本文整理汇总了C#中InitializedList.ForEach方法的典型用法代码示例。如果您正苦于以下问题:C# InitializedList.ForEach方法的具体用法?C# InitializedList.ForEach怎么用?C# InitializedList.ForEach使用的例子?那么恭喜您, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类InitializedList
的用法示例。
在下文中一共展示了InitializedList.ForEach方法的1个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C#代码示例。
示例1: calculate
public override void calculate()
{
/* this engine cannot really check for the averageType==Geometric
since it can be used as control variate for the Arithmetic version
QL_REQUIRE(arguments_.averageType == Average::Geometric,
"not a geometric average option");
*/
if(!(arguments_.exercise.type() == Exercise.Type.European))
throw new ApplicationException("not an European Option");
double runningLog;
int pastFixings;
if (arguments_.averageType == Average.Type.Geometric) {
if(!(arguments_.runningAccumulator>0.0))
throw new ApplicationException("positive running product required: "
+ arguments_.runningAccumulator + " not allowed");
runningLog =
Math.Log(arguments_.runningAccumulator.GetValueOrDefault());
pastFixings = arguments_.pastFixings.GetValueOrDefault();
} else { // it is being used as control variate
runningLog = 1.0;
pastFixings = 0;
}
PlainVanillaPayoff payoff = (PlainVanillaPayoff)(arguments_.payoff);
if (payoff == null)
throw new ApplicationException("non-plain payoff given");
Date referenceDate = process_.riskFreeRate().link.referenceDate();
DayCounter rfdc = process_.riskFreeRate().link.dayCounter();
DayCounter divdc = process_.dividendYield().link.dayCounter();
DayCounter voldc = process_.blackVolatility().link.dayCounter();
List<double> fixingTimes = new InitializedList<double>(arguments_.fixingDates.Count());
int i;
for (i=0; i<arguments_.fixingDates.Count(); i++) {
if (arguments_.fixingDates[i]>=referenceDate) {
double t = voldc.yearFraction(referenceDate,
arguments_.fixingDates[i]);
fixingTimes.Add(t);
}
}
int remainingFixings = fixingTimes.Count();
int numberOfFixings = pastFixings + remainingFixings;
double N = numberOfFixings;
double pastWeight = pastFixings/N;
double futureWeight = 1.0-pastWeight;
/*double timeSum = std::accumulate(fixingTimes.begin(),
fixingTimes.end(), 0.0);*/
double timeSum = 0;
fixingTimes.ForEach((ii, vv) => timeSum += fixingTimes[ii]);
double vola = process_.blackVolatility().link.blackVol(
arguments_.exercise.lastDate(),
payoff.strike());
double temp = 0.0;
for (i=pastFixings+1; i<numberOfFixings; i++)
temp += fixingTimes[i-pastFixings-1]*(N-i);
double variance = vola*vola /N/N * (timeSum+ 2.0*temp);
double dsigG_dsig = Math.Sqrt((timeSum + 2.0*temp))/N;
double sigG = vola * dsigG_dsig;
double dmuG_dsig = -(vola * timeSum)/N;
Date exDate = arguments_.exercise.lastDate();
double dividendRate = process_.dividendYield().link.
zeroRate(exDate, divdc, Compounding.Continuous, Frequency.NoFrequency).rate();
double riskFreeRate = process_.riskFreeRate().link.
zeroRate(exDate, rfdc, Compounding.Continuous, Frequency.NoFrequency).rate();
double nu = riskFreeRate - dividendRate - 0.5*vola*vola;
double s = process_.stateVariable().link.value();
if(!(s > 0.0))
throw new ApplicationException("positive underlying value required");
int M = (pastFixings == 0 ? 1 : pastFixings);
double muG = pastWeight * runningLog/M +
futureWeight * Math.Log(s) + nu*timeSum/N;
double forwardPrice = Math.Exp(muG + variance / 2.0);
double riskFreeDiscount = process_.riskFreeRate().link.discount(
arguments_.exercise.lastDate());
BlackCalculator black = new BlackCalculator(payoff, forwardPrice, Math.Sqrt(variance),
riskFreeDiscount);
results_.value = black.value();
results_.delta = futureWeight*black.delta(forwardPrice)*forwardPrice/s;
results_.gamma = forwardPrice*futureWeight/(s*s)
*( black.gamma(forwardPrice)*futureWeight*forwardPrice
- pastWeight*black.delta(forwardPrice) );
double Nx_1, nx_1;
CumulativeNormalDistribution CND = new CumulativeNormalDistribution();
NormalDistribution ND = new NormalDistribution();
if (sigG > Const.QL_Epsilon) {
double x_1 = (muG-Math.Log(payoff.strike())+variance)/sigG;
Nx_1 = CND.value(x_1);
//.........这里部分代码省略.........