From 5811d44ca65149e2305badfa220a003ccbd801ac Mon Sep 17 00:00:00 2001 From: Bo-Yuan Huang Date: Sat, 9 Mar 2019 13:37:48 -0500 Subject: [PATCH 01/21] Syntax sugar for concatinating Bool sort ast nodes --- src/ila/expr_fuse.cc | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/ila/expr_fuse.cc b/src/ila/expr_fuse.cc index 2d25e4ec5..970d92308 100644 --- a/src/ila/expr_fuse.cc +++ b/src/ila/expr_fuse.cc @@ -285,7 +285,11 @@ ExprPtr ExprFuse::Store(const ExprPtr mem, const int& addr, const int& data) { } ExprPtr ExprFuse::Concat(const ExprPtr hi, const ExprPtr lo) { - return std::make_shared(hi, lo); + auto const_zero = ExprFuse::BvConst(0x0, 1); + auto const_one = ExprFuse::BvConst(0x1, 1); + auto bv_hi = hi->is_bool() ? ExprFuse::Ite(hi, const_one, const_zero) : hi; + auto bv_lo = hi->is_bool() ? ExprFuse::Ite(lo, const_one, const_zero) : lo; + return std::make_shared(bv_hi, bv_lo); } ExprPtr ExprFuse::Extract(const ExprPtr bv, const int& hi, const int& lo) { From 9c888812500b7198ee560ee388a6c08c7499a260 Mon Sep 17 00:00:00 2001 From: Bo-Yuan Huang Date: Thu, 14 Mar 2019 15:06:11 -0400 Subject: [PATCH 02/21] Interface for ILA portable --- include/ilang/ilang++.h | 14 +++++- src/ilang++.cc | 10 ++++ src/portable/ila_to_json_serializer.cc | 14 +++++- src/portable/interface.cc | 33 ++++++++++--- src/portable/json_to_ila_deserializer.cc | 31 ++++++++---- test/t_api.cc | 60 +++++++++++++++--------- 6 files changed, 124 insertions(+), 38 deletions(-) diff --git a/include/ilang/ilang++.h b/include/ilang/ilang++.h index 09903d0c9..8ca670ecd 100644 --- a/include/ilang/ilang++.h +++ b/include/ilang/ilang++.h @@ -485,7 +485,7 @@ class Ila { // ------------------------- GENERATORS --------------------------------- // /// \brief Export an ILA as Verilog - /// \param[in] filename the file name of the generated Verilog source + /// \param[in] fout the output stream of the generated Verilog source. void ExportToVerilog(std::ostream& fout) const; // ------------------------- ACCESSORS/MUTATORS --------------------------- // @@ -542,6 +542,18 @@ std::ostream& operator<<(std::ostream& out, const InstrRef& instr); /// Print out the ILA. std::ostream& operator<<(std::ostream& out, const Ila& ila); +/******************************************************************************/ +// Converters +/******************************************************************************/ +/// \brief Export the ILA portable to file. +/// \param[in] ila the source ILA model to export. +/// \param[in] file_name the name of the exported ILA portable (JSON) file. +bool ExportIlaPortable(const Ila& ila, const std::string& file_name); + +/// \brief Import the ILA portable from file. +/// \param[in] file_name the name of the ILA portable (JSON) file to import. +Ila ImportIlaPortable(const std::string& file_name); + /******************************************************************************/ // Verification. /******************************************************************************/ diff --git a/src/ilang++.cc b/src/ilang++.cc index 4ee7485cb..66509d8d6 100644 --- a/src/ilang++.cc +++ b/src/ilang++.cc @@ -3,6 +3,7 @@ #include #include +#include #include #include #include @@ -634,6 +635,15 @@ std::ostream& operator<<(std::ostream& out, const Ila& ila) { return out << ila.get(); } +bool ExportIlaPortable(const Ila& ila, const std::string& file_name) { + return IlaSerDesMngr::SerToFile(ila.get(), file_name); +} + +Ila ImportIlaPortable(const std::string& file_name) { + auto m = IlaSerDesMngr::DesFromFile(file_name); + return Ila(m); +} + IlaZ3Unroller::IlaZ3Unroller(z3::context& ctx, const std::string& suff) : ctx_(ctx), extra_suff_(suff) { univ_ = std::make_shared(ctx); diff --git a/src/portable/ila_to_json_serializer.cc b/src/portable/ila_to_json_serializer.cc index b4073d66a..34d900222 100644 --- a/src/portable/ila_to_json_serializer.cc +++ b/src/portable/ila_to_json_serializer.cc @@ -47,6 +47,7 @@ json I2JSer::SerInstr(const InstrPtr& i_instr) { for (auto i = 0; i < host->state_num(); i++) { auto i_state = host->state(i); auto i_next = i_instr->update(i_state); + i_next = i_next ? i_next : i_state; // NULL is unchanged auto j_next = SerExpr(i_next); j_update.emplace(i_state->name().str(), j_next.at(SERDES_EXPR_ID).get()); @@ -64,6 +65,7 @@ json I2JSer::SerInstrLvlAbs(const InstrLvlAbsPtr& i_ila) { j_ila.emplace(SERDES_ILA_NAME, i_ila->name().str()); // input + ILA_DLOG("Portable") << "Serialize input variables"; auto j_inp_arr = json::array(); for (auto i = 0; i < i_ila->input_num(); i++) { auto j_inp = SerExpr(i_ila->input(i)); @@ -72,6 +74,7 @@ json I2JSer::SerInstrLvlAbs(const InstrLvlAbsPtr& i_ila) { j_ila.emplace(SERDES_ILA_INPUT, j_inp_arr); // state + ILA_DLOG("Portable") << "Serialize state variables"; auto j_state_arr = json::array(); for (auto i = 0; i < i_ila->state_num(); i++) { auto j_state = SerExpr(i_ila->state(i)); @@ -80,14 +83,19 @@ json I2JSer::SerInstrLvlAbs(const InstrLvlAbsPtr& i_ila) { j_ila.emplace(SERDES_ILA_STATE, j_state_arr); // fetch - auto j_fetch = SerExpr(i_ila->fetch()); - j_ila.emplace(SERDES_ILA_FETCH, j_fetch.at(SERDES_EXPR_ID).get()); + ILA_DLOG("Portable") << "Serialize fetch function"; + if (i_ila->fetch()) { + auto j_fetch = SerExpr(i_ila->fetch()); + j_ila.emplace(SERDES_ILA_FETCH, j_fetch.at(SERDES_EXPR_ID).get()); + } // valid + ILA_DLOG("Portable") << "Serialize valid function"; auto j_valid = SerExpr(i_ila->valid()); j_ila.emplace(SERDES_ILA_VALID, j_valid.at(SERDES_EXPR_ID).get()); // instructions + ILA_DLOG("Portable") << "Serialize instructions"; auto j_instr_arr = json::array(); for (auto i = 0; i < i_ila->instr_num(); i++) { j_instr_arr.push_back(SerInstr(i_ila->instr(i))); @@ -95,6 +103,7 @@ json I2JSer::SerInstrLvlAbs(const InstrLvlAbsPtr& i_ila) { j_ila.emplace(SERDES_ILA_INSTR, j_instr_arr); // init + ILA_DLOG("Portable") << "Serialize initial condition"; auto j_init_arr = json::array(); for (auto i = 0; i < i_ila->init_num(); i++) { auto j_init = SerExpr(i_ila->init(i)); @@ -105,6 +114,7 @@ json I2JSer::SerInstrLvlAbs(const InstrLvlAbsPtr& i_ila) { // XXX child // all ast expressions + ILA_DLOG("Portable") << "Serialize all ast nodes"; j_ila.emplace(SERDES_ILA_AST, j_expr_arr_); return j_ila; diff --git a/src/portable/interface.cc b/src/portable/interface.cc index 72df3ab74..e870efbf2 100644 --- a/src/portable/interface.cc +++ b/src/portable/interface.cc @@ -1,6 +1,7 @@ /// \file /// The source for the ILA portable interface. +#include #include #include #include @@ -8,26 +9,46 @@ namespace ilang { json IlaSerDesMngr::Serialize(const InstrLvlAbsPtr& m) { - auto i2jser = I2JSer::New(); - auto res = i2jser->SerInstrLvlAbs(m); + auto i2j_ser = I2JSer::New(); + auto res = i2j_ser->SerInstrLvlAbs(m); return res; } InstrLvlAbsPtr IlaSerDesMngr::Deserialize(const json& j) { - auto j2ides = J2IDes::New(); - auto res = j2ides->DesInstrLvlAbs(j); + auto j2i_des = J2IDes::New(); + auto res = j2i_des->DesInstrLvlAbs(j); return res; } bool IlaSerDesMngr::SerToFile(const InstrLvlAbsPtr& m, const std::string& file_name) { + auto fout = std::ofstream(); + fout.open(file_name); + + if (fout.is_open()) { + auto j_ila = Serialize(m); + fout << j_ila.dump(2); + } + + fout.close(); return true; - // } InstrLvlAbsPtr IlaSerDesMngr::DesFromFile(const std::string& file_name) { + auto fin = std::ifstream(); + fin.open(file_name); + + if (fin.is_open()) { + auto j_ila = json::object(); + fin >> j_ila; + + auto m = Deserialize(j_ila); + + fin.close(); + return m; + } + return NULL; - // } }; // namespace ilang diff --git a/src/portable/json_to_ila_deserializer.cc b/src/portable/json_to_ila_deserializer.cc index c7f94c4cb..4767a2afe 100644 --- a/src/portable/json_to_ila_deserializer.cc +++ b/src/portable/json_to_ila_deserializer.cc @@ -104,42 +104,57 @@ InstrLvlAbsPtr J2IDes::DesInstrLvlAbs(const json& j_ila) { auto m = InstrLvlAbs::New(name); // XXX parent // input + ILA_DLOG("Portable") << "Deserialize input variables"; auto j_inp_arr = j_ila.at(SERDES_ILA_INPUT); for (auto inp_id : j_inp_arr) { input_id_set_.insert(inp_id.get()); } // state + ILA_DLOG("Portable") << "Deserialize state variables"; auto j_state_arr = j_ila.at(SERDES_ILA_STATE); for (auto state_id : j_state_arr) { state_id_set_.insert(state_id.get()); } // ast expressions + ILA_DLOG("Portable") << "Deserialize ast nodes"; auto j_expr_arr = j_ila.at(SERDES_ILA_AST); for (auto j_expr : j_expr_arr) { DesExpr(j_expr, m); } // fetch - auto fetch_id = j_ila.at(SERDES_ILA_FETCH).get(); - auto fetch_it = id_expr_map_.find(fetch_id); - ILA_ASSERT(fetch_it != id_expr_map_.end()) << "Fetch not found"; - m->SetFetch(fetch_it->second); + ILA_DLOG("Portable") << "Deserialize fetch function"; + try { + auto fetch_id = j_ila.at(SERDES_ILA_FETCH).get(); + auto fetch_it = id_expr_map_.find(fetch_id); + ILA_WARN_IF(fetch_it == id_expr_map_.end()) << "Fetch not found"; + m->SetFetch(fetch_it->second); + } catch (...) { + ILA_WARN << "Fetch not defined"; + } // valid - auto valid_id = j_ila.at(SERDES_ILA_VALID).get(); - auto valid_it = id_expr_map_.find(valid_id); - ILA_ASSERT(valid_it != id_expr_map_.end()) << "Valid not found"; - m->SetValid(valid_it->second); + ILA_DLOG("Portable") << "Deserialize valid function"; + try { + auto valid_id = j_ila.at(SERDES_ILA_VALID).get(); + auto valid_it = id_expr_map_.find(valid_id); + ILA_WARN_IF(valid_it == id_expr_map_.end()) << "Valid not found"; + m->SetValid(valid_it->second); + } catch (...) { + ILA_WARN << "Valid not defined"; + } // instructions + ILA_DLOG("Portable") << "Deserialize instructions"; auto j_instr_arr = j_ila.at(SERDES_ILA_INSTR); for (auto j_instr : j_instr_arr) { DesInstr(j_instr, m); } // init + ILA_DLOG("Portable") << "Deserialize initial condition"; auto j_init_arr = j_ila.at(SERDES_ILA_INIT); for (auto j_init : j_init_arr) { auto init_expr_it = id_expr_map_.find(j_init.get()); diff --git a/test/t_api.cc b/test/t_api.cc index 3982ef907..2163bad78 100644 --- a/test/t_api.cc +++ b/test/t_api.cc @@ -1,6 +1,8 @@ /// \file /// Unit test for c++ API +#include "unit-include/config.h" +#include "unit-include/eq_ilas.h" #include "unit-include/simple_cpu.h" #include "unit-include/util.h" #include @@ -72,9 +74,9 @@ TEST(TestApi, Construct) { } /// helper function -bool SameOp(const ExprRef & l , const ExprRef & r) { - std::shared_ptr lp = std::dynamic_pointer_cast( l.get() ); - std::shared_ptr rp = std::dynamic_pointer_cast( r.get() ); +bool SameOp(const ExprRef& l, const ExprRef& r) { + std::shared_ptr lp = std::dynamic_pointer_cast(l.get()); + std::shared_ptr rp = std::dynamic_pointer_cast(r.get()); ILA_NOT_NULL(lp); ILA_NOT_NULL(rp); return lp->op_name() == rp->op_name(); @@ -153,7 +155,6 @@ TEST(TestApi, ExprOps) { SetUnsignedComparison(true); - auto n_unsigned_lt_bv = n_add_bv < n_sub_bv; auto n_unsigned_gt_bv = n_add_bv > n_sub_bv; auto n_unsigned_le_bv = n_add_bv <= n_sub_bv; @@ -183,27 +184,26 @@ TEST(TestApi, ExprOps) { auto n_sle_bv_c = Sle(n_add_bv, 3); auto n_sge_bv_c = Sge(n_add_bv, 4); - EXPECT_TRUE(SameOp(n_lt_bv, n_slt_bv )); - EXPECT_TRUE(SameOp(n_gt_bv, n_sgt_bv )); - EXPECT_TRUE(SameOp(n_le_bv, n_sle_bv )); - EXPECT_TRUE(SameOp(n_ge_bv, n_sge_bv )); + EXPECT_TRUE(SameOp(n_lt_bv, n_slt_bv)); + EXPECT_TRUE(SameOp(n_gt_bv, n_sgt_bv)); + EXPECT_TRUE(SameOp(n_le_bv, n_sle_bv)); + EXPECT_TRUE(SameOp(n_ge_bv, n_sge_bv)); - EXPECT_TRUE(SameOp(n_unsigned_lt_bv, n_ult_bv )); - EXPECT_TRUE(SameOp(n_unsigned_gt_bv, n_ugt_bv )); - EXPECT_TRUE(SameOp(n_unsigned_le_bv, n_ule_bv )); - EXPECT_TRUE(SameOp(n_unsigned_ge_bv, n_uge_bv )); + EXPECT_TRUE(SameOp(n_unsigned_lt_bv, n_ult_bv)); + EXPECT_TRUE(SameOp(n_unsigned_gt_bv, n_ugt_bv)); + EXPECT_TRUE(SameOp(n_unsigned_le_bv, n_ule_bv)); + EXPECT_TRUE(SameOp(n_unsigned_ge_bv, n_uge_bv)); - EXPECT_TRUE(SameOp(n_lt_bv_c, n_slt_bv_c )); - EXPECT_TRUE(SameOp(n_gt_bv_c, n_sgt_bv_c )); - EXPECT_TRUE(SameOp(n_le_bv_c, n_sle_bv_c )); - EXPECT_TRUE(SameOp(n_ge_bv_c, n_sge_bv_c )); + EXPECT_TRUE(SameOp(n_lt_bv_c, n_slt_bv_c)); + EXPECT_TRUE(SameOp(n_gt_bv_c, n_sgt_bv_c)); + EXPECT_TRUE(SameOp(n_le_bv_c, n_sle_bv_c)); + EXPECT_TRUE(SameOp(n_ge_bv_c, n_sge_bv_c)); + EXPECT_TRUE(SameOp(n_unsigned_lt_bv_c, n_ult_bv_c)); + EXPECT_TRUE(SameOp(n_unsigned_gt_bv_c, n_ugt_bv_c)); + EXPECT_TRUE(SameOp(n_unsigned_le_bv_c, n_ule_bv_c)); + EXPECT_TRUE(SameOp(n_unsigned_ge_bv_c, n_uge_bv_c)); - EXPECT_TRUE(SameOp(n_unsigned_lt_bv_c, n_ult_bv_c )); - EXPECT_TRUE(SameOp(n_unsigned_gt_bv_c, n_ugt_bv_c )); - EXPECT_TRUE(SameOp(n_unsigned_le_bv_c, n_ule_bv_c )); - EXPECT_TRUE(SameOp(n_unsigned_ge_bv_c, n_uge_bv_c )); - auto n_load_bv = v_mem.Load(n_add_bv); auto n_load_bv_static = Load(v_mem, n_add_bv); auto n_store_mem = v_mem.Store(n_add_bv, n_load_bv); @@ -411,4 +411,22 @@ TEST(TestApi, Log) { #endif } +TEST(TestApi, Portable) { + SetToStdErr(1); + EnableDebug("Portable"); + auto example = EqIlaGen(); + auto buff_spec = example.GetIlaFlat1("flat1"); + + auto portable_file_name = + std::string(ILANG_TEST_BIN_ROOT) + "/tmp_portable.json"; + + auto res = ExportIlaPortable(Ila(buff_spec), portable_file_name); + EXPECT_TRUE(res); + + auto read_ila = ImportIlaPortable(portable_file_name); + + DisableDebug("Portable"); + SetToStdErr(0); +} + } // namespace ilang From 7b2daef02fec949b116308a418c205a45c262584 Mon Sep 17 00:00:00 2001 From: Bo-Yuan Huang Date: Fri, 15 Mar 2019 15:20:40 -0400 Subject: [PATCH 03/21] Handle partial specified abs from synth engine && verbose debug msg --- src/synth-interface/synth_abs_converter.cc | 33 ++++++++++++++++------ 1 file changed, 25 insertions(+), 8 deletions(-) diff --git a/src/synth-interface/synth_abs_converter.cc b/src/synth-interface/synth_abs_converter.cc index 9483753e0..9fe4fd4ae 100644 --- a/src/synth-interface/synth_abs_converter.cc +++ b/src/synth-interface/synth_abs_converter.cc @@ -91,6 +91,8 @@ SynthAbsConverter::ConvertSynthNodeToIlangExpr(const ilasynth::nptr_t& node, void SynthAbsConverter::PortInputs(const ilasynth::Abstraction& abs, const InstrLvlAbsPtr& ila) { + ILA_DLOG("SynthImport") << "Port input variables"; + auto inps_synth = abs.getInps(); for (auto it : inps_synth) { auto node = it.second.var; @@ -127,6 +129,8 @@ void SynthAbsConverter::PortInputs(const ilasynth::Abstraction& abs, void SynthAbsConverter::PortStates(const ilasynth::Abstraction& abs, const InstrLvlAbsPtr& ila) { + ILA_DLOG("SynthImport") << "Port state variables"; + // bool auto bits_synth = abs.getBits(); for (auto it : bits_synth) { @@ -193,24 +197,29 @@ void SynthAbsConverter::PortStates(const ilasynth::Abstraction& abs, void SynthAbsConverter::PortValid(const ilasynth::Abstraction& abs, const InstrLvlAbsPtr& ila) { + ILA_DLOG("SynthImport") << "Port valid function"; auto valid_synth = abs.getFetchValidRef(); - auto valid_ilang = ConvertSynthNodeToIlangExpr(valid_synth, ila); - - ila->SetValid(valid_ilang); + if (valid_synth) { + auto valid_ilang = ConvertSynthNodeToIlangExpr(valid_synth, ila); + ila->SetValid(valid_ilang); + } return; } void SynthAbsConverter::PortFetch(const ilasynth::Abstraction& abs, const InstrLvlAbsPtr& ila) { + ILA_DLOG("SynthImport") << "Port fetch function"; auto fetch_synth = abs.getFetchExprRef(); - auto fetch_ilang = ConvertSynthNodeToIlangExpr(fetch_synth, ila); - - ila->SetFetch(fetch_ilang); + if (fetch_synth) { + auto fetch_ilang = ConvertSynthNodeToIlangExpr(fetch_synth, ila); + ila->SetFetch(fetch_ilang); + } return; } void SynthAbsConverter::PortInits(const ilasynth::Abstraction& abs, const InstrLvlAbsPtr& ila) { + ILA_DLOG("SynthImport") << "Port initial conditions"; // only add initial condition for state vars that are already defined for (auto i = 0; i != ila->state_num(); i++) { auto var_expr = ila->state(i); @@ -238,6 +247,7 @@ void SynthAbsConverter::PortInits(const ilasynth::Abstraction& abs, void SynthAbsConverter::PortFuncs(const ilasynth::Abstraction& abs, const InstrLvlAbsPtr& ila) { + ILA_DLOG("SynthImport") << "Port uninterpreted functions"; auto funs_synth = abs.getFuns(); for (auto it : funs_synth) { auto node = it.second.var; @@ -273,6 +283,7 @@ void SynthAbsConverter::PortFuncs(const ilasynth::Abstraction& abs, void SynthAbsConverter::PortInstructions(const ilasynth::Abstraction& abs, const InstrLvlAbsPtr& ila) { + ILA_DLOG("SynthImport") << "Port instructions"; std::map instr_map; // get the set of decode functions @@ -295,8 +306,14 @@ void SynthAbsConverter::PortInstructions(const ilasynth::Abstraction& abs, // next state functions are conjuncted when being exported auto name = var->name().str(); - auto next_node = abs.getNext(name)->node; - auto next_expr = ConvertSynthNodeToIlangExpr(next_node, ila); + + auto next_expr = ExprPtr(NULL); + try { + auto next_node = abs.getNext(name)->node; + next_expr = ConvertSynthNodeToIlangExpr(next_node, ila); + } catch (...) { // catch exception if next func not specified + next_expr = var; + } // decompose the next state functions DecomposeExpr(next_expr); From e202763b3f18c85d99a57fe23b7cad7feb6f8756 Mon Sep 17 00:00:00 2001 From: Bo-Yuan Huang Date: Fri, 15 Mar 2019 18:34:52 -0400 Subject: [PATCH 04/21] Add expr op MUL --- include/ilang/ila/ast/expr_op.h | 10 +++++++++- include/ilang/ila/expr_fuse.h | 2 ++ include/ilang/ilang++.h | 4 ++++ src/ila/ast/expr_op.cc | 13 +++++++++++++ src/ila/expr_fuse.cc | 9 +++++++++ src/ilang++.cc | 10 ++++++++++ test/t_expr_op.cc | 31 +++++++++++++++++++++++++++++++ 7 files changed, 78 insertions(+), 1 deletion(-) diff --git a/include/ilang/ila/ast/expr_op.h b/include/ilang/ila/ast/expr_op.h index 90c06d3dd..e337c1be0 100644 --- a/include/ilang/ila/ast/expr_op.h +++ b/include/ilang/ila/ast/expr_op.h @@ -185,7 +185,15 @@ class ExprOpSub : public ExprOp { // TODO ExprOpMod -// TODO ExprOpMul +/// \brief The wrapper for unsigned multiplication. +class ExprOpMul : public ExprOp { +public: + /// Constructor for MUL operation. + ExprOpMul(const ExprPtr arg0, const ExprPtr arg1); + std::string op_name() const { return "MUL"; } + z3::expr GetZ3Expr(z3::context& ctx, const Z3ExprVec& expr_vec, + const std::string& suffix = "") const; +}; // class ExprOpMul /******************************************************************************/ // Binary comparison diff --git a/include/ilang/ila/expr_fuse.h b/include/ilang/ila/expr_fuse.h index 684e45133..1a1ae2354 100644 --- a/include/ilang/ila/expr_fuse.h +++ b/include/ilang/ila/expr_fuse.h @@ -101,6 +101,8 @@ ExprPtr Lshr(const ExprPtr l, const int& r); ExprPtr Add(const ExprPtr l, const int& r); /// Arithmetic subtraction with int. ExprPtr Sub(const ExprPtr l, const int& r); +/// Arithmetic unsigned multiply with int (bv only). +ExprPtr Mul(const ExprPtr l, const int& r); /******************************************************************************/ // Comparison diff --git a/include/ilang/ilang++.h b/include/ilang/ilang++.h index 8ca670ecd..e851f7dfe 100644 --- a/include/ilang/ilang++.h +++ b/include/ilang/ilang++.h @@ -168,6 +168,8 @@ ExprRef Lshr(const ExprRef& a, const ExprRef& b); ExprRef operator+(const ExprRef& a, const ExprRef& b); /// Unsigned subtraction for bit-vectors. ExprRef operator-(const ExprRef& a, const ExprRef& b); +/// Unsigned multiply for bit-vectors. +ExprRef operator*(const ExprRef& a, const ExprRef& b); /// Logical AND with Boolean constant. ExprRef operator&(const ExprRef& a, const bool& b); @@ -185,6 +187,8 @@ ExprRef Lshr(const ExprRef& a, const int& b); ExprRef operator+(const ExprRef& a, const int& b); /// Unsigned subtraction with int constant. ExprRef operator-(const ExprRef& a, const int& b); +/// Unsigned multiply with int constant. +ExprRef operator*(const ExprRef& a, const int& b); /******************************************************************************/ // Binary comparison diff --git a/src/ila/ast/expr_op.cc b/src/ila/ast/expr_op.cc index 7f2ef22f6..97616a03b 100644 --- a/src/ila/ast/expr_op.cc +++ b/src/ila/ast/expr_op.cc @@ -263,6 +263,19 @@ z3::expr ExprOpSub::GetZ3Expr(z3::context& ctx, const Z3ExprVec& expr_vec, return expr_vec[0] - expr_vec[1]; } +// ------------------------- Class ExprOpMul ------------------------------- // +ExprOpMul::ExprOpMul(const ExprPtr arg0, const ExprPtr arg1) + : ExprOp(arg0, arg1) { + set_sort(GetSortBinaryOperation(arg0, arg1)); +} + +z3::expr ExprOpMul::GetZ3Expr(z3::context& ctx, const Z3ExprVec& expr_vec, + const std::string& suffix) const { + ILA_ASSERT(expr_vec.size() == 2) << "Mul is binary operation."; + ILA_ASSERT(is_bv()) << "Mul can only be applied to bv."; + return expr_vec[0] * expr_vec[1]; +} + // ------------------------- Class ExprOpEq --------------------------------- // ExprOpEq::ExprOpEq(const ExprPtr arg0, const ExprPtr arg1) : ExprOp(arg0, arg1) { diff --git a/src/ila/expr_fuse.cc b/src/ila/expr_fuse.cc index 970d92308..122906efe 100644 --- a/src/ila/expr_fuse.cc +++ b/src/ila/expr_fuse.cc @@ -121,6 +121,10 @@ ExprPtr ExprFuse::Sub(const ExprPtr l, const ExprPtr r) { return std::make_shared(l, r); } +ExprPtr ExprFuse::Mul(const ExprPtr l, const ExprPtr r) { + return std::make_shared(l, r); +} + ExprPtr ExprFuse::And(const ExprPtr l, const bool& r) { auto rc = ExprFuse::BoolConst(r); return ExprFuse::And(l, rc); @@ -161,6 +165,11 @@ ExprPtr ExprFuse::Sub(const ExprPtr l, const int& r) { return ExprFuse::Sub(l, rc); } +ExprPtr ExprFuse::Mul(const ExprPtr l, const int& r) { + auto rc = ExprFuse::BvConst(r, l->sort()->bit_width()); + return ExprFuse::Mul(l, rc); +} + ExprPtr ExprFuse::Eq(const ExprPtr l, const ExprPtr r) { return std::make_shared(l, r); } diff --git a/src/ilang++.cc b/src/ilang++.cc index 66509d8d6..10f3ece25 100644 --- a/src/ilang++.cc +++ b/src/ilang++.cc @@ -166,6 +166,11 @@ ExprRef operator-(const ExprRef& a, const ExprRef& b) { return ExprRef(v); } +ExprRef operator*(const ExprRef& a, const ExprRef& b) { + auto v = ExprFuse::Mul(a.get(), b.get()); + return ExprRef(v); +} + ExprRef operator&(const ExprRef& a, const bool& b) { auto v = ExprFuse::And(a.get(), b); return ExprRef(v); @@ -206,6 +211,11 @@ ExprRef operator-(const ExprRef& a, const int& b) { return ExprRef(v); } +ExprRef operator*(const ExprRef& a, const int& b) { + auto v = ExprFuse::Mul(a.get(), b); + return ExprRef(v); +} + ExprRef operator==(const ExprRef& a, const ExprRef& b) { auto v = ExprFuse::Eq(a.get(), b.get()); return ExprRef(v); diff --git a/test/t_expr_op.cc b/test/t_expr_op.cc index 69a560d2f..a1952a8e0 100644 --- a/test/t_expr_op.cc +++ b/test/t_expr_op.cc @@ -514,6 +514,37 @@ TEST_F(TestExprOp, Sub) { } } +TEST_F(TestExprOp, Mul) { + { // expr + auto mul = rx * ry; + auto z_mul = unr.GetZ3Expr(mul); + auto z_x = unr.GetZ3Expr(rx); + auto z_y = unr.GetZ3Expr(ry); + + s.add(z_x > 0); + s.add(z_y > 0); + s.add(z_x < 0x0f); + s.add(z_y < 0x04); + s.add(z_mul == 0); + EXPECT_EQ(z3::unsat, s.check()); + } + + s.reset(); + + { // const + auto mul = rx * 0x2; + auto z_mul = unr.GetZ3Expr(mul); + auto z_x = unr.GetZ3Expr(rx); + + s.add(z_x > 0x0); + s.add(z_x < 0x0f); + s.add(z_mul > 0x40); + EXPECT_EQ(z3::unsat, s.check()); + + m.SetFetch(mul); + } +} + TEST_F(TestExprOp, Equal) { { // bv expr auto eq = (rx == ry); From 035286f180cc4fb83f10ad60037203a8c227a816 Mon Sep 17 00:00:00 2001 From: Bo-Yuan Huang Date: Fri, 15 Mar 2019 19:08:16 -0400 Subject: [PATCH 05/21] Handle partially specified (initial conditions) abs from synth engine --- src/synth-interface/synth_abs_converter.cc | 29 +++++++++++++--------- 1 file changed, 17 insertions(+), 12 deletions(-) diff --git a/src/synth-interface/synth_abs_converter.cc b/src/synth-interface/synth_abs_converter.cc index 9fe4fd4ae..d96a966de 100644 --- a/src/synth-interface/synth_abs_converter.cc +++ b/src/synth-interface/synth_abs_converter.cc @@ -226,19 +226,25 @@ void SynthAbsConverter::PortInits(const ilasynth::Abstraction& abs, auto var_name = var_expr->name().str(); // initial value - auto init_val_node = abs.getInit(var_name)->node; - - if (init_val_node) { - auto init_val_expr = ConvertSynthNodeToIlangExpr(init_val_node, ila); - ila->AddInit(ExprFuse::Eq(var_expr, init_val_expr)); + try { + auto init_val_node = abs.getInit(var_name)->node; + if (init_val_node) { + auto init_val_expr = ConvertSynthNodeToIlangExpr(init_val_node, ila); + ila->AddInit(ExprFuse::Eq(var_expr, init_val_expr)); + } + } catch (...) { + ILA_DLOG("SynthImport") << "No initial value for " << var_name; } // initial predicate - auto init_pred_node = abs.getIpred(var_name)->node; - - if (init_pred_node) { - auto init_pred_expr = ConvertSynthNodeToIlangExpr(init_pred_node, ila); - ila->AddInit(init_pred_expr); + try { + auto init_pred_node = abs.getIpred(var_name)->node; + if (init_pred_node) { + auto init_pred_expr = ConvertSynthNodeToIlangExpr(init_pred_node, ila); + ila->AddInit(init_pred_expr); + } + } catch (...) { + ILA_DLOG("SynthImport") << "No initial predicate for " << var_name; } } @@ -667,8 +673,7 @@ void SynthAbsConverter::CnvtNodeToExprBvOp(const ilasynth::Node* n) { expr = ExprFuse::Ashr(expr_args.at(0), expr_args.at(1)); break; case ilasynth::BitvectorOp::Op::MUL: - ILA_ERROR << "MUL not implemented."; - // expr = ExprFuse::Mul(expr_args.at(0), expr_args.at(1)); + expr = ExprFuse::Mul(expr_args.at(0), expr_args.at(1)); break; case ilasynth::BitvectorOp::Op::CONCAT: expr = ExprFuse::Concat(expr_args.at(0), expr_args.at(1)); From aef38d072fe1c6a29c4f65b06ff8cd02f44e6332 Mon Sep 17 00:00:00 2001 From: Bo-Yuan Huang Date: Fri, 15 Mar 2019 19:09:50 -0400 Subject: [PATCH 06/21] Structure new component for generating C target --- include/ilang/target-c/ila_to_c.h | 54 +++++++++++++++++++++++++++++++ src/CMakeLists.txt | 7 ++-- src/target-c/CMakeLists.txt | 6 ++++ src/target-c/ila_to_c.cc | 23 +++++++++++++ 4 files changed, 87 insertions(+), 3 deletions(-) create mode 100644 include/ilang/target-c/ila_to_c.h create mode 100644 src/target-c/CMakeLists.txt create mode 100644 src/target-c/ila_to_c.cc diff --git a/include/ilang/target-c/ila_to_c.h b/include/ilang/target-c/ila_to_c.h new file mode 100644 index 000000000..72c6cdba5 --- /dev/null +++ b/include/ilang/target-c/ila_to_c.h @@ -0,0 +1,54 @@ +/// \file +/// ILA to C target generator.. + +#ifndef ILANG_TARGET_I2C_H__ +#define ILANG_TARGET_I2C_H__ + +#include +#include +#include + +/// \namespace ilang +namespace ilang { + +/// \brief The calss for converting an ILA model to a C target. +class I2CMngr { +public: + /// Pointer type for normal use of I2CMngr. + typedef std::shared_ptr I2CMngrPtr; + + // ------------------------- CONSTRUCTOR/DESTRUCTOR ----------------------- // + /// Default constructor. + I2CMngr(); + /// Default destructor. + ~I2CMngr(); + + // ------------------------- HELPERS -------------------------------------- // + /// \brief Create a new I2CMngr. Used for hiding implementation specific type + /// details. + static I2CMngrPtr New(); + + // ------------------------- METHODS -------------------------------------- // + /// \brief Generate a C target of the given ILA model. + /// \param[in] ila The top-level ILA model to generate the C target for. + /// \param[out] C intermediate representation. + void GenerateCTarget(const InstrLvlAbsPtr& ila); + +private: + // ------------------------- MEMBERS -------------------------------------- // + /// A map from visited i_expr id to c_var array index. + std::unordered_map id_var_map_; + + // ------------------------- METHODS -------------------------------------- // + /// Convert constant node to c contant. + void ConvertConst(const ExprPtr& expr) const; + +}; // class I2CMngr + +/// Pointer type for normal use of I2CMngr. +typedef I2CMngr::I2CMngrPtr I2CMngrPtr; + +}; // namespace ilang + +#endif // ILANG_TARGET_I2C_H__ + diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 8bb215d6a..6c7c12a7b 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -8,14 +8,15 @@ add_library(${PROJECT_NAME}::${ILANG_LIB_NAME} ALIAS ${ILANG_LIB_NAME}) ## ## source files ## -add_subdirectory(util) add_subdirectory(ila) +add_subdirectory(mcm) +add_subdirectory(portable) +add_subdirectory(target-c) +add_subdirectory(util) add_subdirectory(verification) add_subdirectory(verilog-in) add_subdirectory(verilog-out) add_subdirectory(vtarget-out) -add_subdirectory(mcm) -add_subdirectory(portable) if(${ILANG_BUILD_SYNTH}) add_subdirectory(synth-interface) diff --git a/src/target-c/CMakeLists.txt b/src/target-c/CMakeLists.txt new file mode 100644 index 000000000..8352f9968 --- /dev/null +++ b/src/target-c/CMakeLists.txt @@ -0,0 +1,6 @@ +# ---------------------------------------------------------------------------- # +# source +# ---------------------------------------------------------------------------- # +target_sources(${ILANG_LIB_NAME} PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR}/ila_to_c.cc +) diff --git a/src/target-c/ila_to_c.cc b/src/target-c/ila_to_c.cc new file mode 100644 index 000000000..47ead0bae --- /dev/null +++ b/src/target-c/ila_to_c.cc @@ -0,0 +1,23 @@ +/// \file +/// The implementation of the ILA to C target converter. + +#include +#include + +namespace ilang { + +typedef size_t ID_t; + +I2CMngr::I2CMngr() {} + +I2CMngr::~I2CMngr() {} + +I2CMngrPtr I2CMngr::New() { return std::make_shared(); } + +void I2CMngr::ConvertConst(const ExprPtr& expr) const { + // + return; +} + +}; // namespace ilang + From 00e4afff36e0189b4f71caa1a1065240b1120bb2 Mon Sep 17 00:00:00 2001 From: Bo-Yuan Huang Date: Fri, 15 Mar 2019 23:30:43 -0400 Subject: [PATCH 07/21] Add expr op MUL --- include/ilang/ila/ast_fuse.h | 1 + src/ila/ast_fuse.cc | 2 ++ 2 files changed, 3 insertions(+) diff --git a/include/ilang/ila/ast_fuse.h b/include/ilang/ila/ast_fuse.h index b477af939..7ebfc90bd 100644 --- a/include/ilang/ila/ast_fuse.h +++ b/include/ilang/ila/ast_fuse.h @@ -30,6 +30,7 @@ enum AST_UID_EXPR_OP { LSHR, ADD, SUB, + MUL, EQ, LT, GT, diff --git a/src/ila/ast_fuse.cc b/src/ila/ast_fuse.cc index 3ade3ad8d..dbd3a71c4 100644 --- a/src/ila/ast_fuse.cc +++ b/src/ila/ast_fuse.cc @@ -60,6 +60,8 @@ AST_UID_EXPR_OP GetUidExprOp(const ExprPtr& expr) { return AST_UID_EXPR_OP::ADD; } else if (std::dynamic_pointer_cast(expr_op)) { return AST_UID_EXPR_OP::SUB; + } else if (std::dynamic_pointer_cast(expr_op)) { + return AST_UID_EXPR_OP::MUL; } else if (std::dynamic_pointer_cast(expr_op)) { return AST_UID_EXPR_OP::EQ; } else if (std::dynamic_pointer_cast(expr_op)) { From 9d162a82eb4f1b8450069abbffaa77fa7dacb59d Mon Sep 17 00:00:00 2001 From: Bo-Yuan Huang Date: Fri, 15 Mar 2019 23:31:02 -0400 Subject: [PATCH 08/21] Support hierarchical export/import ILA portable --- .../ilang/portable/ila_to_json_serializer.h | 4 +- .../ilang/portable/json_to_ila_deserializer.h | 15 ++ include/ilang/portable/serdes_config.h | 1 + src/portable/ila_to_json_serializer.cc | 119 ++++++++------ src/portable/json_to_ila_deserializer.cc | 149 ++++++++++++++++++ 5 files changed, 235 insertions(+), 53 deletions(-) diff --git a/include/ilang/portable/ila_to_json_serializer.h b/include/ilang/portable/ila_to_json_serializer.h index 6544d3c91..0ad287f3f 100644 --- a/include/ilang/portable/ila_to_json_serializer.h +++ b/include/ilang/portable/ila_to_json_serializer.h @@ -36,7 +36,7 @@ class I2JSer { json SerExpr(const ExprPtr& i_expr); /// \brief Serialize Instr to JSON. json SerInstr(const InstrPtr& i_instr); - /// \brief Serialize InstrLvlAbs to JSON. + /// \brief Serialize InstrLvlAbs, including its children, to JSON. json SerInstrLvlAbs(const InstrLvlAbsPtr& i_ila); private: @@ -53,6 +53,8 @@ class I2JSer { json SerConstVal(const ExprPtr& i_expr) const; /// Serialize one single Expr. json SerExprUnit(const ExprPtr& i_expr); + /// Serialize InstrLvlAbs and its children, excluding the AST list. + json SerInstrLvlAbsNoAst(const InstrLvlAbsPtr& i_ila); }; // class I2JSer diff --git a/include/ilang/portable/json_to_ila_deserializer.h b/include/ilang/portable/json_to_ila_deserializer.h index 7f4e03c91..19269e369 100644 --- a/include/ilang/portable/json_to_ila_deserializer.h +++ b/include/ilang/portable/json_to_ila_deserializer.h @@ -39,15 +39,23 @@ class J2IDes { InstrPtr DesInstr(const json& j_instr, const InstrLvlAbsPtr& i_host) const; /// \brief Deserialize InstrLvlAbs from JSON. InstrLvlAbsPtr DesInstrLvlAbs(const json& j_ila); +#if 0 + /// \brief Deserialize top level (parent only) InstrLvlAbs from JSON. + InstrLvlAbsPtr DesInstrLvlAbsTop(const json& j_ila); +#endif private: // ------------------------- MEMBERS -------------------------------------- // /// A mapping from id to expressions. std::unordered_map id_expr_map_; +#if 0 /// The set of state variables. std::unordered_set state_id_set_; /// The set of input variables. std::unordered_set input_id_set_; +#endif + /// The mapping from ila name to pointer. + std::unordered_map ila_name_ptr_map_; // ------------------------- METHODS -------------------------------------- // /// Deserialize ExprVar into state from JSON. @@ -62,6 +70,13 @@ class J2IDes { ExprPtr DesExprOp(const unsigned& ast_expr_op_uid, const json& j_arg_arr, const json& j_param_arr) const; + void DesVarHier(const json& j_ila, const json& j_ast_list, + const InstrLvlAbsPtr& i_parent); + + void DesIlaHier(const json& j_ila); + + void DesIlaUnit(const json& j_ila); + }; // class J2IDes /// Pointer type for normal use of J2IDes. diff --git a/include/ilang/portable/serdes_config.h b/include/ilang/portable/serdes_config.h index 40a55d339..59188c826 100644 --- a/include/ilang/portable/serdes_config.h +++ b/include/ilang/portable/serdes_config.h @@ -37,6 +37,7 @@ namespace ilang { #define SERDES_ILA_INSTR "instr" #define SERDES_ILA_INIT "init" #define SERDES_ILA_AST "a" +#define SERDES_ILA_CHILD "c" // ConstVal #define SERDES_CONST_VAL "v" diff --git a/src/portable/ila_to_json_serializer.cc b/src/portable/ila_to_json_serializer.cc index 34d900222..9cd77fa7d 100644 --- a/src/portable/ila_to_json_serializer.cc +++ b/src/portable/ila_to_json_serializer.cc @@ -60,58 +60,7 @@ json I2JSer::SerInstr(const InstrPtr& i_instr) { json I2JSer::SerInstrLvlAbs(const InstrLvlAbsPtr& i_ila) { ILA_NOT_NULL(i_ila); - // create a new JSON object - auto j_ila = json::object(); - j_ila.emplace(SERDES_ILA_NAME, i_ila->name().str()); - - // input - ILA_DLOG("Portable") << "Serialize input variables"; - auto j_inp_arr = json::array(); - for (auto i = 0; i < i_ila->input_num(); i++) { - auto j_inp = SerExpr(i_ila->input(i)); - j_inp_arr.push_back(j_inp.at(SERDES_EXPR_ID).get()); - } - j_ila.emplace(SERDES_ILA_INPUT, j_inp_arr); - - // state - ILA_DLOG("Portable") << "Serialize state variables"; - auto j_state_arr = json::array(); - for (auto i = 0; i < i_ila->state_num(); i++) { - auto j_state = SerExpr(i_ila->state(i)); - j_state_arr.push_back(j_state.at(SERDES_EXPR_ID).get()); - } - j_ila.emplace(SERDES_ILA_STATE, j_state_arr); - - // fetch - ILA_DLOG("Portable") << "Serialize fetch function"; - if (i_ila->fetch()) { - auto j_fetch = SerExpr(i_ila->fetch()); - j_ila.emplace(SERDES_ILA_FETCH, j_fetch.at(SERDES_EXPR_ID).get()); - } - - // valid - ILA_DLOG("Portable") << "Serialize valid function"; - auto j_valid = SerExpr(i_ila->valid()); - j_ila.emplace(SERDES_ILA_VALID, j_valid.at(SERDES_EXPR_ID).get()); - - // instructions - ILA_DLOG("Portable") << "Serialize instructions"; - auto j_instr_arr = json::array(); - for (auto i = 0; i < i_ila->instr_num(); i++) { - j_instr_arr.push_back(SerInstr(i_ila->instr(i))); - } - j_ila.emplace(SERDES_ILA_INSTR, j_instr_arr); - - // init - ILA_DLOG("Portable") << "Serialize initial condition"; - auto j_init_arr = json::array(); - for (auto i = 0; i < i_ila->init_num(); i++) { - auto j_init = SerExpr(i_ila->init(i)); - j_init_arr.push_back(j_init.at(SERDES_EXPR_ID).get()); - } - j_ila.emplace(SERDES_ILA_INIT, j_init_arr); - - // XXX child + auto j_ila = SerInstrLvlAbsNoAst(i_ila); // all ast expressions ILA_DLOG("Portable") << "Serialize all ast nodes"; @@ -232,5 +181,71 @@ json I2JSer::SerExprUnit(const ExprPtr& i_expr) { return j_expr; } +json I2JSer::SerInstrLvlAbsNoAst(const InstrLvlAbsPtr& i_ila) { + ILA_NOT_NULL(i_ila); + + // create a new JSON object + auto j_ila = json::object(); + j_ila.emplace(SERDES_ILA_NAME, i_ila->name().str()); + + // input + ILA_DLOG("Portable") << "Serialize input variables of " << i_ila; + auto j_inp_arr = json::array(); + for (auto i = 0; i < i_ila->input_num(); i++) { + auto j_inp = SerExpr(i_ila->input(i)); + j_inp_arr.push_back(j_inp.at(SERDES_EXPR_ID).get()); + } + j_ila.emplace(SERDES_ILA_INPUT, j_inp_arr); + + // state + ILA_DLOG("Portable") << "Serialize state variables of " << i_ila; + auto j_state_arr = json::array(); + for (auto i = 0; i < i_ila->state_num(); i++) { + auto j_state = SerExpr(i_ila->state(i)); + j_state_arr.push_back(j_state.at(SERDES_EXPR_ID).get()); + } + j_ila.emplace(SERDES_ILA_STATE, j_state_arr); + + // fetch + ILA_DLOG("Portable") << "Serialize fetch function of " << i_ila; + if (i_ila->fetch()) { + auto j_fetch = SerExpr(i_ila->fetch()); + j_ila.emplace(SERDES_ILA_FETCH, j_fetch.at(SERDES_EXPR_ID).get()); + } + + // valid + ILA_DLOG("Portable") << "Serialize valid function of " << i_ila; + auto j_valid = SerExpr(i_ila->valid()); + j_ila.emplace(SERDES_ILA_VALID, j_valid.at(SERDES_EXPR_ID).get()); + + // instructions + ILA_DLOG("Portable") << "Serialize instructions of " << i_ila; + auto j_instr_arr = json::array(); + for (auto i = 0; i < i_ila->instr_num(); i++) { + j_instr_arr.push_back(SerInstr(i_ila->instr(i))); + } + j_ila.emplace(SERDES_ILA_INSTR, j_instr_arr); + + // init + ILA_DLOG("Portable") << "Serialize initial condition of " << i_ila; + auto j_init_arr = json::array(); + for (auto i = 0; i < i_ila->init_num(); i++) { + auto j_init = SerExpr(i_ila->init(i)); + j_init_arr.push_back(j_init.at(SERDES_EXPR_ID).get()); + } + j_ila.emplace(SERDES_ILA_INIT, j_init_arr); + + // child + ILA_DLOG("Portable") << "Serialize child ILAs of " << i_ila; + auto j_child_arr = json::array(); + for (auto i = 0; i < i_ila->child_num(); i++) { + auto j_child = SerInstrLvlAbsNoAst(i_ila->child(i)); + j_child_arr.push_back(j_child); + } + j_ila.emplace(SERDES_ILA_CHILD, j_child_arr); + + return j_ila; +} + }; // namespace ilang diff --git a/src/portable/json_to_ila_deserializer.cc b/src/portable/json_to_ila_deserializer.cc index 4767a2afe..ce72bfff4 100644 --- a/src/portable/json_to_ila_deserializer.cc +++ b/src/portable/json_to_ila_deserializer.cc @@ -37,6 +37,7 @@ ExprPtr J2IDes::DesExpr(const json& j_expr, const InstrLvlAbsPtr& i_host) { // deserialze variable case AST_UID_EXPR::VAR: { auto name = j_expr.at(SERDES_EXPR_NAME).get(); +#if 0 auto sort = j_expr.at(SERDES_EXPR_SORT); if (state_id_set_.find(id) != state_id_set_.end()) { i_expr = DesExprState(sort, name, i_host); @@ -45,6 +46,8 @@ ExprPtr J2IDes::DesExpr(const json& j_expr, const InstrLvlAbsPtr& i_host) { << "State/input " << name << " not found."; i_expr = DesExprInput(sort, name, i_host); } +#endif + ILA_ERROR << "Var should be constructed already " << name; break; } // deserialize constant @@ -100,6 +103,31 @@ InstrPtr J2IDes::DesInstr(const json& j_instr, } InstrLvlAbsPtr J2IDes::DesInstrLvlAbs(const json& j_ila) { + + // extract hier structure and set up state/input + auto j_expr_arr = j_ila.at(SERDES_ILA_AST); + DesVarHier(j_ila, j_expr_arr, NULL); + + // ast expressions + ILA_DLOG("Portable") << "Deserialize all ast nodes"; + for (auto j_expr : j_expr_arr) { + DesExpr(j_expr, NULL); + } + + // extract ila info + DesIlaHier(j_ila); + + // get the top-level ila + auto name = j_ila.at(SERDES_ILA_NAME).get(); + auto pos = ila_name_ptr_map_.find(name); + ILA_ASSERT(pos != ila_name_ptr_map_.end()) << name; + auto top_ila = pos->second; + + return top_ila; +} + +#if 0 +InstrLvlAbsPtr J2IDes::DesInstrLvlAbsTop(const json& j_ila) { auto name = j_ila.at(SERDES_ILA_NAME).get(); auto m = InstrLvlAbs::New(name); // XXX parent @@ -164,6 +192,7 @@ InstrLvlAbsPtr J2IDes::DesInstrLvlAbs(const json& j_ila) { return m; } +#endif ExprPtr J2IDes::DesExprState(const json& j_sort, const std::string& name, const InstrLvlAbsPtr& i_host) const { @@ -298,6 +327,9 @@ ExprPtr J2IDes::DesExprOp(const unsigned& ast_expr_op_uid, case AST_UID_EXPR_OP::SUB: { return ExprFuse::Sub(args.at(0), args.at(1)); } + case AST_UID_EXPR_OP::MUL: { + return ExprFuse::Mul(args.at(0), args.at(1)); + } case AST_UID_EXPR_OP::EQ: { return ExprFuse::Eq(args.at(0), args.at(1)); } @@ -344,5 +376,122 @@ ExprPtr J2IDes::DesExprOp(const unsigned& ast_expr_op_uid, }; // switch ast_expr_op_uid } +void J2IDes::DesVarHier(const json& j_ila, const json& j_ast_list, + const InstrLvlAbsPtr& i_parent) { + auto name = j_ila.at(SERDES_ILA_NAME).get(); + ILA_CHECK(ila_name_ptr_map_.find(name) == ila_name_ptr_map_.end()) << name; + + auto i_ila = i_parent ? i_parent->NewChild(name) : InstrLvlAbs::New(name); + ila_name_ptr_map_.emplace(name, i_ila); + + std::unordered_set input_id_set; + std::unordered_set state_id_set; + + // input + auto j_input_arr = j_ila.at(SERDES_ILA_INPUT); + for (auto input_id : j_input_arr) { + auto id = input_id.get(); + input_id_set.insert(id); + } + // state + auto j_state_arr = j_ila.at(SERDES_ILA_STATE); + for (auto state_id : j_state_arr) { + auto id = state_id.get(); + state_id_set.insert(id); + } + + // traverse ast list + for (auto j_expr : j_ast_list) { + // check if the expr has been des'ed + auto id = j_expr.at(SERDES_EXPR_ID).get(); + auto pos = id_expr_map_.find(id); + if (pos != id_expr_map_.end()) { + continue; + } + + // j_expr has not been des'ed yet + decltype(pos->second) i_expr = NULL; + + // expr ast type + auto expr_uid = j_expr.at(SERDES_EXPR_UID).get(); + if (expr_uid == AST_UID_EXPR::VAR) { + auto name = j_expr.at(SERDES_EXPR_NAME).get(); + auto sort = j_expr.at(SERDES_EXPR_SORT); + if (state_id_set.find(id) != state_id_set.end()) { + i_expr = DesExprState(sort, name, i_ila); + } else if (input_id_set.find(id) != input_id_set.end()) { + i_expr = DesExprInput(sort, name, i_ila); + } else { + continue; + } + + // book keeping + ILA_NOT_NULL(i_expr); + id_expr_map_.emplace(id, i_expr); + } + } + + // traverse children + auto j_child_arr = j_ila.at(SERDES_ILA_CHILD); + for (auto j_child : j_child_arr) { + DesVarHier(j_child, j_ast_list, i_ila); + } +} + +void J2IDes::DesIlaHier(const json& j_ila) { + DesIlaUnit(j_ila); + + // traverse children + auto j_child_arr = j_ila.at(SERDES_ILA_CHILD); + for (auto j_child : j_child_arr) { + DesIlaHier(j_child); + } +} + +void J2IDes::DesIlaUnit(const json& j_ila) { + auto name = j_ila.at(SERDES_ILA_NAME).get(); + auto pos = ila_name_ptr_map_.find(name); + ILA_ASSERT(pos != ila_name_ptr_map_.end()) << name; + auto m = pos->second; + + // fetch + ILA_DLOG("Portable") << "Deserialize fetch function of " << m; + try { + auto fetch_id = j_ila.at(SERDES_ILA_FETCH).get(); + auto fetch_it = id_expr_map_.find(fetch_id); + ILA_WARN_IF(fetch_it == id_expr_map_.end()) << "Fetch not found"; + m->SetFetch(fetch_it->second); + } catch (...) { + ILA_WARN << "Fetch not defined"; + } + + // valid + ILA_DLOG("Portable") << "Deserialize valid function of " << m; + try { + auto valid_id = j_ila.at(SERDES_ILA_VALID).get(); + auto valid_it = id_expr_map_.find(valid_id); + ILA_WARN_IF(valid_it == id_expr_map_.end()) << "Valid not found"; + m->SetValid(valid_it->second); + } catch (...) { + ILA_WARN << "Valid not defined"; + } + + // instructions + ILA_DLOG("Portable") << "Deserialize instructions of " << m; + auto j_instr_arr = j_ila.at(SERDES_ILA_INSTR); + for (auto j_instr : j_instr_arr) { + DesInstr(j_instr, m); + } + + // init + ILA_DLOG("Portable") << "Deserialize initial condition of " << m; + auto j_init_arr = j_ila.at(SERDES_ILA_INIT); + for (auto j_init : j_init_arr) { + auto init_expr_it = id_expr_map_.find(j_init.get()); + ILA_ASSERT(init_expr_it != id_expr_map_.end()) << "Init not found"; + m->AddInit(init_expr_it->second); + } +} + }; // namespace ilang From 07b1c25e49b5771760ce8f7ff448cd786eaa41e8 Mon Sep 17 00:00:00 2001 From: Bo-Yuan Huang Date: Sat, 16 Mar 2019 20:20:59 -0400 Subject: [PATCH 09/21] Support uninterpreted function in ILA portable --- .../ilang/portable/ila_to_json_serializer.h | 6 + .../ilang/portable/json_to_ila_deserializer.h | 36 +- include/ilang/portable/serdes_config.h | 13 +- src/portable/ila_to_json_serializer.cc | 60 +- src/portable/json_to_ila_deserializer.cc | 224 +- test/t_portable.cc | 14 + test/unit-data/rbm/rbm.json | 16908 ++++++++++++++++ 7 files changed, 17140 insertions(+), 121 deletions(-) create mode 100644 test/unit-data/rbm/rbm.json diff --git a/include/ilang/portable/ila_to_json_serializer.h b/include/ilang/portable/ila_to_json_serializer.h index 0ad287f3f..a78ebd6db 100644 --- a/include/ilang/portable/ila_to_json_serializer.h +++ b/include/ilang/portable/ila_to_json_serializer.h @@ -43,12 +43,18 @@ class I2JSer { // ------------------------- MEMBERS -------------------------------------- // /// A map from visited i_expr id to j_expr array index. std::unordered_map id_idx_map_; + /// A map from visited i_func id to j_func array index. + std::unordered_map func_id_idx_map_; /// The list of all serialized expressions (j_expr array). json j_expr_arr_; + /// The list of all serialized functions (j_func array). + json j_func_arr_; // ------------------------- METHODS -------------------------------------- // /// Serialize Sort to JSON. json SerSort(const SortPtr& i_sort) const; + /// Serialize Func to JSON. + json SerFunc(const FuncPtr& i_func); /// Serialize constant value to JSON. json SerConstVal(const ExprPtr& i_expr) const; /// Serialize one single Expr. diff --git a/include/ilang/portable/json_to_ila_deserializer.h b/include/ilang/portable/json_to_ila_deserializer.h index 19269e369..3afb89005 100644 --- a/include/ilang/portable/json_to_ila_deserializer.h +++ b/include/ilang/portable/json_to_ila_deserializer.h @@ -8,7 +8,6 @@ #include #include #include -#include using json = nlohmann::json; @@ -33,27 +32,23 @@ class J2IDes { static J2IDesPtr New(); // ------------------------- METHODS -------------------------------------- // + /// Deserialize Sort from JSON. + SortPtr DesSort(const json& j_sort); + /// Deserialize Func from JSON. + FuncPtr DesFunc(const json& j_func); /// \brief Deserialize Expr from JSON. - ExprPtr DesExpr(const json& j_expr, const InstrLvlAbsPtr& i_host); + ExprPtr DesExpr(const json& j_expr); /// \brief Deserialize Instr from JSON. InstrPtr DesInstr(const json& j_instr, const InstrLvlAbsPtr& i_host) const; /// \brief Deserialize InstrLvlAbs from JSON. - InstrLvlAbsPtr DesInstrLvlAbs(const json& j_ila); -#if 0 - /// \brief Deserialize top level (parent only) InstrLvlAbs from JSON. - InstrLvlAbsPtr DesInstrLvlAbsTop(const json& j_ila); -#endif + InstrLvlAbsPtr DesInstrLvlAbs(const json& j_global); private: // ------------------------- MEMBERS -------------------------------------- // - /// A mapping from id to expressions. + /// A mapping from id to expression. std::unordered_map id_expr_map_; -#if 0 - /// The set of state variables. - std::unordered_set state_id_set_; - /// The set of input variables. - std::unordered_set input_id_set_; -#endif + /// A mapping from id to function. + std::unordered_map id_func_map_; /// The mapping from ila name to pointer. std::unordered_map ila_name_ptr_map_; @@ -69,13 +64,22 @@ class J2IDes { /// Deserialize ExprOp from JSON. ExprPtr DesExprOp(const unsigned& ast_expr_op_uid, const json& j_arg_arr, const json& j_param_arr) const; + /// Deserialize ExprOpAppFunc from JSON. + ExprPtr DesExprOpAppFunc(const json& j_func_id, const json& j_arg_arr) const; + /// Deserialize state/input variables. Note: the ILA model will be + /// constructed on-the-fly. + void DesVarUnit(const json& j_ila, const json& j_ast_list, + const InstrLvlAbsPtr& i_parent); + /// Deserialize state/input variables hierarchically. Note: ILA model will be + /// constructed on-the-fly. void DesVarHier(const json& j_ila, const json& j_ast_list, const InstrLvlAbsPtr& i_parent); - void DesIlaHier(const json& j_ila); - + /// Deserialize ILA info, e.g., fetch, valid, instructions, etc. void DesIlaUnit(const json& j_ila); + /// Deserialize ILA info hierarchically. + void DesIlaHier(const json& j_ila); }; // class J2IDes diff --git a/include/ilang/portable/serdes_config.h b/include/ilang/portable/serdes_config.h index 59188c826..a0df83c21 100644 --- a/include/ilang/portable/serdes_config.h +++ b/include/ilang/portable/serdes_config.h @@ -13,6 +13,12 @@ namespace ilang { #define SERDES_SORT_ADDR_WIDTH "a" #define SERDES_SORT_DATA_WIDTH "d" +// Func +#define SERDES_FUNC_ID "i" +#define SERDES_FUNC_NAME "n" +#define SERDES_FUNC_OUT "o" +#define SERDES_FUNC_ARGS "a" + // Expr #define SERDES_EXPR_ID "i" #define SERDES_EXPR_UID "u" @@ -22,6 +28,7 @@ namespace ilang { #define SERDES_EXPR_OP "o" #define SERDES_EXPR_ARGS "a" #define SERDES_EXPR_PARAMS "p" +#define SERDES_EXPR_FUNC "f" // Instr #define SERDES_INSTR_NAME "n" @@ -36,7 +43,6 @@ namespace ilang { #define SERDES_ILA_VALID "v" #define SERDES_ILA_INSTR "instr" #define SERDES_ILA_INIT "init" -#define SERDES_ILA_AST "a" #define SERDES_ILA_CHILD "c" // ConstVal @@ -44,6 +50,11 @@ namespace ilang { #define SERDES_CONST_DEF "d" #define SERDES_CONST_MAP "m" +// Global +#define SERDES_GLOBAL_AST "a" +#define SERDES_GLOBAL_FUNC "f" +#define SERDES_GLOBAL_TOP "t" + }; // namespace ilang #endif // ILANG_PORTABLE_SERDES_CONFIG_H__ diff --git a/src/portable/ila_to_json_serializer.cc b/src/portable/ila_to_json_serializer.cc index 9cd77fa7d..37960c609 100644 --- a/src/portable/ila_to_json_serializer.cc +++ b/src/portable/ila_to_json_serializer.cc @@ -60,13 +60,21 @@ json I2JSer::SerInstr(const InstrPtr& i_instr) { json I2JSer::SerInstrLvlAbs(const InstrLvlAbsPtr& i_ila) { ILA_NOT_NULL(i_ila); - auto j_ila = SerInstrLvlAbsNoAst(i_ila); + auto j_global = json::object(); + + // top-level ila + auto j_top = SerInstrLvlAbsNoAst(i_ila); + j_global.emplace(SERDES_GLOBAL_TOP, j_top); // all ast expressions ILA_DLOG("Portable") << "Serialize all ast nodes"; - j_ila.emplace(SERDES_ILA_AST, j_expr_arr_); + j_global.emplace(SERDES_GLOBAL_AST, j_expr_arr_); - return j_ila; + // all func + ILA_DLOG("Portable") << "Serialize all func"; + j_global.emplace(SERDES_GLOBAL_FUNC, j_func_arr_); + + return j_global; } json I2JSer::SerSort(const SortPtr& i_sort) const { @@ -93,6 +101,44 @@ json I2JSer::SerSort(const SortPtr& i_sort) const { return j_sort; } +json I2JSer::SerFunc(const FuncPtr& i_func) { + // func id + auto id = i_func->name().id(); + + // check if i_func has been visited + auto pos = func_id_idx_map_.find(id); + if (pos != func_id_idx_map_.end()) { + return j_func_arr_.at(pos->second); + } + + // i_func has not been serialized yet, create a new JSON object + auto j_func = json::object(); + j_func.emplace(SERDES_FUNC_ID, id); + + // func name + auto func_name = i_func->name().str(); + j_func.emplace(SERDES_FUNC_NAME, func_name); + + // output sort (range) + auto i_out_sort = i_func->out(); + auto j_out_sort = SerSort(i_out_sort); + j_func.emplace(SERDES_FUNC_OUT, j_out_sort); + + // arguments sort (domain) + auto j_arg_sort_arr = json::array(); + for (auto i = 0; i < i_func->arg_num(); i++) { + auto i_arg_sort = i_func->arg(i); + auto j_arg_sort = SerSort(i_arg_sort); + j_arg_sort_arr.push_back(j_arg_sort); + } + j_func.emplace(SERDES_FUNC_ARGS, j_arg_sort_arr); + + // book keeping + j_func_arr_.push_back(j_func); + + return j_func; +} + json I2JSer::SerConstVal(const ExprPtr& i_expr) const { auto i_expr_const = std::dynamic_pointer_cast(i_expr); ILA_NOT_NULL(i_expr_const); @@ -170,6 +216,14 @@ json I2JSer::SerExprUnit(const ExprPtr& i_expr) { j_param_arr.push_back(i_expr->param(i)); } j_expr.emplace(SERDES_EXPR_PARAMS, j_param_arr); + + // only for apply function + if (expr_op_uid == AST_UID_EXPR_OP::APP_FUNC) { + auto i_expr_op_appfunc = std::dynamic_pointer_cast(i_expr); + ILA_NOT_NULL(i_expr_op_appfunc); + auto j_func = SerFunc(i_expr_op_appfunc->func()); + j_expr.emplace(SERDES_EXPR_FUNC, j_func.at(SERDES_FUNC_ID).get()); + } break; } }; // switch expr_uid diff --git a/src/portable/json_to_ila_deserializer.cc b/src/portable/json_to_ila_deserializer.cc index ce72bfff4..57ff31cf2 100644 --- a/src/portable/json_to_ila_deserializer.cc +++ b/src/portable/json_to_ila_deserializer.cc @@ -7,6 +7,7 @@ #include #include #include +#include #include namespace ilang { @@ -20,7 +21,58 @@ J2IDes::~J2IDes() {} J2IDesPtr J2IDes::New() { return std::make_shared(); } -ExprPtr J2IDes::DesExpr(const json& j_expr, const InstrLvlAbsPtr& i_host) { +SortPtr J2IDes::DesSort(const json& j_sort) { + switch (j_sort.at(SERDES_SORT_UID).get()) { + // bool + case AST_UID_SORT::BOOL: { + return Sort::MakeBoolSort(); + } + // bit-vector + case AST_UID_SORT::BV: { + auto width = j_sort.at(SERDES_SORT_WIDTH).get(); + return Sort::MakeBvSort(width); + } + // memory (array) + case AST_UID_SORT::MEM: { + auto addr_width = j_sort.at(SERDES_SORT_ADDR_WIDTH).get(); + auto data_width = j_sort.at(SERDES_SORT_DATA_WIDTH).get(); + return Sort::MakeMemSort(addr_width, data_width); + } + default: { return NULL; } + }; // switch j_sort id +} + +FuncPtr J2IDes::DesFunc(const json& j_func) { + // check if the func has been des'ed + auto id = j_func.at(SERDES_FUNC_ID).get(); + auto pos = id_func_map_.find(id); + if (pos != id_func_map_.end()) { + return pos->second; + } // j_func has not been des'ed yet + + // func name + auto name = j_func.at(SERDES_FUNC_NAME).get(); + + // output sort (range) + auto j_out_sort = j_func.at(SERDES_FUNC_OUT); + auto i_out_sort = DesSort(j_out_sort); + + // argument sort (domain) + auto j_arg_sort_arr = j_func.at(SERDES_FUNC_ARGS); + auto i_arg_sort_vec = std::vector(); + for (auto it = j_arg_sort_arr.begin(); it != j_arg_sort_arr.end(); it++) { + auto i_arg_sort = DesSort(*it); + i_arg_sort_vec.push_back(i_arg_sort); + } + + // construct new func & book keeping + auto i_func = Func::New(name, i_out_sort, i_arg_sort_vec); + id_func_map_.emplace(id, i_func); + + return i_func; +} + +ExprPtr J2IDes::DesExpr(const json& j_expr) { // check if the expr has been des'ed auto id = j_expr.at(SERDES_EXPR_ID).get(); auto pos = id_expr_map_.find(id); @@ -36,18 +88,7 @@ ExprPtr J2IDes::DesExpr(const json& j_expr, const InstrLvlAbsPtr& i_host) { switch (expr_uid) { // deserialze variable case AST_UID_EXPR::VAR: { - auto name = j_expr.at(SERDES_EXPR_NAME).get(); -#if 0 - auto sort = j_expr.at(SERDES_EXPR_SORT); - if (state_id_set_.find(id) != state_id_set_.end()) { - i_expr = DesExprState(sort, name, i_host); - } else { - ILA_ASSERT(input_id_set_.find(id) != input_id_set_.end()) - << "State/input " << name << " not found."; - i_expr = DesExprInput(sort, name, i_host); - } -#endif - ILA_ERROR << "Var should be constructed already " << name; + ILA_ERROR << "Var w/o host " << j_expr.at(SERDES_EXPR_NAME); break; } // deserialize constant @@ -60,9 +101,16 @@ ExprPtr J2IDes::DesExpr(const json& j_expr, const InstrLvlAbsPtr& i_host) { // deserialize operator case AST_UID_EXPR::OP: { auto expr_op_uid = j_expr.at(SERDES_EXPR_OP).get(); - auto& j_arg_arr = j_expr.at(SERDES_EXPR_ARGS); - auto& j_param_arr = j_expr.at(SERDES_EXPR_PARAMS); - i_expr = DesExprOp(expr_op_uid, j_arg_arr, j_param_arr); + + if (expr_op_uid == AST_UID_EXPR_OP::APP_FUNC) { + auto& j_func_id = j_expr.at(SERDES_EXPR_FUNC); + auto& j_arg_arr = j_expr.at(SERDES_EXPR_ARGS); + i_expr = DesExprOpAppFunc(j_func_id, j_arg_arr); + } else { + auto& j_arg_arr = j_expr.at(SERDES_EXPR_ARGS); + auto& j_param_arr = j_expr.at(SERDES_EXPR_PARAMS); + i_expr = DesExprOp(expr_op_uid, j_arg_arr, j_param_arr); + } break; } }; // switch expr_uid @@ -102,98 +150,37 @@ InstrPtr J2IDes::DesInstr(const json& j_instr, return instr; } -InstrLvlAbsPtr J2IDes::DesInstrLvlAbs(const json& j_ila) { +InstrLvlAbsPtr J2IDes::DesInstrLvlAbs(const json& j_global) { + auto j_expr_arr = j_global.at(SERDES_GLOBAL_AST); + auto j_func_arr = j_global.at(SERDES_GLOBAL_FUNC); // extract hier structure and set up state/input - auto j_expr_arr = j_ila.at(SERDES_ILA_AST); - DesVarHier(j_ila, j_expr_arr, NULL); + auto j_top = j_global.at(SERDES_GLOBAL_TOP); + DesVarHier(j_top, j_expr_arr, NULL); + + // func + ILA_DLOG("Portable") << "Deserialize all uninterpreted functions"; + for (auto j_func : j_func_arr) { + DesFunc(j_func); + } // ast expressions ILA_DLOG("Portable") << "Deserialize all ast nodes"; for (auto j_expr : j_expr_arr) { - DesExpr(j_expr, NULL); + DesExpr(j_expr); } // extract ila info - DesIlaHier(j_ila); + DesIlaHier(j_top); // get the top-level ila - auto name = j_ila.at(SERDES_ILA_NAME).get(); + auto name = j_top.at(SERDES_ILA_NAME).get(); auto pos = ila_name_ptr_map_.find(name); ILA_ASSERT(pos != ila_name_ptr_map_.end()) << name; auto top_ila = pos->second; - return top_ila; } -#if 0 -InstrLvlAbsPtr J2IDes::DesInstrLvlAbsTop(const json& j_ila) { - auto name = j_ila.at(SERDES_ILA_NAME).get(); - auto m = InstrLvlAbs::New(name); // XXX parent - - // input - ILA_DLOG("Portable") << "Deserialize input variables"; - auto j_inp_arr = j_ila.at(SERDES_ILA_INPUT); - for (auto inp_id : j_inp_arr) { - input_id_set_.insert(inp_id.get()); - } - - // state - ILA_DLOG("Portable") << "Deserialize state variables"; - auto j_state_arr = j_ila.at(SERDES_ILA_STATE); - for (auto state_id : j_state_arr) { - state_id_set_.insert(state_id.get()); - } - - // ast expressions - ILA_DLOG("Portable") << "Deserialize ast nodes"; - auto j_expr_arr = j_ila.at(SERDES_ILA_AST); - for (auto j_expr : j_expr_arr) { - DesExpr(j_expr, m); - } - - // fetch - ILA_DLOG("Portable") << "Deserialize fetch function"; - try { - auto fetch_id = j_ila.at(SERDES_ILA_FETCH).get(); - auto fetch_it = id_expr_map_.find(fetch_id); - ILA_WARN_IF(fetch_it == id_expr_map_.end()) << "Fetch not found"; - m->SetFetch(fetch_it->second); - } catch (...) { - ILA_WARN << "Fetch not defined"; - } - - // valid - ILA_DLOG("Portable") << "Deserialize valid function"; - try { - auto valid_id = j_ila.at(SERDES_ILA_VALID).get(); - auto valid_it = id_expr_map_.find(valid_id); - ILA_WARN_IF(valid_it == id_expr_map_.end()) << "Valid not found"; - m->SetValid(valid_it->second); - } catch (...) { - ILA_WARN << "Valid not defined"; - } - - // instructions - ILA_DLOG("Portable") << "Deserialize instructions"; - auto j_instr_arr = j_ila.at(SERDES_ILA_INSTR); - for (auto j_instr : j_instr_arr) { - DesInstr(j_instr, m); - } - - // init - ILA_DLOG("Portable") << "Deserialize initial condition"; - auto j_init_arr = j_ila.at(SERDES_ILA_INIT); - for (auto j_init : j_init_arr) { - auto init_expr_it = id_expr_map_.find(j_init.get()); - ILA_ASSERT(init_expr_it != id_expr_map_.end()) << "Init not found"; - m->AddInit(init_expr_it->second); - } - - return m; -} -#endif - ExprPtr J2IDes::DesExprState(const json& j_sort, const std::string& name, const InstrLvlAbsPtr& i_host) const { switch (j_sort.at(SERDES_SORT_UID).get()) { @@ -376,7 +363,30 @@ ExprPtr J2IDes::DesExprOp(const unsigned& ast_expr_op_uid, }; // switch ast_expr_op_uid } -void J2IDes::DesVarHier(const json& j_ila, const json& j_ast_list, +ExprPtr J2IDes::DesExprOpAppFunc(const json& j_func, + const json& j_arg_arr) const { + // func + auto func_id = j_func.get(); + auto func_pos = id_func_map_.find(func_id); + ILA_ASSERT(func_pos != id_func_map_.end()) << j_func; + auto i_func = func_pos->second; + + // arguments + auto args = std::vector(); + for (auto it = j_arg_arr.begin(); it != j_arg_arr.end(); it++) { + auto arg_id = (*it).get(); + auto arg_it = id_expr_map_.find(arg_id); + ILA_ASSERT(arg_it != id_expr_map_.end()) << "Missing arg " << arg_id; + args.push_back(arg_it->second); + } + + auto i_expr_op_app_func = ExprFuse::AppFunc(i_func, args); + ILA_NOT_NULL(i_expr_op_app_func); + + return i_expr_op_app_func; +} + +void J2IDes::DesVarUnit(const json& j_ila, const json& j_ast_list, const InstrLvlAbsPtr& i_parent) { auto name = j_ila.at(SERDES_ILA_NAME).get(); ILA_CHECK(ila_name_ptr_map_.find(name) == ila_name_ptr_map_.end()) << name; @@ -430,21 +440,23 @@ void J2IDes::DesVarHier(const json& j_ila, const json& j_ast_list, id_expr_map_.emplace(id, i_expr); } } - - // traverse children - auto j_child_arr = j_ila.at(SERDES_ILA_CHILD); - for (auto j_child : j_child_arr) { - DesVarHier(j_child, j_ast_list, i_ila); - } } -void J2IDes::DesIlaHier(const json& j_ila) { - DesIlaUnit(j_ila); +void J2IDes::DesVarHier(const json& j_ila, const json& j_ast_list, + const InstrLvlAbsPtr& i_parent) { + // des state/input variables in top-level ILA + DesVarUnit(j_ila, j_ast_list, i_parent); + + // top-level ILA should have been created + auto name = j_ila.at(SERDES_ILA_NAME).get(); + auto pos = ila_name_ptr_map_.find(name); + ILA_ASSERT(pos != ila_name_ptr_map_.end()) << "ILA not constructed " << name; + auto i_ila = pos->second; // traverse children auto j_child_arr = j_ila.at(SERDES_ILA_CHILD); for (auto j_child : j_child_arr) { - DesIlaHier(j_child); + DesVarHier(j_child, j_ast_list, i_ila); } } @@ -493,5 +505,15 @@ void J2IDes::DesIlaUnit(const json& j_ila) { } } +void J2IDes::DesIlaHier(const json& j_ila) { + // des ila info, e.g., fetch, valid, instr, etc., of top-level ILA + DesIlaUnit(j_ila); + + // traverse children + auto j_child_arr = j_ila.at(SERDES_ILA_CHILD); + for (auto j_child : j_child_arr) { + DesIlaHier(j_child); + } +} }; // namespace ilang diff --git a/test/t_portable.cc b/test/t_portable.cc index 833ee3ef2..0fc871a3f 100644 --- a/test/t_portable.cc +++ b/test/t_portable.cc @@ -159,4 +159,18 @@ TEST(TestPortable, UAES) { SetToStdErr(0); } +TEST(TestPortable, RBM) { + SetToStdErr(1); + // DebugLog::Enable("Portable"); + + auto rbm_portable_file = + std::string(ILANG_TEST_SRC_ROOT) + "/unit-data/rbm/rbm.json"; + auto rbm_ila = IlaSerDesMngr::DesFromFile(rbm_portable_file); + + auto ser_rbm = IlaSerDesMngr::Serialize(rbm_ila); + auto des_rbm = IlaSerDesMngr::Deserialize(ser_rbm); + + DebugLog::Disable("Portable"); +} + } // namespace ilang diff --git a/test/unit-data/rbm/rbm.json b/test/unit-data/rbm/rbm.json new file mode 100644 index 000000000..76afe8b71 --- /dev/null +++ b/test/unit-data/rbm/rbm.json @@ -0,0 +1,16908 @@ +{ + "a": [ + { + "i": 10, + "n": "conf_done", + "s": { + "u": 2, + "w": 1 + }, + "u": 1 + }, + { + "i": 14, + "n": "conf_num_hidden", + "s": { + "u": 2, + "w": 32 + }, + "u": 1 + }, + { + "i": 18, + "n": "conf_num_loops", + "s": { + "u": 2, + "w": 32 + }, + "u": 1 + }, + { + "i": 22, + "n": "conf_num_movies", + "s": { + "u": 2, + "w": 32 + }, + "u": 1 + }, + { + "i": 26, + "n": "conf_num_testusers", + "s": { + "u": 2, + "w": 32 + }, + "u": 1 + }, + { + "i": 30, + "n": "conf_num_users", + "s": { + "u": 2, + "w": 32 + }, + "u": 1 + }, + { + "i": 34, + "n": "conf_num_visible", + "s": { + "u": 2, + "w": 32 + }, + "u": 1 + }, + { + "i": 38, + "n": "data_in", + "s": { + "u": 2, + "w": 32 + }, + "u": 1 + }, + { + "i": 42, + "n": "rd_grant", + "s": { + "u": 2, + "w": 1 + }, + "u": 1 + }, + { + "i": 46, + "n": "rst", + "s": { + "u": 2, + "w": 1 + }, + "u": 1 + }, + { + "i": 50, + "n": "wr_grant", + "s": { + "u": 2, + "w": 1 + }, + "u": 1 + }, + { + "i": 54, + "n": "data_out", + "s": { + "u": 2, + "w": 32 + }, + "u": 1 + }, + { + "i": 58, + "n": "done", + "s": { + "u": 2, + "w": 1 + }, + "u": 1 + }, + { + "i": 62, + "n": "init_done", + "s": { + "u": 2, + "w": 1 + }, + "u": 1 + }, + { + "i": 66, + "n": "num_hidden", + "s": { + "u": 2, + "w": 16 + }, + "u": 1 + }, + { + "i": 70, + "n": "num_loops", + "s": { + "u": 2, + "w": 16 + }, + "u": 1 + }, + { + "i": 74, + "n": "num_movies", + "s": { + "u": 2, + "w": 16 + }, + "u": 1 + }, + { + "i": 78, + "n": "num_testusers", + "s": { + "u": 2, + "w": 16 + }, + "u": 1 + }, + { + "i": 82, + "n": "num_users", + "s": { + "u": 2, + "w": 16 + }, + "u": 1 + }, + { + "i": 86, + "n": "num_visible", + "s": { + "u": 2, + "w": 16 + }, + "u": 1 + }, + { + "i": 90, + "n": "rd_complete", + "s": { + "u": 2, + "w": 1 + }, + "u": 1 + }, + { + "i": 94, + "n": "rd_granted", + "s": { + "u": 2, + "w": 1 + }, + "u": 1 + }, + { + "i": 98, + "n": "rd_index", + "s": { + "u": 2, + "w": 32 + }, + "u": 1 + }, + { + "i": 102, + "n": "rd_length", + "s": { + "u": 2, + "w": 32 + }, + "u": 1 + }, + { + "i": 106, + "n": "rd_request", + "s": { + "u": 2, + "w": 1 + }, + "u": 1 + }, + { + "i": 110, + "n": "wr_complete", + "s": { + "u": 2, + "w": 1 + }, + "u": 1 + }, + { + "i": 114, + "n": "wr_granted", + "s": { + "u": 2, + "w": 1 + }, + "u": 1 + }, + { + "i": 118, + "n": "wr_index", + "s": { + "u": 2, + "w": 32 + }, + "u": 1 + }, + { + "i": 122, + "n": "wr_length", + "s": { + "u": 2, + "w": 32 + }, + "u": 1 + }, + { + "i": 126, + "n": "wr_request", + "s": { + "u": 2, + "w": 1 + }, + "u": 1 + }, + { + "i": 130, + "n": "data", + "s": { + "a": 9, + "d": 8, + "u": 3 + }, + "u": 1 + }, + { + "i": 134, + "n": "predict_result", + "s": { + "a": 7, + "d": 8, + "u": 3 + }, + "u": 1 + }, + { + "i": 314, + "s": { + "u": 1 + }, + "u": 2, + "v": { + "v": true + } + }, + { + "i": 298, + "s": { + "u": 2, + "w": 1 + }, + "u": 2, + "v": { + "v": 1 + } + }, + { + "a": [ + 46, + 298 + ], + "i": 139, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 126, + 50 + ], + "i": 177, + "o": 4, + "p": [], + "u": 3 + }, + { + "i": 178, + "s": { + "u": 2, + "w": 1 + }, + "u": 2, + "v": { + "v": 1 + } + }, + { + "a": [ + 177, + 178 + ], + "i": 180, + "o": 13, + "p": [], + "u": 3 + }, + { + "i": 182, + "s": { + "u": 2, + "w": 7 + }, + "u": 2, + "v": { + "v": 0 + } + }, + { + "a": [ + 134, + 182 + ], + "i": 184, + "o": 18, + "p": [], + "u": 3 + }, + { + "a": [ + 184 + ], + "i": 186, + "o": 22, + "p": [ + 32 + ], + "u": 3 + }, + { + "a": [ + 180, + 186, + 54 + ], + "i": 188, + "o": 26, + "p": [], + "u": 3 + }, + { + "i": 191, + "s": { + "u": 2, + "w": 1 + }, + "u": 2, + "v": { + "v": 0 + } + }, + { + "i": 207, + "s": { + "u": 2, + "w": 16 + }, + "u": 2, + "v": { + "v": 0 + } + }, + { + "a": [ + 126, + 50 + ], + "i": 297, + "o": 4, + "p": [], + "u": 3 + }, + { + "a": [ + 297, + 298 + ], + "i": 300, + "o": 13, + "p": [], + "u": 3 + }, + { + "i": 201, + "s": { + "u": 2, + "w": 1 + }, + "u": 2, + "v": { + "v": 1 + } + }, + { + "a": [ + 300, + 201, + 114 + ], + "i": 302, + "o": 26, + "p": [], + "u": 3 + }, + { + "i": 142, + "s": { + "u": 2, + "w": 1 + }, + "u": 2, + "v": { + "v": 0 + } + }, + { + "a": [ + 46, + 142 + ], + "i": 279, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 62, + 142 + ], + "i": 281, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 279, + 281 + ], + "i": 283, + "o": 4, + "p": [], + "u": 3 + }, + { + "a": [ + 10, + 298 + ], + "i": 284, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 283, + 284 + ], + "i": 155, + "o": 4, + "p": [], + "u": 3 + }, + { + "a": [ + 14 + ], + "i": 217, + "o": 21, + "p": [ + 15, + 0 + ], + "u": 3 + }, + { + "a": [ + 18 + ], + "i": 231, + "o": 21, + "p": [ + 15, + 0 + ], + "u": 3 + }, + { + "a": [ + 22 + ], + "i": 245, + "o": 21, + "p": [ + 15, + 0 + ], + "u": 3 + }, + { + "a": [ + 26 + ], + "i": 259, + "o": 21, + "p": [ + 15, + 0 + ], + "u": 3 + }, + { + "a": [ + 30 + ], + "i": 273, + "o": 21, + "p": [ + 15, + 0 + ], + "u": 3 + }, + { + "a": [ + 34 + ], + "i": 287, + "o": 21, + "p": [ + 15, + 0 + ], + "u": 3 + }, + { + "i": 157, + "s": { + "u": 2, + "w": 1 + }, + "u": 2, + "v": { + "v": 1 + } + }, + { + "a": [ + 106, + 157 + ], + "i": 303, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 42, + 157 + ], + "i": 305, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 303, + 305 + ], + "i": 165, + "o": 4, + "p": [], + "u": 3 + }, + { + "i": 308, + "s": { + "u": 2, + "w": 9 + }, + "u": 2, + "v": { + "v": 0 + } + }, + { + "a": [ + 38 + ], + "i": 310, + "o": 21, + "p": [ + 7, + 0 + ], + "u": 3 + }, + { + "a": [ + 130, + 308, + 310 + ], + "i": 312, + "o": 19, + "p": [], + "u": 3 + }, + { + "a": [ + 126, + 157 + ], + "i": 169, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 50, + 157 + ], + "i": 173, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 169, + 173 + ], + "i": 175, + "o": 4, + "p": [], + "u": 3 + }, + { + "a": [ + 54, + 54 + ], + "i": 316, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 58, + 191 + ], + "i": 318, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 62, + 191 + ], + "i": 320, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 66, + 207 + ], + "i": 322, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 70, + 207 + ], + "i": 324, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 74, + 207 + ], + "i": 326, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 78, + 207 + ], + "i": 328, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 82, + 207 + ], + "i": 330, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 86, + 207 + ], + "i": 332, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 90, + 191 + ], + "i": 334, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 94, + 94 + ], + "i": 336, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 98, + 98 + ], + "i": 338, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 102, + 102 + ], + "i": 340, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 106, + 106 + ], + "i": 342, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 110, + 191 + ], + "i": 344, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 114, + 114 + ], + "i": 346, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 118, + 118 + ], + "i": 348, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 122, + 122 + ], + "i": 350, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 126, + 126 + ], + "i": 352, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 130, + 130 + ], + "i": 354, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 134, + 134 + ], + "i": 356, + "o": 13, + "p": [], + "u": 3 + }, + { + "i": 390, + "n": "index", + "s": { + "u": 2, + "w": 16 + }, + "u": 1 + }, + { + "i": 396, + "n": "loop_count", + "s": { + "u": 2, + "w": 16 + }, + "u": 1 + }, + { + "i": 412, + "n": "predict_input_done", + "s": { + "u": 2, + "w": 1 + }, + "u": 1 + }, + { + "i": 424, + "n": "train_input_done", + "s": { + "u": 2, + "w": 1 + }, + "u": 1 + }, + { + "i": 428, + "n": "upc", + "s": { + "u": 2, + "w": 4 + }, + "u": 1 + }, + { + "i": 442, + "n": "edges", + "s": { + "a": 16, + "d": 8, + "u": 3 + }, + "u": 1 + }, + { + "i": 580, + "s": { + "u": 2, + "w": 1 + }, + "u": 2, + "v": { + "v": 1 + } + }, + { + "a": [ + 62, + 580 + ], + "i": 582, + "o": 13, + "p": [], + "u": 3 + }, + { + "i": 584, + "s": { + "u": 2, + "w": 1 + }, + "u": 2, + "v": { + "v": 0 + } + }, + { + "a": [ + 58, + 584 + ], + "i": 586, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 582, + 586 + ], + "i": 588, + "o": 4, + "p": [], + "u": 3 + }, + { + "i": 447, + "s": { + "u": 2, + "w": 4 + }, + "u": 2, + "v": { + "v": 0 + } + }, + { + "a": [ + 428, + 447 + ], + "i": 449, + "o": 13, + "p": [], + "u": 3 + }, + { + "i": 499, + "s": { + "u": 2, + "w": 1 + }, + "u": 2, + "v": { + "v": 0 + } + }, + { + "a": [ + 390 + ], + "i": 510, + "o": 22, + "p": [ + 32 + ], + "u": 3 + }, + { + "i": 515, + "s": { + "u": 2, + "w": 32 + }, + "u": 2, + "v": { + "v": 5 + } + }, + { + "a": [ + 74 + ], + "i": 517, + "o": 22, + "p": [ + 32 + ], + "u": 3 + }, + { + "a": [ + 515, + 517 + ], + "i": 519, + "o": 12, + "p": [], + "u": 3 + }, + { + "i": 523, + "s": { + "u": 2, + "w": 1 + }, + "u": 2, + "v": { + "v": 1 + } + }, + { + "i": 546, + "s": { + "u": 2, + "w": 4 + }, + "u": 2, + "v": { + "v": 1 + } + }, + { + "i": 452, + "s": { + "u": 2, + "w": 4 + }, + "u": 2, + "v": { + "v": 1 + } + }, + { + "a": [ + 428, + 452 + ], + "i": 548, + "o": 13, + "p": [], + "u": 3 + }, + { + "i": 456, + "s": { + "u": 2, + "w": 1 + }, + "u": 2, + "v": { + "v": 0 + } + }, + { + "a": [ + 90, + 456 + ], + "i": 550, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 548, + 550 + ], + "i": 460, + "o": 4, + "p": [], + "u": 3 + }, + { + "i": 466, + "s": { + "u": 2, + "w": 1 + }, + "u": 2, + "v": { + "v": 1 + } + }, + { + "a": [ + 90, + 466 + ], + "i": 555, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 548, + 555 + ], + "i": 470, + "o": 4, + "p": [], + "u": 3 + }, + { + "a": [ + 396, + 70 + ], + "i": 531, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 531, + 523, + 499 + ], + "i": 533, + "o": 26, + "p": [], + "u": 3 + }, + { + "a": [ + 396, + 70 + ], + "i": 540, + "o": 16, + "p": [], + "u": 3 + }, + { + "a": [ + 540, + 523, + 499 + ], + "i": 542, + "o": 26, + "p": [], + "u": 3 + }, + { + "i": 558, + "s": { + "u": 2, + "w": 4 + }, + "u": 2, + "v": { + "v": 2 + } + }, + { + "i": 472, + "s": { + "u": 2, + "w": 4 + }, + "u": 2, + "v": { + "v": 2 + } + }, + { + "a": [ + 428, + 472 + ], + "i": 560, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 424, + 466 + ], + "i": 562, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 560, + 562 + ], + "i": 480, + "o": 4, + "p": [], + "u": 3 + }, + { + "a": [ + 412, + 466 + ], + "i": 567, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 560, + 567 + ], + "i": 490, + "o": 4, + "p": [], + "u": 3 + }, + { + "i": 492, + "s": { + "u": 2, + "w": 4 + }, + "u": 2, + "v": { + "v": 3 + } + }, + { + "a": [ + 428, + 492 + ], + "i": 494, + "o": 13, + "p": [], + "u": 3 + }, + { + "i": 572, + "s": { + "u": 2, + "w": 4 + }, + "u": 2, + "v": { + "v": 3 + } + }, + { + "a": [ + 54, + 54 + ], + "i": 589, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 58, + 499 + ], + "i": 591, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 62, + 499 + ], + "i": 593, + "o": 13, + "p": [], + "u": 3 + }, + { + "i": 595, + "s": { + "u": 2, + "w": 16 + }, + "u": 2, + "v": { + "v": 0 + } + }, + { + "a": [ + 66, + 595 + ], + "i": 597, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 70, + 595 + ], + "i": 599, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 74, + 595 + ], + "i": 601, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 78, + 595 + ], + "i": 603, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 82, + 595 + ], + "i": 605, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 86, + 595 + ], + "i": 607, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 90, + 499 + ], + "i": 609, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 98, + 98 + ], + "i": 611, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 102, + 102 + ], + "i": 613, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 106, + 106 + ], + "i": 615, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 110, + 499 + ], + "i": 617, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 118, + 118 + ], + "i": 619, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 122, + 122 + ], + "i": 621, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 126, + 126 + ], + "i": 623, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 130, + 130 + ], + "i": 625, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 134, + 134 + ], + "i": 627, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 390, + 595 + ], + "i": 629, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 396, + 595 + ], + "i": 631, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 412, + 499 + ], + "i": 633, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 424, + 499 + ], + "i": 635, + "o": 13, + "p": [], + "u": 3 + }, + { + "i": 637, + "s": { + "u": 2, + "w": 4 + }, + "u": 2, + "v": { + "v": 0 + } + }, + { + "a": [ + 428, + 637 + ], + "i": 639, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 442, + 442 + ], + "i": 641, + "o": 13, + "p": [], + "u": 3 + }, + { + "i": 671, + "n": "count", + "s": { + "u": 2, + "w": 8 + }, + "u": 1 + }, + { + "i": 679, + "n": "expectation", + "s": { + "u": 2, + "w": 32 + }, + "u": 1 + }, + { + "i": 687, + "n": "jstate", + "s": { + "u": 2, + "w": 16 + }, + "u": 1 + }, + { + "i": 705, + "n": "per_v_pc", + "s": { + "u": 2, + "w": 4 + }, + "u": 1 + }, + { + "i": 709, + "n": "predict_h_cnt", + "s": { + "u": 2, + "w": 16 + }, + "u": 1 + }, + { + "i": 715, + "n": "predict_max", + "s": { + "u": 2, + "w": 16 + }, + "u": 1 + }, + { + "i": 719, + "n": "predict_sum", + "s": { + "u": 2, + "w": 16 + }, + "u": 1 + }, + { + "i": 723, + "n": "predict_upc", + "s": { + "u": 2, + "w": 4 + }, + "u": 1 + }, + { + "i": 727, + "n": "predict_v_cnt", + "s": { + "u": 2, + "w": 16 + }, + "u": 1 + }, + { + "i": 731, + "n": "prediction", + "s": { + "u": 2, + "w": 8 + }, + "u": 1 + }, + { + "i": 743, + "n": "sumOfpow2", + "s": { + "u": 2, + "w": 64 + }, + "u": 1 + }, + { + "i": 763, + "n": "hidden_unit", + "s": { + "a": 7, + "d": 1, + "u": 3 + }, + "u": 1 + }, + { + "i": 767, + "n": "pow2", + "s": { + "a": 3, + "d": 32, + "u": 3 + }, + "u": 1 + }, + { + "i": 773, + "n": "predict_vector", + "s": { + "a": 9, + "d": 1, + "u": 3 + }, + "u": 1 + }, + { + "i": 777, + "n": "visibleEnergies", + "s": { + "a": 3, + "d": 16, + "u": 3 + }, + "u": 1 + }, + { + "i": 2088, + "s": { + "u": 2, + "w": 1 + }, + "u": 2, + "v": { + "v": 1 + } + }, + { + "a": [ + 412, + 2088 + ], + "i": 2090, + "o": 13, + "p": [], + "u": 3 + }, + { + "i": 795, + "s": { + "u": 2, + "w": 4 + }, + "u": 2, + "v": { + "v": 0 + } + }, + { + "a": [ + 723, + 795 + ], + "i": 797, + "o": 13, + "p": [], + "u": 3 + }, + { + "i": 846, + "s": { + "u": 2, + "w": 4 + }, + "u": 2, + "v": { + "v": 3 + } + }, + { + "a": [ + 723, + 846 + ], + "i": 973, + "o": 13, + "p": [], + "u": 3 + }, + { + "i": 866, + "s": { + "u": 2, + "w": 16 + }, + "u": 2, + "v": { + "v": 4 + } + }, + { + "a": [ + 687, + 866 + ], + "i": 975, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 671 + ], + "i": 977, + "o": 21, + "p": [ + 6, + 0 + ], + "u": 3 + }, + { + "a": [ + 134, + 977, + 731 + ], + "i": 979, + "o": 19, + "p": [], + "u": 3 + }, + { + "a": [ + 975, + 979, + 134 + ], + "i": 980, + "o": 26, + "p": [], + "u": 3 + }, + { + "a": [ + 973, + 980, + 134 + ], + "i": 981, + "o": 26, + "p": [], + "u": 3 + }, + { + "i": 1054, + "s": { + "u": 2, + "w": 8 + }, + "u": 2, + "v": { + "v": 0 + } + }, + { + "i": 1165, + "s": { + "u": 2, + "w": 16 + }, + "u": 2, + "v": { + "v": 0 + } + }, + { + "i": 1248, + "s": { + "u": 2, + "w": 4 + }, + "u": 2, + "v": { + "v": 0 + } + }, + { + "a": [ + 727, + 86 + ], + "i": 1326, + "o": 13, + "p": [], + "u": 3 + }, + { + "i": 1328, + "s": { + "u": 2, + "w": 16 + }, + "u": 2, + "v": { + "v": 1 + } + }, + { + "a": [ + 66, + 1328 + ], + "i": 1330, + "o": 11, + "p": [], + "u": 3 + }, + { + "a": [ + 709, + 1330 + ], + "i": 1331, + "o": 13, + "p": [], + "u": 3 + }, + { + "i": 1333, + "s": { + "u": 2, + "w": 16 + }, + "u": 2, + "v": { + "v": 1 + } + }, + { + "a": [ + 709, + 1333 + ], + "i": 1335, + "o": 10, + "p": [], + "u": 3 + }, + { + "a": [ + 1331, + 1165, + 1335 + ], + "i": 1336, + "o": 26, + "p": [], + "u": 3 + }, + { + "a": [ + 1326, + 1336, + 709 + ], + "i": 1337, + "o": 26, + "p": [], + "u": 3 + }, + { + "i": 1516, + "s": { + "u": 2, + "w": 16 + }, + "u": 2, + "v": { + "v": 0 + } + }, + { + "a": [ + 727, + 1516 + ], + "i": 1518, + "o": 13, + "p": [], + "u": 3 + }, + { + "i": 1520, + "s": { + "u": 2, + "w": 16 + }, + "u": 2, + "v": { + "v": 0 + } + }, + { + "a": [ + 1518, + 1520, + 719 + ], + "i": 1522, + "o": 26, + "p": [], + "u": 3 + }, + { + "a": [ + 727 + ], + "i": 1523, + "o": 21, + "p": [ + 8, + 0 + ], + "u": 3 + }, + { + "a": [ + 130, + 1523 + ], + "i": 1525, + "o": 18, + "p": [], + "u": 3 + }, + { + "i": 1527, + "s": { + "u": 2, + "w": 8 + }, + "u": 2, + "v": { + "v": 1 + } + }, + { + "a": [ + 1525, + 1527 + ], + "i": 1529, + "o": 13, + "p": [], + "u": 3 + }, + { + "i": 1405, + "s": { + "u": 2, + "w": 16 + }, + "u": 2, + "v": { + "v": 101 + } + }, + { + "a": [ + 1405, + 727 + ], + "i": 1531, + "o": 12, + "p": [], + "u": 3 + }, + { + "a": [ + 1531, + 709 + ], + "i": 1532, + "o": 10, + "p": [], + "u": 3 + }, + { + "a": [ + 442, + 1532 + ], + "i": 1533, + "o": 18, + "p": [], + "u": 3 + }, + { + "a": [ + 1533 + ], + "i": 1535, + "o": 21, + "p": [ + 7, + 1 + ], + "u": 3 + }, + { + "a": [ + 1535 + ], + "i": 1537, + "o": 23, + "p": [ + 15 + ], + "u": 3 + }, + { + "a": [ + 1405, + 727 + ], + "i": 1539, + "o": 12, + "p": [], + "u": 3 + }, + { + "a": [ + 1539, + 709 + ], + "i": 1540, + "o": 10, + "p": [], + "u": 3 + }, + { + "a": [ + 442, + 1540 + ], + "i": 1541, + "o": 18, + "p": [], + "u": 3 + }, + { + "a": [ + 1541 + ], + "i": 1543, + "o": 21, + "p": [ + 0, + 0 + ], + "u": 3 + }, + { + "a": [ + 1537, + 1543 + ], + "i": 1549, + "o": 20, + "p": [], + "u": 3 + }, + { + "i": 1551, + "s": { + "u": 2, + "w": 16 + }, + "u": 2, + "v": { + "v": 0 + } + }, + { + "a": [ + 1529, + 1549, + 1551 + ], + "i": 1553, + "o": 26, + "p": [], + "u": 3 + }, + { + "a": [ + 1522, + 1553 + ], + "i": 1554, + "o": 10, + "p": [], + "u": 3 + }, + { + "a": [ + 727, + 86 + ], + "i": 1625, + "o": 13, + "p": [], + "u": 3 + }, + { + "i": 1627, + "s": { + "u": 2, + "w": 16 + }, + "u": 2, + "v": { + "v": 1 + } + }, + { + "a": [ + 66, + 1627 + ], + "i": 1629, + "o": 11, + "p": [], + "u": 3 + }, + { + "a": [ + 709, + 1629 + ], + "i": 1630, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 1625, + 1630 + ], + "i": 1632, + "o": 4, + "p": [], + "u": 3 + }, + { + "i": 1633, + "s": { + "u": 2, + "w": 4 + }, + "u": 2, + "v": { + "v": 1 + } + }, + { + "i": 1635, + "s": { + "u": 2, + "w": 4 + }, + "u": 2, + "v": { + "v": 0 + } + }, + { + "a": [ + 1632, + 1633, + 1635 + ], + "i": 1637, + "o": 26, + "p": [], + "u": 3 + }, + { + "a": [ + 727, + 86 + ], + "i": 1694, + "o": 13, + "p": [], + "u": 3 + }, + { + "i": 1696, + "s": { + "u": 2, + "w": 16 + }, + "u": 2, + "v": { + "v": 1 + } + }, + { + "a": [ + 727, + 1696 + ], + "i": 1698, + "o": 10, + "p": [], + "u": 3 + }, + { + "a": [ + 1694, + 1165, + 1698 + ], + "i": 1699, + "o": 26, + "p": [], + "u": 3 + }, + { + "a": [ + 723, + 846 + ], + "i": 1750, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 727, + 687 + ], + "i": 1752, + "o": 10, + "p": [], + "u": 3 + }, + { + "a": [ + 1752 + ], + "i": 1753, + "o": 21, + "p": [ + 8, + 0 + ], + "u": 3 + }, + { + "a": [ + 773, + 1753 + ], + "i": 1755, + "o": 18, + "p": [], + "u": 3 + }, + { + "i": 1757, + "s": { + "u": 2, + "w": 1 + }, + "u": 2, + "v": { + "v": 1 + } + }, + { + "a": [ + 1755, + 1757 + ], + "i": 1759, + "o": 13, + "p": [], + "u": 3 + }, + { + "i": 1761, + "s": { + "u": 2, + "w": 16 + }, + "u": 2, + "v": { + "v": 1 + } + }, + { + "a": [ + 687, + 1761 + ], + "i": 1763, + "o": 10, + "p": [], + "u": 3 + }, + { + "a": [ + 1763 + ], + "i": 1764, + "o": 21, + "p": [ + 7, + 0 + ], + "u": 3 + }, + { + "i": 1766, + "s": { + "u": 2, + "w": 16 + }, + "u": 2, + "v": { + "v": 0 + } + }, + { + "a": [ + 687, + 1766 + ], + "i": 1768, + "o": 13, + "p": [], + "u": 3 + }, + { + "i": 1087, + "s": { + "u": 2, + "w": 8 + }, + "u": 2, + "v": { + "v": 0 + } + }, + { + "a": [ + 1768, + 1087, + 731 + ], + "i": 1770, + "o": 26, + "p": [], + "u": 3 + }, + { + "a": [ + 1759, + 1764, + 1770 + ], + "i": 1771, + "o": 26, + "p": [], + "u": 3 + }, + { + "a": [ + 1750, + 1771, + 731 + ], + "i": 1772, + "o": 26, + "p": [], + "u": 3 + }, + { + "a": [ + 727, + 86 + ], + "i": 1831, + "o": 13, + "p": [], + "u": 3 + }, + { + "i": 1833, + "s": { + "u": 2, + "w": 16 + }, + "u": 2, + "v": { + "v": 1 + } + }, + { + "a": [ + 66, + 1833 + ], + "i": 1835, + "o": 11, + "p": [], + "u": 3 + }, + { + "a": [ + 709, + 1835 + ], + "i": 1836, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 1831, + 1836 + ], + "i": 1838, + "o": 4, + "p": [], + "u": 3 + }, + { + "a": [ + 727, + 86 + ], + "i": 1839, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 709 + ], + "i": 1841, + "o": 21, + "p": [ + 6, + 0 + ], + "u": 3 + }, + { + "i": 1843, + "s": { + "u": 2, + "w": 64 + }, + "u": 2, + "v": { + "v": 0 + } + }, + { + "a": [ + 1843, + 1843 + ], + "i": 1849, + "o": 7, + "p": [], + "u": 3 + }, + { + "a": [ + 1843, + 1849 + ], + "i": 1850, + "o": 5, + "p": [], + "u": 3 + }, + { + "i": 1851, + "s": { + "u": 2, + "w": 64 + }, + "u": 2, + "v": { + "v": 1073741824 + } + }, + { + "i": 1853, + "s": { + "u": 2, + "w": 64 + }, + "u": 2, + "v": { + "v": 32 + } + }, + { + "a": [ + 1851, + 1853 + ], + "i": 1855, + "o": 7, + "p": [], + "u": 3 + }, + { + "a": [ + 1850, + 1855 + ], + "i": 1856, + "o": 5, + "p": [], + "u": 3 + }, + { + "a": [ + 727, + 1516 + ], + "i": 1857, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 1857, + 1516, + 719 + ], + "i": 1859, + "o": 26, + "p": [], + "u": 3 + }, + { + "a": [ + 727 + ], + "i": 1860, + "o": 21, + "p": [ + 8, + 0 + ], + "u": 3 + }, + { + "a": [ + 130, + 1860 + ], + "i": 1862, + "o": 18, + "p": [], + "u": 3 + }, + { + "a": [ + 1862, + 1527 + ], + "i": 1864, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 1405, + 727 + ], + "i": 1866, + "o": 12, + "p": [], + "u": 3 + }, + { + "a": [ + 1866, + 709 + ], + "i": 1867, + "o": 10, + "p": [], + "u": 3 + }, + { + "a": [ + 442, + 1867 + ], + "i": 1868, + "o": 18, + "p": [], + "u": 3 + }, + { + "a": [ + 1868 + ], + "i": 1870, + "o": 21, + "p": [ + 7, + 1 + ], + "u": 3 + }, + { + "a": [ + 1870 + ], + "i": 1872, + "o": 23, + "p": [ + 15 + ], + "u": 3 + }, + { + "a": [ + 1868 + ], + "i": 1878, + "o": 21, + "p": [ + 0, + 0 + ], + "u": 3 + }, + { + "a": [ + 1872, + 1878 + ], + "i": 1884, + "o": 20, + "p": [], + "u": 3 + }, + { + "a": [ + 1864, + 1884, + 1516 + ], + "i": 1886, + "o": 26, + "p": [], + "u": 3 + }, + { + "a": [ + 1859, + 1886 + ], + "i": 1887, + "o": 10, + "p": [], + "u": 3 + }, + { + "a": [ + 1887 + ], + "f": 791, + "i": 1888, + "o": 24, + "p": [], + "u": 3 + }, + { + "a": [ + 1856, + 1888 + ], + "i": 1889, + "o": 16, + "p": [], + "u": 3 + }, + { + "i": 834, + "s": { + "u": 2, + "w": 1 + }, + "u": 2, + "v": { + "v": 1 + } + }, + { + "i": 836, + "s": { + "u": 2, + "w": 1 + }, + "u": 2, + "v": { + "v": 0 + } + }, + { + "a": [ + 1889, + 834, + 836 + ], + "i": 1891, + "o": 26, + "p": [], + "u": 3 + }, + { + "a": [ + 763, + 1841, + 1891 + ], + "i": 1892, + "o": 19, + "p": [], + "u": 3 + }, + { + "a": [ + 1839, + 1892, + 763 + ], + "i": 1893, + "o": 26, + "p": [], + "u": 3 + }, + { + "a": [ + 66 + ], + "i": 1894, + "o": 21, + "p": [ + 6, + 0 + ], + "u": 3 + }, + { + "a": [ + 1893, + 1894, + 834 + ], + "i": 1896, + "o": 19, + "p": [], + "u": 3 + }, + { + "a": [ + 1838, + 1896, + 1893 + ], + "i": 1897, + "o": 26, + "p": [], + "u": 3 + }, + { + "i": 800, + "s": { + "u": 2, + "w": 4 + }, + "u": 2, + "v": { + "v": 1 + } + }, + { + "a": [ + 723, + 800 + ], + "i": 802, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 723, + 800 + ], + "i": 1058, + "o": 13, + "p": [], + "u": 3 + }, + { + "i": 1060, + "s": { + "u": 2, + "w": 4 + }, + "u": 2, + "v": { + "v": 4 + } + }, + { + "a": [ + 705, + 1060 + ], + "i": 1062, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 1058, + 1062 + ], + "i": 1064, + "o": 4, + "p": [], + "u": 3 + }, + { + "i": 1065, + "s": { + "u": 2, + "w": 16 + }, + "u": 2, + "v": { + "v": 5 + } + }, + { + "a": [ + 727, + 1065 + ], + "i": 1067, + "o": 10, + "p": [], + "u": 3 + }, + { + "a": [ + 1067, + 86 + ], + "i": 1068, + "o": 13, + "p": [], + "u": 3 + }, + { + "i": 1073, + "s": { + "u": 2, + "w": 16 + }, + "u": 2, + "v": { + "v": 500 + } + }, + { + "a": [ + 1067, + 1073 + ], + "i": 1075, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 1067, + 1073 + ], + "i": 1077, + "o": 17, + "p": [], + "u": 3 + }, + { + "a": [ + 1075, + 1077 + ], + "i": 1079, + "o": 5, + "p": [], + "u": 3 + }, + { + "a": [ + 1068, + 1079 + ], + "i": 1080, + "o": 5, + "p": [], + "u": 3 + }, + { + "a": [ + 1064, + 1080 + ], + "i": 1081, + "o": 4, + "p": [], + "u": 3 + }, + { + "i": 1082, + "s": { + "u": 2, + "w": 16 + }, + "u": 2, + "v": { + "v": 4 + } + }, + { + "a": [ + 687, + 1082 + ], + "i": 1084, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 1081, + 1084 + ], + "i": 1086, + "o": 4, + "p": [], + "u": 3 + }, + { + "a": [ + 1086, + 1087, + 671 + ], + "i": 1089, + "o": 26, + "p": [], + "u": 3 + }, + { + "a": [ + 723, + 800 + ], + "i": 1108, + "o": 13, + "p": [], + "u": 3 + }, + { + "i": 1110, + "s": { + "u": 2, + "w": 4 + }, + "u": 2, + "v": { + "v": 3 + } + }, + { + "a": [ + 705, + 1110 + ], + "i": 1112, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 1108, + 1112 + ], + "i": 1114, + "o": 4, + "p": [], + "u": 3 + }, + { + "i": 1115, + "s": { + "u": 2, + "w": 16 + }, + "u": 2, + "v": { + "v": 0 + } + }, + { + "a": [ + 687, + 1115 + ], + "i": 1117, + "o": 13, + "p": [], + "u": 3 + }, + { + "i": 1119, + "s": { + "u": 2, + "w": 32 + }, + "u": 2, + "v": { + "v": 0 + } + }, + { + "a": [ + 1117, + 1119, + 679 + ], + "i": 1121, + "o": 26, + "p": [], + "u": 3 + }, + { + "a": [ + 687 + ], + "i": 1122, + "o": 21, + "p": [ + 2, + 0 + ], + "u": 3 + }, + { + "a": [ + 767, + 1122 + ], + "i": 1124, + "o": 18, + "p": [], + "u": 3 + }, + { + "a": [ + 1124, + 743 + ], + "f": 783, + "i": 1126, + "o": 24, + "p": [], + "u": 3 + }, + { + "a": [ + 1126 + ], + "i": 1127, + "o": 22, + "p": [ + 80 + ], + "u": 3 + }, + { + "a": [ + 687 + ], + "i": 1129, + "o": 22, + "p": [ + 80 + ], + "u": 3 + }, + { + "a": [ + 1127, + 1129 + ], + "i": 1131, + "o": 12, + "p": [], + "u": 3 + }, + { + "a": [ + 1131 + ], + "i": 1132, + "o": 21, + "p": [ + 79, + 63 + ], + "u": 3 + }, + { + "a": [ + 1132 + ], + "i": 1134, + "o": 21, + "p": [ + 2, + 0 + ], + "u": 3 + }, + { + "a": [ + 687 + ], + "i": 1136, + "o": 21, + "p": [ + 2, + 0 + ], + "u": 3 + }, + { + "a": [ + 767, + 1136 + ], + "i": 1138, + "o": 18, + "p": [], + "u": 3 + }, + { + "a": [ + 1138, + 743 + ], + "f": 783, + "i": 1140, + "o": 24, + "p": [], + "u": 3 + }, + { + "a": [ + 1140 + ], + "i": 1141, + "o": 22, + "p": [ + 80 + ], + "u": 3 + }, + { + "a": [ + 687 + ], + "i": 1143, + "o": 22, + "p": [ + 80 + ], + "u": 3 + }, + { + "a": [ + 1141, + 1143 + ], + "i": 1145, + "o": 12, + "p": [], + "u": 3 + }, + { + "a": [ + 1145 + ], + "i": 1146, + "o": 21, + "p": [ + 62, + 0 + ], + "u": 3 + }, + { + "a": [ + 1146 + ], + "i": 1148, + "o": 21, + "p": [ + 62, + 34 + ], + "u": 3 + }, + { + "a": [ + 1134, + 1148 + ], + "i": 1154, + "o": 20, + "p": [], + "u": 3 + }, + { + "a": [ + 1121, + 1154 + ], + "i": 1156, + "o": 10, + "p": [], + "u": 3 + }, + { + "a": [ + 1114, + 1156, + 679 + ], + "i": 1157, + "o": 26, + "p": [], + "u": 3 + }, + { + "a": [ + 723, + 800 + ], + "i": 1169, + "o": 13, + "p": [], + "u": 3 + }, + { + "i": 1171, + "s": { + "u": 2, + "w": 4 + }, + "u": 2, + "v": { + "v": 0 + } + }, + { + "a": [ + 705, + 1171 + ], + "i": 1173, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 1169, + 1173 + ], + "i": 1175, + "o": 4, + "p": [], + "u": 3 + }, + { + "a": [ + 709, + 66 + ], + "i": 1176, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 687, + 1082 + ], + "i": 1178, + "o": 13, + "p": [], + "u": 3 + }, + { + "i": 1180, + "s": { + "u": 2, + "w": 16 + }, + "u": 2, + "v": { + "v": 1 + } + }, + { + "a": [ + 687, + 1180 + ], + "i": 1182, + "o": 10, + "p": [], + "u": 3 + }, + { + "a": [ + 1178, + 1165, + 1182 + ], + "i": 1183, + "o": 26, + "p": [], + "u": 3 + }, + { + "a": [ + 1176, + 1183, + 687 + ], + "i": 1184, + "o": 26, + "p": [], + "u": 3 + }, + { + "a": [ + 723, + 800 + ], + "i": 1185, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 705, + 800 + ], + "i": 1189, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 1185, + 1189 + ], + "i": 1191, + "o": 4, + "p": [], + "u": 3 + }, + { + "a": [ + 687, + 1082 + ], + "i": 1192, + "o": 13, + "p": [], + "u": 3 + }, + { + "i": 1194, + "s": { + "u": 2, + "w": 16 + }, + "u": 2, + "v": { + "v": 1 + } + }, + { + "a": [ + 687, + 1194 + ], + "i": 1196, + "o": 10, + "p": [], + "u": 3 + }, + { + "a": [ + 1192, + 1165, + 1196 + ], + "i": 1197, + "o": 26, + "p": [], + "u": 3 + }, + { + "a": [ + 723, + 800 + ], + "i": 1198, + "o": 13, + "p": [], + "u": 3 + }, + { + "i": 1200, + "s": { + "u": 2, + "w": 4 + }, + "u": 2, + "v": { + "v": 2 + } + }, + { + "a": [ + 705, + 1200 + ], + "i": 1202, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 1198, + 1202 + ], + "i": 1204, + "o": 4, + "p": [], + "u": 3 + }, + { + "a": [ + 687, + 1082 + ], + "i": 1205, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 687, + 1194 + ], + "i": 1207, + "o": 10, + "p": [], + "u": 3 + }, + { + "a": [ + 1205, + 1165, + 1207 + ], + "i": 1208, + "o": 26, + "p": [], + "u": 3 + }, + { + "a": [ + 723, + 800 + ], + "i": 1209, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 705, + 1110 + ], + "i": 1211, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 1209, + 1211 + ], + "i": 1213, + "o": 4, + "p": [], + "u": 3 + }, + { + "a": [ + 687, + 1082 + ], + "i": 1214, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 687, + 1194 + ], + "i": 1216, + "o": 10, + "p": [], + "u": 3 + }, + { + "a": [ + 1214, + 1165, + 1216 + ], + "i": 1217, + "o": 26, + "p": [], + "u": 3 + }, + { + "a": [ + 723, + 800 + ], + "i": 1218, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 705, + 1060 + ], + "i": 1220, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 1218, + 1220 + ], + "i": 1222, + "o": 4, + "p": [], + "u": 3 + }, + { + "a": [ + 687, + 1082 + ], + "i": 1223, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 687, + 1194 + ], + "i": 1225, + "o": 10, + "p": [], + "u": 3 + }, + { + "a": [ + 1223, + 1165, + 1225 + ], + "i": 1226, + "o": 26, + "p": [], + "u": 3 + }, + { + "a": [ + 1222, + 1226, + 687 + ], + "i": 1227, + "o": 26, + "p": [], + "u": 3 + }, + { + "a": [ + 1213, + 1217, + 1227 + ], + "i": 1228, + "o": 26, + "p": [], + "u": 3 + }, + { + "a": [ + 1204, + 1208, + 1228 + ], + "i": 1229, + "o": 26, + "p": [], + "u": 3 + }, + { + "a": [ + 1191, + 1197, + 1229 + ], + "i": 1230, + "o": 26, + "p": [], + "u": 3 + }, + { + "a": [ + 1175, + 1184, + 1230 + ], + "i": 1231, + "o": 26, + "p": [], + "u": 3 + }, + { + "a": [ + 723, + 800 + ], + "i": 1252, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 705, + 1171 + ], + "i": 1254, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 1252, + 1254 + ], + "i": 1256, + "o": 4, + "p": [], + "u": 3 + }, + { + "a": [ + 687, + 1082 + ], + "i": 1257, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 709, + 66 + ], + "i": 1259, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 1257, + 1259 + ], + "i": 1261, + "o": 4, + "p": [], + "u": 3 + }, + { + "i": 1262, + "s": { + "u": 2, + "w": 4 + }, + "u": 2, + "v": { + "v": 1 + } + }, + { + "a": [ + 1261, + 1262, + 705 + ], + "i": 1264, + "o": 26, + "p": [], + "u": 3 + }, + { + "a": [ + 723, + 800 + ], + "i": 1265, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 705, + 800 + ], + "i": 1267, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 1265, + 1267 + ], + "i": 1269, + "o": 4, + "p": [], + "u": 3 + }, + { + "a": [ + 687, + 1082 + ], + "i": 1270, + "o": 13, + "p": [], + "u": 3 + }, + { + "i": 1272, + "s": { + "u": 2, + "w": 4 + }, + "u": 2, + "v": { + "v": 2 + } + }, + { + "a": [ + 1270, + 1272, + 705 + ], + "i": 1274, + "o": 26, + "p": [], + "u": 3 + }, + { + "a": [ + 723, + 800 + ], + "i": 1275, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 705, + 1200 + ], + "i": 1277, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 1275, + 1277 + ], + "i": 1279, + "o": 4, + "p": [], + "u": 3 + }, + { + "a": [ + 687, + 1082 + ], + "i": 1280, + "o": 13, + "p": [], + "u": 3 + }, + { + "i": 1282, + "s": { + "u": 2, + "w": 4 + }, + "u": 2, + "v": { + "v": 3 + } + }, + { + "a": [ + 1280, + 1282, + 705 + ], + "i": 1284, + "o": 26, + "p": [], + "u": 3 + }, + { + "a": [ + 723, + 800 + ], + "i": 1285, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 705, + 1110 + ], + "i": 1287, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 1285, + 1287 + ], + "i": 1289, + "o": 4, + "p": [], + "u": 3 + }, + { + "a": [ + 687, + 1082 + ], + "i": 1290, + "o": 13, + "p": [], + "u": 3 + }, + { + "i": 1292, + "s": { + "u": 2, + "w": 4 + }, + "u": 2, + "v": { + "v": 4 + } + }, + { + "a": [ + 1290, + 1292, + 705 + ], + "i": 1294, + "o": 26, + "p": [], + "u": 3 + }, + { + "a": [ + 723, + 800 + ], + "i": 1295, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 705, + 1060 + ], + "i": 1297, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 1295, + 1297 + ], + "i": 1299, + "o": 4, + "p": [], + "u": 3 + }, + { + "a": [ + 687, + 1082 + ], + "i": 1300, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 727, + 1065 + ], + "i": 1302, + "o": 10, + "p": [], + "u": 3 + }, + { + "a": [ + 1302, + 86 + ], + "i": 1303, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 1302, + 1073 + ], + "i": 1306, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 1302, + 1073 + ], + "i": 1308, + "o": 17, + "p": [], + "u": 3 + }, + { + "a": [ + 1306, + 1308 + ], + "i": 1310, + "o": 5, + "p": [], + "u": 3 + }, + { + "a": [ + 1303, + 1310 + ], + "i": 1311, + "o": 5, + "p": [], + "u": 3 + }, + { + "a": [ + 1311, + 1248, + 1248 + ], + "i": 1312, + "o": 26, + "p": [], + "u": 3 + }, + { + "a": [ + 1300, + 1312, + 705 + ], + "i": 1313, + "o": 26, + "p": [], + "u": 3 + }, + { + "a": [ + 1299, + 1313, + 705 + ], + "i": 1314, + "o": 26, + "p": [], + "u": 3 + }, + { + "a": [ + 1289, + 1294, + 1314 + ], + "i": 1315, + "o": 26, + "p": [], + "u": 3 + }, + { + "a": [ + 1279, + 1284, + 1315 + ], + "i": 1316, + "o": 26, + "p": [], + "u": 3 + }, + { + "a": [ + 1269, + 1274, + 1316 + ], + "i": 1317, + "o": 26, + "p": [], + "u": 3 + }, + { + "a": [ + 1256, + 1264, + 1317 + ], + "i": 1318, + "o": 26, + "p": [], + "u": 3 + }, + { + "a": [ + 723, + 800 + ], + "i": 1340, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 705, + 1171 + ], + "i": 1342, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 1340, + 1342 + ], + "i": 1344, + "o": 4, + "p": [], + "u": 3 + }, + { + "a": [ + 709, + 66 + ], + "i": 1345, + "o": 13, + "p": [], + "u": 3 + }, + { + "i": 1347, + "s": { + "u": 2, + "w": 16 + }, + "u": 2, + "v": { + "v": 1 + } + }, + { + "a": [ + 709, + 1347 + ], + "i": 1349, + "o": 10, + "p": [], + "u": 3 + }, + { + "a": [ + 1345, + 1165, + 1349 + ], + "i": 1350, + "o": 26, + "p": [], + "u": 3 + }, + { + "a": [ + 723, + 800 + ], + "i": 1351, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 705, + 800 + ], + "i": 1353, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 1351, + 1353 + ], + "i": 1355, + "o": 4, + "p": [], + "u": 3 + }, + { + "a": [ + 723, + 800 + ], + "i": 1356, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 705, + 1200 + ], + "i": 1358, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 1356, + 1358 + ], + "i": 1360, + "o": 4, + "p": [], + "u": 3 + }, + { + "a": [ + 723, + 800 + ], + "i": 1361, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 705, + 1110 + ], + "i": 1363, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 1361, + 1363 + ], + "i": 1365, + "o": 4, + "p": [], + "u": 3 + }, + { + "a": [ + 723, + 800 + ], + "i": 1366, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 705, + 1060 + ], + "i": 1368, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 1366, + 1368 + ], + "i": 1370, + "o": 4, + "p": [], + "u": 3 + }, + { + "a": [ + 1370, + 709, + 709 + ], + "i": 1371, + "o": 26, + "p": [], + "u": 3 + }, + { + "a": [ + 1365, + 709, + 1371 + ], + "i": 1372, + "o": 26, + "p": [], + "u": 3 + }, + { + "a": [ + 1360, + 709, + 1372 + ], + "i": 1373, + "o": 26, + "p": [], + "u": 3 + }, + { + "a": [ + 1355, + 709, + 1373 + ], + "i": 1374, + "o": 26, + "p": [], + "u": 3 + }, + { + "a": [ + 1344, + 1350, + 1374 + ], + "i": 1375, + "o": 26, + "p": [], + "u": 3 + }, + { + "a": [ + 723, + 800 + ], + "i": 1385, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 705, + 1171 + ], + "i": 1387, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 1385, + 1387 + ], + "i": 1389, + "o": 4, + "p": [], + "u": 3 + }, + { + "a": [ + 709, + 66 + ], + "i": 1390, + "o": 13, + "p": [], + "u": 3 + }, + { + "i": 1392, + "s": { + "u": 2, + "w": 16 + }, + "u": 2, + "v": { + "v": 0 + } + }, + { + "a": [ + 709, + 1392 + ], + "i": 1394, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 1394, + 1392, + 719 + ], + "i": 1396, + "o": 26, + "p": [], + "u": 3 + }, + { + "a": [ + 709 + ], + "i": 1397, + "o": 21, + "p": [ + 6, + 0 + ], + "u": 3 + }, + { + "a": [ + 763, + 1397 + ], + "i": 1399, + "o": 18, + "p": [], + "u": 3 + }, + { + "i": 1401, + "s": { + "u": 2, + "w": 1 + }, + "u": 2, + "v": { + "v": 1 + } + }, + { + "a": [ + 1399, + 1401 + ], + "i": 1403, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 1405, + 727 + ], + "i": 1407, + "o": 12, + "p": [], + "u": 3 + }, + { + "a": [ + 1407, + 709 + ], + "i": 1408, + "o": 10, + "p": [], + "u": 3 + }, + { + "a": [ + 442, + 1408 + ], + "i": 1409, + "o": 18, + "p": [], + "u": 3 + }, + { + "a": [ + 1409 + ], + "i": 1411, + "o": 21, + "p": [ + 7, + 1 + ], + "u": 3 + }, + { + "a": [ + 1411 + ], + "i": 1413, + "o": 23, + "p": [ + 15 + ], + "u": 3 + }, + { + "a": [ + 1409 + ], + "i": 1419, + "o": 21, + "p": [ + 0, + 0 + ], + "u": 3 + }, + { + "a": [ + 1413, + 1419 + ], + "i": 1425, + "o": 20, + "p": [], + "u": 3 + }, + { + "a": [ + 1403, + 1425, + 1392 + ], + "i": 1427, + "o": 26, + "p": [], + "u": 3 + }, + { + "a": [ + 1396, + 1427 + ], + "i": 1428, + "o": 10, + "p": [], + "u": 3 + }, + { + "a": [ + 687, + 1392 + ], + "i": 1431, + "o": 13, + "p": [], + "u": 3 + }, + { + "i": 1433, + "s": { + "u": 2, + "w": 16 + }, + "u": 2, + "v": { + "v": 1000 + } + }, + { + "a": [ + 1433 + ], + "i": 1435, + "o": 1, + "p": [], + "u": 3 + }, + { + "a": [ + 1431, + 1435, + 715 + ], + "i": 1436, + "o": 26, + "p": [], + "u": 3 + }, + { + "a": [ + 1428, + 1436 + ], + "i": 1437, + "o": 15, + "p": [], + "u": 3 + }, + { + "a": [ + 709, + 1392 + ], + "i": 1439, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 1439, + 1165, + 719 + ], + "i": 1441, + "o": 26, + "p": [], + "u": 3 + }, + { + "a": [ + 709 + ], + "i": 1442, + "o": 21, + "p": [ + 6, + 0 + ], + "u": 3 + }, + { + "a": [ + 763, + 1442 + ], + "i": 1444, + "o": 18, + "p": [], + "u": 3 + }, + { + "a": [ + 1444, + 1401 + ], + "i": 1446, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 1405, + 727 + ], + "i": 1448, + "o": 12, + "p": [], + "u": 3 + }, + { + "a": [ + 1448, + 709 + ], + "i": 1449, + "o": 10, + "p": [], + "u": 3 + }, + { + "a": [ + 442, + 1449 + ], + "i": 1450, + "o": 18, + "p": [], + "u": 3 + }, + { + "a": [ + 1450 + ], + "i": 1452, + "o": 21, + "p": [ + 7, + 1 + ], + "u": 3 + }, + { + "a": [ + 1452 + ], + "i": 1454, + "o": 23, + "p": [ + 15 + ], + "u": 3 + }, + { + "a": [ + 1405, + 727 + ], + "i": 1456, + "o": 12, + "p": [], + "u": 3 + }, + { + "a": [ + 1456, + 709 + ], + "i": 1457, + "o": 10, + "p": [], + "u": 3 + }, + { + "a": [ + 442, + 1457 + ], + "i": 1458, + "o": 18, + "p": [], + "u": 3 + }, + { + "a": [ + 1458 + ], + "i": 1460, + "o": 21, + "p": [ + 0, + 0 + ], + "u": 3 + }, + { + "a": [ + 1454, + 1460 + ], + "i": 1466, + "o": 20, + "p": [], + "u": 3 + }, + { + "a": [ + 1446, + 1466, + 1165 + ], + "i": 1468, + "o": 26, + "p": [], + "u": 3 + }, + { + "a": [ + 1441, + 1468 + ], + "i": 1469, + "o": 10, + "p": [], + "u": 3 + }, + { + "i": 1429, + "s": { + "u": 2, + "w": 16 + }, + "u": 2, + "v": { + "v": 0 + } + }, + { + "a": [ + 687, + 1429 + ], + "i": 1470, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 1433 + ], + "i": 1472, + "o": 1, + "p": [], + "u": 3 + }, + { + "a": [ + 1470, + 1472, + 715 + ], + "i": 1473, + "o": 26, + "p": [], + "u": 3 + }, + { + "a": [ + 1437, + 1469, + 1473 + ], + "i": 1474, + "o": 26, + "p": [], + "u": 3 + }, + { + "a": [ + 1390, + 1474, + 715 + ], + "i": 1475, + "o": 26, + "p": [], + "u": 3 + }, + { + "a": [ + 723, + 800 + ], + "i": 1476, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 705, + 800 + ], + "i": 1478, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 1476, + 1478 + ], + "i": 1480, + "o": 4, + "p": [], + "u": 3 + }, + { + "i": 1481, + "s": { + "u": 2, + "w": 16 + }, + "u": 2, + "v": { + "v": 0 + } + }, + { + "a": [ + 687, + 1481 + ], + "i": 1483, + "o": 13, + "p": [], + "u": 3 + }, + { + "i": 1485, + "s": { + "u": 2, + "w": 16 + }, + "u": 2, + "v": { + "v": 62 + } + }, + { + "a": [ + 715, + 1485 + ], + "i": 1487, + "o": 11, + "p": [], + "u": 3 + }, + { + "a": [ + 1483, + 1487, + 715 + ], + "i": 1488, + "o": 26, + "p": [], + "u": 3 + }, + { + "a": [ + 723, + 800 + ], + "i": 1489, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 705, + 1200 + ], + "i": 1491, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 1489, + 1491 + ], + "i": 1493, + "o": 4, + "p": [], + "u": 3 + }, + { + "a": [ + 723, + 800 + ], + "i": 1494, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 705, + 1110 + ], + "i": 1496, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 1494, + 1496 + ], + "i": 1498, + "o": 4, + "p": [], + "u": 3 + }, + { + "a": [ + 723, + 800 + ], + "i": 1499, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 705, + 1060 + ], + "i": 1501, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 1499, + 1501 + ], + "i": 1503, + "o": 4, + "p": [], + "u": 3 + }, + { + "a": [ + 1503, + 715, + 715 + ], + "i": 1504, + "o": 26, + "p": [], + "u": 3 + }, + { + "a": [ + 1498, + 715, + 1504 + ], + "i": 1505, + "o": 26, + "p": [], + "u": 3 + }, + { + "a": [ + 1493, + 715, + 1505 + ], + "i": 1506, + "o": 26, + "p": [], + "u": 3 + }, + { + "a": [ + 1480, + 1488, + 1506 + ], + "i": 1507, + "o": 26, + "p": [], + "u": 3 + }, + { + "a": [ + 1389, + 1475, + 1507 + ], + "i": 1508, + "o": 26, + "p": [], + "u": 3 + }, + { + "a": [ + 723, + 800 + ], + "i": 1557, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 705, + 1171 + ], + "i": 1559, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 1557, + 1559 + ], + "i": 1561, + "o": 4, + "p": [], + "u": 3 + }, + { + "a": [ + 709, + 1392 + ], + "i": 1562, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 1562, + 1165, + 719 + ], + "i": 1564, + "o": 26, + "p": [], + "u": 3 + }, + { + "a": [ + 709 + ], + "i": 1565, + "o": 21, + "p": [ + 6, + 0 + ], + "u": 3 + }, + { + "a": [ + 763, + 1565 + ], + "i": 1567, + "o": 18, + "p": [], + "u": 3 + }, + { + "a": [ + 1567, + 1401 + ], + "i": 1569, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 1405, + 727 + ], + "i": 1571, + "o": 12, + "p": [], + "u": 3 + }, + { + "a": [ + 1571, + 709 + ], + "i": 1572, + "o": 10, + "p": [], + "u": 3 + }, + { + "a": [ + 442, + 1572 + ], + "i": 1573, + "o": 18, + "p": [], + "u": 3 + }, + { + "a": [ + 1573 + ], + "i": 1575, + "o": 21, + "p": [ + 7, + 1 + ], + "u": 3 + }, + { + "a": [ + 1575 + ], + "i": 1577, + "o": 23, + "p": [ + 15 + ], + "u": 3 + }, + { + "a": [ + 1405, + 727 + ], + "i": 1579, + "o": 12, + "p": [], + "u": 3 + }, + { + "a": [ + 1579, + 709 + ], + "i": 1580, + "o": 10, + "p": [], + "u": 3 + }, + { + "a": [ + 442, + 1580 + ], + "i": 1581, + "o": 18, + "p": [], + "u": 3 + }, + { + "a": [ + 1581 + ], + "i": 1583, + "o": 21, + "p": [ + 0, + 0 + ], + "u": 3 + }, + { + "a": [ + 1577, + 1583 + ], + "i": 1589, + "o": 20, + "p": [], + "u": 3 + }, + { + "a": [ + 1569, + 1589, + 1165 + ], + "i": 1591, + "o": 26, + "p": [], + "u": 3 + }, + { + "a": [ + 1564, + 1591 + ], + "i": 1592, + "o": 10, + "p": [], + "u": 3 + }, + { + "a": [ + 723, + 800 + ], + "i": 1593, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 705, + 800 + ], + "i": 1595, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 1593, + 1595 + ], + "i": 1597, + "o": 4, + "p": [], + "u": 3 + }, + { + "a": [ + 723, + 800 + ], + "i": 1598, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 705, + 1200 + ], + "i": 1600, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 1598, + 1600 + ], + "i": 1602, + "o": 4, + "p": [], + "u": 3 + }, + { + "a": [ + 723, + 800 + ], + "i": 1603, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 705, + 1110 + ], + "i": 1605, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 1603, + 1605 + ], + "i": 1607, + "o": 4, + "p": [], + "u": 3 + }, + { + "a": [ + 723, + 800 + ], + "i": 1608, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 705, + 1060 + ], + "i": 1610, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 1608, + 1610 + ], + "i": 1612, + "o": 4, + "p": [], + "u": 3 + }, + { + "a": [ + 1612, + 719, + 719 + ], + "i": 1613, + "o": 26, + "p": [], + "u": 3 + }, + { + "a": [ + 1607, + 719, + 1613 + ], + "i": 1614, + "o": 26, + "p": [], + "u": 3 + }, + { + "a": [ + 1602, + 719, + 1614 + ], + "i": 1615, + "o": 26, + "p": [], + "u": 3 + }, + { + "a": [ + 1597, + 719, + 1615 + ], + "i": 1616, + "o": 26, + "p": [], + "u": 3 + }, + { + "a": [ + 1561, + 1592, + 1616 + ], + "i": 1617, + "o": 26, + "p": [], + "u": 3 + }, + { + "a": [ + 723, + 800 + ], + "i": 1640, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 705, + 1060 + ], + "i": 1642, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 1640, + 1642 + ], + "i": 1644, + "o": 4, + "p": [], + "u": 3 + }, + { + "a": [ + 687, + 1082 + ], + "i": 1645, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 1644, + 1645 + ], + "i": 1647, + "o": 4, + "p": [], + "u": 3 + }, + { + "a": [ + 727, + 1065 + ], + "i": 1648, + "o": 10, + "p": [], + "u": 3 + }, + { + "a": [ + 1648, + 86 + ], + "i": 1649, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 1648, + 1073 + ], + "i": 1652, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 1648, + 1073 + ], + "i": 1654, + "o": 17, + "p": [], + "u": 3 + }, + { + "a": [ + 1652, + 1654 + ], + "i": 1656, + "o": 5, + "p": [], + "u": 3 + }, + { + "a": [ + 1649, + 1656 + ], + "i": 1657, + "o": 5, + "p": [], + "u": 3 + }, + { + "a": [ + 1647, + 1657 + ], + "i": 1658, + "o": 4, + "p": [], + "u": 3 + }, + { + "i": 1659, + "s": { + "u": 2, + "w": 4 + }, + "u": 2, + "v": { + "v": 3 + } + }, + { + "a": [ + 1658, + 1659, + 1633 + ], + "i": 1661, + "o": 26, + "p": [], + "u": 3 + }, + { + "a": [ + 723, + 800 + ], + "i": 1702, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 705, + 1060 + ], + "i": 1704, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 1702, + 1704 + ], + "i": 1706, + "o": 4, + "p": [], + "u": 3 + }, + { + "a": [ + 687, + 1082 + ], + "i": 1707, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 1706, + 1707 + ], + "i": 1709, + "o": 4, + "p": [], + "u": 3 + }, + { + "a": [ + 727, + 1065 + ], + "i": 1710, + "o": 10, + "p": [], + "u": 3 + }, + { + "a": [ + 1710, + 86 + ], + "i": 1711, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 1710, + 1073 + ], + "i": 1714, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 1710, + 1073 + ], + "i": 1716, + "o": 17, + "p": [], + "u": 3 + }, + { + "a": [ + 1714, + 1716 + ], + "i": 1718, + "o": 5, + "p": [], + "u": 3 + }, + { + "a": [ + 1711, + 1718 + ], + "i": 1719, + "o": 5, + "p": [], + "u": 3 + }, + { + "i": 1720, + "s": { + "u": 2, + "w": 16 + }, + "u": 2, + "v": { + "v": 5 + } + }, + { + "a": [ + 727, + 1720 + ], + "i": 1722, + "o": 10, + "p": [], + "u": 3 + }, + { + "a": [ + 1719, + 1165, + 1722 + ], + "i": 1723, + "o": 26, + "p": [], + "u": 3 + }, + { + "a": [ + 1709, + 1723, + 727 + ], + "i": 1724, + "o": 26, + "p": [], + "u": 3 + }, + { + "a": [ + 723, + 800 + ], + "i": 1777, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 705, + 1171 + ], + "i": 1779, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 1777, + 1779 + ], + "i": 1781, + "o": 4, + "p": [], + "u": 3 + }, + { + "a": [ + 723, + 800 + ], + "i": 1782, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 705, + 800 + ], + "i": 1784, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 1782, + 1784 + ], + "i": 1786, + "o": 4, + "p": [], + "u": 3 + }, + { + "a": [ + 723, + 800 + ], + "i": 1787, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 705, + 1200 + ], + "i": 1789, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 1787, + 1789 + ], + "i": 1791, + "o": 4, + "p": [], + "u": 3 + }, + { + "i": 1792, + "s": { + "u": 2, + "w": 16 + }, + "u": 2, + "v": { + "v": 0 + } + }, + { + "a": [ + 687, + 1792 + ], + "i": 1794, + "o": 13, + "p": [], + "u": 3 + }, + { + "i": 1796, + "s": { + "u": 2, + "w": 64 + }, + "u": 2, + "v": { + "v": 0 + } + }, + { + "a": [ + 1794, + 1796, + 743 + ], + "i": 1798, + "o": 26, + "p": [], + "u": 3 + }, + { + "a": [ + 687 + ], + "i": 1799, + "o": 21, + "p": [ + 2, + 0 + ], + "u": 3 + }, + { + "a": [ + 777, + 1799 + ], + "i": 1801, + "o": 18, + "p": [], + "u": 3 + }, + { + "a": [ + 1801 + ], + "f": 794, + "i": 1803, + "o": 24, + "p": [], + "u": 3 + }, + { + "a": [ + 1803 + ], + "i": 1804, + "o": 21, + "p": [ + 31, + 0 + ], + "u": 3 + }, + { + "a": [ + 1804 + ], + "i": 1806, + "o": 22, + "p": [ + 64 + ], + "u": 3 + }, + { + "a": [ + 1798, + 1806 + ], + "i": 1808, + "o": 10, + "p": [], + "u": 3 + }, + { + "a": [ + 723, + 800 + ], + "i": 1809, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 705, + 1110 + ], + "i": 1811, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 1809, + 1811 + ], + "i": 1813, + "o": 4, + "p": [], + "u": 3 + }, + { + "a": [ + 723, + 800 + ], + "i": 1814, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 705, + 1060 + ], + "i": 1816, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 1814, + 1816 + ], + "i": 1818, + "o": 4, + "p": [], + "u": 3 + }, + { + "a": [ + 1818, + 743, + 743 + ], + "i": 1819, + "o": 26, + "p": [], + "u": 3 + }, + { + "a": [ + 1813, + 743, + 1819 + ], + "i": 1820, + "o": 26, + "p": [], + "u": 3 + }, + { + "a": [ + 1791, + 1808, + 1820 + ], + "i": 1821, + "o": 26, + "p": [], + "u": 3 + }, + { + "a": [ + 1786, + 743, + 1821 + ], + "i": 1822, + "o": 26, + "p": [], + "u": 3 + }, + { + "a": [ + 1781, + 743, + 1822 + ], + "i": 1823, + "o": 26, + "p": [], + "u": 3 + }, + { + "a": [ + 723, + 800 + ], + "i": 1909, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 705, + 1171 + ], + "i": 1911, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 1909, + 1911 + ], + "i": 1913, + "o": 4, + "p": [], + "u": 3 + }, + { + "a": [ + 723, + 800 + ], + "i": 1914, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 705, + 800 + ], + "i": 1916, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 1914, + 1916 + ], + "i": 1918, + "o": 4, + "p": [], + "u": 3 + }, + { + "a": [ + 723, + 800 + ], + "i": 1919, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 705, + 1200 + ], + "i": 1921, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 1919, + 1921 + ], + "i": 1923, + "o": 4, + "p": [], + "u": 3 + }, + { + "a": [ + 687 + ], + "i": 1924, + "o": 21, + "p": [ + 2, + 0 + ], + "u": 3 + }, + { + "a": [ + 687 + ], + "i": 1926, + "o": 21, + "p": [ + 2, + 0 + ], + "u": 3 + }, + { + "a": [ + 777, + 1926 + ], + "i": 1928, + "o": 18, + "p": [], + "u": 3 + }, + { + "a": [ + 1928 + ], + "f": 794, + "i": 1930, + "o": 24, + "p": [], + "u": 3 + }, + { + "a": [ + 767, + 1924, + 1930 + ], + "i": 1931, + "o": 19, + "p": [], + "u": 3 + }, + { + "a": [ + 723, + 800 + ], + "i": 1932, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 705, + 1110 + ], + "i": 1934, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 1932, + 1934 + ], + "i": 1936, + "o": 4, + "p": [], + "u": 3 + }, + { + "a": [ + 723, + 800 + ], + "i": 1937, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 705, + 1060 + ], + "i": 1939, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 1937, + 1939 + ], + "i": 1941, + "o": 4, + "p": [], + "u": 3 + }, + { + "a": [ + 1941, + 767, + 767 + ], + "i": 1942, + "o": 26, + "p": [], + "u": 3 + }, + { + "a": [ + 1936, + 767, + 1942 + ], + "i": 1943, + "o": 26, + "p": [], + "u": 3 + }, + { + "a": [ + 1923, + 1931, + 1943 + ], + "i": 1944, + "o": 26, + "p": [], + "u": 3 + }, + { + "a": [ + 1918, + 767, + 1944 + ], + "i": 1945, + "o": 26, + "p": [], + "u": 3 + }, + { + "a": [ + 1913, + 767, + 1945 + ], + "i": 1946, + "o": 26, + "p": [], + "u": 3 + }, + { + "a": [ + 723, + 800 + ], + "i": 1956, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 705, + 1060 + ], + "i": 1958, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 1956, + 1958 + ], + "i": 1960, + "o": 4, + "p": [], + "u": 3 + }, + { + "a": [ + 723, + 800 + ], + "i": 1961, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 705, + 1060 + ], + "i": 1963, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 1961, + 1963 + ], + "i": 1965, + "o": 4, + "p": [], + "u": 3 + }, + { + "a": [ + 727, + 1065 + ], + "i": 1966, + "o": 10, + "p": [], + "u": 3 + }, + { + "a": [ + 1966, + 86 + ], + "i": 1967, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 1966, + 1073 + ], + "i": 1970, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 1966, + 1073 + ], + "i": 1972, + "o": 17, + "p": [], + "u": 3 + }, + { + "a": [ + 1970, + 1972 + ], + "i": 1974, + "o": 5, + "p": [], + "u": 3 + }, + { + "a": [ + 1967, + 1974 + ], + "i": 1975, + "o": 5, + "p": [], + "u": 3 + }, + { + "a": [ + 1965, + 1975 + ], + "i": 1976, + "o": 4, + "p": [], + "u": 3 + }, + { + "a": [ + 687, + 1082 + ], + "i": 1977, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 1976, + 1977 + ], + "i": 1979, + "o": 4, + "p": [], + "u": 3 + }, + { + "a": [ + 727, + 687 + ], + "i": 1980, + "o": 10, + "p": [], + "u": 3 + }, + { + "a": [ + 1980 + ], + "i": 1981, + "o": 21, + "p": [ + 8, + 0 + ], + "u": 3 + }, + { + "a": [ + 679 + ], + "f": 788, + "i": 1983, + "o": 24, + "p": [], + "u": 3 + }, + { + "a": [ + 1983 + ], + "i": 1984, + "o": 22, + "p": [ + 16 + ], + "u": 3 + }, + { + "a": [ + 687, + 1984 + ], + "i": 1986, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 1986, + 834, + 836 + ], + "i": 1988, + "o": 26, + "p": [], + "u": 3 + }, + { + "a": [ + 773, + 1981, + 1988 + ], + "i": 1989, + "o": 19, + "p": [], + "u": 3 + }, + { + "a": [ + 86 + ], + "i": 1990, + "o": 21, + "p": [ + 8, + 0 + ], + "u": 3 + }, + { + "a": [ + 1989, + 1990, + 834 + ], + "i": 1992, + "o": 19, + "p": [], + "u": 3 + }, + { + "a": [ + 1979, + 1992, + 1989 + ], + "i": 1993, + "o": 26, + "p": [], + "u": 3 + }, + { + "a": [ + 1960, + 1993, + 773 + ], + "i": 1994, + "o": 26, + "p": [], + "u": 3 + }, + { + "a": [ + 723, + 800 + ], + "i": 2004, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 705, + 1171 + ], + "i": 2006, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 2004, + 2006 + ], + "i": 2008, + "o": 4, + "p": [], + "u": 3 + }, + { + "a": [ + 709, + 66 + ], + "i": 2009, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 687 + ], + "i": 2011, + "o": 21, + "p": [ + 2, + 0 + ], + "u": 3 + }, + { + "a": [ + 709, + 1392 + ], + "i": 2013, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 2013, + 1165, + 719 + ], + "i": 2015, + "o": 26, + "p": [], + "u": 3 + }, + { + "a": [ + 709 + ], + "i": 2016, + "o": 21, + "p": [ + 6, + 0 + ], + "u": 3 + }, + { + "a": [ + 763, + 2016 + ], + "i": 2018, + "o": 18, + "p": [], + "u": 3 + }, + { + "a": [ + 2018, + 1401 + ], + "i": 2020, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 1405, + 727 + ], + "i": 2022, + "o": 12, + "p": [], + "u": 3 + }, + { + "a": [ + 2022, + 709 + ], + "i": 2023, + "o": 10, + "p": [], + "u": 3 + }, + { + "a": [ + 442, + 2023 + ], + "i": 2024, + "o": 18, + "p": [], + "u": 3 + }, + { + "a": [ + 2024 + ], + "i": 2026, + "o": 21, + "p": [ + 7, + 1 + ], + "u": 3 + }, + { + "a": [ + 2026 + ], + "i": 2028, + "o": 23, + "p": [ + 15 + ], + "u": 3 + }, + { + "a": [ + 1405, + 727 + ], + "i": 2030, + "o": 12, + "p": [], + "u": 3 + }, + { + "a": [ + 2030, + 709 + ], + "i": 2031, + "o": 10, + "p": [], + "u": 3 + }, + { + "a": [ + 442, + 2031 + ], + "i": 2032, + "o": 18, + "p": [], + "u": 3 + }, + { + "a": [ + 2032 + ], + "i": 2034, + "o": 21, + "p": [ + 0, + 0 + ], + "u": 3 + }, + { + "a": [ + 2028, + 2034 + ], + "i": 2040, + "o": 20, + "p": [], + "u": 3 + }, + { + "a": [ + 2020, + 2040, + 1165 + ], + "i": 2042, + "o": 26, + "p": [], + "u": 3 + }, + { + "a": [ + 2015, + 2042 + ], + "i": 2043, + "o": 10, + "p": [], + "u": 3 + }, + { + "a": [ + 777, + 2011, + 2043 + ], + "i": 2044, + "o": 19, + "p": [], + "u": 3 + }, + { + "a": [ + 2009, + 2044, + 777 + ], + "i": 2045, + "o": 26, + "p": [], + "u": 3 + }, + { + "a": [ + 723, + 800 + ], + "i": 2046, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 705, + 800 + ], + "i": 2048, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 2046, + 2048 + ], + "i": 2050, + "o": 4, + "p": [], + "u": 3 + }, + { + "a": [ + 687 + ], + "i": 2051, + "o": 21, + "p": [ + 2, + 0 + ], + "u": 3 + }, + { + "a": [ + 687 + ], + "i": 2053, + "o": 21, + "p": [ + 2, + 0 + ], + "u": 3 + }, + { + "a": [ + 777, + 2053 + ], + "i": 2055, + "o": 18, + "p": [], + "u": 3 + }, + { + "a": [ + 687, + 1481 + ], + "i": 2057, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 715, + 1485 + ], + "i": 2059, + "o": 11, + "p": [], + "u": 3 + }, + { + "a": [ + 2057, + 2059, + 715 + ], + "i": 2060, + "o": 26, + "p": [], + "u": 3 + }, + { + "a": [ + 2055, + 2060 + ], + "i": 2061, + "o": 11, + "p": [], + "u": 3 + }, + { + "a": [ + 777, + 2051, + 2061 + ], + "i": 2062, + "o": 19, + "p": [], + "u": 3 + }, + { + "a": [ + 723, + 800 + ], + "i": 2063, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 705, + 1200 + ], + "i": 2065, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 2063, + 2065 + ], + "i": 2067, + "o": 4, + "p": [], + "u": 3 + }, + { + "a": [ + 723, + 800 + ], + "i": 2068, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 705, + 1110 + ], + "i": 2070, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 2068, + 2070 + ], + "i": 2072, + "o": 4, + "p": [], + "u": 3 + }, + { + "a": [ + 723, + 800 + ], + "i": 2073, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 705, + 1060 + ], + "i": 2075, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 2073, + 2075 + ], + "i": 2077, + "o": 4, + "p": [], + "u": 3 + }, + { + "a": [ + 2077, + 777, + 777 + ], + "i": 2078, + "o": 26, + "p": [], + "u": 3 + }, + { + "a": [ + 2072, + 777, + 2078 + ], + "i": 2079, + "o": 26, + "p": [], + "u": 3 + }, + { + "a": [ + 2067, + 777, + 2079 + ], + "i": 2080, + "o": 26, + "p": [], + "u": 3 + }, + { + "a": [ + 2050, + 2062, + 2080 + ], + "i": 2081, + "o": 26, + "p": [], + "u": 3 + }, + { + "a": [ + 2008, + 2045, + 2081 + ], + "i": 2082, + "o": 26, + "p": [], + "u": 3 + }, + { + "i": 805, + "s": { + "u": 2, + "w": 4 + }, + "u": 2, + "v": { + "v": 2 + } + }, + { + "a": [ + 723, + 805 + ], + "i": 807, + "o": 13, + "p": [], + "u": 3 + }, + { + "i": 816, + "s": { + "u": 2, + "w": 1 + }, + "u": 2, + "v": { + "v": 0 + } + }, + { + "a": [ + 126, + 816 + ], + "i": 818, + "o": 13, + "p": [], + "u": 3 + }, + { + "i": 820, + "s": { + "u": 2, + "w": 1 + }, + "u": 2, + "v": { + "v": 1 + } + }, + { + "a": [ + 110, + 820 + ], + "i": 822, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 818, + 822 + ], + "i": 824, + "o": 4, + "p": [], + "u": 3 + }, + { + "i": 825, + "s": { + "u": 2, + "w": 16 + }, + "u": 2, + "v": { + "v": 1 + } + }, + { + "a": [ + 78, + 825 + ], + "i": 827, + "o": 11, + "p": [], + "u": 3 + }, + { + "a": [ + 390, + 827 + ], + "i": 828, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 824, + 828 + ], + "i": 830, + "o": 4, + "p": [], + "u": 3 + }, + { + "a": [ + 396, + 70 + ], + "i": 831, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 830, + 831 + ], + "i": 833, + "o": 4, + "p": [], + "u": 3 + }, + { + "a": [ + 833, + 834, + 836 + ], + "i": 838, + "o": 26, + "p": [], + "u": 3 + }, + { + "a": [ + 126, + 816 + ], + "i": 874, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 110, + 820 + ], + "i": 876, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 874, + 876 + ], + "i": 878, + "o": 4, + "p": [], + "u": 3 + }, + { + "a": [ + 878, + 836, + 110 + ], + "i": 879, + "o": 26, + "p": [], + "u": 3 + }, + { + "a": [ + 126, + 816 + ], + "i": 988, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 110, + 820 + ], + "i": 990, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 988, + 990 + ], + "i": 992, + "o": 4, + "p": [], + "u": 3 + }, + { + "i": 993, + "s": { + "u": 2, + "w": 16 + }, + "u": 2, + "v": { + "v": 1 + } + }, + { + "a": [ + 78, + 993 + ], + "i": 995, + "o": 11, + "p": [], + "u": 3 + }, + { + "a": [ + 390, + 995 + ], + "i": 996, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 396, + 70 + ], + "i": 998, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 996, + 998 + ], + "i": 1000, + "o": 4, + "p": [], + "u": 3 + }, + { + "i": 1001, + "s": { + "u": 2, + "w": 16 + }, + "u": 2, + "v": { + "v": 1 + } + }, + { + "a": [ + 390, + 1001 + ], + "i": 1003, + "o": 10, + "p": [], + "u": 3 + }, + { + "a": [ + 1000, + 390, + 1003 + ], + "i": 1004, + "o": 26, + "p": [], + "u": 3 + }, + { + "a": [ + 992, + 1004, + 390 + ], + "i": 1005, + "o": 26, + "p": [], + "u": 3 + }, + { + "a": [ + 126, + 816 + ], + "i": 1015, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 110, + 820 + ], + "i": 1017, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 1015, + 1017 + ], + "i": 1019, + "o": 4, + "p": [], + "u": 3 + }, + { + "a": [ + 1019, + 836, + 412 + ], + "i": 1020, + "o": 26, + "p": [], + "u": 3 + }, + { + "a": [ + 126, + 816 + ], + "i": 1030, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 110, + 820 + ], + "i": 1032, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 1030, + 1032 + ], + "i": 1034, + "o": 4, + "p": [], + "u": 3 + }, + { + "i": 1035, + "s": { + "u": 2, + "w": 16 + }, + "u": 2, + "v": { + "v": 1 + } + }, + { + "a": [ + 78, + 1035 + ], + "i": 1037, + "o": 11, + "p": [], + "u": 3 + }, + { + "a": [ + 390, + 1037 + ], + "i": 1038, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 396, + 70 + ], + "i": 1040, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 1038, + 1040 + ], + "i": 1042, + "o": 4, + "p": [], + "u": 3 + }, + { + "i": 1043, + "s": { + "u": 2, + "w": 4 + }, + "u": 2, + "v": { + "v": 3 + } + }, + { + "i": 1045, + "s": { + "u": 2, + "w": 4 + }, + "u": 2, + "v": { + "v": 0 + } + }, + { + "a": [ + 1042, + 1043, + 1045 + ], + "i": 1047, + "o": 26, + "p": [], + "u": 3 + }, + { + "a": [ + 1034, + 1047, + 428 + ], + "i": 1048, + "o": 26, + "p": [], + "u": 3 + }, + { + "a": [ + 126, + 816 + ], + "i": 1682, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 110, + 820 + ], + "i": 1684, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 1682, + 1684 + ], + "i": 1686, + "o": 4, + "p": [], + "u": 3 + }, + { + "i": 1677, + "s": { + "u": 2, + "w": 4 + }, + "u": 2, + "v": { + "v": 2 + } + }, + { + "a": [ + 1686, + 1677, + 1677 + ], + "i": 1687, + "o": 26, + "p": [], + "u": 3 + }, + { + "a": [ + 54, + 54 + ], + "i": 2092, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 58, + 836 + ], + "i": 2094, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 62, + 836 + ], + "i": 2096, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 66, + 1165 + ], + "i": 2098, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 70, + 1165 + ], + "i": 2100, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 74, + 1165 + ], + "i": 2102, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 78, + 1165 + ], + "i": 2104, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 82, + 1165 + ], + "i": 2106, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 86, + 1165 + ], + "i": 2108, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 90, + 836 + ], + "i": 2110, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 98, + 98 + ], + "i": 2112, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 102, + 102 + ], + "i": 2114, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 106, + 106 + ], + "i": 2116, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 110, + 836 + ], + "i": 2118, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 118, + 118 + ], + "i": 2120, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 122, + 122 + ], + "i": 2122, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 126, + 126 + ], + "i": 2124, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 130, + 130 + ], + "i": 2126, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 134, + 134 + ], + "i": 2128, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 390, + 1165 + ], + "i": 2130, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 396, + 1165 + ], + "i": 2132, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 412, + 836 + ], + "i": 2134, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 424, + 836 + ], + "i": 2136, + "o": 13, + "p": [], + "u": 3 + }, + { + "i": 2138, + "s": { + "u": 2, + "w": 4 + }, + "u": 2, + "v": { + "v": 0 + } + }, + { + "a": [ + 428, + 2138 + ], + "i": 2140, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 442, + 442 + ], + "i": 2142, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 671, + 671 + ], + "i": 2144, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 679, + 679 + ], + "i": 2146, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 687, + 687 + ], + "i": 2148, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 705, + 705 + ], + "i": 2150, + "o": 13, + "p": [], + "u": 3 + }, + { + "i": 2152, + "s": { + "u": 2, + "w": 16 + }, + "u": 2, + "v": { + "v": 0 + } + }, + { + "a": [ + 709, + 2152 + ], + "i": 2154, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 715, + 715 + ], + "i": 2156, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 719, + 719 + ], + "i": 2158, + "o": 13, + "p": [], + "u": 3 + }, + { + "i": 2160, + "s": { + "u": 2, + "w": 4 + }, + "u": 2, + "v": { + "v": 0 + } + }, + { + "a": [ + 723, + 2160 + ], + "i": 2162, + "o": 13, + "p": [], + "u": 3 + }, + { + "i": 2164, + "s": { + "u": 2, + "w": 16 + }, + "u": 2, + "v": { + "v": 0 + } + }, + { + "a": [ + 727, + 2164 + ], + "i": 2166, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 731, + 731 + ], + "i": 2168, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 743, + 743 + ], + "i": 2170, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 763, + 763 + ], + "i": 2172, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 767, + 767 + ], + "i": 2174, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 773, + 773 + ], + "i": 2176, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 777, + 777 + ], + "i": 2178, + "o": 13, + "p": [], + "u": 3 + }, + { + "i": 2216, + "n": "jstate", + "s": { + "u": 2, + "w": 16 + }, + "u": 1 + }, + { + "i": 2234, + "n": "per_v_pc", + "s": { + "u": 2, + "w": 4 + }, + "u": 1 + }, + { + "i": 2248, + "n": "sumOfpow2", + "s": { + "u": 2, + "w": 64 + }, + "u": 1 + }, + { + "i": 2252, + "n": "train_h_cnt", + "s": { + "u": 2, + "w": 16 + }, + "u": 1 + }, + { + "i": 2258, + "n": "train_max", + "s": { + "u": 2, + "w": 16 + }, + "u": 1 + }, + { + "i": 2262, + "n": "train_sum", + "s": { + "u": 2, + "w": 16 + }, + "u": 1 + }, + { + "i": 2266, + "n": "train_upc", + "s": { + "u": 2, + "w": 4 + }, + "u": 1 + }, + { + "i": 2270, + "n": "train_v_cnt", + "s": { + "u": 2, + "w": 16 + }, + "u": 1 + }, + { + "i": 2288, + "n": "hidden_unit", + "s": { + "a": 7, + "d": 1, + "u": 3 + }, + "u": 1 + }, + { + "i": 2292, + "n": "pos", + "s": { + "a": 16, + "d": 1, + "u": 3 + }, + "u": 1 + }, + { + "i": 2296, + "n": "pow2", + "s": { + "a": 3, + "d": 32, + "u": 3 + }, + "u": 1 + }, + { + "i": 2302, + "n": "visibleEnergies", + "s": { + "a": 3, + "d": 16, + "u": 3 + }, + "u": 1 + }, + { + "i": 2306, + "n": "visible_unit", + "s": { + "a": 9, + "d": 1, + "u": 3 + }, + "u": 1 + }, + { + "i": 3401, + "s": { + "u": 2, + "w": 1 + }, + "u": 2, + "v": { + "v": 1 + } + }, + { + "a": [ + 424, + 3401 + ], + "i": 3403, + "o": 13, + "p": [], + "u": 3 + }, + { + "i": 2321, + "s": { + "u": 2, + "w": 4 + }, + "u": 2, + "v": { + "v": 0 + } + }, + { + "a": [ + 2266, + 2321 + ], + "i": 2323, + "o": 13, + "p": [], + "u": 3 + }, + { + "i": 2356, + "s": { + "u": 2, + "w": 16 + }, + "u": 2, + "v": { + "v": 0 + } + }, + { + "i": 2588, + "s": { + "u": 2, + "w": 4 + }, + "u": 2, + "v": { + "v": 0 + } + }, + { + "a": [ + 2270, + 86 + ], + "i": 2711, + "o": 13, + "p": [], + "u": 3 + }, + { + "i": 2713, + "s": { + "u": 2, + "w": 16 + }, + "u": 2, + "v": { + "v": 1 + } + }, + { + "a": [ + 66, + 2713 + ], + "i": 2715, + "o": 11, + "p": [], + "u": 3 + }, + { + "a": [ + 2252, + 2715 + ], + "i": 2716, + "o": 13, + "p": [], + "u": 3 + }, + { + "i": 2718, + "s": { + "u": 2, + "w": 16 + }, + "u": 2, + "v": { + "v": 1 + } + }, + { + "a": [ + 2252, + 2718 + ], + "i": 2720, + "o": 10, + "p": [], + "u": 3 + }, + { + "a": [ + 2716, + 2356, + 2720 + ], + "i": 2721, + "o": 26, + "p": [], + "u": 3 + }, + { + "a": [ + 2711, + 2721, + 2252 + ], + "i": 2722, + "o": 26, + "p": [], + "u": 3 + }, + { + "i": 2906, + "s": { + "u": 2, + "w": 16 + }, + "u": 2, + "v": { + "v": 0 + } + }, + { + "a": [ + 2270, + 2906 + ], + "i": 2908, + "o": 13, + "p": [], + "u": 3 + }, + { + "i": 2910, + "s": { + "u": 2, + "w": 16 + }, + "u": 2, + "v": { + "v": 0 + } + }, + { + "a": [ + 2908, + 2910, + 2262 + ], + "i": 2912, + "o": 26, + "p": [], + "u": 3 + }, + { + "a": [ + 2270 + ], + "i": 2913, + "o": 21, + "p": [ + 8, + 0 + ], + "u": 3 + }, + { + "a": [ + 130, + 2913 + ], + "i": 2915, + "o": 18, + "p": [], + "u": 3 + }, + { + "i": 2917, + "s": { + "u": 2, + "w": 8 + }, + "u": 2, + "v": { + "v": 1 + } + }, + { + "a": [ + 2915, + 2917 + ], + "i": 2919, + "o": 13, + "p": [], + "u": 3 + }, + { + "i": 2801, + "s": { + "u": 2, + "w": 16 + }, + "u": 2, + "v": { + "v": 101 + } + }, + { + "a": [ + 2801, + 2270 + ], + "i": 2921, + "o": 12, + "p": [], + "u": 3 + }, + { + "a": [ + 2921, + 2252 + ], + "i": 2922, + "o": 10, + "p": [], + "u": 3 + }, + { + "a": [ + 442, + 2922 + ], + "i": 2923, + "o": 18, + "p": [], + "u": 3 + }, + { + "a": [ + 2923 + ], + "i": 2925, + "o": 21, + "p": [ + 7, + 1 + ], + "u": 3 + }, + { + "a": [ + 2925 + ], + "i": 2927, + "o": 23, + "p": [ + 15 + ], + "u": 3 + }, + { + "a": [ + 2801, + 2270 + ], + "i": 2929, + "o": 12, + "p": [], + "u": 3 + }, + { + "a": [ + 2929, + 2252 + ], + "i": 2930, + "o": 10, + "p": [], + "u": 3 + }, + { + "a": [ + 442, + 2930 + ], + "i": 2931, + "o": 18, + "p": [], + "u": 3 + }, + { + "a": [ + 2931 + ], + "i": 2933, + "o": 21, + "p": [ + 0, + 0 + ], + "u": 3 + }, + { + "a": [ + 2927, + 2933 + ], + "i": 2939, + "o": 20, + "p": [], + "u": 3 + }, + { + "i": 2941, + "s": { + "u": 2, + "w": 16 + }, + "u": 2, + "v": { + "v": 0 + } + }, + { + "a": [ + 2919, + 2939, + 2941 + ], + "i": 2943, + "o": 26, + "p": [], + "u": 3 + }, + { + "a": [ + 2912, + 2943 + ], + "i": 2944, + "o": 10, + "p": [], + "u": 3 + }, + { + "a": [ + 2270, + 86 + ], + "i": 3009, + "o": 13, + "p": [], + "u": 3 + }, + { + "i": 3011, + "s": { + "u": 2, + "w": 16 + }, + "u": 2, + "v": { + "v": 1 + } + }, + { + "a": [ + 66, + 3011 + ], + "i": 3013, + "o": 11, + "p": [], + "u": 3 + }, + { + "a": [ + 2252, + 3013 + ], + "i": 3014, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 3009, + 3014 + ], + "i": 3016, + "o": 4, + "p": [], + "u": 3 + }, + { + "i": 3017, + "s": { + "u": 2, + "w": 4 + }, + "u": 2, + "v": { + "v": 1 + } + }, + { + "i": 3019, + "s": { + "u": 2, + "w": 4 + }, + "u": 2, + "v": { + "v": 0 + } + }, + { + "a": [ + 3016, + 3017, + 3019 + ], + "i": 3021, + "o": 26, + "p": [], + "u": 3 + }, + { + "a": [ + 2270, + 86 + ], + "i": 3070, + "o": 13, + "p": [], + "u": 3 + }, + { + "i": 3072, + "s": { + "u": 2, + "w": 16 + }, + "u": 2, + "v": { + "v": 1 + } + }, + { + "a": [ + 2270, + 3072 + ], + "i": 3074, + "o": 10, + "p": [], + "u": 3 + }, + { + "a": [ + 3070, + 2356, + 3074 + ], + "i": 3075, + "o": 26, + "p": [], + "u": 3 + }, + { + "a": [ + 2270, + 86 + ], + "i": 3129, + "o": 13, + "p": [], + "u": 3 + }, + { + "i": 3131, + "s": { + "u": 2, + "w": 16 + }, + "u": 2, + "v": { + "v": 1 + } + }, + { + "a": [ + 66, + 3131 + ], + "i": 3133, + "o": 11, + "p": [], + "u": 3 + }, + { + "a": [ + 2252, + 3133 + ], + "i": 3134, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 3129, + 3134 + ], + "i": 3136, + "o": 4, + "p": [], + "u": 3 + }, + { + "a": [ + 2270, + 86 + ], + "i": 3137, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 2252 + ], + "i": 3139, + "o": 21, + "p": [ + 6, + 0 + ], + "u": 3 + }, + { + "a": [], + "f": 2314, + "i": 3141, + "o": 24, + "p": [], + "u": 3 + }, + { + "a": [ + 2270, + 2906 + ], + "i": 3142, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 3142, + 2906, + 2262 + ], + "i": 3144, + "o": 26, + "p": [], + "u": 3 + }, + { + "a": [ + 2270 + ], + "i": 3145, + "o": 21, + "p": [ + 8, + 0 + ], + "u": 3 + }, + { + "a": [ + 130, + 3145 + ], + "i": 3147, + "o": 18, + "p": [], + "u": 3 + }, + { + "a": [ + 3147, + 2917 + ], + "i": 3149, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 2801, + 2270 + ], + "i": 3151, + "o": 12, + "p": [], + "u": 3 + }, + { + "a": [ + 3151, + 2252 + ], + "i": 3152, + "o": 10, + "p": [], + "u": 3 + }, + { + "a": [ + 442, + 3152 + ], + "i": 3153, + "o": 18, + "p": [], + "u": 3 + }, + { + "a": [ + 3153 + ], + "i": 3155, + "o": 21, + "p": [ + 7, + 1 + ], + "u": 3 + }, + { + "a": [ + 3155 + ], + "i": 3157, + "o": 23, + "p": [ + 15 + ], + "u": 3 + }, + { + "a": [ + 3153 + ], + "i": 3163, + "o": 21, + "p": [ + 0, + 0 + ], + "u": 3 + }, + { + "a": [ + 3157, + 3163 + ], + "i": 3169, + "o": 20, + "p": [], + "u": 3 + }, + { + "a": [ + 3149, + 3169, + 2906 + ], + "i": 3171, + "o": 26, + "p": [], + "u": 3 + }, + { + "a": [ + 3144, + 3171 + ], + "i": 3172, + "o": 10, + "p": [], + "u": 3 + }, + { + "a": [ + 3172 + ], + "f": 2317, + "i": 3173, + "o": 24, + "p": [], + "u": 3 + }, + { + "a": [ + 3141, + 3173 + ], + "i": 3174, + "o": 16, + "p": [], + "u": 3 + }, + { + "i": 3176, + "s": { + "u": 2, + "w": 1 + }, + "u": 2, + "v": { + "v": 1 + } + }, + { + "i": 2405, + "s": { + "u": 2, + "w": 1 + }, + "u": 2, + "v": { + "v": 0 + } + }, + { + "a": [ + 3174, + 3176, + 2405 + ], + "i": 3178, + "o": 26, + "p": [], + "u": 3 + }, + { + "a": [ + 2288, + 3139, + 3178 + ], + "i": 3179, + "o": 19, + "p": [], + "u": 3 + }, + { + "a": [ + 3137, + 3179, + 2288 + ], + "i": 3180, + "o": 26, + "p": [], + "u": 3 + }, + { + "a": [ + 66 + ], + "i": 3181, + "o": 21, + "p": [ + 6, + 0 + ], + "u": 3 + }, + { + "a": [ + 3180, + 3181, + 3176 + ], + "i": 3183, + "o": 19, + "p": [], + "u": 3 + }, + { + "a": [ + 3136, + 3183, + 3180 + ], + "i": 3184, + "o": 26, + "p": [], + "u": 3 + }, + { + "i": 2755, + "s": { + "u": 2, + "w": 4 + }, + "u": 2, + "v": { + "v": 3 + } + }, + { + "a": [ + 2266, + 2755 + ], + "i": 3192, + "o": 13, + "p": [], + "u": 3 + }, + { + "i": 3194, + "s": { + "u": 2, + "w": 16 + }, + "u": 2, + "v": { + "v": 101 + } + }, + { + "a": [ + 3194, + 2270 + ], + "i": 3196, + "o": 12, + "p": [], + "u": 3 + }, + { + "a": [ + 3196, + 2252 + ], + "i": 3197, + "o": 10, + "p": [], + "u": 3 + }, + { + "a": [ + 2270 + ], + "i": 3198, + "o": 21, + "p": [ + 8, + 0 + ], + "u": 3 + }, + { + "a": [ + 130, + 3198 + ], + "i": 3200, + "o": 18, + "p": [], + "u": 3 + }, + { + "i": 3202, + "s": { + "u": 2, + "w": 8 + }, + "u": 2, + "v": { + "v": 0 + } + }, + { + "a": [ + 3200, + 3202 + ], + "i": 3204, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 3204 + ], + "i": 3206, + "o": 2, + "p": [], + "u": 3 + }, + { + "a": [ + 3206, + 3176, + 2405 + ], + "i": 3207, + "o": 26, + "p": [], + "u": 3 + }, + { + "a": [ + 2252 + ], + "i": 3208, + "o": 21, + "p": [ + 6, + 0 + ], + "u": 3 + }, + { + "a": [ + 2288, + 3208 + ], + "i": 3210, + "o": 18, + "p": [], + "u": 3 + }, + { + "a": [ + 3207, + 3210 + ], + "i": 3212, + "o": 4, + "p": [], + "u": 3 + }, + { + "a": [ + 2292, + 3197, + 3212 + ], + "i": 3213, + "o": 19, + "p": [], + "u": 3 + }, + { + "a": [ + 3192, + 3213, + 2292 + ], + "i": 3214, + "o": 26, + "p": [], + "u": 3 + }, + { + "i": 2326, + "s": { + "u": 2, + "w": 4 + }, + "u": 2, + "v": { + "v": 1 + } + }, + { + "a": [ + 2266, + 2326 + ], + "i": 2328, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 2266, + 2326 + ], + "i": 2524, + "o": 13, + "p": [], + "u": 3 + }, + { + "i": 2526, + "s": { + "u": 2, + "w": 4 + }, + "u": 2, + "v": { + "v": 0 + } + }, + { + "a": [ + 2234, + 2526 + ], + "i": 2528, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 2524, + 2528 + ], + "i": 2530, + "o": 4, + "p": [], + "u": 3 + }, + { + "a": [ + 2252, + 66 + ], + "i": 2531, + "o": 13, + "p": [], + "u": 3 + }, + { + "i": 2533, + "s": { + "u": 2, + "w": 16 + }, + "u": 2, + "v": { + "v": 4 + } + }, + { + "a": [ + 2216, + 2533 + ], + "i": 2535, + "o": 13, + "p": [], + "u": 3 + }, + { + "i": 2537, + "s": { + "u": 2, + "w": 16 + }, + "u": 2, + "v": { + "v": 1 + } + }, + { + "a": [ + 2216, + 2537 + ], + "i": 2539, + "o": 10, + "p": [], + "u": 3 + }, + { + "a": [ + 2535, + 2356, + 2539 + ], + "i": 2540, + "o": 26, + "p": [], + "u": 3 + }, + { + "a": [ + 2531, + 2540, + 2216 + ], + "i": 2541, + "o": 26, + "p": [], + "u": 3 + }, + { + "a": [ + 2266, + 2326 + ], + "i": 2542, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 2234, + 2326 + ], + "i": 2546, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 2542, + 2546 + ], + "i": 2548, + "o": 4, + "p": [], + "u": 3 + }, + { + "a": [ + 2216, + 2533 + ], + "i": 2549, + "o": 13, + "p": [], + "u": 3 + }, + { + "i": 2551, + "s": { + "u": 2, + "w": 16 + }, + "u": 2, + "v": { + "v": 1 + } + }, + { + "a": [ + 2216, + 2551 + ], + "i": 2553, + "o": 10, + "p": [], + "u": 3 + }, + { + "a": [ + 2549, + 2356, + 2553 + ], + "i": 2554, + "o": 26, + "p": [], + "u": 3 + }, + { + "a": [ + 2266, + 2326 + ], + "i": 2555, + "o": 13, + "p": [], + "u": 3 + }, + { + "i": 2557, + "s": { + "u": 2, + "w": 4 + }, + "u": 2, + "v": { + "v": 2 + } + }, + { + "a": [ + 2234, + 2557 + ], + "i": 2559, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 2555, + 2559 + ], + "i": 2561, + "o": 4, + "p": [], + "u": 3 + }, + { + "a": [ + 2216, + 2533 + ], + "i": 2562, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 2216, + 2551 + ], + "i": 2564, + "o": 10, + "p": [], + "u": 3 + }, + { + "a": [ + 2562, + 2356, + 2564 + ], + "i": 2565, + "o": 26, + "p": [], + "u": 3 + }, + { + "a": [ + 2266, + 2326 + ], + "i": 2566, + "o": 13, + "p": [], + "u": 3 + }, + { + "i": 2568, + "s": { + "u": 2, + "w": 4 + }, + "u": 2, + "v": { + "v": 3 + } + }, + { + "a": [ + 2234, + 2568 + ], + "i": 2570, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 2566, + 2570 + ], + "i": 2572, + "o": 4, + "p": [], + "u": 3 + }, + { + "a": [ + 2216, + 2533 + ], + "i": 2573, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 2216, + 2551 + ], + "i": 2575, + "o": 10, + "p": [], + "u": 3 + }, + { + "a": [ + 2573, + 2356, + 2575 + ], + "i": 2576, + "o": 26, + "p": [], + "u": 3 + }, + { + "a": [ + 2572, + 2576, + 2216 + ], + "i": 2577, + "o": 26, + "p": [], + "u": 3 + }, + { + "a": [ + 2561, + 2565, + 2577 + ], + "i": 2578, + "o": 26, + "p": [], + "u": 3 + }, + { + "a": [ + 2548, + 2554, + 2578 + ], + "i": 2579, + "o": 26, + "p": [], + "u": 3 + }, + { + "a": [ + 2530, + 2541, + 2579 + ], + "i": 2580, + "o": 26, + "p": [], + "u": 3 + }, + { + "a": [ + 2266, + 2326 + ], + "i": 2592, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 2234, + 2526 + ], + "i": 2594, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 2592, + 2594 + ], + "i": 2596, + "o": 4, + "p": [], + "u": 3 + }, + { + "a": [ + 2216, + 2533 + ], + "i": 2597, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 2252, + 66 + ], + "i": 2599, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 2597, + 2599 + ], + "i": 2601, + "o": 4, + "p": [], + "u": 3 + }, + { + "i": 2602, + "s": { + "u": 2, + "w": 4 + }, + "u": 2, + "v": { + "v": 1 + } + }, + { + "a": [ + 2601, + 2602, + 2234 + ], + "i": 2604, + "o": 26, + "p": [], + "u": 3 + }, + { + "a": [ + 2266, + 2326 + ], + "i": 2605, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 2234, + 2326 + ], + "i": 2607, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 2605, + 2607 + ], + "i": 2609, + "o": 4, + "p": [], + "u": 3 + }, + { + "a": [ + 2216, + 2533 + ], + "i": 2610, + "o": 13, + "p": [], + "u": 3 + }, + { + "i": 2612, + "s": { + "u": 2, + "w": 4 + }, + "u": 2, + "v": { + "v": 2 + } + }, + { + "a": [ + 2610, + 2612, + 2234 + ], + "i": 2614, + "o": 26, + "p": [], + "u": 3 + }, + { + "a": [ + 2266, + 2326 + ], + "i": 2615, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 2234, + 2557 + ], + "i": 2617, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 2615, + 2617 + ], + "i": 2619, + "o": 4, + "p": [], + "u": 3 + }, + { + "a": [ + 2216, + 2533 + ], + "i": 2620, + "o": 13, + "p": [], + "u": 3 + }, + { + "i": 2622, + "s": { + "u": 2, + "w": 4 + }, + "u": 2, + "v": { + "v": 3 + } + }, + { + "a": [ + 2620, + 2622, + 2234 + ], + "i": 2624, + "o": 26, + "p": [], + "u": 3 + }, + { + "a": [ + 2266, + 2326 + ], + "i": 2625, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 2234, + 2568 + ], + "i": 2627, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 2625, + 2627 + ], + "i": 2629, + "o": 4, + "p": [], + "u": 3 + }, + { + "a": [ + 2216, + 2533 + ], + "i": 2630, + "o": 13, + "p": [], + "u": 3 + }, + { + "i": 2632, + "s": { + "u": 2, + "w": 16 + }, + "u": 2, + "v": { + "v": 5 + } + }, + { + "a": [ + 2270, + 2632 + ], + "i": 2634, + "o": 10, + "p": [], + "u": 3 + }, + { + "a": [ + 2634, + 86 + ], + "i": 2635, + "o": 13, + "p": [], + "u": 3 + }, + { + "i": 2640, + "s": { + "u": 2, + "w": 16 + }, + "u": 2, + "v": { + "v": 500 + } + }, + { + "a": [ + 2634, + 2640 + ], + "i": 2642, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 2634, + 2640 + ], + "i": 2644, + "o": 17, + "p": [], + "u": 3 + }, + { + "a": [ + 2642, + 2644 + ], + "i": 2646, + "o": 5, + "p": [], + "u": 3 + }, + { + "a": [ + 2635, + 2646 + ], + "i": 2647, + "o": 5, + "p": [], + "u": 3 + }, + { + "a": [ + 2647, + 2588, + 2588 + ], + "i": 2648, + "o": 26, + "p": [], + "u": 3 + }, + { + "a": [ + 2630, + 2648, + 2234 + ], + "i": 2649, + "o": 26, + "p": [], + "u": 3 + }, + { + "a": [ + 2629, + 2649, + 2234 + ], + "i": 2650, + "o": 26, + "p": [], + "u": 3 + }, + { + "a": [ + 2619, + 2624, + 2650 + ], + "i": 2651, + "o": 26, + "p": [], + "u": 3 + }, + { + "a": [ + 2609, + 2614, + 2651 + ], + "i": 2652, + "o": 26, + "p": [], + "u": 3 + }, + { + "a": [ + 2596, + 2604, + 2652 + ], + "i": 2653, + "o": 26, + "p": [], + "u": 3 + }, + { + "a": [ + 2266, + 2326 + ], + "i": 2663, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 2234, + 2526 + ], + "i": 2665, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 2663, + 2665 + ], + "i": 2667, + "o": 4, + "p": [], + "u": 3 + }, + { + "a": [ + 2266, + 2326 + ], + "i": 2668, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 2234, + 2326 + ], + "i": 2670, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 2668, + 2670 + ], + "i": 2672, + "o": 4, + "p": [], + "u": 3 + }, + { + "a": [ + 2266, + 2326 + ], + "i": 2673, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 2234, + 2557 + ], + "i": 2675, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 2673, + 2675 + ], + "i": 2677, + "o": 4, + "p": [], + "u": 3 + }, + { + "i": 2678, + "s": { + "u": 2, + "w": 16 + }, + "u": 2, + "v": { + "v": 0 + } + }, + { + "a": [ + 2216, + 2678 + ], + "i": 2680, + "o": 13, + "p": [], + "u": 3 + }, + { + "i": 2682, + "s": { + "u": 2, + "w": 64 + }, + "u": 2, + "v": { + "v": 0 + } + }, + { + "a": [ + 2680, + 2682, + 2248 + ], + "i": 2684, + "o": 26, + "p": [], + "u": 3 + }, + { + "a": [ + 2216 + ], + "i": 2685, + "o": 21, + "p": [ + 2, + 0 + ], + "u": 3 + }, + { + "a": [ + 2302, + 2685 + ], + "i": 2687, + "o": 18, + "p": [], + "u": 3 + }, + { + "a": [ + 2687 + ], + "f": 2320, + "i": 2689, + "o": 24, + "p": [], + "u": 3 + }, + { + "a": [ + 2689 + ], + "i": 2690, + "o": 21, + "p": [ + 31, + 0 + ], + "u": 3 + }, + { + "a": [ + 2690 + ], + "i": 2692, + "o": 22, + "p": [ + 64 + ], + "u": 3 + }, + { + "a": [ + 2684, + 2692 + ], + "i": 2694, + "o": 10, + "p": [], + "u": 3 + }, + { + "a": [ + 2266, + 2326 + ], + "i": 2695, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 2234, + 2568 + ], + "i": 2697, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 2695, + 2697 + ], + "i": 2699, + "o": 4, + "p": [], + "u": 3 + }, + { + "a": [ + 2699, + 2248, + 2248 + ], + "i": 2700, + "o": 26, + "p": [], + "u": 3 + }, + { + "a": [ + 2677, + 2694, + 2700 + ], + "i": 2701, + "o": 26, + "p": [], + "u": 3 + }, + { + "a": [ + 2672, + 2248, + 2701 + ], + "i": 2702, + "o": 26, + "p": [], + "u": 3 + }, + { + "a": [ + 2667, + 2248, + 2702 + ], + "i": 2703, + "o": 26, + "p": [], + "u": 3 + }, + { + "a": [ + 2266, + 2326 + ], + "i": 2725, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 2234, + 2526 + ], + "i": 2727, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 2725, + 2727 + ], + "i": 2729, + "o": 4, + "p": [], + "u": 3 + }, + { + "a": [ + 2252, + 66 + ], + "i": 2730, + "o": 13, + "p": [], + "u": 3 + }, + { + "i": 2732, + "s": { + "u": 2, + "w": 16 + }, + "u": 2, + "v": { + "v": 1 + } + }, + { + "a": [ + 2252, + 2732 + ], + "i": 2734, + "o": 10, + "p": [], + "u": 3 + }, + { + "a": [ + 2730, + 2356, + 2734 + ], + "i": 2735, + "o": 26, + "p": [], + "u": 3 + }, + { + "a": [ + 2266, + 2326 + ], + "i": 2736, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 2234, + 2326 + ], + "i": 2738, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 2736, + 2738 + ], + "i": 2740, + "o": 4, + "p": [], + "u": 3 + }, + { + "a": [ + 2266, + 2326 + ], + "i": 2741, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 2234, + 2557 + ], + "i": 2743, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 2741, + 2743 + ], + "i": 2745, + "o": 4, + "p": [], + "u": 3 + }, + { + "a": [ + 2266, + 2326 + ], + "i": 2746, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 2234, + 2568 + ], + "i": 2748, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 2746, + 2748 + ], + "i": 2750, + "o": 4, + "p": [], + "u": 3 + }, + { + "a": [ + 2750, + 2252, + 2252 + ], + "i": 2751, + "o": 26, + "p": [], + "u": 3 + }, + { + "a": [ + 2745, + 2252, + 2751 + ], + "i": 2752, + "o": 26, + "p": [], + "u": 3 + }, + { + "a": [ + 2740, + 2252, + 2752 + ], + "i": 2753, + "o": 26, + "p": [], + "u": 3 + }, + { + "a": [ + 2729, + 2735, + 2753 + ], + "i": 2754, + "o": 26, + "p": [], + "u": 3 + }, + { + "a": [ + 2266, + 2326 + ], + "i": 2781, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 2234, + 2526 + ], + "i": 2783, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 2781, + 2783 + ], + "i": 2785, + "o": 4, + "p": [], + "u": 3 + }, + { + "a": [ + 2252, + 66 + ], + "i": 2786, + "o": 13, + "p": [], + "u": 3 + }, + { + "i": 2788, + "s": { + "u": 2, + "w": 16 + }, + "u": 2, + "v": { + "v": 0 + } + }, + { + "a": [ + 2252, + 2788 + ], + "i": 2790, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 2790, + 2788, + 2262 + ], + "i": 2792, + "o": 26, + "p": [], + "u": 3 + }, + { + "a": [ + 2252 + ], + "i": 2793, + "o": 21, + "p": [ + 6, + 0 + ], + "u": 3 + }, + { + "a": [ + 2288, + 2793 + ], + "i": 2795, + "o": 18, + "p": [], + "u": 3 + }, + { + "i": 2797, + "s": { + "u": 2, + "w": 1 + }, + "u": 2, + "v": { + "v": 1 + } + }, + { + "a": [ + 2795, + 2797 + ], + "i": 2799, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 2801, + 2270 + ], + "i": 2803, + "o": 12, + "p": [], + "u": 3 + }, + { + "a": [ + 2803, + 2252 + ], + "i": 2804, + "o": 10, + "p": [], + "u": 3 + }, + { + "a": [ + 442, + 2804 + ], + "i": 2805, + "o": 18, + "p": [], + "u": 3 + }, + { + "a": [ + 2805 + ], + "i": 2807, + "o": 21, + "p": [ + 7, + 1 + ], + "u": 3 + }, + { + "a": [ + 2807 + ], + "i": 2809, + "o": 23, + "p": [ + 15 + ], + "u": 3 + }, + { + "a": [ + 2805 + ], + "i": 2815, + "o": 21, + "p": [ + 0, + 0 + ], + "u": 3 + }, + { + "a": [ + 2809, + 2815 + ], + "i": 2821, + "o": 20, + "p": [], + "u": 3 + }, + { + "a": [ + 2799, + 2821, + 2788 + ], + "i": 2823, + "o": 26, + "p": [], + "u": 3 + }, + { + "a": [ + 2792, + 2823 + ], + "i": 2824, + "o": 10, + "p": [], + "u": 3 + }, + { + "a": [ + 2216, + 2788 + ], + "i": 2827, + "o": 13, + "p": [], + "u": 3 + }, + { + "i": 2829, + "s": { + "u": 2, + "w": 16 + }, + "u": 2, + "v": { + "v": 1000 + } + }, + { + "a": [ + 2829 + ], + "i": 2831, + "o": 1, + "p": [], + "u": 3 + }, + { + "a": [ + 2827, + 2831, + 2258 + ], + "i": 2832, + "o": 26, + "p": [], + "u": 3 + }, + { + "a": [ + 2824, + 2832 + ], + "i": 2833, + "o": 15, + "p": [], + "u": 3 + }, + { + "a": [ + 2252, + 2788 + ], + "i": 2835, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 2835, + 2356, + 2262 + ], + "i": 2837, + "o": 26, + "p": [], + "u": 3 + }, + { + "a": [ + 2252 + ], + "i": 2838, + "o": 21, + "p": [ + 6, + 0 + ], + "u": 3 + }, + { + "a": [ + 2288, + 2838 + ], + "i": 2840, + "o": 18, + "p": [], + "u": 3 + }, + { + "a": [ + 2840, + 2797 + ], + "i": 2842, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 2801, + 2270 + ], + "i": 2844, + "o": 12, + "p": [], + "u": 3 + }, + { + "a": [ + 2844, + 2252 + ], + "i": 2845, + "o": 10, + "p": [], + "u": 3 + }, + { + "a": [ + 442, + 2845 + ], + "i": 2846, + "o": 18, + "p": [], + "u": 3 + }, + { + "a": [ + 2846 + ], + "i": 2848, + "o": 21, + "p": [ + 7, + 1 + ], + "u": 3 + }, + { + "a": [ + 2848 + ], + "i": 2850, + "o": 23, + "p": [ + 15 + ], + "u": 3 + }, + { + "a": [ + 2801, + 2270 + ], + "i": 2852, + "o": 12, + "p": [], + "u": 3 + }, + { + "a": [ + 2852, + 2252 + ], + "i": 2853, + "o": 10, + "p": [], + "u": 3 + }, + { + "a": [ + 442, + 2853 + ], + "i": 2854, + "o": 18, + "p": [], + "u": 3 + }, + { + "a": [ + 2854 + ], + "i": 2856, + "o": 21, + "p": [ + 0, + 0 + ], + "u": 3 + }, + { + "a": [ + 2850, + 2856 + ], + "i": 2862, + "o": 20, + "p": [], + "u": 3 + }, + { + "a": [ + 2842, + 2862, + 2356 + ], + "i": 2864, + "o": 26, + "p": [], + "u": 3 + }, + { + "a": [ + 2837, + 2864 + ], + "i": 2865, + "o": 10, + "p": [], + "u": 3 + }, + { + "i": 2825, + "s": { + "u": 2, + "w": 16 + }, + "u": 2, + "v": { + "v": 0 + } + }, + { + "a": [ + 2216, + 2825 + ], + "i": 2866, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 2829 + ], + "i": 2868, + "o": 1, + "p": [], + "u": 3 + }, + { + "a": [ + 2866, + 2868, + 2258 + ], + "i": 2869, + "o": 26, + "p": [], + "u": 3 + }, + { + "a": [ + 2833, + 2865, + 2869 + ], + "i": 2870, + "o": 26, + "p": [], + "u": 3 + }, + { + "a": [ + 2786, + 2870, + 2258 + ], + "i": 2871, + "o": 26, + "p": [], + "u": 3 + }, + { + "a": [ + 2266, + 2326 + ], + "i": 2872, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 2234, + 2326 + ], + "i": 2874, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 2872, + 2874 + ], + "i": 2876, + "o": 4, + "p": [], + "u": 3 + }, + { + "i": 2877, + "s": { + "u": 2, + "w": 16 + }, + "u": 2, + "v": { + "v": 0 + } + }, + { + "a": [ + 2216, + 2877 + ], + "i": 2879, + "o": 13, + "p": [], + "u": 3 + }, + { + "i": 2881, + "s": { + "u": 2, + "w": 16 + }, + "u": 2, + "v": { + "v": 62 + } + }, + { + "a": [ + 2258, + 2881 + ], + "i": 2883, + "o": 11, + "p": [], + "u": 3 + }, + { + "a": [ + 2879, + 2883, + 2258 + ], + "i": 2884, + "o": 26, + "p": [], + "u": 3 + }, + { + "a": [ + 2266, + 2326 + ], + "i": 2885, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 2234, + 2557 + ], + "i": 2887, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 2885, + 2887 + ], + "i": 2889, + "o": 4, + "p": [], + "u": 3 + }, + { + "a": [ + 2266, + 2326 + ], + "i": 2890, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 2234, + 2568 + ], + "i": 2892, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 2890, + 2892 + ], + "i": 2894, + "o": 4, + "p": [], + "u": 3 + }, + { + "a": [ + 2894, + 2258, + 2258 + ], + "i": 2895, + "o": 26, + "p": [], + "u": 3 + }, + { + "a": [ + 2889, + 2258, + 2895 + ], + "i": 2896, + "o": 26, + "p": [], + "u": 3 + }, + { + "a": [ + 2876, + 2884, + 2896 + ], + "i": 2897, + "o": 26, + "p": [], + "u": 3 + }, + { + "a": [ + 2785, + 2871, + 2897 + ], + "i": 2898, + "o": 26, + "p": [], + "u": 3 + }, + { + "a": [ + 2266, + 2326 + ], + "i": 2947, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 2234, + 2526 + ], + "i": 2949, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 2947, + 2949 + ], + "i": 2951, + "o": 4, + "p": [], + "u": 3 + }, + { + "a": [ + 2252, + 2788 + ], + "i": 2952, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 2952, + 2356, + 2262 + ], + "i": 2954, + "o": 26, + "p": [], + "u": 3 + }, + { + "a": [ + 2252 + ], + "i": 2955, + "o": 21, + "p": [ + 6, + 0 + ], + "u": 3 + }, + { + "a": [ + 2288, + 2955 + ], + "i": 2957, + "o": 18, + "p": [], + "u": 3 + }, + { + "a": [ + 2957, + 2797 + ], + "i": 2959, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 2801, + 2270 + ], + "i": 2961, + "o": 12, + "p": [], + "u": 3 + }, + { + "a": [ + 2961, + 2252 + ], + "i": 2962, + "o": 10, + "p": [], + "u": 3 + }, + { + "a": [ + 442, + 2962 + ], + "i": 2963, + "o": 18, + "p": [], + "u": 3 + }, + { + "a": [ + 2963 + ], + "i": 2965, + "o": 21, + "p": [ + 7, + 1 + ], + "u": 3 + }, + { + "a": [ + 2965 + ], + "i": 2967, + "o": 23, + "p": [ + 15 + ], + "u": 3 + }, + { + "a": [ + 2801, + 2270 + ], + "i": 2969, + "o": 12, + "p": [], + "u": 3 + }, + { + "a": [ + 2969, + 2252 + ], + "i": 2970, + "o": 10, + "p": [], + "u": 3 + }, + { + "a": [ + 442, + 2970 + ], + "i": 2971, + "o": 18, + "p": [], + "u": 3 + }, + { + "a": [ + 2971 + ], + "i": 2973, + "o": 21, + "p": [ + 0, + 0 + ], + "u": 3 + }, + { + "a": [ + 2967, + 2973 + ], + "i": 2979, + "o": 20, + "p": [], + "u": 3 + }, + { + "a": [ + 2959, + 2979, + 2356 + ], + "i": 2981, + "o": 26, + "p": [], + "u": 3 + }, + { + "a": [ + 2954, + 2981 + ], + "i": 2982, + "o": 10, + "p": [], + "u": 3 + }, + { + "a": [ + 2266, + 2326 + ], + "i": 2983, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 2234, + 2326 + ], + "i": 2985, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 2983, + 2985 + ], + "i": 2987, + "o": 4, + "p": [], + "u": 3 + }, + { + "a": [ + 2266, + 2326 + ], + "i": 2988, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 2234, + 2557 + ], + "i": 2990, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 2988, + 2990 + ], + "i": 2992, + "o": 4, + "p": [], + "u": 3 + }, + { + "a": [ + 2266, + 2326 + ], + "i": 2993, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 2234, + 2568 + ], + "i": 2995, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 2993, + 2995 + ], + "i": 2997, + "o": 4, + "p": [], + "u": 3 + }, + { + "a": [ + 2997, + 2262, + 2262 + ], + "i": 2998, + "o": 26, + "p": [], + "u": 3 + }, + { + "a": [ + 2992, + 2262, + 2998 + ], + "i": 2999, + "o": 26, + "p": [], + "u": 3 + }, + { + "a": [ + 2987, + 2262, + 2999 + ], + "i": 3000, + "o": 26, + "p": [], + "u": 3 + }, + { + "a": [ + 2951, + 2982, + 3000 + ], + "i": 3001, + "o": 26, + "p": [], + "u": 3 + }, + { + "a": [ + 2266, + 2326 + ], + "i": 3024, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 2234, + 2568 + ], + "i": 3026, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 3024, + 3026 + ], + "i": 3028, + "o": 4, + "p": [], + "u": 3 + }, + { + "a": [ + 2216, + 2533 + ], + "i": 3029, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 3028, + 3029 + ], + "i": 3031, + "o": 4, + "p": [], + "u": 3 + }, + { + "a": [ + 2270, + 2632 + ], + "i": 3032, + "o": 10, + "p": [], + "u": 3 + }, + { + "a": [ + 3032, + 86 + ], + "i": 3033, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 3032, + 2640 + ], + "i": 3036, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 3032, + 2640 + ], + "i": 3038, + "o": 17, + "p": [], + "u": 3 + }, + { + "a": [ + 3036, + 3038 + ], + "i": 3040, + "o": 5, + "p": [], + "u": 3 + }, + { + "a": [ + 3033, + 3040 + ], + "i": 3041, + "o": 5, + "p": [], + "u": 3 + }, + { + "a": [ + 3031, + 3041 + ], + "i": 3042, + "o": 4, + "p": [], + "u": 3 + }, + { + "i": 3043, + "s": { + "u": 2, + "w": 4 + }, + "u": 2, + "v": { + "v": 3 + } + }, + { + "a": [ + 3042, + 3043, + 3017 + ], + "i": 3045, + "o": 26, + "p": [], + "u": 3 + }, + { + "a": [ + 2266, + 2326 + ], + "i": 3078, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 2234, + 2568 + ], + "i": 3080, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 3078, + 3080 + ], + "i": 3082, + "o": 4, + "p": [], + "u": 3 + }, + { + "a": [ + 2216, + 2533 + ], + "i": 3083, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 3082, + 3083 + ], + "i": 3085, + "o": 4, + "p": [], + "u": 3 + }, + { + "a": [ + 2270, + 2632 + ], + "i": 3086, + "o": 10, + "p": [], + "u": 3 + }, + { + "a": [ + 3086, + 86 + ], + "i": 3087, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 3086, + 2640 + ], + "i": 3090, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 3086, + 2640 + ], + "i": 3092, + "o": 17, + "p": [], + "u": 3 + }, + { + "a": [ + 3090, + 3092 + ], + "i": 3094, + "o": 5, + "p": [], + "u": 3 + }, + { + "a": [ + 3087, + 3094 + ], + "i": 3095, + "o": 5, + "p": [], + "u": 3 + }, + { + "i": 3096, + "s": { + "u": 2, + "w": 16 + }, + "u": 2, + "v": { + "v": 5 + } + }, + { + "a": [ + 2270, + 3096 + ], + "i": 3098, + "o": 10, + "p": [], + "u": 3 + }, + { + "a": [ + 3095, + 2356, + 3098 + ], + "i": 3099, + "o": 26, + "p": [], + "u": 3 + }, + { + "a": [ + 3085, + 3099, + 2270 + ], + "i": 3100, + "o": 26, + "p": [], + "u": 3 + }, + { + "a": [ + 2266, + 2326 + ], + "i": 3219, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 2234, + 2526 + ], + "i": 3221, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 3219, + 3221 + ], + "i": 3223, + "o": 4, + "p": [], + "u": 3 + }, + { + "a": [ + 2266, + 2326 + ], + "i": 3224, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 2234, + 2326 + ], + "i": 3226, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 3224, + 3226 + ], + "i": 3228, + "o": 4, + "p": [], + "u": 3 + }, + { + "a": [ + 2266, + 2326 + ], + "i": 3229, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 2234, + 2557 + ], + "i": 3231, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 3229, + 3231 + ], + "i": 3233, + "o": 4, + "p": [], + "u": 3 + }, + { + "a": [ + 2216 + ], + "i": 3234, + "o": 21, + "p": [ + 2, + 0 + ], + "u": 3 + }, + { + "a": [ + 2216 + ], + "i": 3236, + "o": 21, + "p": [ + 2, + 0 + ], + "u": 3 + }, + { + "a": [ + 2302, + 3236 + ], + "i": 3238, + "o": 18, + "p": [], + "u": 3 + }, + { + "a": [ + 3238 + ], + "f": 2320, + "i": 3240, + "o": 24, + "p": [], + "u": 3 + }, + { + "a": [ + 2296, + 3234, + 3240 + ], + "i": 3241, + "o": 19, + "p": [], + "u": 3 + }, + { + "a": [ + 2266, + 2326 + ], + "i": 3242, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 2234, + 2568 + ], + "i": 3244, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 3242, + 3244 + ], + "i": 3246, + "o": 4, + "p": [], + "u": 3 + }, + { + "a": [ + 3246, + 2296, + 2296 + ], + "i": 3247, + "o": 26, + "p": [], + "u": 3 + }, + { + "a": [ + 3233, + 3241, + 3247 + ], + "i": 3248, + "o": 26, + "p": [], + "u": 3 + }, + { + "a": [ + 3228, + 2296, + 3248 + ], + "i": 3249, + "o": 26, + "p": [], + "u": 3 + }, + { + "a": [ + 3223, + 2296, + 3249 + ], + "i": 3250, + "o": 26, + "p": [], + "u": 3 + }, + { + "a": [ + 2266, + 2326 + ], + "i": 3260, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 2234, + 2526 + ], + "i": 3262, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 3260, + 3262 + ], + "i": 3264, + "o": 4, + "p": [], + "u": 3 + }, + { + "a": [ + 2252, + 66 + ], + "i": 3265, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 2216 + ], + "i": 3267, + "o": 21, + "p": [ + 2, + 0 + ], + "u": 3 + }, + { + "a": [ + 2252, + 2788 + ], + "i": 3269, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 3269, + 2356, + 2262 + ], + "i": 3271, + "o": 26, + "p": [], + "u": 3 + }, + { + "a": [ + 2252 + ], + "i": 3272, + "o": 21, + "p": [ + 6, + 0 + ], + "u": 3 + }, + { + "a": [ + 2288, + 3272 + ], + "i": 3274, + "o": 18, + "p": [], + "u": 3 + }, + { + "a": [ + 3274, + 2797 + ], + "i": 3276, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 2801, + 2270 + ], + "i": 3278, + "o": 12, + "p": [], + "u": 3 + }, + { + "a": [ + 3278, + 2252 + ], + "i": 3279, + "o": 10, + "p": [], + "u": 3 + }, + { + "a": [ + 442, + 3279 + ], + "i": 3280, + "o": 18, + "p": [], + "u": 3 + }, + { + "a": [ + 3280 + ], + "i": 3282, + "o": 21, + "p": [ + 7, + 1 + ], + "u": 3 + }, + { + "a": [ + 3282 + ], + "i": 3284, + "o": 23, + "p": [ + 15 + ], + "u": 3 + }, + { + "a": [ + 2801, + 2270 + ], + "i": 3286, + "o": 12, + "p": [], + "u": 3 + }, + { + "a": [ + 3286, + 2252 + ], + "i": 3287, + "o": 10, + "p": [], + "u": 3 + }, + { + "a": [ + 442, + 3287 + ], + "i": 3288, + "o": 18, + "p": [], + "u": 3 + }, + { + "a": [ + 3288 + ], + "i": 3290, + "o": 21, + "p": [ + 0, + 0 + ], + "u": 3 + }, + { + "a": [ + 3284, + 3290 + ], + "i": 3296, + "o": 20, + "p": [], + "u": 3 + }, + { + "a": [ + 3276, + 3296, + 2356 + ], + "i": 3298, + "o": 26, + "p": [], + "u": 3 + }, + { + "a": [ + 3271, + 3298 + ], + "i": 3299, + "o": 10, + "p": [], + "u": 3 + }, + { + "a": [ + 2302, + 3267, + 3299 + ], + "i": 3300, + "o": 19, + "p": [], + "u": 3 + }, + { + "a": [ + 3265, + 3300, + 2302 + ], + "i": 3301, + "o": 26, + "p": [], + "u": 3 + }, + { + "a": [ + 2266, + 2326 + ], + "i": 3302, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 2234, + 2326 + ], + "i": 3304, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 3302, + 3304 + ], + "i": 3306, + "o": 4, + "p": [], + "u": 3 + }, + { + "a": [ + 2216 + ], + "i": 3307, + "o": 21, + "p": [ + 2, + 0 + ], + "u": 3 + }, + { + "a": [ + 2216 + ], + "i": 3309, + "o": 21, + "p": [ + 2, + 0 + ], + "u": 3 + }, + { + "a": [ + 2302, + 3309 + ], + "i": 3311, + "o": 18, + "p": [], + "u": 3 + }, + { + "a": [ + 2216, + 2877 + ], + "i": 3313, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 2258, + 2881 + ], + "i": 3315, + "o": 11, + "p": [], + "u": 3 + }, + { + "a": [ + 3313, + 3315, + 2258 + ], + "i": 3316, + "o": 26, + "p": [], + "u": 3 + }, + { + "a": [ + 3311, + 3316 + ], + "i": 3317, + "o": 11, + "p": [], + "u": 3 + }, + { + "a": [ + 2302, + 3307, + 3317 + ], + "i": 3318, + "o": 19, + "p": [], + "u": 3 + }, + { + "a": [ + 2266, + 2326 + ], + "i": 3319, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 2234, + 2557 + ], + "i": 3321, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 3319, + 3321 + ], + "i": 3323, + "o": 4, + "p": [], + "u": 3 + }, + { + "a": [ + 2266, + 2326 + ], + "i": 3324, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 2234, + 2568 + ], + "i": 3326, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 3324, + 3326 + ], + "i": 3328, + "o": 4, + "p": [], + "u": 3 + }, + { + "a": [ + 3328, + 2302, + 2302 + ], + "i": 3329, + "o": 26, + "p": [], + "u": 3 + }, + { + "a": [ + 3323, + 2302, + 3329 + ], + "i": 3330, + "o": 26, + "p": [], + "u": 3 + }, + { + "a": [ + 3306, + 3318, + 3330 + ], + "i": 3331, + "o": 26, + "p": [], + "u": 3 + }, + { + "a": [ + 3264, + 3301, + 3331 + ], + "i": 3332, + "o": 26, + "p": [], + "u": 3 + }, + { + "a": [ + 2266, + 2326 + ], + "i": 3342, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 2234, + 2526 + ], + "i": 3344, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 3342, + 3344 + ], + "i": 3346, + "o": 4, + "p": [], + "u": 3 + }, + { + "a": [ + 2266, + 2326 + ], + "i": 3347, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 2234, + 2326 + ], + "i": 3349, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 3347, + 3349 + ], + "i": 3351, + "o": 4, + "p": [], + "u": 3 + }, + { + "a": [ + 2266, + 2326 + ], + "i": 3352, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 2234, + 2557 + ], + "i": 3354, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 3352, + 3354 + ], + "i": 3356, + "o": 4, + "p": [], + "u": 3 + }, + { + "a": [ + 2266, + 2326 + ], + "i": 3357, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 2234, + 2568 + ], + "i": 3359, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 3357, + 3359 + ], + "i": 3361, + "o": 4, + "p": [], + "u": 3 + }, + { + "a": [ + 2216, + 2533 + ], + "i": 3362, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 2270, + 2632 + ], + "i": 3364, + "o": 10, + "p": [], + "u": 3 + }, + { + "a": [ + 3364, + 86 + ], + "i": 3365, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 3364, + 2640 + ], + "i": 3368, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 3364, + 2640 + ], + "i": 3370, + "o": 17, + "p": [], + "u": 3 + }, + { + "a": [ + 3368, + 3370 + ], + "i": 3372, + "o": 5, + "p": [], + "u": 3 + }, + { + "a": [ + 3365, + 3372 + ], + "i": 3373, + "o": 5, + "p": [], + "u": 3 + }, + { + "a": [ + 3362, + 3373 + ], + "i": 3374, + "o": 4, + "p": [], + "u": 3 + }, + { + "a": [ + 2270, + 2216 + ], + "i": 3375, + "o": 10, + "p": [], + "u": 3 + }, + { + "a": [ + 3375 + ], + "i": 3376, + "o": 21, + "p": [ + 8, + 0 + ], + "u": 3 + }, + { + "a": [ + 2216 + ], + "i": 3378, + "o": 21, + "p": [ + 2, + 0 + ], + "u": 3 + }, + { + "a": [ + 2296, + 3378 + ], + "i": 3380, + "o": 18, + "p": [], + "u": 3 + }, + { + "a": [ + 3380, + 2248 + ], + "f": 2312, + "i": 3382, + "o": 24, + "p": [], + "u": 3 + }, + { + "a": [], + "f": 2314, + "i": 3383, + "o": 24, + "p": [], + "u": 3 + }, + { + "a": [ + 3382, + 3383 + ], + "i": 3384, + "o": 17, + "p": [], + "u": 3 + }, + { + "a": [ + 3384, + 3176, + 2405 + ], + "i": 3386, + "o": 26, + "p": [], + "u": 3 + }, + { + "a": [ + 2306, + 3376, + 3386 + ], + "i": 3387, + "o": 19, + "p": [], + "u": 3 + }, + { + "a": [ + 86 + ], + "i": 3388, + "o": 21, + "p": [ + 8, + 0 + ], + "u": 3 + }, + { + "a": [ + 3387, + 3388, + 3176 + ], + "i": 3390, + "o": 19, + "p": [], + "u": 3 + }, + { + "a": [ + 3374, + 3390, + 3387 + ], + "i": 3391, + "o": 26, + "p": [], + "u": 3 + }, + { + "a": [ + 3361, + 3391, + 2306 + ], + "i": 3392, + "o": 26, + "p": [], + "u": 3 + }, + { + "a": [ + 3356, + 2306, + 3392 + ], + "i": 3393, + "o": 26, + "p": [], + "u": 3 + }, + { + "a": [ + 3351, + 2306, + 3393 + ], + "i": 3394, + "o": 26, + "p": [], + "u": 3 + }, + { + "a": [ + 3346, + 2306, + 3394 + ], + "i": 3395, + "o": 26, + "p": [], + "u": 3 + }, + { + "i": 2331, + "s": { + "u": 2, + "w": 4 + }, + "u": 2, + "v": { + "v": 2 + } + }, + { + "a": [ + 2266, + 2331 + ], + "i": 2333, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 2252, + 66 + ], + "i": 2342, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 2270, + 86 + ], + "i": 2344, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 2342, + 2344 + ], + "i": 2346, + "o": 4, + "p": [], + "u": 3 + }, + { + "i": 2347, + "s": { + "u": 2, + "w": 16 + }, + "u": 2, + "v": { + "v": 1 + } + }, + { + "a": [ + 82, + 2347 + ], + "i": 2349, + "o": 11, + "p": [], + "u": 3 + }, + { + "a": [ + 390, + 2349 + ], + "i": 2350, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 396, + 70 + ], + "i": 2352, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 2352 + ], + "i": 2354, + "o": 2, + "p": [], + "u": 3 + }, + { + "a": [ + 2350, + 2354 + ], + "i": 2355, + "o": 4, + "p": [], + "u": 3 + }, + { + "i": 2358, + "s": { + "u": 2, + "w": 16 + }, + "u": 2, + "v": { + "v": 1 + } + }, + { + "a": [ + 390, + 2358 + ], + "i": 2360, + "o": 10, + "p": [], + "u": 3 + }, + { + "a": [ + 2355, + 2356, + 2360 + ], + "i": 2361, + "o": 26, + "p": [], + "u": 3 + }, + { + "a": [ + 2346, + 2361, + 390 + ], + "i": 2362, + "o": 26, + "p": [], + "u": 3 + }, + { + "a": [ + 2252, + 66 + ], + "i": 2372, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 2270, + 86 + ], + "i": 2374, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 2372, + 2374 + ], + "i": 2376, + "o": 4, + "p": [], + "u": 3 + }, + { + "i": 2377, + "s": { + "u": 2, + "w": 16 + }, + "u": 2, + "v": { + "v": 1 + } + }, + { + "a": [ + 82, + 2377 + ], + "i": 2379, + "o": 11, + "p": [], + "u": 3 + }, + { + "a": [ + 390, + 2379 + ], + "i": 2380, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 2376, + 2380 + ], + "i": 2382, + "o": 4, + "p": [], + "u": 3 + }, + { + "a": [ + 396, + 70 + ], + "i": 2383, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 2383 + ], + "i": 2385, + "o": 2, + "p": [], + "u": 3 + }, + { + "a": [ + 2382, + 2385 + ], + "i": 2386, + "o": 4, + "p": [], + "u": 3 + }, + { + "i": 2387, + "s": { + "u": 2, + "w": 16 + }, + "u": 2, + "v": { + "v": 1 + } + }, + { + "a": [ + 396, + 2387 + ], + "i": 2389, + "o": 10, + "p": [], + "u": 3 + }, + { + "a": [ + 2386, + 2389, + 396 + ], + "i": 2390, + "o": 26, + "p": [], + "u": 3 + }, + { + "a": [ + 2252, + 66 + ], + "i": 2400, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 2270, + 86 + ], + "i": 2402, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 2400, + 2402 + ], + "i": 2404, + "o": 4, + "p": [], + "u": 3 + }, + { + "a": [ + 2404, + 2405, + 424 + ], + "i": 2407, + "o": 26, + "p": [], + "u": 3 + }, + { + "a": [ + 2252, + 66 + ], + "i": 2417, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 2270, + 86 + ], + "i": 2419, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 2417, + 2419 + ], + "i": 2421, + "o": 4, + "p": [], + "u": 3 + }, + { + "i": 2422, + "s": { + "u": 2, + "w": 4 + }, + "u": 2, + "v": { + "v": 0 + } + }, + { + "a": [ + 2421, + 2422, + 428 + ], + "i": 2424, + "o": 26, + "p": [], + "u": 3 + }, + { + "i": 2434, + "s": { + "u": 2, + "w": 16 + }, + "u": 2, + "v": { + "v": 101 + } + }, + { + "a": [ + 2434, + 2270 + ], + "i": 2436, + "o": 12, + "p": [], + "u": 3 + }, + { + "a": [ + 2436, + 2252 + ], + "i": 2437, + "o": 10, + "p": [], + "u": 3 + }, + { + "i": 2438, + "s": { + "u": 2, + "w": 16 + }, + "u": 2, + "v": { + "v": 101 + } + }, + { + "a": [ + 2438, + 2270 + ], + "i": 2440, + "o": 12, + "p": [], + "u": 3 + }, + { + "a": [ + 2440, + 2252 + ], + "i": 2441, + "o": 10, + "p": [], + "u": 3 + }, + { + "a": [ + 2292, + 2441 + ], + "i": 2442, + "o": 18, + "p": [], + "u": 3 + }, + { + "i": 2444, + "s": { + "u": 2, + "w": 1 + }, + "u": 2, + "v": { + "v": 0 + } + }, + { + "a": [ + 2442, + 2444 + ], + "i": 2446, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 2446 + ], + "i": 2448, + "o": 2, + "p": [], + "u": 3 + }, + { + "a": [ + 2252 + ], + "i": 2449, + "o": 21, + "p": [ + 6, + 0 + ], + "u": 3 + }, + { + "a": [ + 2288, + 2449 + ], + "i": 2451, + "o": 18, + "p": [], + "u": 3 + }, + { + "a": [ + 2451, + 2444 + ], + "i": 2455, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 2455 + ], + "i": 2457, + "o": 2, + "p": [], + "u": 3 + }, + { + "a": [ + 2270 + ], + "i": 2458, + "o": 21, + "p": [ + 8, + 0 + ], + "u": 3 + }, + { + "a": [ + 2306, + 2458 + ], + "i": 2460, + "o": 18, + "p": [], + "u": 3 + }, + { + "a": [ + 2460, + 2444 + ], + "i": 2464, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 2464 + ], + "i": 2466, + "o": 2, + "p": [], + "u": 3 + }, + { + "a": [ + 2457, + 2466 + ], + "i": 2467, + "o": 4, + "p": [], + "u": 3 + }, + { + "a": [ + 2467 + ], + "i": 2468, + "o": 2, + "p": [], + "u": 3 + }, + { + "a": [ + 2448, + 2468 + ], + "i": 2469, + "o": 4, + "p": [], + "u": 3 + }, + { + "i": 2470, + "s": { + "u": 2, + "w": 16 + }, + "u": 2, + "v": { + "v": 101 + } + }, + { + "a": [ + 2470, + 2270 + ], + "i": 2472, + "o": 12, + "p": [], + "u": 3 + }, + { + "a": [ + 2472, + 2252 + ], + "i": 2473, + "o": 10, + "p": [], + "u": 3 + }, + { + "a": [ + 442, + 2473 + ], + "i": 2474, + "o": 18, + "p": [], + "u": 3 + }, + { + "i": 2476, + "s": { + "u": 2, + "w": 8 + }, + "u": 2, + "v": { + "v": 1 + } + }, + { + "a": [ + 2474, + 2476 + ], + "i": 2478, + "o": 10, + "p": [], + "u": 3 + }, + { + "a": [ + 2438, + 2270 + ], + "i": 2479, + "o": 12, + "p": [], + "u": 3 + }, + { + "a": [ + 2479, + 2252 + ], + "i": 2480, + "o": 10, + "p": [], + "u": 3 + }, + { + "a": [ + 2292, + 2480 + ], + "i": 2481, + "o": 18, + "p": [], + "u": 3 + }, + { + "a": [ + 2481, + 2444 + ], + "i": 2483, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 2483 + ], + "i": 2485, + "o": 2, + "p": [], + "u": 3 + }, + { + "a": [ + 2485 + ], + "i": 2486, + "o": 2, + "p": [], + "u": 3 + }, + { + "a": [ + 2252 + ], + "i": 2487, + "o": 21, + "p": [ + 6, + 0 + ], + "u": 3 + }, + { + "a": [ + 2288, + 2487 + ], + "i": 2489, + "o": 18, + "p": [], + "u": 3 + }, + { + "a": [ + 2489, + 2444 + ], + "i": 2491, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 2491 + ], + "i": 2493, + "o": 2, + "p": [], + "u": 3 + }, + { + "a": [ + 2270 + ], + "i": 2494, + "o": 21, + "p": [ + 8, + 0 + ], + "u": 3 + }, + { + "a": [ + 2306, + 2494 + ], + "i": 2496, + "o": 18, + "p": [], + "u": 3 + }, + { + "a": [ + 2496, + 2444 + ], + "i": 2498, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 2498 + ], + "i": 2500, + "o": 2, + "p": [], + "u": 3 + }, + { + "a": [ + 2493, + 2500 + ], + "i": 2501, + "o": 4, + "p": [], + "u": 3 + }, + { + "a": [ + 2486, + 2501 + ], + "i": 2502, + "o": 4, + "p": [], + "u": 3 + }, + { + "a": [ + 2470, + 2270 + ], + "i": 2503, + "o": 12, + "p": [], + "u": 3 + }, + { + "a": [ + 2503, + 2252 + ], + "i": 2504, + "o": 10, + "p": [], + "u": 3 + }, + { + "a": [ + 442, + 2504 + ], + "i": 2505, + "o": 18, + "p": [], + "u": 3 + }, + { + "i": 2507, + "s": { + "u": 2, + "w": 8 + }, + "u": 2, + "v": { + "v": 1 + } + }, + { + "a": [ + 2505, + 2507 + ], + "i": 2509, + "o": 11, + "p": [], + "u": 3 + }, + { + "a": [ + 2470, + 2270 + ], + "i": 2510, + "o": 12, + "p": [], + "u": 3 + }, + { + "a": [ + 2510, + 2252 + ], + "i": 2511, + "o": 10, + "p": [], + "u": 3 + }, + { + "a": [ + 442, + 2511 + ], + "i": 2512, + "o": 18, + "p": [], + "u": 3 + }, + { + "a": [ + 2502, + 2509, + 2512 + ], + "i": 2514, + "o": 26, + "p": [], + "u": 3 + }, + { + "a": [ + 2469, + 2478, + 2514 + ], + "i": 2515, + "o": 26, + "p": [], + "u": 3 + }, + { + "a": [ + 442, + 2437, + 2515 + ], + "i": 2516, + "o": 19, + "p": [], + "u": 3 + }, + { + "a": [ + 2252, + 66 + ], + "i": 2767, + "o": 13, + "p": [], + "u": 3 + }, + { + "i": 2769, + "s": { + "u": 2, + "w": 16 + }, + "u": 2, + "v": { + "v": 1 + } + }, + { + "a": [ + 2252, + 2769 + ], + "i": 2771, + "o": 10, + "p": [], + "u": 3 + }, + { + "a": [ + 2767, + 2356, + 2771 + ], + "i": 2772, + "o": 26, + "p": [], + "u": 3 + }, + { + "a": [ + 2252, + 66 + ], + "i": 3058, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 2270, + 86 + ], + "i": 3060, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 3058, + 3060 + ], + "i": 3062, + "o": 4, + "p": [], + "u": 3 + }, + { + "i": 3053, + "s": { + "u": 2, + "w": 4 + }, + "u": 2, + "v": { + "v": 2 + } + }, + { + "a": [ + 3062, + 3053, + 3053 + ], + "i": 3063, + "o": 26, + "p": [], + "u": 3 + }, + { + "a": [ + 2252, + 66 + ], + "i": 3114, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 2270, + 86 + ], + "i": 3116, + "o": 13, + "p": [], + "u": 3 + }, + { + "i": 3118, + "s": { + "u": 2, + "w": 16 + }, + "u": 2, + "v": { + "v": 1 + } + }, + { + "a": [ + 2270, + 3118 + ], + "i": 3120, + "o": 10, + "p": [], + "u": 3 + }, + { + "a": [ + 3116, + 2270, + 3120 + ], + "i": 3121, + "o": 26, + "p": [], + "u": 3 + }, + { + "a": [ + 3114, + 3121, + 2270 + ], + "i": 3122, + "o": 26, + "p": [], + "u": 3 + }, + { + "a": [ + 54, + 54 + ], + "i": 3405, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 58, + 2405 + ], + "i": 3407, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 62, + 2405 + ], + "i": 3409, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 66, + 2356 + ], + "i": 3411, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 70, + 2356 + ], + "i": 3413, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 74, + 2356 + ], + "i": 3415, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 78, + 2356 + ], + "i": 3417, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 82, + 2356 + ], + "i": 3419, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 86, + 2356 + ], + "i": 3421, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 90, + 2405 + ], + "i": 3423, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 98, + 98 + ], + "i": 3425, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 102, + 102 + ], + "i": 3427, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 106, + 106 + ], + "i": 3429, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 110, + 2405 + ], + "i": 3431, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 118, + 118 + ], + "i": 3433, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 122, + 122 + ], + "i": 3435, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 126, + 126 + ], + "i": 3437, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 130, + 130 + ], + "i": 3439, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 134, + 134 + ], + "i": 3441, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 390, + 2356 + ], + "i": 3443, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 396, + 2356 + ], + "i": 3445, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 412, + 2405 + ], + "i": 3447, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 424, + 2405 + ], + "i": 3449, + "o": 13, + "p": [], + "u": 3 + }, + { + "i": 3451, + "s": { + "u": 2, + "w": 4 + }, + "u": 2, + "v": { + "v": 0 + } + }, + { + "a": [ + 428, + 3451 + ], + "i": 3453, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 442, + 442 + ], + "i": 3455, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 2216, + 2216 + ], + "i": 3457, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 2234, + 2234 + ], + "i": 3459, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 2248, + 2248 + ], + "i": 3461, + "o": 13, + "p": [], + "u": 3 + }, + { + "i": 3463, + "s": { + "u": 2, + "w": 16 + }, + "u": 2, + "v": { + "v": 0 + } + }, + { + "a": [ + 2252, + 3463 + ], + "i": 3465, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 2258, + 2258 + ], + "i": 3467, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 2262, + 2262 + ], + "i": 3469, + "o": 13, + "p": [], + "u": 3 + }, + { + "i": 3471, + "s": { + "u": 2, + "w": 4 + }, + "u": 2, + "v": { + "v": 0 + } + }, + { + "a": [ + 2266, + 3471 + ], + "i": 3473, + "o": 13, + "p": [], + "u": 3 + }, + { + "i": 3475, + "s": { + "u": 2, + "w": 16 + }, + "u": 2, + "v": { + "v": 0 + } + }, + { + "a": [ + 2270, + 3475 + ], + "i": 3477, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 2288, + 2288 + ], + "i": 3479, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 2292, + 2292 + ], + "i": 3481, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 2296, + 2296 + ], + "i": 3483, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 2302, + 2302 + ], + "i": 3485, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 2306, + 2306 + ], + "i": 3487, + "o": 13, + "p": [], + "u": 3 + }, + { + "i": 3521, + "n": "i", + "s": { + "u": 2, + "w": 16 + }, + "u": 1 + }, + { + "i": 3607, + "s": { + "u": 2, + "w": 1 + }, + "u": 2, + "v": { + "v": 1 + } + }, + { + "a": [ + 94, + 3607 + ], + "i": 3609, + "o": 13, + "p": [], + "u": 3 + }, + { + "i": 3560, + "s": { + "u": 2, + "w": 1 + }, + "u": 2, + "v": { + "v": 1 + } + }, + { + "a": [ + 94, + 3560 + ], + "i": 3562, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 102 + ], + "i": 3565, + "o": 21, + "p": [ + 15, + 0 + ], + "u": 3 + }, + { + "a": [ + 3521, + 3565 + ], + "i": 3567, + "o": 16, + "p": [], + "u": 3 + }, + { + "i": 3569, + "s": { + "u": 2, + "w": 1 + }, + "u": 2, + "v": { + "v": 0 + } + }, + { + "i": 3571, + "s": { + "u": 2, + "w": 1 + }, + "u": 2, + "v": { + "v": 1 + } + }, + { + "a": [ + 3567, + 3569, + 3571 + ], + "i": 3573, + "o": 26, + "p": [], + "u": 3 + }, + { + "a": [ + 102 + ], + "i": 3574, + "o": 21, + "p": [ + 15, + 0 + ], + "u": 3 + }, + { + "a": [ + 3521, + 3574 + ], + "i": 3576, + "o": 16, + "p": [], + "u": 3 + }, + { + "a": [ + 3576, + 94, + 3569 + ], + "i": 3578, + "o": 26, + "p": [], + "u": 3 + }, + { + "a": [ + 102 + ], + "i": 3579, + "o": 21, + "p": [ + 15, + 0 + ], + "u": 3 + }, + { + "a": [ + 3521, + 3579 + ], + "i": 3581, + "o": 16, + "p": [], + "u": 3 + }, + { + "a": [ + 3521 + ], + "i": 3583, + "o": 21, + "p": [ + 8, + 0 + ], + "u": 3 + }, + { + "a": [ + 38 + ], + "i": 3585, + "o": 21, + "p": [ + 7, + 0 + ], + "u": 3 + }, + { + "a": [ + 130, + 3583, + 3585 + ], + "i": 3587, + "o": 19, + "p": [], + "u": 3 + }, + { + "a": [ + 102 + ], + "i": 3588, + "o": 21, + "p": [ + 15, + 0 + ], + "u": 3 + }, + { + "a": [ + 3521, + 3588 + ], + "i": 3590, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 102 + ], + "i": 3592, + "o": 21, + "p": [ + 8, + 0 + ], + "u": 3 + }, + { + "i": 3594, + "s": { + "u": 2, + "w": 8 + }, + "u": 2, + "v": { + "v": 1 + } + }, + { + "a": [ + 130, + 3592, + 3594 + ], + "i": 3596, + "o": 19, + "p": [], + "u": 3 + }, + { + "a": [ + 3590, + 3596, + 130 + ], + "i": 3597, + "o": 26, + "p": [], + "u": 3 + }, + { + "a": [ + 3581, + 3587, + 3597 + ], + "i": 3598, + "o": 26, + "p": [], + "u": 3 + }, + { + "a": [ + 102 + ], + "i": 3599, + "o": 21, + "p": [ + 15, + 0 + ], + "u": 3 + }, + { + "a": [ + 3521, + 3599 + ], + "i": 3601, + "o": 16, + "p": [], + "u": 3 + }, + { + "i": 3603, + "s": { + "u": 2, + "w": 16 + }, + "u": 2, + "v": { + "v": 1 + } + }, + { + "a": [ + 3521, + 3603 + ], + "i": 3605, + "o": 10, + "p": [], + "u": 3 + }, + { + "a": [ + 3601, + 3605, + 3521 + ], + "i": 3606, + "o": 26, + "p": [], + "u": 3 + }, + { + "a": [ + 54, + 54 + ], + "i": 3611, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 58, + 3569 + ], + "i": 3613, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 62, + 3569 + ], + "i": 3615, + "o": 13, + "p": [], + "u": 3 + }, + { + "i": 3617, + "s": { + "u": 2, + "w": 16 + }, + "u": 2, + "v": { + "v": 0 + } + }, + { + "a": [ + 66, + 3617 + ], + "i": 3619, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 70, + 3617 + ], + "i": 3621, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 74, + 3617 + ], + "i": 3623, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 78, + 3617 + ], + "i": 3625, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 82, + 3617 + ], + "i": 3627, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 86, + 3617 + ], + "i": 3629, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 90, + 3569 + ], + "i": 3631, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 94, + 94 + ], + "i": 3633, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 98, + 98 + ], + "i": 3635, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 102, + 102 + ], + "i": 3637, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 106, + 106 + ], + "i": 3639, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 110, + 3569 + ], + "i": 3641, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 118, + 118 + ], + "i": 3643, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 122, + 122 + ], + "i": 3645, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 126, + 126 + ], + "i": 3647, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 130, + 130 + ], + "i": 3649, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 134, + 134 + ], + "i": 3651, + "o": 13, + "p": [], + "u": 3 + }, + { + "i": 3653, + "s": { + "u": 2, + "w": 16 + }, + "u": 2, + "v": { + "v": 1 + } + }, + { + "a": [ + 3521, + 3653 + ], + "i": 3655, + "o": 13, + "p": [], + "u": 3 + }, + { + "i": 3689, + "n": "i", + "s": { + "u": 2, + "w": 16 + }, + "u": 1 + }, + { + "i": 3762, + "s": { + "u": 2, + "w": 1 + }, + "u": 2, + "v": { + "v": 1 + } + }, + { + "a": [ + 114, + 3762 + ], + "i": 3764, + "o": 13, + "p": [], + "u": 3 + }, + { + "i": 3730, + "s": { + "u": 2, + "w": 1 + }, + "u": 2, + "v": { + "v": 1 + } + }, + { + "a": [ + 114, + 3730 + ], + "i": 3732, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 3689 + ], + "i": 3735, + "o": 21, + "p": [ + 6, + 0 + ], + "u": 3 + }, + { + "a": [ + 134, + 3735 + ], + "i": 3737, + "o": 18, + "p": [], + "u": 3 + }, + { + "a": [ + 3737 + ], + "i": 3739, + "o": 22, + "p": [ + 32 + ], + "u": 3 + }, + { + "a": [ + 3689, + 74 + ], + "i": 3741, + "o": 16, + "p": [], + "u": 3 + }, + { + "i": 3743, + "s": { + "u": 2, + "w": 1 + }, + "u": 2, + "v": { + "v": 1 + } + }, + { + "a": [ + 3741, + 110, + 3743 + ], + "i": 3745, + "o": 26, + "p": [], + "u": 3 + }, + { + "a": [ + 3689, + 74 + ], + "i": 3746, + "o": 16, + "p": [], + "u": 3 + }, + { + "i": 3748, + "s": { + "u": 2, + "w": 1 + }, + "u": 2, + "v": { + "v": 0 + } + }, + { + "a": [ + 3746, + 114, + 3748 + ], + "i": 3750, + "o": 26, + "p": [], + "u": 3 + }, + { + "i": 3751, + "s": { + "u": 2, + "w": 16 + }, + "u": 2, + "v": { + "v": 0 + } + }, + { + "a": [ + 3689, + 3751 + ], + "i": 3753, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 3753, + 3748, + 126 + ], + "i": 3755, + "o": 26, + "p": [], + "u": 3 + }, + { + "a": [ + 3689, + 74 + ], + "i": 3756, + "o": 16, + "p": [], + "u": 3 + }, + { + "i": 3758, + "s": { + "u": 2, + "w": 16 + }, + "u": 2, + "v": { + "v": 1 + } + }, + { + "a": [ + 3689, + 3758 + ], + "i": 3760, + "o": 10, + "p": [], + "u": 3 + }, + { + "a": [ + 3756, + 3760, + 3689 + ], + "i": 3761, + "o": 26, + "p": [], + "u": 3 + }, + { + "a": [ + 54, + 54 + ], + "i": 3766, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 58, + 3748 + ], + "i": 3768, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 62, + 3748 + ], + "i": 3770, + "o": 13, + "p": [], + "u": 3 + }, + { + "i": 3772, + "s": { + "u": 2, + "w": 16 + }, + "u": 2, + "v": { + "v": 0 + } + }, + { + "a": [ + 66, + 3772 + ], + "i": 3774, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 70, + 3772 + ], + "i": 3776, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 74, + 3772 + ], + "i": 3778, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 78, + 3772 + ], + "i": 3780, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 82, + 3772 + ], + "i": 3782, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 86, + 3772 + ], + "i": 3784, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 90, + 3748 + ], + "i": 3786, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 94, + 94 + ], + "i": 3788, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 98, + 98 + ], + "i": 3790, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 102, + 102 + ], + "i": 3792, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 106, + 106 + ], + "i": 3794, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 110, + 3748 + ], + "i": 3796, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 114, + 114 + ], + "i": 3798, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 118, + 118 + ], + "i": 3800, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 122, + 122 + ], + "i": 3802, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 126, + 126 + ], + "i": 3804, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 130, + 130 + ], + "i": 3806, + "o": 13, + "p": [], + "u": 3 + }, + { + "a": [ + 134, + 134 + ], + "i": 3808, + "o": 13, + "p": [], + "u": 3 + }, + { + "i": 3810, + "s": { + "u": 2, + "w": 16 + }, + "u": 2, + "v": { + "v": 1 + } + }, + { + "a": [ + 3689, + 3810 + ], + "i": 3812, + "o": 13, + "p": [], + "u": 3 + } + ], + "f": [ + { + "a": [ + { + "u": 2, + "w": 16 + } + ], + "i": 791, + "n": "sigmoid", + "o": { + "u": 2, + "w": 64 + } + }, + { + "a": [ + { + "u": 2, + "w": 32 + }, + { + "u": 2, + "w": 64 + } + ], + "i": 783, + "n": "divide", + "o": { + "u": 2, + "w": 64 + } + }, + { + "a": [ + { + "u": 2, + "w": 32 + }, + { + "u": 2, + "w": 64 + } + ], + "i": 783, + "n": "divide", + "o": { + "u": 2, + "w": 64 + } + }, + { + "a": [ + { + "u": 2, + "w": 16 + } + ], + "i": 794, + "n": "to_int_exp", + "o": { + "u": 2, + "w": 32 + } + }, + { + "a": [ + { + "u": 2, + "w": 16 + } + ], + "i": 794, + "n": "to_int_exp", + "o": { + "u": 2, + "w": 32 + } + }, + { + "a": [ + { + "u": 2, + "w": 32 + } + ], + "i": 788, + "n": "round", + "o": { + "u": 2, + "w": 8 + } + }, + { + "a": [], + "i": 2314, + "n": "rand", + "o": { + "u": 2, + "w": 64 + } + }, + { + "a": [ + { + "u": 2, + "w": 16 + } + ], + "i": 2317, + "n": "sigmoid", + "o": { + "u": 2, + "w": 64 + } + }, + { + "a": [ + { + "u": 2, + "w": 16 + } + ], + "i": 2320, + "n": "to_int_exp", + "o": { + "u": 2, + "w": 32 + } + }, + { + "a": [ + { + "u": 2, + "w": 16 + } + ], + "i": 2320, + "n": "to_int_exp", + "o": { + "u": 2, + "w": 32 + } + }, + { + "a": [ + { + "u": 2, + "w": 32 + }, + { + "u": 2, + "w": 64 + } + ], + "i": 2312, + "n": "divide", + "o": { + "u": 2, + "w": 64 + } + }, + { + "a": [], + "i": 2314, + "n": "rand", + "o": { + "u": 2, + "w": 64 + } + } + ], + "t": { + "c": [ + { + "c": [ + { + "c": [], + "i": [ + 10, + 14, + 18, + 22, + 26, + 30, + 34, + 38, + 42, + 46, + 50 + ], + "init": [ + 2092, + 2094, + 2096, + 2098, + 2100, + 2102, + 2104, + 2106, + 2108, + 2110, + 2112, + 2114, + 2116, + 2118, + 2120, + 2122, + 2124, + 2126, + 2128, + 2130, + 2132, + 2134, + 2136, + 2140, + 2142, + 2144, + 2146, + 2148, + 2150, + 2154, + 2156, + 2158, + 2162, + 2166, + 2168, + 2170, + 2172, + 2174, + 2176, + 2178 + ], + "instr": [ + { + "d": 797, + "n": "I.0", + "u": { + "count": 1054, + "data": 130, + "data_out": 54, + "done": 58, + "edges": 442, + "expectation": 679, + "hidden_unit": 1897, + "index": 390, + "init_done": 62, + "jstate": 1165, + "loop_count": 396, + "num_hidden": 66, + "num_loops": 70, + "num_movies": 74, + "num_testusers": 78, + "num_users": 82, + "num_visible": 86, + "per_v_pc": 1248, + "pow2": 767, + "predict_h_cnt": 1337, + "predict_input_done": 412, + "predict_max": 715, + "predict_result": 981, + "predict_sum": 1554, + "predict_upc": 1637, + "predict_v_cnt": 1699, + "predict_vector": 773, + "prediction": 1772, + "rd_complete": 90, + "rd_granted": 94, + "rd_index": 98, + "rd_length": 102, + "rd_request": 106, + "sumOfpow2": 743, + "train_input_done": 424, + "upc": 428, + "visibleEnergies": 777, + "wr_complete": 110, + "wr_granted": 114, + "wr_index": 118, + "wr_length": 122, + "wr_request": 126 + } + }, + { + "d": 802, + "n": "I.1", + "u": { + "count": 1089, + "data": 130, + "data_out": 54, + "done": 58, + "edges": 442, + "expectation": 1157, + "hidden_unit": 763, + "index": 390, + "init_done": 62, + "jstate": 1231, + "loop_count": 396, + "num_hidden": 66, + "num_loops": 70, + "num_movies": 74, + "num_testusers": 78, + "num_users": 82, + "num_visible": 86, + "per_v_pc": 1318, + "pow2": 1946, + "predict_h_cnt": 1375, + "predict_input_done": 412, + "predict_max": 1508, + "predict_result": 981, + "predict_sum": 1617, + "predict_upc": 1661, + "predict_v_cnt": 1724, + "predict_vector": 1994, + "prediction": 1772, + "rd_complete": 90, + "rd_granted": 94, + "rd_index": 98, + "rd_length": 102, + "rd_request": 106, + "sumOfpow2": 1823, + "train_input_done": 424, + "upc": 428, + "visibleEnergies": 2082, + "wr_complete": 110, + "wr_granted": 114, + "wr_index": 118, + "wr_length": 122, + "wr_request": 126 + } + }, + { + "d": 807, + "n": "I.2", + "u": { + "count": 671, + "data": 130, + "data_out": 54, + "done": 838, + "edges": 442, + "expectation": 679, + "hidden_unit": 763, + "index": 1005, + "init_done": 62, + "jstate": 687, + "loop_count": 396, + "num_hidden": 66, + "num_loops": 70, + "num_movies": 74, + "num_testusers": 78, + "num_users": 82, + "num_visible": 86, + "per_v_pc": 705, + "pow2": 767, + "predict_h_cnt": 709, + "predict_input_done": 1020, + "predict_max": 715, + "predict_result": 981, + "predict_sum": 719, + "predict_upc": 1687, + "predict_v_cnt": 727, + "predict_vector": 773, + "prediction": 1772, + "rd_complete": 90, + "rd_granted": 94, + "rd_index": 98, + "rd_length": 102, + "rd_request": 106, + "sumOfpow2": 743, + "train_input_done": 424, + "upc": 1048, + "visibleEnergies": 777, + "wr_complete": 879, + "wr_granted": 114, + "wr_index": 118, + "wr_length": 122, + "wr_request": 126 + } + } + ], + "n": "predict", + "s": [ + 54, + 58, + 62, + 66, + 70, + 74, + 78, + 82, + 86, + 90, + 94, + 98, + 102, + 106, + 110, + 114, + 118, + 122, + 126, + 130, + 134, + 390, + 396, + 412, + 424, + 428, + 442, + 671, + 679, + 687, + 705, + 709, + 715, + 719, + 723, + 727, + 731, + 743, + 763, + 767, + 773, + 777 + ], + "v": 2090 + }, + { + "c": [], + "i": [ + 10, + 14, + 18, + 22, + 26, + 30, + 34, + 38, + 42, + 46, + 50 + ], + "init": [ + 3405, + 3407, + 3409, + 3411, + 3413, + 3415, + 3417, + 3419, + 3421, + 3423, + 3425, + 3427, + 3429, + 3431, + 3433, + 3435, + 3437, + 3439, + 3441, + 3443, + 3445, + 3447, + 3449, + 3453, + 3455, + 3457, + 3459, + 3461, + 3465, + 3467, + 3469, + 3473, + 3477, + 3479, + 3481, + 3483, + 3485, + 3487 + ], + "instr": [ + { + "d": 2323, + "n": "I.0", + "u": { + "data": 130, + "data_out": 54, + "done": 58, + "edges": 442, + "hidden_unit": 3184, + "index": 390, + "init_done": 62, + "jstate": 2356, + "loop_count": 396, + "num_hidden": 66, + "num_loops": 70, + "num_movies": 74, + "num_testusers": 78, + "num_users": 82, + "num_visible": 86, + "per_v_pc": 2588, + "pos": 3214, + "pow2": 2296, + "predict_input_done": 412, + "predict_result": 134, + "rd_complete": 90, + "rd_granted": 94, + "rd_index": 98, + "rd_length": 102, + "rd_request": 106, + "sumOfpow2": 2248, + "train_h_cnt": 2722, + "train_input_done": 424, + "train_max": 2258, + "train_sum": 2944, + "train_upc": 3021, + "train_v_cnt": 3075, + "upc": 428, + "visibleEnergies": 2302, + "visible_unit": 2306, + "wr_complete": 110, + "wr_granted": 114, + "wr_index": 118, + "wr_length": 122, + "wr_request": 126 + } + }, + { + "d": 2328, + "n": "I.1", + "u": { + "data": 130, + "data_out": 54, + "done": 58, + "edges": 442, + "hidden_unit": 2288, + "index": 390, + "init_done": 62, + "jstate": 2580, + "loop_count": 396, + "num_hidden": 66, + "num_loops": 70, + "num_movies": 74, + "num_testusers": 78, + "num_users": 82, + "num_visible": 86, + "per_v_pc": 2653, + "pos": 3214, + "pow2": 3250, + "predict_input_done": 412, + "predict_result": 134, + "rd_complete": 90, + "rd_granted": 94, + "rd_index": 98, + "rd_length": 102, + "rd_request": 106, + "sumOfpow2": 2703, + "train_h_cnt": 2754, + "train_input_done": 424, + "train_max": 2898, + "train_sum": 3001, + "train_upc": 3045, + "train_v_cnt": 3100, + "upc": 428, + "visibleEnergies": 3332, + "visible_unit": 3395, + "wr_complete": 110, + "wr_granted": 114, + "wr_index": 118, + "wr_length": 122, + "wr_request": 126 + } + }, + { + "d": 2333, + "n": "I.2", + "u": { + "data": 130, + "data_out": 54, + "done": 58, + "edges": 2516, + "hidden_unit": 2288, + "index": 2362, + "init_done": 62, + "jstate": 2216, + "loop_count": 2390, + "num_hidden": 66, + "num_loops": 70, + "num_movies": 74, + "num_testusers": 78, + "num_users": 82, + "num_visible": 86, + "per_v_pc": 2234, + "pos": 3214, + "pow2": 2296, + "predict_input_done": 412, + "predict_result": 134, + "rd_complete": 90, + "rd_granted": 94, + "rd_index": 98, + "rd_length": 102, + "rd_request": 106, + "sumOfpow2": 2248, + "train_h_cnt": 2772, + "train_input_done": 2407, + "train_max": 2258, + "train_sum": 2262, + "train_upc": 3063, + "train_v_cnt": 3122, + "upc": 2424, + "visibleEnergies": 2302, + "visible_unit": 2306, + "wr_complete": 110, + "wr_granted": 114, + "wr_index": 118, + "wr_length": 122, + "wr_request": 126 + } + } + ], + "n": "train", + "s": [ + 54, + 58, + 62, + 66, + 70, + 74, + 78, + 82, + 86, + 90, + 94, + 98, + 102, + 106, + 110, + 114, + 118, + 122, + 126, + 130, + 134, + 390, + 396, + 412, + 424, + 428, + 442, + 2216, + 2234, + 2248, + 2252, + 2258, + 2262, + 2266, + 2270, + 2288, + 2292, + 2296, + 2302, + 2306 + ], + "v": 3403 + } + ], + "i": [ + 10, + 14, + 18, + 22, + 26, + 30, + 34, + 38, + 42, + 46, + 50 + ], + "init": [ + 589, + 591, + 593, + 597, + 599, + 601, + 603, + 605, + 607, + 609, + 611, + 613, + 615, + 617, + 619, + 621, + 623, + 625, + 627, + 629, + 631, + 633, + 635, + 639, + 641 + ], + "instr": [ + { + "d": 449, + "n": "I.0", + "u": { + "data": 130, + "data_out": 54, + "done": 58, + "edges": 442, + "index": 390, + "init_done": 62, + "loop_count": 396, + "num_hidden": 66, + "num_loops": 70, + "num_movies": 74, + "num_testusers": 78, + "num_users": 82, + "num_visible": 86, + "predict_input_done": 412, + "predict_result": 134, + "rd_complete": 499, + "rd_granted": 94, + "rd_index": 510, + "rd_length": 519, + "rd_request": 523, + "train_input_done": 424, + "upc": 546, + "wr_complete": 110, + "wr_granted": 114, + "wr_index": 118, + "wr_length": 122, + "wr_request": 126 + } + }, + { + "d": 460, + "n": "I.1", + "u": { + "data": 130, + "data_out": 54, + "done": 58, + "edges": 442, + "index": 390, + "init_done": 62, + "loop_count": 396, + "num_hidden": 66, + "num_loops": 70, + "num_movies": 74, + "num_testusers": 78, + "num_users": 82, + "num_visible": 86, + "predict_input_done": 412, + "predict_result": 134, + "rd_complete": 90, + "rd_granted": 94, + "rd_index": 98, + "rd_length": 102, + "rd_request": 106, + "train_input_done": 424, + "upc": 428, + "wr_complete": 110, + "wr_granted": 114, + "wr_index": 118, + "wr_length": 122, + "wr_request": 126 + } + }, + { + "d": 470, + "n": "I.2", + "u": { + "data": 130, + "data_out": 54, + "done": 58, + "edges": 442, + "index": 390, + "init_done": 62, + "loop_count": 396, + "num_hidden": 66, + "num_loops": 70, + "num_movies": 74, + "num_testusers": 78, + "num_users": 82, + "num_visible": 86, + "predict_input_done": 533, + "predict_result": 134, + "rd_complete": 499, + "rd_granted": 94, + "rd_index": 98, + "rd_length": 102, + "rd_request": 106, + "train_input_done": 542, + "upc": 558, + "wr_complete": 110, + "wr_granted": 114, + "wr_index": 118, + "wr_length": 122, + "wr_request": 126 + } + }, + { + "d": 480, + "n": "I.3", + "u": { + "data": 130, + "data_out": 54, + "done": 58, + "edges": 442, + "index": 390, + "init_done": 62, + "loop_count": 396, + "num_hidden": 66, + "num_loops": 70, + "num_movies": 74, + "num_testusers": 78, + "num_users": 82, + "num_visible": 86, + "predict_input_done": 412, + "predict_result": 134, + "rd_complete": 90, + "rd_granted": 94, + "rd_index": 98, + "rd_length": 102, + "rd_request": 106, + "train_input_done": 424, + "upc": 558, + "wr_complete": 110, + "wr_granted": 114, + "wr_index": 118, + "wr_length": 122, + "wr_request": 126 + } + }, + { + "d": 490, + "n": "I.4", + "u": { + "data": 130, + "data_out": 54, + "done": 58, + "edges": 442, + "index": 390, + "init_done": 62, + "loop_count": 396, + "num_hidden": 66, + "num_loops": 70, + "num_movies": 74, + "num_testusers": 78, + "num_users": 82, + "num_visible": 86, + "predict_input_done": 412, + "predict_result": 134, + "rd_complete": 90, + "rd_granted": 94, + "rd_index": 98, + "rd_length": 102, + "rd_request": 106, + "train_input_done": 424, + "upc": 558, + "wr_complete": 110, + "wr_granted": 114, + "wr_index": 118, + "wr_length": 122, + "wr_request": 126 + } + }, + { + "d": 494, + "n": "I.5", + "u": { + "data": 130, + "data_out": 54, + "done": 58, + "edges": 442, + "index": 390, + "init_done": 62, + "loop_count": 396, + "num_hidden": 66, + "num_loops": 70, + "num_movies": 74, + "num_testusers": 78, + "num_users": 82, + "num_visible": 86, + "predict_input_done": 412, + "predict_result": 134, + "rd_complete": 90, + "rd_granted": 94, + "rd_index": 98, + "rd_length": 102, + "rd_request": 106, + "train_input_done": 424, + "upc": 572, + "wr_complete": 110, + "wr_granted": 114, + "wr_index": 118, + "wr_length": 122, + "wr_request": 126 + } + } + ], + "n": "compute", + "s": [ + 54, + 58, + 62, + 66, + 70, + 74, + 78, + 82, + 86, + 90, + 94, + 98, + 102, + 106, + 110, + 114, + 118, + 122, + 126, + 130, + 134, + 390, + 396, + 412, + 424, + 428, + 442 + ], + "v": 588 + }, + { + "c": [], + "i": [ + 10, + 14, + 18, + 22, + 26, + 30, + 34, + 38, + 42, + 46, + 50 + ], + "init": [ + 3611, + 3613, + 3615, + 3619, + 3621, + 3623, + 3625, + 3627, + 3629, + 3631, + 3633, + 3635, + 3637, + 3639, + 3641, + 3643, + 3645, + 3647, + 3649, + 3651, + 3655 + ], + "instr": [ + { + "d": 3562, + "n": "I.0", + "u": { + "data": 3598, + "data_out": 54, + "done": 58, + "i": 3606, + "init_done": 62, + "num_hidden": 66, + "num_loops": 70, + "num_movies": 74, + "num_testusers": 78, + "num_users": 82, + "num_visible": 86, + "predict_result": 134, + "rd_complete": 3573, + "rd_granted": 3578, + "rd_index": 98, + "rd_length": 102, + "rd_request": 3569, + "wr_complete": 110, + "wr_granted": 114, + "wr_index": 118, + "wr_length": 122, + "wr_request": 126 + } + } + ], + "n": "DMAload", + "s": [ + 54, + 58, + 62, + 66, + 70, + 74, + 78, + 82, + 86, + 90, + 94, + 98, + 102, + 106, + 110, + 114, + 118, + 122, + 126, + 130, + 134, + 3521 + ], + "v": 3609 + }, + { + "c": [], + "i": [ + 10, + 14, + 18, + 22, + 26, + 30, + 34, + 38, + 42, + 46, + 50 + ], + "init": [ + 3766, + 3768, + 3770, + 3774, + 3776, + 3778, + 3780, + 3782, + 3784, + 3786, + 3788, + 3790, + 3792, + 3794, + 3796, + 3798, + 3800, + 3802, + 3804, + 3806, + 3808, + 3812 + ], + "instr": [ + { + "d": 3732, + "n": "I.0", + "u": { + "data": 130, + "data_out": 3739, + "done": 58, + "i": 3761, + "init_done": 62, + "num_hidden": 66, + "num_loops": 70, + "num_movies": 74, + "num_testusers": 78, + "num_users": 82, + "num_visible": 86, + "predict_result": 134, + "rd_complete": 90, + "rd_granted": 94, + "rd_index": 98, + "rd_length": 102, + "rd_request": 106, + "wr_complete": 3745, + "wr_granted": 3750, + "wr_index": 118, + "wr_length": 122, + "wr_request": 3755 + } + } + ], + "n": "store", + "s": [ + 54, + 58, + 62, + 66, + 70, + 74, + 78, + 82, + 86, + 90, + 94, + 98, + 102, + 106, + 110, + 114, + 118, + 122, + 126, + 130, + 134, + 3689 + ], + "v": 3764 + } + ], + "i": [ + 10, + 14, + 18, + 22, + 26, + 30, + 34, + 38, + 42, + 46, + 50 + ], + "init": [ + 316, + 318, + 320, + 322, + 324, + 326, + 328, + 330, + 332, + 334, + 336, + 338, + 340, + 342, + 344, + 346, + 348, + 350, + 352, + 354, + 356 + ], + "instr": [ + { + "d": 139, + "n": "I.0", + "u": { + "data": 130, + "data_out": 188, + "done": 58, + "init_done": 191, + "num_hidden": 207, + "num_loops": 207, + "num_movies": 207, + "num_testusers": 207, + "num_users": 207, + "num_visible": 207, + "predict_result": 134, + "rd_complete": 90, + "rd_granted": 94, + "rd_index": 98, + "rd_length": 102, + "rd_request": 106, + "wr_complete": 110, + "wr_granted": 302, + "wr_index": 118, + "wr_length": 122, + "wr_request": 126 + } + }, + { + "d": 155, + "n": "I.1", + "u": { + "data": 130, + "data_out": 188, + "done": 58, + "init_done": 201, + "num_hidden": 217, + "num_loops": 231, + "num_movies": 245, + "num_testusers": 259, + "num_users": 273, + "num_visible": 287, + "predict_result": 134, + "rd_complete": 90, + "rd_granted": 94, + "rd_index": 98, + "rd_length": 102, + "rd_request": 106, + "wr_complete": 110, + "wr_granted": 302, + "wr_index": 118, + "wr_length": 122, + "wr_request": 126 + } + }, + { + "d": 165, + "n": "I.2", + "u": { + "data": 312, + "data_out": 188, + "done": 58, + "init_done": 62, + "num_hidden": 66, + "num_loops": 70, + "num_movies": 74, + "num_testusers": 78, + "num_users": 82, + "num_visible": 86, + "predict_result": 134, + "rd_complete": 90, + "rd_granted": 201, + "rd_index": 98, + "rd_length": 102, + "rd_request": 106, + "wr_complete": 110, + "wr_granted": 302, + "wr_index": 118, + "wr_length": 122, + "wr_request": 126 + } + }, + { + "d": 175, + "n": "I.3", + "u": { + "data": 130, + "data_out": 188, + "done": 58, + "init_done": 62, + "num_hidden": 66, + "num_loops": 70, + "num_movies": 74, + "num_testusers": 78, + "num_users": 82, + "num_visible": 86, + "predict_result": 134, + "rd_complete": 90, + "rd_granted": 94, + "rd_index": 98, + "rd_length": 102, + "rd_request": 106, + "wr_complete": 110, + "wr_granted": 302, + "wr_index": 118, + "wr_length": 122, + "wr_request": 126 + } + } + ], + "n": "rbm", + "s": [ + 54, + 58, + 62, + 66, + 70, + 74, + 78, + 82, + 86, + 90, + 94, + 98, + 102, + 106, + 110, + 114, + 118, + 122, + 126, + 130, + 134 + ], + "v": 314 + } +} \ No newline at end of file From 0e0807d3cc95f808a7b1a96d52a82c436bf9c966 Mon Sep 17 00:00:00 2001 From: Bo-Yuan Huang Date: Sat, 16 Mar 2019 20:58:37 -0400 Subject: [PATCH 10/21] Avoid deleted stream declartion --- include/ilang/portable/interface.h | 4 +++- src/portable/interface.cc | 14 ++++++++------ 2 files changed, 11 insertions(+), 7 deletions(-) diff --git a/include/ilang/portable/interface.h b/include/ilang/portable/interface.h index 8ec057154..4db4e2be1 100644 --- a/include/ilang/portable/interface.h +++ b/include/ilang/portable/interface.h @@ -30,8 +30,10 @@ class IlaSerDesMngr { /// \brief Serialize the ILA model to the given file. /// \param[in] m the ILA model to serialize. /// \param[in] file_name the output file name. + /// \param[in] indent the number of space to indent. /// \return Return true if complete sucessfully. - static bool SerToFile(const InstrLvlAbsPtr& m, const std::string& file_name); + static bool SerToFile(const InstrLvlAbsPtr& m, const std::string& file_name, + const int& indent = -1); /// \brief Deserialize the ILA model from the given file. /// \param[in] file_name the input file name. diff --git a/src/portable/interface.cc b/src/portable/interface.cc index e870efbf2..4c18db576 100644 --- a/src/portable/interface.cc +++ b/src/portable/interface.cc @@ -21,13 +21,16 @@ InstrLvlAbsPtr IlaSerDesMngr::Deserialize(const json& j) { } bool IlaSerDesMngr::SerToFile(const InstrLvlAbsPtr& m, - const std::string& file_name) { - auto fout = std::ofstream(); - fout.open(file_name); + const std::string& file_name, const int& indent) { + std::ofstream fout(file_name); if (fout.is_open()) { auto j_ila = Serialize(m); - fout << j_ila.dump(2); + if (indent == -1) { + fout << j_ila.dump(); + } else { + fout << j_ila.dump(indent); + } } fout.close(); @@ -35,8 +38,7 @@ bool IlaSerDesMngr::SerToFile(const InstrLvlAbsPtr& m, } InstrLvlAbsPtr IlaSerDesMngr::DesFromFile(const std::string& file_name) { - auto fin = std::ifstream(); - fin.open(file_name); + std::ifstream fin(file_name); if (fin.is_open()) { auto j_ila = json::object(); From 6c00be4e84d174c36aa1fb65366fddd84d862ec4 Mon Sep 17 00:00:00 2001 From: Bo-Yuan Huang Date: Sun, 21 Apr 2019 01:39:54 +0000 Subject: [PATCH 11/21] Add space --- src/ila/instr_lvl_abs.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ila/instr_lvl_abs.cc b/src/ila/instr_lvl_abs.cc index 60c968b19..e219daf73 100644 --- a/src/ila/instr_lvl_abs.cc +++ b/src/ila/instr_lvl_abs.cc @@ -89,7 +89,7 @@ void InstrLvlAbs::AddState(const ExprPtr state_var) { auto poss = states_.find(name); auto posi = inputs_.find(name); ILA_ASSERT(poss == states_.end() && posi == inputs_.end()) - << "State variable " << state_var << "has been declared."; + << "State variable " << state_var << " has been declared."; // register to the simplifier auto var = Unify(state_var); // register to States From b4560df5e59e58fd34d9f8ecfc9e8d986372bcf5 Mon Sep 17 00:00:00 2001 From: Bo-Yuan Huang Date: Wed, 24 Apr 2019 20:10:18 -0400 Subject: [PATCH 12/21] Fix typo --- src/ila/expr_fuse.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ila/expr_fuse.cc b/src/ila/expr_fuse.cc index 122906efe..4011df0e1 100644 --- a/src/ila/expr_fuse.cc +++ b/src/ila/expr_fuse.cc @@ -297,7 +297,7 @@ ExprPtr ExprFuse::Concat(const ExprPtr hi, const ExprPtr lo) { auto const_zero = ExprFuse::BvConst(0x0, 1); auto const_one = ExprFuse::BvConst(0x1, 1); auto bv_hi = hi->is_bool() ? ExprFuse::Ite(hi, const_one, const_zero) : hi; - auto bv_lo = hi->is_bool() ? ExprFuse::Ite(lo, const_one, const_zero) : lo; + auto bv_lo = lo->is_bool() ? ExprFuse::Ite(lo, const_one, const_zero) : lo; return std::make_shared(bv_hi, bv_lo); } From 2c4bc77a89882f50920ec88c8f94ebff37169d24 Mon Sep 17 00:00:00 2001 From: Bo-Yuan Huang Date: Sat, 27 Apr 2019 13:37:15 -0400 Subject: [PATCH 13/21] Add memory size as paramter --- include/ilang/ila/expr_fuse.h | 5 +++++ src/ila/expr_fuse.cc | 21 +++++++++++++++++++++ test/t_expr_fuse.cc | 14 ++++++++++++++ 3 files changed, 40 insertions(+) diff --git a/include/ilang/ila/expr_fuse.h b/include/ilang/ila/expr_fuse.h index 1a1ae2354..f7b63c7d0 100644 --- a/include/ilang/ila/expr_fuse.h +++ b/include/ilang/ila/expr_fuse.h @@ -165,6 +165,11 @@ ExprPtr Load(const ExprPtr mem, const int& addr); /// Memory store to constant address and data ExprPtr Store(const ExprPtr mem, const int& addr, const int& data); +/// Set memory size. +bool SetMemSize(const ExprPtr mem, const int& size = 0); +/// Get memory size. +int GetMemSize(const ExprPtr mem); + /******************************************************************************/ // Bit manipulation /******************************************************************************/ diff --git a/src/ila/expr_fuse.cc b/src/ila/expr_fuse.cc index 4011df0e1..af1165fdd 100644 --- a/src/ila/expr_fuse.cc +++ b/src/ila/expr_fuse.cc @@ -293,6 +293,27 @@ ExprPtr ExprFuse::Store(const ExprPtr mem, const int& addr, const int& data) { return ExprFuse::Store(mem, ac, dc); } +bool ExprFuse::SetMemSize(const ExprPtr mem, const int& size) { + ILA_ASSERT(size > 0) << "Setting non-positive memory size " << size; + + if (mem->param_num() != 0) { + ILA_WARN << "Overwriting original paramters of " << mem; + return false; + } + + mem->set_params({size}); + return true; +} + +int ExprFuse::GetMemSize(const ExprPtr mem) { + if (mem->param_num() == 0) { + return 0; + } else { + ILA_ASSERT(mem->param_num() == 1) << "Unrecognized memory parameter set"; + return mem->param(0); + } +} + ExprPtr ExprFuse::Concat(const ExprPtr hi, const ExprPtr lo) { auto const_zero = ExprFuse::BvConst(0x0, 1); auto const_one = ExprFuse::BvConst(0x1, 1); diff --git a/test/t_expr_fuse.cc b/test/t_expr_fuse.cc index b50187d56..7092c2874 100644 --- a/test/t_expr_fuse.cc +++ b/test/t_expr_fuse.cc @@ -321,4 +321,18 @@ TEST(TestExprFuse, TopEq) { EXPECT_FALSE(TopEq(c, g)); } +TEST(TestExprFuse, MemSize) { + auto mem = NewMemVar("mem", 8, 8); + + EXPECT_EQ(0, GetMemSize(mem)); + +#ifndef NDEBUG + EXPECT_DEATH(SetMemSize(mem, -1), ".*"); +#endif + EXPECT_TRUE(SetMemSize(mem, 8)); + EXPECT_FALSE(SetMemSize(mem, 16)); + + EXPECT_EQ(8, GetMemSize(mem)); +} + } // namespace ilang From dc5591eff27e25eda33465cf801f9b1336469a08 Mon Sep 17 00:00:00 2001 From: Bo-Yuan Huang Date: Sat, 27 Apr 2019 14:18:27 -0400 Subject: [PATCH 14/21] Check setting/getting memory size from mem var --- src/ila/expr_fuse.cc | 2 ++ test/t_expr_fuse.cc | 6 ++++++ 2 files changed, 8 insertions(+) diff --git a/src/ila/expr_fuse.cc b/src/ila/expr_fuse.cc index af1165fdd..7897ed4d4 100644 --- a/src/ila/expr_fuse.cc +++ b/src/ila/expr_fuse.cc @@ -294,6 +294,7 @@ ExprPtr ExprFuse::Store(const ExprPtr mem, const int& addr, const int& data) { } bool ExprFuse::SetMemSize(const ExprPtr mem, const int& size) { + ILA_ASSERT(mem->is_mem()) << "Set size to non-memory variable " << mem; ILA_ASSERT(size > 0) << "Setting non-positive memory size " << size; if (mem->param_num() != 0) { @@ -306,6 +307,7 @@ bool ExprFuse::SetMemSize(const ExprPtr mem, const int& size) { } int ExprFuse::GetMemSize(const ExprPtr mem) { + ILA_ASSERT(mem->is_mem()) << "Get size from non-memory variable " << mem; if (mem->param_num() == 0) { return 0; } else { diff --git a/test/t_expr_fuse.cc b/test/t_expr_fuse.cc index 7092c2874..67b77adc8 100644 --- a/test/t_expr_fuse.cc +++ b/test/t_expr_fuse.cc @@ -333,6 +333,12 @@ TEST(TestExprFuse, MemSize) { EXPECT_FALSE(SetMemSize(mem, 16)); EXPECT_EQ(8, GetMemSize(mem)); + + auto bl = NewBoolVar("bl"); +#ifndef NDEBUG + EXPECT_DEATH(SetMemSize(bl, 2), ".*"); + EXPECT_DEATH(GetMemSize(bl), ".*"); +#endif } } // namespace ilang From 53d0734492100ad83fa39634cd5a085009969d8a Mon Sep 17 00:00:00 2001 From: Bo-Yuan Huang Date: Sat, 27 Apr 2019 14:18:54 -0400 Subject: [PATCH 15/21] Expose memory entry number to C++ API --- include/ilang/ilang++.h | 5 +++++ src/ilang++.cc | 10 ++++++++++ test/t_api.cc | 22 ++++++++++++++++++++++ 3 files changed, 37 insertions(+) diff --git a/include/ilang/ilang++.h b/include/ilang/ilang++.h index e851f7dfe..c2758acac 100644 --- a/include/ilang/ilang++.h +++ b/include/ilang/ilang++.h @@ -137,6 +137,11 @@ class ExprRef { /// \brief Replace the original argument (must exist) with the new argument. void ReplaceArg(const ExprRef& org_arg, const ExprRef& new_arg); + /// \brief Set the entry number of the memory (size regardless of bit-width). + bool SetEntryNum(const int& num); + /// \brief GEt the entry number of the memory (size regardless of bit-width). + int GetEntryNum(); + }; // class ExprRef /******************************************************************************/ diff --git a/src/ilang++.cc b/src/ilang++.cc index 10f3ece25..1fda2aed8 100644 --- a/src/ilang++.cc +++ b/src/ilang++.cc @@ -111,6 +111,16 @@ void ExprRef::ReplaceArg(const ExprRef& org_arg, const ExprRef& new_arg) { get()->replace_arg(org_arg.get(), new_arg.get()); } +bool ExprRef::SetEntryNum(const int& num) { + auto res = ExprFuse::SetMemSize(get(), num); + return res; +} + +int ExprRef::GetEntryNum() { + auto num = ExprFuse::GetMemSize(get()); + return num; +} + ExprRef operator-(const ExprRef& a) { auto v = ExprFuse::Negate(a.get()); return ExprRef(v); diff --git a/test/t_api.cc b/test/t_api.cc index 2163bad78..d031b83f9 100644 --- a/test/t_api.cc +++ b/test/t_api.cc @@ -279,6 +279,28 @@ TEST(TestApi, ReplaceArg) { EXPECT_TRUE(TopEqual(x, y)); } +TEST(TestApi, EntryNum) { + Ila ila("hots"); + + auto mem = ila.NewMemState("mem", 16, 32); + + EXPECT_EQ(0, mem.GetEntryNum()); + +#ifndef NDEBUG + EXPECT_DEATH(mem.SetEntryNum(-1), ".*"); +#endif + EXPECT_TRUE(mem.SetEntryNum(8)); + EXPECT_FALSE(mem.SetEntryNum(16)); + EXPECT_EQ(8, mem.GetEntryNum()); + + auto bl = ila.NewBoolState("bl"); + +#ifndef NDEBUG + EXPECT_DEATH(bl.SetEntryNum(8), ".*"); + EXPECT_DEATH(bl.GetEntryNum(), ".*"); +#endif +} + TEST(TestApi, Unroll) { z3::context c; auto unroller = IlaZ3Unroller(c); From 50542330b2e997fc950c08e2917e2f048b309693 Mon Sep 17 00:00:00 2001 From: Bo-Yuan Huang Date: Sat, 11 May 2019 02:06:09 -0400 Subject: [PATCH 16/21] Support type conversion of "equal" op --- src/ila/expr_fuse.cc | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/ila/expr_fuse.cc b/src/ila/expr_fuse.cc index 7897ed4d4..713bc86f4 100644 --- a/src/ila/expr_fuse.cc +++ b/src/ila/expr_fuse.cc @@ -224,7 +224,8 @@ ExprPtr ExprFuse::Eq(const ExprPtr l, const bool& r) { } ExprPtr ExprFuse::Eq(const ExprPtr l, const int& r) { - auto rc = ExprFuse::BvConst(r, l->sort()->bit_width()); + auto rc = (l->is_bool()) ? ExprFuse::BoolConst(r == 1) + : ExprFuse::BvConst(r, l->sort()->bit_width()); return ExprFuse::Eq(l, rc); } From c2f0c7ed14891148abf64851b88ea759d1bd0a84 Mon Sep 17 00:00:00 2001 From: Bo-Yuan Huang Date: Mon, 13 May 2019 21:49:11 -0400 Subject: [PATCH 17/21] Support type conversion of "not equal" op --- src/ila/expr_fuse.cc | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/ila/expr_fuse.cc b/src/ila/expr_fuse.cc index 713bc86f4..8c651373d 100644 --- a/src/ila/expr_fuse.cc +++ b/src/ila/expr_fuse.cc @@ -230,7 +230,8 @@ ExprPtr ExprFuse::Eq(const ExprPtr l, const int& r) { } ExprPtr ExprFuse::Ne(const ExprPtr l, const int& r) { - auto rc = ExprFuse::BvConst(r, l->sort()->bit_width()); + auto rc = (l->is_bool()) ? ExprFuse::BoolConst(r == 1) + : ExprFuse::BvConst(r, l->sort()->bit_width()); return ExprFuse::Ne(l, rc); } From b2a2c1666cd17e90e605b856813f9a1a870a6c45 Mon Sep 17 00:00:00 2001 From: Bo-Yuan Huang Date: Mon, 13 May 2019 22:06:23 -0400 Subject: [PATCH 18/21] update vlog parser for pic feature --- extern/vlog-parser | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extern/vlog-parser b/extern/vlog-parser index a02945912..6d4029f2d 160000 --- a/extern/vlog-parser +++ b/extern/vlog-parser @@ -1 +1 @@ -Subproject commit a02945912f5d4d3d50beca04e091c7bc213b5a20 +Subproject commit 6d4029f2dd8a94335e33b661409632d002138142 From 5889ca3f06753bb379660a1fb97d9cde1df46e83 Mon Sep 17 00:00:00 2001 From: Bo-Yuan Huang Date: Mon, 13 May 2019 22:07:04 -0400 Subject: [PATCH 19/21] Add option for building shared library. Fix #93. --- CMakeLists.txt | 1 + src/CMakeLists.txt | 7 ++++++- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index a61b714b5..73ae58524 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -20,6 +20,7 @@ project(ilang VERSION 0.9.0 # OPTION # build configuration # ---------------------------------------------------------------------------- # +option(ILANG_STATIC "Build static libraries." OFF) option(ILANG_FETCH_DEPS "Fetch source of dependencies at config time." ON) option(ILANG_BUILD_DOCS "Build documentations." OFF) option(ILANG_BUILD_SYNTH "Build the synthesis engine." ON) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 6c7c12a7b..86cf6ac66 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -2,7 +2,12 @@ # TARGET # archive library # ---------------------------------------------------------------------------- # -add_library(${ILANG_LIB_NAME} ilang++.cc) +if(${ILANG_STATIC}) + add_library(${ILANG_LIB_NAME} STATIC ilang++.cc) +else() + add_library(${ILANG_LIB_NAME} SHARED ilang++.cc) +endif() + add_library(${PROJECT_NAME}::${ILANG_LIB_NAME} ALIAS ${ILANG_LIB_NAME}) ## From cc5d3a39f2ddae11228ad64b4dc13e922a8e8aaf Mon Sep 17 00:00:00 2001 From: Bo-Yuan Huang Date: Mon, 13 May 2019 22:16:38 -0400 Subject: [PATCH 20/21] Update license --- LICENSE | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/LICENSE b/LICENSE index 15bc72f8d..9ae5e66a0 100644 --- a/LICENSE +++ b/LICENSE @@ -1,6 +1,6 @@ MIT License -Copyright (c) 2019 +Copyright (c) 2019 Princeton University ILA Team Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal From eb038512170aacf3e2b0f54ca265e7b3ffe5ca75 Mon Sep 17 00:00:00 2001 From: Bo-Yuan Huang Date: Tue, 14 May 2019 01:37:11 -0400 Subject: [PATCH 21/21] Update .lgtm.yml remove a legacy directory and configure the build script for static build --- .lgtm.yml | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/.lgtm.yml b/.lgtm.yml index 7541d25d7..6c2ca7685 100644 --- a/.lgtm.yml +++ b/.lgtm.yml @@ -11,9 +11,8 @@ path_classifiers: script: - scripts - example: + application: - apps - - examples extraction: cpp: @@ -30,7 +29,7 @@ extraction: command: - mkdir -p build - cd build - - cmake .. + - cmake .. -DILANG_STATIC=ON index: build_command: