package statistics.simulators;
//Model ARMA series naively as Box Jenkins representation
// Note really need infinite AR representation
import distributions.*;
import fileIO.*;
import java.util.*;
public class HMM_Model extends Model{
//Number of generating distributions
int N;
// family of generating distributions
Distribution[] f;
//Discrete transition matrix
double[][] T;
//Discrete initial values distribution
double[] pi;
//Current state
int state;
//Stats recorded for debugging
int n=200; //Default series length
ArrayList stateRecord;
ArrayList dataRecord;
public HMM_Model()
{
System.out.println("SHOULD NOT BE HERE!!");
}
public HMM_Model(int models)
{
N=models;
f=new NormalDistribution[N];
T=new double[N][N];
pi = new double[N];
}
public HMM_Model(int models, double[] means, double[] stDevs, double[][]trans, double[] inits)
//Default constructor assumes normal distribution
{
N=models;
f=new NormalDistribution[N];
T=new double[N][N];
pi = new double[N];
for(int i=0;i<N;i++)
{
f[i]= new NormalDistribution(means[i],stDevs[i]);
for(int j=0;j<N;j++)
T[i][j]=trans[i][j];
pi[i]=inits[i];
}
//Set initial state
initialise();
}
public void initialise(){
double r=Distribution.RNG.nextDouble();
state = 0;
double s=0;
boolean finished=false;
do{
s+=pi[state];
if(s>r)
finished=true;
else
state++;
}while(!finished && state<N);
stateRecord = new ArrayList(n);
dataRecord = new ArrayList(n);
}
public double generate(double x){
System.out.println("Error, generate not implemented for HMM");
System.exit(0);
return -1;
}
public double generate(){
//Determine state
double r=Distribution.RNG.nextDouble();
double s=0;
int i=0;
boolean finished=false;
do{
s+=T[state][i];
if(s>r)
finished=true;
else
i++;
}while(!finished && i<N);
state=i;
//Sample Distribution
return f[state].simulate();
}
public String toString()
{
String str="";
return str;
}
static public void main(String[] args){
System.out.println("Testing HMM Models");
System.out.println("Generating Data: from 2 normal dists, variance 1");
OutFile f = new OutFile("SmytheHMMData.csv");
/* double[][] d = GenerateData.simulateSmytheData(3,200);
for(int j=0;j<d[0].length;j++)
{
for(int i=0;i<d.length;i++)
f.writeString(d[i][j]+",");
f.writeString("\n");
}
*/
}
@Override
public void setParameters(double[] p) {
throw new UnsupportedOperationException("Not supported yet.");
}
}