Пример #1
0
        private InterpreterState PrepareInterpreterState(ISymbolicExpressionTree tree, IDataset dataset)
        {
            Instruction[]            code = SymbolicExpressionTreeCompiler.Compile(tree, OpCodes.MapSymbolToOpCode);
            Dictionary <string, int> doubleVariableNames = dataset.DoubleVariables.Select((x, i) => new { x, i }).ToDictionary(e => e.x, e => e.i);
            int necessaryArgStackSize = 0;

            foreach (Instruction instr in code)
            {
                if (instr.opCode == OpCodes.Variable)
                {
                    var variableTreeNode = (VariableTreeNode)instr.dynamicNode;
                    instr.data = doubleVariableNames[variableTreeNode.VariableName];
                }
                else if (instr.opCode == OpCodes.LagVariable)
                {
                    var laggedVariableTreeNode = (LaggedVariableTreeNode)instr.dynamicNode;
                    instr.data = doubleVariableNames[laggedVariableTreeNode.VariableName];
                }
                else if (instr.opCode == OpCodes.VariableCondition)
                {
                    var variableConditionTreeNode = (VariableConditionTreeNode)instr.dynamicNode;
                    instr.data = doubleVariableNames[variableConditionTreeNode.VariableName];
                }
                else if (instr.opCode == OpCodes.Call)
                {
                    necessaryArgStackSize += instr.nArguments + 1;
                }
            }
            return(new InterpreterState(code, necessaryArgStackSize));
        }
Пример #2
0
        private static InterpreterState PrepareInterpreterState(ISymbolicExpressionTree tree, IDataset dataset)
        {
            Instruction[] code = SymbolicExpressionTreeCompiler.Compile(tree, OpCodes.MapSymbolToOpCode);
            int           necessaryArgStackSize = 0;

            foreach (Instruction instr in code)
            {
                if (instr.opCode == OpCodes.Variable)
                {
                    var variableTreeNode = (VariableTreeNode)instr.dynamicNode;
                    instr.data = dataset.GetReadOnlyDoubleValues(variableTreeNode.VariableName);
                }
                else if (instr.opCode == OpCodes.LagVariable)
                {
                    var laggedVariableTreeNode = (LaggedVariableTreeNode)instr.dynamicNode;
                    instr.data = dataset.GetReadOnlyDoubleValues(laggedVariableTreeNode.VariableName);
                }
                else if (instr.opCode == OpCodes.VariableCondition)
                {
                    var variableConditionTreeNode = (VariableConditionTreeNode)instr.dynamicNode;
                    instr.data = dataset.GetReadOnlyDoubleValues(variableConditionTreeNode.VariableName);
                }
                else if (instr.opCode == OpCodes.Call)
                {
                    necessaryArgStackSize += instr.nArguments + 1;
                }
            }
            return(new InterpreterState(code, necessaryArgStackSize));
        }
Пример #3
0
        private static Instruction[] PrepareInterpreterState(ISymbolicExpressionTree tree, IDictionary <string, Interval> variableRanges)
        {
            if (variableRanges == null)
            {
                throw new ArgumentNullException("No variablew ranges are present!", nameof(variableRanges));
            }

            //Check if all variables used in the tree are present in the dataset
            foreach (var variable in tree.IterateNodesPrefix().OfType <VariableTreeNode>().Select(n => n.VariableName).Distinct())
            {
                if (!variableRanges.ContainsKey(variable))
                {
                    throw new InvalidOperationException($"No ranges for variable {variable} is present");
                }
            }

            Instruction[] code = SymbolicExpressionTreeCompiler.Compile(tree, OpCodes.MapSymbolToOpCode);
            foreach (Instruction instr in code.Where(i => i.opCode == OpCodes.Variable))
            {
                var variableTreeNode = (VariableTreeNode)instr.dynamicNode;
                instr.data = variableRanges[variableTreeNode.VariableName];
            }
            return(code);
        }