Skip to content

Commit c1ece49

Browse files
committed
track changed columns in dio\
Signed-off-by: Lev Nachmanson <levnach@hotmail.com>
1 parent 008e922 commit c1ece49

File tree

3 files changed

+53
-17
lines changed

3 files changed

+53
-17
lines changed

src/math/lp/dioph_eq.cpp

+43-8
Original file line numberDiff line numberDiff line change
@@ -240,7 +240,7 @@ namespace lp {
240240
unsigned m_conflict_index = -1; // m_entries[m_conflict_index] gives the conflict
241241
unsigned m_max_number_of_iterations = 100;
242242
unsigned m_number_of_iterations;
243-
std_vector<std::unordered_set<unsigned>> m_columns_to_entries; // m_columnn_to_terms[j] is the set of of all k such that m_entry[k].m_l depends on j
243+
std::unordered_map<unsigned, std::unordered_set<unsigned>> m_columns_to_term_columns; // m_columnn_to_term_columns[j] is the set of of all k such that lra.get_term(k) depends on j
244244
struct branch {
245245
unsigned m_j = UINT_MAX;
246246
mpq m_rs;
@@ -290,16 +290,19 @@ namespace lp {
290290
};
291291

292292

293-
struct undo_add_column_bound : public trail {
293+
struct undo_change_column_bound : public trail {
294294
imp& m_s;
295295
unsigned m_j; // the column that has been added
296-
undo_add_column_bound(imp& s, unsigned j) : m_s(s), m_j(j) {}
296+
undo_change_column_bound(imp& s, unsigned j) : m_s(s), m_j(j) {}
297297

298298
void undo() override {
299-
NOT_IMPLEMENTED_YET();
299+
m_s.add_changed_column(m_j);
300300
}
301301
};
302302

303+
uint_set m_changed_columns; // the columns are given as lar_solver columns
304+
friend undo_change_column_bound;
305+
void add_changed_column(unsigned j) { m_changed_columns.insert(j);}
303306
std_vector<const lar_term*> m_added_terms;
304307

305308
std_vector<variable_branch_stats> m_branch_stats;
@@ -318,17 +321,17 @@ namespace lp {
318321
lra.trail().push(undo);
319322
}
320323

321-
void add_column_bound_delegate(unsigned j) {
324+
void update_column_bound_delegate(unsigned j) {
322325
if (!lra.column_is_int(j))
323326
return;
324-
auto undo = undo_add_column_bound(*this, j);
327+
auto undo = undo_change_column_bound(*this, j);
325328
lra.trail().push(undo) ;
326329
}
327330

328331
public:
329332
imp(int_solver& lia, lar_solver& lra) : lia(lia), lra(lra) {
330333
lra.register_add_term_delegate([this](const lar_term*t){add_term_delegate(t);});
331-
lra.register_add_column_bound_delegate([this](unsigned j) {add_column_bound_delegate(j);});
334+
lra.register_update_column_bound_delegate([this](unsigned j) {update_column_bound_delegate(j);});
332335
}
333336
term_o get_term_from_entry(unsigned i) const {
334337
term_o t;
@@ -348,6 +351,22 @@ namespace lp {
348351
return m_var_register.local_to_external(j);
349352
}
350353

354+
void register_term_columns(const lar_term & t) {
355+
for (const auto & p : t) {
356+
register_term_column(p.j(), t);
357+
}
358+
}
359+
void register_term_column(unsigned j, const lar_term& t) {
360+
auto it = m_columns_to_term_columns.find(j);
361+
if (it != m_columns_to_term_columns.end())
362+
it->second.insert(t.j());
363+
else {
364+
auto s = std::unordered_set<unsigned>();
365+
s.insert(t.j());
366+
m_columns_to_term_columns[j] = s;
367+
}
368+
369+
}
351370
// the term has form sum(a_i*x_i) - t.j() = 0,
352371
void fill_entry(const lar_term& t) {
353372
TRACE("dioph_eq", print_lar_term_L(t, tout) << std::endl;);
@@ -383,7 +402,7 @@ namespace lp {
383402
m_e_matrix.add_columns_up_to(lj);
384403
m_e_matrix.add_new_element(entry_index, lj, -mpq(1));
385404
}
386-
TRACE("dioph_eq", print_entry(entry_index, tout););
405+
register_term_columns(t);
387406
SASSERT(entry_invariant(entry_index));
388407
}
389408

@@ -394,6 +413,21 @@ namespace lp {
394413
}
395414
return true;
396415
}
416+
void process_changed_columns() {
417+
std::unordered_set<unsigned> entries_to_recalculate;
418+
for (unsigned j : m_changed_columns) {
419+
for (unsigned k : m_columns_to_term_columns[j]) {
420+
for (const auto& p : m_l_matrix.column(k)) {
421+
entries_to_recalculate.insert(p.var());
422+
}
423+
}
424+
}
425+
426+
if (entries_to_recalculate.size() > 0)
427+
NOT_IMPLEMENTED_YET();
428+
429+
m_changed_columns.reset();
430+
}
397431

398432
void init() {
399433
m_report_branch = false;
@@ -403,6 +437,7 @@ namespace lp {
403437
m_number_of_iterations = 0;
404438
m_branch_stack.clear();
405439
m_lra_level = 0;
440+
process_changed_columns();
406441
for (const lar_term* t: m_added_terms) {
407442
fill_entry(*t);
408443
}

src/math/lp/lar_solver.cpp

+7-6
Original file line numberDiff line numberDiff line change
@@ -1600,10 +1600,10 @@ namespace lp {
16001600
return m_var_register.external_is_used(v);
16011601
}
16021602
void lar_solver::register_add_term_delegate(const std::function<void(const lar_term*)>& f) {
1603-
this->m_add_term_delegates.push_back(f);
1603+
this->m_add_term_callbacks.push_back(f);
16041604
}
1605-
void lar_solver::register_add_column_bound_delegate(const std::function<void(unsigned)>& f) {
1606-
this->m_add_column_bound_delegates.push_back(f);
1605+
void lar_solver::register_update_column_bound_delegate(const std::function<void(unsigned)>& f) {
1606+
this->m_update_column_bound_callbacks.push_back(f);
16071607
}
16081608

16091609
void lar_solver::add_non_basic_var_to_core_fields(unsigned ext_j, bool is_int) {
@@ -1702,7 +1702,7 @@ namespace lp {
17021702
lp_assert(m_var_register.size() == A_r().column_count());
17031703
if (m_need_register_terms)
17041704
register_normalized_term(*t, A_r().column_count() - 1);
1705-
for (const auto & f: m_add_term_delegates)
1705+
for (const auto & f: m_add_term_callbacks)
17061706
f(t);
17071707
return ret;
17081708
}
@@ -1751,8 +1751,6 @@ namespace lp {
17511751
constraint_index lar_solver::add_var_bound(lpvar j, lconstraint_kind kind, const mpq& right_side) {
17521752
constraint_index ci = mk_var_bound(j, kind, right_side);
17531753
activate(ci);
1754-
for (const auto & f: m_add_column_bound_delegates)
1755-
f(j);
17561754
return ci;
17571755
}
17581756

@@ -1992,6 +1990,9 @@ namespace lp {
19921990

19931991

19941992
TRACE("lar_solver_feas", tout << "j = " << j << " became " << (this->column_is_feasible(j) ? "feas" : "non-feas") << ", and " << (this->column_is_bounded(j) ? "bounded" : "non-bounded") << std::endl;);
1993+
for (const auto &f: m_update_column_bound_callbacks) {
1994+
f(j);
1995+
}
19951996
}
19961997

19971998
void lar_solver::insert_to_columns_with_changed_bounds(unsigned j) {

src/math/lp/lar_solver.h

+3-3
Original file line numberDiff line numberDiff line change
@@ -406,11 +406,11 @@ class lar_solver : public column_namer {
406406
}
407407

408408
void register_add_term_delegate(const std::function<void (const lar_term*)>&);
409-
void register_add_column_bound_delegate(const std::function<void (unsigned)>&);
409+
void register_update_column_bound_delegate(const std::function<void (unsigned)>&);
410410

411411
private:
412-
std_vector<std::function<void (const lar_term*)>> m_add_term_delegates;
413-
std_vector<std::function<void (unsigned)>> m_add_column_bound_delegates;
412+
std_vector<std::function<void (const lar_term*)>> m_add_term_callbacks;
413+
std_vector<std::function<void (unsigned)>> m_update_column_bound_callbacks;
414414
public:
415415
bool external_is_used(unsigned) const;
416416
void pop(unsigned k);

0 commit comments

Comments
 (0)