@@ -769,7 +769,7 @@ class ASTRunner : public AcyclicVisitor,
769769 QL_REQUIRE (model_, " model is null" );
770770 // handle case of past payments: do not evaluate the other parameters, since not needed (e.g. past fixings)
771771 Date pay = boost::get<EventVec>(paydate).value ;
772- if (pay <= model_->referenceDate ()) {
772+ if (pay <= model_->referenceDate () && !log ) {
773773 value.push (RandomVariable (size_, 0.0 ));
774774 TRACE (" pay() = 0, since paydate " << paydate << " <= " << model_->referenceDate (), n);
775775 } else {
@@ -786,7 +786,11 @@ class ASTRunner : public AcyclicVisitor,
786786 Date obs = boost::get<EventVec>(obsdate).value ;
787787 std::string pccy = boost::get<CurrencyVec>(paycurr).value ;
788788 QL_REQUIRE (obs <= pay, " observation date (" << obs << " ) <= payment date (" << pay << " ) required" );
789- RandomVariable result = model_->pay (boost::get<RandomVariable>(amount), obs, pay, pccy);
789+ RandomVariable result = pay <= model_->referenceDate ()
790+ ? RandomVariable (model_->size (), 0.0 )
791+ : model_->pay (boost::get<RandomVariable>(amount), obs, pay, pccy);
792+ RandomVariable cashflowResult =
793+ pay <= model_->referenceDate () ? boost::get<RandomVariable>(amount) : result;
790794 if (!log || paylog_ == nullptr ) {
791795 TRACE (" pay( " << amount << " , " << obsdate << " , " << paydate << " , " << paycurr << " )" , n);
792796 } else {
@@ -819,7 +823,7 @@ class ASTRunner : public AcyclicVisitor,
819823 QL_REQUIRE (slot >= 1 , " slot must be >= 1" );
820824 }
821825 }
822- paylog_->write (result , filter.top (), obs, pay, pccy, static_cast <Size>(legno), cftype,
826+ paylog_->write (cashflowResult , filter.top (), obs, pay, pccy, static_cast <Size>(legno), cftype,
823827 static_cast <Size>(slot));
824828 TRACE (" logpay( " << amount << " , " << obsdate << " , " << paydate << " , " << paycurr << " , " << legno
825829 << " , " << cftype << " , " << slot << " )" ,
0 commit comments