C++ API

class BaseNode
#include <base_node.h>

Base class for all vertex property classes in the GHL.

BaseNode provides core functionality for vertex properties, including:

  • Unique identification through ID management

  • Cloning capability for graph operations

  • GraphViz attribute generation for visualization

  • Optional serialization support

This class is designed to be inherited from when creating custom vertex property types. See the City class in examples/city.h for an example of proper inheritance and extension.

Public Functions

inline explicit BaseNode(int id = -1)

Constructs a BaseNode with the specified ID.

Parameters:

id – The unique identifier for the node. Defaults to -1 if not specified.

inline virtual std::shared_ptr<BaseNode> clone()

Creates a clone of the node.

This virtual method enables polymorphic cloning of nodes, which is essential for graph operations that require copying vertices.

Returns:

std::shared_ptr<BaseNode> A smart pointer to a new instance with the same properties.

virtual ~BaseNode() = default

Virtual destructor to ensure proper cleanup of derived classes.

inline int id() const

Gets the node’s ID.

Returns:

The unique identifier of the node.

inline void id(int id)

Sets the node’s ID.

Parameters:

id – The new unique identifier for the node.

inline bool operator==(const BaseNode &other) const

Equality comparison operator.

Nodes are considered equal if they have the same ID. This is used in graph algorithms that need to compare vertices.

Parameters:

other – The node to compare with.

Returns:

true if the nodes have the same ID, false otherwise.

inline virtual std::map<std::string, std::string, std::less<>> graphAttributes()

Generates GraphViz attributes for visualization.

This virtual method can be overridden by derived classes to customize the appearance of nodes in GraphViz output. The base implementation provides a simple label with the node’s ID.

Returns:

A map of GraphViz attribute names to values.

Private Members

int id_ = INT_MIN
template<class T>
class construct
struct edge_comp_helper

Helper struct for edge comparison during isomorphism detection.

Public Functions

inline edge_comp_helper(const GraphType &G1, const GraphType &G2, EdgeCompFunction ecf)
inline bool operator()(const TemplatedEdge e1, const TemplatedEdge e2) const

Public Members

const GraphType &G1_
const GraphType &G2_
EdgeCompFunction ecf_
template<typename VertexProperties, typename EdgeProperties = b::no_property>
struct EdgeReplacementStruct
#include <graph.h>

Represents the replacement of an edge in a graph.

Template Parameters:
  • VertexProperties – Properties associated with vertices.

  • EdgeProperties – Properties associated with edges (default: boost::no_property).

template<typename VertexProperties, typename EdgeProperties = b::no_property>
class ExtendedGraph
#include <graph.h>

A wrapper class around a Boost graph providing extended functionality.

Template Parameters:
  • VertexProperties – Properties associated with vertices.

  • EdgeProperties – Properties associated with edges (default: boost::no_property).

Public Types

using GraphType = Graph<VertexProperties, EdgeProperties>
using TemplatedVertex = Vertex<VertexProperties, EdgeProperties>
using TemplatedEdge = Edge<VertexProperties, EdgeProperties>
using IsoMap = std::map<TemplatedVertex, std::vector<TemplatedVertex>>
using TemplatedEdgeReplacementStruct = EdgeReplacementStruct<VertexProperties, EdgeProperties>

Public Functions

ExtendedGraph() = default

Default constructor.

inline explicit ExtendedGraph(GraphType graph)

Constructor initializing the graph with a given Boost graph instance.

Parameters:

graph – The Boost graph instance to initialize with.

virtual ~ExtendedGraph() = default

Virtual destructor.

inline GraphType &graph()

Accessor for the internal graph.

Returns:

A reference to the internal graph instance.

inline const GraphType &graph() const

Const accessor for the internal graph.

Returns:

A reference to the internal graph instance.

inline TemplatedVertex add_vertex(VertexProperties v = VertexProperties())

Adds a vertex to the graph.

Parameters:

v – The properties of the vertex to add (default constructed if not provided).

Returns:

The descriptor of the newly added vertex.

inline TemplatedEdge add_edge(TemplatedVertex src, TemplatedVertex trg, EdgeProperties e = EdgeProperties())

Adds an edge between two vertices in the graph.

Parameters:
  • src – The source vertex of the edge.

  • trg – The target vertex of the edge.

  • e – The properties of the edge to add (default constructed if not provided).

Returns:

The descriptor of the newly added edge.

inline TemplatedVertex edge_source(TemplatedEdge e) const

Retrieves the source vertex of a given edge.

Parameters:

e – The edge descriptor.

Returns:

The descriptor of the source vertex.

inline TemplatedVertex edge_target(TemplatedEdge e) const

Retrieves the target vertex of a given edge.

Parameters:

e – The edge descriptor.

Returns:

The descriptor of the target vertex.

inline b::iterator_range<typename GraphType::vertex_iterator> vertex_range() const

Provides a range of all vertices in the graph.

Returns:

An iterator range of all vertices in the graph.

inline b::iterator_range<typename GraphType::edge_iterator> edge_range() const

Provides a range of all edges in the graph.

Returns:

An iterator range of all edges in the graph.

inline VertexProperties &operator[](const TemplatedVertex &v)

Accesses the properties of a vertex.

Parameters:

v – The vertex descriptor.

Returns:

A reference to the properties of the specified vertex.

inline const VertexProperties &operator[](const TemplatedVertex &v) const

Accesses the properties of a vertex (const).

Parameters:

v – The vertex descriptor.

Returns:

A reference to the properties of the specified vertex.

inline EdgeProperties &operator[](const TemplatedEdge &e)

Accesses the properties of an edge.

Parameters:

e – The edge descriptor.

Returns:

A reference to the properties of the specified edge.

inline const EdgeProperties &operator[](const TemplatedEdge &e) const

Accesses the properties of an edge (const).

Parameters:

e – The edge descriptor.

Returns:

A reference to the properties of the specified edge.

inline bool is_vertex_in_isomorphism(const TemplatedVertex &vertex, const IsoMap &isomorphism) const

Checks if a vertex exists in the isomorphism map.

Parameters:
  • vertex – The vertex to check.

  • isomorphism – The isomorphism map containing vertices.

Returns:

True if the vertex exists in the isomorphism map, false otherwise.

inline void print_dfs_graph() const

Performs a depth-first search (DFS) on the graph and prints events.

