Tiny hypergraph implementation. Read more about HyperGraph Autorouting, check out online animated examples
import type { SerializedHyperGraph } from "@tscircuit/hypergraph"
import { loadSerializedHyperGraph } from "lib/compat/loadSerializedHyperGraph"
import { TinyHyperGraphSolver } from "lib"
const inputGraph: SerializedHyperGraph = /* ... */
const { topology, problem } = loadSerializedHyperGraph(inputGraph)
const solver = new TinyHyperGraphSolver(topology, problem)
solver.solve()
if (!solver.solved || solver.failed) {
throw new Error(solver.error ?? "Solver did not finish successfully")
}
const solvedGraph = solver.getOutput()Existing routing can be preloaded through the standard region assignments:
const inputGraph: SerializedHyperGraph = {
regions: [
{
regionId: "middle",
pointIds: ["left-port", "right-port"],
assignments: [
{
regionPort1Id: "left-port",
regionPort2Id: "right-port",
connectionId: "trace-1",
},
],
d: {},
},
],
ports,
connections,
}The assignments seed regular route-owned solver state. They reserve their existing ports and contribute to region congestion immediately, but remain eligible for the normal rip-and-reroute process. They do not create regions or otherwise change the hypergraph topology.
solver.getOutput() now returns a SerializedHyperGraph for a solved
TinyHyperGraphSolver.
Under the hood it uses
lib/compat/convertToSerializedHyperGraph.ts, which reconstructs:
regions- region
assignments portsconnectionssolvedRoutes
The serialized region and port ids from
loadSerializedHyperGraph(...) are preserved, so a graph loaded through the
compat layer can be solved and then round-tripped back into the same serialized
shape.
If you want to call the converter directly:
import { convertToSerializedHyperGraph } from "lib/compat/convertToSerializedHyperGraph"
const solvedGraph = convertToSerializedHyperGraph(solver)The converter expects the solver to be fully solved and not failed.