source: branches/ralph/src/main/java/de/ugoe/cs/autoquest/tasktrees/alignment/pal/tree/SimpleTree.java @ 1573

Last change on this file since 1573 was 1573, checked in by rkrimmel, 10 years ago

Now really adding PAL Library

File size: 5.8 KB
Line 
1// SimpleTree.java
2//
3// (c) 1999-2001 PAL Development Core Team
4//
5// This package may be distributed under the
6// terms of the Lesser GNU General Public License (LGPL)
7
8
9package de.ugoe.cs.autoquest.tasktrees.alignment.pal.tree;
10
11import java.io.PrintWriter;
12import java.io.Serializable;
13import java.io.StringWriter;
14import java.util.Hashtable;
15
16import de.ugoe.cs.autoquest.tasktrees.alignment.pal.misc.Identifier;
17import de.ugoe.cs.autoquest.tasktrees.alignment.pal.misc.LabelMapping;
18
19
20
21/**
22 * data structure for a binary/non-binary rooted/unrooted trees
23 *
24 * @version $Id: SimpleTree.java,v 1.19 2002/01/13 23:13:24 matt Exp $
25 *
26 * @author Alexei Drummond
27 * @author Korbinian Strimmer
28 *
29 */
30public class SimpleTree implements Tree
31{
32        //
33        // This class has explicit serialization code so if you alter any fields please alter
34        // the serialization code too (make sure you use a new version number - see readObject/writeObject
35        // Thanks, Matthew
36
37        //
38        // Public stuff
39        //
40
41        //
42        // Private stuff
43        /** root node */
44        private Node root;
45
46        /** list of internal nodes (including root) */
47        private Node[] internalNode = null;
48
49        /** number of internal nodes (including root) */
50        private int numInternalNodes;
51
52        /** list of external nodes */
53        private Node[] externalNode = null;
54
55        /** number of external nodes */
56        private int numExternalNodes;
57
58        /** attributes attached to this tree. */
59        private Hashtable[] attributes = null;
60
61
62
63        /** constructor tree consisting solely of root node */
64        public SimpleTree() {
65
66                // Default configuration
67                root = new FengDoolittleNode();
68                root.setIdentifier(new Identifier("ROOT"));
69                root.setBranchLength(0.0);
70                root.setBranchLengthSE(0.0);
71        }
72
73        /** constructor taking a root node */
74        public SimpleTree(Node r) {
75
76                root = r;
77                createNodeList();
78        }
79
80        /** clone constructor */
81        public SimpleTree(Tree tree)
82        {
83                root = new FengDoolittleNode(tree.getRoot());
84                createNodeList();
85        }
86
87        /** clone constructor */
88        public SimpleTree(Tree tree, boolean keepIdentifiers)
89        {
90                root = new FengDoolittleNode(tree.getRoot(), keepIdentifiers);
91                createNodeList();
92        }
93        /**
94         * clone constructor
95         * @param lm - a label mapping use for translating the original label names into something else
96         */
97        public SimpleTree(Tree tree, LabelMapping lm)
98        {
99                root = new FengDoolittleNode(tree.getRoot(), lm);
100                createNodeList();
101        }
102
103
104
105        /**
106         * Returns the number of external nodes.
107         */
108        public final int getExternalNodeCount() {
109                if(externalNode==null) {
110                        createNodeList();
111                }
112                return numExternalNodes;
113        }
114
115        /**
116         * Returns the ith external node.
117         */
118        public final Node getExternalNode(int i) {
119                if(externalNode==null) {
120                        createNodeList();
121                }
122                return externalNode[i];
123        }
124
125        /**
126         * Returns the number of internal nodes.
127         */
128        public final int getInternalNodeCount() {
129                if(internalNode==null) {
130                        createNodeList();
131                }
132                return numInternalNodes;
133        }
134
135        /**
136         * Returns the ith internal node.
137         */
138        public final Node getInternalNode(int i) {
139                if(internalNode==null) {
140                        createNodeList();
141                }
142                return internalNode[i];
143        }
144
145        /**
146         * Returns the root node of this tree.
147         */
148        public final Node getRoot() {
149                return root;
150        }
151
152        /**
153         * Set a new node as root node.
154         */
155        public final void setRoot(Node r) {
156                root = r;
157                createNodeList();
158        }
159
160        /** count and list external and internal nodes and
161                compute heights of each node */
162        public void createNodeList()
163        {
164                numInternalNodes = 0;
165                numExternalNodes = 0;
166                Node node = root;
167                do
168                {
169                        node = NodeUtils.postorderSuccessor(node);
170                        if (node.isLeaf())
171                        {
172                                node.setNumber(numExternalNodes);
173                                numExternalNodes++;
174                        }
175                        else
176                        {
177                                node.setNumber(numInternalNodes);
178                                numInternalNodes++;
179                        }
180                }
181                while(node != root);
182
183                internalNode = new Node[numInternalNodes];
184                externalNode = new Node[numExternalNodes];
185                node = root;
186                do
187                {
188                        node = NodeUtils.postorderSuccessor(node);
189                        if (node.isLeaf())
190                        {
191                                externalNode[node.getNumber()] = node;
192                        }
193                        else
194                        {
195                                internalNode[node.getNumber()] = node;
196                        }
197                }
198                while(node != root);
199
200                // compute heights if it seems necessary
201                if (root.getNodeHeight() == 0.0) {
202                        NodeUtils.lengths2Heights(root);
203                }
204        }
205
206        /**
207         * return node with number num (as displayed in ASCII tree)
208         *
209         * @param num number of node
210         *
211         * @return node
212         */
213        public Node findNode(int num)
214        {
215                createNodeList();
216
217                if (num <= numExternalNodes)
218                {
219                        return externalNode[num-1];
220                }
221                else
222                {
223                        return internalNode[num-1-numExternalNodes];
224                }
225        }
226
227        private int getIndex(Node node) {
228                if (node.isLeaf()) return node.getNumber();
229                return getExternalNodeCount() + node.getNumber();
230        }
231
232        /**
233         * Sets an named attribute for a given node.
234         * @param node the node whose attribute is being set.
235         * @param name the name of the attribute.
236         * @param value the new value of the attribute.
237         */
238        public void setAttribute(Node node, String name, Object value) {
239                if (node instanceof AttributeNode) {
240                        ((AttributeNode)node).setAttribute(name, value);
241                } else {
242                        int index = getIndex(node);
243                        if (attributes == null) {
244                                attributes = new Hashtable[getExternalNodeCount() + getInternalNodeCount()];
245                        }
246                        if (attributes[index] == null) {
247                                attributes[index] = new Hashtable();
248                        }
249                        attributes[index].put(name, value);
250                }
251        }
252
253        public String toString() {
254                StringWriter sw = new StringWriter();
255                NodeUtils.printNH(new PrintWriter(sw), getRoot(), false, true, 0, true);
256                sw.write(";");
257                return sw.toString();
258        }
259
260        /**
261         * @return an object representing the named attributed for the numbered node.
262         * @param node the node being interrogated.
263         * @param name the name of the attribute of interest.
264         */
265        public Object getAttribute(Node node, String name) {
266                if (node instanceof AttributeNode) {
267                        return ((AttributeNode)node).getAttribute(name);
268                } else {
269                        int index = getIndex(node);
270                        if (attributes == null || attributes[index] == null) {
271                                return null;
272                        }
273                        return attributes[index].get(name);
274                }
275        }
276
277
278
279
280
281}
Note: See TracBrowser for help on using the repository browser.