Fixed the way adjacency_list was being used
This commit is contained in:
parent
9fd1fc1c22
commit
1a6ec4e8b4
2 changed files with 99 additions and 98 deletions
107
src/history.cc
107
src/history.cc
|
|
@ -42,13 +42,89 @@ struct f_max : public std::binary_function<T, T, bool> {
|
||||||
|
|
||||||
namespace ledger {
|
namespace ledger {
|
||||||
|
|
||||||
|
template <typename EdgeWeightMap,
|
||||||
|
typename PricePointMap,
|
||||||
|
typename PriceRatioMap>
|
||||||
|
class recent_edge_weight
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
EdgeWeightMap weight;
|
||||||
|
PricePointMap price_point;
|
||||||
|
PriceRatioMap ratios;
|
||||||
|
|
||||||
|
datetime_t reftime;
|
||||||
|
optional<datetime_t> oldest;
|
||||||
|
|
||||||
|
recent_edge_weight() { }
|
||||||
|
recent_edge_weight(EdgeWeightMap _weight,
|
||||||
|
PricePointMap _price_point,
|
||||||
|
PriceRatioMap _ratios,
|
||||||
|
datetime_t _reftime,
|
||||||
|
const optional<datetime_t>& _oldest = none)
|
||||||
|
: weight(_weight), price_point(_price_point), ratios(_ratios),
|
||||||
|
reftime(_reftime), oldest(_oldest) { }
|
||||||
|
|
||||||
|
template <typename Edge>
|
||||||
|
bool operator()(const Edge& e) const
|
||||||
|
{
|
||||||
|
#if defined(DEBUG_ON)
|
||||||
|
DEBUG("history.find", " reftime = " << reftime);
|
||||||
|
if (oldest) {
|
||||||
|
DEBUG("history.find", " oldest = " << *oldest);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
const price_map_t& prices(get(ratios, e));
|
||||||
|
if (prices.empty()) {
|
||||||
|
DEBUG("history.find", " prices map is empty for this edge");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
price_map_t::const_iterator low = prices.upper_bound(reftime);
|
||||||
|
if (low != prices.end() && low == prices.begin()) {
|
||||||
|
DEBUG("history.find", " don't use this edge");
|
||||||
|
return false;
|
||||||
|
} else {
|
||||||
|
--low;
|
||||||
|
assert(((*low).first <= reftime));
|
||||||
|
|
||||||
|
if (oldest && (*low).first < *oldest) {
|
||||||
|
DEBUG("history.find", " edge is out of range");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
long secs = (reftime - (*low).first).total_seconds();
|
||||||
|
assert(secs >= 0);
|
||||||
|
|
||||||
|
put(weight, e, secs);
|
||||||
|
put(price_point, e, price_point_t((*low).first, (*low).second));
|
||||||
|
|
||||||
|
DEBUG("history.find", " using edge at price point "
|
||||||
|
<< (*low).first << " " << (*low).second);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
typedef filtered_graph
|
||||||
|
<commodity_history_t::Graph,
|
||||||
|
recent_edge_weight<commodity_history_t::EdgeWeightMap,
|
||||||
|
commodity_history_t::PricePointMap,
|
||||||
|
commodity_history_t::PriceRatioMap> > FGraph;
|
||||||
|
|
||||||
|
typedef property_map<FGraph, vertex_name_t>::type FNameMap;
|
||||||
|
typedef property_map<FGraph, vertex_index_t>::type FIndexMap;
|
||||||
|
typedef iterator_property_map
|
||||||
|
<commodity_history_t::vertex_descriptor*, FIndexMap,
|
||||||
|
commodity_history_t::vertex_descriptor,
|
||||||
|
commodity_history_t::vertex_descriptor&> FPredecessorMap;
|
||||||
|
typedef iterator_property_map<long*, FIndexMap, long, long&> FDistanceMap;
|
||||||
|
|
||||||
void commodity_history_t::add_commodity(commodity_t& comm)
|
void commodity_history_t::add_commodity(commodity_t& comm)
|
||||||
{
|
{
|
||||||
if (! comm.graph_index()) {
|
if (! comm.graph_index()) {
|
||||||
std::size_t index = num_vertices(price_graph);
|
comm.set_graph_index(num_vertices(price_graph));
|
||||||
comm.set_graph_index(index);
|
add_vertex(/* vertex_name= */ &comm, price_graph);
|
||||||
const vertex_descriptor vert = add_vertex(&comm, price_graph);
|
|
||||||
put(indexmap, vert, index);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -59,7 +135,10 @@ void commodity_history_t::add_price(const commodity_t& source,
|
||||||
vertex_descriptor sv = vertex(*source.graph_index(), price_graph);
|
vertex_descriptor sv = vertex(*source.graph_index(), price_graph);
|
||||||
vertex_descriptor tv = vertex(*price.commodity().graph_index(), price_graph);
|
vertex_descriptor tv = vertex(*price.commodity().graph_index(), price_graph);
|
||||||
|
|
||||||
std::pair<edge_descriptor, bool> e1 = add_edge(sv, tv, 0, price_graph);
|
std::pair<edge_descriptor, bool> e1 = edge(sv, tv, price_graph);
|
||||||
|
if (! e1.second)
|
||||||
|
e1 = add_edge(sv, tv, price_graph);
|
||||||
|
|
||||||
price_map_t& prices(get(ratiomap, e1.first));
|
price_map_t& prices(get(ratiomap, e1.first));
|
||||||
|
|
||||||
std::pair<price_map_t::iterator, bool> result =
|
std::pair<price_map_t::iterator, bool> result =
|
||||||
|
|
@ -77,11 +156,16 @@ void commodity_history_t::remove_price(const commodity_t& source,
|
||||||
vertex_descriptor sv = vertex(*source.graph_index(), price_graph);
|
vertex_descriptor sv = vertex(*source.graph_index(), price_graph);
|
||||||
vertex_descriptor tv = vertex(*target.graph_index(), price_graph);
|
vertex_descriptor tv = vertex(*target.graph_index(), price_graph);
|
||||||
|
|
||||||
std::pair<edge_descriptor, bool> e1 = add_edge(sv, tv, 0, price_graph);
|
std::pair<Graph::edge_descriptor, bool> e1 = edge(sv, tv, price_graph);
|
||||||
price_map_t& prices(get(ratiomap, e1.first));
|
if (e1.second) {
|
||||||
|
price_map_t& prices(get(ratiomap, e1.first));
|
||||||
|
|
||||||
// jww (2012-03-04): If it fails, should we give a warning?
|
// jww (2012-03-04): If it fails, should we give a warning?
|
||||||
prices.erase(date);
|
prices.erase(date);
|
||||||
|
|
||||||
|
if (prices.empty())
|
||||||
|
remove_edge(e1.first, price_graph);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void commodity_history_t::map_prices(function<void(datetime_t,
|
void commodity_history_t::map_prices(function<void(datetime_t,
|
||||||
|
|
@ -208,9 +292,8 @@ commodity_history_t::find_price(const commodity_t& source,
|
||||||
std::vector<vertex_descriptor> predecessors(vector_len);
|
std::vector<vertex_descriptor> predecessors(vector_len);
|
||||||
std::vector<long> distances(vector_len);
|
std::vector<long> distances(vector_len);
|
||||||
|
|
||||||
FIndexMap indexMap(get(vertex_index, fg));
|
FPredecessorMap predecessorMap(&predecessors[0]);
|
||||||
FPredecessorMap predecessorMap(&predecessors[0], indexMap);
|
FDistanceMap distanceMap(&distances[0]);
|
||||||
FDistanceMap distanceMap(&distances[0], indexMap);
|
|
||||||
|
|
||||||
dijkstra_shortest_paths(fg, /* start= */ sv,
|
dijkstra_shortest_paths(fg, /* start= */ sv,
|
||||||
predecessor_map(predecessorMap)
|
predecessor_map(predecessorMap)
|
||||||
|
|
|
||||||
|
|
@ -60,79 +60,12 @@ namespace ledger {
|
||||||
|
|
||||||
typedef std::map<datetime_t, amount_t> price_map_t;
|
typedef std::map<datetime_t, amount_t> price_map_t;
|
||||||
|
|
||||||
template <typename EdgeWeightMap,
|
|
||||||
typename PricePointMap,
|
|
||||||
typename PriceRatioMap>
|
|
||||||
class recent_edge_weight
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
EdgeWeightMap weight;
|
|
||||||
PricePointMap price_point;
|
|
||||||
PriceRatioMap ratios;
|
|
||||||
|
|
||||||
datetime_t reftime;
|
|
||||||
optional<datetime_t> oldest;
|
|
||||||
|
|
||||||
recent_edge_weight() { }
|
|
||||||
recent_edge_weight(EdgeWeightMap _weight,
|
|
||||||
PricePointMap _price_point,
|
|
||||||
PriceRatioMap _ratios,
|
|
||||||
datetime_t _reftime,
|
|
||||||
const optional<datetime_t>& _oldest = none)
|
|
||||||
: weight(_weight), price_point(_price_point), ratios(_ratios),
|
|
||||||
reftime(_reftime), oldest(_oldest) { }
|
|
||||||
|
|
||||||
template <typename Edge>
|
|
||||||
bool operator()(const Edge& e) const
|
|
||||||
{
|
|
||||||
#if defined(DEBUG_ON)
|
|
||||||
DEBUG("history.find", " reftime = " << reftime);
|
|
||||||
if (oldest) {
|
|
||||||
DEBUG("history.find", " oldest = " << *oldest);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
const price_map_t& prices(get(ratios, e));
|
|
||||||
if (prices.empty()) {
|
|
||||||
DEBUG("history.find", " prices map is empty for this edge");
|
|
||||||
put(weight, e, std::numeric_limits<std::size_t>::max());
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
price_map_t::const_iterator low = prices.upper_bound(reftime);
|
|
||||||
if (low != prices.end() && low == prices.begin()) {
|
|
||||||
DEBUG("history.find", " don't use this edge");
|
|
||||||
put(weight, e, std::numeric_limits<std::size_t>::max());
|
|
||||||
return false;
|
|
||||||
} else {
|
|
||||||
--low;
|
|
||||||
assert(((*low).first <= reftime));
|
|
||||||
|
|
||||||
if (oldest && (*low).first < *oldest) {
|
|
||||||
DEBUG("history.find", " edge is out of range");
|
|
||||||
put(weight, e, std::numeric_limits<std::size_t>::max());
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
long secs = (reftime - (*low).first).total_seconds();
|
|
||||||
assert(secs >= 0);
|
|
||||||
|
|
||||||
put(weight, e, secs);
|
|
||||||
put(price_point, e, price_point_t((*low).first, (*low).second));
|
|
||||||
|
|
||||||
DEBUG("history.find", " using edge at price point "
|
|
||||||
<< (*low).first << " " << (*low).second);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
class commodity_history_t : public noncopyable
|
class commodity_history_t : public noncopyable
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
typedef adjacency_list
|
typedef adjacency_list
|
||||||
<setS, // Store all edges as a set
|
<vecS, // Store all edges in a vector
|
||||||
setS, // Store all vertices in a set
|
vecS, // Store all vertices in a vector
|
||||||
undirectedS, // Relations are both ways
|
undirectedS, // Relations are both ways
|
||||||
|
|
||||||
// All vertices are commodities
|
// All vertices are commodities
|
||||||
|
|
@ -156,31 +89,16 @@ public:
|
||||||
typedef graph_traits<Graph>::vertex_descriptor vertex_descriptor;
|
typedef graph_traits<Graph>::vertex_descriptor vertex_descriptor;
|
||||||
typedef graph_traits<Graph>::edge_descriptor edge_descriptor;
|
typedef graph_traits<Graph>::edge_descriptor edge_descriptor;
|
||||||
|
|
||||||
typedef property_map<Graph, vertex_name_t>::type NameMap;
|
typedef property_map<Graph, vertex_name_t>::type NameMap;
|
||||||
typedef property_map<Graph, vertex_index_t>::type IndexMap;
|
|
||||||
|
|
||||||
typedef property_map<Graph, edge_weight_t>::type EdgeWeightMap;
|
typedef property_map<Graph, edge_weight_t>::type EdgeWeightMap;
|
||||||
typedef property_map<Graph, edge_price_point_t>::type PricePointMap;
|
typedef property_map<Graph, edge_price_point_t>::type PricePointMap;
|
||||||
typedef property_map<Graph, edge_price_ratio_t>::type PriceRatioMap;
|
typedef property_map<Graph, edge_price_ratio_t>::type PriceRatioMap;
|
||||||
|
|
||||||
IndexMap indexmap;
|
|
||||||
PricePointMap pricemap;
|
PricePointMap pricemap;
|
||||||
PriceRatioMap ratiomap;
|
PriceRatioMap ratiomap;
|
||||||
|
|
||||||
typedef filtered_graph<Graph, recent_edge_weight<EdgeWeightMap,
|
|
||||||
PricePointMap,
|
|
||||||
PriceRatioMap> > FGraph;
|
|
||||||
|
|
||||||
typedef property_map<FGraph, vertex_name_t>::type FNameMap;
|
|
||||||
typedef property_map<FGraph, vertex_index_t>::type FIndexMap;
|
|
||||||
typedef iterator_property_map<vertex_descriptor*, FIndexMap,
|
|
||||||
vertex_descriptor,
|
|
||||||
vertex_descriptor&> FPredecessorMap;
|
|
||||||
typedef iterator_property_map<long*, FIndexMap, long, long&> FDistanceMap;
|
|
||||||
|
|
||||||
commodity_history_t()
|
commodity_history_t()
|
||||||
: indexmap(get(vertex_index, price_graph)),
|
: pricemap(get(edge_price_point, price_graph)),
|
||||||
pricemap(get(edge_price_point, price_graph)),
|
|
||||||
ratiomap(get(edge_price_ratio, price_graph)) {}
|
ratiomap(get(edge_price_ratio, price_graph)) {}
|
||||||
|
|
||||||
void add_commodity(commodity_t& comm);
|
void add_commodity(commodity_t& comm);
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue