Skip to content

Commit 7b70a38

Browse files
authored
Merge pull request #7 from jcarpent/devel
Enhance portability and flexibility
2 parents e2e1d1b + f7f071c commit 7b70a38

File tree

13 files changed

+230
-138
lines changed

13 files changed

+230
-138
lines changed

.github/workflows/cmake.yml renamed to .github/workflows/ci-ubuntu.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ jobs:
3838
export PYTHONPATH=$PYTHONPATH:/opt/openrobots/lib/python3/site-packages:/opt/openrobots/lib/python3/dist-packages
3939
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/opt/openrobots/lib64:/opt/openrobots/lib/x86_64-linux-gnu:/opt/openrobots/lib/plugin:/opt/openrobots/lib
4040
export PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/opt/openrobots/lib/pkgconfig:/opt/openrobots/share/pkgconfig:/opt/openrobots/lib/x86_64-linux-gnu/pkgconfig:/opt/openrobots/lib64/pkgconfig
41-
cmake -B ${{github.workspace}}/build -DCMAKE_BUILD_TYPE=${{env.BUILD_TYPE}} -DPYTHON_EXECUTABLE=$(which python3) -DCMAKE_PREFIX_PATH=/opt/openrobots -DBUILD_CODEGEN_BINDINGS=ON
41+
cmake -B ${{github.workspace}}/build -DCMAKE_BUILD_TYPE=${{env.BUILD_TYPE}} -DPYTHON_EXECUTABLE=$(which python3) -DCMAKE_PREFIX_PATH=/opt/openrobots -DBUILD_WITH_CPPAD_CODEGEN_BINDINGS=ON
4242
4343
- name: Build
4444
# Build your program with the given configuration

CMakeLists.txt

Lines changed: 28 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,9 @@ CMAKE_MINIMUM_REQUIRED(VERSION 3.1)
77
SET(PROJECT_NAME pycppad)
88
SET(PROJECT_DESCRIPTION "Python bindings for CppAD and CppADCodeGen using Boost.Python")
99
SET(PROJECT_URL "https://github.com/simple-robotics/pycppad")
10+
SET(PROJECT_CUSTOM_HEADER_EXTENSION "hpp")
11+
SET(PROJECT_USE_CMAKE_EXPORT TRUE)
1012

11-
# Project options
12-
OPTION(SUFFIX_SO_VERSION "Suffix library name with its version" ON)
1313

1414
# Project configuration
1515
SET(PROJECT_USE_CMAKE_EXPORT TRUE)
@@ -33,44 +33,52 @@ COMPUTE_PROJECT_ARGS(PROJECT_ARGS LANGUAGES CXX)
3333
PROJECT(${PROJECT_NAME} ${PROJECT_ARGS})
3434
CHECK_MINIMAL_CXX_STANDARD(11 ENFORCE)
3535

36+
# Project options
37+
OPTION(SUFFIX_SO_VERSION "Suffix library name with its version" ON)
38+
OPTION(BUILD_WITH_CPPAD_CODEGEN_BINDINGS "Build the python bindings for code generation (via CppADCodeGen)" OFF)
39+
3640
FINDPYTHON()
3741

3842
SET_BOOST_DEFAULT_OPTIONS()
3943
ADD_PROJECT_DEPENDENCY(Boost REQUIRED)
4044
SEARCH_FOR_BOOST_PYTHON(REQUIRED)
4145
EXPORT_BOOST_DEFAULT_OPTIONS()
4246

47+
IF(BUILD_WITH_CPPAD_CODEGEN_BINDINGS)
48+
ADD_PROJECT_DEPENDENCY(cppadcg 2.4.1 REQUIRED PKG_CONFIG_REQUIRES "cppadcg >= 2.4.1") # CppADCodeGen 2.4.1 is the first version to check the minimal version of CppAD
49+
ADD_DEFINITIONS(-DPYCPPAD_WITH_CPPAD_CODEGEN_BINDINGS)
50+
ENDIF(BUILD_WITH_CPPAD_CODEGEN_BINDINGS)
51+
4352
ADD_PROJECT_DEPENDENCY(cppad 20180000.0 REQUIRED PKG_CONFIG_REQUIRES "cppad >= 20180000.0")
4453
ADD_PROJECT_DEPENDENCY(Eigen3 REQUIRED PKG_CONFIG_REQUIRES "eigen3 >= 3.0.5")
4554
ADD_PROJECT_DEPENDENCY(eigenpy 2.6.6 REQUIRED)
4655

