Program Listing for File functions.h

Return to documentation for file (include/parpecommon/functions.h)

#ifndef PARPE_OPTIMIZATION_FUNCTIONS_H
#define PARPE_OPTIMIZATION_FUNCTIONS_H

#include <parpecommon/logging.h>

#include <memory>
#include <vector>

#include <gsl/gsl-lite.hpp>

namespace parpe {

enum FunctionEvaluationStatus
{
    functionEvaluationSuccess,
    functionEvaluationFailure,
};

class GradientFunction
{
public:
    virtual FunctionEvaluationStatus evaluate(
            gsl::span<double const> parameters,
            double& fval,
            gsl::span<double> gradient) const;

    virtual FunctionEvaluationStatus evaluate(
            gsl::span<double const> parameters,
            double& fval,
            gsl::span<double> gradient,
            Logger* logger,
            double* cpuTime) const = 0;

    virtual int numParameters() const = 0;

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

    virtual ~GradientFunction() = default;
};


template<typename T>
class SummedGradientFunction
{
public:
    virtual FunctionEvaluationStatus evaluate(
            gsl::span<const double> parameters,
            T dataset,
            double& fval,
            gsl::span<double> gradient,
            Logger* logger,
            double* cpuTime) const = 0;

    virtual FunctionEvaluationStatus evaluate(
            gsl::span<const double> parameters,
            std::vector<T> datasets,
            double& fval,
            gsl::span<double> gradient,
            Logger* logger,
            double* cpuTime) const = 0;

    virtual int numParameters() const = 0;

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

    virtual ~SummedGradientFunction() = default;
};


template<typename T>
class SummedGradientFunctionGradientFunctionAdapter
        : public GradientFunction
        , public SummedGradientFunction<T>
{
public:
    SummedGradientFunctionGradientFunctionAdapter(
            std::unique_ptr<SummedGradientFunction<T>> gradFun,
            std::vector<T> datasets)
        : grad_fun_(std::move(gradFun))
        , datasets_(datasets)
    {}

    FunctionEvaluationStatus evaluate(gsl::span<const double> parameters,
                                      double& fval,
                                      gsl::span<double> gradient,
                                      Logger* logger = nullptr,
                                      double* cpuTime = nullptr) const override
    {
        return grad_fun_->evaluate(
                    parameters, datasets_, fval, gradient, logger, cpuTime);
    }

    FunctionEvaluationStatus evaluate(gsl::span<const double> parameters,
                                      T dataset,
                                      double& fval,
                                      gsl::span<double> gradient,
                                      Logger* logger,
                                      double* cpuTime) const override
    {
        return grad_fun_->evaluate(
                    parameters, dataset, fval, gradient, logger, cpuTime);
    }

    FunctionEvaluationStatus evaluate(gsl::span<const double> parameters,
                                      std::vector<T> datasets,
                                      double& fval,
                                      gsl::span<double> gradient,
                                      Logger* logger,
                                      double* cpuTime) const override
    {
        return grad_fun_->evaluate(
                    parameters, datasets, fval, gradient, logger, cpuTime);
    }

    int numParameters() const override { return grad_fun_->numParameters(); }

    std::vector<std::string> getParameterIds() const override
    {
        return grad_fun_->getParameterIds();
    }

    SummedGradientFunction<T>* getWrappedFunction() const
    {
        return grad_fun_.get();
    }

private:
    std::unique_ptr<SummedGradientFunction<T>> grad_fun_;

    std::vector<T> datasets_;
};

}
#endif