final double df = 4.0 * k() * theta() / sigma2;
final double ncps = 2.0 * rho * rho * (r0 - phi_.get(0.0)) * Math.exp(h * t) / (rho + psi + b);
final double ncpt = 2.0 * rho * rho * (r0 - phi_.get(0.0)) * Math.exp(h * t) / (rho + psi);
final NonCentralChiSquaredDistribution chis = new NonCentralChiSquaredDistribution(df, ncps);
final NonCentralChiSquaredDistribution chit = new NonCentralChiSquaredDistribution(df, ncpt);
final double z = Math.log(super.A(t, s) / strike) / b;
final double call = discountS * chis.op(2.0 * z * (rho + psi + b)) - strike * discountT
* chit.op(2.0 * z * (rho + psi));
if (type.equals(Option.Type.Call))
return call;
else
return call - discountS + strike * discountT;