/*
* MapDiffusionModel.java
*
* Copyright (c) 2002-2015 Alexei Drummond, Andrew Rambaut and Marc Suchard
*
* This file is part of BEAST.
* See the NOTICE file distributed with this work for additional
* information regarding copyright ownership and licensing.
*
* BEAST is free software; you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as
* published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* BEAST is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with BEAST; if not, write to the
* Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
* Boston, MA 02110-1301 USA
*/
package dr.evomodel.continuous;
import dr.inference.model.Parameter;
import dr.math.MathUtils;
import dr.xml.*;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
public class MapDiffusionModel extends MultivariateDiffusionModel {
public static final String MAP_DIFFUSION_MODEL = "mapDiffusionModel";
public static final String GRASS_FILE_NAME = "grassMapFile";
public static final String STARTING_VALUES = "randomStartingValues";
public MapDiffusionModel(TopographicalMap map, Parameter graphRate) {
super();
this.map = map;
this.graphRate = graphRate;
addVariable(graphRate);
initializationReport();
}
public TopographicalMap getMap() {
return map;
}
private void initializationReport() {
System.out.println("Constructing map diffusion model for");
System.out.println("\tMap: " + map.getXDim() + "x" + map.getYDim());
System.out.println("\tRandom-walk order: " + map.getOrder());
System.out.println("\tRandom-walk non-zero size: " + map.getNonZeroSize());
// System.out.println("\tRW1 Matrix:\n"+map.getMatrix().sparseRepresentation());
System.out.println("\tRate parameter: " + graphRate.getStatisticName());
//System.out.println("\tTest probability: "+map.getMatrix().getExponentialEntry(0,0,1.0));
}
/**
* @return the log likelihood of going from start to stop in the given time
*/
public double getLogLikelihood(double[] start, double[] stop, double time) {
// System.err.println("Calc from "+start[0]+" "+start[1]);
// System.err.println("Calc to "+stop[0]+" "+stop[1]);
// System.err.println("like");
double rtn =
// return
Math.log(
map.getCTMCProbability(start, stop, graphRate.getParameterValue(0) * time)
);
// System.err.println("logProb = "+rtn);
return rtn;
}
public void handleParameterChangedEvent(Parameter parameter, int index) {
// calculatePrecisionInfo();
}
// private void calculatePrecisionInfo() {
// }
public static XMLObjectParser PARSER = new AbstractXMLObjectParser() {
public String getParserName() {
return MAP_DIFFUSION_MODEL;
}
public Object parseXMLObject(XMLObject xo) throws XMLParseException {
Parameter graphRate = (Parameter) xo.getChild(Parameter.class);
String mapFileName = xo.getStringAttribute(GRASS_FILE_NAME);
File mapFile;
try {
File file = new File(mapFileName);
String name = file.getName();
String parent = file.getParent();
if (!file.isAbsolute()) {
parent = System.getProperty("user.dir");
}
mapFile = new File(parent, name);
new FileReader(mapFile);
} catch (FileNotFoundException fnfe) {
throw new XMLParseException("File '" + mapFileName + "' can not be opened for " + getParserName() + " element.");
}
double[][] mapValues;
try {
mapValues = TopographicalMap.readGRASSAscii(mapFileName);
} catch (IOException e) {
throw new XMLParseException("File '" + mapFileName + "' can not be read as GRASS file");
}
TopographicalMap map = new TopographicalMap(mapValues);
XMLObject cxo = xo.getChild(STARTING_VALUES);
if (cxo != null) {
System.err.println("Init");
Parameter startPosition = (Parameter) cxo.getChild(Parameter.class);
int numberPositions = startPosition.getDimension() / 2;
int dimX = map.getXDim();
int dimY = map.getYDim();
for (int i = 0; i < numberPositions; i++) {
int x = -1;
int y = -1;
while (map.getIndex(x, y) == -1) {
x = MathUtils.nextInt(dimX);
y = MathUtils.nextInt(dimY);
x = 0;
y = 100;
}
startPosition.setParameterValue(i * 2, x);
startPosition.setParameterValue(i * 2 + 1, y);
System.err.println("set: " + x + "," + y);
}
}
return new MapDiffusionModel(map, graphRate);
}
//************************************************************************
// AbstractXMLObjectParser implementation
//************************************************************************
public String getParserDescription() {
return "Describes a multivariate discrete diffusion process.";
}
public XMLSyntaxRule[] getSyntaxRules() {
return rules;
}
private final XMLSyntaxRule[] rules = {
AttributeRule.newStringRule(GRASS_FILE_NAME),
new ElementRule(Parameter.class),
};
public Class getReturnType() {
return MapDiffusionModel.class;
}
};
private final TopographicalMap map;
private final Parameter graphRate;
}