This function uses a custom DFS visitor to print initialization, start, discovery, and finish events for each vertex during the traversal.

inline void write_graph(const std::string &filename, bool render_pdf = true)
inline TemplatedVertex duplicate_vertex(int id_to_duplicate, CloneVertexFunction<VertexProperties> cvf, ModifyVertexPairFunction<VertexProperties> mvpf)

Duplicates a vertex in the graph, along with its edges.

Parameters:
  • id_to_duplicate – The ID of the vertex to duplicate.

  • cvf – A function to clone the properties of the vertex.

  • mvpf – A function to modify the pair of original and duplicated vertices.

Returns:

The descriptor of the newly duplicated vertex.

inline void add_vertex_after_vertex(TemplatedVertex v, const VertexProperties &new_vertex_properties)

Adds a vertex after a specified vertex and adjusts edges accordingly.

Parameters:
  • v – The vertex after which the new vertex will be added.

  • new_vertex_properties – The properties of the new vertex to add.

template<typename Predicate>
inline void add_vertex_after_pred(Predicate pred, const VertexProperties &new_vertex_properties)

Adds a vertex after vertices that satisfy a given predicate.

Template Parameters:

Predicate – A callable that takes vertex properties and returns true if the vertex matches the criteria.

Parameters:
  • pred – The predicate function to filter vertices.

  • new_vertex_properties – The properties of the new vertex to add.

template<typename Predicate>
inline void remove_vertex_pred(Predicate pred)
inline void add_vertex_before_vertex(TemplatedVertex v, const VertexProperties &new_vertex_properties)
template<typename Predicate>
inline void add_vertex_before_pred(Predicate pred, const VertexProperties &new_vertex_properties)
inline void merge_vertices(TemplatedVertex v1, TemplatedVertex v2, std::function<bool(TemplatedVertex, TemplatedVertex)> can_merge)

Merges two vertices in the graph if they satisfy a given condition.

This function attempts to merge two specified vertices (v1 and v2). The vertices are merged by redirecting all in-edges and out-edges of v2 to v1 and then removing v2 from the graph. The merge only occurs if the provided ‘canMerge’ predicate returns true for the two vertices.

Parameters:
  • v1 – The first vertex to be merged.

  • v2 – The second vertex to be merged into the first.

  • can_merge – A predicate that takes two vertices and returns true if they can be merged.

inline std::set<TemplatedVertex, std::greater<>> replace_subgraph(const GraphType &ng, IsoMap &isomorphism, std::optional<std::function<void(std::vector<TemplatedEdgeReplacementStruct>, std::vector<TemplatedEdgeReplacementStruct>, std::vector<TemplatedVertex>, std::vector<TemplatedVertex>, GraphType&)>> reconnect_edges = std::nullopt)
inline void fix_vertex_obj_ids()

Reassign the IDs of nodes to match their indices in the graph. This might be necessary after mutations in the graph. Applying isomorphisms calls this transparently already.

inline virtual void vertex_property_writer(std::ostream &out, const TemplatedVertex &v) const

Extension point for [write_graph]. Write the attributes of the vertex in dot format to the output stream.

inline virtual void edge_property_writer(std::ostream &out, const TemplatedEdge&) const

Extension point for [write_graph]. Write the attributes of the edge in dot format to the output stream.

inline void set_base_graph(const GraphType &g)

Public Members

int curr_graph = 0

Writes the graph to a DOT file and optionally renders it as a PDF. This is not const as instances of this class keep an internal counter of the emitted graphs, and prefix it to the file name so that file names reflect the ordering of calls to this method.

Param filename:

The base filename (without extension) for the output files.

Param render_pdf:

If true, renders the DOT file to a PDF.

Protected Attributes

Graph<VertexProperties, EdgeProperties> graph_ = {}
template<typename VertexProperties, typename EdgeProperties = b::no_property>
class ExtendedSubGraph
#include <subgraph.h>

Extends graph functionality with subgraph operations.

This class provides support for creating and managing subgraphs within a larger graph structure. It includes functionality for:

  • Managing vertex and edge properties with GraphViz attributes

  • Creating and tracking hierarchical subgraph relationships

  • Maintaining consistent vertex object IDs across the graph hierarchy

  • Generating visual representations through GraphViz

Template Parameters:
  • VertexProperties – The type of properties stored in vertices.

  • EdgeProperties – The type of properties stored in edges (defaults to boost::no_property).

Public Types

using GraphType = b::subgraph<UnderlyingGraph>

Type alias for the graph implementation.

using Vertex = b::graph_traits<GraphType>::vertex_descriptor

Type alias for vertex descriptors.

using Edge = b::graph_traits<GraphType>::edge_descriptor

Type alias for edge descriptors.

Public Functions

inline GraphType &graph()

Accesses the underlying graph instance.

Returns:

Reference to the underlying graph.

inline const GraphType &graph() const

Accesses the underlying graph instance (const version).

Returns:

Const reference to the underlying graph.

inline std::pair<Vertex, Vertex> add_vertex(VertexProperties v, GraphType &subgraph)

Creates a vertex in both global and subgraph contexts.

Creates a vertex with the specified properties in both the global graph and the provided subgraph. The vertex’s GraphViz attributes are initialized based on the vertex properties.

Parameters:
  • v – Properties to assign to the new vertex

  • subgraph – The subgraph to add the vertex to

Returns:

A pair containing the global and local vertex descriptors

inline Vertex add_vertex(VertexProperties v = VertexProperties())

Creates a vertex in the global graph.

Parameters:

v – Properties to assign to the new vertex (default constructed if not provided)

Returns:

The descriptor of the newly created vertex

inline std::pair<Vertex, Vertex> add_vertex(GraphType &subgraph)

Creates a vertex with default properties in both contexts.

Creates a vertex with default-constructed properties in both the global graph and specified subgraph.

Parameters:

subgraph – The subgraph to add the vertex to

Returns:

A pair containing the global and local vertex descriptors

inline std::pair<Edge, bool> add_edge(Vertex source, Vertex target, EdgeProperties e, GraphType &subgraph)

Creates an edge with properties in a specific graph context.

Adds an edge between specified vertices with associated properties. The edge is created in the specified graph context and its GraphViz attributes are initialized.

