Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Issue #520: core: replace RedBlackMap in SimpleCycleBasis #806

Merged
merged 1 commit into from
Oct 13, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
22 changes: 13 additions & 9 deletions core/indigo-core/graph/simple_cycle_basis.h
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,8 @@
#ifndef _SIMPLE_CYCLE_BASIS_H
#define _SIMPLE_CYCLE_BASIS_H

#include <map>

#include "base_cpp/array.h"
#include "base_cpp/obj_array.h"
#include "base_cpp/red_black.h"
Expand Down Expand Up @@ -56,10 +58,10 @@ namespace indigo

void _prepareSubgraph(Graph& subgraph);

RedBlackMap<int, int> vertices_spanning_tree;
std::map<int, int> vertices_spanning_tree;

RedBlackMap<int, int> spanning_tree_vertices;
RedBlackMap<int, int> _edgeIndexMap;
std::map<int, int> spanning_tree_vertices;
std::map<int, int> _edgeIndexMap;

const Graph& _graph;

Expand All @@ -72,20 +74,22 @@ namespace indigo
{

// graph to aux. graph
RedBlackMap<int, int> _vertexMap0;
RedBlackMap<int, int> _vertexMap1;
std::map<int, int> _vertexMap0;
std::map<int, int> _vertexMap1;

RedBlackMap<int, int> _auxVertexMap;
std::map<int, int> _auxVertexMap;

// aux. edge to edge
RedBlackMap<int, int> _auxEdgeMap;
std::map<int, int> _auxEdgeMap;

const Graph& _graph;
Array<bool>& _u;
RedBlackMap<int, int>& _edgeIndexMap;
std::map<int, int>& _edgeIndexMap;

int _findOrCreateVertex(std::map<int, int>& vertexMap, int vertex);

public:
AuxiliaryGraph(const Graph& graph, Array<bool>& u, RedBlackMap<int, int>& edgeIndexMap) : _graph(graph), _u(u), _edgeIndexMap(edgeIndexMap)
AuxiliaryGraph(const Graph& graph, Array<bool>& u, std::map<int, int>& edgeIndexMap) : _graph(graph), _u(u), _edgeIndexMap(edgeIndexMap)
{
}

Expand Down
55 changes: 28 additions & 27 deletions core/indigo-core/graph/src/simple_cycle_basis.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -71,8 +71,8 @@ void SimpleCycleBasis::create()

int new_vertex = spanning_tree.addVertex();

vertices_spanning_tree.insert(current_vertex, new_vertex);
spanning_tree_vertices.insert(new_vertex, current_vertex);
vertices_spanning_tree.emplace(current_vertex, new_vertex);
spanning_tree_vertices.emplace(new_vertex, current_vertex);

vertex_queue.push(current_vertex);

Expand Down Expand Up @@ -101,18 +101,18 @@ void SimpleCycleBasis::create()

int next_vertex = subgraph.getEdge(edge).findOtherEnd(current_vertex);

if (!vertices_spanning_tree.find(next_vertex))
if (vertices_spanning_tree.find(next_vertex) == vertices_spanning_tree.end())
{
// tree edge

tree_edges.push(edge);

int new_vertex = spanning_tree.addVertex();
vertices_spanning_tree.insert(next_vertex, new_vertex);
spanning_tree_vertices.insert(new_vertex, next_vertex);
vertices_spanning_tree.emplace(next_vertex, new_vertex);
spanning_tree_vertices.emplace(new_vertex, next_vertex);

// create a new (directed) Edge object (as explained above)
spanning_tree.addEdge(vertices_spanning_tree.at(current_vertex), vertices_spanning_tree.at(next_vertex));
spanning_tree.addEdge(vertices_spanning_tree.at(current_vertex), new_vertex);

// add the next vertex to the BFS-FIFO
vertex_queue.push(next_vertex);
Expand Down Expand Up @@ -369,7 +369,7 @@ void SimpleCycleBasis::_createEdgeIndexMap()
_edgeIndexMap.clear();
for (int i = 0; i < _edgeList.size(); ++i)
{
_edgeIndexMap.insert(_edgeList[i], i);
_edgeIndexMap.emplace(_edgeList[i], i);
}
}

Expand Down Expand Up @@ -427,28 +427,29 @@ void SimpleCycleBasis::_prepareSubgraph(Graph& subgraph)
}
}

int AuxiliaryGraph::auxVertex0(int vertex)
int AuxiliaryGraph::_findOrCreateVertex(std::map<int, int>& vertexMap, int vertex)
{
if (!_vertexMap0.find(vertex))
const auto it = vertexMap.find(vertex);
if (it != vertexMap.end())
{
int newVertex0 = addVertex();
_vertexMap0.insert(vertex, newVertex0);
_auxVertexMap.insert(newVertex0, vertex);
return newVertex0;
return it->second;
}
return _vertexMap0.at(vertex);

int newVertex = addVertex();
vertexMap.emplace(vertex, newVertex);
_auxVertexMap.emplace(newVertex, vertex);

return newVertex;
}

int AuxiliaryGraph::auxVertex0(int vertex)
{
return _findOrCreateVertex(_vertexMap0, vertex);
}

int AuxiliaryGraph::auxVertex1(int vertex)
{
if (!_vertexMap1.find(vertex))
{
int newVertex1 = addVertex();
_vertexMap1.insert(vertex, newVertex1);
_auxVertexMap.insert(newVertex1, vertex);
return newVertex1;
}
return _vertexMap1.at(vertex);
return _findOrCreateVertex(_vertexMap1, vertex);
}

const Vertex& AuxiliaryGraph::getVertexAndBuild(int auxVertex)
Expand All @@ -472,7 +473,7 @@ const Vertex& AuxiliaryGraph::getVertexAndBuild(int auxVertex)
if (ex_aux_edge == -1)
{
int auxEdge = addEdge(vertex1u, vertex2u);
_auxEdgeMap.insert(auxEdge, edge);
_auxEdgeMap.emplace(auxEdge, edge);
}

vertex1u = auxVertex1(vertex1);
Expand All @@ -482,7 +483,7 @@ const Vertex& AuxiliaryGraph::getVertexAndBuild(int auxVertex)
if (ex_aux_edge == -1)
{
int auxEdge = addEdge(vertex1u, vertex2u);
_auxEdgeMap.insert(auxEdge, edge);
_auxEdgeMap.emplace(auxEdge, edge);
}
}
else
Expand All @@ -493,7 +494,7 @@ const Vertex& AuxiliaryGraph::getVertexAndBuild(int auxVertex)
if (ex_aux_edge == -1)
{
int auxEdge = addEdge(vertex1u, vertex2u);
_auxEdgeMap.insert(auxEdge, edge);
_auxEdgeMap.emplace(auxEdge, edge);
}

vertex1u = auxVertex1(vertex1);
Expand All @@ -502,7 +503,7 @@ const Vertex& AuxiliaryGraph::getVertexAndBuild(int auxVertex)
if (ex_aux_edge == -1)
{
int auxEdge = addEdge(vertex1u, vertex2u);
_auxEdgeMap.insert(auxEdge, edge);
_auxEdgeMap.emplace(auxEdge, edge);
}
}
}
Expand All @@ -512,5 +513,5 @@ const Vertex& AuxiliaryGraph::getVertexAndBuild(int auxVertex)

int AuxiliaryGraph::edge(int auxEdge)
{
return _auxEdgeMap.value(auxEdge);
return _auxEdgeMap.at(auxEdge);
}