コード例 #1
0
ファイル: z.c プロジェクト: lucabe72/StochUtils
struct pmf *z_generate(const struct pmf *t, unsigned int ts)
{
  double sum;
  unsigned int j, th;
  struct pmf *z;

  z = pmf_create(pmf_max(t) / ts * ts, 0);

  th = ts;
  sum = 0;
  for (j = (unsigned int)pmf_min(t); j < (unsigned int)pmf_max(t); j++) {
    if (j < ts) {
      fprintf(stderr, "Error!!! Interarrival times MUST be greater than %d!!!\n",
		      ts);
      return NULL;
    }

    if (j >= th) {
      pmf_set(z, th - ts, sum);
      th += ts;
      sum = 0;
    }
    sum += pmf_get(t, j);
  }

  return z;
}
コード例 #2
0
ファイル: pmf-file.c プロジェクト: lucabe72/StochUtils
int pmf_read(struct pmf *d, FILE *f)
{
  int cnt = 0;

  while (!feof(f)) {
    int res;
    unsigned int i;
    double p;

    res = fscanf(f, "%u %lf\n", &i, &p);
    if (res == 2) {
      if (pmf_set(d, i, p) < 0) {
        fprintf(stderr, "Failed to insert %u: PMF(%u)=%f\n", cnt, i, p);

        return -1;
      }
    } else if (res != 0) {
      perror("fscanf");

      return -1;
    }
    cnt++;
  }

  return 1;
}
コード例 #3
0
ファイル: pmf-sample.c プロジェクト: lucabe72/StochUtils
void pmf_normalise(struct pmf *s)
{
  int i;
  double sum;

  sum = 0;
  for (i = pmf_min(s); i <= pmf_max(s); i++) {
    sum += pmf_get(s, i);
  }
  for (i = pmf_min(s); i <= pmf_max(s); i++) {
    pmf_set(s, i, pmf_get(s, i) / sum);
  }
}
コード例 #4
0
ファイル: mul_fft_dft.c プロジェクト: curtisbright/flint1.6
void
virtual_pmf_isolate (virtual_pmf_t op)
{
   if (op->index == -1)
      return;

   struct virtual_pmfvec_struct* parent = op->parent;

   if (parent->count[op->index] == 1)
      // already has reference count 1
      return;
   
   // detach
   parent->count[op->index]--;
   
   // find new buffer and copy the data
   unsigned index = virtual_pmfvec_new_buf (parent);
   pmf_set (parent->buf[index], parent->buf[op->index], parent->M);
   op->index = index;
}
コード例 #5
0
ファイル: matgen.c プロジェクト: lucabe72/StochUtils
int main(int argc, char *argv[])
{
    int opt;
    struct pmf *c;
    struct pmf *u;
    struct pmf *c1;
    uint64_t time_start, time_end;
    int n, i, j;
    Real prob = 0.0;
    MAT *matrix;

    opt = opts_parse(argc, argv);

    if (strcmp(ofile, "") == 0) {
	fprintf(stderr, "You must specify an output file.mat\n");
	exit(0);
    }
    c = load(argv[opt], Nc);
    c1 = pmf2cdf(c);

//print(c1,"c1");

    time_start = get_time();
    switch (model) {
    case ETFAMODEL:{
	    if (z == 0)
		u = load(argv[opt + 1], Nc);
	    else {
		u = pmf_create(Nc, 0);
		pmf_set(u, z, 1.0);

	    }
	    n = 100;
	    matrix = m_get(n, n);
	    for (i = 0; i < n; i++) {
		for (j = 0; j < n; j++) {
		    prob = prob_efta(i, j, Q, c, u);
		    m_set_val(matrix, i, j, prob);
		}
	    }
	    break;
	}
    case LASTMODEL:{
	    if (d == 0)
		d = Q;
	    n = pmf_max(c) / d * 3;
	    matrix = m_get(n, n);
	    for (i = 0; i < n; i++) {
		for (j = 0; j < n; j++) {
		    prob = prob_last(i, j, Q, z, d, c1);
		    m_set_val(matrix, i, j, prob);
		}
	    }
	    break;
	}
    case RTSSMODEL:{
	    n = 10;
	    matrix = m_get(n, n);
	    for (i = 0; i < n; i++) {
		for (j = 0; j < n; j++) {
		    prob = prob_rtss(i, j, Q, z, c);
		    m_set_val(matrix, i, j, prob);
		}
	    }
	    break;
	}
    default:
	fprintf(stderr, "Choose a model please\n");
	exit(0);
    }
    time_end = get_time();


/*for (i=0; i<n; i++){
     for (j=0; j<n; j++){
       printf("%f ",m_get_val(matrix,i,j));
     }
       printf("\n");
    
}*/
    //print(matrix);
    FILE *fm = fopen(ofile, "w");
    m_save(fm, matrix, "matrix");
    fclose(fm);
    return (0);
}
コード例 #6
0
int
testcase_pmfvec_tpifft_dc (unsigned lgK, unsigned lgM, ulong n, int fwd,
                           ulong z, ulong t, const zn_mod_t mod)
{
   int success = 1;

   ulong M = 1UL << lgM;
   ulong K = 1UL << lgK;
   ulong i, j;

   ptrdiff_t skip = M + 1;

   // ===================================
   // first check linearity, i.e. that ax + by gets mapped to the right thing

   {
      pmfvec_t X, Y, A, B, TX, TY;

      pmfvec_init (X, lgK, skip, lgM, mod);
      pmfvec_init (Y, lgK, skip, lgM, mod);
      pmfvec_init (A, lgK, skip, lgM, mod);
      pmfvec_init (B, lgK, skip, lgM, mod);
      pmfvec_init (TX, lgK, skip, lgM, mod);
      pmfvec_init (TY, lgK, skip, lgM, mod);

      // generate random X, Y, A, B
      for (i = 0; i < K; i++)
      {
         pmf_rand (X->data + i * skip, M, mod);
         pmf_rand (Y->data + i * skip, M, mod);
      }

      pmf_rand (A->data, M, mod);
      pmf_rand (B->data, M, mod);

      for (i = 1; i < K; i++)
      {
         pmf_set (A->data + i * A->skip, A->data, M);
         pmf_set (B->data + i * B->skip, B->data, M);
      }
      
      // transform X and Y (after throwing in random ignorable crap)
      pmfvec_set (TX, X);
      pmfvec_set (TY, Y);
      
      for (i = n + fwd; i < K; i++)
      {
         pmf_rand (TX->data + i * skip, M, mod);
         pmf_rand (TY->data + i * skip, M, mod);
      }

      pmfvec_tpifft_dc (TX, n, fwd, z, t);
      pmfvec_tpifft_dc (TY, n, fwd, z, t);

      // form linear combination of TX and TY
      pmfvec_mul (TX, TX, A, z, 0);
      pmfvec_mul (TY, TY, B, z, 0);
      for (i = 0; i < z; i++)
         pmf_add (TX->data + TX->skip * i, TY->data + TY->skip * i, M, mod);

      // form linear combination of X and Y
      pmfvec_mul (X, X, A, n + fwd, 0);
      pmfvec_mul (Y, Y, B, n + fwd, 0);
      for (i = 0; i < n + fwd; i++)
         pmf_add (X->data + X->skip * i, Y->data + Y->skip * i, M, mod);

      // transform linear combination of X and Y
      pmfvec_tpifft_dc (X, n, fwd, z, t);

      // compare results
      for (i = 0; i < z; i++)
         success = success && !pmf_cmp (X->data + X->skip * i,
                                        TX->data + TX->skip * i, M, mod);
      
      pmfvec_clear (X);
      pmfvec_clear (Y);
      pmfvec_clear (TX);
      pmfvec_clear (TY);
      pmfvec_clear (A);
      pmfvec_clear (B);
   }

   // ===================================
   // now check that the matrix of the transposed IFFT is really the transpose
   // of the matrix of the ordinary IFFT

   {
      pmfvec_t* X = (pmfvec_t*) malloc (z * sizeof (pmfvec_t));
      for (i = 0; i < z; i++)
         pmfvec_init (X[i], lgK, skip, lgM, mod);

      pmfvec_t* Y = (pmfvec_t*) malloc ((n + fwd) * sizeof (pmfvec_t));
      for (i = 0; i < n + fwd; i++)
         pmfvec_init (Y[i], lgK, skip, lgM, mod);
         
      // compute images of basis vectors under FFT

      for (i = 0; i < z; i++)
      for (j = 0; j < z; j++)
      {
         pmf_zero (X[i]->data + j * skip, M);
         X[i]->data[j * skip + 1] = (i == j);
      }
      
      for (i = 0; i < z; i++)
         pmfvec_ifft (X[i], n, fwd, z, t);

      // compute images of basis vectors under transposed FFT

      for (i = 0; i < n + fwd; i++)
      for (j = 0; j < n + fwd; j++)
      {
         pmf_zero (Y[i]->data + j * skip, M);
         Y[i]->data[j * skip + 1] = (i == j);
      }
      
      for (i = 0; i < n + fwd; i++)
         pmfvec_tpifft (Y[i], n, fwd, z, t);
      
      // check that they are transposes of each other

      for (i = 0; i < z; i++)
      for (j = 0; j < n + fwd; j++)
         success = success && !pmf_cmp (X[i]->data + j * skip,
                                        Y[j]->data + i * skip, M, mod);

      for (i = 0; i < z; i++)
         pmfvec_clear (X[i]);
      for (i = 0; i < n + fwd; i++)
         pmfvec_clear (Y[i]);
      free (Y);
      free (X);
   }

   return success;
}
コード例 #7
0
/*
   If lgT == 0, this tests pmfvec_ifft_dc.
   If lgT > 0, it tests pmfvec_ifft_huge.
*/
int
testcase_pmfvec_ifft_dc_or_huge (unsigned lgK, unsigned lgM, unsigned lgT,
                                 ulong n, int fwd, ulong z, ulong t,
                                 const zn_mod_t mod)
{
   pmfvec_t A, B, C;
   
   ulong M = 1UL << lgM;
   ulong K = 1UL << lgK;
   ulong x = zn_mod_reduce (K, mod);

   ptrdiff_t skip = M + 1;
   ulong i;

   pmfvec_init (A, lgK, skip, lgM, mod);
   pmfvec_init (B, lgK, skip, lgM, mod);
   pmfvec_init (C, lgK, skip, lgM, mod);

   // create random a_i's, with zero padding
   for (i = z; i < K; i++)
      pmf_zero (A->data + i * skip, M);
   for (i = z; i < K; i++)
      A->data[i * skip] = random_ulong (2 * M);
   for (i = 0; i < z; i++)
      pmf_rand (A->data + i * skip, M, mod);
      
   // run FFT
   pmfvec_set (B, A);
   pmfvec_fft (B, K, K, t);
   pmfvec_set (C, B);
   
   // fill in missing data, plus junk where the implied zeroes should be
   for (i = n; i < z; i++)
   {
      pmf_set (C->data + i * skip, A->data + i * skip, M);
      pmf_scalar_mul (C->data + i * skip, M, x, mod);
   }
   for (i = z; i < K; i++)
      pmf_rand (C->data + i * skip, M, mod);
   
   // try IFFT
   if (lgT > 0)
      pmfvec_ifft_huge (C, lgT, n, fwd, z, t);
   else
      pmfvec_ifft_dc (C, n, fwd, z, t);
   
   // compare results
   int success = 1;
   for (i = 0; i < n; i++)
      pmf_scalar_mul (A->data + i * skip, M, x, mod);
   for (i = 0; i < n; i++)
      success = success && !pmf_cmp (C->data + i * skip, A->data + i * skip,
                                     M, mod);
   if (fwd)
      success = success && !pmf_cmp (C->data + i * skip, B->data + i * skip,
                                     M, mod);

   pmfvec_clear (C);
   pmfvec_clear (B);
   pmfvec_clear (A);
   
   return success;
}
コード例 #8
0
ファイル: pmf-sample.c プロジェクト: lucabe72/StochUtils
int pmf_collect(struct pmf *s, int i)
{
  return pmf_set(s, i, pmf_get(s, i) + 1);
}