Skip to content

Commit e8598b6

Browse files
committed
Merge branch 'fix-mem' into nodonkey
2 parents 559ac37 + 6f15b66 commit e8598b6

File tree

2 files changed

+41
-36
lines changed

2 files changed

+41
-36
lines changed

src/counter.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -850,8 +850,8 @@ FF Counter::outer_count() {
850850
<< " orig cubes this rst: " << cubes.size()
851851
<< " total orig cubes: " << stats.num_cubes_orig
852852
<< " total final cubes: " << stats.num_cubes_final
853-
<< " total so far: " << cnt
854-
<< " this rst: " << cubes_cnt_this_rst);
853+
<< " total so far: " << *cnt
854+
<< " this rst: " << *cubes_cnt_this_rst);
855855
}
856856

857857
ret = sat_solver->solve();

src/mpoly.hpp

Lines changed: 39 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -28,90 +28,100 @@ THE SOFTWARE.
2828
#include <memory>
2929
#include <cstdlib>
3030

31+
struct AutoPoly {
32+
~AutoPoly() { fmpq_mpoly_ctx_clear(ctx); }
33+
AutoPoly(int nvars) {
34+
fmpq_mpoly_ctx_init(ctx, nvars, ORD_DEGREVLEX);
35+
}
36+
fmpq_mpoly_ctx_t ctx;
37+
};
38+
3139
class FPoly : public CMSat::Field {
3240
public:
3341
fmpq_mpoly_t val;
34-
std::shared_ptr<fmpq_mpoly_ctx_t> ctx;
42+
std::shared_ptr<AutoPoly> ctx;
3543

3644
~FPoly() override {
37-
fmpq_mpoly_clear(val, ctx.get());
45+
fmpq_mpoly_clear(val, ctx->ctx);
3846
}
3947

4048
FPoly(const fmpq_mpoly_t& v,
41-
const std::shared_ptr<fmpq_mpoly_ctx_t>& c): ctx(c) {
42-
fmpq_mpoly_init(val, ctx.get());
43-
fmpq_mpoly_set(val, v, ctx.get());
49+
const std::shared_ptr<AutoPoly>& c): ctx(c) {
50+
memcpy(val, v, sizeof(fmpq_mpoly_t));
4451
}
4552

4653
FPoly(const FPoly& other): ctx(other.ctx) {
4754
ctx = other.ctx;
48-
fmpq_mpoly_init(val, ctx.get());
49-
fmpq_mpoly_set(val, other.val, ctx.get());
55+
fmpq_mpoly_init(val, ctx->ctx);
56+
fmpq_mpoly_set(val, other.val, ctx->ctx);
5057
}
5158
const auto& get_val() const { return val; }
5259

5360
Field& operator=(const Field& other) override {
5461
const auto& od = dynamic_cast<const FPoly&>(other);
55-
fmpq_mpoly_set(val, od.val, ctx.get());
62+
fmpq_mpoly_set(val, od.val, ctx->ctx);
5663
return *this;
5764
}
5865

5966
Field& operator+=(const Field& other) override {
6067
const auto& od = dynamic_cast<const FPoly&>(other);
61-
fmpq_mpoly_add(val, val, od.val, ctx.get());
68+
fmpq_mpoly_add(val, val, od.val, ctx->ctx);
6269
return *this;
6370
}
6471

6572
std::unique_ptr<Field> add(const Field& other) override {
6673
const auto& od = dynamic_cast<const FPoly&>(other);
6774
fmpq_mpoly_t v;
68-
fmpq_mpoly_init(v, ctx.get());
69-
fmpq_mpoly_add(v, val, od.val, ctx.get());
75+
fmpq_mpoly_init(v, ctx->ctx);
76+
fmpq_mpoly_add(v, val, od.val, ctx->ctx);
7077
return std::make_unique<FPoly>(v, ctx);
7178
}
7279

7380
Field& operator-=(const Field& other) override {
7481
const auto& od = dynamic_cast<const FPoly&>(other);
75-
fmpq_mpoly_sub(val, val, od.val, ctx.get());
82+
fmpq_mpoly_sub(val, val, od.val, ctx->ctx);
7683
return *this;
7784
}
7885

7986
Field& operator*=(const Field& other) override {
8087
const auto& od = dynamic_cast<const FPoly&>(other);
81-
fmpq_mpoly_mul(val, val, od.val, ctx.get());
88+
fmpq_mpoly_mul(val, val, od.val, ctx->ctx);
8289
return *this;
8390
}
8491

8592
Field& operator/=(const Field& other) override {
8693
const auto& od = dynamic_cast<const FPoly&>(other);
87-
fmpq_mpoly_div(val, val, od.val, ctx.get());
94+
fmpq_mpoly_div(val, val, od.val, ctx->ctx);
8895
return *this;
8996
}
9097

9198
bool operator==(const Field& other) const override {
9299
const auto& od = dynamic_cast<const FPoly&>(other);
93-
return fmpq_mpoly_equal(val, od.val, ctx.get());
100+
return fmpq_mpoly_equal(val, od.val, ctx->ctx);
94101
}
95102

96103
std::ostream& display(std::ostream& os) const override {
97104
auto varnames = nvars_names();
98-
char* str = fmpq_mpoly_get_str_pretty(val, (const char**)varnames, ctx.get());
105+
char* str = fmpq_mpoly_get_str_pretty(val, (const char**)varnames, ctx->ctx);
99106
os << str;
100107
free(str);
101108
del_nvars_names(varnames);
102109
return os;
103110
}
104111

105112
std::unique_ptr<Field> dup() const override {
106-
return std::make_unique<FPoly>(val, ctx);
113+
fmpq_mpoly_t v;
114+
fmpq_mpoly_init(v, ctx->ctx);
115+
fmpq_mpoly_set(v, val, ctx->ctx);
116+
return std::make_unique<FPoly>(v, ctx);
107117
}
108118

109119
bool is_zero() const override {
110-
return fmpq_mpoly_is_zero(val, ctx.get());
120+
return fmpq_mpoly_is_zero(val, ctx->ctx);
111121
}
112122

113123
bool is_one() const override {
114-
return fmpq_mpoly_is_one(val, ctx.get());
124+
return fmpq_mpoly_is_one(val, ctx->ctx);
115125
}
116126

117127
std::string rem_trail_space(const std::string& str) {
@@ -121,12 +131,12 @@ class FPoly : public CMSat::Field {
121131
}
122132

123133
void del_nvars_names(char** names) const {
124-
uint32_t nvars = fmpq_mpoly_ctx_nvars(ctx.get());
134+
uint32_t nvars = fmpq_mpoly_ctx_nvars(ctx->ctx);
125135
for(uint32_t i = 0; i < nvars; i++) delete[] names[i];
126136
delete[] names;
127137
}
128138
char** nvars_names() const {
129-
uint32_t nvars = fmpq_mpoly_ctx_nvars(ctx.get());
139+
uint32_t nvars = fmpq_mpoly_ctx_nvars(ctx->ctx);
130140
char** vars = new char*[nvars];
131141
for(uint32_t i = 0; i < nvars; i++) {
132142
std::string x = "x";
@@ -148,7 +158,7 @@ class FPoly : public CMSat::Field {
148158
}
149159
str2.pop_back();
150160
auto varnames = nvars_names();
151-
auto ret = fmpq_mpoly_set_str_pretty(val, str2.c_str(), (const char**)varnames, ctx.get());
161+
auto ret = fmpq_mpoly_set_str_pretty(val, str2.c_str(), (const char**)varnames, ctx->ctx);
152162
del_nvars_names(varnames);
153163
if (ret == -1) {
154164
std::cerr << "Error parsing polynomial on line " << line_no
@@ -159,10 +169,10 @@ class FPoly : public CMSat::Field {
159169
}
160170

161171
void set_zero() override {
162-
fmpq_mpoly_zero(val, ctx.get());
172+
fmpq_mpoly_zero(val, ctx->ctx);
163173
}
164174
void set_one() override {
165-
fmpq_mpoly_one(val, ctx.get());
175+
fmpq_mpoly_one(val, ctx->ctx);
166176
}
167177

168178
uint64_t bytes_used() const override {
@@ -172,25 +182,20 @@ class FPoly : public CMSat::Field {
172182

173183
class FGenPoly : public CMSat::FieldGen {
174184
public:
175-
std::shared_ptr<fmpq_mpoly_ctx_t> ctx;
185+
std::shared_ptr<AutoPoly> ctx;
176186

177-
FGenPoly(int nvars) {
178-
ctx = std::make_shared<fmpq_mpoly_ctx_t>();
179-
fmpq_mpoly_ctx_init(ctx.get(), nvars, ORD_DEGREVLEX);
180-
}
181-
FGenPoly(const FGenPoly& other) = default;
182-
~FGenPoly() override = default;
187+
FGenPoly(int nvars) : ctx(std::make_shared<AutoPoly>(nvars)) {}
183188

184189
std::unique_ptr<CMSat::Field> zero() const override {
185190
fmpq_mpoly_t val;
186-
fmpq_mpoly_init(val, ctx.get());
191+
fmpq_mpoly_init(val, ctx->ctx);
187192
return std::make_unique<FPoly>(val, ctx);
188193
}
189194

190195
std::unique_ptr<CMSat::Field> one() const override {
191196
fmpq_mpoly_t val;
192-
fmpq_mpoly_init(val, ctx.get());
193-
fmpq_mpoly_one(val, ctx.get());
197+
fmpq_mpoly_init(val, ctx->ctx);
198+
fmpq_mpoly_one(val, ctx->ctx);
194199
return std::make_unique<FPoly>(val, ctx);
195200
}
196201

0 commit comments

Comments
 (0)