box.hpp /usr/include/gecode/int/no-overlap.hh Gecode Gecode::Int Gecode::Int::NoOverlap /*-*-mode:C++;c-basic-offset:2;indent-tabs-mode:nil-*-*/ /* *Mainauthors: *ChristianSchulte<schulte@gecode.org> * *Copyright: *ChristianSchulte,2011 * *Lastmodified: *$Date:2011-07-1318:16:57+0200(Wed,13Jul2011)$by$Author:schulte$ *$Revision:12192$ * *ThisfileispartofGecode,thegenericconstraint *developmentenvironment: *http://www.gecode.org * *Permissionisherebygranted,freeofcharge,toanypersonobtaining *acopyofthissoftwareandassociateddocumentationfiles(the *"Software"),todealintheSoftwarewithoutrestriction,including *withoutlimitationtherightstouse,copy,modify,merge,publish, *distribute,sublicense,and/orsellcopiesoftheSoftware,andto *permitpersonstowhomtheSoftwareisfurnishedtodoso,subjectto *thefollowingconditions: * *Theabovecopyrightnoticeandthispermissionnoticeshallbe *includedinallcopiesorsubstantialportionsoftheSoftware. * *THESOFTWAREISPROVIDED"ASIS",WITHOUTWARRANTYOFANYKIND, *EXPRESSORIMPLIED,INCLUDINGBUTNOTLIMITEDTOTHEWARRANTIESOF *MERCHANTABILITY,FITNESSFORAPARTICULARPURPOSEAND *NONINFRINGEMENT.INNOEVENTSHALLTHEAUTHORSORCOPYRIGHTHOLDERSBE *LIABLEFORANYCLAIM,DAMAGESOROTHERLIABILITY,WHETHERINANACTION *OFCONTRACT,TORTOROTHERWISE,ARISINGFROM,OUTOFORINCONNECTION *WITHTHESOFTWAREORTHEUSEOROTHERDEALINGSINTHESOFTWARE. * */ namespaceGecode{namespaceInt{namespaceNoOverlap{ /* *Mandatoryboxes * */ template<classDim,intn> forceinlineconstDim& ManBox<Dim,n>::operator [](inti)const{ assert((i>=0)&&(i<n)); returnd[i]; } template<classDim,intn> forceinlineDim& ManBox<Dim,n>::operator [](inti){ assert((i>=0)&&(i<n)); returnd[i]; } template<classDim,intn> forceinlineint ManBox<Dim,n>::dim(void){ returnn; } template<classDim,intn> forceinlinebool ManBox<Dim,n>::mandatory(void)const{ returntrue; } template<classDim,intn> forceinlinebool ManBox<Dim,n>::excluded(void)const{ returnfalse; } template<classDim,intn> forceinlinebool ManBox<Dim,n>::optional(void)const{ returnfalse; } template<classDim,intn> forceinlineExecStatus ManBox<Dim,n>::exclude(Space&){ returnES_FAILED; } template<classDim,intn> forceinlinebool ManBox<Dim,n>::nooverlap(constManBox<Dim,n>&box)const{ for(inti=0;i<n;i++) if((d[i].lec()<=box.d[i].ssc())||(box.d[i].lec()<=d[i].ssc())) returntrue; returnfalse; } template<classDim,intn> forceinlinebool ManBox<Dim,n>::overlap(constManBox<Dim,n>&box)const{ for(inti=0;i<n;i++) if((d[i].sec()<=box.d[i].lsc())||(box.d[i].sec()<=d[i].lsc())) returnfalse; returntrue; } template<classDim,intn> forceinlineExecStatus ManBox<Dim,n>::nooverlap(Space&home,ManBox<Dim,n>&box){ for(inti=0;i<n;i++) if((d[i].sec()<=box.d[i].lsc())|| (box.d[i].sec()<=d[i].lsc())){ //Doesnotoverlapfordimensioni for(intj=i+1;j<n;j++) if((d[j].sec()<=box.d[j].lsc())|| (box.d[j].sec()<=d[j].lsc())) returnES_OK; //Doesnotoverlapforonlydimensioni,hencepropagate d[i].nooverlap(home,box.d[i]); box.d[i].nooverlap(home,d[i]); returnES_OK; } //Overlapsinalldimensions returnES_FAILED; } template<classDim,intn> forceinlinevoid ManBox<Dim,n>::update(Space&home,boolshare,ManBox<Dim,n>&b){ for(inti=0;i<n;i++) d[i].update(home,share,b.d[i]); } template<classDim,intn> forceinlinevoid ManBox<Dim,n>::subscribe(Space&home,Propagator&p){ for(inti=0;i<n;i++) d[i].subscribe(home,p); } template<classDim,intn> forceinlinevoid ManBox<Dim,n>::cancel(Space&home,Propagator&p){ for(inti=0;i<n;i++) d[i].cancel(home,p); } /* *Optionalboxes * */ template<classDim,intn> forceinlinevoid OptBox<Dim,n>::optional(BoolViewo0){ o=o0; } template<classDim,intn> forceinlinebool OptBox<Dim,n>::mandatory(void)const{ returno.one(); } template<classDim,intn> forceinlinebool OptBox<Dim,n>::excluded(void)const{ returno.zero(); } template<classDim,intn> forceinlinebool OptBox<Dim,n>::optional(void)const{ returno.none(); } template<classDim,intn> forceinlineExecStatus OptBox<Dim,n>::exclude(Space&home){ GECODE_ME_CHECK(o.zero(home)); returnES_OK; } template<classDim,intn> forceinlinevoid OptBox<Dim,n>::update(Space&home,boolshare,OptBox<Dim,n>&b){ ManBox<Dim,n>::update(home,share,b); o.update(home,share,b.o); } template<classDim,intn> forceinlinevoid OptBox<Dim,n>::subscribe(Space&home,Propagator&p){ ManBox<Dim,n>::subscribe(home,p); o.subscribe(home,p,PC_BOOL_VAL); } template<classDim,intn> forceinlinevoid OptBox<Dim,n>::cancel(Space&home,Propagator&p){ ManBox<Dim,n>::cancel(home,p); o.cancel(home,p,PC_BOOL_VAL); } }}} //STATISTICS:int-prop