xref: /petsc/src/binding/petsc4py/src/petsc4py/PETSc/Random.pyx (revision 6d8694c4fbab79f9439f1ad13c0386ba7ee1ca4b)
1# --------------------------------------------------------------------
2
3class RandomType(object):
4    """The random number generator type."""
5    RAND      = S_(PETSCRAND)
6    RAND48    = S_(PETSCRAND48)
7    SPRNG     = S_(PETSCSPRNG)
8    RANDER48  = S_(PETSCRANDER48)
9    RANDOM123 = S_(PETSCRANDOM123)
10
11# --------------------------------------------------------------------
12
13
14cdef class Random(Object):
15    """The random number generator object.
16
17    See Also
18    --------
19    petsc.PetscRandom
20
21    """
22
23    Type = RandomType
24
25    def __cinit__(self) -> None:
26        self.obj = <PetscObject*> &self.rnd
27        self.rnd = NULL
28
29    def __call__(self) -> Scalar:
30        """Generate a scalar random number.
31
32        Not collective.
33
34        See Also
35        --------
36        petsc.PetscRandomGetValue
37
38        """
39        return self.getValue()
40
41    def view(self, Viewer viewer=None) -> None:
42        """View a random number generator object.
43
44        Collective.
45
46        Parameters
47        ----------
48        viewer
49            A `Viewer` instance or `None` for the default viewer.
50
51        See Also
52        --------
53        petsc.PetscRandomView
54
55        """
56        assert self.obj != NULL
57        cdef PetscViewer vwr = NULL
58        if viewer is not None: vwr = viewer.vwr
59        CHKERR(PetscRandomView(self.rnd, vwr))
60
61    def destroy(self) -> Self:
62        """Destroy the random number generator object.
63
64        Collective.
65
66        See Also
67        --------
68        petsc.PetscRandomDestroy
69
70        """
71        CHKERR(PetscRandomDestroy(&self.rnd))
72        return self
73
74    def create(self, comm: Comm | None = None) -> Self:
75        """Create a random number generator object.
76
77        Collective.
78
79        Parameters
80        ----------
81        comm
82            MPI communicator, defaults to `Sys.getDefaultComm`.
83
84        See Also
85        --------
86        Sys.getDefaultComm, petsc.PetscRandomCreate
87
88        """
89        cdef MPI_Comm ccomm = def_Comm(comm, PETSC_COMM_DEFAULT)
90        CHKERR(PetscRandomCreate(ccomm, &self.rnd))
91        return self
92
93    def setType(self, rnd_type: Random.Type | str) -> None:
94        """Set the type of the random number generator object.
95
96        Collective.
97
98        Parameters
99        ----------
100        rnd_type
101            The type of the generator.
102
103        See Also
104        --------
105        getType, petsc.PetscRandomSetType
106
107        """
108        cdef PetscRandomType cval = NULL
109        rnd_type = str2bytes(rnd_type, &cval)
110        CHKERR(PetscRandomSetType(self.rnd, cval))
111
112    def getType(self) -> str:
113        """Return the type of the random number generator object.
114
115        Not collective.
116
117        See Also
118        --------
119        setType, petsc.PetscRandomGetType
120
121        """
122        cdef PetscRandomType cval = NULL
123        CHKERR(PetscRandomGetType(self.rnd, &cval))
124        return bytes2str(cval)
125
126    def setFromOptions(self) -> None:
127        """Configure the random number generator from the options database.
128
129        Collective.
130
131        See Also
132        --------
133        petsc_options, petsc.PetscRandomSetFromOptions
134
135        """
136        CHKERR(PetscRandomSetFromOptions(self.rnd))
137
138    def getValue(self) -> Scalar:
139        """Generate a scalar random number.
140
141        Not collective.
142
143        See Also
144        --------
145        petsc.PetscRandomGetValue
146
147        """
148        cdef PetscScalar sval = 0
149        CHKERR(PetscRandomGetValue(self.rnd, &sval))
150        return toScalar(sval)
151
152    def getValueReal(self) -> float:
153        """Generate a real random number.
154
155        Not collective.
156
157        See Also
158        --------
159        petsc.PetscRandomGetValueReal
160
161        """
162        cdef PetscReal rval = 0
163        CHKERR(PetscRandomGetValueReal(self.rnd, &rval))
164        return toReal(rval)
165
166    def getSeed(self) -> int:
167        """Return the random number generator seed.
168
169        Not collective.
170
171        See Also
172        --------
173        setSeed, petsc.PetscRandomGetSeed
174
175        """
176        cdef PetscInt64 seed = 0
177        CHKERR(PetscRandomGetSeed(self.rnd, &seed))
178        return seed
179
180    def setSeed(self, seed: int | None = None) -> None:
181        """Set the seed of random number generator.
182
183        Not collective.
184
185        Parameters
186        ----------
187        seed
188            The value for the seed. If `None`, it only seeds the generator.
189
190        See Also
191        --------
192        getSeed, petsc.PetscRandomSetSeed, petsc.PetscRandomSeed
193
194        """
195        if seed is not None:
196            CHKERR(PetscRandomSetSeed(self.rnd, seed))
197        CHKERR(PetscRandomSeed(self.rnd))
198
199    def getInterval(self) -> tuple[Scalar, Scalar]:
200        """Return the interval containing the random numbers generated.
201
202        Not collective.
203
204        See Also
205        --------
206        setInterval, petsc.PetscRandomGetInterval
207
208        """
209        cdef PetscScalar sval1 = 0
210        cdef PetscScalar sval2 = 1
211        CHKERR(PetscRandomGetInterval(self.rnd, &sval1, &sval2))
212        return (toScalar(sval1), toScalar(sval2))
213
214    def setInterval(self, interval: tuple[Scalar, Scalar]) -> None:
215        """Set the interval of the random number generator.
216
217        Not collective.
218
219        See Also
220        --------
221        getInterval, petsc.PetscRandomSetInterval
222
223        """
224        cdef PetscScalar sval1 = 0
225        cdef PetscScalar sval2 = 1
226        low, high = interval
227        sval1 = asScalar(low)
228        sval2 = asScalar(high)
229        CHKERR(PetscRandomSetInterval(self.rnd, sval1, sval2))
230
231    #
232
233    property seed:
234        """The seed of the random number generator."""
235        def __get__(self) -> int:
236            return self.getSeed()
237
238        def __set__(self, value: int | None) -> None:
239            self.setSeed(value)
240
241    property interval:
242        """The interval of the generated random numbers."""
243        def __get__(self) -> tuple[Scalar, Scalar]:
244            return self.getInterval()
245
246        def __set__(self, value: tuple[Scalar, Scalar]):
247            self.setInterval(value)
248
249# --------------------------------------------------------------------
250
251del RandomType
252
253# --------------------------------------------------------------------
254