LSSTApplications  20.0.0
LSSTDataManagementBasePackage
random.cc
Go to the documentation of this file.
1 /*
2  * LSST Data Management System
3  * Copyright 2008-2016 AURA/LSST.
4  *
5  * This product includes software developed by the
6  * LSST Project (http://www.lsst.org/).
7  *
8  * This program is free software: you can redistribute it and/or modify
9  * it under the terms of the GNU General Public License as published by
10  * the Free Software Foundation, either version 3 of the License, or
11  * (at your option) any later version.
12  *
13  * This program is distributed in the hope that it will be useful,
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16  * GNU General Public License for more details.
17  *
18  * You should have received a copy of the LSST License Statement and
19  * the GNU General Public License along with this program. If not,
20  * see <https://www.lsstcorp.org/LegalNotices/>.
21  */
22 
23 #include <pybind11/pybind11.h>
24 //#include <pybind11/operators.h>
25 #include <pybind11/stl.h>
26 
27 #include "lsst/afw/image/Image.h"
28 #include "lsst/afw/math/Random.h"
29 
30 namespace py = pybind11;
31 
32 using namespace lsst::afw::math;
33 using namespace pybind11::literals;
34 
35 template <typename ImageT>
37  mod.def("randomUniformImage", (void (*)(ImageT *, Random &))randomUniformImage<ImageT>);
38  mod.def("randomUniformPosImage", (void (*)(ImageT *, Random &))randomUniformPosImage<ImageT>);
39  mod.def("randomUniformIntImage",
40  (void (*)(ImageT *, Random &, unsigned long))randomUniformIntImage<ImageT>);
41  mod.def("randomFlatImage",
42  (void (*)(ImageT *, Random &, double const, double const))randomFlatImage<ImageT>);
43  mod.def("randomGaussianImage", (void (*)(ImageT *, Random &))randomGaussianImage<ImageT>);
44  mod.def("randomChisqImage", (void (*)(ImageT *, Random &, double const))randomChisqImage<ImageT>);
45  mod.def("randomPoissonImage", (void (*)(ImageT *, Random &, double const))randomPoissonImage<ImageT>);
46 }
47 
48 PYBIND11_MODULE(random, mod) {
49  py::class_<Random> clsRandom(mod, "Random");
50 
51  /* Member types and enums */
52  py::enum_<Random::Algorithm>(clsRandom, "Algorithm")
53  .value("MT19937", Random::Algorithm::MT19937)
54  .value("RANLXS0", Random::Algorithm::RANLXS0)
55  .value("RANLXS1", Random::Algorithm::RANLXS1)
56  .value("RANLXS2", Random::Algorithm::RANLXS2)
57  .value("RANLXD1", Random::Algorithm::RANLXD1)
58  .value("RANLXD2", Random::Algorithm::RANLXD2)
59  .value("RANLUX", Random::Algorithm::RANLUX)
60  .value("RANLUX389", Random::Algorithm::RANLUX389)
61  .value("CMRG", Random::Algorithm::CMRG)
62  .value("MRG", Random::Algorithm::MRG)
63  .value("TAUS", Random::Algorithm::TAUS)
64  .value("TAUS2", Random::Algorithm::TAUS2)
65  .value("GFSR4", Random::Algorithm::GFSR4)
66  .value("NUM_ALGORITHMS", Random::Algorithm::NUM_ALGORITHMS)
67  .export_values();
68 
69  /* Constructors */
70  clsRandom.def(py::init<Random::Algorithm, unsigned long>(), "algorithm"_a = Random::Algorithm::MT19937,
71  "seed"_a = 1);
72  clsRandom.def(py::init<std::string const &, unsigned long>(), "algorithm"_a, "seed"_a = 1);
73 
74  /* Members */
75  clsRandom.def("deepCopy", &Random::deepCopy);
76  clsRandom.def("getAlgorithm", &Random::getAlgorithm);
77  clsRandom.def("getAlgorithmName", &Random::getAlgorithmName);
78  clsRandom.def_static("getAlgorithmNames", &Random::getAlgorithmNames);
79  clsRandom.def("getSeed", &Random::getSeed);
80  clsRandom.def("uniform", &Random::uniform);
81  clsRandom.def("uniformPos", &Random::uniformPos);
82  clsRandom.def("uniformInt", &Random::uniformInt);
83  clsRandom.def("flat", &Random::flat);
84  clsRandom.def("gaussian", &Random::gaussian);
85  clsRandom.def("chisq", &Random::chisq);
86  clsRandom.def("poisson", &Random::poisson);
87 
88  // getState and setState are special, their std::string cannot
89  // be converted to a Python string (needs to go to bytes instead)
90  // thus use the same solution as employed with Swig
91  clsRandom.def("getState", [](Random &self) -> py::object {
92  std::string state = self.getState();
93  return py::reinterpret_steal<py::object>(PyBytes_FromStringAndSize(state.data(), state.size()));
94  });
95  clsRandom.def("setState", [](Random &self, py::bytes const &state) { self.setState(state); });
96 
97  /* Module level */
98  declareRandomImage<lsst::afw::image::Image<double>>(mod);
99  declareRandomImage<lsst::afw::image::Image<float>>(mod);
100 }
lsst::afw::math::Random::flat
double flat(double const a, double const b)
Returns a random variate from the flat (uniform) distribution on [a, b).
Definition: Random.cc:159
std::string
STL class.
lsst::afw::math::Random::uniformPos
double uniformPos()
Returns a uniformly distributed random double precision floating point number from the generator.
Definition: Random.cc:148
lsst::afw::math::Random::getAlgorithmName
std::string getAlgorithmName() const
Definition: Random.cc:130
std::string::size
T size(T... args)
lsst::afw::math::PYBIND11_MODULE
PYBIND11_MODULE(approximate, mod)
Definition: approximate.cc:56
declareRandomImage
void declareRandomImage(py::module &mod)
Definition: random.cc:36
Image.h
lsst::afw::math::Random::uniform
double uniform()
Returns a uniformly distributed random double precision floating point number from the generator.
Definition: Random.cc:146
lsst::afw::math::Random::getSeed
unsigned long getSeed() const
Definition: Random.cc:142
lsst::afw::math::Random::uniformInt
unsigned long uniformInt(unsigned long n)
Returns a uniformly distributed random integer from 0 to n-1.
Definition: Random.cc:150
lsst::afw::math::Random::getAlgorithm
Algorithm getAlgorithm() const
Definition: Random.cc:128
lsst::afw::math::Random::getAlgorithmNames
static std::vector< std::string > const & getAlgorithmNames()
Definition: Random.cc:132
lsst::afw::math::Random::chisq
double chisq(double const nu)
Returns a random variate from the chi-squared distribution with nu degrees of freedom.
Definition: Random.cc:163
bytes
table::Key< table::Array< std::uint8_t > > bytes
Definition: Transform.cc:199
lsst::afw::math::Random
A class that can be used to generate sequences of random numbers according to a number of different a...
Definition: Random.h:57
lsst::afw::math::Random::gaussian
double gaussian()
Returns a gaussian random variate with mean 0 and standard deviation 1
Definition: Random.cc:161
lsst::afw::math
Definition: statistics.dox:6
pybind11
Definition: _GenericMap.cc:40
Random.h
lsst::afw::math::Random::deepCopy
Random deepCopy() const
Creates a deep copy of this random number generator.
Definition: Random.cc:100
lsst::afw::math::Random::poisson
double poisson(double const mu)
Returns a random variate from the poisson distribution with mean mu.
Definition: Random.cc:165
lsst::meas::modelfit.psf.psfContinued.module
module
Definition: psfContinued.py:42
std::string::data
T data(T... args)