public IToken Interact(int x, int y)
        {
            System.Diagnostics.Trace.WriteLine($"Interact({x}, {y});");

            var t = new Thread(() =>
            {
                interactToken = Reduce(ApOperator.Acquire(interactToken, ConsOperator.Acquire(ConstantOperator.Acquire(x), ConstantOperator.Acquire(y))));
            }, 1024 * 1024 * 1024);

            t.Start();
            t.Join();
            ClearCaches();
            GC.Collect();
            GC.WaitForPendingFinalizers();
            return(lastInteractResult);
        }
        public IToken ParseTokens(string[] ops)
        {
            var    stack = new Stack <ApOperator>();
            IToken token = null;

            for (int i = 0; i < ops.Length; i++)
            {
                var op = ops[i];

                switch (op)
                {
                case "ap":
                    token = new ApOperator();
                    break;

                case "inc":
                    token = IncOperator.Acquire();
                    break;

                case "dec":
                    token = DecOperator.Acquire();
                    break;

                case "neg":
                    token = NegOperator.Acquire();
                    break;

                case "add":
                    token = AddOperator.Acquire();
                    break;

                case "mul":
                    token = MulOperator.Acquire();
                    break;

                //case "l":
                //    token = new LOperator();
                //    break;

                case "div":
                    token = DivOperator.Acquire();
                    break;

                //case "pwr2":
                //    return (new Pwr2Operator(), index);

                case "t":
                    token = KComb.Acquire();
                    break;

                //case "f":
                //    return (new FComb(), index);

                case "s":
                    token = SComb.Acquire();
                    break;

                case "c":
                    token = CComb.Acquire();
                    break;

                case "b":
                    token = BComb.Acquire();
                    break;

                case "i":
                    token = IComb.Acquire();
                    break;

                case "cons":
                case "vec":
                    token = ConsOperator.Acquire();
                    break;

                case "car":
                    token = CarOperator.Acquire();
                    break;

                case "cdr":
                    token = CdrOperator.Acquire();
                    break;

                case "nil":
                    token = NilOperator.Acquire();
                    break;

                case "isnil":
                    token = IsNilOperator.Acquire();
                    break;

                case "eq":
                    token = EqOperator.Acquire();
                    break;

                case "if0":
                    token = new If0Operator();
                    break;

                case "lt":
                    token = LtOperator.Acquire();
                    break;

                //case "mod":
                //    token = new ModOperator();
                //    break;

                //case "dem":
                //    token = new DemodOperator();
                //    break;

                case "interact":
                    token = new InteractOperator();
                    break;

                default:
                    if (decimal.TryParse(op, out var constant))     // int constant
                    {
                        token = ConstantOperator.Acquire(decimal.Parse(op));
                    }
                    else if (op.StartsWith("x"))
                    {
                        token = VarOperator.Acquire(op);
                    }
                    else if (op.StartsWith(":"))     // variable reference
                    {
                        token = LateBoundToken.Acquire(op);
                    }
                    else
                    {
                        throw new InvalidOperationException();
                    }

                    break;
                }

                if (stack.Count == 0)
                {
                    if (!(token is ApOperator))
                    {
                        if (i != ops.Length - 1)
                        {
                            throw new InvalidOperationException();
                        }

                        return(token);
                    }

                    stack.Push((ApOperator)token);
                }
                else
                {
                    var top = stack.Peek();
                    if (top.f == null)
                    {
                        top.f = token;
                        if (token is ApOperator ap)
                        {
                            stack.Push(ap);
                        }
                    }
                    else if (top.x == null)
                    {
                        top.x = token;
                        if (token is ApOperator ap)
                        {
                            stack.Push(ap);
                        }
                        else
                        {
                            while (stack.Count > 0 && stack.Peek().x != null)
                            {
                                token = stack.Pop();
                            }
                        }
                    }
                    else
                    {
                        throw new InvalidOperationException();
                    }
                }
            }

            if (stack.Count == 1)
            {
                return(stack.Pop());
            }

            return(token);
        }
Beispiel #3
0
        public void Mod1()
        {
            var mod = ModDemod.Bleh(ConstantOperator.Acquire(1).Mod());

            Assert.That(mod, Is.EqualTo("1"));
        }
