public override void Predict() { //Normalise Input Normalise(X, Xmean, Xstd, Y); //Process Gating Network 1 for (int i = 0; i < ControlNeurons.Length; i++) { BX.SetValue(i, 0, Y.GetValue(ControlNeurons[i], 0)); } ELU(Layer(BX, BW0_1, Bb0_1, BY)); ELU(Layer(BY, BW1_1, Bb1_1, BY)); SoftMax(Layer(BY, BW2_1, Bb2_1, BY)); W0.SetZero(); b0.SetZero(); for (int i = 0; i < YDimBlend; i++) { float weight = BY.GetValue(i, 0); Blend(W0, CW[6 * i + 0], weight); Blend(b0, CW[6 * i + 1], weight); } //Process Gating Network 2 for (int i = 0; i < ControlNeurons.Length; i++) { BX.SetValue(i, 0, Y.GetValue(ControlNeurons[i], 0)); } ELU(Layer(BX, BW0_2, Bb0_2, BY)); ELU(Layer(BY, BW1_2, Bb1_2, BY)); SoftMax(Layer(BY, BW2_2, Bb2_2, BY)); W1.SetZero(); b1.SetZero(); for (int i = 0; i < YDimBlend; i++) { float weight = BY.GetValue(i, 0); Blend(W1, CW[6 * i + 2], weight); Blend(b1, CW[6 * i + 3], weight); } //Process Gating Network 3 for (int i = 0; i < ControlNeurons.Length; i++) { BX.SetValue(i, 0, Y.GetValue(ControlNeurons[i], 0)); } ELU(Layer(BX, BW0_3, Bb0_3, BY)); ELU(Layer(BY, BW1_3, Bb1_3, BY)); SoftMax(Layer(BY, BW2_3, Bb2_3, BY)); W2.SetZero(); b2.SetZero(); for (int i = 0; i < YDimBlend; i++) { float weight = BY.GetValue(i, 0); Blend(W2, CW[6 * i + 4], weight); Blend(b2, CW[6 * i + 5], weight); } //Process Motion-Prediction Network ELU(Layer(Y, W0, b0, Y)); ELU(Layer(Y, W1, b1, Y)); Layer(Y, W2, b2, Y); //Renormalise Output Renormalise(Y, Ymean, Ystd, Y); }