You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							252 lines
						
					
					
						
							7.4 KiB
						
					
					
				
			
		
		
		
			
			
			
				
					
				
				
					
				
			
		
		
	
	
							252 lines
						
					
					
						
							7.4 KiB
						
					
					
				| The mtr package | |
| 
 | |
| Multiway-branch tree manipulation | |
| 
 | |
| Fabio Somenzi | |
| 
 | |
| ********************************************************************** | |
| 
 | |
| Mtr_AllocNode()                Allocates new tree node. | |
| 
 | |
| Mtr_CopyTree()                 Makes a copy of tree. | |
| 
 | |
| Mtr_CreateFirstChild()         Creates a new node and makes it the first child | |
|                                of parent. | |
| 
 | |
| Mtr_CreateLastChild()          Creates a new node and makes it the last child | |
|                                of parent. | |
| 
 | |
| Mtr_DeallocNode()              Deallocates tree node. | |
| 
 | |
| Mtr_DissolveGroup()            Merges the children of `group' with the | |
|                                children of its parent. | |
| 
 | |
| Mtr_FindGroup()                Finds a group with size leaves starting at low, | |
|                                if it exists. | |
| 
 | |
| Mtr_FreeTree()                 Disposes of tree rooted at node. | |
| 
 | |
| Mtr_InitGroupTree()            Allocate new tree. | |
| 
 | |
| Mtr_InitTree()                 Initializes tree with one node. | |
| 
 | |
| Mtr_MakeFirstChild()           Makes child the first child of parent. | |
| 
 | |
| Mtr_MakeGroup()                Makes a new group with size leaves starting at | |
|                                low. | |
| 
 | |
| Mtr_MakeLastChild()            Makes child the last child of parent. | |
| 
 | |
| Mtr_MakeNextSibling()          Makes second the next sibling of first. | |
| 
 | |
| Mtr_PrintGroups()              Prints the groups as a parenthesized list. | |
| 
 | |
| Mtr_PrintTree()                Prints a tree, one node per line. | |
| 
 | |
| Mtr_ReadGroups()               Reads groups from a file and creates a group | |
|                                tree. | |
| 
 | |
| Mtr_SwapGroups()               Swaps two children of a tree node. | |
| 
 | |
| ********************************************************************** | |
| 
 | |
| This package provides two layers of functions. Functions   of the lower level | |
| manipulate multiway-branch trees, implemented   according to the classical | |
| scheme whereby each node points to its   first child and its previous and | |
| next siblings. These functions are   collected in mtrBasic.c.   Functions | |
| of the upper layer deal with group trees, that is the trees   used by group | |
| sifting to represent the grouping of variables. These   functions are | |
| collected in mtrGroup.c. | |
| 
 | |
| MtrNode * | |
| Mtr_AllocNode( | |
| 
 | |
| ) | |
|   Allocates new tree node. Returns pointer to node. | |
| 
 | |
|   Side Effects: None | |
| 
 | |
| MtrNode * | |
| Mtr_CopyTree( | |
|   MtrNode *         node, | |
|   int               expansion | |
| ) | |
|   Makes a copy of tree. If parameter expansion is greater than 1, it will | |
|   expand the tree by that factor. It is an error for expansion to be less than | |
|   1. Returns a pointer to the copy if successful; NULL otherwise. | |
| 
 | |
|   Side Effects: None | |
| 
 | |
| MtrNode * | |
| Mtr_CreateFirstChild( | |
|   MtrNode *         parent | |
| ) | |
|   Creates a new node and makes it the first child of parent. Returns pointer | |
|   to new child. | |
| 
 | |
|   Side Effects: None | |
| 
 | |
| MtrNode * | |
| Mtr_CreateLastChild( | |
|   MtrNode *         parent | |
| ) | |
|   Creates a new node and makes it the last child of parent. Returns pointer to | |
|   new child. | |
| 
 | |
|   Side Effects: None | |
| 
 | |
| void | |
| Mtr_DeallocNode( | |
|   MtrNode *         node             node to be deallocated | |
| ) | |
|   Deallocates tree node. | |
| 
 | |
|   Side Effects: None | |
| 
 | |
| MtrNode * | |
| Mtr_DissolveGroup( | |
|   MtrNode *         group            group to be dissolved | |
| ) | |
|   Merges the children of `group' with the children of its parent. Disposes of | |
|   the node pointed by group. If group is the root of the group tree, this | |
|   procedure leaves the tree unchanged. Returns the pointer to the parent of | |
|   `group' upon successful termination; NULL otherwise. | |
| 
 | |
|   Side Effects: None | |
| 
 | |
| MtrNode * | |
| Mtr_FindGroup( | |
|   MtrNode *         root,            root of the group tree | |
|   unsigned int      low,             lower bound of the group | |
|   unsigned int      size             upper bound of the group | |
| ) | |
|   Finds a group with size leaves starting at low, if it exists. This procedure | |
|   relies on the low and size fields of each node. It also assumes that the | |
|   children of each node are sorted in order of increasing low. Returns the | |
|   pointer to the root of the group upon successful termination; NULL | |
|   otherwise. | |
| 
 | |
|   Side Effects: None | |
| 
 | |
| void | |
| Mtr_FreeTree( | |
|   MtrNode *         node | |
| ) | |
|   Disposes of tree rooted at node. | |
| 
 | |
|   Side Effects: None | |
| 
 | |
| MtrNode * | |
| Mtr_InitGroupTree( | |
|   int               lower, | |
|   int               size | |
| ) | |
|   Allocate new tree with one node, whose low and size fields are specified by | |
|   the lower and size parameters. Returns pointer to tree root. | |
| 
 | |
|   Side Effects: None | |
| 
 | |
| MtrNode * | |
| Mtr_InitTree( | |
| 
 | |
| ) | |
|   Initializes tree with one node. Returns pointer to node. | |
| 
 | |
|   Side Effects: None | |
| 
 | |
| void | |
| Mtr_MakeFirstChild( | |
|   MtrNode *         parent, | |
|   MtrNode *         child | |
| ) | |
|   Makes child the first child of parent. | |
| 
 | |
|   Side Effects: None | |
| 
 | |
| MtrNode * | |
| Mtr_MakeGroup( | |
|   MtrNode *         root,            root of the group tree | |
|   unsigned int      low,             lower bound of the group | |
|   unsigned int      size,            upper bound of the group | |
|   unsigned int      flags            flags for the new group | |
| ) | |
|   Makes a new group with size leaves starting at low. If the new group | |
|   intersects an existing group, it must either contain it or be contained by | |
|   it. This procedure relies on the low and size fields of each node. It also | |
|   assumes that the children of each node are sorted in order of increasing | |
|   low. In case of a valid request, the flags of the new group are set to the | |
|   value passed in `flags.' This can also be used to change the flags of an | |
|   existing group. Returns the pointer to the root of the new group upon | |
|   successful termination; NULL otherwise. If the group already exists, the | |
|   pointer to its root is returned. | |
| 
 | |
