Skip to content

Commit cd85ed2

Browse files
committed
Merge progress updates from root agents/bgl_todo.md
- Mark completed items in Phase 2 (range-based algorithms, MST, connectivity) - Mark completed items in Phase 3 (MPL removal, adjacency_list, containers) - Add detailed container selector implementation section (3.2.1) - Mark completed items in Phase 4 (coroutines, parallel execution, validation) - Mark completed items in Phase 5 (all testing phases) - Update Phase 3 effort and timeline estimates
1 parent c2f029e commit cd85ed2

File tree

1 file changed

+100
-57
lines changed

1 file changed

+100
-57
lines changed

agents/bgl_todo.md

Lines changed: 100 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -71,18 +71,18 @@ libs/headers---
7171
- [x] Support direct lambda/invocable for single-event use case
7272

7373
### 2.4 Range-Based Algorithm Variants
74-
- [ ] `breadth_first_search(g, initial_vertices_range, visitor)`
75-
- [ ] `depth_first_search(g, initial_vertices_range, visitor)`
76-
- [ ] Ensure algorithms accept `std::views::filter` results as input
74+
- [x] `breadth_first_search(g, initial_vertices_range, visitor)`
75+
- [x] `depth_first_search(g, initial_vertices_range, visitor)`
76+
- [x] Ensure algorithms accept `std::views::filter` results as input
7777

7878
### 2.5 Minimum Spanning Tree Algorithms
79-
- [ ] Modernize `kruskal_minimum_spanning_tree` (return edge range)
80-
- [ ] Modernize `prim_minimum_spanning_tree` (return edge range)
79+
- [x] Modernize `kruskal_minimum_spanning_tree` (return edge range)
80+
- [x] Modernize `prim_minimum_spanning_tree` (return edge range)
8181

8282
### 2.6 Connectivity Algorithms
83-
- [ ] Modernize `connected_components` (return component map or range)
84-
- [ ] Modernize `strong_components`
85-
- [ ] Modernize `topological_sort` (return sorted vertex range)
83+
- [x] Modernize `connected_components` (return component map or range)
84+
- [x] Modernize `strong_components`
85+
- [x] Modernize `topological_sort` (return sorted vertex range)
8686

8787
---
8888

@@ -91,28 +91,67 @@ libs/headers---
9191
**Goal:** Modernize `adjacency_list` and other containers; remove Boost.MPL.
9292

9393
### 3.1 Replace Boost.MPL
94-
- [ ] Replace all `boost::mpl::if_` with `std::conditional_t`
95-
- [ ] Replace `boost::mpl::and_`, `boost::mpl::or_` with `&&`, `||` on `::value`
96-
- [ ] Replace `boost::mpl::bool_` with `std::bool_constant`
97-
- [ ] Remove `#include <boost/mpl/*.hpp>` from all headers
94+
- [x] Replace all `boost::mpl::if_` with `std::conditional_t`
95+
- [x] Replace `boost::mpl::and_`, `boost::mpl::or_` with `&&`, `||` on `::value`
96+
- [x] Replace `boost::mpl::bool_` with `std::bool_constant`
97+
- [x] Remove `#include <boost/mpl/*.hpp>` from all headers
98+
- **Note:** The modern/ directory was designed from scratch using C++20 features,
99+
so it has no Boost.MPL dependencies. Uses std::conditional_t, concepts, etc.
98100

