From 57357b7ecebec0d6065658210f1bf4c5a573c6e2 Mon Sep 17 00:00:00 2001
From: Lev Nachmanson <levnach@hotmail.com>
Date: Thu, 13 Sep 2018 17:39:06 -0700
Subject: [PATCH] does not compile

Signed-off-by: Lev Nachmanson <levnach@hotmail.com>
---
 src/smt/theory_lra.cpp | 29 +++++++++++++++++++++--------
 1 file changed, 21 insertions(+), 8 deletions(-)

diff --git a/src/smt/theory_lra.cpp b/src/smt/theory_lra.cpp
index f8e2f9fe1..a5190459f 100644
--- a/src/smt/theory_lra.cpp
+++ b/src/smt/theory_lra.cpp
@@ -54,6 +54,17 @@ std::ostream& operator<<(std::ostream& out, bound_kind const& k) {
     return out;
 }
 
+struct term_info {
+    rational m_offset;
+    lp::var_index m_var;
+
+    rational const& offset() const { return m_offset; }
+    lp::var_index var() const { return m_var; }
+
+    term_info(): m_var(-1) {}
+    term_info(lp:var_index vi, rational const& offset): m_offset(offset), m_var(vi) {}
+};
+
 class bound { 
     smt::bool_var     m_bv;
     smt::theory_var  m_var;
@@ -777,8 +788,8 @@ class theory_lra::imp {
             lp::var_index vi = m_theory_var2var_index.get(v, UINT_MAX);
             TRACE("arith", tout << mk_pp(term, m) << " " << v << " " << vi << "\n";);
             if (vi == UINT_MAX) {
-                vi = m_solver->add_term(m_left_side, st.coeff());
-                m_theory_var2var_index.setx(v, vi, UINT_MAX);
+                vi = m_solver->add_term(m_left_side);
+                m_theory_var2var_index.setx(v, term_info(vi, st.coeff()), term_info(0, rational::zero()));
                 if (m_solver->is_term(vi)) {
                     m_term_index2theory_var.setx(m_solver->adjust_term_index(vi), v, UINT_MAX);
                 }
@@ -1187,17 +1198,19 @@ public:
     lp::impq get_ivalue(theory_var v) const {
         SASSERT(can_get_ivalue(v));
         lp::var_index vi = m_theory_var2var_index[v];
-        if (!m_solver->is_term(vi))
-            return m_solver->get_column_value(vi);
-        m_todo_terms.push_back(std::make_pair(vi, rational::one()));
-        lp::impq result(0);
+        term_info ti = m_theory_var2var_index[v];
+        if (!m_solver->is_term(ti.var()))
+            return m_solver->get_column_value(ti.var()) + ti.offset();
+        m_todo_terms.push_back(std::make_pair(ti, rational::one())); 
+        lp::impq result(ti);
         while (!m_todo_terms.empty()) {
-            vi = m_todo_terms.back().first;
+            ti = m_todo_terms.back().first;
+            vi = ti.var();
             rational coeff = m_todo_terms.back().second;
             m_todo_terms.pop_back();
+            result += ti.offset() * coeff;            
             if (m_solver->is_term(vi)) {
                 const lp::lar_term& term = m_solver->get_term(vi);
-                result += term.m_v * coeff;
                 for (const auto & i:  term) {
                     m_todo_terms.push_back(std::make_pair(i.var(), coeff * i.coeff()));
                 }