private MarginTotal Process(List <Sensitivity> sensitivities, List <AddOnProductMultiplier> productMultipliers, List <AddOnNotional> notionals, List <AddOnNotionalFactor> notionalFactors, List <AddOnFixedAmount> fixedAmounts) { if (sensitivities == null) { throw new ArgumentNullException(nameof(sensitivities)); } if (productMultipliers == null) { throw new ArgumentNullException(nameof(productMultipliers)); } if (notionals == null) { throw new ArgumentNullException(nameof(notionals)); } if (notionalFactors == null) { throw new ArgumentNullException(nameof(notionalFactors)); } if (fixedAmounts == null) { throw new ArgumentNullException(nameof(fixedAmounts)); } ModelObject?modelObject = SanitizeData(sensitivities, productMultipliers, notionals, notionalFactors, fixedAmounts); if (!modelObject.HasValue) { return(MarginTotal.Of(m_ValuationDate, m_CalculationCurrency)); } ModelObject modelObjectValue = modelObject.Value; sensitivities = modelObjectValue.Sensitivities; notionals = modelObjectValue.Notionals; notionalFactors = modelObjectValue.NotionalFactors; productMultipliers = modelObjectValue.ProductMultipliers; fixedAmounts = modelObjectValue.FixedAmounts; List <Sensitivity> sensitivitiesVega = sensitivities .RemoveAllAndGet(x => x.Category == SensitivityCategory.Vega) .ToList(); if (sensitivitiesVega.Count > 0) { List <Sensitivity> sensitivitiesCurvature = sensitivitiesVega .Select(x => x.ToCurvature(ModelCalculations.CalculateCurvatureAmount(x))) .ToList(); List <Sensitivity> sensitivitiesVolatilityWeighted = sensitivitiesVega .Concat(sensitivitiesCurvature) .ToList(); foreach (Sensitivity sensitivity in sensitivitiesVolatilityWeighted) { sensitivity.ChangeAmount(sensitivity.Amount * ModelParameters.GetWeightVolatility(sensitivity)); } sensitivities.AddRange(sensitivitiesVolatilityWeighted); } List <Sensitivity> sensitivitiesNetted = ModelCalculations.NetSensitivities(m_CalculationCurrency, sensitivities); List <MarginProduct> productMargins = ModelCalculations.CalculateMarginsProduct(m_CalculationCurrency, m_RatesProvider, sensitivitiesNetted); Amount productMarginsAmount = Amount.Sum(productMargins.Select(x => x.Value), m_CalculationCurrency); MarginAddOn addOnMargin = ModelCalculations.CalculateMarginAddOn(m_CalculationCurrency, productMargins, productMultipliers, notionals, notionalFactors, fixedAmounts); Amount addOnMarginAmount = addOnMargin?.Value ?? Amount.OfZero(m_CalculationCurrency); Amount modelMarginAmount = productMarginsAmount + addOnMarginAmount; Margin modelMargin = Margin.Of(modelMarginAmount, productMargins, addOnMargin); return(MarginTotal.Of(m_ValuationDate, m_CalculationCurrency, modelMargin)); }