[BACK]Return to curves_into_grassmannian.adb CVS log [TXT][DIR] Up to [local] / OpenXM_contrib / PHC / Ada / Schubert

Annotation of OpenXM_contrib/PHC/Ada/Schubert/curves_into_grassmannian.adb, Revision 1.1

1.1     ! maekawa     1: with Standard_Floating_Numbers;          use Standard_Floating_Numbers;
        !             2: with Standard_Natural_Vectors;
        !             3: with Standard_Complex_Polynomials;       use Standard_Complex_Polynomials;
        !             4:
        !             5: package body Curves_into_Grassmannian is
        !             6:
        !             7: -- CREATOR :
        !             8:
        !             9:   function Symbolic_Create ( m,p,q : natural; top,bottom : Bracket )
        !            10:                            return Standard_Complex_Poly_Matrices.Matrix is
        !            11:
        !            12:     res : Standard_Complex_Poly_Matrices.Matrix(1..(m+p),1..p);
        !            13:     rws : constant natural := (m+p)*(q+1);
        !            14:     n : constant natural := Number_of_Variables(top,bottom) + 2;
        !            15:     row,ind,s_deg,t_deg : natural;
        !            16:     t : Term;
        !            17:
        !            18:   begin
        !            19:     for i in res'range(1) loop                    -- initialization
        !            20:       for j in res'range(2) loop
        !            21:         res(i,j) := Null_Poly;
        !            22:       end loop;
        !            23:     end loop;
        !            24:     t.dg := new Standard_Natural_Vectors.Vector'(1..n => 0);
        !            25:     t.cf := Create(1.0);
        !            26:     ind := 0;                                     -- ind counts #variables
        !            27:     for j in 1..p loop                            -- assign columnwise
        !            28:       t_deg := (bottom(j)-1)/(m+p);               -- degree in t to homogenize
        !            29:       row := 0; s_deg := 0;
        !            30:       for i in 1..rws loop
        !            31:         row := row + 1;
        !            32:         if i >= top(j) and i <= bottom(j)
        !            33:          then ind := ind+1;
        !            34:               t.dg(n-1) := s_deg; t.dg(n) := t_deg;
        !            35:               t.dg(ind) := 1;
        !            36:               Add(res(row,j),t);
        !            37:               t.dg(n-1) := 0; t.dg(n) := 0;
        !            38:               t.dg(ind) := 0;
        !            39:         end if;
        !            40:         if i mod (m+p) = 0
        !            41:          then row := 0; s_deg := s_deg+1;
        !            42:               if t_deg > 0
        !            43:                then t_deg := t_deg-1;
        !            44:               end if;
        !            45:         end if;
        !            46:       end loop;
        !            47:     end loop;
        !            48:     Clear(t);
        !            49:     return res;
        !            50:   end Symbolic_Create;
        !            51:
        !            52: -- SELECTORS :
        !            53:
        !            54:   function Number_of_Variables ( top,bottom : Bracket ) return natural is
        !            55:
        !            56:     cnt : natural := 0;
        !            57:
        !            58:   begin
        !            59:     for j in top'range loop
        !            60:       cnt := cnt + (bottom(j) - top(j) + 1);
        !            61:     end loop;
        !            62:     return cnt;
        !            63:   end Number_of_Variables;
        !            64:
        !            65:   function Standard_Coordinate_Frame
        !            66:              ( m,p,q : natural; top,bottom : Bracket;
        !            67:                coeff : Standard_Complex_Matrices.Matrix )
        !            68:              return Standard_Natural_Matrices.Matrix is
        !            69:
        !            70:     rws : constant natural := (m+p)*(q+1);
        !            71:     res : Standard_Natural_Matrices.Matrix(1..rws,1..p);
        !            72:     tol : constant double_float := 10.0**(-10);
        !            73:     first : boolean;
        !            74:
        !            75:   begin
        !            76:     for j in 1..p loop
        !            77:       first := true;
        !            78:       for i in 1..rws loop
        !            79:         if i < top(j) or i > bottom(j)
        !            80:          then res(i,j) := 0;
        !            81:          elsif (first and (AbsVal(coeff(i,j)) > tol))
        !            82:              then res(i,j) := 1; first := false;
        !            83:              else res(i,j) := 2;
        !            84:         end if;
        !            85:       end loop;
        !            86:     end loop;
        !            87:     return res;
        !            88:   end Standard_Coordinate_Frame;
        !            89:
        !            90:   function Eval ( c : Term; s,t : Complex_Number ) return Term is
        !            91:
        !            92:     res : Term;
        !            93:
        !            94:   begin
        !            95:     Copy(c,res);
        !            96:     for i in 1..res.dg(res.dg'last-1) loop        -- evaluate s
        !            97:       res.cf := res.cf*s;
        !            98:     end loop;
        !            99:     res.dg(res.dg'last-1) := 0;
        !           100:     for i in 1..res.dg(res.dg'last) loop          -- evaluate t
        !           101:       res.cf := res.cf*t;
        !           102:     end loop;
        !           103:     res.dg(res.dg'last) := 0;
        !           104:     return res;
        !           105:   end Eval;
        !           106:
        !           107:   function Eval ( p : Poly; s,t : Complex_Number ) return Poly is
        !           108:
        !           109:     res : Poly := Null_Poly;
        !           110:
        !           111:     procedure Eval_Term ( ct : in Term; continue : out boolean ) is
        !           112:
        !           113:       et : Term := Eval(ct,s,t);
        !           114:
        !           115:     begin
        !           116:       Add(res,et);
        !           117:       Clear(et);
        !           118:       continue := true;
        !           119:     end Eval_Term;
        !           120:     procedure Eval_Terms is new Visiting_Iterator(Eval_Term);
        !           121:
        !           122:   begin
        !           123:     Eval_Terms(p);
        !           124:     return res;
        !           125:   end Eval;
        !           126:
        !           127:   function Eval ( c : Standard_Complex_Poly_Matrices.Matrix;
        !           128:                   s,t : Complex_Number )
        !           129:                 return Standard_Complex_Poly_Matrices.Matrix is
        !           130:
        !           131:     res : Standard_Complex_Poly_Matrices.Matrix(c'range(1),c'range(2));
        !           132:
        !           133:   begin
        !           134:     for i in c'range(1) loop
        !           135:       for j in c'range(2) loop
        !           136:         if c(i,j) = Null_Poly
        !           137:          then res(i,j) := Null_Poly;
        !           138:          else res(i,j) := Eval(c(i,j),s,t);
        !           139:         end if;
        !           140:       end loop;
        !           141:     end loop;
        !           142:     return res;
        !           143:   end Eval;
        !           144:
        !           145:   function Elim ( c : Term; s,t : Complex_Number ) return Term is
        !           146:
        !           147:     res : Term;
        !           148:
        !           149:   begin
        !           150:     res.dg := new Standard_Natural_Vectors.Vector'
        !           151:                     (c.dg(c.dg'first..c.dg'last-2));
        !           152:     res.cf := c.cf;
        !           153:     for i in 1..c.dg(c.dg'last-1) loop        -- evaluate s
        !           154:       res.cf := res.cf*s;
        !           155:     end loop;
        !           156:     for i in 1..c.dg(c.dg'last) loop          -- evaluate t
        !           157:       res.cf := res.cf*t;
        !           158:     end loop;
        !           159:     return res;
        !           160:   end Elim;
        !           161:
        !           162:   function Elim ( p : Poly; s,t : Complex_Number ) return Poly is
        !           163:
        !           164:     res : Poly := Null_Poly;
        !           165:
        !           166:     procedure Elim_Term ( ct : in Term; continue : out boolean ) is
        !           167:
        !           168:       et : Term := Elim(ct,s,t);
        !           169:
        !           170:     begin
        !           171:       Add(res,et);
        !           172:       Clear(et);
        !           173:       continue := true;
        !           174:     end Elim_Term;
        !           175:     procedure Elim_Terms is new Visiting_Iterator(Elim_Term);
        !           176:
        !           177:   begin
        !           178:     Elim_Terms(p);
        !           179:     return res;
        !           180:   end Elim;
        !           181:
        !           182:   function Elim ( c : Standard_Complex_Poly_matrices.Matrix;
        !           183:                   s,t : Complex_Number )
        !           184:                 return Standard_Complex_Poly_Matrices.Matrix is
        !           185:
        !           186:     res : Standard_Complex_Poly_Matrices.Matrix(c'range(1),c'range(2));
        !           187:
        !           188:   begin
        !           189:     for i in c'range(1) loop
        !           190:       for j in c'range(2) loop
        !           191:         if c(i,j) = Null_Poly
        !           192:          then res(i,j) := Null_Poly;
        !           193:          else res(i,j) := Elim(c(i,j),s,t);
        !           194:         end if;
        !           195:       end loop;
        !           196:     end loop;
        !           197:     return res;
        !           198:   end Elim;
        !           199:
        !           200:   function Column_Localize ( top,bottom : Bracket;
        !           201:                              locmap : Standard_Natural_Matrices.Matrix;
        !           202:                              t : Term ) return Term is
        !           203:
        !           204:   -- DESCRIPTION :
        !           205:   --   Applies the localization map to the term, eliminating those xij's
        !           206:   --   xij for which the corresponding entry in locmap is either 0 or 1.
        !           207:
        !           208:   -- NOTE :
        !           209:   --   This localization assumes that t.dg(k) = 0 with k for which the
        !           210:   --   corresponding (i,j) with locmap(i,j) = 0.
        !           211:   --   The localization pattern is traversed columnwise.
        !           212:
        !           213:     res : Term;
        !           214:     ndg : Standard_Natural_Vectors.Vector(t.dg'range);
        !           215:     cnt : natural := t.dg'first-1;
        !           216:     ind : natural := cnt;
        !           217:
        !           218:   begin
        !           219:     for j in locmap'range(2) loop       -- columnwise order of the variables
        !           220:       for i in top(j)..bottom(j) loop   -- restricted range skips the zeros
        !           221:         ind := ind+1;
        !           222:         if locmap(i,j) = 2              -- skip the ones
        !           223:          then cnt := cnt + 1;
        !           224:               ndg(cnt) := t.dg(ind);
        !           225:         end if;
        !           226:       end loop;
        !           227:     end loop;
        !           228:     for i in ind+1..t.dg'last loop      -- leave the lifting !
        !           229:       cnt := cnt+1;
        !           230:       ndg(cnt) := t.dg(i);
        !           231:     end loop;
        !           232:     res.cf := t.cf;
        !           233:     res.dg := new Standard_Natural_Vectors.Vector'(ndg(1..cnt));
        !           234:     return res;
        !           235:   end Column_Localize;
        !           236:
        !           237:   function Column_Localize ( top,bottom : Bracket;
        !           238:                              locmap : Standard_Natural_Matrices.Matrix;
        !           239:                              p : Poly ) return Poly is
        !           240:
        !           241:   -- DESCRIPTION :
        !           242:   --   Applies the localization map to the polynomial, eliminating
        !           243:   --   those xij's for which locmap(i,j) is either 0 or 1.
        !           244:
        !           245:     res : Poly := Null_Poly;
        !           246:
        !           247:     procedure Column_Localize_Term ( t : in Term; continue : out boolean ) is
        !           248:
        !           249:       lt : Term := Column_Localize(top,bottom,locmap,t);
        !           250:
        !           251:     begin
        !           252:       Add(res,lt);
        !           253:       Clear(lt.dg);
        !           254:       continue := true;
        !           255:     end Column_Localize_Term;
        !           256:     procedure Column_Localize_Terms is
        !           257:       new Visiting_Iterator(Column_Localize_Term);
        !           258:
        !           259:   begin
        !           260:     Column_Localize_Terms(p);
        !           261:     return res;
        !           262:   end Column_Localize;
        !           263:
        !           264:   function Column_Localize ( top,bottom : Bracket;
        !           265:                              locmap : Standard_Natural_Matrices.Matrix;
        !           266:                              p : Poly_Sys ) return Poly_Sys is
        !           267:
        !           268:     res : Poly_Sys(p'range);
        !           269:
        !           270:   begin
        !           271:     for i in p'range loop
        !           272:       res(i) := Column_Localize(top,bottom,locmap,p(i));
        !           273:     end loop;
        !           274:     return res;
        !           275:   end Column_Localize;
        !           276:
        !           277:   function Column_Vector_Rep
        !           278:              ( top,bottom : Bracket;
        !           279:                cffmat : Standard_Complex_Matrices.Matrix )
        !           280:              return Standard_Complex_Vectors.Vector is
        !           281:
        !           282:     dim : constant natural := Number_of_Variables(top,bottom);
        !           283:     res : Standard_Complex_Vectors.Vector(1..dim);
        !           284:     cnt : natural := 0;
        !           285:
        !           286:   begin
        !           287:     for j in cffmat'range(2) loop
        !           288:       for i in top(j)..bottom(j) loop
        !           289:         cnt := cnt + 1;
        !           290:         res(cnt) := cffmat(i,j);
        !           291:       end loop;
        !           292:     end loop;
        !           293:     return res;
        !           294:   end Column_Vector_Rep;
        !           295:
        !           296:   function Column_Vector_Rep ( locmap : Standard_Natural_Matrices.Matrix;
        !           297:                                cffmat : Standard_Complex_Matrices.Matrix )
        !           298:                              return Standard_Complex_Vectors.Vector is
        !           299:
        !           300:     dim : constant natural := cffmat'length(1)*cffmat'length(2);
        !           301:     res : Standard_Complex_Vectors.Vector(1..dim);
        !           302:     cnt : natural := 0;
        !           303:
        !           304:   begin
        !           305:     for j in cffmat'range(2) loop
        !           306:       for i in cffmat'range(1) loop
        !           307:         if locmap(i,j) = 2
        !           308:          then cnt := cnt + 1;
        !           309:               res(cnt) := cffmat(i,j);
        !           310:         end if;
        !           311:       end loop;
        !           312:     end loop;
        !           313:     return res(1..cnt);
        !           314:   end Column_Vector_Rep;
        !           315:
        !           316:   function Column_Matrix_Rep
        !           317:               ( locmap : Standard_Natural_Matrices.Matrix;
        !           318:                 cffvec : Standard_Complex_Vectors.Vector )
        !           319:               return Standard_Complex_Matrices.Matrix is
        !           320:
        !           321:     res : Standard_Complex_Matrices.Matrix(locmap'range(1),locmap'range(2));
        !           322:     cnt : natural := 0;
        !           323:
        !           324:   begin
        !           325:     for j in locmap'range(2) loop
        !           326:       for i in locmap'range(1) loop
        !           327:         if locmap(i,j) = 0
        !           328:          then res(i,j) := Create(0.0);
        !           329:          elsif locmap(i,j) = 1
        !           330:              then res(i,j) := Create(1.0);
        !           331:              else cnt := cnt + 1;
        !           332:                   res(i,j) := cffvec(cnt);
        !           333:         end if;
        !           334:       end loop;
        !           335:     end loop;
        !           336:     return res;
        !           337:   end Column_Matrix_Rep;
        !           338:
        !           339:   procedure Swap ( p : in out Poly; k,l : in natural ) is
        !           340:
        !           341:     procedure Swap_Term ( t : in out Term; continue : out boolean ) is
        !           342:
        !           343:       lval : natural := t.dg(l);
        !           344:
        !           345:     begin
        !           346:       t.dg(l) := t.dg(k);
        !           347:       t.dg(k) := lval;
        !           348:       continue := true;
        !           349:     end Swap_Term;
        !           350:     procedure Swap_Terms is new Changing_Iterator(Swap_Term);
        !           351:
        !           352:   begin
        !           353:     Swap_Terms(p);
        !           354:   end Swap;
        !           355:
        !           356:   procedure Swap ( c : in out Standard_Complex_Poly_Matrices.Matrix;
        !           357:                    k,l : in natural ) is
        !           358:   begin
        !           359:     for i in c'range(1) loop
        !           360:       for j in c'range(2) loop
        !           361:         if c(i,j) /= Null_Poly
        !           362:          then Swap(c(i,j),k,l);
        !           363:         end if;
        !           364:       end loop;
        !           365:     end loop;
        !           366:   end Swap;
        !           367:
        !           368:   function Insert ( p : Poly; k : natural ) return Poly is
        !           369:
        !           370:     res : Poly := Null_Poly;
        !           371:
        !           372:     procedure Insert_Term ( t : in Term; continue : out boolean ) is
        !           373:
        !           374:       rt : Term;
        !           375:
        !           376:     begin
        !           377:       rt.cf := t.cf;
        !           378:       rt.dg := new Standard_Natural_Vectors.Vector(t.dg'first..t.dg'last+1);
        !           379:       rt.dg(t.dg'first..k-1) := t.dg(t.dg'first..k-1);
        !           380:       rt.dg(k) := 0;
        !           381:       rt.dg(k+1..rt.dg'last) := t.dg(k..t.dg'last);
        !           382:       Add(res,rt);
        !           383:       Clear(rt);
        !           384:       continue := true;
        !           385:     end Insert_Term;
        !           386:     procedure Insert_Terms is new Visiting_Iterator(Insert_Term);
        !           387:
        !           388:   begin
        !           389:     Insert_Terms(p);
        !           390:     return res;
        !           391:   end Insert;
        !           392:
        !           393:   function Insert ( c : Standard_Complex_Poly_Matrices.Matrix; k : natural )
        !           394:                   return Standard_Complex_Poly_Matrices.Matrix is
        !           395:
        !           396:     res : Standard_Complex_Poly_Matrices.Matrix(c'range(1),c'range(2));
        !           397:
        !           398:   begin
        !           399:     for i in c'range(1) loop
        !           400:       for j in c'range(2) loop
        !           401:         if c(i,j) = Null_Poly
        !           402:          then res(i,j) := Null_Poly;
        !           403:          else res(i,j) := Insert(c(i,j),k);
        !           404:         end if;
        !           405:       end loop;
        !           406:     end loop;
        !           407:     return res;
        !           408:   end Insert;
        !           409:
        !           410:   procedure Duplicate ( p : in out Poly; k,l : in natural ) is
        !           411:
        !           412:     procedure Duplicate_Term ( t : in out Term; continue : out boolean ) is
        !           413:     begin
        !           414:       t.dg(l) := t.dg(k);
        !           415:       continue := true;
        !           416:     end Duplicate_Term;
        !           417:     procedure Duplicate_Terms is new Changing_Iterator(Duplicate_Term);
        !           418:
        !           419:   begin
        !           420:     Duplicate_Terms(p);
        !           421:   end Duplicate;
        !           422:
        !           423: end Curves_into_Grassmannian;

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>