Aggregation

The Parameterized Strategy Architecture for Aggregation Functions

The aggregation module defines an architecture for implementing aggregation methods, particularly applied to the concept of weighted means in the context of multi-objective scoring and optimization.

The core of the architecture is an abstract class The concrete classes are responsible for defining the specific algorithms that constitute various aggregation methods and how they are applied. The interface imposes that each concrete implements a compute method that accepts two input values, a list of values and a list of weights. The method ensures that the returned aggregation score is a UFloat,

Class Diagram

        classDiagram

        class AbstractParametrizedStrategy {
        <<abstract>>
        utility_function Callable
        parameter_manager ParameterManager
        coefficient_parameters_names List[str]
        input_parameters_names List[str]
        get_parameters_values() Dict[str, Any]
        set_parameters_values(Dict[str, Any])

    }

    class  BaseAggregation {
     +compute_numeric(values[float], weights[float]): float
     +compute_ufloat(values[ufloat], weights[float]): UFloat
    }

    class WeightedArithmeticMeanAggregation
    class WeightedGeometricMeanAggregation
    class WeightedHarmonicMeanAggregation
    class WeightedDeviationIndexAggregation {
    parameters ['ideal_value']
    }

    class Catalogue {
        +item_type Type
        +register
    }

    class ParameterManager {
        +parameters_map Dict[str, Parameter]
        +set_parameter_value()
        +set_parameter_attributes()
    }

    class Parameter {
        <<interface>>
        +value Any
        +set_value()
    }


    AbstractParametrizedStrategy <|--BaseAggregation
    BaseAggregation <|-- WeightedArithmeticMeanAggregation
    BaseAggregation <|-- WeightedGeometricMeanAggregation
    BaseAggregation <|-- WeightedHarmonicMeanAggregation
    BaseAggregation <|-- WeightedDeviationIndexAggregation

    AbstractParametrizedStrategy --> ParameterManager : uses
    AbstractParametrizedStrategy --> Parameter : has


    WeightedArithmeticMeanAggregation ..> aggregation_catalogue : "registers in aggregation_catalogue"
    WeightedGeometricMeanAggregation ..> aggregation_catalogue : "registers in aggregation_catalogue"
    WeightedHarmonicMeanAggregation ..> aggregation_catalogue : "registers in aggregation_catalogue"
    WeightedDeviationIndexAggregation ..> aggregation_catalogue : "registers in aggregation_catalogue"

    Catalogue <|-- aggregation_catalogue
    

Example Usage

Retrieve the available aggregation functions from the catalogue.

>>> from pumas.aggregation import aggregation_catalogue
>>> aggregation_catalogue.list_items()
['arithmetic_mean', 'geometric_mean', 'harmonic_mean', 'deviation_index']

Data Validation Flowchart

Prior of computing the aggregation, the input data_frame is validated and cleaned.

The following conditions are checked and reported as warnings/log entries:
  • Null (None) values.

Warning: value-weight pairs containing null values are removed from the input data_frame.

The following conditions must be met otherwise an exception is raised:
  • The values and weights arrays should have the same length.

  • No value can be negative.

  • No weight can be negative.

  • Weights cannot be null (None).

  • Values cannot be null (None) (after the cleaning step and the warning raising, this is a catch-all failsafe).

The following flowchart describes the process:

        flowchart TB

    start(("Start"))
    start --> checkLengthMatch["check_length_match(values, weights)"]

    checkLengthMatch --> |"length mismatch found)"| raiseLengthMismatchException("Raise LengthMismatchException")
    checkLengthMatch --> reportNullValues["report_null_values(values)"]

    reportNullValues --> reportNullWeights["report_null_weights(weights)"]
    reportNullValues --> raiseNullValueswarning

    reportNullWeights --> filterValues["filter_out_null_values_weights_pairs(values, weights)"]
    reportNullWeights--> raiseNullWeightswarning

    filterValues --> checkNoneWeights["check_null_weights(weights)"]
    checkNoneWeights --> |"Raise Exception"| raiseNoneWeightsException("Raise NoneWeightsException")

    checkNoneWeights --> checkNoneValues["check_null_values(values)"]
    checkNoneValues --> |"Raise Exception"| raiseNoneValuesException("Raise NoneValuesException")

    checkNoneValues --> checkNegativeWeights["check_negative_weights(weights)"]
    checkNegativeWeights --> |"Raise Exception"| raiseNegativeWeightsException("Raise NegativeWeightsException")

    checkNegativeWeights --> checkNegativeValues["check_negative_values(values)"]
    checkNegativeValues --> |"Raise Exception"| raiseNegativeValuesException("Raise NegativeValuesException")
    checkNegativeValues --> proceedWithCalculation[("Proceed with Calculation")]

    raiseNullWeightswarning --> Log
    raiseNullValueswarning --> Log

    raiseLengthMismatchException --> endState["End State: cannot proceed with calculation"]
    raiseNegativeWeightsException --> endState
    raiseNegativeValuesException --> endState
    raiseNoneWeightsException --> endState
    raiseNoneValuesException --> endState