44//! you can generate random numbers without holding the GIL,
55//! by [acquiring][`PyBitGeneratorMethods::lock`] a lock [guard][`PyBitGeneratorGuard`] for the [`PyBitGenerator`]:
66//!
7- //! ```rust
7+ //! ```
88//! use pyo3::prelude::*;
99//! use numpy::random::{PyBitGenerator, PyBitGeneratorMethods as _};
1010//!
11- //! let mut bitgen = Python::with_gil(|py| -> PyResult<_ > {
11+ //! fn default_bit_gen<'py>(py: Python<'py>) -> PyResult<Bound<'py, PyBitGenerator> > {
1212//! let default_rng = py.import("numpy.random")?.call_method0("default_rng")?;
13- //! let bit_generator = default_rng.getattr("bit_generator")?.downcast_into::<PyBitGenerator>()?;
14- //! bit_generator.lock()
13+ //! let bit_generator = default_rng.getattr("bit_generator")?.downcast_into()?;
14+ //! Ok(bit_generator)
15+ //! }
16+ //!
17+ //! let random_number = Python::with_gil(|py| -> PyResult<_> {
18+ //! let mut bitgen = default_bit_gen(py)?.lock()?;
19+ //! Ok(bitgen.next_uint64())
1520//! })?;
16- //! let random_number = bitgen.next_u64();
21+ //! # Ok::<(), PyErr>(())
1722//! ```
1823//!
1924//! With the [`rand`] crate installed, you can also use the [`rand::Rng`] APIs from the [`PyBitGeneratorGuard`]:
2025//!
21- //! ```rust
26+ //! ```
27+ //! use pyo3::prelude::*;
2228//! use rand::Rng as _;
29+ //! use numpy::random::{PyBitGenerator, PyBitGeneratorMethods as _};
30+ //! # // TODO: reuse function definition from above?
31+ //! # fn default_bit_gen<'py>(py: Python<'py>) -> PyResult<Bound<'py, PyBitGenerator>> {
32+ //! # let default_rng = py.import("numpy.random")?.call_method0("default_rng")?;
33+ //! # let bit_generator = default_rng.getattr("bit_generator")?.downcast_into()?;
34+ //! # Ok(bit_generator)
35+ //! # }
2336//!
24- //! if bitgen.random_ratio(1, 1_000_000) {
25- //! println!("a sure thing");
26- //! }
37+ //! Python::with_gil(|py| -> PyResult<_> {
38+ //! let mut bitgen = default_bit_gen(py)?.lock()?;
39+ //! if bitgen.random_ratio(1, 1_000_000) {
40+ //! println!("a sure thing");
41+ //! }
42+ //! Ok(())
43+ //! })?;
44+ //! # Ok::<(), PyErr>(())
2745//! ```
2846//!
2947//! [bg]: https://numpy.org/doc/stable//reference/random/bit_generators/generated/numpy.random.BitGenerator.html
@@ -99,7 +117,7 @@ impl<'py> PyBitGeneratorMethods<'py> for Bound<'py, PyBitGenerator> {
99117 } ;
100118 Ok ( PyBitGeneratorGuard {
101119 raw_bitgen : non_null,
102- capsule,
120+ _capsule : capsule,
103121 lock,
104122 } )
105123 }
@@ -115,7 +133,7 @@ impl<'py> TryFrom<&Bound<'py, PyBitGenerator>> for PyBitGeneratorGuard<'py> {
115133/// [`PyBitGenerator`] lock allowing to access its methods without holding the GIL.
116134pub struct PyBitGeneratorGuard < ' py > {
117135 raw_bitgen : NonNull < npy_bitgen > ,
118- capsule : Bound < ' py , PyCapsule > ,
136+ _capsule : Bound < ' py , PyCapsule > ,
119137 lock : Bound < ' py , PyAny > ,
120138}
121139
@@ -140,28 +158,28 @@ impl PyBitGeneratorGuard<'_> {
140158 /// Returns the next random unsigned 64 bit integer.
141159 pub fn next_uint64 ( & mut self ) -> u64 {
142160 unsafe {
143- let bitgen = self . raw_bitgen . as_mut ( ) ;
161+ let bitgen = * self . raw_bitgen . as_ptr ( ) ;
144162 ( bitgen. next_uint64 ) ( bitgen. state )
145163 }
146164 }
147165 /// Returns the next random unsigned 32 bit integer.
148166 pub fn next_uint32 ( & mut self ) -> u32 {
149167 unsafe {
150- let bitgen = self . raw_bitgen . as_mut ( ) ;
168+ let bitgen = * self . raw_bitgen . as_ptr ( ) ;
151169 ( bitgen. next_uint32 ) ( bitgen. state )
152170 }
153171 }
154172 /// Returns the next random double.
155173 pub fn next_double ( & mut self ) -> libc:: c_double {
156174 unsafe {
157- let bitgen = self . raw_bitgen . as_mut ( ) ;
175+ let bitgen = * self . raw_bitgen . as_ptr ( ) ;
158176 ( bitgen. next_double ) ( bitgen. state )
159177 }
160178 }
161179 /// Returns the next raw value (can be used for testing).
162180 pub fn next_raw ( & mut self ) -> u64 {
163181 unsafe {
164- let bitgen = self . raw_bitgen . as_mut ( ) ;
182+ let bitgen = * self . raw_bitgen . as_ptr ( ) ;
165183 ( bitgen. next_raw ) ( bitgen. state )
166184 }
167185 }
0 commit comments