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

Annotation of OpenXM_contrib/PHC/Ada/Schubert/ts_canocurv.adb, Revision 1.1.1.1

1.1       maekawa     1: with text_io,integer_io;                 use text_io,integer_io;
                      2: with Characters_and_Numbers;             use Characters_and_Numbers;
                      3: with Standard_Complex_Numbers;           use Standard_Complex_Numbers;
                      4: with Standard_Natural_Vectors;
                      5: with Standard_Natural_Matrices;
                      6: with Symbol_Table,Symbol_Table_io;       use Symbol_Table;
                      7: with Standard_Complex_Polynomials;       use Standard_Complex_Polynomials;
                      8: with Standard_Complex_Poly_Matrices;
                      9: with Standard_Complex_Poly_Matrices_io;  use Standard_Complex_Poly_Matrices_io;
                     10: with Brackets,Brackets_io;               use Brackets,Brackets_io;
                     11: with Symbolic_Minor_Equations;           use Symbolic_Minor_Equations;
                     12:
                     13: procedure ts_canocurv is
                     14:
                     15: -- DESCRIPTION :
                     16: --   Test for localization patterns of q-curves.
                     17:
                     18:   procedure Write_Separator ( p,k : in natural ) is
                     19:
                     20:   -- DESCRIPTION :
                     21:   --   Writes a separating bar between blocks in a stretched representation
                     22:   --   of a q-curve that produces p-planes.
                     23:   --   The elements in the columns occupy each k spaces.
                     24:
                     25:   begin
                     26:     for j in 1..p loop
                     27:       for i in 1..k loop
                     28:         put("-");
                     29:       end loop;
                     30:     end loop;
                     31:     put_line("-");
                     32:   end Write_Separator;
                     33:
                     34:   procedure Write_Pattern ( m,p,q : in natural; top,bottom : in Bracket;
                     35:                             locpat : in Standard_Natural_Matrices.Matrix ) is
                     36:
                     37:   -- DESCRIPTION :
                     38:   --   Writes the pattern for top and bottom pivots of a q-curve that
                     39:   --   produces p-planes into (m+p)-dimensional space.
                     40:
                     41:   begin
                     42:     put("The pattern of the "); put(q,1); put("-curve into G(");
                     43:     put(m,1); put(","); put(m+p,1); put(") for (");
                     44:     put(top); put(","); put(bottom); put_line(") :");
                     45:     Write_Separator(p,2);
                     46:     for i in locpat'range(1) loop
                     47:       for j in locpat'range(2) loop
                     48:         if locpat(i,j) = 0
                     49:          then put(" 0");
                     50:          else put(" *");
                     51:         end if;
                     52:       end loop;
                     53:       new_line;
                     54:       if i mod (m+p) = 0
                     55:        then Write_Separator(p,2);
                     56:       end if;
                     57:     end loop;
                     58:   end Write_Pattern;
                     59:
                     60:   procedure Write_Variables ( m,p,q : in natural; top,bottom : in Bracket;
                     61:                               locpat : in Standard_Natural_Matrices.Matrix ) is
                     62:
                     63:   -- DESCRIPTION :
                     64:   --   Writes the variables in the pattern for top and bottom pivots of a
                     65:   --   q-curve that produces p-planes into (m+p)-dimensional space.
                     66:
                     67:     row,deg : natural := 0;
                     68:
                     69:   begin
                     70:     put("Variable pattern of the "); put(q,1); put("-curve into G(");
                     71:     put(m,1); put(","); put(m+p,1); put(") for (");
                     72:     put(top); put(","); put(bottom); put_line(") :");
                     73:     Write_Separator(p,6);
                     74:     for i in locpat'range(1) loop
                     75:       row := row + 1;
                     76:       for j in locpat'range(2) loop
                     77:         put(" ");
                     78:         if locpat(i,j) = 0
                     79:          then for k in 1..4 loop
                     80:                 put(" ");
                     81:               end loop;
                     82:               put("0");
                     83:          else put("x"); put(row,1); put(j,1); put("s"); put(deg,1);
                     84:         end if;
                     85:       end loop;
                     86:       new_line;
                     87:       if i mod (m+p) = 0
                     88:        then Write_Separator(p,6);
                     89:             row := 0; deg := deg+1;
                     90:       end if;
                     91:     end loop;
                     92:   end Write_Variables;
                     93:
                     94:   procedure Write_Localization_Pattern
                     95:                ( m,p,q : in natural; top,bottom : in Bracket ) is
                     96:
                     97:   -- DESCRIPTION :
                     98:   --   Writes the variables in the pattern for top and bottom pivots of a
                     99:   --   q-curve that produces p-planes into (m+p)-dimensional space.
                    100:
                    101:     rws : constant natural := (m+p)*(q+1);
                    102:     row,deg : natural := 0;
                    103:
                    104:   begin
                    105:     put("Variable pattern of the "); put(q,1); put("-curve into G(");
                    106:     put(m,1); put(","); put(m+p,1); put(") for (");
                    107:     put(top); put(","); put(bottom); put_line(") :");
                    108:     Write_Separator(p,6);
                    109:     for i in 1..rws loop
                    110:       row := row + 1;
                    111:       for j in 1..p loop
                    112:         put(" ");
                    113:         if (i < top(j) or i > bottom(j))
                    114:          then for k in 1..4 loop
                    115:                 put(" ");
                    116:               end loop;
                    117:               put("0");
                    118:          else put("x"); put(row,1); put(j,1); put("s"); put(deg,1);
                    119:         end if;
                    120:       end loop;
                    121:       new_line;
                    122:       if i mod (m+p) = 0
                    123:        then Write_Separator(p,6);
                    124:             row := 0; deg := deg+1;
                    125:       end if;
                    126:     end loop;
                    127:   end Write_Localization_Pattern;
                    128:
                    129:   function Number_of_Variables ( top,bottom : Bracket ) return natural is
                    130:
                    131:   -- DESCRIPTION :
                    132:   --   Counts the number of x_ij-variables needed to represent the pattern
                    133:   --   prescribed with top and bottom pivots.
                    134:   --   Note that the actual dimension of the corresponding space is p less.
                    135:
                    136:     cnt : natural := 0;
                    137:
                    138:   begin
                    139:     for j in top'range loop
                    140:       cnt := cnt + (bottom(j) - top(j) + 1);
                    141:     end loop;
                    142:     return cnt;
                    143:   end Number_of_Variables;
                    144:
                    145:   procedure Set_up_Symbol_Table ( m,p,q : natural; top,bottom : in Bracket ) is
                    146:
                    147:   -- DESCRIPTION :
                    148:   --   Fills the symbol table with those symbols needed to represent a
                    149:   --   q-curve into the Grassmannian of p-planes into (m+p)-space,
                    150:   --   represented in the pattern prescribed by top and bottom pivots.
                    151:   --   The "s" and the "t" variables are the first ones that occur.
                    152:
                    153:     cnt : constant natural := 2 + Number_of_Variables(top,bottom);
                    154:     rws : constant natural := (m+p)*(q+1);
                    155:     row,deg : natural;
                    156:     sb : Symbol;
                    157:
                    158:   begin
                    159:     Symbol_Table.Init(cnt);           -- initialization with #variables
                    160:     sb := (sb'range => ' ');
                    161:     sb(1) := 's';
                    162:     Symbol_Table.Add(sb);             -- adding "s"
                    163:     sb(1) := 't';
                    164:     Symbol_Table.Add(sb);             -- adding "t"
                    165:     sb(1) := 'x';
                    166:     sb(4) := 's';
                    167:     for j in 1..p loop                -- adding the rest columnwise
                    168:       row := 0; deg := 0;
                    169:       for i in 1..rws loop
                    170:         row := row + 1;
                    171:         if i >= top(j) and i <= bottom(j)
                    172:          then sb(2) := Convert_Hexadecimal(row);
                    173:               sb(3) := Convert_Hexadecimal(j);
                    174:               sb(5) := Convert_Hexadecimal(deg);
                    175:               Symbol_Table.Add(sb);
                    176:         end if;
                    177:         if i mod (m+p) = 0
                    178:          then row := 0; deg := deg+1;
                    179:         end if;
                    180:       end loop;
                    181:     end loop;
                    182:   end Set_up_Symbol_Table;
                    183:
                    184:   procedure Write_Symbol_Table is
                    185:
                    186:   -- DESCRIPTION :
                    187:   --   Writes the content of the symbol table.
                    188:
                    189:   begin
                    190:     put_line("The symbols currently in the symbol table : ");
                    191:     for i in 1..Symbol_Table.Number loop
                    192:       Symbol_Table_io.put(Symbol_Table.Get(i)); new_line;
                    193:     end loop;
                    194:   end Write_Symbol_Table;
                    195:
                    196:   function Polynomial_Pattern ( m,p,q : natural; top,bottom : Bracket )
                    197:                               return Standard_Complex_Poly_Matrices.Matrix is
                    198:
                    199:   -- DESCRIPTION :
                    200:   --   Returns the representation of a q-curve that produces p-planes in
                    201:   --   (m+p)-dimensional space, in the localization pattern prescribed by
                    202:   --   top and bottom pivots.  The columns of the matrix on return contain
                    203:   --   the polynomial functions that generate the p-plane.
                    204:
                    205:     res : Standard_Complex_Poly_Matrices.Matrix(1..(m+p),1..p);
                    206:     rws : constant natural := (m+p)*(q+1);
                    207:     n : constant natural := 2 + Number_of_Variables(top,bottom);
                    208:     row,ind,s_deg,t_deg : natural;
                    209:     t : Term;
                    210:
                    211:   begin
                    212:     for i in res'range(1) loop                    -- initialization
                    213:       for j in res'range(2) loop
                    214:         res(i,j) := Null_Poly;
                    215:       end loop;
                    216:     end loop;
                    217:     t.dg := new Standard_Natural_Vectors.Vector'(1..n => 0);
                    218:     t.cf := Create(1.0);
                    219:     ind := 2;                                     -- ind counts #variables
                    220:     for j in 1..p loop                            -- assign columnwise
                    221:       t_deg := (bottom(j)-1)/(m+p);               -- degree in t to homogenize
                    222:       row := 0; s_deg := 0;
                    223:       for i in 1..rws loop
                    224:         row := row + 1;
                    225:         if i >= top(j) and i <= bottom(j)
                    226:          then ind := ind+1;
                    227:               t.dg(1) := s_deg; t.dg(2) := t_deg;
                    228:               t.dg(ind) := 1;
                    229:               Add(res(row,j),t);
                    230:               t.dg(1) := 0; t.dg(2) := 0;
                    231:               t.dg(ind) := 0;
                    232:         end if;
                    233:         if i mod (m+p) = 0
                    234:          then row := 0; s_deg := s_deg+1; t_deg := t_deg-1;
                    235:         end if;
                    236:       end loop;
                    237:     end loop;
                    238:     Clear(t);
                    239:     return res;
                    240:   end Polynomial_Pattern;
                    241:
                    242:   procedure Main is
                    243:
                    244:     m,p,q : natural;
                    245:     ans : character;
                    246:
                    247:   begin
                    248:     put("Give m : "); get(m);
                    249:     put("Give p : "); get(p);
                    250:     put("Give q : "); get(q);
                    251:     put("  m = "); put(m,1);
                    252:     put("  p = "); put(p,1);
                    253:     put("  q = "); put(q,1); new_line;
                    254:     loop
                    255:       declare
                    256:         top,bottom : Bracket(1..p);
                    257:       begin
                    258:         put("Give top pivots : "); get(top);
                    259:         put("Give bottom pivots : "); get(bottom);
                    260:         put("  top pivots : "); put(top);
                    261:         put("  bottom pivots : "); put(bottom); new_line;
                    262:         Write_Localization_Pattern(m,p,q,top,bottom);
                    263:         Set_up_Symbol_Table(m,p,q,top,bottom);
                    264:         Write_Symbol_Table;
                    265:         put_line("The representation as a matrix of polynomials : ");
                    266:         put(Polynomial_Pattern(m,p,q,top,bottom));
                    267:       end;
                    268:       put("Do you want patterns for other pivots ? (y/n) "); get(ans);
                    269:       exit when (ans /= 'y');
                    270:     end loop;
                    271:   end Main;
                    272:
                    273: begin
                    274:   new_line;
                    275:   put_line("Test on canonical form of a curve into the Grassmannian");
                    276:   new_line;
                    277:   Main;
                    278: end ts_canocurv;

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