public void compute(int lastWord, int word) {

        double activeValue = conf.strengthenLastWord ? 2 : 1;
        if (lastWord != -1) inputLayer.neurons.set(lastWord, 0, activeValue);

        //Propagate input -> hidden
        MatrixVectorMult.mult(inputSynapse.weights, inputLayer.neurons, hiddenLayer.neurons);
        MatrixVectorMult.multAdd(recurrentSynapse.weights, recurrentLayer.neurons, hiddenLayer.neurons);

        // hidden -> (sigmoid) -> hidden
        if (conf.fastMath) {
            FastMath.fastSigmoid(hiddenLayer.neurons);
        }
        else {
            FastMath.sigmoid(hiddenLayer.neurons);
        }

        // TODO: Add compression layer

        // TODO: Support class

        //Propagate hidden -> output
        outputLayer.neurons.zero();
        MatrixVectorMult.mult(hiddenSynapse.weights, hiddenLayer.neurons, outputLayer.neurons);

        // TODO: apply direct connections to classes

        // TODO: apply direct connections to words

        // output -> (softmax) -> output

        if (word!=-1) {
            if (conf.classSize == 0) {
                if (conf.fastMath) {
                    // TODO: fastSoftmax make convergence slow here, unveiled by SmallFileTest
                    FastMath.fastSoftmax(outputLayer.neurons);
                }
                else {
                    FastMath.softmax(outputLayer.neurons);
                }

            } else {
                // TODO: support class
                System.err.println("no class support now!");
            }
        }

        if (lastWord != -1) inputLayer.neurons.set(lastWord, 0, 0);


    }