1. 04 Aug, 2016 2 commits
    • Jason Rhinelander's avatar
      Eigen support for special matrix objects · 9ffb3dda
      Jason Rhinelander authored
      Functions returning specialized Eigen matrices like Eigen::DiagonalMatrix and
      Eigen::SelfAdjointView--which inherit from EigenBase but not
      DenseBase--isn't currently allowed; such classes are explicitly copyable
      into a Matrix (by definition), and so we can support functions that
      return them by copying the value into a Matrix then casting that
      resulting dense Matrix into a numpy.ndarray.  This commit does exactly
      that.
      9ffb3dda
    • Jason Rhinelander's avatar
      Fix eigen copying of non-standard stride values · 8657f308
      Jason Rhinelander authored
      Some Eigen objects, such as those returned by matrix.diagonal() and
      matrix.block() have non-standard stride values because they are
      basically just maps onto the underlying matrix without copying it (for
      example, the primary diagonal of a 3x3 matrix is a vector-like object
      with .src equal to the full matrix data, but with stride 4).  Returning
      such an object from a pybind11 method breaks, however, because pybind11
      assumes vectors have stride 1, and that matrices have strides equal to
      the number of rows/columns or 1 (depending on whether the matrix is
      stored column-major or row-major).
      
      This commit fixes the issue by making pybind11 use Eigen's stride
      methods when copying the data.
      8657f308
  2. 03 Aug, 2016 1 commit
    • Jason Rhinelander's avatar
      Add support for Eigen::Ref<...> function arguments · 5fd5074a
      Jason Rhinelander authored
      Eigen::Ref is a common way to pass eigen dense types without needing a
      template, e.g. the single definition `void
      func(Eigen::Ref<Eigen::MatrixXd> x)` can be called with any double
      matrix-like object.
      
      The current pybind11 eigen support fails with internal errors if
      attempting to bind a function with an Eigen::Ref<...> argument because
      Eigen::Ref<...> satisfies the "is_eigen_dense" requirement, but can't
      compile if actually used: Eigen::Ref<...> itself is not default
      constructible, and so the argument std::tuple containing an
      Eigen::Ref<...> isn't constructible, which results in compilation
      failure.
      
      This commit adds support for Eigen::Ref<...> by giving it its own
      type_caster implementation which consists of an internal type_caster of
      the referenced type, load/cast methods that dispatch to the internal
      type_caster, and a unique_ptr to an Eigen::Ref<> instance that gets
      set during load().
      
      There is, of course, no performance advantage for pybind11-using code of
      using Eigen::Ref<...>--we are allocating a matrix of the derived type
      when loading it--but this has the advantage of allowing pybind11 to bind
      transparently to C++ methods taking Eigen::Refs.
      5fd5074a
  3. 09 Jul, 2016 1 commit
  4. 06 Jul, 2016 1 commit
    • Jason Rhinelander's avatar
      Add _<bool>("s1", "s2") ternary & use TYPE_CASTER · 8469f751
      Jason Rhinelander authored
      This commit adds an additional _ template function for compile-time
      selection between two description strings.  This in turn allows the
      elimination of needing two name() methods in type_caster<arithmetic
      types> and type_caster<eigen types>, which allows them to start using
      PYBIND11_TYPE_CASTER instead, simplifying their code by eliminating all
      the code that they are duplicating from the macro.
      8469f751
  5. 05 Jul, 2016 1 commit
    • Ben North's avatar
      Fix handling of one-dimensional input arrays · 93594a38
      Ben North authored
      In eigen.h, type_caster<Type>::load():  For the 'ndim == 1' case, use
      the 'InnerStride' type because there is only an inner stride for a
      vector.  Choose between (n_elts x 1) or (1 x n_elts) according to
      whether we're constructing a Vector or a RowVector.
      93594a38
  6. 30 May, 2016 1 commit
  7. 29 May, 2016 1 commit
  8. 24 May, 2016 1 commit
  9. 20 May, 2016 1 commit
  10. 15 May, 2016 1 commit
  11. 08 May, 2016 1 commit
  12. 05 May, 2016 1 commit