예제 #1
0
        public async Task CreateInstanceTest8()
        {
            _factory = await EquationFactory.CreateInstance(string.Empty, SimpleEquation1);

            Assert.AreEqual(1, _factory.Equation.Variables.Count);
            Assert.AreEqual("_Variable_1", _factory.Equation.Variables[0]);
        }
예제 #2
0
        public async Task CaseInsensitiveTest(string function, float value)
        {
            _factory = await EquationFactory.CreateInstance(string.Empty, function);

            Assert.IsNull(_factory.Equation);
            Assert.AreEqual(value, _factory.Value);
        }
예제 #3
0
        /// <summary>
        ///     Modules connect variables together
        ///     This method make the connection and prepare the connected variables
        /// </summary>
        public async Task ResolveConnects()
        {
            foreach (var module in Variables.Modules.ToImmutableList())
            {
                var connects = module.Connects;
                foreach (var connect in connects.ToImmutableList())
                {
                    var to   = Variables.Get(connect.To);
                    var from = Variables.Get(connect.From);
                    if (to.Access != VariableAccess.Input || from.Access != VariableAccess.Output)
                    {
                        continue;
                    }

                    if (to is Stock)
                    {
                        // to prevent the computation of toVariable as a stock, it is cast as an auxiliary
                        Variables[to.FullName] = new Auxiliary(to.Name, to.Model);
                        to = Variables[to.FullName];
                    }

                    var factory = await EquationFactory.CreateInstance(from.Model, from.Name);

                    to.Equation = factory.Equation;
                    to.Value    = factory.Value;
                    //to.Equation = new Equation(from.FullName) {Variables = new List<string> {from.FullName}};
                    //to.Value = from.Value;
                    to.Children = new List <string> {
                        from.FullName
                    };
                }

                Variables.Remove(module.FullName);
            }
        }
예제 #4
0
        public static async Task <T> CreateVariable <T>(string name, string model, string eqn, GraphicalFunction graph,
                                                        Range range, Range scale,
                                                        NonNegative nonNegative, VariableAccess access) where T : IVariable, new()
        {
            var variable = new T
            {
                Model             = model,
                Name              = StringUtils.CleanName(name),
                GraphicalFunction = graph,
                Range             = range,
                Scale             = scale,
                Units             = Units.CreateInstanceFromEquation(eqn),
                NonNegative       = nonNegative,
                Access            = access
            };

            variable.FullName = StringUtils.FullName(variable.Model, variable.Name);

            var factory = await EquationFactory.CreateInstance(model, eqn);

            variable.Equation = factory.Equation;
            variable.Value    = factory.Value;
            variable.AdjustValue(factory.Value);
            variable.Initialize();
            variable.SetChildren();
            return(variable);
        }
예제 #5
0
        public async Task CreateInstanceTest10()
        {
            _factory = await EquationFactory.CreateInstance(string.Empty, ComplexEquation1);

            Assert.AreEqual(3, _factory.Equation.Variables.Count);
            Assert.AreEqual("_Variable_1", _factory.Equation.Variables[0]);
            Assert.AreEqual("_Variable2", _factory.Equation.Variables[1]);
            Assert.AreEqual("_Variable3", _factory.Equation.Variables[2]);
        }
예제 #6
0
        public async Task GetParametersTest5()
        {
            const string function = @"SMTH1((Junior_doctor's__base_salary*Annual__Pay_Change),.5)";

            _factory = await EquationFactory.CreateInstance(string.Empty, function);

            Assert.AreEqual(2, _factory.Equation.Variables.Count);
            Assert.AreEqual("_Junior_doctors_base_salary", _factory.Equation.Variables[0]);
            Assert.AreEqual("_Annual_pay_change", _factory.Equation.Variables[1]);
        }
예제 #7
0
        public async Task CreateInstanceTest9()
        {
            _factory = await EquationFactory.CreateInstance(string.Empty, ComplexEquation);

            Assert.AreEqual(5, _factory.Equation.Variables.Count);
            Assert.AreEqual("_Name", _factory.Equation.Variables[0]);
            Assert.AreEqual("_Dt", _factory.Equation.Variables[1]);
            Assert.AreEqual("_Variable_1", _factory.Equation.Variables[2]);
            Assert.AreEqual("_Variable2", _factory.Equation.Variables[3]);
            Assert.AreEqual("_Time", _factory.Equation.Variables[4]);
        }
예제 #8
0
        public async Task EvaluateTest(string function, float expected)
        {
            var factory = await EquationFactory.CreateInstanceAsync(string.Empty, function, null);

            Assert.AreEqual(expected, factory.Value);


            //var ifThenElse = await IfThenElse.CreateIfThenElse(string.Empty, function);
            //await ifThenElse.Prepare(Machine.Models.GetVariables().First(), Machine.Models.GetVariables(), Machine.Simulation);
            //Assert.AreEqual(expected, await ifThenElse.Evaluate(null, Machine.Models.GetVariables(), Machine.Simulation));
        }
예제 #9
0
        public static async Task <T> CreateVariable <T>(string name, string model, string eqn) where T : IVariable, new()
        {
            var variable = new T
            {
                Model       = model,
                Name        = StringUtils.CleanName(name),
                Units       = Units.CreateInstanceFromEquation(eqn),
                NonNegative = new NonNegative(false)
            };

            variable.FullName = StringUtils.FullName(variable.Model, variable.Name);
            var factory = await EquationFactory.CreateInstance(model, eqn);

            variable.Equation = factory.Equation;
            variable.Value    = factory.Value;
            variable.Initialize();
            variable.SetChildren();
            return(variable);
        }
예제 #10
0
        /// <summary>
        ///     stock(t) = stock(t - dt) + dt*(inflows(t - dt) – outflows(t - dt))
        ///     Re compute SetChildren with the new equation
        /// </summary>
        public async Task SetStockEquation(string dt)
        {
            var equation = Name;
            var inflows  = AggregateFlows(Inflow, "+");
            var outflows = AggregateFlows(Outflow, "-");

            if (inflows.Length > 0 || outflows.Length > 0)
            {
                equation += "+" + dt + "*(" +
                            inflows;
                if (outflows.Length > 0)
                {
                    equation += "-" + outflows;
                }

                equation += ")";
            }

            Equation = (await EquationFactory.CreateInstance(Model, equation)).Equation;

            SetChildren();
        }
예제 #11
0
 public async Task CreateInstanceTest2()
 {
     await Assert.ThrowsExceptionAsync <ArgumentException>(async() =>
                                                           await EquationFactory.CreateInstance(string.Empty, "Func()"));
 }