首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在OR工具中使用Python回调

在OR工具中使用Python回调
EN

Stack Overflow用户
提问于 2015-03-17 03:20:08
回答 1查看 695关注 0票数 3

我希望这是一个简单的饮酒问题。我正在使用谷歌或工具优化库。它是一个用SWIG包装的C++库(我对它知之甚少)。我很难让Python回调函数工作起来。有一个C++函数

代码语言:javascript
复制
DecisionBuilder* MakePhase(const std::vector<IntVar*>& vars,
                           IndexEvaluator1* var_evaluator,
                           IntValueStrategy val_str);

随同

代码语言:javascript
复制
typedef ResultCallback1<int64, int64> IndexEvaluator1;

而相关的酒杯(我相信)是

代码语言:javascript
复制
  DecisionBuilder* VarEvalValStrPhase(
      const std::vector<IntVar*>& vars,
      ResultCallback1<int64, int64>* var_evaluator,
      operations_research::Solver::IntValueStrategy val_str) {
    return self->MakePhase(vars, var_evaluator, val_str);
  }

在另一个文件中我们有

代码语言:javascript
复制
%{
static int64 PyCallback1Int64Int64(PyObject* pyfunc, int64 i) {
  // () needed to force creation of one-element tuple
  PyObject* pyresult = PyEval_CallFunction(pyfunc, "(l)", static_cast<long>(i));
  int64 result = 0;
  if (!pyresult) {
    PyErr_SetString(PyExc_RuntimeError,
                    "ResultCallback1<int64, int64> invocation failed.");
  } else {
    result = PyInt_AsLong(pyresult);
    Py_DECREF(pyresult);
  }
  return result;
}
%}

%typemap(in) ResultCallback1<int64, int64>* {
  if (!PyCallable_Check($input)) {
    PyErr_SetString(PyExc_TypeError, "Need a callable object!");
    SWIG_fail;
  }
  $1 = NewPermanentCallback(&PyCallback1Int64Int64, $input);
}

在我的Python模块中,我定义了一个函数Run1,如下所示(这里是我认为应该有一些类型转换的地方,但我认为这不是Python ):

代码语言:javascript
复制
def Run1(index1):
    return index1

并设定

代码语言:javascript
复制
selector_callback = Run1
solver = pywrapcp.Solver("graph-coloring")

最后,我打电话给

代码语言:javascript
复制
solver.Phase(nodes,
             selector_callback,
             solver.INT_VALUE_DEFAULT)

唉,这是事情发展的方向,我总是会犯以下错误:

代码语言:javascript
复制
  File "C:\dev\Python27\lib\site-packages\ortools-1.3853-py2.7-win-amd64.egg\ortools\constraint_solver\pywrapcp.py", line 457, in Phase
    def Phase(self, *args): return _pywrapcp.Solver_Phase(self, *args)
NotImplementedError: Wrong number or type of arguments for overloaded function 'Solver_Phase'.
  Possible C/C++ prototypes are:
    operations_research::Solver::MakePhase(std::vector< operations_research::IntVar *,std::allocator< operations_research::IntVar * > > const &,operations_research::Solver::IntVarStrategy,operations_research::Solver::IntValueStrategy)
    operations_research::Solver::MakePhase(std::vector< operations_research::IntervalVar *,std::allocator< operations_research::IntervalVar * > > const &,operations_research::Solver::IntervalStrategy)
    operations_research::Solver::MakePhase(std::vector< operations_research::SequenceVar *,std::allocator< operations_research::SequenceVar * > > const &,operations_research::Solver::SequenceStrategy)

困难在于第二个参数中的回调函数;如果我使用一个内置值而不是回调,则操作是成功的。但是,我需要在里面有我自己的功能。

我不会在我的模块中导入任何文件。我需要这么做吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-03-17 18:22:01

几天后,我找到了答案。如果我打电话

代码语言:javascript
复制
solver.VarEvalValStrPhase(nodes,
             selector_callback,
             solver.INT_VALUE_DEFAULT)

它不是在手册中引用的标准函数名Phase,而是起作用的。如果我要使用另一个参数组合,我必须使用另一个函数名,我相信。在这种情况下,似乎重载失败了。这很好,但是开发者的警告是很好的。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29090752

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档