Skip to content

Commit 1bbf535

Browse files
authored
Add ndarray-linalg example (#88)
* Add linalg example * Shorten discription for flake8 * Add gfortran to travis deps * Use travis_wait
1 parent 98f1370 commit 1bbf535

File tree

8 files changed

+94
-1
lines changed

8 files changed

+94
-1
lines changed

.travis.yml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ addons:
3434
- gcc
3535
- binutils-dev
3636
- libiberty-dev
37+
- gfortran
3738

3839
before_install:
3940
- source ./ci/travis/setup.sh
@@ -44,7 +45,7 @@ install:
4445

4546
script:
4647
- flake8 examples/
47-
- ./ci/travis/test.sh
48+
- travis_wait ./ci/travis/test.sh
4849

4950
deploy:
5051
- provider: script

examples/linalg/Cargo.toml

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
[package]
2+
name = "numpy-linalg-example"
3+
version = "0.1.0"
4+
authors = ["kngwyu <[email protected]>"]
5+
edition = "2018"
6+
7+
[lib]
8+
name = "rust_linalg"
9+
crate-type = ["cdylib"]
10+
11+
[dependencies]
12+
numpy = { path = "../.." }
13+
ndarray = "0.12"
14+
ndarray-linalg = { version = "0.10", features = ["openblas"] }
15+
16+
[dependencies.pyo3]
17+
version = "0.5.2"
18+
features = ["extension-module"]

examples/linalg/requirements-dev.txt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
numpy>=1.15.0
2+
pytest>=3.5.0
3+
setuptools-rust>=0.10.2
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
from .rust_linalg import * # noqa

examples/linalg/setup.py

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
import sys
2+
from setuptools import find_packages, setup
3+
from setuptools_rust import RustExtension
4+
5+
6+
PYTHON_MAJOR_VERSION = sys.version_info[0]
7+
8+
setup_requires = ['setuptools-rust>=0.6.0']
9+
install_requires = ['numpy']
10+
test_requires = install_requires + ['pytest']
11+
12+
setup(
13+
name='rust_linalg',
14+
version='0.1.0',
15+
description='Example of python extension with ndarray-linalg',
16+
rust_extensions=[RustExtension(
17+
'rust_linalg.rust_linalg',
18+
'./Cargo.toml',
19+
rustc_flags=['--cfg=Py_{}'.format(PYTHON_MAJOR_VERSION)],
20+
features=['numpy/python{}'.format(PYTHON_MAJOR_VERSION)],
21+
)],
22+
install_requires=install_requires,
23+
setup_requires=setup_requires,
24+
test_requires=test_requires,
25+
packages=find_packages(),
26+
zip_safe=False,
27+
)

examples/linalg/src/lib.rs

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
use ndarray_linalg::solve::Inverse;
2+
use numpy::{IntoPyArray, PyArray2};
3+
use pyo3::exceptions::RuntimeError;
4+
use pyo3::prelude::{pymodinit, Py, PyErr, PyModule, PyResult, Python};
5+
use std::fmt::Display;
6+
7+
fn make_error<E: Display + Sized>(e: E) -> PyErr {
8+
PyErr::new::<RuntimeError, _>(format!("[rust_linalg] {}", e))
9+
}
10+
11+
#[pymodinit]
12+
fn rust_linalg(_py: Python, m: &PyModule) -> PyResult<()> {
13+
#[pyfn(m, "inv")]
14+
fn inv(py: Python, x: &PyArray2<f64>) -> PyResult<Py<PyArray2<f64>>> {
15+
let x = x.as_array().inv().map_err(make_error)?;
16+
Ok(x.into_pyarray(py).to_owned())
17+
}
18+
Ok(())
19+
}

examples/linalg/tests/test_linalg.py

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
import numpy as np
2+
import rust_linalg
3+
4+
5+
def test_inv():
6+
x = np.array([
7+
[1, 0],
8+
[0, 2],
9+
], dtype=np.float64)
10+
y = rust_linalg.inv(x)
11+
np.testing.assert_array_almost_equal(y, np.linalg.inv(x))

examples/linalg/tox.ini

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
[tox]
2+
envlist = py27,
3+
py35,
4+
py36,
5+
py37,
6+
minversion = 2.9.0
7+
skip_missing_interpreters = true
8+
9+
[testenv]
10+
description = Run the unit tests under {basepython}
11+
deps = -rrequirements-dev.txt
12+
usedevelop = True
13+
commands = pytest

0 commit comments

Comments
 (0)