17 KiB
Inire Configuration & API Documentation
This document describes the current public API for inire.
1. Primary API
RoutingProblem
RoutingProblem describes the physical routing problem:
boundsnetsstatic_obstaclesinitial_pathsclearancesafety_zone_radius
RoutingOptions
RoutingOptions groups all expert controls for the routing engine:
searchobjectivecongestionrefinementdiagnostics
Route a problem with:
run = route(problem, options=options)
If you omit options, route(problem) uses RoutingOptions() defaults.
The package root is the stable API surface. Deep imports under inire.router.* and inire.geometry.* remain accessible for advanced use, but they are unstable semi-private interfaces and may change without notice.
Stable example:
from inire import route, RoutingOptions, RoutingProblem
Unstable example:
from inire.router._router import PathFinder
Incremental routing with locked geometry
For incremental workflows, route one problem, reuse the result's locked geometry, and feed it into the next problem:
run_a = route(problem_a)
problem_b = RoutingProblem(
bounds=problem_a.bounds,
nets=(...),
static_obstacles=run_a.results_by_net["netA"].locked_geometry,
)
run_b = route(problem_b)
RoutingResult.locked_geometry stores canonical physical geometry only. The next run applies its own clearance rules when treating it as a static obstacle.
Initial paths with PathSeed
Use RoutingProblem.initial_paths to provide semantic per-net seeds. Seeds are materialized with the current width, clearance, and bend collision settings for the run, and partial seeds are retried by normal routing in later iterations.
2. Search Options
RoutingOptions.search is a SearchOptions object.
| Field | Default | Description |
|---|---|---|
node_limit |
1_000_000 |
Maximum number of states to explore per net. |
max_straight_length |
2000.0 |
Maximum length of a single straight segment. |
min_straight_length |
5.0 |
Minimum length of a single straight segment. |
greedy_h_weight |
1.5 |
Heuristic weight. 1.0 is optimal but slower. |
bend_radii |
(50.0, 100.0) |
Available radii for 90-degree bends. |
sbend_radii |
(10.0,) |
Available radii for S-bends. |
sbend_offsets |
None |
Optional explicit lateral offsets for S-bends. |
bend_collision_type |
"arc" |
Bend collision/proxy model: "arc", "bbox", "clipped_bbox", or, for backward compatibility, a custom polygon. A legacy custom polygon here is treated as both the physical bend and its proxy unless overridden by the split fields below. |
bend_proxy_geometry |
None |
Optional explicit bend proxy geometry. Use this when you want a custom search/collision envelope that differs from the routed bend shape. Supplying only a custom polygon proxy warns and keeps the physical bend as the standard arc. |
bend_physical_geometry |
None |
Optional explicit bend physical geometry. Use "arc" or a custom polygon. If you set a custom physical polygon and do not set a proxy, the proxy defaults to the same polygon. |
bend_clip_margin |
None |
Optional legacy shrink margin for "clipped_bbox". Leave None for the default 8-point proxy. |
visibility_guidance |
"tangent_corner" |
Visibility-derived straight candidate strategy. |
3. Objective Weights
RoutingOptions.objective and RoutingOptions.refinement.objective use ObjectiveWeights.
| Field | Default | Description |
|---|---|---|
unit_length_cost |
1.0 |
Cost per unit length. |
bend_penalty |
250.0 |
Flat bend penalty before radius scaling. |
sbend_penalty |
500.0 |
Flat S-bend penalty. |
danger_weight |
1.0 |
Weight applied to danger-map proximity costs. |
4. Congestion Options
RoutingOptions.congestion is a CongestionOptions object.
| Field | Default | Description |
|---|---|---|
max_iterations |
10 |
Maximum rip-up and reroute iterations. |
base_penalty |
100.0 |
Starting overlap penalty for negotiated congestion. |
multiplier |
1.5 |
Multiplier applied after an iteration still needs retries. |
use_tiered_strategy |
True |
Use cheaper collision proxies in the first pass when applicable. |
net_order |
"user" |
Net ordering strategy for warm-start seeding and routed iterations. |
warm_start_enabled |
True |
Run the greedy warm-start seeding pass before negotiated congestion iterations. |
shuffle_nets |
False |
Shuffle routing order between iterations. |
seed |
None |
RNG seed for shuffled routing order. |
5. Refinement Options
RoutingOptions.refinement is a RefinementOptions object.
| Field | Default | Description |
|---|---|---|
enabled |
True |
Enable post-route refinement. |
objective |
None |
Optional override objective for refinement. None reuses the search objective. |
6. Diagnostics Options
RoutingOptions.diagnostics is a DiagnosticsOptions object.
| Field | Default | Description |
|---|---|---|
capture_expanded |
False |
Record expanded nodes for diagnostics and visualization. |
capture_conflict_trace |
False |
Capture authoritative post-reverify conflict trace entries for debugging negotiated-congestion failures. |
capture_frontier_trace |
False |
Run an analysis-only reroute for reached-but-colliding nets and capture prune causes near their final conflict hotspots. |
7. Conflict Trace
RoutingRunResult.conflict_trace is an immutable tuple of post-reverify conflict snapshots. It is empty unless RoutingOptions.diagnostics.capture_conflict_trace=True.
Trace types:
ConflictTraceEntrystage:"iteration","restored_best", or"final"iteration: Iteration index for"iteration"entries, otherwiseNonecompleted_net_ids: Nets with collision-free reached-target paths at that stageconflict_edges: Undirected dynamic-conflict net pairs seen after full reverifynets: Per-net trace payloads in routing-order order
NetConflictTracenet_idoutcomereached_targetreportconflicting_net_ids: Dynamic conflicting nets for that stagecomponent_conflicts: Dynamic component-pair overlaps for that stage
ComponentConflictTraceother_net_idself_component_indexother_component_index
The conflict trace only records dynamic net-vs-net component overlaps. Static-obstacle and self-collision details remain count-only in RoutingReport.
Use scripts/record_conflict_trace.py to capture JSON and Markdown trace artifacts for the built-in trace scenarios. The default target is example_07_large_scale_routing_no_warm_start.
8. Frontier Trace
RoutingRunResult.frontier_trace is an immutable tuple of per-net post-run frontier analyses. It is empty unless RoutingOptions.diagnostics.capture_frontier_trace=True.
Trace types:
NetFrontierTracenet_idhotspot_bounds: Buffered bounds around the net's final dynamic component-overlap hotspotspruned_closed_setpruned_hard_collisionpruned_self_collisionpruned_costsamples: First traced prune events near those hotspots
FrontierPruneSamplereason:"closed_set","hard_collision","self_collision", or"cost"move_typehotspot_indexparent_stateend_state
The frontier trace is observational only. It reruns only the final reached-but-colliding nets in analysis mode, with scratch metrics, after the routed result is already fixed.
Use scripts/record_frontier_trace.py to capture JSON and Markdown frontier-prune artifacts for the built-in trace scenarios. The default target is example_07_large_scale_routing_no_warm_start.
Separately from the observational trace tooling, the router may run a bounded post-loop pair-local scratch reroute before refinement when the restored best snapshot ends with final two-net reached-target dynamic conflicts. That repair phase is part of normal routing behavior and is reported through the pair_local_search_* counters below.
9. RouteMetrics
RoutingRunResult.metrics is an immutable per-run snapshot.
Search Counters
nodes_expanded: Total nodes expanded during the run.moves_generated: Total candidate moves generated during the run.moves_added: Total candidate moves admitted to the open set.pruned_closed_set: Total moves pruned because the state was already closed at lower cost.pruned_hard_collision: Total moves pruned by hard collision checks.pruned_cost: Total moves pruned by cost ceilings or invalid costs.route_iterations: Number of negotiated-congestion iterations entered.nets_routed: Number of net-routing attempts executed across all iterations.nets_reached_target: Number of those attempts that reached the requested target port.warm_start_paths_built: Number of warm-start seed paths built by the greedy bootstrap pass.warm_start_paths_used: Number of routing attempts satisfied directly from an initial or warm-start path.refine_path_calls: Number of completed paths passed through the post-route refiner.timeout_events: Number of timeout exits encountered during the run.iteration_reverify_calls: Number of end-of-iteration full reverify passes against the final installed dynamic geometry.iteration_reverified_nets: Number of reached-target nets reverified at iteration boundaries.iteration_conflicting_nets: Total unique nets found in end-of-iteration dynamic conflicts.iteration_conflict_edges: Total undirected dynamic-conflict edges observed at iteration boundaries.nets_carried_forward: Number of nets retained unchanged between iterations.
Cache Counters
move_cache_abs_hits/move_cache_abs_misses: Absolute move-geometry cache activity.move_cache_rel_hits/move_cache_rel_misses: Relative move-geometry cache activity.guidance_match_moves: Number of moves that matched the reroute guidance seed and received the guidance bonus.guidance_match_moves_straight,guidance_match_moves_bend90,guidance_match_moves_sbend: Guidance-match counts split by move type.guidance_bonus_applied: Total reroute-guidance bonus subtracted from move costs across the run.guidance_bonus_applied_straight,guidance_bonus_applied_bend90,guidance_bonus_applied_sbend: Guidance bonus totals split by move type.static_safe_cache_hits: Reuse count for the static-safe admission cache.hard_collision_cache_hits: Reuse count for the hard-collision cache.congestion_cache_hits/congestion_cache_misses: Per-search congestion-cache activity.
Index And Collision Counters
dynamic_path_objects_added/dynamic_path_objects_removed: Dynamic-path geometry objects inserted into or removed from the live routing index.dynamic_tree_rebuilds: Number of dynamic STRtree rebuilds.dynamic_grid_rebuilds: Number of dynamic congestion-grid rebuilds.static_tree_rebuilds: Number of static dilated-obstacle STRtree rebuilds.static_raw_tree_rebuilds: Number of raw static-obstacle STRtree rebuilds used for verification.static_net_tree_rebuilds: Number of net-width-specific static STRtree rebuilds.visibility_corner_index_builds: Number of lazy corner-index rebuilds.visibility_builds: Number of exact corner-visibility graph rebuilds.visibility_corner_pairs_checked: Number of corner-pair visibility probes considered while building the exact graph.visibility_corner_queries_exact/visibility_corner_hits_exact: Exact-corner visibility query activity.visibility_point_queries,visibility_point_cache_hits,visibility_point_cache_misses: Arbitrary-point visibility query and cache activity.ray_cast_calls: Number of ray-cast queries issued against static obstacles.ray_cast_candidate_bounds: Total broad-phase candidate bounds considered by ray casts.ray_cast_exact_geometry_checks: Total exact non-rectangular geometry checks performed by ray casts.congestion_check_calls: Number of congestion broad-phase checks requested by search.congestion_presence_cache_hits/congestion_presence_cache_misses: Reuse of cached per-span booleans indicating whether a move polygon could overlap any other routed net at all.congestion_presence_skips: Number of moves that bypassed full congestion evaluation because the presence precheck found no other routed nets in any covered dynamic-grid span.congestion_candidate_precheck_hits/congestion_candidate_precheck_misses: Reuse of cached conservative per-span booleans indicating whether any candidate nets survive the net-envelope and grid-net broad phases.congestion_candidate_precheck_skips: Number of moves that bypassed full congestion evaluation because the candidate-net precheck found no surviving candidate nets after those broad phases.congestion_candidate_nets: Total candidate net ids returned by the dynamic net-envelope broad phase during routing.congestion_net_envelope_cache_hits/congestion_net_envelope_cache_misses: Reuse of cached dynamic net-envelope candidate sets keyed by the queried grid-cell span.congestion_grid_net_cache_hits/congestion_grid_net_cache_misses: Reuse of cached per-span candidate net ids gathered from dynamic grid occupancy.congestion_grid_span_cache_hits/congestion_grid_span_cache_misses: Reuse of cached dynamic-path candidate unions keyed by the queried grid-cell span.congestion_lazy_resolutions: Number of popped nodes whose pending congestion was resolved lazily.congestion_lazy_requeues: Number of lazily resolved nodes requeued after a positive congestion penalty was applied.congestion_candidate_ids: Total dynamic-path object ids returned by the congestion broad phase before exact confirmation.congestion_exact_pair_checks: Number of exact geometry-pair checks performed while confirming congestion hits.
Verification Counters
verify_path_report_calls: Number of full path-verification passes.verify_static_buffer_ops: Number of static-verificationbuffer()operations.verify_dynamic_candidate_nets: Total candidate net ids returned by the dynamic net-envelope broad phase during final verification.verify_dynamic_exact_pair_checks: Number of exact geometry-pair checks performed during dynamic-path verification.
Local Search Counters
pair_local_search_pairs_considered: Number of final reached-target conflict pairs considered by the bounded post-loop pair-local-search phase.pair_local_search_attempts: Number of pair-local-search reroute attempts executed across all considered pairs.pair_local_search_accepts: Number of pair-local-search attempts accepted into the whole routed result set.pair_local_search_nodes_expanded: Total A* node expansions spent inside pair-local-search attempts.
10. Internal Modules
Lower-level search and collision modules are semi-private implementation details. They remain accessible through deep imports for advanced use, but they are unstable and may change without notice. The stable supported entrypoint is route(problem, options=...).
The current implementation structure is summarized in docs/architecture.md. The committed example-corpus counter baseline is tracked in docs/performance.md.
Use scripts/diff_performance_baseline.py to compare a fresh local run against that baseline. Use scripts/record_conflict_trace.py for opt-in conflict-hotspot traces and scripts/record_frontier_trace.py for hotspot-adjacent prune traces. The counter baseline is currently observational and is not enforced as a CI gate.
11. Tuning Notes
Speed vs. optimality
- Lower
search.greedy_h_weighttoward1.0for better optimality. - Raise
search.greedy_h_weightfor faster, greedier routing.
Congestion handling
- Increase
congestion.base_penaltyto separate nets more aggressively in the first iteration. - Increase
congestion.max_iterationsif congestion needs more reroute passes. - Increase
congestion.multiplierif later iterations need to escalate more quickly.
Bend-heavy routes
- Increase
objective.bend_penaltyto discourage ladders of small bends. - Increase available
search.bend_radiiwhen larger turns are physically acceptable. - Use
search.bend_physical_geometryandsearch.bend_proxy_geometrytogether when you need a real custom bend shape plus a different conservative proxy.
Visibility guidance
"tangent_corner"is the default and best general-purpose setting in obstacle-dense layouts."exact_corner"is more conservative."off"disables visibility-derived straight candidates.
S-bends
- Leave
search.sbend_offsets=Noneto let the router derive natural offsets automatically. - Provide explicit
search.sbend_offsetsfor known process-preferred offsets. - S-bends are only used for offsets smaller than
2R.