public decimal?Calculate(CalculationTicket ticket, ICalculationTracer tracer) { tracer.WriteLine("Base less overlay positive total formula"); tracer.Indent(); Decimal?result = this.cashRescaledBase.Value(ticket, tracer, "Cash rescaled base"); tracer.WriteValue(" + Cash rescaled base", result); foreach (var model in models) { var value = this.baseLessOverlayFormula.Calculate(model, ticket, tracer); if (value.HasValue && value.Value > 0) { tracer.WriteValue("+ Base less overlay", value); if (result.HasValue) { result = result.Value + value.Value; } else { result = value.Value; } } } tracer.WriteValue("Total", result); tracer.Unindent(); return(result); }
public Decimal?Value(CalculationTicket ticket, ICalculationTracer tracer, String name) { tracer.WriteLine("Nullable sum: " + (name ?? this.Name)); tracer.Indent(); var result = this.defaultValue; foreach (var expressionOpt in this.expressions) { if (expressionOpt == null) { continue; } var value = expressionOpt.Value(ticket); tracer.WriteValue("+", value); if (value.HasValue) { if (result.HasValue) { result = result.Value + value.Value; } else { result = value.Value; } } } tracer.WriteValue("Total", result); tracer.Unindent(); return(result); }
public static Decimal?CalculateRescaledBase( Decimal? @base, Decimal?portfolioAdjustment, Decimal?baseWherePortfoioAdjustmentSetTotal, Decimal?porfolioAdjustmentTotal, ICalculationTracer tracer ) { Decimal?result; if (portfolioAdjustment.HasValue) { result = portfolioAdjustment.Value; tracer.WriteValue("Portfolio adjustment as is", result); } else if (@base.HasValue) { result = @base.Value / (1.0m - (baseWherePortfoioAdjustmentSetTotal.HasValue ? baseWherePortfoioAdjustmentSetTotal.Value : 0m)) * (1.0m - (porfolioAdjustmentTotal.HasValue ? porfolioAdjustmentTotal.Value : 0m)); tracer.WriteValue("Base / (1 - baseWherePortfoioAdjustmentSetTotal) * (1 - porfolioAdjustmentTotal)", result); } else { result = null; } return(result); }
public Decimal?Calculate(IModel model, CalculationTicket ticket, ICalculationTracer tracer) { tracer.WriteLine("Base less overlay formula"); tracer.Indent(); var rescaledBaseValue = this.rescaledBaseForAdjustmentFormula.Calculate(model, ticket, tracer); tracer.WriteValue("Rescaled base", rescaledBaseValue); Decimal?result; if (rescaledBaseValue.HasValue) { var overlayExpressionOpt = picker.Overlay.TryPickExpression(model); if (overlayExpressionOpt == null) { throw new ApplicationException("There is no overlay expression."); } var overlayValue = overlayExpressionOpt.Value(ticket, tracer, "Overlay"); result = rescaledBaseValue.Value - overlayValue; } else { result = null; } tracer.WriteValue("Result", result); tracer.Unindent(); return(result); }
public Decimal?Calculate(CalculationTicket ticket, ICalculationTracer tracer) { tracer.WriteLine("Add formula"); tracer.Indent(); var one = this.oneExpression.Value(ticket, tracer, No.ExpressionName); var another = this.anotherExpression.Value(ticket, tracer, No.ExpressionName); Decimal?result; if (one.HasValue) { if (another.HasValue) { result = one.Value + another.Value; } else { result = one.Value; } } else { if (another.HasValue) { result = another.Value; } else { result = null; } } tracer.WriteValue("Sum", result); tracer.Unindent(); return(result); }
public TValue Value(CalculationTicket ticket, ICalculationTracer tracer, String name) { var result = this.InitialValue; tracer.WriteValue(name ?? this.Name, result, this.Adapter); return(result); }
public Decimal?Calculate(IModel model, CalculationTicket ticket, ICalculationTracer tracer) { tracer.WriteLine("Base active formula"); tracer.Indent(); var baseExpressionOpt = picker.Base.TryPickExpression(model); var benchmarkExpressionOpt = picker.Benchmark.TryPickExpression(model); if (baseExpressionOpt == null || benchmarkExpressionOpt == null) { return(null); } var baseValue = baseExpressionOpt.Value(ticket, tracer, "Base"); var benchmarkValue = benchmarkExpressionOpt.Value(ticket, tracer, "Benchmark"); Decimal?result; if (!baseValue.HasValue) { result = null; } else { result = baseValue.Value - benchmarkValue; } tracer.WriteValue("Base - Benchmark", result); tracer.Unindent(); return(result); }
public Decimal?Value(CalculationTicket ticket, ICalculationTracer tracer, String name) { var value = this.EditedValue; tracer.WriteValue(name ?? this.Name, value); return(value); }
public Decimal?Calculate(CalculationTicket ticket, ICalculationTracer tracer) { tracer.WriteLine("Base where portfolio adjustment is set"); tracer.Indent(); var models = this.traverser.TraverseGlobe(this.root); var result = this.ComputeBaseTotalWherePortfoioAdjustmentSetValue(models, tracer); tracer.WriteValue("Total", result); tracer.Unindent(); return(result); }
public Decimal?Calculate(CalculationTicket ticket, ICalculationTracer tracer) { tracer.WriteLine("Base active formula"); tracer.Indent(); var baseValue = BaseExpression.Value(ticket, tracer, "Base"); var benchmarkValue = BenchmarkExpression.Value(ticket, tracer, "Benchmark"); var result = baseValue.HasValue ? baseValue - benchmarkValue : null; tracer.WriteValue("Base - Benchmark", result); tracer.Unindent(); return(result); }
public TValue Value(CalculationTicket ticket, ICalculationTracer tracer, String name) { TValue result; tracer.WriteLine("Expession: " + (name ?? this.Name)); tracer.Indent(); if (this.ticket == ticket) { result = this.value; tracer.WriteValue("CACHED", result, this.Adapter); } else { result = this.formula.Calculate(ticket, tracer); this.ticket = ticket; this.value = result; } tracer.Unindent(); return(result); }
public Decimal?Calculate(CalculationTicket ticket, ICalculationTracer tracer) { var rescaledBaseCash = this.rescaledCashBase.Value(ticket, tracer, "Rescaled cash base"); if (!rescaledBaseCash.HasValue) { return(null); } if (rescaledBaseCash.Value < 0) { return(0m); } var positiveTotal = baseLessOverlayPositiveTotal.Value(ticket, tracer, "Base less overlay positive total"); if (!positiveTotal.HasValue) { return(null); } var total = baseLessOverlayTotal.Value(ticket, tracer, "Base less overlay total"); if (!total.HasValue) { return(null); } if (positiveTotal.Value == 0) { throw new NotImplementedException(); } var value = rescaledBaseCash.Value / positiveTotal.Value * total.Value; tracer.WriteValue("Rescaled cash base / positive base less overlay total * base less overlay total", value); return(value); }
protected Decimal?ComputeBaseTotalWherePortfoioAdjustmentSetValue(IEnumerable <IModel> models, ICalculationTracer tracer) { Decimal?total = null; foreach (var model in models) { var resolver = new BaseTotalWherePortfoioAdjustmentSetValueMultimethod(); model.Accept(resolver); var value = resolver.Result; if (value.HasValue) { tracer.WriteValue("+", value); if (!total.HasValue) { total = value; } else { total += value; } } } return(total); }