Skip to content

Commit

Permalink
Merge pull request #806 from epam/feature/520_std_map_simple_cycle_basis
Browse files Browse the repository at this point in the history
Issue #520: core: replace RedBlackMap in SimpleCycleBasis
  • Loading branch information
MysterionRise authored Oct 13, 2022
2 parents bb5a66c + 6c4c27c commit c4179fb
Show file tree
Hide file tree
Showing 2 changed files with 41 additions and 36 deletions.
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);
}

0 comments on commit c4179fb

Please sign in to comment.