Commit 5bd22964 authored by Philipp Götze's avatar Philipp Götze
Browse files

Prepared Image and Graph Processing Use Cases, currently using the Test Cases

parent 8d285e08
......@@ -4,7 +4,7 @@ Here we want to describe and show some use cases for PipeFabric to give you an i
and necessary efforts of utilization. Therefore we provide the following topics:
+ DEBS2017, a research challenge for detecting anomalies in RDF streaming data
+ Image Processing, realized by matrix operations (coming soon)
+ Image and Graph Processing, realized by matrix operations
+ Processing of Movement Trajectories, tracking movement of different objects (coming soon)
To run them on your own, we give the necessary simple installation steps below because the use cases are not
......@@ -67,10 +67,9 @@ For data of real sensors with real manufacturing machines, this print could also
whatever the reaction to an anomaly should be.
### Image Processing ###
(coming soon!)
### Image and Graph Processing ###
Requires OpenCV and Eigen library to be installed (tested with opencv 3.3.1 and eigen 3.3.1)
### Movement Trajectories ###
......
......@@ -26,7 +26,7 @@ option(SUPPORT_MATRICES
# Build use cases
option(BUILD_USE_CASES
""
OFF)
OFF)
# Use the boost::spirit parser for converting strings to numbers
option(USE_BOOST_SPIRIT_PARSER
......@@ -53,13 +53,13 @@ option(BUILD_ONLY_LIBS
# If switched to off, no tests will be build
option(BUILD_TEST_CASES
"build tests for pipefabric functionality"
ON
ON
)
#Build google benchmark library
option(BUILD_GOOGLE_BENCH
"build google benchmark"
ON
ON
)
# Build benchmark test
......@@ -74,7 +74,7 @@ option(BUILD_BENCHMARKS
# Use cases require matrix support (image and graph processing)
if(BUILD_USE_CASES)
set(SUPPORT_MATRICES)
set(SUPPORT_MATRICES ON)
endif()
# Benchmark test requires benchmark library
......
......@@ -5,7 +5,7 @@
#include "BaseMatrix.hpp"
#include "ReaderValue.hpp"
#include <Eigen/Dense>
#include <eigen3/Eigen/Dense>
#include <boost/uuid/uuid.hpp>
......
......@@ -6,7 +6,7 @@
#include "BaseMatrix.hpp"
#include "core/StreamElementTraits.hpp"
#include "ReaderValue.hpp"
#include <Eigen/Sparse>
#include <eigen3/Eigen/Sparse>
#include <mutex>
#include <boost/signals2.hpp>
......
if (BUILD_USE_CASES)
add_subdirectory(DEBS2017)
endif()
add_subdirectory(DEBS2017)
add_subdirectory(MatrixProcessing)
\ No newline at end of file
add_definitions(-DTEST_DATA_DIRECTORY="${CMAKE_CURRENT_SOURCE_DIR}/data/")
include_directories(${PROJECT_SOURCE_DIR}/test) #</ catch.hpp
add_executable(graph_test GraphTest.cpp)
target_link_libraries(graph_test
pfabric_core
${Boost_SYSTEM_LIBRARY}
)
add_executable(image_test ImageProcessingTest.cpp)
target_link_libraries(image_test
pfabric_core
${Boost_SYSTEM_LIBRARY}
${OpenCV_LIBS}
)
\ No newline at end of file
#define CATCH_CONFIG_MAIN
#include <catch.hpp>
#include <vector>
#include "pfabric.hpp"
#include "operations/Graph.hpp"
#include "operations/GraphAlgorithms.hpp"
#include "matrix/Matrix.hpp"
#include "matrix/ReaderValue.hpp"
#include "qop/ToMatrix.hpp"
#include "StreamMockup.hpp"
using namespace pfabric;
typedef int CellType;
typedef TuplePtr<int, int, CellType> InputType;
typedef pfabric::Matrix<CellType, pfabric::ReaderValue<InputType> > MatrixType;
typedef pfabric::Graph< MatrixType > GraphType;
// adjacent matrix contains edges and values
std::vector< InputType > inputs = {
makeTuplePtr(0, 1, 1), makeTuplePtr(0, 2, 3),
makeTuplePtr(1, 0, 1), makeTuplePtr(1, 4, 1),
makeTuplePtr(2, 0, 3), makeTuplePtr(2, 3, 5), makeTuplePtr(2, 4, 4),
makeTuplePtr(3, 2, 5), makeTuplePtr(3, 4, 2),
makeTuplePtr(4, 1, 1), makeTuplePtr(4, 2, 4), makeTuplePtr(4, 3, 2)
};
std::shared_ptr<MatrixType> init_matrix(const std::vector<InputType> &inputs)
{
auto matrix = make_shared<MatrixType>();
auto mockup = std::make_shared<StreamMockup<InputType, InputType> >(inputs, inputs);
auto op = std::make_shared<ToMatrix<MatrixType>> (matrix);
CREATE_DATA_LINK(mockup, op);
mockup->start();
for(const auto& tuple : inputs ) {
auto x = tuple->getAttribute<0>();
auto y = tuple->getAttribute<1>();
auto z = tuple->getAttribute<2>();
matrix->set(x, y, z);
}
return matrix;
}
TEST_CASE("Observe graph values", "[GraphTest]")
{
auto matrix = init_matrix(inputs);
GraphType graph(matrix.get());
REQUIRE(matrix->getRows() == 5);
REQUIRE(matrix->getCols() == 5);
REQUIRE(boost::num_vertices(graph) == 5);
auto weight_map = boost::get(boost::edge_weight, graph);
auto range_vertices_it = boost::vertices(graph);
for(auto vert_it = range_vertices_it.first; vert_it != range_vertices_it.second; ++vert_it) {
auto out_edges_pair = boost::out_edges(*vert_it, graph);
for(auto edge_it = out_edges_pair.first; edge_it != out_edges_pair.second; ++edge_it)
{
auto edge = *edge_it;
auto found_edge_it = std::find_if(inputs.begin(), inputs.end(), [&edge](const InputType& tuple) {
return edge.first == get<0>(tuple) && edge.second == get<1>(tuple);
});
if(found_edge_it != inputs.end()) {
REQUIRE(weight_map[edge] == get<2>(*found_edge_it));
} else {
REQUIRE(false);
}
}
}
}
TEST_CASE("Shortest path", "[GraphTest]")
{
auto matrix = init_matrix(inputs);
GraphType graph(matrix.get());
auto node1 = 0;
{
auto node2 = 4;
REQUIRE(pfabric::shortest_path(graph, node1, node2) == 2);
}
{
auto node2 = 3;
REQUIRE(pfabric::shortest_path(graph, node1, node2) == 4);
}
}
TEST_CASE("Shortest path with context", "[GraphTest]")
{
StreamGenerator<InputType>::Generator stream([]( size_t n) -> InputType {
return inputs[n];
});
const std::string matrixName("exMatrix1");
PFabricContext ctx;
{
// A matrix is filling in one place
auto t = ctx.createTopology();
auto matrix = ctx.createMatrix<MatrixType>(matrixName);
auto s = t->streamFromGenerator<InputType>(stream, inputs.size())
.toMatrix<MatrixType>(matrix)
;
t->start(false);
}
// Shortest path is computed on another place by getting matrix from context
auto matrix = ctx.getMatrix<MatrixType>(matrixName);
GraphType graph(matrix.get());
auto node1 = 0;
{
auto node2 = 4;
REQUIRE(pfabric::shortest_path(graph, node1, node2) == 2);
}
{
auto node2 = 3;
REQUIRE(pfabric::shortest_path(graph, node1, node2) == 4);
}
}
TEST_CASE("Graph streaming", "[GraphTest]")
{
StreamGenerator<InputType>::Generator stream([]( size_t n) -> InputType {
return inputs[n];
});
const std::string matrixName("exMatrix");
PFabricContext ctx;
auto t = ctx.createTopology();
auto matrix = ctx.createMatrix<MatrixType>(matrixName);
auto s = t->streamFromGenerator<InputType>(stream, inputs.size())
.toMatrix<MatrixType>(matrix)
;
CellType shortest_path = std::numeric_limits<CellType>::max();
t->newStreamFromMatrix<MatrixType>(matrix)
.notify([&matrix, &shortest_path](const auto &tuple, bool outdated){
auto node1 = 0; auto node2 = 4;
GraphType graph(matrix.get());
auto res = pfabric::shortest_path(graph, node1, node2);
if(res < shortest_path) {
shortest_path = res;
std::cout << "\nshortest path: " << shortest_path;
}
})
;
t->start();
t->wait();
}
TEST_CASE("Sparse edge iterator", "[GraphTest]")
{
auto matrix = init_matrix(inputs);
GraphType g(matrix.get());
auto verify = [&g](std::size_t vertex, std::size_t id) {
auto range_it = boost::out_edges(vertex, g);
for(auto beg_it = range_it.first, end_it = range_it.second; beg_it != end_it; ++beg_it ) {
auto edge = *beg_it;
auto tuple = inputs[id++];
REQUIRE(edge.first == get<0>(tuple));
REQUIRE(edge.second == get<1>(tuple));
}
};
verify(0, 0);
verify(1, 2);
verify(2, 4);
verify(3, 7);
verify(4, 9);
}
TEST_CASE("Edges iterator", "[GraphTest]")
{
auto matrix = init_matrix(inputs);
GraphType g(matrix.get());
auto range_it = boost::edges(g);
auto id = 0u;
for(auto beg_it = range_it.first, end_it = range_it.second; beg_it != end_it; ++beg_it ) {
auto edge = *beg_it;
auto tuple = inputs[id++];
REQUIRE(edge.first == get<0>(tuple));
REQUIRE(edge.second == get<1>(tuple));
}
}
TEST_CASE("Vertices iterator", "[GraphTest]")
{
std::vector<typename GraphType::vertex_descriptor> expected = {0, 1, 2, 3, 4};
auto matrix = init_matrix(inputs);
GraphType g(matrix.get());
auto id = 0u;
auto range_it = boost::vertices(g);
for(auto beg_it = range_it.first, end_it = range_it.second; beg_it != end_it; ++beg_it ) {
REQUIRE(*beg_it == expected[id++]);
}
}
TEST_CASE("Count edges", "[GraphTest]")
{
auto matrix = init_matrix(inputs);
GraphType g(matrix.get());
REQUIRE(boost::num_edges(g) == inputs.size());
}
TEST_CASE("In edge test", "[GraphTest], [UndirectedGraph]")
{
auto matrix = init_matrix(inputs);
GraphType g(matrix.get());
auto verify = [&g](std::size_t vertex, std::size_t id)
{
auto range_it = boost::in_edges(vertex, g);
for(auto beg_it = range_it.first, end_it = range_it.second; beg_it != end_it; ++beg_it ) {
auto edge = *beg_it;
auto tuple = inputs[id];
REQUIRE(edge.first == get<1>(tuple));
REQUIRE(edge.second == get<0>(tuple));
}
};
verify(0, 0);
verify(1, 2);
verify(2, 4);
verify(3, 7);
verify(4, 9);
}
TEST_CASE("In degree", "[GraphTest], [UndirectedGraph]")
{
auto matrix = init_matrix(inputs);
GraphType g(matrix.get());
REQUIRE(boost::in_degree(0, g) == 2);
REQUIRE(boost::in_degree(1, g) == 2);
REQUIRE(boost::in_degree(2, g) == 3);
REQUIRE(boost::in_degree(3, g) == 2);
REQUIRE(boost::in_degree(4, g) == 3);
}
TEST_CASE("Vertex test", "[GraphTest]")
{
auto matrix = init_matrix(inputs);
GraphType g(matrix.get());
REQUIRE(boost::vertex(0, g) == 0);
REQUIRE(boost::vertex(1, g) == 1);
}
TEST_CASE("Edge test", "[GraphTest]")
{
auto matrix = init_matrix(inputs);
GraphType g(matrix.get());
auto range_it = boost::edges(g);
for(auto beg_it = range_it.first, end_it = range_it.second; beg_it != end_it; ++beg_it ) {
auto edge = *beg_it;
REQUIRE(boost::edge(edge.first, edge.second, g).second);
}
}
TEST_CASE("Adjacent test", "[GraphTest], [UndirectedGraph]")
{
auto matrix = init_matrix(inputs);
GraphType g(matrix.get());
auto verify = [&g](std::size_t vertex, std::size_t id) {
auto range_it = boost::adjacent_vertices(vertex, g);
for(auto beg_it = range_it.first, end_it = range_it.second; beg_it != end_it; ++beg_it ) {
auto tuple = inputs[id];
REQUIRE(*beg_it == get<0>(tuple));
}
};
verify(0, 0);
verify(1, 2);
verify(2, 4);
verify(3, 7);
verify(4, 9);
}
TEST_CASE("Edge test with nonexistent edges", "[GraphTest], [UndirectedGraph]")
{
std::vector<InputType> inputs = {makeTuplePtr(0, 1, 5), makeTuplePtr(0, 3, 2)
, makeTuplePtr(3, 2, 7)
};
std::vector<InputType> nonexistent = {makeTuplePtr(0, 2, 4), makeTuplePtr(1, 2, 7)};
auto matrix = init_matrix(inputs);
GraphType g(matrix.get());
{ // Precondition
auto range_it = boost::edges(g);
for(auto beg_it = range_it.first, end_it = range_it.second; beg_it != end_it; ++beg_it ) {
auto edge = *beg_it;
REQUIRE(boost::edge(edge.first, edge.second, g).second);
}
}
for(const auto &tuple : nonexistent) {
auto x = get<0>(tuple);
auto y = get<1>(tuple);
REQUIRE_FALSE(boost::edge(x, y, g).second);
}
}
TEST_CASE("Remove edge", "[GraphTest]")
{
auto matrix = init_matrix(inputs);
GraphType g(matrix.get());
REQUIRE(g.num_edges() == inputs.size());
auto numEdges = boost::in_degree(2, g);
REQUIRE(numEdges == 3);
auto range_it = boost::out_edges(2, g);
for(auto beg = range_it.first; beg != range_it.second; ++beg) {
auto edge = *beg;
g.remove_edge(edge.first, edge.second);
}
auto undirectedGr = 2;
REQUIRE(boost::num_edges(g) == inputs.size()-numEdges*undirectedGr);
}
TEST_CASE("Clear vertex", "[GraphTest] [UndirectedGraph]")
{
auto matrix = init_matrix(inputs);
GraphType g(matrix.get());
auto numEdges = boost::in_degree(2, g);
REQUIRE(numEdges == 3);
boost::clear_vertex(2, g);
auto undirectedGr = 2;
REQUIRE(boost::num_edges(g) == inputs.size()-numEdges*undirectedGr);
REQUIRE(boost::in_degree(2, g) == 0);
REQUIRE(boost::out_degree(2, g) == 0);
}
\ No newline at end of file
#define CATCH_CONFIG_MAIN // This tells Catch to provide a main() - only do this in one cpp file
#include "catch.hpp"
#include "pfabric.hpp"
#include "matrix/DenseMatrix.hpp"
#include "operations/filters/GaussianFilter.hpp"
#include <fstream>
#include <sstream>
using namespace pfabric;
TEST_CASE("Gaussian blur image filter", "[ImageProcessing]")
{
typedef float CellType;
typedef VectorY<CellType> VectorCol;
typedef TuplePtr<int, int, VectorCol > InputType;
typedef TuplePtr<VectorCol> VectorTuple;
GaussianFilter filter(5, 3, CV_32FC3);
pfabric::Topology t;
std::ostringstream img_values;
t.newStreamFromFile(std::string(TEST_DATA_DIRECTORY)+"blur_image_test.in")
.extract<InputType>(',')
.map<VectorTuple>([](const auto& tp, bool) {
return makeTuplePtr(pfabric::get<2>(tp));
})
.map<VectorTuple>([&filter](const auto& tp, bool) {
auto &vector = get<0>(tp);
filter.apply(vector.getRawData(), vector.getRows(), vector.getCols());
return tp;
})
.print(img_values)
;
t.start(false);
std::ifstream f(std::string(TEST_DATA_DIRECTORY)+"blur_image_test.res");
std::stringstream expected;
if(f.is_open()) {
expected << f.rdbuf();
REQUIRE(img_values.str() == expected.str());
} else {
REQUIRE(false);
}
}
\ No newline at end of file
24,24,111 130 223 105 129 222 116 148 242 75 40 146 82 74 178 90 90 195 94 99 207 95 99 206 96 101 209 98 100 207 99 102 204 96 101 206 94 97 204 98 100 203 86 76 178 103 113 205 112 135 227 101 127 224 99 116 214 155 214 246 81 64 170 91 85 184 103 114 223 85 71 160 107 129 224 119 153 234 103 130 231 65 40 147 78 72 179 85 86 194 92 95 204 94 94 204 91 93 209 85 87 208 73 74 200 86 83 202 93 92 203 89 92 208 88 81 189 104 92 195 116 133 222 110 136 227 104 116 216 134 183 242 112 131 196 100 105 215 82 62 155 51 0 58 118 153 238 86 105 223 111 144 242 64 32 142 78 73 181 85 84 201 89 91 207 94 92 212 104 100 206 125 119 198 152 156 201 147 160 205 104 100 198 85 77 201 86 78 192 93 87 195 112 117 215 107 126 222 102 119 221 66 67 200 199 255 255 68 45 137 55 2 65 59 19 92 94 110 215 86 89 193 110 149 252 60 23 125 82 71 175 85 79 189 87 87 201 87 86 195 100 89 180 112 105 190 135 138 203 166 185 222 189 212 225 137 139 196 74 55 166 91 89 201 104 111 216 104 109 219 95 110 221 101 115 228 107 129 216 48 0 60 59 15 87 68 33 103 64 38 146 95 112 218 113 145 246 62 28 131 82 70 177 83 81 192 89 86 200 85 73 179 98 92 191 104 102 200 119 123 207 165 174 219 187 196 226 222 245 247 130 121 172 77 68 180 110 125 239 64 38 123 97 103 210 114 138 255 48 0 64 57 16 91 65 10 74 137 155 235 70 46 145 96 106 212 117 148 246 59 23 125 80 69 176 82 75 186 95 97 193 86 77 188 103 99 199 111 108 199 145 152 209 169 184 222 177 187 222 179 190 221 221 238 236 121 121 200 96 108 237 46 40 74 160 181 221 108 91 146 62 22 98 46 0 65 126 117 197 128 150 218 73 57 163 90 104 216 118 158 251 57 24 131 76 68 183 83 75 186 100 117 209 82 66 181 103 98 198 126 131 212 151 163 221 150 163 218 161 173 222 169 181 221 183 188 218 170 181 222 116 129 213 184 197 228 215 238 254 139 132 160 45 0 71 91 58 138 136 157 236 120 130 209 71 52 157 92 112 221 121 165 254 57 22 131 76 66 177 94 99 195 96 127 230 85 67 180 113 112 208 117 119 209 133 135 215 138 143 217 135 138 205 146 147 204 150 155 210 162 173 214 197 215 230 182 193 219 179 201 251 69 42 102 51 0 68 140 148 233 128 140 213 122 133 207 74 53 157 94 116 231 120 165 251 59 21 129 73 63 177 84 88 187 122 171 248 92 77 189 106 102 203 113 104 199 118 85 166 118 73 144 106 69 136 120 106 175 160 176 223 167 184 215 171 181 215 138 151 214 117 114 182 36 0 53 106 84 165 133 148 220 126 132 207 121 133 205 78 61 167 91 110 221 123 167 253 57 21 127 73 61 175 75 69 177 137 180 237 91 73 188 107 93 195 100 61 140 83 27 92 81 15 81 119 84 139 149 162 206 171 187 225 142 147 202 113 93 169 101 106 176 54 21 92 49 0 68 131 139 216 132 152 218 130 139 209 124 132 203 77 61 166 92 99 206 127 173 255 58 19 127 81 68 181 83 82 195 108 127 216 95 70 182 88 45 124 83 26 91 76 26 94 106 78 142 168 171 221 151 168 228 167 178 230 164 181 244 125 109 175 52 12 78 48 7 80 87 58 135 130 145 208 128 142 208 128 135 202 122 132 207 74 57 165 93 98 204 127 175 255 62 21 127 80 70 185 87 92 208 93 90 188 101 60 142 74 20 78 69 18 89 103 77 139 142 156 210 107 98 171 109 105 203 159 177 247 151 163 219 87 62 131 72 36 113 50 0 70 115 113 189 127 145 214 122 134 201 128 135 198 119 115 187 75 59 166 87 90 196 133 181 255 55 23 139 78 76 188 108 103 181 100 52 116 110 53 111 73 26 84 71 39 103 138 146 206 113 112 197 88 60 153 95 79 193 137 143 229 102 88 172 63 22 106 86 58 130 66 21 94 121 134 209 121 135 210 119 136 209 122 114 183 123 133 191 69 46 145 84 81 185 136 187 255 52 27 149 119 95 177 104 58 111 104 45 100 97 48 108 74 40 109 87 67 127 127 131 213 107 100 216 152 157 231 109 105 223 145 144 221 135 135 232 60 20 112 85 54 121 88 68 145 121 135 206 122 131 204 114 104 180 122 152 212 136 180 230 69 36 127 77 69 173 133 184 255 69 32 149 138 86 152 111 46 97 99 57 112 61 21 95 90 69 138 104 101 155 66 49 148 115 118 241 139 148 234 83 78 208 133 135 224 128 131 235 50 10 105 81 49 110 113 120 196 120 135 209 121 125 194 112 117 187 134 200 248 159 201 236 59 29 127 101 96 195 130 178 255 62 29 146 117 66 133 102 47 101 121 70 121 71 45 124 115 109 174 73 46 109 68 48 156 102 103 237 121 122 228 116 119 220 152 166 250 105 85 161 49 12 94 88 62 136 120 137 213 120 132 205 115 111 181 114 158 224 151 202 242 173 205 233 48 9 100 115 116 209 135 182 255 82 44 155 94 46 106 126 69 117 132 83 139 133 131 206 76 53 123 56 15 86 75 59 163 97 101 235 94 93 218 96 86 217 121 118 231 73 39 110 53 19 98 90 74 161 118 135 205 121 134 201 104 96 170 138 189 242 166 207 239 170 212 240 45 0 60 111 127 238 134 183 255 75 31 137 84 36 88 125 69 114 152 102 148 106 87 157 47 2 74 61 25 96 58 28 111 68 51 159 101 94 208 139 140 247 79 54 140 42 0 68 64 38 124 97 85 167 124 137 196 136 153 207 103 84 151 163 215 251 184 239 255 141 183 232 72 36 105 78 73 182 136 179 255 88 49 120 83 32 92 121 72 126 143 92 133 129 90 142 62 22 92 64 24 92 61 24 98 78 61 160 107 106 220 124 130 224 158 180 226 105 84 125 59 24 111 97 84 167 106 103 182 97 89 166 78 42 126 174 248 255 121 150 209 53 21 102 149 136 166 62 44 151 134 186 255 81 36 100 61 17 83 89 43 106 126 70 122 153 111 150 83 51 114 55 12 81 66 33 108 84 75 188 104 104 225 113 120 220 136 162 232 190 227 248 98 87 129 91 85 160 116 125 195 122 110 169 77 93 191 175 255 255 60 23 126 79 63 159 128 104 141 64 55 153 136 196 255 70 13 84 70 23 86 76 38 101 83 33 94 161 113 151 99 68 125 63 31 111 66 42 135 90 89 208 98 103 227 105 109 219 125 139 221 173 199 247 161 162 188 115 129 200 118 132 201 89 68 152 185 247 249 106 143 220 66 53 169 94 75 153 99 69 100 84 77 174 132 188 255 73 24 102 72 27 86 72 30 93 94 42 100 118 70 120 82 38 97 56 30 119 81 77 190 91 82 185 100 106 228 97 103 219 114 126 220 149 168 225 220 242 255 88 83 163 93 86 156 100 100 187 157 237 255 57 49 176 77 59 154 85 62 137 119 104 164 102 100 176 130 198 255 70 7 82 62 21 84 75 35 97 71 28 90 129 80 126 41 4 74 54 22 106 76 70 179 101 111 230 102 109 223 94 101 219 99 109 219 128 146 222 203 219 249 130 134 197 60 29 123 99 118 154 87 121 194 68 33 123 82 56 140 81 57 128 78 39 96 140 161 223 134 189 254 50 0 46 85 44 109 102 53 110 111 66 119 90 45 103 59 33 118 79 86 213 92 100 224 89 96 217 100 107 223 104 112 223 101 112 222 115 129 220 164 182 233 163 169 209 101 93 154 81 80 196 76 53 159 71 47 122 122 108 172 51 17 96
108.625 131.75 224.875 107.375 128.438 222.5 100.562 110.5 207.812 89.8125 84.1875 185.812 85.125 75.6875 180.062 88.375 85.6875 191.375 92.625 95.3125 202.062 94.875 99 206.375 96.3125 100.188 207.312 97.4375 100.75 206.625 97.5 100.875 205.562 96.5 100.125 204.875 95.3125 97.75 202.625 94.1875 94.125 197.312 95.375 96.25 195.688 100.562 109.312 204.812 104.562 122.625 216.875 106.75 130.812 222.438 113.188 141.188 222.562 115.125 138.5 213.75 104.5 113.125 198.562 95.125 94.1875 192.625 94.375 93.8125 194.25 97.5 102.25 197.875 104 119.625 210.875 106.5 129.062 220.688 96.1875 109.562 207.062 82.375 80.4375 184.375 78.9375 72.5625 179.562 84.3125 82.375 190.438 89.8125 90.9375 200.25 91.625 93.0625 204.875 89.1875 90.6875 206.625 84.125 85.4375 205.625 81.625 81.8125 203.25 84.625 83.8125 202.5 88.6875 87.9375 202.938 90.5 88.6875 200.812 94.3125 90.4375 198.188 102.438 102.25 203.062 109 119.188 214.062 111.125 130.438 221.938 114.25 139.75 224.375 117.375 145.438 221.375 112.125 132.25 210.938 97.5625 99.0625 187.125 82.875 67.25 153.5 80.75 66.875 147.375 90.5625 96.5 184.312 96.6875 115.625 216.125 91.375 102.375 208.188 81.9375 78.0625 185.5 79 71.0625 181.688 83.5 80.25 194.5 89.5 88.9375 205.062 96.625 94.9375 207.688 108.812 105.688 205.25 125.938 124.375 202.062 138 140.75 201.375 132.25 136.25 201.562 111.875 111.375 200.312 94.375 88.8125 197.875 90.25 83.8125 196.812 96.375 94.0625 201.312 103.75 109.438 210.688 103.562 115.875 216.938 100.938 116.125 217.75 110.938 129.312 216.438 117.938 131.188 197.75 96.8125 86.5 149.625 70.6875 39.5625 111 69 43.5 125.125 81.8125 77.6875 171.688 90.6875 100.75 202.688 88.75 95.1875 198.375 81.1875 74.125 177.5 79.3125 66.875 172.438 83.3125 75.9375 184.875 87 83.875 193.562 91.6875 87.75 192.062 101.125 95.1875 189 116.562 113.062 193.062 138.188 143.062 204.438 158.812 172.125 214.375 159.688 172.562 211.938 133.188 136 197.688 103.062 97.8125 189.062 93.6875 90.375 196.812 98.3125 101.438 210.188 100.75 108.875 218.188 100.062 112.25 221.625 97.875 109.688 212.188 87 84.9375 172.25 70.0625 45.25 118.938 61.8125 24.3125 96 65.1875 32.625 114.25 75.5 60.5 155.812 88 91.5625 194.375 90.75 96.125 199.688 83.125 76.3125 180.5 79.625 67.9375 175 83.0625 75.6875 185.625 86.625 80.875 190.75 90.3125 83.3125 189.375 97 91.3125 191.812 108.875 107.438 199.375 129.688 133.125 208.438 158.75 166.688 218.312 182.438 193.5 224.938 177.625 186.25 217.062 142.062 143.688 200.312 106.75 104.688 193.375 90.6875 87.375 189.25 87.6875 84.125 185.562 90.75 90.4375 192.188 86.5625 80.875 177.5 70.875 45.5625 128.25 65.3125 26.8125 99.25 80.25 49.375 122.312 94.6875 79.75 161.812 95.875 92.375 186.125 95 99.375 199.75 92 94.9375 196.562 82.5 74.1875 177.25 78.5 65.6875 171.188 83.5625 75.875 181.562 89.0625 84.875 189.312 93.8125 89.3125 192.562 102.875 98.9375 196.5 119.562 119.562 202.25 141.875 147.875 209.938 162 172.375 217.25 176.25 188 221.812 184.75 196.562 223.75 174.938 185.438 222.438 138.688 146.25 211.688 101.562 106.938 185.938 95.5625 100.5 163.875 108.375 108.75 158.812 101.75 87.375 143.188 79.625 49.625 115.625 79 49.8125 120.875 99.1875 86.3125 160.938 106.25 106.25 189.312 97.125 102.062 197.625 93.0625 103.625 206.312 90.3125 99.0625 202.5 80.6875 76.6875 182.75 77.125 67.4375 176.625 83.8125 80 187.25 89.9375 89.5 193.938 94.5625 91.375 194.5 106.312 103.5 199.375 125.25 128.688 209.188 142.125 151.562 216.625 152.688 164.625 219.562 161 172.812 220.438 169.375 179.625 220.375 170.688 179.875 219.688 160.562 170.75 219.062 156.875 169.5 221.875 171.062 185.188 226.125 171.438 179.562 210 134.312 124.938 164.125 96.3125 72.1875 131.75 95.5625 77.375 151.562 111 109.125 189.5 108.188 111.625 199.062 95.6875 100.125 197 93.5625 105.75 206.875 91.8125 102.75 204.125 82.25 79.1875 182.875 79.8125 73.25 178.125 87.125 90.9375 194.312 92.5625 100.25 204.062 97.3125 98.5 202.25 107.188 104.875 203.062 119.312 119.5 208.938 129.125 131.75 212.938 135.188 138.5 212.188 139.312 142.375 208.688 144.75 148.125 207.188 154 160.188 210.438 168 178.625 216.688 180.438 194.375 223.312 176.688 189.812 222.125 145.375 147.562 193 103.5 87.3125 146.25 90.5625 68.8125 138.25 109.188 101.438 176.938 121.312 126.062 203.938 110.875 114.625 199.125 97.25 101.188 197.375 95.0625 107.625 209.625 92.4375 103.375 205 81.5 77.625 181.5 78.25 71.875 176.562 89.6875 97.625 196.25 100.938 115.688 210.75 103.812 109.125 207.75 106 99.5 199 111.5 95.125 187.688 115.25 86.8125 169.188 114.812 79 152.875 116.625 86.9375 155.062 129.312 117.062 177.812 149.062 154.125 203.062 161.5 174.312 214.438 157.688 169.75 213.188 136.438 141.875 196.25 104.688 97.0625 158.75 86.1875 68.1875 133.75 97.1875 83.875 154.438 117.688 117.812 191.625 122.25 128.812 204.625 110.375 114.25 197.938 97.8125 102.312 197.875 95.5 107.875 208.625 92.5625 103 203.25 80.75 76.0625 179.5 76.625 67.0625 172.25 89.875 92 189.062 104.125 112.625 203.25 106.062 103.75 198.312 101.625 81.3125 175.688 95.75 58.375 141.062 90.5 40.1875 110.625 96.4375 47.3125 109.75 118 89.125 143.688 142.312 138.625 185.938 151.375 158.438 205.625 139.875 141.875 198.125 117.188 111.125 177.688 91.5625 77.4375 148.125 73 48.875 119.562 79.1875 56.125 127.125 105.875 100.125 171.312 125.562 134.75 204.938 125.75 135.625 207.5 112.25 115.188 196.375 98.9375 100.125 193.5 96.875 105.062 203.125 95 102.438 200.562 84.6875 78.6875 181.688 80.3125 69.5 177.812 87.9375 85.0625 191.688 95.5625 92.6875 194.312 95 76 171.125 89 50.4375 134.125 84.6875 36.75 108.875 91.75 49.25 115.062 115.375 90.625 151.938 142.438 138.375 195.625 157.25 166.438 222.375 159.688 171.5 229 147.188 150.875 211.875 114.312 100.688 165.5 78.4375 48.4375 116.688 68.6875 36 107.188 88.375 69.375 140.5 113.5 113.25 181.375 125.562 135.125 201.875 123.25 131.75 202.812 110.062 112.5 195.125 97.4375 98.25 193.188 96.625 104.312 202.375 96 103.312 200.25 86.25 81 183.375 81 71.0625 180.812 86.0625 79.5625 188.062 91.5 77.375 174.438 89.375 56.875 138.312 82.5 37.4375 107.438 85.3125 44.5 109.625 102.688 79.75 142.438 116.875 109.938 174.5 119.25 117.875 191.5 125.688 128.062 207.438 136.75 143.375 217 129.438 129.688 196.375 101.438 84.0625 151.938 77.875 46.25 118.125 78.875 50.1875 123.312 99.5 89.25 161.5 118 124.562 194.5 124.125 134.5 201.875 120.875 125.625 195 108.438 105.625 185.938 95.9375 93.125 186.312 95.5 102.375 199.125 94.9375 104.562 201.5 85.5625 84.9375 186.438 84.5625 74.5625 173.688 95.3125 75.375 159.5 101.438 64.875 133.5 95.6875 48.25 109.375 87.5 45.125 105.125 93.3125 67.9375 130.375 107.812 97.875 167.062 109.25 100.875 182.125 102.188 88.3125 182.062 105.312 92.875 190.938 110.062 100.5 193.312 99.5625 82.8125 168.438 83.3125 55 135.438 78.4375 46.375 122.562 88 65.6875 139.75 104.938 101.375 175.562 117.125 126.562 200.562 120.625 129.938 201.625 118.125 121.312 190.812 106.562 103.438 178.25 93.75 89.5625 175.75 93.6875 98.625 190.625 96.75 105.938 199.25 95 89.3125 182.375 98.625 71.375 153.562 104.062 61.4375 126.938 101.312 51.8125 110.125 92.8125 47.0625 107.625 88.1875 54.75 119.188 95.625 77.125 148.375 110.25 103.188 186.875 122.125 120.25 213.875 128 127.312 223.5 130.25 129.312 224.625 128.625 125.062 218.062 114 101.562 191.75 92.0625 68 153.125 84.875 59.125 137 95.875 82.1875 155.875 110.312 110.25 183.312 117.625 122.625 195.312 119.812 129.438 198.75 120.188 138.438 202.688 110.688 125.312 193.062 95.0625 96.75 177.562 92.1875 94.125 184.062 99.3125 101.875 193.562 105.375 86.6875 174.5 111.25 66.8125 141.438 109 56.3125 117.625 94.375 47.8125 108.125 83.5625 48.5625 113.875 85.3125 63 130.5 89 76.0625 150.625 93.8125 86.6875 177.75 106.062 104.688 208.562 114.062 116 223.25 114.312 115.562 222.25 114.438 112.75 215.938 104 93.3125 190.25 86.375 64.6875 151.875 86.625 67.5 144.25 103.312 99.4375 171.938 115.562 122.25 194.438 118.812 129.875 199.5 123.188 146.125 208.438 129.25 164.125 218.812 121.188 145.938 206.125 103.625 108.75 186.812 98.9375 102.125 192.5 100.5 103.938 197.125 97.6875 80.8125 170.25 100.562 59.25 135.125 106.062 56.25 118.25 103.125 60.1875 120.812 96.5625 67.4375 133.375 90.9375 71 140.812 83.9375 65.75 145.938 84 69.6875 170.125 97.3125 91.4375 205.438 113.625 114.625 225.125 124.688 128.375 226.875 122.875 121.625 209.125 102.375 87.6875 168.625 83.625 60.1875 138.438 89.3125 74.0625 150.625 107.25 107.562 182.312 116.375 125.25 197.875 118.562 135.312 203.562 127.562 158.562 217.125 138.562 174 222.562 128.938 146.75 199.938 107.875 107.625 179.062 104.812 106.812 191.375 108.75 111.688 199.5 103.062 85.0625 168.75 103.938 62.0625 132.375 117.188 69.0625 127.688 124.875 87.3125 147.188 113.25 88.375 155.438 88.6875 65.25 138 73.125 48.125 131.312 77 60.25 162.688 88.125 82.1875 202.312 95.75 92.6875 219.375 100.375 93.75 215.188 96.8125 82.5 188.125 82.5 58.875 147.125 75.5625 51.1875 131.75 88.625 77.0625 155.562 106.812 109.812 184.125 115.125 124.438 194.312 121.5 138.125 202.25 137.438 168.25 220.562 148.562 183.875 224.5 132.062 151 194.75 105.875 109.125 172.875 101.688 108.562 191.562 104.812 110.375 198.625 97.375 78.625 159.125 99.375 56.3125 120.938 117.188 67.75 120.125 122.938 79.625 133.375 101.125 64.5 127.5 72.5 36.875 107.188 60 25.5 102 63.25 35.5 123 77.75 59.9375 160.812 98.1875 88.125 195.188 104 92.6875 193.812 85.1875 63.5 152 66.25 37.0625 117.375 71.4375 47.4375 126.25 94.5 85.1875 159.812 115.188 118.5 184.188 124 131.375 190.5 132.625 147 199.312 150.188 182.375 223.062 155.938 196.625 232.375 131.938 155.375 204.062 101.75 103.625 174.75 95.5625 95.625 180.25 102.188 101.875 183.438 100.188 80.1875 151 100.812 59.1875 120.25 115.438 66.6875 119.875 125.188 78.375 128.375 111.188 68.25 123.125 84.25 44 107.438 67.6875 29.9375 100.875 68.9375 38.25 119.25 83 65 159.25 104.312 100.25 198.75 124.188 129.312 213.312 126.875 129.125 192.688 107.438 95.875 155.562 89.125 68.6875 140.125 90.25 74.0625 154.062 96.8125 86 166.312 99.3125 90.375 165.625 111.188 115.812 176.938 124.375 147.875 196.125 116.312 134.625 185.875 102.125 97.625 157.375 100.562 88.25 154.5 102.375 100.562 174.5 99.125 99.3125 173.938 88.5625 69.6875 138.062 81.625 42.125 106.188 94.75 47.0625 106.625 116.75 69 122.062 118.625 75.3125 126.938 95.125 56.3125 114.875 72.6875 37.125 107 71.1875 43.8125 128.938 84.5 70.625 172.562 100.875 99.9375 207.625 119.5 130.375 224 139.375 159.438 226.125 142.5 160.188 207 122.75 128.562 177.062 107.125 105.938 167.062 107.688 106.875 175.375 110.625 117 185.812 114.125 135.375 197.688 112.438 135.438 195.375 98.8125 100.438 171.5 91.5625 74.75 151.875 96 82.1875 154.688 99.3125 100.375 171.562 96.875 98.4375 169.062 86.5 65.4375 132.625 76.4375 35.6875 100.312 81.1875 36.125 97.5625 100.938 55.8125 111.438 114.562 71.9375 124.625 102.438 66.1875 126.688 80.5625 51.75 129.062 75.3125 56.4375 152.375 85.25 78.375 189.125 97.4375 99.4375 214.125 111.562 119.375 222.562 132.562 145.688 225.312 150.125 164.75 221.062 147.562 159.688 208.625 129.25 138.562 197.188 116.875 124.312 190.688 122.938 137.25 195.75 129.625 156.938 209.5 113.938 137.562 206.062 92.5 94.125 178.438 88.375 72.375 149.25 94 78.9375 145.75 99.6875 99.3125 169.938 99.4375 101.75 176.25 88.125 69.4375 140.188 77.375 38 103.188 80.4375 34.375 95.25 92.375 44.8125 102.188 96.25 50 107.5 85.1875 46.6875 114.25 74.8125 49.5 135.438 78.5 65.875 167.562 88.9375 84.8125 195 96.6875 98.6875 212.125 104.875 112.25 219.75 124.25 136.75 223.688 150.938 166.625 227 154.688 166.75 216.125 126.812 129.875 189.625 105.438 107.938 177.875 109.062 126.5 194.062 108.75 135.188 205.75 91.4375 102.5 188.5 81.625 71.1875 162.188 90.8125 73.3125 152.875 104.312 95.5625 165.312 110.188 117.312 184.438 103.062 108.812 175.625 85.3125 65.8125 132.562 72.0625 32.5 97.8125 73.8125 30.8125 92.875 84.0625 40.8125 99.375 84.4375 41.5625 100.938 70.3125 33.125 102.562 63.875 38.6875 125.25 76.1875 66.5625 169.688 91.625 94.0625 207.062 97.9375 105.062 220.75 99.8125 108.438 220.875 111.688 123.125 221.875 137.5 151.438 226.25 150.562 160.75 219.5 128.688 128.75 190.375 97.875 95.125 161.562 86.25 92.1875 157 83.25 88.4375 158.438 79 67.5625 147.25 78.3125 53.5 133.375 83.375 57.25 128.625 98 84.4375 148.375 113.688 120.938 182 107.938 116.312 175.312 88.625 71.625 128.812 85.1875 45.6875 103.188 96 50.1875 107.562 98.625 54.0625 112.062 87.5625 50.3125 118.062 77.0625 55.5 144.688 78.5625 74.3125 185.375 86.4375 91.75 212.812 92.8125 100.125 220.375 97.8125 105.375 221.5 102 110.812 222.188 109.125 120.312 222.5 126.062 139.438 223.25 143.625 155.562 218.125 139.625 145.188 201.125 113.875 111.812 183.5 89.25 80 172.438 80.4375 64.1875 159.5 84.375 63.9375 146.75 88.625 66.5625 139.688 89 66.25 137.25
#ifndef Graph__HH
#define Graph__HH
#include "matrix/BaseMatrix.hpp"
#include <boost/graph/graph_traits.hpp>
#include <boost/iterator/iterator_facade.hpp>
#include <boost/property_map/property_map.hpp>
#include <boost/graph/properties.hpp>
// Forward declaration
namespace pfabric {
template<typename M>
class Graph;
}
// traits for our Graph class