diff --git a/src/dr/math/distributions/BayesianBridgeMarkovRandomField.java b/src/dr/math/distributions/BayesianBridgeMarkovRandomField.java index a0fcc052df..ada7e15e32 100644 --- a/src/dr/math/distributions/BayesianBridgeMarkovRandomField.java +++ b/src/dr/math/distributions/BayesianBridgeMarkovRandomField.java @@ -55,10 +55,27 @@ public BayesianBridgeMarkovRandomField(String name, } @Override - SymmetricTriDiagonalMatrix getQ() { + protected SymmetricTriDiagonalMatrix getQ() { if (!qKnown) { -// bayesianBridge.getStandardDeviation(i); - throw new RuntimeException("Not yet implemented"); + + final double[] diagonal = Q.diagonal; + final double[] offDiagonal = Q.offDiagonal; + + double sd = bayesianBridge.getStandardDeviation(0); + offDiagonal[0] = -1.0 / (sd * sd); + diagonal[0] = -offDiagonal[0]; + + for (int i = 1; i < dim - 1; ++i) { + sd = bayesianBridge.getStandardDeviation(i); + offDiagonal[i] = -1.0 / (sd * sd); + diagonal[i] = -(offDiagonal[i - 1] + offDiagonal[i]); + } + + diagonal[dim - 1] = -offDiagonal[dim - 2]; + + // TODO Update for lambda != 1 and for weights + + qKnown = true; } return Q; } diff --git a/src/dr/math/distributions/GaussianMarkovRandomField.java b/src/dr/math/distributions/GaussianMarkovRandomField.java index 0f0ae39434..b049af5e55 100644 --- a/src/dr/math/distributions/GaussianMarkovRandomField.java +++ b/src/dr/math/distributions/GaussianMarkovRandomField.java @@ -43,7 +43,7 @@ public class GaussianMarkovRandomField extends RandomFieldDistribution { public static final String TYPE = "GaussianMarkovRandomField"; - private final int dim; + protected final int dim; private final Parameter meanParameter; private final Parameter precisionParameter; private final RandomField.WeightProvider weightProvider; @@ -117,7 +117,7 @@ public double[] getMean() { return mean; } - SymmetricTriDiagonalMatrix getQ() { + protected SymmetricTriDiagonalMatrix getQ() { if (!qKnown) { double precision = precisionParameter.getParameterValue(0); Q.diagonal[0] = precision;