Parameters:
  • source – Source vertex descriptor

  • target – Target vertex descriptor

  • e – Properties to assign to the new edge

  • subgraph – The graph or subgraph to add the edge to

Returns:

A pair containing the edge descriptor and a boolean indicating success

inline std::pair<Edge, bool> add_edge(Vertex source, Vertex target, EdgeProperties e = EdgeProperties())

Creates an edge with properties in the global graph.

Parameters:
  • source – Source vertex descriptor

  • target – Target vertex descriptor

  • e – Properties to assign to the new edge (default constructed if not provided)

Returns:

A pair containing the edge descriptor and a boolean indicating success

inline std::pair<Edge, bool> add_edge(Vertex source, Vertex target, GraphType &subgraph)

Creates an edge with default properties in a specific graph context.

Creates an edge with default-constructed properties between specified vertices in the given graph context.

Parameters:
  • source – Source vertex descriptor

  • target – Target vertex descriptor

  • subgraph – The graph or subgraph to add the edge to

Returns:

A pair containing the edge descriptor and a boolean indicating success

inline GraphType &add_subgraph(GraphType &curr_graph, const std::string &name)

Creates a new subgraph within the current graph.

Creates and initializes a new subgraph with the given name, setting up appropriate GraphViz attributes for visualization.

Parameters:
  • curr_graph – The parent graph to create the subgraph in.

  • name – The name to assign to the new subgraph.

Returns:

Reference to the newly created subgraph.

inline GraphType &add_subgraph(const std::string &name)
inline GraphType &operator[](const std::string &name)

Accesses a subgraph by name.

Retrieves a reference to a previously created subgraph using its assigned name. Throws std::out_of_range if the subgraph doesn’t exist.

Parameters:

name – The name of the subgraph to retrieve

Throws:

std::out_of_range – if no subgraph exists with the given name

Returns:

Reference to the requested subgraph

inline void update_graph_attributes()

Updates GraphViz attributes for all vertices.

Refreshes the GraphViz attributes for each vertex in the graph by calling their graphAttributes() method. This is useful after modifying vertex properties that affect visualization.

inline void fix_id_vertices()

Updates vertex object IDs to match their position in the graph.

Iterates through all vertices and sets their internal ID to match their vertex descriptor value, ensuring consistent identification across the graph.

Pre:

The graph must not be empty and vertices must have an ‘id’ member.

inline void write_graph(const std::string &filename)

Writes the graph to GraphViz format files.

Generates both a DOT file and a PDF visualization of the graph using GraphViz.

Parameters:

filename – Base name for the output files (without extension).

Private Types

using GraphvizAttributes = std::map<std::string, std::string, std::less<>>

Type alias for GraphViz attribute maps.

using ExtendedVertexProperties = b::property<b::vertex_attribute_t, GraphvizAttributes, VertexProperties>

Type for vertex properties extended with GraphViz attributes.

using ExtendedEdgeProperties = b::property<b::edge_index_t, int, b::property<b::edge_attribute_t, GraphvizAttributes, EdgeProperties>>

Type for edge properties extended with GraphViz attributes and indices.

using UnderlyingGraph = b::adjacency_list<b::vecS, b::vecS, b::bidirectionalS, ExtendedVertexProperties, ExtendedEdgeProperties, b::property<b::graph_name_t, std::string, b::property<b::graph_graph_attribute_t, GraphvizAttributes, b::property<b::graph_vertex_attribute_t, GraphvizAttributes, b::property<b::graph_edge_attribute_t, GraphvizAttributes>>>>>

Type definition for the underlying graph structure.

Combines the extended property types with Boost’s adjacency list and adds graph-level attributes for GraphViz visualization.

Private Members

b::subgraph<UnderlyingGraph> graph_

The underlying Boost subgraph instance.

std::map<std::string, b::subgraph<UnderlyingGraph>*> subgraphs_

Maps subgraphs to their names.

template<typename T, typename U = b::no_property>
struct generic_edge_descriptor
#include <graph.h>

Descriptor for defining an edge in the graph.

Template Parameters:
  • T – The type of the vertex identifier.

  • U – The type of the edge properties (default: boost::no_property).

Public Members

T in_
T out_
U properties_
template<class T>
struct is_shared_ptr : public std::false_type
#include <subgraph.h>
template<class T>
struct is_shared_ptr<std::shared_ptr<T>> : public std::true_type
#include <subgraph.h>
template<typename VertexProperties, typename EdgeProperties = boost::no_property>
class Isomorphism

Base class for implementing graph isomorphism operations.

This class provides the framework for defining and discovering graph isomorphisms, as well as applying transformations based on discovered isomorphisms. It can be extended to implement specific isomorphism patterns and transformations.

See also

examples/02_isomorphism.cpp for usage examples.

Template Parameters:
  • VertexProperties – The type of vertex properties in the graph.

  • EdgeProperties – The type of edge properties in the graph (defaults to boost::no_property).

Public Types

using GraphType = Graph<VertexProperties, EdgeProperties>
using TemplatedVertex = Vertex<VertexProperties, EdgeProperties>
using TemplatedEdge = Edge<VertexProperties, EdgeProperties>
using IsoMap = std::map<TemplatedVertex, std::vector<TemplatedVertex>>
using SpecializeIsoFunction = std::function<IsoMap(const GraphType &graph, const IsoMap &isomorphism)>

Function type for specializing discovered isomorphisms.

using VertexCompFunction = std::function<bool(const GraphType &G1, const GraphType &G2, const TemplatedVertex v1, const TemplatedVertex v2)>

Function type for comparing vertices during isomorphism detection.

using EdgeCompFunction = std::function<bool(const GraphType &G1, const GraphType &G2, const TemplatedEdge e1, const TemplatedEdge e2)>

Function type for comparing edges during isomorphism detection.

using IsIsomorphismValidFunction = std::function<bool(const GraphType &graph, const IsoMap &isomorphism)>

Function type for validating discovered isomorphisms.

using ConstructDesiredGraphFunction = std::function<GraphType(GraphType input_graph)>

Function type for constructing the desired graph after transformation.

using TemplatedEdgeReplacementStruct = EdgeReplacementStruct<VertexProperties, EdgeProperties>
using ReconstructEdgesFunction = std::optional<std::function<void(std::vector<TemplatedEdgeReplacementStruct>, std::vector<TemplatedEdgeReplacementStruct>, std::vector<TemplatedVertex>, std::vector<TemplatedVertex>, GraphType&)>>

