Flowlessly  0.1
Minimum cost maximum cost solver
 All Classes Functions Pages
adjacency_map_graph.h
1 // The Flowlessly project
2 // Copyright (c) 2013-2016 Ionel Gog <ionel.gog@cl.cam.ac.uk>
3 
4 #ifndef FLOWLESSLY_ADJACENCY_MAP_GRAPH_H
5 #define FLOWLESSLY_ADJACENCY_MAP_GRAPH_H
6 
7 #include "graphs/graph.h"
8 
9 #include <stdint.h>
10 #include <limits>
11 #include <list>
12 #include <set>
13 #include <string>
14 #include <unordered_map>
15 #include <vector>
16 
17 #include "graphs/node.h"
18 #include "misc/statistics.h"
19 
20 namespace flowlessly {
21 
22 class AdjacencyMapGraph : public Graph {
23  public:
24  explicit AdjacencyMapGraph(Statistics* stats);
25  AdjacencyMapGraph(uint32_t max_node_id, uint32_t num_arcs, uint32_t sink_node,
26  const set<uint32_t>& source_nodes,
27  const vector<unordered_map<uint32_t, Arc*> >& arcs,
28  const vector<Node>& nodes,
29  const set<uint32_t>& unused_node_ids,
30  Statistics* stats);
32 
33  Arc* AddArc(uint32_t src_node_id, uint32_t dst_node_id,
34  uint32_t min_flow, int32_t capacity,
35  int64_t cost, int32_t type);
36  void AddNode(uint32_t node_id, int32_t supply, int64_t potential,
37  NodeType type, bool first_scheduling_iteration);
38  uint32_t AddNode(int32_t supply, int64_t price, NodeType type,
39  bool first_scheduling_iteration);
40 
41  void ChangeArc(Arc* arc, uint32_t new_min_flow, int32_t new_capacity,
42  int64_t new_cost, int32_t new_type);
43  void ChangeArc(uint32_t src_node_id, uint32_t dst_node_id,
44  uint32_t new_min_flow, int32_t new_capacity, int64_t new_cost,
45  int32_t new_type, bool is_multi_arc, int64_t old_cost);
46  void GetMachinePUs(uint32_t machine_node_id, set<uint32_t>* pu_ids);
47  Arc* GetRandomArc(uint32_t node_id);
48  unordered_multimap<uint32_t, uint32_t>* GetTaskAssignments();
49  int64_t GetTotalCost();
50  void InitializeGraph();
51  bool IsEpsOptimal(int64_t eps);
52  bool IsFeasible();
53  bool IsInTopologicalOrder(const vector<uint32_t>& node_ids);
54 
62  int64_t MaxRefinePotential(uint64_t node_id, int64_t eps);
63 
70  bool TopologicalSort(vector<uint32_t>* ordered);
71 
72  void RemoveArc(Arc* arc);
73  void RemoveNode(uint32_t node_id);
74  void ScaleDownCosts(int64_t scale_down);
75  void ScaleUpCosts(int64_t scale_up);
76  void UpdateAdmissibleGraph(const vector<uint32_t>& updated_nodes);
77  void WriteAssignments(FILE* out_file);
78  void WriteFlowGraph(FILE* out_graph_file);
79  void WriteGraph(FILE* out_graph_file);
80 
81  inline set<uint32_t>& get_active_node_ids() {
82  return active_node_ids_;
83  }
84 
85  inline vector<unordered_map<uint32_t, Arc*> >& get_admissible_arcs() {
86  return admissible_arcs_;
87  }
88 
89  inline vector<unordered_map<uint32_t, Arc*> >& get_arcs() {
90  return arcs_;
91  }
92 
93  inline vector<Node>& get_nodes() {
94  return nodes_;
95  }
96 
97  private:
98  int32_t GetNumAssignedTasksToPU(uint32_t node_id);
99  void RemoveArcs(uint32_t node_id);
100  bool TopologicalSort(uint32_t node_id, list<uint32_t>* ordered);
101  void UpdateNodeTypeOnArcRemoval(uint32_t src_node_id, uint32_t dst_node_id);
102 
103  vector<unordered_map<uint32_t, Arc*> > arcs_;
104  vector<unordered_map<uint32_t, Arc*> > admissible_arcs_;
105  vector<Node> nodes_;
106  set<uint32_t> active_node_ids_;
107  set<uint32_t> unused_node_ids_;
108  uint32_t seed_;
109  Statistics* statistics_;
110 };
111 
112 } // namespace flowlessly
113 #endif // FLOWLESSLY_ADJACENCY_MAP_GRAPH_H
void RemoveNode(uint32_t node_id)
Definition: adjacency_map_graph.cc:595
Definition: statistics.h:19
Definition: graph.h:80
void WriteGraph(FILE *out_graph_file)
Definition: adjacency_map_graph.cc:752
bool IsFeasible()
Definition: adjacency_map_graph.cc:491
bool IsEpsOptimal(int64_t eps)
Definition: adjacency_map_graph.cc:470
void RemoveArc(Arc *arc)
Definition: adjacency_map_graph.cc:551
void ScaleUpCosts(int64_t scale_up)
Definition: adjacency_map_graph.cc:630
Arc * GetRandomArc(uint32_t node_id)
Definition: adjacency_map_graph.cc:370
void ChangeArc(Arc *arc, uint32_t new_min_flow, int32_t new_capacity, int64_t new_cost, int32_t new_type)
Definition: adjacency_map_graph.cc:246
bool TopologicalSort(vector< uint32_t > *ordered)
Definition: adjacency_map_graph.cc:639
int64_t MaxRefinePotential(uint64_t node_id, int64_t eps)
Definition: adjacency_map_graph.cc:533
int64_t GetTotalCost()
Definition: adjacency_map_graph.cc:441
bool IsInTopologicalOrder(const vector< uint32_t > &node_ids)
Definition: adjacency_map_graph.cc:516
void ScaleDownCosts(int64_t scale_down)
Definition: adjacency_map_graph.cc:622
void WriteFlowGraph(FILE *out_graph_file)
Definition: adjacency_map_graph.cc:735
Definition: graph.h:24
void WriteAssignments(FILE *out_file)
Definition: adjacency_map_graph.cc:727
Definition: adjacency_map_graph.h:22