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)
79 p = ap_linexpr0_add_dimensions(
const_cast<ap_linexpr0_t*
>(&x.
l),
88 p = ap_linexpr0_permute_dimensions(
const_cast<ap_linexpr0_t*
>(&x.
l),
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];
112 for (
size_t i=0;i<
size;i++) (*
this)[dims[i]] = coeffs[i];
145 ap_linexpr0_realloc(&
l,
size);
155 ap_linexpr0_permute_dimensions_with(&
l,
const_cast<ap_dimperm_t*
>(d.
get_ap_dimperm_t()));
166 return ap_linexpr0_size(
const_cast<ap_linexpr0_t*
>(&
l));
180 return reinterpret_cast<coeff&
>(*ap_linexpr0_cstref(
const_cast<ap_linexpr0_t*
>(&
l)));
185 return reinterpret_cast<coeff&
>(*ap_linexpr0_cstref(
const_cast<ap_linexpr0_t*
>(&
l)));
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);
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";
255 ap_linexpr0_fprint(stream,
const_cast<ap_linexpr0_t*
>(&
l), name_of_dim);
264 return ap_linexpr0_is_integer(
const_cast<ap_linexpr0_t*
>(&
l), intdim);
269 return ap_linexpr0_is_real(
const_cast<ap_linexpr0_t*
>(&
l), intdim);
274 return ap_linexpr0_type(
const_cast<ap_linexpr0_t*
>(&
l));
279 return ap_linexpr0_is_linear(
const_cast<ap_linexpr0_t*
>(&
l));
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));
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));
344 if (
l->discr == AP_LINEXPR_DENSE)
return;
345 while (pos < l->
size &&
l->p.linterm[
pos].dim == AP_DIM_MAX)
pos++;
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;
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);
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);
426 return pos <
l->size;
446 ap_linexpr0_minimize(&
l);
451 return ap_linexpr0_hash(
const_cast<ap_linexpr0_t*
>(&
l));
bool operator==(const abstract0 &x, const abstract0 &y)
Definition: apxx_abstract0_inline.hh:409
bool operator<=(const abstract0 &x, const abstract0 &y)
Definition: apxx_abstract0_inline.hh:421
bool operator>(const abstract0 &x, const abstract0 &y)
Definition: apxx_abstract0_inline.hh:433
bool operator<(const abstract0 &x, const abstract0 &y)
Definition: apxx_abstract0_inline.hh:438
bool operator>=(const abstract0 &x, const abstract0 &y)
Definition: apxx_abstract0_inline.hh:428
bool operator!=(const abstract0 &x, const abstract0 &y)
Definition: apxx_abstract0_inline.hh:416
std::vector< std::string > * get_varname(std::basic_ostream< charT, Traits > &os)
Definition: apxx_dimension_inline.hh:43
int compare(const linexpr0 &x, const linexpr0 &y)
Definition: apxx_linexpr0_inline.hh:287
bool equal(const linexpr0 &x, const linexpr0 &y)
Definition: apxx_linexpr0_inline.hh:293
static void apxx_linexpr0_init(ap_linexpr0_t *d, ap_linexpr_discr_t discr, size_t size)
Definition: apxx_linexpr0_inline.hh:23
static bool print_coeff_sign(std::ostream &os, const coeff &c, bool &first, bool cst)
Definition: apxx_linexpr0_inline.hh:206
static void apxx_linexpr0_clear(ap_linexpr0_t *d)
Definition: apxx_linexpr0_inline.hh:33
static void apxx_linexpr0_copy(ap_linexpr0_t *d, const ap_linexpr0_t *s)
Definition: apxx_linexpr0_inline.hh:39
std::ostream & operator<<(std::ostream &os, const linexpr0 &s)
Definition: apxx_linexpr0_inline.hh:229
Coefficient (ap_coeff_t wrapper).
Definition: apxx_coeff.hh:36
Represents a dimension (i.e., variable by index) in an expression tree.
Definition: apxx_texpr0.hh:33
Dimension change object (ap_dimchange_t wrapper).
Definition: apxx_dimension.hh:102
const ap_dimchange_t * get_ap_dimchange_t() const
Returns a pointer to the internal APRON object stored in *this.
Definition: apxx_dimension_inline.hh:204
Dimension permutation object (ap_dimperm_t wrapper).
Definition: apxx_dimension.hh:292
const ap_dimperm_t * get_ap_dimperm_t() const
Returns a pointer to the internal APRON object stored in *this.
Definition: apxx_dimension_inline.hh:422
Iterator to traverse a constant linexpr0.
Definition: apxx_linexpr0.hh:286
void operator++()
Moves the iterator to the following position.
Definition: apxx_linexpr0_inline.hh:419
ap_dim_t pos
Internal use only. Current index.
Definition: apxx_linexpr0.hh:295
void skip_AP_DIM_MAX()
Internal use only. Skips free coefficients in sparse expressions.
Definition: apxx_linexpr0_inline.hh:342
ap_linexpr0_t * l
Internal use only. Pointer to the underlying APRON structure.
Definition: apxx_linexpr0.hh:294
const_iterator & operator=(const const_iterator &i)
Assigns the iterator.
Definition: apxx_linexpr0_inline.hh:378
ap_dim_t get_dim() const
Returns the dimension of the coefficient at the current iterator position.
Definition: apxx_linexpr0_inline.hh:392
void next()
Moves the iterator to the following position.
Definition: apxx_linexpr0_inline.hh:413
bool valid() const
Whether we are at a valid position (true) or past the last iterator position (false).
Definition: apxx_linexpr0_inline.hh:424
const_iterator(ap_linexpr0_t *l)
Internal use only.
const coeff & get_coeff() const
Returns a reference to the coefficient at the current iterator position.
Definition: apxx_linexpr0_inline.hh:399
Iterator to traverse and mutate a linear expression.
Definition: apxx_linexpr0.hh:352
iterator & operator=(const iterator &i)
Assigns the iterator.
Definition: apxx_linexpr0_inline.hh:385
iterator(ap_linexpr0_t *l)
Internal use only.
coeff & get_coeff() const
Returns a (modifiable) reference to the coefficient at the current iterator position.
Definition: apxx_linexpr0_inline.hh:406
Level 0 linear expression (ap_linexpr0_t wrapper).
Definition: apxx_linexpr0.hh:44
void minimize()
Minimizes all coefficients.
Definition: apxx_linexpr0_inline.hh:444
~linexpr0()
Frees all space for the expression and coefficients.
Definition: apxx_linexpr0_inline.hh:120
linexpr0(ap_linexpr0_t *p)
Internal use only. Shallow copy of structure followed by a free to take ownership of expression.
Definition: apxx_linexpr0_inline.hh:60
iterator begin()
Returns a new iterator to traverse and mutate the linear expression.
Definition: apxx_linexpr0_inline.hh:429
bool is_integer(size_t intdim) const
Whether only dimensions greater than intdim have a non-zero coefficient.
Definition: apxx_linexpr0_inline.hh:262
coeff & operator[](ap_dim_t dim)
Returns a (modifiable) reference to the coefficient corresponding to the given dimension.
Definition: apxx_linexpr0_inline.hh:188
bool is_linear() const
Whether all coefficients are scalar.
Definition: apxx_linexpr0_inline.hh:277
ap_linexpr_type_t get_type() const
Gets the type of the linear expression.
Definition: apxx_linexpr0_inline.hh:272
bool is_real(size_t intdim) const
Whether only dimensions strictly smaller than intdim have a non-zero coefficient.
Definition: apxx_linexpr0_inline.hh:267
linexpr0 & operator=(const linexpr0 &x)
Makes a (deep) copy.
Definition: apxx_linexpr0_inline.hh:129
void resize(size_t size)
Changes the number of coefficients in the expression. (Useful only for dense expressions....
Definition: apxx_linexpr0_inline.hh:143
void print(char **name_of_dim=NULL, FILE *stream=stdout) const
Prints to a C stream.
Definition: apxx_linexpr0_inline.hh:253
bool is_quasilinear() const
Whether all coefficients are scalar, except maybe the constant one.
Definition: apxx_linexpr0_inline.hh:282
long hash() const
Returns a hash-code.
Definition: apxx_linexpr0_inline.hh:449
size_t size() const
Returns the number of coefficients in the expression.
Definition: apxx_linexpr0_inline.hh:164
const ap_linexpr0_t * get_ap_linexpr0_t() const
Returns a pointer to the internal APRON object stored in *this.
Definition: apxx_linexpr0_inline.hh:459
coeff & get_cst()
Returns a (modifiable) reference to the constant coefficient.
Definition: apxx_linexpr0_inline.hh:178
void permute_dimensions(const dimperm &d)
Applies a permutation on coefficients.
Definition: apxx_linexpr0_inline.hh:153
ap_linexpr_discr_t get_discr() const
Returns the expression type.
Definition: apxx_linexpr0_inline.hh:172
ap_linexpr0_t l
Structure managed by APRON.
Definition: apxx_linexpr0.hh:48
void add_dimensions(const dimchange &d)
Adds some dimensions, shifting coefficients if needed.
Definition: apxx_linexpr0_inline.hh:148