- 09 Apr, 2017 1 commit
-
-
Jason Rhinelander authored
Many of the Eigen type casters' name() methods weren't wrapping the type description in a `type_descr` object, which thus wasn't adding the "{...}" annotation used to identify an argument which broke the help output by skipping eigen arguments. The test code I had added even had some (unnoticed) broken output (with the "arg0: " showing up in the return value). This commit also adds test code to ensure that named eigen arguments actually work properly, despite the invalid help output. (The added tests pass without the rest of this commit).
-
- 07 Apr, 2017 1 commit
-
-
Dean Moldovan authored
Fixes #775. Assignments of the form `Type.static_prop = value` should be translated to `Type.static_prop.__set__(value)` except when `isinstance(value, static_prop)`.
-
- 06 Apr, 2017 1 commit
-
-
Dean Moldovan authored
Besides appearing in the CMake GUI, the `:FILENAME` specifier changes behavior as well: cmake -DPYTHON_EXECUTABLE=python .. # FAIL, can't find python cmake -DPYTHON_EXECUTABLE=/path/to/python .. # OK cmake -DPYTHON_EXECUTABLE:FILENAME=python .. # OK cmake -DPYTHON_EXECUTABLE:FILENAME=/path/to/python .. # OK
-
- 05 Apr, 2017 1 commit
-
-
Jason Rhinelander authored
When make_tuple fails (for example, when print() is called with a non-convertible argument, as in #778) the error message a less helpful than it could be: make_tuple(): unable to convert arguments of types 'std::tuple<type1, type2>' to Python object There is no actual std::tuple involved (only a parameter pack and a Python tuple), but it also doesn't immediately reveal which type caused the problem. This commit changes the debugging mode output to show just the problematic type: make_tuple(): unable to convert argument of type 'type2' to Python object
-
- 02 Apr, 2017 2 commits
-
-
Dean Moldovan authored
```c++ m.def("foo", foo, py::call_guard<T>()); ``` is equivalent to: ```c++ m.def("foo", [](args...) { T scope_guard; return foo(args...); // forwarded arguments }); ``` -
Roman Miroshnychenko authored
This commit adds `error_already_set::matches()` convenience method to check if the exception trapped by `error_already_set` matches a given Python exception type. This will address #700 by providing a less verbose way to check exceptions.
-
- 28 Mar, 2017 1 commit
-
-
Dean Moldovan authored
* Support raw string literals as input for py::eval * Dedent only when needed
-
- 22 Mar, 2017 4 commits
-
-
Wenzel Jakob authored
* nicer py::capsule destructor mechanism * added destructor-only version of capsule & tests * added documentation for module destructors (fixes #733)
-
Jason Rhinelander authored
The extends the previous unchecked support with the ability to determine the dimensions at runtime. This incurs a small performance hit when used (versus the compile-time fixed alternative), but is still considerably faster than the full checks on every call that happen with `.at()`/`.mutable_at()`.
-
Jason Rhinelander authored
This adds bounds-unchecked access to arrays through a `a.unchecked<Type, Dimensions>()` method. (For `array_t<T>`, the `Type` template parameter is omitted). The mutable version (which requires the array have the `writeable` flag) is available as `a.mutable_unchecked<...>()`. Specifying the Dimensions as a template parameter allows storage of an std::array; having the strides and sizes stored that way (as opposed to storing a copy of the array's strides/shape pointers) allows the compiler to make significant optimizations of the shape() method that it can't make with a pointer; testing with nested loops of the form: for (size_t i0 = 0; i0 < r.shape(0); i0++) for (size_t i1 = 0; i1 < r.shape(1); i1++) ... r(i0, i1, ...) += 1; over a 10 million element array gives around a 25% speedup (versus using a pointer) for the 1D case, 33% for 2D, and runs more than twice as fast with a 5D array. -
Dean Moldovan authored
Fixes #754.
-
- 21 Mar, 2017 3 commits
-
-
Jason Rhinelander authored
This extends the trivial handling to support trivial handling for Fortran-order arrays (i.e. column major): if inputs aren't all C-contiguous, but *are* all F-contiguous, the resulting array will be F-contiguous and we can do trivial processing. For anything else (e.g. C-contiguous, or inputs requiring non-trivial processing), the result is in (numpy-default) C-contiguous layout.
-
Jason Rhinelander authored
The only part of the vectorize code that actually needs c-contiguous is the "trivial" broadcast; for non-trivial arguments, the code already uses strides properly (and so handles C-style, F-style, neither, slices, etc.) This commit rewrites `broadcast` to additionally check for C-contiguous storage, then takes off the `c_style` flag for the arguments, which will keep the functionality more or less the same, except for no longer requiring an array copy for non-c-contiguous input arrays. Additionally, if we're given a singleton slice (e.g. a[0::4, 0::4] for a 4x4 or smaller array), we no longer fail triviality because the trivial code path never actually uses the strides on a singleton.
-
Dean Moldovan authored
Instead of a segfault. Fixes #751. This covers the case of loading a custom holder from a default-holder instance. Attempting to load one custom holder from a different custom holder (i.e. not `std::unique_ptr`) yields undefined behavior, just as #588 established for inheritance.
-
- 17 Mar, 2017 2 commits
-
-
Jason Rhinelander authored
We can't support this for classes from imported modules (which is the primary purpose of a ctor argument base class) because we *have* to have both parent and derived to properly extract a multiple-inheritance base class pointer from a derived class pointer. We could support this for actual `class_<Base, ...> instances, but since in that case the `Base` is already present in the code, it seems more consistent to simply always require MI to go via template options.
-
Jason Rhinelander authored
Fixes #738 The current check for conformability fails when given a 2D, 1xN or Nx1 input to a row-major or column-major, respectively, Eigen::Ref, leading to a copy-required state in the type_caster, but this later failed because the copy was also non-conformable because it had the same shape and strides (because a 1xN or Nx1 is both F and C contiguous). In such cases we can safely ignore the stride on the "1" dimension since it'll never be used: only the "N" dimension stride needs to match the Eigen::Ref stride, which both fixes the non-conformable copy problem, but also avoids a copy entirely as long as the "N" dimension has a compatible stride.
-
- 16 Mar, 2017 1 commit
-
-
Dean Moldovan authored
Fixes #731. Generally, this applies to any caster made with PYBIND11_TYPE_CASTER().
-
- 15 Mar, 2017 1 commit
-
-
Dean Moldovan authored
Fixes #728.
-
- 14 Mar, 2017 2 commits
-
-
Patrick Stewart authored
Allows equivalent integral types and numpy dtypes
-
Patrick Stewart authored
Allows use of vectors as python buffers, so for example they can be adopted without a copy by numpy.asarray Allows faster conversion of buffers to vectors by copying instead of individually casting the elements
-
- 13 Mar, 2017 1 commit
-
-
Dean Moldovan authored
* Add value_type member alias to py::array_t (resolve #632) * Use numpy scalar name in py::array_t function signatures (e.g. float32/64 instead of just float)
-
- 12 Mar, 2017 1 commit
-
-
Jason Rhinelander authored
The duration calculation was using %, but that's only supported on duration objects when the arithmetic type supports %, and hence fails for floats. Fixed by subtracting off the calculated values instead.
-
- 10 Mar, 2017 1 commit
-
-
Dean Moldovan authored
* Add `pytest.ini` config file and set default options there instead of in `CMakeLists.txt` (command line arguments). * Change all output capture from `capfd` (filedescriptors) to `capsys` (Python's `sys.stdout` and `sys.stderr`). This avoids capturing low-level C errors, e.g. from the debug build of Python. * Set pytest minimum version to 3.0 to make it easier to use new features. Removed conditional use of `excinfo.match()`. * Clean up some leftover function-level `@pytest.requires_numpy`.
-
- 08 Mar, 2017 1 commit
-
-
Jason Rhinelander authored
When using pybind::options to disable function signatures, user-defined docstrings only get appended if they exist, but newlines were getting appended unconditionally, so the docstring could end up with blank lines (depending on which overloads, in particular, provided docstrings). This commit suppresses the empty lines by only adding newlines for overloads when needed.
-
- 06 Mar, 2017 1 commit
-
-
Jason Rhinelander authored
This makes array_t respect overload resolution and noconvert by failing to load when `convert = false` if the src isn't already an array of the correct type.
-
- 03 Mar, 2017 1 commit
-
-
Matthieu Bec authored
-
- 28 Feb, 2017 1 commit
-
-
Dean Moldovan authored
-
- 27 Feb, 2017 1 commit
-
-
Dean Moldovan authored
-
- 26 Feb, 2017 6 commits
-
-
Dean Moldovan authored
Slightly reduces binary size (range for loops over tuple/list benefit a lot). The iterators are compatible with std algorithms.
-
Dean Moldovan authored
The added type aliases are required by `std::iterator_traits`. Python iterators satisfy the `InputIterator` concept in C++.
-
Dean Moldovan authored
Before this, `py::iterator` didn't do any error handling, so code like: ```c++ for (auto item : py::int_(1)) { // ... } ``` would just silently skip the loop. The above now throws `TypeError` as expected. This is a breaking behavior change, but any code which relied on the silent skip was probably broken anyway. Also, errors returned by `PyIter_Next()` are now properly handled. -
Wenzel Jakob authored
-
Jason Rhinelander authored
Fixes test failure on Fedora 25.
-
Jason Rhinelander authored
Fixes some numpy tests failures on ppc64 in big-endian mode due to little-endian assumptions. Fixes #694.
-
- 24 Feb, 2017 6 commits
-
-
Jason Rhinelander authored
test_eigen.py and test_numpy_*.py have the same @pytest.requires_eigen_and_numpy or @pytest.requires_numpy on every single test; this changes them to use pytest's global `pytestmark = ...` instead to disable the entire module when numpy and/or eigen aren't available.
-
Jason Rhinelander authored
This commit largely rewrites the Eigen dense matrix support to avoid copying in many cases: Eigen arguments can now reference numpy data, and numpy objects can now reference Eigen data (given compatible types). Eigen::Ref<...> arguments now also make use of the new `convert` argument use (added in PR #634) to avoid conversion, allowing `py::arg().noconvert()` to be used when binding a function to prohibit copying when invoking the function. Respecting `convert` also means Eigen overloads that avoid copying will be preferred during overload resolution to ones that require copying. This commit also rewrites the Eigen documentation and test suite to explain and test the new capabilities.
-
Jason Rhinelander authored
Numpy raises ValueError when attempting to modify an array, while py::array is raising a RuntimeError. This changes the exception to a std::domain_error, which gets mapped to the expected ValueError in python.
-
Jason Rhinelander authored
numpy arrays aren't currently properly setting base: by setting `->base` directly, the base doesn't follow what numpy expects and documents (that is, following chained array bases to the root array). This fixes the behaviour by using numpy's PyArray_SetBaseObject to set the base instead, and then updates the tests to reflect the fixed behaviour.
-
Jason Rhinelander authored
Currently when we do a conversion between a numpy array and an Eigen Vector, we allow the conversion only if the Eigen type is a compile-time vector (i.e. at least one dimension is fixed at 1 at compile time), or if the type is dynamic on *both* dimensions. This means we can run into cases where MatrixXd allow things that conforming, compile-time sizes does not: for example, `Matrix<double,4,Dynamic>` is currently not allowed, even when assigning from a 4-element vector, but it *is* allowed for a `Matrix<double,Dynamic,Dynamic>`. This commit also reverts the current behaviour of using the matrix's storage order to determine the structure when the Matrix is fully dynamic (i.e. in both dimensions). Currently we assign to an eigen row if the storage order is row-major, and column otherwise: this seems wrong (the storage order has nothing to do with the shape!). While numpy doesn't distinguish between a row/column vector, Eigen does, but it makes more sense to consistently choose one than to produce something with a different shape based on the intended storage layout.
-
Jason Rhinelander authored
-