/*
* DifferenceMatrixParameter.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.inference.model;
import java.util.List;
import dr.inference.model.Bounds;
import dr.inference.model.Parameter;
import dr.inference.model.Variable;
import dr.inference.model.VariableListener;
public class DifferenceMatrixParameter extends MatrixParameter implements
VariableListener{
private Parameter parameter1;
private Parameter parameter2;
private Bounds bounds = null;
public DifferenceMatrixParameter(Parameter parameter1, Parameter parameter2) {
super(null);
this.parameter1 = parameter1;
this.parameter2 = parameter2;
this.parameter1.addVariableListener(this);
this.parameter2.addVariableListener(this);
}// END: Constructor
@Override
public double getParameterValue(int dim) {
double value=0;
if(dim<Math.max(parameter1.getDimension(),parameter2.getDimension()))
{
if(parameter1.getDimension()==parameter2.getDimension()) {
value = parameter1.getParameterValue(dim)
- parameter2.getParameterValue(dim); }
else if(parameter1.getDimension()<parameter2.getDimension()){
value=parameter1.getParameterValue(dim%parameter1.getDimension())-parameter2.getParameterValue(dim);
}
else
value=parameter1.getParameterValue(dim)-parameter2.getParameterValue(dim% parameter2.getDimension());
}
else {
System.out.println(dim);
throw new RuntimeException("Index out of bounds.");
}
return value;
}// END: getParameterValue
public double getParameterValue(int row, int col){
double val1;
double val2;
if(parameter1 instanceof MatrixParameter){
val1=((MatrixParameter) parameter1).getParameterValue(row, col);
}
else{
val1=getParameterValue(row);
}
if(parameter2 instanceof MatrixParameter){
val2=((MatrixParameter) parameter2).getParameterValue(row, col);
}
else{
val2=getParameterValue(row);
}
return val1-val2;
}
public int getParameterCount(){
int pcount1=1;
int pcount2=1;
if(parameter1 instanceof MatrixParameter){
pcount1=((MatrixParameter) parameter1).getParameterCount();
}
if(parameter2 instanceof MatrixParameter){
pcount2=((MatrixParameter) parameter2).getParameterCount();
}
return Math.max(pcount1, pcount2);
}
@Override
public Parameter getParameter(int index) {
Parameter tempParam1;
Parameter tempParam2;
if(parameter1 instanceof CompoundParameter){
tempParam1=((CompoundParameter) parameter1).getParameter(index);
}
else{
tempParam1=parameter1;
}
if(parameter2 instanceof CompoundParameter){
tempParam2=((CompoundParameter) parameter2).getParameter(index);
}
else{
tempParam2=parameter2;
}
return new DifferenceMatrixParameter(tempParam1, tempParam2);
}
@Override
public void setParameterValue(int dim, double value) {
throw new RuntimeException("Not implemented");
}
@Override
public void setParameterValueQuietly(int dim, double value) {
throw new RuntimeException("Not implemented");
}
@Override
public void setParameterValueNotifyChangedAll(int dim, double value) {
throw new RuntimeException("Not implemented");
}
// @Override
// public String getParameterName() {
// if (getId() == null) {
//
// StringBuilder sb = new StringBuilder("ratio");
// sb.append(parameter1.getId()).append(".")
// .append(parameter2.getId());
// setId(sb.toString());
// }
//
// return getId();
// }// END: getParameterName
@Override
public int getDimension() {
return Math.max(parameter1.getDimension(), parameter2.getDimension());
}
@Override
public void addBounds(Bounds<Double> bounds) {
this.bounds = bounds;
}
@Override
public Bounds<Double> getBounds() {
return bounds;
}
@Override
public void addDimension(int index, double value) {
throw new RuntimeException("Not yet implemented.");
}
@Override
public double removeDimension(int index) {
throw new RuntimeException("Not yet implemented.");
}
@Override
public void variableChangedEvent(Variable variable, int index,
dr.inference.model.Variable.ChangeType type) {
fireParameterChangedEvent(index, type);
}
@Override
protected void storeValues() {
parameter1.storeParameterValues();
parameter2.storeParameterValues();
}
@Override
protected void restoreValues() {
parameter1.restoreParameterValues();
parameter2.restoreParameterValues();
}
@Override
public int getRowDimension() {
boolean param1 = parameter1 instanceof MatrixParameter;
boolean param2 = parameter2 instanceof MatrixParameter;
System.out.println("row");
if (param1 & param2) {
if (((MatrixParameter) parameter1).getRowDimension() == ((MatrixParameter) parameter2).getRowDimension()) {
return ((MatrixParameter) parameter1).getRowDimension();
} else {
throw new RuntimeException("parameters not of the same length");
}
} else if (param1) {
return ((MatrixParameter) parameter1).getRowDimension();
} else if (param2) {
return ((MatrixParameter) parameter2).getRowDimension();
} else {
return parameter1.getDimension();
}
}
@Override
public int getColumnDimension(){
System.out.println("column");
boolean param1=parameter1 instanceof MatrixParameter;
boolean param2=parameter2 instanceof MatrixParameter;
if(param1 & param2){
if(((MatrixParameter)parameter1).getColumnDimension()==((MatrixParameter)parameter2).getColumnDimension()){
return ((MatrixParameter)parameter1).getColumnDimension();
}
else{
throw new RuntimeException("parameters not of the same length");
}
}
else if(param1) {
return ((MatrixParameter) parameter1).getColumnDimension();
}
else if(param2){
return ((MatrixParameter)parameter2).getColumnDimension();
}
else{
return 1;
}
}
// @Override
// protected void acceptValues() {
// parameter1.acceptParameterValues();
// parameter2.acceptParameterValues();
// }
//
// @Override
// protected void adoptValues(Parameter source) {
// throw new RuntimeException("Not implemented");
// }
}// END: class