~ubuntu-branches/debian/stretch/gecode/stretch

« back to all changes in this revision

Viewing changes to examples/cartesian-heart.cpp

  • Committer: Package Import Robot
  • Author(s): Kari Pahula
  • Date: 2013-05-25 15:57:32 UTC
  • mfrom: (1.1.17)
  • Revision ID: package-import@ubuntu.com-20130525155732-bltd8lu9my9borhk
Tags: 4.0.0-2
Give make check LD_LIBRARY_PATH=. to make test work without gecode
already installed, to fix FTBFS.

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/* -*- mode: C++; c-basic-offset: 2; indent-tabs-mode: nil -*- */
 
2
/*
 
3
 *  Main authors:
 
4
 *     Vincent Barichard <Vincent.Barichard@univ-angers.fr>
 
5
 *
 
6
 *  Copyright:
 
7
 *     Vincent Barichard, 2012
 
8
 *
 
9
 *  Last modified:
 
10
 *     $Date: 2013-02-04 22:40:26 +0100 (Mon, 04 Feb 2013) $ by $Author: schulte $
 
11
 *     $Revision: 13263 $
 
12
 *
 
13
 *  This file is part of Gecode, the generic constraint
 
14
 *  development environment:
 
15
 *     http://www.gecode.org
 
16
 *
 
17
 *  Permission is hereby granted, free of charge, to any person obtaining
 
18
 *  a copy of this software and associated documentation files (the
 
19
 *  "Software"), to deal in the Software without restriction, including
 
20
 *  without limitation the rights to use, copy, modify, merge, publish,
 
21
 *  distribute, sublicense, and/or sell copies of the Software, and to
 
22
 *  permit persons to whom the Software is furnished to do so, subject to
 
23
 *  the following conditions:
 
24
 *
 
25
 *  The above copyright notice and this permission notice shall be
 
26
 *  included in all copies or substantial portions of the Software.
 
27
 *
 
28
 *  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
 
29
 *  EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
 
30
 *  MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
 
31
 *  NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
 
32
 *  LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
 
33
 *  OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
 
34
 *  WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 
35
 *
 
36
 */
 
37
 
 
38
#include <gecode/driver.hh>
 
39
 
 
40
#include <gecode/minimodel.hh>
 
41
#include <gecode/float.hh>
 
42
 
 
43
using namespace Gecode;
 
44
 
 
45
/**
 
46
 * \brief %Example: Cartesian Heart
 
47
 *
 
48
 * There are many mathematical curves that produce heart shapes.
 
49
 * With a good solving effort, coordinates of a filled heart shape
 
50
 * can be computed by solving the cartesian equation:
 
51
 *
 
52
 * \f[
 
53
 * x^2+2\left(y-p\times\operatorname{abs}(x)^{\frac{1}{q}}\right)^2 = 1
 
54
 * \f]
 
55
 *
 
56
 * By setting \f$p=0.5\f$ and \f$q=2\f$, it yields to the equation:
 
57
 * 
 
58
 * \f[
 
59
 * x^2+2\left(y-\frac{\operatorname{abs}(x)^{\frac{1}{2}}}{2}\right)^2 = 1
 
60
 * \f]
 
61
 * 
 
62
 * To get reasonable interval starting sizes, \f$x\f$ and \f$y\f$
 
63
 * are restricted to \f$[-20;20]\f$.
 
64
 *
 
65
 * \ingroup Example
 
66
 */
 
67
class CartesianHeart : public Script {
 
68
protected:
 
69
  /// The numbers
 
70
  FloatVarArray f;
 
71
  /// Minimum distance between two solutions
 
72
  FloatNum step;
 
73
public:
 
74
  /// Actual model
 
75
  CartesianHeart(const Options&) 
 
76
    : f(*this,2,-20,20), step(0.01) {
 
77
    int q = 2;
 
78
    FloatNum p = 0.5;
 
79
    // Post equation
 
80
    rel(*this, sqr(f[0]) + 2*sqr(f[1]-p*nroot(abs(f[0]),q)) == 1);
 
81
    branch(*this, f[0], FLOAT_VAL_SPLIT_MIN());
 
82
    branch(*this, f[1], FLOAT_VAL_SPLIT_MIN());
 
83
  }
 
84
  /// Constructor for cloning \a p
 
85
  CartesianHeart(bool share, CartesianHeart& p) 
 
86
    : Script(share,p), step(p.step) {
 
87
    f.update(*this,share,p.f);
 
88
  }
 
89
  /// Copy during cloning
 
90
  virtual Space* copy(bool share) { 
 
91
    return new CartesianHeart(share,*this); 
 
92
  }
 
93
  /// Add constraints to current model to get next solution (not too close)
 
94
  virtual void constrain(const Space& _b) {
 
95
    const CartesianHeart& b = static_cast<const CartesianHeart&>(_b);
 
96
    rel(*this, 
 
97
        (f[0] >= (b.f[0].max()+step)) || 
 
98
        (f[1] >= (b.f[1].max()+step)) || 
 
99
        (f[1] <= (b.f[1].min()-step)));
 
100
  }
 
101
  /// Print solution coordinates
 
102
  virtual void print(std::ostream& os) const {
 
103
    os << "XY " << f[0].med() << " " << f[1].med()
 
104
       << std::endl;
 
105
  }
 
106
 
 
107
};
 
108
 
 
109
/** \brief Main-function
 
110
 *  \relates CartesianHeart
 
111
 */
 
112
int main(int argc, char* argv[]) {
 
113
  Options opt("CartesianHeart");
 
114
  opt.parse(argc,argv);
 
115
  opt.solutions(0);
 
116
  Script::run<CartesianHeart,BAB,Options>(opt);
 
117
  return 0;
 
118
}
 
119
 
 
120
// STATISTICS: example-any