Source code for curepy.container.retrieval_input

"""Container for all retrieval inputs"""

from curepy.container.measurement_function import MeasurementFunction
from curepy.container.ancillary_parameter import AncillaryParameter
from curepy.container.prior import Prior
from curepy.container.measurement import Measurement

from typing import Union, List, Optional, Callable, Any


[docs] class RetrievalInput: def __init__( self, measurement_function_obj: Optional[MeasurementFunction] = None, measurement_obj: Optional[Measurement] = None, ancillary_obj: Optional[AncillaryParameter] = None, prior_obj: Optional[Prior] = None, ) -> None: """ Container aggregating all inputs required for a retrieval. Individual sub-objects can be supplied directly or built afterwards using the ``build_*`` helper methods. :param measurement_function_obj: Measurement function container. :param measurement_obj: Measurement data container. :param ancillary_obj: Ancillary parameter container. :param prior_obj: Prior distribution container. """ self.measurement_function_obj = measurement_function_obj self.measurement_obj = measurement_obj self.ancillary_obj = ancillary_obj self.prior_obj = prior_obj
[docs] def build_retrieval_inputs( self, measurement_func: Callable, initial_guess: Any, y: Any, u_y_total: Optional[Any] = None, u_y_rand: Optional[Any] = None, u_y_syst: Optional[Any] = None, corr_y: Optional[Union[str, Any]] = None, multiple_guess_measurements: bool = False, measurement_name: str = None, input_quantities_names: Union[str, List[str]] = None, prior_shape: List[str] = None, prior_params: List[dict] = [{}], prior_correlation: Optional[Any] = None, b: Optional[list] = None, u_b: Optional[list] = None, corr_b: Optional[list] = None, corr_between_b: Optional[Any] = None, b_samples: Optional[Any] = None, b_MC_steps: Optional[int] = None, ) -> None: """ Construct all retrieval input sub-objects in a single call. :param measurement_func: Callable measurement/forward-model function. :param initial_guess: Initial values for the retrieval parameters. :param y: Measurement variable. :param u_y_total: Total uncertainty of the measurement variable. :param u_y_rand: Random uncertainty of the measurement variable. :param u_y_syst: Systematic uncertainty of the measurement variable. :param corr_y: Error-correlation of the measurement variable (``None``, ``"rand"``, ``"syst"``, or a square matrix). :param multiple_guess_measurements: If ``True``, the initial guess contains multiple measurements per parameter. :param measurement_name: Optional name for the measured quantity. :param input_quantities_names: Optional name(s) for input quantities. :param prior_shape: List of prior distribution shape names. :param prior_params: List of prior parameter dictionaries. :param prior_correlation: Correlation matrix for the prior. :param b: Ancillary parameter values. :param u_b: Uncertainties for the ancillary parameters. :param corr_b: Correlation specification for each ancillary parameter. :param corr_between_b: Correlation matrix between ancillary parameters. :param b_samples: Pre-generated MC samples for ancillary parameters. :param b_MC_steps: Number of MC steps for ancillary parameter sampling. """ self.measurement_function_obj = MeasurementFunction( measurement_func, initial_guess, multiple_guess_measurements, measurement_name, input_quantities_names, ) self.measurement_obj = Measurement(y, u_y_total, u_y_rand, u_y_syst, corr_y) self.ancillary_obj = AncillaryParameter( b, u_b, corr_b, corr_between_b, b_samples, b_MC_steps ) self.prior_obj = Prior(prior_shape, prior_params, prior_correlation)
[docs] def build_measurement_function( self, measurement_func: Callable, initial_guess: Any, multiple_guess_measurements: bool = False, measurement_name: str = None, input_quantities_names: Union[str, List[str]] = None, ) -> None: """ Construct ``measurement_function_obj`` from individual components. :param measurement_func: Callable measurement/forward-model function. :param initial_guess: Initial values for the retrieval parameters. :param multiple_guess_measurements: If ``True``, the initial guess contains multiple measurements per parameter. :param measurement_name: Optional name for the measured quantity. :param input_quantities_names: Optional name(s) for input quantities. """ self.measurement_function_obj = MeasurementFunction( measurement_func, initial_guess, multiple_guess_measurements, measurement_name, input_quantities_names, )
[docs] def build_measurement( self, y: Any, u_y_total: Optional[Any] = None, u_y_rand: Optional[Any] = None, u_y_syst: Optional[Any] = None, corr_y: Optional[Union[str, Any]] = None, ) -> None: """ Construct ``measurement_obj`` from measurement data. :param y: Measurement variable. :param u_y_total: Total uncertainty of the measurement variable. :param u_y_rand: Random uncertainty of the measurement variable. :param u_y_syst: Systematic uncertainty of the measurement variable. :param corr_y: Error-correlation of the measurement variable (``None``, ``"rand"``, ``"syst"``, or a square matrix). """ self.measurement_obj = Measurement(y, u_y_total, u_y_rand, u_y_syst, corr_y)
[docs] def build_prior( self, prior_shape: List[str] = None, prior_params: List[dict] = [{}], prior_correlation: Optional[Any] = None, ) -> None: """ Construct ``prior_obj`` from prior distribution specifications. :param prior_shape: List of prior distribution shape names. :param prior_params: List of prior parameter dictionaries. :param prior_correlation: Correlation matrix for the prior. """ self.prior_obj = Prior(prior_shape, prior_params, prior_correlation)
[docs] def build_ancillary( self, b: Optional[list] = None, u_b: Optional[list] = None, corr_b: Optional[list] = None, corr_between_b: Optional[Any] = None, b_samples: Optional[Any] = None, b_MC_steps: Optional[int] = None, ) -> None: """ Construct ``ancillary_obj`` from ancillary parameter data. :param b: Ancillary parameter values. :param u_b: Uncertainties for the ancillary parameters. :param corr_b: Correlation specification for each ancillary parameter. :param corr_between_b: Correlation matrix between ancillary parameters. :param b_samples: Pre-generated MC samples for ancillary parameters. :param b_MC_steps: Number of MC steps for ancillary parameter sampling. """ self.ancillary_obj = AncillaryParameter( b, u_b, corr_b, corr_between_b, b_samples, b_MC_steps )
[docs] def build_from_obsarray( self, obs_ds: Any, y_name: str, measurement_func: Callable, initial_guess: Any, b_name: Optional[List[str]] = None, multiple_guess_measurements: bool = False, input_quantities_names: Union[str, List[str]] = None, prior_shape: List[str] = None, prior_params: List[dict] = [{}], prior_correlation: Optional[Any] = None, b_samples: Optional[Any] = None, b_MC_steps: Optional[int] = None, ) -> None: """ Construct all retrieval input sub-objects from an ``obsarray`` dataset. The measurement variable, uncertainty, and error-correlation are read directly from the dataset. Ancillary parameters are optionally sourced from the same dataset by name. :param obs_ds: ``obsarray`` dataset containing measurement and ancillary variables with associated uncertainty information. :param y_name: Name of the measurement variable in ``obs_ds``. :param measurement_func: Callable measurement/forward-model function. :param initial_guess: Initial values for the retrieval parameters. :param b_name: List of ancillary parameter variable names in ``obs_ds``, or ``None`` if no ancillary parameters are used. :param multiple_guess_measurements: If ``True``, the initial guess contains multiple measurements per parameter. :param input_quantities_names: Optional name(s) for input quantities. :param prior_shape: List of prior distribution shape names. :param prior_params: List of prior parameter dictionaries. :param prior_correlation: Correlation matrix for the prior. :param b_samples: Pre-generated MC samples for ancillary parameters. :param b_MC_steps: Number of MC steps for ancillary parameter sampling. """ y = obs_ds[y_name].values u_y = obs_ds.unc[y_name].total_unc() corr_y = obs_ds.unc[y_name].total_err_corr_matrix() measurement_name = y_name if b_name is None: b = None u_b = None corr_b = None corr_between_b = None else: b = [] u_b = [] corr_b = [] corr_between_b = None # corr between variables not yet implemented in obsarray, user could manually define after running function for name in b_name: b.append(obs_ds[name].values) u_b.append(obs_ds.unc[name].total_unc()) corr_b.append(obs_ds.unc[name].total_err_corr_matrix()) self.measurement_function_obj = MeasurementFunction( measurement_func, initial_guess, multiple_guess_measurements, measurement_name, input_quantities_names, ) self.measurement_obj = Measurement(y, u_y, corr_y) self.ancillary_obj = AncillaryParameter( b, u_b, corr_b, corr_between_b, b_samples, b_MC_steps ) self.prior_obj = Prior(prior_shape, prior_params, prior_correlation)