Generated on Thu Apr 11 13:58:57 2019 for Gecode by doxygen 1.6.3

merit.hpp

Go to the documentation of this file.
00001 /* -*- mode: C++; c-basic-offset: 2; indent-tabs-mode: nil -*- */
00002 /*
00003  *  Main authors:
00004  *     Christian Schulte <schulte@gecode.org>
00005  *
00006  *  Copyright:
00007  *     Christian Schulte, 2012
00008  *
00009  *  This file is part of Gecode, the generic constraint
00010  *  development environment:
00011  *     http://www.gecode.org
00012  *
00013  *  Permission is hereby granted, free of charge, to any person obtaining
00014  *  a copy of this software and associated documentation files (the
00015  *  "Software"), to deal in the Software without restriction, including
00016  *  without limitation the rights to use, copy, modify, merge, publish,
00017  *  distribute, sublicense, and/or sell copies of the Software, and to
00018  *  permit persons to whom the Software is furnished to do so, subject to
00019  *  the following conditions:
00020  *
00021  *  The above copyright notice and this permission notice shall be
00022  *  included in all copies or substantial portions of the Software.
00023  *
00024  *  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
00025  *  EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
00026  *  MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
00027  *  NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
00028  *  LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
00029  *  OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
00030  *  WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
00031  *
00032  */
00033 
00034 namespace Gecode { namespace Int { namespace Branch {
00035 
00036   // Minimum merit
00037   template<class View>
00038   forceinline
00039   MeritMin<View>::MeritMin
00040     (Space& home, const VarBranch<MeritMin<View>::Var>& vb)
00041     : MeritBase<View,int>(home,vb) {}
00042   template<class View>
00043   forceinline
00044   MeritMin<View>::MeritMin(Space& home, MeritMin& m)
00045     : MeritBase<View,int>(home,m) {}
00046   template<class View>
00047   forceinline int
00048   MeritMin<View>::operator ()(const Space&, View x, int) {
00049     return x.min();
00050   }
00051 
00052   // Maximum merit
00053   template<class View>
00054   forceinline
00055   MeritMax<View>::MeritMax
00056     (Space& home, const VarBranch<MeritMax<View>::Var>& vb)
00057     : MeritBase<View,int>(home,vb) {}
00058   template<class View>
00059   forceinline
00060   MeritMax<View>::MeritMax(Space& home, MeritMax& m)
00061     : MeritBase<View,int>(home,m) {}
00062   template<class View>
00063   forceinline int
00064   MeritMax<View>::operator ()(const Space&, View x, int) {
00065     return x.max();
00066   }
00067 
00068   // Size merit
00069   template<class View>
00070   forceinline
00071   MeritSize<View>::MeritSize
00072     (Space& home, const VarBranch<MeritSize<View>::Var>& vb)
00073     : MeritBase<View,unsigned int>(home,vb) {}
00074   template<class View>
00075   forceinline
00076   MeritSize<View>::MeritSize(Space& home, MeritSize& m)
00077     : MeritBase<View,unsigned int>(home,m) {}
00078   template<class View>
00079   forceinline unsigned int
00080   MeritSize<View>::operator ()(const Space&, View x, int) {
00081     return x.size();
00082   }
00083 
00084   // Degree over size merit
00085   template<class View>
00086   forceinline
00087   MeritDegreeSize<View>::MeritDegreeSize
00088     (Space& home, const VarBranch<MeritDegreeSize<View>::Var>& vb)
00089     : MeritBase<View,double>(home,vb) {}
00090   template<class View>
00091   forceinline
00092   MeritDegreeSize<View>::MeritDegreeSize(Space& home, MeritDegreeSize& m)
00093     : MeritBase<View,double>(home,m) {}
00094   template<class View>
00095   forceinline double
00096   MeritDegreeSize<View>::operator ()(const Space&, View x, int) {
00097     return static_cast<double>(x.degree()) / static_cast<double>(x.size());
00098   }
00099 
00100   // AFC over size merit
00101   template<class View>
00102   forceinline
00103   MeritAFCSize<View>::MeritAFCSize
00104     (Space& home, const VarBranch<MeritAFCSize<View>::Var>& vb)
00105     : MeritBase<View,double>(home,vb), afc(vb.afc()) {}
00106   template<class View>
00107   forceinline
00108   MeritAFCSize<View>::MeritAFCSize(Space& home, MeritAFCSize& m)
00109     : MeritBase<View,double>(home,m), afc(m.afc) {}
00110   template<class View>
00111   forceinline double
00112   MeritAFCSize<View>::operator ()(const Space&, View x, int) {
00113     return x.afc() / static_cast<double>(x.size());
00114   }
00115   template<class View>
00116   forceinline bool
00117   MeritAFCSize<View>::notice(void) const {
00118     return false;
00119   }
00120   template<class View>
00121   forceinline void
00122   MeritAFCSize<View>::dispose(Space&) {
00123     // Not needed
00124     afc.~AFC();
00125   }
00126 
00127   // Action over size merit
00128   template<class View>
00129   forceinline
00130   MeritActionSize<View>::MeritActionSize
00131   (Space& home, const VarBranch<MeritActionSize<View>::Var>& vb)
00132     : MeritBase<View,double>(home,vb), action(vb.action()) {}
00133   template<class View>
00134   forceinline
00135   MeritActionSize<View>::MeritActionSize(Space& home, MeritActionSize& m)
00136     : MeritBase<View,double>(home,m), action(m.action) {}
00137   template<class View>
00138   forceinline double
00139   MeritActionSize<View>::operator ()(const Space&, View x, int i) {
00140     return action[i] / static_cast<double>(x.size());
00141   }
00142   template<class View>
00143   forceinline bool
00144   MeritActionSize<View>::notice(void) const {
00145     return true;
00146   }
00147   template<class View>
00148   forceinline void
00149   MeritActionSize<View>::dispose(Space&) {
00150     action.~Action();
00151   }
00152 
00153   // CHB over size merit
00154   template<class View>
00155   forceinline
00156   MeritCHBSize<View>::MeritCHBSize
00157   (Space& home, const VarBranch<MeritCHBSize<View>::Var>& vb)
00158     : MeritBase<View,double>(home,vb), chb(vb.chb()) {}
00159   template<class View>
00160   forceinline
00161   MeritCHBSize<View>::MeritCHBSize(Space& home, MeritCHBSize& m)
00162     : MeritBase<View,double>(home,m), chb(m.chb) {}
00163   template<class View>
00164   forceinline double
00165   MeritCHBSize<View>::operator ()(const Space&, View x, int i) {
00166     return chb[i] / static_cast<double>(x.size());
00167   }
00168   template<class View>
00169   forceinline bool
00170   MeritCHBSize<View>::notice(void) const {
00171     return true;
00172   }
00173   template<class View>
00174   forceinline void
00175   MeritCHBSize<View>::dispose(Space&) {
00176     chb.~CHB();
00177   }
00178 
00179   // Minimum regret merit
00180   template<class View>
00181   forceinline
00182   MeritRegretMin<View>::MeritRegretMin
00183   (Space& home, const VarBranch<MeritRegretMin<View>::Var>& vb)
00184     : MeritBase<View,unsigned int>(home,vb) {}
00185   template<class View>
00186   forceinline
00187   MeritRegretMin<View>::MeritRegretMin(Space& home, MeritRegretMin& m)
00188     : MeritBase<View,unsigned int>(home,m) {}
00189   template<class View>
00190   forceinline unsigned int
00191   MeritRegretMin<View>::operator ()(const Space&, View x, int) {
00192     return x.regret_min();
00193   }
00194 
00195   // Maximum regret merit
00196   template<class View>
00197   forceinline
00198   MeritRegretMax<View>::MeritRegretMax
00199   (Space& home, const VarBranch<MeritRegretMax<View>::Var>& vb)
00200     : MeritBase<View,unsigned int>(home,vb) {}
00201   template<class View>
00202   forceinline
00203   MeritRegretMax<View>::MeritRegretMax(Space& home, MeritRegretMax& m)
00204     : MeritBase<View,unsigned int>(home,m) {}
00205   template<class View>
00206   forceinline unsigned int
00207   MeritRegretMax<View>::operator ()(const Space&, View x, int) {
00208     return x.regret_max();
00209   }
00210 
00211 }}}
00212 
00213 // STATISTICS: int-branch