Annotation of OpenXM_contrib/PHC/Ada/Schubert/localization_posets.ads, Revision 1.1
1.1 ! maekawa 1: with Standard_Natural_Vectors; use Standard_Natural_Vectors;
! 2: with Brackets; use Brackets;
! 3:
! 4: package Localization_Posets is
! 5:
! 6: -- DESCRIPTION :
! 7: -- This package provides an abstraction of a poset of localization patterns.
! 8: -- A localization pattern is characterized by top and bottom pivots,
! 9: -- represented by a pair of brackets. In constructing the poset we can
! 10: -- decrement the top pivots or increment the bottom pivots, when moving
! 11: -- to lower-dimensional spaces that contain the special p-planes.
! 12: -- We denote the Grassmannian of all p-planes in n-space by G(p,m+p),
! 13: -- where n = m+p.
! 14:
! 15: -- DATASTRUCTURES :
! 16:
! 17: type Node_Type is (top,bottom,mixed);
! 18:
! 19: type Node;
! 20: type Link_to_Node is access Node;
! 21:
! 22: type Array_of_Nodes is array ( integer range <> ) of Link_to_Node;
! 23: type Link_to_Array_of_Nodes is access Array_of_Nodes;
! 24: type Array_of_Array_of_Nodes is
! 25: array ( integer range <> ) of Link_to_Array_of_Nodes;
! 26:
! 27: type Matrix_of_Nodes is
! 28: array ( integer range <>, integer range <> ) of Link_to_Node;
! 29:
! 30: type Node ( p : natural ) is record
! 31: tp : Node_Type; -- type of node
! 32: level,label : natural; -- coordinates in poset
! 33: roco : integer; -- root count, also as flag
! 34: top,bottom : Bracket(1..p); -- top(i) <= bottom(i)
! 35: prev_sibling : Link_to_Node; -- previous node at same level
! 36: next_sibling : Link_to_Node; -- next node at same level
! 37: children : Matrix_of_Nodes(0..p,0..p);
! 38: child_labels : Link_to_Vector;
! 39: end record;
! 40: -- The level of a node is a natural number between m*p+q*(m+p) and 0,
! 41: -- children nodes have a level number that is one less.
! 42: -- At a leaf in the poset, level = 0 and the p-plane is completely specified.
! 43: -- At the root of the poset, level = m*p and any p-plane will fit it.
! 44: -- For the quantum case, the bottom level is m*p+q*(m+p).
! 45: -- In going up in the poset, the top pivots are incremented and
! 46: -- the bottom pivots are decremented, keeping top(i) <= bottom(i).
! 47: -- The field roco (root count) is determined by the root counting procedure.
! 48: -- At a leaf, roco = 1. At a node, roco = sum of roco's of its children.
! 49: -- The labels of the children are determined in a indexed poset.
! 50:
! 51: -- CREATORS :
! 52:
! 53: function Trivial_Root ( m,p : natural ) return Node;
! 54:
! 55: -- DESCRIPTION :
! 56: -- Returns the root of the localization poset, with top and bottom pivots
! 57: -- for the trivial localization pattern for any p-plane in (m+p)-space.
! 58: -- The level of the trivial root equals m+p.
! 59:
! 60: function Trivial_Root ( m,p,q : natural ) return Node;
! 61:
! 62: -- DESCRIPTION :
! 63: -- Returns the root for the poset to count all curves of degree q.
! 64: -- The case q = 0 is the default, as implemented by the routine above.
! 65:
! 66: procedure Top_Create ( root : in out Link_to_Node; n : in natural );
! 67:
! 68: -- DESCRIPTION :
! 69: -- Creates a poset consistently incrementing top pivots,
! 70: -- where n is the maximal entry in a top pivot.
! 71:
! 72: procedure Q_Top_Create ( root : in out Link_to_Node; n,lag : in natural );
! 73:
! 74: -- DESCRIPTION :
! 75: -- Creates a poset consistently incrementing top pivots,
! 76: -- where n is the maximal entry in a top pivot and lag the maximal
! 77: -- space between first and last entry, typically, lag = m+p.
! 78: -- For root = Trivial_Root(m,p,q) this poset will serve to count all
! 79: -- maps of degree q in G(p,m+p) that meet m*p+q*(m+p) general m-planes.
! 80:
! 81: procedure Top_Create ( root : in out Link_to_Node;
! 82: k : in Bracket; n : in natural );
! 83:
! 84: -- DESCRIPTION :
! 85: -- Creates the poset by incrementing top pivots, with k = co-dimensions.
! 86: -- By default, compared to the other Top_Create, all k's are one.
! 87: -- So all nodes created are of type "top".
! 88:
! 89: procedure Q_Top_Create ( root : in out Link_to_Node;
! 90: k : in Bracket; n,lag : in natural );
! 91:
! 92: -- DESCRIPTION :
! 93: -- Quantum analogue for creation of poset incrementing top pivots
! 94: -- for given co-dimension conditions.
! 95:
! 96: procedure Bottom_Create ( root : in out Link_to_Node );
! 97:
! 98: -- DESCRIPTION :
! 99: -- Creates a poset consistently decrementing bottom pivots.
! 100: -- So all nodes created are of type "bottom".
! 101:
! 102: procedure Q_Bottom_Create ( root : in out Link_to_Node; lag : in natural );
! 103:
! 104: -- DESCRIPTION :
! 105: -- Creates a poset consistently decrementing bottom pivots for counting
! 106: -- all maps of degree q with root = Trivial_Root(m,p,q).
! 107: -- The parameter lag > max space between first and last entry in brackets.
! 108:
! 109: procedure Bottom_Create ( root : in out Link_to_Node; k : in Bracket );
! 110:
! 111: -- DESCRIPTION :
! 112: -- Creates the poset by decrementing bottom pivots, k = co-dimensions.
! 113: -- By default, compared to the other Bottom_Create, all k's are one.
! 114:
! 115: procedure Q_Bottom_Create ( root : in out Link_to_Node; k : in Bracket;
! 116: lag : in natural );
! 117:
! 118: -- DESCRIPTION :
! 119: -- Quantum analogue for creation of poset decrementing bottom pivots
! 120: -- for given co-dimension conditions.
! 121:
! 122: procedure Top_Bottom_Create ( root : in out Link_to_Node; n : in natural );
! 123:
! 124: -- DESCRIPTION :
! 125: -- Creates a poset by incrementing top and decrementing bottom pivots.
! 126:
! 127: procedure Q_Top_Bottom_Create ( root : in out Link_to_Node;
! 128: n,lag : in natural );
! 129:
! 130: -- DESCRIPTION :
! 131: -- Creates a poset by incrementing top and decrementing bottom pivots
! 132: -- to count all maps of degree q in G(p,m+p) that meet m*p+q*(m+p)
! 133: -- general m-planes.
! 134:
! 135: procedure Top_Bottom_Create ( root : in out Link_to_Node;
! 136: k : in Bracket; n : in natural );
! 137:
! 138: -- DESCRIPTION :
! 139: -- Creates a poset by incrementing top and decrementing bottom pivots.
! 140: -- The vector k contains co-dimensions. All nodes are of type "mixed".
! 141:
! 142: procedure Q_Top_Bottom_Create ( root : in out Link_to_Node;
! 143: k : in Bracket; n,lag : in natural );
! 144:
! 145: -- DESCRIPTION :
! 146: -- Quantum analogue for creation of poset in mixed fashion,
! 147: -- for given co-dimension conditions.
! 148:
! 149: function Create_Leveled_Poset ( root : Link_to_Node ) return Array_of_Nodes;
! 150:
! 151: -- DESCRIPTION :
! 152: -- The array on return contains points to the first node at each level.
! 153:
! 154: function Create_Indexed_Poset ( poset : Array_of_Nodes )
! 155: return Array_of_Array_of_Nodes;
! 156:
! 157: -- DESCRIPTION :
! 158: -- Returns the poset structure where every node has a unique label.
! 159: -- Every node contains a vector with labels to the children.
! 160: -- The coordinates of every node in the poset on return is uniquely
! 161: -- determined by level and label, as poset(node.level)(node.label).
! 162:
! 163: -- SELECTORS :
! 164:
! 165: function Equal ( nd1,nd2 : Node ) return boolean;
! 166:
! 167: -- DESCRIPTION :
! 168: -- Returns true if the levels, top and bottom pivots are equal
! 169: -- for both nodes. False is returned otherwise.
! 170:
! 171: function Is_Leaf ( nd : Node ) return boolean;
! 172:
! 173: -- DESCRIPTION :
! 174: -- Returns true if the node has all its children empty.
! 175:
! 176: function Find_Node ( root : Link_to_Node; lvl : natural )
! 177: return Link_to_Node;
! 178:
! 179: -- DESCRIPTION :
! 180: -- Finds the first node at the given level.
! 181:
! 182: function Number_of_Siblings ( nd : Link_to_Node ) return natural;
! 183:
! 184: -- DESCRIPTION :
! 185: -- If nd = null, then 0 is returned else the number of return
! 186: -- equals the number of nonzero siblings plus one.
! 187:
! 188: function Number_of_Children ( nd : Node ) return natural;
! 189:
! 190: -- DESCRIPTION :
! 191: -- Returns the number of children of the node.
! 192:
! 193: -- ITERATORS :
! 194:
! 195: generic
! 196: with procedure Report ( lvlnd : in Node; continue : out boolean );
! 197: procedure Enumerate_Siblings ( nd : in Node );
! 198:
! 199: -- DESCRIPTION :
! 200: -- Visits all siblings of the given node and calls Report on each of them.
! 201:
! 202: generic
! 203: with procedure Report ( lnd : in Link_to_Node; continue : out boolean );
! 204: procedure Enumerate_Grand_Children ( nd : in Node; k : in positive );
! 205:
! 206: -- DESCRIPTION :
! 207: -- Enumerates all grandchildren of the node nd, k generations deep.
! 208: -- For k = 1, these are just the children of nd.
! 209:
! 210: generic
! 211: with procedure Modify ( lvlnd : in out Node; continue : out boolean );
! 212: procedure Modify_Siblings ( nd : in out Node );
! 213:
! 214: -- DESCRIPTION :
! 215: -- Runs through all siblings of the node and calls Modify on each of them.
! 216:
! 217: -- COMBINATORIAL ROOT COUNTING :
! 218:
! 219: procedure Count_Roots ( poset : in out Array_of_Nodes );
! 220:
! 221: -- DESCRIPTION :
! 222: -- Counts the roots by assigning roco fields in the leveled poset.
! 223: -- The total number of roots equals poset(poset'last).roco.
! 224:
! 225: function Row_Root_Count_Sum
! 226: ( poset : Array_of_Nodes; i : natural ) return natural;
! 227:
! 228: -- DESCRIPTION :
! 229: -- Sums up all the root counts at the i-th level in the poset.
! 230:
! 231: function Root_Count_Sum ( poset : Array_of_Nodes ) return natural;
! 232:
! 233: -- DESCRIPTION :
! 234: -- Returns the sum of all root counts over levels 1 and higher.
! 235: -- This amount equals the number of paths that need to be traced.
! 236:
! 237: -- DESTRUCTORS :
! 238:
! 239: procedure Clear ( nd : in out Node );
! 240:
! 241: -- DESCRIPTION :
! 242: -- Deallocation of the siblings.
! 243:
! 244: procedure Clear ( lnd : in out Link_to_Node );
! 245:
! 246: -- DESCRIPTION :
! 247: -- Releases the memory.
! 248:
! 249: procedure Clear ( arrnd : in out Array_of_Nodes );
! 250:
! 251: -- DESCRIPTION :
! 252: -- Deallocation of the memory sibling after sibling.
! 253:
! 254: procedure Clear ( arrnd : in out Link_to_Array_of_Nodes );
! 255:
! 256: -- DESCRIPTION :
! 257: -- Release of the pointers and deallocation of memory.
! 258:
! 259: procedure Clear ( arrnd : in out Array_of_Array_of_Nodes );
! 260:
! 261: -- DESCRIPTION :
! 262: -- Deallocation of all nodes in all arrays.
! 263:
! 264: procedure Clear ( matnd : in out Matrix_of_Nodes );
! 265:
! 266: -- DESCRIPTION :
! 267: -- Applies the nodes destructor to every element in the matrix.
! 268:
! 269: end Localization_Posets;
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>