Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
49 commits
Select commit Hold shift + click to select a range
2c0f2e7
Update edge_list_strategy.md for unified CPO architecture
pratzl Jan 31, 2026
e72aedc
Refine edge_list strategy tiering
pratzl Jan 31, 2026
546be88
Add Tier 1 to supported types matrix and clarify native edge member a…
pratzl Jan 31, 2026
4997cb3
Add detailed edge_list implementation plan
pratzl Jan 31, 2026
4cf4eeb
Add is_edge_list_descriptor trait for edge_list type detection
pratzl Jan 31, 2026
3aa3c64
Phase 1 complete: source_id CPO extended with tiers 5-7
pratzl Jan 31, 2026
92bdd13
Phase 2 complete: target_id CPO extended with tiers 5-7
pratzl Jan 31, 2026
4a30960
Phase 3 complete: edge_value CPO extended with tiers 5-7
pratzl Jan 31, 2026
187d8b7
Phase 4, Step 4.1: Create edge_list::edge_descriptor type
pratzl Jan 31, 2026
ccfaf22
Update edge_list_plan.md: Mark Steps 4.1-4.3 as complete
pratzl Jan 31, 2026
bfb8773
Optimize edge_descriptor accessors for non-trivial vertex ID types
pratzl Jan 31, 2026
fdb5240
Use perfect forwarding in edge_descriptor constructors
pratzl Jan 31, 2026
d115462
Redesign edge_descriptor as lightweight reference-based handle
pratzl Jan 31, 2026
2bc2047
Encapsulate edge_descriptor: change to class with private members
pratzl Jan 31, 2026
c38200a
Update strategy and plan docs to reflect reference-based edge_descriptor
pratzl Jan 31, 2026
7358bca
Complete edge_list unification: Phases 5-6 (concepts, integration, te…
pratzl Jan 31, 2026
04c61c0
Merge feature/edge-list-unification: Complete edge_list unification w…
pratzl Jan 31, 2026
8245597
Consolidate edge_list tests into single executable
pratzl Jan 31, 2026
ebf567b
Refactor view_strategy.md to use descriptor-based info structs
pratzl Jan 31, 2026
c6691d9
[views] Add detailed implementation plan
pratzl Jan 31, 2026
4498608
Revert to original info struct design in view_strategy.md
pratzl Jan 31, 2026
052e202
[views] Update Section 8: All info struct members are optional via void
pratzl Jan 31, 2026
4fef70d
[views] Update search views to use VId=void in info structs
pratzl Jan 31, 2026
9ded421
[views] Document external data use cases for ID-only info structs
pratzl Jan 31, 2026
1a0db8d
[views] Clarify neighbor_info internal implementation in Section 8.3
pratzl Jan 31, 2026
3c013e9
[views] Update Section 9.2: edge_descriptor contains source vertex de…
pratzl Jan 31, 2026
3d096cf
[views] Create detailed implementation plan
pratzl Feb 1, 2026
1c0e24c
[views] Fix Phase 0 info struct implementation approach
pratzl Feb 1, 2026
330c7d8
[views] Phase 0: Info struct refactoring complete
pratzl Feb 1, 2026
a3cebcb
[views] Phase 1.1: Create views directory structure
pratzl Feb 1, 2026
bd43abc
[views] Phase 1.2: Implement search_base.hpp infrastructure
pratzl Feb 1, 2026
2e2a5a7
[views] Phase 1.3: Add view_concepts.hpp
pratzl Feb 1, 2026
15bb359
[views] Phase 2.1: Implement vertexlist view
pratzl Feb 1, 2026
9edfcc6
[views] Fix edge_info Sourced parameter in documentation
pratzl Feb 1, 2026
3bd7584
[views] Phase 2.1-2.2: Implement vertexlist and incidence views
pratzl Feb 1, 2026
d6b602b
[views] Phase 2.4: Implement edgelist view for adjacency_list
pratzl Feb 1, 2026
baeea27
[views] Step 2.4.1: Implement edgelist view for edge_list
pratzl Feb 1, 2026
422ac07
[docs] Update view_plan.md: Step 2.4.1 complete
pratzl Feb 1, 2026
8003441
[views] Step 2.5: Add basic_views.hpp convenience header
pratzl Feb 1, 2026
d6ce960
[docs] Update view_plan.md: Phase 2 complete
pratzl Feb 1, 2026
aca8655
[views] Add incidence(g,uid) convenience overloads + undirected_adjac…
pratzl Feb 1, 2026
6b27d74
fix(concepts): Check underlying iterator type in index_vertex_range
pratzl Feb 1, 2026
8c5f785
[views] Implement DFS edges view (Step 3.2)
pratzl Feb 1, 2026
fa0741a
[views] Test DFS cancel functionality (Step 3.3)
pratzl Feb 1, 2026
766efa1
[views] Implement BFS views with depth/size tracking
pratzl Feb 1, 2026
a61a0aa
[views] Steps 6.2-6.3: Search view adaptors and comprehensive chainin…
pratzl Feb 1, 2026
d2aa2a5
[views] Steps 7.1-7.2: Unified header and graph.hpp integration
pratzl Feb 2, 2026
433e0ba
[views] Step 7.5: Comprehensive edge case tests
pratzl Feb 2, 2026
73ae1e5
[views] Step 7.3-7.4: Documentation and performance benchmarks
pratzl Feb 2, 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
4 changes: 4 additions & 0 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ include(Sanitizers)
include(CodeCoverage)
include(CompilerCache)
include(PrecompiledHeaders)
include(CPM)

# C++ standard
set(CMAKE_CXX_STANDARD 20)
Expand Down Expand Up @@ -56,6 +57,9 @@ target_include_directories(graph3 INTERFACE

target_compile_features(graph3 INTERFACE cxx_std_20)

# Link tl::expected for optional cycle detection in topological sort
target_link_libraries(graph3 INTERFACE tl::expected)

# Apply compiler warnings
set_project_warnings(graph3)

Expand Down
45 changes: 24 additions & 21 deletions agents/edge_list_goal.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,36 +2,39 @@

The abstract edge list, a complement to the abstract adjacency list, needs to be implemented.

An edge list is a container or range of edge values that can be projected to the `edge_info`
data structure defined in `graph_info.hpp`. This provides an alternative graph representation
focused on edges rather than vertices.

There are multiple (and subtle forms) of edge list, as follows:
- "edge list" with a space between the words refers to the abstract edge list data structure.
- The "edge_list" namespace (with an underscore) is the namespace for the abstract edge list
implementation.
- "edgelist" (one word) refers to the edgelist view used by the abstract adjacency list data structure.
An edge list is a range of edge values that have a target_id, source_id and optional edge_value.
This can be represented by projecting values on into an `edge_info` data structure defined in
`graph_info.hpp`. This is an example, and other methods should be considered to implement it.

## Edge Lists Types and Naming
The term edge list has different forms.
- The abstract edge list is a range of values with a `target_id`, `source_id` and optional
`edge_value` members. They can have different names, so the library needs to be able to
enable the user to expose them into those names using the matching CPO functions. `edge_list`
(with an underscore separator) will be used to refer to this.
- `edgelist` (one word) refers to an edge list view of all edges in an adjacency list. This has
not been implemented yet.

## Goals
Create an implementation for an edge list in the `graph::edge_list` namespace, a peer to
`graph::adj_list`.

In the future, there will be an edgelist view that iterates through all outgoing edges of
all vertices that will also project `edge_info` values. This will allow algorithms to work
equally well against either:
- The abstract edge list data structure, or
- All edges in an abstract adjacency list (via the edgelist view)
Future algorithms that require an edge list must be able to work with either an `edge_list`
or an `edgelist` view without caring which one it is using.

## Important Details
CPOs for `source_id(g,uv)`, `target_id(g,uv)` and `edge_value(g,uv)` need to work on an adjacency list
edge, a `edge_list` value, and an `edgelist` view. This will help unify the overall design. Observations
to consider for implementation:
- Extend the `source_id(g,uv)`, `target_id(g,uv)` and `edge_value(g,uv)` CPOs to handle the `edge_list` values.
- Extend the edge descriptor to handle the `edge_list` values.

## Reference Implementation
`/mnt/d/dev_graph/graph-v2` contains an earlier version of this library (graph-v2) that uses
a reference-based define instead of the value-based descriptors. It has a similar directory
layout, including the `edge_list/` directory for the edge list implementation that can be used
as a reference. I don't think our edge list implementation needs descriptors, so the reference
implementation may be able to be copied with little change.

The adjacency list views for an edge list will be named `edgelist` in order to distinguish from the
abstract edge list data structure in the `edge_list` namespace.
layout, including the `edge_list/` subdirectory for the edge list implementation that can be used
as a reference design. The implementation for this library may need to be different.

## Important Details
`graph_info.hpp` contains common definitions of classes/structs that are shared between both the
adjacency list and edge list data structures. While `edge_info` is the primary shared type, others
could be added in the future.
Loading
Loading