gecoder 0.8.2 → 0.8.3

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.
Files changed (38) hide show
  1. data/CHANGES +14 -0
  2. data/ext/gecoder.cpp +181 -0
  3. data/ext/gecoder.h +94 -0
  4. data/ext/vararray.cpp +3 -3
  5. data/lib/gecoder/bindings/bindings.rb +104 -46
  6. data/lib/gecoder/interface/binding_changes.rb +1 -301
  7. data/lib/gecoder/interface/branch.rb +15 -11
  8. data/lib/gecoder/interface/constraints/bool/boolean.rb +56 -52
  9. data/lib/gecoder/interface/constraints/bool/channel.rb +1 -16
  10. data/lib/gecoder/interface/constraints/bool_enum/channel.rb +13 -8
  11. data/lib/gecoder/interface/constraints/bool_enum/extensional.rb +48 -0
  12. data/lib/gecoder/interface/constraints/extensional_regexp.rb +101 -0
  13. data/lib/gecoder/interface/constraints/int/channel.rb +1 -13
  14. data/lib/gecoder/interface/constraints/int_enum/channel.rb +15 -35
  15. data/lib/gecoder/interface/constraints/int_enum/extensional.rb +130 -0
  16. data/lib/gecoder/interface/constraints/set/channel.rb +54 -0
  17. data/lib/gecoder/interface/constraints/set_enum/channel.rb +37 -6
  18. data/lib/gecoder/interface/constraints/set_var_constraints.rb +1 -0
  19. data/lib/gecoder/interface/constraints.rb +38 -0
  20. data/lib/gecoder/interface/model.rb +110 -85
  21. data/lib/gecoder/interface/variables.rb +3 -21
  22. data/lib/gecoder/version.rb +1 -1
  23. data/specs/branch.rb +16 -1
  24. data/specs/constraints/bool_enum_relation.rb +6 -6
  25. data/specs/constraints/boolean.rb +31 -25
  26. data/specs/constraints/channel.rb +102 -4
  27. data/specs/constraints/extensional.rb +185 -2
  28. data/specs/constraints/reification_sugar.rb +2 -46
  29. data/specs/model.rb +85 -7
  30. data/tasks/dependencies.txt +1 -0
  31. data/vendor/rust/rust/class.rb +33 -35
  32. data/vendor/rust/rust/templates/ClassDeclarations.rusttpl +1 -1
  33. data/vendor/rust/rust/templates/CxxClassDefinitions.rusttpl +10 -1
  34. metadata +185 -184
  35. data/example/raw_bindings.rb +0 -44
  36. data/ext/missing.cpp +0 -328
  37. data/ext/missing.h +0 -120
  38. 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/ext/gecoder.cpp ADDED
