diff --git a/examples/01_simple_route.py b/examples/01_simple_route.py index 6bbbcfa..fd006a7 100644 --- a/examples/01_simple_route.py +++ b/examples/01_simple_route.py @@ -26,8 +26,8 @@ def main() -> None: # Precompute the danger map (distance field) for heuristics danger_map.precompute([obstacle]) - evaluator = CostEvaluator(engine, danger_map, greedy_h_weight=1.5, bend_penalty=50.0, sbend_penalty=150.0) - router = AStarRouter(evaluator, snap_size=1.0, bend_radii=[10.0], sbend_radii=[10.0]) + evaluator = CostEvaluator(engine, danger_map, bend_penalty=50.0, sbend_penalty=150.0) + router = AStarRouter(evaluator, snap_size=1.0, bend_radii=[10.0]) pf = PathFinder(router, evaluator) # 2. Define Netlist diff --git a/examples/02_congestion_resolution.py b/examples/02_congestion_resolution.py index f6265c2..6963860 100644 --- a/examples/02_congestion_resolution.py +++ b/examples/02_congestion_resolution.py @@ -16,8 +16,8 @@ def main() -> None: danger_map = DangerMap(bounds=bounds) danger_map.precompute([]) - evaluator = CostEvaluator(engine, danger_map, greedy_h_weight=1.5, bend_penalty=50.0, sbend_penalty=150.0) - router = AStarRouter(evaluator, snap_size=1.0, bend_radii=[10.0], sbend_radii=[10.0]) + evaluator = CostEvaluator(engine, danger_map, bend_penalty=50.0, sbend_penalty=150.0) + router = AStarRouter(evaluator, snap_size=1.0, bend_radii=[10.0]) pf = PathFinder(router, evaluator) # 2. Define Netlist diff --git a/examples/03_locked_paths.py b/examples/03_locked_paths.py index a60e944..2e5adcf 100644 --- a/examples/03_locked_paths.py +++ b/examples/03_locked_paths.py @@ -18,8 +18,8 @@ def main() -> None: danger_map = DangerMap(bounds=bounds) danger_map.precompute([]) - evaluator = CostEvaluator(engine, danger_map, greedy_h_weight=1.5, bend_penalty=50.0, sbend_penalty=150.0) - router = AStarRouter(evaluator, snap_size=1.0, bend_radii=[10.0], sbend_radii=[10.0]) + evaluator = CostEvaluator(engine, danger_map, bend_penalty=50.0, sbend_penalty=150.0) + router = AStarRouter(evaluator, snap_size=1.0, bend_radii=[10.0]) pf = PathFinder(router, evaluator) # 2. Add a 'Pre-routed' net and lock it diff --git a/examples/04_sbends_and_radii.py b/examples/04_sbends_and_radii.py index 18efda7..a3e36cf 100644 --- a/examples/04_sbends_and_radii.py +++ b/examples/04_sbends_and_radii.py @@ -21,7 +21,6 @@ def main() -> None: engine, danger_map, unit_length_cost=1.0, - greedy_h_weight=1.5, bend_penalty=10.0, sbend_penalty=20.0, ) @@ -32,7 +31,6 @@ def main() -> None: snap_size=1.0, bend_radii=[10.0, 30.0], sbend_offsets=[5.0], # Use a simpler offset - sbend_radii=[10.0], bend_penalty=10.0, sbend_penalty=20.0, snap_to_target_dist=50.0, # Large snap range diff --git a/examples/05_orientation_stress.py b/examples/05_orientation_stress.py index 1a1c8d6..5f952cd 100644 --- a/examples/05_orientation_stress.py +++ b/examples/05_orientation_stress.py @@ -16,8 +16,8 @@ def main() -> None: danger_map = DangerMap(bounds=bounds) danger_map.precompute([]) - evaluator = CostEvaluator(engine, danger_map, greedy_h_weight=1.5, bend_penalty=50.0, sbend_penalty=150.0) - router = AStarRouter(evaluator, snap_size=1.0, bend_radii=[10.0], sbend_radii=[10.0]) + evaluator = CostEvaluator(engine, danger_map, bend_penalty=50.0, sbend_penalty=150.0) + router = AStarRouter(evaluator, snap_size=1.0, bend_radii=[10.0]) pf = PathFinder(router, evaluator) # 2. Define Netlist: Complex orientation challenges diff --git a/examples/06_bend_collision_models.py b/examples/06_bend_collision_models.py index e061dc4..9b75287 100644 --- a/examples/06_bend_collision_models.py +++ b/examples/06_bend_collision_models.py @@ -30,18 +30,18 @@ def main() -> None: danger_map.precompute(obstacles) # We'll run three separate routers since collision_type is a router-level config - evaluator = CostEvaluator(engine, danger_map, greedy_h_weight=1.5, bend_penalty=50.0, sbend_penalty=150.0) + evaluator = CostEvaluator(engine, danger_map, bend_penalty=50.0, sbend_penalty=150.0) # Scenario 1: Standard 'arc' model (High fidelity) - router_arc = AStarRouter(evaluator, snap_size=1.0, bend_radii=[10.0], sbend_radii=[10.0], bend_collision_type="arc") + router_arc = AStarRouter(evaluator, snap_size=1.0, bend_radii=[10.0], bend_collision_type="arc") netlist_arc = {"arc_model": (Port(10, 120, 0), Port(90, 140, 90))} # Scenario 2: 'bbox' model (Conservative axis-aligned box) - router_bbox = AStarRouter(evaluator, snap_size=1.0, bend_radii=[10.0], sbend_radii=[10.0], bend_collision_type="bbox") + router_bbox = AStarRouter(evaluator, snap_size=1.0, bend_radii=[10.0], bend_collision_type="bbox") netlist_bbox = {"bbox_model": (Port(10, 70, 0), Port(90, 90, 90))} # Scenario 3: 'clipped_bbox' model (Balanced) - router_clipped = AStarRouter(evaluator, snap_size=1.0, bend_radii=[10.0], sbend_radii=[10.0], bend_collision_type="clipped_bbox", bend_clip_margin=1.0) + router_clipped = AStarRouter(evaluator, snap_size=1.0, bend_radii=[10.0], bend_collision_type="clipped_bbox", bend_clip_margin=1.0) netlist_clipped = {"clipped_model": (Port(10, 20, 0), Port(90, 40, 90))} # 2. Route each scenario diff --git a/examples/08_custom_bend_geometry.py b/examples/08_custom_bend_geometry.py index 837d37e..2451186 100644 --- a/examples/08_custom_bend_geometry.py +++ b/examples/08_custom_bend_geometry.py @@ -18,8 +18,8 @@ def main() -> None: danger_map = DangerMap(bounds=bounds) danger_map.precompute([]) - evaluator = CostEvaluator(engine, danger_map, greedy_h_weight=1.5, bend_penalty=50.0, sbend_penalty=150.0) - router = AStarRouter(evaluator, snap_size=1.0, bend_radii=[10.0], sbend_radii=[10.0]) + evaluator = CostEvaluator(engine, danger_map, bend_penalty=50.0, sbend_penalty=150.0) + router = AStarRouter(evaluator, snap_size=1.0, bend_radii=[10.0]) pf = PathFinder(router, evaluator) # 2. Define Netlist @@ -39,7 +39,7 @@ def main() -> None: print("Routing with custom collision model...") # Override bend_collision_type with a literal Polygon - router_custom = AStarRouter(evaluator, snap_size=1.0, bend_radii=[10.0], sbend_radii=[10.0], bend_collision_type=custom_poly) + router_custom = AStarRouter(evaluator, snap_size=1.0, bend_radii=[10.0], bend_collision_type=custom_poly) results_custom = PathFinder(router_custom, evaluator, use_tiered_strategy=False).route_all( {"custom_model": netlist["custom_bend"]}, {"custom_model": 2.0} ) diff --git a/examples/09_unroutable_best_effort.py b/examples/09_unroutable_best_effort.py index fb0444e..514ad0a 100644 --- a/examples/09_unroutable_best_effort.py +++ b/examples/09_unroutable_best_effort.py @@ -26,9 +26,9 @@ def main() -> None: danger_map = DangerMap(bounds=bounds) danger_map.precompute(cage) - evaluator = CostEvaluator(engine, danger_map, greedy_h_weight=1.5, bend_penalty=50.0, sbend_penalty=150.0) + evaluator = CostEvaluator(engine, danger_map, bend_penalty=50.0, sbend_penalty=150.0) # Use a low node limit to fail faster - router = AStarRouter(evaluator, node_limit=2000, snap_size=1.0, bend_radii=[10.0], sbend_radii=[10.0]) + router = AStarRouter(evaluator, node_limit=2000, snap_size=1.0, bend_radii=[10.0]) # Enable partial path return pf = PathFinder(router, evaluator) diff --git a/inire/router/config.py b/inire/router/config.py index 6e9c25d..a82a30a 100644 --- a/inire/router/config.py +++ b/inire/router/config.py @@ -23,7 +23,7 @@ class RouterConfig: straight_lengths: list[float] = field(default_factory=list) bend_radii: list[float] = field(default_factory=lambda: [50.0, 100.0]) - sbend_radii: list[float] = field(default_factory=lambda: [50.0, 100.0, 500.0]) + sbend_radii: list[float] = field(default_factory=lambda: [10.0]) snap_to_target_dist: float = 1000.0 bend_penalty: float = 250.0 sbend_penalty: float = 500.0 @@ -36,7 +36,7 @@ class CostConfig: """Configuration parameters for the Cost Evaluator.""" unit_length_cost: float = 1.0 - greedy_h_weight: float = 1.1 + greedy_h_weight: float = 1.5 congestion_penalty: float = 10000.0 bend_penalty: float = 250.0 sbend_penalty: float = 500.0 diff --git a/inire/router/cost.py b/inire/router/cost.py index e6d45c4..edec182 100644 --- a/inire/router/cost.py +++ b/inire/router/cost.py @@ -39,7 +39,7 @@ class CostEvaluator: collision_engine: CollisionEngine, danger_map: DangerMap, unit_length_cost: float = 1.0, - greedy_h_weight: float = 1.1, + greedy_h_weight: float = 1.5, congestion_penalty: float = 10000.0, bend_penalty: float = 250.0, sbend_penalty: float = 500.0, diff --git a/inire/tests/test_astar.py b/inire/tests/test_astar.py index 7744f88..890fb5f 100644 --- a/inire/tests/test_astar.py +++ b/inire/tests/test_astar.py @@ -13,13 +13,13 @@ from inire.utils.validation import validate_routing_result @pytest.fixture def basic_evaluator() -> CostEvaluator: engine = CollisionEngine(clearance=2.0) - danger_map = DangerMap(bounds=(0, 0, 100, 100)) + danger_map = DangerMap(bounds=(0, -50, 150, 150)) danger_map.precompute([]) return CostEvaluator(engine, danger_map, bend_penalty=50.0, sbend_penalty=150.0) def test_astar_straight(basic_evaluator: CostEvaluator) -> None: - router = AStarRouter(basic_evaluator, snap_size=1.0, straight_lengths=[1.0, 5.0, 25.0]) + router = AStarRouter(basic_evaluator, snap_size=1.0) start = Port(0, 0, 0) target = Port(50, 0, 0) path = router.route(start, target, net_width=2.0) @@ -35,7 +35,7 @@ def test_astar_straight(basic_evaluator: CostEvaluator) -> None: def test_astar_bend(basic_evaluator: CostEvaluator) -> None: - router = AStarRouter(basic_evaluator, snap_size=1.0, straight_lengths=[1.0, 5.0, 25.0], bend_radii=[10.0]) + router = AStarRouter(basic_evaluator, snap_size=1.0, bend_radii=[10.0]) start = Port(0, 0, 0) # 20um right, 20um up. Needs a 10um bend and a 10um bend. target = Port(20, 20, 0) @@ -56,7 +56,7 @@ def test_astar_obstacle(basic_evaluator: CostEvaluator) -> None: basic_evaluator.collision_engine.add_static_obstacle(obstacle) basic_evaluator.danger_map.precompute([obstacle]) - router = AStarRouter(basic_evaluator, snap_size=1.0, straight_lengths=[1.0, 5.0, 25.0], bend_radii=[10.0]) + router = AStarRouter(basic_evaluator, snap_size=1.0, bend_radii=[10.0]) router.node_limit = 1000000 # Give it more room for detour start = Port(0, 0, 0) target = Port(60, 0, 0) diff --git a/inire/tests/test_congestion.py b/inire/tests/test_congestion.py index 014a226..710ac45 100644 --- a/inire/tests/test_congestion.py +++ b/inire/tests/test_congestion.py @@ -39,7 +39,7 @@ def test_astar_sbend(basic_evaluator: CostEvaluator) -> None: def test_pathfinder_negotiated_congestion_resolution(basic_evaluator: CostEvaluator) -> None: - router = AStarRouter(basic_evaluator, snap_size=1.0, bend_radii=[5.0, 10.0], sbend_radii=[5.0, 10.0]) + router = AStarRouter(basic_evaluator, snap_size=1.0, bend_radii=[5.0, 10.0]) # Increase base penalty to force detour immediately pf = PathFinder(router, basic_evaluator, max_iterations=10, base_congestion_penalty=1000.0) diff --git a/inire/tests/test_cost.py b/inire/tests/test_cost.py index 8158c50..8251e86 100644 --- a/inire/tests/test_cost.py +++ b/inire/tests/test_cost.py @@ -10,7 +10,7 @@ def test_cost_calculation() -> None: danger_map = DangerMap(bounds=(0, 0, 50, 50)) danger_map.precompute([]) # Use small penalties for testing - evaluator = CostEvaluator(engine, danger_map, bend_penalty=10.0) + evaluator = CostEvaluator(engine, danger_map, greedy_h_weight=1.1, bend_penalty=10.0) p1 = Port(0, 0, 0) p2 = Port(10, 10, 0) diff --git a/inire/tests/test_refinements.py b/inire/tests/test_refinements.py index db1fd82..fcb949b 100644 --- a/inire/tests/test_refinements.py +++ b/inire/tests/test_refinements.py @@ -29,7 +29,7 @@ def test_locked_paths() -> None: danger_map = DangerMap(bounds=(0, -50, 100, 50)) danger_map.precompute([]) evaluator = CostEvaluator(engine, danger_map) - router = AStarRouter(evaluator, bend_radii=[5.0, 10.0], sbend_radii=[5.0, 10.0]) + router = AStarRouter(evaluator, bend_radii=[5.0, 10.0]) pf = PathFinder(router, evaluator) # 1. Route Net A