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.FactorVariable)
                {
                    var factorTreeNode = instr.dynamicNode as FactorVariableTreeNode;
                    instr.data = dataset.GetReadOnlyStringValues(factorTreeNode.VariableName);
                }
                else if (instr.opCode == OpCodes.BinaryFactorVariable)
                {
                    var factorTreeNode = instr.dynamicNode as BinaryFactorVariableTreeNode;
                    instr.data = dataset.GetReadOnlyStringValues(factorTreeNode.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));
        }
Пример #2
0
        public static void PrepareInstructions(LinearInstruction[] code, IDataset dataset)
        {
            for (int i = 0; i != code.Length; ++i)
            {
                var instr = code[i];
                #region opcode switch
                switch (instr.opCode)
                {
                case OpCodes.Constant: {
                    var constTreeNode = (ConstantTreeNode)instr.dynamicNode;
                    instr.value = constTreeNode.Value;
                    instr.skip  = true; // the value is already set so this instruction should be skipped in the evaluation phase
                }
                break;

                case OpCodes.Variable: {
                    var variableTreeNode = (VariableTreeNode)instr.dynamicNode;
                    instr.data = dataset.GetReadOnlyDoubleValues(variableTreeNode.VariableName);
                }
                break;

                case OpCodes.BinaryFactorVariable: {
                    var factorVariableTreeNode = instr.dynamicNode as BinaryFactorVariableTreeNode;
                    instr.data = dataset.GetReadOnlyStringValues(factorVariableTreeNode.VariableName);
                }
                break;

                case OpCodes.FactorVariable: {
                    var factorVariableTreeNode = instr.dynamicNode as FactorVariableTreeNode;
                    instr.data = dataset.GetReadOnlyStringValues(factorVariableTreeNode.VariableName);
                }
                break;

                case OpCodes.LagVariable: {
                    var laggedVariableTreeNode = (LaggedVariableTreeNode)instr.dynamicNode;
                    instr.data = dataset.GetReadOnlyDoubleValues(laggedVariableTreeNode.VariableName);
                }
                break;

                case OpCodes.VariableCondition: {
                    var variableConditionTreeNode = (VariableConditionTreeNode)instr.dynamicNode;
                    instr.data = dataset.GetReadOnlyDoubleValues(variableConditionTreeNode.VariableName);
                }
                break;

                case OpCodes.TimeLag:
                case OpCodes.Integral:
                case OpCodes.Derivative: {
                    var seq = GetPrefixSequence(code, i);
                    var interpreterState = new InterpreterState(seq, 0);
                    instr.data = interpreterState;
                    for (int j = 1; j != seq.Length; ++j)
                    {
                        seq[j].skip = true;
                    }
                    break;
                }
                }
                #endregion
            }
        }