| 
									
										
										
										
											2011-08-08 15:21:36 +02:00
										 |  |  | // -*- c++ -*-
 | 
					
						
							|  |  |  | //=============================================================================
 | 
					
						
							|  |  |  | // Copyright (C) 2011 by Denys Duchier
 | 
					
						
							|  |  |  | //
 | 
					
						
							|  |  |  | // This program is free software: you can redistribute it and/or modify it
 | 
					
						
							|  |  |  | // under the terms of the GNU Lesser General Public License as published by the
 | 
					
						
							|  |  |  | // Free Software Foundation, either version 3 of the License, or (at your
 | 
					
						
							|  |  |  | // option) any later version.
 | 
					
						
							|  |  |  | // 
 | 
					
						
							|  |  |  | // This program is distributed in the hope that it will be useful, but WITHOUT
 | 
					
						
							|  |  |  | // ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
 | 
					
						
							|  |  |  | // FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
 | 
					
						
							|  |  |  | // more details.
 | 
					
						
							|  |  |  | // 
 | 
					
						
							|  |  |  | // You should have received a copy of the GNU Lesser General Public License
 | 
					
						
							|  |  |  | // along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | 
					
						
							|  |  |  | //=============================================================================
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include "gecode-common.icc"
 | 
					
						
							|  |  |  | #include <iostream>
 | 
					
						
							|  |  |  | using namespace std; | 
					
						
							|  |  |  | using namespace generic_gecode; | 
					
						
							|  |  |  | using namespace Gecode; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-08-09 16:30:59 +02:00
										 |  |  | extern "C" | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | #include "config.h"
 | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | namespace generic_gecode | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | #ifndef HAVE_DYNARRAY
 | 
					
						
							|  |  |  |   template <typename T> struct DynArray | 
					
						
							|  |  |  |   { | 
					
						
							|  |  |  |     T* _array; | 
					
						
							|  |  |  |     DynArray(int n): _array(new T[n]) {} | 
					
						
							|  |  |  |     ~DynArray() { delete[] _array; } | 
					
						
							|  |  |  |     T& operator[](int i) { return _array[i]; } | 
					
						
							|  |  |  |   }; | 
					
						
							|  |  |  | #define DYNARRAY(T,A,N) DynArray<T> A(N)
 | 
					
						
							|  |  |  | #else
 | 
					
						
							|  |  |  | #define DYNARRAY(T,A,N) T A[N]
 | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #ifndef HAVE_DYNARRAY
 | 
					
						
							|  |  |  |   struct SpecArray | 
					
						
							|  |  |  |   { | 
					
						
							|  |  |  |     int (*_array)[2]; | 
					
						
							|  |  |  |     SpecArray(int n): _array((int (*)[2]) new int[n*2]) {} | 
					
						
							|  |  |  |     ~SpecArray() { delete[] _array; } | 
					
						
							|  |  |  |     int& operator()(int i,int j) { return _array[i][j]; } | 
					
						
							|  |  |  |   }; | 
					
						
							|  |  |  | #define SPECARRAY(A,N) SpecArray A(N)
 | 
					
						
							|  |  |  | #define SPECARRAYELEM(A,I,J) A(I,J)
 | 
					
						
							|  |  |  | #define SPECARRAYDEREF(A) A._array
 | 
					
						
							|  |  |  | #else
 | 
					
						
							|  |  |  | #define SPECARRAY(A,N) int A[N][2]
 | 
					
						
							|  |  |  | #define SPECARRAYELEM(A,I,J) A[I][J]
 | 
					
						
							|  |  |  | #define SPECARRAYDEREF(A) A
 | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-08-08 15:21:36 +02:00
										 |  |  | extern "C" | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | #include "SWI-Stream.h"
 | 
					
						
							|  |  |  | #include "YapInterface.h"
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   static YAP_opaque_tag_t gecode_space_tag; | 
					
						
							|  |  |  |   static YAP_opaque_handler_t gecode_space_handler; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   static int gecode_space_fail_handler(void* p) | 
					
						
							|  |  |  |   { | 
					
						
							|  |  |  |     delete *(GenericSpace**)p; | 
					
						
							|  |  |  |     return TRUE; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   static int | 
					
						
							|  |  |  |   gecode_space_write_handler | 
					
						
							|  |  |  |   (void *stream_, YAP_opaque_tag_t type, void *p, int flags) | 
					
						
							|  |  |  |   { | 
					
						
							|  |  |  |     IOSTREAM* stream = (IOSTREAM*) stream_; | 
					
						
							|  |  |  |     Sfprintf(stream,"<space %p>", p); | 
					
						
							|  |  |  |     return TRUE; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   static YAP_Term gecode_term_from_space(GenericSpace* s) | 
					
						
							|  |  |  |   { | 
					
						
							|  |  |  |     YAP_Term term = | 
					
						
							|  |  |  |       YAP_NewOpaqueObject(gecode_space_tag, sizeof(GenericSpace*)); | 
					
						
							|  |  |  |     GenericSpace** ptr = | 
					
						
							|  |  |  |       (GenericSpace**) YAP_OpaqueObjectFromTerm(term); | 
					
						
							|  |  |  |     *ptr = s; | 
					
						
							|  |  |  |     return term; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   static int gecode_new_space(void) | 
					
						
							|  |  |  |   { | 
					
						
							|  |  |  |     YAP_Term term = gecode_term_from_space(new GenericSpace); | 
					
						
							|  |  |  |     return YAP_Unify(YAP_ARG1, term); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #ifndef DISJUNCTOR
 | 
					
						
							|  |  |  |   static inline GenericSpace* | 
					
						
							|  |  |  |   gecode_Space_from_term(YAP_Term t) | 
					
						
							|  |  |  |   { | 
					
						
							|  |  |  |     return * (GenericSpace**) YAP_OpaqueObjectFromTerm(t); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | #else
 | 
					
						
							|  |  |  |   struct YapDisjunctor | 
					
						
							|  |  |  |   { | 
					
						
							|  |  |  |     GenericSpace* home; | 
					
						
							|  |  |  |     Disjunctor disj; | 
					
						
							|  |  |  |     YapDisjunctor(GenericSpace* home_) | 
					
						
							|  |  |  |       : home(home_), disj(*home_) {} | 
					
						
							|  |  |  |   }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   static YAP_opaque_tag_t gecode_disjunctor_tag; | 
					
						
							|  |  |  |   static YAP_opaque_handler_t gecode_disjunctor_handler; | 
					
						
							|  |  |  |   static YAP_opaque_tag_t gecode_disjunctor_clause_tag; | 
					
						
							|  |  |  |   static YAP_opaque_handler_t gecode_disjunctor_clause_handler; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   static inline Disjunctor& | 
					
						
							|  |  |  |   gecode_Disjunctor_from_term(YAP_Term t) | 
					
						
							|  |  |  |   { | 
					
						
							|  |  |  |     return ((YapDisjunctor*) YAP_OpaqueObjectFromTerm(t))->disj; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   static inline YapDisjunctor& | 
					
						
							|  |  |  |   gecode_YapDisjunctor_from_term(YAP_Term t) | 
					
						
							|  |  |  |   { | 
					
						
							|  |  |  |     return * (YapDisjunctor*) YAP_OpaqueObjectFromTerm(t); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   static inline Clause& | 
					
						
							|  |  |  |   gecode_Clause_from_term(YAP_Term t) | 
					
						
							|  |  |  |   { | 
					
						
							|  |  |  |     return * (Clause*) YAP_OpaqueObjectFromTerm(t); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   static inline GenericSpace* | 
					
						
							|  |  |  |   gecode_Space_from_term(YAP_Term t) | 
					
						
							|  |  |  |   { | 
					
						
							|  |  |  |     if (YAP_IsOpaqueObjectTerm(t, gecode_disjunctor_clause_tag)) | 
					
						
							|  |  |  |       { | 
					
						
							|  |  |  | 	Clause& c = gecode_Clause_from_term(t); | 
					
						
							|  |  |  | 	return & (GenericSpace&) c; | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  |     return * (GenericSpace**) YAP_OpaqueObjectFromTerm(t); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   static YAP_opaque_tag_t gecode_engine_tag; | 
					
						
							|  |  |  |   static YAP_opaque_handler_t gecode_engine_handler; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   static int gecode_new_engine(void) | 
					
						
							|  |  |  |   { | 
					
						
							|  |  |  |     YAP_Term arg1 = YAP_ARG1; | 
					
						
							|  |  |  |     YAP_Term arg2 = YAP_ARG2; | 
					
						
							| 
									
										
										
										
											2011-12-01 22:48:28 +01:00
										 |  |  |     YAP_Term arg3 = YAP_ARG3; | 
					
						
							|  |  |  |     bool restart = YAP_IntOfTerm(YAP_ArgOfTerm(1, arg3)); | 
					
						
							| 
									
										
										
										
											2011-12-03 22:04:04 +01:00
										 |  |  |     double threads = YAP_FloatOfTerm(YAP_ArgOfTerm(2, arg3)); | 
					
						
							|  |  |  |     unsigned int c_d = YAP_IntOfTerm(YAP_ArgOfTerm(3, arg3)); | 
					
						
							|  |  |  |     unsigned int a_d = YAP_IntOfTerm(YAP_ArgOfTerm(4, arg3)); | 
					
						
							|  |  |  |     Search::Options opt; | 
					
						
							|  |  |  |     opt.threads = threads; | 
					
						
							|  |  |  |     opt.c_d = c_d; | 
					
						
							|  |  |  |     opt.a_d = a_d; | 
					
						
							| 
									
										
										
										
											2011-08-08 15:21:36 +02:00
										 |  |  |     GenericSpace* space = gecode_Space_from_term(arg1); | 
					
						
							| 
									
										
										
										
											2011-12-03 22:04:04 +01:00
										 |  |  |     GenericEngine* engine = space->new_engine(restart,opt); | 
					
						
							| 
									
										
										
										
											2011-08-08 15:21:36 +02:00
										 |  |  |     YAP_Term y_engine = | 
					
						
							|  |  |  |       YAP_NewOpaqueObject(gecode_engine_tag, sizeof(GenericEngine*)); | 
					
						
							|  |  |  |     GenericEngine** ptr = | 
					
						
							|  |  |  |       (GenericEngine**) YAP_OpaqueObjectFromTerm(y_engine); | 
					
						
							|  |  |  |     *ptr = engine; | 
					
						
							|  |  |  |     return YAP_Unify(arg2, y_engine); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   static inline GenericEngine* | 
					
						
							|  |  |  |   gecode_engine_from_term(YAP_Term t) | 
					
						
							|  |  |  |   { | 
					
						
							|  |  |  |     return * (GenericEngine**) YAP_OpaqueObjectFromTerm(t); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   static int gecode_engine_fail_handler(void* p) | 
					
						
							|  |  |  |   { | 
					
						
							|  |  |  |     delete *(GenericEngine**)p; | 
					
						
							|  |  |  |     return TRUE; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   static int | 
					
						
							|  |  |  |   gecode_engine_write_handler | 
					
						
							|  |  |  |   (void *stream_, YAP_opaque_tag_t type, void *p, int flags) | 
					
						
							|  |  |  |   { | 
					
						
							|  |  |  |     IOSTREAM* stream = (IOSTREAM*) stream_; | 
					
						
							|  |  |  |     Sfprintf(stream,"<engine %p>", p); | 
					
						
							|  |  |  |     return TRUE; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   static int gecode_engine_search(void) | 
					
						
							|  |  |  |   { | 
					
						
							|  |  |  |     GenericEngine* engine = gecode_engine_from_term(YAP_ARG1); | 
					
						
							|  |  |  |     GenericSpace* space = engine->next(); | 
					
						
							|  |  |  |     if (space) | 
					
						
							|  |  |  |       { | 
					
						
							|  |  |  | 	YAP_Term term = gecode_term_from_space(space); | 
					
						
							|  |  |  | 	return YAP_Unify(YAP_ARG2, term); | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  |     else YAP_cut_fail(); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #ifdef DISJUNCTOR
 | 
					
						
							|  |  |  |   static int gecode_new_disjunctor(void) | 
					
						
							|  |  |  |   { | 
					
						
							|  |  |  |     YAP_Term result = YAP_ARG1; | 
					
						
							|  |  |  |     GenericSpace* space = gecode_Space_from_term(YAP_ARG2); | 
					
						
							|  |  |  |     YAP_Term term = | 
					
						
							|  |  |  |       YAP_NewOpaqueObject(gecode_disjunctor_tag, sizeof(YapDisjunctor)); | 
					
						
							|  |  |  |     new (YAP_OpaqueObjectFromTerm(term)) YapDisjunctor(space); | 
					
						
							|  |  |  |     return YAP_Unify(result, term); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   static int | 
					
						
							|  |  |  |   gecode_disjunctor_write_handler | 
					
						
							|  |  |  |   (void *stream_, YAP_opaque_tag_t type, void *p, int flags) | 
					
						
							|  |  |  |   { | 
					
						
							|  |  |  |     IOSTREAM* stream = (IOSTREAM*) stream_; | 
					
						
							|  |  |  |     Sfprintf(stream,"<disjunctor %p>", p); | 
					
						
							|  |  |  |     return TRUE; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   static int gecode_new_clause(void) | 
					
						
							|  |  |  |   { | 
					
						
							|  |  |  |     YAP_Term result = YAP_ARG1; | 
					
						
							|  |  |  |     YapDisjunctor& disj = gecode_YapDisjunctor_from_term(YAP_ARG2); | 
					
						
							|  |  |  |     YAP_Term term = | 
					
						
							|  |  |  |       YAP_NewOpaqueObject(gecode_disjunctor_clause_tag, sizeof(Clause)); | 
					
						
							|  |  |  |     new (YAP_OpaqueObjectFromTerm(term)) Clause(*disj.home,disj.disj); | 
					
						
							|  |  |  |     return YAP_Unify(result, term); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   static int | 
					
						
							|  |  |  |   gecode_clause_write_handler | 
					
						
							|  |  |  |   (void *stream_, YAP_opaque_tag_t type, void *p, int flags) | 
					
						
							|  |  |  |   { | 
					
						
							|  |  |  |     IOSTREAM* stream = (IOSTREAM*) stream_; | 
					
						
							|  |  |  |     Sfprintf(stream,"<clause %p>", p); | 
					
						
							|  |  |  |     return TRUE; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   static IntVar gecode_IntVar_from_term(GenericSpace*,YAP_Term); | 
					
						
							|  |  |  |   static BoolVar gecode_BoolVar_from_term(GenericSpace*,YAP_Term); | 
					
						
							|  |  |  |   static SetVar gecode_SetVar_from_term(GenericSpace*,YAP_Term); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   static int gecode_clause_intvar_forward(void) | 
					
						
							|  |  |  |   { | 
					
						
							|  |  |  |     Clause& clause = gecode_Clause_from_term(YAP_ARG1); | 
					
						
							|  |  |  |     GenericSpace* outer = clause.generic_parent(); | 
					
						
							|  |  |  |     GenericSpace* inner = clause.generic_space(); | 
					
						
							|  |  |  |     IntVar outer_var = gecode_IntVar_from_term(outer, YAP_ARG2); | 
					
						
							|  |  |  |     IntVar inner_var = gecode_IntVar_from_term(inner, YAP_ARG3); | 
					
						
							|  |  |  |     clause.forward(outer_var,inner_var); | 
					
						
							|  |  |  |     return TRUE; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   static int gecode_clause_boolvar_forward(void) | 
					
						
							|  |  |  |   { | 
					
						
							|  |  |  |     Clause& clause = gecode_Clause_from_term(YAP_ARG1); | 
					
						
							|  |  |  |     GenericSpace* outer = clause.generic_parent(); | 
					
						
							|  |  |  |     GenericSpace* inner = clause.generic_space(); | 
					
						
							|  |  |  |     BoolVar outer_var = gecode_BoolVar_from_term(outer, YAP_ARG2); | 
					
						
							|  |  |  |     BoolVar inner_var = gecode_BoolVar_from_term(inner, YAP_ARG3); | 
					
						
							|  |  |  |     clause.forward(outer_var,inner_var); | 
					
						
							|  |  |  |     return TRUE; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   static int gecode_clause_setvar_forward(void) | 
					
						
							|  |  |  |   { | 
					
						
							|  |  |  |     Clause& clause = gecode_Clause_from_term(YAP_ARG1); | 
					
						
							|  |  |  |     GenericSpace* outer = clause.generic_parent(); | 
					
						
							|  |  |  |     GenericSpace* inner = clause.generic_space(); | 
					
						
							|  |  |  |     SetVar outer_var = gecode_SetVar_from_term(outer, YAP_ARG2); | 
					
						
							|  |  |  |     SetVar inner_var = gecode_SetVar_from_term(inner, YAP_ARG3); | 
					
						
							|  |  |  |     clause.forward(outer_var,inner_var); | 
					
						
							|  |  |  |     return TRUE; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   static int gecode_new_intvar_from_bounds(void) | 
					
						
							|  |  |  |   { | 
					
						
							|  |  |  |     YAP_Term ivar = YAP_ARG1; | 
					
						
							|  |  |  |     GenericSpace* space = gecode_Space_from_term(YAP_ARG2); | 
					
						
							|  |  |  |     int lo = YAP_IntOfTerm(YAP_ARG3); | 
					
						
							|  |  |  |     int hi = YAP_IntOfTerm(YAP_ARG4); | 
					
						
							|  |  |  |     int i = space->new_ivar(lo, hi); | 
					
						
							|  |  |  |     YAP_Term y_i = YAP_MkIntTerm(i); | 
					
						
							|  |  |  |     return YAP_Unify(ivar, y_i); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   static int | 
					
						
							|  |  |  |   gecode_list_length(YAP_Term l) | 
					
						
							|  |  |  |   { | 
					
						
							|  |  |  |     int n = 0; | 
					
						
							|  |  |  |     while (YAP_IsPairTerm(l)) | 
					
						
							|  |  |  |       { | 
					
						
							|  |  |  | 	n += 1; | 
					
						
							|  |  |  | 	l = YAP_TailOfTerm(l); | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  |     return n; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   static IntSet | 
					
						
							|  |  |  |   gecode_IntSet_from_term(YAP_Term specs) | 
					
						
							|  |  |  |   { | 
					
						
							|  |  |  |     int n = gecode_list_length(specs); | 
					
						
							| 
									
										
										
										
											2011-08-09 15:03:45 +02:00
										 |  |  |     SPECARRAY(r,n); | 
					
						
							| 
									
										
										
										
											2011-08-08 15:21:36 +02:00
										 |  |  |     int i = 0; | 
					
						
							|  |  |  |     while (YAP_IsPairTerm(specs)) | 
					
						
							|  |  |  |       { | 
					
						
							|  |  |  | 	YAP_Term head = YAP_HeadOfTerm(specs); | 
					
						
							|  |  |  | 	specs = YAP_TailOfTerm(specs); | 
					
						
							| 
									
										
										
										
											2011-08-09 15:03:45 +02:00
										 |  |  | 	SPECARRAYELEM(r,i,0) = YAP_IntOfTerm(YAP_ArgOfTerm(1, head)); | 
					
						
							|  |  |  | 	SPECARRAYELEM(r,i,1) = YAP_IntOfTerm(YAP_ArgOfTerm(2, head)); | 
					
						
							| 
									
										
										
										
											2011-08-08 15:21:36 +02:00
										 |  |  | 	i += 1; | 
					
						
							|  |  |  |       } | 
					
						
							| 
									
										
										
										
											2011-08-09 16:30:59 +02:00
										 |  |  |     return IntSet(SPECARRAYDEREF(r), n); | 
					
						
							| 
									
										
										
										
											2011-08-08 15:21:36 +02:00
										 |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   static int gecode_new_intvar_from_intset(void) | 
					
						
							|  |  |  |   { | 
					
						
							|  |  |  |     YAP_Term ivar = YAP_ARG1; | 
					
						
							|  |  |  |     GenericSpace* space = gecode_Space_from_term(YAP_ARG2); | 
					
						
							|  |  |  |     YAP_Term specs = YAP_ARG3; | 
					
						
							|  |  |  |     IntSet iset = gecode_IntSet_from_term(specs); | 
					
						
							|  |  |  |     int i = space->new_ivar(iset); | 
					
						
							|  |  |  |     return YAP_Unify(ivar, YAP_MkIntTerm(i)); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   static int gecode_new_boolvar(void) | 
					
						
							|  |  |  |   { | 
					
						
							|  |  |  |     YAP_Term bvar = YAP_ARG1; | 
					
						
							|  |  |  |     GenericSpace* space = gecode_Space_from_term(YAP_ARG2); | 
					
						
							|  |  |  |     int i = space->new_bvar(); | 
					
						
							|  |  |  |     return YAP_Unify(bvar, YAP_MkIntTerm(i)); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   static int gecode_new_setvar_1(void) | 
					
						
							|  |  |  |   { | 
					
						
							|  |  |  |     YAP_Term result = YAP_ARG1; | 
					
						
							|  |  |  |     GenericSpace* space = gecode_Space_from_term(YAP_ARG2); | 
					
						
							|  |  |  |     int GlbMin = YAP_IntOfTerm(YAP_ARG3); | 
					
						
							|  |  |  |     int GlbMax = YAP_IntOfTerm(YAP_ARG4); | 
					
						
							|  |  |  |     int LubMin = YAP_IntOfTerm(YAP_ARG5); | 
					
						
							|  |  |  |     int LubMax = YAP_IntOfTerm(YAP_ARG6); | 
					
						
							|  |  |  |     int CardMin= YAP_IntOfTerm(YAP_ARG7); | 
					
						
							|  |  |  |     int CardMax= YAP_IntOfTerm(YAP_ARG8); | 
					
						
							|  |  |  |     int idx = space->new_svar(GlbMin,GlbMax,LubMin,LubMax,CardMin,CardMax); | 
					
						
							|  |  |  |     return YAP_Unify(result, YAP_MkIntTerm(idx)); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   static int gecode_new_setvar_2(void) | 
					
						
							|  |  |  |   { | 
					
						
							|  |  |  |     YAP_Term result = YAP_ARG1; | 
					
						
							|  |  |  |     GenericSpace* space = gecode_Space_from_term(YAP_ARG2); | 
					
						
							|  |  |  |     int GlbMin = YAP_IntOfTerm(YAP_ARG3); | 
					
						
							|  |  |  |     int GlbMax = YAP_IntOfTerm(YAP_ARG4); | 
					
						
							|  |  |  |     int LubMin = YAP_IntOfTerm(YAP_ARG5); | 
					
						
							|  |  |  |     int LubMax = YAP_IntOfTerm(YAP_ARG6); | 
					
						
							|  |  |  |     int CardMin= YAP_IntOfTerm(YAP_ARG7); | 
					
						
							|  |  |  |     int idx = space->new_svar(GlbMin,GlbMax,LubMin,LubMax,CardMin); | 
					
						
							|  |  |  |     return YAP_Unify(result, YAP_MkIntTerm(idx)); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   static int gecode_new_setvar_3(void) | 
					
						
							|  |  |  |   { | 
					
						
							|  |  |  |     YAP_Term result = YAP_ARG1; | 
					
						
							|  |  |  |     GenericSpace* space = gecode_Space_from_term(YAP_ARG2); | 
					
						
							|  |  |  |     int GlbMin = YAP_IntOfTerm(YAP_ARG3); | 
					
						
							|  |  |  |     int GlbMax = YAP_IntOfTerm(YAP_ARG4); | 
					
						
							|  |  |  |     int LubMin = YAP_IntOfTerm(YAP_ARG5); | 
					
						
							|  |  |  |     int LubMax = YAP_IntOfTerm(YAP_ARG6); | 
					
						
							|  |  |  |     int idx = space->new_svar(GlbMin,GlbMax,LubMin,LubMax); | 
					
						
							|  |  |  |     return YAP_Unify(result, YAP_MkIntTerm(idx)); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   static int gecode_new_setvar_4(void) | 
					
						
							|  |  |  |   { | 
					
						
							|  |  |  |     YAP_Term result = YAP_ARG1; | 
					
						
							|  |  |  |     GenericSpace* space = gecode_Space_from_term(YAP_ARG2); | 
					
						
							|  |  |  |     IntSet Glb = gecode_IntSet_from_term(YAP_ARG3); | 
					
						
							|  |  |  |     int LubMin = YAP_IntOfTerm(YAP_ARG4); | 
					
						
							|  |  |  |     int LubMax = YAP_IntOfTerm(YAP_ARG5); | 
					
						
							|  |  |  |     int CardMin = YAP_IntOfTerm(YAP_ARG6); | 
					
						
							|  |  |  |     int CardMax = YAP_IntOfTerm(YAP_ARG7); | 
					
						
							|  |  |  |     int idx = space->new_svar(Glb,LubMin,LubMax,CardMin,CardMax); | 
					
						
							|  |  |  |     return YAP_Unify(result, YAP_MkIntTerm(idx)); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   static int gecode_new_setvar_5(void) | 
					
						
							|  |  |  |   { | 
					
						
							|  |  |  |     YAP_Term result = YAP_ARG1; | 
					
						
							|  |  |  |     GenericSpace* space = gecode_Space_from_term(YAP_ARG2); | 
					
						
							|  |  |  |     IntSet Glb = gecode_IntSet_from_term(YAP_ARG3); | 
					
						
							|  |  |  |     int LubMin = YAP_IntOfTerm(YAP_ARG4); | 
					
						
							|  |  |  |     int LubMax = YAP_IntOfTerm(YAP_ARG5); | 
					
						
							|  |  |  |     int CardMin = YAP_IntOfTerm(YAP_ARG6); | 
					
						
							|  |  |  |     int idx = space->new_svar(Glb,LubMin,LubMax,CardMin); | 
					
						
							|  |  |  |     return YAP_Unify(result, YAP_MkIntTerm(idx)); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   static int gecode_new_setvar_6(void) | 
					
						
							|  |  |  |   { | 
					
						
							|  |  |  |     YAP_Term result = YAP_ARG1; | 
					
						
							|  |  |  |     GenericSpace* space = gecode_Space_from_term(YAP_ARG2); | 
					
						
							|  |  |  |     IntSet Glb = gecode_IntSet_from_term(YAP_ARG3); | 
					
						
							|  |  |  |     int LubMin = YAP_IntOfTerm(YAP_ARG4); | 
					
						
							|  |  |  |     int LubMax = YAP_IntOfTerm(YAP_ARG5); | 
					
						
							|  |  |  |     int idx = space->new_svar(Glb,LubMin,LubMax); | 
					
						
							|  |  |  |     return YAP_Unify(result, YAP_MkIntTerm(idx)); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   static int gecode_new_setvar_7(void) | 
					
						
							|  |  |  |   { | 
					
						
							|  |  |  |     YAP_Term result = YAP_ARG1; | 
					
						
							|  |  |  |     GenericSpace* space = gecode_Space_from_term(YAP_ARG2); | 
					
						
							|  |  |  |     int GlbMin = YAP_IntOfTerm(YAP_ARG3); | 
					
						
							|  |  |  |     int GlbMax = YAP_IntOfTerm(YAP_ARG4); | 
					
						
							|  |  |  |     IntSet Lub = gecode_IntSet_from_term(YAP_ARG5); | 
					
						
							|  |  |  |     int CardMin = YAP_IntOfTerm(YAP_ARG6); | 
					
						
							|  |  |  |     int CardMax = YAP_IntOfTerm(YAP_ARG7); | 
					
						
							|  |  |  |     int idx = space->new_svar(GlbMin,GlbMax,Lub,CardMin,CardMax); | 
					
						
							|  |  |  |     return YAP_Unify(result, YAP_MkIntTerm(idx)); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   static int gecode_new_setvar_8(void) | 
					
						
							|  |  |  |   { | 
					
						
							|  |  |  |     YAP_Term result = YAP_ARG1; | 
					
						
							|  |  |  |     GenericSpace* space = gecode_Space_from_term(YAP_ARG2); | 
					
						
							|  |  |  |     int GlbMin = YAP_IntOfTerm(YAP_ARG3); | 
					
						
							|  |  |  |     int GlbMax = YAP_IntOfTerm(YAP_ARG4); | 
					
						
							|  |  |  |     IntSet Lub = gecode_IntSet_from_term(YAP_ARG5); | 
					
						
							|  |  |  |     int CardMin = YAP_IntOfTerm(YAP_ARG6); | 
					
						
							|  |  |  |     int idx = space->new_svar(GlbMin,GlbMax,Lub,CardMin); | 
					
						
							|  |  |  |     return YAP_Unify(result, YAP_MkIntTerm(idx)); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   static int gecode_new_setvar_9(void) | 
					
						
							|  |  |  |   { | 
					
						
							|  |  |  |     YAP_Term result = YAP_ARG1; | 
					
						
							|  |  |  |     GenericSpace* space = gecode_Space_from_term(YAP_ARG2); | 
					
						
							|  |  |  |     int GlbMin = YAP_IntOfTerm(YAP_ARG3); | 
					
						
							|  |  |  |     int GlbMax = YAP_IntOfTerm(YAP_ARG4); | 
					
						
							|  |  |  |     IntSet Lub = gecode_IntSet_from_term(YAP_ARG5); | 
					
						
							|  |  |  |     int idx = space->new_svar(GlbMin,GlbMax,Lub); | 
					
						
							|  |  |  |     return YAP_Unify(result, YAP_MkIntTerm(idx)); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   static int gecode_new_setvar_10(void) | 
					
						
							|  |  |  |   { | 
					
						
							|  |  |  |     YAP_Term result = YAP_ARG1; | 
					
						
							|  |  |  |     GenericSpace* space = gecode_Space_from_term(YAP_ARG2); | 
					
						
							|  |  |  |     IntSet Glb = gecode_IntSet_from_term(YAP_ARG3); | 
					
						
							|  |  |  |     IntSet Lub = gecode_IntSet_from_term(YAP_ARG4); | 
					
						
							|  |  |  |     int CardMin = YAP_IntOfTerm(YAP_ARG5); | 
					
						
							|  |  |  |     int CardMax = YAP_IntOfTerm(YAP_ARG6); | 
					
						
							|  |  |  |     int idx = space->new_svar(Glb,Lub,CardMin,CardMax); | 
					
						
							|  |  |  |     return YAP_Unify(result, YAP_MkIntTerm(idx)); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   static int gecode_new_setvar_11(void) | 
					
						
							|  |  |  |   { | 
					
						
							|  |  |  |     YAP_Term result = YAP_ARG1; | 
					
						
							|  |  |  |     GenericSpace* space = gecode_Space_from_term(YAP_ARG2); | 
					
						
							|  |  |  |     IntSet Glb = gecode_IntSet_from_term(YAP_ARG3); | 
					
						
							|  |  |  |     IntSet Lub = gecode_IntSet_from_term(YAP_ARG4); | 
					
						
							|  |  |  |     int CardMin = YAP_IntOfTerm(YAP_ARG5); | 
					
						
							|  |  |  |     int idx = space->new_svar(Glb,Lub,CardMin); | 
					
						
							|  |  |  |     return YAP_Unify(result, YAP_MkIntTerm(idx)); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   static int gecode_new_setvar_12(void) | 
					
						
							|  |  |  |   { | 
					
						
							|  |  |  |     YAP_Term result = YAP_ARG1; | 
					
						
							|  |  |  |     GenericSpace* space = gecode_Space_from_term(YAP_ARG2); | 
					
						
							|  |  |  |     IntSet Glb = gecode_IntSet_from_term(YAP_ARG3); | 
					
						
							|  |  |  |     IntSet Lub = gecode_IntSet_from_term(YAP_ARG4); | 
					
						
							|  |  |  |     int idx = space->new_svar(Glb,Lub); | 
					
						
							|  |  |  |     return YAP_Unify(result, YAP_MkIntTerm(idx)); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   static int gecode_space_minimize(void) | 
					
						
							|  |  |  |   { | 
					
						
							|  |  |  |     GenericSpace* space = gecode_Space_from_term(YAP_ARG1); | 
					
						
							|  |  |  |     int i = YAP_IntOfTerm(YAP_ARG2); | 
					
						
							|  |  |  |     space->minimize(i); | 
					
						
							|  |  |  |     return TRUE; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   static int gecode_space_maximize(void) | 
					
						
							|  |  |  |   { | 
					
						
							|  |  |  |     GenericSpace* space = gecode_Space_from_term(YAP_ARG1); | 
					
						
							|  |  |  |     int i = YAP_IntOfTerm(YAP_ARG2); | 
					
						
							|  |  |  |     space->maximize(i); | 
					
						
							|  |  |  |     return TRUE; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   static int gecode_space_minimize_ratio(void) | 
					
						
							|  |  |  |   { | 
					
						
							|  |  |  |     GenericSpace* space = gecode_Space_from_term(YAP_ARG1); | 
					
						
							|  |  |  |     int i = YAP_IntOfTerm(YAP_ARG2); | 
					
						
							|  |  |  |     int j = YAP_IntOfTerm(YAP_ARG3); | 
					
						
							|  |  |  |     space->minimize(i,j); | 
					
						
							|  |  |  |     return TRUE; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   static int gecode_space_maximize_ratio(void) | 
					
						
							|  |  |  |   { | 
					
						
							|  |  |  |     GenericSpace* space = gecode_Space_from_term(YAP_ARG1); | 
					
						
							|  |  |  |     int i = YAP_IntOfTerm(YAP_ARG2); | 
					
						
							|  |  |  |     int j = YAP_IntOfTerm(YAP_ARG3); | 
					
						
							|  |  |  |     space->maximize(i,j); | 
					
						
							|  |  |  |     return TRUE; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   static IntVar | 
					
						
							|  |  |  |   gecode_IntVar_from_term(GenericSpace* space, YAP_Term x) | 
					
						
							|  |  |  |   { | 
					
						
							|  |  |  |     int i = YAP_IntOfTerm(x); | 
					
						
							|  |  |  |     return space->get_ivar(i); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   static BoolVar | 
					
						
							|  |  |  |   gecode_BoolVar_from_term(GenericSpace* space, YAP_Term x) | 
					
						
							|  |  |  |   { | 
					
						
							|  |  |  |     int i = YAP_IntOfTerm(x); | 
					
						
							|  |  |  |     return space->get_bvar(i); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   static SetVar | 
					
						
							|  |  |  |   gecode_SetVar_from_term(GenericSpace* space, YAP_Term x) | 
					
						
							|  |  |  |   { | 
					
						
							|  |  |  |     int i = YAP_IntOfTerm(x); | 
					
						
							|  |  |  |     return space->get_svar(i); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   static IntVarArgs | 
					
						
							|  |  |  |   gecode_IntVarArgs_from_term(GenericSpace* space, YAP_Term l) | 
					
						
							|  |  |  |   { | 
					
						
							|  |  |  |     int n = gecode_list_length(l); | 
					
						
							|  |  |  |     IntVarArgs v(n); | 
					
						
							|  |  |  |     int i = 0; | 
					
						
							|  |  |  |     while (YAP_IsPairTerm(l)) | 
					
						
							|  |  |  |       { | 
					
						
							|  |  |  | 	int idx = YAP_IntOfTerm(YAP_HeadOfTerm(l)); | 
					
						
							|  |  |  | 	v[i] = space->get_ivar(idx); | 
					
						
							|  |  |  | 	l = YAP_TailOfTerm(l); | 
					
						
							|  |  |  | 	i += 1; | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  |     return v; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   static BoolVarArgs | 
					
						
							|  |  |  |   gecode_BoolVarArgs_from_term(GenericSpace* space, YAP_Term l) | 
					
						
							|  |  |  |   { | 
					
						
							|  |  |  |     int n = gecode_list_length(l); | 
					
						
							|  |  |  |     BoolVarArgs v(n); | 
					
						
							|  |  |  |     int i = 0; | 
					
						
							|  |  |  |     while (YAP_IsPairTerm(l)) | 
					
						
							|  |  |  |       { | 
					
						
							|  |  |  | 	int idx = YAP_IntOfTerm(YAP_HeadOfTerm(l)); | 
					
						
							|  |  |  | 	v[i] = space->get_bvar(idx); | 
					
						
							|  |  |  | 	l = YAP_TailOfTerm(l); | 
					
						
							|  |  |  | 	i += 1; | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  |     return v; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   static SetVarArgs | 
					
						
							|  |  |  |   gecode_SetVarArgs_from_term(GenericSpace* space, YAP_Term l) | 
					
						
							|  |  |  |   { | 
					
						
							|  |  |  |     int n = gecode_list_length(l); | 
					
						
							|  |  |  |     SetVarArgs v(n); | 
					
						
							|  |  |  |     int i = 0; | 
					
						
							|  |  |  |     while (YAP_IsPairTerm(l)) | 
					
						
							|  |  |  |       { | 
					
						
							|  |  |  | 	int idx = YAP_IntOfTerm(YAP_HeadOfTerm(l)); | 
					
						
							|  |  |  | 	v[i] = space->get_svar(idx); | 
					
						
							|  |  |  | 	l = YAP_TailOfTerm(l); | 
					
						
							|  |  |  | 	i += 1; | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  |     return v; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   static IntArgs | 
					
						
							|  |  |  |   gecode_IntArgs_from_term(YAP_Term l) | 
					
						
							|  |  |  |   { | 
					
						
							|  |  |  |     int n = gecode_list_length(l); | 
					
						
							|  |  |  |     IntArgs v(n); | 
					
						
							|  |  |  |     int i = 0; | 
					
						
							|  |  |  |     while (YAP_IsPairTerm(l)) | 
					
						
							|  |  |  |       { | 
					
						
							|  |  |  | 	int idx = YAP_IntOfTerm(YAP_HeadOfTerm(l)); | 
					
						
							|  |  |  | 	v[i] = idx; | 
					
						
							|  |  |  | 	l = YAP_TailOfTerm(l); | 
					
						
							|  |  |  | 	i += 1; | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  |     return v; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   static IntSetArgs | 
					
						
							|  |  |  |   gecode_IntSetArgs_from_term(YAP_Term l) | 
					
						
							|  |  |  |   { | 
					
						
							|  |  |  |     int n = gecode_list_length(l); | 
					
						
							|  |  |  |     IntSetArgs v(n); | 
					
						
							|  |  |  |     int i = 0; | 
					
						
							|  |  |  |     while (YAP_IsPairTerm(l)) | 
					
						
							|  |  |  |       { | 
					
						
							|  |  |  | 	IntSet s = gecode_IntSet_from_term(YAP_HeadOfTerm(l)); | 
					
						
							|  |  |  | 	v[i] = s; | 
					
						
							|  |  |  | 	l = YAP_TailOfTerm(l); | 
					
						
							|  |  |  | 	i += 1; | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  |     return v; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   static TaskType gecode_TaskType_from_term(YAP_Term); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   static TaskTypeArgs | 
					
						
							|  |  |  |   gecode_TaskTypeArgs_from_term(YAP_Term l) | 
					
						
							|  |  |  |   { | 
					
						
							|  |  |  |     int n = gecode_list_length(l); | 
					
						
							|  |  |  |     TaskTypeArgs v(n); | 
					
						
							|  |  |  |     int i = 0; | 
					
						
							|  |  |  |     while (YAP_IsPairTerm(l)) | 
					
						
							|  |  |  |       { | 
					
						
							|  |  |  | 	TaskType tt = gecode_TaskType_from_term(YAP_HeadOfTerm(l)); | 
					
						
							|  |  |  | 	v[i] = tt; | 
					
						
							|  |  |  | 	l = YAP_TailOfTerm(l); | 
					
						
							|  |  |  | 	i += 1; | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  |     return v; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   static YAP_Term gecode_TRUE; | 
					
						
							|  |  |  |   static YAP_Term gecode_FALSE; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   static bool | 
					
						
							|  |  |  |   gecode_bool_from_term(YAP_Term X) | 
					
						
							|  |  |  |   { | 
					
						
							|  |  |  |     if (X==gecode_TRUE) return true; | 
					
						
							|  |  |  |     if (X==gecode_FALSE) return false; | 
					
						
							|  |  |  |     cerr << "this should never happen" << endl; exit(1); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-12-03 23:31:28 +01:00
										 |  |  |   static int gecode_space_use_keep_index(void) | 
					
						
							|  |  |  |   { | 
					
						
							|  |  |  |     YAP_Term arg1 = YAP_ARG1; | 
					
						
							|  |  |  |     YAP_Term arg2 = YAP_ARG2; | 
					
						
							|  |  |  |     GenericSpace* space = gecode_Space_from_term(arg1); | 
					
						
							|  |  |  |     return YAP_Unify(arg2,(space->use_keep_index() | 
					
						
							|  |  |  | 			   ?gecode_TRUE:gecode_FALSE)); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   static int gecode_intvar_keep(void) | 
					
						
							|  |  |  |   { | 
					
						
							|  |  |  |     YAP_Term arg1 = YAP_ARG1; | 
					
						
							|  |  |  |     YAP_Term arg2 = YAP_ARG2; | 
					
						
							|  |  |  |     YAP_Term arg3 = YAP_ARG3; | 
					
						
							|  |  |  |     GenericSpace* space = gecode_Space_from_term(arg1); | 
					
						
							|  |  |  |     int idx = YAP_IntOfTerm(arg2); | 
					
						
							|  |  |  |     int kidx = space->keep_ivar(idx); | 
					
						
							|  |  |  |     return YAP_Unify(arg3,YAP_MkIntTerm(kidx)); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   static int gecode_boolvar_keep(void) | 
					
						
							|  |  |  |   { | 
					
						
							|  |  |  |     YAP_Term arg1 = YAP_ARG1; | 
					
						
							|  |  |  |     YAP_Term arg2 = YAP_ARG2; | 
					
						
							|  |  |  |     YAP_Term arg3 = YAP_ARG3; | 
					
						
							|  |  |  |     GenericSpace* space = gecode_Space_from_term(arg1); | 
					
						
							|  |  |  |     int idx = YAP_IntOfTerm(arg2); | 
					
						
							|  |  |  |     int kidx = space->keep_bvar(idx); | 
					
						
							|  |  |  |     return YAP_Unify(arg3,YAP_MkIntTerm(kidx)); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   static int gecode_setvar_keep(void) | 
					
						
							|  |  |  |   { | 
					
						
							|  |  |  |     YAP_Term arg1 = YAP_ARG1; | 
					
						
							|  |  |  |     YAP_Term arg2 = YAP_ARG2; | 
					
						
							|  |  |  |     YAP_Term arg3 = YAP_ARG3; | 
					
						
							|  |  |  |     GenericSpace* space = gecode_Space_from_term(arg1); | 
					
						
							|  |  |  |     int idx = YAP_IntOfTerm(arg2); | 
					
						
							|  |  |  |     int kidx = space->keep_svar(idx); | 
					
						
							|  |  |  |     return YAP_Unify(arg3,YAP_MkIntTerm(kidx)); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-08-08 15:21:36 +02:00
										 |  |  |   // INFO ON INTVARS
 | 
					
						
							|  |  |  |   static int gecode_intvar_assigned(void) | 
					
						
							|  |  |  |   { | 
					
						
							|  |  |  |     GenericSpace* space = gecode_Space_from_term(YAP_ARG1); | 
					
						
							|  |  |  |     IntVar x = gecode_IntVar_from_term(space, YAP_ARG2); | 
					
						
							|  |  |  |     return (x.assigned()) ? TRUE : FALSE; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   static int gecode_intvar_min(void) | 
					
						
							|  |  |  |   { | 
					
						
							|  |  |  |     YAP_Term result = YAP_ARG1; | 
					
						
							|  |  |  |     GenericSpace* space = gecode_Space_from_term(YAP_ARG2); | 
					
						
							|  |  |  |     IntVar x = gecode_IntVar_from_term(space, YAP_ARG3); | 
					
						
							|  |  |  |     return YAP_Unify(result, YAP_MkIntTerm(x.min())); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   static int gecode_intvar_max(void) | 
					
						
							|  |  |  |   { | 
					
						
							|  |  |  |     YAP_Term result = YAP_ARG1; | 
					
						
							|  |  |  |     GenericSpace* space = gecode_Space_from_term(YAP_ARG2); | 
					
						
							|  |  |  |     IntVar x = gecode_IntVar_from_term(space, YAP_ARG3); | 
					
						
							|  |  |  |     return YAP_Unify(result, YAP_MkIntTerm(x.max())); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   static int gecode_intvar_med(void) | 
					
						
							|  |  |  |   { | 
					
						
							|  |  |  |     YAP_Term result = YAP_ARG1; | 
					
						
							|  |  |  |     GenericSpace* space = gecode_Space_from_term(YAP_ARG2); | 
					
						
							|  |  |  |     IntVar x = gecode_IntVar_from_term(space, YAP_ARG3); | 
					
						
							|  |  |  |     return YAP_Unify(result, YAP_MkIntTerm(x.med())); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   static int gecode_intvar_val(void) | 
					
						
							|  |  |  |   { | 
					
						
							|  |  |  |     YAP_Term result = YAP_ARG1; | 
					
						
							|  |  |  |     GenericSpace* space = gecode_Space_from_term(YAP_ARG2); | 
					
						
							|  |  |  |     IntVar x = gecode_IntVar_from_term(space, YAP_ARG3); | 
					
						
							|  |  |  |     return YAP_Unify(result, YAP_MkIntTerm(x.val())); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   static int gecode_intvar_size(void) | 
					
						
							|  |  |  |   { | 
					
						
							|  |  |  |     YAP_Term result = YAP_ARG1; | 
					
						
							|  |  |  |     GenericSpace* space = gecode_Space_from_term(YAP_ARG2); | 
					
						
							|  |  |  |     IntVar x = gecode_IntVar_from_term(space, YAP_ARG3); | 
					
						
							|  |  |  |     return YAP_Unify(result, YAP_MkIntTerm(x.size())); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   static int gecode_intvar_width(void) | 
					
						
							|  |  |  |   { | 
					
						
							|  |  |  |     YAP_Term result = YAP_ARG1; | 
					
						
							|  |  |  |     GenericSpace* space = gecode_Space_from_term(YAP_ARG2); | 
					
						
							|  |  |  |     IntVar x = gecode_IntVar_from_term(space, YAP_ARG3); | 
					
						
							|  |  |  |     return YAP_Unify(result, YAP_MkIntTerm(x.width())); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   static int gecode_intvar_regret_min(void) | 
					
						
							|  |  |  |   { | 
					
						
							|  |  |  |     YAP_Term result = YAP_ARG1; | 
					
						
							|  |  |  |     GenericSpace* space = gecode_Space_from_term(YAP_ARG2); | 
					
						
							|  |  |  |     IntVar x = gecode_IntVar_from_term(space, YAP_ARG3); | 
					
						
							|  |  |  |     return YAP_Unify(result, YAP_MkIntTerm(x.regret_min())); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   static int gecode_intvar_regret_max(void) | 
					
						
							|  |  |  |   { | 
					
						
							|  |  |  |     YAP_Term result = YAP_ARG1; | 
					
						
							|  |  |  |     GenericSpace* space = gecode_Space_from_term(YAP_ARG2); | 
					
						
							|  |  |  |     IntVar x = gecode_IntVar_from_term(space, YAP_ARG3); | 
					
						
							|  |  |  |     return YAP_Unify(result, YAP_MkIntTerm(x.regret_max())); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-08-09 16:57:33 +02:00
										 |  |  |   static YAP_Functor gecode_COMMA2; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   static int gecode_intvar_ranges(void) | 
					
						
							|  |  |  |   { | 
					
						
							|  |  |  |     YAP_Term result = YAP_ARG1; | 
					
						
							|  |  |  |     GenericSpace* space = gecode_Space_from_term(YAP_ARG2); | 
					
						
							|  |  |  |     IntVar x = gecode_IntVar_from_term(space, YAP_ARG3); | 
					
						
							|  |  |  |     int n = 0; | 
					
						
							|  |  |  |     { IntVarRanges it(x); while (it()) { ++n; ++it; } } | 
					
						
							|  |  |  |     DYNARRAY(int,min,n); | 
					
						
							|  |  |  |     DYNARRAY(int,max,n); | 
					
						
							|  |  |  |     { IntVarRanges it(x); int i=0; | 
					
						
							|  |  |  |       while (it()) { min[i]=it.min(); max[i]=it.max(); ++it; ++i; } } | 
					
						
							|  |  |  |     YAP_Term lst = YAP_TermNil(); | 
					
						
							|  |  |  |     for (;n--;) | 
					
						
							|  |  |  |       { | 
					
						
							|  |  |  | 	YAP_Term args[2]; | 
					
						
							|  |  |  | 	args[0] = YAP_MkIntTerm(min[n]); | 
					
						
							|  |  |  | 	args[1] = YAP_MkIntTerm(max[n]); | 
					
						
							|  |  |  | 	YAP_Term range = YAP_MkApplTerm(gecode_COMMA2,2,args); | 
					
						
							|  |  |  | 	lst = YAP_MkPairTerm(range,lst); | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  |     return YAP_Unify(result,lst); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   static int gecode_intvar_values(void) | 
					
						
							|  |  |  |   { | 
					
						
							|  |  |  |     YAP_Term result = YAP_ARG1; | 
					
						
							|  |  |  |     GenericSpace* space = gecode_Space_from_term(YAP_ARG2); | 
					
						
							|  |  |  |     IntVar x = gecode_IntVar_from_term(space, YAP_ARG3); | 
					
						
							|  |  |  |     int n = x.size(); | 
					
						
							|  |  |  |     DYNARRAY(int,a,n); | 
					
						
							|  |  |  |     { IntVarValues it(x); int i=0; | 
					
						
							|  |  |  |       while (it()) { a[i]=it.val(); ++it; ++i; } } | 
					
						
							|  |  |  |     YAP_Term lst = YAP_TermNil(); | 
					
						
							|  |  |  |     for (;n--;) | 
					
						
							|  |  |  |       { | 
					
						
							|  |  |  | 	lst = YAP_MkPairTerm(YAP_MkIntTerm(a[n]),lst); | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  |     return YAP_Unify(result,lst); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-08-08 15:21:36 +02:00
										 |  |  |   // INFO ON BOOLVARS
 | 
					
						
							|  |  |  |   static int gecode_boolvar_assigned(void) | 
					
						
							|  |  |  |   { | 
					
						
							|  |  |  |     GenericSpace* space = gecode_Space_from_term(YAP_ARG1); | 
					
						
							|  |  |  |     BoolVar x = gecode_BoolVar_from_term(space, YAP_ARG2); | 
					
						
							|  |  |  |     return (x.assigned()) ? TRUE : FALSE; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   static int gecode_boolvar_min(void) | 
					
						
							|  |  |  |   { | 
					
						
							|  |  |  |     YAP_Term result = YAP_ARG1; | 
					
						
							|  |  |  |     GenericSpace* space = gecode_Space_from_term(YAP_ARG2); | 
					
						
							|  |  |  |     BoolVar x = gecode_BoolVar_from_term(space, YAP_ARG3); | 
					
						
							|  |  |  |     return YAP_Unify(result, YAP_MkIntTerm(x.min())); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   static int gecode_boolvar_max(void) | 
					
						
							|  |  |  |   { | 
					
						
							|  |  |  |     YAP_Term result = YAP_ARG1; | 
					
						
							|  |  |  |     GenericSpace* space = gecode_Space_from_term(YAP_ARG2); | 
					
						
							|  |  |  |     BoolVar x = gecode_BoolVar_from_term(space, YAP_ARG3); | 
					
						
							|  |  |  |     return YAP_Unify(result, YAP_MkIntTerm(x.max())); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   static int gecode_boolvar_med(void) | 
					
						
							|  |  |  |   { | 
					
						
							|  |  |  |     YAP_Term result = YAP_ARG1; | 
					
						
							|  |  |  |     GenericSpace* space = gecode_Space_from_term(YAP_ARG2); | 
					
						
							|  |  |  |     BoolVar x = gecode_BoolVar_from_term(space, YAP_ARG3); | 
					
						
							|  |  |  |     return YAP_Unify(result, YAP_MkIntTerm(x.med())); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   static int gecode_boolvar_val(void) | 
					
						
							|  |  |  |   { | 
					
						
							|  |  |  |     YAP_Term result = YAP_ARG1; | 
					
						
							|  |  |  |     GenericSpace* space = gecode_Space_from_term(YAP_ARG2); | 
					
						
							|  |  |  |     BoolVar x = gecode_BoolVar_from_term(space, YAP_ARG3); | 
					
						
							|  |  |  |     return YAP_Unify(result, YAP_MkIntTerm(x.val())); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   static int gecode_boolvar_size(void) | 
					
						
							|  |  |  |   { | 
					
						
							|  |  |  |     YAP_Term result = YAP_ARG1; | 
					
						
							|  |  |  |     GenericSpace* space = gecode_Space_from_term(YAP_ARG2); | 
					
						
							|  |  |  |     BoolVar x = gecode_BoolVar_from_term(space, YAP_ARG3); | 
					
						
							|  |  |  |     return YAP_Unify(result, YAP_MkIntTerm(x.size())); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   static int gecode_boolvar_width(void) | 
					
						
							|  |  |  |   { | 
					
						
							|  |  |  |     YAP_Term result = YAP_ARG1; | 
					
						
							|  |  |  |     GenericSpace* space = gecode_Space_from_term(YAP_ARG2); | 
					
						
							|  |  |  |     BoolVar x = gecode_BoolVar_from_term(space, YAP_ARG3); | 
					
						
							|  |  |  |     return YAP_Unify(result, YAP_MkIntTerm(x.width())); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   static int gecode_boolvar_regret_min(void) | 
					
						
							|  |  |  |   { | 
					
						
							|  |  |  |     YAP_Term result = YAP_ARG1; | 
					
						
							|  |  |  |     GenericSpace* space = gecode_Space_from_term(YAP_ARG2); | 
					
						
							|  |  |  |     BoolVar x = gecode_BoolVar_from_term(space, YAP_ARG3); | 
					
						
							|  |  |  |     return YAP_Unify(result, YAP_MkIntTerm(x.regret_min())); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   static int gecode_boolvar_regret_max(void) | 
					
						
							|  |  |  |   { | 
					
						
							|  |  |  |     YAP_Term result = YAP_ARG1; | 
					
						
							|  |  |  |     GenericSpace* space = gecode_Space_from_term(YAP_ARG2); | 
					
						
							|  |  |  |     BoolVar x = gecode_BoolVar_from_term(space, YAP_ARG3); | 
					
						
							|  |  |  |     return YAP_Unify(result, YAP_MkIntTerm(x.regret_max())); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   // INFO ON SETVARS
 | 
					
						
							|  |  |  |   static int gecode_setvar_assigned(void) | 
					
						
							|  |  |  |   { | 
					
						
							|  |  |  |     GenericSpace* space = gecode_Space_from_term(YAP_ARG1); | 
					
						
							|  |  |  |     SetVar x = gecode_SetVar_from_term(space, YAP_ARG2); | 
					
						
							|  |  |  |     return (x.assigned()) ? TRUE : FALSE; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   static int gecode_setvar_glbSize(void) | 
					
						
							|  |  |  |   { | 
					
						
							|  |  |  |     YAP_Term result = YAP_ARG1; | 
					
						
							|  |  |  |     GenericSpace* space = gecode_Space_from_term(YAP_ARG2); | 
					
						
							|  |  |  |     SetVar x = gecode_SetVar_from_term(space, YAP_ARG3); | 
					
						
							|  |  |  |     return YAP_Unify(result, YAP_MkIntTerm(x.glbSize())); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   static int gecode_setvar_lubSize(void) | 
					
						
							|  |  |  |   { | 
					
						
							|  |  |  |     YAP_Term result = YAP_ARG1; | 
					
						
							|  |  |  |     GenericSpace* space = gecode_Space_from_term(YAP_ARG2); | 
					
						
							|  |  |  |     SetVar x = gecode_SetVar_from_term(space, YAP_ARG3); | 
					
						
							|  |  |  |     return YAP_Unify(result, YAP_MkIntTerm(x.lubSize())); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   static int gecode_setvar_unknownSize(void) | 
					
						
							|  |  |  |   { | 
					
						
							|  |  |  |     YAP_Term result = YAP_ARG1; | 
					
						
							|  |  |  |     GenericSpace* space = gecode_Space_from_term(YAP_ARG2); | 
					
						
							|  |  |  |     SetVar x = gecode_SetVar_from_term(space, YAP_ARG3); | 
					
						
							|  |  |  |     return YAP_Unify(result, YAP_MkIntTerm(x.unknownSize())); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   static int gecode_setvar_cardMin(void) | 
					
						
							|  |  |  |   { | 
					
						
							|  |  |  |     YAP_Term result = YAP_ARG1; | 
					
						
							|  |  |  |     GenericSpace* space = gecode_Space_from_term(YAP_ARG2); | 
					
						
							|  |  |  |     SetVar x = gecode_SetVar_from_term(space, YAP_ARG3); | 
					
						
							|  |  |  |     return YAP_Unify(result, YAP_MkIntTerm(x.cardMin())); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   static int gecode_setvar_cardMax(void) | 
					
						
							|  |  |  |   { | 
					
						
							|  |  |  |     YAP_Term result = YAP_ARG1; | 
					
						
							|  |  |  |     GenericSpace* space = gecode_Space_from_term(YAP_ARG2); | 
					
						
							|  |  |  |     SetVar x = gecode_SetVar_from_term(space, YAP_ARG3); | 
					
						
							|  |  |  |     return YAP_Unify(result, YAP_MkIntTerm(x.cardMax())); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   static int gecode_setvar_lubMin(void) | 
					
						
							|  |  |  |   { | 
					
						
							|  |  |  |     YAP_Term result = YAP_ARG1; | 
					
						
							|  |  |  |     GenericSpace* space = gecode_Space_from_term(YAP_ARG2); | 
					
						
							|  |  |  |     SetVar x = gecode_SetVar_from_term(space, YAP_ARG3); | 
					
						
							|  |  |  |     return YAP_Unify(result, YAP_MkIntTerm(x.lubMin())); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   static int gecode_setvar_lubMax(void) | 
					
						
							|  |  |  |   { | 
					
						
							|  |  |  |     YAP_Term result = YAP_ARG1; | 
					
						
							|  |  |  |     GenericSpace* space = gecode_Space_from_term(YAP_ARG2); | 
					
						
							|  |  |  |     SetVar x = gecode_SetVar_from_term(space, YAP_ARG3); | 
					
						
							|  |  |  |     return YAP_Unify(result, YAP_MkIntTerm(x.lubMax())); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   static int gecode_setvar_glbMin(void) | 
					
						
							|  |  |  |   { | 
					
						
							|  |  |  |     YAP_Term result = YAP_ARG1; | 
					
						
							|  |  |  |     GenericSpace* space = gecode_Space_from_term(YAP_ARG2); | 
					
						
							|  |  |  |     SetVar x = gecode_SetVar_from_term(space, YAP_ARG3); | 
					
						
							|  |  |  |     return YAP_Unify(result, YAP_MkIntTerm(x.glbMin())); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   static int gecode_setvar_glbMax(void) | 
					
						
							|  |  |  |   { | 
					
						
							|  |  |  |     YAP_Term result = YAP_ARG1; | 
					
						
							|  |  |  |     GenericSpace* space = gecode_Space_from_term(YAP_ARG2); | 
					
						
							|  |  |  |     SetVar x = gecode_SetVar_from_term(space, YAP_ARG3); | 
					
						
							|  |  |  |     return YAP_Unify(result, YAP_MkIntTerm(x.glbMax())); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   static int gecode_setvar_glb_ranges(void) | 
					
						
							|  |  |  |   { | 
					
						
							|  |  |  |     YAP_Term result = YAP_ARG1; | 
					
						
							|  |  |  |     GenericSpace* space = gecode_Space_from_term(YAP_ARG2); | 
					
						
							|  |  |  |     SetVar x = gecode_SetVar_from_term(space, YAP_ARG3); | 
					
						
							|  |  |  |     int n = 0; | 
					
						
							|  |  |  |     { SetVarGlbRanges it(x); while (it()) { ++n; ++it; } } | 
					
						
							| 
									
										
										
										
											2011-08-09 15:03:45 +02:00
										 |  |  |     DYNARRAY(int,min,n); | 
					
						
							|  |  |  |     DYNARRAY(int,max,n); | 
					
						
							| 
									
										
										
										
											2011-08-08 15:21:36 +02:00
										 |  |  |     { SetVarGlbRanges it(x); int i=0; | 
					
						
							|  |  |  |       while (it()) { min[i]=it.min(); max[i]=it.max(); ++it; ++i; } } | 
					
						
							|  |  |  |     YAP_Term lst = YAP_TermNil(); | 
					
						
							|  |  |  |     for (;n--;) | 
					
						
							|  |  |  |       { | 
					
						
							|  |  |  | 	YAP_Term args[2]; | 
					
						
							|  |  |  | 	args[0] = YAP_MkIntTerm(min[n]); | 
					
						
							|  |  |  | 	args[1] = YAP_MkIntTerm(max[n]); | 
					
						
							|  |  |  | 	YAP_Term range = YAP_MkApplTerm(gecode_COMMA2,2,args); | 
					
						
							|  |  |  | 	lst = YAP_MkPairTerm(range,lst); | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  |     return YAP_Unify(result,lst); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   static int gecode_setvar_lub_ranges(void) | 
					
						
							|  |  |  |   { | 
					
						
							|  |  |  |     YAP_Term result = YAP_ARG1; | 
					
						
							|  |  |  |     GenericSpace* space = gecode_Space_from_term(YAP_ARG2); | 
					
						
							|  |  |  |     SetVar x = gecode_SetVar_from_term(space, YAP_ARG3); | 
					
						
							|  |  |  |     int n = 0; | 
					
						
							|  |  |  |     { SetVarLubRanges it(x); while (it()) { ++n; ++it; } } | 
					
						
							| 
									
										
										
										
											2011-08-09 15:03:45 +02:00
										 |  |  |     DYNARRAY(int,min,n); | 
					
						
							|  |  |  |     DYNARRAY(int,max,n); | 
					
						
							| 
									
										
										
										
											2011-08-08 15:21:36 +02:00
										 |  |  |     { SetVarLubRanges it(x); int i=0; | 
					
						
							|  |  |  |       while (it()) { min[i]=it.min(); max[i]=it.max(); ++it; ++i; } } | 
					
						
							|  |  |  |     YAP_Term lst = YAP_TermNil(); | 
					
						
							|  |  |  |     for (;n--;) | 
					
						
							|  |  |  |       { | 
					
						
							|  |  |  | 	YAP_Term args[2]; | 
					
						
							|  |  |  | 	args[0] = YAP_MkIntTerm(min[n]); | 
					
						
							|  |  |  | 	args[1] = YAP_MkIntTerm(max[n]); | 
					
						
							|  |  |  | 	YAP_Term range = YAP_MkApplTerm(gecode_COMMA2,2,args); | 
					
						
							|  |  |  | 	lst = YAP_MkPairTerm(range,lst); | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  |     return YAP_Unify(result,lst); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   static int gecode_setvar_unknown_ranges(void) | 
					
						
							|  |  |  |   { | 
					
						
							|  |  |  |     YAP_Term result = YAP_ARG1; | 
					
						
							|  |  |  |     GenericSpace* space = gecode_Space_from_term(YAP_ARG2); | 
					
						
							|  |  |  |     SetVar x = gecode_SetVar_from_term(space, YAP_ARG3); | 
					
						
							|  |  |  |     int n = 0; | 
					
						
							|  |  |  |     { SetVarUnknownRanges it(x); while (it()) { ++n; ++it; } } | 
					
						
							| 
									
										
										
										
											2011-08-09 15:03:45 +02:00
										 |  |  |     DYNARRAY(int,min,n); | 
					
						
							|  |  |  |     DYNARRAY(int,max,n); | 
					
						
							| 
									
										
										
										
											2011-08-08 15:21:36 +02:00
										 |  |  |     { SetVarUnknownRanges it(x); int i=0; | 
					
						
							|  |  |  |       while (it()) { min[i]=it.min(); max[i]=it.max(); ++it; ++i; } } | 
					
						
							|  |  |  |     YAP_Term lst = YAP_TermNil(); | 
					
						
							|  |  |  |     for (;n--;) | 
					
						
							|  |  |  |       { | 
					
						
							|  |  |  | 	YAP_Term args[2]; | 
					
						
							|  |  |  | 	args[0] = YAP_MkIntTerm(min[n]); | 
					
						
							|  |  |  | 	args[1] = YAP_MkIntTerm(max[n]); | 
					
						
							|  |  |  | 	YAP_Term range = YAP_MkApplTerm(gecode_COMMA2,2,args); | 
					
						
							|  |  |  | 	lst = YAP_MkPairTerm(range,lst); | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  |     return YAP_Unify(result,lst); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   static int gecode_setvar_glb_values(void) | 
					
						
							|  |  |  |   { | 
					
						
							|  |  |  |     YAP_Term result = YAP_ARG1; | 
					
						
							|  |  |  |     GenericSpace* space = gecode_Space_from_term(YAP_ARG2); | 
					
						
							|  |  |  |     SetVar x = gecode_SetVar_from_term(space, YAP_ARG3); | 
					
						
							| 
									
										
										
										
											2011-08-09 15:03:45 +02:00
										 |  |  |     DYNARRAY(YAP_Term,elems,x.glbSize()); | 
					
						
							| 
									
										
										
										
											2011-08-08 15:21:36 +02:00
										 |  |  |     SetVarGlbValues it(x); | 
					
						
							|  |  |  |     int n = 0; | 
					
						
							|  |  |  |     while (it()) { elems[n] = YAP_MkIntTerm(it.val()); ++it; ++n; } | 
					
						
							|  |  |  |     YAP_Term lst = YAP_TermNil(); | 
					
						
							|  |  |  |     for (;n--;) lst = YAP_MkPairTerm(elems[n],lst); | 
					
						
							|  |  |  |     return YAP_Unify(result,lst); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   static int gecode_setvar_lub_values(void) | 
					
						
							|  |  |  |   { | 
					
						
							|  |  |  |     YAP_Term result = YAP_ARG1; | 
					
						
							|  |  |  |     GenericSpace* space = gecode_Space_from_term(YAP_ARG2); | 
					
						
							|  |  |  |     SetVar x = gecode_SetVar_from_term(space, YAP_ARG3); | 
					
						
							| 
									
										
										
										
											2011-08-09 15:03:45 +02:00
										 |  |  |     DYNARRAY(YAP_Term,elems,x.glbSize()); | 
					
						
							| 
									
										
										
										
											2011-08-08 15:21:36 +02:00
										 |  |  |     SetVarLubValues it(x); | 
					
						
							|  |  |  |     int n = 0; | 
					
						
							|  |  |  |     while (it()) { elems[n] = YAP_MkIntTerm(it.val()); ++it; ++n; } | 
					
						
							|  |  |  |     YAP_Term lst = YAP_TermNil(); | 
					
						
							|  |  |  |     for (;n--;) lst = YAP_MkPairTerm(elems[n],lst); | 
					
						
							|  |  |  |     return YAP_Unify(result,lst); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   static int gecode_setvar_unknown_values(void) | 
					
						
							|  |  |  |   { | 
					
						
							|  |  |  |     YAP_Term result = YAP_ARG1; | 
					
						
							|  |  |  |     GenericSpace* space = gecode_Space_from_term(YAP_ARG2); | 
					
						
							|  |  |  |     SetVar x = gecode_SetVar_from_term(space, YAP_ARG3); | 
					
						
							| 
									
										
										
										
											2011-08-09 15:03:45 +02:00
										 |  |  |     DYNARRAY(YAP_Term,elems,x.glbSize()); | 
					
						
							| 
									
										
										
										
											2011-08-08 15:21:36 +02:00
										 |  |  |     SetVarUnknownValues it(x); | 
					
						
							|  |  |  |     int n = 0; | 
					
						
							|  |  |  |     while (it()) { elems[n] = YAP_MkIntTerm(it.val()); ++it; ++n; } | 
					
						
							|  |  |  |     YAP_Term lst = YAP_TermNil(); | 
					
						
							|  |  |  |     for (;n--;) lst = YAP_MkPairTerm(elems[n],lst); | 
					
						
							|  |  |  |     return YAP_Unify(result,lst); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #define gecode_int_from_term YAP_IntOfTerm
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include "gecode_yap_cc_forward_auto_generated.icc"
 | 
					
						
							|  |  |  | #include "gecode_yap_cc_impl_auto_generated.icc"
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   void gecode_init(void) | 
					
						
							|  |  |  |   { | 
					
						
							|  |  |  |     { YAP_Atom X= YAP_LookupAtom("true"); | 
					
						
							|  |  |  |       gecode_TRUE = YAP_MkAtomTerm(X); | 
					
						
							|  |  |  |       YAP_AtomGetHold(X); } | 
					
						
							|  |  |  |     { YAP_Atom X= YAP_LookupAtom("false"); | 
					
						
							|  |  |  |       gecode_FALSE = YAP_MkAtomTerm(X); | 
					
						
							|  |  |  |       YAP_AtomGetHold(X); } | 
					
						
							|  |  |  |     { YAP_Atom X= YAP_LookupAtom(","); | 
					
						
							|  |  |  |       YAP_AtomGetHold(X); | 
					
						
							|  |  |  |       gecode_COMMA2 = YAP_MkFunctor(X,2); } | 
					
						
							|  |  |  | #include "gecode_yap_cc_init_auto_generated.icc"
 | 
					
						
							|  |  |  |     // opaque spaces
 | 
					
						
							|  |  |  |     gecode_space_handler.fail_handler = gecode_space_fail_handler; | 
					
						
							|  |  |  |     gecode_space_handler.write_handler = gecode_space_write_handler; | 
					
						
							|  |  |  |     gecode_space_tag = YAP_NewOpaqueType(&gecode_space_handler); | 
					
						
							|  |  |  |     YAP_UserCPredicate("gecode_new_space", gecode_new_space, 1); | 
					
						
							|  |  |  |     // opaque engines
 | 
					
						
							|  |  |  |     gecode_engine_handler.fail_handler = gecode_engine_fail_handler; | 
					
						
							|  |  |  |     gecode_engine_handler.write_handler = gecode_engine_write_handler; | 
					
						
							|  |  |  |     gecode_engine_tag = YAP_NewOpaqueType(&gecode_engine_handler); | 
					
						
							| 
									
										
										
										
											2011-12-01 22:48:28 +01:00
										 |  |  |     YAP_UserCPredicate("gecode_new_engine", gecode_new_engine, 3); | 
					
						
							| 
									
										
										
										
											2011-08-08 15:21:36 +02:00
										 |  |  | #ifdef DISJUNCTOR
 | 
					
						
							|  |  |  |     // opaque disjunctors and clauses
 | 
					
						
							|  |  |  |     gecode_disjunctor_handler.write_handler = gecode_disjunctor_write_handler; | 
					
						
							|  |  |  |     gecode_disjunctor_tag = YAP_NewOpaqueType(&gecode_disjunctor_handler); | 
					
						
							|  |  |  |     gecode_disjunctor_clause_handler.write_handler = gecode_clause_write_handler; | 
					
						
							|  |  |  |     gecode_disjunctor_clause_tag = | 
					
						
							|  |  |  |       YAP_NewOpaqueType(&gecode_disjunctor_clause_handler); | 
					
						
							|  |  |  |     YAP_UserCPredicate("gecode_new_disjunctor", gecode_new_disjunctor, 2); | 
					
						
							|  |  |  |     YAP_UserCPredicate("gecode_new_clause", gecode_new_clause, 2); | 
					
						
							|  |  |  |     YAP_UserCPredicate("gecode_clause_intvar_forward", gecode_clause_intvar_forward, 3); | 
					
						
							|  |  |  |     YAP_UserCPredicate("gecode_clause_boolvar_forward", gecode_clause_boolvar_forward, 3); | 
					
						
							|  |  |  |     YAP_UserCPredicate("gecode_clause_setvar_forward", gecode_clause_setvar_forward, 3); | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  |     // backtracking search using an engine
 | 
					
						
							|  |  |  |     YAP_UserBackCutCPredicate("gecode_engine_search", | 
					
						
							|  |  |  | 			      gecode_engine_search, gecode_engine_search, | 
					
						
							|  |  |  | 			      NULL, 2, 0); | 
					
						
							|  |  |  |     // creating variables
 | 
					
						
							|  |  |  |     YAP_UserCPredicate("gecode_new_intvar_from_bounds", | 
					
						
							|  |  |  | 		       gecode_new_intvar_from_bounds, 4); | 
					
						
							|  |  |  |     YAP_UserCPredicate("gecode_new_intvar_from_intset", | 
					
						
							|  |  |  | 		       gecode_new_intvar_from_intset, 3); | 
					
						
							|  |  |  |     YAP_UserCPredicate("gecode_new_boolvar", gecode_new_boolvar, 2); | 
					
						
							|  |  |  |     YAP_UserCPredicate("gecode_new_setvar_1", gecode_new_setvar_1, 8); | 
					
						
							|  |  |  |     YAP_UserCPredicate("gecode_new_setvar_2", gecode_new_setvar_2, 7); | 
					
						
							|  |  |  |     YAP_UserCPredicate("gecode_new_setvar_3", gecode_new_setvar_3, 6); | 
					
						
							|  |  |  |     YAP_UserCPredicate("gecode_new_setvar_4", gecode_new_setvar_4, 7); | 
					
						
							|  |  |  |     YAP_UserCPredicate("gecode_new_setvar_5", gecode_new_setvar_5, 6); | 
					
						
							|  |  |  |     YAP_UserCPredicate("gecode_new_setvar_6", gecode_new_setvar_6, 5); | 
					
						
							|  |  |  |     YAP_UserCPredicate("gecode_new_setvar_7", gecode_new_setvar_7, 7); | 
					
						
							|  |  |  |     YAP_UserCPredicate("gecode_new_setvar_8", gecode_new_setvar_8, 6); | 
					
						
							|  |  |  |     YAP_UserCPredicate("gecode_new_setvar_9", gecode_new_setvar_9, 5); | 
					
						
							|  |  |  |     YAP_UserCPredicate("gecode_new_setvar_10", gecode_new_setvar_10, 6); | 
					
						
							|  |  |  |     YAP_UserCPredicate("gecode_new_setvar_11", gecode_new_setvar_11, 5); | 
					
						
							|  |  |  |     YAP_UserCPredicate("gecode_new_setvar_12", gecode_new_setvar_12, 4); | 
					
						
							|  |  |  |     YAP_UserCPredicate("gecode_space_minimize", gecode_space_minimize, 2); | 
					
						
							|  |  |  |     YAP_UserCPredicate("gecode_space_maximize", gecode_space_maximize, 2); | 
					
						
							|  |  |  |     YAP_UserCPredicate("gecode_space_minimize_ratio", gecode_space_minimize_ratio, 3); | 
					
						
							|  |  |  |     YAP_UserCPredicate("gecode_space_maximize_ratio", gecode_space_maximize_ratio, 3); | 
					
						
							|  |  |  |     // INFO ON INTVARS
 | 
					
						
							|  |  |  |     YAP_UserCPredicate("gecode_intvar_assigned", gecode_intvar_assigned, 2); | 
					
						
							|  |  |  |     YAP_UserCPredicate("gecode_intvar_min", gecode_intvar_min, 3); | 
					
						
							|  |  |  |     YAP_UserCPredicate("gecode_intvar_max", gecode_intvar_max, 3); | 
					
						
							|  |  |  |     YAP_UserCPredicate("gecode_intvar_med", gecode_intvar_med, 3); | 
					
						
							|  |  |  |     YAP_UserCPredicate("gecode_intvar_val", gecode_intvar_val, 3); | 
					
						
							|  |  |  |     YAP_UserCPredicate("gecode_intvar_size", gecode_intvar_size, 3); | 
					
						
							|  |  |  |     YAP_UserCPredicate("gecode_intvar_width", gecode_intvar_width, 3); | 
					
						
							|  |  |  |     YAP_UserCPredicate("gecode_intvar_regret_min", gecode_intvar_regret_min, 3); | 
					
						
							|  |  |  |     YAP_UserCPredicate("gecode_intvar_regret_max", gecode_intvar_regret_max, 3); | 
					
						
							| 
									
										
										
										
											2011-08-09 16:57:33 +02:00
										 |  |  |     YAP_UserCPredicate("gecode_intvar_ranges", gecode_intvar_ranges, 3); | 
					
						
							|  |  |  |     YAP_UserCPredicate("gecode_intvar_values", gecode_intvar_values, 3); | 
					
						
							| 
									
										
										
										
											2011-08-08 15:21:36 +02:00
										 |  |  |     // INFO ON BOOLVARS
 | 
					
						
							|  |  |  |     YAP_UserCPredicate("gecode_boolvar_assigned", gecode_boolvar_assigned, 2); | 
					
						
							|  |  |  |     YAP_UserCPredicate("gecode_boolvar_min", gecode_boolvar_min, 3); | 
					
						
							|  |  |  |     YAP_UserCPredicate("gecode_boolvar_max", gecode_boolvar_max, 3); | 
					
						
							|  |  |  |     YAP_UserCPredicate("gecode_boolvar_med", gecode_boolvar_med, 3); | 
					
						
							|  |  |  |     YAP_UserCPredicate("gecode_boolvar_val", gecode_boolvar_val, 3); | 
					
						
							|  |  |  |     YAP_UserCPredicate("gecode_boolvar_size", gecode_boolvar_size, 3); | 
					
						
							|  |  |  |     YAP_UserCPredicate("gecode_boolvar_width", gecode_boolvar_width, 3); | 
					
						
							|  |  |  |     YAP_UserCPredicate("gecode_boolvar_regret_min", gecode_boolvar_regret_min, 3); | 
					
						
							|  |  |  |     YAP_UserCPredicate("gecode_boolvar_regret_max", gecode_boolvar_regret_max, 3); | 
					
						
							|  |  |  |     // INFO ON SETVARS
 | 
					
						
							|  |  |  |     YAP_UserCPredicate("gecode_setvar_assigned", gecode_setvar_assigned, 2); | 
					
						
							|  |  |  |     YAP_UserCPredicate("gecode_setvar_glbSize", gecode_setvar_glbSize, 3); | 
					
						
							|  |  |  |     YAP_UserCPredicate("gecode_setvar_lubSize", gecode_setvar_lubSize, 3); | 
					
						
							|  |  |  |     YAP_UserCPredicate("gecode_setvar_unknownSize", gecode_setvar_unknownSize, 3); | 
					
						
							|  |  |  |     YAP_UserCPredicate("gecode_setvar_cardMin", gecode_setvar_cardMin, 3); | 
					
						
							|  |  |  |     YAP_UserCPredicate("gecode_setvar_cardMax", gecode_setvar_cardMax, 3); | 
					
						
							|  |  |  |     YAP_UserCPredicate("gecode_setvar_lubMin", gecode_setvar_lubMin, 3); | 
					
						
							|  |  |  |     YAP_UserCPredicate("gecode_setvar_lubMax", gecode_setvar_lubMax, 3); | 
					
						
							|  |  |  |     YAP_UserCPredicate("gecode_setvar_glbMin", gecode_setvar_glbMin, 3); | 
					
						
							|  |  |  |     YAP_UserCPredicate("gecode_setvar_glbMax", gecode_setvar_glbMax, 3); | 
					
						
							|  |  |  |     YAP_UserCPredicate("gecode_setvar_glb_ranges", gecode_setvar_glb_ranges, 3); | 
					
						
							|  |  |  |     YAP_UserCPredicate("gecode_setvar_lub_ranges", gecode_setvar_lub_ranges, 3); | 
					
						
							|  |  |  |     YAP_UserCPredicate("gecode_setvar_unknown_ranges", gecode_setvar_unknown_ranges, 3); | 
					
						
							|  |  |  |     YAP_UserCPredicate("gecode_setvar_glb_values", gecode_setvar_glb_values, 3); | 
					
						
							|  |  |  |     YAP_UserCPredicate("gecode_setvar_lub_values", gecode_setvar_lub_values, 3); | 
					
						
							|  |  |  |     YAP_UserCPredicate("gecode_setvar_unknown_values", gecode_setvar_unknown_values, 3); | 
					
						
							| 
									
										
										
										
											2011-12-03 23:31:28 +01:00
										 |  |  |     YAP_UserCPredicate("gecode_space_use_keep_index", gecode_space_use_keep_index, 2); | 
					
						
							|  |  |  |     YAP_UserCPredicate("gecode_intvar_keep", gecode_intvar_keep, 3); | 
					
						
							|  |  |  |     YAP_UserCPredicate("gecode_boolvar_keep", gecode_boolvar_keep, 3); | 
					
						
							|  |  |  |     YAP_UserCPredicate("gecode_setvar_keep", gecode_setvar_keep, 3); | 
					
						
							| 
									
										
										
										
											2011-08-08 15:21:36 +02:00
										 |  |  |   } | 
					
						
							|  |  |  | } |