Exemplo n.º 1
0
 public LabelingVectorFormulaEvaluatorCompilationVisitor(IModelWithStateLabelingInLabelingVector model)
 {
     _modelWithStateLabeling  = model;
     StateNumberParameterExpr = Expression.Parameter(typeof(int), "state");
     LabelingVectorExpr       = Expression.Constant(_modelWithStateLabeling.StateLabeling);
     LabelsOfCurrentStateExpr = Expression.Parameter(typeof(StateFormulaSet), "labelsOfCurrentState");
 }
Exemplo n.º 2
0
        /// <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);
        }