/usr/lib/ocaml/apron/coeff.idl is in libapron-ocaml-dev 0.9.10-7.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 | /* -*- mode: c -*- */
/* This file is part of the APRON Library, released under LGPL license.
Please read the COPYING file packaged in the distribution */
quote(C, "\n\
#include <limits.h>\n\
#include \"ap_coeff.h\"\n\
#include \"apron_caml.h\"\n\
\n\
#define Scalar AP_COEFF_SCALAR\n\
#define Interval AP_COEFF_INTERVAL\n\
")
import "scalar.idl";
import "interval.idl";
/* For ap_coeff_t,
- the conversion from ML to C may use allocation, but it is automatically freed
by Camlidl mechanisms
- the conversion from C to ML duplicate the C allocated memory.
Hence, the C type should be explicitly deallocated
(if allocated from the underlying C function)
*/
struct ap_coeff_t {
int discr; /* discriminant for coefficient */
[switch_is(discr)] union {
case Scalar: [ref]ap_scalar_t* scalar;
/* cst (normal linear expression) */
case Interval: [ref]struct ap_interval_t* interval;
/* interval (quasi-linear expression) */
} val;
};
quote(MLMLI,"(** APRON Coefficients (either scalars or intervals) *)")
quote(MLI,"\n\
val s_of_mpq : Mpq.t -> t\n\
val s_of_mpqf : Mpqf.t -> t\n\
val s_of_int : int -> t\n\
val s_of_frac : int -> int -> t\n\
(** Create a scalar coefficient of type [Mpqf.t] from resp.\n\
- A multi-precision rational [Mpq.t] \n\
- A multi-precision rational [Mpqf.t] \n\
- an integer \n\
- a fraction [x/y]\n\
*)\n\
\n\
val s_of_float : float -> t\n\
(** Create an interval coefficient of type [Float] with the given value *)\n\
val s_of_mpfr : Mpfr.t -> t\n\
(** Create an interval coefficient of type [Mpfr] with the given value *)\n\
val i_of_scalar : Scalar.t -> Scalar.t -> t\n\
(** Build an interval from a lower and an upper bound *)\n\
val i_of_mpq : Mpq.t -> Mpq.t -> t\n\
val i_of_mpqf : Mpqf.t -> Mpqf.t -> t\n\
val i_of_int : int -> int -> t\n\
val i_of_frac : int -> int -> int -> int -> t\n\
val i_of_float : float -> float -> t\n\
val i_of_mpfr : Mpfr.t -> Mpfr.t -> t\n\
(** Create an interval coefficient from resp. two\n\
- multi-precision rationals [Mpq.t] \n\
- multi-precision rationals [Mpqf.t] \n\
- integers \n\
- fractions [x/y] and [z/w]\n\
- machine floats\n\
- Mpfr floats\n\
*)\n\
\n\
val is_scalar : t -> bool\n\
val is_interval : t -> bool\n\
val cmp : t -> t -> int\n\
(** Non Total Comparison:\n\
- If the 2 coefficients are both scalars, corresp. to Scalar.cmp\n\
- If the 2 coefficients are both intervals, corresp. to Interval.cmp\n\
- otherwise, -3 if the first is a scalar, 3 otherwise\n\
*)\n\
val equal : t -> t -> bool\n\
(** Equality test *)\n\
val is_zero : t -> bool\n\
(** Is the coefficient equal to scalar 0 or interval [0,0] ? *)\n\
val equal_int : t -> int -> bool\n\
(** Is the coefficient equal to scalar b or interval [b,b] ? *)\n\
val neg : t -> t\n\
(** Negation *)\n\
val reduce : t -> t\n\
(** Convert interval to scalar if possible *)\n\
val print : Format.formatter -> t -> unit\n\
(** Printing *)\n\
")
quote(ML,"\n\
let s_of_mpq x = Scalar (Scalar.of_mpq x)\n\
let s_of_mpqf x = Scalar (Scalar.of_mpqf x)\n\
let s_of_int x = Scalar (Scalar.of_int x)\n\
let s_of_frac x y = Scalar (Scalar.of_frac x y)\n\
let s_of_float x = Scalar (Scalar.of_float x)\n\
let s_of_mpfr x = Scalar (Scalar.of_mpfr x)\n\
\n\
let i_of_scalar inf sup = Interval (Interval.of_scalar inf sup)\n\
let i_of_mpq x y = Interval (Interval.of_mpq x y)\n\
let i_of_mpqf x y = Interval (Interval.of_mpqf x y)\n\
let i_of_int x y = Interval (Interval.of_int x y)\n\
let i_of_frac x y z w = Interval (Interval.of_frac x y z w)\n\
let i_of_float x y = Interval (Interval.of_float x y)\n\
let i_of_mpfr x y = Interval (Interval.of_mpfr x y)\n\
\n\
let is_scalar c = match c with Scalar _ -> true | _ -> false\n\
let is_interval c = match c with Interval _ -> true | _ -> false\n\
let cmp c1 c2 = match (c1,c2) with\n\
| (Scalar s1, Scalar s2) -> Scalar.cmp s1 s2\n\
| (Interval i1, Interval i2) -> Interval.cmp i1 i2\n\
| (Scalar _, _) -> (-3)\n\
| _ -> 3\n\
let equal c1 c2 = match (c1,c2) with\n\
| (Scalar s1, Scalar s2) -> Scalar.equal s1 s2\n\
| (Interval i1, Interval i2) -> Interval.equal i1 i2\n\
| _ -> false\n\
let is_zero c = match c with\n\
| Scalar s -> (Scalar.sgn s)=0\n\
| Interval i -> Interval.is_zero i\n\
let equal_int c b = match c with\n\
| Scalar s -> Scalar.equal_int s b\n\
| Interval i -> Interval.equal_int i b\n\
let neg c = match c with\n\
| Scalar s -> Scalar (Scalar.neg s)\n\
| Interval i -> Interval (Interval.neg i)\n\
let reduce c = match c with\n\
| Scalar _ -> c\n\
| Interval i ->\n\
if Scalar.equal i.Interval.inf i.Interval.sup\n\
then Scalar i.Interval.inf\n\
else c\n\
let print fmt c = match c with\n\
| Scalar s -> Scalar.print fmt s\n\
| Interval i -> Interval.print fmt i\n\
")
|