Optional function type for reconstructing edges after transformation.

using InPlaceUpdateFunction = std::optional<std::function<void(GraphType&, const IsoMap&)>>

Optional function type for in-place graph updates.

Public Functions

inline explicit Isomorphism(GraphType input_graph)

Constructs an Isomorphism instance with the given input graph.

Parameters:

input_graph – The graph to search for isomorphisms in.

virtual ~Isomorphism() = default
inline void reset_input_graph()

Resets the working graph to the original input graph.

inline virtual VertexCompFunction vertex_comp_function()

Virtual function defining vertex comparison criteria.

Returns:

Function object for comparing vertices.

inline virtual EdgeCompFunction edge_comp_function()

Virtual function defining edge comparison criteria.

Returns:

Function object for comparing edges.

inline virtual bool is_isomorphism_valid(const GraphType &graph, const IsoMap &isomorphism)

Virtual function for validating discovered isomorphisms.

Parameters:
  • graph – The graph containing the isomorphism.

  • isomorphism – The discovered isomorphism mapping.

Returns:

true if the isomorphism is valid, false otherwise.

inline virtual IsoMap specialize_isomorphism(const GraphType &graph, const IsoMap &isomorphism)

Virtual function for specializing discovered isomorphisms.

This function can modify or extend the discovered isomorphism mapping before validation.

Parameters:
  • graph – The graph containing the isomorphism.

  • isomorphism – The discovered isomorphism mapping.

Returns:

The specialized isomorphism mapping.

inline virtual GraphType construct_desired_graph(const GraphType &input_graph, IsoMap &isomorphism)

Virtual function for constructing the transformed graph.

Parameters:
  • input_graph – The original graph to transform.

  • isomorphism – The isomorphism mapping guiding the transformation.

Returns:

The transformed graph.

inline virtual ReconstructEdgesFunction reconstruct_edges_function()

Virtual function providing edge reconstruction rules.

Returns:

Optional function for reconstructing edges after transformation.

inline virtual InPlaceUpdateFunction inplace_update_function()

Virtual function providing in-place update rules.

Returns:

Optional function for updating the graph in place.

inline virtual std::vector<IsoMap> discover(GraphType &sg, const GraphType &g, bool first, bool nonoverlapping = false, bool use_vf3 = true, IsIsomorphismValidFunction is_isomorphism_valid_ = nullptr, SpecializeIsoFunction specialize_isomorphism_ = nullptr)

Discovers isomorphisms in the graph matching the defined criteria.

This function uses Boost to find subgraph isomorphisms, then applies specialization and validation as defined by the derived class.

Parameters:
  • sg – The subgraph pattern to search for.

  • g – The graph to search in.

  • first – If true, stops after finding the first valid isomorphism.

  • is_isomorphism_valid_ – Optional custom validation function.

  • specialize_isomorphism_ – Optional custom specialization function.

  • nonoverlapping – Optional control for discovered isomorphisms.

  • use_vf3 – Whether to use VF2 or VF3.

Returns:

Vector of valid isomorphism mappings.

inline virtual GraphType apply_isomorphism_to_graph(const GraphType &g, IsoMap isomorphism)

Applies an isomorphism mapping to transform a graph.

Creates a new graph based on the isomorphism mapping, preserving the necessary vertices and edges while applying any transformations defined by the derived class.

Parameters:
  • g – The graph to transform.

  • isomorphism – The isomorphism mapping to apply.

Returns:

The transformed graph.

Public Members

GraphType original_input_graph_
GraphType input_graph_
struct isomorphisms_callback

Callback struct for collecting valid isomorphisms during search.

Public Functions

inline isomorphisms_callback(GraphType &sg, const GraphType &g, std::vector<IsoMap> &iso, bool first, IsIsomorphismValidFunction is_isomorphism_valid, SpecializeIsoFunction specialize_isomorphism, bool nonoverlapping)
template<typename CorrespondenceMap1To2, typename CorrespondenceMap2To1>
inline bool operator()(CorrespondenceMap1To2 cm1, CorrespondenceMap2To1) const

Processes each discovered isomorphism mapping.

Returns:

true to continue search, false to stop.

Public Members

GraphType &sg_
const GraphType &g_
std::vector<IsoMap> &valid_isomorphisms_
bool discover_first_
IsIsomorphismValidFunction is_isomorphism_valid_
SpecializeIsoFunction specialize_isomorphism_
bool nonoverlapping
mutable std::unordered_set<TemplatedVertex> used_vertices_
struct pair_hash
#include <graph.h>

Custom hash function for hashing pairs of objects.

Public Functions

template<class T1, class T2>
inline std::size_t operator()(const std::pair<T1, T2> &pair) const

Compute the hash value for a pair.

Template Parameters:
  • T1 – The type of the first element in the pair.

  • T2 – The type of the second element in the pair.

Parameters:

pair – The pair to hash.

Returns:

The computed hash value.

class PrimitiveEdge : public boost::no_property
#include <primitive_edge.h>

Base class for all edge property classes in the GHL.

PrimitiveEdge extends boost::no_property to provide:

  • Unique identification through ID management

  • Cloning capability for graph operations

  • Optional serialization support

This class is designed to be inherited from when creating custom edge property types. See the Road class in examples/city.h for an example of proper inheritance and extension.

Note

Unlike BaseNode, PrimitiveEdge inherits from boost::no_property to maintain compatibility with Boost Graph Library’s edge property system while adding GHL-specific functionality.

Public Functions

inline explicit PrimitiveEdge(int id = -1)

Constructs a PrimitiveEdge with the specified ID.

Parameters:

id – The unique identifier for the edge. Defaults to -1 if not specified.

inline virtual std::shared_ptr<PrimitiveEdge> clone()

Creates a clone of the edge.

This virtual method enables polymorphic cloning of edges, which is essential for graph operations that require copying edges, such as subgraph extraction or graph transformation.

Returns:

std::shared_ptr<PrimitiveEdge> A smart pointer to a new instance with the same properties.

virtual ~PrimitiveEdge() = default

Virtual destructor to ensure proper cleanup of derived classes.

inline int id() const

Gets the edge’s ID.

Returns:

The unique identifier of the edge.

inline void id(int id)

Sets the edge’s ID.

Parameters:

