Program Listing for File multiConditionDataProvider.h

Return to documentation for file (include/parpeamici/multiConditionDataProvider.h)

#ifndef MULTICONDITIONDATAPROVIDER_H
#define MULTICONDITIONDATAPROVIDER_H

#include <parpecommon/hdf5Misc.h>
#include <parpeoptimization/optimizationOptions.h>

#include <amici/amici.h>

#include <gsl/gsl-lite.hpp>

#include <H5Cpp.h>

#include <memory>
#include <string>
#include <vector>

namespace parpe {

class MultiConditionDataProvider
{
  public:
    virtual ~MultiConditionDataProvider() = default;

    virtual int getNumberOfSimulationConditions() const = 0;

    virtual std::vector<int> getSimulationToOptimizationParameterMapping(
      int conditionIdx) const = 0;

    virtual void mapSimulationToOptimizationGradientAddMultiply(
      int conditionIdx,
      gsl::span<double const> simulation,
      gsl::span<double> optimization,
      gsl::span<const double> parameters,
      double coefficient = 1.0) const = 0;

    virtual void mapAndSetOptimizationToSimulationVariables(
      int conditionIdx,
      gsl::span<double const> optimization,
      gsl::span<double> simulation,
      gsl::span<amici::ParameterScaling> optimizationScale,
      gsl::span<amici::ParameterScaling> simulationScale) const = 0;

    virtual amici::ParameterScaling getParameterScaleOpt(
      int parameterIdx) const = 0;

    virtual std::vector<amici::ParameterScaling> getParameterScaleOpt()
      const = 0;

    virtual std::vector<amici::ParameterScaling> getParameterScaleSim(
      int simulationIdx) const = 0;

    virtual amici::ParameterScaling getParameterScaleSim(
      int simulationIdx,
      int modelParameterIdx) const = 0;

    virtual void updateSimulationParametersAndScale(
      int conditionIndex,
      gsl::span<double const> optimizationParams,
      amici::Model& model) const = 0;

    virtual std::unique_ptr<amici::ExpData> getExperimentalDataForCondition(
      int conditionIdx) const = 0;

    virtual std::vector<std::vector<double>> getAllMeasurements() const = 0;
    virtual std::vector<std::vector<double>> getAllSigmas() const = 0;

    virtual int getNumOptimizationParameters() const = 0;

    virtual std::vector<std::string> getProblemParameterIds() const = 0;

    virtual std::unique_ptr<amici::Model> getModel() const = 0;

    virtual std::unique_ptr<amici::Solver> getSolver() const = 0;
};


class MultiConditionDataProviderDefault : public MultiConditionDataProvider
{
  public:
    MultiConditionDataProviderDefault(std::unique_ptr<amici::Model> model,
                                      std::unique_ptr<amici::Solver> solver);

    ~MultiConditionDataProviderDefault() override = default;

    int getNumberOfSimulationConditions() const override;

    std::vector<int> getSimulationToOptimizationParameterMapping(
      int conditionIdx) const override;

    void mapSimulationToOptimizationGradientAddMultiply(
      int conditionIdx,
      gsl::span<double const> simulation,
      gsl::span<double> optimization,
      gsl::span<const double> parameters,
      double coefficient = 1.0) const override;

    void mapAndSetOptimizationToSimulationVariables(
      int conditionIdx,
      gsl::span<double const> optimization,
      gsl::span<double> simulation,
      gsl::span<amici::ParameterScaling> optimizationScale,
      gsl::span<amici::ParameterScaling> simulationScale) const override;

    std::vector<amici::ParameterScaling> getParameterScaleOpt()
      const override;

    amici::ParameterScaling getParameterScaleOpt(
      int optimizationParameterIndex) const override;

    amici::ParameterScaling getParameterScaleSim(
      int simulationIdx,
      int optimizationParameterIndex) const override;

    std::vector<amici::ParameterScaling> getParameterScaleSim(
      int) const override;

    void updateSimulationParametersAndScale(
      int conditionIndex,
      gsl::span<const double> optimizationParams,
      amici::Model& model) const override;

    std::unique_ptr<amici::ExpData> getExperimentalDataForCondition(
      int conditionIdx) const override;

    std::vector<std::vector<double>> getAllMeasurements()
      const override;
    std::vector<std::vector<double>> getAllSigmas() const override;

    int getNumOptimizationParameters() const override;

    std::unique_ptr<amici::Model> getModel() const override;

    std::unique_ptr<amici::Solver> getSolver() const override;

    std::vector<std::string> getProblemParameterIds() const override;

    // TODO private
    std::vector<amici::ExpData> edata_;

