Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/python-2.7/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/google-app-engine/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 制作C++;使用Python函数的输出_C++_Python 2.7_Cython_Wrapper_Software Design - Fatal编程技术网

C++ 制作C++;使用Python函数的输出

C++ 制作C++;使用Python函数的输出,c++,python-2.7,cython,wrapper,software-design,C++,Python 2.7,Cython,Wrapper,Software Design,这更像是一个工程设计问题。MiniSAT是解决SAT问题的基础库。它已经内置了很多优化功能。我目前正在加速代码的一部分。但是,我的代码是用Python编写的,我希望C++代码使用我的代码的输出来执行它。p> 我一直在想在Python中编写一个C++代码的包装器,以便从Python中调用。p> 以下是我关注的代码: Python功能: CNF = get_cnf(filename) c_solver.solve(filename) # loads up CNF in C++ while True:

这更像是一个工程设计问题。MiniSAT是解决SAT问题的基础库。它已经内置了很多优化功能。我目前正在加速代码的一部分。但是,我的代码是用Python编写的,我希望C++代码使用我的代码的输出来执行它。p>

我一直在想在Python中编写一个C++代码的包装器,以便从Python中调用。p> 以下是我关注的代码:

Python功能:

CNF = get_cnf(filename)
c_solver.solve(filename) # loads up CNF in C++
while True:
  # python function to decide variable and the value to assign
  variable, value = python_decide_variable(CNF) 

  # this one calls C++ pickBranchLit 
  result, new_variables, values = python_sat_solver.assign_value(variable, value) 

  if result == "SATISFIABLE":
     break

我是C++ NoOB,但是我很擅长Python。我的设计正确吗?如何更改C++ PcBangChink代码以侦听Python?

< P>在C++中不可能使用Python变量,它们需要转换成适当的C++类型。对于本机类型,Cython通过复制值自动执行此操作

在您的情况下,您希望C++函数接受Python参数。这意味着修改

Solver::pickBranchLit
以接受它所使用的变量的参数

另一种方法是在Python中实现<代码> PcPrimChuts并返回由C++ C++代码返回的<代码> List

这个选项可能是最简单的-因为您已经使用Python生成了代码< > PcBangChutix所使用的值,修改它的C++代码接受这些值作为参数不会产生任何性能效益。 为了能够从Python返回

Lit
结构,需要为结构编写Cython包装,例如:

cdef extern from "SolverTypes.h" namespace "Minisat":
    ctypedef int Var
    struct Lit:
        int     x
        # Use this as a constructor:
        Lit mkLit(Var, bool)

然后,在Cython代码中可以使用<代码> MKLIT(ItnFielsPy)< /Cuff>创建一个可以用来调用C++代码的<代码> List结构。p>


Cython代码调用的C++函数也需要写包装器——参见文档,例如:

我不真正地遵循C++函数的哪一个位获得/使用<代码>变量< /> >和<代码>值< /> >。当然可以从C++调用Python函数,这可能比运行连续循环更好地观察全局变量来更新你的建议!我一直在努力实现这些功能。同时,我听到有人谈论了UZNZMQ类型库来进行C++与Python之间的消息传递。你对它有什么想法吗?传递消息对分布式系统最有用。对于在同一台机器上调用库,它们将产生比Cython生产的简单C-API包装器多得多的开销。取决于用例。
CNF = get_cnf(filename)
c_solver.solve(filename) # loads up CNF in C++
while True:
  # python function to decide variable and the value to assign
  variable, value = python_decide_variable(CNF) 

  # this one calls C++ pickBranchLit 
  result, new_variables, values = python_sat_solver.assign_value(variable, value) 

  if result == "SATISFIABLE":
     break
cdef extern from "SolverTypes.h" namespace "Minisat":
    ctypedef int Var
    struct Lit:
        int     x
        # Use this as a constructor:
        Lit mkLit(Var, bool)