Skip to content
Open
Show file tree
Hide file tree
Changes from 54 commits
Commits
Show all changes
72 commits
Select commit Hold shift + click to select a range
c48617d
add hublabel build and query code, get tests to build
electricEpilith Dec 9, 2025
9a5bbd3
replace placeholder getter stuff, rewrite hhlquery to take iterator
electricEpilith Dec 12, 2025
28add14
Merge remote-tracking branch 'upstream/master' into hublabel
electricEpilith Dec 12, 2025
3e009fa
debugging etc.
electricEpilith Jan 23, 2026
6755f44
Change hub_labels to a size_t vector, which the function to generate …
adamnovak Jan 23, 2026
37492aa
Merge remote-tracking branch 'upstream/hublabel' into hublabel
adamnovak Jan 23, 2026
0065e97
Define a type for the complex temporary X index indexing, and accesso…
adamnovak Jan 23, 2026
420c9e9
Use indexing accessors in make_boost_graph()
adamnovak Jan 23, 2026
5edfaa0
Add const accessors and fix build errors
adamnovak Jan 23, 2026
b9ba500
Write some hub labeling interface docs as I remember it, and add some…
adamnovak Jan 26, 2026
23e6745
Add synthetic debug logging and synthetic analysis results to make_bo…
adamnovak Jan 27, 2026
ad43882
Synthesize code to allocate vertices and avoid wasting them, and to h…
adamnovak Jan 27, 2026
0e6aa47
Redesign to only think of indexing inward-facing handles for converti…
adamnovak Jan 27, 2026
3619491
Teach CMake about Boost dependency
adamnovak Jan 27, 2026
7e33257
Stop putting negative-unsigned entries in the hub labels
adamnovak Jan 27, 2026
9a88f8f
Define what to do for asking about a node to itself, and test it
adamnovak Jan 27, 2026
ac07468
Qualify std::move calls to appease compiler
adamnovak Jan 27, 2026
3b84fb0
Const-ify arguments to label building
adamnovak Jan 27, 2026
227e4d1
De-comment the existing hub labeling test cases into distinct test ca…
adamnovak Jan 27, 2026
9b33554
Add some synthetic unit tests, with revisions, for some more graph sh…
adamnovak Jan 27, 2026
385efa8
Fix signature mismatch
adamnovak Jan 27, 2026
9ae76d4
Fix type name
adamnovak Jan 27, 2026
1d50a68
Merge remote-tracking branch 'origin/master' into hublabel
adamnovak Jan 28, 2026
fb774f2
Rework HHL vertex ID computation so we can actually find the right ve…
adamnovak Jan 28, 2026
a5c20a8
Be clear about who is responsible for initializing NodeProp fields, a…
adamnovak Jan 29, 2026
9a7e4c3
Produce more descriptive errors for out of bounds temporary snarl rec…
adamnovak Jan 29, 2026
a868f92
Fix cases where simple snarls could be accesed with the non-simple Sn…
adamnovak Jan 29, 2026
f8de1dc
Figure out ChainRecord is used to decode snarls sometimes and documen…
adamnovak Jan 29, 2026
41ccdf3
Stop trying to report types we aren't allowed to compute
adamnovak Jan 29, 2026
a3948d4
Handle ROOT record type as also needing to canonicalize to the one tr…
adamnovak Feb 2, 2026
0609855
Use stringification wrappers to avoid mis-indexing the enum name tables
adamnovak Feb 2, 2026
178857d
Turn off debugging prints and some of the checks
adamnovak Feb 2, 2026
8a85c23
Flag off more debug prints
adamnovak Feb 2, 2026
e9ff343
Merge branch 'hublabel' into HEAD
adamnovak Feb 10, 2026
9dc0326
Merge remote-tracking branch 'upstream/hublabel' into hublabel
adamnovak Feb 10, 2026
d429581
Adjust debugging for better diffing and add a distance promotion func…
adamnovak Feb 11, 2026
43a6bc7
Turn on debugging and add more query prints
adamnovak Feb 11, 2026
baa9b49
Rename orientation flags and start collecting constraints on them to …
adamnovak Feb 11, 2026
ee08df2
Turn on debugging again and fix adding to infinite unreachable loop d…
adamnovak Feb 13, 2026
f522ff9
Turn off debugging
adamnovak Feb 13, 2026
badfab6
Implement storing regularity in index via the type
adamnovak Mar 20, 2026
1522fa9
Fix non-Python build
adamnovak Mar 20, 2026
46aa094
Enable debugging and stop OR-ing in enum values
adamnovak Mar 20, 2026
efa47f2
Turn off debugging
adamnovak Mar 20, 2026
bb713f4
Try not to run a jillion threads during tests
adamnovak Mar 20, 2026
00327bd
Add get_snarl_child_count and use hub labels for oversized snarl dist…
electricEpilith Mar 24, 2026
72eefa7
Count simple and trivial snarls as regular because zip codes do
adamnovak Mar 24, 2026
0be8fda
Merge branch 'mergePlaceholder' into hublabel
electricEpilith Mar 30, 2026
28d2d2b
add back get_snarl_child_count
electricEpilith Mar 30, 2026
4c70990
Merge remote-tracking branch 'origin/hublabel-debug' into hublabel
electricEpilith Mar 30, 2026
5acf1f4
Fix duplicate get_snarl_child_count declaration/definition from merge
electricEpilith Mar 30, 2026
fdb9a74
upgrade version number to 5
electricEpilith Apr 2, 2026
ea70e55
upgrade version number
electricEpilith Apr 2, 2026
09f9d6e
fix conflict from accidentally doing the same version upgrade twice
electricEpilith Apr 7, 2026
2c3c0db
Add CHOverlay output
adamnovak Apr 22, 2026
a7602fd
Address some of my own review comments
adamnovak Apr 22, 2026
a169eca
prevent sdsl conflicts
electricEpilith Apr 26, 2026
531e77e
prevent libhandlegraph conflicts
electricEpilith Apr 26, 2026
5aff1a5
prevent hopscotch conflicts
electricEpilith Apr 26, 2026
789ad6d
prevent mio conflicts
electricEpilith Apr 26, 2026
78584c4
Update bdsg/include/bdsg/internal/indexing_iterator.hpp
electricEpilith May 8, 2026
d6dffdd
Fix collections misspelling
electricEpilith May 8, 2026
9882957
Fix typos
electricEpilith May 8, 2026
90289e8
Fix collections typo
electricEpilith May 8, 2026
772d34c
Update bdsg/include/bdsg/internal/indexing_iterator.hpp
electricEpilith May 8, 2026
2d12064
CI needs to have Boost to support contraction hierarchy code
electricEpilith May 13, 2026
83cea1f
consolidate contraction-hierarchy/hub-labeling stuff
electricEpilith May 13, 2026
8e57a39
fix errors caused by const conflicts
electricEpilith May 13, 2026
467ab3d
fix PYBIND11_MAKE_OPAQUE 'a type specifier is required for all declar…
electricEpilith May 13, 2026
b5abb87
format code
electricEpilith May 13, 2026
91b0e91
uncomment non-hub-labeling tests
electricEpilith May 13, 2026
1c35a3b
mention Boost dep
electricEpilith May 13, 2026
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
12 changes: 8 additions & 4 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -18,8 +18,8 @@ OPTION(USE_INSTALLED_LIBHANDLEGRAPH "Use the version of libhandlegraph installed
# TODO: We can only do out-of-source builds!
# TODO: How do we error out meaningfully on in-source builds?

# We build using c++14
set(CMAKE_CXX_STANDARD 14)
# We build using c++20
set(CMAKE_CXX_STANDARD 20)
# We need library paths to be relative in the build directories so we can let
# the libraries in our Python module find each other when we package them into
# a wheel. This only works on CMake 3.14+; older CMake we have to bully with
Expand Down Expand Up @@ -143,6 +143,8 @@ endif()
# Find other system dependencies
pkg_check_modules(Jansson REQUIRED IMPORTED_TARGET jansson)

find_package(Boost REQUIRED)
Comment thread
electricEpilith marked this conversation as resolved.

# Find our bdsg package directory where input sources and dependencies are
set(bdsg_DIR "${CMAKE_CURRENT_SOURCE_DIR}/bdsg")

Expand Down Expand Up @@ -306,6 +308,7 @@ add_library(bdsg_objs OBJECT
${bdsg_DIR}/src/strand_split_overlay.cpp
${bdsg_DIR}/src/utility.cpp
${bdsg_DIR}/src/vectorizable_overlays.cpp
${bdsg_DIR}/src/ch.cpp
${bdsg_DIR}/src/snarl_distance_index.cpp
)

Expand All @@ -324,7 +327,8 @@ set(bdsg_TARGET_DEPS
bbhash
sparsepp
mio::mio
PkgConfig::Jansson)
PkgConfig::Jansson
Boost::boost)

