27 ap_coeff_init(&d->cst,AP_COEFF_SCALAR);
28 if (discr==AP_LINEXPR_DENSE) d->p.coeff = NULL;
29 else d->p.linterm = NULL;
30 if (size) ap_linexpr0_realloc(d,size);
35 ap_linexpr0_realloc(d, 0);
36 ap_coeff_clear(&d->cst);
42 assert(d->discr==s->discr);
43 ap_linexpr0_realloc(d,s->size);
44 ap_coeff_set(&d->cst, const_cast<ap_coeff_t*>(&s->cst));
45 if (d->discr==AP_LINEXPR_DENSE) {
46 for (
size_t i=0; i<d->size; i++)
47 ap_coeff_set(&d->p.coeff[i], &s->p.coeff[i]);
50 for (
size_t i=0; i<d->size; i++) {
51 ap_coeff_set(&d->p.linterm[i].coeff, &s->p.linterm[i].coeff);
52 d->p.linterm[i].dim = s->p.linterm[i].dim;
60 inline linexpr0::linexpr0(ap_linexpr0_t* p) : l(*p)
65 inline linexpr0::linexpr0(ap_linexpr_discr_t discr,
size_t size)
70 inline linexpr0::linexpr0(
const linexpr0& x)
76 inline linexpr0::linexpr0(
const linexpr0& x,
const dimchange& d)
79 p = ap_linexpr0_add_dimensions(const_cast<ap_linexpr0_t*>(&x.l),
80 const_cast<ap_dimchange_t*>(d.get_ap_dimchange_t()));
85 inline linexpr0::linexpr0(
const linexpr0& x,
const dimperm& d)
88 p = ap_linexpr0_permute_dimensions(const_cast<ap_linexpr0_t*>(&x.l),
89 const_cast<ap_dimperm_t*>(d.get_ap_dimperm_t()));
94 inline linexpr0::linexpr0(
size_t size,
const coeff coeffs[],
const coeff& cst, ap_linexpr_discr_t discr)
97 for (
size_t i=0;i<size;i++) (*
this)[i] = coeffs[i];
101 inline linexpr0::linexpr0(
const std::vector<coeff>& coeffs,
const coeff& cst, ap_linexpr_discr_t discr)
103 size_t size = coeffs.size();
105 for (
size_t i=0;i<size;i++) (*
this)[i] = coeffs[i];
109 inline linexpr0::linexpr0(
size_t size,
const coeff coeffs[],
const ap_dim_t dims[],
const coeff& cst)
112 for (
size_t i=0;i<size;i++) (*
this)[dims[i]] = coeffs[i];
120 inline linexpr0::~linexpr0()
129 inline linexpr0& linexpr0::operator= (
const linexpr0& x)
143 inline void linexpr0::resize(
size_t size)
145 ap_linexpr0_realloc(&l, size);
150 ap_linexpr0_add_dimensions_with(&l, const_cast<ap_dimchange_t*>(d.get_ap_dimchange_t()));
155 ap_linexpr0_permute_dimensions_with(&l, const_cast<ap_dimperm_t*>(d.get_ap_dimperm_t()));
164 inline size_t linexpr0::size()
const 166 return ap_linexpr0_size(const_cast<ap_linexpr0_t*>(&l));
172 inline ap_linexpr_discr_t linexpr0::get_discr()
const 178 inline coeff& linexpr0::get_cst()
180 return reinterpret_cast<coeff&>(*ap_linexpr0_cstref(const_cast<ap_linexpr0_t*>(&l)));
183 inline const coeff& linexpr0::get_cst()
const 185 return reinterpret_cast<coeff&>(*ap_linexpr0_cstref(const_cast<ap_linexpr0_t*>(&l)));
188 inline coeff& linexpr0::operator[](ap_dim_t dim)
190 ap_coeff_t* x = ap_linexpr0_coeffref(&l, dim);
191 if (!x)
throw std::out_of_range(
"apron::linexpr0::operator[](ap_dim_t)");
192 return reinterpret_cast<coeff&>(*x);
195 inline const coeff& linexpr0::operator[](ap_dim_t dim)
const 197 const ap_coeff_t* x = ap_linexpr0_coeffref(const_cast<ap_linexpr0_t*>(&l), dim);
198 if (!x)
throw std::out_of_range(
"apron::linexpr0::operator[](ap_dim)t");
199 return reinterpret_cast<const coeff&>(*x);
206 static inline bool print_coeff_sign(std::ostream& os,
const coeff& c,
bool& first,
bool cst)
208 if (c.is_zero())
return false;
209 if (c.get_discr()==AP_COEFF_SCALAR) {
210 if (c.get_scalar()==1) {
211 if (!first) os <<
" + ";
214 else if (c.get_scalar().sgn()<0) {
215 if (first) os <<
"- " << -c;
216 else os <<
" - " << -c;
218 else if (first) os << c;
219 else os <<
" + " << c;
223 else os <<
" + " << c;
229 inline std::ostream&
operator<<(std::ostream& os,
const linexpr0& s)
234 size_t sz = (*names).size();
235 for (linexpr0::const_iterator i=s.begin();i.valid();++i) {
237 if (i.get_dim()<sz) os << (*names)[i.get_dim()];
238 else os <<
"x" << i.get_dim();
243 for (linexpr0::const_iterator i=s.begin();i.valid();++i) {
245 os <<
"x" << i.get_dim();
249 if (first) os <<
"0";
253 inline void linexpr0::print(
char** name_of_dim, FILE* stream)
const 255 ap_linexpr0_fprint(stream, const_cast<ap_linexpr0_t*>(&l), name_of_dim);
262 inline bool linexpr0::is_integer(
size_t intdim)
const 264 return ap_linexpr0_is_integer(const_cast<ap_linexpr0_t*>(&l), intdim);
267 inline bool linexpr0::is_real(
size_t intdim)
const 269 return ap_linexpr0_is_real(const_cast<ap_linexpr0_t*>(&l), intdim);
272 inline ap_linexpr_type_t linexpr0::get_type()
const 274 return ap_linexpr0_type(const_cast<ap_linexpr0_t*>(&l));
277 inline bool linexpr0::is_linear()
const 279 return ap_linexpr0_is_linear(const_cast<ap_linexpr0_t*>(&l));
282 inline bool linexpr0::is_quasilinear()
const 284 return ap_linexpr0_is_quasilinear(const_cast<ap_linexpr0_t*>(&l));
287 inline int compare(
const linexpr0& x,
const linexpr0& y)
289 return ap_linexpr0_compare(const_cast<ap_linexpr0_t*>(&x.l),
290 const_cast<ap_linexpr0_t*>(&y.l));
293 inline bool equal (
const linexpr0& x,
const linexpr0& y)
295 return ap_linexpr0_equal(const_cast<ap_linexpr0_t*>(&x.l),
296 const_cast<ap_linexpr0_t*>(&y.l));
299 #if 0 // overloaded to make constraints 301 inline bool operator>= (
const linexpr0& x,
const linexpr0& y)
303 return ap_linexpr0_compare(const_cast<ap_linexpr0_t*>(&x.l),
304 const_cast<ap_linexpr0_t*>(&y.l)) >= 0; }
306 inline bool operator<= (
const linexpr0& x,
const linexpr0& y)
308 return ap_linexpr0_compare(const_cast<ap_linexpr0_t*>(&x.l),
309 const_cast<ap_linexpr0_t*>(&y.l)) <= 0;
312 inline bool operator> (
const linexpr0& x,
const linexpr0& y)
314 return ap_linexpr0_compare(const_cast<ap_linexpr0_t*>(&x.l),
315 const_cast<ap_linexpr0_t*>(&y.l)) > 0;
318 inline bool operator< (
const linexpr0& x,
const linexpr0& y)
320 return ap_linexpr0_compare(const_cast<ap_linexpr0_t*>(&x.l),
321 const_cast<ap_linexpr0_t*>(&y.l)) < 0;
324 inline bool operator== (
const linexpr0& x,
const linexpr0& y)
326 return ap_linexpr0_equal(const_cast<ap_linexpr0_t*>(&x.l),
327 const_cast<ap_linexpr0_t*>(&y.l));
330 inline bool operator!= (
const linexpr0& x,
const linexpr0& y)
332 return !ap_linexpr0_equal(const_cast<ap_linexpr0_t*>(&x.l),
333 const_cast<ap_linexpr0_t*>(&y.l));
342 inline void linexpr0::const_iterator::skip_AP_DIM_MAX()
344 if (l->discr == AP_LINEXPR_DENSE)
return;
345 while (pos < l->size && l->p.linterm[pos].dim == AP_DIM_MAX) pos++;
348 inline linexpr0::const_iterator::const_iterator(ap_linexpr0_t* e)
354 inline linexpr0::const_iterator::const_iterator(
const linexpr0& e)
356 l = const_cast<ap_linexpr0_t*>(e.get_ap_linexpr0_t());
361 inline linexpr0::const_iterator::const_iterator(
const const_iterator& i)
366 inline linexpr0::iterator::iterator(ap_linexpr0_t* e)
367 : linexpr0::const_iterator(e)
370 inline linexpr0::iterator::iterator(linexpr0& e)
371 : linexpr0::const_iterator(e.get_ap_linexpr0_t())
374 inline linexpr0::iterator::iterator(
const iterator& i)
375 : linexpr0::const_iterator(i.l)
378 inline linexpr0::const_iterator& linexpr0::const_iterator::operator=(
const const_iterator& i)
385 inline linexpr0::iterator& linexpr0::iterator::operator=(
const iterator& i)
392 inline ap_dim_t linexpr0::const_iterator::get_dim()
const 394 if (pos >= l->size)
throw std::out_of_range(
"apron::linexpr0::const_iterator::get_dim()");
395 if (l->discr == AP_LINEXPR_DENSE)
return pos;
396 else return l->p.linterm[pos].dim;
399 inline const coeff& linexpr0::const_iterator::get_coeff()
const 401 if (pos >= l->size)
throw std::out_of_range(
"apron::linexpr0::const_iterator::get_coeff()");
402 if (l->discr == AP_LINEXPR_DENSE)
return reinterpret_cast<coeff&>(l->p.coeff[pos]);
403 else return reinterpret_cast<coeff&>(l->p.linterm[pos].coeff);
406 inline coeff& linexpr0::iterator::get_coeff()
const 408 if (pos >= l->size)
throw std::out_of_range(
"apron::linexpr0::iterator::get_coeff()");
409 if (l->discr == AP_LINEXPR_DENSE)
return reinterpret_cast<coeff&>(l->p.coeff[pos]);
410 else return reinterpret_cast<coeff&>(l->p.linterm[pos].coeff);
413 inline void linexpr0::const_iterator::next()
419 inline void linexpr0::const_iterator::operator++()
424 inline bool linexpr0::const_iterator::valid()
const 426 return pos < l->size;
429 inline linexpr0::iterator linexpr0::begin()
431 return iterator(*
this);
434 inline linexpr0::const_iterator linexpr0::begin()
const 436 return const_iterator(*
this);
444 inline void linexpr0::minimize()
446 ap_linexpr0_minimize(&l);
449 inline long linexpr0::hash()
const 451 return ap_linexpr0_hash(const_cast<ap_linexpr0_t*>(&l));
459 inline const ap_linexpr0_t* linexpr0::get_ap_linexpr0_t()
const 464 inline ap_linexpr0_t* linexpr0::get_ap_linexpr0_t()
std::ostream & operator<<(std::ostream &os, const linexpr0 &s)
Definition: apxx_linexpr0_inline.hh:229
std::vector< std::string > * get_varname(std::basic_ostream< charT, Traits > &os)
Definition: apxx_dimension_inline.hh:43
static void apxx_linexpr0_clear(ap_linexpr0_t *d)
Definition: apxx_linexpr0_inline.hh:33
abstract0 & add_dimensions(manager &m, abstract0 &dst, const abstract0 &src, const dimchange &d, bool project=false)
Definition: apxx_abstract0_inline.hh:1037
bool operator==(const abstract0 &x, const abstract0 &y)
Definition: apxx_abstract0.hh:410
static void apxx_linexpr0_init(ap_linexpr0_t *d, ap_linexpr_discr_t discr, size_t size)
Definition: apxx_linexpr0_inline.hh:23
bool operator>(const abstract0 &x, const abstract0 &y)
Definition: apxx_abstract0.hh:434
static bool print_coeff_sign(std::ostream &os, const coeff &c, bool &first, bool cst)
Definition: apxx_linexpr0_inline.hh:206
bool equal(const linexpr0 &x, const linexpr0 &y)
Definition: apxx_linexpr0_inline.hh:293
abstract0 & permute_dimensions(manager &m, abstract0 &dst, const abstract0 &src, const dimperm &d)
Definition: apxx_abstract0_inline.hh:1060
bool operator>=(const abstract0 &x, const abstract0 &y)
Definition: apxx_abstract0.hh:429
bool operator!=(const abstract0 &x, const abstract0 &y)
Definition: apxx_abstract0.hh:417
static void apxx_linexpr0_copy(ap_linexpr0_t *d, const ap_linexpr0_t *s)
Definition: apxx_linexpr0_inline.hh:39
bool operator<=(const abstract0 &x, const abstract0 &y)
Definition: apxx_abstract0.hh:422
int compare(const linexpr0 &x, const linexpr0 &y)
Definition: apxx_linexpr0_inline.hh:287
bool operator<(const abstract0 &x, const abstract0 &y)
Definition: apxx_abstract0.hh:439