12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485 |
- module groebopt;
-
- %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
- % optimization of the sequence of variables
- %
-
- % Optimization of variable sequence;
- % the theoretical background can be found
- % in Boege/Gebauer/Kredel , J.Symb.Comp(1986)I,83-98
- % Techniques modfied to the following algorithm
- %
- % x > y if
- % x appears in a higher power than y
- % or
- % the highest powers are equal, but x appears more often with
- % that power.
- %
- % An explicit dependency DEPENDS X,Y will supersede the optimality.
-
- fluid '(vdpvars!* % list of intersting variables (and korder)
- intvdpvars!*
- !*trgroeb % control of print messages
- );
-
- symbolic procedure vdpvordopt (w,vars);
- % w : list of polynomials (standard forms)
- % vars: list of variables
- % returns (w . vars), both reorderdered
- begin; scalar c;
- vars := sort(vars,'ordop);
- c := for each x in vars collect x . 0 . 0;
- for each poly in w do vdpvordopt1 (poly,vars,c);
- c := sort(c,function vdpvordopt2);
- intvdpvars!* := for each v in c collect car v;
- vars := vdpvordopt31 intvdpvars!*;
- if !*trgroeb then
- <<prin2 "optimized sequence of kernels: "; prin2t vars>>;
- return (for each poly in w collect reorder poly) . vars;
- end;
-
- symbolic procedure vdpvordopt1 (p,vl,c);
- if null p then 0
- else
- if domainp p or null vl then 1
- else
- if mvar p neq car vl then vdpvordopt1(p,cdr vl,c)
- else
- begin scalar var,pow,slot; integer n;
- n := vdpvordopt1 (lc p,cdr vl,c);
- var := mvar p;
- pow := ldeg p;
- slot := assoc(var,c);
- if pow #> cadr slot then
- <<rplaca(cdr slot,pow); rplacd(cdr slot,n)>>
- else
- rplacd(cdr slot,n #+ cddr slot);
- return n #+ vdpvordopt1 (red p,vl,c);
- end;
-
- symbolic procedure vdpvordopt2(sl1,sl2);
- % compare two slots from the power table
- <<sl1 := cdr sl1;
- sl2 := cdr sl2;
- car sl1 #< car sl2 or car sl1 = car sl2 and cdr sl1 #< cdr sl2
- >>;
-
- symbolic procedure vdpvordopt31 u;
- % u : list of variables
- % returns u reordered to respect dependency ordering
- begin scalar v,y;
- if null u then return nil;
- v := foreach x in u join
- << y := assoc(x,depl!*);
- if null y or null xnp(cdr y,u) then {x} >>;
- return nconc(vdpvordopt31 setdiff(u,v),v);
- end;
- % symbolic procedure vdpvordopt3(x,y);
- % % two level compare: 1. dependency, 2. optimal order.
- % depends(x,y) or member(y,member(x,intvdpvars!*));
- endmodule;
-
- end;
|