Skip to content

Commit 911da7e

Browse files
committed
fix(gen): move perfect graph generators before default handling
- Move ptolemaic, modular, quasi-line checks earlier in generateBaseStructure - Prevents these exact structures from being overridden by default connectivity handling - Add perfect graph variants to hasExactStructure to prevent density edge additions - Fixes root cause: ptolemaic generator creating paths, then generateDisconnectedEdges adding cycles - Modular and quasi-line generators also benefit from this fix This ensures graph class generators produce correct, unmolested structures.
1 parent 989acf2 commit 911da7e

2 files changed

Lines changed: 23 additions & 14 deletions

File tree

src/generation/generators/density-helpers.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,11 @@ export const hasExactStructure = (spec: GraphSpec): boolean => {
1919
spec.binaryTree?.kind === "complete_binary") return true;
2020
if (spec.tournament?.kind === "tournament") return true;
2121

22+
// Perfect graph class generators (produce exact structures)
23+
if (spec.modular?.kind === "modular") return true;
24+
if (spec.ptolemaic?.kind === "ptolemaic") return true;
25+
if (spec.quasiLine?.kind === "quasi_line") return true;
26+
2227
// Regularity constraints
2328
if (spec.cubic?.kind === "cubic") return true;
2429
if (spec.specificRegular?.kind === "k_regular") return true;

src/generation/generators/edge-generator.ts

Lines changed: 18 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -500,6 +500,24 @@ const generateBaseStructure = (nodes: TestNode[], spec: GraphSpec, _config: Grap
500500
return handleTopologicalMinorFree(nodes, edges, spec, rng);
501501
}
502502

503+
// ============================================================================
504+
// PERFECT GRAPH VARIANTS (check before default connectivity/cycles handling)
505+
// These generate exact structures that should not be modified
506+
// ============================================================================
507+
508+
if (spec.modular?.kind === "modular") {
509+
generateModularGraphEdges(nodes, edges, spec, rng);
510+
return edges;
511+
}
512+
if (spec.ptolemaic?.kind === "ptolemaic") {
513+
generatePtolemaicEdges(nodes, edges, spec, rng);
514+
return edges;
515+
}
516+
if (spec.quasiLine?.kind === "quasi_line") {
517+
generateQuasiLineEdges(nodes, edges, spec, rng);
518+
return edges;
519+
}
520+
503521
// Non-bipartite graphs
504522
if (spec.connectivity.kind === "connected" && spec.cycles.kind === "acyclic") {
505523
// Generate tree structure
@@ -573,20 +591,6 @@ const generateBaseStructure = (nodes: TestNode[], spec: GraphSpec, _config: Grap
573591
return edges;
574592
}
575593

576-
// Handle perfect graph variants
577-
if (spec.modular?.kind === "modular") {
578-
generateModularGraphEdges(nodes, edges, spec, rng);
579-
return edges;
580-
}
581-
if (spec.ptolemaic?.kind === "ptolemaic") {
582-
generatePtolemaicEdges(nodes, edges, spec, rng);
583-
return edges;
584-
}
585-
if (spec.quasiLine?.kind === "quasi_line") {
586-
generateQuasiLineEdges(nodes, edges, spec, rng);
587-
return edges;
588-
}
589-
590594
return edges;
591595
};
592596

0 commit comments

Comments
 (0)