this repo has no description
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 * 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
34#include <gecode/driver.hh>
35
36#include <gecode/minimodel.hh>
37#include <gecode/float.hh>
38
39using namespace Gecode;
40
41/**
42 * \brief %Example: Folium of Descartes
43 *
44 * The folium of Descartes is a curve defined by the equation:
45 * \f[
46 * x^3 + y^3 - 3axy = 0
47 * \f]
48 *
49 * A technique to solve it, is to write \f$y=px\f$ and solve for
50 * \f$x\f$ and \f$y\f$ in terms of \f$p\f$. By setting
51 * \f$a=1\f$, it yields to the paramatric equation:
52 *
53 * \f[
54 * x^3 + y^3 - 3xy = 0
55 * \f]
56 * \f[
57 * x=\frac{3p}{1+p^3},\quad y=\frac{3p^2}{1+p^3}
58 * \f]
59 *
60 * The parameter \f$p\f$ is related to the position on the curve
61 * and is constrained to get different solutions for \f$x\f$ and
62 * \f$y\f$. To get reasonable interval starting sizes, \f$p\f$
63 * and \f$y\f$ are restricted to \f$[-20;20]\f$ and \f$x\f$ is
64 * restricted to \f$[-1;2]\f$.
65 *
66 * \ingroup Example
67 */
68class DescartesFolium : public FloatMaximizeScript {
69protected:
70 /// The numbers
71 FloatVarArray f;
72 /// Minimum distance between two solutions
73 double step;
74public:
75 /// Actual model
76 DescartesFolium(const Options& opt)
77 : FloatMaximizeScript(opt), f(*this,3,-20,20) {
78
79 if (opt.trace() != 0)
80 trace(*this, f, opt.trace());
81
82 // Post equation
83 FloatVar p = f[0];
84 FloatVar x = f[1];
85 FloatVar y = f[2];
86 rel(*this, 3*p/(1+pow(p,3)) == x);
87 rel(*this, 3*sqr(p)/(1+pow(p,3)) == y);
88 rel(*this, pow(x,3) + pow(y,3) == 3 * x * y);
89 rel(*this, x == FloatVal(-1,2));
90
91 branch(*this,p,FLOAT_VAL_SPLIT_MIN());
92 }
93 /// Constructor for cloning \a p
94 DescartesFolium(DescartesFolium& p)
95 : FloatMaximizeScript(p) {
96 f.update(*this, p.f);
97 }
98 /// Copy during cloning
99 virtual Space* copy(void) {
100 return new DescartesFolium(*this);
101 }
102 /// Cost function
103 virtual FloatVar cost(void) const {
104 return f[0];
105 }
106 /// Print solution coordinates
107 virtual void print(std::ostream& os) const {
108 os << "XY " << f[1].med() << " " << f[2].med()
109 << std::endl;
110 }
111
112};
113
114/** \brief Main-function
115 * \relates DescartesFolium
116 */
117int main(int argc, char* argv[]) {
118 Options opt("DescartesFolium");
119 opt.solutions(0);
120 opt.step(0.1);
121 opt.parse(argc,argv);
122 FloatMaximizeScript::run<DescartesFolium,BAB,Options>(opt);
123 return 0;
124}
125
126// STATISTICS: example-any