Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Vectorisation over distribution parameters #46

Open
mkcinu opened this issue Dec 8, 2022 · 3 comments
Open

Vectorisation over distribution parameters #46

mkcinu opened this issue Dec 8, 2022 · 3 comments
Labels
enhancement New feature or request

Comments

@mkcinu
Copy link

mkcinu commented Dec 8, 2022

Hi, fantastic work - it's making our code a lot faster! Having said that we got a bit stuck of generating an array/matrix of numbers from binomial distribution for different trials and probabilities. For example, in numpy you can run np.random.binomial(n, p) where n and p can either be a scalar (like in EigenRand) or arrays of the same dimensions. How difficult would it be to implement to implement a similar interface? Do you think it's possible to SIMD operations like this? Many thanks!

@bab2min bab2min added the enhancement New feature or request label Dec 15, 2022
@bab2min
Copy link
Owner

bab2min commented Dec 15, 2022

Hi @mkcinu,
Thanks for the nice suggestions.
But Eigen::Rand::binomial uses different calculation methods depending on n and p values actually. Thus the vectorization over distribution parameters is quite difficult to implement.
It seems hard to implement it in the near future, but I will leave it as a far future plan!
Thank you again for your suggestion.

@bab2min
Copy link
Owner

bab2min commented Feb 2, 2023

Since version 0.5.0, some distributions including Eigen::Rand::binomial support Vectorization over Parameters(VoP).
Please see the full list of distributions supporting VoP at here.

A simple usage is:

#include <iostream>
#include <Eigen/Dense>
#include <EigenRand/EigenRand>
 
using namespace Eigen;
 
int main()
{
  Rand::P8_mt19937_64 urng{ 42 };
 
  ArrayXf a{ 10 }, b{ 10 }, c{ 10 };
  a << 1, 2, 3, 4, 5, 6, 7, 8, 9, 10;
  b << 10, 12, 14, 16, 18, 20, 22, 24, 26, 28;
  
  // You can use two array parameters.
  // The shape of two parameters should be equal in this case.
  c = Rand::uniformReal(urng, a, b);
  std::cout << c << std::endl;
  
  // Or you can provide one parameter as a scalar
  // In this case, a scalar parameter is broadcast to the shape of the array parameter.
  c = Rand::uniformReal(urng, -5, b);
  std::cout << c << std::endl;
 
  c = Rand::uniformReal(urng, a, 11);
  std::cout << c << std::endl;
  return 0;
}

@mkcinu
Copy link
Author

mkcinu commented Feb 2, 2023

That's brilliant! Thanks so much, I'll give it a try soon!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
enhancement New feature or request
Projects
None yet
Development

No branches or pull requests

2 participants