小编Eri*_*ic 的帖子

如何用Ceres解决大规模非线性优化问题?

我需要优化由2D网格点表示的表面,以产生与提供的目标法向量对齐的表面的法向矢量.网格大小可能介于201x201和1001x1001之间.这意味着变量的数量将是40,000到1,000,000,因为我只修改网格点的z坐标.

我正在使用Ceres框架,因为它应该在大规模非线性优化问题上表现出色.我已经尝试过MATLAB的fmincon,但它使用了大量的内存.我写了一个适用于小网格的目标函数(在3x3和31x31成功).但是,当我尝试编译具有大网格大小(157x200)的代码时,我看到下面的错误.我已经读到这是Eigen的限制.但是,当我告诉Ceres使用LAPACK而不是Eigen时,我得到大型矩阵的相同错误.我试过这些线:

options.dense_linear_algebra_library_type = ceres::LAPACK;

options.linear_solver_type = ceres::DENSE_QR;
Run Code Online (Sandbox Code Playgroud)

这些告诉求解器使用LAPACK和DENSE_QR,因为使用3x3网格的输出显示:

Minimizer                        TRUST_REGION

Dense linear algebra library           LAPACK
Trust region strategy     LEVENBERG_MARQUARDT

                                    Given                     Used
Linear solver                        DENSE_QR                 DENSE_QR
Threads                                     1                        1
Linear solver threads                       1                        1
Run Code Online (Sandbox Code Playgroud)

但是,当我使用大参数时,我仍然会得到Eigen的错误.

无论如何,我真的可以使用一些帮助.如何让Ceres优化大量变量(> 30,000)?提前致谢

链接到Ceres:http://ceres-solver.org

链接到Eigen:http://eigen.tuxfamily.org/dox/

错误:

In file included from /usr/include/eigen3/Eigen/Core:254:0,
             from /usr/local/include/ceres/jet.h:165,
             from /usr/local/include/ceres/internal/autodiff.h:145,
             from /usr/local/include/ceres/autodiff_cost_function.h:132,
             from /usr/local/include/ceres/ceres.h:37,
             from /home/ubuntu/code/surfaceopt/surfaceopt.cc:10:
/usr/include/eigen3/Eigen/src/Core/DenseStorage.h: In instantiation of ‘Eigen::internal::plain_array<T, Size, MatrixOrArrayOptions, Alignment>::plain_array()     [with T = double; int Size = 31400; int MatrixOrArrayOptions = …
Run Code Online (Sandbox Code Playgroud)

c++ optimization lapack eigen large-scale

8
推荐指数
1
解决办法
3778
查看次数

Django:如何对更新视图/表单进行单元测试

我正在尝试对更新表单和视图进行单元测试。我将Django Crispy Forms用于创建和更新表单。UpdateForm继承了CreateForm并对提交按钮文本进行了少量更改。CreateView和UpdateView非常相似。它们具有相同的模型,模板和success_url。它们的区别在于它们使用各自的形式,CreateView继承django.views.generic.CreateView,UpdateView继承django.views.generic.edit.UpdateView。

该网站运行良好。我可以毫无问题地创建和编辑对象。但是,下面显示的第二项测试失败。如何测试我的UpdateForm?

任何帮助,将不胜感激。谢谢。

该测试通过:

class CreateFormTest(TestCase):

    def setUp(self):
        self.valid_data = {
            'x': 'foo',
            'y': 'bar',
        }

    def test_create_form_valid(self):
        """ Test CreateForm with valid data """
        form = CreateForm(data=self.valid_data)
        self.assertTrue(form.is_valid())
        obj = form.save()
        self.assertEqual(obj.x, self.valid_data['x'])
Run Code Online (Sandbox Code Playgroud)

该测试失败:

class UpdateFormTest(TestCase):
    def setUp(self):
        self.obj = Factories.create_obj()  # Creates the object

    def test_update_form_valid(self):
        """ Test UpdateForm with valid data """
        valid_data = model_to_dict(self.obj)
        valid_data['x'] = 'new'
        form = UpdateForm(valid_data)
        self.assertTrue(form.is_valid())
        case = form.save()
        self.assertEqual(case.defendant, self.valid_data['defendant']
Run Code Online (Sandbox Code Playgroud)

python forms django unit-testing

5
推荐指数
1
解决办法
1429
查看次数

标签 统计

c++ ×1

django ×1

eigen ×1

forms ×1

lapack ×1

large-scale ×1

optimization ×1

python ×1

unit-testing ×1