double /* @DiscountFactor */riskFreeDiscount = process.riskFreeRate().currentLink().discount(ex.lastDate());
double /* @Real */spot = process.stateVariable().currentLink().value();
QL.require(spot > 0.0, "negative or null underlying given"); // QA:[RG]::verified // TODO: message
double /* @Real */strike = payoff.strike();
if (payoff.optionType()==Option.Type.Put) {
// use put-call symmetry
// swap spot and strike, has to be done inline
double tmp = spot; spot = strike; strike = tmp;
// swap riskFreeDiscount and dividenDiscount, has to be done inline