Annotation of OpenXM_contrib/PHC/Ada/Schubert/ts_posets.adb, Revision 1.1
1.1 ! maekawa 1: with text_io,integer_io; use text_io,integer_io;
! 2: with Communications_with_User; use Communications_with_User;
! 3: with Brackets,Brackets_io; use Brackets,Brackets_io;
! 4: with Localization_Posets; use Localization_Posets;
! 5: with Localization_Posets_io; use Localization_Posets_io;
! 6: with Drivers_for_Input_Planes; use Drivers_for_Input_Planes;
! 7:
! 8: procedure ts_posets is
! 9:
! 10: -- DESCRIPTION :
! 11: -- Test on the construction of localization posets.
! 12:
! 13: function Determine_Root ( m,p : natural ) return Node is
! 14:
! 15: -- DESCRIPTION :
! 16: -- Proposes the trivial root to the user, allowing the user to
! 17: -- modify this choice.
! 18:
! 19: root : Node(p) := Trivial_Root(m,p);
! 20: ans : character;
! 21:
! 22: begin
! 23: loop
! 24: put("Top and bottom pivots of root are ");
! 25: put(root.top); put(" and ");
! 26: put(root.bottom); put_line(".");
! 27: put("Level of the root : "); put(root.level,1); new_line;
! 28: put("Do you want to use another root ? (y/n) "); get(ans);
! 29: exit when (ans /= 'y');
! 30: put("Give top pivots : "); get(root.top);
! 31: put("Give bottom pivots : "); get(root.bottom);
! 32: put("Give level of root : "); get(root.level);
! 33: end loop;
! 34: return root;
! 35: end Determine_Root;
! 36:
! 37: procedure Write_Poset
! 38: ( file : in file_type;
! 39: lnkroot : in Link_to_Node; m,p,q : in natural ) is
! 40:
! 41: -- DESCRIPTION :
! 42: -- Creates the posets and writes them onto the file.
! 43:
! 44: nq : constant natural := m*p + q*(m+p);
! 45: level_poset : Array_of_Nodes(0..nq);
! 46: index_poset : Array_of_Array_of_Nodes(0..nq);
! 47: nbp : natural;
! 48:
! 49: begin
! 50: level_poset := Create_Leveled_Poset(lnkroot);
! 51: Count_Roots(level_poset);
! 52: index_poset := Create_Indexed_Poset(level_poset);
! 53: put(file,index_poset);
! 54: nbp := Root_Count_Sum(level_poset);
! 55: put(file,"The number of paths : "); put(file,nbp,1); new_line(file);
! 56: end Write_Poset;
! 57:
! 58: procedure Create_Top_Hypersurface_Poset ( m,p : in natural ) is
! 59:
! 60: -- DESCRIPTION :
! 61: -- Create the poset by incrementing only top pivots.
! 62:
! 63: root : Node(p) := Trivial_Root(m,p);
! 64: lnkroot : Link_to_Node := new Node'(root);
! 65:
! 66: begin
! 67: Top_Create(lnkroot,m+p);
! 68: put_line("The poset created from the top : ");
! 69: Write_Poset(Standard_Output,lnkroot,m,p,0);
! 70: end Create_Top_Hypersurface_Poset;
! 71:
! 72: procedure Create_Top_Hypersurface_Poset ( m,p,q : in natural ) is
! 73:
! 74: -- DESCRIPTION :
! 75: -- Create the poset by incrementing only top pivots.
! 76:
! 77: root : Node(p) := Trivial_Root(m,p,q);
! 78: lnkroot : Link_to_Node := new Node'(root);
! 79:
! 80: begin
! 81: Q_Top_Create(lnkroot,root.bottom(p),m+p);
! 82: put_line("The poset created from the top : ");
! 83: Write_Poset(Standard_Output,lnkroot,m,p,q);
! 84: end Create_Top_Hypersurface_Poset;
! 85:
! 86: procedure Create_Bottom_Hypersurface_Poset ( m,p : in natural ) is
! 87:
! 88: -- DESCRIPTION :
! 89: -- Create the poset by decrementing only bottom pivots.
! 90:
! 91: root : Node(p) := Trivial_Root(m,p);
! 92: lnkroot : Link_to_Node := new Node'(root);
! 93:
! 94: begin
! 95: Bottom_Create(lnkroot);
! 96: put_line("The poset created from the bottom : ");
! 97: Write_Poset(Standard_Output,lnkroot,m,p,0);
! 98: end Create_Bottom_Hypersurface_Poset;
! 99:
! 100: procedure Create_Bottom_Hypersurface_Poset ( m,p,q : in natural ) is
! 101:
! 102: -- DESCRIPTION :
! 103: -- Create the poset by decrementing only bottom pivots.
! 104:
! 105: root : Node(p) := Trivial_Root(m,p,q);
! 106: lnkroot : Link_to_Node := new Node'(root);
! 107:
! 108: begin
! 109: Q_Bottom_Create(lnkroot,m+p);
! 110: put_line("The poset created from the bottom : ");
! 111: Write_Poset(Standard_Output,lnkroot,m,p,q);
! 112: end Create_Bottom_Hypersurface_Poset;
! 113:
! 114: procedure Create_Mixed_Hypersurface_Poset ( m,p : in natural ) is
! 115:
! 116: -- DESCRIPTION :
! 117: -- Create the poset by incrementing top and decrementing bottom pivots.
! 118:
! 119: root : Node(p) := Trivial_Root(m,p);
! 120: lnkroot : Link_to_Node := new Node'(root);
! 121:
! 122: begin
! 123: Top_Bottom_Create(lnkroot,m+p);
! 124: put_line("The poset created in a mixed fashion : ");
! 125: Write_Poset(Standard_Output,lnkroot,m,p,0);
! 126: end Create_Mixed_Hypersurface_Poset;
! 127:
! 128: procedure Create_Mixed_Hypersurface_Poset ( m,p,q : in natural ) is
! 129:
! 130: -- DESCRIPTION :
! 131: -- Create the poset by incrementing top and decrementing bottom pivots.
! 132:
! 133: root : Node(p) := Trivial_Root(m,p,q);
! 134: lnkroot : Link_to_Node := new Node'(root);
! 135:
! 136: begin
! 137: Q_Top_Bottom_Create(lnkroot,root.bottom(p),m+p);
! 138: put_line("The poset created in a mixed fashion : ");
! 139: Write_Poset(Standard_Output,lnkroot,m,p,q);
! 140: end Create_Mixed_Hypersurface_Poset;
! 141:
! 142: procedure Create_Top_General_Poset ( m,p : in natural ) is
! 143:
! 144: -- DESCRIPTION :
! 145: -- Creates a poset for counting general subspace intersections,
! 146: -- by consistently incrementing the top pivots.
! 147:
! 148: root : Node(p) := Trivial_Root(m,p);
! 149: lnkroot : Link_to_Node := new Node'(root);
! 150: codim : constant Bracket := Read_Codimensions(m,p,0);
! 151:
! 152: begin
! 153: Top_Create(lnkroot,codim,m+p);
! 154: put_line("The poset created from the top : ");
! 155: Write_Poset(Standard_Output,lnkroot,m,p,0);
! 156: end Create_Top_General_Poset;
! 157:
! 158: procedure Create_Bottom_General_Poset ( m,p : in natural ) is
! 159:
! 160: -- DESCRIPTION :
! 161: -- Creates a poset for counting general subspace intersections,
! 162: -- by consistently incrementing the top pivots.
! 163:
! 164: root : Node(p) := Trivial_Root(m,p);
! 165: lnkroot : Link_to_Node := new Node'(root);
! 166: codim : constant Bracket := Read_Codimensions(m,p,0);
! 167:
! 168: begin
! 169: Bottom_Create(lnkroot,codim);
! 170: put_line("The poset created from the bottom : ");
! 171: Write_Poset(Standard_Output,lnkroot,m,p,0);
! 172: end Create_Bottom_General_Poset;
! 173:
! 174: procedure Create_Mixed_General_Poset ( m,p : in natural ) is
! 175:
! 176: -- DESCRIPTION :
! 177: -- Creates a poset for counting general subspace intersections,
! 178: -- by incrementing the top and decrementing the bottom pivots.
! 179:
! 180: root : Node(p) := Trivial_Root(m,p);
! 181: lnkroot : Link_to_Node := new Node'(root);
! 182: codim : constant Bracket := Read_Codimensions(m,p,0);
! 183:
! 184: begin
! 185: Top_Bottom_Create(lnkroot,codim,m+p);
! 186: put_line("The poset created in a mixed fashion : ");
! 187: Write_Poset(Standard_Output,lnkroot,m,p,0);
! 188: end Create_Mixed_General_Poset;
! 189:
! 190: procedure Create_Top_General_Poset ( m,p,q : in natural ) is
! 191:
! 192: -- DESCRIPTION :
! 193: -- Creates a poset for counting general subspace intersections,
! 194: -- by consistently incrementing the top pivots.
! 195:
! 196: root : Node(p) := Trivial_Root(m,p,q);
! 197: lnkroot : Link_to_Node := new Node'(root);
! 198: codim : constant Bracket := Read_Codimensions(m,p,q);
! 199:
! 200: begin
! 201: Q_Top_Create(lnkroot,codim,root.bottom(p),m+p);
! 202: put_line("The poset created from the top : ");
! 203: Write_Poset(Standard_Output,lnkroot,m,p,q);
! 204: end Create_Top_General_Poset;
! 205:
! 206: procedure Create_Bottom_General_Poset ( m,p,q : in natural ) is
! 207:
! 208: -- DESCRIPTION :
! 209: -- Creates a poset for counting general subspace intersections,
! 210: -- by consistently incrementing the top pivots.
! 211:
! 212: root : Node(p) := Trivial_Root(m,p,q);
! 213: lnkroot : Link_to_Node := new Node'(root);
! 214: codim : constant Bracket := Read_Codimensions(m,p,q);
! 215:
! 216: begin
! 217: Q_Bottom_Create(lnkroot,codim,m+p);
! 218: put_line("The poset created from the bottom : ");
! 219: Write_Poset(Standard_Output,lnkroot,m,p,q);
! 220: end Create_Bottom_General_Poset;
! 221:
! 222: procedure Create_Mixed_General_Poset ( m,p,q : in natural ) is
! 223:
! 224: -- DESCRIPTION :
! 225: -- Creates a poset for counting general subspace intersections,
! 226: -- by incrementing the top and decrementing the bottom pivots.
! 227:
! 228: root : Node(p) := Trivial_Root(m,p,q);
! 229: lnkroot : Link_to_Node := new Node'(root);
! 230: codim : constant Bracket := Read_Codimensions(m,p,q);
! 231:
! 232: begin
! 233: Q_Top_Bottom_Create(lnkroot,codim,root.bottom(p),m+p);
! 234: put_line("The poset created in a mixed fashion : ");
! 235: Write_Poset(Standard_Output,lnkroot,m,p,q);
! 236: end Create_Mixed_General_Poset;
! 237:
! 238: procedure Test_Root_Counts
! 239: ( file : in file_type;
! 240: m,p,q : in natural; codim : in Bracket; bug : out boolean ) is
! 241:
! 242: -- DESCRIPTION :
! 243: -- Computes the root count in various ways for the given vector
! 244: -- of co-dimensions. Compares the results and reports bugs.
! 245:
! 246: mpq : constant natural := m*p + q*(m+p);
! 247: top_root0,bot_root0,mix_root0 : Node(p);
! 248: lnk_top_root0 : Link_to_Node := new Node'(top_root0);
! 249: lnk_bot_root0 : Link_to_Node := new Node'(bot_root0);
! 250: lnk_mix_root0 : Link_to_Node := new Node'(mix_root0);
! 251: top_poset0,bot_poset0,mix_poset0 : Array_of_Nodes(0..mpq);
! 252: top_rootq,bot_rootq,mix_rootq : Node(p);
! 253: lnk_top_rootq : Link_to_Node := new Node'(top_rootq);
! 254: lnk_bot_rootq : Link_to_Node := new Node'(bot_rootq);
! 255: lnk_mix_rootq : Link_to_Node := new Node'(mix_rootq);
! 256: top_posetq,bot_posetq,mix_posetq : Array_of_Nodes(0..mpq);
! 257:
! 258: begin
! 259: bug := false;
! 260: if q = 0
! 261: then top_root0 := Trivial_Root(m,p);
! 262: bot_root0 := Trivial_Root(m,p);
! 263: mix_root0 := Trivial_Root(m,p);
! 264: lnk_top_root0 := new Node'(top_root0);
! 265: lnk_bot_root0 := new Node'(bot_root0);
! 266: lnk_mix_root0 := new Node'(mix_root0);
! 267: Top_Create(lnk_top_root0,codim,m+p);
! 268: Bottom_Create(lnk_bot_root0,codim);
! 269: Top_Bottom_Create(lnk_mix_root0,codim,m+p);
! 270: top_poset0 := Create_Leveled_Poset(lnk_top_root0);
! 271: bot_poset0 := Create_Leveled_Poset(lnk_bot_root0);
! 272: mix_poset0 := Create_Leveled_Poset(lnk_mix_root0);
! 273: Count_Roots(top_poset0);
! 274: Count_Roots(bot_poset0);
! 275: Count_Roots(mix_poset0);
! 276: end if;
! 277: top_rootq := Trivial_Root(m,p,q);
! 278: bot_rootq := Trivial_Root(m,p,q);
! 279: mix_rootq := Trivial_Root(m,p,q);
! 280: lnk_top_rootq := new Node'(top_rootq);
! 281: lnk_bot_rootq := new Node'(bot_rootq);
! 282: lnk_mix_rootq := new Node'(mix_rootq);
! 283: Q_Top_Create(lnk_top_rootq,codim,top_rootq.bottom(p),m+p);
! 284: Q_Bottom_Create(lnk_bot_rootq,codim,m+p);
! 285: Q_Top_Bottom_Create(lnk_mix_rootq,codim,mix_rootq.bottom(p),m+p);
! 286: top_posetq := Create_Leveled_Poset(lnk_top_rootq);
! 287: bot_posetq := Create_Leveled_Poset(lnk_bot_rootq);
! 288: mix_posetq := Create_Leveled_Poset(lnk_mix_rootq);
! 289: Count_Roots(top_posetq);
! 290: Count_Roots(bot_posetq);
! 291: Count_Roots(mix_posetq);
! 292: if q = 0
! 293: then
! 294: put(file,top_poset0(mpq).roco,1);
! 295: if top_poset0(mpq).roco = bot_poset0(mpq).roco
! 296: then
! 297: put(file," = ");
! 298: put(file,bot_poset0(mpq).roco,1); bug := false;
! 299: if bot_poset0(mpq).roco = mix_poset0(mpq).roco
! 300: then
! 301: bug := false;
! 302: put(file," = "); put(file,mix_poset0(mpq).roco,1);
! 303: else
! 304: bug := true;
! 305: put(file," <> "); put(file,mix_poset0(mpq).roco,1);
! 306: put_line(file," BUG !!!");
! 307: put_line(file,"The poset created incrementing top pivots : ");
! 308: Write_Poset(file,lnk_top_root0,m,p,q);
! 309: put_line(file,"The poset created decrementing bottom pivots : ");
! 310: Write_Poset(file,lnk_bot_root0,m,p,q);
! 311: put_line(file,"The poset created in a mixed fashion : ");
! 312: Write_Poset(file,lnk_mix_root0,m,p,q);
! 313: end if;
! 314: else
! 315: bug := true;
! 316: put(file," <> "); put(file,bot_poset0(mpq).roco,1);
! 317: put_line(file," BUG !!!");
! 318: put_line(file,"The poset created incrementing top pivots : ");
! 319: Write_Poset(file,lnk_top_root0,m,p,q);
! 320: put_line(file,"The poset created decrementing bottom pivots : ");
! 321: Write_Poset(file,lnk_bot_root0,m,p,q);
! 322: end if;
! 323: end if;
! 324: if q = 0
! 325: then
! 326: if top_posetq(mpq).roco /= top_poset0(mpq).roco
! 327: then
! 328: bug := true;
! 329: put(file," <> "); put(file,top_posetq(mpq).roco,1);
! 330: put_line(file," BUG !!!");
! 331: put_line(file,"The poset created without q = 0 : ");
! 332: Write_Poset(file,lnk_top_root0,m,p,q);
! 333: put_line(file,"The poset created with q = 0 : ");
! 334: Write_Poset(file,lnk_bot_rootq,m,p,q);
! 335: else
! 336: put(file," = ");
! 337: end if;
! 338: end if;
! 339: if not bug
! 340: then
! 341: put(file,top_posetq(mpq).roco,1);
! 342: if top_posetq(mpq).roco = bot_posetq(mpq).roco
! 343: then
! 344: put(file," = ");
! 345: put(file,bot_posetq(mpq).roco,1); bug := false;
! 346: if bot_posetq(mpq).roco = mix_posetq(mpq).roco
! 347: then
! 348: bug := false;
! 349: put(file," = "); put(file,mix_posetq(mpq).roco,1); new_line(file);
! 350: else
! 351: bug := true;
! 352: put(file," <> "); put(file,mix_posetq(mpq).roco,1);
! 353: put_line(file," BUG !!!");
! 354: put_line(file,"The poset created incrementing top pivots : ");
! 355: Write_Poset(file,lnk_top_rootq,m,p,q);
! 356: put_line(file,"The poset created decrementing bottom pivots : ");
! 357: Write_Poset(file,lnk_bot_rootq,m,p,q);
! 358: put_line(file,"The poset created in a mixed fashion : ");
! 359: Write_Poset(file,lnk_mix_rootq,m,p,q);
! 360: end if;
! 361: else
! 362: bug := true;
! 363: put(file," <> "); put(file,bot_posetq(mpq).roco,1);
! 364: put_line(file," BUG !!!");
! 365: put_line(file,"The poset created incrementing top pivots : ");
! 366: Write_Poset(file,lnk_top_rootq,m,p,q);
! 367: put_line(file,"The poset created decrementing bottom pivots : ");
! 368: Write_Poset(file,lnk_bot_rootq,m,p,q);
! 369: end if;
! 370: end if;
! 371: Clear(top_poset0); Clear(bot_poset0); Clear(mix_poset0);
! 372: Clear(top_posetq); Clear(bot_posetq); Clear(mix_posetq);
! 373: end Test_Root_Counts;
! 374:
! 375: procedure Enumerate_Partitions
! 376: ( file : in file_type; m,p,q : in natural ) is
! 377:
! 378: -- DESCRIPTION :
! 379: -- Test the root counts for all partitions of m*p + q*(m+p).
! 380: -- The results are written on file.
! 381:
! 382: n : constant natural := m*p + q*(m+p);
! 383: accu : Bracket(1..n);
! 384: bug : boolean := false;
! 385:
! 386: procedure Enumerate ( k,nk : in natural ) is
! 387: begin
! 388: if nk = 0
! 389: then put(file,n,1); put(file," = ");
! 390: for i in 1..k-2 loop
! 391: put(file,accu(i),1); put(file," + ");
! 392: end loop;
! 393: put(file,accu(k-1),1); put(file," : ");
! 394: Test_Root_Counts(file,m,p,q,accu(1..k-1),bug);
! 395: else for i in 1..nk loop
! 396: exit when (i > m);
! 397: accu(k) := i;
! 398: Enumerate(k+1,nk-i);
! 399: exit when bug;
! 400: end loop;
! 401: end if;
! 402: end Enumerate;
! 403:
! 404: begin
! 405: Enumerate(1,n);
! 406: end Enumerate_Partitions;
! 407:
! 408: procedure Main is
! 409:
! 410: m,p,q : natural;
! 411: ans : character;
! 412: file : file_type;
! 413:
! 414: begin
! 415: loop
! 416: new_line;
! 417: put_line("MENU for posets for counting p-planes in (m+p)-space : ");
! 418: put_line(" 0. exit this program.");
! 419: put_line("-------- the case q = 0 ------------------------------------");
! 420: put_line(" 1. k_i == 1 consistently incrementing the top pivots.");
! 421: put_line(" 2. consistently decrementing the bottom pivots.");
! 422: put_line(" 3. mixed top-bottom sequence for poset creation.");
! 423: put_line(" 4. k_i >= 1 consistently incrementing the top pivots.");
! 424: put_line(" 5. consistently decrementing the bottom pivots.");
! 425: put_line(" 6. mixed top-bottom sequence for poset creation.");
! 426: put_line(" 7. Enumerate all partitions of m*p and test root counts.");
! 427: put_line("-------- the case q >= 0 -----------------------------------");
! 428: put_line(" 8. k_i == 1 consistently incrementing top pivots.");
! 429: put_line(" 9. consistently decrementing bottom pivots.");
! 430: put_line(" A. mixed top-bottom sequence for pivots.");
! 431: put_line(" B. k_i >= 1 consistently incrementing top pivots.");
! 432: put_line(" C. consistently decrementing bottom pivots.");
! 433: put_line(" D. mixed top-bottom sequence for pivots.");
! 434: put_line(" E. Test root counts for all partitions of m*p + q*(m+p).");
! 435: put_line("------------------------------------------------------------");
! 436: put("Type 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, or E to choose : ");
! 437: Ask_Alternative(ans,"0123456789ABCDE");
! 438: exit when ans = '0';
! 439: if ans = '7' or ans = 'E'
! 440: then new_line;
! 441: put_line("Reading the name of the output file.");
! 442: Read_Name_and_Create_File(file);
! 443: end if;
! 444: new_line;
! 445: put("Give p, the number of entries in bracket : "); get(p);
! 446: put("Give m, the complementary dimension : "); get(m);
! 447: new_line;
! 448: case ans is
! 449: when '1' => Create_Top_Hypersurface_Poset(m,p);
! 450: when '2' => Create_Bottom_Hypersurface_Poset(m,p);
! 451: when '3' => Create_Mixed_Hypersurface_Poset(m,p);
! 452: when '4' => Create_Top_General_Poset(m,p);
! 453: when '5' => Create_Bottom_General_Poset(m,p);
! 454: when '6' => Create_Mixed_General_Poset(m,p);
! 455: when '7' => Enumerate_Partitions(file,m,p,0);
! 456: when '8' => put("Give q, the degree of the maps : "); get(q);
! 457: Create_Top_Hypersurface_Poset(m,p,q);
! 458: when '9' => put("Give q, the degree of the maps : "); get(q);
! 459: Create_Bottom_Hypersurface_Poset(m,p,q);
! 460: when 'A' => put("Give q, the degree of the maps : "); get(q);
! 461: Create_Mixed_Hypersurface_Poset(m,p,q);
! 462: when 'B' => put("Give q, the degree of the maps : "); get(q);
! 463: Create_Top_General_Poset(m,p,q);
! 464: when 'C' => put("Give q, the degree of the maps : "); get(q);
! 465: Create_Bottom_General_Poset(m,p,q);
! 466: when 'D' => put("Give q, the degree of the maps : "); get(q);
! 467: Create_Mixed_General_Poset(m,p,q);
! 468: when 'E' => put("Give q, the degree of the maps : "); get(q);
! 469: Enumerate_Partitions(file,m,p,q);
! 470: when others => put_line("Option not recognized. Please try again.");
! 471: end case;
! 472: end loop;
! 473: end Main;
! 474:
! 475: begin
! 476: new_line;
! 477: put_line("Test on localization posets for linear subspace intersections.");
! 478: Main;
! 479: end ts_posets;
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>