  private:
    std::unique_ptr<amici::Model> model_;
    std::unique_ptr<amici::Solver> solver_;
};

// TODO split; separate optimization from simulation
class MultiConditionDataProviderHDF5 : public MultiConditionDataProvider
{
  public:
    MultiConditionDataProviderHDF5() = default;

    MultiConditionDataProviderHDF5(std::unique_ptr<amici::Model> model,
                                   const std::string& hdf5Filename);

    MultiConditionDataProviderHDF5(std::unique_ptr<amici::Model> model,
                                   std::string const& hdf5Filename,
                                   std::string const& rootPath);

    MultiConditionDataProviderHDF5(MultiConditionDataProviderHDF5 const&) =
      delete;

    ~MultiConditionDataProviderHDF5() override;

    int getNumberOfSimulationConditions() const override;

    std::vector<int> getSimulationToOptimizationParameterMapping(
      int conditionIdx) const override;

    void mapSimulationToOptimizationGradientAddMultiply(
      int conditionIdx,
      gsl::span<double const> simulation,
      gsl::span<double> optimization,
      gsl::span<const double> parameters,
      double coefficient = 1.0) const override;

    void mapAndSetOptimizationToSimulationVariables(
      int conditionIdx,
      gsl::span<double const> optimization,
      gsl::span<double> simulation,
      gsl::span<amici::ParameterScaling> optimizationScale,
      gsl::span<amici::ParameterScaling> simulationScale) const override;

    std::vector<amici::ParameterScaling> getParameterScaleOpt()
      const override;

    amici::ParameterScaling getParameterScaleOpt(
      int parameterIdx) const override;

    std::vector<amici::ParameterScaling> getParameterScaleSim(
      int simulationIdx) const override;

    amici::ParameterScaling getParameterScaleSim(
      int simulationIdx,
      int modelParameterIdx) const override;

    virtual void checkDataIntegrity() const;

    // void printInfo() const;

    virtual void readFixedSimulationParameters(int conditionIdx,
                                               gsl::span<double> buffer) const;

    std::unique_ptr<amici::ExpData> getExperimentalDataForCondition(
      int conditionIdx) const override;

    std::vector<std::vector<double>> getAllMeasurements() const override;
    std::vector<std::vector<double>> getAllSigmas() const override;

    std::vector<double> getSigmaForSimulationIndex(int simulationIdx) const;
    std::vector<double> getMeasurementForSimulationIndex(
      int conditionIdx) const;

    virtual void getOptimizationParametersLowerBounds(
      gsl::span<double> buffer) const;

    virtual void getOptimizationParametersUpperBounds(
      gsl::span<double> buffer) const;

    int getNumOptimizationParameters() const override;

    std::unique_ptr<amici::Model> getModel() const override;

    std::unique_ptr<amici::Solver> getSolver() const override;

    void updateSimulationParametersAndScale(
      int simulationIdx,
      gsl::span<const double> optimizationParams,
      amici::Model& model) const override;

    void copyInputData(const H5::H5File& target);

    void getSimAndPreeqConditions(
      const int simulationIdx,
      int& preequilibrationConditionIdx,
      int& simulationConditionIdx
    ) const;

    std::vector<int> getReinitializationIndices(const int simulationIdx) const;

    H5::H5File getHdf5File() const;

    void setModel(std::unique_ptr<amici::Model> model);

    std::vector<std::string> getProblemParameterIds() const override;

  protected:
    void updateFixedSimulationParameters(int conditionIdx,
                                         amici::ExpData& edata) const;


  private:
    std::unique_ptr<amici::Model> model_;

    std::string root_path_ = "/";
    std::string hdf5_measurement_path_;
    std::string hdf5_measurement_sigma_path_;
    std::string hdf5_condition_path_;
    std::string hdf5_reference_condition_path_;
    std::string hdf5_amici_options_path_;
    std::string hdf5_parameter_path_;
    std::string hdf5_parameter_min_path_;
    std::string hdf5_parameter_max_path_;
    std::string hdf5_parameter_scale_simulation_path_;
    std::string hdf5_parameter_scale_optimization_path_;
    std::string hdf5_simulation_to_optimization_parameter_mapping_path_;
    std::string hdf5_parameter_overrides_path;
    std::string hdf5_parameter_ids_path_;
    std::string hdf5_reinitialization_idxs_path_;

    H5::H5File file_;

    std::unique_ptr<OptimizationOptions> optimization_options_;
};

double
applyChainRule(double gradient,
               double parameter,
               amici::ParameterScaling oldScale,
               amici::ParameterScaling newScale);

} // namespace parpe

#endif // MULTICONDITIONDATAPROVIDER_H