gecoder-with-gecode 0.8.2-mswin32 → 0.8.3-mswin32
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/CHANGES +14 -0
- data/lib/gecode.dll +0 -0
- data/lib/gecoder/bindings/bindings.rb +104 -46
- data/lib/gecoder/interface/binding_changes.rb +1 -301
- data/lib/gecoder/interface/branch.rb +15 -11
- data/lib/gecoder/interface/constraints.rb +38 -0
- data/lib/gecoder/interface/constraints/bool/boolean.rb +56 -52
- data/lib/gecoder/interface/constraints/bool/channel.rb +1 -16
- data/lib/gecoder/interface/constraints/bool_enum/channel.rb +13 -8
- data/lib/gecoder/interface/constraints/bool_enum/extensional.rb +48 -0
- data/lib/gecoder/interface/constraints/extensional_regexp.rb +101 -0
- data/lib/gecoder/interface/constraints/int/channel.rb +1 -13
- data/lib/gecoder/interface/constraints/int_enum/channel.rb +15 -35
- data/lib/gecoder/interface/constraints/int_enum/extensional.rb +130 -0
- data/lib/gecoder/interface/constraints/set/channel.rb +54 -0
- data/lib/gecoder/interface/constraints/set_enum/channel.rb +37 -6
- data/lib/gecoder/interface/constraints/set_var_constraints.rb +1 -0
- data/lib/gecoder/interface/model.rb +110 -85
- data/lib/gecoder/interface/variables.rb +3 -21
- data/lib/gecoder/version.rb +1 -1
- data/specs/branch.rb +16 -1
- data/specs/constraints/bool_enum_relation.rb +6 -6
- data/specs/constraints/boolean.rb +31 -25
- data/specs/constraints/channel.rb +102 -4
- data/specs/constraints/extensional.rb +185 -2
- data/specs/constraints/reification_sugar.rb +2 -46
- data/specs/model.rb +85 -7
- data/tasks/dependencies.txt +1 -0
- data/vendor/rust/rust/class.rb +33 -35
- data/vendor/rust/rust/templates/ClassDeclarations.rusttpl +1 -1
- data/vendor/rust/rust/templates/CxxClassDefinitions.rusttpl +10 -1
- metadata +186 -185
- data/example/raw_bindings.rb +0 -44
- data/specs/binding_changes.rb +0 -76
    
        data/CHANGES
    CHANGED
    
    | @@ -1,3 +1,17 @@ | |
| 1 | 
            +
            == Version 0.8.3 
         | 
| 2 | 
            +
            This release adds regular expression constraints, the last channel
         | 
| 3 | 
            +
            constraint and various minor convenience improvements. It also fixes a
         | 
| 4 | 
            +
            rather serious bug that occurs when using the latest patchlevels of Ruby
         | 
| 5 | 
            +
            1.8.6. 
         | 
| 6 | 
            +
             | 
