c ++松耦合函数依赖

时间:2015-08-30 18:42:17

标签: c++ architecture decoupling loose-coupling

由于标题已经暗示我很难描述我的架构问题,并且出于同样的原因,搜索一直没有结果。我正在编写一个命令行应用程序,旨在通过最小二乘拟合来获取可以拟合物理模型的二维数据。我已经实现了一个正常工作的Nelder-Mead和Levenberg-Marquardt例程,即给定一组数据,模型和成本函数,他们将优化一系列拟合参数。

为此,我想编写一个促进优化抽象功能的类,而不依赖于将使用的实际模型和成本函数。

class Fit
{
public:
    Fit();
    ~Fit();

    run();

private:
    std::vector<std::vector<double>> m_data;
    std::vector<double> m_parameters;
    std::vector<double> m_evaluated;
}

实际优化方法run()大致如下所示:

void run()
{
    // Set initial guess for parameters
    m_parameters = {...};

    while(condition) {
        double cost_value;
        // Evaluate model function for current parameters
        (*model)(&m_evaluated, m_data, m_parameters);
        (*cost)(&cost_value, m_data, m_evaluated);

        if (cost_value < threshold_value)
            break;
        else
            update_parameters(&m_parameters);
    }
}

这就是我的问题所在。Fit::run()方法需要调用modelcost函数,但不知道这些函数会是什么样子或函数参数他们需要。他们在我的例子中所采用的参数是从拟合程序中看到的最小必需参数,但可能还有其他必需的参数。

具体的成本函数和模型将在别处定义,但我不知道如何让Fit类知道它需要调用哪些函数。来自c我正在考虑函数指针,但我不知道最好如何在c++中完成。 Fit是否应该在实例化后必须设置函数指针成员m_model?我只是在这里吐痰。我怎样才能最好地解决这个问题,这个问题叫做什么,以便我可以寻找其他方法?

编辑:更好地了解我想要完成的一些伪代码。

// Imagine multiple available functions that all work differently but take some array of parameters 
// which is then used to evaluate some function for a set of data values
void model_a(std::vector<double>* y, std::vector<std::vector<double>> data, std::vector<double> p) {
    for (int i; i < data[0].size(); ++i)
        (*y)[i] = parameters[0] + parameters[1]*data[0][i];
};

void model_b(std::vector<double>* y, std::vector<std::vector<double>> data, std::vector<double> p) {
    for (int i; i < data[0].size(); ++i)
        (*y)[i] = parameters[0] - pow(data[0][i], parameters[1]);
};

// Assume we have some data
std::vector<std::vector<double>> data = {};

Fit fit = Fit();
fit->set_data(data)
fit->set_model(model_a); // This is what the question is about
fit->run();

// Now we can extract and display the optimized parameter array
std::vector<double> p = fit.parameters();
for (int i; i < p.size(); ++i)
    std::cout << p[i] << std::endl;

1 个答案:

答案 0 :(得分:0)

对我来说,这听起来像是要么提供一个提供接口的接口类,要么只是创建一个类hieararchy,其中数据存储在基类中,派生类知道如何计算成本等

有几种方法可以实际实现这一点 - 如果您希望数据在类中持久存在,您可以在构造中或之后传入,例如在成本模型中。

不幸的是,我现在必须赶紧行动,但稍后会回来查看评论等等。