/// <summary> /// This method check scenario by scenario for defaults, overwriting bondValue as necessary /// </summary> public static void AdjustBondValueForDefault(double notional, double expiryTime, Vector bondValue, Vector bondIsAlive, Vector historicalRecovery, Vector defaultTime, double currentTime, IInterestRate discountRate, RecoveryRate recoveryRate) { using (var cache = Vector.CacheLike(bondValue)) { Vector recoveryValue = cache.Get(); Vector expiryDf = cache.Get(); discountRate.GetValue(expiryDf, currentTime, expiryTime); recoveryRate.GetValue(recoveryValue, currentTime); // If this is the period when the bond defaults fill in the historical recovery amount. historicalRecovery.AssignConditional((defaultTime <= currentTime).And(bondIsAlive), recoveryValue * notional, historicalRecovery); bondValue.AssignConditional((defaultTime <= currentTime), expiryDf * historicalRecovery, bondValue); bondIsAlive.AssignConditional((defaultTime <= currentTime), 0.0, bondIsAlive); } }
/// <summary> /// Returns the recovery rate to be used for realized default. /// </summary> protected override void RealizedRecoveryRate(Vector vout, RecoveryRate RR, double t) { RR.GetValue(vout, t); }