[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     ! 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>