我正在尝试为C ++ Computational Topology库GUDHI(http://gudhi.gforge.inria.fr)设计一个Cython包装器。 GUDHI类为其参数提供其他类,并且这些类将其他子类传递给它们的方法。因此直接推向Cython是相当混乱的。我在下面有一个代码示例。
我向cython google小组发了一个问题,有人建议我用C ++编写一个简化的包装器来隐藏Cython中的这种复杂性。评论的text如下。
另一种选择,如果事情变得复杂,就是在C ++中编写简化包装并调用它们。 (在Cython支持任何C ++之前,这曾经是必要的,如果使用了深奥的C ++特性,它仍然很有用,即使它只是一个简单的声明几个typedef。在下面的代码中,它定义了(以及取消定义和重新定义(!))宏以应对本来可能是非常详细的代码,这可能是你最好的选择。)你也可以进行强制转换[1](动态或其他)来转换Cython没有的类型#39知道是相关的。
这是一个代码示例,可让您了解所涉及的层次结构。
typedef CGAL::Epick_d< CGAL::Dimension_tag<2> > Kernel;
--- needs to be passed into
Gudhi::alpha_complex::Alpha_complex<Kernel> alpha_complex_from_points(points, alpha_square_max_value);
Epick_d.h
--- Epick_d.h depends upon these libraries
#include <CGAL/NewKernel_d/Cartesian_base.h>
#include <CGAL/NewKernel_d/Cartesian_static_filters.h>
#include <CGAL/NewKernel_d/Cartesian_filter_K.h>
#include <CGAL/NewKernel_d/Wrapper/Cartesian_wrap.h>
#include <CGAL/NewKernel_d/Kernel_d_interface.h>
#include <CGAL/internal/Exact_type_selector.h>
#include <CGAL/Interval_nt.h>
--- Sample source code for Epick_d.h
namespace CGAL {
#define CGAL_BASE \
Cartesian_filter_K< Cartesian_base_d<double, Dim>, \
Cartesian_base_d<Interval_nt_advanced, Dim>, \
Cartesian_base_d<internal::Exact_field_selector<double>::Type, Dim> \
>
template<class Dim>
struct Epick_d_help1
: CGAL_BASE
{
CGAL_CONSTEXPR Epick_d_help1(){}
CGAL_CONSTEXPR Epick_d_help1(int d):CGAL_BASE(d){}
};
#undef CGAL_BASE
#define CGAL_BASE \
Cartesian_static_filters<Dim,Epick_d_help1<Dim>,Epick_d_help2<Dim> >
template<class Dim>
struct Epick_d_help2
: CGAL_BASE
{
CGAL_CONSTEXPR Epick_d_help2(){}
CGAL_CONSTEXPR Epick_d_help2(int d):CGAL_BASE(d){}
};
#undef CGAL_BASE
#define CGAL_BASE \
Kernel_d_interface< \
Cartesian_wrap< \
Epick_d_help2<Dim>, \
Epick_d<Dim> > >
template<class Dim>
struct Epick_d
: CGAL_BASE
{
CGAL_CONSTEXPR Epick_d(){}
CGAL_CONSTEXPR Epick_d(int d):CGAL_BASE(d){}
};
#undef CGAL_BASE
}
#endif
我不确定如何设计一个与Cython兼容的C ++包装器,但也会隐藏Cython的层次结构。
这是我的想法,但我不确定这是否是简化包装器的含义。因此,GUDHI类采用一组n维点,然后对它们进行一些几何计算。所以现在如果我想直接包装一个GUDHI类,例如Simplex_tree(subclass)
,那么我需要通知Cython这个。相反,我可以编写一个C ++类,它只需要获取点数组,计算结果,然后返回一个数组。所以在一些伪代码中就像
Class(*array)
constructor(*array)
loop:
take values from *array and create CGAL::Point_d
push new CGAL::Point_d to std::vector<CGAL::Point_d>
include all of the hierarchical class operations here.
method_1(std::vector)
include all of the hierarchical operations here, but
return the result as a simple array or struct.
我是否能够在cython中包装此类而不必传递所有类层次结构,因为我只传递一个数组指针到该函数?
答案 0 :(得分:0)
这是上次GUDHI version 2.0.0所做的。 包装类Alpha_complex_interface(不再模板化)包装Alpha_complex&gt;在各个方面工作。 然后对Alpha_complex_interface类进行cython化(参见alpha_complex.pyx) 然后通过std :: vector&gt;&amp;交换点数。 如果您对我的方式有任何疑问,或者您需要其他界面,请不要犹豫。