id – The new unique identifier for the edge.

inline virtual std::map<std::string, std::string, std::less<>> graphAttributes()

Generates GraphViz attributes for visualization.

This virtual method can be overridden by derived classes to customize the appearance of edges in GraphViz output. The base implementation results in no output.

Returns:

A map of GraphViz attribute names to values.

Private Members

int id_
struct vertex_comp_helper

Helper struct for vertex comparison during isomorphism detection.

Public Functions

inline vertex_comp_helper(const GraphType &G1, const GraphType &G2, VertexCompFunction vcf)
inline bool operator()(const TemplatedVertex v1, const TemplatedVertex v2)

Public Members

const GraphType &G1_
const GraphType &G2_
VertexCompFunction vcf_
template<typename T>
concept NodeLike
#include <base_node.h>
namespace boost
namespace cereal

Functions

template<class Archive, typename VertexProperties, typename EdgeProperties = b::no_property>
void save(Archive &ar, ghl::Graph<VertexProperties, EdgeProperties> const &graph)

Serializes a GHL graph to an archive.

Saves the complete graph structure including vertices, edges, and their associated properties. The serialization process preserves the graph topology and all property data.

Template Parameters:
  • Archive – The type of archive to serialize to

  • VertexProperties – The type of vertex properties in the graph

  • EdgeProperties – The type of edge properties in the graph

Parameters:
  • ar – The archive to save to

  • graph – The graph to serialize

template<class Archive, typename VertexProperties, typename EdgeProperties = b::no_property>
void load(Archive &ar, ghl::Graph<VertexProperties, EdgeProperties> &graph)

Deserializes a GHL graph from an archive.

Reconstructs a complete graph structure from serialized data, including vertices, edges, and their associated properties. The deserialization process restores the original graph topology and all property data.

Template Parameters:
  • Archive – The type of archive to deserialize from

  • VertexProperties – The type of vertex properties in the graph

  • EdgeProperties – The type of edge properties in the graph

Parameters:
  • ar – The archive to load from

  • graph – The graph to deserialize into

namespace ghl

Typedefs

using EdgeDescImpl = b::detail::edge_desc_impl<b::bidirectional_tag, unsigned long>
typedef std::function<void(T, T)> ModifyVertexPairFunction

Function type for modifying a pair of vertices.

Template Parameters:

T – The type of the vertices.

typedef std::function<T(T)> CloneVertexFunction

Function type for cloning a vertex.

Template Parameters:

T – The type of the vertex.

typedef b::adjacency_list<b::vecS, b::vecS, b::bidirectionalS, VertexProperties, EdgeProperties, GraphProperties> Graph

A bidirectional graph structure with customizable properties.

Template Parameters:
  • VertexProperties – Properties associated with vertices. This is commonly a class that will be instantiated at each vertex.

  • EdgeProperties – Properties associated with edges (default: boost::no_property). This is commonly a class that will be instantiated at each edge.

  • GraphProperties – Properties associated with the entire graph (default: boost::no_property).

typedef b::adjacency_list<b::vecS, b::vecS, b::undirectedS, VertexProperties, EdgeProperties, GraphProperties> UndirectedGraph

An undirected graph structure with customizable properties.

Template Parameters:
  • VertexProperties – Properties associated with vertices. This is commonly a class that will be instantiated at each vertex.

  • EdgeProperties – Properties associated with edges (default: boost::no_property). This is commonly a class that will be instantiated at each edge.

  • GraphProperties – Properties associated with the entire graph (default: boost::no_property).

typedef typename b::graph_traits<Graph<VertexProperties, EdgeProperties>>::vertex_descriptor Vertex

Descriptor type for vertices in a bidirectional graph.

Template Parameters:
  • VertexProperties – Properties associated with vertices. This is commonly a class that will be instantiated at each vertex.

  • EdgeProperties – Properties associated with edges (default: boost::no_property). This is commonly a class that will be instantiated at each edge.

typedef typename b::graph_traits<UndirectedGraph<VertexProperties, EdgeProperties>>::vertex_descriptor UVertex

Descriptor type for vertices in an undirected graph.

Template Parameters:
  • VertexProperties – Properties associated with vertices. This is commonly a class that will be instantiated at each vertex.

  • EdgeProperties – Properties associated with edges (default: boost::no_property). This is commonly a class that will be instantiated at each edge.

typedef typename b::graph_traits<Graph<VertexProperties, EdgeProperties>>::edge_descriptor Edge

Descriptor type for edges in a bidirectional graph.

Template Parameters:
  • VertexProperties – Properties associated with vertices. This is commonly a class that will be instantiated at each vertex.

  • EdgeProperties – Properties associated with edges (default: boost::no_property). This is commonly a class that will be instantiated at each edge.

typedef typename b::graph_traits<UndirectedGraph<VertexProperties, EdgeProperties>>::edge_descriptor UEdge

Descriptor type for edges in an undirected graph.

Template Parameters:
  • VertexProperties – Properties associated with vertices. This is commonly a class that will be instantiated at each vertex.

  • EdgeProperties – Properties associated with edges (default: boost::no_property). This is commonly a class that will be instantiated at each edge.

Functions

template<typename VertexProperties, typename EdgeProperties = b::no_property>
void print_graph(const Graph<VertexProperties, EdgeProperties> &graph)

Prints the structure of a graph to standard output.

Outputs all vertices and edges in the graph for debugging and visualization purposes.

Template Parameters:
  • VertexProperties – Type of vertex properties

  • EdgeProperties – Type of edge properties

Parameters:

graph – The graph to print

template<typename VertexProperties, typename EdgeProperties = b::no_property>
std::vector<Vertex<VertexProperties, EdgeProperties>> vertices_(Graph<VertexProperties, EdgeProperties> graph)

Returns a vector of all vertices in the graph.

Template Parameters:
  • VertexProperties – Type of vertex properties

  • EdgeProperties – Type of edge properties

Parameters:

graph – The graph to extract vertices from

Returns:

Vector containing all vertex descriptors

template<typename VertexProperties, typename EdgeProperties = b::no_property>
std::vector<Edge<VertexProperties, EdgeProperties>> edges_(Graph<VertexProperties, EdgeProperties> graph)

Returns a vector of all edges in the graph.

Template Parameters:
  • VertexProperties – Type of vertex properties

  • EdgeProperties – Type of edge properties

