Skip to content

← Back to CoordinationMethodBasis documentation

CoordinationMethodBasis - Source Code

File: Distributed_Design_Optimizer/coordination/coordinationmethod/CoordinationMethodBasis.py

# Copyright (C) The DistributedDesignOptimizer Contributors
# Licensed under the GNU General Public License v3.0. See LICENSE file for details.
"""Basis class for coordination methods.

This module provides the base implementation for coordination methods,
containing common functionality shared across different coordination algorithms.
"""

from typing import List, Type
from Distributed_Design_Optimizer.postprocess.terminal_print_tools import ddo_print
from Distributed_Design_Optimizer.coordination.coordinationmethod import CoordinationMethodInterface
from Distributed_Design_Optimizer.coordination.innerloop_iterationscheme import IterationSchemeInterface
from Distributed_Design_Optimizer.coordination.updatecouplingparametermethod import UpdateCouplingParameterMethodInterface
from Distributed_Design_Optimizer.coordination.convergence import (ConvergenceIndicator_Innerloop_Interface,
                                                                   ConvergenceIndicator_Outerloop_Interface,
                                                                   )


class CoordinationMethodBasis(CoordinationMethodInterface):
    """Basis class for coordination methods providing common functionality.

    This class implements the common getter methods for iteration schemes
    that are shared across all coordination method implementations.
    Subclasses must set the iteration scheme attributes in their __init__.
    """

    _DDO_PRINT_LABEL_WIDTH: int = 20

    def __init__(self) -> None:
        """Initialize the basis class.

        Note: Subclasses must set the following attributes:
            - _iterationscheme: IterationSchemeInterface
            - _allowediterationschemes: List[Type[IterationSchemeInterface]]
            - _unrecommendediterationschemes: List[Type[IterationSchemeInterface]]
            - _recommendediterationschemes: List[Type[IterationSchemeInterface]]
        """

        # to be initialized in child-class of CoordinationMethodBasis
        self._iterationscheme: IterationSchemeInterface
        self._allowediterationschemes: List[Type[IterationSchemeInterface]] 
        self._unrecommendediterationschemes: List[Type[IterationSchemeInterface]]
        self._recommendediterationschemes: List[Type[IterationSchemeInterface]]

        # to be initialized in child-class of CoordinationMethodBasis
        self._convergence_indicator_innerloop: ConvergenceIndicator_Innerloop_Interface
        self._convergence_indicator_outerloop: ConvergenceIndicator_Outerloop_Interface
        self._updatecouplingparametermethod_outerloop: UpdateCouplingParameterMethodInterface
        self._iterationscheme: IterationSchemeInterface

    def get_IterationScheme(self) -> IterationSchemeInterface:
        """Get the selected iteration scheme.

        Returns:
            The iteration scheme instance.
        """
        return self._iterationscheme

    def get_AllowedIterationSchemes(self) -> List[Type[IterationSchemeInterface]]:
        """Get the list of allowed iteration scheme types.

        Returns:
            List of iteration scheme class types compatible with this coordination method.
        """
        return self._allowediterationschemes.copy()

    def get_UnrecommendedIterationSchemes(self) -> List[Type[IterationSchemeInterface]]:
        """Get the list of unrecommended iteration scheme types.

        Returns:
            List of iteration scheme class types that are unrecommended.
        """
        return self._unrecommendediterationschemes.copy()

    def get_RecommendedIterationSchemes(self) -> List[Type[IterationSchemeInterface]]:
        """Get the list of recommended iteration scheme types.

        Returns:
            List of iteration scheme class types recommended for best convergence.
        """
        return self._recommendediterationschemes.copy()

    def get_Convergence_Indicator_Innerloop(self) -> ConvergenceIndicator_Innerloop_Interface:
        """Get the inner loop convergence indicator factory.

        Returns:
            ConvergenceIndicator_Innerloop_Interface: The convergence indicator for inner loop.
        """
        return self._convergence_indicator_innerloop

    def get_Convergence_Indicator_Outerloop(self) -> ConvergenceIndicator_Outerloop_Interface:
        """Get the outer loop convergence indicator factory.

        Returns:
            ConvergenceIndicator_Outerloop_Interface: The convergence indicator for outer loop.
        """
        return self._convergence_indicator_outerloop

    def _print_coordination_config(self) -> None:
        """Print convergence indicators, update method, and iteration scheme."""
        ddo_print(f"{type(self).__name__}: ConvergenceIndicator_Innerloop:")
        self.get_Convergence_Indicator_Innerloop().print_startup_summary()
        ddo_print(f"{type(self).__name__}: ConvergenceIndicator_Outerloop:")
        self.get_Convergence_Indicator_Outerloop().print_startup_summary()
        ddo_print(f"{type(self).__name__}: UpdateCouplingParameterMethod_Outerloop:")
        self._updatecouplingparametermethod_outerloop.print_startup_summary()
        ddo_print(f"{type(self).__name__}: {'IterationScheme:'.ljust(self._DDO_PRINT_LABEL_WIDTH)} {type(self.get_IterationScheme()).__name__}")
        self.get_IterationScheme().print_startup_summary()

    def print_startup_summary(self) -> None:
        """Print the convergence indicators, update method, and iteration scheme at startup."""
        self._print_coordination_config()

    def print_termination_summary(self) -> None:
        """Print the convergence indicators, update method, and iteration scheme at the end."""
        self._print_coordination_config()