delpi  0.0.1
DElta-complete LP solver
Loading...
Searching...
No Matches
gmp.cpp
1
7
8#include "delpi/libs/gmp.h"
9
10#include <vector>
11
12namespace {
19size_t gmpz_hash(const mpz_t val) {
20 size_t hash = 0;
21 for (int i = 0, n = mpz_size(val); i < n; ++i) {
22 const mp_limb_t limb = mpz_getlimbn(val, i);
23 hash = hash * 2;
24 hash = hash ^ limb;
25 }
26 return hash;
27}
28} // namespace
29
36size_t std::hash<mpq_class>::operator()(const mpq_class &val) const noexcept {
37 const size_t numeratorHash = gmpz_hash(val.get_num_mpz_t());
38 const size_t denominatorHash = gmpz_hash(val.get_den_mpz_t());
39 return numeratorHash ^ denominatorHash;
40}
41
42namespace delpi {
43
44std::strong_ordering operator<=>(const mpq_class &lhs, const mpq_t &rhs) {
45 const mpq_class &rhs_class = gmp::ToMpqClass(rhs);
46 return lhs < rhs_class ? std::strong_ordering::less
47 : lhs > rhs_class ? std::strong_ordering::greater
48 : std::strong_ordering::equal;
49}
50std::strong_ordering operator<=>(const mpq_t &lhs, const mpq_class &rhs) {
51 const mpq_class &lhs_class = gmp::ToMpqClass(lhs);
52 return lhs_class < rhs ? std::strong_ordering::less
53 : lhs_class > rhs ? std::strong_ordering::greater
54 : std::strong_ordering::equal;
55}
56
57namespace gmp {
58
59std::vector<mpq_class> ToMpqVector(const mpq_t *const x, const int size) {
60 std::vector<mpq_class> result{};
61 result.reserve(size);
62 for (int i = 0; i < size; i++) result.emplace_back(x[i]);
63 return result;
64}
65
66mpz_class floor(const mpq_class &val) {
67 // This rounds towards zero
68 mpz_class t{val};
69 if (t == val || val > 0) {
70 return t;
71 } else {
72 // val is negative and non-integer, so it was rounded upwards
73 return t - 1;
74 }
75}
76
77mpz_class ceil(const mpq_class &val) {
78 // This rounds towards zero
79 mpz_class t{val};
80 if (t == val || val < 0) {
81 return t;
82 } else {
83 // val is positive and non-integer, so it was rounded downwards
84 return t + 1;
85 }
86}
87
88} // namespace gmp
89
90} // namespace delpi
Global namespace for the delpi library.
size_t operator()(const mpq_class &val) const noexcept
Hash a gmp rational.
Definition gmp.cpp:36