blob: 801b01e33374497765ec8a1abd82a1cc2b4ba56c [file] [log] [blame]
Lang Hames3ca9a5b2009-08-06 23:32:48 +00001#ifndef LLVM_CODEGEN_PBQP_ANNOTATEDGRAPH_H
2#define LLVM_CODEGEN_PBQP_ANNOTATEDGRAPH_H
3
4#include "GraphBase.h"
5
6namespace PBQP {
7
8
9template <typename NodeData, typename EdgeData> class AnnotatedEdge;
10
11template <typename NodeData, typename EdgeData>
12class AnnotatedNode : public NodeBase<AnnotatedNode<NodeData, EdgeData>,
13 AnnotatedEdge<NodeData, EdgeData> > {
14private:
15
16 NodeData nodeData;
17
18public:
19
20 AnnotatedNode(const Vector &costs, const NodeData &nodeData) :
21 NodeBase<AnnotatedNode<NodeData, EdgeData>,
22 AnnotatedEdge<NodeData, EdgeData> >(costs),
23 nodeData(nodeData) {}
24
25 NodeData& getNodeData() { return nodeData; }
26 const NodeData& getNodeData() const { return nodeData; }
27
28};
29
30template <typename NodeData, typename EdgeData>
31class AnnotatedEdge : public EdgeBase<AnnotatedNode<NodeData, EdgeData>,
32 AnnotatedEdge<NodeData, EdgeData> > {
33private:
34
35 typedef typename GraphBase<AnnotatedNode<NodeData, EdgeData>,
36 AnnotatedEdge<NodeData, EdgeData> >::NodeIterator
37 NodeIterator;
38
39 EdgeData edgeData;
40
41public:
42
43
44 AnnotatedEdge(const NodeIterator &node1Itr, const NodeIterator &node2Itr,
45 const Matrix &costs, const EdgeData &edgeData) :
46 EdgeBase<AnnotatedNode<NodeData, EdgeData>,
47 AnnotatedEdge<NodeData, EdgeData> >(node1Itr, node2Itr, costs),
48 edgeData(edgeData) {}
49
50 EdgeData& getEdgeData() { return edgeData; }
51 const EdgeData& getEdgeData() const { return edgeData; }
52
53};
54
55template <typename NodeData, typename EdgeData>
56class AnnotatedGraph : public GraphBase<AnnotatedNode<NodeData, EdgeData>,
57 AnnotatedEdge<NodeData, EdgeData> > {
58private:
59
60 typedef GraphBase<AnnotatedNode<NodeData, EdgeData>,
61 AnnotatedEdge<NodeData, EdgeData> > PGraph;
62
63 typedef AnnotatedNode<NodeData, EdgeData> NodeEntry;
64 typedef AnnotatedEdge<NodeData, EdgeData> EdgeEntry;
65
66
67 void copyFrom(const AnnotatedGraph &other) {
68 if (!other.areNodeIDsValid()) {
69 other.assignNodeIDs();
70 }
71 std::vector<NodeIterator> newNodeItrs(other.getNumNodes());
72
73 for (ConstNodeIterator nItr = other.nodesBegin(), nEnd = other.nodesEnd();
74 nItr != nEnd; ++nItr) {
75 newNodeItrs[other.getNodeID(nItr)] = addNode(other.getNodeCosts(nItr));
76 }
77
78 for (ConstEdgeIterator eItr = other.edgesBegin(), eEnd = other.edgesEnd();
79 eItr != eEnd; ++eItr) {
80
81 unsigned node1ID = other.getNodeID(other.getEdgeNode1(eItr)),
82 node2ID = other.getNodeID(other.getEdgeNode2(eItr));
83
84 addEdge(newNodeItrs[node1ID], newNodeItrs[node2ID],
85 other.getEdgeCosts(eItr), other.getEdgeData(eItr));
86 }
87
88 }
89
90public:
91
92 typedef typename PGraph::NodeIterator NodeIterator;
93 typedef typename PGraph::ConstNodeIterator ConstNodeIterator;
94 typedef typename PGraph::EdgeIterator EdgeIterator;
95 typedef typename PGraph::ConstEdgeIterator ConstEdgeIterator;
96
97 AnnotatedGraph() {}
98
99 AnnotatedGraph(const AnnotatedGraph &other) {
100 copyFrom(other);
101 }
102
103 AnnotatedGraph& operator=(const AnnotatedGraph &other) {
104 PGraph::clear();
105 copyFrom(other);
106 return *this;
107 }
108
109 NodeIterator addNode(const Vector &costs, const NodeData &data) {
110 return PGraph::addConstructedNode(NodeEntry(costs, data));
111 }
112
113 EdgeIterator addEdge(const NodeIterator &node1Itr,
114 const NodeIterator &node2Itr,
115 const Matrix &costs, const EdgeData &data) {
116 return PGraph::addConstructedEdge(EdgeEntry(node1Itr, node2Itr,
117 costs, data));
118 }
119
120 NodeData& getNodeData(const NodeIterator &nodeItr) {
121 return getNodeEntry(nodeItr).getNodeData();
122 }
123
124 const NodeData& getNodeData(const NodeIterator &nodeItr) const {
125 return getNodeEntry(nodeItr).getNodeData();
126 }
127
128 EdgeData& getEdgeData(const EdgeIterator &edgeItr) {
129 return getEdgeEntry(edgeItr).getEdgeData();
130 }
131
132 const EdgeEntry& getEdgeData(const EdgeIterator &edgeItr) const {
133 return getEdgeEntry(edgeItr).getEdgeData();
134 }
135
136 SimpleGraph toSimpleGraph() const {
137 SimpleGraph g;
138
139 if (!PGraph::areNodeIDsValid()) {
140 PGraph::assignNodeIDs();
141 }
142 std::vector<SimpleGraph::NodeIterator> newNodeItrs(PGraph::getNumNodes());
143
144 for (ConstNodeIterator nItr = PGraph::nodesBegin(),
145 nEnd = PGraph::nodesEnd();
146 nItr != nEnd; ++nItr) {
147
148 newNodeItrs[getNodeID(nItr)] = g.addNode(getNodeCosts(nItr));
149 }
150
151 for (ConstEdgeIterator
152 eItr = PGraph::edgesBegin(), eEnd = PGraph::edgesEnd();
153 eItr != eEnd; ++eItr) {
154
155 unsigned node1ID = getNodeID(getEdgeNode1(eItr)),
156 node2ID = getNodeID(getEdgeNode2(eItr));
157
158 g.addEdge(newNodeItrs[node1ID], newNodeItrs[node2ID],
159 getEdgeCosts(eItr));
160 }
161
162 return g;
163 }
164
165};
166
167
168}
169
170#endif // LLVM_CODEGEN_PBQP_ANNOTATEDGRAPH_H