$30 off During Our Annual Pro Sale. View Details »

Using Eigen from Swift (via C)

Taketo Sano
September 19, 2021

Using Eigen from Swift (via C)

Taketo Sano

September 19, 2021
Tweet

More Decks by Taketo Sano

Other Decks in Programming

Transcript

  1. Using Eigen from Swift (via C)
    Using Eigen from Swift (via C)
    さ の
    た け と @ t a
    k e t o 1
    0
    2
    4
    ͞ͷ͚ͨͱ !UBLFUP


    J04%$+BQBO

    View Slide

  2. Using Eigen from Swift (via C)
    さ の
    た け と @ t a
    k e t o 1
    0
    2
    4

    J04%$.F

    さ の
    た け と @ t a
    k e t o 1
    0
    2
    4

    View Slide

  3. Using Eigen from Swift (via C)
    さ の
    た け と @ t a
    k e t o 1
    0
    2
    4

    &JHFO

    &JHFOJTBIJHIMFWFM$MJCSBSZPGUFNQMBUFIFBEFSTGPS
    MJOFBSBMHFCSB NBUSJYBOEWFDUPSPQFSBUJPOT
    'BTU
    -JHIUXFJHIU
    &YUFOTJCMF
    8FXBOUBXSBQQFSMJCSBSZGPS4XJGU

    View Slide

  4. Using Eigen from Swift (via C)
    さ の
    た け と @ t a
    k e t o 1
    0
    2
    4

    6TJOH&JHFOGSPN4XJGU

    ↟3FRVJSFNFOU4DBMBSUZQFTNVTUCFHFOFSJD
    let a = EigenIntMatrix( ... )


    let b = EigenDoubleMatrix( ... )


    let c = EigenRationalMatrix( ... )


    🙅
    let a = EigenMatrix( ... )


    let b = EigenMatrix( ... )


    let c = EigenMatrix( ... )


    🙆

    View Slide

  5. Using Eigen from Swift (via C)
    さ の
    た け と @ t a
    k e t o 1
    0
    2
    4

    )PX

    4XJGU $ $
    EigenMatrix
    EigenMatrix
    Eigen::Matrix
    Eigen::Matrix
    EigenMatrix Eigen::Matrix

    View Slide

  6. Using Eigen from Swift (via C)
    さ の
    た け と @ t a
    k e t o 1
    0
    2
    4


    4XJGU

    protocol Scalar {


    static func + (a: Self, b: Self) -> Self


    static func - (a: Self, b: Self) -> Self


    static func * (a: Self, b: Self) -> Self





    }
    4XJGU
    extension Int: Scalar {}


    extension Double: Scalar {}


    struct Rational: Scalar {





    }


    4XJGU

    View Slide

  7. Using Eigen from Swift (via C)
    さ の
    た け と @ t a
    k e t o 1
    0
    2
    4


    4XJGU

    typealias EigenMatrixPointer = UnsafeMutableRawPointer


    typealias EigenMatrixOperation =


    (EigenMatrixPointer,


    EigenMatrixPointer,


    EigenMatrixPointer) -> Void


    protocol EigenCompatibleScalar: Scalar {


    static var eigen_init: (Int, Int) -> EigenMatrixPointer { get }


    static var eigen_add: EigenMatrixOperation { get }


    static var eigen_minus: EigenMatrixOperation { get }


    static var eigen_mul: EigenMatrixOperation { get }





    }
    4XJGU

    View Slide

  8. Using Eigen from Swift (via C)
    さ の
    た け と @ t a
    k e t o 1
    0
    2
    4


    4XJGU

    struct EigenMatrix {


    private var ptr: EigenMatrixPointer


    init(size: MatrixSize) {


    let ptr = R.eigen_init(size.rows, size.cols)


    self.ptr = ptr


    }




    static func + (a: Self, b: Self) -> Self {


    let c = Self(size: a.size)


    R.eigen_add(a.ptr, b.ptr, c.ptr)


    return c


    }





    }
    4XJGU

    View Slide

  9. Using Eigen from Swift (via C)
    さ の
    た け と @ t a
    k e t o 1
    0
    2
    4


    4XJGU$

    extension Int: EigenCompatibleScalar {


    static var eigen_init = eigen_int_init


    static var eigen_add = eigen_int_add


    static var eigen_minus = eigen_int_minus


    static var eigen_mul = eigen_int_mul





    }
    4XJGU
    void *eigen_int_init(int rows, int cols);


    void eigen_int_add (void *a, void *b, void *c);


    void eigen_int_minus(void *a, void *b, void *c);


    void eigen_int_mul (void *a, void *b, void *c);
    $
    EigenMatrixPointer
    EigenMatrixOperation

    View Slide

  10. Using Eigen from Swift (via C)
    さ の
    た け と @ t a
    k e t o 1
    0
    2
    4


    4XJGU$

    extension Double: EigenCompatibleScalar {


    static var eigen_init = eigen_dbl_init


    static var eigen_add = eigen_dbl_add


    static var eigen_minus = eigen_dbl_minus


    static var eigen_mul = eigen_dbl_mul





    }
    4XJGU
    void *eigen_dbl_init(int rows, int cols);


    void eigen_dbl_add (void *a, void *b, void *c);


    void eigen_dbl_minus(void *a, void *b, void *c);


    void eigen_dbl_mul (void *a, void *b, void *c);
    $

    View Slide

  11. Using Eigen from Swift (via C)
    さ の
    た け と @ t a
    k e t o 1
    0
    2
    4


    $$

    #import


    using IntMatrix = Eigen::Matrix;


    void *eigen_int_init(int_t rows, int_t cols) {


    IntMatrix *A = new IntMatrix(rows, cols);


    A->setZero();


    return static_cast(A);


    }



    void eigen_int_add(void *a, void *b, void *c) {


    IntMatrix *A = static_cast(a);


    IntMatrix *B = static_cast(b);


    IntMatrix *C = static_cast(c);


    *C = *A + *B;


    }


    $

    View Slide

  12. Using Eigen from Swift (via C)
    さ の
    た け と @ t a
    k e t o 1
    0
    2
    4


    $$

    #import


    using DoubleMatrix = Eigen::Matrix;


    void *eigen_dbl_init(int_t rows, int_t cols) {


    DoubleMatrix *A = new DoubleMatrix(rows, cols);


    A->setZero();


    return static_cast(A);


    }



    void eigen_dbl_add(void *a, void *b, void *c) {


    DoubleMatrix *A = static_cast(a);


    DoubleMatrix *B = static_cast(b);


    DoubleMatrix *C = static_cast(c);


    *C = *A + *B;


    }


    $

    View Slide

  13. Using Eigen from Swift (via C)
    さ の
    た け と @ t a
    k e t o 1
    0
    2
    4

    *UXPSLT

    let a: EigenMatrix2x2 = [1, 2, 3, 4]


    let b: EigenMatrix2x2 = [5, 6, 7, 8]


    print(a + b)
    4XJGU
    [6, 8; 10, 12]
    DPOTPMF
    IUUQTHJUIVCDPNUBLFUPTXNFJHFO

    View Slide

  14. Using Eigen from Swift (via C)
    さ の
    た け と @ t a
    k e t o 1
    0
    2
    4

    5IBOLZPV

    View Slide