Finish impl'ing reading a file

This commit is contained in:
John 2022-04-22 18:48:36 -05:00
parent aeeb33e699
commit 8234aca2e0
7 changed files with 79 additions and 49 deletions

View File

@ -1,23 +1,25 @@
class graph { class graph {
private:
int num_processes;
int num_resources;
int *resource_counts;
struct m{
int x, y;
std::vector<std::vector<int>> data;
} matrix; // Tell me, Mr. Anderson, what good is a phone call if you are unable to speak?
public: public:
// Constructors // Constructors
graph() {}
graph(const int processes, const int resources); graph(const int processes, const int resources);
// Destructors
~graph();
// Initializers: // Initializers:
void init(const int **data); void read(std::string filename);
// check functions: // check functions:
// is the graph... // is the graph...
bool reducible();// ? bool reducible();// ?
bool knotted();// ? bool knotted();// ?
struct m{
int x, y;
std::vector<std::vector<int>> data;
};
private:
int num_processes = 0;
int num_resources = 0;
std::vector<int> resource_counts;
struct m matrix; // Tell me, Mr. Anderson, what good is a phone call if you are unable to speak?
bool is_blocked(int process_id);
}; };

View File

@ -1,3 +0,0 @@
void read_file(std::string filename);

View File

@ -1,4 +1,5 @@
#include <cstdlib> #include <cstdlib>
#include <string>
#include <vector> #include <vector>
#include "graph.hpp" #include "graph.hpp"
@ -20,7 +21,3 @@ graph::graph (const int processes, const int resources) {
} }
} }
} }
graph::~graph() {
/* clean up..? */
}

View File

@ -1,4 +1,5 @@
#include <cstdlib> #include <cstdlib>
#include <string>
#include <vector> #include <vector>
#include "graph.hpp" #include "graph.hpp"

View File

