this repo has no description
1/* -*- mode: C++; c-basic-offset: 2; indent-tabs-mode: nil -*- */ 2/* 3 * Main authors: 4 * Christian Schulte <schulte@gecode.org> 5 * 6 * Copyright: 7 * Christian Schulte, 2012 8 * 9 * This file is part of Gecode, the generic constraint 10 * development environment: 11 * http://www.gecode.org 12 * 13 * Permission is hereby granted, free of charge, to any person obtaining 14 * a copy of this software and associated documentation files (the 15 * "Software"), to deal in the Software without restriction, including 16 * without limitation the rights to use, copy, modify, merge, publish, 17 * distribute, sublicense, and/or sell copies of the Software, and to 18 * permit persons to whom the Software is furnished to do so, subject to 19 * the following conditions: 20 * 21 * The above copyright notice and this permission notice shall be 22 * included in all copies or substantial portions of the Software. 23 * 24 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 25 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 26 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 27 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 28 * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION 29 * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION 30 * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 31 * 32 */ 33 34namespace Gecode { 35 36 /// Combine variable selection criteria for tie-breaking 37 template<class VarBranch> 38 class TieBreak { 39 public: 40 /// Branching criteria to try in order 41 VarBranch a, b, c, d; 42 /// Initialize with variable selection criteria 43 TieBreak(VarBranch a0 = VarBranch(), 44 VarBranch b0 = VarBranch(), 45 VarBranch c0 = VarBranch(), 46 VarBranch d0 = VarBranch()); 47 }; 48 49 /** 50 * \defgroup TaskModelBranchTieBreak Tie-breaking for variable selection 51 * 52 * \ingroup TaskModelBranch 53 */ 54 //@{ 55 /// Combine variable selection criteria \a a and \a b for tie-breaking 56 template<class VarBranch> 57 TieBreak<VarBranch> 58 tiebreak(VarBranch a, VarBranch b); 59 /// Combine variable selection criteria \a a, \a b, and \a c for tie-breaking 60 template<class VarBranch> 61 TieBreak<VarBranch> 62 tiebreak(VarBranch a, VarBranch b, VarBranch c); 63 /// Combine variable selection criteria \a a, \a b, \a c, and \a d for tie-breaking 64 template<class VarBranch> 65 TieBreak<VarBranch> 66 tiebreak(VarBranch a, VarBranch b, VarBranch c, VarBranch d); 67 //@} 68 69 70 template<class VarBranch> 71 forceinline 72 TieBreak<VarBranch>::TieBreak(VarBranch a0, 73 VarBranch b0, 74 VarBranch c0, 75 VarBranch d0) 76 : a(a0), b(b0), c(c0), d(d0) {} 77 78 template<class VarBranch> 79 TieBreak<VarBranch> 80 tiebreak(VarBranch a, VarBranch b) { 81 TieBreak<VarBranch> ab(a,b); 82 return ab; 83 } 84 85 template<class VarBranch> 86 TieBreak<VarBranch> 87 tiebreak(VarBranch a, VarBranch b, VarBranch c) { 88 TieBreak<VarBranch> abc(a,b,c); 89 return abc; 90 } 91 92 template<class VarBranch> 93 TieBreak<VarBranch> 94 tiebreak(VarBranch a, VarBranch b, VarBranch c, VarBranch d) { 95 TieBreak<VarBranch> abcd(a,b,c,d); 96 return abcd; 97 } 98 99} 100 101// STATISTICS: kernel-branch