From 9345d5de8acdc2ae69a3aa874ca0c9a42c55f91f Mon Sep 17 00:00:00 2001 From: Mikolaj Wielgus Date: Tue, 4 Nov 2025 15:29:15 +0100 Subject: [PATCH] feat(autorouter/multilayer_reconfigurator): Add reconfiguration trigger here too --- src/autorouter/multilayer_reconfigurator.rs | 15 +++-- src/autorouter/planar_reconfigurator.rs | 61 ++++++++++++++------- src/autorouter/planar_reconfigurer.rs | 4 +- 3 files changed, 50 insertions(+), 30 deletions(-) diff --git a/src/autorouter/multilayer_reconfigurator.rs b/src/autorouter/multilayer_reconfigurator.rs index 654c84f..a79a00e 100644 --- a/src/autorouter/multilayer_reconfigurator.rs +++ b/src/autorouter/multilayer_reconfigurator.rs @@ -74,24 +74,23 @@ impl MultilayerAutorouteReconfigurator { preconfiguration, options, )?, - reconfiguration_trigger: SmaRateReconfigurationTrigger::new(10, 0.5, 0.1), + reconfiguration_trigger: SmaRateReconfigurationTrigger::new(20, 0.5, 0.1), reconfigurer, options, }) } - fn reconfigure( + fn reconfigure( &mut self, - autorouter: &mut Autorouter, + autorouter: &mut Autorouter, ) -> Result, MultilayerReconfiguratorStatus>, AutorouterError> { // Reset the reconfiguration trigger. - self.reconfiguration_trigger = SmaRateReconfigurationTrigger::new(10, 0.5, 0.1); + self.reconfiguration_trigger = SmaRateReconfigurationTrigger::new(20, 1.0, 0.1); loop { - let configuration = match self.reconfigurer.next_configuration(autorouter) { - None => return Ok(ControlFlow::Break(None)), - Some(configuration) => configuration, + let Some(configuration) = self.reconfigurer.next_configuration(autorouter) else { + return Ok(ControlFlow::Break(None)); }; match self.stepper.reconfigure(autorouter, configuration) { @@ -141,7 +140,7 @@ impl Step, Option, MultilayerReconfi Err(err) => { self.reconfigurer .process_planar_result(autorouter, Err(err.clone())); - Err(err) + self.reconfigure(autorouter) } } } diff --git a/src/autorouter/planar_reconfigurator.rs b/src/autorouter/planar_reconfigurator.rs index a781dbf..60358c0 100644 --- a/src/autorouter/planar_reconfigurator.rs +++ b/src/autorouter/planar_reconfigurator.rs @@ -24,7 +24,10 @@ use crate::{ drawing::graph::PrimitiveIndex, geometry::primitive::PrimitiveShape, router::{navcord::Navcord, navmesh::Navmesh, thetastar::ThetastarStepper}, - stepper::{Abort, EstimateProgress, LinearScale, ReconfiguratorStatus, Reconfigure, Step}, + stepper::{ + Abort, EstimateProgress, LinearScale, ReconfiguratorStatus, Reconfigure, + SmaRateReconfigurationTrigger, Step, + }, }; pub type PlanarAutorouteReconfiguratorStatus = @@ -32,6 +35,7 @@ pub type PlanarAutorouteReconfiguratorStatus = pub struct PlanarAutorouteReconfigurator { stepper: PlanarAutorouteExecutionStepper, + reconfiguration_trigger: SmaRateReconfigurationTrigger, reconfigurer: PlanarAutorouteReconfigurer, options: PlanarAutorouteOptions, } @@ -61,11 +65,39 @@ impl PlanarAutorouteReconfigurator { Ok(Self { stepper: PlanarAutorouteExecutionStepper::new(autorouter, preconfiguration, options)?, + reconfiguration_trigger: SmaRateReconfigurationTrigger::new(5, 0.5, 0.1), // Note: I assume here that the first permutation is the same as the original order. reconfigurer, options, }) } + + fn reconfigure( + &mut self, + autorouter: &mut Autorouter, + ) -> Result, PlanarAutorouteReconfiguratorStatus>, AutorouterError> + { + self.reconfiguration_trigger = SmaRateReconfigurationTrigger::new(5, 0.5, 0.1); + + loop { + let Some(configuration) = self + .reconfigurer + .next_configuration(autorouter, &self.stepper) + else { + return Ok(ControlFlow::Break(None)); + }; + + match self.stepper.reconfigure(autorouter, configuration) { + Ok(result) => { + return Ok(ControlFlow::Continue(ReconfiguratorStatus::Reconfigured( + result, + ))) + } + Err(AutorouterError::NothingToUndoForReconfiguration) => continue, + Err(err) => return Err(err), + } + } + } } impl Step, Option, PlanarAutorouteReconfiguratorStatus> @@ -78,6 +110,13 @@ impl Step, Option, PlanarAutorouteRe autorouter: &mut Autorouter, ) -> Result, PlanarAutorouteReconfiguratorStatus>, AutorouterError> { + if !self + .reconfiguration_trigger + .update(*self.estimate_progress().value() as f64) + { + return self.reconfigure(autorouter); + } + match self.stepper.step(autorouter) { Ok(ControlFlow::Break(maybe_edit)) => Ok(ControlFlow::Break(maybe_edit)), Ok(ControlFlow::Continue(status)) => { @@ -87,25 +126,7 @@ impl Step, Option, PlanarAutorouteRe if !self.options.permutate { return Err(err); } - - loop { - let Some(configuration) = self - .reconfigurer - .next_configuration(autorouter, &self.stepper) - else { - return Ok(ControlFlow::Break(None)); - }; - - match self.stepper.reconfigure(autorouter, configuration) { - Ok(result) => { - return Ok(ControlFlow::Continue(ReconfiguratorStatus::Reconfigured( - result, - ))) - } - Err(AutorouterError::NothingToUndoForReconfiguration) => continue, - Err(err) => return Err(err), - } - } + self.reconfigure(autorouter) } } } diff --git a/src/autorouter/planar_reconfigurer.rs b/src/autorouter/planar_reconfigurer.rs index a29bd04..7ff318e 100644 --- a/src/autorouter/planar_reconfigurer.rs +++ b/src/autorouter/planar_reconfigurer.rs @@ -19,7 +19,7 @@ use crate::autorouter::{ pub trait MakeNextPlanarAutorouteConfiguration { fn next_configuration( &mut self, - autorouter: &mut Autorouter, + autorouter: &Autorouter, stepper: &PlanarAutorouteExecutionStepper, ) -> Option; } @@ -78,7 +78,7 @@ impl SccPermutationsPlanarAutorouteReconfigurer { impl MakeNextPlanarAutorouteConfiguration for SccPermutationsPlanarAutorouteReconfigurer { fn next_configuration( &mut self, - autorouter: &mut Autorouter, + autorouter: &Autorouter, _stepper: &PlanarAutorouteExecutionStepper, ) -> Option { let scc_permutation = self.sccs_permutations_iter.next()?;