From 7e56d05dcf4598b04d925ccebd8b786a5722e6ef Mon Sep 17 00:00:00 2001
From: Nikolaj Bjorner <nbjorner@microsoft.com>
Date: Tue, 28 Nov 2017 15:17:00 -0800
Subject: [PATCH] translation?

Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com>
---
 src/ast/ast_translation.h                      |  9 ++++++---
 src/sat/sat_solver/inc_sat_solver.cpp          | 13 +++++++++++--
 src/solver/solver.cpp                          |  4 ++++
 src/solver/solver.h                            |  1 +
 src/tactic/portfolio/bounded_int2bv_solver.cpp |  6 +++++-
 src/tactic/portfolio/enum2bv_solver.cpp        |  5 +++--
 src/tactic/portfolio/pb2bv_solver.cpp          |  5 +++--
 7 files changed, 33 insertions(+), 10 deletions(-)

diff --git a/src/ast/ast_translation.h b/src/ast/ast_translation.h
index 886aaf417..9d09fbb76 100644
--- a/src/ast/ast_translation.h
+++ b/src/ast/ast_translation.h
@@ -50,15 +50,18 @@ class ast_translation {
 
 public:
     ast_translation(ast_manager & from, ast_manager & to, bool copy_plugins = true) : m_from_manager(from), m_to_manager(to) {
-        if (copy_plugins)
-            m_to_manager.copy_families_plugins(m_from_manager);
-        m_to_manager.update_fresh_id(m_from_manager);
+        if (&from != &to) {
+            if (copy_plugins)
+                m_to_manager.copy_families_plugins(m_from_manager);
+            m_to_manager.update_fresh_id(m_from_manager);
+        }
     }
 
     ~ast_translation();
 
     template<typename T>
     T * operator()(T const * n) { 
+        if (&from() == &to()) return const_cast<T*>(n);
         SASSERT(!n || from().contains(const_cast<T*>(n)));
         ast * r = process(n);
         SASSERT((!n && !r) || to().contains(const_cast<ast*>(r)));
diff --git a/src/sat/sat_solver/inc_sat_solver.cpp b/src/sat/sat_solver/inc_sat_solver.cpp
index 86b7e477d..60f185695 100644
--- a/src/sat/sat_solver/inc_sat_solver.cpp
+++ b/src/sat/sat_solver/inc_sat_solver.cpp
@@ -108,11 +108,20 @@ public:
         for (unsigned l : m_fmls_lim) result->m_fmls_lim.push_back(l);
         for (unsigned a : m_asms_lim) result->m_asms_lim.push_back(a);
         for (unsigned h : m_fmls_head_lim) result->m_fmls_head_lim.push_back(h);
+        std::cout << "translate internalized " << m_internalized_fmls.size() << "\n";
+        std::cout.flush();
         for (expr* f : m_internalized_fmls) result->m_internalized_fmls.push_back(tr(f));
-        if (m_mc0.get()) result->m_mc0 = m_mc0->translate(tr);
+        std::cout << "mc0\n";
+        std::cout.flush();
+        model_converter_ref mc = concat(mc0(), get_model_converter().get());
+        if (mc) {
+            ast_translation tr(m, dst_m);
+            result->set_model_converter(mc->translate(tr));
+        } 
+        std::cout << "mc1\n";
+        std::cout.flush();
         result->m_internalized = m_internalized;
         result->m_internalized_converted = m_internalized_converted;
-        if (mc0()) result->set_model_converter(mc0()->translate(tr));
         return result;
     }
 
diff --git a/src/solver/solver.cpp b/src/solver/solver.cpp
index eb2b0d016..606c32bed 100644
--- a/src/solver/solver.cpp
+++ b/src/solver/solver.cpp
@@ -212,3 +212,7 @@ void solver::updt_params(params_ref const & p) {
     m_enforce_model_conversion = m_params.get_bool("solver.enforce_model_conversion", true);
 }
 
+void solver::hoist_converter(model_converter_ref& mc) {
+    
+}
+
diff --git a/src/solver/solver.h b/src/solver/solver.h
index f6ad74042..2b1824cd3 100644
--- a/src/solver/solver.h
+++ b/src/solver/solver.h
@@ -226,6 +226,7 @@ protected:
 
     bool is_literal(ast_manager& m, expr* e);
 
+    void hoist_converter(model_converter_ref& mc);
 };
 
 typedef ref<solver> solver_ref;
diff --git a/src/tactic/portfolio/bounded_int2bv_solver.cpp b/src/tactic/portfolio/bounded_int2bv_solver.cpp
index a2f4cabe4..0eb5cef18 100644
--- a/src/tactic/portfolio/bounded_int2bv_solver.cpp
+++ b/src/tactic/portfolio/bounded_int2bv_solver.cpp
@@ -81,7 +81,11 @@ public:
         for (func_decl* f : m_bv_fns) result->m_bv_fns.push_back(tr(f));
         for (func_decl* f : m_int_fns) result->m_int_fns.push_back(tr(f));
         for (bound_manager* b : m_bounds) result->m_bounds.push_back(b->translate(dst_m));
-        if (mc0()) result->set_model_converter(mc0()->translate(tr));
+        model_converter_ref mc = concat(mc0(), m_solver->get_model_converter().get());
+        if (mc) {
+            ast_translation tr(m, dst_m);
+            result->set_model_converter(mc->translate(tr));
+        }
         return result;
     }
 
diff --git a/src/tactic/portfolio/enum2bv_solver.cpp b/src/tactic/portfolio/enum2bv_solver.cpp
index 4feaa622b..9c522a714 100644
--- a/src/tactic/portfolio/enum2bv_solver.cpp
+++ b/src/tactic/portfolio/enum2bv_solver.cpp
@@ -50,9 +50,10 @@ public:
 
     virtual solver* translate(ast_manager& dst_m, params_ref const& p) {   
         solver* result = alloc(enum2bv_solver, dst_m, p, m_solver->translate(dst_m, p));
-        if (mc0()) {
+        model_converter_ref mc = concat(mc0(), m_solver->get_model_converter().get());
+        if (mc) {
             ast_translation tr(m, dst_m);
-            result->set_model_converter(mc0()->translate(tr));
+            result->set_model_converter(mc->translate(tr));
         }
         return result;
     }
diff --git a/src/tactic/portfolio/pb2bv_solver.cpp b/src/tactic/portfolio/pb2bv_solver.cpp
index ffc1ea09f..e22a41ad3 100644
--- a/src/tactic/portfolio/pb2bv_solver.cpp
+++ b/src/tactic/portfolio/pb2bv_solver.cpp
@@ -50,9 +50,10 @@ public:
     virtual solver* translate(ast_manager& dst_m, params_ref const& p) {
         flush_assertions();
         solver* result = alloc(pb2bv_solver, dst_m, p, m_solver->translate(dst_m, p));
-        if (mc0()) {
+        model_converter_ref mc = concat(mc0(), m_solver->get_model_converter().get());
+        if (mc) {
             ast_translation tr(m, dst_m);
-            result->set_model_converter(mc0()->translate(tr));
+            result->set_model_converter(mc->translate(tr));
         }
         return result;
     }