CYCAMORE
src/source.cc
Go to the documentation of this file.
1 #include "source.h"
2 
3 #include <sstream>
4 #include <limits>
5 
6 #include <boost/lexical_cast.hpp>
7 
8 namespace cycamore {
9 
10 Source::Source(cyclus::Context* ctx)
11  : cyclus::Facility(ctx),
12  throughput(std::numeric_limits<double>::max()),
13  inventory_size(std::numeric_limits<double>::max()),
14  latitude(0.0),
15  longitude(0.0),
17 
18 Source::~Source() {}
19 
20 void Source::InitFrom(Source* m) {
21  #pragma cyclus impl initfromcopy cycamore::Source
22  cyclus::toolkit::CommodityProducer::Copy(m);
24 }
25 
26 void Source::InitFrom(cyclus::QueryableBackend* b) {
27  #pragma cyclus impl initfromdb cycamore::Source
28  namespace tk = cyclus::toolkit;
29  tk::CommodityProducer::Add(tk::Commodity(outcommod),
30  tk::CommodInfo(throughput, throughput));
32 }
33 
35  namespace tk = cyclus::toolkit;
36  std::stringstream ss;
37  std::string ans;
38  if (cyclus::toolkit::CommodityProducer::Produces(
39  cyclus::toolkit::Commodity(outcommod))) {
40  ans = "yes";
41  } else {
42  ans = "no";
43  }
44  ss << cyclus::Facility::str() << " supplies commodity '" << outcommod
45  << "' with recipe '" << outrecipe << "' at a throughput of "
46  << throughput << " kg per time step "
47  << " commod producer members: "
48  << " produces " << outcommod << "?: " << ans
49  << " throughput: " << cyclus::toolkit::CommodityProducer::Capacity(outcommod)
50  << " cost: " << cyclus::toolkit::CommodityProducer::Cost(outcommod);
51  return ss.str();
52 }
53 
54 std::set<cyclus::BidPortfolio<cyclus::Material>::Ptr> Source::GetMatlBids(
55  cyclus::CommodMap<cyclus::Material>::type& commod_requests) {
56  using cyclus::Bid;
57  using cyclus::BidPortfolio;
58  using cyclus::CapacityConstraint;
59  using cyclus::Material;
60  using cyclus::Request;
61 
62  double max_qty = std::min(throughput, inventory_size);
63  cyclus::toolkit::RecordTimeSeries<double>("supply"+outcommod, this,
64  max_qty);
65  LOG(cyclus::LEV_INFO3, "Source") << prototype() << " is bidding up to "
66  << max_qty << " kg of " << outcommod;
67  LOG(cyclus::LEV_INFO5, "Source") << "stats: " << str();
68 
69  std::set<BidPortfolio<Material>::Ptr> ports;
70  if (max_qty < cyclus::eps()) {
71  return ports;
72  } else if (commod_requests.count(outcommod) == 0) {
73  return ports;
74  }
75 
76  BidPortfolio<Material>::Ptr port(new BidPortfolio<Material>());
77  std::vector<Request<Material>*>& requests = commod_requests[outcommod];
78  std::vector<Request<Material>*>::iterator it;
79  for (it = requests.begin(); it != requests.end(); ++it) {
80  Request<Material>* req = *it;
81  Material::Ptr target = req->target();
82  double qty = std::min(target->quantity(), max_qty);
83  Material::Ptr m = Material::CreateUntracked(qty, target->comp());
84  if (!outrecipe.empty()) {
85  m = Material::CreateUntracked(qty, context()->GetRecipe(outrecipe));
86  }
87  port->AddBid(req, m, this);
88  }
89 
90  CapacityConstraint<Material> cc(max_qty);
91  port->AddConstraint(cc);
92  ports.insert(port);
93  return ports;
94 }
95 
97  const std::vector<cyclus::Trade<cyclus::Material> >& trades,
98  std::vector<std::pair<cyclus::Trade<cyclus::Material>,
99  cyclus::Material::Ptr> >& responses) {
100  using cyclus::Material;
101  using cyclus::Trade;
102 
103  std::vector<cyclus::Trade<cyclus::Material> >::const_iterator it;
104  for (it = trades.begin(); it != trades.end(); ++it) {
105  double qty = it->amt;
106  inventory_size -= qty;
107 
108  Material::Ptr response;
109  if (!outrecipe.empty()) {
110  response = Material::Create(this, qty, context()->GetRecipe(outrecipe));
111  } else {
112  response = Material::Create(this, qty, it->request->target()->comp());
113  }
114  responses.push_back(std::make_pair(*it, response));
115  LOG(cyclus::LEV_INFO5, "Source") << prototype() << " sent an order"
116  << " for " << qty << " of " << outcommod;
117  }
118 }
119 
120 void Source::RecordPosition() {
121  std::string specification = this->spec();
122  context()
123  ->NewDatum("AgentPosition")
124  ->AddVal("Spec", specification)
125  ->AddVal("Prototype", this->prototype())
126  ->AddVal("AgentId", id())
127  ->AddVal("Latitude", latitude)
128  ->AddVal("Longitude", longitude)
129  ->Record();
130 }
131 
132 extern "C" cyclus::Agent* ConstructSource(cyclus::Context* ctx) {
133  return new Source(ctx);
134 }
135 
136 } // namespace cycamore
cyclus::Agent * ConstructSource(cyclus::Context *ctx)
double longitude
virtual std::set< cyclus::BidPortfolio< cyclus::Material >::Ptr > GetMatlBids(cyclus::CommodMap< cyclus::Material >::type &commod_requests)
cycamore::GrowthRegion string
virtual std::string str()
virtual void InitFrom(Source *m)
cyclus::toolkit::Position coordinates
Source(cyclus::Context *ctx)
virtual void GetMatlTrades(const std::vector< cyclus::Trade< cyclus::Material > > &trades, std::vector< std::pair< cyclus::Trade< cyclus::Material >, cyclus::Material::Ptr > > &responses)