C++ 制作C++;使用Python函数的输出
这更像是一个工程设计问题。MiniSAT是解决SAT问题的基础库。它已经内置了很多优化功能。我目前正在加速代码的一部分。但是,我的代码是用Python编写的,我希望C++代码使用我的代码的输出来执行它。p>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:
我一直在想在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)