| 7 | 
            +
            * [#20888] Fixed a GC bug causing problems with Ruby 1.8.6 at patchlevels around 230.
         | 
| 8 | 
            +
            * Boolean constraints can no longer be specified using the form "bool.must == true". Only the "bool.must_be.true" form can now be used.
         | 
| 9 | 
            +
            * Added constants in Model that contain the limits of the variables' domains.
         | 
| 10 | 
            +
            * The domain when construction arrays and matrices of int variables now default to the same as when creating single variables (the largest possible domain).
         | 
| 11 | 
            +
            * Model#branch_on now accepts single variables as well as enums.
         | 
| 12 | 
            +
            * Added channel constraints between single set variables and enumerations of boolean variables.
         | 
| 13 | 
            +
            * Added integer and boolean regular expression constraints. Thanks goes to Eivind Eklund for providing the idea for the syntax used to specify the regular expressions.
         | 
| 14 | 
            +
             | 
| 1 15 | 
             
            == Version 0.8.2
         | 
| 2 16 | 
             
            This release adds search statistics along with some new arithmetic constraints 
         | 
| 3 17 | 
             
            and channel constraints between boolean and integer variables.
         | 
    
        data/lib/gecode.dll
    CHANGED
    
    | Binary file | 
| @@ -77,7 +77,7 @@ Rust::Bindings::create_bindings Rust::Bindings::LangCxx, "gecode" do |b| | |
| 77 77 | 
             
              b.include_header 'gecode/set.hh', Rust::Bindings::HeaderGlobal
         | 
| 78 78 | 
             
              b.include_header 'gecode/search.hh', Rust::Bindings::HeaderGlobal
         | 
| 79 79 | 
             
              b.include_header 'gecode/minimodel.hh', Rust::Bindings::HeaderGlobal
         | 
| 80 | 
            -
              b.include_header ' | 
| 80 | 
            +
              b.include_header 'gecoder.h', Rust::Bindings::HeaderLocal
         | 
| 81 81 |  | 
| 82 82 | 
             
              b.add_custom_definition ruby2intargs
         | 
| 83 83 | 
             
              b.add_custom_definition custom_mark_definitions
         | 
| @@ -351,52 +351,47 @@ Rust::Bindings::create_bindings Rust::Bindings::LangCxx, "gecode" do |b| | |
| 351 351 | 
             
                  klass.add_method "tuples", "int"
         | 
| 352 352 | 
             
                end
         | 
| 353 353 |  | 
| 354 | 
            -
                ns.add_cxx_class "MBranchingDesc" do |klass|
         | 
| 355 | 
            -
                  klass.bindname = "BranchingDesc"
         | 
| 356 | 
            -
                  klass.add_constructor
         | 
| 357 | 
            -
                  klass.add_method "alternatives", "int"
         | 
| 358 | 
            -
                  klass.add_method "size", "int"
         | 
| 359 | 
            -
                end
         | 
| 360 | 
            -
                
         | 
| 361 354 | 
             
                ns.add_cxx_class "MSpace" do |klass|
         | 
| 362 355 | 
             
                  klass.bindname = "Space"
         | 
| 363 356 | 
             
                  klass.function_mark = 'Gecode_MSpace_custom_mark'
         | 
| 364 357 |  | 
| 365 358 | 
             
                  klass.add_constructor
         | 
| 366 | 
            -
             | 
| 367 | 
            -
                  klass.add_method "debug"
         | 
| 368 | 
            -
                  
         | 
| 359 | 
            +
             | 
| 369 360 | 
             
                  klass.add_method "constrain" do |method|
         | 
| 370 361 | 
             
                    method.add_parameter "Gecode::MSpace*", "s"
         | 
| 371 362 | 
             
                  end
         | 
| 372 363 |  | 
| 373 | 
            -
                  klass.add_method " | 
| 374 | 
            -
                    method.add_parameter " | 
| 375 | 
            -
                    method.add_parameter " | 
| 364 | 
            +
                  klass.add_method "new_int_var", "int" do |method|
         | 
| 365 | 
            +
                    method.add_parameter "int", "min"
         | 
| 366 | 
            +
                    method.add_parameter "int", "max"
         | 
| 376 367 | 
             
                  end
         | 
| 377 368 |  | 
| 378 | 
            -
                  klass.add_method " | 
| 379 | 
            -
                    method.add_parameter "Gecode:: | 
| 380 | 
            -
                    method.add_parameter "char*", "name"
         | 
| 369 | 
            +
                  klass.add_method "new_int_var", "int" do |method|
         | 
| 370 | 
            +
                    method.add_parameter "Gecode::IntSet", "domain"
         | 
| 381 371 | 
             
                  end
         | 
| 382 | 
            -
             | 
| 383 | 
            -
                  klass.add_method " | 
| 384 | 
            -
                    method.add_parameter "Gecode::MSetVarArray *", "x"
         | 
| 385 | 
            -
                    method.add_parameter "char*", "name"
         | 
| 372 | 
            +
             | 
| 373 | 
            +
                  klass.add_method "new_bool_var", "int" do |method|
         | 
| 386 374 | 
             
                  end
         | 
| 387 | 
            -
             | 
| 388 | 
            -
                  klass.add_method " | 
| 389 | 
            -
                    method.add_parameter " | 
| 375 | 
            +
             | 
| 376 | 
            +
                  klass.add_method "new_set_var", "int" do |method|
         | 
| 377 | 
            +
                    method.add_parameter "Gecode::IntSet", "glb"
         | 
| 378 | 
            +
                    method.add_parameter "Gecode::IntSet", "lub"
         | 
| 379 | 
            +
                    method.add_parameter "int", "cardMin"
         | 
| 380 | 
            +
                    method.add_parameter "int", "cardMax"
         | 
| 390 381 | 
             
                  end
         | 
| 391 | 
            -
             | 
| 392 | 
            -
                  klass.add_method " | 
| 393 | 
            -
                    method.add_parameter " | 
| 382 | 
            +
             | 
| 383 | 
            +
                  klass.add_method "int_var", "Gecode::IntVar*" do |method|
         | 
| 384 | 
            +
                    method.add_parameter "int", "id"
         | 
| 394 385 | 
             
                  end
         | 
| 395 | 
            -
             | 
| 396 | 
            -
                  klass.add_method " | 
| 397 | 
            -
                    method.add_parameter " | 
| 386 | 
            +
             | 
| 387 | 
            +
                  klass.add_method "bool_var", "Gecode::BoolVar*" do |method|
         | 
| 388 | 
            +
                    method.add_parameter "int", "id"
         | 
| 398 389 | 
             
                  end
         | 
| 399 390 |  | 
| 391 | 
            +
                  klass.add_method "set_var", "Gecode::SetVar*" do |method|
         | 
| 392 | 
            +
                    method.add_parameter "int", "id"
         | 
| 393 | 
            +
                  end
         | 
| 394 | 
            +
             | 
| 400 395 | 
             
                  klass.add_method "clone", "Gecode::MSpace *" do |method|
         | 
| 401 396 | 
             
                    method.add_parameter "bool", "shared"
         | 
| 402 397 | 
             
                  end
         | 
| @@ -411,13 +406,6 @@ Rust::Bindings::create_bindings Rust::Bindings::LangCxx, "gecode" do |b| | |
| 411 406 | 
             
                  # description method used by rspec, and isn't used directly in the 
         | 
| 412 407 | 
             
                  # interface.
         | 
| 413 408 | 
             
                  #klass.add_method "mdescription", "Gecode::MBranchingDesc *", "description"
         | 
| 414 | 
            -
                  
         | 
| 415 | 
            -
                  klass.add_method "commit" do |method|
         | 
| 416 | 
            -
                    method.add_parameter "Gecode::MBranchingDesc", "desc" do |param|
         | 
| 417 | 
            -
                      param.custom_conversion = "ruby2Gecode_MBranchingDescPtr(desc, 1)->ptr()"
         | 
| 418 | 
            -
                    end
         | 
| 419 | 
            -
                    method.add_parameter "int", "a"
         | 
| 420 | 
            -
                  end
         | 
| 421 409 | 
             
                end
         | 
| 422 410 |  | 
| 423 411 | 
             
                # The namespace structure doesn't completely mimic Gecode's namespace 
         | 
| @@ -659,6 +647,57 @@ Rust::Bindings::create_bindings Rust::Bindings::LangCxx, "gecode" do |b| | |
| 659 647 | 
             
                  klass.add_method "next", "Gecode::MSpace *"
         | 
| 660 648 | 
             
                  klass.add_method "statistics", "Gecode::Search::Statistics"
         | 
| 661 649 | 
             
                end
         | 
| 650 | 
            +
             | 
| 651 | 
            +
                ns.add_cxx_class "DFA" do |klass|
         | 
| 652 | 
            +
                  klass.add_constructor
         | 
| 653 | 
            +
                end
         | 
| 654 | 
            +
             | 
| 655 | 
            +
                ns.add_cxx_class "REG" do |klass|
         | 
| 656 | 
            +
                  klass.add_constructor
         | 
| 657 | 
            +
             | 
| 658 | 
            +
                  klass.add_constructor do |method|
         | 
| 659 | 
            +
                    method.add_parameter "int", "s"
         | 
| 660 | 
            +
                  end
         | 
| 661 | 
            +
             | 
| 662 | 
            +
                  klass.add_constructor do |method|
         | 
| 663 | 
            +
                    method.add_parameter "Gecode::IntArgs&", "x"
         | 
| 664 | 
            +
                  end
         | 
| 665 | 
            +
             | 
| 666 | 
            +
                  klass.add_constructor do |method|
         | 
| 667 | 
            +
                    method.add_parameter "Gecode::REG&", "r"
         | 
| 668 | 
            +
                  end
         | 
| 669 | 
            +
             | 
| 670 | 
            +
                  klass.add_operator "+", "Gecode::REG" do |operator|
         | 
| 671 | 
            +
                    operator.add_parameter "Gecode::REG&", "r"
         | 
| 672 | 
            +
                  end
         | 
| 673 | 
            +
             | 
| 674 | 
            +
                  klass.add_operator "+=", "Gecode::REG&" do |operator|
         | 
| 675 | 
            +
                    operator.add_parameter "Gecode::REG&", "r"
         | 
| 676 | 
            +
                  end
         | 
| 677 | 
            +
             | 
| 678 | 
            +
                  klass.add_operator "|", "Gecode::REG" do |operator|
         | 
| 679 | 
            +
                    operator.add_parameter "Gecode::REG&", "r"
         | 
| 680 | 
            +
                  end
         | 
| 681 | 
            +
                  
         | 
| 682 | 
            +
                  klass.add_operator "|=", "Gecode::REG&" do |operator|
         | 
| 683 | 
            +
                    operator.add_parameter "Gecode::REG&", "r"
         | 
| 684 | 
            +
                  end
         | 
| 685 | 
            +
                  
         | 
| 686 | 
            +
                  klass.add_operator "*", "Gecode::REG" do |operator|
         | 
| 687 | 
            +
                  end
         | 
| 688 | 
            +
                  
         | 
| 689 | 
            +
                  klass.add_operator "+", "Gecode::REG" do |operator|
         | 
| 690 | 
            +
                  end
         | 
| 691 | 
            +
             | 
| 692 | 
            +
                  klass.add_operator "()", "Gecode::REG" do |operator|
         | 
| 693 | 
            +
                    operator.add_parameter "int", "n"
         | 
| 694 | 
            +
                    operator.add_parameter "int", "m"
         | 
| 695 | 
            +
                  end
         | 
| 696 | 
            +
             | 
| 697 | 
            +
                  klass.add_operator "()", "Gecode::REG" do |operator|
         | 
| 698 | 
            +
                    operator.add_parameter "int", "n"
         | 
| 699 | 
            +
                  end
         | 
| 700 | 
            +
                end
         | 
| 662 701 |  | 
| 663 702 | 
             
                # SEARCH NAMESPACE
         | 
| 664 703 |  | 
| @@ -789,7 +828,7 @@ Rust::Bindings::create_bindings Rust::Bindings::LangCxx, "gecode" do |b| | |
| 789 828 | 
             
                      method.add_parameter "Gecode::MiniModel::LinRel<Gecode::BoolVar>", "e"
         | 
| 790 829 | 
             
                    end        
         | 
| 791 830 |  | 
| 792 | 
            -
                    klass.add_method "post" do |method|
         | 
| 831 | 
            +
                    klass.add_method "post", "Gecode::BoolVar" do |method|
         | 
| 793 832 | 
             
                      method.add_parameter "Gecode::MSpace *", "home"
         | 
| 794 833 | 
             
                      method.add_parameter "Gecode::IntConLevel", "icl"
         | 
| 795 834 | 
             
                      method.add_parameter "Gecode::PropKind", "pk"
         | 
| @@ -1276,14 +1315,25 @@ Rust::Bindings::create_bindings Rust::Bindings::LangCxx, "gecode" do |b| | |
| 1276 1315 | 
             
                  func.add_parameter "Gecode::PropKind", "pk"
         | 
| 1277 1316 | 
             
                end
         | 
| 1278 1317 |  | 
| 1279 | 
            -
             | 
| 1280 | 
            -
             | 
| 1281 | 
            -
             | 
| 1282 | 
            -
             | 
| 1283 | 
            -
             | 
| 1284 | 
            -
             | 
| 1285 | 
            -
             | 
| 1286 | 
            -
             | 
| 1318 | 
            +
                ns.add_function "extensional", "void" do |func|
         | 
| 1319 | 
            +
                  func.add_parameter "Gecode::MSpace*", "home"
         | 
| 1320 | 
            +
                  func.add_parameter "Gecode::MIntVarArray *", "x" do |param|
         | 
| 1321 | 
            +
                    param.custom_conversion = "*ruby2Gecode_MIntVarArrayPtr(argv[1], 2)->ptr()"
         | 
| 1322 | 
            +
                  end
         | 
| 1323 | 
            +
                  func.add_parameter "Gecode::REG", "dfa" 
         | 
| 1324 | 
            +
                  func.add_parameter "Gecode::IntConLevel", "icl"
         | 
| 1325 | 
            +
                  func.add_parameter "Gecode::PropKind", "pk"
         | 
| 1326 | 
            +
                end
         | 
| 1327 | 
            +
             | 
| 1328 | 
            +
                ns.add_function "extensional", "void" do |func|
         | 
| 1329 | 
            +
                  func.add_parameter "Gecode::MSpace*", "home"
         | 
| 1330 | 
            +
                  func.add_parameter "Gecode::MBoolVarArray *", "x" do |param|
         | 
| 1331 | 
            +
                    param.custom_conversion = "*ruby2Gecode_MBoolVarArrayPtr(argv[1], 2)->ptr()"
         | 
| 1332 | 
            +
                  end
         | 
| 1333 | 
            +
                  func.add_parameter "Gecode::REG", "dfa" 
         | 
| 1334 | 
            +
                  func.add_parameter "Gecode::IntConLevel", "icl"
         | 
| 1335 | 
            +
                  func.add_parameter "Gecode::PropKind", "pk"
         | 
| 1336 | 
            +
                end
         | 
| 1287 1337 |  | 
| 1288 1338 | 
             
                ns.add_function "bab", "Gecode::MSpace*" do |func|
         | 
| 1289 1339 | 
             
                  func.add_parameter "Gecode::MSpace*", "home"
         | 
| @@ -1765,6 +1815,14 @@ Rust::Bindings::create_bindings Rust::Bindings::LangCxx, "gecode" do |b| | |
| 1765 1815 | 
             
                    param.custom_conversion = "*ruby2Gecode_MSetVarArrayPtr(argv[2], 3)->ptr()"
         | 
| 1766 1816 | 
             
                  end
         | 
| 1767 1817 | 
             
                end
         | 
| 1818 | 
            +
             | 
| 1819 | 
            +
                ns.add_function "channel" do |func|
         | 
| 1820 | 
            +
                  func.add_parameter "Gecode::MSpace*", "home"
         | 
| 1821 | 
            +
                  func.add_parameter "Gecode::MBoolVarArray", "x" do |param|
         | 
| 1822 | 
            +
                    param.custom_conversion = "*ruby2Gecode_MBoolVarArrayPtr(argv[1], 2)->ptr()"
         | 
| 1823 | 
            +
                  end
         | 
| 1824 | 
            +
                  func.add_parameter "Gecode::SetVar", "y"
         | 
| 1825 | 
            +
                end
         | 
| 1768 1826 |  | 
| 1769 1827 | 
             
                ns.add_function "weights" do |func|
         | 
| 1770 1828 | 
             
                  func.add_parameter "Gecode::MSpace*", "home"
         | 
| @@ -1,309 +1,9 @@ | |
| 1 | 
            -
            # This file adds a small layer on top of the bindings. | 
| 2 | 
            -
            # of variables so that a single array is allocated in each space which is then 
         | 
| 3 | 
            -
            # used to store variable. The variables themselves are not directly returned, 
         | 
| 4 | 
            -
            # rather they are represented as the index in that store, which allows the 
         | 
| 5 | 
            -
            # variable to be retrieved back given a space.
         | 
| 6 | 
            -
            #
         | 
| 7 | 
            -
            # This layer should be moved to the C++ side instead when possible for better
         | 
| 8 | 
            -
            # performance.
         | 
| 1 | 
            +
            # This file adds a small layer on top of the bindings.
         | 
| 9 2 | 
             
            module GecodeRaw #:nodoc: all
         | 
| 10 3 | 
             
              class Space
         | 
| 11 | 
            -
                # Creates the specified number of integer variables in the space with the
         | 
| 12 | 
            -
                # specified domain. Returns the indices with which they can then be 
         | 
| 13 | 
            -
                # accessed using int_var. The domain can be given as a Range (trated 
         | 
| 14 | 
            -
                # specially) or as another enum.
         | 
| 15 | 
            -
                def new_int_vars(domain, count = 1)
         | 
| 16 | 
            -
                  int_var_store.new_vars(domain, count)
         | 
| 17 | 
            -
                end
         | 
| 18 | 
            -
                
         | 
| 19 | 
            -
                # Gets the int variable with the specified index, nil if none exists.
         | 
| 20 | 
            -
                def int_var(index)
         | 
| 21 | 
            -
                  int_var_store[index]
         | 
| 22 | 
            -
                end
         | 
| 23 | 
            -
                
         | 
| 24 | 
            -
                # Creates the specified number of boolean variables in the space. Returns
         | 
| 25 | 
            -
                # the indices with which they can then be accessed using bool_var.
         | 
| 26 | 
            -
                def new_bool_vars(count = 1)
         | 
| 27 | 
            -
                  bool_var_store.new_vars(count)
         | 
| 28 | 
            -
                end
         | 
| 29 | 
            -
                
         | 
| 30 | 
            -
                # Gets the bool variable with the specified index, nil if none exists.
         | 
| 31 | 
            -
                def bool_var(index)
         | 
| 32 | 
            -
                  bool_var_store[index]
         | 
| 33 | 
            -
                end
         | 
| 34 | 
            -
                
         | 
| 35 | 
            -
                # Creates the specified number of set variables in the space with the 
         | 
| 36 | 
            -
                # specified domain for greatest lower bound and least upper bound 
         | 
| 37 | 
            -
                # (specified as either a range or enum). A range for the allowed 
         | 
| 38 | 
            -
                # cardinality of the set can also be specified, if none is specified, or 
         | 
| 39 | 
            -
                # nil is given, then the default range (anything) will be used. Returns 
         | 
| 40 | 
            -
                # the indices with which they can then be accessed using set_var.
         | 
| 41 | 
            -
                def new_set_vars(*vars)
         | 
| 42 | 
            -
                  set_var_store.new_vars(*vars)
         | 
| 43 | 
            -
                end
         | 
| 44 | 
            -
                
         | 
| 45 | 
            -
                # Gets the set variable with the specified index, nil if none exists.
         | 
| 46 | 
            -
                def set_var(index)
         | 
| 47 | 
            -
                  set_var_store[index]
         | 
| 48 | 
            -
                end
         | 
| 49 | 
            -
                
         | 
| 50 4 | 
             
                # Used by Gecode during BAB-search.
         | 
| 51 5 | 
             
                def constrain(best_so_far_space)
         | 
| 52 6 | 
             
                  Gecode::Model.constrain(self, best_so_far_space)
         | 
| 53 7 | 
             
                end
         | 
| 54 | 
            -
                
         | 
| 55 | 
            -
                # Refreshes the underlying stores used by the space.
         | 
| 56 | 
            -
                def refresh
         | 
| 57 | 
            -
                  @int_var_store = nil
         | 
| 58 | 
            -
                  @bool_var_store = nil
         | 
| 59 | 
            -
                  @set_var_store = nil
         | 
| 60 | 
            -
                end
         | 
| 61 | 
            -
                
         | 
| 62 | 
            -
                private
         | 
| 63 | 
            -
                
         | 
| 64 | 
            -
                # Retrieves the store used for integer variables. Creates one if none
         | 
| 65 | 
            -
                # exists.
         | 
| 66 | 
            -
                def int_var_store
         | 
| 67 | 
            -
                  # TODO: caching interferes with the variable creation during BAB-search,
         | 
| 68 | 
            -
                  # find out why.
         | 
| 69 | 
            -
                  #if @int_var_store.nil?
         | 
| 70 | 
            -
                    @int_var_store = Gecode::Util::IntVarStore.new(self) 
         | 
| 71 | 
            -
                  #end
         | 
| 72 | 
            -
                  return @int_var_store
         | 
| 73 | 
            -
                end
         | 
| 74 | 
            -
                
         | 
| 75 | 
            -
                # Retrieves the store used for boolean variables. Creates one if none
         | 
| 76 | 
            -
                # exists.
         | 
| 77 | 
            -
                def bool_var_store
         | 
| 78 | 
            -
                  #if @bool_var_store.nil?
         | 
| 79 | 
            -
                    @bool_var_store = Gecode::Util::BoolVarStore.new(self) 
         | 
| 80 | 
            -
                  #end
         | 
| 81 | 
            -
                  return @bool_var_store
         | 
| 82 | 
            -
                end
         | 
| 83 | 
            -
                
         | 
| 84 | 
            -
                # Retrieves the store used for set variables. Creates one if none exists.
         | 
| 85 | 
            -
                def set_var_store
         | 
| 86 | 
            -
                  #if @set_var_store.nil?
         | 
| 87 | 
            -
                    @set_var_store = Gecode::Util::SetVarStore.new(self) 
         | 
| 88 | 
            -
                  #end
         | 
| 89 | 
            -
                  return @set_var_store
         | 
| 90 | 
            -
                end
         | 
| 91 | 
            -
              end
         | 
| 92 | 
            -
            end
         | 
| 93 | 
            -
             | 
| 94 | 
            -
            module Gecode
         | 
| 95 | 
            -
              # Various utility (mainly used to change the behavior of the raw bindings).
         | 
| 96 | 
            -
              module Util #:nodoc: all
         | 
| 97 | 
            -
                # Provides common methods to the variable stores. The stores must provide
         | 
| 98 | 
            -
                # @next_index, @var_array, @size, ARRAY_IDENTIFIER and #new_storage_array .
         | 
| 99 | 
            -
                module VarStoreMethods
         | 
| 100 | 
            -
                  # Returns the int var with the specified index, nil if none exists.
         | 
| 101 | 
            -
                  def [](index)
         | 
| 102 | 
            -
                    if index < 0 or index >= @next_index
         | 
| 103 | 
            -
                      return nil
         | 
| 104 | 
            -
                    end
         | 
| 105 | 
            -
                    return @var_array.at(index)
         | 
| 106 | 
            -
                  end
         | 
| 107 | 
            -
                  
         | 
| 108 | 
            -
                  private
         | 
| 109 | 
            -
                  
         | 
| 110 | 
            -
                  # Grows the store to the new size.
         | 
| 111 | 
            -
                  def grow(new_size)
         | 
| 112 | 
            -
                    @var_array.enlargeArray(@space, new_size - @size)
         | 
| 113 | 
            -
                    @size = new_size
         | 
| 114 | 
            -
                  end
         | 
| 115 | 
            -
                end
         | 
| 116 | 
            -
              
         | 
| 117 | 
            -
                # A store in which int variables are created and stored.
         | 
| 118 | 
            -
                class IntVarStore
         | 
| 119 | 
            -
                  # Design note: The store used to double its size when it needed to grow
         | 
| 120 | 
            -
                  # leaving unallocated slots (in rev 16). This was changed to only growing
         | 
| 121 | 
            -
                  # the amount of space needed because the additional information about which
         | 
| 122 | 
            -
                  # slot is the next unallocated one could not be encoded without changes to
         | 
| 123 | 
            -
                  # the bindings (and without that information we can not deduce the store
         | 
| 124 | 
            -
                  # from the new copy of space). So for additional performance the bindings 
         | 
| 125 | 
            -
                  # should grow the array more than needed (when this is moved to the bindings).
         | 
| 126 | 
            -
                  
         | 
| 127 | 
            -
                  include VarStoreMethods
         | 
| 128 | 
            -
                  
         | 
| 129 | 
            -
                  private
         | 
| 130 | 
            -
                
         | 
| 131 | 
            -
                  # A string that identifies the array used by the store.
         | 
| 132 | 
            -
                  ARRAY_IDENTIFIER = 'int_array'
         | 
| 133 | 
            -
                
         | 
| 134 | 
            -
                  public
         | 
| 135 | 
            -
                  
         | 
| 136 | 
            -
                  # Creates a store for the specified space with the specified capacit.
         | 
| 137 | 
            -
                  def initialize(space)
         | 
| 138 | 
            -
                    @space = space
         | 
| 139 | 
            -
                    
         | 
| 140 | 
            -
                    @var_array = space.int_var_array(ARRAY_IDENTIFIER)
         | 
| 141 | 
            -
                    if @var_array.nil?
         | 
| 142 | 
            -
                      # Create a new one.
         | 
| 143 | 
            -
                      @var_array = new_storage_array(0)
         | 
| 144 | 
            -
                    end
         | 
| 145 | 
            -
              
         | 
| 146 | 
            -
                    @size = @var_array.size
         | 
| 147 | 
            -
                    @next_index = @size
         | 
| 148 | 
            -
                  end
         | 
| 149 | 
            -
                  
         | 
| 150 | 
            -
                  # Creates the specified number of integer variables in the space with the
         | 
| 151 | 
            -
                  # specified domain. Returns the indices with which they can then be 
         | 
| 152 | 
            -
                  # accessed using int_var. The domain can be given as a Range (trated 
         | 
| 153 | 
            -
                  # specially) or as another enum.
         | 
| 154 | 
            -
                  def new_vars(domain, count = 1)
         | 
| 155 | 
            -
                    grow(@next_index + count) # See the design note for more information.
         | 
| 156 | 
            -
                    count.times do |i|
         | 
| 157 | 
            -
                      if domain.kind_of? Range
         | 
| 158 | 
            -
                        domain_params = [domain.first, domain.last] 
         | 
| 159 | 
            -
                      elsif domain.kind_of? Enumerable
         | 
| 160 | 
            -
                        arr = domain.to_a
         | 
| 161 | 
            -
                        domain_params = [Gecode::Raw::IntSet.new(arr, arr.size)]
         | 
| 162 | 
            -
                      else
         | 
| 163 | 
            -
                        raise TypeError, "Expected Enumerable, got #{domain.class}."
         | 
| 164 | 
            -
                      end
         | 
| 165 | 
            -
             | 
| 166 | 
            -
                      @var_array[@next_index] = Gecode::Raw::IntVar.new(@space, 
         | 
| 167 | 
            -
                        *domain_params)
         | 
| 168 | 
            -
                      @next_index += 1
         | 
| 169 | 
            -
                    end
         | 
| 170 | 
            -
                    
         | 
| 171 | 
            -
                    ((@next_index - count)...@next_index).to_a
         | 
| 172 | 
            -
                  end
         | 
| 173 | 
            -
              
         | 
| 174 | 
            -
                  # Returns the int var with the specified index, nil if none exists.
         | 
| 175 | 
            -
                  def [](index)
         | 
| 176 | 
            -
                    if index < 0 or index >= @next_index
         | 
| 177 | 
            -
                      return nil
         | 
| 178 | 
            -
                    end
         | 
| 179 | 
            -
                    return @var_array.at(index)
         | 
| 180 | 
            -
                  end
         | 
| 181 | 
            -
              
         | 
| 182 | 
            -
                  private
         | 
| 183 | 
            -
                  
         | 
| 184 | 
            -
                  # Creates a new storage array for int variables.
         | 
| 185 | 
            -
                  def new_storage_array(new_size)
         | 
| 186 | 
            -
                    arr = Gecode::Raw::IntVarArray.new(@space, new_size)
         | 
| 187 | 
            -
                    @space.own(arr, ARRAY_IDENTIFIER)
         | 
| 188 | 
            -
                    return arr
         | 
| 189 | 
            -
                  end
         | 
| 190 | 
            -
                end
         | 
| 191 | 
            -
                
         | 
| 192 | 
            -
                # A store in which int variables are created and stored.
         | 
| 193 | 
            -
                class BoolVarStore
         | 
| 194 | 
            -
                  # TODO: can we refactor this better seeing as IntVarStore and BoolVarStore
         | 
| 195 | 
            -
                  # are similar?
         | 
| 196 | 
            -
                  
         | 
| 197 | 
            -
                  include VarStoreMethods
         | 
| 198 | 
            -
                  
         | 
| 199 | 
            -
                  private
         | 
| 200 | 
            -
                
         | 
| 201 | 
            -
                  # A string that identifies the array used by the store.
         | 
| 202 | 
            -
                  ARRAY_IDENTIFIER = 'bool_array'
         | 
| 203 | 
            -
                
         | 
| 204 | 
            -
                  public
         | 
| 205 | 
            -
                  
         | 
| 206 | 
            -
                  # Creates a store for the specified space with the specified capacit.
         | 
| 207 | 
            -
                  def initialize(space)
         | 
| 208 | 
            -
                    @space = space
         | 
| 209 | 
            -
                  
         | 
| 210 | 
            -
                    @var_array = space.bool_var_array(ARRAY_IDENTIFIER)
         | 
| 211 | 
            -
                    if @var_array.nil?
         | 
| 212 | 
            -
                      # Create a new one.
         | 
| 213 | 
            -
                      @var_array = new_storage_array(0)
         | 
| 214 | 
            -
                    end
         | 
| 215 | 
            -
              
         | 
| 216 | 
            -
                    @size = @var_array.size
         | 
| 217 | 
            -
                    @next_index = @size
         | 
| 218 | 
            -
                  end
         | 
| 219 | 
            -
                  
         | 
| 220 | 
            -
                  # Creates the specified number of new bool variables. Returns the indices 
         | 
| 221 | 
            -
                  # of the created variables as an array.
         | 
| 222 | 
            -
                  def new_vars(count = 1)
         | 
| 223 | 
            -
                    grow(@next_index + count) # See the design note for more information.
         | 
| 224 | 
            -
                    count.times do |i|
         | 
| 225 | 
            -
                      @var_array[@next_index] = Gecode::Raw::BoolVar.new(@space, 0, 1)
         | 
| 226 | 
            -
                      @next_index += 1
         | 
| 227 | 
            -
                    end
         | 
| 228 | 
            -
                    
         | 
| 229 | 
            -
                    ((@next_index - count)...@next_index).to_a
         | 
| 230 | 
            -
                  end
         | 
| 231 | 
            -
              
         | 
| 232 | 
            -
                  private
         | 
| 233 | 
            -
                  
         | 
| 234 | 
            -
                  # Creates a new storage array for bool variables.
         | 
| 235 | 
            -
                  def new_storage_array(new_size)
         | 
| 236 | 
            -
                    arr = Gecode::Raw::BoolVarArray.new(@space, new_size)
         | 
| 237 | 
            -
                    @space.own(arr, ARRAY_IDENTIFIER)
         | 
| 238 | 
            -
                    return arr
         | 
| 239 | 
            -
                  end
         | 
| 240 | 
            -
                end
         | 
| 241 | 
            -
                
         | 
| 242 | 
            -
                # A store in which int variables are created and stored.
         | 
| 243 | 
            -
                class SetVarStore
         | 
| 244 | 
            -
                  include VarStoreMethods
         | 
| 245 | 
            -
                  
         | 
| 246 | 
            -
                  private
         | 
| 247 | 
            -
                
         | 
| 248 | 
            -
                  # A string that identifies the array used by the store.
         | 
| 249 | 
            -
                  ARRAY_IDENTIFIER = 'set_array'
         | 
| 250 | 
            -
                
         | 
| 251 | 
            -
                  public
         | 
| 252 | 
            -
                  
         | 
| 253 | 
            -
                  # Creates a store for the specified space with the specified capacit.
         | 
| 254 | 
            -
                  def initialize(space)
         | 
| 255 | 
            -
                    @space = space
         | 
| 256 | 
            -
                  
         | 
| 257 | 
            -
                    @var_array = space.set_var_array(ARRAY_IDENTIFIER)
         | 
| 258 | 
            -
                    if @var_array.nil?
         | 
| 259 | 
            -
                      # Create a new one.
         | 
| 260 | 
            -
                      @var_array = new_storage_array(0)
         | 
| 261 | 
            -
                    end
         | 
| 262 | 
            -
              
         | 
| 263 | 
            -
                    @size = @var_array.size
         | 
| 264 | 
            -
                    @next_index = @size
         | 
| 265 | 
            -
                  end
         | 
| 266 | 
            -
                  
         | 
| 267 | 
            -
                  # Creates the specified number of set variables in the space with the 
         | 
| 268 | 
            -
                  # specified domain for greatest lower bound and least upper bound 
         | 
| 269 | 
            -
                  # (specified as either a range or enum). A range for the allowed 
         | 
| 270 | 
            -
                  # cardinality of the set can also be specified, if none is specified, or 
         | 
| 271 | 
            -
                  # nil is given, then the default range (anything) will be used. Returns 
         | 
| 272 | 
            -
                  # the indices with which they can then be accessed using set_var.
         | 
| 273 | 
            -
                  def new_vars(glb_domain, lub_domain, cardinality_range = nil, count = 1)
         | 
| 274 | 
            -
                    grow(@next_index + count) # See the design note for more information.
         | 
| 275 | 
            -
             | 
| 276 | 
            -
                    if cardinality_range.nil?
         | 
| 277 | 
            -
                      cardinality_range = 0..Gecode::Raw::SetLimits::CARD
         | 
| 278 | 
            -
                    end
         | 
| 279 | 
            -
                    
         | 
| 280 | 
            -
                    params = [@space]
         | 
| 281 | 
            -
                    params << domain_to_args(glb_domain)
         | 
| 282 | 
            -
                    params << domain_to_args(lub_domain)
         | 
| 283 | 
            -
                    params << cardinality_range.first << cardinality_range.last
         | 
| 284 | 
            -
                    count.times do |i|
         | 
| 285 | 
            -
                      @var_array[@next_index] = Gecode::Raw::SetVar.new(*params.flatten)
         | 
| 286 | 
            -
                      @next_index += 1
         | 
| 287 | 
            -
                    end
         | 
| 288 | 
            -
                    
         | 
| 289 | 
            -
                    ((@next_index - count)...@next_index).to_a
         | 
| 290 | 
            -
                  end
         | 
| 291 | 
            -
              
         | 
| 292 | 
            -
                  private
         | 
| 293 | 
            -
                  
         | 
| 294 | 
            -
                  # Transforms a lub or glb domain given as a fixnum, range or enumeration 
         | 
| 295 | 
            -
                  # into one or more parameters that describe the domain to 
         | 
| 296 | 
            -
                  # Gecode::Raw::SetVar .
         | 
| 297 | 
            -
                  def domain_to_args(domain)
         | 
| 298 | 
            -
                    Gecode::Constraints::Util.constant_set_to_int_set(domain)
         | 
| 299 | 
            -
                  end
         | 
| 300 | 
            -
                  
         | 
| 301 | 
            -
                  # Creates a new storage array for bool variables.
         | 
| 302 | 
            -
                  def new_storage_array(new_size)
         | 
| 303 | 
            -
                    arr = Gecode::Raw::SetVarArray.new(@space, new_size)
         | 
| 304 | 
            -
                    @space.own(arr, ARRAY_IDENTIFIER)
         | 
| 305 | 
            -
                    return arr
         | 
| 306 | 
            -
                  end
         | 
| 307 | 
            -
                end
         | 
| 308 8 | 
             
              end
         | 
| 309 9 | 
             
            end
         |