Generated on Thu Mar 22 10:39:33 2012 for Gecode by doxygen 1.6.3

array.cpp

Go to the documentation of this file.
00001 /* -*- mode: C++; c-basic-offset: 2; indent-tabs-mode: nil -*- */
00002 /*
00003  *  Main authors:
00004  *     Guido Tack <tack@gecode.org>
00005  *     Christian Schulte <schulte@gecode.org>
00006  *     Gabor Szokoli <szokoli@gecode.org>
00007  *
00008  *  Copyright:
00009  *     Guido Tack, 2004
00010  *     Christian Schulte, 2004
00011  *     Gabor Szokoli, 2004
00012  *
00013  *  Last modified:
00014  *     $Date: 2011-04-05 15:56:09 +0200 (Tue, 05 Apr 2011) $ by $Author: tack $
00015  *     $Revision: 11894 $
00016  *
00017  *  This file is part of Gecode, the generic constraint
00018  *  development environment:
00019  *     http://www.gecode.org
00020  *
00021  *  Permission is hereby granted, free of charge, to any person obtaining
00022  *  a copy of this software and associated documentation files (the
00023  *  "Software"), to deal in the Software without restriction, including
00024  *  without limitation the rights to use, copy, modify, merge, publish,
00025  *  distribute, sublicense, and/or sell copies of the Software, and to
00026  *  permit persons to whom the Software is furnished to do so, subject to
00027  *  the following conditions:
00028  *
00029  *  The above copyright notice and this permission notice shall be
00030  *  included in all copies or substantial portions of the Software.
00031  *
00032  *  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
00033  *  EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
00034  *  MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
00035  *  NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
00036  *  LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
00037  *  OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
00038  *  WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
00039  *
00040  */
00041 
00042 
00043 
00044 #include <gecode/set.hh>
00045 
00046 namespace Gecode {
00047 
00048   SetVarArray::SetVarArray(Space& home, int n)
00049     : VarArray<SetVar>(home,n) {
00050     for (int i = size(); i--; )
00051       x[i] = SetVar(home);
00052   }
00053 
00054   SetVarArray::SetVarArray(Space& home,int n,
00055                            int lbMin,int lbMax,int ubMin,int ubMax,
00056                            unsigned int minCard,
00057                            unsigned int maxCard)
00058     : VarArray<SetVar>(home,n) {
00059     Set::Limits::check(lbMin,"SetVarArray::SetVarArray");
00060     Set::Limits::check(lbMax,"SetVarArray::SetVarArray");
00061     Set::Limits::check(ubMin,"SetVarArray::SetVarArray");
00062     Set::Limits::check(ubMax,"SetVarArray::SetVarArray");
00063     Set::Limits::check(maxCard,"SetVarArray::SetVarArray");
00064     unsigned int glbSize = 
00065       (lbMin <= lbMax ? static_cast<unsigned int>(lbMax-lbMin+1) : 0U);
00066     unsigned int lubSize = 
00067       (ubMin <= ubMax ? static_cast<unsigned int>(ubMax-ubMin+1) : 0U);
00068     if (minCard > maxCard || minCard > lubSize || maxCard < glbSize ||
00069         lbMin < ubMin || lbMax > ubMax)
00070       throw Set::VariableEmptyDomain("SetVarArray::SetVarArray");
00071     for (int i = size(); i--; )
00072       x[i] = SetVar(home,lbMin,lbMax,ubMin,ubMax,minCard,maxCard);
00073   }
00074 
00075   SetVarArray::SetVarArray(Space& home,int n,
00076                            const IntSet& glb,int ubMin,int ubMax,
00077                            unsigned int minCard,unsigned int maxCard)
00078     : VarArray<SetVar>(home,n) {
00079     Set::Limits::check(glb,"SetVarArray::SetVarArray");
00080     Set::Limits::check(ubMin,"SetVarArray::SetVarArray");
00081     Set::Limits::check(ubMax,"SetVarArray::SetVarArray");
00082     Set::Limits::check(maxCard,"SetVarArray::SetVarArray");
00083     IntSetRanges glbr(glb);
00084     unsigned int glbSize = Iter::Ranges::size(glbr);
00085     unsigned int lubSize = 
00086       (ubMin <= ubMax ? static_cast<unsigned int>(ubMax-ubMin+1) : 0U);
00087     if (minCard > maxCard || minCard > lubSize || maxCard < glbSize ||
00088         glb.min() < ubMin || glb.max() > ubMax)
00089       throw Set::VariableEmptyDomain("SetVarArray::SetVarArray");
00090     for (int i = size(); i--; )
00091       x[i] = SetVar(home,glb,ubMin,ubMax,minCard,maxCard);
00092   }
00093 
00094   SetVarArray::SetVarArray(Space& home,int n,
00095                            int lbMin,int lbMax,const IntSet& lub,
00096                            unsigned int minCard,unsigned int maxCard)
00097     : VarArray<SetVar>(home,n) {
00098     Set::Limits::check(lbMin,"SetVarArray::SetVarArray");
00099     Set::Limits::check(lbMax,"SetVarArray::SetVarArray");
00100     Set::Limits::check(lub,"SetVarArray::SetVarArray");
00101     Set::Limits::check(maxCard,"SetVarArray::SetVarArray");
00102     Iter::Ranges::Singleton glbr(lbMin,lbMax);
00103     IntSetRanges lubr(lub);
00104     IntSetRanges lubr_s(lub);
00105     unsigned int glbSize = 
00106       (lbMin <= lbMax ? static_cast<unsigned int>(lbMax-lbMin+1) : 0U);
00107     unsigned int lubSize = Iter::Ranges::size(lubr_s);
00108     if (minCard > maxCard || minCard > lubSize || maxCard < glbSize ||
00109         !Iter::Ranges::subset(glbr,lubr))
00110       throw Set::VariableEmptyDomain("SetVarArray::SetVarArray");
00111     for (int i = size(); i--; )
00112       x[i] = SetVar(home,lbMin,lbMax,lub,minCard,maxCard);
00113   }
00114 
00115   SetVarArray::SetVarArray(Space& home,int n,
00116                            const IntSet& glb, const IntSet& lub,
00117                            unsigned int minCard, unsigned int maxCard)
00118     : VarArray<SetVar>(home,n) {
00119     Set::Limits::check(glb,"SetVarArray::SetVarArray");
00120     Set::Limits::check(lub,"SetVarArray::SetVarArray");
00121     Set::Limits::check(maxCard,"SetVarArray::SetVarArray");
00122     IntSetRanges glbr(glb);
00123     IntSetRanges glbr_s(glb);
00124     unsigned int glbSize = Iter::Ranges::size(glbr_s);
00125     IntSetRanges lubr(lub);
00126     IntSetRanges lubr_s(lub);
00127     unsigned int lubSize = Iter::Ranges::size(lubr_s);
00128     if (minCard > maxCard || minCard > lubSize || maxCard < glbSize ||
00129         !Iter::Ranges::subset(glbr,lubr))
00130       throw Set::VariableEmptyDomain("SetVar");
00131     for (int i = size(); i--; )
00132       x[i] = SetVar(home,glb,lub,minCard,maxCard);
00133   }
00134 
00135   SetVarArgs::SetVarArgs(Space& home,int n,
00136                          int lbMin,int lbMax,int ubMin,int ubMax,
00137                          unsigned int minCard,
00138                          unsigned int maxCard)
00139     : VarArgArray<SetVar>(n) {
00140     Set::Limits::check(lbMin,"SetVarArgs::SetVarArgs");
00141     Set::Limits::check(lbMax,"SetVarArgs::SetVarArgs");
00142     Set::Limits::check(ubMin,"SetVarArgs::SetVarArgs");
00143     Set::Limits::check(ubMax,"SetVarArgs::SetVarArgs");
00144     Set::Limits::check(maxCard,"SetVarArgs::SetVarArgs");
00145     unsigned int glbSize = 
00146       (lbMin <= lbMax ? static_cast<unsigned int>(lbMax-lbMin+1) : 0U);
00147     unsigned int lubSize = 
00148       (ubMin <= ubMax ? static_cast<unsigned int>(ubMax-ubMin+1) : 0U);
00149     if (minCard > maxCard || minCard > lubSize || maxCard < glbSize ||
00150         lbMin < ubMin || lbMax > ubMax)
00151       throw Set::VariableEmptyDomain("SetVarArgs::SetVarArgs");
00152     for (int i = size(); i--; )
00153       a[i] = SetVar(home,lbMin,lbMax,ubMin,ubMax,minCard,maxCard);
00154   }
00155 
00156   SetVarArgs::SetVarArgs(Space& home,int n,
00157                          const IntSet& glb,int ubMin,int ubMax,
00158                          unsigned int minCard,unsigned int maxCard)
00159     : VarArgArray<SetVar>(n) {
00160     Set::Limits::check(glb,"SetVarArgs::SetVarArgs");
00161     Set::Limits::check(ubMin,"SetVarArgs::SetVarArgs");
00162     Set::Limits::check(ubMax,"SetVarArgs::SetVarArgs");
00163     Set::Limits::check(maxCard,"SetVarArgs::SetVarArgs");
00164     IntSetRanges glbr(glb);
00165     unsigned int glbSize = Iter::Ranges::size(glbr);
00166     unsigned int lubSize = 
00167       (ubMin <= ubMax ? static_cast<unsigned int>(ubMax-ubMin+1) : 0U);
00168     if (minCard > maxCard || minCard > lubSize || maxCard < glbSize ||
00169         glb.min() < ubMin || glb.max() > ubMax)
00170       throw Set::VariableEmptyDomain("SetVarArgs::SetVarArgs");
00171     for (int i = size(); i--; )
00172       a[i] = SetVar(home,glb,ubMin,ubMax,minCard,maxCard);
00173   }
00174 
00175   SetVarArgs::SetVarArgs(Space& home,int n,
00176                          int lbMin,int lbMax,const IntSet& lub,
00177                          unsigned int minCard,unsigned int maxCard)
00178     : VarArgArray<SetVar>(n) {
00179     Set::Limits::check(lbMin,"SetVarArgs::SetVarArgs");
00180     Set::Limits::check(lbMax,"SetVarArgs::SetVarArgs");
00181     Set::Limits::check(lub,"SetVarArgs::SetVarArgs");
00182     Set::Limits::check(maxCard,"SetVarArgs::SetVarArgs");
00183     Iter::Ranges::Singleton glbr(lbMin,lbMax);
00184     IntSetRanges lubr(lub);
00185     IntSetRanges lubr_s(lub);
00186     unsigned int glbSize = 
00187       (lbMin <= lbMax ? static_cast<unsigned int>(lbMax-lbMin+1) : 0U);
00188     unsigned int lubSize = Iter::Ranges::size(lubr_s);
00189     if (minCard > maxCard || minCard > lubSize || maxCard < glbSize ||
00190         !Iter::Ranges::subset(glbr,lubr))
00191       throw Set::VariableEmptyDomain("SetVarArgs::SetVarArgs");
00192     for (int i = size(); i--; )
00193       a[i] = SetVar(home,lbMin,lbMax,lub,minCard,maxCard);
00194   }
00195 
00196   SetVarArgs::SetVarArgs(Space& home,int n,
00197                          const IntSet& glb, const IntSet& lub,
00198                          unsigned int minCard, unsigned int maxCard)
00199     : VarArgArray<SetVar>(n) {
00200     Set::Limits::check(glb,"SetVarArgs::SetVarArgs");
00201     Set::Limits::check(lub,"SetVarArgs::SetVarArgs");
00202     Set::Limits::check(maxCard,"SetVarArgs::SetVarArgs");
00203     IntSetRanges glbr(glb);
00204     IntSetRanges glbr_s(glb);
00205     unsigned int glbSize = Iter::Ranges::size(glbr_s);
00206     IntSetRanges lubr(lub);
00207     IntSetRanges lubr_s(lub);
00208     unsigned int lubSize = Iter::Ranges::size(lubr_s);
00209     if (minCard > maxCard || minCard > lubSize || maxCard < glbSize ||
00210         !Iter::Ranges::subset(glbr,lubr))
00211       throw Set::VariableEmptyDomain("SetVar");
00212     for (int i = size(); i--; )
00213       a[i] = SetVar(home,glb,lub,minCard,maxCard);
00214   }
00215 
00216 }
00217 
00218 // STATISTICS: set-other
00219