Parameters:

graph – The graph to extract edges from

Returns:

Vector containing all edge descriptors

template<typename VertexProperties, typename EdgeProperties = b::no_property>
std::vector<Edge<VertexProperties, EdgeProperties>> in_edges(Graph<VertexProperties, EdgeProperties> graph, Vertex<VertexProperties, EdgeProperties> vertex)

Returns a vector of all incoming edges for a vertex.

Template Parameters:
  • VertexProperties – Type of vertex properties

  • EdgeProperties – Type of edge properties

Parameters:
  • graph – The graph containing the vertex

  • vertex – The vertex to get incoming edges for

Returns:

Vector of incoming edge descriptors

template<typename VertexProperties, typename EdgeProperties = b::no_property>
std::vector<Edge<VertexProperties, EdgeProperties>> out_edges(Graph<VertexProperties, EdgeProperties> graph, Vertex<VertexProperties, EdgeProperties> vertex)

Returns a vector of all outgoing edges for a vertex.

Template Parameters:
  • VertexProperties – Type of vertex properties

  • EdgeProperties – Type of edge properties

Parameters:
  • graph – The graph containing the vertex

  • vertex – The vertex to get outgoing edges for

Returns:

Vector of outgoing edge descriptors

template<typename VertexProperties, typename EdgeProperties = b::no_property>
void declare_graph_bindings(py::module_ &m, const std::string &pyclass_name)

Declares Python bindings for a graph type.

Creates Python bindings for graph operations including vertex/edge manipulation, property access, and traversal methods.

Template Parameters:
  • VertexProperties – Type of vertex properties

  • EdgeProperties – Type of edge properties

Parameters:
  • m – The pybind11 module to add bindings to

  • pyclass_name – Name of the Python class to create

template<typename VertexProperties, typename EdgeProperties = b::no_property>
void declare_generic_edge_descriptor(py::module_ &m, const std::string &pyclass_name)
template<typename VertexProperties, typename EdgeProperties = b::no_property>
void declare_isomorphism_bindings(py::module_ &m, const std::string &pyclass_name)

Declares Python bindings for an isomorphism type.

Creates Python bindings for isomorphism initialization and discover function.

Template Parameters:
  • VertexProperties – Type of vertex properties

  • EdgeProperties – Type of edge properties

Parameters:
  • m – The pybind11 module to add bindings to

  • pyclass_name – Name of the Python class to create

void base_node_bindings(const py::module_ &m)

Creates Python bindings for the BaseNode class.

Parameters:

m – The pybind11 module to add bindings to

void primitive_edge_bindings(const py::module_ &m)

Creates Python bindings for the PrimitiveEdge class.

Parameters:

m – The pybind11 module to add bindings to

void graph_bindings(py::module_ &m)

Creates Python bindings for core graph functionality.

Initializes bindings for base classes and common graph operations.

Parameters:

m – The pybind11 module to add bindings to

void isomorphism_bindings(py::module_ &m)

Creates Python bindings for core isomorphism functionality.

Initializes bindings for base classes and common isomorphism operations.

Parameters:

m – The pybind11 module to add bindings to

template<typename T, typename E = b::no_property>
Graph<T, E> construct_graph(std::vector<T> vertex_vector, std::vector<generic_edge_descriptor<int, E>> vertex_eds)

Constructs a graph from a set of vertices and edges.

Template Parameters:
  • T – The type of vertex properties.

  • E – The type of edge properties (default: boost::no_property).

Parameters:
  • vertex_vector – A vector of vertices to be added to the graph.

  • vertex_eds – A vector of edge descriptors defining the edges between vertices.

Returns:

A constructed graph of type Graph<T, E>.

template<typename T, typename E = b::no_property>
std::pair<std::vector<T>, std::vector<generic_edge_descriptor<int, E>>> deconstruct_graph(Graph<T, E> g)

Deconstructs a graph into its vertices and edge descriptors.

Template Parameters:
  • T – The type of vertex properties.

  • E – The type of edge properties (default: boost::no_property).

Parameters:

g – The graph to be deconstructed.

Returns:

A pair containing a vector of vertices and a vector of edge descriptors.

inline void convert_dot_to_pdf(const std::string &dot_filename, const std::string &pdf_filename)

Converts a DOT file to a PDF using the Graphviz dot tool.

Parameters:
  • dot_filename – The path to the input DOT file.

  • pdf_filename – The path to the output PDF file.

template<typename V, typename G>
void update_edge_source(V source, V new_source, V target, G &g)

Updates the source vertex of an edge in a graph.

Template Parameters:
  • V – The type of the vertex descriptor.

  • G – The type of the graph.

Parameters:
  • source – The current source vertex of the edge.

  • new_source – The new source vertex for the edge.

  • target – The target vertex of the edge.

  • g – The graph where the edge resides.

template<typename V, typename G>
void update_edge_target(V source, V target, V new_target, G &g)

Updates the target vertex of an edge in a graph.

Template Parameters:
  • V – The type of the vertex descriptor.

  • G – The type of the graph.

Parameters:
  • source – The source vertex of the edge.

  • target – The current target vertex of the edge.

  • new_target – The new target vertex for the edge.

  • g – The graph where the edge resides.

template<typename VertexProperties, typename EdgeProperties = boost::no_property>
void iterate_isomorphisms(ExtendedGraph<VertexProperties, EdgeProperties> &graph, std::shared_ptr<ghl::Isomorphism<VertexProperties, EdgeProperties>> isomorphism, auto isomorphisms)

Applies a vector of isomorphism transformations to a graph.

This function implements the process of applying a graph isomorphism, which can modify both the structure and properties of the graph. It supports both in-place updates and constructive transformations where a new subgraph replaces part of the original graph.

The function operates iteratively, implementing the passed vector of previously found isomorphisms. This enables comprehensive graph transformations that may require multiple passes.

Template Parameters:
  • VertexProperties – The type of properties stored in vertices

  • EdgeProperties – The type of properties stored in edges

Parameters:
  • graph – The graph to transform

  • isomorphism – The isomorphism object defining the transformation rules

  • isomorphisms – The vector or view on the vector of previously found isomorphisms

template<typename VertexProperties, typename EdgeProperties = boost::no_property>
void apply_isomorphism(ExtendedGraph<VertexProperties, EdgeProperties> &graph, std::shared_ptr<ghl::Isomorphism<VertexProperties, EdgeProperties>> isomorphism, bool nonoverlapping = true, bool use_vf3 = false)