47-
OPTION(BUILD_CODEGEN_BINDINGS "Build the python bindings for code generation (via CppADCodeGen)" OFF)
48-
49-
IF(BUILD_CODEGEN_BINDINGS)
50-
ADD_PROJECT_DEPENDENCY(cppadcg 2.4.1 REQUIRED PKG_CONFIG_REQUIRES "cppadcg >= 2.4.1") # CppADCodeGen 2.4.1 is the first version to check the minimal version of CppAD
51-
ADD_DEFINITIONS(-DPYCPPAD_BUILD_CPPAD_CODEGEN_BINDINGS)
52-
ENDIF(BUILD_CODEGEN_BINDINGS)
53-
5456
SET(${PROJECT_NAME}_HEADERS
5557
include/${PROJECT_NAME}/fwd.hpp
5658
include/${PROJECT_NAME}/ad.hpp
5759
include/${PROJECT_NAME}/independent.hpp
5860
include/${PROJECT_NAME}/ad_fun.hpp
61+
include/${PROJECT_NAME}/cast.hpp
5962
include/${PROJECT_NAME}/cppad.hpp
6063
include/${PROJECT_NAME}/cppad-scalar.hpp
64+
include/${PROJECT_NAME}/utils/scope.hpp
65+
66+
# Generated headers
67+
${${PROJECT_NAME}_BINARY_DIR}/include/${PROJECT_NAME}/config.hpp
68+
${${PROJECT_NAME}_BINARY_DIR}/include/${PROJECT_NAME}/deprecated.hpp
69+
${${PROJECT_NAME}_BINARY_DIR}/include/${PROJECT_NAME}/warning.hpp
6170
)
6271

6372
SET(${PROJECT_NAME}_SOURCES
6473
src/cppad.cpp
6574
)
6675

67-
IF(BUILD_CODEGEN_BINDINGS)
76+
IF(BUILD_WITH_CPPAD_CODEGEN_BINDINGS)
6877
LIST(APPEND ${PROJECT_NAME}_HEADERS
6978
include/${PROJECT_NAME}/codegen/cg.hpp
70-
include/${PROJECT_NAME}/codegen/ad.hpp
7179
include/${PROJECT_NAME}/codegen/cppadcg-scalar.hpp
7280
)
73-
ENDIF(BUILD_CODEGEN_BINDINGS)
81+
ENDIF(BUILD_WITH_CPPAD_CODEGEN_BINDINGS)
7482

7583
ADD_LIBRARY(${PROJECT_NAME} SHARED ${${PROJECT_NAME}_SOURCES} ${${PROJECT_NAME}_HEADERS})
7684

@@ -79,10 +87,17 @@ IF(SUFFIX_SO_VERSION)
7987
ENDIF(SUFFIX_SO_VERSION)
8088

8189
TARGET_LINK_BOOST_PYTHON(${PROJECT_NAME} PUBLIC)
90+
TARGET_LINK_LIBRARIES(${PROJECT_NAME} PUBLIC ${cppad_LIBRARY} eigenpy::eigenpy)
91+
IF(BUILD_WITH_CPPAD_CODEGEN_BINDINGS)
92+
TARGET_INCLUDE_DIRECTORIES(${PROJECT_NAME}
93+
SYSTEM PUBLIC
94+
${cppadcg_INCLUDE_DIR}
95+
)
96+
TARGET_LINK_LIBRARIES(${PROJECT_NAME} PUBLIC ${CMAKE_DL_LIBS})
97+
ENDIF(BUILD_WITH_CPPAD_CODEGEN_BINDINGS)
8298

