Skip to content

Commit bc4f6e4

Browse files
committed
SCMigrationModel now accepts Function inputs.
1 parent 791d05b commit bc4f6e4

File tree

3 files changed

+41
-64
lines changed

3 files changed

+41
-64
lines changed

src/beast/app/multitypetree/beauti/InitMigrationModelConnector.java

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
import beast.app.beauti.BeautiDoc;
2020
import beast.core.BEASTInterface;
2121
import beast.core.parameter.Parameter;
22+
import beast.core.parameter.RealParameter;
2223
import beast.evolution.likelihood.TreeLikelihood;
2324
import beast.evolution.tree.SCMigrationModel;
2425
import beast.evolution.tree.StructuredCoalescentMultiTypeTree;
@@ -52,24 +53,24 @@ public static boolean customConnector(BeautiDoc doc) {
5253
SCMigrationModel migModelInit = (SCMigrationModel)doc.pluginmap.get(
5354
"migModelInit.t:" + pID);
5455

55-
String rateMatrixStr = getParameterString(migModel.rateMatrixInput.get());
56-
String popSizesStr = getParameterString(migModel.popSizesInput.get());
56+
String rateMatrixStr = getParameterString((RealParameter)migModel.rateMatrixInput.get());
57+
String popSizesStr = getParameterString((RealParameter)migModel.popSizesInput.get());
5758

58-
migModelInit.popSizesInput.get().setDimension(migModel.getNTypes());
59+
((RealParameter)migModelInit.popSizesInput.get()).setDimension(migModel.getNTypes());
5960

60-
migModelInit.popSizesInput.get().valuesInput.setValue(
61+
((RealParameter)migModelInit.popSizesInput.get()).valuesInput.setValue(
6162
popSizesStr,
62-
migModelInit.popSizesInput.get());
63+
(RealParameter)migModelInit.popSizesInput.get());
6364

64-
migModelInit.rateMatrixInput.get().setDimension(
65+
((RealParameter)migModelInit.rateMatrixInput.get()).setDimension(
6566
migModel.getNTypes()*(migModel.getNTypes()-1));
66-
migModelInit.rateMatrixInput.get().valuesInput.setValue(
67+
((RealParameter)migModelInit.rateMatrixInput.get()).valuesInput.setValue(
6768
rateMatrixStr,
68-
migModelInit.rateMatrixInput.get());
69+
(RealParameter)migModelInit.rateMatrixInput.get());
6970

7071
try {
71-
migModelInit.popSizesInput.get().initAndValidate();
72-
migModelInit.rateMatrixInput.get().initAndValidate();
72+
((RealParameter)migModelInit.popSizesInput.get()).initAndValidate();
73+
((RealParameter)migModelInit.rateMatrixInput.get()).initAndValidate();
7374
migModelInit.initAndValidate();
7475
} catch (Exception ex) {
7576
System.err.println("Error configuring initial migration model.");

src/beast/app/multitypetree/beauti/MigrationModelInputEditor.java

Lines changed: 19 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
import beast.app.draw.InputEditor;
2121
import beast.core.BEASTInterface;
2222
import beast.core.Input;
23+
import beast.core.parameter.RealParameter;
2324
import beast.evolution.tree.SCMigrationModel;
2425
import java.awt.Color;
2526
import java.awt.Component;
@@ -131,7 +132,7 @@ public boolean isCellEditable(int row, int column) {
131132
c.weightx = 1.0;
132133
c.anchor = GridBagConstraints.LINE_START;
133134
panel.add(popSizeTable, c);
134-
popSizeEstCheckBox.setSelected(migModel.popSizesInput.get().isEstimatedInput.get());
135+
popSizeEstCheckBox.setSelected(((RealParameter)migModel.popSizesInput.get()).isEstimatedInput.get());
135136
c.gridx = 2;
136137
c.gridy = 1;
137138
c.anchor = GridBagConstraints.LINE_END;
@@ -174,7 +175,7 @@ public Component getTableCellRendererComponent(
174175
c.anchor = GridBagConstraints.LINE_START;
175176
c.weightx = 1.0;
176177
panel.add(rateMatrixTable, c);
177-
rateMatrixEstCheckBox.setSelected(migModel.rateMatrixInput.get().isEstimatedInput.get());
178+
rateMatrixEstCheckBox.setSelected(((RealParameter)migModel.rateMatrixInput.get()).isEstimatedInput.get());
178179

179180
c.gridx = 2;
180181
c.gridy = 2;
@@ -194,10 +195,10 @@ public Component getTableCellRendererComponent(
194195
dimChangeInProgress = true;
195196

196197
popSizeModel.setColumnCount(newDim);
197-
migModel.popSizesInput.get().setDimension(newDim);
198+
((RealParameter)migModel.popSizesInput.get()).setDimension(newDim);
198199
rateMatrixModel.setColumnCount(newDim);
199200
rateMatrixModel.setRowCount(newDim);
200-
migModel.rateMatrixInput.get().setDimension(newDim*newDim);
201+
((RealParameter)migModel.rateMatrixInput.get()).setDimension(newDim*newDim);
201202
for (int i=0; i<newDim; i++) {
202203
if (popSizeModel.getValueAt(0, i) == null) {
203204
popSizeModel.setValueAt(1.0, 0, i);
@@ -257,8 +258,8 @@ public void loadFromMigrationModel() {
257258
}
258259
}
259260

260-
popSizeEstCheckBox.setSelected(migModel.popSizesInput.get().isEstimatedInput.get());
261-
rateMatrixEstCheckBox.setSelected(migModel.rateMatrixInput.get().isEstimatedInput.get());
261+
popSizeEstCheckBox.setSelected(((RealParameter)migModel.popSizesInput.get()).isEstimatedInput.get());
262+
rateMatrixEstCheckBox.setSelected(((RealParameter)migModel.rateMatrixInput.get()).isEstimatedInput.get());
262263
}
263264

264265
public void saveToMigrationModel() {
@@ -272,10 +273,10 @@ public void saveToMigrationModel() {
272273
else
273274
sbPopSize.append("1.0");
274275
}
275-
migModel.popSizesInput.get().setDimension(popSizeModel.getColumnCount());
276-
migModel.popSizesInput.get().valuesInput.setValue(
276+
((RealParameter)migModel.popSizesInput.get()).setDimension(popSizeModel.getColumnCount());
277+
((RealParameter)migModel.popSizesInput.get()).valuesInput.setValue(
277278
sbPopSize.toString(),
278-
migModel.popSizesInput.get());
279+
(RealParameter)migModel.popSizesInput.get());
279280

280281
StringBuilder sbRateMatrix = new StringBuilder();
281282
boolean first = true;
@@ -295,20 +296,20 @@ public void saveToMigrationModel() {
295296
sbRateMatrix.append("1.0");
296297
}
297298
}
298-
migModel.rateMatrixInput.get().setDimension(
299+
((RealParameter)migModel.rateMatrixInput.get()).setDimension(
299300
popSizeModel.getColumnCount()*(popSizeModel.getColumnCount()-1));
300-
migModel.rateMatrixInput.get().valuesInput.setValue(
301+
((RealParameter)migModel.rateMatrixInput.get()).valuesInput.setValue(
301302
sbRateMatrix.toString(),
302-
migModel.rateMatrixInput.get());
303+
(RealParameter)migModel.rateMatrixInput.get());
303304

304-
migModel.popSizesInput.get().isEstimatedInput.setValue(
305-
popSizeEstCheckBox.isSelected(), migModel.popSizesInput.get());
306-
migModel.rateMatrixInput.get().isEstimatedInput.setValue(
307-
rateMatrixEstCheckBox.isSelected(), migModel.rateMatrixInput.get());
305+
((RealParameter)migModel.popSizesInput.get()).isEstimatedInput.setValue(
306+
popSizeEstCheckBox.isSelected(), (RealParameter)migModel.popSizesInput.get());
307+
((RealParameter)migModel.rateMatrixInput.get()).isEstimatedInput.setValue(
308+
rateMatrixEstCheckBox.isSelected(), (RealParameter)migModel.rateMatrixInput.get());
308309

309310
try {
310-
migModel.rateMatrixInput.get().initAndValidate();
311-
migModel.popSizesInput.get().initAndValidate();
311+
((RealParameter)migModel.rateMatrixInput.get()).initAndValidate();
312+
((RealParameter)migModel.popSizesInput.get()).initAndValidate();
312313
migModel.initAndValidate();
313314
} catch (Exception ex) {
314315
System.err.println("Error updating migration model state.");

src/beast/evolution/tree/SCMigrationModel.java

Lines changed: 11 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818

1919
import beast.core.CalculationNode;
2020
import beast.core.Description;
21+
import beast.core.Function;
2122
import beast.core.Input;
2223
import beast.core.Input.Validate;
2324
import beast.core.parameter.BooleanParameter;
@@ -34,12 +35,12 @@
3435
@Description("Basic plugin describing a simple Markovian migration model.")
3536
public class SCMigrationModel extends CalculationNode implements MigrationModel {
3637

37-
public Input<RealParameter> rateMatrixInput = new Input<>(
38+
public Input<Function> rateMatrixInput = new Input<>(
3839
"rateMatrix",
3940
"Migration rate matrix",
4041
Validate.REQUIRED);
4142

42-
public Input<RealParameter> popSizesInput = new Input<>(
43+
public Input<Function> popSizesInput = new Input<>(
4344
"popSizes",
4445
"Deme population sizes.",
4546
Validate.REQUIRED);
@@ -49,7 +50,7 @@ public class SCMigrationModel extends CalculationNode implements MigrationModel
4950
"Optional boolean parameter specifying which rates to use."
5051
+ " (Default is to use all rates.)");
5152

52-
protected RealParameter rateMatrix, popSizes;
53+
protected Function rateMatrix, popSizes;
5354
protected BooleanParameter rateMatrixFlags;
5455
protected double mu, muSym;
5556
protected int nTypes;
@@ -81,8 +82,11 @@ public void initAndValidate() {
8182
if (rateMatrixFlagsInput.get() != null)
8283
rateMatrixFlags = rateMatrixFlagsInput.get();
8384

84-
rateMatrix.setLower(Math.max(rateMatrix.getLower(), 0.0));
85-
popSizes.setLower(Math.max(popSizes.getLower(), 0.0));
85+
if (rateMatrix instanceof RealParameter)
86+
((RealParameter)rateMatrix).setLower(Math.max(((RealParameter)rateMatrix).getLower(), 0.0));
87+
88+
if (popSizes instanceof RealParameter)
89+
((RealParameter)popSizes).setLower(Math.max(((RealParameter)popSizes).getLower(), 0.0));
8690

8791
if (rateMatrix.getDimension() == nTypes*nTypes) {
8892
rateMatrixIsSquare = true;
@@ -190,7 +194,7 @@ public double getRateForLog(int i, int j) {
190194
if (i==j)
191195
return 0;
192196

193-
return rateMatrix.getValue(getArrayOffset(i, j));
197+
return rateMatrix.getArrayValue(getArrayOffset(i, j));
194198

195199
}
196200

@@ -212,7 +216,7 @@ public double getBackwardRate(int i, int j) {
212216
&& !rateMatrixFlagsInput.get().getValue(offset))
213217
return 0.0;
214218
else
215-
return rateMatrix.getValue(offset);
219+
return rateMatrix.getArrayValue(offset);
216220
}
217221

218222
/**
@@ -249,24 +253,6 @@ public double getForwardRate(int i, int j) {
249253
return getBackwardRate(j, i)*getPopSize(j)/getPopSize(i);
250254
}
251255

252-
/**
253-
* Set element of rate matrix for migration model.
254-
* This method should only be called by operators.
255-
*
256-
* @param i
257-
* @param j
258-
* @param rate
259-
*/
260-
public void setBackwardRate(int i, int j, double rate) {
261-
if (i==j)
262-
return;
263-
264-
rateMatrix.setValue(getArrayOffset(i,j), rate);
265-
266-
// Model is now dirty.
267-
dirty = true;
268-
}
269-
270256
/**
271257
* Obtain offset into "rate matrix" and associated flag arrays.
272258
*
@@ -306,17 +292,6 @@ protected int getArrayOffset(int i, int j) {
306292
public double getPopSize(int i) {
307293
return popSizes.getArrayValue(i);
308294
}
309-
310-
/**
311-
* Set effective population size of particular type/deme.
312-
*
313-
* @param i deme index
314-
* @param newSize
315-
*/
316-
public void setPopSize(int i, double newSize) {
317-
popSizes.setValue(i, newSize);
318-
dirty = true;
319-
}
320295

321296
@Override
322297
public double getMu(boolean symmetric) {

0 commit comments

Comments
 (0)