[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

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>