Finds and applies isomorphisms.

This function implements finds isomorphisms and applies to the target graph.

Template Parameters:
  • VertexProperties – The type of properties stored in vertices

  • EdgeProperties – The type of properties stored in edges

Parameters:
  • graph – The graph to transform

  • isomorphism – The isomorphism object defining the transformation rules

  • nonoverlapping – If true, find isomorphisms one by one

  • use_vf3 – If true, use the VF3 algorithm. If false, use VF2

namespace pybind11

Functions

template<class Archive>
void save(Archive &ar, const object &obj)

Serializes a Python object to an archive.

Converts the Python object to a serialized string using pickle and base64 encoding to ensure safe storage of binary data.

Template Parameters:

Archive – The type of archive to serialize to

Parameters:
  • ar – The archive instance

  • obj – The Python object to serialize

template<class Archive>
void load(Archive &ar, object &obj)

Deserializes a Python object from an archive.

Reconstructs a Python object from its serialized string representation using base64 decoding and pickle.

Template Parameters:

Archive – The type of archive to deserialize from

Parameters:
  • ar – The archive instance

  • obj – The Python object to deserialize into

template<class Archive>
void save(Archive &ar, const pybind11::kwargs &kwargs)

Serializes Python keyword arguments to an archive.

Converts Python kwargs into a serializable map structure.

Template Parameters:

Archive – The type of archive to serialize to

Parameters:
  • ar – The archive instance

  • kwargs – The Python keyword arguments to serialize

template<class Archive>
void load(Archive &ar, pybind11::kwargs &kwargs)

Deserializes Python keyword arguments from an archive.

Reconstructs Python kwargs from a serialized map structure.

Template Parameters:

Archive – The type of archive to deserialize from

Parameters:
  • ar – The archive instance

  • kwargs – The Python keyword arguments to deserialize into

template void save< cereal::JSONOutputArchive > (cereal::JSONOutputArchive &, const object &)
template void save< cereal::BinaryOutputArchive > (cereal::BinaryOutputArchive &, const object &)
template void save< cereal::PortableBinaryOutputArchive > (cereal::PortableBinaryOutputArchive &, const object &)
template void load< cereal::JSONInputArchive > (cereal::JSONInputArchive &, object &)
template void load< cereal::BinaryInputArchive > (cereal::BinaryInputArchive &, object &)
template void load< cereal::PortableBinaryInputArchive > (cereal::PortableBinaryInputArchive &, object &)
template void save< cereal::JSONOutputArchive > (cereal::JSONOutputArchive &, const pybind11::kwargs &)
template void save< cereal::BinaryOutputArchive > (cereal::BinaryOutputArchive &, const pybind11::kwargs &)
template void save< cereal::PortableBinaryOutputArchive > (cereal::PortableBinaryOutputArchive &, const pybind11::kwargs &)
template void load< cereal::JSONInputArchive > (cereal::JSONInputArchive &, pybind11::kwargs &)
template void load< cereal::BinaryInputArchive > (cereal::BinaryInputArchive &, pybind11::kwargs &)
template void load< cereal::PortableBinaryInputArchive > (cereal::PortableBinaryInputArchive &, pybind11::kwargs &)
template<class Archive>
void save(Archive &ar, const pybind11::object &obj)
template<class Archive>
void load(Archive &ar, pybind11::object &obj)
namespace std
file graph_bindings.cpp
#include “graph_bindings.h

Functions

PYBIND11_MODULE(ghl_bindings, m)

Defines the Python module for GHL bindings.

Creates and initializes the Python module containing all GHL functionality.

Parameters:

m – The pybind11 module to initialize

file graph_bindings.h
#include “../graph/graph.h
#include <pybind11/functional.h>
#include <pybind11/pybind11.h>
#include <pybind11/stl.h>

Provides Python bindings for the Generic Graph Library core functionality.

This file implements pybind11-based Python bindings for GHL’s core graph types and operations. It enables seamless integration between C++ and Python by exposing graph manipulation functions, property access, and traversal methods.

Dependencies:

  • pybind11 (when GHL_BINDINGS is defined)

  • Boost Graph Library

Functions

PYBIND11_MAKE_OPAQUE(std::shared_ptr<void>)
file cereal.h
#include <fstream>
#include <cereal/access.hpp>
#include <cereal/archives/binary.hpp>
#include <cereal/archives/json.hpp>
#include <cereal/archives/portable_binary.hpp>
#include <cereal/types/array.hpp>
#include <cereal/types/complex.hpp>
#include <cereal/types/map.hpp>
#include <cereal/types/memory.hpp>
#include <cereal/types/string.hpp>
#include <cereal/types/tuple.hpp>
#include <cereal/types/unordered_map.hpp>
#include <cereal/types/utility.hpp>
#include <cereal/types/vector.hpp>

Provides serialization utilities and macros for the GHL.

This file sets up the serialization infrastructure for the Generic Graph Library using the cereal serialization library. It defines a set of macros that simplify the process of implementing serialization for different types of graph components, including:

  • Base class serialization

  • Derived class serialization with polymorphic support

  • Automatic registration of types with cereal

The macros defined here are used throughout the GHL to provide consistent serialization behavior across all serializable components.

Defines

REGISTER_SERIALIZATION(cls)

Registers serialization functions for a class with different archive types.

This macro generates the necessary template specializations for serializing a class with JSON, Binary, and PortableBinary archives in both input and output modes.

Parameters:
  • cls – The class to register for serialization

REGISTER_TYPE_AND_POLYMORPHISM(base, cls)

Registers polymorphic type information for a class and its base.

This macro registers a class for polymorphic serialization and establishes its relationship with a base class in the serialization system.

Parameters:
  • base – The base class in the polymorphic relationship

  • cls – The derived class to register

SERIALIZE_CHILD_NO_ARGS(cls, base)

Implements serialization for a child class without additional members.

This macro defines serialization for a derived class that only needs to serialize its base class members.

Parameters:
  • cls – The derived class implementing serialization

  • base – The base class whose serialization should be included

SERIALIZE_CHILD(cls, base, ...)

Implements serialization for a child class with additional members.

This macro defines serialization for a derived class that needs to serialize both its base class members and its own members.

