///*
// * NewMatrixParameter.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 dr.xml.*;
//
//import java.util.StringTokenizer;
////import org.w3c.dom.Document;
////import org.w3c.dom.Element;
////import dr.xml.*;
//
///**
// * @author Marc Suchard
// */
//public class NewMatrixParameter extends Parameter.Default {
//
// public final static String MATRIX_PARAMETER = "matrixParameter";
//
// public NewMatrixParameter(String name) {
// super(name);
// }
//
// public NewMatrixParameter(String name, double[] parameter, int numRows, int numCols) {
// super(parameter);
// this.numRows = numRows;
// this.numCols = numCols;
// }
//
// private int numRows = 0;
// private int numCols = 0;
//
// public double getParameterValue(int row, int col) {
// return getParameterValue(row * numCols + col); // Stores in row-major
// }
//
// public double[][] getParameterAsMatrix() {
//// final int I = getRowDimension();
//// final int J = getColumnDimension();
//// double[][] parameterAsMatrix = new double[I][J];
//// for (int i = 0; i < I; i++) {
//// for (int j = 0; j < J; j++)
//// parameterAsMatrix[i][j] = getParameterValue(i, j);
//// }
//// return parameterAsMatrix;
// double[][] parameterAsMatris = new double[numRows][numCols];
// for (int i = 0; i < numRows; i++) {
// for (int j = 0; j < numCols; j++) {
// parameterAsMatris[i][j] = getParameterValue(i * numCols + j);
// }
// }
// return parameterAsMatris;
// }
//
// public int getColumnDimension() {
// return numCols;
// }
//
// public int getRowDimension() {
// return numRows;
// }
//
// public String toSymmetricString() {
// StringBuffer sb = new StringBuffer("{");
// int dim = getRowDimension();
// int total = dim * (dim + 1) / 2;
// for (int i = 0; i < dim; i++) {
// for (int j = i; j < dim; j++) {
// sb.append(String.format("%5.4e", getParameterValue(i, j)));
// total--;
// if (total > 0)
// sb.append(",");
// }
// }
// sb.append("}");
// return sb.toString();
// }
//
// public static NewMatrixParameter parseFromSymmetricString(String string) {
// String clip = string.replace("{", "").replace("}", "").trim();
// StringTokenizer st = new StringTokenizer(clip, ",");
// int count = st.countTokens();
// int dim = (-1 + (int) Math.sqrt(1 + 8 * count)) / 2;
//// Parameter[] parameter = new Parameter[dim];
//// for (int i = 0; i < dim; i++)
//// parameter[i] = new Parameter.Default(dim);
//// for (int i = 0; i < dim; i++) {
//// for (int j = i; j < dim; j++) {
//// double datum = new Double(st.nextToken());
//// parameter[i].setParameterValue(j, datum);
//// parameter[j].setParameterValue(i, datum);
//// }
//// }
// double[] data = new double[dim * dim];
// for (int i = 0; i < dim; i++) {
// for (int j = i; j < dim; j++) {
// double datum = new Double(st.nextToken());
// data[i * dim + j] = datum;
// data[j * dim + i] = datum;
// }
// }
// return new NewMatrixParameter(null, data, dim, dim);
// }
//
// public static NewMatrixParameter parseFromSymmetricDoubleArray(Object[] inData) {
//
// int dim = (-1 + (int) Math.sqrt(1 + 8 * inData.length)) / 2;
//// Parameter[] parameter = new Parameter[dim];
//// for (int i = 0; i < dim; i++)
//// parameter[i] = new Parameter.Default(dim);
// int index = 0;
//// for (int i = 0; i < dim; i++) {
//// for (int j = i; j < dim; j++) {
//// double datum = (Double) data[index++];
//// parameter[i].setParameterValue(j, datum);
//// parameter[j].setParameterValue(i, datum);
//// }
//// }
//// return new MatrixParameter(null, parameter);
// double[] data = new double[dim * dim];
// for (int i = 0; i < dim; i++) {
// for (int j = i; j < dim; j++) {
// double datum = (Double) inData[index++];
// data[i * dim + j] = datum;
// data[j * dim + i] = datum;
// }
// }
// return new NewMatrixParameter(null, data, dim, dim);
// }
//
// // **************************************************************
// // XMLElement IMPLEMENTATION
// // **************************************************************
//
//// public Element createElement(Document d) {
//// throw new RuntimeException("Not implemented yet!");
//// }
//
// public static XMLObjectParser PARSER = new AbstractXMLObjectParser() {
//
// public String getParserName() {
// return MATRIX_PARAMETER;
// }
//
// public Object parseXMLObject(XMLObject xo) throws XMLParseException {
//
//// MatrixParameter matrixParameter = new MatrixParameter(MATRIX_PARAMETER);
//
// int numRows = xo.getChildCount();
// int numCols = 0;
//
// double[] values = null;
//
// for (int i = 0; i < numRows; i++) {
// Parameter parameter = (Parameter) xo.getChild(i);
// if (values == null) {
// numCols = parameter.getDimension();
// values = new double[numCols * numRows];
// } else {
// if (numCols != parameter.getDimension()) {
// throw new XMLParseException(
// "All parameters must have the same dimension to construct a rectangular matrix");
// }
// }
// double[] newValues = parameter.getParameterValues();
// System.arraycopy(newValues, 0, values, i * numCols, numCols);
// }
//
// String name = (xo.hasId() ? xo.getId() : MATRIX_PARAMETER);
//
// return new NewMatrixParameter(name, values, numRows, numCols);
// }
//
// //************************************************************************
// // AbstractXMLObjectParser implementation
// //************************************************************************
//
// public String getParserDescription() {
// return "A matrix parameter constructed from its component parameters.";
// }
//
// public XMLSyntaxRule[] getSyntaxRules() {
// return rules;
// }
//
// private final XMLSyntaxRule[] rules = {
// new ElementRule(Parameter.class, 1, Integer.MAX_VALUE),
// };
//
// public Class getReturnType() {
// return NewMatrixParameter.class;
// }
// };
//
//
//}