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(); } }
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); }
protected override void LLWrite(ICodeWriter writer, object o) { OperatorExpr.WriteAll(writer); }