|
Packit |
67cb25 |
/* Author: G. Jungman
|
|
Packit |
67cb25 |
*/
|
|
Packit |
67cb25 |
#include <config.h>
|
|
Packit |
67cb25 |
#include <stdlib.h>
|
|
Packit |
67cb25 |
#include <string.h>
|
|
Packit |
67cb25 |
#include <gsl/gsl_errno.h>
|
|
Packit |
67cb25 |
#include <gsl/gsl_qrng.h>
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
gsl_qrng *
|
|
Packit |
67cb25 |
gsl_qrng_alloc (const gsl_qrng_type * T, unsigned int dimension)
|
|
Packit |
67cb25 |
{
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
gsl_qrng * q = (gsl_qrng *) malloc (sizeof (gsl_qrng));
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
if (q == 0)
|
|
Packit |
67cb25 |
{
|
|
Packit |
67cb25 |
GSL_ERROR_VAL ("allocation failed for qrng struct",
|
|
Packit |
67cb25 |
GSL_ENOMEM, 0);
|
|
Packit |
67cb25 |
};
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
q->dimension = dimension;
|
|
Packit |
67cb25 |
q->state_size = T->state_size(dimension);
|
|
Packit |
67cb25 |
q->state = malloc (q->state_size);
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
if (q->state == 0)
|
|
Packit |
67cb25 |
{
|
|
Packit |
67cb25 |
free (q);
|
|
Packit |
67cb25 |
GSL_ERROR_VAL ("allocation failed for qrng state",
|
|
Packit |
67cb25 |
GSL_ENOMEM, 0);
|
|
Packit |
67cb25 |
};
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
q->type = T;
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
T->init_state(q->state, q->dimension);
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
return q;
|
|
Packit |
67cb25 |
}
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
void
|
|
Packit |
67cb25 |
gsl_qrng_init (gsl_qrng * q)
|
|
Packit |
67cb25 |
{
|
|
Packit |
67cb25 |
(q->type->init_state) (q->state, q->dimension);
|
|
Packit |
67cb25 |
}
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
int
|
|
Packit |
67cb25 |
gsl_qrng_memcpy (gsl_qrng * dest, const gsl_qrng * src)
|
|
Packit |
67cb25 |
{
|
|
Packit |
67cb25 |
if (dest->type != src->type)
|
|
Packit |
67cb25 |
{
|
|
Packit |
67cb25 |
GSL_ERROR ("generators must be of the same type", GSL_EINVAL);
|
|
Packit |
67cb25 |
}
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
dest->dimension = src->dimension;
|
|
Packit |
67cb25 |
dest->state_size = src->state_size;
|
|
Packit |
67cb25 |
memcpy (dest->state, src->state, src->state_size);
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
return GSL_SUCCESS;
|
|
Packit |
67cb25 |
}
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
gsl_qrng *
|
|
Packit |
67cb25 |
gsl_qrng_clone (const gsl_qrng * q)
|
|
Packit |
67cb25 |
{
|
|
Packit |
67cb25 |
gsl_qrng * r = (gsl_qrng *) malloc (sizeof (gsl_qrng));
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
if (r == 0)
|
|
Packit |
67cb25 |
{
|
|
Packit |
67cb25 |
GSL_ERROR_VAL ("failed to allocate space for rng struct",
|
|
Packit |
67cb25 |
GSL_ENOMEM, 0);
|
|
Packit |
67cb25 |
};
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
r->dimension = q->dimension;
|
|
Packit |
67cb25 |
r->state_size = q->state_size;
|
|
Packit |
67cb25 |
r->state = malloc (r->state_size);
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
if (r->state == 0)
|
|
Packit |
67cb25 |
{
|
|
Packit |
67cb25 |
free (r);
|
|
Packit |
67cb25 |
GSL_ERROR_VAL ("failed to allocate space for rng state",
|
|
Packit |
67cb25 |
GSL_ENOMEM, 0);
|
|
Packit |
67cb25 |
};
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
r->type = q->type;
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
memcpy (r->state, q->state, q->state_size);
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
return r;
|
|
Packit |
67cb25 |
}
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
const char *
|
|
Packit |
67cb25 |
gsl_qrng_name (const gsl_qrng * q)
|
|
Packit |
67cb25 |
{
|
|
Packit |
67cb25 |
return q->type->name;
|
|
Packit |
67cb25 |
}
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
size_t
|
|
Packit |
67cb25 |
gsl_qrng_size (const gsl_qrng * q)
|
|
Packit |
67cb25 |
{
|
|
Packit |
67cb25 |
return q->state_size;
|
|
Packit |
67cb25 |
}
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
void *
|
|
Packit |
67cb25 |
gsl_qrng_state (const gsl_qrng * q)
|
|
Packit |
67cb25 |
{
|
|
Packit |
67cb25 |
return q->state;
|
|
Packit |
67cb25 |
}
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
void
|
|
Packit |
67cb25 |
gsl_qrng_free (gsl_qrng * q)
|
|
Packit |
67cb25 |
{
|
|
Packit |
67cb25 |
RETURN_IF_NULL (q);
|
|
Packit |
67cb25 |
if(q->state != 0) free (q->state);
|
|
Packit |
67cb25 |
free (q);
|
|
Packit |
67cb25 |
}
|