57 protected DoubleMatrix2D C;
58 protected DoubleMatrix2D BC, sortedBC, copyBC;
59 protected DoubleMatrix2D PcovZ, PC;
60 protected double[] z, zz, zzz;
61 protected int[] eigenIndex;
64 protected boolean decompPCA;
97 public void setParams(
int c,
double[] x0,
double[] mu,
double[] sigma,
double[][] corrZ) {
99 super.setParams(c, x0, mu, sigma, corrZ);
103 double[] u =
new double[c * d];
104 for (
int i = 0; i < c * d; i++)
105 u[i] = gen.nextDouble();
118 for (j = 0; j < c * d; j++)
119 z[j] = uniform01[j] * BC.getQuick(j, 0);
122 for (j = 0; j < c * d; j++) {
123 zz[j] = z[(int) BC.getQuick(j, 1)];
125 for (j = 0; j < d; j++) {
126 for (i = 0; i < c; i++) {
128 for (k = 0; k < c; k++)
129 sum += PcovZ.getQuick(i, k) * zz[j * c + k];
130 zzz[j * c + i] = sum;
137 for (j = 0; j < d; j++) {
138 for (i = 0; i < c; i++) {
140 for (k = 0; k < d; k++) {
141 sum += PC.getQuick(j, k) * zzz[c * k + i];
143 path[(j + 1) * c + i] = sum + mu[i] * (t[j + 1] - t[0]) + x0[i];
147 observationIndex = observationCounter = d;
151 protected DoubleMatrix2D decompPCA(DoubleMatrix2D Sigma,
double[] eigenValues) {
155 SingularValueDecomposition sv =
new SingularValueDecomposition(Sigma);
156 DoubleMatrix2D D = sv.getS();
158 for (
int i = 0; i < D.rows(); i++) {
159 D.setQuick(i, i, Math.sqrt(D.getQuick(i, i)));
160 eigenValues[i] = D.getQuick(i, i);
162 DoubleMatrix2D P = sv.getV();
168 protected void init() {
171 z =
new double[c * d];
172 zz =
new double[c * d];
173 zzz =
new double[c * d];
174 double[] lambdaC =
new double[d];
175 double[] etaB =
new double[c];
177 BC =
new DenseDoubleMatrix2D(c * d, 2);
179 sortedBC =
new DenseDoubleMatrix2D(c * d, 2);
180 PC =
new DenseDoubleMatrix2D(d, d);
181 PcovZ =
new DenseDoubleMatrix2D(c, c);
184 C =
new DenseDoubleMatrix2D(d, d);
185 for (j = 0; j < d; j++) {
186 for (i = j; i < d; i++) {
187 C.setQuick(j, i, t[j + 1]);
188 C.setQuick(i, j, t[j + 1]);
192 PC = decompPCA(C, lambdaC);
193 PcovZ = decompPCA(covZ, etaB);
195 for (j = 0; j < d; j++)
196 for (i = 0; i < c; i++) {
197 BC.setQuick(c * j + i, 0, lambdaC[j] * etaB[i]);
198 BC.setQuick(c * j + i, 1, (
double) (c * j + i));
200 sortedBC = Sorting.quickSort.sort(BC, 0);
204 DoubleMatrix2D copyBC = sortedBC.copy();
206 for (i = 0; i < c * d; i++) {
207 BC.setQuick(i, 0, copyBC.getQuick(c * d - 1 - i, 0));
208 BC.setQuick(i, 1, copyBC.getQuick(c * d - 1 - i, 1));