Sha256: a7c7d39136e8e4764dd48775fe12cae67ab65ffccf31f5f5ddb0ca2ef7bb1496

Contents?: true

Size: 1.08 KB

Versions: 3

Compression:

Stored size: 1.08 KB

Contents

module Ravensat
  module Claw
    def self.alo(bool_vars)
      bool_vars.reduce(:|)
    end

    def self.pairwise_amo(bool_vars)
      bool_vars.combination(2).map do |e|
        e.map(&:~@).reduce(:|)
      end.reduce(:&)
    end

    # NOTE: Klieber, W. and Kwon, G.: Efficient CNF Encoding for Selecting 1 from N Objects (2007).
    def self.commander_amo(bool_vars)
      m = bool_vars.size / 2
      commander_variables = []
      formula = Ravensat::InitialNode.new
      bool_vars.each_slice(2) do |g|
        c = Ravensat::VarNode.new
        subset = g << ~c
        formula &= pairwise_amo(subset)
        formula &= alo(subset)
        commander_variables << c
      end

      if m < 6
        formula &= pairwise_amo(commander_variables)
      else
        formula &= commander_amo(commander_variables)
      end
    end

    def self.all_different(*int_vars)
      int_vars.combination(2).map do |int_var|
        int_var.reduce(:!=)
      end.reduce(:&)
    end

    def self.all_only_one(*int_vars)
      int_vars.map(&:only_one).reduce(:&)
    end

    # alias :amo :pairwise_amo
  end
end

Version data entries

3 entries across 3 versions & 1 rubygems

Version Path
ravensat-1.0.3 lib/ravensat/claw.rb
ravensat-1.0.2 lib/ravensat/claw.rb
ravensat-1.0.1 lib/ravensat/claw.rb