From c80fae5d1a6b521cc584cc2bb99c9a7f00aebfc5 Mon Sep 17 00:00:00 2001 From: maxschalz <58850267+maxschalz@users.noreply.github.com> Date: Mon, 29 Mar 2021 10:41:49 +0200 Subject: [PATCH 01/18] WIP add GPR reactor files without GPR additions This is a mere backup commit/initial commit adding the GPR archetype files based on cycamore's reactor. However, none of Antonio Figueroa's GPR stuff has been added yet. --- src/CMakeLists.txt | 2 + src/gpr_reactor.cc | 535 +++++++++++++++++++++++++++++++++++++++ src/gpr_reactor.h | 270 ++++++++++++++++++++ src/gpr_reactor_tests.cc | 63 +++++ src/gpr_reactor_tests.h | 22 ++ 5 files changed, 892 insertions(+) create mode 100644 src/gpr_reactor.cc create mode 100644 src/gpr_reactor.h create mode 100644 src/gpr_reactor_tests.cc create mode 100644 src/gpr_reactor_tests.h diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index b70d386..1035e03 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -4,6 +4,8 @@ USE_CYCLUS("misoenrichment" "enrichment_calculator") USE_CYCLUS("misoenrichment" "miso_helper") USE_CYCLUS("misoenrichment" "flexible_input") +USE_CYCLUS("misoenrichment" "gpr_reactor") + INSTALL_CYCLUS_MODULE("misoenrichment" "./") # install header files diff --git a/src/gpr_reactor.cc b/src/gpr_reactor.cc new file mode 100644 index 0000000..c504648 --- /dev/null +++ b/src/gpr_reactor.cc @@ -0,0 +1,535 @@ +#include "gpr_reactor.h" + +#include +#include +#include +#include +#include + +// Future changes relating to the implementation of Antonio's GPRs are marked +// with the following comment: +// TODO ANTONIO GPR + +namespace misoenrichment { + +// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +GprReactor::GprReactor(cyclus::Context* ctx) + : cyclus::Facility(ctx), + in_commods(std::vector()), + out_commods(std::vector()), + in_recipes(std::vector()), + out_recipes(std::vector()), + fuel_prefs(std::vector()), + n_assem_core(0), + n_assem_batch(0), + assem_size(0), + n_assem_fresh(0), + n_assem_spent(0), + latitude(0.), + longitude(0.), + decom_transmute_all(false), + cycle_time(0), + refuel_time(0), + cycle_step(0), + discharged(false), + power_output(0.), + res_indexes(std::map()), + is_hybrid(true), + side_products(std::vector()), + side_product_quantity(std::vector()), + unique_out_commods(std::set()) + {;} + +// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +std::set::Ptr> GprReactor::GetMatlBids( + cyclus::CommodMap::type& commod_requests) { + using cyclus::BidPortfolio; + using cyclus::Material; + + // TODO ensure that if statement below yields true despite initialiser list + // in the class' constructor! + if (unique_out_commods.empty()) { + // TODO delete std::cout statement. + std::cout << "\n\nGprRea: Confirmation that `unique_out_commods` is empty\n"; + for (int i = 0; i < out_commods.size(); ++i) { + unique_out_commods.insert(out_commods[i]); + } + } + + std::set::Ptr> ports; + std::map all_mats; + std::set::iterator it; + // Loop over all out commodities. + for (it = unique_out_commods.begin(); it != unique_out_commods.end(); ++it) { + std::string commod = *it; + std::vector*>& reqs = commod_requests[commod]; + if (reqs.size() == 0) { + continue; + } else { + all_mats = PeekSpent_(); + } + cyclus::toolkit::MatVec mats = all_mats[commod]; + if (mats.size() == 0) { + continue; + } + BidPortfolio::Ptr port(new BidPortfolio()); + // Loop over all requests for the given out commodity. + for (int j = 0; j < reqs.size(); ++j) { + cyclus::Request* req = reqs[j]; + double total_bid = 0; + // Loop over all available material of the given commidity. + for (int k = 0; k < mats.size(); ++k) { + Material::Ptr m = mats[k]; + total_bid += m->quantity(); + port->AddBid(req, m, this, true); + if (total_bid >= req->target()->quantity()) { + break; + } + } + } + double total_qty = 0; + for (int j = 0; j < mats.size(); ++j) { + total_qty += mats[j]->quantity(); + } + cyclus::CapacityConstraint cap_constraint(total_qty); + port->AddConstraint(cap_constraint); + ports.insert(port); + } + return ports; +} + +// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +std::set::Ptr> +GprReactor::GetMatlRequests() { + using cyclus::Material; + using cyclus::Request; + using cyclus::RequestPortfolio; + + std::set::Ptr> ports; + Material::Ptr m; + + int n_assem_order = n_assem_core - core.count() + + n_assem_fresh - fresh_inv.count(); + // This if clause accounts for the fact that less assemblies may be needed if + // the reactor retirement is near. + if (exit_time() != -1) { + // The '+ 1' accounts for the fact that the reactor is online and gets to + // operate during its exit_time timestep. + int time_left = exit_time() - context()->time() + 1; + int time_left_cycle = cycle_time + refuel_time - cycle_step; + double n_cycles_left = static_cast(time_left - time_left_cycle) + / static_cast(cycle_time + refuel_time); + n_cycles_left = std::ceil(n_cycles_left); + int n_needed = std::max(0.0, n_cycles_left*n_assem_batch - n_assem_fresh + + n_assem_core - core.count()); + n_assem_order = std::min(n_assem_order, n_needed); + } + + if (n_assem_order == 0 || Retired_()) { + return ports; + } + + // Make a request for each assembly. + for (int i = 0; i < n_assem_order; ++i) { + RequestPortfolio::Ptr port(new RequestPortfolio()); + std::vector*> mutual_reqs; + // Make mutual requests for each fuel incommod. + for (int j = 0; j < in_commods.size(); ++j) { + std::string commod = in_commods[j]; + double pref = fuel_prefs[j]; + cyclus::Composition::Ptr recipe = context()->GetRecipe(in_recipes[j]); + m = Material::CreateUntracked(assem_size, recipe); + + Request* r = port->AddRequest(m, this, commod, pref, true); + mutual_reqs.push_back(r); + } + std::vector::iterator result; + result = std::max_element(fuel_prefs.begin(), fuel_prefs.end()); + int max_index = std::distance(fuel_prefs.begin(), result); + + cyclus::toolkit::RecordTimeSeries("demand" + in_commods[max_index], + this, assem_size*n_assem_order); + port->AddMutualReqs(mutual_reqs); + ports.insert(port); + } + return ports; +} + +// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +std::string GprReactor::str() { return cyclus::Facility::str(); } + +// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +void GprReactor::AcceptMatlTrades( + const std::vector, + cyclus::Material::Ptr> >& responses) { + std::vector, + cyclus::Material::Ptr> >::const_iterator trade; + std::stringstream ss; + // Number of assemblies that are loaded directly into the core. + int n_load = std::min((int)responses.size(), n_assem_core - core.count()); + if (n_load > 0) { + ss << n_load << " assemblies"; + Record_("LOAD", ss.str()); + } + + // Accept trades and push material to core or fresh fuel inventory. + for (trade = responses.begin(); trade != responses.end(); ++trade) { + std::string commod = trade->first.request->commodity(); + cyclus::Material::Ptr m = trade->second; + IndexRes_(m, commod); + + if (core.count() < n_assem_core) { + core.Push(m); + } else { + // TODO check if it is assured that the fresh inventory does not obtain + // more fuel than it can accept. + fresh_inv.Push(m); + } + } +} + +// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +void GprReactor::EnterNotify() { + cyclus::Facility::EnterNotify(); + + if (fuel_prefs.size() == 0) { + for (int i = 0; i < out_commods.size(); i++) { + fuel_prefs.push_back(cyclus::kDefaultPref); + } + } + + // Check if side products have been defined. + if (side_products.size() == 0) { + is_hybrid = false; + } + RecordPosition_(); +} + +// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +void GprReactor::GetMatlTrades( + const std::vector >& trades, + std::vector, + cyclus::Material::Ptr> >& responses) { + std::map mats = PopSpent_(); + for (int i = 0; i < trades.size(); i++) { + std::string commod = trades[i].request->commodity(); + cyclus::Material::Ptr m = mats[commod].back(); + mats[commod].pop_back(); + responses.push_back(std::make_pair(trades[i], m)); + res_indexes.erase(m->obj_id()); + } + PushSpent_(mats); // return leftovers back to spent buffer +} + +// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +void GprReactor::Tick() { + // Check if the reactor is already retired. + if (Retired_()) { + Record_("RETIRED", ""); + // Transmute remaining fuel exactly once. + if (context()->time() == exit_time()+1) { + if (decom_transmute_all == true) { + Transmute_(std::ceil(static_cast(n_assem_core))); + } + else { + Transmute_(std::ceil(static_cast(n_assem_core)/2.)); + } + } + // Empty the reactor core if this has not yet been done. + while (core.count() > 0) { + if (!Discharge_()) { + break; + } + } + + while (fresh_inv.count() > 0 && spent_inv.space() >= assem_size) { + spent_inv.Push(fresh_inv.Pop()); + } + if (CheckDecommissionCondition()) { + Decommission(); + } + return; + } + + // "Burn" the fuel, i.e., change its composition from fresh to spent fuel. + if (cycle_step == cycle_time) { + Transmute_(); + Record_("CYCLE_END", ""); + } + + // If the irradiation period is over and the fuel has not yet been discharged, + // e.g., because of a full spent fuel inventory, then discharge it now if + // possible. + if (cycle_step >= cycle_time && !discharged) { + discharged = Discharge_(); + } + + // If the irradiation period is over, try to load fresh fuel into the reactor + // core. + if (cycle_step >= cycle_time) { + Load_(); + } + + // In cycamore's Reactor implementation, the changing of preferences and + // recipes would take place here. +} + +// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +void GprReactor::Tock() { + using cyclus::toolkit::RecordTimeSeries; + + if (Retired_()) { + return; + } + + // Check that the irradiation and refuelling period is over, that the core is + // full and that the spent fuel was successfully discharged in this refuelling + // period. If all of this is the case, start a new cycle. + if (cycle_step >= cycle_time+refuel_time && core.count() == n_assem_core + && discharged == true) { + discharged = false; + cycle_step = 0; + } + + if (cycle_step == 0 && core.count() == n_assem_core) { + Record_("CYCLE_START", ""); + } + + // Normal reactor operation where power is produced + if (cycle_step >= 0 && cycle_step < cycle_time + && core.count() == n_assem_core) { + RecordTimeSeries(this, power_output); + RecordTimeSeries("supplyPOWER", this, power_output); + RecordSideProduct_(true); + } else { + RecordTimeSeries(this, 0); + RecordTimeSeries("supplyPOWER", this, 0); + RecordSideProduct_(false); + } + + // This statement prevents that a newly deployed reactor (`cycle_step = 0`) + // increments `cycle_step` although the core might not have been filled yet. + if (cycle_step > 0 || core.count() == n_assem_core) { + cycle_step++; + } +} + +// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +// Below are the private helper functions, not directly interacting with CYCLUS. +bool GprReactor::CheckDecommissionCondition() { + return core.count()==0 && spent_inv.count()==0; +} + +// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +bool GprReactor::Discharge_() { + int n_pop = std::min(n_assem_batch, core.count()); + if (n_assem_spent-spent_inv.count() < n_pop) { + // Not enough room in spent fuel buffer. + Record_("DISCHARGE", "failed"); + return false; + } + std::stringstream ss; + ss << n_pop << " assemblies"; + Record_("DISCHARGE", ss.str()); + spent_inv.Push(core.PopN(n_pop)); + + std::map spent_mats; + for (std::string commod : out_commods) { + spent_mats = PeekSpent_(); + cyclus::toolkit::MatVec mats = spent_mats[commod]; + double total_spent = 0.; + for (cyclus::Material::Ptr mat_ptr : mats) { + total_spent += mat_ptr->quantity(); + } + cyclus::toolkit::RecordTimeSeries("supply"+commod, this, + total_spent); + } + return true; +} + +// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +bool GprReactor::Retired_() { + return exit_time() != -1 && context()->time() > exit_time(); +} + +// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +std::map GprReactor::PeekSpent_() { + std::map mapped; + cyclus::toolkit::MatVec mats = spent_inv.PopN(spent_inv.count()); + spent_inv.Push(mats); + for (cyclus::Material::Ptr mat_ptr : mats) { + std::string commod = OutCommod_(mat_ptr); + mapped[commod].push_back(mat_ptr); + } + return mapped; +} + +// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +std::map GprReactor::PopSpent_() { + cyclus::toolkit::MatVec mats = spent_inv.PopN(spent_inv.count()); + std::map mapped; + for (int i = 0; i < mats.size(); ++i) { + std::string commod = OutCommod_(mats[i]); + mapped[commod].push_back(mats[i]); + } + + // Reverse to ensure oldest assemblies are traded away first. + // TODO check this in cycamore Reactor, unsure why this is needed. + std::map::iterator it; + for (it = mapped.begin(); it != mapped.end(); ++it) { + std::reverse(it->second.begin(), it->second.end()); + } + return mapped; +} + +// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +/* +std::string GprReactor::InCommod_(cyclus::Material::Ptr m) { + int i = res_indexes[m->obj_id()]; + if (i >= in_commods.size()) { + throw cyclus::KeyError("misoenrichment::GprReactor - no incommod for material object"); + } + return in_commods[i]; +} +*/ + +// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +std::string GprReactor::OutCommod_(cyclus::Material::Ptr m) { + int i = res_indexes[m->obj_id()]; + if (i >= out_commods.size()) { + throw cyclus::KeyError("misoenrichment::GprReactor - no outcommod for material object"); + } + return out_commods[i]; +} + +// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +/* +std::string GprReactor::InRecipe_(cyclus::Material::Ptr m) { + int i = res_indexes[m->obj_id()]; + if (i >= in_recipes.size()) { + throw cyclus::KeyError("misoenrichment::GprReactor - no inrecipe for material object"); + } + return in_recipes[i]; +} +*/ + +// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +std::string GprReactor::OutRecipe_(cyclus::Material::Ptr m) { + int i = res_indexes[m->obj_id()]; + if (i >= out_recipes.size()) { + throw cyclus::KeyError("misoenrichment::GprReactor - no outrecipe for material object"); + } + return out_recipes[i]; +} + +// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +void GprReactor::IndexRes_(cyclus::Resource::Ptr m, std::string incommod) { + for (int i = 0; i < in_commods.size(); ++i) { + if (in_commods[i] == incommod) { + res_indexes[m->obj_id()] = i; + return; + } + } + throw cyclus::ValueError( + "misoenrichment::GprReactor - received unsupported incommod material."); +} + +// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +void GprReactor::Load_() { + int n_load = std::min(n_assem_core - core.count(), fresh_inv.count()); + if (n_load == 0) { + return; + } + std::stringstream ss; + ss << n_load << " assemblies"; + Record_("LOAD", ss.str()); + core.Push(fresh_inv.PopN(n_load)); +} + +// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +void GprReactor::PushSpent_(std::map mats) { + std::map::iterator it; + for (it = mats.begin(); it != mats.end(); ++it) { + // Undo reverse in PopSpent to ensure oldest assemblies come out first. + // TODO check this in cycamore Reactor, unsure why this is needed. + std::reverse(it->second.begin(), it->second.end()); + spent_inv.Push(it->second); + } +} + +// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +void GprReactor::Record_(std::string name, std::string val) { + context()->NewDatum("ReactorEvents") + ->AddVal("AgentId", id()) + ->AddVal("Time", context()->time()) + ->AddVal("Event", name) + ->AddVal("Value", val) + ->Record(); +} + +// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +void GprReactor::RecordPosition_() { + context()->NewDatum("AgentPosition") + ->AddVal("Spec", this->spec()) + ->AddVal("Prototype", this->prototype()) + ->AddVal("AgentId", id()) + ->AddVal("Latitude", latitude) + ->AddVal("Longitude", longitude) + ->Record(); +} + +// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +void GprReactor::RecordSideProduct_(bool is_producing) { + if (is_hybrid) { + double value; + for (int i = 0; i < side_products.size(); ++i) { + if (is_producing) { + value = side_product_quantity[i]; + } + else { + value = 0; + } + context()->NewDatum("ReactorSideProducts") + ->AddVal("AgentId", id()) + ->AddVal("Time", context()->time()) + ->AddVal("Product", side_products[i]) + ->AddVal("Value", value) + ->Record(); + } + } +} + +// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +void GprReactor::Transmute_() { Transmute_(n_assem_batch); } + +// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +void GprReactor::Transmute_(int n_assem) { + cyclus::toolkit::MatVec old = core.PopN(std::min(n_assem, core.count())); + core.Push(old); + if (core.count() > old.size()) { + // Rotate the untransmuted materials back to the back of the buffer. + core.Push(core.PopN(core.count() - old.size())); + } + std::stringstream ss; + ss << old.size() << " assemblies"; + Record_("TRANSMUTE", ss.str()); + + // TODO somewhere at this place, Antonio's GPRs must be used. + // TODO ANTONIO GPR + for (int i = 0; i < old.size(); ++i) { + old[i]->Transmute(context()->GetRecipe(OutRecipe_(old[i]))); + } +} + +// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +// WARNING! Do not change the following this function!!! This enables your +// archetype to be dynamically loaded and any alterations will cause your +// archetype to fail. +extern "C" cyclus::Agent* ConstructGprReactor(cyclus::Context* ctx) { + return new GprReactor(ctx); +} + +} // namespace misoenrichment diff --git a/src/gpr_reactor.h b/src/gpr_reactor.h new file mode 100644 index 0000000..ffc3598 --- /dev/null +++ b/src/gpr_reactor.h @@ -0,0 +1,270 @@ +#ifndef MISOENRICHMENT_SRC_GPR_REACTOR_H_ +#define MISOENRICHMENT_SRC_GPR_REACTOR_H_ + +#include +#include + +#include "cyclus.h" + +// Future changes relating to the implementation of Antonio's GPRs are marked +// with the following comment: +// TODO ANTONIO GPR +// +// TODO list: +// - check line 49 in .cc file. Ensure that `unique_out_commods.empty()` +// evaluates to `true`, else, the set gets not filled! +// - no implementation of `Reactor::fuel_pref(cyclus::Material::Ptr)` because +// it is not used in the reactor class. +// - implement Antonio's stuff (obviously) +// - think about the weird (?) decommissioning behaviour of the cycamore +// archetype and whether or not I should use it as well +// - not a todo, but a note: contrary to cycamore's Reactor, this reactor model +// does not feature a change of preferences or recipes over time. + +namespace misoenrichment { + +class GprReactor : public cyclus::Facility, public cyclus::toolkit::Position { + public: + /// Constructor for GprReactor Class + /// @param ctx the cyclus context for access to simulation-wide parameters + explicit GprReactor(cyclus::Context* ctx); + + /// The Prime Directive + /// Generates code that handles all input file reading and restart operations + /// (e.g., reading from the database, instantiating a new object, etc.). + /// @warning The Prime Directive must have a space before it! + + #pragma cyclus + + #pragma cyclus note {"doc": "A reactor facility that calculates its spent " \ + "fuel composition using Gaussian process " \ + "regression."} + + bool CheckDecommissionCondition(); + std::set::Ptr> GetMatlBids( + cyclus::CommodMap::type& commod_requests); + std::set::Ptr> GetMatlRequests(); + std::string str(); + void AcceptMatlTrades( + const std::vector, + cyclus::Material::Ptr> >& responses); + void EnterNotify(); + void GetMatlTrades( + const std::vector >& trades, + std::vector, + cyclus::Material::Ptr> >& responses); + void Tick(); + void Tock(); + + private: + // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + // Fuel commodities, recipes and preferences + #pragma cyclus var { \ + "uitype": ["oneormore", "incommodity"], \ + "doc": "An ordered list of the input commodities (fresh fuel)." \ + } + std::vector in_commods; + + #pragma cyclus var { \ + "uitype": ["oneormore", "outcommodity"], \ + "doc": "An ordered list of the (spent) output commodities." \ + } + std::vector out_commods; + + #pragma cyclus var { \ + "uitype": ["oneormore", "inrecipe"], \ + "doc": "An ordered list of the input (fresh fuel) recipes." \ + } + std::vector in_recipes; + + // TODO This variable might get deleted + // TODO ANTONIO GPR + #pragma cyclus var { \ + "uitype": ["oneormore", "outrecipe"], \ + "doc": "An ordered list of the output (spent fuel) recipes." \ + } + std::vector out_recipes; + + #pragma cyclus var { \ + "default": [], \ + "doc": "The preference for each input fuel type, in the same order as " \ + "the input commodities. If no preferences are specified, then the " \ + "same default value is used for all fuel requests." \ + } + std::vector fuel_prefs; + + std::set unique_out_commods; + // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + // Core specifics + #pragma cyclus var { \ + "default": 3, \ + "doc": "Number of assemblies in a full core." \ + } + int n_assem_core; + + #pragma cyclus var { \ + "doc": "Number of assemblies constituting a single batch. This is the " \ + "number of assemblies that gets discharged from the core after " \ + "one complete irradiation cycle." \ + } + int n_assem_batch; + + #pragma cyclus var { \ + "uitype": "range", \ + "range": [1., 1e5], \ + "doc": "The mass of one assembly in kg." \ + } + double assem_size; + + // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + // Irradiation cycle parameters + #pragma cyclus var { \ + "default": 0, \ + "doc": "If true, the archetype transmutes all assemblies upon " \ + "decommissioning. If false, the archetype only transmutes half." \ + } + bool decom_transmute_all; + + #pragma cyclus var { \ + "default": 12, \ + "doc": "The duration of one complete irradiation cycle excluding the " \ + "refuelling, in units of simulation time steps." \ + } + int cycle_time; + + #pragma cyclus var { \ + "default": 1, \ + "doc": "The duration of an entire refuelling period, i.e., the minimum " \ + "time between the end of a cycle and the start of the next cycle." \ + "In units of simulation time steps." \ + } + int refuel_time; + + #pragma cyclus var { \ + "default": 0, \ + "doc": "The number of time steps since the start of the last cycle. Only " \ + "set this variable if you know what you are doing." \ + } + int cycle_step; + + // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + // Side product settings + #pragma cyclus var { \ + "default": 1, \ + "internal": True, \ + "doc": "If the reactor produces side products, then this variable is set " \ + "to true." \ + } + bool is_hybrid; + + #pragma cyclus var { \ + "default": [], \ + "doc": "An ordered vector containing the side products produced during " \ + "normal reactor operation." \ + } + std::vector side_products; + + #pragma cyclus var { \ + "default": [], \ + "doc": "An ordered vector containing the quantities of the produced side " \ + "products. The vector entries must be of type 'double'." \ + } + std::vector side_product_quantity; + + // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + // Other variables + #pragma cyclus var { \ + "default": 0, \ + "uitype": "range", \ + "range": [0, 10000], \ + "units": "MWe", \ + "doc": "The amount of electrical power that the reactor produces during " \ + "operation." \ + } + double power_output; + + // This variable is internal only and true if fuel has already been discharged + // this cycle. + #pragma cyclus var { \ + "default": 0, \ + "internal": True, \ + "doc": "This variable should NEVER be set manually." \ + } + bool discharged; + + #pragma cyclus var { \ + "default": 0, \ + "uitype": "range", \ + "range": [0, 1000000000], \ + "doc": "Maximum number of fresh fuel assemblies that are stored in " \ + "the facility if available." \ + } + int n_assem_fresh; + + #pragma cyclus var { \ + "default": 1000000000, \ + "uitype": "range", \ + "range": [0, 1000000000], \ + "doc": "Maximum number of spent fuel assemblies that can be stored in " \ + "the facility before reactor operation stalls." \ + } + int n_assem_spent; + + // This variable should be hidden/unavailable in ui. Maps resource object + // id's to the index for the incommod through which they were received. + #pragma cyclus var { \ + "default": {}, \ + "internal": True, \ + "doc": "This variable should NEVER be set manually." \ + } + std::map res_indexes; + + // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + // Material buffers + # pragma cyclus var {"capacity": "n_assem_fresh * assem_size"} + cyclus::toolkit::ResBuf fresh_inv; + # pragma cyclus var {"capacity": "n_assem_core * assem_size"} + cyclus::toolkit::ResBuf core; + # pragma cyclus var {"capacity": "n_assem_spent * assem_size"} + cyclus::toolkit::ResBuf spent_inv; + + + // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + // Coordinates + #pragma cyclus var { \ + "default": 0.0, \ + "uilabel": "Geographical latitude in degrees as a double", \ + "doc": "Latitude of the agent's geographical position. The value " \ + "should be expressed in degrees as a double." \ + } + double latitude; + + #pragma cyclus var { \ + "default": 0.0, \ + "uilabel": "Geographical longitude in degrees as a double", \ + "doc": "Longitude of the agent's geographical position. The value " \ + "should be expressed in degrees as a double." \ + } + double longitude; + + bool Discharge_(); + bool Retired_(); + std::map PeekSpent_(); + std::map PopSpent_(); + //std::string InCommod_(cyclus::Material::Ptr m); + std::string OutCommod_(cyclus::Material::Ptr m); + //std::string InRecipe_(cyclus::Material::Ptr m); + std::string OutRecipe_(cyclus::Material::Ptr m); + void IndexRes_(cyclus::Resource::Ptr m, std::string incommod); + void Load_(); + void Record_(std::string name, std::string val); + void RecordPosition_(); + void RecordSideProduct_(bool produce); + void PushSpent_(std::map mats); + void Transmute_(); + void Transmute_(int n_assem); +}; + +} // namespace misoenrichment + +#endif // MISOENRICHMENT_SRC_GPR_REACTOR_H_ diff --git a/src/gpr_reactor_tests.cc b/src/gpr_reactor_tests.cc new file mode 100644 index 0000000..0d7ef4d --- /dev/null +++ b/src/gpr_reactor_tests.cc @@ -0,0 +1,63 @@ +#include "gpr_reactor_tests.h" + +#include "agent_tests.h" +#include "context.h" +#include "facility_tests.h" +#include "pyhooks.h" + +namespace misoenrichment { + +// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +void GprReactorTest::SetUp() { + cyclus::PyStart(); + facility = new GprReactor(tc.get()); +} + +// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +void GprReactorTest::TearDown() { + delete facility; + cyclus::PyStop(); +} + +// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +TEST_F(GprReactorTest, InitialState) { + // Test things about the initial state of the facility here +} + +// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +TEST_F(GprReactorTest, Print) { + EXPECT_NO_THROW(std::string s = facility->str()); + // Test GprReactor specific aspects of the print method here +} + +// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +TEST_F(GprReactorTest, Tick) { + ASSERT_NO_THROW(facility->Tick()); + // Test GprReactor specific behaviors of the Tick function here +} + +// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +TEST_F(GprReactorTest, Tock) { + EXPECT_NO_THROW(facility->Tock()); + // Test GprReactor specific behaviors of the Tock function here +} + +} // namespace misoenrichment + +// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +// Do Not Touch! Below section required for connection with Cyclus +cyclus::Agent* GprReactorConstructor(cyclus::Context* ctx) { + return new misoenrichment::GprReactor(ctx); +} +// Required to get functionality in cyclus agent unit tests library +#ifndef CYCLUS_AGENT_TESTS_CONNECTED +int ConnectAgentTests(); +static int cyclus_agent_tests_connected = ConnectAgentTests(); +#define CYCLUS_AGENT_TESTS_CONNECTED cyclus_agent_tests_connected +#endif // CYCLUS_AGENT_TESTS_CONNECTED +INSTANTIATE_TEST_CASE_P(GprReactor, FacilityTests, + ::testing::Values(&GprReactorConstructor)); +INSTANTIATE_TEST_CASE_P(GprReactor, AgentTests, + ::testing::Values(&GprReactorConstructor)); +// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/gpr_reactor_tests.h b/src/gpr_reactor_tests.h new file mode 100644 index 0000000..e6d173f --- /dev/null +++ b/src/gpr_reactor_tests.h @@ -0,0 +1,22 @@ +#ifndef MISOENRICHMENT_SRC_GPR_REACTOR_TESTS_H_ +#define MISOENRICHMENT_SRC_GPR_REACTOR_TESTS_H_ + +#include + +#include "agent_tests.h" +#include "gpr_reactor.h" + +namespace misoenrichment { + +class GprReactorTest : public ::testing::Test { + protected: + cyclus::TestContext tc; + GprReactor* facility; + + virtual void SetUp(); + virtual void TearDown(); +}; + +} // namespace misoenrichment + +#endif // MISOENRICHMENT_SRC_GPR_REACTOR_TESTS_H_ From 02203a7c661e04ce4b20d8771500b49124c1fc80 Mon Sep 17 00:00:00 2001 From: maxschalz <58850267+maxschalz@users.noreply.github.com> Date: Thu, 29 Apr 2021 19:44:20 +0200 Subject: [PATCH 02/18] WIP Add SpentFuelGPR python module The `SpentFuelGPR` module is not implemented yet, however the directory structure has been created and it has been incorporated into the installer file (`install.py`). The (future) implementation will be based on Antonio Figueroa's Gaussian Process Regression (GPR) methods to model the spent fuel composition using GPRs. See, e.g., https://doi.org/10.1016/j.anucene.2020.108085 or https://arxiv.org/abs/2006.12921 or https://github.com/FigueroaAC/GPs-for-SpentFuel --- .gitignore | 1 + SpentFuelGPR/SpentFuelGPR/__init__.py | 1 + .../SpentFuelGPR/predict_posterior.py | 0 SpentFuelGPR/setup.py | 22 +++++++++++++++++++ install.py | 5 +++++ 5 files changed, 29 insertions(+) create mode 100644 SpentFuelGPR/SpentFuelGPR/__init__.py create mode 100644 SpentFuelGPR/SpentFuelGPR/predict_posterior.py create mode 100644 SpentFuelGPR/setup.py diff --git a/.gitignore b/.gitignore index c61074d..ca3c00a 100644 --- a/.gitignore +++ b/.gitignore @@ -2,4 +2,5 @@ build misc commit_msg __pycache__ +*.egg-info *.swp diff --git a/SpentFuelGPR/SpentFuelGPR/__init__.py b/SpentFuelGPR/SpentFuelGPR/__init__.py new file mode 100644 index 0000000..884dee2 --- /dev/null +++ b/SpentFuelGPR/SpentFuelGPR/__init__.py @@ -0,0 +1 @@ +from SpentFuelGPR.predict_posterior import * diff --git a/SpentFuelGPR/SpentFuelGPR/predict_posterior.py b/SpentFuelGPR/SpentFuelGPR/predict_posterior.py new file mode 100644 index 0000000..e69de29 diff --git a/SpentFuelGPR/setup.py b/SpentFuelGPR/setup.py new file mode 100644 index 0000000..b8444fc --- /dev/null +++ b/SpentFuelGPR/setup.py @@ -0,0 +1,22 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +from setuptools import setup + +def main(): + setup( + name="SpentFuelGPR", + version="0.1", + description="Python part of the MIsoEnrichment module", + author="Nuclear Verification and Disarmament Group, RWTH Aachen University", + url="https://github.com/maxschalz/miso_enrichment/", + license="BSD-3-Clause", + packages=["SpentFuelGPR"], + classifiers=["License :: OSI Approved :: BSD-3-Clause License", + "Programming Language :: Python :: 3"], + install_requires=["numpy"] + ) + return + +if __name__=="__main__": + main() diff --git a/install.py b/install.py index dba1439..8f71181 100644 --- a/install.py +++ b/install.py @@ -37,6 +37,11 @@ def install(args): root_dir = os.path.split(__file__)[0] makefile = os.path.join(args.build_dir, 'Makefile') + print("Installing Python (sub)module 'SpentFuelGPR'...") + spent_fuel_gpr_dir = os.path.join(root_dir, "SpentFuelGPR") + subprocess.check_call(["pip3", "install", "-e", spent_fuel_gpr_dir]) + print() + if not os.path.exists(makefile): rtn = subprocess.call(['which', 'cmake'], shell=(os.name == 'nt')) if rtn != 0: From 750a3a45d71fb3d5e43ebc98f0a8d29665c47963 Mon Sep 17 00:00:00 2001 From: maxschalz <58850267+maxschalz@users.noreply.github.com> Date: Fri, 30 Apr 2021 15:04:40 +0200 Subject: [PATCH 03/18] Change Python package naming to lowercase In accordance with https://www.python.org/dev/peps/pep-0008/#package-and-module-names --- CMakeLists.txt | 4 +++- SpentFuelGPR/SpentFuelGPR/__init__.py | 1 - install.py | 4 ++-- {SpentFuelGPR => spentfuelgpr}/setup.py | 6 +++--- spentfuelgpr/spentfuelgpr/__init__.py | 1 + .../spentfuelgpr}/predict_posterior.py | 0 6 files changed, 9 insertions(+), 7 deletions(-) delete mode 100644 SpentFuelGPR/SpentFuelGPR/__init__.py rename {SpentFuelGPR => spentfuelgpr}/setup.py (83%) create mode 100644 spentfuelgpr/spentfuelgpr/__init__.py rename {SpentFuelGPR/SpentFuelGPR => spentfuelgpr/spentfuelgpr}/predict_posterior.py (100%) diff --git a/CMakeLists.txt b/CMakeLists.txt index d0455b7..772f0a0 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -120,11 +120,13 @@ FIND_PACKAGE(COIN REQUIRED) SET(STUB_INCLUDE_DIRS ${STUB_INCLUDE_DIRS} ${COIN_INCLUDE_DIR}) set(LIBS ${LIBS} ${COIN_LIBRARIES}) +# Find Python and python.h +FIND_PACKAGE(PythonLibs REQUIRED) +SET(STUB_INCLUDE_DIRS ${STUB_INCLUDE_DIRS} ${PYTHON_INCLUDE_DIRS}) # include all the directories we just found INCLUDE_DIRECTORIES(${STUB_INCLUDE_DIRS}) - # add the agents ADD_SUBDIRECTORY(src) diff --git a/SpentFuelGPR/SpentFuelGPR/__init__.py b/SpentFuelGPR/SpentFuelGPR/__init__.py deleted file mode 100644 index 884dee2..0000000 --- a/SpentFuelGPR/SpentFuelGPR/__init__.py +++ /dev/null @@ -1 +0,0 @@ -from SpentFuelGPR.predict_posterior import * diff --git a/install.py b/install.py index 8f71181..83df77f 100644 --- a/install.py +++ b/install.py @@ -37,8 +37,8 @@ def install(args): root_dir = os.path.split(__file__)[0] makefile = os.path.join(args.build_dir, 'Makefile') - print("Installing Python (sub)module 'SpentFuelGPR'...") - spent_fuel_gpr_dir = os.path.join(root_dir, "SpentFuelGPR") + print("Installing Python (sub)module 'spentfuelgpr'...") + spent_fuel_gpr_dir = os.path.join(root_dir, "spentfuelgpr") subprocess.check_call(["pip3", "install", "-e", spent_fuel_gpr_dir]) print() diff --git a/SpentFuelGPR/setup.py b/spentfuelgpr/setup.py similarity index 83% rename from SpentFuelGPR/setup.py rename to spentfuelgpr/setup.py index b8444fc..4caed5c 100644 --- a/SpentFuelGPR/setup.py +++ b/spentfuelgpr/setup.py @@ -5,16 +5,16 @@ def main(): setup( - name="SpentFuelGPR", + name="spentfuelgpr", version="0.1", description="Python part of the MIsoEnrichment module", author="Nuclear Verification and Disarmament Group, RWTH Aachen University", url="https://github.com/maxschalz/miso_enrichment/", license="BSD-3-Clause", - packages=["SpentFuelGPR"], + packages=["spentfuelgpr"], classifiers=["License :: OSI Approved :: BSD-3-Clause License", "Programming Language :: Python :: 3"], - install_requires=["numpy"] + install_requires=["json", "numpy", "os"] ) return diff --git a/spentfuelgpr/spentfuelgpr/__init__.py b/spentfuelgpr/spentfuelgpr/__init__.py new file mode 100644 index 0000000..ec038d0 --- /dev/null +++ b/spentfuelgpr/spentfuelgpr/__init__.py @@ -0,0 +1 @@ +from spentfuelgpr.predict_posterior import * diff --git a/SpentFuelGPR/SpentFuelGPR/predict_posterior.py b/spentfuelgpr/spentfuelgpr/predict_posterior.py similarity index 100% rename from SpentFuelGPR/SpentFuelGPR/predict_posterior.py rename to spentfuelgpr/spentfuelgpr/predict_posterior.py From 0a24cf3c1e36ac9fd278a83ece0cdb3ee9becd27 Mon Sep 17 00:00:00 2001 From: maxschalz <58850267+maxschalz@users.noreply.github.com> Date: Fri, 30 Apr 2021 16:45:41 +0200 Subject: [PATCH 04/18] WIP Add untested `predict_posterior` Python script `predict_posterior.py` is now in a preliminary final version (up to potential changes of paths or variable names) but it has not been tested yet. `kernel.py` contains lots of kernel types and this file will be cleaned up in the future, all unneeded kernel types will be removed. However, this can only be done after the kernels have been trained and after it is known which kernel type is 'the chosen one'. --- .gitignore | 2 + spentfuelgpr/data/x_trainingset.npy | Bin 0 -> 32128 bytes spentfuelgpr/spentfuelgpr/kernel.py | 324 ++++++++++++++++++ .../spentfuelgpr/predict_posterior.py | 179 ++++++++++ 4 files changed, 505 insertions(+) create mode 100644 spentfuelgpr/data/x_trainingset.npy create mode 100644 spentfuelgpr/spentfuelgpr/kernel.py diff --git a/.gitignore b/.gitignore index ca3c00a..001bbd2 100644 --- a/.gitignore +++ b/.gitignore @@ -2,5 +2,7 @@ build misc commit_msg __pycache__ + *.egg-info *.swp +*.json diff --git a/spentfuelgpr/data/x_trainingset.npy b/spentfuelgpr/data/x_trainingset.npy new file mode 100644 index 0000000000000000000000000000000000000000..7f1db3cac22f445c087c6cb6bf2865fed8de5e8d GIT binary patch literal 32128 zcmbT8_e0I^`^P(VI;Ul?5JDkBLT|I{x(QhkGD1dHMCq)MmG(X@D=RB2NmfXbB(sDh zrL>gx-rxK6dY#Wd@a?zv8`U}IzOU5VF6V5QcO&*bGjsnSH9q>PZ=1O(2>!deZ`|#PGIZ5NkNI&b1bg(_yk7Vdc0Ut`XuE~OU7g~{ zk!!?g*59t+Z@G|Y+P)a#J)<1nU7Gi>?ywt7QJc1Yj+PV!TEV9NBelrvVNd79I@iM$ z$JrX+ZG+%(op+xtFJVbJ6EWABgzxhxVHSC+xmG%4d2| zGp_D<{3B%m4^JefU79Bif#D;^r5BwP*^g7qJLG_WATfP^CtGMW5QG`CuRH zl2^FE1An-@fBus*1`^yaQA+;sxdx||n%3&x`Uy_VU+4;jF&j_qf08T3#?32S`eG~k zEc;fx$FCgX7iuYw6MDeK%pQM@1Y$HDwc^a3H9X=HHvi`3OZ5>Q^n;tX?yuYDD8r;)S60-gs1xzyPG2zO;laMq z3-V`#f>XQS)3tp>xOV@|2T{lBaJhs1&c@SxWIz9b-q2K%E0U#(F?U1z-m0oL+^Qax z)iW{%*w6o7Ft~g%G7LW~MPt3uea=o)CdN-r_L>=<2WzLtrAkc$p?*=+B58Gk=T-r(W! zu(`hWJAI+mt)E$bxdin`wEKDqRfwbanp^7zsNxak0A_{2QOBL_T^D6oIzYd490%x|f+9yUQ8)08>dIGnE zL0XRu^DlfAp|);1Uz(>v?(O;Lc;2Z4V$W4wPkHA7%i8XAKKGGePQTX80|%&)xPO^_ z1f!MlB=Ze?#{>Z=CSTkpJ3)3;1N3@mta)Z-S_l z#s7Kpg5b@AKeNkR#JHo+=Cvk+)Jf%qE6v;XcES$kYg9Naxiqy=%~*;T#3NoBj;_TF zLE;*_E6VtW{&Vu%4U)C*>^-(lgnFCB2Snkm82xe% zw12tsh`emqn5$ntfqS{-Sj=z737H3vjoZ})+h*o1^B)iZ+JW=NY;1PI)RB+nY1Ybw zUjDQ1hpTX(k5L$$J9zT(-=hFlg++PQx>2`robvXQn>bhr;DJ{_$n?QhYYtU*oZ{3VCowV(I4D0^#)f zlpOMg!Gvs!@iQ5?dfk{fp*4KhyxH#ZrOwnfvVz<1c&P$qvx%?9^ zsNkwUSI;J23ttYN(@QGH5!S~$ozi^&jkHt+v&^-3sOv4Z< zI`#9-GoPbIW^ZvE@#|V09EPbj@o#;>A+qoN%kd(dq8T^y-vKRB|8en;MXs$tPq$6H zdMMQU@7R;%Ai-kUnfEats&V!CKIS>mO2~fyM_zE?z~hnmdNSN&`_HXuRtrwDIzBQ) zhmZcu1w0lEHPsW(u3aKV=g}924*RA=w6v-^7y1Zs15+S!0zjH`e5H&h#hF7=4<>a} zCEeKH-y4|rSrZ%vZEwD4hCh^HXYZPC+vlm1-h$B?duQYTt-L7XrH{71&jNk>Ue~%DX$p*W-s{=4;LJV!8Wc z90UbX>+-j^iEzex+;u0S9X-mK8}^&KA8W#4XXvfdZZQ(vJaS>rR(EAmpCY9~B98W5k|Qm&mUMWZUag9x9Kc6)YeG60RTAd*>v@5o^lUc`fP0 zasI0o%r#I&wtl_z1e0O4XXl&|;mYAdy-PN#kPQW2cYmAr5}5LRNi`UrYM8CsvP^>g z2P`P^2@?|jDtk3cwF0ib75f7=hG`w+%P>pJkxclYN%l`1DK&gi1+`RO^wbW6$9ucE zHH{PFiJfyobo`spL6x~7jqrFVeTS!c!0dIKX7$gPp!&+t#kTETI7XBjwLiQAnD!?i za!4|}S3f0Oh6{$(@xD&w6Nl>byH(SaQO4Bwjeg)0=CgX(bP;Ow)3I^ht40=G2VdIb zu$5_mD?_2j@tp3am12CaF)x1bRV}i@&GUwa&RaOe^p{265Nbc+&4$ZT>??crwufE~ zx<1p^&h7XEw7WRYP74OD!mFm4X(BwmwY%%;kQQuySCX_LyBbz^A0KqjMHK9*Lg*>Ok6qCSc0X?VK>^|8(KqUQ=b5p|h@~W|}J5e*L`BGc z$Q=TVUykzLAjZ(%u2x}=>LftpdEJVK%E-Juk8^{d&(J=3*Lz8^-D$_uvM;r0_j2qf zbv*$dW%~OmUpS?{{bWjt43FD97EPMlhV=4^haLC~otd-()`Y;JrEw94rB0}tJ)b1?s{vx?Oq{8 zubyi@x|(Z{%Dty~@|b3@VFcW*0O&aT$u0kY2>2FPI0w?WDbD_H~L;=l!Te-NntA+T-7u$q_=VrtRy$g<&u$`o#+W`%+9_ zKkM1#jdcEC>suI5^_+0wj0fD%|1XXIQ-qi z)3x5#77SAsH;!ofCPU9JB)kO^WeV!r1}Mxa$>}rrdxhlbo7kXj$tUHh%p0SSGl7RX3mURn+ z39A+?%CeT>ZL6oF+6$FQ&DPD%P0I>^k*Dsr!l3Dj?(L)wC)~HV(Dj0jkW9RwNjq#c zaPzY#xCA+E%a0YK5$TpUXO$)?W(80qFfZ?5rW|-K$vR5Aq&W4n%g1?V8}aw^4f1jxk0iAw= z9;+(mdmnI3%i}+2k>b{cPul$Ig+$26^BHNt9KYC&A<#qaGBjF*4L54)3(Q z+~yU6K2snT2f@+tH>NE9Cc%`vM*ei;YTWlFzjb0~H8Ao}*D)OU1Ka-D`O0w7JM-s9 zFEyh+d4BKQk0w~eyusma@WC$AV$}o@?ppt0hOL(p$zkW~PQ||uf)!SygrYxU9BbJa zE=c5)h27%=XQe80=kuu#d_(6K@>BHu%pX>Fqe+dh<$bCEnei>qH3TdkSDC0Mitx_Q zi;aB>YOphg>EP*LzzDb~Pxx|~RE?HM(D+Slw6$d`{+rAUxW({=w(qqqa#$M}a((_- z8E#k?d4Kt49=R=K2HYC%e1GtV&jQV136^3Uy6jz#`je`JE6>f`e5V-(R<#?x=Ln?u z+pK=i$xrHJ(4T#@gLeTlJ|_(Gfb3tVLc?4H$WY>A)?($ODZvfv|AF^NN)}q{w?QKe*?;4!q+#V%8EX zC62Fr4uh8oQ?|cT65|}JC0EDwR3Tn-f(EF(Qo%XQ0KMKF=HK)fQuaWCg2fWvrv*Z? zjUAwcNT;il`!a&yU0BvvwLLOS#q%4Tj%pGr4uUV{W^wiXm@kAB-}|qwn+R<`oquyOpUz1+U?lg3?=UO3l4xY zy2G+kR!Q)gsp#9LHCp8QhC}OjARk$Mzb_1iY3&axQkP+UuD0?iuWCHe=da0-XdyD~ z)4I?DPM#1GGWsHZ>#1m(FwV?@2l6ILt^qR4lDB;je{1xH%J4_Qm+QoslbuxOG_4lH2liC=Eo}p4yeGOLAaYe-oD?O+%_)6vKe^tD z*IqSjYTv>`uD%CBdCRe+>7PYdyLPhiF<%~WJ!m`g{wF@N^R;m}I2L6bT@@*+o;oG_TrRfFMwt>3A6;60#$s}Q~vjURx>-XhNc|1&~^5w|bV92w` z&x(l@Qb1vP~Bz-vn z&&?Okp-@mh;Kra73CcevrmC1XVNnw!;FXc>FQMMB^Sj-a>4#)EAinqUMUT4hB`e@n zk&!2Zs)E62%-mNahf@BzA~wRj51+8(8GLX`2MEzx8`G+oA=z>)*-s_X1ydx>Q-G{~#HLTUY&;l&eJ8 z>z}QRtiI?U3X@+S2=OOkT(?|1bbEhQ@;g;e_-laxhcFHNlNUUWdAIm>qXY-dC)H{e z>g2~qrURtId*;h87-mNd;lH~jLyhdh>hyqG{4wVa?EuBV*5~>F5L7g7e_$cPz}F@> zv^!f-kCAUWwOoI{5C*wG}nXS~TUCovvg zecIq$fHGN2>FGS@Qeg1&F3S)IkQ}X?Jz9#mB*`691Z3-6rh?Z2r|;=}wk7@Ah8!6x z&neIU)1g7M@7dA{-lE|5;c(|^m#cBI6K17P%k->lz+HjEvZn4-LUZPVzi|WO>y|Su z576`b+{f?Z#!lq;mkOt^y@G(LP7V{KxPR5YNS_@lWLQUQz~wnYWapEAJ}^;Z@SYMY z%6}G}>>PhyNIp=yTCw*Bu>Iw12*fqmj}&N1kX8ii^skzPp{p5t%YdC7ywfbtiJ6P4ENTWtc)lTVdREEFERy6WNp!Oibz|z*Wc+6CT3om zPa`C_eZ}0t&Zd0gMW^f2g-Tp~*9(KE6SH6au$18#b9>ofsTyJB;R-&|>bkjTxd)s$ zc3(fa-U-WQhkZ%7qeVDACPY?WE|r6ty=rd34KZ5&+R$z_wFb>tK6sg%?<9WUzh+H1 zZ<7?irAEg^TxmgCyl92_#p#Ppp`iNdW48kyBAj4->|u>MkFa#$)<0n9OIvU7iPudz zIg|3AWjA_<5mmDK{sfzmrPA`uUn@w1^c47Ai|MKAdv!RHj<%T~4F>?51MN96Mn znF8qN4nYi{bCu!nwN?}J@_7n=_Jo_S%Y$GY190^z|5V>%&&k&c*eGKS)&iXsa zz~G(Z{XC)I0|nR}RR5$~rx%+w;(L~_6>xmzt{iqeA?h8mGW2_P+k1RmCk}~bZg@3R zGJIi%KP>79>Ta9qglen0bmQeJBy;f3(}zbjas4GJ6h1M4&|8e}7LGZ*@vV^fdOuuV z&g-mU`m$K4oP4^Ry6nPpjjA9U`oJ&wur@z6n`* zk)w(n-wy)I|2m^h21{_phFi1w#!7_qZ{7n_zUM9uhi@a6@3i_%`Hf}f>FaiULTA&R z>6wLK#u!Wn?y&UCo80$JB1~A&(Xi+e?H}v_Si|`%Pl6!Bec;LR+Y)r0J!(Z|mKLG# zez@82W?=cAg)gk#zh{}oR?1i1?yui7r3zD@`(@p0?*#S@cpn0~3_#d!)gS}sBd``GGhg>T;C6|MMv0OP%Wr&Lv*royZ!Di{;rz8Dau~Vk&~ckF)Za<# zqqeLskEqo$6{L&fi&=gUwdlk2!@neWC~?-d+Qq7b!g*%Esq;<7Sj2TytE;P1l zL$mm$p5-q}fx$aR$^t>jCL;OO1?qpLmL8k+k4GqcrwXtR82qO*C>&&8`^=j8hWZx? zy?*756p+Bj8z};51;#!(S?LZ`{nW2>k)ToBjOi!VYY>j#DRF#VM-IntKf3KaNrqD& zes@i|QI8b9Q^c#n@y$Md&@ytOUiDha$1WMn>^86iS^2R_i0t>D5DG^a0NS1UPbtq^ z43a572=G`jqvHq1S9#u`(v}fA{*?^3J}b8R&?X=+N3@1JKPZDGOo6@{3?-%`&V&>? zpL$5X%%NS^n!l0&KiblGH z6fd6pVpy6=`x_%48kLa2(;sD?u*-k8tGQH!A<4l`10qxue2>rhE5GGX;T$+)=QzrL z=zt&pMMzrN0aA!%%o`lx50oC%y8o7R_WESKZEK0e^^=H>{U=XCzPv()zIre@^qqkr7}vFTBV@)xwfu>x0_yI-nd5S;3r_i&yF=cXR$+A~0z z3}g*j1)uNZ0R!TGp8VP>MnOX4`X0;v=YPEB?#Bc2Nx zHtLVUKk$RT1FpW=^PSGW4_c1uD>Y!qgBIq5DExy^IIY}t)W=VPr56`Zvv=q~3b)gj zFKSYpUvC&%X+G@+k)cV7h4Z>9WuhXF@k-F|1onJB3Wo6QiFbAF#Mtswmf1c^NH%o6 z9u|H~89DzT5C$^QJ zf8&Fqe!GKTdbZ%yTPOS!(O|G(SQm2qut-tAgP_-Q!xs;aQ2vuVvS$7p6~fy8b~W65 zC-Q~xs3WqklciYsWXaO9P9gDO?EiVq!1)Iu&|SB&a>;rT#@v#u2-?@{JFkMyzwb8tB?c=g{EG~Qe-H-!m;p1A&c83cOKsC=|JckZkP=1x_JA|< z9xQ-0bpCx5YbI1yCp}rdSPQH^43fjv@PHcztxovr*_+cJ8*4Dlmr)=s+^`?G>_7?HKk$5B|3h8jPyDYx1VJS;fHl(j z_wjz;8`tWPjRy$-D*S_R*v<@KL&P}o%B#86{n~Lk3n=QiKmX?jWkUxT$7ay^_l?Gp zvvZUc{IM07c+ZHlLExZaSN7Rch7r#vXPX`rkUSPpC?Pwa^zsFo9$NBrtO#xHZ!jsi zNAo32dumoe&OZo&=kr7P*?D3NjvIW~ZFK{N^BbrGDdhZ#PEVL)T>Pv#REqsC?w$JX zbqBiM-e>ITmklhR(F=z78ylxMKBM#R>%2y1cRQc ztu$OABy4+GSI_YklQ2j=#=ClFlnhtgn{@Y+wfxM z-nU86gk3D3?&6)AR}9WeTuqzkimI#Gv_&&_vd{9xWE9sjM5DgSvD z=OC?BArFVL00cSzAQTMx*axTna6-2yzupZTt469=f8jPaUwU~%bm#L$B>`fbe^)T( z`4%m*_Uv8y3iE)|@4+y+tcQxgOo|$baCODGY8-fjd4(0g=A-Te!p$w72M_NNVZbf< z#?x9YI5&xDpbfzJ2Vr2e^oMbTE}ehh)o4^dS0e2b83Nm`(C_XLH*H*b{8u{vz8thO zq=B!Pzj?^%_aHEgiQH=3LFeB`b6=T^S0{1q);%0mRk`{8n=jluTR+G$R)RH8|AvoW zT8n=e`?gnt!aoQF6VLfy9Cp(A_xj9b;%BWmmJK-Mb9~{I7j%6eHq}}~gh$?{ocI;S zBW${9Vih-^djx~qtNj(uFT{v1s`8F~P$f*dX``r-%V(7afco86S5JzisQf^CmY%8x znXxT%+B=I5ZoWPp2FFIt9MU5~gjtV5ywp1CkV!Y`^ixJozk7meZ~w33EhT7kxd@lp zw__$dpR2Otkyer%d>DW)km3F}XWP^EDl7bf6or4_56Y6&s>$QUIE4;a`>qNIYp?G6 zqwo(x!Egi<*^{uL3H2$x8M>{A4zs9C}9Jz=B%hRxzWQq*~}Z_z?4HS&lZz`7Lt zJ{SsmMr((p$}l(j;C z(Pxkd&&1t`UumR4hEn=7ZP{N1zjp^+Rh0ubK8aEI=z;srmGugKTBqRmL2$Kt)udE6 zDf&eUO{0_A@dzVdZCbfMzv2r+cD;{++agqZV|b|blrmw{PZ5fIPg4j)t{l3>W{U*h zJ+u0L?z4bMY5M7g24BJNy0ZXXh_rY-CVM$Q^Y%x~GZj#MW zX+&0j4*tpIlO6?tUgY$Jed;9WbpGB%Z>LT?%fxfc%7M!dg+Y|RFV8qihV99``VvPK zq8hNo>GR=w1;6)%{khw0br#e4H-7AL-zcGiueK@py&M|fJ{&w#NrJ~>R^FcQTa(1c z@v5x`@wne_fUKl!H(}Tw#-ZbLpU=}!s53maI6X&%<3HT#Y1~VR z?5F9eR}Dh^#P}P7eZZM9NaU3NBz?30YR)I7Z2nfP$oGUmhl<{_?h9lX`?xFB`Is76 zd)e*E=@&m0{y-2&4xOFsu}_TR=rQ^_kG064@huP)Ue4w7=7mG+j*9XtBc&*{tWRuO zU4>@+tZy%`)hqbDI~-X7S6*e&{Ab_yr;-LWW9$C={u5o>6#PC2_LMyE>Gn-<#tL)fvLMI&PHzG(6%*xlnz@#Cs$7oIXnl0ZGETwi(lKDU3?J8S9r zuk$+`wn~*uyXM`m(WPC%?>(U2!L*OZbqQ|x`{2hkKXuaNZCpI*HV@f+kh2_|*9X13 zvVrEGbw9qEq*;ew@Z!tTfvU*mNBw}@wi_SVMf1;Ex-QNK+ptJS-ebb@L@wXs6ACFO zpBCMT6JuK2v@?12JaTQs*_z_Ce9qr|;?1P*&cC;#_p4@0qpP8S^zF3VlytmG!S6%h z6%(+PQ$A4QvtraX4f4|7t=J->QIQ`F1oPr=AGXe?`DY#H2U<_-(K&n5xo5HtMSe6K z-lvc8INnC{EyA?DE5~-=fGb1Bh8ZX$>(3XsgW1B19nB-en9$O#&xiLkKWXi&y5yvy zzxS8J+bOjV24vCmUuELp$QP3AggF*lN2MzA(|%x~YqrnCUxssvHofaJOOxpNF5rn1 z|0wd)p)g?okk7hCH23hFc^Bv$FW{2L6bjI%y@lizCa$Xe`}$Od4d364^zioNJuCt)zwQqgTCT3Wp(e$HUBgCCaa1Cn zJFQ^f!x~PXRfK|GQB%*<=am06n4kE5o!;-SMvXt^&5HcJ52zU|=szLP2|LU7=N-&b zBlUB%?kwEfrQr7=;NSQ3$0ea+OdmP_(}R08Xq8oWZ@r!hr@t+Optn-F$DV~!T;1c8 zXS;4IP72)O-#b`%4 zKB-Lk*s$uvpe=RiqAolV>DK~mKF2ErXu9$I!$%UFtvTnw_s?y}t~X3k;_|5vJfYvY z;cLFy%WzBETkRgY%0yh7ODlv5a`}BZkPsr&|S5Hl8ug{b=TQg?|tRrOD?FIu20&Gx$vGo?Zp<1dyk%{->bQK%3^^2z-nA}dwFIqN&db}Ilu7*TU#fPVt=xRL z+z%+c>=mmiL+z?J6&EH7$rGy$HhbQ_Vi+H} z{JuBrke(psr4sZUV0LBx%SLp3^`y->3^47Ud6X z(DzgL2Z0b58@=8VMQGk6(kT0+LX6o0k)!Yr!eIJ&rM`|0V$`aL*x@f!BZ65KcP(560e!jJuIyr*nD4B5KQHz%@t(O{QT&I?CEQ((ec2Y z*UH!0I6mO#3-SL3x9fRI@LcbnA;;b{V~EJi^fB^~&F7Ve0A%frn>$N}J-cGA+MZP+ z4r5~nIz;o4883ex@PbFnipD*)rTnM<2T%Bg^69;shL4_fUyao^`uh4u}hx<@V5s%!xb7JY+i|va1z8s>7OYewvl>gL5 zAFRKrN@8hu9Gt-8_(VT{81;lM$Q&1;PwDq>CktqP((K&EjB%>S<}>ex!mTUw<`|pM z{PWP>3005k@XXpRpWf_y2`t}M@d2Ztlda3kX?|E^o77}w{8`%v9#~JFW*o z*Pz_??q6yCSR?_qu=^E8 z!N8t`2BIY1FD~rSVN1Uz`;HN8Ts(wVo@+8Oo2>{qyKT!~RAaSBH0U z@9*3&P=4I^gLAV4e>d{I2ezq@nwP2?1&@_c!shoq!0Yl3_mg*I82N8}(KBP3FL4$X zof;)TcE8774$JE);#n@jZ3U~z=G|I^>3*mDKP&tLKcMN!3l~)-IDgdd@28@xF+jQW z*!7Mgg?|tV*6;qTc@ZzgcfE{*@`kiv=e}h!l3fE_e%~81=B)o@QXs;pPNEl*qD10y z#!k5VpqblmY6ylk6Yh9gos{67`rXG&I{9SxA_0{cU0go;bs*#n>;mx;8BQn*$@wvr z@~fQcrSnWwIDc0d4y)wSN97_hP8i|yR%BC)|AK7{+Aj-`%kR5GmP@LGh5_xb-Exk{ ze`rN+|0|Qr_p8gnX4jxG2Dy~~wD&)E>^zTXvHMvi3je?tjIDnvO@8Twn`)^Q@J*G> zzO3IR{8|faK3^vk9?l#8#8N885v9AV-gMI-wX}OmVp_OA&+&p;laB6p94EzoL#I5o z=w6R(_nfDMTz)?o?ngD2maL%qP2EEjcDNmx?iqDo1=)NyFA%1MnqLyAQU23f-fy2& znK0dR({Lej{y`W#KYC`J{&SjtsP603D_TINRrlHc-Zl&NG69+uo-nnkS9(OD2>TY# z{uo!JLA+Rj_g9hMmqUDkt@qQ@5^Nusd)pwP0bRbgd3^j-$MIR2KfuQaB-?`KpH+>v zJC5(fN%OwXo^`90`+R?gf^b;i<>VSCJkgvOu--z2h}W%aUG++d`~9~2fS*SG`ajnw z|Ec_2*6A)J%X+@~syT^|?0(Cd5a``#+*f&n6x9lQFNl1uNto`NbY7^~4+sM9y*GUi zoS^yVeqQJK`{;ar!YLqCcoLZPg*Llz=)SIf?x|@s|IEu?z4%ubcF$Y2ZE|joBERnj zA!Zis4=bc7YYY=E9K|Q~Y=8O3@!^0V(0uk8FieXS)6@U;ZJQ!L6axK1> z@axZ<`Kw2Wu%+iJe^YS_GN*rSA|JW@elTqP6xu2NE=K6gh)k-X_oJ}uqV>K993RmP zfRgy)harBH|J1j2ZZ}XR?0B>7H|LLy4TDX_HWM`CM40?nZ@u~!b>hT~H-jsI%kO(Y z;gFbO13Rk!hu==gh^s|MX1w{^09<}w4tDCw7tDvs@V8dyk%4+`$c{J3?VP{s>IeD9 z4)jl)Cr0D;>w{z7^2k29;ZUj}kjoE+!Vdd)A9GtN|Ec*bTgelUMdoK(p3YYE2M2E` zUo*tB3x7k7w=uY}1`^?vT}w?`*5b<9H%{vULH+mqG(! zrDuYftA`j<)uJ5hzqDghw{sUf)v7svrYa1woO*U#oGHaotuCSGE-91fL(Z!k{xov^ z{ggW_FY^>@+fx2hb+sCQ2*|d-E4$gg=uqVMgW&7eABO*FOYnBl$0db5HHrVN0b6%1 zRp$8Mb6>E2Ij+d+gA~UORJ!Taw-N2Oy3-P(%K7sup^!f9@`exfB8=v**!t;2C(bwd z^C8SOO_AUCf;D;#egEB{`JZOXZoUUpNLSRv{KRF2oWFiB7;<_n_@J>#hQBHf+D*7e z_5B>tXbY7ZjxT-+fGeAICpPdzc=6BW*XgC2gi$w7bDI?Tp)fF5;#AV-kr;dTyLr|& zndVEF@h83$92f(3xFgZgXv z&ZaLCwTMeEra%{S`ecd^T<=)jWuq^~sv%QHxgDrNF*BZY)+q8lAz=77>e1nB>VF-y zf2U^HjN=ORcDVj%R`C5GxR=@L5D`fIugQ5YuP;?1`BWWM$8{<4L*Z~xKQrCKn4bSJ zYC{*h^U3?XioX-gRk;0J6L;w9Im+j1i5NYGPC8imOpRQp>Zs^}0Gar{QeqIewaext zM@TWxCz*fFz6Q0q0?*}p*84)csOrhgWZEC4{h$B&*@7(xyp(>d z60D~NbC^Dl+`l>Ozn{&u+mHg?O!3&)DATFK@|LXe!LL=2%a4YE z=jrI)6B4Qa<&+qm;M<08V&i_QBeev|n4rJ7e z=~pF1zB2?Gm7hC${E}jhp^c&AS7oBnH+g@<96q-n(HIE(4o)fU;EVD62v4s*-Grn# zZPL=)F+$|>qv24u-Q%K8Jl+4I2K7TTO_I*ew-*%oeRpuS%vw9sf##o&B>fog(uk$) zv&@d|{iVq7%Yj7Ri`VZh!hyT{28+u(v4D|}d;cl&(|(ZRuOc#gBgW5TCtuxoM}l)x8FQn{BxpV6bi~0JKG~df z{K6R9N{$Z|%fX_*U)%c&bpM4K>_bY`NQp&+K)G9^BERkr19ooT_-Kv@yZIFJ+LLN9 z;+gEZLuosg&uj^Wh!v0eeQTormtcO#j_L-FbjM~?4mly4C?0ou4u^$iwLoQ`>_;}O(FP)S7H51hd zD=#k9#dUFG;HVcS3tzMR! zl#$J+9teS+jt|{Vr8psfkbPP6Nt&Oe)l2Pzs^ax~LfCq>*^ds<{PXb{MfXNDU>nOH z-*J4fn(~(g)(u~csQMZ}Rmx?wejYCT=9kfkJKuJZ2RX`$^XCVrn@zh7zaT+#JCndKqzmUB z+sm{7Wb^y8Lt$uP&}&#F!yVK>_s>!x%`9I`SKJ?OD4w!=^w=gR9IIP#)TpN#vD0M; zlp^067YuuJpXHg~7UREu{d2x7&?5g1&n+n#UaRmg0-;*7`>CB{>vDtSlMX|kOX zvik?y!XV}I%NZ?lDMk$*Q$3?xom`{p^w4(|#r~8Bn3_+Ib$mke&+f6+Q{UF1Yuwzc z#`A<+{q>i_tI58*1NTWV%8`G=Wm-E{a1B_I-}eLaVZTO1kCb8m3AbYMS1OZjHDiu- zcP``j{KZgs5x(k-{$ery7@4W%?kga>i>n&N1L_t1!yD$gURzSb0?FQjseC~8=iLV$n438On8mB@SbsLr>ROoLvc;r=njCM7AKm3Nf zldVwUKV0GR5vPJ+qLOX%;a${U9*~jW@2n8JkH-75&-e~BP<=a(dVD^yKb!_ zqWMYMUB(sik=;L-90n((ZL!uu5uWfnrjhre8hzOL?ulZ5)&tbGF5PqBnHbfaGm`Wt zwjk$E{O0uc208dIy)g3BeyT4f1LVx>#>g)bzdz==b_vojme+X0w z+rEt&IsNSr3O+HrR!*>x;G!Xg4KAj1|D0*xS{;h{!5g|q#A_~9k>PHyvF%SBYO(Ot zsMT3@ius`^7(DtIpGY1{{V$PAoKhammn>rj1XXUo>{=jbcAc2{Cr^U$6L&rwd7Y== zcgb8nsW}XS%D&d|!er>8AJqFzt}0>Zt^1y`uCp*O$R^Ox4XXv;rt6l zzO^+7a!2vHYgW+wvs-3G=&*W>@Uf=|xJjYEeZjW($`pf0>c2RQy7n`m9al6jIIJ%0 z9!e@1Tije95{zwM4n zYI7Cy!--%h+`KP3cd`tP2L_a^snj4bET4O?*gpt>4OvC{tJl-~^RXj&4xbt@o4o*q z+Ob!=k#Zvn|C=xNZ0heq?}<1hV5@mm<0Iw<-~) z`#k<3;OeV91g>1pZM^YbjJl(jXsa8mk`F9jQ{=kINrO8xWE zRU4}YEAmT&!{FAh#U~HT=*%~Mup@QBBv?LN_mlob5k14dfC>fSIzjD7Wo%Ny0{ zeg*4~sBrwOv7-d!8oFRT+O zyr%w%5ZUMFCW z_=Eg%x%*Wg0xC6wMkIfgVM71ggo^j8Y zxF&}~x0Y|Ienb81GKp``h$>`0-7_=u75ROCs2h=*wX;fuPbeU=nB9ys*aB9`^|!~N z;M{$X+~bM_hwYg7bJ1!glDRR6BJ4)R{(%p)x9nMXb)5_g*024q(w|R!-t8IR->8G@ zPZLAn^`d#V0^8~He=LuO$X~0GixDGhU#cpeKQSZ-7MYy1jlM_o&o$fr`*XMkT~^BJ z6;tGw=7hti;eQ8z*g^fToQG8g6)g(B^;*H--C@D$%^_w1BJ915ziQe99%1O|=t+M# z{vHzq@7-b-+s>uuf8F?)pW9W*de-2r=AI8S%NLeA^7*dK^!Y#Z0R~6U(f$^^gCg!G zj=#SOfz*;ihgyb-QKh20LBjYtOk?Ep*iOa%ffrbO`7l}gs|3BWHs|xtwIQPp^iL>r z{?PPb$VeFW&%{TDf~`N^>kE`g1XTw))vDa{MJxi~Y>$?u!^ew|#$ycL&K8gzEWi4| z`BO{6K(~#G@d7dWEgk1>FVP?jU5y)6q~Px!aJ4uh!RDkC%Ss;)I{m9&;m_1?{9Pi4 zAvS$Yz9opzAyeZ^-jWWqOqt~|by2f|zxzSt!X1_MA_=x`ik{aem*yv@u!My3M?FJf z)YQk<`WVRYxz+be5Bmv8?q`OOs35n0;0@<*PaNvIT#QF3fLgbd=1W)uS-{n&&R`gM z>iD-Cs#44-+^Qw^Z^USpPh}|btAP-8;!8kkybM==j!TYj??lFZBRVBqed!qves4yE zPRMb>%8e%ylpd;(EWiKO1lTF~e2zQxx-VX`R8F7&v-0+!D-}Y8f78M}-=?=5!q2Dh z?dQ|y|1A6}U7)W;Moy7Y0-~hg?|#s|zp2Zgy&~LNpEGBtUN!Zx3!j%CR^j-zekcU< zf~F{sr1|H(32k>mnvufa(~;!@Za<*X3$!cp|LJB)k*-IqJ9u1)Fz#H@gKwNa5D^T4 z+tzJ6)g{6M>;FC&@`O*4*aG*L z_a)^&wqY4N*YOAgcbB!PDDw0EU~hZydWTesd)FmQ(3GnZ3U{eNEad#LzoGCayJo25 zJl#KCR^k(#s!k$zG6XwY;UDu)tU~ z8PfHOT-!R@-x~hx7`&;T^Cv8VV7oy#;aDTef41yiY&D7cAMEq}+Bkno6b@y5H@z?~ zqWot~$o1x3w7>0Iy1Pw-r`TU`0|%vhvYlt>^M95;Q;E1p`x~1-;&bOy6a>>OeSTQZ zrv7hf_JHQe4LFdh2fJdS;`u#3@O)N|+_9Ga{4a)|O)q!gUzQ);;qHe!eSX=P35x=+ zOHsZFlIN(a5QaYQ7@Vhg{*Wg;xp4KR;1lIP^Z{1IC?q#L?&SrTRdD`ZyBth?n-1u^ z(dYjxmb-X6YZB)6J~-T<@Gtz~m2{!8*>uW33*FSe{At9b^MSuctZV1|i|%1Cvoi6< z)6HUZ`}FPQz?EId++OoD3Vp5b0f|3)Z_Vx}MfZ(;XB*|y{3OdaRk{6;|LFd~>urNt z(qw49a`x#j+G+|ul%RNij~^JQ#|_)`&j~da?r4xMr~Wx3Pfp}>`yGoyA-Y~Q>+mHp z%Ii8IFJjDN2Qidaqa&w0z6waS{2l_$=P-2TAJV7R&Fld$g*%73<7 zX5F~0L|A#UvV-%dHwMDQxx*8UCsY2j{@|3Qg?z%sHwGwk`#E3eb516RoGnXf{aAiE zsCqDcJ_x=2TisQW-S6Jw4u;pts#1H<=WA6(O}aF;R>6PXaQ*2k<;(I}Q6rI8x=A3xx5OB3Vf(wpkjByFc>HnF!UsLBX%n`ik;Y9 zs8|R{cYOQabNmbZ`M%>ld#}CLvo=?de!>Iujq!V8pzo^q0L6+B!cDjT-^LAMP8c6H z=F#`@rvYjn&Ay)30_UIcUPoOn%Q?;F0F>}cS$;qR>n~hbQSTY@e>|6&e=0=(q>?u% z)X@22vL4L#S@!N0iTckUpLU_|3du^rpdg`q!A%*&v-%{S7 zpdbQ&XsHS0W-q7RoE}V^&|tE`U&7J#H64U}c~%5O7uq-f)-;5a`L?(3WK?ixh5OQX znor%L1Ihdy`UwQ{O(RFGd+@-5+A4ZmLG_M7y9Ni*NqAyou)i-4Rn%nTV9md1U8V; z`Ldk>#;;!3a%b=kpMBCMBj1yr9% z(n7%bcUM%yQU9E@@6r@28HeI08W32%xLpjq>F(1fdkN-?eA1gphnR7n1Oo!&_oNtL zQuCx73wt%$g9er4l~&vZ!GIuT{2>i|Rg~=O{62(SEod{S!_zz>*!!v#RNwE4{7YO< zYOe>9A)f+^=aX`#&%9>*p?DCFQoFQTrXrbmpnv;X#2v%yp=vzyw-OUXINvQ8*cJ7k z36`fr>&ZDhjyCC}DP;cp2&g^|^UjP3BJ;eR>a}q<=Y|OPsS2uZ&e6fTtvb8s=IHOu zz28l=wtxusyqzLK`8~0qjKnW|D$bwpTKsg&s~{+D@*^z*CwqsG$)4t# zI;|}@2jKzw!}vo9;A8)$y{<5j#Am76yzha0IDY+H$M{3CM0jo8<>T=KD$?-P?Kf?A zRS{wRoLtHL_u=4Qz0#CE3H6_V*kNZPCG37BruQv{4xXzDt=z&<|M5MWOEB>s`AJk+V!^$5+u@2&nUeB*Y>mLLU+e#>NiZ5kS>sLi%6{&c- z^4q>pf9ehcY{`F8oH+yepKk|e?sKbTe73(p`J<7*%cs(2!DR8YVV))L#4O)bLjAps z^pJE{HOuZX@^2BKySagaqXC0|{-t?9u^!=e`)V1A!~Spd`A=P zb{L#^{xI@kekZnci7X-rcf^FYocZq~z`lvr^K}5;FJAt7xu&Fw(ER3I>hJW{LGJ9i zC(@*t?+a*o=i4a>D8&0 z62jxVeB%>fMO-KIGqvddoLm4;qorK18u+Ko=|;V9}XdT`OY36kbgUTNLiB#ORk5&NBd6sn7LZ0djDVk93A?fzhsH>ev~r4 zV?OiW$G}a;mZL{I1rg1x9sbQ7M4Vy>A3!Rj{(F%ThBsYo8TcFd&;EDLr%pqD3DT!# z2iCIufCkc~X*aYx)TAyNbf#@FWBE!c<%5Rk!EL4U0JGac+9QONxE<|b@+>2ikN6X)|2`7# z-W%QSil2%M+8kDtGx=YBuz>!)Pw8Of*?sTdBOhCoaKKxaDC36kcw${S{rizPc!uYX z3gly7-|+N^Q@R;f!{dkhil{&5mJ!Zox@`{l7D&eV$>()W$R}?OcC_+LlCu0jH1P6v z*e3KpyZYHJsVOHkpQt1PA9jENu3pMA-!V!}dTboC@O@t~w@Tm(zNWvQ&dC4nJ#DQ` zF#i5ySKV8^NX}7yAoDMICc@=bXZkyJ!TjU8*LzKQ!Wi5XkT|-;HKaNd~br19CX5mLCgql5_fwG%QT@S6=r z;N|-j*}+8LcWkMsZY{YZ@QF?{{&W;z=>foBEGGltK3k3j<6=`Fs5k z+)pE_db^h>8DA)e>N9x>@MFAaHAZ87D`x7NX&1I@$yVvzs5seVw) zXc5QLMW%L>Gk$q2WE&RtL-!cj7~lW#wX}cv!8FP*?`eb?mfw%%%*OoJhG`Bn%FQ?- z{@CIx%MV1s?~=Z=ty-!{gm1^$n(z69@}>XM{J;S{Ec&Wx?eGl!&#uc`KOR%T_&Oz& zuk4rr6GLj{Gw&k*Iq~}+i)mtxr)wPBRZZuEizdjJ_P^Bit5hU9w(hWFo8=tBxjxhx zEFqMC9|__oLxdbh`F%H1dB| ze=#|(wPgIRe0D!DKtFYx;r9Xc8IKMFZHr4t=!nY`9$hSB|NSE2^3*`_?;l0Em zWkxNbeEVAV-%kflZ+|ZfXrUr|wKII5|3?2LPhWLr{?yFC-T5QWinxnm`me|U zp#G8}$ba=(*L%<<+`r=QkIKuIaTiKbFySbo{$j@{s59WjpNUH_|FypGprO4vNBQtl z+8=OH4|;q1q!k@P$eFRjXZ#$1{zM+1*G|d!MG0WBV|(+0k?7ClwzlYYxPtf!{HQnV zeqe%xsK3waOVkAM)$?59#EcL1o8_m%p;0gw+x;BsKe0P+f4nK@DBq}%?zfM%P9b^Z3vc6^y?h1EEP@ho6Z<{`3C|$6o(aNCZ6SEfKpP7=V}mp1Wec za?sGa<`b*PX{5hw=`CaZ0m%PW9$D@&5Bbl=5#Kt_lyH=6a93dYyi#O??2u>O-*R^$scc@wsM>!KGH9OY+xVD|&$e~-O0wYC!PzoWLhZ{J!> z1iX5WY|sn*{RmjY**0r+GMJe4|6BXbqJ~g@V-eMt3_6f^o&Rj$tPtXc1}2+9m_PsP zjEK)l=HHKlN2`W7bu&#RQ&DIVW6mib$gjo>pkF?(n#@}E})Hu67W$;Ar* zI2r2?h=SK+ekIKaQj>YZ-TN;af%~~If1PFDZv%KeoYLaMmLT%iX>)$+#ahOf`1d|& z;l(+00D2++M_c?tVk6@u0zV>`-47CB{9b9CtsL`@;jMZmk2GU^h+;OsZ-6JwR?2ja zDspY5d))91R*ZjJ#pZV{_$nSi7o5TPwZ>A$3d(DuB zolgC)oCtU%BBy`969(ApTK4LE{~#hk16F9pzxnDq%O7Zfmj_?xs>rRli4R*hl{5ar zSNgtp)WcERZSEy|k^j7YL#G>F*dHM974q2qARapC8eU!a0R7Kn=1+CgBfnkXCzR0N zXMYnM3Y{4ey9WKw(EI`Nzbo3dyp4Qp?}4)|=bWr!eAImUzGdsd_D9gm%mKt2OldRD=BQ;e+HWSK#}F z2Cf~o7F_*R{0CUV`1|3o#VO&+=I(g^9eH&~Remw!uPP{?UZjIIZN3Db&qO|_vvsxW z)Ec%QKV|;?7}&URTuyf@K+BWAnQn=ApdhXN&h=G+4dfT}lpO`n~SOT9!YE zhrfq9E>owgNWCqSO5@E$96x-gdPph1XqyRCiOYMK)}#KJ5HY$Jk#UxuJRzL@{YWHa z*U8^+br|{2;m41^3^8N-?@RjoyrqLB<*oq^0m%PZ`NnejaVt)!HyQei-4EiRIMdkF z!zP4u8TW0$edm0}FDan+wbw>i=x?P>8>k}3{_E4h`an795gFTT_FHye@ri~4_sPRD z@`K5ijW==+TZ%c#XBN@@&eH%Py-$d0lac=um+j&8pPcjJ@mqJLG+#VG3uHsowBN&# z|Fhm^f58fKj!&1r>7%5-&wxa@wfKEAvsx9gMuXVCUj>X0@|N*)Hh{;(uFvhyV7>}I zH_rB}BtkuiOBU1bwUG8K$z#X+AQETVG<)+m^p^;Hk3z=Zj|R6?bf{`k|A|SvF|fIU zTXJdIo~|z{n19Fs4-O8y^nNJvf7WKT&hW9|jE#04dGuOD=i}#*z{}U87h=B2tDpCp zO+{ppz&DoB`(9l=+_h@(XQ`bUb<-%bJ4)o|2!K;1<)f9w!Kkw7d$q6e`(s#`5phYv z=9gW}KV$-zICP*OAA3kt;=nG23QmFar?RylnSLJuSC=`u{$7XtpRlW&9(A!~{IqPQ z-|Jw=jMWuNXXFQu_`*#bhWR|<2T;uXL$Pq_eeu$;Dd>Oh*Sli(xf;@;v=@)yWBwr{ zkUQ>Ob~FkmDxK?il|jn!bdzSY#jHOd3T~a+j3c<3I7iMu+vI_g8!qtKWK6$D{$&^I z2~PRQzYR57Uy@jHv|r{N^A9D!bsKcxBnRUk6VtnISt(f~^v7ht8{Po@-30F9v-g)y z3?a#zbAwZRi?}?YA10US_u){_C*IM&CJ?!hO`c7iFXN62{VydkrTXZ?Ek>6!nKrr(We*l`;P04Vph#s)wy1qryEa)TF1yx;xDW zi#Xb^@|E%huf#*czc;IHwN;U#+C%NG2FqA~N*>iW*PCF|yT)fTU*Y~+{5)*hQ8SMA zqm(lJJ`!5op0iLI8$zJJMg8zm`HbIK&GdU6d~fXfI0yOIH{1K)eQ>#)9GS%vU?oK0 z6FSAgJc%*VDiitKW`4xHv6$1eD04YuJBOc%aNH+???VGnsyGfNbyMi_?P9|J>({IH0Cg#l_?W_`cb{Lqcj9^A9D$@6*e6`uV6xQ-$M&k{mIYApojs7(XW*7VW(6r&g-T zyUH;(TRJGX2Lk_4LjC0_S}2HaQQveK_uu?gO9xG|;P&_90aI+g9u@TuYEmZjGyP!ty#_M&)r)W*hW%eM zaj(oR^gr(f0Kz*#9MYb?E7KDccWUGXH)oWMX`25Aw0Em)0nPUn)7;U-XOe zP2!M$Z)kl!wl4CYb2?6MTE~j@6BRQ3J_`8w+hOEmTP>IMYw+tY*)I$T<<#FRGeF9` z8=dYiQxnThFP?i%FCzlJX944zW+MOotIIBKR}i^t-q3BtToGp>3hh{RtLv>_-aae zs>niT$2ysN^9k+u$zuNLSa52A4ym8G|F&Cwt4qTQ(o5*?DPsOgLM|(R zr8;wB?gzG)h{`Hh{y+ok#yy|V3UL3euHXE_GJM|zzNm=u3HIngIiy3wK}E>_DeNB- zcEX$!@Hl=l>ThbD0I}WC0d-JK#yY*KNgZ8CupF$m{VgTsx1TYAY=5rn^C#$kZr$me z{6;0?o9(0f-O@moQ3>vjBh#Q29iBe{fUP8=${lmU^2>&9)tZ%m7e20 z_F}(7`9-U9o&NO)T%`Gf<%zKB=Pv8HnZW@&lhW=;A zE?-rrOBnw=m+E87wXnit9#@Ne>;p|gw_LKTB^~(smOdqn-xCcrebAwuh4X`Wc4zTD zDfbTP(o?Njzgi6PzmN7_YO+TDVQE5mlE{o3CKTYYev3d0@)}l6pnJ=p$p!RA{iDsPgB5>TGpZ|x*$4<>v{fvr1|0G|Jv`9+xQ@eC9Vhk$q%TfPv82S0Rc_~>pb_W)i zDQLc|IrdM0waUCZ`kx!`*w}1&E!&@7vHO7$hVce_U(|oZW&3*+Nm)O|FUB8=hDVrw z+G&aUPe~iu3kS@92>laukw;hsF{d7ocF z)MmNEWJ}gI0^!evk-W`Nc6~wxj>kzG-@$`sD=6YeI|uNa=mkG8|rfa32!n zgZr;ppZ^YB{l~vjQa<4!Enqq*c~Ws8xll7{=crN{C*Ygy-?95a479ZknjCsaMM8@r zD)YLTa{`|EUKYC_7$8}O2Kgy!a=-5qazN;3_{Sg8K&#M!@eLxe|H$t8)n8XD zh(BMy)|~N&dh22DY*g3>29qp>#pR6~#T>0y6S4b2JaihJQR9`5{YO>3nhtm@=e`RC zhm1euW&(b^xziN+Ed>)*pA^W?LG`rmYbE3FM*yayy8S>t_Q_t&%0op(>^^;v`S*2j zaChYo+4>ODuhoK+Hx^fs%d`N4-49|Ru;9h8za4_eN7-km@Wm32@~d;${lEyNAJIVn zUPX3QD0Q9o|Kn2^GyYH%gx*_r!BLC-FL^z39(=Ok8VUV$Rm{Jyha!^KBk3IOzuj(T z`JE^x0{%Q&%=kkIupHNy>kEQOt7eV&?r2>@uI2F!kTTj|X^{vuO^mz0v<)FoC1;KX zx=Y!9a~UXqKOBM+EN#aR$NsOf59W=-l-xw&0sO-J`#PvtG3jYY4er0W@>v&BEV=sv z-#M4v4`LvUH_)HP{j1BO54{3P$u@!CTte^Lt&K4KP)&Rl^0DQOuNjv=t|bWn9q-hq zn)&xN@XO@w-aH!hA5oNjKx-N6cVqnliF#Pb84KxP>l zlxHFTIs4tGy-=E20;%QCv-e?D9Q^4O*(CfZ?!Ps;Emzse zIX!(~>3sdo2uoVMeY|%X?!QG%RNCTkU2UG7{LGk*Mc zrr#$5KYstW5&aKUHxlPn$T@yF{T`Ih`1>0G4z_+abtLl73$hF9^s-?3Y8jnxby~P- zTpGPbjQRJT154if77;9e#R8gI<{yfNfmXl8Wyr^#*)sl^-R&ykDiq8}DSto70BNNz z7aM=V{a3c+^qDOZj;FV#FHx}mfJkur78}^dfd9TKHq{&VOu^B9!)KH~+8p`!PP1OL z?u+~H-?aIa=9b)Zfv^6P{{OL#2P2Nxga4?=ovuHArYK4X<);_W{<5wnu(h-pI%yZ) zcWj+^RR`CQal!*y4o&!g{`3gYu3LNg1@f`yNQOG@36!$?xQONxeRW{72puq?!Nj3# zp=RhICC959E7nMf&<~-B1*A)KZO|)(4v+*AWw;zbwH7{CJp(d~DYN`^O(?CFXX&lKOKiWkl!~>=+3X_yFjA z)PH(DIqT&sXZLlcFP+x`ruVy6g(3gPzTCPn&YYus(_{4eI5H0WYA5dt+K>K_tz(>$ z>lPBqFa1pU6c3E>A?w5>y+8V&Ba*YTS5*@JdiB6FhxG?U!_-%j#wV>YU(-MI+2#^4 zNBcqk`FjlTb`&~1`Xm3j+rDmtx+yq({1I|h#q@nGOvdrhJs15g?bD+(W?FFg_+!C? znC%CN@U?xbnwfji|GcrL!`jp$e5d&dSzBV-m&W_yrB<_ToAWM$&IZNRGzyFBW literal 0 HcmV?d00001 diff --git a/spentfuelgpr/spentfuelgpr/kernel.py b/spentfuelgpr/spentfuelgpr/kernel.py new file mode 100644 index 0000000..83c984c --- /dev/null +++ b/spentfuelgpr/spentfuelgpr/kernel.py @@ -0,0 +1,324 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- +""" +This module is strongly based on Antonio Figueroa's work, who kindly +provided the original code. For more information, please see +https://doi.org/10.1016/j.anucene.2020.108085 +or https://arxiv.org/abs/2006.12921 +or https://github.com/FigueroaAC/GPs-for-SpentFuel +""" + +import numpy as np +from scipy.spatial.distance import cdist + +def Kernel(X1, X2, Type, *params, gradient=False, LAMBDA=None): + ''' + All the kernels have a bit of noise added in order to prevent the covariance + matrix becoming singular. The amount of noise to be added is also a + parameter to reconstruct + ''' + + def dif(array1, array2): + Output = [array1[i] - array2[i] for i in range(len(array1))] + Output = np.array(Output).ravel() + return sum(Output) + + if Type == 'SQE': + sqdist = np.sum(X1**2, 1).reshape(-1, 1) + np.sum(X2**2, 1) - 2 * np.dot(X1, X2.T) + K = (params[0][0]**2) * np.exp(-0.5 * sqdist / params[0][1]**2 ) +\ + ((params[0][-1]**2)*np.eye(X1.shape[0])) + if gradient: + gradients = [2*params[0][0]*K,np.multiply(sqdist/(params[0][1]**3),K), + 2*params[0][-1]*np.eye(X1.shape[0])] + return K, gradients + else: + return K + + if Type == 'ASQE': + if LAMBDA is None: + LAMBDA = np.eye(len(X2[0])) + length_scales = 1/params[0][1:-1] + np.fill_diagonal(LAMBDA,length_scales) + + X1 = np.dot(X1,LAMBDA) + X2 = np.dot(X2,LAMBDA) + sqdist = cdist(X1 , X2, metric='sqeuclidean').T + K = (params[0][0]**2) * np.exp(-0.5 * sqdist) +\ + ((params[0][-1]**2)*np.eye(X1.shape[0])) + if gradient: + g = [cdist(np.expand_dims(X1[:,i],-1), + np.expand_dims(X2[:,i],-1), + metric='sqeuclidean')/(params[0][i+1]) \ + for i in range(X1.shape[1]) ] + gradients = [np.multiply(g[i],K) for i in range(X1.shape[1])] + gradients = [2*params[0][0]*K] + gradients + [2*params[0][-1]*np.eye(X1.shape[0])] + + return K, gradients + else: + return K + + if Type == 'LAP': + dist = np.sqrt(np.sum(X1**2, 1).reshape(-1, 1) + np.sum(X2**2, 1) - 2 * np.dot(X1, X2.T)) + K = (params[0][0]**2) * np.exp(-0.5 * dist / params[0][1] ) +\ + ((params[0][-1]**2)*np.eye(X1.shape[0])) + if gradient: + gradients = [2*params[0][0]*K,np.multiply(dist/(params[0][1]**2),K), + 2*params[0][-1]*np.eye(X1.shape[0])] + return K, gradients + else: + return K + + if Type == 'ALAP': + dist = np.sqrt(cdist(X1/params[0][1:-1],X2/params[0][1:-1], metric='euclidean').T) + K = (params[0][0]**2) * np.exp(-0.5 * dist) +\ + ((params[0][-1]**2)*np.eye(X1.shape[0])) + if gradient: + g = [cdist(np.expand_dims(X1[:,i]/params[0][i+1],-1), + np.expand_dims(X2[:,i]/params[0][i+1],-1), + metric='euclidean')/(params[0][i+1]) \ + for i in range(X1.shape[1]) ] + gradients = [np.multiply(g[i],K) for i in range(X1.shape[1])] + gradients = [2*params[0][0]*K] + gradients + [2*params[0][-1]*np.eye(X1.shape[0])] + + return K, gradients + else: + return K + + if Type == 'Linear': + # This is a version of Linear modified to include lengthscales for each + # Input Variable +# ============================================================================= +# K = a*X.Y+b +# ============================================================================= + LAMBDA = np.eye(len(params[0][2:-1])) + length_scales = 1/params[0][2:-1] + np.fill_diagonal(LAMBDA,length_scales) + X1 = np.dot(X1,LAMBDA) + X2 = np.dot(X2,LAMBDA) + K = (params[0][0]*np.dot(X1,X2.T).T)+params[0][1] +\ + ((params[0][-1]**2)*np.eye(X1.shape[0])) + + if gradient: + gradients = [np.dot(X1,X2.T).T] + [np.eye(K.shape[0])] + [2*params[0][0]*\ + np.dot(np.expand_dims(X1[:,i],-1) + ,np.expand_dims(X2[:,i],-1).T).T/\ + params[0][i]\ + for i in range(X1.shape[1])] + gradients = gradients + [2*params[0][-1]*np.eye(X1.shape[0])] + return K, gradients + else: + return K + + if Type == 'Poly': +# ============================================================================= +# K = (a*(X.Y)+b)**c +# ============================================================================= + LAMBDA = np.eye(len(params[0][3:-1])) + length_scales = 1/params[0][3:-1] + np.fill_diagonal(LAMBDA,length_scales) + X1 = np.dot(X1,LAMBDA) + X2 = np.dot(X2,LAMBDA) + K = ((params[0][0]*np.dot(X1,X2.T).T)+params[0][1])**params[0][2] +\ + ((params[0][-1]**2)*np.eye(X1.shape[0])) + + if gradient: + db = params[0][2]*((params[0][0]*np.dot(X1,X2.T))+params[0][1])**(params[0][2]-1) + da = np.multiply(np.dot(X1,X2.T),db) + dc = np.multiply(K,np.log((params[0][0]*np.dot(X1,X2.T)) + params[0][1])) + gradients = [da,db,dc]+\ + [2*params[0][0]*np.multiply(np.dot(np.expand_dims(X1[:,i],-1), + np.expand_dims(X2[:,i],-1).T)/\ + params[0][i],db) \ + for i in range(X1.shape[1])] + gradients = gradients + [2*params[0][-1]*np.eye(X1.shape[0])] + return K, gradients + else: + return K + return + if Type == 'Anova': + # This isn't working, probably some parameters for lengthscales are needed for each dimension + K = np.exp((-params[0][0]*cdist(X1,X2, metric='sqeuclidean'))**params[0][1]) +\ + np.exp((-params[0][0]*cdist(X1**2,X2**2, metric='sqeuclidean'))**params[0][1])+ \ + np.exp((-params[0][0]*cdist(X1**3,X2**3, metric='sqeuclidean'))**params[0][1]) +\ + ((params[0][-1]**2)*np.eye(X1.shape[0]))# Not working + if gradient: + dd = params[0][1] * (np.exp((-params[0][0]*cdist(X1 , X2, metric='sqeuclidean'))**(params[0][1]-1)) +\ + np.exp((-params[0][0] *cdist(X1**2 , X2**2, metric='sqeuclidean'))**(params[0][1]-1)) + \ + np.exp((-params[0][0]*cdist(X1**3 , X2**3, metric='sqeuclidean'))**(params[0][1]-1))) + gradients = [-np.multiply(cdist(X1 , X2, metric='sqeuclidean'),dd), + -np.multiply(cdist(X1**2 , X2**2, metric='sqeuclidean'),dd), + -np.multiply(cdist(X1**3 , X2**3, metric='sqeuclidean'),dd), dd, + 2*params[0][-1]*np.eye(X1.shape[0])] + return K, gradients + + else: + return K + + if Type == 'Sigmoid': + # This is not a positive semidefinite Kernel. Some tweaking has to be done + # to make this work. Probably along the lines of KdotK.T + K = np.tanh(params[0][0]*np.dot(X1,X2.T) + params[0][1]) +\ + ((params[0][-1]**2)*np.eye(X1.shape[0])) + if gradient: + sech2 = 1/(np.cosh(params[0][0]*np.dot(X1,X2.T) + params[0][1])**2) + gradients = [np.multiply(np.dot(X1,X2.T),sech2),sech2, + 2*params[0][-1]*np.eye(X1.shape[0]) ] + return K, gradients + # This isn't working, probably some parameters for lengthscales are needed for each dimension + else: + return K + + if Type == 'RQ': + LAMBDA = np.eye(len(X1[0])) + length_scales = 1/params[0][1:-1] + np.fill_diagonal(LAMBDA,length_scales) + X1 = np.dot(X1,LAMBDA) + X2 = np.dot(X2,LAMBDA) + sqdist = cdist(X1 , X2, metric='sqeuclidean').T + K = 1 - (sqdist/(sqdist+(params[0][0])**2)) +\ + ((params[0][-1]**2)*np.eye(X1.shape[0])) + + if gradient: + denom = 1/((sqdist+(params[0][0])**2))**2 + g = [cdist(np.expand_dims(X1[:,i],-1), + np.expand_dims(X2[:,i],-1), + metric='sqeuclidean')/(params[0][i+1]) \ + for i in range(X1.shape[1]) ] + gradients = [-2*denom*g[i]*(params[0][0])**2 for i in range(X1.shape[1])] + gradients = [2*params[0][0]*sqdist*denom] + gradients +\ + [2*params[0][-1]*np.eye(X1.shape[0])] + return K, gradients + + else: + return K + + + if Type == 'SRQ': + LAMBDA = np.eye(len(X1[0])) + length_scales = 1/params[0][:-1] + np.fill_diagonal(LAMBDA,length_scales) + X1 = np.dot(X1,LAMBDA) + X2 = np.dot(X2,LAMBDA) + sqdist = cdist(X1 , X2, metric='sqeuclidean').T + return (1/(1 + (sqdist/params[0][-1])) )**params[0][-1] + + if Type == 'MultiQuad': + # This Kernel is not positive semidefinite so a lot of tweaking would + # have to be done to make this work. Maybe take some product of KdotK.T + LAMBDA = np.eye(len(X1[0])) + length_scales = 1/params[0][1:-1] + np.fill_diagonal(LAMBDA,length_scales) + X1 = np.dot(X1,LAMBDA) + X2 = np.dot(X2,LAMBDA) + sqdist = cdist(X1 , X2, metric='sqeuclidean').T + K = np.sqrt(sqdist + (params[0][0]**2)) +\ + ((params[0][-1]**2)*np.eye(X1.shape[0])) + if gradient: + g = [cdist(np.expand_dims(X1[:,i],-1), + np.expand_dims(X2[:,i],-1), + metric='sqeuclidean')/(params[0][i+1]) \ + for i in range(X1.shape[1]) ] + gradients = [np.multiply(g[i],1/K) for i in range(X1.shape[1])] + gradients = [params[0][0]/K] + gradients +\ + [2*params[0][-1]*np.eye(X1.shape[0])] + return K, gradients + + else: + return K + + if Type == 'InvMultiQuad': + LAMBDA = np.eye(len(X1[0])) + length_scales = 1/params[0][1:-1] + np.fill_diagonal(LAMBDA,length_scales) + X1 = np.dot(X1,LAMBDA) + X2 = np.dot(X2,LAMBDA) + sqdist = np.sqrt(cdist(X1 , X2, metric='sqeuclidean').T + (params[0][0]**2)) + K = 1/sqdist + ((params[0][-1]**2)*np.eye(X1.shape[0])) + if gradient: + g = [cdist(np.expand_dims(X1[:,i],-1), + np.expand_dims(X2[:,i],-1), + metric='sqeuclidean')/(params[0][i+1]) \ + for i in range(X1.shape[1]) ] + gradients = [-np.multiply(g[i],K**3) for i in range(X1.shape[1])] + gradients = [-params[0][0]*(K**3)] + gradients +\ + [2*params[0][-1]*np.eye(X1.shape[0])] + + return K, gradients + else: + return K + if Type == 'Wave': + dist = cdist(X1 , X2, metric='euclidean') + K = ((params[0][0]/dist) * np.sin(dist/params[0][0])) +\ + ((params[0][-1]**2)*np.eye(X1.shape[0])) + if gradient: + arg = dist/params[0][0] + gradients = (1/dist) * (np.sin(arg) - (np.cos(arg)/(params[0][0])**2)) +\ + [2*params[0][-1]*np.eye(X1.shape[0])] + return K, gradients + else: + return K + + if Type == 'Power': + K = cdist(X1/params[0][1:-1],X2/params[0][1:-1], metric='euclidean')**params[0][0] +\ + ((params[0][-1]**2)*np.eye(X1.shape[0])) + if gradient: + dd = params[0][0] * cdist(X1/params[0][1:-1],X2/params[0][1:-1], + metric='euclidean')**(params[0][0]-1) + g = [cdist(np.expand_dims(X1[:,i]/params[0][i+1],-1), + np.expand_dims(X2[:,i]/params[0][i+1],-1), + metric='sqeuclidean')/(params[0][i+1]) \ + for i in range(X1.shape[1]) ] + gradients = [np.multiply(g[i],dd) for i in range(X1.shape[1])] + gradients = [dd] + gradients + [2*params[0][-1]*np.eye(X1.shape[0])] + return K, gradients + else: + return K + + if Type == 'Log': + # This is a non positive definite Kernel + dist = cdist(X1 , X2, metric='euclidean').T + K = -np.log((dist**params[0][0]) + 1) +\ + ((params[0][-1]**2)*np.eye(X1.shape[0])) + if gradient: + arg = dist**params[0][0] + gradients = arg * np.log(dist)/ (arg+1) +\ + [2*params[0][-1]*np.eye(X1.shape[0])] + return K, gradients + else: + return K + + if Type == 'Cauchy': + # This works very nice and fast + sqdist = cdist(X1 , X2, metric='sqeuclidean').T + K = 1/(1+(sqdist/(params[0][0]**2))) +\ + ((params[0][-1]**2)*np.eye(X1.shape[0])) + if gradient: + gradients = [sqdist/(((params[0][0]**2)+sqdist)**2)] +\ + [2*params[0][-1]*np.eye(X1.shape[0])] + return K, gradients + else: + return K + + if Type == 'Tstudent': + # This isn't working at the moment + LAMBDA = np.eye(len(X1[0])) + length_scales = 1/params[0][1:] + np.fill_diagonal(LAMBDA,length_scales) + X1 = np.dot(X1,LAMBDA) + X2 = np.dot(X2,LAMBDA) + sqdist = cdist(X1 , X2, metric='euclidean').T + K = 1/(1+(sqdist**params[0][0])) +\ + ((params[0][-1]**2)*np.eye(X1.shape[0])) + if gradient: + da = -(sqdist**params[0][0])*np.log(sqdist)*(K**2) + arg = (sqdist**(params[0][0]-2))*(K**2) + gradients = [da] + [params[0][0]*np.multiply( + cdist(np.expand_dims(X1[:,i],-1), + np.expand_dims(X2[:,i],-1), + metric='sqeuclidean')/(params[0][i+1]),arg) + for i in range(X1.shape[1])] +\ + [2*params[0][-1]*np.eye(X1.shape[0])] + return K, gradients + else: + return K + diff --git a/spentfuelgpr/spentfuelgpr/predict_posterior.py b/spentfuelgpr/spentfuelgpr/predict_posterior.py index e69de29..0ccf7b3 100644 --- a/spentfuelgpr/spentfuelgpr/predict_posterior.py +++ b/spentfuelgpr/spentfuelgpr/predict_posterior.py @@ -0,0 +1,179 @@ + +import json +import numpy +import os + +from kernel import Kernel + +def main(): + return + +def predict(): + """Calculate the spent fuel composition.""" + # Check if the kernels needed exist. + # Rationale for the choice of these isotopes: + # - isotope fraction > 1e-15 + # - stable U isotopes, i.e., 1/2 time > days (omit U230, 231, 237) + # - stable Pu isotopes + # - decay into 'interesting' material (relevant for U->Np->Pu) + # - stable Pu isotopes + isotopes = ('U232', 'U233', 'U234', 'U235', 'U235m', 'U236', 'U238', + 'U239', 'U240', 'Pu238', 'Pu239', 'Pu240', 'Pu241', + 'Pu242', 'Pu243', 'Pu244', 'Np239', 'Np240', 'Np240m', + 'Np241') + data_dir = os.path.join(os.path.split(__file__)[0], "..", "data") + kernel_dir = os.path.join(data_dir, "trained_kernels") + if not os.path.isdir(kernel_dir): + raise OSError("'trained_kernels' directory not found!") + for iso in isotopes: + fname = iso + ".npy" + if not os.path.isfile(os.path.join(kernel_dir, fname)): + msg = f"Trained kernel '{fname}' not found!" + raise FileNotFoundError(msg) + + # Load input parameters, training data and the kernel type. + kernel_type = "ASQE" + par = ("enrichment", "temperature", "power_output", "burnup") + reactor_input_params = get_input_params(par) + size = 100 # Needed if a subset of the data was used for training. + training_data = np.load(os.path.join(data_dir, "x_trainingset.npy"), + allow_pickle=True)[:size] + spent_fuel_composition = {} + for iso in isotopes: + fname = f"{iso}.npy" + trained_kernel = np.load(os.path.join(kernel_dir, fname), + allow_pickle=True).item() + mass = run_kernel(reactor_input_params, training_data, + trained_kernel, kernel_type) + spent_fuel_composition[iso] = mass + + store_results(spent_fuel_composition) + +def get_input_params(pnames): + """Read in the Gpr input parameters. + + Currently, the input filename is hardcoded. Maybe this will be + changed in the future but at the moment I have no idea how this + could be done. + + Parameters + ---------- + pnames : tuple + The names of the parameters to be extracted from the JSON + file. + + Returns + ------- + input_params : dict + A dictionary with the extracted values and with keys being the + names from `pnames`. + """ + data_dir = os.path.join(os.path.split(__file__)[0], "..", "data") + fname = "gpr_reactor_input_params.json" + with open(os.path.join(data_dir, fname), "r") as f: + data = json.load(f) + input_params = {} + + for param in pnames: + param = param.lower() + if param == "enrichment": + enrich = data["fresh_fuel_composition"]["922350000"] + input_params["enrichment"] = enrich + else: + try: + input_params[param] = data[param] + except KeyError as e: + msg = (f"Key '{param}' not found. Enter a value " + + "manually to continue or press Enter, in " + + "which case an error is raised.\n") + manual_entry = input(msg) + if manual_entry == "": + raise e + input_params[param] = manual_entry + + return input_params + +def store_results(composition): + """Store the composition in a .json file. + + Parameters + ---------- + composition : dict + A dictionary with the keys being the isotopes and the values + being the corresponding masses. + """ + data_dir = os.path.join(os.path.split(__file__)[0], "..", "data") + fname = "gpr_reactor_spent_fuel_composition.json" + with open(os.path.join(data_dir, fname), "r") as f: + json.dump(composition, f, indent=2) + +def run_kernel(reactor_input_params, x_train, trained_kernel, + kernel_type='ASQE'): + """Calculate the amount of the isotope in question in the spent fuel + + Parameters + ---------- + reactor_input_params + The input parameters used in the calculations and as defined + above in *TODO insert name of the function calling `prediction`* + x_train + The input parameters used during training. + trained_kernel + The trained kernel, specific to the isotope in question + kernel_type + The type of the trained kernel. TODO UPDATE WHICH KERNEL IS USED + + Returns + ------- + mu_s + The (mean predicted) mass of the isotope in the spent fuel + after one irradiation period. + """ + if (kernel_type != 'ASQE'): + msg = "Currently, only the 'ASQE' kernel type is supported." + raise ValueError(msg) + + k_s = Kernel(reactor_input_params, x_train, kernel_type, params, + gradient=False) + mu_s = np.dot(k_s.T, alpha_) + + return mu_s[0] + +""" +Part of the spent fuel compositions obtained from SERPENT simulations +of one Savannah River Site reactors. Taken from Max Schalz' master +thesis, see https://github.com/maxschalz/studious_potato/blob/main/data/SERPENT_outputs_NatU_percentages.npy +Simulations kindly provided by Antonio Figueroa. + +BU: 0.5MWd 2MWd + U230: 2.701e-21 2.701e-21 + U231: 1.422e-22 1.422e-22 + U232: 2.850e-14 2.850e-14 + U233: 3.099e-11 3.099e-11 + U234: 8.513e-05 8.513e-05 + U235: 1.030e-02 1.030e-02 + U236: 9.760e-05 9.760e-05 + U237: 8.535e-07 8.535e-07 + U238: 9.885e-01 9.885e-01 + U239: 5.391e-07 5.391e-07 + U240: 1.744e-10 1.744e-10 + U241: 1.100e-15 1.100e-15 + U242: 3.389e-20 3.389e-20 + Pu238: 9.167e-09 9.167e-09 + Pu239: 4.052e-04 4.052e-04 + Pu240: 9.193e-06 9.193e-06 + Pu241: 5.679e-07 5.679e-07 + Pu242: 5.122e-09 5.122e-09 + Pu243: 1.835e-12 1.835e-12 + Pu244: 4.362e-15 4.362e-15 + Np239: 7.775e-05 7.775e-05 + Np240: 1.160e-09 1.160e-09 + Np241: 3.059e-15 3.059e-15 + Np242: 4.438e-21 4.438e-21 + U235m: 8.643e-10 8.643e-10 +Np240m: 2.402e-10 2.402e-10 + +""" + +if __name__=="__main__": + main() From 3fc229c459ae8154d287401c95944eb93ea38b8e Mon Sep 17 00:00:00 2001 From: maxschalz <58850267+maxschalz@users.noreply.github.com> Date: Tue, 18 May 2021 17:54:09 +0200 Subject: [PATCH 05/18] Fix preliminary spentfuelgpr Python code, now working This commit fixes the preliminary python code committed in previous commits and establishes the first working version of the code. Most notable changes introduced here are: - update the `__init__` file, now the imports work and are independent of the current working directory - all data (training data, reactor input parameter) gets imported - the results are calculated and get exported (saved in a `.json` file) - it is checked if the input parameters are valid --- spentfuelgpr/setup.py | 2 +- spentfuelgpr/spentfuelgpr/__init__.py | 3 +- .../spentfuelgpr/predict_posterior.py | 134 ++++++++++++------ 3 files changed, 93 insertions(+), 46 deletions(-) diff --git a/spentfuelgpr/setup.py b/spentfuelgpr/setup.py index 4caed5c..e0dd001 100644 --- a/spentfuelgpr/setup.py +++ b/spentfuelgpr/setup.py @@ -14,7 +14,7 @@ def main(): packages=["spentfuelgpr"], classifiers=["License :: OSI Approved :: BSD-3-Clause License", "Programming Language :: Python :: 3"], - install_requires=["json", "numpy", "os"] + install_requires=["numpy"] ) return diff --git a/spentfuelgpr/spentfuelgpr/__init__.py b/spentfuelgpr/spentfuelgpr/__init__.py index ec038d0..c063204 100644 --- a/spentfuelgpr/spentfuelgpr/__init__.py +++ b/spentfuelgpr/spentfuelgpr/__init__.py @@ -1 +1,2 @@ -from spentfuelgpr.predict_posterior import * +from .kernel import * +from .predict_posterior import * diff --git a/spentfuelgpr/spentfuelgpr/predict_posterior.py b/spentfuelgpr/spentfuelgpr/predict_posterior.py index 0ccf7b3..88b6e8e 100644 --- a/spentfuelgpr/spentfuelgpr/predict_posterior.py +++ b/spentfuelgpr/spentfuelgpr/predict_posterior.py @@ -1,54 +1,94 @@ import json -import numpy +import numpy as np import os -from kernel import Kernel +from . import kernel + + +#TODO +# - Find a workaround for the ugly calculations that are currently +# performed in 'get_input_params' for the 'power_output' parameter +# and that are only relevant (?) for the SRS reactor. def main(): return def predict(): """Calculate the spent fuel composition.""" - # Check if the kernels needed exist. # Rationale for the choice of these isotopes: # - isotope fraction > 1e-15 # - stable U isotopes, i.e., 1/2 time > days (omit U230, 231, 237) # - stable Pu isotopes # - decay into 'interesting' material (relevant for U->Np->Pu) # - stable Pu isotopes + isotopes = ('U232', 'U233', 'U234', 'U235', 'U235m', 'U236', 'U238', 'U239', 'U240', 'Pu238', 'Pu239', 'Pu240', 'Pu241', 'Pu242', 'Pu243', 'Pu244', 'Np239', 'Np240', 'Np240m', 'Np241') + + # Check if the needed kernels and parameter information exist. data_dir = os.path.join(os.path.split(__file__)[0], "..", "data") kernel_dir = os.path.join(data_dir, "trained_kernels") if not os.path.isdir(kernel_dir): raise OSError("'trained_kernels' directory not found!") for iso in isotopes: - fname = iso + ".npy" + fname = f"{iso}.npy" if not os.path.isfile(os.path.join(kernel_dir, fname)): msg = f"Trained kernel '{fname}' not found!" raise FileNotFoundError(msg) + fname = f"training_params_{iso}.json" + if not os.path.isfile(os.path.join(kernel_dir, fname)): + msg = f"Training parameters '{fname}' not found!" + raise FileNotFoundError(msg) + # Load input parameters, training data and the kernel type. - kernel_type = "ASQE" + training_data = np.load(os.path.join(data_dir, "x_trainingset.npy"), + allow_pickle=True) par = ("enrichment", "temperature", "power_output", "burnup") reactor_input_params = get_input_params(par) - size = 100 # Needed if a subset of the data was used for training. - training_data = np.load(os.path.join(data_dir, "x_trainingset.npy"), - allow_pickle=True)[:size] - spent_fuel_composition = {} + reactor_input_params = np.expand_dims(reactor_input_params, axis=0) + + # Calculate the spent fuel composition for all isotopes. + spent_fuel_composition = {"spent_fuel_composition": {}} for iso in isotopes: - fname = f"{iso}.npy" - trained_kernel = np.load(os.path.join(kernel_dir, fname), + kernel_fname = os.path.join(kernel_dir, f"{iso}.npy") + params_fname = os.path.join(kernel_dir, + f"training_params_{iso}.json") + + with open(params_fname, "r") as f: + data = json.load(f) + kernel_type = data["kernel_type"] + size = data["size"] + check_input_params(reactor_input_params, training_data[:size]) + trained_kernel = np.load(kernel_fname, allow_pickle=True).item() - mass = run_kernel(reactor_input_params, training_data, + mass = run_kernel(reactor_input_params, training_data[:size], trained_kernel, kernel_type) - spent_fuel_composition[iso] = mass + spent_fuel_composition["spent_fuel_composition"][iso] = mass store_results(spent_fuel_composition) +def check_input_params(params, training_data): + """Check the validity of the input parameters. + + The function raises a ValueError if the checks fail, else it has no + return value. + """ + min_vals = np.min(training_data, axis=0) + max_vals = np.max(training_data, axis=0) + is_valid = (np.all(min_vals < params[0]) + and np.all(params[0] < max_vals)) + + if not is_valid: + msg = ("[spentfuelgpr] One or more parameters exceed the bounds.\n" + + f"Minimum parameter values: {min_vals}\n" + + f"Actual parameter values: {params[0]}\n" + + f"Maximum parameter values: {max_vals}") + raise ValueError(msg) + def get_input_params(pnames): """Read in the Gpr input parameters. @@ -64,34 +104,38 @@ def get_input_params(pnames): Returns ------- - input_params : dict - A dictionary with the extracted values and with keys being the - names from `pnames`. + input_params : array + An array containing the extracted values in the same order as + specified in `pnames`. """ - data_dir = os.path.join(os.path.split(__file__)[0], "..", "data") fname = "gpr_reactor_input_params.json" - with open(os.path.join(data_dir, fname), "r") as f: + with open(fname, "r") as f: data = json.load(f) - input_params = {} + input_params = [] for param in pnames: param = param.lower() if param == "enrichment": enrich = data["fresh_fuel_composition"]["922350000"] - input_params["enrichment"] = enrich + input_params.append(enrich) + elif param == "power_output": + # These calculations below have to be performed for the + # Savannah River Site reactor. Currently, they are + # hardcoded but this is hopefully subject to change. + # TODO update this implementation + n_assemblies_tot = 500; + n_assemblies_model = 18; + feet_to_cm = 30.48; + assembly_length = 12; # in feet + power = (data[param] * n_assemblies_model + / n_assemblies_tot / assembly_length + / feet_to_cm) + power *= 1e6 # conversion MW to W + input_params.append(power) else: - try: - input_params[param] = data[param] - except KeyError as e: - msg = (f"Key '{param}' not found. Enter a value " - + "manually to continue or press Enter, in " - + "which case an error is raised.\n") - manual_entry = input(msg) - if manual_entry == "": - raise e - input_params[param] = manual_entry + input_params.append(data[param]) - return input_params + return np.array(input_params) def store_results(composition): """Store the composition in a .json file. @@ -102,26 +146,25 @@ def store_results(composition): A dictionary with the keys being the isotopes and the values being the corresponding masses. """ - data_dir = os.path.join(os.path.split(__file__)[0], "..", "data") fname = "gpr_reactor_spent_fuel_composition.json" - with open(os.path.join(data_dir, fname), "r") as f: + with open(fname, "w") as f: json.dump(composition, f, indent=2) def run_kernel(reactor_input_params, x_train, trained_kernel, - kernel_type='ASQE'): - """Calculate the amount of the isotope in question in the spent fuel + kernel_params, kernel_type='ASQE'): + """Calculate the mass of one isotope in the spent fuel. Parameters ---------- reactor_input_params - The input parameters used in the calculations and as defined - above in *TODO insert name of the function calling `prediction`* + Input parameters used in the calculations and as defined above + in 'predict()' and in 'get_input_params' x_train - The input parameters used during training. + Input parameters used during training trained_kernel - The trained kernel, specific to the isotope in question + Trained kernel, specific to the isotope in question kernel_type - The type of the trained kernel. TODO UPDATE WHICH KERNEL IS USED + The type of the trained kernel Returns ------- @@ -132,10 +175,13 @@ def run_kernel(reactor_input_params, x_train, trained_kernel, if (kernel_type != 'ASQE'): msg = "Currently, only the 'ASQE' kernel type is supported." raise ValueError(msg) - - k_s = Kernel(reactor_input_params, x_train, kernel_type, params, - gradient=False) - mu_s = np.dot(k_s.T, alpha_) + + kernel_params = trained_kernel["Params"] + alpha = trained_kernel["alpha_"] + lambda_ = trained_kernel["LAMBDA"] + k_s = kernel.Kernel(reactor_input_params, x_train, kernel_type, + kernel_params, gradient=False, LAMBDA=lambda_) + mu_s = np.dot(k_s.T, alpha) return mu_s[0] From 1b77a3c0bb29196b20e0449d3f8121315e5a7f6d Mon Sep 17 00:00:00 2001 From: maxschalz <58850267+maxschalz@users.noreply.github.com> Date: Wed, 19 May 2021 13:30:27 +0200 Subject: [PATCH 06/18] Update README.md Add requirements for GprReactor to README --- README.md | 37 +++++++++++++++++++++++++++++++------ 1 file changed, 31 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index b8b381a..eb49644 100644 --- a/README.md +++ b/README.md @@ -1,19 +1,34 @@ # misoenrichment: a Cyclus multi component isotope enrichment module `misoenrichment` is a module developed at the [Nuclear Verification and Disarmament Group](https://www.nvd.rwth-aachen.de/) at RWTH Aachen University for the nuclear fuel cycle simulator -[Cyclus](http://fuelcycle.org). It provides a Cyclus facility that enriches -uranium streams composed of two or more isotopes taking into account the +[Cyclus](http://fuelcycle.org). It currently provides two Cyclus facilities. + +`MIsoEnrich` is an enrichment facility that enriches +streams composed of two or more uranium isotopes taking into account the different enrichment behaviour of minor isotopes such as 234U (present in natural as well as in reprocessed uranium) or 236U (present in reprocessed uranium from spent nuclear fuel). The tracking of minor isotopes makes this module suitable for nuclear archaeology, see, e.g., Ref 3. +`GprReactor` is a Cyclus reactor facility that uses Gaussian Process +Regression (GPR) to calculate the composition of the irradiated fuel depending +on various input parameters. Generally, this implementation works for any +reactor type and any input parameters. However, one needs the appropriate +GPR model (which needs to be generated using training data) and depending +on which input parameters are chosen, the source code of `GprReactor` may +need minor tweaking. Additional information on this issue will be given +in future commits. + Table of Contents -- [Getting Started](#getting-started) -- [Theoretical background](#theoretical-background) +- [MIsoEnrich](#misoenrich) + - [Getting Started](#getting-started) + - [Theoretical background](#theoretical-background) +- [GprReactor](#gprreactor) + - [Requirements](#requirements) - [References](#references) -## Getting started +## MIsoEnrich +### Getting started An example input file is found in `input/main.py` featuring a `cycamore::Source` source agent, a `MIsoEnrich` enrichment facility and two `cycamore::Sink` agents, one for enriched and one for depleted uranium. @@ -34,7 +49,7 @@ level, as explained above) and then blending the product with uranium from the feed. This procedure is only performed if the `use_downblending` variable is set to `True` in the input file. -## Theoretical background +### Theoretical background The implementation of the facility itself and the interaction with Cyclus' Dynamic Resource Exchange is based on the binary enrichment facility from the [Cycamore](https://github.com/cyclus/cycamore) package. @@ -44,6 +59,16 @@ Ref 1 derives the mathematical formalism of a matched abundance ratio cascade using constant overall stage separation factors while Ref 2 gives a new physically founded approach to calculating said separation factors. +## GprReactor +### Requirements +This facility needs Niels Lohmann's [JSON for Modern C++](https://json.nlohmann.me/) +library. It can be downloaded from his [GitHub repository](https://github.com/nlohmann/json) +or using one of the many package managers, see [here](https://github.com/nlohmann/json#package-managers). +Successfully tested using `conda install -c conda-forge nlohmann_json` + +Additionally, one needs `Python3` in combination with the `NumPy` and +`SciPy` packages. + ## References 1. E. von Halle, _Multicomponent Isotope Separation in Matched Abundance From efd58ade11ec1921e5b89e281c9dc2441883e7a0 Mon Sep 17 00:00:00 2001 From: maxschalz <58850267+maxschalz@users.noreply.github.com> Date: Wed, 19 May 2021 13:50:55 +0200 Subject: [PATCH 07/18] Add Python Gpr calculations to C++ code --- CMakeLists.txt | 4 + src/gpr_reactor.cc | 249 +++++++++++++++++++++++++++++++++++++-------- src/gpr_reactor.h | 57 ++++++++--- 3 files changed, 253 insertions(+), 57 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 772f0a0..54fb6dc 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -124,6 +124,10 @@ set(LIBS ${LIBS} ${COIN_LIBRARIES}) FIND_PACKAGE(PythonLibs REQUIRED) SET(STUB_INCLUDE_DIRS ${STUB_INCLUDE_DIRS} ${PYTHON_INCLUDE_DIRS}) +# Find Niels Lohmann's 'JSON for Modern C++' package +FIND_PACKAGE(nlohmann_json REQUIRED) +SET(STUB_INCLUDE_DIRS ${STUB_INCLUDE_DIRS} ${nlohmann_json_INCLUDE_DIRS}) + # include all the directories we just found INCLUDE_DIRECTORIES(${STUB_INCLUDE_DIRS}) diff --git a/src/gpr_reactor.cc b/src/gpr_reactor.cc index c504648..88769dd 100644 --- a/src/gpr_reactor.cc +++ b/src/gpr_reactor.cc @@ -1,11 +1,19 @@ +#define PY_SSIZE_T_CLEAN +#include + #include "gpr_reactor.h" #include #include +#include +#include +#include #include #include #include +#include + // Future changes relating to the implementation of Antonio's GPRs are marked // with the following comment: // TODO ANTONIO GPR @@ -33,12 +41,33 @@ GprReactor::GprReactor(cyclus::Context* ctx) cycle_step(0), discharged(false), power_output(0.), + temperature(0.), res_indexes(std::map()), is_hybrid(true), side_products(std::vector()), side_product_quantity(std::vector()), - unique_out_commods(std::set()) - {;} + unique_out_commods(std::set()), + permitted_fresh_fuel_comps(std::set({922350000, 922380000})), + relevant_spent_fuel_comps(std::set( + {922320000, 922330000, 922340000, 922350000, 922350001, 922360000, + 922380000, 922390000, 922400000, 932390000, 932400000, 932400001, + 932410000, 942380000, 942390000, 942400000, 942410000, 942420000, + 942430000, 942440000} + )), + out_fname("gpr_reactor_input_params.json"), + in_fname("gpr_reactor_spent_fuel_composition.json") { + // TODO check, e.g., runtime performance to determine if calling PyStart here + // and doing the imports here (i.e., once) is actually faster or if this is + // all optimised anyway. + //cyclus::PyStart(); + //PyRun_SimpleString("import setuptest"); +} + +// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +GprReactor::~GprReactor() { + // TODO see comment in constructor + //cyclus::PyStop(); +} // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - std::set::Ptr> GprReactor::GetMatlBids( @@ -383,46 +412,6 @@ std::map GprReactor::PopSpent_() { return mapped; } -// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -/* -std::string GprReactor::InCommod_(cyclus::Material::Ptr m) { - int i = res_indexes[m->obj_id()]; - if (i >= in_commods.size()) { - throw cyclus::KeyError("misoenrichment::GprReactor - no incommod for material object"); - } - return in_commods[i]; -} -*/ - -// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -std::string GprReactor::OutCommod_(cyclus::Material::Ptr m) { - int i = res_indexes[m->obj_id()]; - if (i >= out_commods.size()) { - throw cyclus::KeyError("misoenrichment::GprReactor - no outcommod for material object"); - } - return out_commods[i]; -} - -// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -/* -std::string GprReactor::InRecipe_(cyclus::Material::Ptr m) { - int i = res_indexes[m->obj_id()]; - if (i >= in_recipes.size()) { - throw cyclus::KeyError("misoenrichment::GprReactor - no inrecipe for material object"); - } - return in_recipes[i]; -} -*/ - -// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -std::string GprReactor::OutRecipe_(cyclus::Material::Ptr m) { - int i = res_indexes[m->obj_id()]; - if (i >= out_recipes.size()) { - throw cyclus::KeyError("misoenrichment::GprReactor - no outrecipe for material object"); - } - return out_recipes[i]; -} - // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - void GprReactor::IndexRes_(cyclus::Resource::Ptr m, std::string incommod) { for (int i = 0; i < in_commods.size(); ++i) { @@ -516,13 +505,183 @@ void GprReactor::Transmute_(int n_assem) { ss << old.size() << " assemblies"; Record_("TRANSMUTE", ss.str()); - // TODO somewhere at this place, Antonio's GPRs must be used. - // TODO ANTONIO GPR + cyclus::PyStart(); + int python_exit_code; + python_exit_code += PyRun_SimpleString("import spentfuelgpr"); for (int i = 0; i < old.size(); ++i) { - old[i]->Transmute(context()->GetRecipe(OutRecipe_(old[i]))); + CompositionToOutFile_(old[i]->comp(), false); + python_exit_code += PyRun_SimpleString("spentfuelgpr.predict()"); + cyclus::Composition::Ptr spent_fuel_comp = ImportSpentFuelComposition_( + old[i]->quantity()); + old[i]->Transmute(spent_fuel_comp); + } + if (python_exit_code != 0) { + throw cyclus::Error("Execution of Python code in Gpr::ReactorTick " + "unsuccessful!"); + } + + // Having finished the GPR calculations, delete the .json files to prevent + // cluttering up the working directory. + if (std::remove(in_fname.c_str()) != 0) { + std::stringstream msg; + msg << "Error deleting file '" << in_fname << "'."; + throw cyclus::IOError(msg.str()); + } + if (std::remove(out_fname.c_str()) != 0) { + std::stringstream msg; + msg << "Error deleting file '" << out_fname << "'."; + throw cyclus::IOError(msg.str()); + } + // TODO the code below can be deleted UNLESS it turns out that the GPR + // predictions are computationally significant and that they are causing a + // bottleneck. If this is the case, then do something along the lines shown + // below. + /* + bool same_composition = true; + cyclus::Composition::Ptr previous_comp = old[0]->comp(); + for (cyclus::Material::Ptr mat : old) { + it (!cyclus::compmath::AlmostEq(mat->comp(), previous_comp)) { + same_composition = false; + break; + } + } + */ +} + +// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +void GprReactor::CompositionToOutFile_(cyclus::Composition::Ptr comp, + bool delete_outfile) { + nlohmann::json json_object; + + // TODO check if GPRs use mass or atom percent + cyclus::CompMap cm = comp->atom(); + cyclus::compmath::Normalize(&cm); + cyclus::CompMap::iterator compmap_it; + // Loop over each isotope in composition. + for (compmap_it = cm.begin(); compmap_it != cm.end(); ++compmap_it) { + std::set::iterator isotope_it = permitted_fresh_fuel_comps.find( + compmap_it->first); + // Ensure that the fresh fuel is solely composed of isotopes taken into + // account by the GPR, if not, throw an error. + if (isotope_it == permitted_fresh_fuel_comps.end()) { + std::stringstream msg; + msg << "GprReactor fuel must be composed of (some or all of) the " + "following isotopes: "; + for (const int& iso : permitted_fresh_fuel_comps) { + msg << iso << " "; + } + msg << "\n"; + throw cyclus::ValueError(msg.str()); + } + std::string nuc_id = std::to_string(compmap_it->first); + double fraction = compmap_it->second; + json_object["fresh_fuel_composition"][nuc_id] = fraction; + } + + // TODO also pass `relevant_spent_fuel_comps` to tell GPR which isotopes to + // reconstruct? + uint64_t irradiation_time; + if (context() != NULL) { + const long seconds_per_day = 60 * 60 * 24; + irradiation_time = cycle_time * context()->sim_info().dt / seconds_per_day; + } else { + // kDefaultTimeStepDur defined in cyclus/src/context.h as duration in + // seconds of 1/12 of a year, like so: + // const uint64_t kDefaultTimeStepDur = 2629846; + irradiation_time = cycle_time * kDefaultTimeStepDur; + } + + // TODO Update burnup calculation below. + // TODO This is strictly speaking not correct in the case of a reactor using + // for example uranium dioxide (UO2) as fuel. In that case, the denonimator + // would consist only of the mass of uranium, excluding the oxygen mass. + double burnup = power_output * irradiation_time / n_assem_core + / assem_size; // in MWd/kg + + json_object["temperature"] = temperature; // in K + json_object["power_output"] = power_output; // in MWth + json_object["irradiation_time"] = irradiation_time; // in days + json_object["burnup"] = burnup; // Save JSON output in output file. + std::ofstream file(out_fname, std::ofstream::out | std::ofstream::trunc); + file << std::setw(2) << json_object << "\n"; + file.close(); + + // Deleting the output file does not make sense except for unit tests to + // prevent cluttering up the working directory where the unit tests are + // performed. + if (delete_outfile && (std::remove(out_fname.c_str()) != 0)) { + std::stringstream msg; + msg << "Error deleting file '" << out_fname << "'.\n"; + throw cyclus::IOError(msg.str()); } } +// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +cyclus::Composition::Ptr GprReactor::ImportSpentFuelComposition_(double qty) { + using cyclus::Composition; + + nlohmann::json json_object; + + // Dump file contents into json object. + std::ifstream file(in_fname, std::ifstream::in); + if (!file.is_open()) { + std::stringstream msg; + msg << "Cannot find file '" << in_fname << "'"; + throw cyclus::IOError(msg.str()); + } + file >> json_object; + file.close(); + + try { + json_object.at("spent_fuel_composition"); + } catch (const nlohmann::detail::out_of_range& e) { + std::stringstream msg; + msg << "Cannot find key 'spent_fuel_composition' in '" << in_fname << "'." + << "\nException id: " << e.id; + throw cyclus::IOError(msg.str()); + } + + cyclus::CompMap cm; + // This variable is the ratio of the material to be transmuted ('qty' kg) to + // the mass of the full core. + const double fraction_of_core = qty / (n_assem_core * assem_size); + // 'mass' is the absolute mass of the isotope in question in a full reactor + // core after one irradiation period. + double mass; + double sum = 0; + + for (const int& nuc_id : relevant_spent_fuel_comps) { + try { + std::string key = std::to_string(nuc_id); + mass = json_object.at("spent_fuel_composition").at(key); + } catch (const nlohmann::detail::out_of_range& e) { + continue; + } + cm[nuc_id] = mass * fraction_of_core; + sum += mass * fraction_of_core; + } + // All isotopes part of the spent fuel but not calculated by the Gpr (i.e., + // all isotopes not part of 'relevant_spent_fuel_comps') are `represented' by + // hydrogen (H1). This is obviously not correct, but we are not interested in + // this part of the spent fuel so it should be alright. + if (!cyclus::AlmostEq(qty, sum)) { + cm[10010000] = qty - sum; + } + + // TODO check if Gpr uses atom or mass fraction + Composition::Ptr spent_fuel_comp = Composition::CreateFromMass(cm); + return spent_fuel_comp; +} + +// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +std::string GprReactor::OutCommod_(cyclus::Material::Ptr m) { + int i = res_indexes[m->obj_id()]; + if (i >= out_commods.size()) { + throw cyclus::KeyError("misoenrichment::GprReactor - no outcommod for material object"); + } + return out_commods[i]; +} + // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - // WARNING! Do not change the following this function!!! This enables your diff --git a/src/gpr_reactor.h b/src/gpr_reactor.h index ffc3598..2957fc6 100644 --- a/src/gpr_reactor.h +++ b/src/gpr_reactor.h @@ -15,11 +15,9 @@ // evaluates to `true`, else, the set gets not filled! // - no implementation of `Reactor::fuel_pref(cyclus::Material::Ptr)` because // it is not used in the reactor class. -// - implement Antonio's stuff (obviously) // - think about the weird (?) decommissioning behaviour of the cycamore // archetype and whether or not I should use it as well -// - not a todo, but a note: contrary to cycamore's Reactor, this reactor model -// does not feature a change of preferences or recipes over time. +// - check if GPRs use mass or molar fractions? namespace misoenrichment { @@ -29,6 +27,10 @@ class GprReactor : public cyclus::Facility, public cyclus::toolkit::Position { /// @param ctx the cyclus context for access to simulation-wide parameters explicit GprReactor(cyclus::Context* ctx); + ~GprReactor(); + + friend class GprReactorTest; + /// The Prime Directive /// Generates code that handles all input file reading and restart operations /// (e.g., reading from the database, instantiating a new object, etc.). @@ -98,7 +100,10 @@ class GprReactor : public cyclus::Facility, public cyclus::toolkit::Position { // Core specifics #pragma cyclus var { \ "default": 3, \ - "doc": "Number of assemblies in a full core." \ + "doc": "Number of assemblies in a full core. This value is used in " \ + "combination with the assembly mass, the irradiation time and the " \ + "thermal power output to calculate the specific burnup needed for " \ + "the Gaussian process regression." \ } int n_assem_core; @@ -112,7 +117,10 @@ class GprReactor : public cyclus::Facility, public cyclus::toolkit::Position { #pragma cyclus var { \ "uitype": "range", \ "range": [1., 1e5], \ - "doc": "The mass of one assembly in kg." \ + "doc": "The mass of one assembly in kg. This value is used in " \ + "combination with the number of assemblies in a full core, the " \ + "irradiation time and the thermal power output to calculate the " \ + "specific burnup needed for the Gaussian process regression." \ } double assem_size; @@ -128,7 +136,10 @@ class GprReactor : public cyclus::Facility, public cyclus::toolkit::Position { #pragma cyclus var { \ "default": 12, \ "doc": "The duration of one complete irradiation cycle excluding the " \ - "refuelling, in units of simulation time steps." \ + "refuelling, in units of simulation time steps. This value is " \ + "used in combination with the core mass and the thermal power " \ + "output to calculate the specific burnup needed for the Gaussian " \ + "process regression." \ } int cycle_time; @@ -177,12 +188,21 @@ class GprReactor : public cyclus::Facility, public cyclus::toolkit::Position { "default": 0, \ "uitype": "range", \ "range": [0, 10000], \ - "units": "MWe", \ - "doc": "The amount of electrical power that the reactor produces during " \ - "operation." \ + "units": "MWth", \ + "doc": "The amount of thermal power that the reactor produces during " \ + "operation. This value is used in combination with the core mass " \ + "and the irradiation time to calculate the specific burnup needed " \ + "for the Gaussian process regression." \ } double power_output; + #pragma cyclus var { \ + "default": 350, \ + "units": "K", \ + "doc": "The reactor moderator temperature." \ + } + double temperature; + // This variable is internal only and true if fuel has already been discharged // this cycle. #pragma cyclus var { \ @@ -228,6 +248,19 @@ class GprReactor : public cyclus::Facility, public cyclus::toolkit::Position { # pragma cyclus var {"capacity": "n_assem_spent * assem_size"} cyclus::toolkit::ResBuf spent_inv; + // This set contains all nuc ids that may be part of fresh fuel. So far, + // they are limited to U235 and U238, however this list will expand in the + // future. Notably, other U isotopes will be included (probably U232 up to + // U236) and possibly Pu as well. + const std::set permitted_fresh_fuel_comps; + // This set contains all nuc ids of isotopes in spent fuel that we are + // interested in and that the GPRs calculate. + const std::set relevant_spent_fuel_comps; + + // Filenames of files used to pass arguments and results between the Python + // file and the C++ Cyclus archetype. + const std::string out_fname; + const std::string in_fname; // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - // Coordinates @@ -249,12 +282,12 @@ class GprReactor : public cyclus::Facility, public cyclus::toolkit::Position { bool Discharge_(); bool Retired_(); + cyclus::Composition::Ptr ImportSpentFuelComposition_(double qty); std::map PeekSpent_(); std::map PopSpent_(); - //std::string InCommod_(cyclus::Material::Ptr m); std::string OutCommod_(cyclus::Material::Ptr m); - //std::string InRecipe_(cyclus::Material::Ptr m); - std::string OutRecipe_(cyclus::Material::Ptr m); + void CompositionToOutFile_(cyclus::Composition::Ptr comp, + bool delete_outfile = false); void IndexRes_(cyclus::Resource::Ptr m, std::string incommod); void Load_(); void Record_(std::string name, std::string val); From b0df88e4696f26f4c90815526f14f4d81a3ad1c6 Mon Sep 17 00:00:00 2001 From: maxschalz <58850267+maxschalz@users.noreply.github.com> Date: Wed, 19 May 2021 13:51:46 +0200 Subject: [PATCH 08/18] Add unit tests --- src/gpr_reactor_tests.cc | 193 +++++++++++++++++++++++++++++++++++++-- src/gpr_reactor_tests.h | 43 +++++++++ 2 files changed, 229 insertions(+), 7 deletions(-) diff --git a/src/gpr_reactor_tests.cc b/src/gpr_reactor_tests.cc index 0d7ef4d..828c93c 100644 --- a/src/gpr_reactor_tests.cc +++ b/src/gpr_reactor_tests.cc @@ -1,16 +1,111 @@ #include "gpr_reactor_tests.h" +#include + #include "agent_tests.h" #include "context.h" #include "facility_tests.h" #include "pyhooks.h" +#include + +#include "miso_helper.h" + namespace misoenrichment { +namespace gpr_reactor_test { + +// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +cyclus::Composition::Ptr valid_composition() { + cyclus::CompMap valid_cm; + valid_cm[922350000] = 1.5; + valid_cm[922380000] = 98.5; + + return cyclus::Composition::CreateFromMass(valid_cm); +} + +// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +cyclus::Composition::Ptr invalid_composition() { + cyclus::CompMap invalid_cm; + invalid_cm[922350000] = 1.5; + invalid_cm[922380000] = 98.5; + invalid_cm[10010000] = 1; + + return cyclus::Composition::CreateFromMass(invalid_cm); +} +} // namespace gpr_reactor_test + +// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +// Functions handling the initiation and ending of the tests. void GprReactorTest::SetUp() { cyclus::PyStart(); + facility = new GprReactor(tc.get()); + InitParameters(); + SetUpGprReactor(); +} + +// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +void GprReactorTest::InitParameters() { + in_commods = std::vector(1, "fresh_fuel"); + out_commods = std::vector(1, "spent_fuel"); + in_recipes = std::vector(1, "fresh_fuel_recipe"); + out_recipes = std::vector(1, "spent_fuel_recipe"); + fuel_prefs = std::vector(1, 1); + n_assem_core = 2; + n_assem_batch = 2; + assem_size = 50000; + n_assem_fresh = 1; + n_assem_spent = 1; + latitude = 0.; + longitude = 0.; + decom_transmute_all = false; + cycle_time = 3; + refuel_time = 1; + temperature = 350; + power_output = 2400; + + /* + // The calculations below need to be done because of the way the SRS kernel + // handles the power output (namely as a power density). + const int n_assemblies_tot = 600; + const int n_assemblies_model = 18; + const double feet_to_m = 0.3048; // in m * ft^-1 + double assembly_length = 12; // in ft + assembly_length *= feet_to_m; // in m + + power_output *= n_assemblies_model / n_assemblies_tot / assembly_length; + */ +} + +// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +void GprReactorTest::SetUpGprReactor() { + using cyclus::Material; + + facility->in_commods = in_commods; + facility->out_commods = out_commods; + facility->in_recipes = in_recipes; + facility->out_recipes = out_recipes; + facility->fuel_prefs = fuel_prefs; + facility->n_assem_core = n_assem_core; + facility->n_assem_batch = n_assem_batch; + facility->assem_size = assem_size; + facility->n_assem_fresh = n_assem_fresh; + facility->n_assem_spent = n_assem_spent; + facility->latitude = latitude; + facility->longitude = longitude; + facility->decom_transmute_all = decom_transmute_all; + facility->cycle_time = cycle_time; + facility->refuel_time = refuel_time; + facility->power_output = power_output; + facility->temperature = temperature; + + for (int i = 0; i < n_assem_core; ++i) { + Material::Ptr mat = Material::CreateUntracked(assem_size, + gpr_reactor_test::valid_composition()); + facility->core.Push(mat); + } } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -20,26 +115,111 @@ void GprReactorTest::TearDown() { } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -TEST_F(GprReactorTest, InitialState) { - // Test things about the initial state of the facility here +// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +// Unit tests +TEST_F(GprReactorTest, ExportCompositions) { + using cyclus::Composition; + + Composition::Ptr invalid_comp = gpr_reactor_test::invalid_composition(); + EXPECT_THROW(DoCompositionToOutFile(invalid_comp, true), + cyclus::ValueError); + + Composition::Ptr valid_comp = gpr_reactor_test::valid_composition(); + EXPECT_NO_THROW(DoCompositionToOutFile(valid_comp, true)); +} + +// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +TEST_F(GprReactorTest, ImportCompositions) { + using cyclus::Composition; + + Composition::Ptr valid_comp = gpr_reactor_test::valid_composition(); + cyclus::CompMap valid_cm = valid_comp->mass(); + + // Prepare import composition-tests. + nlohmann::json json_object; + cyclus::compmath::Normalize(&valid_cm); + for (const std::pair& x : valid_cm) { + // Multiply the mass fraction with the total mass of the core. + json_object["spent_fuel_composition"][std::to_string(x.first)] = + n_assem_core * assem_size * x.second; + } + std::ofstream file("gpr_reactor_spent_fuel_composition.json", + std::ofstream::out | std::ofstream::trunc); + file << json_object; + file.close(); + + // Perform and test the imports + ASSERT_NO_THROW(DoImportSpentFuelComposition(n_assem_core * assem_size)); + cyclus::CompMap return_cm = DoImportSpentFuelComposition( + n_assem_core * assem_size)->mass(); + cyclus::compmath::Normalize(&return_cm); + EXPECT_TRUE(cyclus::compmath::AlmostEq(valid_cm, return_cm, kEpsCompMap)); + + nlohmann::json json_object2; + json_object2["test"] = -1; + file.open("gpr_reactor_spent_fuel_composition.json", + std::ofstream::out | std::ofstream::trunc); + file << json_object2; + file.close(); + EXPECT_THROW(DoImportSpentFuelComposition(n_assem_core * assem_size / 2), + cyclus::IOError); + std::remove("gpr_reactor_spent_fuel_composition.json"); +} + +// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +TEST_F(GprReactorTest, SpentFuelWaste) { + using cyclus::Composition; + + Composition::Ptr valid_comp = gpr_reactor_test::valid_composition(); + cyclus::CompMap valid_cm = valid_comp->mass(); + + // Prepare import composition-tests. + nlohmann::json json_object; + cyclus::compmath::Normalize(&valid_cm); + for (const std::pair& x : valid_cm) { + // In this test, multiply by half a core (as opposed to the test in + // `GprReactorTest.ImportCompositions`) because we want to test if half of + // the spent fuel gets set to hydrogen. + json_object["spent_fuel_composition"][std::to_string(x.first)] = + x.second * n_assem_core * assem_size / 2.; + } + std::ofstream file("gpr_reactor_spent_fuel_composition.json", + std::ofstream::out | std::ofstream::trunc); + file << json_object; + file.close(); + + // Perform and test the import. + cyclus::CompMap return_cm = DoImportSpentFuelComposition( + n_assem_core * assem_size)->mass(); + cyclus::compmath::Normalize(&return_cm); + valid_cm[10010000] = 1.; + cyclus::compmath::Normalize(&valid_cm); + EXPECT_TRUE(cyclus::compmath::AlmostEq(valid_cm, return_cm, kEpsCompMap)); + + std::remove("gpr_reactor_spent_fuel_composition.json"); } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +TEST_F(GprReactorTest, TransmuteFuel) { + DoTransmute(); +} + + +// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +// Below are standard tests introduced by cycstub. Probably not so useful but +// they don't do harm, either. TEST_F(GprReactorTest, Print) { EXPECT_NO_THROW(std::string s = facility->str()); - // Test GprReactor specific aspects of the print method here } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - TEST_F(GprReactorTest, Tick) { - ASSERT_NO_THROW(facility->Tick()); - // Test GprReactor specific behaviors of the Tick function here + EXPECT_NO_THROW(facility->Tick()); } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - TEST_F(GprReactorTest, Tock) { EXPECT_NO_THROW(facility->Tock()); - // Test GprReactor specific behaviors of the Tock function here } } // namespace misoenrichment @@ -60,4 +240,3 @@ INSTANTIATE_TEST_CASE_P(GprReactor, FacilityTests, ::testing::Values(&GprReactorConstructor)); INSTANTIATE_TEST_CASE_P(GprReactor, AgentTests, ::testing::Values(&GprReactorConstructor)); -// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/gpr_reactor_tests.h b/src/gpr_reactor_tests.h index e6d173f..2c599ad 100644 --- a/src/gpr_reactor_tests.h +++ b/src/gpr_reactor_tests.h @@ -15,6 +15,49 @@ class GprReactorTest : public ::testing::Test { virtual void SetUp(); virtual void TearDown(); + + void InitParameters(); + void SetUpGprReactor(); + + bool decom_transmute_all; + + double assem_size; + double latitude; + double longitude; + double power_output; + double temperature; + + int n_assem_core; + int n_assem_batch; + int n_assem_fresh; + int n_assem_spent; + int cycle_time; + int refuel_time; + + std::vector in_commods; + std::vector out_commods; + std::vector in_recipes; + std::vector out_recipes; + std::vector fuel_prefs; + + // The Do* functions are a hack: GprReactorTest is a friend class to + // GprReactor and it can therefore access private functions. However, + // all of the tests are sub-classes of the fixture and they cannot access + // the private functions, hence we need to use the Do* functions as an + // intermediary. See, e.g., 4th bullet point here: + // https://github.com/google/googletest/blob/master/googletest/docs/advanced.md#testing-private-code + // + // TODO implement functions below + inline cyclus::Composition::Ptr DoImportSpentFuelComposition(double qty) { + return facility->ImportSpentFuelComposition_(qty); + } + inline void DoCompositionToOutFile(cyclus::Composition::Ptr comp, + bool delete_txt) { + facility->CompositionToOutFile_(comp, delete_txt); + } + inline void DoTransmute() { + facility->Transmute_(); + } }; } // namespace misoenrichment From 7bb02701a8e977330cab3089e2fb2cca5226d989 Mon Sep 17 00:00:00 2001 From: maxschalz <58850267+maxschalz@users.noreply.github.com> Date: Wed, 19 May 2021 13:52:08 +0200 Subject: [PATCH 09/18] Update Python requirements list in setup.py --- spentfuelgpr/setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spentfuelgpr/setup.py b/spentfuelgpr/setup.py index e0dd001..409c277 100644 --- a/spentfuelgpr/setup.py +++ b/spentfuelgpr/setup.py @@ -14,7 +14,7 @@ def main(): packages=["spentfuelgpr"], classifiers=["License :: OSI Approved :: BSD-3-Clause License", "Programming Language :: Python :: 3"], - install_requires=["numpy"] + install_requires=["numpy", "scipy"] ) return From bcee5dcff37101c8f104aceda6d3af95a69523bf Mon Sep 17 00:00:00 2001 From: maxschalz <58850267+maxschalz@users.noreply.github.com> Date: Fri, 28 May 2021 17:07:18 +0200 Subject: [PATCH 10/18] Fix and speed up predict_posterior.py, fix kernel.py --- spentfuelgpr/spentfuelgpr/kernel.py | 9 ++- .../spentfuelgpr/predict_posterior.py | 63 ++++++++++++++++--- 2 files changed, 58 insertions(+), 14 deletions(-) diff --git a/spentfuelgpr/spentfuelgpr/kernel.py b/spentfuelgpr/spentfuelgpr/kernel.py index 83c984c..1be7f65 100644 --- a/spentfuelgpr/spentfuelgpr/kernel.py +++ b/spentfuelgpr/spentfuelgpr/kernel.py @@ -11,7 +11,7 @@ import numpy as np from scipy.spatial.distance import cdist -def Kernel(X1, X2, Type, *params, gradient=False, LAMBDA=None): +def Kernel(X1, X2, Type, *params, gradient=False): ''' All the kernels have a bit of noise added in order to prevent the covariance matrix becoming singular. The amount of noise to be added is also a @@ -35,10 +35,9 @@ def dif(array1, array2): return K if Type == 'ASQE': - if LAMBDA is None: - LAMBDA = np.eye(len(X2[0])) - length_scales = 1/params[0][1:-1] - np.fill_diagonal(LAMBDA,length_scales) + LAMBDA = np.eye(len(X2[0])) + length_scales = 1/params[0][1:-1] + np.fill_diagonal(LAMBDA,length_scales) X1 = np.dot(X1,LAMBDA) X2 = np.dot(X2,LAMBDA) diff --git a/spentfuelgpr/spentfuelgpr/predict_posterior.py b/spentfuelgpr/spentfuelgpr/predict_posterior.py index 88b6e8e..e0c2d97 100644 --- a/spentfuelgpr/spentfuelgpr/predict_posterior.py +++ b/spentfuelgpr/spentfuelgpr/predict_posterior.py @@ -47,6 +47,17 @@ def predict(): # Load input parameters, training data and the kernel type. training_data = np.load(os.path.join(data_dir, "x_trainingset.npy"), allow_pickle=True) + if not os.path.isfile(os.path.join(data_dir, + "y_trainingset_reduced.npy")): + y_data = np.load(os.path.join(data_dir, "y_trainingset.npy"), + allow_pickle=True).item() + shrink_dictionary( + y_data, isotopes, + os.path.join(data_dir, "y_trainingset_reduced.npy")) + + y_data = np.load( + os.path.join(data_dir, "y_trainingset_reduced.npy"), + allow_pickle=True).item() par = ("enrichment", "temperature", "power_output", "burnup") reactor_input_params = get_input_params(par) reactor_input_params = np.expand_dims(reactor_input_params, axis=0) @@ -57,18 +68,26 @@ def predict(): kernel_fname = os.path.join(kernel_dir, f"{iso}.npy") params_fname = os.path.join(kernel_dir, f"training_params_{iso}.json") - with open(params_fname, "r") as f: data = json.load(f) kernel_type = data["kernel_type"] size = data["size"] - check_input_params(reactor_input_params, training_data[:size]) + x_train = training_data[:size] + y_train = np.array(y_data[iso])[:size] + check_input_params(reactor_input_params, x_train) trained_kernel = np.load(kernel_fname, allow_pickle=True).item() - mass = run_kernel(reactor_input_params, training_data[:size], + mass = run_kernel(reactor_input_params, x_train, y_train, trained_kernel, kernel_type) - spent_fuel_composition["spent_fuel_composition"][iso] = mass + if mass < 0: + msg = (f"Calculated mass of {iso} in spent fuel is {mass} " + + "kg.\nHowever, the mass cannot be negative!\n" + + f"Parameters used: {reactor_input_params}") + raise RuntimeError(msg) + + iso = iso[:-1]+"M" if iso[-1] == "m" else iso + spent_fuel_composition["spent_fuel_composition"][iso] = mass store_results(spent_fuel_composition) def check_input_params(params, training_data): @@ -89,6 +108,27 @@ def check_input_params(params, training_data): + f"Maximum parameter values: {max_vals}") raise ValueError(msg) +def shrink_dictionary(data, isotopes, fname): + """Remove unnecessary data from dictionary to reduce runtime + + Parameters + ---------- + data : dict + A dictionary containing all the data with the keys being the + isotopes. + isotopes : iterable + All the isotopes that remain in the final dictionary + fname : string + Filename of the final dictionary + """ + d = {} + for iso in isotopes: + d[iso] = data[iso] + + np.save(fname, d, allow_pickle=True) + + return + def get_input_params(pnames): """Read in the Gpr input parameters. @@ -150,7 +190,7 @@ def store_results(composition): with open(fname, "w") as f: json.dump(composition, f, indent=2) -def run_kernel(reactor_input_params, x_train, trained_kernel, +def run_kernel(reactor_input_params, x_train, y_train, trained_kernel, kernel_params, kernel_type='ASQE'): """Calculate the mass of one isotope in the spent fuel. @@ -161,6 +201,8 @@ def run_kernel(reactor_input_params, x_train, trained_kernel, in 'predict()' and in 'get_input_params' x_train Input parameters used during training + y_train + Output used during training trained_kernel Trained kernel, specific to the isotope in question kernel_type @@ -178,12 +220,15 @@ def run_kernel(reactor_input_params, x_train, trained_kernel, kernel_params = trained_kernel["Params"] alpha = trained_kernel["alpha_"] - lambda_ = trained_kernel["LAMBDA"] k_s = kernel.Kernel(reactor_input_params, x_train, kernel_type, - kernel_params, gradient=False, LAMBDA=lambda_) - mu_s = np.dot(k_s.T, alpha) + kernel_params, gradient=False) + mu_s = np.dot(k_s.T, alpha)[0] + + # Revert the normalisation of the output which is used during + # training of the Gpr. + mu_s = mu_s * np.std(y_train) + np.mean(y_train) - return mu_s[0] + return mu_s """ Part of the spent fuel compositions obtained from SERPENT simulations From aadc3c08b2cf45621e65746786108254f92b2d4a Mon Sep 17 00:00:00 2001 From: maxschalz <58850267+maxschalz@users.noreply.github.com> Date: Fri, 28 May 2021 17:09:25 +0200 Subject: [PATCH 11/18] Remove unnecessary variable in gpr_reactor, fix bug --- src/gpr_reactor.cc | 16 ++++++++++------ src/gpr_reactor.h | 8 -------- 2 files changed, 10 insertions(+), 14 deletions(-) diff --git a/src/gpr_reactor.cc b/src/gpr_reactor.cc index 88769dd..e85214b 100644 --- a/src/gpr_reactor.cc +++ b/src/gpr_reactor.cc @@ -12,6 +12,7 @@ #include #include +#include "pyne.h" #include // Future changes relating to the implementation of Antonio's GPRs are marked @@ -26,7 +27,6 @@ GprReactor::GprReactor(cyclus::Context* ctx) in_commods(std::vector()), out_commods(std::vector()), in_recipes(std::vector()), - out_recipes(std::vector()), fuel_prefs(std::vector()), n_assem_core(0), n_assem_batch(0), @@ -75,11 +75,7 @@ std::set::Ptr> GprReactor::GetMatlBids( using cyclus::BidPortfolio; using cyclus::Material; - // TODO ensure that if statement below yields true despite initialiser list - // in the class' constructor! if (unique_out_commods.empty()) { - // TODO delete std::cout statement. - std::cout << "\n\nGprRea: Confirmation that `unique_out_commods` is empty\n"; for (int i = 0; i < out_commods.size(); ++i) { unique_out_commods.insert(out_commods[i]); } @@ -652,7 +648,9 @@ cyclus::Composition::Ptr GprReactor::ImportSpentFuelComposition_(double qty) { for (const int& nuc_id : relevant_spent_fuel_comps) { try { - std::string key = std::to_string(nuc_id); + // Convert NucID to a human-readable string as used in the json file, for + // example: '922350001' is converted to 'U235M'. + std::string key = pyne::nucname::name(nuc_id); mass = json_object.at("spent_fuel_composition").at(key); } catch (const nlohmann::detail::out_of_range& e) { continue; @@ -660,6 +658,12 @@ cyclus::Composition::Ptr GprReactor::ImportSpentFuelComposition_(double qty) { cm[nuc_id] = mass * fraction_of_core; sum += mass * fraction_of_core; } + if (cyclus::AlmostEq(sum, 0.)) { + // This error is thrown if no isotopes contained in + // `relevant_spent_fuel_comps` are found in the spent fuel composition file. + // Notably, this prevents the program to continue if the file were empty. + throw cyclus::ValueError("No relevant isotopes found in the spent fuel!\n"); + } // All isotopes part of the spent fuel but not calculated by the Gpr (i.e., // all isotopes not part of 'relevant_spent_fuel_comps') are `represented' by // hydrogen (H1). This is obviously not correct, but we are not interested in diff --git a/src/gpr_reactor.h b/src/gpr_reactor.h index 2957fc6..517d6f8 100644 --- a/src/gpr_reactor.h +++ b/src/gpr_reactor.h @@ -79,14 +79,6 @@ class GprReactor : public cyclus::Facility, public cyclus::toolkit::Position { } std::vector in_recipes; - // TODO This variable might get deleted - // TODO ANTONIO GPR - #pragma cyclus var { \ - "uitype": ["oneormore", "outrecipe"], \ - "doc": "An ordered list of the output (spent fuel) recipes." \ - } - std::vector out_recipes; - #pragma cyclus var { \ "default": [], \ "doc": "The preference for each input fuel type, in the same order as " \ From 878c76a8a804e01ed3772d3801af74a0f365338c Mon Sep 17 00:00:00 2001 From: maxschalz <58850267+maxschalz@users.noreply.github.com> Date: Fri, 28 May 2021 17:09:57 +0200 Subject: [PATCH 12/18] Fix unit tests and add Cycamore reactor unit tests --- src/gpr_reactor_tests.cc | 794 ++++++++++++++++++++++++++++++++++++++- src/gpr_reactor_tests.h | 1 - 2 files changed, 781 insertions(+), 14 deletions(-) diff --git a/src/gpr_reactor_tests.cc b/src/gpr_reactor_tests.cc index 828c93c..3bcf291 100644 --- a/src/gpr_reactor_tests.cc +++ b/src/gpr_reactor_tests.cc @@ -14,7 +14,6 @@ namespace misoenrichment { namespace gpr_reactor_test { -// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - cyclus::Composition::Ptr valid_composition() { cyclus::CompMap valid_cm; valid_cm[922350000] = 1.5; @@ -23,7 +22,6 @@ cyclus::Composition::Ptr valid_composition() { return cyclus::Composition::CreateFromMass(valid_cm); } -// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - cyclus::Composition::Ptr invalid_composition() { cyclus::CompMap invalid_cm; invalid_cm[922350000] = 1.5; @@ -33,6 +31,48 @@ cyclus::Composition::Ptr invalid_composition() { return cyclus::Composition::CreateFromMass(invalid_cm); } +// The compositions below are taken from CNERG's cycamore module, see +// https://github.com/cyclus/cycamore/blob/master/src/reactor_tests.cc +// Copyright under BSD-3 License, University of Wisconsin Computational Nuclear +// Engineering Research Group, 2010-2016. +cyclus::Composition::Ptr c_uox() { + cyclus::CompMap m; + m[pyne::nucname::id("u235")] = 0.04; + m[pyne::nucname::id("u238")] = 0.96; + return cyclus::Composition::CreateFromMass(m); +}; + +cyclus::Composition::Ptr c_mox() { + cyclus::CompMap m; + m[pyne::nucname::id("u235")] = .7; + m[pyne::nucname::id("u238")] = 100; + m[pyne::nucname::id("pu239")] = 3.3; + return cyclus::Composition::CreateFromMass(m); +}; + +cyclus::Composition::Ptr c_spentuox() { + cyclus::CompMap m; + m[pyne::nucname::id("u235")] = .8; + m[pyne::nucname::id("u238")] = 100; + m[pyne::nucname::id("pu239")] = 1; + return cyclus::Composition::CreateFromMass(m); +}; + +cyclus::Composition::Ptr c_spentmox() { + cyclus::CompMap m; + m[pyne::nucname::id("u235")] = .2; + m[pyne::nucname::id("u238")] = 100; + m[pyne::nucname::id("pu239")] = .9; + return cyclus::Composition::CreateFromMass(m); +}; + +cyclus::Composition::Ptr c_water() { + cyclus::CompMap m; + m[pyne::nucname::id("O16")] = 1; + m[pyne::nucname::id("H1")] = 2; + return cyclus::Composition::CreateFromAtom(m); +}; + } // namespace gpr_reactor_test // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -51,11 +91,10 @@ void GprReactorTest::InitParameters() { in_commods = std::vector(1, "fresh_fuel"); out_commods = std::vector(1, "spent_fuel"); in_recipes = std::vector(1, "fresh_fuel_recipe"); - out_recipes = std::vector(1, "spent_fuel_recipe"); fuel_prefs = std::vector(1, 1); - n_assem_core = 2; - n_assem_batch = 2; - assem_size = 50000; + n_assem_core = 1; + n_assem_batch = 1; + assem_size = 110820; n_assem_fresh = 1; n_assem_spent = 1; latitude = 0.; @@ -86,7 +125,6 @@ void GprReactorTest::SetUpGprReactor() { facility->in_commods = in_commods; facility->out_commods = out_commods; facility->in_recipes = in_recipes; - facility->out_recipes = out_recipes; facility->fuel_prefs = fuel_prefs; facility->n_assem_core = n_assem_core; facility->n_assem_batch = n_assem_batch; @@ -102,7 +140,7 @@ void GprReactorTest::SetUpGprReactor() { facility->temperature = temperature; for (int i = 0; i < n_assem_core; ++i) { - Material::Ptr mat = Material::CreateUntracked(assem_size, + cyclus::Material::Ptr mat = cyclus::Material::CreateUntracked(assem_size, gpr_reactor_test::valid_composition()); facility->core.Push(mat); } @@ -139,9 +177,12 @@ TEST_F(GprReactorTest, ImportCompositions) { nlohmann::json json_object; cyclus::compmath::Normalize(&valid_cm); for (const std::pair& x : valid_cm) { - // Multiply the mass fraction with the total mass of the core. - json_object["spent_fuel_composition"][std::to_string(x.first)] = - n_assem_core * assem_size * x.second; + // Convert the nuc id to a name (e.g., 922350001 --> U235M) to match the + // output of the `spentfuelgpr` program and multiply the mass fraction with + // the total mass of the core. + std::string nuc_name = pyne::nucname::name(x.first); + double mass = n_assem_core * assem_size * x.second; + json_object["spent_fuel_composition"][nuc_name] = mass; } std::ofstream file("gpr_reactor_spent_fuel_composition.json", std::ofstream::out | std::ofstream::trunc); @@ -177,11 +218,15 @@ TEST_F(GprReactorTest, SpentFuelWaste) { nlohmann::json json_object; cyclus::compmath::Normalize(&valid_cm); for (const std::pair& x : valid_cm) { + // Convert the nuc id to a name (e.g., 922350001 --> U235M) to match the + // output of the `spentfuelgpr` program and multiply the mass fraction with + // the total mass of the core. // In this test, multiply by half a core (as opposed to the test in // `GprReactorTest.ImportCompositions`) because we want to test if half of // the spent fuel gets set to hydrogen. - json_object["spent_fuel_composition"][std::to_string(x.first)] = - x.second * n_assem_core * assem_size / 2.; + std::string nuc_name = pyne::nucname::name(x.first); + double mass = n_assem_core * assem_size * x.second / 2.; + json_object["spent_fuel_composition"][nuc_name] = mass; } std::ofstream file("gpr_reactor_spent_fuel_composition.json", std::ofstream::out | std::ofstream::trunc); @@ -204,7 +249,730 @@ TEST_F(GprReactorTest, TransmuteFuel) { DoTransmute(); } +// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +// Below are unit tests taken from CNERG's cycamore module, see +// https://github.com/cyclus/cycamore/blob/master/src/reactor_tests.cc +// Copyright under BSD-3 License, University of Wisconsin Computational Nuclear +// Engineering Research Group, 2010-2016. + +// Test that with a zero refuel_time and a zero capacity fresh fuel buffer +// (the default), fuel can be ordered and the cycle started with no time step +// delay. +TEST_F(GprReactorTest, JustInTimeOrdering) { + std::string config = + " lwr_fresh " + " lwr_spent " + " enriched_u " + " waste " + " 1.0 " + "" + " 1 " + " 0 " + " 300 " + " 1 " + " 1 "; + + int simdur = 50; + cyclus::MockSim sim(cyclus::AgentSpec(":cycamore:Reactor"), config, simdur); + sim.AddSource("enriched_u").Finalize(); + sim.AddRecipe("lwr_fresh", gpr_reactor_test::c_uox()); + sim.AddRecipe("lwr_spent", gpr_reactor_test::c_spentuox()); + int id = sim.Run(); + + cyclus::QueryResult qr = sim.db().Query("Transactions", NULL); + EXPECT_EQ(simdur, qr.rows.size()) << "failed to order+run on fresh fuel " + "inside 1 time step"; +} + +// tests that the correct number of assemblies are popped from the core each +// cycle. +TEST_F(GprReactorTest, BatchSizes) { + std::string config = + " uox " + " spentuox " + " uox " + " waste " + "" + " 1 " + " 0 " + " 1 " + " 7 " + " 3 "; + + int simdur = 50; + cyclus::MockSim sim(cyclus::AgentSpec(":cycamore:Reactor"), config, simdur); + sim.AddSource("uox").Finalize(); + sim.AddRecipe("uox", gpr_reactor_test::c_uox()); + sim.AddRecipe("spentuox", gpr_reactor_test::c_spentuox()); + int id = sim.Run(); + + cyclus::QueryResult qr = sim.db().Query("Transactions", NULL); + // 7 for initial core, 3 per time step for each new batch for remainder + EXPECT_EQ(7+3*(simdur-1), qr.rows.size()); +} + +// tests that the refueling period between cycle end and start of the next +// cycle is honored. +TEST_F(GprReactorTest, RefuelTimes) { + std::string config = + " uox " + " spentuox " + " uox " + " waste " + "" + " 4 " + " 3 " + " 1 " + " 1 " + " 1 "; + + int simdur = 49; + cyclus::MockSim sim(cyclus::AgentSpec(":cycamore:Reactor"), config, simdur); + sim.AddSource("uox").Finalize(); + sim.AddRecipe("uox", gpr_reactor_test::c_uox()); + sim.AddRecipe("spentuox", gpr_reactor_test::c_spentuox()); + int id = sim.Run(); + + cyclus::QueryResult qr = sim.db().Query("Transactions", NULL); + int cyclet = 4; + int refuelt = 3; + int n_assem_want = simdur/(cyclet+refuelt)+1; // +1 for initial core + EXPECT_EQ(n_assem_want, qr.rows.size()); +} + + +// tests that a reactor decommissions on time without producing +// power at the end of its lifetime. +TEST_F(GprReactorTest, DecomTimes) { + std::string config = + " uox " + " spentuox " + " uox " + " waste " + "" + " 2 " + " 2 " + " 1 " + " 3 " + " 1000 " + " 1 "; + + int simdur = 12; + int lifetime = 7; + cyclus::MockSim sim(cyclus::AgentSpec(":cycamore:Reactor"), config, simdur, + lifetime); + sim.AddSource("uox").Finalize(); + sim.AddRecipe("uox", gpr_reactor_test::c_uox()); + sim.AddRecipe("spentuox", gpr_reactor_test::c_spentuox()); + int id = sim.Run(); + + // operating for 2+2 months and shutdown for 2+1 + int on_time = 4; + std::vector conds; + conds.push_back(cyclus::Cond("Value", "==", 1000)); + cyclus::QueryResult qr = sim.db().Query("TimeSeriesPower", &conds); + EXPECT_EQ(on_time, qr.rows.size()); + + int off_time = 3; + conds.clear(); + conds.push_back(cyclus::Cond("Value", "==", 0)); + qr = sim.db().Query("TimeSeriesPower", &conds); + EXPECT_EQ(off_time, qr.rows.size()); +} + + +// Tests if a reactor produces power at the time of its decommission +// given a refuel_time of zero. +TEST_F(GprReactorTest, DecomZeroRefuel) { + std::string config = + " uox " + " spentuox " + " uox " + " waste " + "" + " 2 " + " 0 " + " 1 " + " 3 " + " 1000 " + " 1 "; + + int simdur = 8; + int lifetime = 6; + cyclus::MockSim sim(cyclus::AgentSpec(":cycamore:Reactor"), config, simdur, + lifetime); + sim.AddSource("uox").Finalize(); + sim.AddRecipe("uox", gpr_reactor_test::c_uox()); + sim.AddRecipe("spentuox", gpr_reactor_test::c_spentuox()); + int id = sim.Run(); + + // operating for 2+2 months and shutdown for 2+1 + int on_time = 6; + std::vector conds; + conds.push_back(cyclus::Cond("Value", "==", 1000)); + cyclus::QueryResult qr = sim.db().Query("TimeSeriesPower", &conds); + EXPECT_EQ(on_time, qr.rows.size()); +} + +// tests that new fuel is ordered immediately following cycle end - at the +// start of the refueling period - not before and not after. - thie is subtly +// different than RefuelTimes test and is not a duplicate of it. +TEST_F(GprReactorTest, OrderAtRefuelStart) { + std::string config = + " uox " + " spentuox " + " uox " + " waste " + "" + " 4 " + " 3 " + " 1 " + " 1 " + " 1 "; + + int simdur = 7; + cyclus::MockSim sim(cyclus::AgentSpec(":cycamore:Reactor"), config, simdur); + sim.AddSource("uox").Finalize(); + sim.AddRecipe("uox", gpr_reactor_test::c_uox()); + sim.AddRecipe("spentuox", gpr_reactor_test::c_spentuox()); + int id = sim.Run(); + + cyclus::QueryResult qr = sim.db().Query("Transactions", NULL); + int cyclet = 4; + int refuelt = 3; + int n_assem_want = simdur/(cyclet+refuelt)+1; // +1 for initial core + EXPECT_EQ(n_assem_want, qr.rows.size()); +} + +// tests that the reactor handles requesting multiple types of fuel correctly +// - with proper inventory constraint honoring, etc. +TEST_F(GprReactorTest, MultiFuelMix) { + std::string config = + " uox mox " + " spentuox spentmox " + " uox mox " + " waste waste " + "" + " 1 " + " 0 " + " 1 " + " 3 " + " 3 " + " 3 "; + + // it is important that the sources have cumulative capacity greater than + // the reactor can take on a single time step - to test that inventory + // capacity constraints are being set properly. It is also important that + // each source is smaller capacity thatn the reactor orders on each time + // step to make it easy to compute+check the number of transactions. + int simdur = 50; + cyclus::MockSim sim(cyclus::AgentSpec(":cycamore:Reactor"), config, simdur); + sim.AddSource("uox").capacity(2).Finalize(); + sim.AddSource("mox").capacity(2).Finalize(); + sim.AddRecipe("uox", gpr_reactor_test::c_uox()); + sim.AddRecipe("spentuox", gpr_reactor_test::c_spentuox()); + sim.AddRecipe("mox", gpr_reactor_test::c_spentuox()); + sim.AddRecipe("spentmox", gpr_reactor_test::c_spentuox()); + int id = sim.Run(); + + cyclus::QueryResult qr = sim.db().Query("Transactions", NULL); + // +3 is for fresh fuel inventory + EXPECT_EQ(3*simdur+3, qr.rows.size()); +} + +// tests that the reactor halts operation when it has no more room in its +// spent fuel inventory buffer. +TEST_F(GprReactorTest, FullSpentInventory) { + std::string config = + " uox " + " spentuox " + " uox " + " waste " + "" + " 1 " + " 0 " + " 1 " + " 1 " + " 1 " + " 3 "; + + int simdur = 10; + cyclus::MockSim sim(cyclus::AgentSpec(":cycamore:Reactor"), config, simdur); + sim.AddSource("uox").Finalize(); + sim.AddRecipe("uox", gpr_reactor_test::c_uox()); + sim.AddRecipe("spentuox", gpr_reactor_test::c_spentuox()); + int id = sim.Run(); + + cyclus::QueryResult qr = sim.db().Query("Transactions", NULL); + int n_assem_spent = 3; + + // +1 is for the assembly in the core + the three in spent + EXPECT_EQ(n_assem_spent+1, qr.rows.size()); +} + +// tests that the reactor shuts down, ie., does not generate power, when the +// spent fuel inventory is full and the core cannot be unloaded. +TEST_F(GprReactorTest, FullSpentInventoryShutdown) { + std::string config = + " uox " + " spentuox " + " uox " + " waste " + "" + " 1 " + " 0 " + " 1 " + " 1 " + " 1 " + " 1 " + " 100 "; + + int simdur = 3; + cyclus::MockSim sim(cyclus::AgentSpec(":cycamore:Reactor"), config, simdur); + sim.AddSource("uox").Finalize(); + sim.AddRecipe("uox", gpr_reactor_test::c_uox()); + sim.AddRecipe("spentuox", gpr_reactor_test::c_spentuox()); + int id = sim.Run(); + + cyclus::QueryResult qr = sim.db().Query("TimeSeriesPower", NULL); + EXPECT_EQ(0, qr.GetVal("Value", simdur - 1)); +} + +// tests that the reactor cycle is delayed as expected when it is unable to +// acquire fuel in time for the next cycle start. This checks that after a +// cycle is delayed past an original scheduled start time, as soon as enough +// fuel is received, a new cycle pattern is established starting from the +// delayed start time. +TEST_F(GprReactorTest, FuelShortage) { + std::string config = + " uox " + " spentuox " + " uox " + " waste " + "" + " 7 " + " 0 " + " 1 " + " 3 " + " 3 "; + + int simdur = 50; + cyclus::MockSim sim(cyclus::AgentSpec(":cycamore:Reactor"), config, simdur); + // provide initial full batch + sim.AddSource("uox").lifetime(1).Finalize(); + // provide partial batch post cycle-end + sim.AddSource("uox").start(9).lifetime(1).capacity(2).Finalize(); + // provide remainder of batch much later + sim.AddSource("uox").start(15).Finalize(); + sim.AddRecipe("uox", gpr_reactor_test::c_uox()); + sim.AddRecipe("spentuox", gpr_reactor_test::c_spentuox()); + int id = sim.Run(); + + // check that we never got a full refueled batch during refuel period + std::vector conds; + conds.push_back(cyclus::Cond("Time", "<", 15)); + cyclus::QueryResult qr = sim.db().Query("Transactions", &conds); + EXPECT_EQ(5, qr.rows.size()); + + // after being delayed past original scheduled start of new cycle, we got + // final assembly for core. + conds.clear(); + conds.push_back(cyclus::Cond("Time", "==", 15)); + qr = sim.db().Query("Transactions", &conds); + EXPECT_EQ(1, qr.rows.size()); + + // all during the next (delayed) cycle we shouldn't be requesting any new fuel + conds.clear(); + conds.push_back(cyclus::Cond("Time", "<", 21)); + qr = sim.db().Query("Transactions", &conds); + EXPECT_EQ(6, qr.rows.size()); + + // as soon as this delayed cycle ends, we should be requesting/getting 3 new + // batches + conds.clear(); + conds.push_back(cyclus::Cond("Time", "==", 22)); + qr = sim.db().Query("Transactions", &conds); + EXPECT_EQ(3, qr.rows.size()); +} + +// tests that discharged fuel is transmuted properly immediately at cycle end. +TEST_F(GprReactorTest, DischargedFuelTransmute) { + std::string config = + " uox " + " spentuox " + " uox " + " waste " + "" + " 4 " + " 3 " + " 1 " + " 1 " + " 1 "; + + int simdur = 7; + cyclus::MockSim sim(cyclus::AgentSpec(":cycamore:Reactor"), config, simdur); + sim.AddSource("uox").Finalize(); + sim.AddSink("waste").Finalize(); + sim.AddRecipe("uox", gpr_reactor_test::c_uox()); + Composition::Ptr spentuox = gpr_reactor_test::c_spentuox(); + sim.AddRecipe("spentuox", spentuox); + int id = sim.Run(); + + std::vector conds; + conds.push_back(cyclus::Cond("SenderId", "==", id)); + int resid = sim.db().Query("Transactions", &conds).GetVal("ResourceId"); + cyclus::Material::Ptr m = sim.GetMaterial(resid); + cyclus::toolkit::MatQuery mq(m); + EXPECT_EQ(spentuox->id(), m->comp()->id()); + EXPECT_TRUE(mq.mass(942390000) > 0) << "transmuted spent fuel doesn't have Pu239"; +} + +// tests that spent fuel is offerred on correct commods according to the +// incommod it was received on - esp when dealing with multiple fuel commods +// simultaneously. +TEST_F(GprReactorTest, SpentFuelProperCommodTracking) { + std::string config = + " uox mox " + " spentuox spentmox " + " uox mox " + " waste1 waste2 " + "" + " 1 " + " 0 " + " 1 " + " 3 " + " 3 "; + + int simdur = 7; + cyclus::MockSim sim(cyclus::AgentSpec(":cycamore:Reactor"), config, simdur); + sim.AddSource("uox").capacity(1).Finalize(); + sim.AddSource("mox").capacity(2).Finalize(); + sim.AddSink("waste1").Finalize(); + sim.AddSink("waste2").Finalize(); + sim.AddRecipe("uox", gpr_reactor_test::c_uox()); + sim.AddRecipe("spentuox", gpr_reactor_test::c_spentuox()); + sim.AddRecipe("mox", gpr_reactor_test::c_mox()); + sim.AddRecipe("spentmox", gpr_reactor_test::c_spentmox()); + int id = sim.Run(); + + std::vector conds; + conds.push_back(cyclus::Cond("SenderId", "==", id)); + conds.push_back(cyclus::Cond("Commodity", "==", std::string("waste1"))); + cyclus::QueryResult qr = sim.db().Query("Transactions", &conds); + EXPECT_EQ(simdur-1, qr.rows.size()); + + conds[1] = cyclus::Cond("Commodity", "==", std::string("waste2")); + qr = sim.db().Query("Transactions", &conds); + EXPECT_EQ(2*(simdur-1), qr.rows.size()); +} + +// The user can optionally omit fuel preferences. In the case where +// preferences are adjusted, the ommitted preference vector must be populated +// with default values - if it wasn't then preferences won't be adjusted +// correctly and the reactor could segfault. Check that this doesn't happen. +TEST_F(GprReactorTest, PrefChange) { + // it is important that the fuel_prefs not be present in the config below. + std::string config = + " lwr_fresh " + " lwr_spent " + " enriched_u " + " waste " + "" + " 1 " + " 0 " + " 300 " + " 1 " + " 1 " + "" + " 25 " + " enriched_u " + " -1 "; + + int simdur = 50; + cyclus::MockSim sim(cyclus::AgentSpec(":cycamore:Reactor"), config, simdur); + sim.AddSource("enriched_u").Finalize(); + sim.AddRecipe("lwr_fresh", gpr_reactor_test::c_uox()); + sim.AddRecipe("lwr_spent", gpr_reactor_test::c_spentuox()); + int id = sim.Run(); + + cyclus::QueryResult qr = sim.db().Query("Transactions", NULL); + EXPECT_EQ(25, qr.rows.size()) << "failed to adjust preferences properly"; +} + +TEST_F(GprReactorTest, RecipeChange) { + // it is important that the fuel_prefs not be present in the config below. + std::string config = + " lwr_fresh " + " lwr_spent " + " enriched_u " + " waste " + "" + " 1 " + " 0 " + " 300 " + " 1 " + " 1 " + "" + " 25 35 " + " enriched_u enriched_u " + " water water " + " lwr_spent water "; + + int simdur = 50; + cyclus::MockSim sim(cyclus::AgentSpec(":cycamore:Reactor"), config, simdur); + sim.AddSource("enriched_u").Finalize(); + sim.AddSink("waste").Finalize(); + sim.AddRecipe("lwr_fresh", gpr_reactor_test::c_uox()); + sim.AddRecipe("lwr_spent", gpr_reactor_test::c_spentuox()); + sim.AddRecipe("water", gpr_reactor_test::c_water()); + int aid = sim.Run(); + + std::vector conds; + cyclus::QueryResult qr; + + // check that received recipe is not water + conds.clear(); + conds.push_back(cyclus::Cond("Time", "==", 24)); + conds.push_back(cyclus::Cond("ReceiverId", "==", aid)); + qr = sim.db().Query("Transactions", &conds); + cyclus::toolkit::MatQuery mq = cyclus::toolkit::MatQuery( + sim.GetMaterial(qr.GetVal("ResourceId"))); + + EXPECT_TRUE(0 < mq.qty()); + EXPECT_TRUE(0 == mq.mass(pyne::nucname::id("H1"))); + + // check that received recipe changed to water + conds.clear(); + conds.push_back(cyclus::Cond("Time", "==", 26)); + conds.push_back(cyclus::Cond("ReceiverId", "==", aid)); + qr = sim.db().Query("Transactions", &conds); + mq = cyclus::toolkit::MatQuery(sim.GetMaterial(qr.GetVal("ResourceId"))); + + EXPECT_TRUE(0 < mq.qty()); + EXPECT_TRUE(0 < mq.mass(pyne::nucname::id("H1"))); + + // check that sent recipe is not water + conds.clear(); + conds.push_back(cyclus::Cond("Time", "==", 34)); + conds.push_back(cyclus::Cond("SenderId", "==", aid)); + qr = sim.db().Query("Transactions", &conds); + mq = cyclus::toolkit::MatQuery(sim.GetMaterial(qr.GetVal("ResourceId"))); + + EXPECT_TRUE(0 < mq.qty()); + EXPECT_TRUE(0 == mq.mass(pyne::nucname::id("H1"))); + + // check that sent recipe changed to water + conds.clear(); + conds.push_back(cyclus::Cond("Time", "==", 36)); + conds.push_back(cyclus::Cond("SenderId", "==", aid)); + qr = sim.db().Query("Transactions", &conds); + mq = cyclus::toolkit::MatQuery(sim.GetMaterial(qr.GetVal("ResourceId"))); + + EXPECT_TRUE(0 < mq.qty()); + EXPECT_TRUE(0 < mq.mass(pyne::nucname::id("H1"))); +} + +TEST_F(GprReactorTest, Retire) { + std::string config = + " lwr_fresh " + " lwr_spent " + " enriched_u " + " waste " + "" + " 7 " + " 0 " + " 300 " + " 1 " + " 3 " + " 1 " + " 1 " + ""; + + int dur = 50; + int life = 36; + int cycle_time = 7; + int refuel_time = 0; + cyclus::MockSim sim(cyclus::AgentSpec(":cycamore:Reactor"), config, dur, + life); + sim.AddSource("enriched_u").Finalize(); + sim.AddSink("waste").Finalize(); + sim.AddRecipe("lwr_fresh", gpr_reactor_test::c_uox()); + sim.AddRecipe("lwr_spent", gpr_reactor_test::c_spentuox()); + int id = sim.Run(); + + int ncore = 3; + int nbatch = 1; + + // reactor should stop requesting new fresh fuel as it approaches retirement + int nassem_recv = + static_cast(ceil(static_cast(life) / 7.0)) * nbatch + + (ncore - nbatch); + + std::vector conds; + conds.push_back(cyclus::Cond("ReceiverId", "==", id)); + cyclus::QueryResult qr = sim.db().Query("Transactions", &conds); + EXPECT_EQ(nassem_recv, qr.rows.size()) + << "failed to stop ordering near retirement"; + + // reactor should discharge all fuel before/by retirement + conds.clear(); + conds.push_back(cyclus::Cond("SenderId", "==", id)); + qr = sim.db().Query("Transactions", &conds); + EXPECT_EQ(nassem_recv, qr.rows.size()) + << "failed to discharge all material by retirement time"; + + // reactor should record power entry on the time step it retires if operating + int time_online = life / (cycle_time + refuel_time) * cycle_time + + std::min(life % (cycle_time + refuel_time), cycle_time); + conds.clear(); + conds.push_back(cyclus::Cond("AgentId", "==", id)); + conds.push_back(cyclus::Cond("Value", ">", 0)); + qr = sim.db().Query("TimeSeriesPower", &conds); + EXPECT_EQ(time_online, qr.rows.size()) + << "failed to generate power for the correct number of time steps"; +} + +TEST_F(GprReactorTest, PositionInitialize) { + std::string config = + " lwr_fresh " + " lwr_spent " + " enriched_u " + " waste " + " 1.0 " + "" + " 1 " + " 0 " + " 300 " + " 1 " + " 1 "; + + int simdur = 50; + cyclus::MockSim sim(cyclus::AgentSpec(":cycamore:Reactor"), config, simdur); + sim.AddSource("enriched_u").Finalize(); + sim.AddRecipe("lwr_fresh", gpr_reactor_test::c_uox()); + sim.AddRecipe("lwr_spent", gpr_reactor_test::c_spentuox()); + int id = sim.Run(); + + cyclus::QueryResult qr = sim.db().Query("AgentPosition", NULL); + EXPECT_EQ(qr.GetVal("Latitude"), 0.0); + EXPECT_EQ(qr.GetVal("Longitude"), 0.0); +} + +TEST_F(GprReactorTest, PositionInitialize2) { + std::string config = + " lwr_fresh " + " lwr_spent " + " enriched_u " + " waste " + " 1.0 " + "" + " 1 " + " 0 " + " 300 " + " 1 " + " 1 " + " 30.0 " + " 30.0 "; + + int simdur = 50; + cyclus::MockSim sim(cyclus::AgentSpec(":cycamore:Reactor"), config, simdur); + sim.AddSource("enriched_u").Finalize(); + sim.AddRecipe("lwr_fresh", gpr_reactor_test::c_uox()); + sim.AddRecipe("lwr_spent", gpr_reactor_test::c_spentuox()); + int id = sim.Run(); + + cyclus::QueryResult qr = sim.db().Query("AgentPosition", NULL); + EXPECT_EQ(qr.GetVal("Latitude"), 30.0); + EXPECT_EQ(qr.GetVal("Longitude"), 30.0); +} + +TEST_F(GprReactorTest, ByProduct) { + std::string config = + " uox " + " spentuox " + " uox " + " waste " + "" + " 1 " + " 1 " + " 1 " + " 7 " + " 3 " + "" + " process_heat " + " 10 "; + + int simdur = 10; + cyclus::MockSim sim(cyclus::AgentSpec(":cycamore:Reactor"), config, simdur); + sim.AddSource("uox").Finalize(); + sim.AddRecipe("uox", gpr_reactor_test::c_uox()); + sim.AddRecipe("spentuox", gpr_reactor_test::c_spentuox()); + int id = sim.Run(); + + std::vector conds; + // test if it produces side products only when reactor is running + int quantity = 10; + conds.push_back(cyclus::Cond("Value", "==", quantity)); + cyclus::QueryResult qr = sim.db().Query("ReactorSideProducts", &conds); + EXPECT_EQ(5, qr.rows.size()); + + // test if it doesn't produce side products when reactor is refueling + conds.clear(); + conds.push_back(cyclus::Cond("Value", "==", 0)); + qr = sim.db().Query("ReactorSideProducts", &conds); + EXPECT_EQ(5, qr.rows.size()); +} + +TEST_F(GprReactorTest, MultipleByProduct) { + std::string config = + " uox " + " spentuox " + " uox " + " waste " + "" + " 1 " + " 1 " + " 1 " + " 7 " + " 3 " + "" + " process_heat water " + " 10 100 "; + + int simdur = 10; + cyclus::MockSim sim(cyclus::AgentSpec(":cycamore:Reactor"), config, simdur); + sim.AddSource("uox").Finalize(); + sim.AddRecipe("uox", gpr_reactor_test::c_uox()); + sim.AddRecipe("spentuox", gpr_reactor_test::c_spentuox()); + int id = sim.Run(); + + + std::vector conds; + // test if it produces heat when reactor is running + int quantity = 10; + conds.push_back(cyclus::Cond("Product", "==", std::string("process_heat"))); + conds.push_back(cyclus::Cond("Value", "==", quantity)); + cyclus::QueryResult qr = sim.db().Query("ReactorSideProducts", &conds); + EXPECT_EQ(5, qr.rows.size()); + + // test if it produces water when reactor is running + conds.clear(); + quantity = 100; + conds.push_back(cyclus::Cond("Product", "==", std::string("water"))); + conds.push_back(cyclus::Cond("Value", "==", quantity)); + qr = sim.db().Query("ReactorSideProducts", &conds); + EXPECT_EQ(5, qr.rows.size()); + + conds.clear(); + conds.push_back(cyclus::Cond("Value", "==", 0)); + qr = sim.db().Query("ReactorSideProducts", &conds); + EXPECT_EQ(10, qr.rows.size()); +} + + +// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - // Below are standard tests introduced by cycstub. Probably not so useful but // they don't do harm, either. diff --git a/src/gpr_reactor_tests.h b/src/gpr_reactor_tests.h index 2c599ad..c104a84 100644 --- a/src/gpr_reactor_tests.h +++ b/src/gpr_reactor_tests.h @@ -37,7 +37,6 @@ class GprReactorTest : public ::testing::Test { std::vector in_commods; std::vector out_commods; std::vector in_recipes; - std::vector out_recipes; std::vector fuel_prefs; // The Do* functions are a hack: GprReactorTest is a friend class to From 3f2a603342143b762b8716eb7dc160858b4aa6bd Mon Sep 17 00:00:00 2001 From: maxschalz <58850267+maxschalz@users.noreply.github.com> Date: Mon, 7 Jun 2021 14:22:30 +0200 Subject: [PATCH 13/18] Add GprReactor to example input files --- input/archetypes.py | 4 +++- input/control.py | 4 ++-- input/facility.py | 35 +++++++++++++++++++++++++++++------ input/recipe.py | 10 ++++++---- 4 files changed, 40 insertions(+), 13 deletions(-) diff --git a/input/archetypes.py b/input/archetypes.py index dd97548..fde0ac1 100644 --- a/input/archetypes.py +++ b/input/archetypes.py @@ -5,7 +5,9 @@ def archetypes(): {"lib": "agents", "name": "NullRegion"}, {"lib": "cycamore", "name": "Sink"}, {"lib": "cycamore", "name": "Source"}, - {"lib": "misoenrichment", "name":"MIsoEnrich"} + {"lib": "cycamore", "name": "Storage"}, + {"lib": "misoenrichment", "name": "GprReactor"}, + {"lib": "misoenrichment", "name": "MIsoEnrich"} ] }} diff --git a/input/control.py b/input/control.py index 5afe7ff..79d096a 100644 --- a/input/control.py +++ b/input/control.py @@ -2,8 +2,8 @@ def control(): d = {"control": { "startyear": 2020, "startmonth": 1, - "duration": 12, - "dt": 2629846, # duration of a time step in seconds, here: 1 month + "duration": 365, + "dt": 86400, # duration of a time step in seconds, here: 1 day "simhandle": "misoenrichment tutorial file", } } diff --git a/input/facility.py b/input/facility.py index 0558f03..eb31b1b 100644 --- a/input/facility.py +++ b/input/facility.py @@ -5,14 +5,13 @@ def facility(): "config": {"Source": { "outcommod": "NaturalU", "outrecipe": "NaturalURecipe", - "throughput": 2000 + "throughput": 10000 }} }, { - "name": "EnrichedUSink", + "name": "SpentFuelSink", "config": {"Sink": { - "in_commods": {"val": ["EnrichedU"]}, - "recipe_name": "EnrichedURecipe" + "in_commods": {"val": ["SpentFuel"]} }} }, { @@ -22,6 +21,15 @@ def facility(): "recipe_name": "DepletedURecipe" }} }, + { + "name": "FreshFuelStorage", + "config": {"Storage": { + "in_commods": {"val": ["EnrichedU"]}, + "out_commods": {"val": ["FreshFuel"]}, + "in_recipe": ["EnrichedURecipe"], + "residence_time": 0 + }} + }, { "name": "EnrichmentFacility", "config": {"MIsoEnrich": { @@ -31,13 +39,28 @@ def facility(): "tails_commod": "DepletedU", "tails_assay": 0.003, "initial_feed": 0, - "max_feed_inventory": 10000, + "max_feed_inventory": 1e299, "gamma_235": 1.35, "swu_capacity": 1e299, - "swu_capacity_vals": {"val": [1e5, 1000, 2000]}, + "swu_capacity_vals": {"val": [1e5, 5e4, 5e5]}, "swu_capacity_times": {"val": [0, 5, 6]}, "use_downblending": True }} + }, + { + "name": "SavannahRiverReactor", + "config": {"GprReactor": { + "in_commods": {"val": ["FreshFuel"]}, + "out_commods": {"val": ["SpentFuel"]}, + "in_recipes": {"val": ["EnrichedURecipe"]}, + "n_assem_core": 1, + "n_assem_batch": 1, + "assem_size": 110820, + "cycle_time": 88, + "refuel_time": 6, + "power_output": 2400, + "temperature": 350 + }} } ]} return d diff --git a/input/recipe.py b/input/recipe.py index 36a8005..ecf1645 100644 --- a/input/recipe.py +++ b/input/recipe.py @@ -4,17 +4,19 @@ def recipe(): "name": "NaturalURecipe", "basis": "mass", "nuclide": [ - {"id": "U234", "comp": 5.5e-3}, + # At the moment (May 2021), U234 is not taken into + # account by the Gpr model. + #{"id": "U234", "comp": 5.5e-3}, {"id": "U235", "comp": 0.711}, - {"id": "U238", "comp": 100 - 0.711 - 5.5e-3} + {"id": "U238", "comp": 100 - 0.711} ] }, { "name": "EnrichedURecipe", "basis": "mass", "nuclide": [ - {"id": "U235", "comp": 90}, - {"id": "U238", "comp": 10} + {"id": "U235", "comp": 1.1}, + {"id": "U238", "comp": 98.9} ] }, { From 8fefb2b6f9cbdd934f58b3ad399b2e09305f63ec Mon Sep 17 00:00:00 2001 From: maxschalz <58850267+maxschalz@users.noreply.github.com> Date: Mon, 7 Jun 2021 18:09:06 +0200 Subject: [PATCH 14/18] Update README.md --- README.md | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index eb49644..2e5acba 100644 --- a/README.md +++ b/README.md @@ -64,7 +64,22 @@ physically founded approach to calculating said separation factors. This facility needs Niels Lohmann's [JSON for Modern C++](https://json.nlohmann.me/) library. It can be downloaded from his [GitHub repository](https://github.com/nlohmann/json) or using one of the many package managers, see [here](https://github.com/nlohmann/json#package-managers). -Successfully tested using `conda install -c conda-forge nlohmann_json` +Successfully tested using `conda install -c conda-forge nlohmann_json` and using `CMake`. +When using `CMake`, then the package needs to be installed globally +(i.e., under `/usr/local`), as shown in the following: +``` +$ git clone https://github.com/nlohmann/json +$ cd json +$ mkdir build +$cd build +$ cmake .. +$ make +$ sudo make install +``` +While it _should_ be possible to install `JSON for Modern C++` locally, +i.e. in `~/.local`, this results in `CMake` not finding `nlohmann/json.hpp` +during the `misoenrichment` installation. I will hopefully manage to +fix this in future versions. Additionally, one needs `Python3` in combination with the `NumPy` and `SciPy` packages. From d66245ad030a6daa16138e181f9bc7f8e8c38325 Mon Sep 17 00:00:00 2001 From: maxschalz <58850267+maxschalz@users.noreply.github.com> Date: Mon, 7 Jun 2021 18:17:12 +0200 Subject: [PATCH 15/18] WIP Add comment about nlohmann_json installation --- CMakeLists.txt | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CMakeLists.txt b/CMakeLists.txt index 54fb6dc..a5892cb 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -126,6 +126,9 @@ SET(STUB_INCLUDE_DIRS ${STUB_INCLUDE_DIRS} ${PYTHON_INCLUDE_DIRS}) # Find Niels Lohmann's 'JSON for Modern C++' package FIND_PACKAGE(nlohmann_json REQUIRED) +# The line below does not work! +# For unknown reasons, CMake does not find the include directories +# and nlohmann_json_INCLUDE_DIRS is an unset variable. SET(STUB_INCLUDE_DIRS ${STUB_INCLUDE_DIRS} ${nlohmann_json_INCLUDE_DIRS}) # include all the directories we just found From 7cb855cdddafa4136686bab71bd382e26e910100 Mon Sep 17 00:00:00 2001 From: maxschalz <58850267+maxschalz@users.noreply.github.com> Date: Tue, 8 Jun 2021 15:20:23 +0200 Subject: [PATCH 16/18] Fix uninitialised value that might throw an error For the `GprReactor::Transmute_` function to run properly, without throwing an error, it is crucial that `python_exit_code` gets initialised to 0. --- src/gpr_reactor.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/gpr_reactor.cc b/src/gpr_reactor.cc index e85214b..1983cea 100644 --- a/src/gpr_reactor.cc +++ b/src/gpr_reactor.cc @@ -502,7 +502,7 @@ void GprReactor::Transmute_(int n_assem) { Record_("TRANSMUTE", ss.str()); cyclus::PyStart(); - int python_exit_code; + int python_exit_code = 0; python_exit_code += PyRun_SimpleString("import spentfuelgpr"); for (int i = 0; i < old.size(); ++i) { CompositionToOutFile_(old[i]->comp(), false); From 0b361f0a8b061a9180ed094fe2da09cf6ba4153e Mon Sep 17 00:00:00 2001 From: maxschalz <58850267+maxschalz@users.noreply.github.com> Date: Mon, 14 Jun 2021 14:09:12 +0200 Subject: [PATCH 17/18] Update license, add authors etc. to Python module --- LICENSE | 2 +- spentfuelgpr/spentfuelgpr/__init__.py | 22 +++++++++++++++++++ spentfuelgpr/spentfuelgpr/kernel.py | 8 +++++-- .../spentfuelgpr/predict_posterior.py | 5 +++++ 4 files changed, 34 insertions(+), 3 deletions(-) diff --git a/LICENSE b/LICENSE index 4a914fa..dfa5f20 100644 --- a/LICENSE +++ b/LICENSE @@ -1,6 +1,6 @@ BSD 3-Clause License -Copyright (c) 2020, RWTH Aachen University Nuclear Verification and Disarmament Group +Copyright (c) 2020-2021, RWTH Aachen University Nuclear Verification and Disarmament Group All rights reserved. Redistribution and use in source and binary forms, with or without diff --git a/spentfuelgpr/spentfuelgpr/__init__.py b/spentfuelgpr/spentfuelgpr/__init__.py index c063204..d19b56c 100644 --- a/spentfuelgpr/spentfuelgpr/__init__.py +++ b/spentfuelgpr/spentfuelgpr/__init__.py @@ -1,2 +1,24 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- +""" +Calculate the composition of spent fuel based on a set of trained GPRs. + +This module is part of the misoenrichment module for Cyclus, see +https://github.com/maxschalz/miso_enrichment/ . + +The module is strongly based on Antonio Figueroa's work, who kindly +provided the original code. For more information, please see +https://doi.org/10.1016/j.anucene.2020.108085 +or https://arxiv.org/abs/2006.12921 +or https://github.com/FigueroaAC/GPs-for-SpentFuel +""" + +__author__ = "Nuclear Verification and Disarmament Group, RWTH Aachen University" +__copyright__ = "Copyright 2020-2021, Nuclear Verification and Disarmament Group, RWTH Aachen University" +__credits__ = ["Antonio Figueroa", "Max Schalz"] +__license__ = "BSD-3-Clause" +__version__ = "2.0" +__maintainer__ = "Max Schalz" + from .kernel import * from .predict_posterior import * diff --git a/spentfuelgpr/spentfuelgpr/kernel.py b/spentfuelgpr/spentfuelgpr/kernel.py index 1be7f65..76e3361 100644 --- a/spentfuelgpr/spentfuelgpr/kernel.py +++ b/spentfuelgpr/spentfuelgpr/kernel.py @@ -1,13 +1,17 @@ #!/usr/bin/env python3 # -*- coding: utf-8 -*- """ -This module is strongly based on Antonio Figueroa's work, who kindly +Define the kernel function used to calculate the predictions. + +This module is strongly based on Antonio Figueroa's work, who kindly provided the original code. For more information, please see https://doi.org/10.1016/j.anucene.2020.108085 -or https://arxiv.org/abs/2006.12921 +or https://arxiv.org/abs/2006.12921 or https://github.com/FigueroaAC/GPs-for-SpentFuel """ +__all__ = ["Kernel"] + import numpy as np from scipy.spatial.distance import cdist diff --git a/spentfuelgpr/spentfuelgpr/predict_posterior.py b/spentfuelgpr/spentfuelgpr/predict_posterior.py index e0c2d97..53bb029 100644 --- a/spentfuelgpr/spentfuelgpr/predict_posterior.py +++ b/spentfuelgpr/spentfuelgpr/predict_posterior.py @@ -1,3 +1,8 @@ +#!/usr/bin/env python3] +# -*- coding: utf-8 -*- +"""Interface used by Cyclus to calculate the spent fuel composition.""" + +__all__ = ["predict", "run_kernel"] import json import numpy as np From 518183f84362e11a26bd607b91e6a47582aa3c14 Mon Sep 17 00:00:00 2001 From: maxschalz <58850267+maxschalz@users.noreply.github.com> Date: Mon, 14 Jun 2021 14:19:38 +0200 Subject: [PATCH 18/18] Add reduced y-data trainingset This file contains all the data needed for running the `predict` function. At the same time, it is only a small file (< 1MB) as opposed to the complete y-dataset (>65MB). --- spentfuelgpr/data/y_trainingset_reduced.npy | Bin 0 -> 620107 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 spentfuelgpr/data/y_trainingset_reduced.npy diff --git a/spentfuelgpr/data/y_trainingset_reduced.npy b/spentfuelgpr/data/y_trainingset_reduced.npy new file mode 100644 index 0000000000000000000000000000000000000000..0a8a6cbd6d76b660adb0089901f4afbba0cb4baa GIT binary patch literal 620107 zcmbr{d0b6x)Cc^KN>WOOlA(bJDUynIluAl*NTv#@h|1m-l~R?OVacxRbR>9FEk`9T#E1uR}~eSewAv-%qA6^xhgCb zn>#d{A+}g1D$2x`ySg}p7iHh_~JO>OMAgX(d8omBMUSF8s^tsa|Rk7`? zroSh^O4R)C@6nQp?f&=g87gZ3zyBVEaIyUi2bCp*(ynRMMhRjEx!6%AcAC|8Ryzlk z3kA7K{XWMDqK;hDm5H63M&l-)-*C{?P!RRxVi%d%wP{pq>ah2nRqO?^n_TQJ6ZM-$ zZ~oggf5>?kK{SwyhBDEpY4q6LsJvd6!vwL1T z2OBfhH>fQT#6EJduT1RMG@8C_?|N}7{aRDG*k2}^HH{iK*I(Bodf!mdTrLifi36KP ze{R}fVf4#J5G~~5Aem^{G+MhgKc#E)(SkTwE?UV%>!#824+(=KM42Gk$i*Qtap?by z7X6!lXRogy+R8;iCfYTPeraLeA^z-iK^!I*hs#9!rqRs)JNw^jmmr7^a&d%AbZi=( zY8cpOOI(?)=p+}NW#Y)D(bU}cPN(XO1<^$=j*^M4O`~hW&d&-tCJ3UNTpTSE-J3?W zx>dy13gZRQLoSYyiDR2ar=@Nmx;J{ZAj;(8IGH%UY4qRdBA@o*k|27@#R)Ret7-J% z)Q2g%_tAScQ7%rBiIbZ~FB;354GO1MHbpK@m5JU>qpE)+^9P?Y6+|Do=qnSaHI1q{ zJd0d%+EWmx%f%To(XVOrc!1W_M>{7A;!L^dFB1crMr+e$osGWv3u2&LoFx-yH;r1X zPLpRJqxURGF3ypObDKtI)R)_t&YdHO!E!M~CWbbR#xHN>IVD$95a-E7Q6@_N^CxsD zdwf%{6~r*P7%mednns`Xy63syV~ilqmx~KzVr0{3hq}4HH1uoXuCHv*qGWnYgQI^oB?07tM@lG)FG(mWg|sMomAh zzgw9TDu{dK;y#(UziD)=$!e#A_ZAD{0l9ckCLU@U^?IFj&@aeZ5Od|?VVQWOY4l6Y z@`WwyX*ToZ;!&A+tZ8&c#W<6l{pi^|E*DS8#FI^Sfiv;nkTs$We&o_;po8~#Td=brCzFfQ@6APL~%h!GSo|(N+5HHHbOEU3t)98dg zxkpBK^0yVQ$i=HN@mkYpwXfX9@VAa2UYCnEWMW~{=|#NwvWT~Bl;b~)@Ph$V8dR3_eS8qIcAPYC@TD2Vsu;(eJ|)-be&`U2XK&=Kd z$djHs=skNU7vIao4^5*N_H}z2dn#HGKgz{VGVycM=#{}1E@fqpY{f5fv05h9G>w+( zd^}pWZJ;22m5a49v94)!`V!ffO=d#{@ta)yE)(mUMwgiF_xLSPeE1<38)V|orqMnQ zZT%N3(tGwxF8-E@jZLHNTI{}P zU7I+x)ZpkigLk%43$P-%C9}CrdGB7y_JX7YRtBpu>)yX>^4`HykXnIN!L6B-GplTd z8F~wn8n_KuojJ{7^^58fe?ig!w*_l5yX^Y3*|BhjAZdZyfwh_S&d*HS?YdNu+JifQ zJ2JQJA8-HHKvR%9fpx&T%pM_o1O6rs7NpK#J#ZK1JA=bop6%o)NL|6*z}=abbPt@+ z&uNk%>4OcxhRl5{pWOK|EnJX{z&*e{ndgTc+Nb|BQjmUDZjF}r@kQBgB`#ln0-sjvOSm3Qgj46ft{J#E*ZaT%%IVNG!pCr9>qNV=_KjV zsHuYF3U&jJW?ocRd&l7ju{+oUJcc>zYuC)!f3()df@R=w%zK{&xXYau3(|P7CwKyL zi*r+THazvVmAt_JrLr=Ka`*pv1j7>w9w+MP3esfo6!28$xC@&if2|rWNZw!{urKrP zXR`Q)sF{K^4Llt@gZbyC-MU)Q^!WRMXM+8iQ(Ui{DLzaS8UPLi&tkUA4VwI82+i1R za1eM7^YuS@>jv~YWGl@D2ZKYH9Rl9#EZu4+NTJ|)V3B!RUFuE~8+SpHz+vEU=Es_e zf4=RTB1jS7`QQc2jT*vaXv>3buoWR^NE~#)ra6dsx1TO{4nUg!)NBq+pAxO)>N#JDWsr7BO zjw-nd(sJ+$a0>J9pB{t%ji>i~B{&tlin+8(t7X)@J43W+9g&6fdd371Dpxo#Ju}ygLXtIMTgDcE#R%pZXd3u ze7PPdNLk=*;O)#SKmLl?u!>gd4sbSjC-Y6Cp}%@6(MsI~&H?XcPLG~5Ywb+pJ>b3I zeawk!4hge2cM+uh-~-@;%Z}~hCG5?s_#_hGPl^|UPUjbib-oHQn_U_gWf^-dh9ejgX%y8Sa zJB9*wA^0Zv7PC^&p;2A_5*LAQgYPhJ|IqV!{&h)^ioqq|QsyA19kFUN=y%@*-vi%g zu6yRUTOg2$sQVD(oe#=~arJ=y4K2?ya!0*8C zna{7=Hu9Wpg01uc{1N<#d4H0SFmfnu(4WCyz}3vVv<`>OGofv+2K*IV%e=B$_r&4p zv{LK9-@xCQ#p%Oyr_844P!IkAZeSi=_aLxY86_q^!N0)2nUijHE^(Mm+z9>y{>$7L zq;bgkM1igJ53E3C8ky9Lu1%?A*12fkmR=@;)SQOoQVXymvl!)2@A_hbAhiT5ft8sD z)QwuyzAGgrD&SUNRp#9dADaJ5qTtaQtOjnw95W}r*P?#(2&#iMz-^g7nk7B(9v>n| znqVz(JLb(-LKnRo^ut!t2Db-yV6J?U(86mD<%%7_oxnQGrJugG2`_OHBwcW4upaZz zLyuxA6UGTr7jRc_H|Eo~%Fc}aOtGaqSRZV_9Qg9d5Wmq21<4R>1n$AS(6wZ~MkCEw zPp~n#7xVae<1Ks=8f>NBU=wg3=HZ?>-uBxbv(WD{$Mk(IrD&D z_dSvXdWZ&q2ZAk_3zmu2MV)9V4gy<(2QwF@1z%OQ3>73Rur=6*IVU9lrps}umlcc4h~<|@8N$dH5?oPp3f}mE%Kj=RTR&Fdpb@!-YaCCoEFEW4k3l@6K-;6(6J=HS%aoZFRS z1W68F22NuBcQW+f+B5XFB!icOS1^wpr*!_&xoAO30j~t7GOq|(bZeu=B0*XOUJYKu z?B1n+pGiA!*h*>OwcvE-AQA8{3*je0X_*n#hi7svcu+s@q%<3doU_e34mQGt)-To-&V1;LG4E%qf~}KE8CIrFa#5 z4Sb#1drSGH;*|>o=?1tEe3SX7#XhaXQc8kvfs4SmneS{r`EU7$FhRNlE(Vt{cUV~H zyhl}8kV?UK!S|Sjxppg_YS4_`2bX~#Fpun9Fmv^Hde0w%AAuh;TR1EzN_#@@`4ezC z_$jll$NA>Bj?NLJXW-}H7tEG@#txZkOu^$N_!amybKUFx5!dqQ#wx&-;5W=2y{E5k zqh%yWZ^2dIcg#gLL3_5p_7J4^;1A%B%=d1`=1q6=5~NSy&)_f2uY!~g`W>c?sv2Aa z{>rR7p{Bb$i-JcjxDNb{`H6g_&f2OtLHZ7^2mfGR+dJ!z#~eyb8o)onznDuMvn!_T z?JY>Z!HwWQ%%{AswT$~VM3DZ1|A7@+{O>;Yu5d+Ikn<=(YDPnHsX1L`QVZr$n$0J- z97`t)MQ}^760>!~tjqZw=v<-aC_#(fn!(17P<*i2XIGlC+1NR#&18b zr76(?>w-HomnfWRbJc_vvL3h#xGS@(nyxUeIc-$kz}><6%sZoey;ILpxHkYBf{mDa zzWx!epZ3yL>H+QvHfGM4bi;ArTAI*a;ND;p=0C$Wze_N47NkDlzTke$xz;Xo=4w%) z*c99!Y{tB!#4y4notYyAh0E~i@tM1@EZy}gTYo{Yvx65 zqz!AAf3=ltz(c@8neQc-w(9+GfFRj|1+X3SmVCpw6VVjUhk=KK?U@Z_xf2f9)08-X zM}Qrfy|bUpEZ3uRi4)ivJd!zaW!ks>Qjj3IfJcE{nY}by99b}p*bO`y?9M#Fr}IX) z_WFY40UiS$%Us;g$2ro@Qjlceap3XH;+f51Pe0Hz<_Vqv_F}%*I7r#PP$ozd!IQv~ znQKq{i5uoe<+mx|sbFtr$A0x|uGrC9^8x#Ur!iaV=Ii8tS}aJ@!85>q%*8sVJ6pME z2+~ZjKRAGS;)j@Fns#&^3k1&s&t}dxn19@TA*ED7;5p#A%!~IWUG=Z0fE^4D0f#aV zm^AI1=|bXpU=b`aM-6KE!LMDoAccX$!4b?)BJ?-5UP+n9eDDHrB=g1BU*5jD)mo6E zz|r7^%!OAU-0X6fqC*Tg7QBc#I;)-BXX_+EiUY@k7c=itQaiogh-%nNzzN_)=1;}O z-*R5lQd|m_gO@R@bpADIEp?itByci#IkT^4TtN$Cxgf0or+`;759ylMt@59lAf7Nr*H;C0~j%zo2sb;tLneQX1GBRGTk!}*xq z+C}u9XM#6@H!~X_x;(-80aZk|fVYCPm{X42tbI{M6S@t&9lV3t{l&`Tmg5iGO4;C@ z;9blc&W4ru8$rjl9Pn=N9_HS+*JT=xpm@F)ybrvex!=E*@`S;3V+X(o!H1a5+h5(; zaXRJ5x!}X#Bg}b$`YKD)sl=TJJ_^sc0H0)j=u>ieo|%#$odTZ* zpJD!Lv`eGQZ;IzN-Y7Gg6}fRhezF8M@@C<9{4`EjCn}DcU#q`bhv*2eh7ZVynAMF%Xujj zupfh;fXkUPo^>nA^rg(>Dfk)qIdkm0x5E+w=*C`vUxHsTw+K0DyG*yDU%suiSO)+~yOYtN46ZkXpRL@7}YtpEb z`vqJLu3=vNQmdU^2MQiv!L{Hz=4RVAA4syM;PDOo9bC^`y3^bzsZd9det;XmKbc$i zzjx!2lC2>90{;d#GFO%cx4zemHmX11zuTssIWeTHtnIZRWv|PVvPJ^!T?2cK~-}uAf%% zZvS`+9-Y8CU|r^M=~uiQ18JM<4Auj8VXm3nDSY`AI`nh}cLR547B$P4y?fi2`rlv! zup#sFixa-4`B8K*0`~y-WNvsFxTp9gMF(SWFK}<>@h_appH87du?e^jxG(dFglUn- z4$@ld2Q~%wXI{26#k~A2O^F%U96W$|OuylKbl1gG{~K%p9>hFOp7kNfvS_Ge2_6i# zVs^^ytvltlG4;Q}HsB%5=97#5Z4I!X{x{ebEHG=e|7I~dgpMtC;9=n5%=QLnHM%L# zjoE`8z$2KOM;#1t_NI952zCNHGmkqnd)c!riY+6-F5pqjZXqRh3Bm(g$rbDd9?d*< z=~1f(p9fL@8|(od!<^8?+5d5=JN3W8GVnO&$@f;=3$dpe8xQsbPhgJB>YmZ|C*{aq z;Qv0SN&Ro;x&22ixbojIbuxGgcq;Sa-Cr_OIwn&88|(x2W&Y&6Ma+Bo)>fJZo(`VD zT$v%CWSvVj4?plsus?H;_G7k>ws)ldH#iVHi+P>PL{p_?TB)%EPHu zI~N=b4q;w7eplm+eiY9`!Slc(v&FR)X$N=Hgi7Era5!`8!a+XS%X?7&8$2JpfcbCF z8FoSUsIC|ZjsizB4_p1|NpmwQ4J-u5fMc0GYz%eehbgu!0>^>lnYH3{RGya8Qd|sP z0#0C-mb@=}y_-T$B6ulS&U{Gkj`rqJ8@FwOIt76~udOFo?25$jxWezJk6+f(z!hIHa8+bc&Y|i*$ckfbZ zUz9{x|qI_yqIqvEk8CuJp=J zf=_`@Gmp#gv0D~QJMbCsS@1dL_Q@F+Gk;R~?L0Uie1W-bADavHHz;@%fG>hCG2gnq zw`JBZ+NdsruYj*I|8O&3IDR;V`)lCq;2X?~tPh>Yo_fMoDg@sI-(r5HwExnso>cQF z0^bJTVUE++mhXCIPyKIj3AmKG#Y&@@J66yxco%#Re4knIl=dmHBc&E);0NG`%n4V{ zDnGtJ578s=WAGE^-wrPohs~#YYB~5R_!;w$y1Rj1-{_M$&%rOiFPWEFy-I5~w>$N} z!LPv;%&&dhElzDm!J`uV2K<)UR7Gv0jy|0vtHAHT@0n+$JiOk1HpTM~;E&)>%%Oqa z&gZqMO7$811zgR%$v&Y$dl{|s8t_+eE%V@0EhirEpd`2s{0;n_dHdCz_e+#%2d)SI z05>o{*!fZCYI9ntKf%AiznQOJG^+@FK;ga-{0ID(S!d)SQN>{|#1TZg$@EflC?A|C}10cjleyaOHb{~yfcr=P(8uM;9kswLYm*%Z9@0m8*BpZ!|Z$b zN^V^eEycdzeqdAPd+l58)!MV1`rlwPusL&^LD}BNkI+Lj06Y+E!JPhPjL{YKq168d zTY?8OZ@j74cyY5U^}oT^U>jz)o=S)FCQ?c@1UwXM%iPNOU-QyS6deSx9e5b?w!_Ko zC+wV0{co^6*nwH^e#y(DYQ!VJj$kKd-`>`B=j*kp{|z1qc41D++;3U8#+>@!U{|mk z^T0Viai1>J<3Aeg4)$PHnSUVFLT@JZzrka{GUlv_nvYWxDJdEU9uM|pzMJ>eaOi28 zu?b)=@I>b9XGK0e+R)oF2|O7*g}KGr&55xcN^GU6U~jMwv)-1Qq3?Fk2JH);2Ayh?{{q1fUN4gd!-A8bgh^}RHX`rqK$;2`Ejg@-L|XU9|j z8$1^r%zPrl^~RjTG-Dy)Q1CqFLq!_*KPz6gl|--v4r3m3be&e`Dmu1=gCoH6nUw+# ztooKm8`T1EBshwBc+?q}iOXmQjs`CT$1p3a7Yc#CRP%@hF9OFgS0`jS?E63*4_*vj z!knCa&vDFUnz00MB6umYsb2Pqf5mmSk{rAYoWxvFHfgZi6-wWe!OOubm`|*l@}$oQ z59)t|SAtWSyT8xh8F+gN^}oTZ!E2a5Fz@NoSGQ}2{?z{lXMwjdA80K4>U!Uq z`rqIk;B4l0mAU731<0uX4c-OLVLm?P{)ZW9^q%hq?*Z>+R>}Iba#%5)B=>>$gAXvL zsKpvDzDnENLGU4PF0-ZLbNTGq9jN~eJ_62T4!d~lb>D&gsQ(Q<20qSQz2=2#!fD!K zPk>K?PciTEaz0v6LR-yg@EPz~W;6Yl&l5M%S~~|m56)*k^1Y4wcpciuE`STb7nzgK z44N0+NU`M-_%iqkbB~ugWA%^FdF(3q8u&W%*>yQ%q@$D!-T)VZZ!)K7mR7iYqtxOS zxCnfkx$ya=&nItE#&ri=3@%}g_!Lq;&yq5(Qt(~yJ?8Rpqcj>+xD5P&*-{*% z?$oe^`rqJ3;K$4hl85h~ph?l;3Ah~mlsP5o%C$j@Y^nbZehz-Y?E0|$SATO_iZ8*h zz^|D*+L>ON>PYW-1-KIYhPk49V&obfI+wf!SApL#w{F;e_3vO>Ywy7yz#o|t&o0kw2Rb~_ztcI z|6rD?^_R8lKbHF6;Gf`M%n>6m_I)&lg63~Z(w6$);Fe$|=AZeS-VOaq&zLe;1>B1HsKMi;@2@Fn zs)AdC)tEb-8TZ#_Hf>aG!0KQPX4#hb!m{}kJlcXa!CK5lzr>hV|8-m1fwjTynX41u zj~$mvzqq0qHju=g9m^IGMAZejJQ3AazzX9 zAh0E~o8@p5YkvwJgTYo{YvyL6%>LWG34&w;9s(Z9T&6SG*eQq3CAMGzY{%T`obiUk z%@cGjI6qqvZFIat9xg;BasR^V$Us zUbVgHzUPA%fFqfwjrA$_I8C20jRHr57c#d>o14+(kQJ-2d@LK zXD;hKAn$;k2KB$e8^IaOYp$4H4BkD6`rqJ9;LXf&(ODI{s_9&^1-uoU#k{Ifbc%MN z3Ec+X4&K4swnl&7%`ys_+2EbvUCgHL?}KVTQt-$D?*{K-)^tgmvafk8^}oUU!26l2 z+gg^lN}+Ef9RME$A7Vb;$GKo}KibD~!H2;|n5}PEUO(7trWw$C zejI!Pe3JQWlz-NgD-(EGcO$%H+Iwsdd9ARuY#{JzirjccS9SB=hwkEz=h0@pV$ezBPpKW z1m6M|G3Rewbo6#_N-b`K?|_S$wSGMd>h3`MSP8fke3yCW+Z_*w1SC-Z8+;#J#+;$5 zBk7vyQvVzL5d4T)W!T1&i0jtW{{}w+mou0AI(@CH0_BQN!Oy_YnI|n8GGk8_EyWk$ zm*7{-w<}l9cs!ZH{cCUqxRUwAg|Wq3c2R731AYsxV!k*;PqSMh?PKr2@4+9KZ|q)V z8njW1`rqJB;Lpt0st*r~TtGqd3%D9w!yLUd%b;Hs9b3MFYr%EQGwR=}>|aIi`8V)) za6R*&L9-n052hse2e<+JlezM8W6PIHw2*&+e}fyDHw|{`Ytxo8>_6bY;D5}2KSzEm z`)ES_Z)Nnq=}P@?x;7OpS4`?VeBlKr>VJb3!7Z6D`;XSI3ZX1l39JlOVHOpwR5SZi zbZ7-u1-EA2H@)QJwf{a;payOOR%f1G^)d3}R@$gEz-_^r%sxN+hHj>xX(DNX+kv&2 zH3L=#8AlY^O6|cNz#W;RgCZ*yly;^5H&_R(%Y4;peV>B*;ne>I>w&v48@ei*Ts}$R zzALyJxI44eFWY9tt~82HBAeg7Lg7;MGdVX4~ClKqq;TZ3)DLzp-0-#W2TeJS<7!M0$5`I_$9 zhSW23Y_S6m0}p48$gvAmE~E39J=g&}g4sQBqfO2yN9uoroxsk_wHLJ?#+K53j|97b zM=@_`+dJ#f6Ix8JU^nn+<`V;v{? z_Hfkx-Q&NH-b@2e2hU&*33hIr-4H_kZ}3d8KlA&;&$e$aqg^ln90;Dp+_Jmdn|VFD zQ2!eo1fIj(>UqW4fhM#A&jkmALzs6iA0xl-O7T1tJP#}~FQ0g$kK0{}EfP2k9L_A= zThl(jm{w{8cs_Um^XnIuvpe0U;1LOq0!K5ST3~*ER_YS!e}iMdvCOIJ)>WEWhSdKC z$AROS?-!&xr(UHQTMS+TPGBBxWSzM{VGQ-Z!Arq%X3L~6cFK#xss9a50w*(@>vgr7 z=SjK4a_|ap3iBSr#kW^C(o$RrP6e-G9w`Be2%Jv+Z}1lIR%YdZjC=7O zw3xEM+rZnIZ#fQXztfJ2SUbSk;GN8|XVfMSI+#fPZ*UHHH*@QPimPU8UfD`}zT&3;74^Tt2fzoJ=k#oCes42X4i15H!H1dcT~4o<-JIT*Bj7ynQRW*RJM397 ziZc>w5dISr=7r~d9XLd_#F>o1eRF}b5z*m{y4;`Mq-jXKt8u&W+2D5#f{gM(b zisyyko8Vi_v);M>%I!k?SP}R(_ztt8-I{^puhKd%2A6ci{KT zY8f56s@u{&_5u76{E2yCT)LKOh8y+2!C%1D%;E3HSjc|Tl+=K~f@_&=^fs9}XE;;lp$^snw`Ig54Tjuh$ zB_9e-8&LlnYzH33+`_Y8k?v^+>VJdn!4Aw9>rA&=mr&+00_+HOV(vSk``l;Q^x-&X z@JO%=b05o7{ktrt1J@|9E7*6Ff*TyYL~E;yK3*}BMmpF2HcA>dH(JZ8O5x?5yxC@~Si5;%;x zxq-Rb>5a6`!@&{Y`OI$?4lC7;qu{Xs90`tMHnkowbu&-$1VpZCpQ@|_1sm#jnpR46AQ>Xqncr|zp^Cs_;&I7D_QvVyg z7M#wk(IwEfID&TIb>Q{j4a{r5eKm2a@}d4WI0Kx?JmH{D-=4v=&20j225(``9aVRE zYk!I@Tftf2ZOq5-wXpquiek%l@D6Y`vv$;PVbwb$>VJcGfpeJCJ1nUfE{>x9H+T_z==@EPz~W|QWzCaYfBQ~w)$9-Pmd z5g9V)a5b&93*Z9qMdqXrW1l1kQ2Kred>MR&c}1Vp=~p}{>|F(417ByJ{o|TC#q)>YN8rcI9y|IzuZf`A{S$CG_$hPtrowHXhSIU+ z8TdK)1+)F@&jG9TX~tfHUx8mUR~1{Ypr6J;{cmt3_zm;lhbGZ+8iv&W23LXKF)s@) zFJFI(qQ!OE$G(H>!9SQEq)aQjP|}S0-{7C%U(CP%u1Y(dXiWWYa3lB+^A)3* zb-k`o&EqflA6TK)|E7{#cfU1Sb%-ASW;8_oZ@NR=6Kv%!CJG#hNF{|(jz zYcYFgN50FsLOF6fur|0ob3cRX<>o8szB_8*B(RV(vWQ%++5V%&Gqk?g=(# zzPa$IeQMv~)c*$e2AeRqF4*n$buk5xKH$FKe$2PGS}nd?LlbHW?hiI&KHkyv?w$XB z=AAis0C*s?$^O$nKJB5EY5^Vuwq(Akx4>slWq0a-gRQ{U%-&UdhT3ORxVHfh0S{%) zTkAe=-9(BGwqOBl$E@@2t#(8%?PJ5h!@>52%)fv5tE~=Crv5j06xfy7RVT~(cMTp zfkiZ9f#6x-+03b4@*f^?lq&{-=YZ!jN9>; zZgh%vN5 zuK}ll*D@!UeUn$$(o>QSUI$*!oDiV7{lr1a_BMbwf-{(Z+4+pDb*0dg3El+W%sik? z74?Ev^7_z<)CgfmlwXLMt^;KSe}%ta{` z_TFJs8ps151s`Lstn7Yt&Mpn=e}hkePcnO^-0vAepX`@Tflq_aFb|uOeP_lHN-fTU z&w=8W6_qjxqR>iZ~^nvZmTy`MALhI5qt@Jnc2W|P5nSK;w#{*;A_n4zIQH) zWt6vE2j2h}GOtu@2)T1yh5Fy%Ti_z*&8j{P4Rg$>{|&waE@loM_($xkOpkvFxD447Cv2s2+o#fXkVWhs7IOh7vyo zKLbB!cDj0W(@1ry*1Q0}1ixa=={#iTW)FIZUV|&ZmCTum?;q;9QdE2cehaQ*c3Lh^ zI4@9^`wsjb{DFB)yAy3Zf74R@2>t~A%)D>Qub4GPwAQ|WtHCwQeGg0w?KEmJ^}oTj z;5z0l8Tp>Wyd!L-Z{Y9XdS=TPT~AH6pd|PQxB>i=dH%g{y{_Nsfc*>n8{Ehozjw{| zs>A^5e}n&m|1lr3+UuTEMmMIQivBlUssByarlMu=)A1ko9ix&+3$P-%CG$)@_p15B zX?s@!D}z;-SAY7|r{zKVykaY`D!4WCN!7ySQ}d}>qXupRR%d>fT)1{(iYxWM!EM2s z%*zfp%8SR!sQ(Ra2i9h`tSUHm(QG<>{~O!^+>trA?zZ-gEDAlHz&c=E=AwfZC;G-x z=Fu6f2kye0TQmA=xGH__zALyJxI6Q~Ywg#LSvZ*b-(UlBfw}J-|Jg z|BQVd?Uqj)v@y6BxHt2XZN^>RwWjD`0`3Fu%lv(fZJk>-B_{pArr`d}p+ja|n%;@n z3~UY_z+6y!Y}Kr%zip*~U<>dd=72vtb|xj!vBeTR7;MFS;^s?>R!8YgwFcXOhcG`j zbXwebC&iYbU|X=jtlHLU?xWkZ*6hH;z{8nC9t2tb{qM)&+k+jzBbZyAnE2G~zn@a* z2zCNHGtcg2*XgNZC+dHLUBIK5hq}F86J+v2v5TuYgU7kDCg67#H$pKruw(2Pw6 zPXSM5wjMDyd!E>p`rlw5urISh$CQp+o6|Ek4Llt@gZatSj3MQQ&eZ<~&jkB3_nnnD zAyJJYasW6GJd64E)a`zU6{vtV8yp0l!)$nXXY8WEkDtOW`Hxno0!L~ zxiHGJj7r>_!CSyvnYa2a&mGl@_OUGRHt=@lL5bhOSDd8&*bZ)S0wV?FSzKA7pM{)XZj!jAF|na4z^T^WW;{ zyIlHeQU4p92R_Pty}yxnT-;FVe}j*MPcTnzeYelaRx~9i!Kc8dnN=rsvdN`?kw!WL zJ_|m_e9ZKOxPCnyu+M|@!55g-kG}Za`Y_cz3cwe^mze911>aB)qRitm_zL(cvw7M5 zsiJpV>VJc;gKseJ{I2}4XSEIWzri=bx0t)9zWvp!iZZSu@NMuN=CpJ7)|CAB<9v$2 zCE!x#lJ36sC#)zjxeLArzR&EdHQ<~6QF_M8zz@I=nOBCDzP`4D_!0Oq_zCmk5qH1; zYGXqEZ}3y_GiE#W7dOX^A3^oUCyw5em`$5Sa~h)lH&~JR z&5Dh^cAuhG-V&??R%X^rZ^)MK7O4LXZUt6l-Z1=F)of3S=dHnN;5N*`r)~DUwxH)* z9jpOv%lv0ZaO3$9TB({~EpR*LWn0- zH_1FfKLA-5+!?ILd}*WNl%R2ass9b`3hu^iF*wGj*)}?0cL(c(4Vay#954FXj*?(Q zuo1Wi^M!V^SL9~UF4z-n4DQ8TQ8mqLtO@PFy}>5nKFl*7Sb7chp{7J%a6hmqvyX~$ zM0`n^t<)cE1~zB*dp@O?qHj;?e}e~tE&h)O>^2!SoaTEF*b+RL*RoigFTr;UyQm}e}uyQ1h5x)BC}y@y|Q-S zXi6r5CxfRj|2zJE@rY=8#-@V3!9L8!O2#?4qb5=R8$1m>oq0*Gif8rKbl)?;e&CtR zA2*$8Ju{jfe}8ZQIFNa(%C80U!YDDB1)dEKVt#v}Lqf07RP&evo(m3UZoW<D=KBdb+HFqJjfI0F!1I~cT>Toi?z$iKzrm5 z&77|Gpm-h)UI>n1mOEy&%l${0M=W>|IF5OaiNmN;Qwlxt;Kkr2%x`v;k5Oq(Ia2~S z5xkT+%B?ivbR~VlR1RJSPGYVsUsBkqE#!0H^Wc2uw@1!u^v_77{x`S)e3ALjf_uNOU$3^6E`cwD zuQ2bNmXTMUOc~cz@HOytX7l^{iG$Bm#&rW+2)@ajSrRH#wx*2h7Pts}o38#7>4(Yu z_s`Z2lx6exGWU;0kah^O(rm_IHCTs8$Jn3$9|;wyK`xC(?bt1HT73p_Xx3?Ti){o)hfZ&;2P%3#>WGmXxyM$CAbz`$6R&XAV+aV5q(z& z{2g4+ywEATot4rXAw`LysYNY1XC%36q32p;cXZE$)f9hcf{ca6#Td*c``t5eXZPZ^-trFZ0 ztj%1r^zEamFLqO{65IjYk-3xhjkHlSj!~@=tOM3%URd5d#MZHdYL#F;a2MwHcc(rG z&n4~(?gsA8d_Jb)S5hp!a(%D?*pPYNO9kgn?lhrB;2z+f%nzohH_u&6GiD6#1@6s! z@^7_fa;Lpis|5D}_hr^L%6?Kh`V!SD!KUE;%qzbRdGhktRjO5j&A|hh4TlLS&!#@5 z@9Kapz=N2RREiqPV;)hh5{aGVnO&yGJw} zt+wS+trF}Bp1@qa+|g%;`DLnAf+vC}F?VTp=Wna66cs0fr+}w2Z!GXKopbsX)hfY0 zU|;6ayLXIUZMa9ZO7L{>4CXUkD(Z3v&@1-?&jkB3KPozAZfZe)cmOyMJd62geOG;3 zV~P&5!9n0T%+K5G{+alUp0T;$U~mYt$J}x1bIRx;3I)#ti_E&cyQ-Kc-lbY4I1C)l zJjeOx0q3r-sa6S|4_?6hX5*2wDK)fGBf(MNXlD2MK6`HUr2Ae7jseFqU%2!&`O6mC z^cR8S!12t3=d2IUS$KtNmEa}d1m?E2mQ!yuze%-9@KUgxxqb4`%s$5S_%8z|fs>gR zm~6cMY&7j-%fTzaDa;S%A9Kp_p($AjP6e-G{&=SKFk3lA#ns?7;56pXD%%Ye=d7Yy zB{&_tjydbmGtHP27pPVV-T>anJn(q`ppqWNRI3DMf;TbC=^vO9)hM2C25$jxW&Tya zbG21>dWf>X+rZnI6_($;e4>nIYzH_Syp!48$+qvUNXk5RfpfsSncv6BCcT=xoNATe zz2JS!>Mw7c4SaZ!YL(yv;DgLh9V>d5gwli_0_TDcGY9JGDFpdZY&inX10QAnd_j1m zwUnN*W8mZ96U_N3Iy)Xdq21sl_!Rgw^E6%i&7B9(+j0hc7JQC5J~{N=*|!uG&x7;9 z7nplASnGG0LNitXz6id=oRwqa^=ux6z02S$;H%6gEjq3)w0%IeO7L~?4d!00y)MsK zMNzR3d=q?&Io~R2`zLc+$VK4W;5*D$W9Pn|IfVAHVsHt#lsPtjsqw4WeN?Li-vi%g z9?~+=?du`RnaaQqzz>M^1V;AD* z;1}SR%wC7bZm2&((cu;NHMoLVV|VkBb^=XkCHM{aE%W1_&_#OB?b58%1 zUJ(Yg6hDAJfF(zPj-tZCP&&rw5)4$WzZYL#F`=8|Ln%k#`>N?L-Iz{<=izdGJ3+)8Ur z1>6d(%Dg)M*=hSmTB)tUYT!1^x9YkdY4D`PL>;UFZp-}gLFXVtD=NZjg0;Zym^($J zx9@apKh-M1?ZF+G=ariM>(`z(=#Jn{U>)Yq*FSbkTuA$vF1RyTkGV?i$EJkmG$mcY zUBTU$#q|ycOefIW(jBZ1HemL59PV|{`7PBd!A9U7%t^s+8C^dlQ>_wg4DQ8TU^rpi zI19==dV@{CeV7k*)lR8UqLtbg+z)KZTv_gVKeU)`tUuTcY|i{=#B#@XHnfio01pIP zFz-&hwP9B_MTbFPOYmUkn9BdDEU_PAR_gKv`n$QtoN3av~m;O5s8Y$A0IDn1o*8#zrJfPhJYvC%z;Voe zt$h_;htLT+9=sU5gn6om)Ox@gI@~9K6TwTFXN`9G`zDtrR1RJSPGVMFl5Ei|m1Zm% zyd1oO`9Yk)t>fA>V=3U3;8f;M`&JhZ*-y{dD)4IX8fMcTqxVe=rlpt$UJFiVPP3Zy z<@pGT4(q_{!5f%ul5aeT7*5e)BRB(`$-ME%n9$K%>7{J~Zw7B+cIsMvH^+#g!&Yz> zcpJ05tf)GuoSw1m;2q#>=KNmUW*<-tqgo|+7dVI6`L_Cr6Yb7YtrENkyqCHDscevY zAx-E$@P6#G-S<)OG4OF_ z#c2%-zj{&fe*%0Ge2O`0hxeqM%Nway2|fcp%iMNKN|a_ct<-bi^Wc2u!gDv9HLB1C zeF0nmzR2uXfiHuvFpq3#Y-eppuly?b8u&W%jT@;+N7U&Vy8$i)-(+?? zRABzikyh$0a1r=6v$WHBfA65}^s_3##o!X=!{*UjhNsa!RtmlgzQUtxzXHEz{-C`%%Qt2ZeOCuu34X(@Jpa)dZ$)~>-h!*Z@0icN$+nufPaF2G3To-nrXK7Dt%W6+z9@|T;uCy_c)VI(0{@I zzzXXBn@VmqIq}@!94)41G(_Lkp(}k?hxxqowe;DaDfB3UTY{CCI~Iog_DZ0&rVLgA zw_>(Qz0$({6y3KfxHVXfIeBH~or#x^(|2{i>R=7#X)(oKbJx>aYYWx{Yca3>H#lSZ ze<#UyU~O=F=5CI)PrWA7jCBBa1b1TAv^%+CM<;saI$&LJ=l_SOI}fM2>;4DcXeiPs z8a2~^N+H9EGL)oH6jBkI#8D!1MWsk6DN%+fluXGKl}3sNO{h#sX);ureyjKWd)D`# zb6wAQT|L+SoW1v2YwzWpo4N8r?^{nVP_h^W9t|GDykMNS;f8axQpbYjz~h*QKauQx zbtFC5c<==9MCLx}r7x!{Q`nmXo(!JCd|Y+uOzFooWAb1H@KokEhmz{Yb<)tLfv1CK zFh{g&T3>CZ2~`9uft8uBZw%EPt3=N|6Fdt%oB8bOU3c#NJEp3D=YZ!jch^4~>+TXn z-_-%Dfz_EeY*X#)>6=a8)d6dOHJS65JTbf}ev7`V1J(u$m|q`E&!|SIqhpBX5KnYzf}od z54K~L9p1m+7KzLBT^;ZSumf|=qmbGCVknO}f}Ow{nXCG*X;yWlk#7QT25({RcVPO_ z(Lt1Aw}PF)+n9AMzZJ!qQqXh(yMl$xcT#+nkNrEWKx7&X23!_`AgWyBp5N3hd ztbx*->6R)Kd>9n3gZ(rv~%F|;8f;`76l{K57CUJfz!bk zn7{0IoN?+KZK8|d4Dco9rN5ifUF~QKW`eW8+051XQm1v#=h1g{z`5Yd%(_w=7oVO< zOEC|81)R?;wSV^FBO;Vy3&4foB4*)B`F@{&iODxQ;xVC_1tQ33=e4V-f z?O@lR#Z=wj0GEMpGPheqDM%Gjb$<(d8+?bk!>O+RZ=pARR|k9#T+UoN=ELsZExGhv z9q@hd1Li$~34J=RQXZ=WSAicg+rM!-suoRA@e%kj_zAO7)3A_!-)P3F!B4@@m^<@# z?h5KpcRkO+FTgLE?^J)!>c4^ZSPi%qT*qAWJ#f*(sw33@2EPWsVcu`vU$R#R3pOJ0g=SG(6j{crGBa67Z?!S6$2dz_;FH@Fkr#jJelm}h!g3H86h-@!ka zzlmS3FndK&u^apo{EIm!=RrTaCc3Tp4gLfE%Utlce_L`L%~%g9^uOtq`rq{W-=$^1 z-WhLtzo)3!8{7xnmsxdrT=&4OG@&A3QLq^ExQ69JJ3VQwiG%xr`!hSw-?cO18zpE7 zuq1c@b541_$njoO{7Zocf(J3*3R>N-N`sCqgTX_f^-clHgB6(1JzI2Fbpyqgso-hg>C6^44$dt8 z*NdG2Rs<_CKXXm8NL@|Otqh(Cp2ZyPn-df`FO&M;U={Ej=9d#yW&CZa7@P}M1*1}_3HW|qm%aPsw`88ZSe0UI;#SQNX{ z#)QJ&Qm_el8T0a?`;tF?r%Xh*i*z0{1)DL~T2;4~l+wR82d@CHWKLVu>!bfGN>mnL zOYkb@<&7IQCBLGDyc%o;wq|Y=hE<$Yq$1b`yasH`+-LJjr^Mw~sQ(RK2VT!?+i%yH zhyHXPvjf|MH!wFIO;R6ZN+WjwJA$2-Z`4SpQyN_#8-yc@iS`DIbn zDUViq?!DkZa1ir&`5r$5R#2_D54<0IfVsVHjI(p-HR^wZ4}uRdcij3_u%w$t9s&*p zA7;MwdS2t| zYks=5^Q;q%JPCXjoXp%Y>dn0zaayS<;B(;f%=HCPvqz7mm6{4p1E({qds7B5Q7k~?ye@Tz`id{tky9itizRE0kE1Hy1PAjzpTnfI%Jb9v5)fYvoJg$Rp zfXkR=PuH4%nnD@)CioWkHuL_KH-5XWpknY2_%8S!bJpn$qmA<@kClTf!1tM>Uh0oi z*-i2M0k{%e#k{drdr`e4<*|q0N8rcIBW1^~+&_zE>L^k zf}6n2%;}aV7rwqiMbTSu3-}%L(_Ez?mG(69R`7f92j=gGHXX2%p*+?G{s{i`f9zt{ ze6voQ`rqI$;IGV$S6p6v^rn^C4(|!D4|zi~_5<7v z{>fZ;X7|KO51Q{^;NRds%w{S=|AH=Bihsd92BQB>um6>jWuhPF_0Fd&uwL{Q^}oS= zm|f-%UwNZ{!sq;bT<;WQ-8`JZ=R4paw;b0lCEc3BG zkCR{RJ5K#?@JR3|X5%R}qxSZtr8pWq20WH|T=PBuLM5uWL@S5xp`lFx zPXte5)|qwQzI+H3WRt;D!1B!NMJJw!T}@$60X!8vjd|B*rOa+CS`O2}Gr)?>O9#rY zxUip!U?s3JcqVhF+yx06ZMyTA1)dF7VO}~VDQVdRnz1?HxnNc15hZgiN~>tCse#qO z^O!Y+Lx&f*QdHCcYl5|yk6bU&(Vj&k*9Hr~^O=kG=`_gQrKqR_)&(zMwv#F_k?xmH z{co@ySfAN=Sa|Zm)Em_Q1{;DGF$bh&NqP*YkuL@tftN5Zv+3;QITZvU(1Jjsq$suOr4coTE*?)%?XWzrto4Bi6X%6zOnO8rMbHub;3+rTc& z0nM+@7|o~Z-W4nayD?vuj#+HoNhj#-;2mIh=K3vlDn+*`QSAhKfIXQ9ixpmZlY^#w6#dG$lS@U$7tZ;hBrHmy}Sl@COHgcQb1@d(RC!yMg-O;Jx5LX0x38 zT}{iVx(@>H1Mg?vd&$Gwa1%ZE0dO$*AhUz`UF`*_RB;^whk!$w?VZzoZ_T0Dau^&2 zKEhmIczC0C6vgv!a0ED#xptcG?h#`2w^T>L$G}m{whv3wPltw4{~H_)KEeFl&UR>1 z1U=YEa18hqvsBa16VuCRkHv!Hz^9py)XeB|vZIlo0mp+Am{-0`A0IuJ7IGpu34E5h zGUb`7bveyeO?95q6L(2kZgL9ZAj%3IDNTBGD3%(4_WA;8%ZT0OdP01B-KDdDSvf1Oc zsfF~h6oQMu#mqOedcIs1M|ks%yT1m$4!*&x6r$OB_bOHQW#F6O zTg-0r+)UNI=nnff_zw6k^Z1s%pJMar!R~>}!4=G+l3)5hN~BZGeeeTtC3A4EXJd^A zQO#5Zeh7ZV{9Y$Qui+XMCXc~Sz}3v=>qGv~*@ODu;Ai0H%!V;`7vF6wrT#bgCAfz9 zaKaOXyf_+pEw~Q+iusYlUzr7)iC=@?fa{sxF6r~@Q5Vfv1Go{~#C%ZCcG{TjwAPxz zZ^13hVWpzW?^n`uzXP{|-!t2qiG^34Nv8fcxDEV~c}VOKQI{HeuutI6;4jR1p5rtn z9@1ZdeFe9JJDA-IeZGH^p|IBp?gD>fjvfBM?Dpf)Y1Hg36g2;U|AKoA`d=wIGd|p|JhYhl-}Dyszv-3w-^@4j+nOd+Qy%LB?h6)S z9^l*OKtmWExJ1EXU~%RjgVbY>v{PZy58NLt!JL=UbM@Xh>TpSd2Y{uR51g&6yfl?6 zkAdJp;K9u83QD8CMAM870S^TaWA^LW^{zG2gZkg#;b0kNUyY5XZMBrBWWgiABbhy; z>h7nErf@$BJQ_TPS#-{~&($@Je9fUM&pUa4MEiZ22TgiV7_Q~@UKNWRriWuC9pEH?Kwfm zp;Z(-W`bvdXEXOn3H5E4p**Gno&%oCY;f*U$>z-z&sD){V0Gq-py!XS{Oi@s18aaa znJ3@b+-{aaGo}UB1`C+S^mbjfp?|Ela6VWEtjj#_UBAd8vFp_T1}_BbF?U?E@@Vv+ z_L)A|0Bp!??U->~_?|x0Mc~C?Bj&;F-=v?vr#-d=Yz$t?yuo^U_{kp>JWRmLz{{CO zv_*PuTSROMHUpb8KTP&nUobbG`rqJ{U<>A*Pg*nPe4{OB30?(W&D?%z=c$iVX=qkp zYp@OTx30@0i^?bytpVGD*D^;PqfTW_#URTipINW9-2jzz)oVzvg;I zxzoRP1UrE@GVeZcRbYHNjr!l<&EPG}n{<7qyp5$9+X{9DZ(}xDtXl-BQSOEY!?d=ebP+@P%N;E+Qj zKLw5j$1x|LC>~$CmZHOH@ELGCb4IS8LaGU!<`Te(;3Vdedkj*{MJZXF1t)`3m|L4i z`{rweQ2!fz9-PYjqNPiy`27;~zrpF?3(Wn)8?HC(qC|BOoB_VXT&3Kqrz20#oe9nY zXEPV}64|LOM%zCJoD06pe7Ue-*xXUH*7Cqt!1>HwT9Vr59?)|afD6Gz%mUGsCua^i zMg4E^Rd5OO=x~LW2{}{*mx8Z>uQOY0^d9Q?^%nKN!DZl^%$g;!ACAT`jjp$x=a94{iWAGXGkVr1l|;W~>R^41UYJ@n^rjuN~>ZTEOqX zt<0l7dwIv~qQ&$c`~lp?9HUjbyoV0)NAM@`XXeI%r_+-oskHb4{t9kq_I{=H?A;`q zu?}!2xQp3C_8hASMo7b!Rt^Rk|n*mk?D>1tyyY^N|p*^Myo(Z1CJU;(|=e2(i zHXE!0p2PfAq4`tVUYgLkU{$ahvtGG^)VH=~>VJdhfi;*r3E+cI0X zNF13uiYkw_;C0~j%;^#lp!}w(a>vx;fYj4g?1=M+H6$mYqsFbRT#>_yBYG16QqW;l#n< zgWyBVmdBk_=B}YV76J|hA7<9nle@fOT?X~P!AHR1%!(sE`F^OQ2a5nlf{!x0+*wlm za|12KW8f(8apuLP0d{LIP^}mZJ^?<-EOw=j{DrlYEMmZ?z_HBPbDk?|{JZmr1D^(; zVYd9-d)3YBv=rmP3E)KL(?_ZvH$J4Om;^oxPG){NqUu$wC`H8-@Hy~#=77yROJ7RS zVoC+4fzz2yHA6Bz{(YtI0{9|0gL%EAOlI?H+GCf%ncytuz`lx!{;Kq`WP@|Sxy(A7Gz6rhszRkSR_O8?3VYJrnfbW9uF~{F_$(~%gzTubCT7Znu=#Q04Ik zTn}zwPWZcgX`)*M^}oSQ;AZAwyAsM)O}Iw=Z*U9v9dpB)<0|(SP@kw3{2u&)S$kGc z!50}iaJ7LyfEos z_&f6ly}pef7o<`D8{7^4$=q+m^m_*mU#0#x_&4|ubL2vu@xfmy?EMAz7=r#cz5Z89 zZqLh5ug<6F(2L%p{x`S}^VEkbtMblL!0rnc0gEy(wfOzgvXk5Ufn?zKu2T^uqIfG*~}vANni=(F>SB_JfFGeVwqlV zuTuf81J(sEV1994rFupSeJl&XdSHEK>l3@(U$3T-8-NYLi!6wYjEkzQ7Pn4jSftQ0#nP2S9*q42Z4!LGvbMOl0)VN{E>tcvk zf-S(7%&lqTW@Y~ScFHR7YOob^NMl?7**cU3t-&_nHOx8Y^L#YoXhLnlYr*T7$H?t_ z-E9*<{co@x*q%A3P@%`}*|do^fE~b&%qa){2u&I(XgYy6f;Tabs#?DO=U|G8o55Sa zTbY}rZH|O>5IcjnfnAt?Oq7gWxqz~PD_972WA<5KJSaSucIbBS4zN43sFCp%!)yxo zJHZ}cPiF6>vPp%3+0_3Adx5=~7kAc*sQ;vUMIW#)*pFGdrReF%6LhNa2M2(6Gnb~u z9*t6_#k2>!7aYjEpe^p2RV7VH5O^PWKeP1+&m*N;bgy^-91K3lJZeGApoh^Xss9ZQ z0f#al)VCOO?tCfrzrkVPBg`5R-|D`7r=S@QjsQn8PfociS2UfL;!*H1a1?W{($4A0 ze#FPY(clxz12U2YjtaC=Pl98>r&-e8JpL9%#WUb|a02rh z``i99SyXu>f|I~!nJezz{5wa4wm~vD1$>UVMaU z;0xf3%z@VT8U}08$TPr~z?sZnn{+;JPo~(C16iU#A;39A_^GlPt|K6hEuS~n-8u&W+ z26I!o-IUICG-GApo8Vi_!Bb|GExkZ1^)~np_%5@3kwbv4I-ULRfy==a%+hK-U*$_t zF?b*R09?u3XppYrPQ75E|e5wo$&nH%*tX$w9EKLJ-W&;QtdaZhiG4o|_)z|WbL z4%`im@TWBQ0{jwO!#py4?WjE~s6SQbfc2=@=(iYF6{x|pyxSrYLTt$+cD{cP< za3i>hSw?^Jp?FQ|k2Qnef?Jqn-Co9z@TL#-9k>VJa=fTftb1ZQSwwNYU*5IhJxm^u1bJN?8JmG48qL&3wCW#cs_El;B@C=DJCmSO%l zN%ZQoWK18Pj88 zByFMv;Dum4X061*PKkE3f%U-#U_)j>q}X(|J(R~5ffs{~m_MDlru;BIkNV$WWAIYu zG6~DY5+`Y`nShspmowjOkSZ@vraWc}HUpb8hb!+84!A%wwgS8oY{48|6aD4886`ihUt553#Jd%5$pus$UMxteEzE>D*iWtH-on@XE=2(pHoR0cq`Z$ zyp7p%(TlTD|9+Up1?&nIGFM#_QJ7Rj59S8m4&K3B{cG0|jZ9jK?%(2a6%EI1jQ!t5j&^+U&+hIS5o9-PW-alFRt&TD$^G;lij0<&1CvDU&(lnpL| zGr*UaS6wQ*>u4B5{cmszH@G%N^RjKmDeI<~Q(n@DJvZ&r&T$tfL9-2LA;A zVva7q>euvws=eRfKj6R2?`zDPmRV6Y=rIiaZ+fNvH@*IMY56|6htb2SP1OGe_W}21 zetk7$NToE*mly{sj-)PFM965;343l%+F*ER<#w=$cKTY!NZyF>MyDM(wjn$3|JOCf;r>z z)Jm0+F4X@9j{=Wow)fEwH@$zE`rqKOU^(U}&Ben+h61z#UWeQjxtiXInQsmd9e}Awv6+8_*ojKbn)x^h;^4JWpB3Oy}%KNu1 z9qz%@{|3(l&tk6d%MIIdxPfm`` z4Q4H|u=`t#={{8xtOeF)Ugh)R`LVHd115puL0XK>xsTj6`xB{aV>Zqcs;YO=WVG#4H~%}*dDxrx%KeD z1GALrT;c$B1UoTHlo@y|(WbDs5xfb!nb|P+_Uin-G-F%9TfxrEAF^M6+NE}d`rlv| zuq(6Vk1ZR`N@9U)f~t zqdn#Y_6GYfFFMh#urrT77GJO**q_-XXz_q^j;+-H2JZ&%VVo4l^5?S(R4c}V6TpegF{y(iMN;XxlfY-e z$;|SCUr)?t(}bpg&w;Xq722YeTNk9m{&GiMJ&$_C}&3h;eq=`i^zhg7Imd;qQlS1~_)diRhp zfuh4h@FVbJ=0b6ewgK;GDLw&LgP$_T|1fA6S$c~4-{9xq7tGmv>=p%DQrLS5t^wCF z2YU~)(2Jy?SqFXve$5;^x;x?IQ2J2cfa}2x%>7T?+P&Y5W~>q11a4+7e7e>@_BpN8 zx8N4=JLZ->M^3w&5VwNggFi5L;G;BVmX%Gi)-(ksx$zF*!s>VMN))c*$eVUD+nJ~`t9UG??_i-1L$ zm9+P4tPQ_G{co^1xF56M7_r|E zb?`}%-t?i429E)cWnOVwQPXV$O{g4r9C$qQdQ00CQbIaOP5@5?Phx(4@X_6#so-hM^a~BQ%vCQ@{~J65tjIjHaDe*jp0vl5z{=p6%sTtz z#H{BK&jQZ|t1xQ~F#a+?m!iWQ@LaGe^ZV3ub$c$;N>u}^gXb}O@4XP6@{U%j23QlU z#e7|%#@}Q#g?nwV06d?$>|DFLSK4mse}i?w3z+{_R{xqMLFciBU_G!t^H*MUBXTNl!WsVi6r zc4Jn2@-ThK2b!_%;2mIhX0ba*GnR|c_TLHi0DCeQnY?wo;OzT@nP|2j0&- z^sj5&7irpK2f)GLgUs^R3|);6(+T-Tid4%@x{X$>0?5 zIp&(9k*5qFWl{edoC;23Ha5>s`26qZ_|m}_z!#Zk##?(98Q@FcOy+e_#iHv* zQ~90+&Iac&D@V6E9_XT7k_)~J&SSpO>zsVSHad@80q27Ym>)h|TR7f=Zomt{Mc`uQ zuW1YS99%&MuB+e@a4B>3qJ?PdhXZYH{g2aA&(r#uA56MwE^4+ZekYOIqiPeaLV7!;J4rw=KC`|EYmYj zQ~w*>3VzS*+WT?GCSA&7AHZ$kkIcdMt5;pHrCX{`;LqSM%wy_i-gr<)vE?hc9o)fO zWe~fhQk|khC%6mzjrr}hUcnB1DD->>{{VM08xC;MuF$7i@hA8f_&2kt{Hph(wJ6;G z0sjT}82-Of(sSB-S>-M&Eqc;h)c>Ye>VGqzb{stFYBE(^eZYOeBFtJU?rUZ*q}U<~ z76XejOIu9)VYQR?SU+%oump4b8pGGkb16DVf(L-5nCB|&%WJWql{yeS2t1g1?f25( z`iVKz{{{~Q4`aT&T}3u^k8Gba^P{yp#sZ(uM%mkjR#KvPh|cxe_hy;5Sp<`;K|@A%rdtwebn=$ zV~adk0X&sCMR9V)v{X7OP6JN|&tP8hQ|qOL1qDq-uo76A**Q@$Y(^@bfoFnefoC)K zR&Qllk?N*^eUx6cx3= z+F$|mwAOPkV?jI$+_VHwj4*FmNupzU-H-(1E z%M=|Jffs{~nDc)9{cuH^CUgnd7`&8OWBxoxcR6}66Yw(da^~0#w`6nsQFJf`n}N-l zwRXH)TX>CTYz25F*n+vVW>Jj&zu&vJ1g`?GW-fm}TxE$D4b2K{4YpzKGcoT){wd19 zYrwYPwao91KS_}DZ>Ih?cs9ufwVT4R!)=WPa0h z!*Y}wMcsd3;jr_gaB4 z415F}&V1oSkXg!{9RgtlI1+r6*`}c3)8B2b0^u=m6!Jr-E)?@t{*56#)A{UiOd5QyQYVAwbNZC z_$)Y?IbwyU#)w#3fiMMp4t$>3@9Tk8SL3$}gsI>(a5}Tf`D5=jHH8A<1@J|12J^i< z*`5=|1PFwez?tAI<}($m>K?D!Ef8jdbHKUGnPo-?n9=%{c5f$#yi z5?san?e2+zDS~wZ;Y08v@MGrEFq^!=UunjkfUChznH>szu9uA2B@jLXKL@{HHt%^h zc~v3}?IpMdT+4iYjO-#aW%^j^z^}lsnHS}>FY)U^EA_&f8fJ0t5XZJmPW#EvCQV9x}MAq}Trf*QC0J(e5fc1;SqR7Tr~X z`!LH013r#O-zyOI1&e@1na@p`cQU<}SPU!*SPDFld6($jFIKKJV}rnh!9$pT6)4nJtfr+n6g&(p&8)ZoTbo22ZU5n58L%v~ zyf8M?V?Isj2=GYoDCUG~`tM8(g9XCT;4$E_%+)P7*J@W2%Yny%$1^|J{i6Ni(Def0 z1n@-gBL1OlG$gV)ONNDUZzp&jzb7Z$0QZ|K_q#fp89ZE?AX$X!oBX?ms03 zLN%~Dcph^f_i2~AKT%ZF0BeG^n8%zNBh^r{Q6SU?3&8W4l`1xW|J0ivOb4tBUcfBb z)z7=%c3**TAy^Nr&%84DMXwpr`vpP+upxL6^M0qy+@315QWt}bz)P5Czd2fSD`lQQ zXbfHoHeo*CdAzN(z)m1s23`&}W!5;6sHruJHjx?F9K3>A)pOI(qLY-zR)Q_Smdss> z5f0NuX#1}MuLfH&+t+!i>AoVi2HSwwFkhRRC^6$E#THxeTJSn%rN;_V8>{9EgzLd} zV0&f>zk=JAQceQl2CxIzk@?W)rCA5nY2;4ejo?kpm;7{k$`(<;-VELX-pU*#>9lUj z3d#n~;B82gYwd3Gu z@CoK)n+$d|DbiXy3624uVh)|Q&h4`X?Xg&J9QZV|!Ns)xch9XB2+x4y!3oTF#ph3c zJ9M)^mVwv*_=^h0V5}0^xaZDmaZ&Jh~kz9Bdw5N3h1!8y!|lieE^PFg7t=7KMS^Oz5tK6>A4 zl8Zoi1)L8qV2*y`kYaU%@>n6b2wco;l=wp) z+51&(m1gzu4K0L$`wtfzi|>)fgge&F&kOSJ=PscLGv;A3Amd1oJ-B)TTdxbJq14lKW7d& zUH8(un-=m5@JnzFv*M8MpQR&crPhM$z^|BfPFH+v8m=x7z6QSm*E8SoSZ_Y`G9{`8 za3i>hIo@5r$JFne1j1(UTW|}roynhTJr~kSeFts@zh_Q9UN~v1F6FTg;5P6_W>58& zB`-~BN4sjx`);Ri+cPC|C?E&a8fCou_{{RrmeC{lOB<{_}=9#O&H4 z5K4jvfTft94cK%2ZZ?g4Ab1dXFmp_8QP!~z+G9h&L&3wCj~G^dB%A`Ko6mSLWH zQajCf3?(XA@CfioX3Z4w!R7|UqrjuVW0-%|cr<4CS_p(=!E)en%q2>vZGYKQNi`lk z0X&g;%CU6+F%M}IO#)8_Phmc4C0!esa1S^4+nFpH7r7c&Z^Vm%AEbwgRUGL>O`%R$-QvuHb&t;ao|IIo#ixQP8SPiVs z9A7WJwCorKk9lAXuqJc4#oOTX8Zl8XJ?1?#(i{GKr+=*vHUJwkZ=O~#|8bdVmAVPM8N7x0g`#)+OnDcB4LcYDy7YO%*4}gQ2M;>j>(MzYLco2LD9Kw9prMJbi5;|aq zf)9hknC+e(s~=qCBM=?|hl3-SGuCLj{pe34j|3kDA7l0xv`Q(eQI#77J`Rp%F6$in zt7{o8+@&J;6gUS#UBqg?YvO!xxYAr$luQd>)+2Jo|f@n`9Sp8aN$%fjNKG;K27~ zbb`JJ&H!IxeynlwNnXctfiM%C1o&=1(}Wg-uYyaM9V$0GHPNOMbSd~6_&W0t374+9e#AGx zW#F64wjU-PD%h}AAiM>>4Zg!{DSNXtSB*-lyWo4^a_0LtjMqH%q#3IK-v>WnmL4W9 zfggjPFn7(rwr`L)t<-ApQ}8q9uN87hrE6)AJqN!4 zzhriK5LbIEnX23xa4oow*~_@HO0JWl!z=J>@Ehi0$FbEN)7%8YdT;}{k=Y@` z<*_DkGx#mD`GHTS`sZjuTfpzYt;{FvM|PAe(pq~D{s3-c7MENXY4e>{>PPS=@Mq?c zb@EF*mMaK^U%+3%?ab#VUsSl6LlfEo?gV!+4|K~O(&rH^#c$y6;2+Fi(<}legem<11M`AZmT^)M;@6s~5;^)gGFRB%L zgZqH{GIx$^tIK|^DiDf*MZsdsrU%r^#Ya&|B@XTf?$2DWyGtu2gz}gKSQ0#d`SUY( z!IubHic;W#;6cm_F30^m6i9h&Fn9=fD08Rr&b99kP@)gjTP~sF4H*hc<=<~ky(eL zzl%`iF%dioJek>JZ?6EaYzo*@!17=PW~~)X{VD{sQm2Bafu}Qjy+~`6P^OA&23QfS z#Jpl=ufvB^DJm+1XM$%jU+%sA^P?D=lG$Jt@Em5HQxf(44pJVQ3swcIF?S8VA|>&g z!k#*K9$14}D)QChbsH!;Xo9uC+RR-mR=65Hqw|;mJRhvXJaMV+B8OmFsk-0=;DyXS z-&H>T?6wpL^}zaI17`cfxgp=j(n-<~ya>FQ`LMO-?+6)MOh(`(U}NUl)nA4jlB3FF zDcA(OjQOg>x#EaU+GESXreHH>yWYa*D<0Fx&A}_cE14xDUe?80g$aZfU`y~SW|K14 z8=c;C=dl`W1-53cms8Iylc(z52D}Dr%Y3{uapj2NH1f6Jb>Q{PaTB_Y5+BmY?ZEcn z4a^fm)r!vsQ3>q;b_6>y2Pm29T={d`&q!NPNz}uNU_qb?yY0!-A0K0>CGJjDy5I$6&f`<9K|o~Y}z-G2mSg8=Yu@E+z@H^n~6_n0ma z?ga;egP4;`-GB7G=pYd81MdePV6OeJOrgIy6(+&pgWyBV&YSExp4`LxHvz(>I0%)x`!FX^0288`wQ2|mgk>F{d)eM?G`$G}nGn^z0(_tO@3N|H=d+Z@9)K&s zRm`D*R~FuTPHXKU_!0OqbM2s#8$YH}9(w|=20vv^QJ8+A>*NaRe}kWcUocBFSQM>1 zK~wS)Tm!CUj@Z6Er*S!P9rzXaHM5G>(AL3K6g=L5>%k4ob6!5%_kAXfyb;_4Zf5rT zuKv#Y7wxgP;1=*ZW=`*|;P>DU%zc#N)?U=JrT#bgBlr{ZDV54a=?fMC zi!vJvhRyu)uX`>A76)0G;o=^R6@C>jb^XF_oDM9i^>VJck!84hIYNnQy zucehb3p^XF!dxV-=sx=gP01YaT(By$j?LpH(RvD+YG8HnJZAe`gO^ItbmyS~)&y%Y zU-q?J(JoFaRU0e-&u3mI4Cz15Ybo`=!MflD%tM9^{BUe4CFq4(hEBk&UDi`{p}pRl8qY7AZqHeo($J-h9EElub$@N%#z^U#o^ zd#;sJt!M@|2d`kxjH!)VUbL9{-(U-{CG)t+;$Ob%QW3lgyc%r9tYI2yIN=fTTGi&`%u`k1+N9KWBzRTWYe2>R4c9r+kx$wTLa@#Dy~za+5mO{J2Fq)-E)(v z1F;i$BX|?@vq#bQm+0A0{~Npoyp?&@`=xq5M>kOa8@vtd!fgFQX~fk43LdUtA=r&M zd2V92vn!R7+rc})?#$8CRCA_|qcV0U*aPgz>=z)`_BN9WlU-mhus3sU?3x)ddQ^G% zfPKM!%;E=e;7d=}+QA;1F;q^O6-0m8N~7Ja!ly20p@UGDw&{vVvA>I5+|v z$?PfdbbyFGl@>?A$G}m{Hv4bsi2mG0{cmtI_ylvKf^} zv%uNl9OhF7qvSfz&_d1yUk2wfA8g%zN>xa)o`) zlZ6`fzriKoQs$Z``gXI!*HHf(d>wp)`A69e2kG6kQp>qIE16ZC0)IB{r)*FKeh7ZVeEau$zdQq7 z>VJcufUB8fMkj0RP@t&z6#NYQoOw)xd1$gc&Daa@OK=VI>&%Ni?zU2jtp(SCUoqb+ z)(V^V??m+){03alyfxV%L#dMXSOd5b+{C;(E`G-@6)sYL7p#OmXf_sem zUnyDZZK!W~oqEtc=`HGi(<}AAnN8zn3S&|2#U?hlq=UbD%%YD+cMOp@RMU@7Lh%Na|%gJ~%a1P=laW>%9u6f-2vmiph| zq2OW6SE_rQG&p8Y{crGaunhC>q_7LJ|Ni<-7CZtxk~uSWYL}WWUG0woj|Pun4%sCh z*kn#&Z!B02JdWA?%!`M*mh`cV2TuS`WVUF(+T`$-{?20(crthj^OFr`whf_H)c*!6 zfTuE-k53pRcY&hAH1Krr4CdgSJ;w~cL3vCOtOQnOKGL{1_;?B>s+r(f;MvSYgE|8D ziP6Yaz;nQJnTH>04QN)Uk*k8$!0OBoHBZ|264J*q53B*!{68*g($QNug!=QPdy=>)w1yb!F%JjK29N{l>JT>4-Gup#rikPk)rU+B3P zffs{~n76bHPqDjCv1JL^7`&8u#?*7ZKZnr?+624|yqq~CZd|yp!EEY(gU!I^%=e7$ zDfSvm!D9t@CD?*_@6~Z#v#MyuEWxY5tC=-xR=?{SLnF5WTZ3(wlWuuey{@2aum)@k zUd!BPQvX!HZ8Rn8!0W+w%)5r?9ekuiY!BW5c3>VE;$vewc`^0B!A{_f%=-jUK>@+* zss9b$4Bo=LE&uxQ%oj9cTfxrYZOjfsHt*XxifTm{uq#-|?6^|&UG6s;nj3gKcn5Qo zo|tEs1|az&>{$NjW(kGH`oX4%Y5Kc&XV4nDJuGb z{lNju=7meoz7tR$+YR0W-pibQVqVV~ZWQ(c!9n1C%xjcaFIlKeYi&RH063U=VVq!% zVgTi_gWyBp5av#8i(PF_bRG)@9|ngpTeP1X_GSfL<{SZsgCm&7sEN5fTjxamZ}3s@ zG3EwektA7r3VTuD$<(J?6dZ;_C9BQKJF8={BMDa!MB-BvS0QU_(rb=O2Bu(rOXGz zdS-SHr$@yy@Lljd=9F^Hx9^Am}bh=b&`BfdNe}g}Q zKQU)?zjwRYMOpDPxDnjMeBPj>_+{^l!)EXoa0_!q&Ka*YMYO$t1%Cs#GF#njtY5BA zxAq~9`F`rA9&f%}X`{hO{-|EBAIFD=XIp~&MPrM>>(0bl{<(FP4| zhI45^2Z9B`gP3K{Yi-hWpyVM076ywjhkP^IxHN@$Fjy2U#_VuYbZ3PkC66KCp+v0w%8IOct$#r<`zQDEc2ieM$?&#nEf zQ}5G8H36&)R$&%2IC9Nhn?`IRcoKLr^Xw~Uw-4`qsWAmS6+Df(c=Ex4Q^Y7cOb4ri z)tEOQ+d6moI65<_gEhc2n446SUn<1VOw|O>1kYkV^l;^fsQvVcTMMiWp3Ur3|2OAJ zDP;#8@Eq`5W}PhoBZpPeKBf!S1M4$C*O@f0Z|@WIJg@=SklEh%dcQ$>w2#dP8-W)v zN4wbG>6uFdY7AZoHeud6)lS+}`w-Q?!Hd9)ncI@r;r}{T|33w@UyzIKX)OH#% zbFc;2lG!I_WAVS0lsv4!%fQQ-mj!j(Pqm~WSpi-NUd6oQNW+b3Su~*5U>mS4bB@r7 zV;YNTuGxWCgV!)?t7-KenoG}PYr*Tl_RP%{CFSRoRH*(9b_B0yF2A||$k~PTRO1BR z0Cr~1np-|KVJJ;S7w|^#CT6FT`M&MN6t^qb4eZV=IV;jf$ABJ@H-kOEp3H;STg-?I zq`1An-e4c*NU@u8p=&7aE#R%-ZOp^-M=hRLL+O4ycn5eVbDre%Q?IjWD*A%`!2ZnD zUlZeG#OZS$yTAe9-OPUZ28SXa2MP$>&>EG?Dj#Bf$Ha-wf3@^B%B>>fhi4;3(#Es{@A^{&1rDH~0|vF!THa zY5wOrX%QU(M}uRS{pQ6D9$`WI*impS_!#q#aYnTtL}~fQf#bmm%yJ7QEuY;dP6QtZ zpI}~FF?80H-rSM|J_$a>T-hqp&>l^XEy>^%@M-4L)4q@D2;4;VZ*VF&jal}9N<~ob z>$kJubnrQ55gi$`M+KCy&x13-naukGRfhox z!}QR$lqJO1z**pI<}I_A_=h-AR?GqCg7cU)4~)pK+Djvr555k*!EBwdQmExH9p4MU zh2Wdanwf`#4(+6~ViEWjxS09*Z(Y~pm2_*j!6o23%#tc@2j(i!8Y=~tf$uU~`VCOj zai%qP4}2e7&iw00bNFxZ6;%HQSAZ*-FKHXCn-)!v$PdAfz>k^Z9tuRhdqc^i3j73I z%^a;0CK1uQk39uH13zbWRMyFT=Sg$z1^6YnhIzI`w!nrpAXwcyvxlS)e(zi*(_ z^9KADT*ti7z0aQhDQl_z4SolH&#Z1^x+?n#Wrqgv2k=McIVqwy_nxI8`2_w9Ze-SZ zXeedYP1{@(xEcI~d9SzLJ5_NSu@>-G@Hgg8i%es`A;hiV@8BQIuR0a`A1tPQ>?gPl z+|In^>j$SweFdt2gFC>T%fhk8U zB{zZgF%|Gc@FZrD#%}+er)VFW44wj>%3QB~QSGN6?PJrx)4{6DVZugZVrEdcsDahN z8qC&zHl5S^K!@NNU`_B$X7A^#W%@hOW6LbC7Fe5ETIJ{}#Vndkv%xyxIm~+R`*ybF z)5&8lSQo6vyn9WPM9M}wap{BSfen~POWfQ&!IkdZ5Ii4j#BAug_T{e8^v+`e*ciN! z`Lo-M;h8rqsQwK$1utU0UTr=l{WrbySPV7;FJX4@Z9XM9p6+}p*c@!Zyy|jV;cH{M zb4#!lcp3BU!zv1L52;(0gI9o8GRK^_qO>T67SSrOHQ0t(w9lNJjmKyS+Jf!CtC=U9 zOx*Fsofgp=@LKRX=Cll%yOP>8V)kGMup{$vyEOw{1?c3l9_$3(z%0Abar-F;N*>N& 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%0A>y9t&irc|Ez~Rhi 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�`6WfO0J!d>VX)dE3ABPBRl| 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 literal 0 HcmV?d00001