samer@0: /* samer@0: * Copyright (c) 2001, Samer Abdallah, King's College London. samer@0: * All rights reserved. samer@0: * samer@0: * This software is provided AS iS and WITHOUT ANY WARRANTY; samer@0: * without even the implied warranty of MERCHANTABILITY or samer@0: * FITNESS FOR A PARTICULAR PURPOSE. samer@0: */ samer@0: samer@0: package samer.units; samer@0: samer@0: import samer.core.*; samer@0: import samer.core.types.*; samer@0: import samer.core.util.*; samer@0: import samer.maths.*; samer@0: import samer.tools.*; samer@0: import java.util.*; samer@0: samer@0: /** samer@0: Builds up a 2D joint histogram of 2 elements of a vector. samer@0: */ samer@0: samer@0: public class JointHistogram extends Viewable implements Agent, Task, Observer { samer@0: VInteger I1, I2; samer@0: VMap vmap; samer@0: Matrix bins; samer@0: IMap map; samer@0: int i1, i2; samer@0: double[] xArray; samer@0: double[][] binArray; samer@0: double[] lbw; samer@0: VDouble L; samer@0: int count; samer@0: samer@0: public JointHistogram(Vec x, int bins, int i1, int i2) { samer@0: this(x,bins); samer@0: I1.value=i1; I1.changed(); samer@0: I2.value=i2; I2.changed(); samer@0: } samer@0: samer@0: public JointHistogram(Vec x, int M) samer@0: { samer@0: super("joint.histogram"); samer@0: samer@0: xArray=x.array(); samer@0: if (xArray==null) throw new Error("vec array not accessible"); samer@0: samer@0: Shell.push(node); samer@0: samer@0: // int M=Shell.getInt("bins",32); samer@0: int N=x.size(); samer@0: samer@0: Shell.setAutoRegister(false); samer@0: I1=new VInteger("i1",1); samer@0: I2=new VInteger("i2",2); samer@0: I1.setRange(0,N-1); samer@0: I2.setRange(0,N-1); samer@0: samer@0: lbw = new double[M]; samer@0: vmap=new VMap(new LinearMap(0,1,M)); // ?? samer@0: bins = new Matrix("bins",M,M); samer@0: L = new VDouble("likelihood"); samer@0: Shell.setAutoRegister(true); samer@0: Shell.pop(); samer@0: samer@0: binArray=bins.getArray(); samer@0: I1.addObserver(this); samer@0: I2.addObserver(this); samer@0: vmap.addObserver(this); samer@0: update(vmap,VMap.NEW_MAP); samer@0: setAgent(this); samer@0: Shell.registerViewable(this); samer@0: } samer@0: samer@0: public void clear() { count=0; bins.zero(); bins.changed(); } samer@0: public Matrix getBinMatrix() { return bins; } samer@0: public VDouble getLikelihoodSignal() { return L; } samer@0: public VMap getVMap() { return vmap; } samer@0: samer@0: public void starting() {} samer@0: public void stopping() {} samer@0: public void run() { samer@0: int j=map.clipInt(xArray[i1]); samer@0: int k=map.clipInt(xArray[i2]); samer@0: L.value=-Math.log((++binArray[j][k])/(double)(++count)) + lbw[k] + lbw[j]; samer@0: L.changed(); samer@0: bins.changed(); samer@0: } samer@0: samer@0: public void dispose() { samer@0: I1.dispose(); samer@0: I2.dispose(); samer@0: bins.dispose(); samer@0: L.dispose(); samer@0: } samer@0: samer@0: public void normalise() { samer@0: int n=binArray.length, c=0; samer@0: for (int i=0; i