package mikera.vectorz.ops; import mikera.util.Rand; public class StochasticBinary extends ABoundedOp { public static final StochasticBinary INSTANCE=new StochasticBinary(); @Override public boolean isStochastic() {return true;} @Override public double apply(double x) { return (Rand.nextDouble()<x)?1.0:0.0; } @Override public double applyInverse(double y) { return y; } @Override public double minValue() { return 0.0; } @Override public double maxValue() { return 1.0; } @Override public boolean hasDerivative() { return true; } @Override public double derivative(double x) { if ((x<0.0)||(x>1.0)) return 0.0; return 1.0; } @Override public double derivativeForOutput(double y) { // output must be 0.0 or 1.0, so average derivative must be 1.0 assuming in-range value of x return 1.0; } }