public LabelingVectorFormulaEvaluatorCompilationVisitor(IModelWithStateLabelingInLabelingVector model) { _modelWithStateLabeling = model; StateNumberParameterExpr = Expression.Parameter(typeof(int), "state"); LabelingVectorExpr = Expression.Constant(_modelWithStateLabeling.StateLabeling); LabelsOfCurrentStateExpr = Expression.Parameter(typeof(StateFormulaSet), "labelsOfCurrentState"); }
/// <summary> /// Compiles the <paramref name="formula" /> of the <paramref name="formalism" />. /// </summary> /// <param name="formalism"></param> /// <param name="formula">The formula that should be compiled.</param> public static Func <int, bool> Compile(IModelWithStateLabelingInLabelingVector formalism, Formula formula) { Requires.NotNull(formula, nameof(formula)); var visitor = new LabelingVectorFormulaEvaluatorCompilationVisitor(formalism); visitor.Visit(formula); //var getMarkovChainState = visitor.MarkovChainExpr.Type.GetMethod("GetMarkovChainState", BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public); //var markovChainStateExpr = Expression.Call(visitor.MarkovChainExpr, getMarkovChainState, visitor.StateStorageStateExpr); // = GetMarkovChainState(stateStorageState); var indexer = visitor.LabelingVectorExpr.Type.GetProperty("Item", BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public); var labelsOfCurrentStateExpr = Expression.Property(visitor.LabelingVectorExpr, indexer, visitor.StateNumberParameterExpr); var setLabelsOfCurrentStateExpr = Expression.Assign(visitor.LabelsOfCurrentStateExpr, labelsOfCurrentStateExpr); var codeOfLambda = Expression.Block(new[] { visitor.LabelsOfCurrentStateExpr }, setLabelsOfCurrentStateExpr, visitor._expression); var lambda = Expression.Lambda <Func <int, bool> >(codeOfLambda, visitor.StateNumberParameterExpr).Compile(); return(lambda); }