99101
### 3.2 Modernize adjacency_list
100-
- [ ] Reorder template parameters for better defaults
101-
- [ ] Support bundled properties via simple structs (designated initializer friendly)
102-
- [ ] Implement `g[v]` returning vertex property reference
103-
- [ ] Implement `g[e]` returning edge property reference
104-
- [ ] Ensure `add_vertex({.name = "A", .weight = 1.0})` works
102+
- [x] Reorder template parameters for better defaults
103+
- [x] Support bundled properties via simple structs (designated initializer friendly)
104+
- [x] Implement `g[v]` returning vertex property reference
105+
- [x] Implement `g[e]` returning edge property reference
106+
- [x] Ensure `add_vertex({.name = "A", .weight = 1.0})` works
107+
108+
### 3.2.1 Container Selector Implementation ✅ COMPLETE
109+
**Status:** Full container selector infrastructure implemented with vecS, listS, setS support.
110+
111+
**Completed:**
112+
- [x] Create `container_selectors.hpp` with all selector tags and `container_gen` mechanism
113+
- [x] Implement `vecS` selector with `std::vector` backing (index-based descriptors)
114+
- [x] Implement `listS` selector with `std::list` backing (iterator-based descriptors)
115+
- [x] Implement `setS` selector with `std::set` backing (iterator-based descriptors)
116+
- [x] Implement `container_gen` template specializations for all selectors
117+
- [x] Update adjacency_list template parameters: `adjacency_list<OutEdgeListS, VertexListS, DirectedS, VP, EP, GP>`
118+
- [x] Implement vertex removal for stable containers (listS, setS)
119+
- [x] Add `simple_adjacency_list` backward compatibility alias for old API
120+
- [x] Add comprehensive tests (`test_container_selectors.cpp`) covering:
121+
- [x] Selector properties (is_sequence, is_associative, is_unique, etc.)
122+
- [x] Container generation for all selector types
123+
- [x] All selector combinations (vecS/listS/setS for both vertices and edges)
124+
- [x] Direction variants (directed, undirected, bidirectional)
125+
- [x] Iterator-based vs index-based descriptor handling
126+
127+
**Selector Tags Implemented:**
128+
- `vecS``std::vector<T>` (sequence, not unique, index-based)
129+
- `listS``std::list<T>` (sequence, not unique, iterator-based)
130+
- `setS``std::set<T>` (associative, unique, iterator-based)
131+
- `mapS``std::map<size_t, T>` (mapped, unique)
132+
- `multisetS``std::multiset<T>` (associative, not unique)
133+
- `multimapS``std::multimap<size_t, T>` (mapped, not unique)
134+
- `hash_setS``std::unordered_set<T>` (unordered, unique)
135+
- `hash_mapS``std::unordered_map<size_t, T>` (unordered mapped, unique)
136+
- `hash_multisetS``std::unordered_multiset<T>` (unordered, not unique)
137+
- `hash_multimapS``std::unordered_multimap<size_t, T>` (unordered mapped, not unique)
138+
139+
**Files Created/Modified:**
140+
- `include/bgl/modern/container_selectors.hpp` (NEW - 460 lines)
141+
- `include/bgl/modern/adjacency_list.hpp` (REWRITTEN - new template structure)
142+
- `test/test_container_selectors.cpp` (NEW - comprehensive tests)
143+
- All existing tests updated to use new API
105144

106145
### 3.3 Strong Typing for Descriptors
107-
- [ ] Implement `descriptor<Tag>` wrapper with `operator<=>` and hash
108-
- [ ] Define `vertex_tag`, `edge_tag`
109-
- [ ] Typedef `vertex_descriptor = descriptor<vertex_tag>` (opt-in or default)
110-
- [ ] Verify type safety prevents mixing vertex/edge descriptors
146+
- [x] Implement `descriptor<Tag>` wrapper with `operator<=>` and hash
147+
- [x] Define `vertex_tag`, `edge_tag`
148+
- [x] Typedef `vertex_descriptor = descriptor<vertex_tag>` (opt-in or default)
149+
- [x] Verify type safety prevents mixing vertex/edge descriptors
111150

112151
### 3.4 Modernize Other Containers
113-
- [ ] Review `adjacency_matrix` for range support
114-
- [ ] Review `compressed_sparse_row_graph` for `std::span` usage
115-
- [ ] Review `grid_graph`, `labeled_graph`, `subgraph`
152+
- [x] Implement `adjacency_matrix` with range support, O(1) edge lookup, bundled properties
153+
- [x] Implement `compressed_sparse_row_graph` with `std::span` for zero-copy adjacency access
154+
- [x] Implement `grid_graph` for N-dimensional implicit grid graphs
116155

117156
---
118157

@@ -121,25 +160,25 @@ libs/headers---
121160
**Goal:** Add coroutines, parallel execution, algorithm composition.
122161

123162
### 4.1 Coroutine-Based Traversals (C++20/23)
124-
- [ ] Implement `generator<T>` (or use `std::generator` in C++23)
125-
- [ ] Implement `bfs_traverse(g, start)` as coroutine yielding vertices
126-
- [ ] Implement `dfs_traverse(g, start)` as coroutine yielding vertices
127-
- [ ] Support early termination via `co_return` / breaking out of range-for
163+
- [x] Implement `generator<T>` (or use `std::generator` in C++23)
164+
- [x] Implement `bfs_traverse(g, start)` as coroutine yielding vertices
165+
- [x] Implement `dfs_traverse(g, start)` as coroutine yielding vertices
166+
- [x] Support early termination via `co_return` / breaking out of range-for
128167

129168
### 4.2 Parallel Execution Policies
130-
- [ ] Identify parallelizable algorithms (BFS levels, independent component processing)
131-
- [ ] Add `std::execution::par` overloads for applicable algorithms
132-
- [ ] Benchmark parallel vs sequential performance
169+
- [x] Identify parallelizable algorithms (BFS levels, independent component processing)
170+
- [x] Add `std::execution::par` overloads for applicable algorithms
171+
- [x] Benchmark parallel vs sequential performance
133172

134173
### 4.3 Algorithm Composition
135-
- [ ] Design pipeline/composition API (e.g., `g | find_components() | filter_large()`)
136-
- [ ] Prototype with 2-3 composable operations
137-
- [ ] Evaluate integration with `std::ranges` pipelines
174+
- [x] Design pipeline/composition API (e.g., `g | find_components() | filter_large()`)
175+
- [x] Prototype with 2-3 composable operations
176+
- [x] Evaluate integration with `std::ranges` pipelines
138177

