Augmented Lagrangian Coordination (ALC) Pseudocode-to-Code Traceability¶
This page maps each step of the Augmented Lagrangian Coordination (ALC) pseudocode to the implementing classes and methods in the codebase.
Highlighted lines are linked to the implementation. Hover or click to see the implementing classes/methods, then click through to the full API documentation.
ALC.__init__()
ALC.validate_inputs()
LocalSubSystemALC.__init__()
LocalSubSystemALC.initializeCouplingParameters_after_CopyFromMiddleLevel()
MiddleLevelDataStorageALC.__init__()
CouplingParametersALC.__init__()Coordinator.innerloop_iteration()
IterationSchemeInterface.run_innerloop_jobs_multiprocessing()
SubSystemBasis.run_innerloop_job()SubSystemBasis.CopyFromMiddleLevel()
MiddleLevelDataStorageBasis.get_StoredCoupling()
SubSysMiddleLevelCouplingBasis.get_MappedResponses()
SubSysMiddleLevelCouplingBasis.get_SharedDesignVariable()SubSystemBasis.run_IterativeOptimization()
LocalSubSystemALC.evaluateCoordinationObjective()
LocalSubSystemBasis.evaluateTotalObjective()
LocalSubSystemBasis.evaluateTotalConstraint()
OptimizationInterface.callOptimizer()SubSystemBasis.CopyToMiddleLevel()
MiddleLevelDataStorageBasis.set_Coupling()
SubSysMiddleLevelCouplingBasis.set_MappedResponses()
SubSysMiddleLevelCouplingBasis.set_SharedDesignVariable()SubSystemBasis.evaluate_InnerLoopConvergenceIndicator()
Local_ConvergenceIndicator_Innerloop_Interface.evaluate()
Local_ConvergenceIndicator_Innerloop_DeWit.evaluate()
Centralized_ConvergenceIndicator_Innerloop_Interface.evaluate()
Centralized_ConvergenceIndicator_Innerloop_DeWit.evaluate()Coordinator.outerloop_iteration()
LocalSubSystemBasis.run_prepare_updateCouplingParameters_job()
SubSystemBasis.CopyFromMiddleLevel()LocalSubSystemBasis.evaluate_Inconsistencies()
InConsistencySizeBasis.evaluate_MappedResponse_Minus_CopyCouplingVariable()
InConsistencySizeBasis.evaluate_CopyMappedResponse_Minus_CouplingVariable()
InConsistencySizeBasis.evaluate_SharedDesignVariable_Minus_CopyTargetSharedDesignVariable()
InConsistencySizeBasis.evaluate_CopySharedDesignVariable_Minus_TargetSharedDesignVariable()LocalSubSystemALC.updateCouplingParameters_outerLoop()
UpdateCouplingParameterMethod_AugLagMultipliersAdaptiveWeights.update_CoordinationMultipliers()
LocalSubSystemALC.set_CoordinationMultipliers_MappedResponse_Minus_CopyCouplingVariable()
LocalSubSystemALC.set_CoordinationMultipliers_CopyMappedResponse_Minus_CouplingVariable()
LocalSubSystemALC.set_CoordinationMultipliers_SharedDesignVariable_Minus_CopyTargetSharedDesignVariable()
LocalSubSystemALC.set_CoordinationMultipliers_CopySharedDesignVariable_Minus_TargetSharedDesignVariable()
CouplingParametersALC.set_Multipliers_MappedResponse_Minus_CopyCouplingVariable()
CouplingParametersALC.set_Multipliers_CopySharedDesignVariable_Minus_TargetSharedDesignVariable()LocalSubSystemALC.updateCouplingParameters_outerLoop()
UpdateCouplingParameterMethod_AugLagMultipliersAdaptiveWeights.update_CoordinationWeights()
LocalSubSystemALC.set_CoordinationWeights_MappedResponse_Minus_CopyCouplingVariable()
LocalSubSystemALC.set_CoordinationWeights_CopyMappedResponse_Minus_CouplingVariable()
LocalSubSystemALC.set_CoordinationWeights_SharedDesignVariable_Minus_CopyTargetSharedDesignVariable()
LocalSubSystemALC.set_CoordinationWeights_CopySharedDesignVariable_Minus_TargetSharedDesignVariable()
CouplingParametersALC.set_Weights_MappedResponse_Minus_CopyCouplingVariable()
CouplingParametersALC.set_Weights_CopySharedDesignVariable_Minus_TargetSharedDesignVariable()Coordinator.outerloop_iteration()
SubSystemBasis.evaluate_OuterLoopConvergenceIndicator()
Local_ConvergenceIndicator_Outerloop_Interface.evaluate()
Local_ConvergenceIndicator_Outerloop_DeWit.evaluate()
Centralized_ConvergenceIndicator_Outerloop_Interface.evaluate()
Centralized_ConvergenceIndicator_Outerloop_DeWit.evaluate()
LocalSubSystemALC.evaluate_Inconsistencies()CouplingParametersALC.get_Multipliers_MappedResponse_Minus_CopyCouplingVariable()
CouplingParametersALC.get_Multipliers_CopySharedDesignVariable_Minus_TargetSharedDesignVariable()CouplingParameters and MiddleLevel¶
Algorithm Options / Hyperparameters¶
The ALC coordination method is selected and configured in the use case InputFile.py by assigning an ALC instance to self._coordinationmethod. All algorithmic behaviour is wired through four constructor arguments:
self._coordinationmethod: CoordinationMethodInterface = ALC(
convergence_indicator_innerloop=ConvergenceIndicator_Innerloop_DeWit(
tolerancetotalobjective=1E-5),
convergence_indicator_outerloop=ConvergenceIndicator_Outerloop_DeWit(
toleranceconsistency=1E-4),
updatecouplingparametermethod_outerloop=UpdateCouplingParameterMethod_AugLagMultipliersAdaptiveWeights(
beta=1.3,
gamma=0.25,
initialweight=0.01,
initialmultiplier=0.0),
iterationscheme=Parallel())
Convergence criteria¶
ALC uses a nested inner/outer loop (Algorithm 1 in ALC), so two convergence indicators are configured:
-
Inner loop —
convergence_indicator_innerloop, evaluated bySubSystemBasis.evaluate_InnerLoopConvergenceIndicator. ALC requiresConvergenceIndicator_Innerloop_DeWit, which converges on the relative change of the total objective, \(\text{error} = |v_f^{\text{new}} - v_f^{\text{old}}| / (1 + |v_f^{\text{new}}|) \le\)tolerancetotalobjective. A smallertolerancetotalobjective(e.g.1E-5) forces more inner FPI sweeps per outer step (tighter primal-update fixed point); a larger value terminates the inner loop earlier and shifts most of the work onto the outer dual and penalty updates. -
Outer loop —
convergence_indicator_outerloop, evaluated bySubSystemBasis.evaluate_OuterLoopConvergenceIndicator. ALC requiresConvergenceIndicator_Outerloop_DeWit, which terminates once all coupling inconsistencies \(c = \left({}^{i}_{j}H({}^{i}r) - {}^{i}_{j}h,\; {}^{i}_{j}z - {}^{j}_{i}z,\ldots\right)\) and their step-to-step changes fall withintoleranceconsistency. A smallertoleranceconsistency(e.g.1E-4) enforces tighter consensus between coupled subsystems at the cost of more outer iterations.
Both indicators are validated in LocalSubSystemALC (validate_inputs), which restricts ALC to the DeWit inner/outer indicators.
Update method (dual and penalty update)¶
updatecouplingparametermethod_outerloop implements the ALC dual and penalty update (pseudocode lines 19–20), applied by LocalSubSystemALC.updateCouplingParameters_outerLoop. ALC requires the adaptive-weight augmented-Lagrangian method UpdateCouplingParameterMethod_AugLagMultipliersAdaptiveWeights, which advances the multipliers by the subgradient step \(\lambda \leftarrow \lambda + 2\,s \circ s \circ c\) (update_CoordinationMultipliers) and adapts the penalty weights \(s\) (update_CoordinationWeights):
initialweight— the initial penalty weight \(s\) (recommended \(0 < s \le 0.1\), e.g.0.01). Largerinitialweightproduces larger multiplier steps and faster constraint enforcement, but risks oscillation/ill-conditioning; smaller values give gentler, more stable but slower consensus.initialmultiplier— the initial Lagrange multiplier \({}^{i}_{j}\lambda^{(0)}\) (recommended0.0).
Iteration scheme¶
iterationscheme controls how the inner-loop primal updates are scheduled by the IterationSchemeInterface. ALC has no controller — the primal problem is solved distributedly by an FPI scheme, so the choice selects the fixed-point sweep:
Parallel— a Jacobi sweep: all subsystem problems (pseudocode line 10) are solved simultaneously from the previous iterate.SequentialForward/SequentialBackward— a Gauss–Seidel sweep: subsystems are solved one after another, each using the latest neighbour data (often faster convergence, no parallelism).
Penalty hyperparameters β, γ, s¶
The pseudocode "Require" block (Algorithm 1, lines 1–3) lists the penalty-adaption hyperparameters \(\beta\) and \(\gamma\), alongside the initial penalty weights \(s\) and multipliers \(c\) or \(c_c\)">\(\lambda\). \(\beta\) and \(\gamma\) are passed to the update method above and govern the penalty update \(s^{(k+1)} \leftarrow \beta\,s^{(k)}\) applied only when \(|c^{(k+1)}| > \gamma\,|c^{(k)}|\):
- \(\beta\) — the penalty-weight increase factor (must satisfy \(\beta > 1\), recommended \(\beta \le 3\), e.g.
1.3). A larger \(\beta\) grows the weights more aggressively when consensus stalls (stronger constraint enforcement, but risk of ill-conditioning and oscillation); a value closer to 1 grows them gently (more stable, slower consensus). - \(\gamma\) — the inconsistency-reduction threshold (must satisfy \(0 < \gamma < 1\), e.g.
0.25). The weights are only increased when the inconsistency fails to shrink below a factor \(\gamma\) of the previous step. A smaller \(\gamma\) demands a larger per-iteration reduction before the weights are held constant, so penalties grow more often; a value closer to 1 tolerates slow reduction and increases penalties rarely.
The corresponding weights \(s\) and multipliers \(c\) or \(c_c\)">\(\lambda\) are stored per coupling in CouplingParametersALC, while \(\beta\) and \(\gamma\) are held on the ALC coordination method.