class Gecode::Bool::BooleanConstraint

Public Instance Methods

post() click to toggle source
# File doc/tmp/rdoc_dev/gecoder/interface/constraints/bool/boolean.rb, line 137
def post
  lhs, rhs, negate, reif_var = 
    @params.values_at(:lhs, :rhs, :negate, :reif)

  if lhs.respond_to? :to_bool_var
    lhs = ExpressionNode.new(lhs, @model)
  end
  space = (lhs.model || rhs.model).active_space

  bot_eqv = Gecode::Raw::IRT_EQ
  bot_xor = Gecode::Raw::IRT_NQ

  if rhs.respond_to? :to_minimodel_bool_expr
    if reif_var.nil?
      tree = ExpressionTree.new(lhs, :==, rhs)
      tree.to_minimodel_bool_expr.post(space, !negate, 
        *propagation_options)
    else
      tree = ExpressionTree.new(lhs, :==, rhs)
      var = tree.to_minimodel_bool_expr.post(space, *propagation_options)
      Gecode::Raw::rel(space, var, (negate ? bot_xor : bot_eqv),
        reif_var.to_bool_var.bind, *propagation_options)
    end
  else
    should_hold = !negate & rhs
    if reif_var.nil?
      lhs.to_minimodel_bool_expr.post(space, should_hold, 
        *propagation_options)
    else
      var = lhs.to_minimodel_bool_expr.post(space, *propagation_options)
      Gecode::Raw::rel(space, var, 
        (should_hold ? bot_eqv : bot_xor),
        reif_var.to_bool_var.bind, *propagation_options)
    end
  end
end