Beispiel #4
0
        /// <summary>
        /// Initializes the operator resolver.
        /// </summary>
        /// <returns>The operator resolver.</returns>
        private static OperatorResolver InitOperatorResolver()
        {
            Mock <OperatorResolver> opResolverMock = new Mock <OperatorResolver>();
            IExpressionFactory      exprFactory    =
                new ExpressionFactory(
                    ModelResolvers.ExprResolver,
                    ModelResolvers.RuleExprResolver,
                    ModelResolvers.JoinExprResolver,
                    opResolverMock.Object);

            JoinApplyMeasuresOperator joinApplyMeasuresOp = new JoinApplyMeasuresOperator(
                exprFactory,
                ModelResolvers.DsResolver);

            opResolverMock.Setup(o => o(It.IsAny <string>()))
            .Returns((string key) =>
            {
                IOperatorDefinition op;

                if (key.In("count", "min", "max", "median", "sum", "avg", "stddev_pop", "stddev_samp", "var_pop", "var_samp"))
                {
                    op = new AggrFunctionOperator(joinApplyMeasuresOp, ModelResolvers.DsResolver);
                }
                else if (key == "aggr")
                {
                    op = new AggrOperator();
                }
                else if (key.In("first_value", "last_value", "lag", "rank", "ratio_to_report", "lead"))
                {
                    op = new AnalyticFunctionOperator(joinApplyMeasuresOp, ModelResolvers.DsResolver);
                }
                else if (key.In("+", "-", "*", "/"))
                {
                    op = new ArithmeticOperator(joinApplyMeasuresOp);
                }
                else if (key == "between")
                {
                    op = new BetweenOperator(joinApplyMeasuresOp, ModelResolvers.DsResolver);
                }
                else if (key.In("and", "or", "xor", "not"))
                {
                    op = new BooleanOperator(joinApplyMeasuresOp, ModelResolvers.DsResolver);
                }
                else if (key == "calc")
                {
                    op = new CalcOperator(ModelResolvers.DsResolver);
                }
                else if (key == "check_datapoint")
                {
                    op = new CheckDatapointOperator(ModelResolvers.DsResolver, exprFactory);
                }
                else if (key.In("=", "<>", "<", "<=", ">", ">="))
                {
                    op = new ComparisonOperator(joinApplyMeasuresOp, ModelResolvers.DsResolver);
                }
                else if (key == "comp")
                {
                    op = new ComponentOperator(ModelResolvers.DsResolver, new ComponentTypeInference(ModelResolvers.DsResolver));
                }
                else if (key == "const")
                {
                    op = new ConstantOperator(ModelResolvers.DsResolver);
                }
                else if (key == "current_date")
                {
                    op = new CurrentDateOperator(ModelResolvers.DsResolver);
                }
                else if (key == "exists_in")
                {
                    op = new ExistsInOperator(ModelResolvers.DsResolver);
                }
                else if (key == "get")
                {
                    op = new GetOperator(new Mock <IDataModelProvider>().Object);                       // operator tests should mock IDataModel implementation
                }
                else if (key == "if")
                {
                    op = new IfThenElseOperator(joinApplyMeasuresOp, ModelResolvers.DsResolver);
                }
                else if (key.In("in", "not_in"))
                {
                    op = new InOperator(joinApplyMeasuresOp, ModelResolvers.DsResolver);
                }
                else if (key == "isnull")
                {
                    op = new IsNullOperator(joinApplyMeasuresOp, ModelResolvers.DsResolver);
                }
                else if (key == "join")
                {
                    op = new JoinOperator(ModelResolvers.DsResolver);
                }
                else if (key.In("keep", "drop"))
                {
                    op = new KeepDropOperator(ModelResolvers.DsResolver);
                }
                else if (key == "match_characters")
                {
                    op = new MatchCharactersOperator(joinApplyMeasuresOp, ModelResolvers.DsResolver);
                }
                else if (key == "#")
                {
                    op = new MembershipOperator();
                }
                else if (key.In("ceil", "floor", "abs", "exp", "ln", "sqrt", "mod", "round", "power", "log", "trunc"))
                {
                    op = new NumericOperator(joinApplyMeasuresOp, ModelResolvers.DsResolver);
                }
                else if (key == "nvl")
                {
                    op = new NvlOperator(joinApplyMeasuresOp);
                }
                else if (key == "opt")
                {
                    op = new OptionalOperator(ModelResolvers.DsResolver);
                }
                else if (key == "period_indicator")
                {
                    op = new PeriodIndicatorOperator(joinApplyMeasuresOp, ModelResolvers.DsResolver, exprFactory);
                }
                else if (key == "pivot")
                {
                    op = new PivotOperator(ModelResolvers.DsResolver);
                }
                else if (key == "ref")
                {
                    op = new ReferenceOperator();
                }
                else if (key == "rename")
                {
                    op = new RenameOperator(ModelResolvers.DsResolver);
                }
                else if (key.In("union", "intersect", "setdiff", "symdiff"))
                {
                    op = new SetOperator();
                }
                else if (key.In("||", "trim", "rtrim", "ltrim", "upper", "lower", "substr", "replace", "instr", "length"))
                {
                    op = new StringOperator(joinApplyMeasuresOp, ModelResolvers.DsResolver);
                }
                else if (key == "sub")
                {
                    op = new SubspaceOperator(ModelResolvers.DsResolver);
                }
                else if (key.In("fill_time_series", "flow_to_stock", "stock_to_flow", "timeshift", "time_agg"))
                {
                    op = new TimeOperator();
                }
                else if (key.In("plus", "minus"))
                {
                    op = new UnaryArithmeticOperator(joinApplyMeasuresOp);
                }
                else if (key == "unpivot")
                {
                    op = new UnpivotOperator(ModelResolvers.DsResolver);
                }
                // ---
                else if (key == "calcExpr")
                {
                    op = new CalcExprOperator(ModelResolvers.DsResolver);
                }
                else if (key == "collection")
                {
                    op = new CollectionOperator(ModelResolvers.DsResolver);
                }
                else if (key == "datasetClause")
                {
                    op = new DatasetClauseOperator();
                }
                else if (key == "group")
                {
                    op = new GroupOperator(ModelResolvers.DsResolver);
                }
                else if (key == "order")
                {
                    op = new OrderOperator(ModelResolvers.DsResolver);
                }
                else if (key == "partition")
                {
                    op = new PartitionOperator(ModelResolvers.DsResolver);
                }
                else if (key == "renameExpr")
                {
                    op = new RenameExprOperator(ModelResolvers.DsResolver);
                }
                else if (key == "subExpr")
                {
                    op = new SubspaceExprOperator();
                }
                else if (key == "when")
                {
                    op = new WhenOperator();
                }
                else
                {
                    throw new InvalidOperationException("Operator not found");
                }

                op.Symbol = key;
                return(op);
            });

            return(opResolverMock.Object);
        }
Beispiel #5
0
        public void Mod20372()
        {
            var mod = ModDemod.Bleh(ConstantOperator.Acquire(20372).Mod());

            Assert.That(mod, Is.EqualTo("20372"));
        }