8399
TARGET_INCLUDE_DIRECTORIES(${PROJECT_NAME}
84100
SYSTEM PUBLIC
85-
${cppad_INCLUDE_DIR}
86101
${Boost_INCLUDE_DIRS}
87102
${EIGEN3_INCLUDE_DIR}
88103
${PYTHON_INCLUDE_DIRS}

include/pycppad/ad.hpp

Lines changed: 7 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,10 @@
66
#define __pycppad_ad_hpp__
77

88
#include "pycppad/fwd.hpp"
9-
#include "eigenpy/user-type.hpp"
10-
#include "eigenpy/ufunc.hpp"
9+
#include "pycppad/cast.hpp"
10+
11+
#include <eigenpy/user-type.hpp>
12+
#include <eigenpy/ufunc.hpp>
1113

1214
namespace pycppad
1315
{
@@ -27,7 +29,7 @@ namespace pycppad
2729
cl
2830
.def(bp::init<>(bp::arg("self"),"Default constructor"))
2931
.def(bp::init<Scalar>(bp::args("self","value"),
30-
std::string("Constructor from a ").append(typeid(Scalar).name()).c_str()))
32+
std::string("Constructor from a ").append(bp::type_id<Scalar>().name()).c_str()))
3133
.def(bp::init<AD>(bp::args("self","other"),"Copy constructor"))
3234
.def(bp::self + bp::self)
3335
.def(bp::self - bp::self)
@@ -71,7 +73,7 @@ namespace pycppad
7173
.def("__repr__",&print)
7274

7375
.def("__float__",&::CppAD::Value<Scalar>)
74-
.def("__int__",&__int__)
76+
.def("__int__",&internal::Cast<AD,int64_t>::run)
7577
;
7678
}
7779

@@ -83,11 +85,6 @@ namespace pycppad
8385
ss << get_class_name() << "(" << self <<")";
8486
return ss.str();
8587
}
86-
87-
static int64_t __int__(const AD & self)
88-
{
89-
return static_cast<int>(::CppAD::Value<Scalar>(self));
90-
}
9188

9289
protected:
9390

@@ -109,7 +106,7 @@ namespace pycppad
109106
{
110107
set_class_name(class_name);
111108
bp::class_<AD>(class_name.c_str(),
112-
std::string("AD type corresponding to the scalar type ").append(typeid(Scalar).name()).c_str(),
109+
std::string("AD type corresponding to the scalar type ").append(bp::type_id<Scalar>().name()).c_str(),
113110
bp::no_init)
114111
.def(ADVisitor<Scalar>());
115112

include/pycppad/cast.hpp

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
/*
2+
* Copyright 2021 INRIA
3+
*/
4+
5+
#ifndef __pycppad_cast_hpp__
6+
#define __pycppad_cast_hpp__
7+
8+
#include "pycppad/fwd.hpp"
9+
10+
namespace pycppad
11+
{
12+
namespace internal
13+
{
14+
15+
template<typename From, typename To>
16+
struct Cast
17+
{
18+
static To run(const From & from)
19+
{
20+
return static_cast<To>(from);
21+
}
22+
};
23+
24+
template<typename Scalar>
25+
struct CppADValue
26+
{
27+
static Scalar get(const ::CppAD::AD<Scalar> & v)
28+
{
29+
return ::CppAD::Value<Scalar>(v);
30+
}
31+
};
32+
33+
template<typename Scalar, typename To>
34+
struct Cast<::CppAD::AD<Scalar>,To>
35+
{
36+
typedef ::CppAD::AD<Scalar> From;
37+
static To run(const From & from)
38+
{
39+
return static_cast<To>(CppADValue<Scalar>::get(from));
40+
}
41+
};
42+
} // namespace internal
43+
} // namespace pycppad
44+
45+
#endif //#ifndef __pycppad_cast_hpp__

include/pycppad/codegen/ad.hpp

Lines changed: 0 additions & 20 deletions
This file was deleted.

0 commit comments

Comments
 (0)