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 * Vincent Barichard <Vincent.Barichard@univ-angers.fr> 6 * 7 * Copyright: 8 * Christian Schulte, 2005 9 * Vincent Barichard, 2012 10 * 11 * This file is part of Gecode, the generic constraint 12 * development environment: 13 * http://www.gecode.org 14 * 15 * Permission is hereby granted, free of charge, to any person obtaining 16 * a copy of this software and associated documentation files (the 17 * "Software"), to deal in the Software without restriction, including 18 * without limitation the rights to use, copy, modify, merge, publish, 19 * distribute, sublicense, and/or sell copies of the Software, and to 20 * permit persons to whom the Software is furnished to do so, subject to 21 * the following conditions: 22 * 23 * The above copyright notice and this permission notice shall be 24 * included in all copies or substantial portions of the Software. 25 * 26 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 27 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 28 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 29 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 30 * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION 31 * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION 32 * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 33 * 34 */ 35 36#include "test/float.hh" 37 38#include <gecode/minimodel.hh> 39 40namespace Test { namespace Float { 41 42 /// %Tests for domain constraints 43 namespace Dom { 44 45 /** 46 * \defgroup TaskTestFloatDom Domain constraints 47 * \ingroup TaskTestFloat 48 */ 49 //@{ 50 /// %Test for domain constraints with a float value 51 class Val : public Test { 52 protected: 53 /// Float constant 54 Gecode::FloatVal c; 55 public: 56 /// Create and register test 57 Val(int n, Gecode::FloatVal c0, Gecode::FloatNum st) 58 : Test("Dom::Val::"+str(n)+"::"+str(c0), 59 n,-3,3,st,CPLT_ASSIGNMENT,n==1), c(c0) { 60 testsubsumed = false; 61 } 62 /// %Test whether \a x is solution 63 virtual MaybeType solution(const Assignment& x) const { 64 for (int i=x.size(); i--; ) 65 if ((x[i].max() > c.max()) || (x[i].min() < c.min())) 66 return MT_FALSE; 67 return MT_TRUE; 68 } 69 /// Post constraint on \a x 70 virtual void post(Gecode::Space& home, Gecode::FloatVarArray& x) { 71 if (x.size() == 1) 72 Gecode::dom(home, x[0], c); 73 else 74 Gecode::dom(home, x, c); 75 } 76 /// Post reified constraint on \a x for \a r 77 virtual void post(Gecode::Space& home, Gecode::FloatVarArray& x, 78 Gecode::Reify r) { 79 assert(x.size() == 1); 80 Gecode::dom(home, x[0], c, r); 81 } 82 }; 83 84 /// %Test for domain constraints with float numbers 85 class Num : public Test { 86 protected: 87 /// Float number 88 Gecode::FloatNum min; 89 /// Float number 90 Gecode::FloatNum max; 91 public: 92 /// Create and register test 93 Num(int n, Gecode::FloatNum min0, Gecode::FloatNum max0, 94 Gecode::FloatNum st) 95 : Test("Dom::Num::"+str(n)+"::"+str(min0)+"::"+str(max0), 96 n,-3,3,st,CPLT_ASSIGNMENT,n==1), min(min0), max(max0) { 97 testsubsumed = false; 98 } 99 /// %Test whether \a x is solution 100 virtual MaybeType solution(const Assignment& x) const { 101 if (max < min) 102 return MT_FALSE; 103 for (int i=x.size(); i--; ) 104 if ((x[i].max() > max) || (x[i].min() < min)) 105 return MT_FALSE; 106 return MT_TRUE; 107 } 108 /// Post constraint on \a x 109 virtual void post(Gecode::Space& home, Gecode::FloatVarArray& x) { 110 if (x.size() == 1) 111 Gecode::dom(home, x[0], min, max); 112 else 113 Gecode::dom(home, x, min, max); 114 } 115 /// Post reified constraint on \a x for \a r 116 virtual void post(Gecode::Space& home, Gecode::FloatVarArray& x, 117 Gecode::Reify r) { 118 assert(x.size() == 1); 119 Gecode::dom(home, x[0], min, max, r); 120 } 121 }; 122 123 /// Help class to create and register tests 124 class Create { 125 public: 126 /// Perform creation and registration 127 Create(void) { 128 using namespace Gecode; 129 FloatNum step = 0.7; 130 for (int c=-4; c<=4; c++) { 131 (void) new Val(1,c,step); 132 (void) new Val(2,c,step); 133 for (int d=-3; d<=3; d++) { 134 (void) new Num(1,c,d,step); 135 (void) new Num(2,c,d,step); 136 } 137 } 138 } 139 }; 140 141 Create c; 142 //@} 143 144 } 145 146}} 147 148// STATISTICS: test-float