1
- //! Safe interface for NumPy's random [`BitGenerator`][]
2
- //!
3
- //! `BitGenerator`: https://numpy.org/doc/stable//reference/random/bit_generators/generated/numpy.random.BitGenerator.html
1
+ //! Safe interface for NumPy's random [`BitGenerator`]
4
2
5
3
use pyo3:: { ffi, prelude:: * , sync:: GILOnceCell , types:: PyType , PyTypeInfo } ;
6
4
7
5
use crate :: npyffi:: get_bitgen_api;
8
6
9
- ///! Wrapper for NumPy's random [`BitGenerator`][]
10
- ///
11
- ///! [BitGenerator ]: https://numpy.org/doc/stable/reference/random/bit_generators/generated/numpy.random.BitGenerator.html
7
+ ///! Wrapper for NumPy's random [`BitGenerator`][bg ]
8
+ ///!
9
+ ///! [bg ]: https://numpy.org/doc/stable/ /reference/random/bit_generators/generated/numpy.random.BitGenerator.html
12
10
#[ repr( transparent) ]
13
11
pub struct BitGenerator ( PyAny ) ;
14
12
@@ -33,3 +31,50 @@ unsafe impl PyTypeInfo for BitGenerator {
33
31
}
34
32
}
35
33
34
+ /// Methods for [`BitGenerator`]
35
+ pub trait BitGeneratorMethods {
36
+ /// Returns the next random unsigned 64 bit integer
37
+ fn next_uint64 ( & self ) -> u64 ;
38
+ /// Returns the next random unsigned 32 bit integer
39
+ fn next_uint32 ( & self ) -> u32 ;
40
+ /// Returns the next random double
41
+ fn next_double ( & self ) -> libc:: c_double ;
42
+ /// Returns the next raw value (can be used for testing)
43
+ fn next_raw ( & self ) -> u64 ;
44
+ }
45
+
46
+ // TODO: cache npy_bitgen pointer
47
+ impl < ' py > BitGeneratorMethods for Bound < ' py , BitGenerator > {
48
+ fn next_uint64 ( & self ) -> u64 {
49
+ todo ! ( )
50
+ }
51
+ fn next_uint32 ( & self ) -> u32 {
52
+ todo ! ( )
53
+ }
54
+ fn next_double ( & self ) -> libc:: c_double {
55
+ todo ! ( )
56
+ }
57
+ fn next_raw ( & self ) -> u64 {
58
+ let mut api = get_bitgen_api ( self . as_any ( ) ) . expect ( "Could not get bitgen" ) ;
59
+ unsafe {
60
+ let api = api. as_mut ( ) ;
61
+ ( api. next_raw ) ( api. state )
62
+ }
63
+ }
64
+ }
65
+
66
+ #[ cfg( test) ]
67
+ mod tests {
68
+ use super :: * ;
69
+
70
+ #[ test]
71
+ fn test_bitgen ( ) -> PyResult < ( ) > {
72
+ Python :: with_gil ( |py| {
73
+ let default_rng = py. import ( "numpy.random" ) ?. getattr ( "default_rng" ) ?;
74
+ let bitgen = default_rng. call0 ( ) ?. getattr ( "bit_generator" ) ?. downcast_into :: < BitGenerator > ( ) ?;
75
+ let res = bitgen. next_raw ( ) ;
76
+ dbg ! ( res) ;
77
+ Ok ( ( ) )
78
+ } )
79
+ }
80
+ }
0 commit comments