Skip to content

Commit

Permalink
upgrade pyo3
Browse files Browse the repository at this point in the history
  • Loading branch information
kaizhang committed May 1, 2024
1 parent f2e2c5f commit 4438770
Show file tree
Hide file tree
Showing 13 changed files with 220 additions and 225 deletions.
10 changes: 5 additions & 5 deletions anndata/Cargo.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[package]
name = "anndata"
version = "0.3.2"
version = "0.3.3"
edition = "2021"
rust-version = "1.70"
authors = ["Kai Zhang <kai@kzhang.org>"]
Expand All @@ -14,16 +14,16 @@ homepage = "https://github.com/kaizhang/anndata-rs"
anyhow = "1.0"
flate2 = "1.0"
log = "0.4"
indexmap = { version = "2.0", features = ["rayon"] }
indexmap = { version = "2.2", features = ["rayon"] }
itertools = "0.12"
ndarray = { version = "0.15" }
nalgebra-sparse = "0.9"
num = "0.4"
polars = { version = "0.37", features = ["lazy", "decompress-fast", "ndarray", "dtype-full"] }
polars = { version = "0.39", features = ["lazy", "decompress-fast", "ndarray", "dtype-full"] }
parking_lot = "0.12"
replace_with = "0.1"
smallvec = "1.11"
rayon = "1.8"
smallvec = "1.13"
rayon = "1.10"
permutation = "0.4"

[dev-dependencies]
Expand Down
18 changes: 9 additions & 9 deletions pyanndata/Cargo.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[package]
name = "pyanndata"
version = "0.3.2"
version = "0.3.3"
edition = "2021"
rust-version = "1.70"
authors = ["Kai Zhang <kai@kzhang.org>"]
Expand All @@ -12,27 +12,27 @@ homepage = "https://github.com/kaizhang/anndata-rs"
keywords = ["data"]

[dependencies]
anndata = "0.3.2"
anndata = "0.3.3"
anndata-hdf5 = "0.2"
anyhow = "1.0"
downcast-rs = "1.2"
numpy = "0.20.0"
numpy = "0.21.0"
ndarray = "0.15"
nalgebra-sparse = "0.9"
hdf5 = "0.8"
polars = { version = "0.37", features = ["ndarray"] }
polars-core = "0.37"
polars-arrow = "0.37"
pyo3-polars = "0.11.3"
polars = { version = "0.39", features = ["ndarray"] }
polars-core = "0.39"
polars-arrow = "0.39"
pyo3-polars = "0.13"
thiserror = "1.0"
rand = "0.8"
flate2 = "1.0"
paste = "1.0"
parking_lot = "0.12"
rayon = "1.8"
rayon = "1.10"

[dependencies.pyo3]
version = "0.20.2"
version = "0.21.2"
features = ["extension-module", "multiple-pymethods", "anyhow"]

