public int Create(bool logarithm, out double[,] transitionMatrix, out double[] initialState)
{
double[,] A = new double[States, States];
if (random)
{
// Create pi
double sum = 0;
for (int i = 0; i < states; i++)
sum += pi[i] = Accord.Math.Random.Generator.Random.NextDouble();
for (int i = 0; i < states; i++)
pi[i] /= sum;
// Create A using random uniform distribution
for (int i = 0; i < states; i++)
{
sum = 0.0;
for (int j = 0; j < states; j++)
sum += A[i, j] = Accord.Math.Random.Generator.Random.NextDouble();
for (int j = 0; j < states; j++)
A[i, j] /= sum;
}
}
else
{
// Create A using equal uniform probabilities,
for (int i = 0; i < states; i++)
for (int j = 0; j < states; j++)
A[i, j] = 1.0 / states;
}
if (logarithm)
{
transitionMatrix = A.Log();
initialState = pi.Log();
}
else
{
transitionMatrix = A;
initialState = (double[])pi.Clone();
}
return States;
}