forked from greedythib/CME212-2020
-
Notifications
You must be signed in to change notification settings - Fork 0
/
subgraph.cpp
130 lines (109 loc) · 3.99 KB
/
subgraph.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
/**
* @file subgraph.cpp
* Test script for viewing a subgraph from our Graph
*
* @brief Reads in two files specified on the command line.
* First file: 3D Points (one per line) defined by three doubles
* Second file: Tetrahedra (one per line) defined by 4 indices into the point
* list
*/
#include <fstream>
#include <iterator>
#include "CME212/SFML_Viewer.hpp"
#include "CME212/Util.hpp"
#include "Graph.hpp"
/** An iterator that skips over elements of another iterator based on whether
* those elements satisfy a predicate.
*
* Given an iterator range [@a first, @a last) and a predicate @a pred,
* this iterator models a filtered range such that all i with
* @a first <= i < @a last and @a pred(*i) appear in order of the original range.
*/
template <typename Pred, typename It>
class filter_iterator : private equality_comparable<filter_iterator<Pred,It>>
{
public:
// Get all of the iterator traits and make them our own
using value_type = typename std::iterator_traits<It>::value_type;
using pointer = typename std::iterator_traits<It>::pointer;
using reference = typename std::iterator_traits<It>::reference;
using difference_type = typename std::iterator_traits<It>::difference_type;
using iterator_category = typename std::input_iterator_tag;
// Constructor
filter_iterator(const Pred& p, const It& first, const It& last)
: p_(p), it_(first), end_(last) {
// HW1 #4: YOUR CODE HERE
}
// HW1 #4: YOUR CODE HERE
// Supply definitions AND SPECIFICATIONS for:
// value_type operator*() const;
// filter_iterator& operator++();
// bool operator==(const self_type&) const;
private:
Pred p_;
It it_;
It end_;
};
/** Helper function for constructing filter_iterators. This deduces the type of
* the predicate function and the iterator so the user doesn't have to write it.
* This also allows the use of lambda functions as predicates.
*
* Usage:
* // Construct an iterator that filters odd values out and keeps even values.
* std::vector<int> a = ...;
* auto it = make_filtered(a.begin(), a.end(), [](int k) {return k % 2 == 0;});
*/
template <typename Pred, typename Iter>
filter_iterator<Pred,Iter> make_filtered(const Iter& it, const Iter& end,
const Pred& p) {
return filter_iterator<Pred,Iter>(p, it, end);
}
// HW1 #4: YOUR CODE HERE
// Specify and write an interesting predicate on the nodes.
// Explain what your predicate is intended to do and test it.
// If you'd like you may create new nodes and tets files.
/** Test predicate for HW1 #4 */
struct SlicePredicate {
template <typename NODE>
bool operator()(const NODE& n) {
return n.position().x < 0;
}
};
int main(int argc, char** argv)
{
// Check arguments
if (argc < 3) {
std::cerr << "Usage: " << argv[0] << " NODES_FILE TETS_FILE\n";
exit(1);
}
// Define our types
using GraphType = Graph<int>;
using NodeType = typename GraphType::node_type;
// Construct a Graph
GraphType graph;
std::vector<NodeType> nodes;
// Create a nodes_file from the first input argument
std::ifstream nodes_file(argv[1]);
// Interpret each line of the nodes_file as a 3D Point and add to the Graph
Point p;
while (CME212::getline_parsed(nodes_file, p))
nodes.push_back(graph.add_node(p));
// Create a tets_file from the second input argument
std::ifstream tets_file(argv[2]);
// Interpret each line of the tets_file as four ints which refer to nodes
std::array<int,4> t;
while (CME212::getline_parsed(tets_file, t))
for (unsigned i = 1; i < t.size(); ++i)
for (unsigned j = 0; j < i; ++j)
graph.add_edge(nodes[t[i]], nodes[t[j]]);
// Print out the stats
std::cout << graph.num_nodes() << " " << graph.num_edges() << std::endl;
// Launch the SFML_Viewer
CME212::SFML_Viewer viewer;
// HW1 #4: YOUR CODE HERE
// Use the filter_iterator to plot an induced subgraph.
// Center the view and enter the event loop for interactivity
viewer.center_view();
viewer.event_loop();
return 0;
}