@@ -0,0 +1,181 @@
1
+ /**
2
+ * Gecode/R, a Ruby interface to Gecode.
3
+ * Copyright (C) 2007 The Gecode/R development team.
4
+ *
5
+ * This library is free software; you can redistribute it and/or
6
+ * modify it under the terms of the GNU Lesser General Public
7
+ * License as published by the Free Software Foundation; either
8
+ * version 2.1 of the License, or (at your option) any later version.
9
+ *
10
+ * This library is distributed in the hope that it will be useful,
11
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
12
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13
+ * Lesser General Public License for more details.
14
+ *
15
+ * You should have received a copy of the GNU Lesser General Public
16
+ * License along with this library; if not, write to the Free Software
17
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
18
+ **/
19
+
20
+ #include "gecoder.h"
21
+ #include "gecode.hh"
22
+
23
+ #include <iostream>
24
+ #include <map>
25
+
26
+ namespace Gecode {
27
+ MSpace::MSpace() {
28
+ }
29
+
30
+ MSpace::MSpace(bool share, MSpace& s) : Gecode::Space(share, s) {
31
+ int_variables.update(this, share, s.int_variables);
32
+ bool_variables.update(this, share, s.bool_variables);
33
+ set_variables.update(this, share, s.set_variables);
34
+ }
35
+
36
+ MSpace::~MSpace() {
37
+ #ifdef DEBUG
38
+ fprintf(stderr, "gecoder: destructing MSpace %p\n", this);
39
+ #endif
40
+ }
41
+
42
+ Gecode::Space* MSpace::copy(bool share) {
43
+ return new MSpace(share, *this);
44
+ }
45
+
46
+ /*
47
+ * Creates a new integer variable with the specified domain and
48
+ * returns its identifier.
49
+ */
50
+ int MSpace::new_int_var(int min, int max) {
51
+ int id = int_variables.size();
52
+ Gecode::IntVar* var = new IntVar(this, min, max);
53
+ int_variables.add(this, *var);
54
+ return id;
55
+ }
56
+ int MSpace::new_int_var(IntSet domain) {
57
+ int id = int_variables.size();
58
+ Gecode::IntVar* var = new IntVar(this, domain);
59
+ int_variables.add(this, *var);
60
+ return id;
61
+ }
62
+
63
+ /*
64
+ * Creates a new boolean variable and returns its identifier.
65
+ */
66
+ int MSpace::new_bool_var() {
67
+ int id = bool_variables.size();
68
+ Gecode::BoolVar* var = new BoolVar(this, 0, 1);
69
+ bool_variables.add(this, *var);
70
+ return id;
71
+ }
72
+
73
+ /*
74
+ * Creates a new set variable with the specified domain and returns
75
+ * its identifier.
76
+ */
77
+ int MSpace::new_set_var(const IntSet& glb, const IntSet& lub, unsigned int card_min, unsigned int card_max) {
78
+ int id = set_variables.size();
79
+ Gecode::SetVar* var = new SetVar(this, glb, lub, card_min, card_max);
80
+ set_variables.add(this, *var);
81
+ return id;
82
+ }
83
+
84
+ /*
85
+ * Fetches the integer variable with the specified identifier.
86
+ */
87
+ Gecode::IntVar* MSpace::int_var(int id) {
88
+ return &int_variables[id];
89
+ }
90
+
91
+ /*
92
+ * Fetches the integer variable with the specified identifier.
93
+ */
94
+ Gecode::BoolVar* MSpace::bool_var(int id) {
95
+ return &bool_variables[id];
96
+ }
97
+
98
+ /*
99
+ * Fetches the integer variable with the specified identifier.
100
+ */
101
+ Gecode::SetVar* MSpace::set_var(int id) {
102
+ return &set_variables[id];
103
+ }
104
+
105
+ void MSpace::gc_mark() {
106
+ for(int i = 0; i < int_variables.size(); i++) {
107
+ rb_gc_mark(Rust_gecode::cxx2ruby(&int_variables[i], false, false));
108
+ }
109
+ for(int i = 0; i < bool_variables.size(); i++) {
110
+ rb_gc_mark(Rust_gecode::cxx2ruby(&bool_variables[i], false, false));
111
+ }
112
+ for(int i = 0; i < set_variables.size(); i++) {
113
+ rb_gc_mark(Rust_gecode::cxx2ruby(&set_variables[i], false, false));
114
+ }
115
+ }
116
+
117
+ // For BAB.
118
+ void MSpace::constrain(MSpace* s) {
119
+ // Call Ruby's constrain.
120
+ rb_funcall(Rust_gecode::cxx2ruby(this), rb_intern("constrain"), 1,
121
+ Rust_gecode::cxx2ruby(s, false));
122
+ }
123
+
124
+ /*
125
+ * MDFS is the same as DFS but with the size of a space inferred from the
126
+ * other arguments, since it can't be done from the Ruby side.
127
+ */
128
+ MDFS::MDFS(MSpace* space, unsigned int c_d, unsigned int a_d, Search::Stop* st) : Gecode::Search::DFS(space, c_d, a_d, st, sizeof(space)) {
129
+ }
130
+
131
+ MDFS::~MDFS() {
132
+ }
133
+
134
+ /*
135
+ * MBAB is the same as BAB but with the size of a space inferred from the
136
+ * other arguments, since it can't be done from the Ruby side.
137
+ */
138
+ MBAB::MBAB(MSpace* space, const Search::Options &o) : Gecode::BAB<MSpace>(space, o) {
139
+ }
140
+
141
+ MBAB::~MBAB() {
142
+ }
143
+
144
+ namespace Search {
145
+ /*
146
+ * MStop combines the time stop and fail stop, but for what reason?
147
+ * TODO: Try removing MStop, replacing it with plain Stop objects.
148
+ */
149
+
150
+ struct MStop::Private {
151
+ Gecode::Search::TimeStop* ts;
152
+ Gecode::Search::FailStop* fs;
153
+ };
154
+
155
+ MStop::MStop() : d(new Private) {
156
+ d->ts = 0;
157
+ d->fs = 0;
158
+ }
159
+
160
+ MStop::MStop(int fails, int time) : d(new Private) {
161
+ d->ts = new Search::TimeStop(time);
162
+ d->fs = new Search::FailStop(fails);
163
+ }
164
+
165
+ MStop::~MStop() {
166
+ }
167
+
168
+ bool MStop::stop(const Gecode::Search::Statistics &s) {
169
+ if (!d->fs && !d->ts) return false;
170
+ return d->fs->stop(s) || d->ts->stop(s);
171
+ }
172
+
173
+ Gecode::Search::Stop* MStop::create(int fails, int time) {
174
+ if (fails < 0 && time < 0) return 0;
175
+ if (fails < 0) return new Search::TimeStop(time);
176
+ if (time < 0) return new Search::FailStop(fails);
177
+
178
+ return new MStop(fails, time);
179
+ }
180
+ }
181
+ }
data/ext/gecoder.h ADDED
@@ -0,0 +1,94 @@
1
+ /**
2
+ * Gecode/R, a Ruby interface to Gecode.
3
+ * Copyright (C) 2007 The Gecode/R development team.
4
+ *
5
+ * This library is free software; you can redistribute it and/or
6
+ * modify it under the terms of the GNU Lesser General Public
7
+ * License as published by the Free Software Foundation; either
8
+ * version 2.1 of the License, or (at your option) any later version.
9
+ *
10
+ * This library is distributed in the hope that it will be useful,
11
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
12
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13
+ * Lesser General Public License for more details.
14
+ *
15
+ * You should have received a copy of the GNU Lesser General Public
16
+ * License along with this library; if not, write to the Free Software
17
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
18
+ **/
19
+
20
+ #ifndef __GECODER_H
21
+ #define __GECODER_H
22
+
23
+ #include <ruby.h>
24
+
25
+ #include <gecode/kernel.hh>
26
+ #include <gecode/int.hh>
27
+ #include <gecode/search.hh>
28
+ #include <gecode/minimodel.hh>
29
+ #include <gecode/set.hh>
30
+
31
+ #include "vararray.h"
32
+
33
+ namespace Gecode {
34
+ class MSpace : public Space {
35
+ public:
36
+ MSpace();
37
+ MSpace(bool share, MSpace& s);
38
+ ~MSpace();
39
+ Gecode::Space *copy(bool share);
40
+
41
+ int new_int_var(int min, int max);
42
+ int new_int_var(IntSet domain);
43
+ Gecode::IntVar* int_var(int id);
44
+
45
+ int new_bool_var();
46
+ Gecode::BoolVar* bool_var(int id);
47
+
48
+ int new_set_var(const IntSet& glb, const IntSet& lub, unsigned int card_min, unsigned int card_max);
49
+ Gecode::SetVar* set_var(int id);
50
+
51
+ void gc_mark();
52
+
53
+ void constrain(MSpace* s);
54
+
55
+ private:
56
+ Gecode::IntVarArray int_variables;
57
+ Gecode::BoolVarArray bool_variables;
58
+ Gecode::SetVarArray set_variables;
59
+ };
60
+
61
+ class MDFS : public Gecode::Search::DFS {
62
+ public:
63
+ MDFS(MSpace *space, unsigned int c_d, unsigned int a_d, Search::Stop* st = 0);
64
+ ~MDFS();
65
+ };
66
+
67
+ class MBAB : public Gecode::BAB<MSpace> {
68
+ public:
69
+ MBAB(MSpace* space, const Search::Options &o);
70
+ ~MBAB();
71
+ };
72
+
73
+ namespace Search {
74
+ class MStop : public Gecode::Search::Stop {
75
+ private:
76
+ MStop(int fails, int time);
77
+
78
+ public:
79
+ MStop();
80
+ ~MStop();
81
+
82
+ bool stop (const Gecode::Search::Statistics &s);
83
+ static Gecode::Search::Stop* create(int fails, int time);
84
+
85
+ private:
86
+ struct Private;
87
+ Private *const d;
88
+ };
89
+ }
90
+ }
91
+
92
+ #endif
93
+
94
+
data/ext/vararray.cpp CHANGED
@@ -133,7 +133,7 @@ IntVar &MIntVarArray::operator [](int index)
133
133
  void MIntVarArray::gc_mark()
