示例#1
0
 public virtual object Visit(OperatorExpr expr)
 {
     foreach (var operand in expr.Operands)
     {
         operand.Accept(this);
     }
     return(null);
 }
        private static void AddMessagingConstraints(List <InternodeMessage> messages, Solver.IModel solverModel, Dictionary <A.Message, MessageDecision> msgDecisions, Dictionary <NodeId, NodeDecision> nodeDecisions)
        {
            Func <A.Message, Expr> getTerm = m =>
            {
                Expr ret = new TermExpr()
                {
                    Variable = nodeDecisions[m.Node.NodeId].Decision
                };
                for (; m != null; m = m.Prev)
                {
                    MessageDecision d;
                    if (msgDecisions.TryGetValue(m, out d))
                    {
                        ret = new OperatorExpr()
                        {
                            Op    = OperatorExpr.OpType.Sub,
                            Left  = ret,
                            Right = new TermExpr()
                            {
                                Variable = d.Decision
                            }
                        }
                    }
                    ;
                }
                return(ret);
            };

            foreach (var message in messages)
            {
                var toNodeDecision   = getTerm(message.IncomingMessage);
                var fromNodeDecision = getTerm(message.OutgoingMessage);

                solverModel.AddConstraints(
                    SolverUtils.MakeValidSolverIdentifierFromString("MessageConstraint_" + message.Id),
                    new OperatorExpr()
                {
                    Op   = OperatorExpr.OpType.Get,
                    Left = new OperatorExpr()
                    {
                        Op    = OperatorExpr.OpType.Sub,
                        Left  = toNodeDecision,
                        Right = fromNodeDecision,
                    },
                    Right = new ConstantExpr()
                    {
                        Value = (message.FromTimestamp - message.ToTimestamp).Ticks + 1
                    }
                }
                    );
                nodeDecisions[message.IncomingMessage.Node.NodeId].UsedInConstraint();
                nodeDecisions[message.OutgoingMessage.Node.NodeId].UsedInConstraint();
            }
        }
示例#3
0
        public DataElement Visit(OperatorExpr expr)
        {
            // evaluate all of the operands
            // this may emit instructions and allocate locals
            var operands = EvaluateArguments(expr.Operands);

            // insert local and the evaluation funcion =(...)
            var local = AllocateLocal();

            Emit(new TargetInstruction(local, _instructions));
            EmitCall("=", InterleaveOperandsAndOperators(operands, expr.Operators));

            // return the local the result is written to
            return(local);
        }
示例#4
0
 protected override void LLWrite(ICodeWriter writer, object o)
 {
     OperatorExpr.WriteAll(writer);
 }