Solving Monodromy

Build a compiled parameter homotopy, seed one vertex with a known solution, and run monodromy tracking. The basic workflow only needs vertices: if no explicit edge list is supplied, solve_monodromy tracks the complete graph on those vertices. The graph-based monodromy workflow follows the computational monodromy framework of [DHJ+19], with certified homotopy-graph ideas from [DL26].

julia> @variables x y p q;
julia> CC = AcbField(256);
julia> F = [p*x^2 + 3y - 4, y^2 + q];
julia> compiled = compile_edge_homotopy(F, [x, y], [p, q]);Compilation Done.
julia> v1 = vertex([CC(1), CC(-1)], [[CC(1), CC(1)]]);
julia> vertices = [v1; [vertex([CC(cis(0.2k)), CC(cis(0.3k))]) for k in 1:3]];
julia> length(vertices)4

Solve the complete monodromy graph by passing only compiled and vertices.

result = solve_monodromy(compiled, vertices; max_roots=4)
length(result.edges)
result.success

For threaded monodromy tracking, pass threading=true and choose the number of tasks.

result = solve_monodromy(
    compiled,
    vertices;
    threading=true,
    ntasks=4,
)

Use Homotopy Graph when you want to inspect vertices and edges as data structures or supply a custom graph instead of the complete graph.

CertifiedHomotopyTracking.solve_monodromyFunction
solve_monodromy(compiled, vertices[, edges]; kwargs...) -> MonodromyResult

Track a monodromy graph and discover solution correspondences.

The current Symbolics-based workflow uses a CompiledHomotopy from compile_edge_homotopy. If edges are omitted, a complete graph is built on vertices. If edges are supplied, the custom graph is tracked.

Options for the compiled workflow

  • max_roots=20: target number of correspondences per edge.
  • max_attempts=10: stop after this many consecutive stagnant solve-loop iterations. An iteration is stagnant when the stored correspondences do not increase after tracking the current graph, so increasing this value gives the solver more chances to discover new roots before returning a partial result.
  • show_progress=false: print path-tracking progress.
  • root_match=:certified_or_heuristic: root matching mode used when deciding whether a tracked endpoint is already present in the target vertex. Supported values are :heuristic, :certified, and :certified_or_heuristic.
  • projective=false: track in projective charts. Requires compiled to be built with projective=true.
  • track_options=(;): keyword options forwarded to track_path, for example (; adaptive_precision=false, h_init=0.05).
  • posteriori=false: additionally certify paths with certify_posteriori.
  • posteriori_options=(;): options forwarded to a posteriori certification.
  • threading=false, ntasks=Threads.nthreads(): track independent paths in parallel when enabled.

The graph is mutated in-place. Interrupting with Ctrl-C returns partial data.

Example

@variables x y p q;
CC = AcbField(256);
F = [p*x^2 + 3y - 4, y^2 + q];
compiled = compile_edge_homotopy(F, [x, y], [p, q]);

v1 = vertex([CC(1), CC(-1)], [[CC(1), CC(1)]]);
vertices = [v1; [vertex([CC(cis(0.2k)), CC(cis(0.3k))]) for k in 1:3]];

# Omitting edges uses the complete graph on vertices.
result = solve_monodromy(compiled, vertices; max_roots=4)
length(result.edges)
source
solve_monodromy(compiled_sys, vertices, edges; kwargs...)

Track the given graph for a compiled homotopy and return a MonodromyResult. The result stores the mutated vertices, edges, success/status metadata, iteration counts, and optional diagnostics.

Within one solve run, paths that already failed are cached and skipped on later iterations with the same options.

source

References

[DHJ+19]
T. Duff, C. Hill, A. Jensen, K. Lee, A. Leykin and J. Sommars. Solving polynomial systems via homotopy continuation and monodromy. IMA Journal of Numerical Analysis 39, 1421–1446 (2019).
[DL26]
T. Duff and K. Lee. Certifying Galois/monodromy Actions via Homotopy Graphs, arXiv preprint arXiv:2603.17288 (2026).