[lib]
Expand Down
2 changes: 1 addition & 1 deletion pyanndata/src/anndata.rs
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ use anyhow::Result;
pub fn read<'py>(py: Python<'py>, filename: PathBuf, backed: Option<&str>, backend: Option<&str>) -> Result<PyObject> {
let adata = match backed {
Some(m) => AnnData::new_from(filename, m, backend).unwrap().into_py(py),
None => PyModule::import(py, "anndata")?
None => PyModule::import_bound(py, "anndata")?
.getattr("read_h5ad")?
.call1((filename,))?
.to_object(py),
Expand Down
78 changes: 38 additions & 40 deletions pyanndata/src/anndata/backed.rs
Original file line number Diff line number Diff line change
Expand Up @@ -91,7 +91,7 @@ impl AnnData {
}
}

fn select_obs(&self, ix: &PyAny) -> PyResult<SelectInfoElem> {
fn select_obs(&self, ix: &Bound<'_, PyAny>) -> PyResult<SelectInfoElem> {
let from_iter = ix.iter().and_then(|iter|
iter.map(|x| x.unwrap().extract::<String>()).collect::<PyResult<Vec<_>>>()
).map(|names| {
Expand All @@ -109,7 +109,7 @@ impl AnnData {
}
}

fn select_var(&self, ix: &PyAny) -> PyResult<SelectInfoElem> {
fn select_var(&self, ix: &Bound<'_, PyAny>) -> PyResult<SelectInfoElem> {
let from_iter = ix.iter().and_then(|iter|
iter.map(|x| x.unwrap().extract::<String>()).collect::<PyResult<Vec<_>>>()
).map(|names| {
Expand Down Expand Up @@ -145,8 +145,8 @@ impl AnnData {
pub fn new(
filename: PathBuf,
X: Option<PyArrayData>,
obs: Option<&PyAny>,
var: Option<&PyAny>,
obs: Option<Bound<'_, PyAny>>,
var: Option<Bound<'_, PyAny>>,
obsm: Option<HashMap<String, PyArrayData>>,
varm: Option<HashMap<String, PyArrayData>>,
uns: Option<HashMap<String, PyData>>,
Expand Down Expand Up @@ -218,12 +218,12 @@ impl AnnData {
self.0.obs_names().into_vec()
}
#[setter(obs_names)]
pub fn set_obs_names(&self, names: &PyAny) -> Result<()> {
pub fn set_obs_names(&self, names: Bound<'_, PyAny>) -> Result<()> {
self.0.set_obs_names(names)
}

#[pyo3(text_signature = "($self, names)")]
fn obs_ix(&self, names: &PyAny) -> Result<Vec<usize>> { self.0.obs_ix(names) }
fn obs_ix(&self, names: Bound<'_, PyAny>) -> Result<Vec<usize>> { self.0.obs_ix(names) }

/// Names of variables.
///
Expand All @@ -235,12 +235,12 @@ impl AnnData {
self.0.var_names().into_vec()
}
#[setter(var_names)]
pub fn set_var_names(&self, names: &PyAny) -> Result<()> {
pub fn set_var_names(&self, names: Bound<'_, PyAny>) -> Result<()> {
self.0.set_var_names(names)
}

#[pyo3(text_signature = "($self, names)")]
fn var_ix(&self, names: &PyAny) -> Result<Vec<usize>> { self.0.var_ix(names) }
fn var_ix(&self, names: Bound<'_, PyAny>) -> Result<Vec<usize>> { self.0.var_ix(names) }

/// Data matrix of shape n_obs × n_vars.
///
Expand All @@ -266,7 +266,7 @@ impl AnnData {
self.0.get_obs()
}
#[setter(obs)]
fn set_obs(&self, obs: Option<&PyAny>) -> Result<()> {
fn set_obs(&self, obs: Option<Bound<'_, PyAny>>) -> Result<()> {
self.0.set_obs(obs)
}

Expand All @@ -280,7 +280,7 @@ impl AnnData {
self.0.get_var()
}
#[setter(var)]
fn set_var(&self, var: Option<&PyAny>) -> Result<()> {
fn set_var(&self, var: Option<Bound<'_, PyAny>>) -> Result<()> {
self.0.set_var(var)
}

Expand Down Expand Up @@ -370,8 +370,8 @@ impl AnnData {
pub fn subset(
&self,
py: Python<'_>,
obs_indices: Option<&PyAny>,
var_indices: Option<&PyAny>,
obs_indices: Option<&Bound<'_, PyAny>>,
var_indices: Option<&Bound<'_, PyAny>>,
out: Option<PathBuf>,
inplace: bool,
backend: Option<&str>,
Expand Down Expand Up @@ -504,11 +504,11 @@ impl AnnData {
trait AnnDataTrait: Send + Downcast {
fn shape(&self) -> (usize, usize);
fn obs_names(&self) -> DataFrameIndex;
fn set_obs_names(&self, names: &PyAny) -> Result<()>;
fn obs_ix(&self, index: &PyAny) -> Result<Vec<usize>>;
fn set_obs_names(&self, names: Bound<'_, PyAny>) -> Result<()>;
fn obs_ix(&self, index: Bound<'_, PyAny>) -> Result<Vec<usize>>;
fn var_names(&self) -> DataFrameIndex;
fn set_var_names(&self, names: &PyAny) -> Result<()>;
fn var_ix(&self, index: &PyAny) -> Result<Vec<usize>>;
fn set_var_names(&self, names: Bound<'_, PyAny>) -> Result<()>;
fn var_ix(&self, index: Bound<'_, PyAny>) -> Result<Vec<usize>>;

fn get_x(&self) -> Option<PyArrayElem>;
fn get_obs(&self) -> Option<PyDataFrameElem>;
Expand All @@ -521,8 +521,8 @@ trait AnnDataTrait: Send + Downcast {
fn get_layers(&self) -> Option<PyAxisArrays>;

fn set_x(&self, data: Option<PyArrayData>) -> Result<()>;
fn set_obs(&self, obs: Option<&PyAny>) -> Result<()>;
fn set_var(&self, var: Option<&PyAny>) -> Result<()>;
fn set_obs(&self, obs: Option<Bound<'_, PyAny>>) -> Result<()>;
fn set_var(&self, var: Option<Bound<'_, PyAny>>) -> Result<()>;
fn set_uns(&self, uns: Option<HashMap<String, PyData>>) -> Result<()>;
fn set_obsm(&self, obsm: Option<HashMap<String, PyArrayData>>) -> Result<()>;
fn set_obsp(&self, obsp: Option<HashMap<String, PyArrayData>>) -> Result<()>;
Expand Down Expand Up @@ -582,13 +582,12 @@ impl<B: Backend> AnnDataTrait for InnerAnnData<B> {
self.adata.inner().obs_names()
}

fn obs_ix(&self, index: &PyAny) -> Result<Vec<usize>> {
self.adata.inner().obs_ix(
index.iter()?.map(|x| x.unwrap().extract::<&str>().unwrap())
)
fn obs_ix(&self, index: Bound<'_, PyAny>) -> Result<Vec<usize>> {
let bounds: Vec<_> = index.iter()?.map(|x| x.unwrap()).collect();
self.adata.inner().obs_ix(bounds.iter().map(|x| x.extract::<&str>().unwrap()))
}

fn set_obs_names(&self, names: &PyAny) -> Result<()> {
fn set_obs_names(&self, names: Bound<'_, PyAny>) -> Result<()> {
let obs_names: Result<DataFrameIndex> =
names.iter()?.map(|x| Ok(x?.extract::<String>()?)).collect();
self.adata.inner().set_obs_names(obs_names?)
Expand All @@ -598,13 +597,12 @@ impl<B: Backend> AnnDataTrait for InnerAnnData<B> {
self.adata.inner().var_names()
}

fn var_ix(&self, index: &PyAny) -> Result<Vec<usize>> {
self.adata.inner().var_ix(
index.iter()?.map(|x| x.unwrap().extract::<&str>().unwrap())
)
fn var_ix(&self, index: Bound<'_, PyAny>) -> Result<Vec<usize>> {
let bounds: Vec<_> = index.iter()?.map(|x| x.unwrap()).collect();
self.adata.inner().var_ix(bounds.iter().map(|x| x.extract::<&str>().unwrap()))
}

fn set_var_names(&self, names: &PyAny) -> Result<()> {
fn set_var_names(&self, names: Bound<'_, PyAny>) -> Result<()> {
let var_names: Result<DataFrameIndex> =
names.iter()?.map(|x| Ok(x?.extract::<String>()?)).collect();
self.adata.inner().set_var_names(var_names?)
Expand Down Expand Up @@ -702,34 +700,34 @@ impl<B: Backend> AnnDataTrait for InnerAnnData<B> {
}
Ok(())
}
fn set_obs(&self, obs: Option<&PyAny>) -> Result<()> {
fn set_obs(&self, obs: Option<Bound<'_, PyAny>>) -> Result<()> {
let inner = self.adata.inner();
if let Some(x) = obs {
let py = x.py();
let ob = if isinstance_of_pandas(py, x)? {
py.import("polars")?.call_method1("from_pandas", (x, ))
let ob = if isinstance_of_pandas(&x)? {
py.import_bound("polars")?.call_method1("from_pandas", (x, ))?
} else if x.is_instance_of::<pyo3::types::PyDict>() {
py.import("polars")?.call_method1("from_dict", (x, ))
py.import_bound("polars")?.call_method1("from_dict", (x, ))?
} else {
Ok(x)
}?;
x
};
inner.set_obs(ob.extract::<PyDataFrame>()?.0)?;
} else {
inner.del_obs()?;
}
Ok(())
}
fn set_var(&self, var: Option<&PyAny>) -> Result<()> {
fn set_var(&self, var: Option<Bound<'_, PyAny>>) -> Result<()> {
let inner = self.adata.inner();
if let Some(x) = var {
let py = x.py();
let ob = if isinstance_of_pandas(py, x)? {
py.import("polars")?.call_method1("from_pandas", (x, ))
let ob = if isinstance_of_pandas(&x)? {
py.import_bound("polars")?.call_method1("from_pandas", (x, ))?
} else if x.is_instance_of::<pyo3::types::PyDict>() {
py.import("polars")?.call_method1("from_dict", (x, ))
py.import_bound("polars")?.call_method1("from_dict", (x, ))?
} else {
Ok(x)
}?;
x
};
inner.set_var(ob.extract::<PyDataFrame>()?.0)?;
} else {
inner.del_var()?;
Expand Down
Loading

0 comments on commit 4438770

Please sign in to comment.