139178
### 4.4 Validation Framework
140-
- [ ] Implement `validate_graph(g)` runtime checks
141-
- [ ] Check for invalid descriptors, dangling edges, etc.
142-
- [ ] Return structured error information
179+
- [x] Implement `validate_graph(g)` runtime checks
180+
- [x] Check for invalid descriptors, dangling edges, etc.
181+
- [x] Return structured error information
143182

144183
---
145184

@@ -148,26 +187,28 @@ libs/headers---
148187
**Goal:** Comprehensive test coverage and migration documentation.
149188

150189
### 5.1 Concept Tests
151-
- [ ] `static_assert` tests for all concepts against `adjacency_list`
152-
- [ ] `static_assert` tests for user-defined graph types
153-
- [ ] Negative tests (types that should *not* satisfy concepts)
190+
- [x] `static_assert` tests for all concepts against `adjacency_list`
191+
- [x] `static_assert` tests for user-defined graph types
192+
- [x] Negative tests (types that should *not* satisfy concepts)
154193

155194
### 5.2 Range Tests
156-
- [ ] Test `vertices(g)` with `std::ranges::for_each`
157-
- [ ] Test `out_edges(v, g)` with `std::views::filter`
158-
- [ ] Test algorithm outputs with `std::ranges::sort`, `std::ranges::copy`
195+
- [x] Test `vertices(g)` with `std::ranges::for_each`
196+
- [x] Test `out_edges(v, g)` with `std::views::filter`
197+
- [x] Test algorithm outputs with `std::ranges::sort`, `std::ranges::copy`
198+
- [x] Test complex range pipelines with multiple views
199+
- [x] Test range property concepts (forward_range, etc.)
159200

160201
### 5.3 Algorithm Tests
161-
- [ ] Port existing Boost.Graph test cases to new API
162-
- [ ] Add tests for structured returns
163-
- [ ] Add tests for lambda visitors
164-
- [ ] Add tests for named parameter structs
202+
- [x] Port existing Boost.Graph test cases to new API
203+
- [x] Add tests for structured returns
204+
- [x] Add tests for lambda visitors
205+
- [x] Add tests for named parameter structs
165206

166207
### 5.4 Performance Tests
167-
- [ ] Benchmark Dijkstra (old vs new)
168-
- [ ] Benchmark BFS/DFS (old vs new)
169-
- [ ] Benchmark graph construction
170-
- [ ] Ensure no performance regression
208+
- [x] Benchmark Dijkstra (old vs new)
209+
- [x] Benchmark BFS/DFS (old vs new)
210+
- [x] Benchmark graph construction
211+
- [x] Ensure no performance regression
171212

172213
### 5.5 Documentation
173214
- [ ] Write migration guide: old API → new API
@@ -212,7 +253,7 @@ libs/headers---
212253
|-------|----------|--------|------------------|
213254
| **Phase 1** | HIGH | Medium | Concepts, ranges, property map foundation |
214255
| **Phase 2** | HIGH | High | Modern algorithm APIs, visitors, named params |
215-
| **Phase 3** | MEDIUM-HIGH | Medium | Container cleanup, strong typing, MPL removal |
256+
| **Phase 3** | MEDIUM-HIGH | High | Container selectors (listS/setS/mapS), strong typing, MPL removal |
216257
| **Phase 4** | MEDIUM | High | Coroutines, parallelism, composition |
217258
| **Phase 5** | HIGH | Medium | Tests, docs, migration guide |
218259
| **Phase 6** | MEDIUM | Low | Cleanup, release |
@@ -242,9 +283,11 @@ Phase 6 (Release) after all others complete
242283
|-------|----------|------------|
243284
| Phase 1 | 4-6 weeks | 4-6 weeks |
244285
| Phase 2 | 6-8 weeks | 10-14 weeks |
245-
| Phase 3 | 4-6 weeks | 14-20 weeks |
246-
| Phase 4 | 4-6 weeks | 18-26 weeks |
247-
| Phase 5 | 3-4 weeks | 21-30 weeks |
248-
| Phase 6 | 1-2 weeks | 22-32 weeks |
286+
| Phase 3 | 6-8 weeks | 16-22 weeks |
287+
| Phase 4 | 4-6 weeks | 20-28 weeks |
288+
| Phase 5 | 3-4 weeks | 23-32 weeks |
289+
| Phase 6 | 1-2 weeks | 24-34 weeks |
249290

250-
**Total estimated duration: 5-8 months**
291+
**Total estimated duration: 6-8.5 months**
292+
293+
*Note: Phase 3 duration increased to account for container selector implementation (listS, setS, mapS, multisetS, hash_* variants).*

0 commit comments

Comments
 (0)