Parameters:
  • cls – The derived class implementing serialization

  • base – The base class whose serialization should be included

  • ... – Additional members to serialize

SERIALIZE_BASE(base, ...)

Implements serialization for a base class.

This macro defines serialization for a base class, including all specified members in the serialization process.

Parameters:
  • base – The base class implementing serialization

  • ... – Members to serialize

file forward_decl.h

Forward declarations for cereal serialization library components.

This header provides minimal forward declarations needed for cereal integration, along with macros to handle dynamic initialization of polymorphic support. It helps prevent linker optimization issues that can occur with static polymorphic registration objects.

Defines

CEREAL_FWD_DLL_EXPORT

Platform-specific DLL export macro for MSVC compilers.

Defines export behavior differently for MSVC versus other compilers to ensure proper symbol visibility.

CEREAL_FWD_USED
CEREAL_FWD_FORCE_DYNAMIC_INIT(LibName)

Forces dynamic initialization of polymorphic support in a previously registered source file

See CEREAL_REGISTER_DYNAMIC_INIT for detailed explanation of how this macro should be used. The name used should match that for CEREAL_REGISTER_DYNAMIC_INIT.

See also

CEREAL_REGISTER_DYNAMIC_INIT

file pybind11.cpp
#include “pybind11.h
#include “cereal.h
#include <pybind11/embed.h>
file pybind11.h
file ghl.h
#include “graph/graph.h
file ghl_isomorphisms.h
file ghl_subgraphs.h
#include “graph/subgraph.h
file base_node.h
#include <format>
#include <map>
#include <memory>
#include “pybind11_fwd_decl.h

Defines the base class for vertex properties in the Generic Graph Library.

This file contains the BaseNode class which serves as the foundation for all vertex property classes in the GHL. It provides basic functionality such as unique identification and GraphViz attribute generation that can be extended by derived classes.

The BaseNode class is designed to work seamlessly with the Boost Graph Library while providing additional functionality specific to GHL’s needs. It supports optional serialization capabilities when the GHL_SERIALIZATION flag is defined.

file graph.h
#include “base_node.h
#include “primitive_edge.h
#include <boost/graph/adjacency_list.hpp>
#include <boost/graph/copy.hpp>
#include <boost/graph/depth_first_search.hpp>
#include <boost/graph/graph_traits.hpp>
#include <boost/graph/graph_utility.hpp>
#include <boost/graph/graphviz.hpp>
#include <boost/graph/subgraph.hpp>
#include <boost/graph/vf2_sub_graph_iso.hpp>
#include <boost/graph/vf3_sub_graph_iso.hpp>
#include <climits>
#include <filesystem>
#include <map>
#include <ranges>
#include <set>
#include <typeinfo>
#include <unordered_set>

Header file defining the primary graph data structures and utilities for the Generic Graph Library (GHL).

This file contains core definitions and implementations for managing and manipulating graphs. It utilizes the Boost Graph Library for foundational graph structures and supports extended operations such as vertex duplication, edge updates, and subgraph replacement.

Dependencies:

  • Boost Graph Library (>= 1.86.0)

file primitive_edge.h
#include <boost/graph/adjacency_list.hpp>
#include <memory>

Defines the base class for edge properties in the Generic Graph Library.

This file contains the PrimitiveEdge class which serves as the foundation for all edge property classes in the GHL. It extends boost::no_property to maintain compatibility with the Boost Graph Library while adding unique identification capabilities for GHL’s extended functionality.

The PrimitiveEdge class parallels BaseNode in providing core property management for graph elements, but specifically for edges rather than vertices. It supports optional serialization when the GHL_SERIALIZATION flag is defined.

file pybind11_fwd_decl.h

Defines

PYBIND11_EXPORT
file subgraph.h
#include “graph.h
#include <format>
#include <stdexcept>
#include <type_traits>

Provides subgraph functionality for the Generic Graph Library.

This file defines the ExtendedSubGraph class which extends GHL’s graph functionality to support subgraph operations. It builds upon Boost’s subgraph capabilities while adding GHL-specific features such as vertex object ID management and GraphViz attribute handling.

The implementation uses Boost’s property system to maintain visualization attributes and supports hierarchical graph structures through subgraph relationships.

file apply_isomorphism.h
#include “graph_isomorphisms.h

Implements functionality for applying graph isomorphisms in the GHL.

This file defines the core mechanism for applying discovered isomorphisms to transform graphs. It provides a templated function that handles the process of applying structural and property modifications based on isomorphism mappings, including:

  • Applying vertex and edge transformations

  • Managing external edge reconnection

  • Maintaining property consistency

  • Supporting both in-place and constructive updates

The implementation works in conjunction with the Isomorphism class to enable complete graph transformation workflows.

file graph_isomorphisms.h
#include “../graph/graph.h
#include <unordered_set>

Provides graph isomorphism detection and transformation capabilities.

This file defines the core isomorphism framework for GHL, enabling detection of structurally equivalent subgraphs and graph transformations. It builds upon Boost’s VF2 subgraph isomorphism algorithm while adding GHL-specific functionality for property-based matching and graph transformations.

The implementation supports:

  • Custom vertex and edge matching criteria

  • Isomorphism validation and specialization

  • Graph transformation based on discovered isomorphisms

  • In-place and constructive graph updates

file graph_serialization.h
#include “../cereal/cereal.h
#include “../graph/graph.h

Provides serialization support for graph structures in the GHL.

This file implements serialization and deserialization functionality for GHL graph structures using the cereal library. It enables graphs to be saved to and loaded from various formats including JSON and binary. The implementation handles both vertex and edge properties, maintaining the complete graph structure during serialization.

Dependencies:

  • cereal (>= 1.3.0)

dir /home/runner/work/graph-hook-library/graph-hook-library/include/ghl/bindings
dir /home/runner/work/graph-hook-library/graph-hook-library/include/ghl/cereal
dir /home/runner/work/graph-hook-library/graph-hook-library/include/ghl
dir /home/runner/work/graph-hook-library/graph-hook-library/include/ghl/graph
dir /home/runner/work/graph-hook-library/graph-hook-library/include
dir /home/runner/work/graph-hook-library/graph-hook-library/include/ghl/isomorphism
dir /home/runner/work/graph-hook-library/graph-hook-library/include/ghl/serialization