134
134
  {
135
135
  for(int i = size(); i--; ) {
136
- rb_gc_mark(Rust_gecode::cxx2ruby(&(d->array[i])));
136
+ rb_gc_mark(Rust_gecode::cxx2ruby(&(d->array[i]), false, false));
137
137
  }
138
138
  }
139
139
 
@@ -210,7 +210,7 @@ Gecode::BoolVar &MBoolVarArray::operator[](int index)
210
210
  void MBoolVarArray::gc_mark()
211
211
  {
212
212
  for(int i = size(); i--; ) {
213
- rb_gc_mark(Rust_gecode::cxx2ruby(&(d->array[i])));
213
+ rb_gc_mark(Rust_gecode::cxx2ruby(&(d->array[i]), false, false));
214
214
  }
215
215
  }
216
216
 
@@ -306,7 +306,7 @@ Gecode::SetVar &MSetVarArray::operator[](int index)
306
306
  void MSetVarArray::gc_mark()
307
307
  {
308
308
  for(int i = size(); i--; ) {
309
- rb_gc_mark(Rust_gecode::cxx2ruby(&(d->array[i])));
309
+ rb_gc_mark(Rust_gecode::cxx2ruby(&(d->array[i]), false, false));
310
310
  }
311
311
  }
312
312
 
@@ -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 'missing.h', Rust::Bindings::HeaderLocal
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 "own" do |method|
374
- method.add_parameter "Gecode::MIntVarArray *", "x"
375
- method.add_parameter "char*", "name"
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 "own" do |method|
379
- method.add_parameter "Gecode::MBoolVarArray *", "x"
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 "own" do |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 "intVarArray", "Gecode::MIntVarArray *" do |method|
389
- method.add_parameter "char *", "name"
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 "boolVarArray", "Gecode::MBoolVarArray *" do |method|
393
- method.add_parameter "char *", "name"
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 "setVarArray", "Gecode::MSetVarArray *" do |method|
397
- method.add_parameter "char *", "name"
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
- # ns.add_function "regular", "void" do |func|
1280
- # func.add_parameter "Gecode::MSpace*", "home"
1281
- # func.add_parameter "Gecode::MIntVarArray *", "x" do |param|
1282
- # param.custom_conversion = "*ruby2Gecode_MIntVarArrayPtr(argv[1], 2)->ptr()"
1283
- # end
1284
- # func.add_parameter "Gecode::DFA", "dfa" # TODO: add class DFA
1285
- # func.add_parameter "Gecode::IntConLevel", "icl", true
1286
- # end
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"