使用scipy.optimize.minimize优化cython编译的类方法

时间:2018-03-25 13:01:57

标签: python performance scipy cython

对于优化问题,我需要为许多不同的参数argmin_u f(u, a)找到a。我的所有代码都是用Python编写的,所以我想我会使用cython来优化这个特定的任务。我使用scipy.optimize.minimize进行实际优化。

我编写了一个简单的cython类来包装函数,使用单独的方法设置参数并使用单个输入来评估函数。但是,当我尝试优化它时,编译工作但我收到运行时错误:

TypeError: wrap() takes exactly 2 positional arguments (1 given)

以下是我设法重现错误的最小示例(在.pyx文件中):

from scipy.optimize import minimize

cdef double testfun(double x):
  return (x-3)**2

cdef class TestClass(object):
  cdef double eval(self, double x):
    return (x-5)**2

cpdef optimize_testfun():

  # this works:
  res = minimize(testfun, [0])
  print('Result: {}'.format(res.x[0]))

  # this does not work:
  cdef TestClass test_object = TestClass()
  res = minimize(test_object.eval, [0])
  print('Result: {}'.format(res.x[0]))

请注意,对于常规编译函数,优化工作正常。此外,对于常规Python类,这种构造也适用。我想问题在于cython处理self参数的方式。

有没有人有想法让代码与编译的类一起使用?或者是否有人有另外的想法如何包装多参数函数以将其作为编译的单参数函数呈现给minimize

我对优化和cython的体验是有限的,所以如果这是一个愚蠢的方法,请告诉我。

[NB。我最初的问题非常模糊,我几乎完全重写了它,以提供一个清晰且可重现的问题大纲]

0 个答案:

没有答案