4#include <boost/lexical_cast.hpp>
5#include "toolkit/mat_query.h"
9using cyclus::RequestPortfolio;
10using cyclus::BidPortfolio;
11using cyclus::CommodMap;
14using cyclus::Material;
15using cyclus::CapacityConstraint;
16using cyclus::toolkit::ResBuf;
17using cyclus::toolkit::RecordTimeSeries;
23 : cyclus::Facility(ctx) {
26 input = ResBuf<Material>(
true);
27 output = ResBuf<Material>(
true);
31Conversion::~Conversion() {}
33#pragma cyclus def schema cycamore::Conversion
34#pragma cyclus def annotations cycamore::Conversion
35#pragma cyclus def infiletodb cycamore::Conversion
36#pragma cyclus def snapshot cycamore::Conversion
37#pragma cyclus def snapshotinv cycamore::Conversion
38#pragma cyclus def initinv cycamore::Conversion
39#pragma cyclus def clone cycamore::Conversion
40#pragma cyclus def initfromdb cycamore::Conversion
41#pragma cyclus def initfromcopy cycamore::Conversion
44void Conversion::EnterNotify() {
45 cyclus::Facility::EnterNotify();
50std::string Conversion::str() {
54 ss << cyclus::Facility::str();
57 msg +=
"accepts commodities ";
58 for (vector<string>::iterator commod = incommods.begin();
59 commod != incommods.end();
61 msg += (commod == incommods.begin() ?
"{" :
", ");
64 msg +=
"} until its input is full at ";
65 msg += std::to_string(input.capacity());
68 msg +=
"} and converts ";
69 msg += std::to_string(throughput);
70 msg +=
" kg/timestep into commodity ";
71 ss << msg << outcommod;
76void Conversion::Tick() {
81void Conversion::Tock() {}
84double Conversion::AvailableFeedstockCapacity() {
85 return input.capacity() - input.quantity();
89void Conversion::Convert() {
90 if (input.quantity() > 0) {
91 output.Push(input.Pop(std::min(input.quantity(), throughput)));
96std::set<RequestPortfolio<Material>::Ptr> Conversion::GetMatlRequests() {
97 std::set<RequestPortfolio<Material>::Ptr> ports;
100 double available_capacity = AvailableFeedstockCapacity();
101 if (available_capacity <= 0)
return ports;
104 RequestPortfolio<Material>::Ptr port(
new RequestPortfolio<Material>());
107 Material::Ptr mat = cyclus::NewBlankMaterial(available_capacity);
111 for (std::vector<std::string>::iterator it = incommods.begin();
112 it != incommods.end(); ++it) {
113 Request<Material>* req = port->AddRequest(mat,
this, *it);
117 CapacityConstraint<Material> cc(available_capacity);
118 port->AddConstraint(cc);
125std::set<BidPortfolio<Material>::Ptr> Conversion::GetMatlBids(
126 CommodMap<Material>::type& commod_requests) {
127 std::set<BidPortfolio<Material>::Ptr> ports;
130 if (output.quantity() <= 0)
return ports;
133 BidPortfolio<Material>::Ptr port(
new BidPortfolio<Material>());
136 std::vector<Request<Material>*>& requests = commod_requests[outcommod];
137 for (std::vector<Request<Material>*>::iterator it = requests.begin();
138 it != requests.end(); ++it) {
140 double available = output.quantity();
141 double requested = (*it)->target()->quantity();
142 double offer_qty = std::min(available, requested);
145 Material::Ptr offer = Material::CreateUntracked(offer_qty, output.Peek()->comp());
146 port->AddBid(*it, offer,
this);
151 CapacityConstraint<Material> cc(output.quantity());
152 port->AddConstraint(cc);
159void Conversion::AcceptMatlTrades(
160 const std::vector<std::pair<Trade<Material>, Material::Ptr>>& responses) {
162 for (std::vector<std::pair<Trade<Material>, Material::Ptr>>::const_iterator it =
163 responses.begin(); it != responses.end(); ++it) {
167 input.Push(it->second);
173void Conversion::GetMatlTrades(
174 const std::vector<Trade<Material>>& trades,
175 std::vector<std::pair<Trade<Material>, Material::Ptr>>& responses) {
177 for (std::vector<Trade<Material>>::const_iterator it = trades.begin();
178 it != trades.end(); ++it) {
180 Material::Ptr response = output.Pop(it->amt);
182 responses.push_back(std::make_pair(*it, response));
188 return new Conversion(ctx);
Conversion(cyclus::Context *ctx)
cyclus::Agent * ConstructConversion(cyclus::Context *ctx)