/*
* IntMathVec.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.oldevomodel.indel;
/**
*
* IntMathVec -- mathematical vector of integers.
*
* Vectors provide equals() and hashCode() based on value-identity,
* so can be used in maps, but are NOT immutable, so take care not
* to change the value of map-keys.
*
* @author Gerton Lunter
*
* 20/3/2003
*
*/
class IntMathVec implements Cloneable {
public int[] iV;
/** Constructor, null vector of given length */
IntMathVec(int iLen) {
iV = new int[iLen];
}
/** Constructor, copy of existing vector */
IntMathVec(IntMathVec iVec) {
iV = iVec.iV.clone();
}
/** Constructor, copy of integer array - handy for printing */
IntMathVec(int[] iArr) {
iV = iArr.clone();
}
/** Internal, to make sure vectors are of same length. */
// I know, I should throw an exception.. Will likely happen automatically.
private void check(IntMathVec iVec) {
if (iVec.iV.length != iV.length) {
System.out.println("IntMathVec.check: Vector sizes don't match.");
}
}
/** Make equals() reflect value-identity instead of object-identity */
public boolean equals(Object iObj) {
if (iObj instanceof IntMathVec) {
IntMathVec iVec = (IntMathVec)iObj;
if (iVec.iV.length != iV.length)
return false;
for (int i=0; i<iV.length; i++) {
if (iV[i] != iVec.iV[i])
return false;
}
return true;
}
return false;
}
/** hashCode() reflects value-identity instead of object-identity */
public int hashCode() {
int iCode = 0;
for( int anIV : iV ) {
iCode = (iCode * 75) + anIV;
}
return iCode;
}
/** Clone this object */
public IntMathVec clone() {
try {
// This magically creates an object of the right type
IntMathVec iObj = (IntMathVec) super.clone();
iObj.iV = iV.clone();
return iObj;
} catch (CloneNotSupportedException e) {
System.out.println("IntMathVec.clone: Something happened that cannot happen -- ?");
return null;
}
}
/** Overriding built-in toString, produces Mathematica-readable output */
public String toString() {
String iResult = "{";
for (int i=0; i<iV.length; i++) {
if (i != 0)
iResult += ",";
iResult += iV[i];
}
iResult += "}";
return iResult;
}
/** Now the math thingies */
public int innerProduct(IntMathVec iVec) {
check(iVec);
int iSum = 0;
for (int i=0; i<iV.length; i++)
iSum += iVec.iV[i]*iV[i];
return iSum;
}
public boolean zeroEntry() {
for(int anIV : iV) {
if( anIV == 0 ) {
return true;
}
}
return false;
}
public void assign(IntMathVec iVec) {
iV = iVec.iV.clone();
}
public void add(IntMathVec iVec) {
check(iVec);
for (int i=0; i<iV.length; i++)
iV[i] += iVec.iV[i];
}
public void addMultiple(IntMathVec iVec, int iMultiple) {
check(iVec);
for (int i=0; i<iV.length; i++)
iV[i] += iVec.iV[i] * iMultiple;
}
public void subtract(IntMathVec iVec) {
check(iVec);
for (int i=0; i<iV.length; i++)
iV[i] -= iVec.iV[i];
}
}