Exemplo n.º 1
0
    public Matrix <float> Predict(float phase)
    {
        float pamount;
        int   pindex_0, pindex_1, pindex_2, pindex_3;

        Matrix <float> _Xp = Xp.Clone();

        _Xp = (_Xp - Xmean).PointwiseDivide(Xstd);

        switch (Mode)
        {
        case MODE.CONSTANT:
            pindex_1 = (int)((phase / (2 * M_PI)) * 50);
            H0       = (W0[pindex_1] * _Xp) + b0[pindex_1]; ELU(ref H0);
            H1       = (W1[pindex_1] * H0) + b1[pindex_1]; ELU(ref H1);
            Yp       = (W2[pindex_1] * H1) + b2[pindex_1];
            break;

        case MODE.LINEAR:
            //TODO: make fmod faster
            pamount  = Mathf.Repeat((phase / (2 * M_PI)) * 10, 1.0f);
            pindex_1 = (int)((phase / (2 * M_PI)) * 10);
            pindex_2 = ((pindex_1 + 1) % 10);
            Linear(ref W0p, ref W0[pindex_1], ref W0[pindex_2], pamount);
            Linear(ref W1p, ref W1[pindex_1], ref W1[pindex_2], pamount);
            Linear(ref W2p, ref W2[pindex_1], ref W2[pindex_2], pamount);
            Linear(ref b0p, ref b0[pindex_1], ref b0[pindex_2], pamount);
            Linear(ref b1p, ref b1[pindex_1], ref b1[pindex_2], pamount);
            Linear(ref b2p, ref b2[pindex_1], ref b2[pindex_2], pamount);
            H0 = (W0p * _Xp) + b0p; ELU(ref H0);
            H1 = (W1p * H0) + b1p; ELU(ref H1);
            Yp = (W2p * H1) + b2p;
            break;

        case MODE.CUBIC:
            //TODO: make fmod faster
            pamount  = Mathf.Repeat((phase / (2 * M_PI)) * 4, 1.0f);
            pindex_1 = (int)((phase / (2 * M_PI)) * 4);
            pindex_0 = ((pindex_1 + 3) % 4);
            pindex_2 = ((pindex_1 + 1) % 4);
            pindex_3 = ((pindex_1 + 2) % 4);
            Cubic(ref W0p, ref W0[pindex_0], ref W0[pindex_1], ref W0[pindex_2], ref W0[pindex_3], pamount);
            Cubic(ref W1p, ref W1[pindex_0], ref W1[pindex_1], ref W1[pindex_2], ref W1[pindex_3], pamount);
            Cubic(ref W2p, ref W2[pindex_0], ref W2[pindex_1], ref W2[pindex_2], ref W2[pindex_3], pamount);
            Cubic(ref b0p, ref b0[pindex_0], ref b0[pindex_1], ref b0[pindex_2], ref b0[pindex_3], pamount);
            Cubic(ref b1p, ref b1[pindex_0], ref b1[pindex_1], ref b1[pindex_2], ref b1[pindex_3], pamount);
            Cubic(ref b2p, ref b2[pindex_0], ref b2[pindex_1], ref b2[pindex_2], ref b2[pindex_3], pamount);
            H0 = (W0p * _Xp) + b0p; ELU(ref H0);
            H1 = (W1p * H0) + b1p; ELU(ref H1);
            Yp = (W2p * H1) + b2p;
            break;

        default:
            break;
        }

        Yp = (Yp.PointwiseMultiply(Ystd)) + Ymean;

        return(Yp);
    }