set(bdsg_LIBS
${bdsg_TARGET_DEPS}
Expand All @@ -338,7 +342,7 @@ target_include_directories(bdsg_objs PUBLIC ${bdsg_INCLUDES})
set_target_properties(bdsg_objs PROPERTIES POSITION_INDEPENDENT_CODE TRUE)

if (CMAKE_MAJOR_VERSION EQUAL "3" AND (CMAKE_MINOR_VERSION EQUAL "10" OR CMAKE_MINOR_VERSION EQUAL "11"))
# Before CMake 3.12 we can't ise target_link_libraries on an object library to convey the need to use depencies' include directories
# Before CMake 3.12 we can't use target_link_libraries on an object library to convey the need to use depencies' include directories
get_target_property(sdsl_INCLUDE sdsl INTERFACE_INCLUDE_DIRECTORIES)
target_include_directories(bdsg_objs PUBLIC ${sdsl_INCLUDE})
get_target_property(hopscotch_map_INCLUDE tsl::hopscotch_map INTERFACE_INCLUDE_DIRECTORIES)
Expand Down
1 change: 1 addition & 0 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ OBJS += $(OBJ_DIR)/path_subgraph_overlay.o
OBJS += $(OBJ_DIR)/subgraph_overlay.o
OBJS += $(OBJ_DIR)/vectorizable_overlays.o
OBJS += $(OBJ_DIR)/packed_subgraph_overlay.o
OBJS += $(OBJ_DIR)/ch.o
Comment thread
electricEpilith marked this conversation as resolved.
OBJS += $(OBJ_DIR)/snarl_distance_index.o
OBJS += $(OBJ_DIR)/strand_split_overlay.o
OBJS += $(OBJ_DIR)/utility.o
Expand Down
281 changes: 281 additions & 0 deletions bdsg/include/bdsg/ch.hpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,281 @@
/*
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Include guards are missing for this header.

file for quickly playing around with stuff
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This needs a better description; we can't mainline a file for quickly playing around with stuff.

The file might also need a more descriptive file name.

What determines if a piece belongs here or in hublabel.hpp or landmark.hpp?

Also, if there's not a class that represents the hub labeling module, this is where you would document the whole module: the concepts involved, citations to the literature, what functions the user of the module is expected to call in sequence to actually use it, and so on.

*/
#include "landmark.hpp"
#include "hublabel.hpp"

#include <boost/graph/adjacency_list.hpp>
#include <boost/graph/filtered_graph.hpp>
#include <boost/graph/graphviz.hpp>
#include <boost/graph/biconnected_components.hpp>
#include <bdsg/snarl_distance_index.hpp>

//#define debug_binary_intersection
//#define debug_hhl_query

namespace bdsg {

/**
* For a handle graph indexed with HHL, get the HHL rank ("Boost graph ID") for
* an orientation of a node, as a source or destination.
*/
NODE_UINT bgid(const handle_t& h, const bdsg::HashGraph& hg);

/**
* For a net graph indexed with HHL, get the HHL rank for an orientation of a
* net graph element (snarl start node, snarl end node, child node, child
* chain), as either the source or destination of a query.
*
* Snarl start nodes and snarl end nodes are handled so that "forward"
* orientation runs along the snarl, regardless of the orientation that the
* underlying handle graph node is in as a snarl boundary.
*
* Child chains and nodes are also handled so that "forward" orientation is the
* orientation the thing has in the snarl. So if a node is reversed in the
* snarl, asking about forward is actually asking about that node in its local
* reverse orientation.
*
* For net graphs, we need to distinguish between source and destination status
* to allow turning around within a child chain without traversing the full
* length of the chain. Each child chain needs to be represented by a subgraph
* with different in and out "port" nodes in each orientation. The source port
* is the one you would leave the node from in that orientation.
*/
NODE_UINT bgid(size_t net_rank, bool is_reverse, bool is_source);

/**
* For a handle or net graph indexed with HHL, take the HHL rank of an orientation of
* a node and get that of the opposite orientation of a node.
*
* For handle graphs, ranks are the same for source and destination.
*
* For net graphs, ranks differ between source and destination "ports" for a
* net graph element; this also swaps source and destination status.
*/
NODE_UINT rev_bgid(NODE_UINT n);


typedef struct NodeProp {
// This is initialized by make_boost_graph()
DIST_UINT seqlen;
DIST_UINT max_out = 0;
NODE_UINT contracted_neighbors = 0;
NODE_UINT level = 0;
NODE_UINT arc_cover = 1;
bool contracted = false;
// This is left uninitialized until make_contraction_hierarchy() is run.
NODE_UINT new_id;
} NodeProp;

typedef struct EdgeProp {
bool contracted = false;
DIST_UINT weight = 0;
NODE_UINT arc_cover = 1;
bool ori = true;
} EdgeProp;
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

These should have a little more documentation.


typedef boost::adjacency_list<boost::vecS, boost::vecS, boost::bidirectionalS, NodeProp, EdgeProp> CHOverlay;
typedef boost::filtered_graph<CHOverlay, function<bool(CHOverlay::edge_descriptor)>> ContractedGraph;

/**
* Build the intermediate hub labeling computation data structure ("Boost
* graph") from a HashGraph.
*
* The nodes in the graph must have dense node IDs starting at 1.
*
* For later queries, orientations of nodes are assigned ranks as provided by
* the bgid() function.
*/
CHOverlay make_boost_graph(const bdsg::HashGraph& hg);
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Can this have a better name than bdsg::make_boost_graph()? And a better name for the data structure than the "Boost graph"?

The names of the hub labeling API functions we actually use don't have much to tie them together (they don't belong to a class as static methods, or to a namespace, or share any words in their names). Talking here about a "Boost graph" is telling the user about the implementation detail that should be hidden (the fact that Boost is a dependency) and not about the fact that this is hub-labeling-related or what the graph that's implemented using Boost actually represents.

/**
* Build the intermediate hub labeling computation data structure ("Boost
* graph") for the net graph of a snarl in a TemporaryDistanceIndex.
*
* all_children must contain the child chains and nodes of the snarl, as well as the bounding nodes of the snarl, in any order.
*
* For later queries, orientations of children or the snarl boundary nodes are assigned query ranks based on their snarl distance index rank.
*
* The snarl distance index ranks are 0 and 1 for the start and end nodes of the snarl, and the rank_in_parent field of the temporary index for each child.
*/
CHOverlay make_boost_graph(const bdsg::SnarlDistanceIndex::TemporaryDistanceIndex& temp_index, const SnarlDistanceIndex::temp_record_ref_t& snarl_index, const SnarlDistanceIndex::TemporaryDistanceIndex::TemporarySnarlRecord& temp_snarl_record, const vector<pair<SnarlDistanceIndex::temp_record_t, size_t>>& all_children, const HandleGraph* graph);

int edge_diff(ContractedGraph::vertex_descriptor nid, ContractedGraph& ch, CHOverlay& ov, vector<DIST_UINT>& node_dists, int hop_limit);

void contract(CHOverlay::vertex_descriptor nid, ContractedGraph& ch, CHOverlay& ov, vector<DIST_UINT>& node_dists, vector<bool>& shouldnt_contract, int hop_limit);
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

These should maybe be static since they are file-scope helpers. It would be good if they had some doc comments.


/**
* Find the contraction hierarchy order for the graph.
*
* Initializes the new_id field of each NodeProb in the graph.
*/
void make_contraction_hierarchy(CHOverlay& ov);

template <typename ItrType>
ItrType get_dist_itr(ItrType start_itr, ItrType hub_itr) {
auto node_count = *start_itr;
auto last_fwd_end_bound_itr = next(start_itr, 1+node_count);
if (hub_itr >= next(start_itr, *last_fwd_end_bound_itr)) {
//backwards label
auto first_back_bound_itr = next(start_itr, 1+node_count+1);
auto last_back_bound_itr = next(start_itr, 1+node_count+1+node_count);
auto jump_to_dist = (*last_back_bound_itr) - *first_back_bound_itr;
return next(hub_itr, jump_to_dist);
} else {
//forwards label
auto first_fwd_bound_itr = next(start_itr, 1);
auto last_fwd_bound_itr = next(start_itr, 1+node_count);
auto jump_to_dist = (*last_fwd_bound_itr) - *first_fwd_bound_itr;
return next(hub_itr, jump_to_dist);
}
}

DIST_UINT binary_intersection_ch(vector<HubRecord>& v1, vector<HubRecord>& v2);
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This could use a doc comment.

/*
* Do binary intersection to find shared labels for two vertices.
*
* start_itr should point to the first slot of the packed label data returned
* by pack_labels(), which is the label count.
*
* start_bound_index variables are relative to start_itr, and give the
* positions of the stored start bounds for the two labels; the stored end
* bounds will be in the slots after.
*/
template <typename ItrType>
DIST_UINT binary_intersection_ch(ItrType start_itr, size_t v1_start_bound_index, size_t v2_start_bound_index) {
auto v1_start_bound_itr = next(start_itr, v1_start_bound_index);
auto v1_end_bound_itr = next(v1_start_bound_itr, 1);
auto v2_start_bound_itr = next(start_itr, v2_start_bound_index);
auto v2_end_bound_itr = next(v2_start_bound_itr, 1);

auto v1_start_itr = next(start_itr, *v1_start_bound_itr);
auto v1_end_itr = next(start_itr, *v1_end_bound_itr);

#ifdef debug_binary_intersection
std::cerr << "Found " << v1_end_itr - v1_start_itr << " labels for vertex 1" << std::endl;
#endif

auto v2_start_itr = next(start_itr, *v2_start_bound_itr);
auto v2_end_itr = next(start_itr, *v2_end_bound_itr);

#ifdef debug_binary_intersection
std::cerr << "Found " << v2_end_itr - v2_start_itr << " labels for vertex 2" << std::endl;
#endif

auto v1_range = ranges::subrange<ItrType>(v1_start_itr, v1_end_itr);
auto v2_range = ranges::subrange<ItrType>(v2_start_itr, v2_end_itr);

auto& key_vec = v1_range.size() < v2_range.size() ? v1_range : v2_range;
auto& search_vec = v1_range.size() < v2_range.size() ? v2_range : v1_range;

auto search_start_itr = search_vec.begin();
auto search_end_itr = search_vec.end();
DIST_UINT min_dist = INF_INT;
for (auto it = key_vec.begin(); it < key_vec.end(); it++) {
#ifdef debug_binary_intersection
cerr << "Performing key query" << endl;
#endif
auto k = *it;
auto k_dist_itr = get_dist_itr(start_itr, it);
#ifdef debug_binary_intersection
cerr << "Distance for k " << k << " is " << *k_dist_itr << ", at: " << distance(start_itr,k_dist_itr) << endl;
cerr << "searching for " << k << " between " << distance(start_itr,search_start_itr) << " & " << distance(start_itr,search_end_itr) << endl;
#endif
search_start_itr = lower_bound(search_start_itr, search_end_itr, k);
if (search_start_itr == search_end_itr) {
#ifdef debug_binary_intersection
std::cerr << "No more search results possible" << std::endl;
#endif
return min_dist;
}
if (*search_start_itr == k) {
#ifdef debug_binary_intersection
cerr << "match found, key: " << *search_start_itr << ", at " << distance(start_itr,search_start_itr) << endl;
#endif
auto dist_itr = get_dist_itr(start_itr, search_start_itr);
DIST_UINT d = *(dist_itr) + *(k_dist_itr);
#ifdef debug_binary_intersection
cerr << "dist for key is: " << *dist_itr << ", at " << distance(start_itr,dist_itr) << endl;
cerr << "total dist is: " << d << endl;
#endif
min_dist = min(min_dist, d);
}
}
return min_dist;
}

/**
* Query stored hub label data for a minimum distance.
*
* start_itr should point to the first slot of the packed label data returned
* by pack_labels(), which is the label count.
*
* The rank space covers both orientations of each node.
*
* Returns the minimum distance from the end of the node orientation at rank1
* to the start of the node orientation at rank2. (If working in a net graph in
* a SnarlDistanceIndex, these "nodes" may really be child chains.)
*
* If rank1 == rank2, returns the minimum distance around that cycle, if any.
*
* If there is no known path between the given nodes, returns INF_INT.
*/
template <typename ItrType>
DIST_UINT hhl_query(ItrType start_itr, size_t rank1, size_t rank2) {
size_t label_count = *start_itr;

#ifdef debug_hhl_query
std::cerr << "Making hub label query on " << label_count << " labels" << std::endl;
#endif

// Bounds start after the label count, and at the rank of the first
// vertex past there we find the start bound for the first vertex.
auto start_index_1 = 1+rank1;

#ifdef debug_hhl_query
std::cerr << "Start bound for forward label for rank " << rank1 << " is at index " << start_index_1 << " past there" << std::endl;
#endif

// And there's a final end value for the first set of labels before we go on
// to the bounds where we would find the start bound for the second vertex.
auto start_index_2 = 1+label_count+1+rank2;

#ifdef debug_hhl_query
std::cerr << "Start bound for reverse label for rank " << rank2 << " is at index " << start_index_2 << " past there" << std::endl;
#endif

DIST_UINT dist = binary_intersection_ch(start_itr, start_index_1, start_index_2);


return dist;
}

void down_dijk(int node, CHOverlay& ov, vector<DIST_UINT>& node_dists, vector<vector<HubRecord>>& labels, vector<vector<HubRecord>>& labels_rev);

void down_dijk_rev(int node, CHOverlay& ov, vector<DIST_UINT>& node_dists, vector<vector<HubRecord>>& labels, vector<vector<HubRecord>>& labels_rev);
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

What's the difference between these?

Also, it would be good to organize this file so the things that are part of the external interface are clearly separated from the ones (like these) that aren't. A class with public and private methods/types could be used to formalize that.


void test_dijk(int node, CHOverlay& ov, vector<DIST_UINT>& node_dists, vector<vector<HubRecord>>& labels, vector<vector<HubRecord>>& labels_rev);

void test_dijk_rev(int node, CHOverlay& ov, vector<DIST_UINT>& node_dists, vector<vector<HubRecord>>& labels, vector<vector<HubRecord>>& labels_rev);
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Test code should move to the test files.


void create_labels(vector<vector<HubRecord>>& labels, vector<vector<HubRecord>>& labels_rev, CHOverlay& ov);
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This should have a doc comment.


/**
* Puts hub labels in a flat vector form
*
* Structure:
* - offsets are relative to start of flat vector
* - extra offset in each of fwd and back offset sets at the end so that end of ranges can be found
* -- subtracting the extra offset by the first offset of its set gets the distance to the corresponding dist of a hub
*
* The layout is:
* label count | start offsets (fwd) | start offsets (back) | fwd label hubs | fwd label dists | back label hubs | back label dists
*/
vector<size_t> pack_labels(const vector<vector<HubRecord>>& labels, const vector<vector<HubRecord>>& labels_back);

//not necessary stuff
void write_to_csv(CHOverlay& ov, string out_path);

void write_to_gr(CHOverlay& ov, string out_path);

vector<CHOverlay::vertex_descriptor> read_node_order(string in_path);
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think these would want to be cut, probably.

}
Loading
Loading