Source code for skretrieval.retrieval
from __future__ import annotations
from abc import ABC, abstractmethod
import numpy as np
from skretrieval.core.radianceformat import RadianceBase
from . import observation
[docs]
class ForwardModel(ABC):
"""
A ForwardModel is an object which is capable of calculating a radiance. This serves as the primary interface
to the retrieval, along with the RetrievalTarget.
"""
@abstractmethod
def calculate_radiance(self):
pass
class RetrievalTarget(ABC):
"""
The retrieval target defines the parameter that is to be retrieved, and also what measurements are going to be
used to retrieve it. Notation is similar to that of Rodgers.
"""
@abstractmethod
def state_vector(self):
"""
Returns
-------
np.array
The state vector, x
"""
@abstractmethod
def measurement_vector(self, l1_data: RadianceBase):
"""
Parameters
----------
l1_data: RadianceBase
Radiance data. Usually this is an instrument specific instance of RadianceBase, and the RetrievalTarget
only works with specific formats.
Returns
-------
dict
Keys 'y' for the measurement vector, 'jacobian' for the jacobian of the measurement vector (if weighting
functions are in l1_data, 'y_error' the covariance of 'y' (if error information is provided in l1_data)
"""
@abstractmethod
def update_state(self, x: np.ndarray):
"""
Updates the state for the new state vector. Note that this change has to propagate backwards to the ForwardModel
somehow. Typically this is done by passing a climatology into the RetrievalTarget at initiliazation which is
used in the ForwardModel.
Parameters
----------
x: np.array
New state vector
"""
@abstractmethod
def apriori_state(self) -> np.array:
"""
Returns
-------
np.array
Apriori state vector, x_a. If no apriori is used return None
"""
@abstractmethod
def inverse_apriori_covariance(self):
"""
Returns
-------
np.array
Inverse of the apriori covariance matrix. If no apriori is used return None.
"""
def initialize( # noqa: B027
self, forward_model: ForwardModel, meas_l1: RadianceBase
):
"""
Called at the beginning of the retrieval and can be used to initialize parameters
Parameters
----------
forward_model
meas_l1
"""
@staticmethod
def state_vector_allowed_to_change():
"""
Returns
-------
bool
True if the state vector/apriori may change shape between iterations, False otherwise.
"""
return False
@staticmethod
def measurement_vector_allowed_to_change():
"""
Returns
-------
bool
True if the measurement_vector may change shape between iterations, False otherwise.
"""
return False
def adjust_parameters(
self,
forward_model, # noqa: ARG002
y_dict, # noqa: ARG002
chi_sq, # noqa: ARG002
chi_sq_linear, # noqa: ARG002
iter_idx, # noqa: ARG002
predicted_delta_y, # noqa: ARG002
):
return None
class Minimizer(ABC):
"""
A class which performs minimization between some aspect of measurement level1 data and the forward model simulations.
"""
@abstractmethod
def retrieve(
self,
measurement_l1: RadianceBase,
forward_model: ForwardModel,
retrieval_target: RetrievalTarget,
):
"""
Parameters
----------
measurement_l1: RadianceBase
The data we are trying to match, either from a real instrument or simulations.
forward_model: ForwardModel
A model for the data in measurement_l1
retrieval_target: RetrievalTarget
What we are trying to retrieve
Returns
-------
dict
Various parameters specific to the minimizer
"""