コード例 #1
0
        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);
        }
コード例 #2
0
        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);
        }
コード例 #3
0
        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);
        }
コード例 #4
0
        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);
        }
コード例 #5
0
        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);
        }
コード例 #6
0
        public TValue Value(CalculationTicket ticket, ICalculationTracer tracer, String name)
        {
            var result = this.InitialValue;

            tracer.WriteValue(name ?? this.Name, result, this.Adapter);
            return(result);
        }
コード例 #7
0
        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);
        }
コード例 #8
0
        public Decimal?Value(CalculationTicket ticket, ICalculationTracer tracer, String name)
        {
            var value = this.EditedValue;

            tracer.WriteValue(name ?? this.Name, value);
            return(value);
        }
コード例 #9
0
        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);
        }
コード例 #10
0
            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);
            }
コード例 #11
0
ファイル: Expression.cs プロジェクト: leewashmore/Greenfield
        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);
        }
コード例 #12
0
        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);
        }
コード例 #13
0
        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);
        }