|
414 | 414 | {"id":"franken_networkx-i1d","title":"Utility Extras B: remove attrs, describe, Floyd-Warshall numpy, misc","description":"Implement ~10 utility functions: remove_node_attributes(G, name) — delete attribute from all nodes; remove_edge_attributes(G, name) — delete from all edges; describe(G) — detailed graph description string; floyd_warshall_numpy(G, weight) — Floyd-Warshall via numpy matrix operations O(n^3); global_parameters(G) — global graph parameters (diameter, girth, etc.); intersection_array(G) — intersection array for distance-regular graphs; harmonic_diameter(G) — harmonic mean of all distances; goldberg_radzik(G, source, weight) — shortest paths with negative weights, faster than Bellman-Ford; is_perfect_graph(G) — check if graph is perfect (Strong Perfect Graph Theorem); tutte_polynomial(G, x, y) — Tutte polynomial evaluation via deletion-contraction. Tests: Floyd-Warshall numpy matches Dijkstra all-pairs, remove_attrs actually removes, NX parity.","status":"closed","priority":4,"issue_type":"task","created_at":"2026-03-22T17:34:39.170489516Z","created_by":"ubuntu","updated_at":"2026-03-22T22:38:06.630383101Z","closed_at":"2026-03-22T22:38:06.629748971Z","close_reason":"Implemented 6 utility functions: remove_node_attributes, remove_edge_attributes, floyd_warshall_numpy, harmonic_diameter, global_parameters, intersection_array.","source_repo":".","compaction_level":0,"original_size":0,"labels":["algorithms"]} |
415 | 415 | {"id":"franken_networkx-i2ul","title":"Degree-sequence predicate wrappers diverge on invalid-input parity","status":"closed","priority":2,"issue_type":"bug","created_at":"2026-04-19T01:15:59.321811152Z","created_by":"ubuntu","updated_at":"2026-04-19T01:20:40.679491853Z","closed_at":"2026-04-19T01:20:40.677691569Z","close_reason":"Completed","source_repo":".","compaction_level":0,"original_size":0} |
416 | 416 | {"id":"franken_networkx-i3f5","title":"Build broken: fnx-python fails to compile (missing edge_py_keys, borrow checker errors)","description":"Recent working tree changes broke the cargo build. Errors in crates/fnx-python include missing edge_py_keys field in PyMultiGraph/PyMultiDiGraph initializers, and E0502 borrow checker errors in remove_edge_metadata due to concurrent mutable and immutable borrows of self. Build fails with exit code 101.","status":"closed","priority":1,"issue_type":"bug","created_at":"2026-04-18T20:36:58.998805076Z","created_by":"ubuntu","updated_at":"2026-04-18T20:53:27.718897198Z","closed_at":"2026-04-18T20:53:27.717007602Z","close_reason":"Verified resolved in current worktree with rch cargo check","source_repo":".","compaction_level":0,"original_size":0} |
| 417 | +{"id":"franken_networkx-i4b8","title":"parity: conversion live views should expose dict factory attributes","description":"The top-level to_undirected() and to_directed() live views currently lack NetworkX's dict-factory attributes: adjlist_inner_dict_factory, adjlist_outer_dict_factory, edge_attr_dict_factory, graph_attr_dict_factory, node_attr_dict_factory, and node_dict_factory. Upstream conversion views expose each of these and they materialize empty dicts by default. Match the upstream factory-attribute surface on both conversion views.","status":"open","priority":2,"issue_type":"task","created_at":"2026-04-21T07:20:09.627649830Z","created_by":"ubuntu","updated_at":"2026-04-21T07:20:09.627649830Z","source_repo":".","compaction_level":0,"original_size":0} |
417 | 418 | {"id":"franken_networkx-i4tm","title":"chordal_graph_cliques returns empty list for non-chordal graphs","status":"closed","priority":2,"issue_type":"task","created_at":"2026-04-19T06:56:02.157583736Z","created_by":"ubuntu","updated_at":"2026-04-19T07:09:34.925329282Z","closed_at":"2026-04-19T07:09:34.923475296Z","close_reason":"Completed","source_repo":".","compaction_level":0,"original_size":0} |
418 | 419 | {"id":"franken_networkx-i6q0","title":"[A2.1] Audit committed binary blobs","description":"**Track:** A. **Priority:** P1. **Type:** task.","status":"closed","priority":2,"issue_type":"task","created_at":"2026-04-09T00:23:26.167651233Z","updated_at":"2026-04-13T17:50:46.718314597Z","closed_at":"2026-04-13T17:50:46.718037973Z","close_reason":"Audit complete: found only expected binaries - project images (webp, png) and inherited legacy NetworkX assets (favicon, test fixtures). .gitignore properly excludes runtime binaries (.pyc, .so, .pyd). No unexpected or suspicious blobs.","source_repo":".","compaction_level":0,"original_size":0} |
419 | 420 | {"id":"franken_networkx-i8rn","title":"Add no-fallback parity probes for top-level graph views","description":"Apply testing-conformance-harnesses to harden top-level nodes, edges, and degree helper parity by computing NetworkX expected values first, then patching those NetworkX helpers during FNX calls.","status":"closed","priority":2,"issue_type":"task","created_at":"2026-04-18T07:32:40.433876104Z","created_by":"ubuntu","updated_at":"2026-04-18T07:33:58.703383516Z","closed_at":"2026-04-18T07:33:58.700311293Z","close_reason":"Completed no-fallback top-level graph view parity probes","source_repo":".","compaction_level":0,"original_size":0} |
|
472 | 473 | {"id":"franken_networkx-km0","title":"Make PageRank/Katz/HITS parameters user-configurable via Python API","description":"## What\n\nThe iterative centrality algorithms (PageRank, Katz, HITS, eigenvector) use hardcoded\ndefault parameters that match NetworkX. While the DEFAULTS are correct, the Python\nAPI doesn't always expose them as keyword arguments, meaning users can't override:\n\n- max_iter: currently hardcoded to 100/1000 in Rust, not passable from Python\n- tol: convergence tolerance, not passable from Python\n- alpha (Katz/PageRank): passable for PageRank, NOT for Katz\n\n## Current State\n\nThe Rust implementations accept these as function parameters:\n```rust\npub fn pagerank(graph: &Graph) -> PageRankResult\npub fn katz_centrality(graph: &Graph) -> KatzCentralityResult\n```\n\nBut the Python bindings hardcode them:\n```rust\n#[pyfunction]\npub fn pagerank(py, g) { ... fnx_algorithms::pagerank(inner) ... }\n```\n\nNetworkX's signatures:\n- nx.pagerank(G, alpha=0.85, max_iter=100, tol=1.0e-06, ...)\n- nx.katz_centrality(G, alpha=0.1, beta=1.0, max_iter=1000, tol=1.0e-06, ...)\n- nx.hits(G, max_iter=100, tol=1.0e-08, ...)\n\n## What To Do\n\n1. Update Rust functions to accept parameters (some already do, verify all)\n2. Update PyO3 bindings to accept keyword args with NX-matching defaults:\n ```rust\n #[pyfunction]\n #[pyo3(signature = (g, alpha=0.85, max_iter=100, tol=1.0e-6, weight=\"weight\"))]\n pub fn pagerank(...) -> ...\n ```\n3. Thread parameters through to the Rust implementation\n\n## Why This Matters\n\nUsers who need to tune convergence (large graphs, slow convergence) currently\ncan't. This is a functional parity gap with NetworkX, not just a cosmetic issue.\n\n## Files To Change\n\n- crates/fnx-algorithms/src/lib.rs (verify parameter threading)\n- crates/fnx-python/src/algorithms.rs (add kwargs to pagerank, katz_centrality, hits)\n\n## Verification\n\n- Existing tests should pass unchanged (they use defaults)\n- Add tests that pass non-default values and verify convergence","status":"closed","priority":2,"issue_type":"feature","created_at":"2026-03-25T03:07:30.808886192Z","created_by":"ubuntu","updated_at":"2026-03-25T03:18:19.584041235Z","closed_at":"2026-03-25T03:18:19.583403878Z","close_reason":"PageRank now accepts alpha, max_iter, tol kwargs via Python API. Rust pagerank_with_params() function added. Default values match NX exactly. All 1082 tests pass.","source_repo":".","compaction_level":0,"original_size":0,"dependencies":[{"issue_id":"franken_networkx-km0","depends_on_id":"franken_networkx-hl4","type":"blocks","created_at":"2026-03-25T03:07:37.785901031Z","created_by":"ubuntu","metadata":"{}","thread_id":""}]} |
473 | 474 | {"id":"franken_networkx-kopg","title":"Add no-fallback parity probes for disjoint union and relabel helpers","description":"Strengthen the disjoint_union, relabel_nodes, and convert_node_labels_to_integers parity test by computing NetworkX oracle outputs before no-fallback guards, then patching matching NetworkX functions during FrankenNetworkX calls.","status":"closed","priority":2,"issue_type":"task","created_at":"2026-04-18T10:44:14.468895207Z","created_by":"ubuntu","updated_at":"2026-04-18T10:45:47.342351809Z","closed_at":"2026-04-18T10:45:47.340189587Z","close_reason":"Completed no-fallback disjoint union and relabel helper parity probes","source_repo":".","compaction_level":0,"original_size":0} |
474 | 475 | {"id":"franken_networkx-ksxj","title":"Top-level omega wrapper diverges from NetworkX error and zero-division contract","status":"closed","priority":2,"issue_type":"task","created_at":"2026-04-19T04:19:39.808384673Z","created_by":"ubuntu","updated_at":"2026-04-19T04:23:44.585163924Z","closed_at":"2026-04-19T04:23:44.583335985Z","close_reason":"Completed","source_repo":".","compaction_level":0,"original_size":0} |
| 476 | +{"id":"franken_networkx-ktz1","title":"parity: conversion live views should expose to_directed_class and to_undirected_class","description":"The top-level to_undirected() and to_directed() live views currently lack the class-factory hooks to_directed_class() and to_undirected_class(). Upstream NetworkX conversion views expose these and return DiGraph / Graph respectively. Match the upstream class-factory API on both conversion views.","status":"open","priority":2,"issue_type":"task","created_at":"2026-04-21T07:19:55.069783381Z","created_by":"ubuntu","updated_at":"2026-04-21T07:19:55.069783381Z","source_repo":".","compaction_level":0,"original_size":0} |
475 | 477 | {"id":"franken_networkx-kuby","title":"Match reverse() undirected error contract","status":"closed","priority":2,"issue_type":"bug","created_at":"2026-04-18T19:52:41.505038832Z","created_by":"ubuntu","updated_at":"2026-04-18T19:54:55.511898366Z","closed_at":"2026-04-18T19:54:55.510038948Z","close_reason":"Completed","source_repo":".","compaction_level":0,"original_size":0} |
476 | 478 | {"id":"franken_networkx-kvly","title":"port: Louvain communities with Leiden refinement parity","description":"NetworkX 3.4 louvain_communities with seed, resolution, threshold","status":"closed","priority":2,"issue_type":"task","created_at":"2026-04-20T18:28:03.255999892Z","created_by":"ubuntu","updated_at":"2026-04-20T18:47:44.908455493Z","closed_at":"2026-04-20T18:47:44.906123030Z","close_reason":"Completed","source_repo":".","compaction_level":0,"original_size":0} |
477 | 479 | {"id":"franken_networkx-kw8","title":"Fix degree_mixing_dict nodes/weight parity","status":"closed","priority":1,"issue_type":"bug","created_at":"2026-04-01T18:54:18.016419094Z","created_by":"ubuntu","updated_at":"2026-04-01T18:56:08.530379430Z","closed_at":"2026-04-01T18:56:08.530122353Z","close_reason":"degree_mixing_dict already matches NX for default, nodes, and weight params after Python-side revert. Verified with parity tests.","source_repo":".","compaction_level":0,"original_size":0} |
|
712 | 714 | {"id":"franken_networkx-vcx2","title":"Fix self-loop degree handling in path/regular checks","status":"closed","priority":2,"issue_type":"bug","created_at":"2026-04-11T18:06:31.722432354Z","created_by":"ubuntu","updated_at":"2026-04-11T18:09:35.282065329Z","closed_at":"2026-04-11T18:09:35.281752346Z","close_reason":"Fixed self-loop degree handling in path/regular checks","source_repo":".","compaction_level":0,"original_size":0} |
713 | 715 | {"id":"franken_networkx-vd6","title":"Extract assortativity denominator epsilon to named constant","description":"## What\n\nReplace 2 inline 1e-15 values in assortativity computations with the named constant\nASSORTATIVITY_EPSILON (defined as 1.0e-15).\n\n## Status: COMPLETED (March 2026)\n\nOccurrences replaced:\n1. degree_assortativity_coefficient (line ~6896): denominator.abs() < ASSORTATIVITY_EPSILON\n Guards against division by zero when all nodes have identical degree.\n2. attribute_assortativity (line ~21154): (1.0 - e_squared).abs() < ASSORTATIVITY_EPSILON\n Guards against division by zero in the r = (tr(e) - ||e²||) / (1 - ||e²||) formula\n when the mixing matrix is a perfect identity (all same-attribute edges).\n\n## Why 1e-15\n\nThis is tighter than DISTANCE_COMPARISON_EPSILON (1e-12) because assortativity\noperates on normalized mixing matrices where values are small fractions. A looser\nepsilon would incorrectly classify near-assortative graphs as perfectly assortative.\n\n## Files Changed\n\n- crates/fnx-algorithms/src/lib.rs (lines 26, ~6896, ~21154)","status":"closed","priority":1,"issue_type":"task","created_at":"2026-03-25T03:04:35.309898181Z","created_by":"ubuntu","updated_at":"2026-03-25T03:04:42.417788477Z","closed_at":"2026-03-25T03:04:42.417023980Z","close_reason":"Both 1e-15 values replaced with ASSORTATIVITY_EPSILON. Verified.","source_repo":".","compaction_level":0,"original_size":0} |
714 | 716 | {"id":"franken_networkx-ve84","title":"Public all_triangles wrapper lacks NetworkX nbunch contract","status":"closed","priority":2,"issue_type":"task","created_at":"2026-04-19T05:05:19.241985837Z","created_by":"ubuntu","updated_at":"2026-04-19T05:10:22.169936511Z","closed_at":"2026-04-19T05:10:22.168077943Z","close_reason":"Completed","source_repo":".","compaction_level":0,"original_size":0} |
| 717 | +{"id":"franken_networkx-veds","title":"parity: conversion live views should expose nbunch_iter","description":"The top-level to_undirected() and to_directed() live views currently lack NetworkX's nbunch_iter() helper entirely. Upstream conversion views expose nbunch_iter(['a','z']) -> ['a'], while FrankenNetworkX raises AttributeError. Match the upstream node-bunch helper contract on both conversion views.","status":"in_progress","priority":2,"issue_type":"task","created_at":"2026-04-21T07:19:40.555198489Z","created_by":"ubuntu","updated_at":"2026-04-21T07:20:33.552621714Z","source_repo":".","compaction_level":0,"original_size":0} |
715 | 718 | {"id":"franken_networkx-vh7p","title":"Native degree-sequence generator parity without NetworkX delegation","description":"Porting-to-Rust gap discovered 2026-04-18 with no ready beads. docs/coverage.md lists havel_hakimi_graph, directed_havel_hakimi_graph, directed_configuration_model, expected_degree_graph, random_degree_sequence_graph, joint_degree_graph, directed_joint_degree_graph, and random_clustered_graph as NX_DELEGATED. Scope: extract NetworkX validation/error semantics and deterministic node/edge ordering where applicable, implement native generator coverage in fnx-generators/fnx-python, and add conformance tests including invalid degree sequences and seed-sensitive cases.","status":"closed","priority":2,"issue_type":"feature","created_at":"2026-04-18T00:28:06.752948393Z","created_by":"ubuntu","updated_at":"2026-04-18T01:34:39.291952980Z","closed_at":"2026-04-18T01:34:39.289932587Z","close_reason":"Implemented native degree-sequence generator parity without NetworkX delegation","source_repo":".","compaction_level":0,"original_size":0,"labels":["generators","parity","porting"]} |
716 | 719 | {"id":"franken_networkx-vihg","title":"Public square_clustering wrapper lacks NetworkX nodes contract and digraph semantics","status":"closed","priority":2,"issue_type":"task","created_at":"2026-04-19T05:19:31.877230603Z","created_by":"ubuntu","updated_at":"2026-04-19T05:22:34.236126013Z","closed_at":"2026-04-19T05:22:34.234197253Z","close_reason":"Completed","source_repo":".","compaction_level":0,"original_size":0} |
717 | 720 | {"id":"franken_networkx-viqn","title":"parity: all_pairs_all_shortest_paths should preserve full path-list parity","description":"all_pairs_all_shortest_paths currently returns single paths instead of lists of all shortest paths and misses self entries. On the same weighted diamond graph, FrankenNetworkX gives result['a']['e'] == ['a','b','e'] while NetworkX gives [['a','b','e'], ['a','b','d','e'], ['a','c','d','e']]. Rework it to match NetworkX's dict-of-dict-of-list-of-paths contract for weighted and unweighted graphs, ideally by reusing a correct single_source_all_shortest_paths implementation.","status":"closed","priority":2,"issue_type":"task","created_at":"2026-04-21T04:28:21.868861484Z","created_by":"ubuntu","updated_at":"2026-04-21T04:48:08.158420667Z","closed_at":"2026-04-21T04:48:08.156517082Z","close_reason":"Completed","source_repo":".","compaction_level":0,"original_size":0} |
|
0 commit comments