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)