2323import beast .evolution .likelihood .TreeLikelihood ;
2424import beast .evolution .tree .SCMigrationModel ;
2525import beast .evolution .tree .StructuredCoalescentMultiTypeTree ;
26+ import beast .evolution .tree .TraitSet ;
2627
28+ import java .util .HashSet ;
2729import java .util .List ;
30+ import java .util .Set ;
2831
2932
3033/**
3740 * @author Tim Vaughan ([email protected] ) 3841 */
3942public class InitMigrationModelConnector {
43+
44+ public static int uniqueTraitsInData (StructuredCoalescentMultiTypeTree scTree ) {
45+ Set <String > uniqueTypes = new HashSet <>();
46+ TraitSet typeTraitSet = scTree .typeTraitInput .get ();
47+ for (String taxonName : typeTraitSet .taxaInput .get ().getTaxaNames ())
48+ uniqueTypes .add (typeTraitSet .getStringValue (taxonName ));
49+
50+ return uniqueTypes .size ();
51+ }
4052
4153 public static boolean customConnector (BeautiDoc doc ) {
4254
@@ -56,6 +68,37 @@ public static boolean customConnector(BeautiDoc doc) {
5668 String rateMatrixStr = getParameterString ((RealParameter )migModel .rateMatrixInput .get ());
5769 String popSizesStr = getParameterString ((RealParameter )migModel .popSizesInput .get ());
5870
71+ // Ensure model has minimum number of demes
72+ int uniqueTraitCount = uniqueTraitsInData (tree );
73+ StringBuilder rateMatrixStrBuilder = new StringBuilder ();
74+ StringBuilder popSizesStrBuilder = new StringBuilder ();
75+ if (migModel .getNTypes ()<uniqueTraitCount ) {
76+ for (int i =0 ; i <uniqueTraitCount ; i ++) {
77+ popSizesStrBuilder .append (" 1.0" );
78+ for (int j =0 ; j <uniqueTraitCount ; j ++) {
79+ if (j == i )
80+ continue ;
81+
82+ rateMatrixStrBuilder .append (" 1.0" );
83+ }
84+ }
85+
86+ popSizesStr = popSizesStrBuilder .toString ();
87+ rateMatrixStr = rateMatrixStrBuilder .toString ();
88+
89+ ((RealParameter )migModel .popSizesInput .get ()).setDimension (uniqueTraitCount );
90+ ((RealParameter )migModel .popSizesInput .get ()).valuesInput .setValue (popSizesStr ,
91+ (RealParameter )migModel .popSizesInput .get ());
92+
93+ ((RealParameter )migModel .rateMatrixInput .get ()).setDimension (uniqueTraitCount *(uniqueTraitCount -1 ));
94+ ((RealParameter )migModel .rateMatrixInput .get ()).valuesInput .setValue (rateMatrixStr ,
95+ (RealParameter )migModel .rateMatrixInput .get ());
96+
97+ ((RealParameter )migModel .popSizesInput .get ()).initAndValidate ();
98+ ((RealParameter )migModel .rateMatrixInput .get ()).initAndValidate ();
99+ migModel .initAndValidate ();
100+ }
101+
59102 ((RealParameter )migModelInit .popSizesInput .get ()).setDimension (migModel .getNTypes ());
60103
61104 ((RealParameter )migModelInit .popSizesInput .get ()).valuesInput .setValue (
0 commit comments