delpi
0.0.1
DElta-complete LP solver
Toggle main menu visibility
Loading...
Searching...
No Matches
gmp.cpp
1
7
8
#include "delpi/libs/gmp.h"
9
10
#include <vector>
11
12
namespace
{
19
size_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
36
size_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
42
namespace
delpi
{
43
44
std::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
}
50
std::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
57
namespace
gmp {
58
59
std::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
66
mpz_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
77
mpz_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
delpi
Global namespace for the delpi library.
std::hash< mpq_class >::operator()
size_t operator()(const mpq_class &val) const noexcept
Hash a gmp rational.
Definition
gmp.cpp:36
delpi
libs
gmp.cpp
Generated by
1.17.0