update defaults for speed
This commit is contained in:
parent
7455917b4a
commit
148aca45d4
14 changed files with 27 additions and 29 deletions
|
|
@ -26,8 +26,8 @@ def main() -> None:
|
||||||
# Precompute the danger map (distance field) for heuristics
|
# Precompute the danger map (distance field) for heuristics
|
||||||
danger_map.precompute([obstacle])
|
danger_map.precompute([obstacle])
|
||||||
|
|
||||||
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)
|
||||||
router = AStarRouter(evaluator, snap_size=1.0, bend_radii=[10.0], sbend_radii=[10.0])
|
router = AStarRouter(evaluator, snap_size=1.0, bend_radii=[10.0])
|
||||||
pf = PathFinder(router, evaluator)
|
pf = PathFinder(router, evaluator)
|
||||||
|
|
||||||
# 2. Define Netlist
|
# 2. Define Netlist
|
||||||
|
|
|
||||||
|
|
@ -16,8 +16,8 @@ def main() -> None:
|
||||||
danger_map = DangerMap(bounds=bounds)
|
danger_map = DangerMap(bounds=bounds)
|
||||||
danger_map.precompute([])
|
danger_map.precompute([])
|
||||||
|
|
||||||
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)
|
||||||
router = AStarRouter(evaluator, snap_size=1.0, bend_radii=[10.0], sbend_radii=[10.0])
|
router = AStarRouter(evaluator, snap_size=1.0, bend_radii=[10.0])
|
||||||
pf = PathFinder(router, evaluator)
|
pf = PathFinder(router, evaluator)
|
||||||
|
|
||||||
# 2. Define Netlist
|
# 2. Define Netlist
|
||||||
|
|
|
||||||
|
|
@ -18,8 +18,8 @@ def main() -> None:
|
||||||
danger_map = DangerMap(bounds=bounds)
|
danger_map = DangerMap(bounds=bounds)
|
||||||
danger_map.precompute([])
|
danger_map.precompute([])
|
||||||
|
|
||||||
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)
|
||||||
router = AStarRouter(evaluator, snap_size=1.0, bend_radii=[10.0], sbend_radii=[10.0])
|
router = AStarRouter(evaluator, snap_size=1.0, bend_radii=[10.0])
|
||||||
pf = PathFinder(router, evaluator)
|
pf = PathFinder(router, evaluator)
|
||||||
|
|
||||||
# 2. Add a 'Pre-routed' net and lock it
|
# 2. Add a 'Pre-routed' net and lock it
|
||||||
|
|
|
||||||
|
|
@ -21,7 +21,6 @@ def main() -> None:
|
||||||
engine,
|
engine,
|
||||||
danger_map,
|
danger_map,
|
||||||
unit_length_cost=1.0,
|
unit_length_cost=1.0,
|
||||||
greedy_h_weight=1.5,
|
|
||||||
bend_penalty=10.0,
|
bend_penalty=10.0,
|
||||||
sbend_penalty=20.0,
|
sbend_penalty=20.0,
|
||||||
)
|
)
|
||||||
|
|
@ -32,7 +31,6 @@ def main() -> None:
|
||||||
snap_size=1.0,
|
snap_size=1.0,
|
||||||
bend_radii=[10.0, 30.0],
|
bend_radii=[10.0, 30.0],
|
||||||
sbend_offsets=[5.0], # Use a simpler offset
|
sbend_offsets=[5.0], # Use a simpler offset
|
||||||
sbend_radii=[10.0],
|
|
||||||
bend_penalty=10.0,
|
bend_penalty=10.0,
|
||||||
sbend_penalty=20.0,
|
sbend_penalty=20.0,
|
||||||
snap_to_target_dist=50.0, # Large snap range
|
snap_to_target_dist=50.0, # Large snap range
|
||||||
|
|
|
||||||
|
|
@ -16,8 +16,8 @@ def main() -> None:
|
||||||
danger_map = DangerMap(bounds=bounds)
|
danger_map = DangerMap(bounds=bounds)
|
||||||
danger_map.precompute([])
|
danger_map.precompute([])
|
||||||
|
|
||||||
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)
|
||||||
router = AStarRouter(evaluator, snap_size=1.0, bend_radii=[10.0], sbend_radii=[10.0])
|
router = AStarRouter(evaluator, snap_size=1.0, bend_radii=[10.0])
|
||||||
pf = PathFinder(router, evaluator)
|
pf = PathFinder(router, evaluator)
|
||||||
|
|
||||||
# 2. Define Netlist: Complex orientation challenges
|
# 2. Define Netlist: Complex orientation challenges
|
||||||
|
|
|
||||||
|
|
@ -30,18 +30,18 @@ def main() -> None:
|
||||||
danger_map.precompute(obstacles)
|
danger_map.precompute(obstacles)
|
||||||
|
|
||||||
# We'll run three separate routers since collision_type is a router-level config
|
# 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)
|
# 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))}
|
netlist_arc = {"arc_model": (Port(10, 120, 0), Port(90, 140, 90))}
|
||||||
|
|
||||||
# Scenario 2: 'bbox' model (Conservative axis-aligned box)
|
# 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))}
|
netlist_bbox = {"bbox_model": (Port(10, 70, 0), Port(90, 90, 90))}
|
||||||
|
|
||||||
# Scenario 3: 'clipped_bbox' model (Balanced)
|
# 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))}
|
netlist_clipped = {"clipped_model": (Port(10, 20, 0), Port(90, 40, 90))}
|
||||||
|
|
||||||
# 2. Route each scenario
|
# 2. Route each scenario
|
||||||
|
|
|
||||||
|
|
@ -18,8 +18,8 @@ def main() -> None:
|
||||||
danger_map = DangerMap(bounds=bounds)
|
danger_map = DangerMap(bounds=bounds)
|
||||||
danger_map.precompute([])
|
danger_map.precompute([])
|
||||||
|
|
||||||
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)
|
||||||
router = AStarRouter(evaluator, snap_size=1.0, bend_radii=[10.0], sbend_radii=[10.0])
|
router = AStarRouter(evaluator, snap_size=1.0, bend_radii=[10.0])
|
||||||
pf = PathFinder(router, evaluator)
|
pf = PathFinder(router, evaluator)
|
||||||
|
|
||||||
# 2. Define Netlist
|
# 2. Define Netlist
|
||||||
|
|
@ -39,7 +39,7 @@ def main() -> None:
|
||||||
|
|
||||||
print("Routing with custom collision model...")
|
print("Routing with custom collision model...")
|
||||||
# Override bend_collision_type with a literal Polygon
|
# 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(
|
results_custom = PathFinder(router_custom, evaluator, use_tiered_strategy=False).route_all(
|
||||||
{"custom_model": netlist["custom_bend"]}, {"custom_model": 2.0}
|
{"custom_model": netlist["custom_bend"]}, {"custom_model": 2.0}
|
||||||
)
|
)
|
||||||
|
|
|
||||||
|
|
@ -26,9 +26,9 @@ def main() -> None:
|
||||||
danger_map = DangerMap(bounds=bounds)
|
danger_map = DangerMap(bounds=bounds)
|
||||||
danger_map.precompute(cage)
|
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
|
# 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
|
# Enable partial path return
|
||||||
pf = PathFinder(router, evaluator)
|
pf = PathFinder(router, evaluator)
|
||||||
|
|
|
||||||
|
|
@ -23,7 +23,7 @@ class RouterConfig:
|
||||||
straight_lengths: list[float] = field(default_factory=list)
|
straight_lengths: list[float] = field(default_factory=list)
|
||||||
|
|
||||||
bend_radii: list[float] = field(default_factory=lambda: [50.0, 100.0])
|
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
|
snap_to_target_dist: float = 1000.0
|
||||||
bend_penalty: float = 250.0
|
bend_penalty: float = 250.0
|
||||||
sbend_penalty: float = 500.0
|
sbend_penalty: float = 500.0
|
||||||
|
|
@ -36,7 +36,7 @@ class CostConfig:
|
||||||
"""Configuration parameters for the Cost Evaluator."""
|
"""Configuration parameters for the Cost Evaluator."""
|
||||||
|
|
||||||
unit_length_cost: float = 1.0
|
unit_length_cost: float = 1.0
|
||||||
greedy_h_weight: float = 1.1
|
greedy_h_weight: float = 1.5
|
||||||
congestion_penalty: float = 10000.0
|
congestion_penalty: float = 10000.0
|
||||||
bend_penalty: float = 250.0
|
bend_penalty: float = 250.0
|
||||||
sbend_penalty: float = 500.0
|
sbend_penalty: float = 500.0
|
||||||
|
|
|
||||||
|
|
@ -39,7 +39,7 @@ class CostEvaluator:
|
||||||
collision_engine: CollisionEngine,
|
collision_engine: CollisionEngine,
|
||||||
danger_map: DangerMap,
|
danger_map: DangerMap,
|
||||||
unit_length_cost: float = 1.0,
|
unit_length_cost: float = 1.0,
|
||||||
greedy_h_weight: float = 1.1,
|
greedy_h_weight: float = 1.5,
|
||||||
congestion_penalty: float = 10000.0,
|
congestion_penalty: float = 10000.0,
|
||||||
bend_penalty: float = 250.0,
|
bend_penalty: float = 250.0,
|
||||||
sbend_penalty: float = 500.0,
|
sbend_penalty: float = 500.0,
|
||||||
|
|
|
||||||
|
|
@ -13,13 +13,13 @@ from inire.utils.validation import validate_routing_result
|
||||||
@pytest.fixture
|
@pytest.fixture
|
||||||
def basic_evaluator() -> CostEvaluator:
|
def basic_evaluator() -> CostEvaluator:
|
||||||
engine = CollisionEngine(clearance=2.0)
|
engine = CollisionEngine(clearance=2.0)
|
||||||
danger_map = DangerMap(bounds=(0, 0, 100, 100))
|
danger_map = DangerMap(bounds=(0, -50, 150, 150))
|
||||||
danger_map.precompute([])
|
danger_map.precompute([])
|
||||||
return CostEvaluator(engine, danger_map, bend_penalty=50.0, sbend_penalty=150.0)
|
return CostEvaluator(engine, danger_map, bend_penalty=50.0, sbend_penalty=150.0)
|
||||||
|
|
||||||
|
|
||||||
def test_astar_straight(basic_evaluator: CostEvaluator) -> None:
|
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)
|
start = Port(0, 0, 0)
|
||||||
target = Port(50, 0, 0)
|
target = Port(50, 0, 0)
|
||||||
path = router.route(start, target, net_width=2.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:
|
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)
|
start = Port(0, 0, 0)
|
||||||
# 20um right, 20um up. Needs a 10um bend and a 10um bend.
|
# 20um right, 20um up. Needs a 10um bend and a 10um bend.
|
||||||
target = Port(20, 20, 0)
|
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.collision_engine.add_static_obstacle(obstacle)
|
||||||
basic_evaluator.danger_map.precompute([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
|
router.node_limit = 1000000 # Give it more room for detour
|
||||||
start = Port(0, 0, 0)
|
start = Port(0, 0, 0)
|
||||||
target = Port(60, 0, 0)
|
target = Port(60, 0, 0)
|
||||||
|
|
|
||||||
|
|
@ -39,7 +39,7 @@ def test_astar_sbend(basic_evaluator: CostEvaluator) -> None:
|
||||||
|
|
||||||
|
|
||||||
def test_pathfinder_negotiated_congestion_resolution(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
|
# Increase base penalty to force detour immediately
|
||||||
pf = PathFinder(router, basic_evaluator, max_iterations=10, base_congestion_penalty=1000.0)
|
pf = PathFinder(router, basic_evaluator, max_iterations=10, base_congestion_penalty=1000.0)
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -10,7 +10,7 @@ def test_cost_calculation() -> None:
|
||||||
danger_map = DangerMap(bounds=(0, 0, 50, 50))
|
danger_map = DangerMap(bounds=(0, 0, 50, 50))
|
||||||
danger_map.precompute([])
|
danger_map.precompute([])
|
||||||
# Use small penalties for testing
|
# 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)
|
p1 = Port(0, 0, 0)
|
||||||
p2 = Port(10, 10, 0)
|
p2 = Port(10, 10, 0)
|
||||||
|
|
|
||||||
|
|
@ -29,7 +29,7 @@ def test_locked_paths() -> None:
|
||||||
danger_map = DangerMap(bounds=(0, -50, 100, 50))
|
danger_map = DangerMap(bounds=(0, -50, 100, 50))
|
||||||
danger_map.precompute([])
|
danger_map.precompute([])
|
||||||
evaluator = CostEvaluator(engine, danger_map)
|
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)
|
pf = PathFinder(router, evaluator)
|
||||||
|
|
||||||
# 1. Route Net A
|
# 1. Route Net A
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue