While you are working on this, let me also extend an invitation to
submit to my PerlGSL namespace. Of course you do not have to by any
means, but I have been working on making a set of Perl-ish bindings to
GSL and haven't gotten to the random numbers yet.

If you are interested, please read more at http://p3rl.org/PerlGSL

Thanks,
Joel

On Thu, Jun 7, 2012 at 3:31 PM, Tom Nishimura <[email protected]> wrote:
> Dear Piddlers,
>
> I'm in the process of binding the GSL random distribution functions
> (since currently only the samplers are implemented, in PDL::GSL::RNG,
> not the pdf/cdf functions).
>
> I'm trying to bind a function whose prototype has a mix of types, like
> so:
>
>  double gsl_ran_poisson_pdf (unsigned int k, double mu)
>
> I want to bind it so that it is threadable on both parameters, like:
>
>  PDL::gsl_ran_poisson_pdf(long(20),           10.5);
>  PDL::gsl_ran_poisson_pdf(long(10),           pdl(8,9,10,11,12));
>  PDL::gsl_ran_poisson_pdf(long(8,9,10,11,12), pdl(8,9,10,11,12));
>
> My first attempt is the obvious:
>
>  pp_def('gsl_ran_poisson_pdf',
>     Pars => 'int numdraws(); double lambda(); double [o] out()',
>     Code => q{
>         $out() = gsl_ran_poisson_pdf( $numdraws(), $lambda() );
>     },
>  );
>
> This works, but then I started wondering how cognizant people will be
> about passing an integer type as the first parameter,  since in Perl
> most people don't worry about types too much.  I'd prefer automatically
> rounding floating point values correctly, so the following three lines
> produce the same value.  The above will truncate 9.9 to 9.  (I'm not
> sure if 10.0 is guaranteed to cast down to the 'properly' to 10,
> or could it possibly to be cast to 9?)
>
>  PDL::gsl_ran_poisson_pdf(double(9.9),  pdl(8,9,10,11,12));
>  PDL::gsl_ran_poisson_pdf(double(10.0), pdl(8,9,10,11,12));
>  PDL::gsl_ran_poisson_pdf(double(10.1), pdl(8,9,10,11,12));
>
> Maybe I should drop the type spec from numdraws() in Pars and use the
> type of the loop to decide whether or not to round?:
>
>  pp_def('gsl_ran_poisson_pdf2',
>     Pars => 'numdraws(); double lambda(); double [o] out()',
>     Code => q{
>         /* the generic loop type is the type of numdraws, right? */
>         types(BSUL) %{
>             $out() = gsl_ran_poisson_pdf( $numdraws(), $lambda() );
>         %}
>         types(FD) %{
>             $out() = gsl_ran_poisson_pdf(
>                 /* need to round numdraws to nearest int */
>                 ($numdraws() > 0.0) ?
>                   floor($numdraws() + 0.5) :
>                   ceil($numdraws() - 0.5),
>                 $lambda()
>             );
>         %}
>     },
>  );
>
> This achieves automatic rounding but seems hackish.  Any advice? Should
> I just go with the first version and leave it to the user to be aware of
> the types?  Or is there a smarter way of properly rounding floating
> points down to integers?  Maybe keep the first one, but write a wrapper
> in Perl?
>
> Also, side question: how come there is no 'unsigned int' type in PDL?
> ushort is the only unsigned int type.
>
> thanks,
> Tom
>
> _______________________________________________
> Perldl mailing list
> [email protected]
> http://mailman.jach.hawaii.edu/mailman/listinfo/perldl

_______________________________________________
Perldl mailing list
[email protected]
http://mailman.jach.hawaii.edu/mailman/listinfo/perldl

Reply via email to