4 // FORESTER -- software libraries and applications
5 // for evolutionary biology research and applications.
7 // Copyright (C) 2008-2009 Christian M. Zmasek
8 // Copyright (C) 2008-2009 Burnham Institute for Medical Research
11 // This library is free software; you can redistribute it and/or
12 // modify it under the terms of the GNU Lesser General Public
13 // License as published by the Free Software Foundation; either
14 // version 2.1 of the License, or (at your option) any later version.
16 // This library is distributed in the hope that it will be useful,
17 // but WITHOUT ANY WARRANTY; without even the implied warranty of
18 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
19 // Lesser General Public License for more details.
21 // You should have received a copy of the GNU Lesser General Public
22 // License along with this library; if not, write to the Free Software
23 // Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
25 // Contact: phylosoft @ gmail . com
26 // WWW: https://sites.google.com/site/cmzmasek/home/software/forester
28 package org.forester.evoinference;
31 import java.io.FileInputStream;
32 import java.io.StringWriter;
33 import java.util.Date;
34 import java.util.List;
36 import org.forester.archaeopteryx.Archaeopteryx;
37 import org.forester.evoinference.distance.NeighborJoining;
38 import org.forester.evoinference.distance.PairwiseDistanceCalculator;
39 import org.forester.evoinference.matrix.character.BasicCharacterStateMatrix;
40 import org.forester.evoinference.matrix.character.CharacterStateMatrix;
41 import org.forester.evoinference.matrix.character.CharacterStateMatrix.BinaryStates;
42 import org.forester.evoinference.matrix.character.CharacterStateMatrix.GainLossStates;
43 import org.forester.evoinference.matrix.distance.BasicSymmetricalDistanceMatrix;
44 import org.forester.evoinference.matrix.distance.DistanceMatrix;
45 import org.forester.evoinference.parsimony.DolloParsimony;
46 import org.forester.evoinference.parsimony.FitchParsimony;
47 import org.forester.io.parsers.GeneralMsaParser;
48 import org.forester.io.parsers.SymmetricalDistanceMatrixParser;
49 import org.forester.io.parsers.nhx.NHXParser;
50 import org.forester.msa.Msa;
51 import org.forester.phylogeny.Phylogeny;
52 import org.forester.phylogeny.factories.ParserBasedPhylogenyFactory;
53 import org.forester.phylogeny.factories.PhylogenyFactory;
54 import org.forester.util.ForesterUtil;
56 public class TestPhylogenyReconstruction {
58 private final static double ZERO_DIFF = 1.0E-9;
59 private final static boolean TIME = false;
61 public static boolean isEqual( final double a, final double b ) {
62 return ( ( Math.abs( a - b ) ) < ZERO_DIFF );
65 public static void main( final String[] args ) {
66 timeNeighborJoining();
69 public static boolean test( final File test_dir ) {
70 System.out.print( " Basic symmetrical distance matrix: " );
71 if ( !testBasicSymmetricalDistanceMatrix() ) {
72 System.out.println( "failed." );
75 System.out.println( "OK." );
76 System.out.print( " Basic character state matrix: " );
77 if ( !testBasicCharacterStateMatrix() ) {
78 System.out.println( "failed." );
81 System.out.println( "OK." );
82 System.out.print( " Symmetrical distance matrix parser: " );
83 if ( !testSymmetricalDistanceMatrixParser() ) {
84 System.out.println( "failed." );
87 System.out.println( "OK." );
88 System.out.print( " Distance Calculation: " );
89 if ( !testDistanceCalculationMethods( test_dir ) ) {
90 System.out.println( "failed." );
93 System.out.println( "OK." );
94 System.out.print( " Neighbor Joining: " );
95 if ( !testNeighborJoining() ) {
96 System.out.println( "failed." );
99 System.out.println( "OK." );
100 System.out.print( " Dollo Parsimony: " );
101 if ( !testDolloParsimony() ) {
102 System.out.println( "failed." );
105 System.out.println( "OK." );
106 System.out.print( " Dollo Parsimony on non binary trees: " );
107 if ( !testDolloParsimonyOnNonBinaryTree() ) {
108 System.out.println( "failed." );
111 System.out.println( "OK." );
112 System.out.print( " Fitch Parsimony: " );
113 if ( !testFitchParsimony() ) {
114 System.out.println( "failed." );
117 System.out.println( "OK." );
121 private static boolean testDistanceCalculationMethods( final File test_dir ) {
123 final Msa msa0 = GeneralMsaParser.parse( new FileInputStream( test_dir + ForesterUtil.FILE_SEPARATOR
125 final BasicSymmetricalDistanceMatrix pwd0 = PairwiseDistanceCalculator.calcKimuraDistances( msa0 );
126 if ( pwd0.getSize() != 120 ) {
129 for( int i = 0; i < pwd0.getSize(); ++i ) {
130 if ( !isEqual( pwd0.getValue( i, i ), 0.0 ) ) {
135 catch ( final Exception e ) {
136 e.printStackTrace( System.out );
142 private static boolean testBasicCharacterStateMatrix() {
144 final CharacterStateMatrix<String> matrix_0 = new BasicCharacterStateMatrix<String>( 4, 8 );
145 final CharacterStateMatrix<String> matrix_00 = new BasicCharacterStateMatrix<String>( 4, 8 );
146 matrix_0.setIdentifier( 0, "A" );
147 matrix_0.setIdentifier( 1, "B" );
148 matrix_0.setIdentifier( 2, "C" );
149 matrix_0.setIdentifier( 3, "D" );
150 matrix_0.setCharacter( 0, "0" );
151 matrix_0.setCharacter( 1, "1" );
152 matrix_0.setCharacter( 2, "2" );
153 matrix_0.setCharacter( 3, "3" );
154 matrix_0.setCharacter( 4, "4" );
155 matrix_0.setCharacter( 5, "5" );
156 matrix_0.setCharacter( 6, "6" );
157 matrix_0.setCharacter( 7, "7" );
158 matrix_00.setIdentifier( 0, "A" );
159 matrix_00.setIdentifier( 1, "B" );
160 matrix_00.setIdentifier( 2, "C" );
161 matrix_00.setIdentifier( 3, "D" );
162 matrix_00.setCharacter( 3, "3" );
163 matrix_00.setCharacter( 4, "4" );
164 if ( !matrix_0.getCharacter( 1 ).equals( "1" ) ) {
167 if ( !matrix_0.getIdentifier( 0 ).equals( "A" ) ) {
170 matrix_0.setState( 0, 0, "00" );
171 matrix_00.setState( 0, 0, "00" );
172 if ( !matrix_0.getState( 0, 0 ).equals( "00" ) ) {
175 matrix_0.setState( 0, 1, "01" );
176 matrix_00.setState( 0, 1, "01" );
177 if ( !matrix_0.getState( 0, 1 ).equals( "01" ) ) {
180 matrix_0.setState( 1, 1, "11" );
181 matrix_00.setState( 1, 1, "11" );
182 if ( !matrix_0.getState( 1, 1 ).equals( "11" ) ) {
185 matrix_0.setState( 1, 0, "10" );
186 matrix_00.setState( 1, 0, "10" );
187 if ( !matrix_0.getState( 1, 0 ).equals( "10" ) ) {
190 matrix_0.setState( 1, 2, "12" );
191 matrix_00.setState( 1, 2, "12" );
192 if ( !matrix_0.getState( 1, 2 ).equals( "12" ) ) {
195 matrix_0.setState( 3, 7, "37" );
196 matrix_00.setState( 3, 7, "37" );
197 if ( !matrix_0.getState( 3, 7 ).equals( "37" ) ) {
200 matrix_0.setState( 2, 6, "26" );
201 matrix_00.setState( 2, 6, "26" );
202 if ( !matrix_0.getState( 2, 6 ).equals( "26" ) ) {
205 matrix_0.setState( "D", "3", "33" );
206 matrix_00.setState( "D", "3", "33" );
207 if ( !matrix_0.getState( 3, 3 ).equals( "33" ) ) {
210 if ( !matrix_0.getState( "D", "3" ).equals( "33" ) ) {
213 matrix_0.setState( "C", "4", "24" );
214 matrix_00.setState( "C", "4", "24" );
215 if ( !matrix_0.getState( 2, 4 ).equals( "24" ) ) {
218 if ( !matrix_0.getState( "C", "4" ).equals( "24" ) ) {
221 if ( matrix_0.isEmpty() ) {
224 if ( matrix_0.getNumberOfIdentifiers() != 4 ) {
227 if ( matrix_0.getNumberOfCharacters() != 8 ) {
230 if ( !matrix_0.equals( matrix_0 ) ) {
233 if ( !matrix_0.equals( matrix_00 ) ) {
236 matrix_00.setState( "C", "4", "123" );
237 if ( matrix_0.equals( matrix_00 ) ) {
240 final Integer[][] ints = { { 1, 2, 3, 4 }, { 5, 6, 7, 8 }, { 9, 10, 11, 12 } };
241 final CharacterStateMatrix<Integer> matrix_000 = new BasicCharacterStateMatrix<Integer>( ints );
242 matrix_000.toString();
243 if ( matrix_000.getNumberOfCharacters() != 4 ) {
246 if ( matrix_000.getNumberOfIdentifiers() != 3 ) {
249 if ( matrix_000.getState( 0, 1 ) != 2 ) {
252 if ( matrix_000.getState( 2, 3 ) != 12 ) {
255 final Integer[][] ints0 = { { 1, 2, 3, 4 }, { 5, 6, 7, 8 }, { 9, 10, 11, 12 } };
256 final CharacterStateMatrix<Integer> matrix_0000 = new BasicCharacterStateMatrix<Integer>( ints0 );
257 if ( !matrix_000.equals( matrix_0000 ) ) {
260 final Integer[][] ints00 = { { 1, 2, 3, -4 }, { 5, 6, 7, 8 }, { 9, 10, 11, 12 } };
261 final CharacterStateMatrix<Integer> matrix_00000 = new BasicCharacterStateMatrix<Integer>( ints00 );
262 if ( matrix_000.equals( matrix_00000 ) ) {
265 final CharacterStateMatrix<String> clone0 = matrix_0.copy();
266 final CharacterStateMatrix<String> clone00 = matrix_00.copy();
267 if ( !clone0.equals( matrix_0 ) ) {
270 if ( !clone00.equals( matrix_00 ) ) {
273 if ( clone00.equals( clone0 ) ) {
276 final CharacterStateMatrix<String> pivot0 = matrix_0.pivot();
277 final CharacterStateMatrix<String> pivot00 = matrix_00.pivot();
278 if ( !pivot0.getState( 1, 0 ).equals( "01" ) ) {
281 if ( !pivot0.getState( 6, 2 ).equals( "26" ) ) {
284 if ( !matrix_0.getState( 2, 6 ).equals( "26" ) ) {
287 final CharacterStateMatrix<String> pivotpivot00 = pivot00.pivot();
288 if ( !pivotpivot00.equals( matrix_00 ) ) {
291 final CharacterStateMatrix<BinaryStates> nex = new BasicCharacterStateMatrix<BinaryStates>( 4, 3 );
292 nex.setIdentifier( 0, "amphioxus" );
293 nex.setIdentifier( 1, "sponge" );
294 nex.setIdentifier( 2, "sea_anemone" );
295 nex.setIdentifier( 3, "cobra" );
296 nex.setCharacter( 0, "notch" );
297 nex.setCharacter( 1, "homeobox" );
298 nex.setCharacter( 2, "wnt" );
299 nex.setState( 0, 0, BinaryStates.ABSENT );
300 nex.setState( 0, 1, BinaryStates.ABSENT );
301 nex.setState( 0, 2, BinaryStates.ABSENT );
302 nex.setState( 1, 0, BinaryStates.PRESENT );
303 nex.setState( 1, 1, BinaryStates.PRESENT );
304 nex.setState( 1, 2, BinaryStates.ABSENT );
305 nex.setState( 2, 0, BinaryStates.PRESENT );
306 nex.setState( 2, 1, BinaryStates.PRESENT );
307 nex.setState( 2, 2, BinaryStates.PRESENT );
308 nex.setState( 3, 0, BinaryStates.PRESENT );
309 nex.setState( 3, 1, BinaryStates.ABSENT );
310 nex.setState( 3, 2, BinaryStates.ABSENT );
311 StringWriter w = new StringWriter();
312 nex.toWriter( w, CharacterStateMatrix.Format.NEXUS_BINARY );
313 //System.out.println( w.getBuffer().toString() );
314 w = new StringWriter();
315 nex.pivot().toWriter( w, CharacterStateMatrix.Format.NEXUS_BINARY );
316 //System.out.println( w.getBuffer().toString() );
318 catch ( final Exception e ) {
319 e.printStackTrace( System.out );
325 private static boolean testBasicSymmetricalDistanceMatrix() {
327 final DistanceMatrix matrix_0 = new BasicSymmetricalDistanceMatrix( 4 );
328 matrix_0.setIdentifier( 0, "A" );
329 matrix_0.setIdentifier( 1, "B" );
330 matrix_0.setIdentifier( 2, "C" );
331 matrix_0.setIdentifier( 3, "0123456789012" );
332 matrix_0.setValue( 1, 0, 0.00001 );
333 matrix_0.setValue( 0, 2, 0.0000009 );
334 matrix_0.setValue( 3, 0, 3.0 );
335 matrix_0.setValue( 1, 2, 4.0 );
336 matrix_0.setValue( 3, 1, 5.0 );
337 matrix_0.setValue( 2, 3, 6.0 );
338 if ( !matrix_0.getIdentifier( 0 ).equals( "A" ) ) {
341 if ( !matrix_0.getIdentifier( 1 ).equals( "B" ) ) {
344 if ( !matrix_0.getIdentifier( 2 ).equals( "C" ) ) {
347 if ( !matrix_0.getIdentifier( 3 ).equals( "0123456789012" ) ) {
350 if ( matrix_0.getSize() != 4 ) {
353 if ( !isEqual( matrix_0.getValue( 0, 0 ), 0.0 ) ) {
356 if ( !isEqual( matrix_0.getValue( 3, 3 ), 0.0 ) ) {
359 if ( !isEqual( matrix_0.getValue( 0, 1 ), 0.00001 ) ) {
362 if ( !isEqual( matrix_0.getValue( 0, 2 ), 0.0000009 ) ) {
365 if ( !isEqual( matrix_0.getValue( 0, 3 ), 3 ) ) {
368 if ( !isEqual( matrix_0.getValue( 1, 0 ), 0.00001 ) ) {
371 if ( !isEqual( matrix_0.getValue( 1, 2 ), 4 ) ) {
374 if ( !isEqual( matrix_0.getValue( 1, 3 ), 5 ) ) {
377 if ( !isEqual( matrix_0.getValue( 2, 0 ), 0.0000009 ) ) {
380 if ( !isEqual( matrix_0.getValue( 2, 1 ), 4 ) ) {
383 if ( !isEqual( matrix_0.getValue( 2, 3 ), 6 ) ) {
386 if ( !isEqual( matrix_0.getValue( 3, 0 ), 3 ) ) {
389 if ( !isEqual( matrix_0.getValue( 3, 1 ), 5 ) ) {
392 if ( !isEqual( matrix_0.getValue( 3, 2 ), 6 ) ) {
395 final StringBuffer matrix_0_phylip = new StringBuffer();
396 matrix_0_phylip.append( " 4" );
397 matrix_0_phylip.append( ForesterUtil.LINE_SEPARATOR );
398 matrix_0_phylip.append( "A 0.000000 0.000010 0.000001 3.000000" );
399 matrix_0_phylip.append( ForesterUtil.LINE_SEPARATOR );
400 matrix_0_phylip.append( "B 0.000010 0.000000 4.000000 5.000000" );
401 matrix_0_phylip.append( ForesterUtil.LINE_SEPARATOR );
402 matrix_0_phylip.append( "C 0.000001 4.000000 0.000000 6.000000" );
403 matrix_0_phylip.append( ForesterUtil.LINE_SEPARATOR );
404 matrix_0_phylip.append( "0123456789 3.000000 5.000000 6.000000 0.000000" );
405 if ( !matrix_0_phylip.toString()
406 .equals( matrix_0.toStringBuffer( DistanceMatrix.Format.PHYLIP ).toString() ) ) {
410 catch ( final Exception e ) {
411 e.printStackTrace( System.out );
417 private static boolean testDolloParsimony() {
419 final BinaryStates PRESENT = BinaryStates.PRESENT;
420 final BinaryStates ABSENT = BinaryStates.ABSENT;
421 final GainLossStates UNCHANGED_PRESENT = GainLossStates.UNCHANGED_PRESENT;
422 final DolloParsimony dollo1 = DolloParsimony.createInstance();
423 final PhylogenyFactory factory1 = ParserBasedPhylogenyFactory.getInstance();
424 final String p1_str = "((((((a,b)ab,c)ac,d)ad,(e,f)ef)af,(g,h)gh)ah,i)r";
425 final Phylogeny p1 = factory1.create( p1_str, new NHXParser() )[ 0 ];
426 CharacterStateMatrix<CharacterStateMatrix.BinaryStates> m1 = new BasicCharacterStateMatrix<CharacterStateMatrix.BinaryStates>( 9,
428 m1.setIdentifier( 0, "a" );
429 m1.setIdentifier( 1, "b" );
430 m1.setIdentifier( 2, "c" );
431 m1.setIdentifier( 3, "d" );
432 m1.setIdentifier( 4, "e" );
433 m1.setIdentifier( 5, "f" );
434 m1.setIdentifier( 6, "g" );
435 m1.setIdentifier( 7, "h" );
436 m1.setIdentifier( 8, "i" );
437 m1.setCharacter( 0, "0" );
438 m1.setState( "a", "0", PRESENT );
439 m1.setState( "b", "0", ABSENT );
440 m1.setState( "c", "0", PRESENT );
441 m1.setState( "d", "0", ABSENT );
442 m1.setState( "e", "0", ABSENT );
443 m1.setState( "f", "0", ABSENT );
444 m1.setState( "g", "0", ABSENT );
445 m1.setState( "h", "0", ABSENT );
446 m1.setState( "i", "0", ABSENT );
447 dollo1.execute( p1, m1 );
448 if ( dollo1.getTotalGains() != 1 ) {
451 if ( dollo1.getTotalLosses() != 1 ) {
454 if ( dollo1.getTotalUnchanged() != 15 ) {
457 m1.setState( "b", "0", PRESENT );
458 dollo1.execute( p1, m1 );
459 if ( dollo1.getTotalGains() != 1 ) {
462 if ( dollo1.getTotalLosses() != 0 ) {
465 if ( dollo1.getTotalUnchanged() != 16 ) {
468 m1.setState( "b", "0", ABSENT );
469 m1.setState( "e", "0", PRESENT );
470 dollo1.execute( p1, m1 );
471 if ( dollo1.getTotalGains() != 1 ) {
474 if ( dollo1.getTotalLosses() != 3 ) {
477 if ( dollo1.getTotalUnchanged() != 13 ) {
480 m1.setState( "a", "0", ABSENT );
481 m1.setState( "c", "0", ABSENT );
482 m1.setState( "g", "0", PRESENT );
483 dollo1.setReturnInternalStates( true );
484 dollo1.setReturnGainLossMatrix( true );
485 dollo1.execute( p1, m1 );
486 if ( dollo1.getTotalGains() != 1 ) {
489 if ( dollo1.getTotalLosses() != 3 ) {
492 if ( dollo1.getTotalUnchanged() != 13 ) {
495 final DolloParsimony dollo2 = DolloParsimony.createInstance();
496 final PhylogenyFactory factory2 = ParserBasedPhylogenyFactory.getInstance();
497 final String p2_str = "((((((a,b)ab,c)ac,d)ad,(e,f)ef)af,(g,h,i)gi)ai,((j,k,l)jl,(m,n,o)mo,(p,q,r)pr)jr)root";
498 final Phylogeny p2 = factory2.create( p2_str, new NHXParser() )[ 0 ];
499 final CharacterStateMatrix<CharacterStateMatrix.BinaryStates> m2 = new BasicCharacterStateMatrix<CharacterStateMatrix.BinaryStates>( 18,
501 m2.setIdentifier( 0, "a" );
502 m2.setIdentifier( 1, "b" );
503 m2.setIdentifier( 2, "c" );
504 m2.setIdentifier( 3, "d" );
505 m2.setIdentifier( 4, "e" );
506 m2.setIdentifier( 5, "f" );
507 m2.setIdentifier( 6, "g" );
508 m2.setIdentifier( 7, "h" );
509 m2.setIdentifier( 8, "i" );
510 m2.setIdentifier( 9, "j" );
511 m2.setIdentifier( 10, "k" );
512 m2.setIdentifier( 11, "l" );
513 m2.setIdentifier( 12, "m" );
514 m2.setIdentifier( 13, "n" );
515 m2.setIdentifier( 14, "o" );
516 m2.setIdentifier( 15, "p" );
517 m2.setIdentifier( 16, "q" );
518 m2.setIdentifier( 17, "r" );
519 m2.setCharacter( 0, "0" );
520 m2.setCharacter( 1, "1" );
521 m2.setCharacter( 2, "2" );
522 m2.setCharacter( 3, "3" );
523 m2.setState( "a", "0", PRESENT );
524 m2.setState( "b", "0", ABSENT );
525 m2.setState( "c", "0", PRESENT );
526 m2.setState( "d", "0", ABSENT );
527 m2.setState( "e", "0", ABSENT );
528 m2.setState( "f", "0", ABSENT );
529 m2.setState( "g", "0", ABSENT );
530 m2.setState( "h", "0", ABSENT );
531 m2.setState( "i", "0", ABSENT );
532 m2.setState( "j", "0", ABSENT );
533 m2.setState( "k", "0", ABSENT );
534 m2.setState( "l", "0", ABSENT );
535 m2.setState( "m", "0", ABSENT );
536 m2.setState( "n", "0", ABSENT );
537 m2.setState( "o", "0", ABSENT );
538 m2.setState( "p", "0", ABSENT );
539 m2.setState( "q", "0", ABSENT );
540 m2.setState( "r", "0", ABSENT );
541 m2.setState( "a", "1", PRESENT );
542 m2.setState( "b", "1", ABSENT );
543 m2.setState( "c", "1", PRESENT );
544 m2.setState( "d", "1", ABSENT );
545 m2.setState( "e", "1", ABSENT );
546 m2.setState( "f", "1", ABSENT );
547 m2.setState( "g", "1", PRESENT );
548 m2.setState( "h", "1", ABSENT );
549 m2.setState( "i", "1", ABSENT );
550 m2.setState( "j", "1", PRESENT );
551 m2.setState( "k", "1", ABSENT );
552 m2.setState( "l", "1", ABSENT );
553 m2.setState( "m", "1", PRESENT );
554 m2.setState( "n", "1", ABSENT );
555 m2.setState( "o", "1", ABSENT );
556 m2.setState( "p", "1", ABSENT );
557 m2.setState( "q", "1", ABSENT );
558 m2.setState( "r", "1", ABSENT );
559 m2.setState( "a", "2", ABSENT );
560 m2.setState( "b", "2", ABSENT );
561 m2.setState( "c", "2", ABSENT );
562 m2.setState( "d", "2", ABSENT );
563 m2.setState( "e", "2", ABSENT );
564 m2.setState( "f", "2", ABSENT );
565 m2.setState( "g", "2", ABSENT );
566 m2.setState( "h", "2", ABSENT );
567 m2.setState( "i", "2", ABSENT );
568 m2.setState( "j", "2", PRESENT );
569 m2.setState( "k", "2", ABSENT );
570 m2.setState( "l", "2", ABSENT );
571 m2.setState( "m", "2", PRESENT );
572 m2.setState( "n", "2", ABSENT );
573 m2.setState( "o", "2", ABSENT );
574 m2.setState( "p", "2", PRESENT );
575 m2.setState( "q", "2", ABSENT );
576 m2.setState( "r", "2", ABSENT );
577 m2.setState( "a", "3", ABSENT );
578 m2.setState( "b", "3", ABSENT );
579 m2.setState( "c", "3", PRESENT );
580 m2.setState( "d", "3", ABSENT );
581 m2.setState( "e", "3", ABSENT );
582 m2.setState( "f", "3", ABSENT );
583 m2.setState( "g", "3", PRESENT );
584 m2.setState( "h", "3", ABSENT );
585 m2.setState( "i", "3", ABSENT );
586 m2.setState( "j", "3", ABSENT );
587 m2.setState( "k", "3", ABSENT );
588 m2.setState( "l", "3", ABSENT );
589 m2.setState( "m", "3", ABSENT );
590 m2.setState( "n", "3", ABSENT );
591 m2.setState( "o", "3", ABSENT );
592 m2.setState( "p", "3", ABSENT );
593 m2.setState( "q", "3", ABSENT );
594 m2.setState( "r", "3", ABSENT );
595 dollo2.setReturnInternalStates( true );
596 dollo2.setReturnGainLossMatrix( true );
597 dollo2.execute( p2, m2 );
598 final CharacterStateMatrix<BinaryStates> i_m = dollo2.getInternalStatesMatrix();
599 final CharacterStateMatrix<GainLossStates> gl_m = dollo2.getGainLossMatrix();
600 if ( dollo2.getTotalGains() != 3 ) {
603 if ( dollo2.getTotalLosses() != 22 ) {
606 if ( dollo2.getTotalUnchanged() != 95 ) {
609 if ( i_m.getState( "ab", "0" ) != PRESENT ) {
612 if ( i_m.getState( "ac", "0" ) != PRESENT ) {
615 if ( i_m.getState( "ad", "0" ) != ABSENT ) {
618 if ( i_m.getState( "af", "0" ) != ABSENT ) {
621 if ( i_m.getState( "ef", "0" ) != ABSENT ) {
624 if ( i_m.getState( "ai", "0" ) != ABSENT ) {
627 if ( i_m.getState( "gi", "0" ) != ABSENT ) {
630 if ( i_m.getState( "jl", "0" ) != ABSENT ) {
633 if ( i_m.getState( "mo", "0" ) != ABSENT ) {
636 if ( i_m.getState( "pr", "0" ) != ABSENT ) {
639 if ( i_m.getState( "jr", "0" ) != ABSENT ) {
642 if ( i_m.getState( "root", "0" ) != ABSENT ) {
645 if ( i_m.getState( "ab", "1" ) != PRESENT ) {
648 if ( i_m.getState( "ac", "1" ) != PRESENT ) {
651 if ( i_m.getState( "ad", "1" ) != PRESENT ) {
654 if ( i_m.getState( "af", "1" ) != PRESENT ) {
657 if ( i_m.getState( "ef", "1" ) != ABSENT ) {
660 if ( i_m.getState( "ai", "1" ) != PRESENT ) {
663 if ( i_m.getState( "gi", "1" ) != PRESENT ) {
666 if ( i_m.getState( "jl", "1" ) != PRESENT ) {
669 if ( i_m.getState( "mo", "1" ) != PRESENT ) {
672 if ( i_m.getState( "pr", "1" ) != ABSENT ) {
675 if ( i_m.getState( "jr", "1" ) != PRESENT ) {
678 if ( i_m.getState( "root", "1" ) != PRESENT ) {
681 if ( i_m.getState( "ab", "2" ) != ABSENT ) {
684 if ( i_m.getState( "ac", "2" ) != ABSENT ) {
687 if ( i_m.getState( "ad", "2" ) != ABSENT ) {
690 if ( i_m.getState( "af", "2" ) != ABSENT ) {
693 if ( i_m.getState( "ef", "2" ) != ABSENT ) {
696 if ( i_m.getState( "ai", "2" ) != ABSENT ) {
699 if ( i_m.getState( "gi", "2" ) != ABSENT ) {
702 if ( i_m.getState( "jl", "2" ) != PRESENT ) {
705 if ( i_m.getState( "mo", "2" ) != PRESENT ) {
708 if ( i_m.getState( "pr", "2" ) != PRESENT ) {
711 if ( i_m.getState( "jr", "2" ) != PRESENT ) {
714 if ( i_m.getState( "root", "2" ) != ABSENT ) {
717 if ( i_m.getState( "ab", "3" ) != ABSENT ) {
720 if ( i_m.getState( "ac", "3" ) != PRESENT ) {
723 if ( i_m.getState( "ad", "3" ) != PRESENT ) {
726 if ( i_m.getState( "af", "3" ) != PRESENT ) {
729 if ( i_m.getState( "ef", "3" ) != ABSENT ) {
732 if ( i_m.getState( "ai", "3" ) != PRESENT ) {
735 if ( i_m.getState( "gi", "3" ) != PRESENT ) {
738 if ( i_m.getState( "jl", "3" ) != ABSENT ) {
741 if ( i_m.getState( "mo", "3" ) != ABSENT ) {
744 if ( i_m.getState( "pr", "3" ) != ABSENT ) {
747 if ( i_m.getState( "jr", "3" ) != ABSENT ) {
750 if ( i_m.getState( "root", "3" ) != ABSENT ) {
753 if ( gl_m.getState( "a", "0" ) != UNCHANGED_PRESENT ) {
756 final DolloParsimony dollo9 = DolloParsimony.createInstance();
757 final PhylogenyFactory factory9 = ParserBasedPhylogenyFactory.getInstance();
758 final String p9_str = "((((((a,b)ab,c)ac,d)ad,(e,f)ef)af,(g,h)gh)ah,i)r";
759 final Phylogeny p9 = factory9.create( p9_str, new NHXParser() )[ 0 ];
760 m1 = new BasicCharacterStateMatrix<CharacterStateMatrix.BinaryStates>( 9, 3 );
761 m1.setIdentifier( 0, "a" );
762 m1.setIdentifier( 1, "b" );
763 m1.setIdentifier( 2, "c" );
764 m1.setIdentifier( 3, "d" );
765 m1.setIdentifier( 4, "e" );
766 m1.setIdentifier( 5, "f" );
767 m1.setIdentifier( 6, "g" );
768 m1.setIdentifier( 7, "h" );
769 m1.setIdentifier( 8, "i" );
770 m1.setState( 0, 0, PRESENT );
771 m1.setState( 1, 0, ABSENT );
772 m1.setState( 2, 0, PRESENT );
773 m1.setState( 3, 0, ABSENT );
774 m1.setState( 4, 0, ABSENT );
775 m1.setState( 5, 0, ABSENT );
776 m1.setState( 6, 0, ABSENT );
777 m1.setState( 7, 0, ABSENT );
778 m1.setState( 8, 0, ABSENT );
779 m1.setState( 0, 1, PRESENT );
780 m1.setState( 1, 1, PRESENT );
781 m1.setState( 2, 1, PRESENT );
782 m1.setState( 3, 1, PRESENT );
783 m1.setState( 4, 1, ABSENT );
784 m1.setState( 5, 1, ABSENT );
785 m1.setState( 6, 1, ABSENT );
786 m1.setState( 7, 1, ABSENT );
787 m1.setState( 8, 1, ABSENT );
788 m1.setState( 0, 2, PRESENT );
789 m1.setState( 1, 2, ABSENT );
790 m1.setState( 2, 2, ABSENT );
791 m1.setState( 3, 2, ABSENT );
792 m1.setState( 4, 2, ABSENT );
793 m1.setState( 5, 2, ABSENT );
794 m1.setState( 6, 2, ABSENT );
795 m1.setState( 7, 2, PRESENT );
796 m1.setState( 8, 2, ABSENT );
797 dollo9.execute( p9, m1 );
798 if ( dollo9.getTotalGains() != 3 ) {
801 if ( dollo9.getTotalLosses() != 6 ) {
804 final DolloParsimony dollo10 = DolloParsimony.createInstance();
805 final PhylogenyFactory factory10 = ParserBasedPhylogenyFactory.getInstance();
806 final String p10_str = "((((((a,b)ab,c)ac,d)ad,(e,f)ef)af,(g,h)gh)ah,i)r";
807 final Phylogeny p10 = factory10.create( p10_str, new NHXParser() )[ 0 ];
808 final CharacterStateMatrix<CharacterStateMatrix.BinaryStates> m10 = new BasicCharacterStateMatrix<CharacterStateMatrix.BinaryStates>( 9,
810 m10.setIdentifier( 0, "a" );
811 m10.setIdentifier( 1, "b" );
812 m10.setIdentifier( 2, "c" );
813 m10.setIdentifier( 3, "d" );
814 m10.setIdentifier( 4, "e" );
815 m10.setIdentifier( 5, "f" );
816 m10.setIdentifier( 6, "g" );
817 m10.setIdentifier( 7, "h" );
818 m10.setIdentifier( 8, "i" );
819 m10.setState( 0, 0, PRESENT );
820 m10.setState( 1, 0, ABSENT );
821 m10.setState( 2, 0, PRESENT );
822 m10.setState( 3, 0, ABSENT );
823 m10.setState( 4, 0, ABSENT );
824 m10.setState( 5, 0, ABSENT );
825 m10.setState( 6, 0, ABSENT );
826 m10.setState( 7, 0, ABSENT );
827 m10.setState( 8, 0, ABSENT );
828 dollo10.execute( p10, m10 );
829 if ( dollo10.getTotalGains() != 1 ) {
832 if ( dollo10.getTotalLosses() != 1 ) {
836 catch ( final Exception e ) {
837 e.printStackTrace( System.out );
843 private static boolean testDolloParsimonyOnNonBinaryTree() {
845 final BinaryStates PRESENT = BinaryStates.PRESENT;
846 final BinaryStates ABSENT = BinaryStates.ABSENT;
847 final DolloParsimony dollo1 = DolloParsimony.createInstance();
848 final PhylogenyFactory factory1 = ParserBasedPhylogenyFactory.getInstance();
849 final String p1_str = "((((((a,b,y)aby,c)ac,d)ad,(e,f)ef)af,(g,h)gh)ah,i)r";
850 final Phylogeny p1 = factory1.create( p1_str, new NHXParser() )[ 0 ];
851 final CharacterStateMatrix<CharacterStateMatrix.BinaryStates> m1 = new BasicCharacterStateMatrix<CharacterStateMatrix.BinaryStates>( 10,
853 m1.setIdentifier( 0, "a" );
854 m1.setIdentifier( 1, "b" );
855 m1.setIdentifier( 2, "y" );
856 m1.setIdentifier( 3, "c" );
857 m1.setIdentifier( 4, "d" );
858 m1.setIdentifier( 5, "e" );
859 m1.setIdentifier( 6, "f" );
860 m1.setIdentifier( 7, "g" );
861 m1.setIdentifier( 8, "h" );
862 m1.setIdentifier( 9, "i" );
863 m1.setCharacter( 0, "0" );
864 m1.setState( "a", "0", PRESENT );
865 m1.setState( "b", "0", ABSENT );
866 m1.setState( "y", "0", PRESENT );
867 m1.setState( "c", "0", PRESENT );
868 m1.setState( "d", "0", ABSENT );
869 m1.setState( "e", "0", ABSENT );
870 m1.setState( "f", "0", ABSENT );
871 m1.setState( "g", "0", ABSENT );
872 m1.setState( "h", "0", ABSENT );
873 m1.setState( "i", "0", ABSENT );
874 dollo1.execute( p1, m1 );
875 if ( dollo1.getTotalGains() != 1 ) {
878 if ( dollo1.getTotalLosses() != 1 ) {
881 if ( dollo1.getTotalUnchanged() != 16 ) {
884 m1.setState( "b", "0", PRESENT );
885 dollo1.execute( p1, m1 );
886 if ( dollo1.getTotalGains() != 1 ) {
889 if ( dollo1.getTotalLosses() != 0 ) {
892 if ( dollo1.getTotalUnchanged() != 17 ) {
895 m1.setState( "a", "0", ABSENT );
896 m1.setState( "b", "0", ABSENT );
897 dollo1.execute( p1, m1 );
898 if ( dollo1.getTotalGains() != 1 ) {
901 if ( dollo1.getTotalLosses() != 2 ) {
904 if ( dollo1.getTotalUnchanged() != 15 ) {
907 m1.setState( "y", "0", ABSENT );
908 dollo1.execute( p1, m1 );
909 if ( dollo1.getTotalGains() != 1 ) {
912 if ( dollo1.getTotalLosses() != 0 ) {
915 if ( dollo1.getTotalUnchanged() != 17 ) {
918 final DolloParsimony dollo2 = DolloParsimony.createInstance();
919 final PhylogenyFactory factory2 = ParserBasedPhylogenyFactory.getInstance();
920 final String p2_str = "((((((a,b,y)aby,c,d)cad,e,f)af,(g,h)gh)ah,i))r";
921 final Phylogeny p2 = factory2.create( p2_str, new NHXParser() )[ 0 ];
922 final CharacterStateMatrix<CharacterStateMatrix.BinaryStates> m2 = new BasicCharacterStateMatrix<CharacterStateMatrix.BinaryStates>( 10,
924 m2.setIdentifier( 0, "a" );
925 m2.setIdentifier( 1, "b" );
926 m2.setIdentifier( 2, "y" );
927 m2.setIdentifier( 3, "c" );
928 m2.setIdentifier( 4, "d" );
929 m2.setIdentifier( 5, "e" );
930 m2.setIdentifier( 6, "f" );
931 m2.setIdentifier( 7, "g" );
932 m2.setIdentifier( 8, "h" );
933 m2.setIdentifier( 9, "i" );
934 m2.setCharacter( 0, "0" );
935 m2.setState( "a", "0", PRESENT );
936 m2.setState( "b", "0", ABSENT );
937 m2.setState( "y", "0", PRESENT );
938 m2.setState( "c", "0", PRESENT );
939 m2.setState( "d", "0", ABSENT );
940 m2.setState( "e", "0", ABSENT );
941 m2.setState( "f", "0", ABSENT );
942 m2.setState( "g", "0", ABSENT );
943 m2.setState( "h", "0", ABSENT );
944 m2.setState( "i", "0", ABSENT );
945 dollo2.setReturnInternalStates( true );
946 dollo2.execute( p2, m2 );
947 CharacterStateMatrix<BinaryStates> i_m2 = dollo2.getInternalStatesMatrix();
948 if ( i_m2.getState( "aby", "0" ) != PRESENT ) {
951 if ( i_m2.getState( "cad", "0" ) != PRESENT ) {
954 if ( i_m2.getState( "af", "0" ) != ABSENT ) {
957 if ( i_m2.getState( "gh", "0" ) != ABSENT ) {
960 if ( i_m2.getState( "ah", "0" ) != ABSENT ) {
963 if ( i_m2.getState( "r", "0" ) != ABSENT ) {
966 if ( dollo2.getTotalGains() != 1 ) {
969 if ( dollo2.getTotalLosses() != 2 ) {
972 if ( dollo2.getTotalUnchanged() != 14 ) {
975 m2.setState( "b", "0", PRESENT );
976 dollo2.execute( p2, m2 );
977 if ( dollo2.getTotalGains() != 1 ) {
980 if ( dollo2.getTotalLosses() != 1 ) {
983 if ( dollo2.getTotalUnchanged() != 15 ) {
986 m2.setState( "a", "0", ABSENT );
987 m2.setState( "b", "0", ABSENT );
988 dollo2.execute( p2, m2 );
989 if ( dollo2.getTotalGains() != 1 ) {
992 if ( dollo2.getTotalLosses() != 3 ) {
995 if ( dollo2.getTotalUnchanged() != 13 ) {
998 m2.setState( "y", "0", ABSENT );
999 dollo2.execute( p2, m2 );
1000 if ( dollo2.getTotalGains() != 1 ) {
1003 if ( dollo2.getTotalLosses() != 0 ) {
1006 if ( dollo2.getTotalUnchanged() != 16 ) {
1009 m2.setState( "c", "0", ABSENT );
1010 dollo2.execute( p2, m2 );
1011 if ( dollo2.getTotalGains() != 0 ) {
1014 if ( dollo2.getTotalLosses() != 0 ) {
1017 if ( dollo2.getTotalUnchanged() != 17 ) {
1020 m2.setState( "y", "0", PRESENT );
1021 m2.setState( "e", "0", PRESENT );
1022 dollo2.execute( p2, m2 );
1023 if ( dollo2.getTotalGains() != 1 ) {
1026 if ( dollo2.getTotalLosses() != 5 ) {
1029 if ( dollo2.getTotalUnchanged() != 11 ) {
1032 i_m2 = dollo2.getInternalStatesMatrix();
1033 if ( i_m2.getState( "aby", "0" ) != PRESENT ) {
1036 if ( i_m2.getState( "cad", "0" ) != PRESENT ) {
1039 if ( i_m2.getState( "af", "0" ) != PRESENT ) {
1042 if ( i_m2.getState( "gh", "0" ) != ABSENT ) {
1045 if ( i_m2.getState( "ah", "0" ) != ABSENT ) {
1048 if ( i_m2.getState( "r", "0" ) != ABSENT ) {
1052 catch ( final Exception e ) {
1053 e.printStackTrace( System.out );
1059 private static boolean testFitchParsimony() {
1061 final BinaryStates PRESENT = BinaryStates.PRESENT;
1062 final BinaryStates ABSENT = BinaryStates.ABSENT;
1063 final GainLossStates GAIN = GainLossStates.GAIN;
1064 final GainLossStates LOSS = GainLossStates.LOSS;
1065 final GainLossStates UNCHANGED_PRESENT = GainLossStates.UNCHANGED_PRESENT;
1066 final GainLossStates UNCHANGED_ABSENT = GainLossStates.UNCHANGED_ABSENT;
1067 final FitchParsimony<String> fitch1 = new FitchParsimony<String>();
1068 final PhylogenyFactory factory1 = ParserBasedPhylogenyFactory.getInstance();
1069 final String p1_str = "((((((a,b)ab,c)ac,d)ad,(e,f)ef)af,(g,h,i)gi)ai,((j,k,l)jl,(m,n,o)mo,(p,q,r)pr)jr)root";
1070 final Phylogeny p1 = factory1.create( p1_str, new NHXParser() )[ 0 ];
1071 final CharacterStateMatrix<String> m1 = new BasicCharacterStateMatrix<String>( 18, 1 );
1072 m1.setIdentifier( 0, "a" );
1073 m1.setIdentifier( 1, "b" );
1074 m1.setIdentifier( 2, "c" );
1075 m1.setIdentifier( 3, "d" );
1076 m1.setIdentifier( 4, "e" );
1077 m1.setIdentifier( 5, "f" );
1078 m1.setIdentifier( 6, "g" );
1079 m1.setIdentifier( 7, "h" );
1080 m1.setIdentifier( 8, "i" );
1081 m1.setIdentifier( 9, "j" );
1082 m1.setIdentifier( 10, "k" );
1083 m1.setIdentifier( 11, "l" );
1084 m1.setIdentifier( 12, "m" );
1085 m1.setIdentifier( 13, "n" );
1086 m1.setIdentifier( 14, "o" );
1087 m1.setIdentifier( 15, "p" );
1088 m1.setIdentifier( 16, "q" );
1089 m1.setIdentifier( 17, "r" );
1090 m1.setCharacter( 0, "0" );
1091 m1.setState( "a", "0", "A" );
1092 m1.setState( "b", "0", "A" );
1093 m1.setState( "c", "0", "B" );
1094 m1.setState( "d", "0", "C" );
1095 m1.setState( "e", "0", "D" );
1096 m1.setState( "f", "0", "A" );
1097 m1.setState( "g", "0", "A" );
1098 m1.setState( "h", "0", "B" );
1099 m1.setState( "i", "0", "C" );
1100 m1.setState( "j", "0", "A" );
1101 m1.setState( "k", "0", "B" );
1102 m1.setState( "l", "0", "C" );
1103 m1.setState( "m", "0", "B" );
1104 m1.setState( "n", "0", "B" );
1105 m1.setState( "o", "0", "B" );
1106 m1.setState( "p", "0", "A" );
1107 m1.setState( "q", "0", "C" );
1108 m1.setState( "r", "0", "D" );
1109 fitch1.setReturnInternalStates( true );
1110 fitch1.setReturnGainLossMatrix( false );
1111 fitch1.setRandomize( false );
1112 fitch1.execute( p1, m1 );
1113 final CharacterStateMatrix<String> i_m = fitch1.getInternalStatesMatrix();
1114 final CharacterStateMatrix<List<String>> i_m_all = fitch1.getInternalStatesMatrixPriorToTraceback();
1115 if ( fitch1.getCost() != 10 ) {
1118 if ( !i_m.getState( "ab", "0" ).equals( "A" ) ) {
1121 if ( !i_m.getState( "ac", "0" ).equals( "A" ) ) {
1124 if ( !i_m.getState( "ad", "0" ).equals( "A" ) ) {
1127 if ( !i_m.getState( "ef", "0" ).equals( "A" ) ) {
1130 if ( !i_m.getState( "ai", "0" ).equals( "A" ) ) {
1133 if ( !i_m.getState( "gi", "0" ).equals( "A" ) ) {
1136 if ( !i_m.getState( "jl", "0" ).equals( "A" ) ) {
1139 if ( !i_m.getState( "mo", "0" ).equals( "B" ) ) {
1142 if ( !i_m.getState( "pr", "0" ).equals( "A" ) ) {
1145 if ( i_m_all.getState( "ab", "0" ).size() != 1 ) {
1148 if ( !i_m_all.getState( "ab", "0" ).contains( "A" ) ) {
1151 if ( i_m_all.getState( "ac", "0" ).size() != 2 ) {
1154 if ( !i_m_all.getState( "ac", "0" ).contains( "A" ) ) {
1157 if ( !i_m_all.getState( "ac", "0" ).contains( "B" ) ) {
1160 if ( i_m_all.getState( "ad", "0" ).size() != 3 ) {
1163 if ( !i_m_all.getState( "ad", "0" ).contains( "A" ) ) {
1166 if ( !i_m_all.getState( "ad", "0" ).contains( "B" ) ) {
1169 if ( !i_m_all.getState( "ad", "0" ).contains( "C" ) ) {
1172 if ( i_m_all.getState( "af", "0" ).size() != 1 ) {
1175 if ( !i_m_all.getState( "af", "0" ).contains( "A" ) ) {
1178 if ( i_m_all.getState( "ef", "0" ).size() != 2 ) {
1181 if ( !i_m_all.getState( "ef", "0" ).contains( "A" ) ) {
1184 if ( !i_m_all.getState( "ef", "0" ).contains( "D" ) ) {
1187 if ( i_m_all.getState( "gi", "0" ).size() != 3 ) {
1190 if ( !i_m_all.getState( "gi", "0" ).contains( "A" ) ) {
1193 if ( !i_m_all.getState( "gi", "0" ).contains( "B" ) ) {
1196 if ( !i_m_all.getState( "gi", "0" ).contains( "C" ) ) {
1199 if ( i_m_all.getState( "ai", "0" ).size() != 1 ) {
1202 if ( !i_m_all.getState( "ai", "0" ).contains( "A" ) ) {
1205 if ( i_m_all.getState( "jl", "0" ).size() != 3 ) {
1208 if ( !i_m_all.getState( "jl", "0" ).contains( "A" ) ) {
1211 if ( !i_m_all.getState( "jl", "0" ).contains( "B" ) ) {
1214 if ( !i_m_all.getState( "jl", "0" ).contains( "C" ) ) {
1217 if ( i_m_all.getState( "mo", "0" ).size() != 1 ) {
1220 if ( !i_m_all.getState( "mo", "0" ).contains( "B" ) ) {
1223 if ( i_m_all.getState( "pr", "0" ).size() != 3 ) {
1226 if ( !i_m_all.getState( "pr", "0" ).contains( "A" ) ) {
1229 if ( !i_m_all.getState( "pr", "0" ).contains( "C" ) ) {
1232 if ( !i_m_all.getState( "pr", "0" ).contains( "D" ) ) {
1235 if ( i_m_all.getState( "jr", "0" ).size() != 4 ) {
1238 if ( !i_m_all.getState( "jr", "0" ).contains( "A" ) ) {
1241 if ( !i_m_all.getState( "jr", "0" ).contains( "B" ) ) {
1244 if ( !i_m_all.getState( "jr", "0" ).contains( "C" ) ) {
1247 if ( !i_m_all.getState( "jr", "0" ).contains( "D" ) ) {
1250 final FitchParsimony<String> fitch2 = new FitchParsimony<String>();
1251 final PhylogenyFactory factory2 = ParserBasedPhylogenyFactory.getInstance();
1252 final String p2_str = "((a,b)ab,(c,(d,e)de)cde)r";
1253 final Phylogeny p2 = factory2.create( p2_str, new NHXParser() )[ 0 ];
1254 final CharacterStateMatrix<String> m2 = new BasicCharacterStateMatrix<String>( 5, 1 );
1255 m2.setIdentifier( 0, "a" );
1256 m2.setIdentifier( 1, "b" );
1257 m2.setIdentifier( 2, "c" );
1258 m2.setIdentifier( 3, "d" );
1259 m2.setIdentifier( 4, "e" );
1260 m2.setCharacter( 0, "0" );
1261 m2.setState( "a", "0", "C" );
1262 m2.setState( "b", "0", "A" );
1263 m2.setState( "c", "0", "C" );
1264 m2.setState( "d", "0", "A" );
1265 m2.setState( "e", "0", "G" );
1266 fitch2.setReturnInternalStates( true );
1267 fitch2.setReturnGainLossMatrix( false );
1268 fitch2.execute( p2, m2 );
1269 final CharacterStateMatrix<String> i_m2 = fitch2.getInternalStatesMatrix();
1270 final CharacterStateMatrix<List<String>> i_m_all2 = fitch2.getInternalStatesMatrixPriorToTraceback();
1271 if ( fitch2.getCost() != 3 ) {
1274 if ( !i_m2.getState( "ab", "0" ).equals( "A" ) ) {
1277 if ( !i_m2.getState( "de", "0" ).equals( "A" ) ) {
1280 if ( !i_m2.getState( "cde", "0" ).equals( "A" ) ) {
1283 if ( !i_m2.getState( "r", "0" ).equals( "A" ) ) {
1286 if ( i_m_all2.getState( "cde", "0" ).size() != 3 ) {
1289 if ( !i_m_all2.getState( "cde", "0" ).contains( "A" ) ) {
1292 if ( !i_m_all2.getState( "cde", "0" ).contains( "C" ) ) {
1295 if ( !i_m_all2.getState( "cde", "0" ).contains( "G" ) ) {
1298 if ( i_m_all2.getState( "ab", "0" ).size() != 2 ) {
1301 if ( !i_m_all2.getState( "ab", "0" ).contains( "A" ) ) {
1304 if ( !i_m_all2.getState( "ab", "0" ).contains( "C" ) ) {
1307 fitch2.setReturnInternalStates( true );
1308 fitch2.setReturnGainLossMatrix( false );
1309 fitch2.setUseLast( true );
1310 fitch2.execute( p2, m2 );
1311 final CharacterStateMatrix<String> i_m21 = fitch2.getInternalStatesMatrix();
1312 final CharacterStateMatrix<List<String>> i_m_all21 = fitch2.getInternalStatesMatrixPriorToTraceback();
1313 if ( fitch2.getCost() != 3 ) {
1316 if ( !i_m21.getState( "ab", "0" ).equals( "C" ) ) {
1319 if ( !i_m21.getState( "de", "0" ).equals( "G" ) ) {
1322 if ( !i_m21.getState( "cde", "0" ).equals( "C" ) ) {
1325 if ( !i_m21.getState( "r", "0" ).equals( "C" ) ) {
1328 if ( i_m_all21.getState( "cde", "0" ).size() != 3 ) {
1331 if ( !i_m_all21.getState( "cde", "0" ).contains( "A" ) ) {
1334 if ( !i_m_all21.getState( "cde", "0" ).contains( "C" ) ) {
1337 if ( !i_m_all21.getState( "cde", "0" ).contains( "G" ) ) {
1340 final FitchParsimony<String> fitch3 = new FitchParsimony<String>();
1341 final PhylogenyFactory factory3 = ParserBasedPhylogenyFactory.getInstance();
1342 final String p3_str = "(((a,b)ab,((c,d)cd,e)cde)abcde,f)r";
1343 final Phylogeny p3 = factory3.create( p3_str, new NHXParser() )[ 0 ];
1344 final CharacterStateMatrix<String> m3 = new BasicCharacterStateMatrix<String>( 6, 1 );
1345 m3.setIdentifier( 0, "a" );
1346 m3.setIdentifier( 1, "b" );
1347 m3.setIdentifier( 2, "c" );
1348 m3.setIdentifier( 3, "d" );
1349 m3.setIdentifier( 4, "e" );
1350 m3.setIdentifier( 5, "f" );
1351 m3.setCharacter( 0, "0" );
1352 m3.setState( "a", "0", "C" );
1353 m3.setState( "b", "0", "U" );
1354 m3.setState( "c", "0", "G" );
1355 m3.setState( "d", "0", "U" );
1356 m3.setState( "e", "0", "A" );
1357 m3.setState( "f", "0", "A" );
1358 fitch3.setReturnInternalStates( true );
1359 fitch3.setReturnGainLossMatrix( false );
1360 fitch3.execute( p3, m3 );
1361 final CharacterStateMatrix<String> i_m3 = fitch3.getInternalStatesMatrix();
1362 final CharacterStateMatrix<List<String>> i_m_all3 = fitch3.getInternalStatesMatrixPriorToTraceback();
1363 if ( fitch3.getCost() != 4 ) {
1366 if ( !i_m3.getState( "ab", "0" ).equals( "U" ) ) {
1369 if ( !i_m3.getState( "cd", "0" ).equals( "U" ) ) {
1372 if ( !i_m3.getState( "cde", "0" ).equals( "U" ) ) {
1375 if ( !i_m3.getState( "abcde", "0" ).equals( "U" ) ) {
1378 if ( !i_m3.getState( "r", "0" ).equals( "A" ) ) {
1381 if ( i_m_all3.getState( "cde", "0" ).size() != 3 ) {
1384 if ( !i_m_all3.getState( "cde", "0" ).contains( "A" ) ) {
1387 if ( !i_m_all3.getState( "cde", "0" ).contains( "G" ) ) {
1390 if ( !i_m_all3.getState( "cde", "0" ).contains( "U" ) ) {
1393 if ( i_m_all3.getState( "ab", "0" ).size() != 2 ) {
1396 if ( !i_m_all3.getState( "ab", "0" ).contains( "C" ) ) {
1399 if ( !i_m_all3.getState( "ab", "0" ).contains( "U" ) ) {
1402 if ( i_m_all3.getState( "cd", "0" ).size() != 2 ) {
1405 if ( !i_m_all3.getState( "cd", "0" ).contains( "G" ) ) {
1408 if ( !i_m_all3.getState( "cd", "0" ).contains( "U" ) ) {
1411 if ( i_m_all3.getState( "abcde", "0" ).size() != 1 ) {
1414 if ( !i_m_all3.getState( "abcde", "0" ).contains( "U" ) ) {
1417 if ( i_m_all3.getState( "r", "0" ).size() != 2 ) {
1420 if ( !i_m_all3.getState( "r", "0" ).contains( "A" ) ) {
1423 if ( !i_m_all3.getState( "r", "0" ).contains( "U" ) ) {
1426 final FitchParsimony<BinaryStates> fitch4 = new FitchParsimony<BinaryStates>();
1427 final PhylogenyFactory factory4 = ParserBasedPhylogenyFactory.getInstance();
1428 final String p4_str = "(((a,b)ab,((c,d)cd,e)cde)abcde,f)r";
1429 final Phylogeny p4 = factory4.create( p4_str, new NHXParser() )[ 0 ];
1430 final CharacterStateMatrix<BinaryStates> m4 = new BasicCharacterStateMatrix<BinaryStates>( 6, 1 );
1431 m4.setIdentifier( 0, "a" );
1432 m4.setIdentifier( 1, "b" );
1433 m4.setIdentifier( 2, "c" );
1434 m4.setIdentifier( 3, "d" );
1435 m4.setIdentifier( 4, "e" );
1436 m4.setIdentifier( 5, "f" );
1437 m4.setCharacter( 0, "0" );
1438 m4.setState( "a", "0", PRESENT );
1439 m4.setState( "b", "0", ABSENT );
1440 m4.setState( "c", "0", PRESENT );
1441 m4.setState( "d", "0", PRESENT );
1442 m4.setState( "e", "0", ABSENT );
1443 m4.setState( "f", "0", ABSENT );
1444 fitch4.setReturnInternalStates( true );
1445 fitch4.setReturnGainLossMatrix( true );
1446 fitch4.execute( p4, m4 );
1447 final CharacterStateMatrix<GainLossStates> gl_m_4 = fitch4.getGainLossMatrix();
1448 if ( fitch4.getCost() != 2 ) {
1451 if ( fitch4.getTotalLosses() != 0 ) {
1454 if ( fitch4.getTotalGains() != 2 ) {
1457 if ( fitch4.getTotalUnchanged() != 9 ) {
1460 if ( gl_m_4.getState( "a", "0" ) != GAIN ) {
1463 if ( gl_m_4.getState( "b", "0" ) != UNCHANGED_ABSENT ) {
1466 if ( gl_m_4.getState( "ab", "0" ) != UNCHANGED_ABSENT ) {
1469 if ( gl_m_4.getState( "cd", "0" ) != GAIN ) {
1472 if ( gl_m_4.getState( "r", "0" ) != UNCHANGED_ABSENT ) {
1475 final FitchParsimony<BinaryStates> fitch5 = new FitchParsimony<BinaryStates>();
1476 final PhylogenyFactory factory5 = ParserBasedPhylogenyFactory.getInstance();
1477 final String p5_str = "(((a,b)ab,((c,d)cd,e)cde)abcde,f)r";
1478 final Phylogeny p5 = factory5.create( p5_str, new NHXParser() )[ 0 ];
1479 final CharacterStateMatrix<BinaryStates> m5 = new BasicCharacterStateMatrix<BinaryStates>( 6, 1 );
1480 m5.setIdentifier( 0, "a" );
1481 m5.setIdentifier( 1, "b" );
1482 m5.setIdentifier( 2, "c" );
1483 m5.setIdentifier( 3, "d" );
1484 m5.setIdentifier( 4, "e" );
1485 m5.setIdentifier( 5, "f" );
1486 m5.setCharacter( 0, "0" );
1487 m5.setState( "a", "0", PRESENT );
1488 m5.setState( "b", "0", ABSENT );
1489 m5.setState( "c", "0", PRESENT );
1490 m5.setState( "d", "0", ABSENT );
1491 m5.setState( "e", "0", PRESENT );
1492 m5.setState( "f", "0", ABSENT );
1493 fitch5.setReturnInternalStates( true );
1494 fitch5.setReturnGainLossMatrix( true );
1495 fitch5.execute( p5, m5 );
1496 final CharacterStateMatrix<GainLossStates> gl_m_5 = fitch5.getGainLossMatrix();
1497 if ( fitch5.getCost() != 3 ) {
1500 if ( fitch5.getTotalLosses() != 2 ) {
1503 if ( fitch5.getTotalGains() != 1 ) {
1506 if ( fitch5.getTotalUnchanged() != 8 ) {
1509 if ( gl_m_5.getState( "abcde", "0" ) != GAIN ) {
1512 if ( gl_m_5.getState( "a", "0" ) != UNCHANGED_PRESENT ) {
1515 if ( gl_m_5.getState( "b", "0" ) != LOSS ) {
1518 if ( gl_m_5.getState( "d", "0" ) != LOSS ) {
1521 if ( gl_m_5.getState( "r", "0" ) != UNCHANGED_ABSENT ) {
1524 final FitchParsimony<BinaryStates> fitch6 = new FitchParsimony<BinaryStates>();
1525 final PhylogenyFactory factory6 = ParserBasedPhylogenyFactory.getInstance();
1526 final String p6_str = "(((a,b)ab,((c,d)cd,e)cde)abcde,f)r";
1527 final Phylogeny p6 = factory6.create( p6_str, new NHXParser() )[ 0 ];
1528 final CharacterStateMatrix<BinaryStates> m6 = new BasicCharacterStateMatrix<BinaryStates>( 6, 1 );
1529 m6.setIdentifier( 0, "a" );
1530 m6.setIdentifier( 1, "b" );
1531 m6.setIdentifier( 2, "c" );
1532 m6.setIdentifier( 3, "d" );
1533 m6.setIdentifier( 4, "e" );
1534 m6.setIdentifier( 5, "f" );
1535 m6.setCharacter( 0, "0" );
1536 m6.setState( "a", "0", PRESENT );
1537 m6.setState( "b", "0", ABSENT );
1538 m6.setState( "c", "0", PRESENT );
1539 m6.setState( "d", "0", PRESENT );
1540 m6.setState( "e", "0", ABSENT );
1541 m6.setState( "f", "0", PRESENT );
1542 fitch6.setReturnInternalStates( true );
1543 fitch6.setReturnGainLossMatrix( true );
1544 fitch6.execute( p6, m6 );
1545 final CharacterStateMatrix<GainLossStates> gl_m_6 = fitch6.getGainLossMatrix();
1546 if ( fitch6.getCost() != 2 ) {
1549 if ( fitch6.getTotalLosses() != 2 ) {
1552 if ( fitch6.getTotalGains() != 0 ) {
1555 if ( fitch6.getTotalUnchanged() != 9 ) {
1558 if ( gl_m_6.getState( "abcde", "0" ) != UNCHANGED_PRESENT ) {
1561 if ( gl_m_6.getState( "r", "0" ) != UNCHANGED_PRESENT ) {
1564 if ( gl_m_6.getState( "b", "0" ) != LOSS ) {
1567 if ( gl_m_6.getState( "e", "0" ) != LOSS ) {
1570 final FitchParsimony<BinaryStates> fitch7 = new FitchParsimony<BinaryStates>();
1571 final PhylogenyFactory factory7 = ParserBasedPhylogenyFactory.getInstance();
1572 final String p7_str = "(((a,b)ab,(c,d)cd)abcd,((e,f)ef,(g,h)gh)efgh)r";
1573 final Phylogeny p7 = factory7.create( p7_str, new NHXParser() )[ 0 ];
1574 final CharacterStateMatrix<BinaryStates> m7 = new BasicCharacterStateMatrix<BinaryStates>( 8, 1 );
1575 m7.setIdentifier( 0, "a" );
1576 m7.setIdentifier( 1, "b" );
1577 m7.setIdentifier( 2, "c" );
1578 m7.setIdentifier( 3, "d" );
1579 m7.setIdentifier( 4, "e" );
1580 m7.setIdentifier( 5, "f" );
1581 m7.setIdentifier( 6, "g" );
1582 m7.setIdentifier( 7, "h" );
1583 m7.setCharacter( 0, "0" );
1584 m7.setState( "a", "0", PRESENT );
1585 m7.setState( "b", "0", ABSENT );
1586 m7.setState( "c", "0", PRESENT );
1587 m7.setState( "d", "0", ABSENT );
1588 m7.setState( "e", "0", PRESENT );
1589 m7.setState( "f", "0", ABSENT );
1590 m7.setState( "g", "0", PRESENT );
1591 m7.setState( "h", "0", ABSENT );
1592 fitch7.setReturnInternalStates( true );
1593 fitch7.setReturnGainLossMatrix( true );
1594 fitch7.execute( p7, m7 );
1595 final CharacterStateMatrix<GainLossStates> gl_m_7 = fitch7.getGainLossMatrix();
1596 if ( fitch7.getCost() != 4 ) {
1599 if ( fitch7.getTotalLosses() != 0 ) {
1602 if ( fitch7.getTotalGains() != 4 ) {
1605 if ( fitch7.getTotalUnchanged() != 11 ) {
1608 if ( gl_m_7.getState( "a", "0" ) != GAIN ) {
1611 if ( gl_m_7.getState( "c", "0" ) != GAIN ) {
1614 if ( gl_m_7.getState( "e", "0" ) != GAIN ) {
1617 if ( gl_m_7.getState( "g", "0" ) != GAIN ) {
1620 if ( gl_m_7.getState( "r", "0" ) != UNCHANGED_ABSENT ) {
1623 fitch7.setReturnInternalStates( true );
1624 fitch7.setReturnGainLossMatrix( true );
1625 fitch7.setUseLast( true );
1626 fitch7.execute( p7, m7 );
1627 final CharacterStateMatrix<GainLossStates> gl_m_71 = fitch7.getGainLossMatrix();
1628 if ( fitch7.getCost() != 4 ) {
1631 if ( fitch7.getTotalLosses() != 4 ) {
1634 if ( fitch7.getTotalGains() != 0 ) {
1637 if ( fitch7.getTotalUnchanged() != 11 ) {
1640 if ( gl_m_71.getState( "b", "0" ) != LOSS ) {
1643 if ( gl_m_71.getState( "d", "0" ) != LOSS ) {
1646 if ( gl_m_71.getState( "f", "0" ) != LOSS ) {
1649 if ( gl_m_71.getState( "h", "0" ) != LOSS ) {
1652 if ( gl_m_71.getState( "r", "0" ) != UNCHANGED_PRESENT ) {
1655 final FitchParsimony<BinaryStates> fitch8 = new FitchParsimony<BinaryStates>();
1656 final PhylogenyFactory factory8 = ParserBasedPhylogenyFactory.getInstance();
1657 final String p8_str = "(((a,b)ab,(c,d)cd)abcd,((e,f)ef,(g,h)gh)efgh)r";
1658 final Phylogeny p8 = factory8.create( p8_str, new NHXParser() )[ 0 ];
1659 final CharacterStateMatrix<BinaryStates> m8 = new BasicCharacterStateMatrix<BinaryStates>( 8, 1 );
1660 m8.setIdentifier( 0, "a" );
1661 m8.setIdentifier( 1, "b" );
1662 m8.setIdentifier( 2, "c" );
1663 m8.setIdentifier( 3, "d" );
1664 m8.setIdentifier( 4, "e" );
1665 m8.setIdentifier( 5, "f" );
1666 m8.setIdentifier( 6, "g" );
1667 m8.setIdentifier( 7, "h" );
1668 m8.setCharacter( 0, "0" );
1669 m8.setState( "a", "0", PRESENT );
1670 m8.setState( "b", "0", PRESENT );
1671 m8.setState( "c", "0", PRESENT );
1672 m8.setState( "d", "0", ABSENT );
1673 m8.setState( "e", "0", ABSENT );
1674 m8.setState( "f", "0", ABSENT );
1675 m8.setState( "g", "0", ABSENT );
1676 m8.setState( "h", "0", ABSENT );
1677 fitch8.setReturnInternalStates( true );
1678 fitch8.setReturnGainLossMatrix( true );
1679 fitch8.execute( p8, m8 );
1680 final CharacterStateMatrix<GainLossStates> gl_m_8 = fitch8.getGainLossMatrix();
1681 if ( fitch8.getCost() != 2 ) {
1684 if ( fitch8.getTotalLosses() != 1 ) {
1687 if ( fitch8.getTotalGains() != 1 ) {
1690 if ( fitch8.getTotalUnchanged() != 13 ) {
1693 if ( gl_m_8.getState( "d", "0" ) != LOSS ) {
1696 if ( gl_m_8.getState( "abcd", "0" ) != GAIN ) {
1699 final FitchParsimony<BinaryStates> fitch9 = new FitchParsimony<BinaryStates>();
1700 final PhylogenyFactory factory9 = ParserBasedPhylogenyFactory.getInstance();
1701 final String p9_str = "(((a,b)ab,c)abc,d)abcd";
1702 final Phylogeny p9 = factory9.create( p9_str, new NHXParser() )[ 0 ];
1703 final CharacterStateMatrix<BinaryStates> m9 = new BasicCharacterStateMatrix<BinaryStates>( 4, 1 );
1704 m9.setIdentifier( 0, "a" );
1705 m9.setIdentifier( 1, "b" );
1706 m9.setIdentifier( 2, "c" );
1707 m9.setIdentifier( 3, "d" );
1708 m9.setCharacter( 0, "0" );
1709 m9.setState( "a", "0", PRESENT );
1710 m9.setState( "b", "0", ABSENT );
1711 m9.setState( "c", "0", PRESENT );
1712 m9.setState( "d", "0", ABSENT );
1713 fitch9.setReturnInternalStates( true );
1714 fitch9.setReturnGainLossMatrix( true );
1715 fitch9.setUseLast( false );
1716 fitch9.execute( p9, m9 );
1717 final CharacterStateMatrix<GainLossStates> gl_m_9a = fitch9.getGainLossMatrix();
1718 if ( fitch9.getCost() != 2 ) {
1721 if ( fitch9.getTotalLosses() != 1 ) {
1724 if ( fitch9.getTotalGains() != 1 ) {
1727 if ( fitch9.getTotalUnchanged() != 5 ) {
1730 if ( gl_m_9a.getState( "a", "0" ) != UNCHANGED_PRESENT ) {
1733 if ( gl_m_9a.getState( "b", "0" ) != LOSS ) {
1736 if ( gl_m_9a.getState( "c", "0" ) != UNCHANGED_PRESENT ) {
1739 if ( gl_m_9a.getState( "d", "0" ) != UNCHANGED_ABSENT ) {
1742 if ( gl_m_9a.getState( "ab", "0" ) != UNCHANGED_PRESENT ) {
1745 if ( gl_m_9a.getState( "abc", "0" ) != GAIN ) {
1748 if ( gl_m_9a.getState( "abcd", "0" ) != UNCHANGED_ABSENT ) {
1751 fitch9.setUseLast( true );
1752 fitch9.execute( p9, m9 );
1753 final CharacterStateMatrix<GainLossStates> gl_m_9b = fitch9.getGainLossMatrix();
1754 if ( fitch9.getCost() != 2 ) {
1757 if ( fitch9.getTotalLosses() != 2 ) {
1760 if ( fitch9.getTotalGains() != 0 ) {
1763 if ( fitch9.getTotalUnchanged() != 5 ) {
1766 if ( gl_m_9b.getState( "a", "0" ) != UNCHANGED_PRESENT ) {
1769 if ( gl_m_9b.getState( "b", "0" ) != LOSS ) {
1772 if ( gl_m_9b.getState( "c", "0" ) != UNCHANGED_PRESENT ) {
1775 if ( gl_m_9b.getState( "d", "0" ) != LOSS ) {
1778 if ( gl_m_9b.getState( "ab", "0" ) != UNCHANGED_PRESENT ) {
1781 if ( gl_m_9b.getState( "abc", "0" ) != UNCHANGED_PRESENT ) {
1784 if ( gl_m_9b.getState( "abcd", "0" ) != UNCHANGED_PRESENT ) {
1787 fitch9.setUseLast( false );
1788 fitch9.setRandomize( true );
1789 fitch9.setRandomNumberSeed( 8722445 );
1790 fitch9.execute( p9, m9 );
1791 fitch9.getGainLossMatrix();
1792 if ( fitch9.getCost() != 2 ) {
1795 if ( fitch9.getTotalLosses() != 1 ) {
1798 if ( fitch9.getTotalGains() != 1 ) {
1801 if ( fitch9.getTotalUnchanged() != 5 ) {
1804 final FitchParsimony<BinaryStates> fitch10 = new FitchParsimony<BinaryStates>();
1805 final PhylogenyFactory factory10 = ParserBasedPhylogenyFactory.getInstance();
1806 final String p10_str = "((((a,b)ab,c)abc,d)abcd,e)abcde";
1807 final Phylogeny p10 = factory10.create( p10_str, new NHXParser() )[ 0 ];
1808 final CharacterStateMatrix<BinaryStates> m10 = new BasicCharacterStateMatrix<BinaryStates>( 5, 1 );
1809 m10.setIdentifier( 0, "a" );
1810 m10.setIdentifier( 1, "b" );
1811 m10.setIdentifier( 2, "c" );
1812 m10.setIdentifier( 3, "d" );
1813 m10.setIdentifier( 4, "e" );
1814 m10.setCharacter( 0, "0" );
1815 m10.setState( "a", "0", PRESENT );
1816 m10.setState( "b", "0", ABSENT );
1817 m10.setState( "c", "0", ABSENT );
1818 m10.setState( "d", "0", PRESENT );
1819 m10.setState( "e", "0", ABSENT );
1820 fitch10.setReturnInternalStates( true );
1821 fitch10.setReturnGainLossMatrix( true );
1822 fitch10.setUseLast( false );
1823 fitch10.execute( p10, m10 );
1824 final CharacterStateMatrix<GainLossStates> gl_m_10a = fitch10.getGainLossMatrix();
1825 if ( fitch10.getCost() != 2 ) {
1828 if ( fitch10.getTotalLosses() != 0 ) {
1831 if ( fitch10.getTotalGains() != 2 ) {
1834 if ( fitch10.getTotalUnchanged() != 7 ) {
1837 if ( gl_m_10a.getState( "a", "0" ) != GAIN ) {
1840 if ( gl_m_10a.getState( "b", "0" ) != UNCHANGED_ABSENT ) {
1843 if ( gl_m_10a.getState( "c", "0" ) != UNCHANGED_ABSENT ) {
1846 if ( gl_m_10a.getState( "d", "0" ) != GAIN ) {
1849 if ( gl_m_10a.getState( "e", "0" ) != UNCHANGED_ABSENT ) {
1852 if ( gl_m_10a.getState( "ab", "0" ) != UNCHANGED_ABSENT ) {
1855 if ( gl_m_10a.getState( "abc", "0" ) != UNCHANGED_ABSENT ) {
1858 if ( gl_m_10a.getState( "abcd", "0" ) != UNCHANGED_ABSENT ) {
1861 if ( gl_m_10a.getState( "abcde", "0" ) != UNCHANGED_ABSENT ) {
1864 fitch10.setUseLast( true );
1865 fitch10.execute( p10, m10 );
1866 final CharacterStateMatrix<GainLossStates> gl_m_10b = fitch10.getGainLossMatrix();
1867 if ( fitch10.getCost() != 2 ) {
1870 if ( fitch10.getTotalLosses() != 0 ) {
1873 if ( fitch10.getTotalGains() != 2 ) {
1876 if ( fitch10.getTotalUnchanged() != 7 ) {
1879 if ( gl_m_10b.getState( "a", "0" ) != GAIN ) {
1882 if ( gl_m_10b.getState( "b", "0" ) != UNCHANGED_ABSENT ) {
1885 if ( gl_m_10b.getState( "c", "0" ) != UNCHANGED_ABSENT ) {
1888 if ( gl_m_10b.getState( "d", "0" ) != GAIN ) {
1891 if ( gl_m_10b.getState( "e", "0" ) != UNCHANGED_ABSENT ) {
1894 if ( gl_m_10b.getState( "ab", "0" ) != UNCHANGED_ABSENT ) {
1897 if ( gl_m_10b.getState( "abc", "0" ) != UNCHANGED_ABSENT ) {
1900 if ( gl_m_10b.getState( "abcd", "0" ) != UNCHANGED_ABSENT ) {
1903 if ( gl_m_10b.getState( "abcde", "0" ) != UNCHANGED_ABSENT ) {
1907 catch ( final Exception e ) {
1908 e.printStackTrace( System.out );
1914 private static boolean testNeighborJoining() {
1916 BasicSymmetricalDistanceMatrix m = new BasicSymmetricalDistanceMatrix( 6 );
1918 m.setRow( "4 7", 2 );
1919 m.setRow( "7 10 7", 3 );
1920 m.setRow( "6 9 6 5", 4 );
1921 m.setRow( "8 11 8 9 8", 5 );
1922 m.setIdentifier( 0, "A" );
1923 m.setIdentifier( 1, "B" );
1924 m.setIdentifier( 2, "C" );
1925 m.setIdentifier( 3, "D" );
1926 m.setIdentifier( 4, "E" );
1927 m.setIdentifier( 5, "F" );
1928 final NeighborJoining nj = NeighborJoining.createInstance();
1930 m = new BasicSymmetricalDistanceMatrix( 7 );
1931 m.setIdentifier( 0, "Bovine" );
1932 m.setIdentifier( 1, "Mouse" );
1933 m.setIdentifier( 2, "Gibbon" );
1934 m.setIdentifier( 3, "Orang" );
1935 m.setIdentifier( 4, "Gorilla" );
1936 m.setIdentifier( 5, "Chimp" );
1937 m.setIdentifier( 6, "Human" );
1938 m.setRow( "0.00000 1.68660 1.71980 1.66060 1.52430 1.60430 1.59050", 0 );
1939 m.setRow( "1.68660 0.00000 1.52320 1.48410 1.44650 1.43890 1.46290", 1 );
1940 m.setRow( "1.71980 1.52320 0.00000 0.71150 0.59580 0.61790 0.55830", 2 );
1941 m.setRow( "1.66060 1.48410 0.71150 0.00000 0.46310 0.50610 0.47100", 3 );
1942 m.setRow( "1.52430 1.44650 0.59580 0.46310 0.00000 0.34840 0.30830", 4 );
1943 m.setRow( "1.60430 1.43890 0.61790 0.50610 0.34840 0.00000 0.26920", 5 );
1944 m.setRow( "1.59050 1.46290 0.55830 0.47100 0.30830 0.26920 0.00000", 6 );
1945 System.out.println( m.toString() );
1946 final Phylogeny p2 = nj.execute( m );
1947 p2.reRoot( p2.getNode( "Bovine" ) );
1948 System.out.println( p2.toString() );
1949 // from phylip Neighbor-Joining/UPGMA method version 3.69:
1950 // ((((((Chimp:0.15167,Human:0.11753):0.03982,Gorilla:0.15393):0.02696,Orang:0.28469):0.04648,Gibbon:0.35793):0.42027,Mouse:0.76891):0.458845,Bovine:0.458845);
1951 Archaeopteryx.createApplication( p2 );
1952 m = new BasicSymmetricalDistanceMatrix( 4 );
1953 m.setIdentifier( 0, "A" );
1954 m.setIdentifier( 1, "B" );
1955 m.setIdentifier( 2, "C" );
1956 m.setIdentifier( 3, "D" );
1957 m.setRow( "0.00 0.95 0.17 0.98", 0 );
1958 m.setRow( "0.95 0.00 1.02 1.83", 1 );
1959 m.setRow( "0.17 1.02 0.00 1.01", 2 );
1960 m.setRow( "0.98 1.83 1.01 0.00", 3 );
1961 final Phylogeny p3 = nj.execute( m );
1965 // ----------------------- B 0.90
1969 // ------------------------- D 0.91
1970 p3.reRoot( p3.getNode( "C" ).getParent() );
1971 if ( !isEqual( p3.getNode( "A" ).getDistanceToParent(), 0.05 ) ) {
1974 if ( !isEqual( p3.getNode( "B" ).getDistanceToParent(), 0.90 ) ) {
1977 if ( !isEqual( p3.getNode( "C" ).getDistanceToParent(), 0.10 ) ) {
1980 if ( !isEqual( p3.getNode( "D" ).getDistanceToParent(), 0.91 ) ) {
1984 timeNeighborJoining();
1987 catch ( final Exception e ) {
1988 e.printStackTrace( System.out );
1994 private static boolean testSymmetricalDistanceMatrixParser() {
1996 final String l = ForesterUtil.getLineSeparator();
1997 StringBuffer source = new StringBuffer();
1998 source.append( " 4" + l );
1999 source.append( "A 0 0 0 0" + l );
2000 source.append( "B 1 0 0 0" + l );
2001 source.append( "C 2 4 0 0" + l );
2002 source.append( "D 3 5 6 0" + l );
2004 source.append( " 4" + l );
2005 source.append( "A 0 11 12 13" + l );
2006 source.append( "B 11 0 14 15" + l );
2007 source.append( "C 12 14 0 16" + l );
2008 source.append( "D 13 15 16 0" + l );
2011 source.append( " " + l );
2012 source.append( " 4" + l );
2013 source.append( " A 0 " + l );
2014 source.append( " B 21 0" + l );
2015 source.append( " C 22 24 0 " + l );
2016 source.append( " # 2 222 2 2 " + l );
2017 source.append( " D 23 25 26 0" + l );
2020 source.append( " " + l );
2021 final SymmetricalDistanceMatrixParser p0 = SymmetricalDistanceMatrixParser.createInstance();
2022 final DistanceMatrix[] ma0 = p0.parse( source.toString() );
2023 if ( ma0.length != 3 ) {
2026 if ( !isEqual( ma0[ 0 ].getValue( 0, 0 ), 0 ) ) {
2029 if ( !isEqual( ma0[ 0 ].getValue( 1, 0 ), 1 ) ) {
2032 if ( !isEqual( ma0[ 0 ].getValue( 2, 0 ), 2 ) ) {
2035 if ( !isEqual( ma0[ 0 ].getValue( 3, 0 ), 3 ) ) {
2038 if ( !isEqual( ma0[ 0 ].getValue( 0, 1 ), 1 ) ) {
2041 if ( !isEqual( ma0[ 0 ].getValue( 1, 1 ), 0 ) ) {
2044 if ( !isEqual( ma0[ 0 ].getValue( 2, 1 ), 4 ) ) {
2047 if ( !isEqual( ma0[ 0 ].getValue( 3, 1 ), 5 ) ) {
2050 if ( !isEqual( ma0[ 1 ].getValue( 0, 0 ), 0 ) ) {
2053 if ( !isEqual( ma0[ 1 ].getValue( 1, 0 ), 11 ) ) {
2056 if ( !isEqual( ma0[ 1 ].getValue( 2, 0 ), 12 ) ) {
2059 if ( !isEqual( ma0[ 1 ].getValue( 3, 0 ), 13 ) ) {
2062 if ( !isEqual( ma0[ 1 ].getValue( 0, 1 ), 11 ) ) {
2065 if ( !isEqual( ma0[ 1 ].getValue( 1, 1 ), 0 ) ) {
2068 if ( !isEqual( ma0[ 1 ].getValue( 2, 1 ), 14 ) ) {
2071 if ( !isEqual( ma0[ 1 ].getValue( 3, 1 ), 15 ) ) {
2074 if ( !isEqual( ma0[ 2 ].getValue( 0, 0 ), 0 ) ) {
2077 if ( !isEqual( ma0[ 2 ].getValue( 1, 0 ), 21 ) ) {
2080 if ( !isEqual( ma0[ 2 ].getValue( 2, 0 ), 22 ) ) {
2083 if ( !isEqual( ma0[ 2 ].getValue( 3, 0 ), 23 ) ) {
2086 if ( !isEqual( ma0[ 2 ].getValue( 0, 1 ), 21 ) ) {
2089 if ( !isEqual( ma0[ 2 ].getValue( 1, 1 ), 0 ) ) {
2092 if ( !isEqual( ma0[ 2 ].getValue( 2, 1 ), 24 ) ) {
2095 if ( !isEqual( ma0[ 2 ].getValue( 3, 1 ), 25 ) ) {
2098 source = new StringBuffer();
2099 source.append( "A 0 0 0 0" + l );
2100 source.append( "B 1 0 0 0" + l );
2101 source.append( "C 2 4 0 0" + l );
2102 source.append( "D 3 5 6 0" + l );
2103 source.append( " " + l );
2104 source.append( "A 0 11 12 13" + l );
2105 source.append( "B 11 0 14 15" + l );
2106 source.append( "C 12 14 0 16" + l );
2107 source.append( "D 13 15 16 0" + l );
2109 source.append( " A 0 " + l );
2110 source.append( " B 21 0" + l );
2111 source.append( " C 22 24 0 " + l );
2112 source.append( " # 2 222 2 2 " + l );
2113 source.append( " D 23 25 26 0" + l );
2114 final DistanceMatrix[] ma1 = p0.parse( source.toString() );
2115 if ( ma1.length != 3 ) {
2118 if ( !isEqual( ma1[ 0 ].getValue( 0, 0 ), 0 ) ) {
2121 if ( !isEqual( ma1[ 0 ].getValue( 1, 0 ), 1 ) ) {
2124 if ( !isEqual( ma1[ 0 ].getValue( 2, 0 ), 2 ) ) {
2127 if ( !isEqual( ma1[ 0 ].getValue( 3, 0 ), 3 ) ) {
2130 if ( !isEqual( ma1[ 0 ].getValue( 0, 1 ), 1 ) ) {
2133 if ( !isEqual( ma1[ 0 ].getValue( 1, 1 ), 0 ) ) {
2136 if ( !isEqual( ma1[ 0 ].getValue( 2, 1 ), 4 ) ) {
2139 if ( !isEqual( ma1[ 0 ].getValue( 3, 1 ), 5 ) ) {
2142 if ( !isEqual( ma1[ 1 ].getValue( 0, 0 ), 0 ) ) {
2145 if ( !isEqual( ma1[ 1 ].getValue( 1, 0 ), 11 ) ) {
2148 if ( !isEqual( ma1[ 1 ].getValue( 2, 0 ), 12 ) ) {
2151 if ( !isEqual( ma1[ 1 ].getValue( 3, 0 ), 13 ) ) {
2154 if ( !isEqual( ma1[ 1 ].getValue( 0, 1 ), 11 ) ) {
2157 if ( !isEqual( ma1[ 1 ].getValue( 1, 1 ), 0 ) ) {
2160 if ( !isEqual( ma1[ 1 ].getValue( 2, 1 ), 14 ) ) {
2163 if ( !isEqual( ma1[ 1 ].getValue( 3, 1 ), 15 ) ) {
2166 if ( !isEqual( ma1[ 2 ].getValue( 0, 0 ), 0 ) ) {
2169 if ( !isEqual( ma1[ 2 ].getValue( 1, 0 ), 21 ) ) {
2172 if ( !isEqual( ma1[ 2 ].getValue( 2, 0 ), 22 ) ) {
2175 if ( !isEqual( ma1[ 2 ].getValue( 3, 0 ), 23 ) ) {
2178 if ( !isEqual( ma1[ 2 ].getValue( 0, 1 ), 21 ) ) {
2181 if ( !isEqual( ma1[ 2 ].getValue( 1, 1 ), 0 ) ) {
2184 if ( !isEqual( ma1[ 2 ].getValue( 2, 1 ), 24 ) ) {
2187 if ( !isEqual( ma1[ 2 ].getValue( 3, 1 ), 25 ) ) {
2190 source = new StringBuffer();
2191 source.append( "A 0" + l );
2192 source.append( "B 10 0" + l );
2193 final DistanceMatrix[] ma2 = p0.parse( source.toString() );
2194 if ( ma2.length != 1 ) {
2197 if ( !isEqual( ma2[ 0 ].getValue( 0, 1 ), 10 ) ) {
2200 source = new StringBuffer();
2201 source.append( " " + l );
2202 source.append( "#" + l );
2203 final DistanceMatrix[] ma3 = p0.parse( source.toString() );
2204 if ( ma3.length != 0 ) {
2207 source = new StringBuffer();
2208 source.append( " " + l );
2209 source.append( "A 0 11 12 13" + l );
2210 source.append( "B 0 14 15" + l );
2211 source.append( "C 0 16" + l );
2212 source.append( "D 0" + l );
2214 source.append( "A 0 21 22 23" + l );
2215 source.append( "B 0 24 25" + l );
2216 source.append( "C 0 26" + l );
2217 source.append( "D 0" + l );
2218 p0.setInputMatrixType( SymmetricalDistanceMatrixParser.InputMatrixType.UPPER_TRIANGLE );
2219 final DistanceMatrix[] ma4 = p0.parse( source );
2220 if ( ma4.length != 2 ) {
2223 if ( !isEqual( ma4[ 0 ].getValue( 0, 0 ), 0 ) ) {
2226 if ( !isEqual( ma4[ 0 ].getValue( 1, 0 ), 11 ) ) {
2229 if ( !isEqual( ma4[ 0 ].getValue( 2, 0 ), 12 ) ) {
2232 if ( !isEqual( ma4[ 0 ].getValue( 3, 0 ), 13 ) ) {
2235 if ( !isEqual( ma4[ 0 ].getValue( 0, 1 ), 11 ) ) {
2238 if ( !isEqual( ma4[ 0 ].getValue( 1, 1 ), 0 ) ) {
2241 if ( !isEqual( ma4[ 0 ].getValue( 2, 1 ), 14 ) ) {
2244 if ( !isEqual( ma4[ 0 ].getValue( 3, 1 ), 15 ) ) {
2247 if ( !isEqual( ma4[ 0 ].getValue( 0, 2 ), 12 ) ) {
2250 if ( !isEqual( ma4[ 0 ].getValue( 1, 2 ), 14 ) ) {
2253 if ( !isEqual( ma4[ 0 ].getValue( 2, 2 ), 0 ) ) {
2256 if ( !isEqual( ma4[ 0 ].getValue( 3, 2 ), 16 ) ) {
2259 if ( !isEqual( ma4[ 0 ].getValue( 0, 3 ), 13 ) ) {
2262 if ( !isEqual( ma4[ 0 ].getValue( 1, 3 ), 15 ) ) {
2265 if ( !isEqual( ma4[ 0 ].getValue( 2, 3 ), 16 ) ) {
2268 if ( !isEqual( ma4[ 0 ].getValue( 3, 3 ), 0 ) ) {
2271 source = new StringBuffer();
2272 source.append( " 4 " + l );
2273 source.append( "A 0 11 12 13" + l );
2274 source.append( "B 0 14 15" + l );
2275 source.append( "C 0 16" + l );
2276 source.append( "D 0" + l );
2277 source.append( " 4" + l );
2278 source.append( "A 0 21 22 23" + l );
2279 source.append( "B 0 24 25" + l );
2280 source.append( "C 0 26" + l );
2281 source.append( "D 0" + l );
2282 source.append( " " + l );
2283 source.append( " 4" + l );
2284 source.append( "A 0 21 22 23" + l );
2285 source.append( "B 0 24 25" + l );
2286 source.append( "C 0 26" + l );
2287 source.append( "D 0" + l );
2289 source.append( "A 0 21 22 23" + l );
2290 source.append( "B 0 24 25" + l );
2291 source.append( "C 0 26" + l );
2292 source.append( "D 0" + l );
2293 p0.setInputMatrixType( SymmetricalDistanceMatrixParser.InputMatrixType.UPPER_TRIANGLE );
2294 final DistanceMatrix[] ma5 = p0.parse( source );
2295 if ( ma5.length != 4 ) {
2298 if ( !isEqual( ma5[ 0 ].getValue( 0, 0 ), 0 ) ) {
2301 if ( !isEqual( ma5[ 0 ].getValue( 1, 0 ), 11 ) ) {
2304 if ( !isEqual( ma5[ 0 ].getValue( 2, 0 ), 12 ) ) {
2307 if ( !isEqual( ma5[ 0 ].getValue( 3, 0 ), 13 ) ) {
2310 if ( !isEqual( ma5[ 0 ].getValue( 0, 1 ), 11 ) ) {
2313 if ( !isEqual( ma5[ 0 ].getValue( 1, 1 ), 0 ) ) {
2316 if ( !isEqual( ma5[ 0 ].getValue( 2, 1 ), 14 ) ) {
2319 if ( !isEqual( ma5[ 0 ].getValue( 3, 1 ), 15 ) ) {
2322 if ( !isEqual( ma5[ 0 ].getValue( 0, 2 ), 12 ) ) {
2325 if ( !isEqual( ma5[ 0 ].getValue( 1, 2 ), 14 ) ) {
2328 if ( !isEqual( ma5[ 0 ].getValue( 2, 2 ), 0 ) ) {
2331 if ( !isEqual( ma5[ 0 ].getValue( 3, 2 ), 16 ) ) {
2334 if ( !isEqual( ma5[ 0 ].getValue( 0, 3 ), 13 ) ) {
2337 if ( !isEqual( ma5[ 0 ].getValue( 1, 3 ), 15 ) ) {
2340 if ( !isEqual( ma5[ 0 ].getValue( 2, 3 ), 16 ) ) {
2343 if ( !isEqual( ma5[ 0 ].getValue( 3, 3 ), 0 ) ) {
2347 catch ( final Exception e ) {
2348 e.printStackTrace( System.out );
2354 private static void timeNeighborJoining() {
2355 final NeighborJoining nj = NeighborJoining.createInstance();
2356 for( int n = 3; n <= 13; ++n ) {
2357 final int x = ( int ) Math.pow( 2, n );
2358 final BasicSymmetricalDistanceMatrix mt = new BasicSymmetricalDistanceMatrix( x );
2359 mt.randomize( new Date().getTime() );
2360 // for( int i = 0; i < mt.getSize(); i++ ) {
2361 // mt.setIdentifier( i, i + "i" );
2363 // System.out.println( mt.toStringBuffer( Format.PHYLIP ) );
2364 final long start_time = new Date().getTime();
2366 System.out.println( "Size: " + x + " -> " + ( new Date().getTime() - start_time ) + "ms." );