void DPCostsInsideExpectation::sampleOnceGradientFD
(double const * const coefsJkp1Ref, 
 int const * const * const refTableJkp1Ref, 
 double const * const stateKRef, 
 double const * const controlKRef, 
 gsl_rng* generator, double * const grad)
{
  
  /* Note we assume the generator is already initialized with the
   * appropriate seed when passed into this function. */
  static gsl_rng_type const * rngType = gsl_rng_ranlxs0;
  static gsl_rng* generatorRef = gsl_rng_alloc(rngType);
  gsl_rng_memcpy(generatorRef, generator);
  
  /* Initializations. */
  double perturb(0.0), fp(0.0), fm(0.0);
  static double* controlKPert = new double[primary.nControlsDim];
  
  for (int i = 0; i < primary.nControlsDim; i++)
    controlKPert[i] = controlKRef[i];
  
  for (int i = 0; i < primary.nControlsDim; i++)
  {
    /* Reset previous perturbation. */
    if (i > 0)
      controlKPert[i - 1] = controlKRef[i - 1];

    /* Positive perturbation. */
    perturb = max<double>(fabs(controlKRef[i]), 1.0) * sqrt(EPS);
    controlKPert[i] = controlKRef[i] + perturb;
    fp = 0.0;
    gsl_rng_memcpy(generator, generatorRef);
    fp = sampleOnce(coefsJkp1Ref, refTableJkp1Ref, 
		    stateKRef, controlKPert, generator);

    /* Negative perturbation. */
    controlKPert[i] = controlKRef[i] - perturb;
    fm = 0.0;
    gsl_rng_memcpy(generator, generatorRef);
    fm = sampleOnce(coefsJkp1Ref, refTableJkp1Ref, 
		    stateKRef, controlKPert, generator);
    
    /* Compute gradient component. */
    grad[i] = (fp - fm) / (2.0 * perturb);
  }
  
}
Exemple #2
0
static VALUE rb_gsl_rng_memcpy(VALUE obj, VALUE dst, VALUE org)
{
  gsl_rng *dest, *src;
  CHECK_RNG(dst); CHECK_RNG(org);
  Data_Get_Struct(dst, gsl_rng, dest);
  Data_Get_Struct(org, gsl_rng, src);
  gsl_rng_memcpy(dest, src);
  return dst;
}
Exemple #3
0
void
rng_state_test (const gsl_rng_type * T)
{
  unsigned long int test_a[N], test_b[N];

  int i;

  gsl_rng *r = gsl_rng_alloc (T);
  gsl_rng *r_save = gsl_rng_alloc (T);

  for (i = 0; i < N; ++i)
    {
      gsl_rng_get (r);  /* throw away N iterations */
    }

  gsl_rng_memcpy (r_save, r);   /* save the intermediate state */

  for (i = 0; i < N; ++i)
    {
      test_a[i] = gsl_rng_get (r);
    }

  gsl_rng_memcpy (r, r_save);   /* restore the intermediate state */
  gsl_rng_free (r_save);

  for (i = 0; i < N; ++i)
    {
      test_b[i] = gsl_rng_get (r);
    }

  {
    int status = 0;
    for (i = 0; i < N; ++i)
      {
        status |= (test_b[i] != test_a[i]);
      }
    /*gsl_test (status, "%s, random number state consistency",*/
              /*gsl_rng_name (r));*/
  }

  gsl_rng_free (r);
}
Exemple #4
0
void
rng_parallel_state_test (const gsl_rng_type * T)
{
  unsigned long int test_a[N], test_b[N];
  unsigned long int test_c[N], test_d[N];
  double test_e[N], test_f[N];

  int i;

  gsl_rng *r1 = gsl_rng_alloc (T);
  gsl_rng *r2 = gsl_rng_alloc (T);

  for (i = 0; i < N; ++i)
    {
      gsl_rng_get (r1);         /* throw away N iterations */
    }

  gsl_rng_memcpy (r2, r1);              /* save the intermediate state */

  for (i = 0; i < N; ++i)
    {
      /* check that there is no hidden state intermixed between r1 and r2 */
      test_a[i] = gsl_rng_get (r1);     
      test_b[i] = gsl_rng_get (r2);
      test_c[i] = gsl_rng_uniform_int (r1, 1234);       
      test_d[i] = gsl_rng_uniform_int (r2, 1234);
      test_e[i] = gsl_rng_uniform (r1); 
      test_f[i] = gsl_rng_uniform (r2);
    }

  {
    int status = 0;
    for (i = 0; i < N; ++i)
      {
        status |= (test_b[i] != test_a[i]);
        status |= (test_c[i] != test_d[i]);
        status |= (test_e[i] != test_f[i]);
      }
    /*gsl_test (status, "%s, parallel random number state
 * consistency",*/
              /*gsl_rng_name (r1));*/
  }

  gsl_rng_free (r1);
  gsl_rng_free (r2);

}
Exemple #5
0
void restore_state(void *state)
{
    gsl_rng_memcpy(rnd(), (gsl_rng *) state);
}
Exemple #6
0
int main(int argc, char **argv){
    int i;
    gsl_rng *r;
    gsl_rng *rcopy;
    unsigned long x;
    rngRemember(unsigned long save);
    rngRemember(unsigned long saved[5]);
    double sum = 0.;
    (void)argc; (void)argv; /* unused */

    /* Silence an unused-parameter warning. */
    (void)argc;

    r = gsl_rng_alloc(gsl_rng_cbrng);
    assert (gsl_rng_min(r) == 0);
    assert (gsl_rng_max(r) == 0xffffffffUL); /* Not necessarily ~0UL */
    assert (gsl_rng_size(r) > 0);

    printf("%s\nulongs from %s in initial state\n", argv[0], gsl_rng_name(r));
    for (i = 0; i < 5; i++) {
	x = gsl_rng_get(r);
        rngRemember(saved[i] = x);
	printf("%d: 0x%lx\n", i, x);
	assert(x != 0);
    }
    printf("uniforms from %s\n", gsl_rng_name(r));
    for (i = 0; i < 5; i++) {
        double z = gsl_rng_uniform(r);
        sum += z;
        printf("%d: %.4g\n", i, z);
    }
    assert( sum < 0.9*5 && sum > 0.1*5 && (long)"sum must be reasonably close  to 0.5*number of trials");
    rngRemember(save =) gsl_rng_get(r);

    gsl_rng_set(r, 0xdeadbeef); /* set a non-zero seed */
    printf("ulongs from %s after seed\n", gsl_rng_name(r));
    for (i = 0; i < 5; i++) {
	x = gsl_rng_get(r);
	printf("%d: 0x%lx\n", i, x);
	assert(x != 0);
    }
    /* make a copy of the total state */
    rcopy = gsl_rng_alloc(gsl_rng_cbrng);
    gsl_rng_memcpy(rcopy, r);
    printf("uniforms from %s\n", gsl_rng_name(r));
    sum = 0.;
    for (i = 0; i < 5; i++) {
        double x = gsl_rng_uniform(r);
        rngRemember(double y = gsl_rng_uniform(rcopy));
	printf("%d: %.4g\n", i, x);
        sum += x;
        assert(x == y);
    }
    assert(gsl_rng_get(r) != save);
    assert( sum < 0.9*5 && sum > 0.1*5 && (long)"sum must be reasonably close  to 0.5*number of trials");

    /* gsl_rng_set(*, 0) is supposed to recover the default seed */
    gsl_rng_set(r, 0);
    printf("ulongs from %s after restore to initial\n", gsl_rng_name(r));
    for (i = 0; i < 5; i++) {
	x = gsl_rng_get(r);
        assert( x == saved[i] );
	printf("%d: 0x%lx\n", i, x);
	assert(x != 0);
    }
    printf("uniforms from %s\n", gsl_rng_name(r));
    for (i = 0; i < 5; i++) {
	printf("%d: %.4g\n", i, gsl_rng_uniform(r));
    }


    gsl_rng_free (rcopy);
    gsl_rng_free (r);

    printf("ut_gsl: OK\n");
    return 0;
}