@ -4,10 +4,10 @@
+-------------+---------+-----------------------+ +-------------+---------+-----------------------+
| Created 2022-04-16 | | Created 2022-04-16 |
+-----------------------------------------------+ */ +-----------------------------------------------+ */
#include <cstdio>
#include <string> #include <string>
#include <vector>
#include "graph.hpp" // Graph reduction/Knot detection, struct adjmatrix #include "graph.hpp" // Graph reduction/Knot detection, struct adjmatrix
#include "read_input.hpp" //TODO: Read input in the associated C file, and provide an interface to that function here
int main(int argc, char** argv) { int main(int argc, char** argv) {
// TODO: Grab file name from args // TODO: Grab file name from args
@ -15,9 +15,10 @@ int main(int argc, char** argv) {
//? Other flags? What other features should this have? //? Other flags? What other features should this have?
if (argc < 2) return 1; if (argc < 2) return 1;
std::string filename = argv[1]; std::string filename = argv[1];
graph g;
//TODO: Implement reading from a file //TODO: Implement reading from a file
read_file(filename); g.read(filename);
// TODO: Implement graph reduction and/or knot detection // TODO: Implement graph reduction and/or knot detection

View File

@ -1,51 +1,60 @@
//TODO: Include C file IO header (stdio.h? Whatever it is) //TODO: Include C file IO header (stdio.h? Whatever it is)
#include <iostream> #include <iostream>
#include <sstream>
#include <fstream> #include <fstream>
#include <string> #include <string>
#include <vector> #include <vector>
#include <regex> #include <regex>
#include "graph.hpp" // struct adjmatrix #include "graph.hpp"
#include "read_input.hpp" // read_input
#define MAX_LINE_LEN 1024 #define MAX_LINE_LEN 1024
// Vector of regices // Vector of regices
std::vector<std::regex> patterns = { std::vector<std::regex> patterns = {
//* A line starting with a % is a comment, and should be skipped //* A line starting with a % is a comment, and should be skipped
//* A blank line should be skipped //* A blank line should be skipped
//* A line starting with `num_processes=` contains the number of processes //* A line starting with `num_processes=` contains the number of processes
std::regex("^.*(num_processes)\\s*=\\s*(\\d+).*"), std::regex("^.*(num_processes)\\s*=\\s*(\\d+).*"),
//* A line starting with `num_resources=` contains the number of resources //* A line starting with `num_resources=` contains the number of resources
std::regex("^.*(num_resources)\\s*=\\s*(\\d+)"), std::regex("^.*(num_resources)\\s*=\\s*(\\d+)"),
//* A line containing comma-separated values should be returned as-is, for manual disassembly //* A line containing comma-separated values should be returned as-is, for manual disassembly
std::regex("^([0-9, ]+)") std::regex("^([\\-0-9, ]+)")}; // matches comma-separated space-separated signed decimal integers
};
// convert comma-separated string s to vector<int>
std::vector<int> stovi (const std::string &s);
// TODO: Implement reading from a file // TODO: Implement reading from a file
void read_file(std::string filename) { void graph::read(std::string filename) {
printf("graph::read(%s)\n", filename.c_str());
// Open file with name filename as read-only // Open file with name filename as read-only
std::fstream f; f.open(filename, f.in); std::fstream f; f.open(filename, f.in);
// TODO: Check for file IO errors (I might have a solution for that in another project)
int num_processes = 0, num_resources = 0; // TODO: Check for file IO errors (I might have a solution for that in another project)
std::vector<int> rescount;
std::vector<std::vector<int>> matrix;
std::string line; // Lines can be no more than 1KB in size, a sensible limitation std::string line; // Lines can be no more than 1KB in size, a sensible limitation
while (!f.eof()) { while (!f.eof()) {
std::getline (f, line); std::getline (f, line);
std::smatch res; std::smatch res;
// Iterate over each pattern, and grab the associated data // Iterate over each pattern, and grab the associated data
for (auto pattern: patterns) { for (auto pattern: patterns) {
if (std::regex_search (line, res, pattern)) { if (std::regex_search (line, res, pattern)) {
// get the pattern type, value // get the pattern type, value
std::string type = res.format("$1"), value = res.format("$2"); std::string type = res.format("$1"), value = res.format("$2");
// Handle the pattern
if (type == "num_processes") { num_processes = std::stoi(value); } else
if (type == "num_resources") { num_resources = std::stoi(value); } else
if (type.length()/2 <= num_resources) {
// This is the resource count structure
} // Handle the pattern
// If num_processes= matched, assign value to num_processes
if (type == "num_processes") { num_processes = std::stoi(value); } else
// If num_resources= matched, assign value to num_resources
if (type == "num_resources") { num_resources = std::stoi(value); } else
// If this line is a comma-separated list of numbers,
// and this is the first match, assign it to resource counts
if (!resource_counts.size()) { resource_counts = stovi(type); } else
// and this is a subsequent match, push it onto the matrix
{ matrix.data.push_back(stovi(type)); }
// If a pattern is matched, go to the next line and skip evaluating other patterns
break; break;
} }
} }
@ -54,5 +63,25 @@ void read_file(std::string filename) {
// Close file // Close file
f.close(); f.close();
// TODO: Check for file IO errors (Shouldn't be any) // TODO: Check for file IO errors (Shouldn't be any)
// print information about the graph
printf("np: %d\tnr: %d\n", num_processes, num_resources);
printf("resource_counts:\n"); for (auto e: resource_counts) printf("%d\t", e); printf("\n");
printf("matrix:\n"); for (auto x: matrix.data) {for (auto y: x) printf("%d\t", y); printf("\n");}
return; return;
} }
std::vector<int> stovi (const std::string &s) {
std::stringstream ss(s);
printf("%s\n", s.c_str());
size_t idx = 0;
std::vector<int> vi;
// reserve enough space for an entire string of one-character ints
vi.reserve((s.length()+1)/2);
while (!ss.eof()) {
char integer[16]; // " -WXXXYYYZZZ,"
ss.getline(integer, 16, ',');
vi.push_back(atoi( (const char* ) &integer));
}
return vi;
}

View File

@ -1,21 +1,24 @@
#include <cstdlib> #include <cstdlib>
#include <string>
#include <vector> #include <vector>
#include "graph.hpp" #include "graph.hpp"
/* reducible: /* reducible:
Perform the graph reduction algorithm on the adjacency matrix to detect deadlocks Perform the graph reduction algorithm on the adjacency matrix to detect deadlocks
This algorithm is described in section 5.2 of the Zybook This algorithm is described in section 5.2 of the Zybook
(!THIS MODIFIES THE GRAPH!)
@params: none, uses class-internal data @params: none, uses class-internal data
@returns: @returns:
bool: bool:
false if graph is not reducible (deadlock) true if graph is not reducible (deadlock)
true if graph is reducible (no deadlock) false if graph is reducible (no deadlock)
*/ */
bool graph::reducible() bool graph::reducible() {
{
// TODO: Implement a function which checks if a process is blocked // TODO: Implement a function which checks if a process is blocked
// TODO: Use that function to implement the graph reduction algorithm // TODO: Use that function to implement the graph reduction algorithm
//? Make sure when reducing the graph, you don't try to delete the //? Make sure when reducing the graph, you don't try to delete the
return false; return false;
}
bool graph::is_blocked(int process_id) {
return true;
} }