Skip to content

Commit dd5d0f8

Browse files
committed
Use only sub-class in compress_coercion
The compress predicate had a cubic number of entries in the size of a hierarchy whereas sub-class is only quadratic. Compilation of MathComp: before: 22:57 (1.53 GB) HB.structure: 05:42 HB.instance: 02:31 after: 20:36 (1.26 GB) HB.structure: 03:10 HB.instance: 02:29
1 parent aec1aa2 commit dd5d0f8

File tree

5 files changed

+26
-50
lines changed

5 files changed

+26
-50
lines changed

HB/about.elpi

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -192,8 +192,10 @@ main-structure S Class Structure MLwP :-
192192
std.findall (exported-op m P O) OPS,
193193
std.map OPS (c\out\ sigma p\ c = exported-op m p out) r) OPLL,
194194
std.flatten OPLL Operations,
195-
std.map {std.findall (sub-class Class C_)} (x\r\ x = sub-class Class r) SubClasses,
196-
std.map {std.findall (sub-class C_ Class)} (x\r\ x = sub-class r Class) SuperClasses,
195+
std.map {std.findall (sub-class Class CS_ CoeS_ NS_)}
196+
(x\r\ x = sub-class Class r _ _) SubClasses,
197+
std.map {std.findall (sub-class Cs_ Class Coes_ Ns_)}
198+
(x\r\ x = sub-class r Class _ _) SuperClasses,
197199
% format
198200
PpOrigin = box (hov 4) [
199201
str "HB: ", str S, str " is a structure", spc,

HB/common/database.elpi

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -155,10 +155,10 @@ toposort-proj.acc Proj ES Acc [A|In] Out :- std.do![
155155

156156
% Classes can be topologically sorted according to the subclass relation
157157
pred toposort-classes.mk-class-edge i:prop, o:pair classname classname.
158-
toposort-classes.mk-class-edge (sub-class C1 C2) (pr C2 C1).
158+
toposort-classes.mk-class-edge (sub-class C1 C2 _ _) (pr C2 C1).
159159
pred toposort-classes i:list classname, o:list classname.
160160
toposort-classes In Out :- std.do! [
161-
std.findall (sub-class C1_ C2_) SubClasses,
161+
std.findall (sub-class C1_ C2_ _ _) SubClasses,
162162
std.map SubClasses toposort-classes.mk-class-edge ES,
163163
std.toposort ES In Out,
164164
].

HB/common/synthesis.elpi

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -191,8 +191,21 @@ mixin-for T M MICompressed :- mixin-src T M Tm, !, std.do! [
191191
compress-coercion-paths MI MICompressed,
192192
].
193193

194+
pred drop i:int, i:list A, o:list A.
195+
drop 0 L L :- !.
196+
drop N [_|XS] L :- !, N1 is N - 1, drop N1 XS L.
197+
194198
pred compress-copy o:term, o:term.
195-
compress-copy X Y :- compress X Y, !.
199+
compress-copy (app [global (const C) | L]) R :-
200+
sub-class C2 C3 C NparamsC,
201+
drop NparamsC L [app [global (const C') | L']],
202+
sub-class C1 C2 C' NparamsC',
203+
drop NparamsC' L' L'',
204+
sub-class C1 C3 C'' NparamsC'',
205+
std.append {coq.mk-n-holes NparamsC''} L'' HL'',
206+
CHL'' = app [global (const C'') | HL''],
207+
coq.typecheck CHL'' _ ok, !,
208+
compress-copy CHL'' R.
196209
compress-copy (app L) (app L1) :- !, std.map L compress-copy L1.
197210
compress-copy X X.
198211

HB/structure.elpi

Lines changed: 2 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -360,8 +360,6 @@ pred declare-coercion i:term, i:term, i:class, i:class.
360360
declare-coercion SortProjection ClassProjection
361361
(class FC StructureF FMLwP) (class TC StructureT TMLwP) :- std.do! [
362362

363-
acc-clause current (sub-class FC TC),
364-
365363
gref->modname StructureF 2 "_" ModNameF,
366364
gref->modname StructureT 2 "_" ModNameT,
367365
CName is ModNameF ^ "_class__to__" ^ ModNameT ^ "_class",
@@ -393,41 +391,10 @@ declare-coercion SortProjection ClassProjection
393391

394392
log.coq.CS.declare-instance SC,
395393

396-
if-verbose (coq.say {header} "declare coercion path compression rules"),
397-
398-
findall-classes All,
399-
CurrentTgtClass = (class TC StructureT TMLwP),
400-
std.filter All (sub-class? CurrentTgtClass) AllTgtSuper,
401-
std.map AllTgtSuper class_structure AllTgtSuperStructures,
402-
403-
mk-compression-clauses StructureF StructureT AllTgtSuperStructures AllCompressionClauses,
404-
acc-clauses current AllCompressionClauses,
394+
w-params.nparams FMLwP NparamsSC,
395+
acc-clause current (sub-class FC TC SC NparamsSC)
405396
].
406397

407-
408-
pred mk-compression-clauses i:gref, i:gref, i:list gref, o:list prop.
409-
mk-compression-clauses _ _ [] [].
410-
mk-compression-clauses StructureF StructureT [StructureE|Rest] Res :- std.do! [
411-
std.assert! (coq.coercion.db-for (grefclass StructureF) (grefclass StructureT) [pr C1 Nparams1]) "wrong number of coercions",
412-
std.assert! (coq.coercion.db-for (grefclass StructureT) (grefclass StructureE) [pr C2 Nparams2]) "wrong number of coercions",
413-
std.assert! (coq.coercion.db-for (grefclass StructureF) (grefclass StructureE) [pr C3 Nparams3]) "wrong number of coercions",
414-
coq.mk-app (global C1) {coq.mk-n-holes Nparams1} F,
415-
coq.mk-app (global C2) {coq.mk-n-holes Nparams2} G,
416-
coq.mk-app (global C3) {coq.mk-n-holes Nparams3} H,
417-
RuleSkel = {{ fun x => lp:G (lp:F x) = lp:H x}},
418-
std.assert-ok! (coq.elaborate-skeleton RuleSkel _ Rule) "coercion composition fails",
419-
(((pi X L\ coq.fold-map X L X [X|L] :- var X, not(std.exists L (same_var X))) => coq.fold-map Rule [] Rule Holes,
420-
mk-compression-clause Holes Rule Clause,
421-
mk-compression-clauses StructureF StructureT Rest Clauses,
422-
Res = [Clause|Clauses]) ; (Res = [])),
423-
].
424-
425-
pred mk-compression-clause i:list term, i:term, o:prop.
426-
mk-compression-clause [] (fun _ _ x\ app[_,_,LHS x,RHS x]) (pi x\ C x) :-
427-
pi x\ copy (LHS x) (L x), copy (RHS x) (R x), C x = (pi tmp\ compress (L x) (R x)).
428-
mk-compression-clause [UV|Rest] T (pi v\ R v) :-
429-
pi v\ (pi U\ copy U v :- same_var U UV, !) => mk-compression-clause Rest T (R v).
430-
431398
pred join-body i:int, i:int, i:structure, i:term, i:term, i:term, i:term, i:term,
432399
i:list term, i:name, i:term, i:(term -> A), o:term.
433400
join-body N1 N2 S3 S2_Pack S1_sort S3_to_S1 S2_class S3_to_S2

structures.v

Lines changed: 4 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -142,9 +142,10 @@ pred is-structure o:gref.
142142
% the [F.Build T] abbreviation the term behind it has N arguments before T
143143
pred factory-builder-nparams o:constant, o:int.
144144

145-
% [sub-class C1 C2] C1 is a sub-class of C2, see also sub-class? which computes
146-
% it on the fly
147-
pred sub-class o:classname, o:classname.
145+
% [sub-class C1 C2 Coercion12 NparamsCoercion] C1 is a sub-class of C2,
146+
% see also sub-class? which computes it on the fly
147+
:index (2 2 1)
148+
pred sub-class o:classname, o:classname, o:constant, o:int.
148149

149150
% [gref-deps GR MLwP] is a (pre computed) list of dependencies of a know global
150151
% constant. The list is topologically sorted
@@ -226,13 +227,6 @@ pred decl-location o:gref, o:loc.
226227
% [docstring Loc Doc] links a location in the source text and some doc
227228
pred docstring o:loc, o:string.
228229

229-
%% database for #[compress_coercions] %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
230-
231-
% coercions chains compression rules (we only care about non applicative
232-
% terms, since this is what you get when you apply coercions)
233-
:index (4)
234-
pred compress o:term, o:term.
235-
236230
}}.
237231

238232
(* %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% *)

0 commit comments

Comments
 (0)