Пример #1
0
mt_struct *get_mt_parameter_id(int w, int p, int id)
{
    mt_struct *mts;
    prescr_t pre;
    check32_t ck;

    if (id > 0xffff) {
	printf("\"id\" must be less than 65536\n");
	return NULL;
    }
    if (id < 0) {
	printf("\"id\" must be positive\n");
	return NULL;
    }

    mts = init_mt_search(&ck, &pre, w, p);
    if (mts == NULL) return NULL;

    if ( NOT_FOUND == get_irred_param(&ck, &pre, &global_mt19937,
				      mts, id, DEFAULT_ID_SIZE) ) {
	free_mt_struct(mts);
	return NULL;
    }
    _get_tempering_parameter_hard_dc(mts);
    end_mt_search(&pre);

    return mts;
}
Пример #2
0
static int set_up_dcmt (int n, int self, unsigned int seed)
{
    mt_struct **mtss;
    int w = 32;
    int p = 521; /* period = 2^521-1 =~ 6.9e+156 */
    int dseed = 4172;
    int i, count = 0;

    mtss = get_mt_parameters_st(w, p, 0, n - 1, dseed, &count);
    if (mtss == NULL) {
        fprintf(stderr, "Couldn't get MT parameters\n");
        return E_DATA;
    }

#if 0
    fprintf(stderr, "set_up_dcmt: set up %d MTs, self = %d\n", n, self);
#endif

    use_dcmt = 1;
    dcmt_seed = seed != 0 ? seed : time(NULL);

    for (i=0; i<count; i++) {
	if (i == self) {
	    dcmt = mtss[i];
	    sgenrand_mt(dcmt_seed, dcmt);
	} else {
	    free_mt_struct(mtss[i]);
	}
    }

    free(mtss);

    return 0;
}
Пример #3
0
void gretl_rand_free (void)
{
#if USE_RAND_ARRAY
    sfmt_array_cleanup();
#endif

    if (dcmt != NULL) {
	free_mt_struct(dcmt);
	dcmt = NULL;
    }
}
Пример #4
0
void free_mt_struct_array(mt_struct **mtss, int count)
{
    int i;

    if (mtss == NULL) {
	return;
    }
    for (i=0; i < count; i++) {
	free_mt_struct(mtss[i]);
    }
    free(mtss);
}
Пример #5
0
/*
   w -- word size
   p -- Mersenne Exponent
*/
mt_struct *get_mt_parameter(int w, int p)
{
    mt_struct *mts;
    prescr_t pre;
    check32_t ck;

    mts = init_mt_search(&ck, &pre, w, p);
    if (mts == NULL) return NULL;

    if ( NOT_FOUND == get_irred_param(&ck, &pre, &global_mt19937, mts,0,0) ) {
	free_mt_struct(mts);
	return NULL;
    }
    _get_tempering_parameter_hard_dc(mts);
    end_mt_search(&pre);

    return mts;
}
Пример #6
0
mt_struct *get_mt_parameter_opt_temper(int w, int p, uint32_t seed)
{
    mt_struct *mts;
    prescr_t pre;
    _org_state org;
    check32_t ck;

    _sgenrand_dc(&org, seed);
    mts = init_mt_search(&ck, &pre, w, p);
    if (mts == NULL) return NULL;

    if ( NOT_FOUND == get_irred_param(&ck, &pre, &org, mts,0,0) ) {
	free_mt_struct(mts);
	return NULL;
    }
    _get_tempering_parameter_hard_dc(mts);
    end_mt_search(&pre);

    return mts;
}
Пример #7
0
int main(void)
{
    int i,j;
    mt_struct *mts;

    init_dc(4172);

    /* This trys to find a small Mersenne Twister with period 2^521-1. */
    mts = get_mt_parameter(32,521); 
    if (mts == NULL) {
	printf ("error\n");
    }
    else {
	sgenrand_mt(3241, mts);
	for (i=0; i<100; i++) {
	    for (j=0; j<5; j++)
		printf("%8x ", genrand_mt(mts));
	    printf("\n");
	}
	free_mt_struct(mts);
    }

    return 0;
}
Пример #8
0
void freeRandom(Random *rnd) {
	free_mt_struct(*rnd);
	*rnd = NULL;
}
Пример #9
0
int main(void){
    int i, flag;
    mt_struct *mts;
    mt_struct_stripped mt_strip;
    FILE *fd, *flog;


    if( sizeof(mt_struct) != 64 || sizeof(mt_struct_stripped) != 16 ){
        printf("***BAD STRUCTURE ALIGNMENT!!!***\n");
        goto brk;
    }

    if( !(flog = fopen("log.txt", "w+")) ){
        printf("***FAILED TO CREATE LOG FILE!!!***n");
        goto brk;
    }

    fprintf(flog, "Generating Mersenne Twisters...\n"); fflush(flog);
        init_dc(DCMT_SEED);
        for(i = 0; i < MT_RNG_COUNT; i++){
            fprintf(flog, "...%i\n", i); fflush(flog);
            mts = get_mt_parameter_id(32, MT_RNG_PERIOD, i);
            if(!mts){
                fprintf(flog, "***FAILED TO FIND RNG!!!***\n");
                goto brk;
            }
            MT[i] = *mts;
            //We don't need the contents of the state,
            //which anyway wasn't yet initialized by sgenrand_mt()
            MT[i].i     = 0;
            MT[i].state = NULL;
            free_mt_struct(mts);
        }

    fprintf(flog, "Inspecting configurations...\n"); fflush(flog);
        flag = 1;
        for(i = 1; i < MT_RNG_COUNT; i++)
            if(
                (MT[i].mm != MT[0].mm) ||
                (MT[i].nn != MT[0].nn) ||
                (MT[i].rr != MT[0].rr) ||
                (MT[i].ww != MT[0].ww) ||
                (MT[i].wmask != MT[0].wmask) ||
                (MT[i].umask != MT[0].umask) ||
                (MT[i].lmask != MT[0].lmask) ||
                (MT[i].shift0 != MT[0].shift0) ||
                (MT[i].shift1 != MT[0].shift1) ||
                (MT[i].shiftB != MT[0].shiftB) ||
                (MT[i].shiftC != MT[0].shiftC)
            ) flag = 0;

        if(!flag){
            fprintf(flog, "***INCONSISTENT CONFIGURATIONS!!!***\n");
            goto brk;
        }


    fprintf(flog, "Creating raw MT file...\n"); fflush(flog);
        if( !(fd = fopen("MersenneTwister.raw", "wb+")) ){
            fprintf(flog, "***FAILED TO CREATE RAW MT FILE!!!***\n");
            goto brk;
        }
        fwrite(&MT, sizeof(mt_struct), MT_RNG_COUNT, fd);
        fclose(fd);


    fprintf(flog, "Creating stripped MT file...\n"); fflush(flog);
        if( !(fd = fopen("MersenneTwister.dat", "wb+")) ){
            fprintf(flog, "***FAILED TO CREATE STRIPPED FILE!!!***\n");
            goto brk;
        }
        for(i = 0; i < MT_RNG_COUNT; i++){
            mt_strip.matrix_a = MT[i].aaa;
            mt_strip.mask_b   = MT[i].maskB;
            mt_strip.mask_c   = MT[i].maskC;
            mt_strip.seed     = 0;
            fwrite(&mt_strip, sizeof(mt_struct_stripped), 1, fd);
        }
        fclose(fd);



    fprintf(flog, "Creating MT header file...\n"); fflush(flog);
        if( !(fd = fopen("MersenneTwister.h", "w+")) ){
            fprintf(flog, "***FAILED TO CREATE MersenneTwister.h!!!***\n");
            goto brk;
        }

        fprintf(fd, "#ifndef MERSENNETWISTER_H\n"                   );
        fprintf(fd, "#define MERSENNETWISTER_H\n"                   );
        fprintf(fd, "#ifndef mersennetwister_h\n"                   );
        fprintf(fd, "#define mersennetwister_h\n"                   );
        fprintf(fd, "\n\n\n");
        fprintf(fd, "#define      DCMT_SEED %i\n",    DCMT_SEED     );
        fprintf(fd, "#define  MT_RNG_PERIOD %i\n",    MT_RNG_PERIOD );
        fprintf(fd, "\n\n");
        fprintf(fd, "typedef struct{\n"                             );
        fprintf(fd, "    unsigned int matrix_a;\n"                  );
        fprintf(fd, "    unsigned int mask_b;\n"                    );
        fprintf(fd, "    unsigned int mask_c;\n"                    );
        fprintf(fd, "    unsigned int seed;\n"                      );
        fprintf(fd, "} mt_struct_stripped;\n"                       );
        fprintf(fd, "\n\n");
        fprintf(fd, "#define   MT_RNG_COUNT %i\n",    MT_RNG_COUNT  );
        fprintf(fd, "#define          MT_MM %i\n",    MT[0].mm      );
        fprintf(fd, "#define          MT_NN %i\n",    MT[0].nn      );
        fprintf(fd, "#define       MT_WMASK 0x%XU\n", 0xFFFFFFFFU   );
        fprintf(fd, "#define       MT_UMASK 0x%XU\n", MT[0].umask   );
        fprintf(fd, "#define       MT_LMASK 0x%XU\n", MT[0].lmask   );
        fprintf(fd, "#define      MT_SHIFT0 %i\n",    MT[0].shift0  );
        fprintf(fd, "#define      MT_SHIFTB %i\n",    MT[0].shiftB  );
        fprintf(fd, "#define      MT_SHIFTC %i\n",    MT[0].shiftC  );
        fprintf(fd, "#define      MT_SHIFT1 %i\n",    MT[0].shift1  );
        fprintf(fd, "\n\n\n");
        fprintf(fd, "#endif\n");
        fprintf(fd, "#endif\n");
        fclose(fd);

    fprintf(flog, "All done.\n");

brk:
    fclose(flog);
    return 0;
}