* @param excitatory If true, weights are to be kept positive (otherwise negative)
*/
public void optimizeDecoders(float[][] baseWeights, float[] biasEncoders, boolean excitatory) {
float[][] evalPoints = MU.transpose(new float[][]{new float[myConstantOutputs[0].length]}); //can use anything here because target function is constant
GradientDescentApproximator.Constraints constraints = new BiasEncodersMaintained(baseWeights, biasEncoders, excitatory);
GradientDescentApproximator approximator = new GradientDescentApproximator(evalPoints, MU.clone(myConstantOutputs), constraints, true);
approximator.setStartingCoefficients(MU.transpose(getDecoders())[0]);
float[] newDecoders = approximator.findCoefficients(new ConstantFunction(1, 0));
super.setDecoders(MU.transpose(new float[][]{newDecoders}));
}