FLOPC++
MP_expression.cpp
Go to the documentation of this file.
1 // ******************** FlopCpp **********************************************
2 // File: MP_expression.cpp
3 // $Id$
4 // Author: Tim Helge Hultberg (thh@mat.ua.pt)
5 // Copyright (C) 2003 Tim Helge Hultberg
6 // All Rights Reserved.
7 //****************************************************************************
8 
9 #include <sstream>
10 #include "MP_expression.hpp"
11 #include "MP_constant.hpp"
12 #include "MP_boolean.hpp"
13 #include "MP_constraint.hpp"
14 #include "MP_set.hpp"
15 #include "MP_variable.hpp"
16 
17 using namespace std;
18 
19 namespace flopc {
20 
22  friend class MP_expression;
23 
24 private:
25  Expression_constant(const Constant& c) : C(c) {}
26  double level() const {
27  return C->evaluate();
28  }
29  double getValue() const {
30  return C->evaluate();
31  }
32  int getColumn() const {
33  return -1;
34  }
35  int getStage() const {
36  return C->getStage(); //NB to be changed
37  }
38  void generate(const MP_domain& domain,
39  vector<Constant> multiplicators,
40  GenerateFunctor& f,
41  double m) const {
42  f.setMultiplicator(multiplicators,m);
43  f.setTerminalExpression(this);
44  domain.Forall(&f);
45  }
46  void insertVariables(set<MP_variable*>& v) const {}
47 
49 };
50 
52  friend MP_expression operator+(const MP_expression& e1, const MP_expression& e2);
53  friend MP_expression operator+(const MP_expression& e1, const Constant& e2);
54  friend MP_expression operator+(const Constant& e1, const MP_expression& e2);
55 private:
56  Expression_plus(const MP_expression& e1, const MP_expression& e2) :
57  Expression_operator(e1,e2) {}
58  double level() const {
59  return left->level()+right->level();
60  }
61  void generate(const MP_domain& domain,
62  vector<Constant> multiplicators,
63  GenerateFunctor& f,
64  double m) const {
65  left->generate(domain, multiplicators,f,m);
66  right->generate(domain, multiplicators,f,m);
67  }
68 };
69 
71  friend MP_expression operator-(const MP_expression& e1, const MP_expression& e2);
72  friend MP_expression operator-(const MP_expression& e1, const Constant& e2);
73  friend MP_expression operator-(const Constant& e1, const MP_expression& e2);
74 private:
75  Expression_minus(const MP_expression& e1, const MP_expression& e2) :
76  Expression_operator(e1,e2) {}
77  double level() const {
78  return left->level()-right->level();
79  }
80  void generate(const MP_domain& domain,
81  vector<Constant> multiplicators,
82  GenerateFunctor& f,
83  double m) const {
84  left->generate(domain, multiplicators,f,m);
85  right->generate(domain, multiplicators,f,-m);
86  }
87 };
88 
90  friend MP_expression operator*(const Constant& e1, const MP_expression& e2);
91  friend MP_expression operator*(const MP_expression& e1, const Constant& e2);
92 
93 private:
94  Expression_mult(const Constant& e1, const MP_expression& e2) :
95  left(e1), right(e2) {}
96  double level() const {
97  return left->evaluate()*right->level();
98  }
99  void generate(const MP_domain& domain,
100  vector<Constant> multiplicators,
101  GenerateFunctor& f,
102  double m) const {
103  multiplicators.push_back(left);
104  right->generate(domain, multiplicators, f, m);
105  }
106  void insertVariables(set<MP_variable*>& v) const {
107  right->insertVariables(v);
108  }
111 };
112 
113 class Expression_sum : public MP_expression_base, public Functor {
114  friend MP_expression sum(const MP_domain& d, const MP_expression& e);
115 private:
116  Expression_sum(const MP_domain& d, const MP_expression& e) :
117  D(d), exp(e) {}
118  void operator()() const {
119  the_sum += exp->level();
120  }
121  double level() const {
122  the_sum = 0;
123  D.Forall(this);
124  return the_sum;
125  }
126  void generate(const MP_domain& domain,
127  vector<Constant> multiplicators,
128  GenerateFunctor& f,
129  double m) const {
130  // The order, D*domain (NOT domain*D), is important for efficiency!
131  exp->generate(D*domain, multiplicators, f, m);
132  }
133  void insertVariables(set<MP_variable*>& v) const {
134  exp->insertVariables(v);
135  }
136 
137  mutable double the_sum;
140 };
141 
142 
144  return new Expression_plus(e1, e2);
145 }
147  return new Expression_plus(e1, e2);
148 }
150  return new Expression_plus(e1, e2);
151 }
152 
154  const MP_expression& e2) {
155  return new Expression_minus(e1, e2);
156 }
158  const Constant& e2) {
159  return new Expression_minus(e1, e2);
160 }
162  const MP_expression& e2) {
163  return new Expression_minus(e1, e2);
164 }
165 
167  return new Expression_mult(e1, e2);
168 }
170  return new Expression_mult(e2, e1);
171 }
172 
174  return new Expression_sum(d, e);
175 }
176 
177 } // End of namespace flopc
178 
179 using namespace flopc;
180 
181 
182 MP_expression::MP_expression(const Constant &c) :
184 
186  Handle<MP_expression_base*>(const_cast<VariableRef*>(&v)) {}
187 
189  return R->row_number();
190 }
191 
193  double multiplicator = m_;
194  int stage = 0;
195  for (unsigned int i=0; i<multiplicators.size(); i++) {
196  multiplicator *= multiplicators[i]->evaluate();
197  if (multiplicators[i]->getStage() > stage) {
198  stage = multiplicators[i]->getStage();
199  }
200  }
201  int rowNumber = row_number();
202  if (rowNumber != outOfBound) {
203  int colNumber = C->getColumn();
204  if ( colNumber != outOfBound ) {
205  double val = multiplicator*C->getValue();
206  int tstage = C->getStage();
207  if (tstage > stage) {
208  stage = tstage;
209  }
210  // For the SP core it might be usefull to generate zero coefs
211  // if (val != 0) {
212  Coefs.push_back(Coef(colNumber, rowNumber, val, stage));
213  //}
214  }
215  }
216 }
void generate(const MP_domain &domain, vector< Constant > multiplicators, GenerateFunctor &f, double m) const
double level() const
void generate(const MP_domain &domain, vector< Constant > multiplicators, GenerateFunctor &f, double m) const
void generate(const MP_domain &domain, vector< Constant > multiplicators, GenerateFunctor &f, double m) const
void operator()() const
virtual int row_number() const
Symbolic representation of a linear expression.This is one of the main public interface classes...
virtual double getValue() const =0
Expression_constant(const Constant &c)
void generate(const MP_domain &domain, vector< Constant > multiplicators, GenerateFunctor &f, double m) const
Expression_mult(const Constant &e1, const MP_expression &e2)
Expression_sum(const MP_domain &d, const MP_expression &e)
void Forall(const Functor *op) const
Special conditional operation on the domain.
Definition: MP_domain.cpp:85
double level() const
Utility for doing reference counted pointers.
Constant operator+(const Constant &a, const Constant &b)
Returns the sum of two constants.This is used in the formation of an expression.
const TerminalExpression * C
void insertVariables(set< MP_variable * > &v) const
std::vector< Coef > & Coefs
The base class for all expressions.
virtual int getColumn() const =0
const int outOfBound
Distinct return value on conditions where an index goes out of bounds.
Constant operator-(const Constant &a, const Constant &b)
Returns the difference of two constants.This is used in the formation of an expression.
void setTerminalExpression(const TerminalExpression *c)
Expression_minus(const MP_expression &e1, const MP_expression &e2)
double level() const
void generate(const MP_domain &domain, vector< Constant > multiplicators, GenerateFunctor &f, double m) const
std::vector< Constant > multiplicators
Internal representation of a Coefficient in a matrix.
Range over which some other constuct is defined.This is one of the main public interface classes...
Definition: MP_domain.hpp:61
int row_number() const
Function object. Often used.
Reference counted class for all &quot;constant&quot; types of data.
Definition: MP_constant.hpp:48
Functor to facilitate generation of coefficients.
void insertVariables(set< MP_variable * > &v) const
Constant operator*(const Constant &a, const Constant &b)
Returns the product of two constants.This is used in the formation of an expression.
void setMultiplicator(std::vector< Constant > &mults, double m)
MP_expression()
default constructor
Constant sum(const MP_domain &i, const Constant &e)
Returns the sum of two constants.
virtual int getStage() const =0
void insertVariables(set< MP_variable * > &v) const
The base class for all expressions.
Expression_plus(const MP_expression &e1, const MP_expression &e2)
The base class for all expressions.