APRONXX 0.9.15
/home/mine/apron/apronxx/apxx_lincons0.hh
Go to the documentation of this file.
1/* -*- C++ -*-
2 * apxx_lincons0.hh
3 *
4 * APRON Library / C++ class wrappers
5 *
6 * Copyright (C) Antoine Mine' 2007
7 *
8 */
9/* This file is part of the APRON Library, released under LGPL license
10 with an exception allowing the redistribution of statically linked
11 executables.
12
13 Please read the COPYING file packaged in the distribution.
14*/
15
16#ifndef __APXX_LINCONS0_HH
17#define __APXX_LINCONS0_HH
18
19#include <vector>
20#include "ap_lincons0.h"
21#include "apxx_linexpr0.hh"
22
23
24namespace apron {
25
28struct unsat {};
29
30
31
32/* ================================= */
33/* lincons0 */
34/* ================================= */
35
36
38
39 * A lincons0 object represents a linear constraint: expr==0, expr>=0, expr>0, expr!=0, or expr==0 mod c.
40 * It stores and manages a linexpr0 (linear expression with scalar or interval coefficients),
41 * a constraint type (==, >=, >, !=, mod), and (for modulo constraint) an auxiliary scalar (c).
42 */
43class lincons0 : public use_malloc {
44
45protected:
46
47 ap_lincons0_t l;
48
49
50 lincons0(ap_lincons0_t l);
51
52 friend class abstract0;
53
54public:
56
57 /* constructors */
58 /* ============ */
59
61
68
69 lincons0(ap_constyp_t constyp=AP_CONS_SUPEQ);
70
73 * The auxiliary scalar is not created (has_modulo returns false).
74 * \arg \c constyp can be \c AP_CONS_EQ, \c AP_CONS_SUPEQ, \c AP_CONS_SUP, or \c AP_CONS_DISEQ (but not \c AP_CONS_EQMOD).
75 */
76 lincons0(ap_constyp_t constyp, const linexpr0& lin);
77
82 lincons0(ap_constyp_t constyp, const linexpr0& lin, const scalar& modulo);
83
85 lincons0(const lincons0& x);
86
88 lincons0(const lincons0& x, const dimchange& d);
89
90
91 lincons0(const lincons0& x, const dimperm& d);
92
94 lincons0(unsat x);
95
97
98
99 /* destructor */
100 /* ========== */
101
102 /** @name Destructor */
104
106 ~lincons0();
107
110
111 /* assignment */
112 /* ========== */
113
114
115 //@{
116
118 lincons0& operator= (const lincons0& x);
119
120
122
127 */
128 void set_modulo(const scalar& c);
129
132
135 void set_linexpr(const linexpr0& c);
138
139
140 /* dimension operations */
141 /* ==================== */
142
145
146 /*! \brief Resizes the underlying linear expression.
147 *
148 * \throw std::invalid_argument if no valid linear expression has been defined.
149 */
150 void resize(size_t size);
155
156 void add_dimensions(const dimchange& d);
157
161
163
165
166
167 /* access */
168 /* ====== */
169
172
173 /* size */
179 size_t size() const;
181
182 /* get */
183
185
186 * \return either \c AP_CONS_EQ, \c AP_CONS_SUPEQ, \c AP_CONS_SUP, \c AP_CONS_EQMOD, or \c AP_CONS_DISEQ.
187 */
188 ap_constyp_t& get_constyp();
189
191
192 * \return either \c AP_CONS_EQ, \c AP_CONS_SUPEQ, \c AP_CONS_SUP, \c AP_CONS_EQMOD, or \c AP_CONS_DISEQ.
193 */
194 const ap_constyp_t& get_constyp() const;
197 bool has_modulo() const;
200
201 * \note The only way the linear expression may be invalid is when accessing fields of uninitialised
202 * (or enlarged) lincons0_array.
203 */
204 bool has_linexpr() const;
205
208 * \throw std::invalid_argument if no valid auxiliary scalar has been defined.
209 */
211
216 const scalar& get_modulo() const;
217
220
221 */
223
225
228 const linexpr0& get_linexpr() const;
229
230 /*! \brief Returns a (modifiable) reference to the constant coefficient.
231 *
232 * \throw std::invalid_argument if no valid linear expression has been defined.
233 */
234 coeff& get_cst();
235
236 /*! \brief Returns a reference to the constant coefficient.
237 *
238 * \throw std::invalid_argument if no valid linear expression has been defined.
239 */
240 const coeff& get_cst() const;
241
242 /*! \brief Returns a (modifiable) reference to the coefficient corresponding to the given dimension.
243 *
244 * \throw std::out_of_range if the expression is dense and the dimension exceeds the size
245 * of the expression; if the expression is sparse, it will be extended and no exception is thrown
246 * \throw std::invalid_argument if no valid linear expression has been defined.
247 */
248 coeff& operator[](ap_dim_t dim);
249
253 * of the expression; if the expression is sparse, it will be extended and no exception is thrown
254 * \throw std::invalid_argument if no valid linear expression has been defined.
255 */
256 const coeff& operator[](ap_dim_t dim) const;
257
258 //@}
259
260
261 /* print */
262 /* ===== */
263
266
272 * auxiliary scalar is missing (for modulo).
273 */
274 friend std::ostream& operator<< (std::ostream& os, const lincons0& s);
275
276
277 void print(char** name_of_dim=NULL, FILE* stream=stdout) const;
278
280
281
282 /* tests */
283 /* ===== */
287
290
291 */
292
293 bool is_unsat() const;
294
297
298 */
299 bool is_linear() const;
300
303
304 * \throw std::invalid_argument if no valid linear expression has been defined.
305 */
306 bool is_quasilinear() const;
307
308 // TODO: equal, compare (currently not in ap_lincons0.h) ???
309
311
312 /* TODO: evaluation, linearization, intelligent constructors */
313
315 /* C-level compatibility */
316 /* ===================== */
317
318
320
322 const ap_lincons0_t* get_ap_lincons0_t() const;
325 ap_lincons0_t* get_ap_lincons0_t();
326
328};
329
330
331
332/* ================================= */
333/* lincons0_array */
334/* ================================= */
335
336
342
343protected:
344
345 ap_lincons0_array_t a;
346
348 lincons0_array(ap_lincons0_array_t& a) : a(a) {}
349
350 friend class lincons1_array;
351 friend class abstract0;
352
353public:
354
355 /* constructors */
356 /* ============ */
360
361
363 * has_modulo and has_linexpr will return false on all elements of the array.
364 */
365 lincons0_array(size_t size);
366
367 //! (Deep) copy.
369
371 lincons0_array(const lincons0_array& x, const dimchange& d);
372
374 lincons0_array(const lincons0_array& x, const dimperm& d);
375
376 //! Creates a lincons0_array from an array of constraints of the given size (copied).
377 lincons0_array(size_t size, const lincons0 x[]);
378
380 lincons0_array(const std::vector<lincons0>& x);
383
384
385 /* destructor */
386 /* ========== */
387
390
391 //! Frees the space used by the array and all its constraints.
393
395
397 /* assignment */
398 /* ========== */
399
400
401 //@{
402
405
406
408 * \arg x should contain (at least) size elements.
409 */
411
412
413 lincons0_array& operator= (const std::vector<lincons0>& x);
414
416
418 /* dimension operations */
419 /* ==================== */
420
423
425 void resize(size_t size);
426
428 void add_dimensions(const dimchange& d);
429
430 //! Applies permute_dimensions to all constraints in the array.
431 void permute_dimensions(const dimperm& d);
432
434
435
436 /* access */
437 /* ====== */
438
439 /** @name Accesses */
441
443 size_t size() const;
444
447
448 //! Returns a pointer to the start of the internal array holding the constraints.
449 const lincons0* contents() const;
450
452 lincons0& operator[](size_t i);
455 const lincons0& operator[](size_t i) const;
456
457
461 lincons0& get(size_t i);
462
463 /*! \brief Returns a reference to an element (bound-checked).
464 *
465 * \throw std::out_of_range if the index is invalid.
466 */
467 const lincons0& get(size_t i) const;
470
471
472 /* conversion */
473 /* ========== */
474
477
479 operator std::vector<lincons0>() const;
480
482
483
484 /* print */
485 /* ===== */
486
489
497 friend std::ostream& operator<< (std::ostream& os, const lincons0_array& s);
498
500 void print(char** name_of_dim = NULL, FILE* stream=stdout) const;
501
503
504
505 /* tests */
506 /* ===== */
507
510
512 bool is_linear() const;
513
515 bool is_quasilinear() const;
516
518
519
520 /* C-level compatibility */
521 /* ===================== */
522
525
527 const ap_lincons0_array_t* get_ap_lincons0_array_t() const;
528
530 ap_lincons0_array_t* get_ap_lincons0_array_t();
531
533
534};
535
537
538}
539
540#endif /* __APXX_LINCONS0_HH */
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
Dimension permutation object (ap_dimperm_t wrapper).
Definition apxx_dimension.hh:292
size_t size() const
Returns the size of the array.
Definition apxx_lincons0.hh:376
friend class abstract0
Definition apxx_lincons0.hh:351
~lincons0_array()
Frees the space used by the array and all its constraints.
Definition apxx_lincons0.hh:314
lincons0 & get(size_t i)
Returns a (modifiable) reference to an element (bound-checked).
Definition apxx_lincons0.hh:401
const ap_lincons0_array_t * get_ap_lincons0_array_t() const
Returns a pointer to the internal APRON object stored in *this.
Definition apxx_lincons0.hh:463
void permute_dimensions(const dimperm &d)
Applies permute_dimensions to all constraints in the array.
Definition apxx_lincons0.hh:367
lincons0 * contents()
Returns a pointer to the start of the internal array holding the constraints.
Definition apxx_lincons0.hh:381
ap_lincons0_array_t a
Structure managed by APRON.
Definition apxx_lincons0.hh:345
lincons0_array(ap_lincons0_array_t &a)
Internal use only. Performs a shallow copy and takes ownership of the contents.
Definition apxx_lincons0.hh:348
void print(char **name_of_dim=NULL, FILE *stream=stdout) const
Prints to a C stream.
Definition apxx_lincons0.hh:439
bool is_linear() const
Whether all constraints are linear.
Definition apxx_lincons0.hh:448
bool is_quasilinear() const
Whether all constraints are quasi-linear.
Definition apxx_lincons0.hh:453
lincons0 & operator[](size_t i)
Returns a (modifiable) reference to an element, no bound checking.
Definition apxx_lincons0.hh:391
void resize(size_t size)
Resizes the array.
Definition apxx_lincons0.hh:357
friend class lincons1_array
Definition apxx_lincons0.hh:350
friend std::ostream & operator<<(std::ostream &os, const lincons0_array &s)
Printing.
Definition apxx_lincons0.hh:430
ap_lincons0_array_t * get_ap_lincons0_array_t()
Returns a pointer to the internal APRON object stored in *this.
Definition apxx_lincons0.hh:468
lincons0_array & operator=(const lincons0_array &x)
(Deep) copy.
Definition apxx_lincons0.hh:323
void add_dimensions(const dimchange &d)
Applies add_dimensions to all constraints in the array.
Definition apxx_lincons0.hh:362
Level 0 linear constraint (ap_lincons0_t wrapper).
Definition apxx_lincons0.hh:43
coeff & operator[](ap_dim_t dim)
Returns a (modifiable) reference to the coefficient corresponding to the given dimension.
Definition apxx_lincons0.hh:198
bool has_modulo() const
Whether the constraint has a valid auxiliary scalar (used in modulo constraints).
Definition apxx_lincons0.hh:146
bool has_linexpr() const
Whether the constraint has a valid linear expression.
Definition apxx_lincons0.hh:151
void add_dimensions(const dimchange &d)
Changes the dimension of the underlying linear expression.
Definition apxx_lincons0.hh:109
friend class abstract0
Definition apxx_lincons0.hh:52
void resize(size_t size)
Resizes the underlying linear expression.
Definition apxx_lincons0.hh:102
void set_linexpr(const linexpr0 &c)
Sets the underlying linear expression to c (copied).
Definition apxx_lincons0.hh:186
lincons0(ap_lincons0_t l)
Internal use only. Performs a shallow copy and takes ownership of the contents.
Definition apxx_lincons0.hh:24
bool is_unsat() const
Whether the constraint is unsatisfiable.
Definition apxx_lincons0.hh:230
bool is_quasilinear() const
Whether the underlying linear expression has only scalar coefficients, except maybe for the constant ...
Definition apxx_lincons0.hh:242
bool is_linear() const
Whether the underlying linear expression has only scalar coefficients.
Definition apxx_lincons0.hh:236
const ap_lincons0_t * get_ap_lincons0_t() const
Returns a pointer to the internal APRON object stored in *this.
Definition apxx_lincons0.hh:253
friend std::ostream & operator<<(std::ostream &os, const lincons0 &s)
Printing.
Definition apxx_lincons0.hh:208
ap_lincons0_t l
Structure managed by APRON.
Definition apxx_lincons0.hh:47
coeff & get_cst()
Returns a (modifiable) reference to the constant coefficient.
Definition apxx_lincons0.hh:192
scalar & get_modulo()
Returns a (modifiable) reference to the auxiliary scalar.
Definition apxx_lincons0.hh:156
~lincons0()
Frees the constraint, including the embedded linear expression and optional modulo scalar.
Definition apxx_lincons0.hh:73
void set_modulo(const scalar &c)
Sets the auxiliary scalar modulo to c (copied).
Definition apxx_lincons0.hh:168
ap_constyp_t & get_constyp()
Returns a (modifiable) reference to the constraint type.
Definition apxx_lincons0.hh:136
void print(char **name_of_dim=NULL, FILE *stream=stdout) const
Prints to a C stream.
Definition apxx_lincons0.hh:221
void permute_dimensions(const dimperm &d)
Applies a permutation to the underlying linear expression.
Definition apxx_lincons0.hh:115
size_t size() const
Returns the size of the underlying linear expression.
Definition apxx_lincons0.hh:127
linexpr0 & get_linexpr()
Returns a (modifiable) reference to the underlying linear expression.
Definition apxx_lincons0.hh:174
lincons0 & operator=(const lincons0 &x)
(Deep) copy.
Definition apxx_lincons0.hh:82
Level 0 linear expression (ap_linexpr0_t wrapper).
Definition apxx_linexpr0.hh:44
Scalar (ap_scalar_t wrapper).
Definition apxx_scalar.hh:89
Definition apxx_abstract0.hh:27
Unsatisfiable constraint, to simplify initialisations and assignments.
Definition apxx_lincons0.hh:28
Inherited by most wrappers to map new and delete to malloc and free.
Definition apxx_scalar.hh:69