-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
1 parent
b212c53
commit 410a91c
Showing
8 changed files
with
193 additions
and
111 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,5 @@ | ||
build: | ||
cargo build --release | ||
|
||
run: | ||
./target/release/graph_lib_rust ${mode} ${target} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,72 @@ | ||
use crate::graph::vertex::{Vertex, VertexId}; | ||
use crate::graph::edge::Edge; | ||
use crate::graph::Graph; | ||
use std::collections::HashSet; | ||
|
||
pub struct DiGraph { | ||
vertices: Vec<Vertex>, | ||
edges: Vec<Edge>, | ||
strong_components: Vec<Vec<Vertex>>, | ||
} | ||
|
||
impl DiGraph { | ||
pub fn new(vertices: Vec<Vertex>, edges: Vec<Edge>) -> DiGraph { | ||
DiGraph { | ||
vertices, | ||
edges, | ||
strong_components: Vec::new(), | ||
} | ||
} | ||
|
||
fn search_forward(&self) -> Vec<Vertex> { | ||
let mut visited: HashSet<VertexId> = HashSet::new(); | ||
let mut vertex_stack: Vec<VertexId> = Vec::new(); | ||
for vertex in &self.vertices { | ||
if !visited.contains(&vertex.id()) { | ||
let connected: Vec<VertexId> = self.visit_forward(&mut visited, &mut vertex_stack, vertex); | ||
} | ||
}; | ||
|
||
println!("{:?}", vertex_stack); | ||
|
||
vertex_stack.iter().map(|&x| self.vertices[x].clone()).collect() | ||
} | ||
|
||
fn visit_forward(&self, visited: &mut HashSet<VertexId>, vertex_stack: &mut Vec<VertexId>, vertex: &Vertex) -> Vec<VertexId> { | ||
println!("Visit {}", vertex.id()); | ||
visited.insert(*vertex.id()); | ||
let mut connected = vec![*vertex.id()]; | ||
let neighbours: Vec<&Vertex> = self.get_neighbours(vertex); | ||
for neighbour in neighbours { | ||
if !visited.contains(neighbour.id()) { | ||
connected.append(&mut self.visit_forward(visited, vertex_stack, neighbour)) | ||
} | ||
}; | ||
vertex_stack.push(*vertex.id()); | ||
println!("Adding thing {} to stack", vertex.id()); | ||
connected | ||
} | ||
} | ||
|
||
impl Graph for DiGraph { | ||
fn get_vertices(&self) -> &Vec<Vertex> { | ||
&self.vertices | ||
} | ||
|
||
fn get_edges(&self) -> &Vec<Edge> { | ||
&self.edges | ||
} | ||
|
||
fn get_vertices_as_mut(&mut self) -> &mut Vec<Vertex> { | ||
&mut self.vertices | ||
} | ||
|
||
fn get_edges_as_mut(&mut self) -> &mut Vec<Edge> { | ||
&mut self.edges | ||
} | ||
|
||
fn find_strongly_connected_components(&self) -> () { | ||
|
||
self.search_forward(); | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,77 +1,97 @@ | ||
use std::collections::HashSet; | ||
use std::fs::File; | ||
use std::io; | ||
use std::io::{BufRead, BufReader}; | ||
use std::time::Instant; | ||
|
||
use crate::graph::edge::Edge; | ||
use crate::graph::private_graph::PrivateGraph; | ||
use crate::graph::ugraph::UndirectedGraph; | ||
use crate::graph::vertex::{Vertex, VertexId}; | ||
use crate::graph::vertex::{VertexId, Vertex}; | ||
use crate::graph::edge::{Edge, EdgeId}; | ||
use crate::graph::digraph::DiGraph; | ||
|
||
mod vertex; | ||
mod edge; | ||
|
||
pub mod ugraph; | ||
pub mod digraph; | ||
|
||
pub fn create_undirected_graph(file: File) -> UndirectedGraph { | ||
let now = Instant::now(); | ||
let graph: UndirectedGraph = Graph::new(&file); | ||
let mut graph: UndirectedGraph = UndirectedGraph::new(Vec::new(), Vec::new()); | ||
graph.read_from_file(&file); | ||
println!("{}", now.elapsed().as_micros()); | ||
|
||
graph | ||
} | ||
|
||
pub trait Graph { | ||
fn new(file: &File) -> Self; | ||
fn find_strong_connected_components(&self) -> (); | ||
pub fn create_directed_graph(file: File) -> DiGraph { | ||
let now = Instant::now(); | ||
let mut graph: DiGraph = DiGraph::new(Vec::new(), Vec::new()); | ||
graph.read_from_file(&file); | ||
println!("{}", now.elapsed().as_micros()); | ||
|
||
graph | ||
} | ||
|
||
mod private_graph { | ||
use crate::graph::edge::{Edge, EdgeId}; | ||
use crate::graph::vertex::{Vertex, VertexId}; | ||
pub trait Graph { | ||
fn read_from_file(&mut self, file: &File) -> () { | ||
let reader = BufReader::new(file); | ||
|
||
let mut first = true; | ||
for line in reader.lines().filter_map(io::Result::ok) { | ||
if first { | ||
let count: i32 = line.parse().unwrap(); | ||
for _ in 0..count { | ||
self.add_vertex(); | ||
} | ||
first = false; | ||
} else { | ||
let vertices = line.trim().split(' ').flat_map(str::parse::<VertexId>).collect::<Vec<_>>(); | ||
self.add_edge(vertices[0], vertices[1]); | ||
} | ||
} | ||
} | ||
fn add_vertex(&mut self) -> VertexId { | ||
let id = self.get_free_vertex_id(); | ||
let vertex = Vertex::new(id, Vec::new()); | ||
self.get_vertices_as_mut().push(vertex); | ||
|
||
pub trait PrivateGraph { | ||
fn get_vertices(&self) -> &Vec<Vertex>; | ||
fn get_edges(&self) -> &Vec<Edge>; | ||
id | ||
} | ||
|
||
fn get_vertices_as_mut(&mut self) -> &mut Vec<Vertex>; | ||
fn get_edges_as_mut(&mut self) -> &mut Vec<Edge>; | ||
fn add_edge(&mut self, vertex_a: VertexId, vertex_b: VertexId) -> EdgeId { | ||
let id = self.get_free_edge_id(); | ||
let edge = Edge::new(id, vertex_a, vertex_b); | ||
self.get_vertices_as_mut()[vertex_a].add_edge(id); | ||
self.get_vertices_as_mut()[vertex_b].add_edge(id); | ||
self.get_edges_as_mut().push(edge); | ||
|
||
fn get_free_vertex_id(&mut self) -> VertexId { | ||
self.get_vertices().len() as VertexId | ||
} | ||
id | ||
} | ||
|
||
fn get_free_edge_id(&mut self) -> EdgeId { | ||
self.get_edges().len() as EdgeId | ||
} | ||
fn get_free_vertex_id(&mut self) -> VertexId { | ||
self.get_vertices().len() as VertexId | ||
} | ||
|
||
fn get_neighbours(&self, vertex: &Vertex) -> Vec<&Vertex> { | ||
let neighbours: Vec<&Vertex> = vertex.edges() | ||
.iter() | ||
.map(|&x| self.get_edges()[x].get_other_vertex(*vertex.id())) | ||
.map(|&x| &self.get_vertices()[x]) | ||
.collect(); | ||
neighbours | ||
} | ||
fn get_free_edge_id(&mut self) -> EdgeId { | ||
self.get_edges().len() as EdgeId | ||
} | ||
|
||
fn add_vertex(&mut self) -> VertexId { | ||
let id = self.get_free_vertex_id(); | ||
let vertex = Vertex::new(id, Vec::new()); | ||
self.get_vertices_as_mut().push(vertex); | ||
fn get_vertices(&self) -> &Vec<Vertex>; | ||
fn get_edges(&self) -> &Vec<Edge>; | ||
|
||
id | ||
} | ||
fn get_vertices_as_mut(&mut self) -> &mut Vec<Vertex>; | ||
fn get_edges_as_mut(&mut self) -> &mut Vec<Edge>; | ||
|
||
fn add_edge(&mut self, vertex_a: VertexId, vertex_b: VertexId) -> EdgeId { | ||
let id = self.get_free_edge_id(); | ||
let edge = Edge::new(id, vertex_a, vertex_b); | ||
self.get_vertices_as_mut()[vertex_a].add_edge(id); | ||
self.get_vertices_as_mut()[vertex_b].add_edge(id); | ||
self.get_edges_as_mut().push(edge); | ||
|
||
id | ||
} | ||
fn get_neighbours(&self, vertex: &Vertex) -> Vec<&Vertex> { | ||
let neighbours: Vec<&Vertex> = vertex.edges() | ||
.iter() | ||
.map(|&x| self.get_edges()[x].get_other_vertex(*vertex.id())) | ||
.map(|&x| &self.get_vertices()[x]) | ||
.collect(); | ||
neighbours | ||
} | ||
|
||
fn find_strongly_connected_components(&self) -> (); | ||
} | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.