|   Side Effects: None | |
| 
 | |
| void | |
| Mtr_MakeLastChild( | |
|   MtrNode *         parent, | |
|   MtrNode *         child | |
| ) | |
|   Makes child the last child of parent. | |
| 
 | |
|   Side Effects: None | |
| 
 | |
| void | |
| Mtr_MakeNextSibling( | |
|   MtrNode *         first, | |
|   MtrNode *         second | |
| ) | |
|   Makes second the next sibling of first. Second becomes a child of the parent | |
|   of first. | |
| 
 | |
|   Side Effects: None | |
| 
 | |
| void | |
| Mtr_PrintGroups( | |
|   MtrNode *         root,            root of the group tree | |
|   int               silent           flag to check tree syntax only | |
| ) | |
|   Prints the groups as a parenthesized list. After each group, the group's | |
|   flag are printed, preceded by a `|'. For each flag (except MTR_TERMINAL) a | |
|   character is printed.  F: MTR_FIXED N: MTR_NEWNODE S: | |
|   MTR_SOFT  The second argument, silent, if different from 0, causes | |
|   Mtr_PrintGroups to only check the syntax of the group tree. | |
| 
 | |
|   Side Effects: None | |
| 
 | |
| void | |
| Mtr_PrintTree( | |
|   MtrNode *         node | |
| ) | |
|   Prints a tree, one node per line. | |
| 
 | |
|   Side Effects: None | |
| 
 | |
| MtrNode * | |
| Mtr_ReadGroups( | |
|   FILE *            fp,              file pointer | |
|   int               nleaves          number of leaves of the new tree | |
| ) | |
|   Reads groups from a file and creates a group tree. Each group is specified | |
|   by three fields: low size flags.  Low and size are (short) | |
|   integers. Flags is a string composed of the following characters (with | |
|   associated translation):  D: MTR_DEFAULT F: MTR_FIXED N: | |
|   MTR_NEWNODE S: MTR_SOFT T: MTR_TERMINAL  Normally, the only | |
|   flags that are needed are D and F. Groups and fields are separated by white | |
|   space (spaces, tabs, and newlines). Returns a pointer to the group tree if | |
|   successful; NULL otherwise. | |
| 
 | |
|   Side Effects: None | |
| 
 | |
| int | |
| Mtr_SwapGroups( | |
|   MtrNode *         first,           first node to be swapped | |
|   MtrNode *         second           second node to be swapped | |
| ) | |
|   Swaps two children of a tree node. Adjusts the high and low fields of the | |
|   two nodes and their descendants. The two children must be adjacent. However, | |
|   first may be the younger sibling of second. Returns 1 in case of success; 0 | |
|   otherwise. | |
| 
 | |
|   Side Effects: None | |
| 
 |