Ejemplo n.º 1
0
void
dss_random(DSS_HUGE *tgt, DSS_HUGE lower, DSS_HUGE upper, long stream)
{
	*tgt = UnifInt(lower, upper, stream);
	Seed[stream].usage += 1;

	return;
}
Ejemplo n.º 2
0
long
tpc_random(long lower, long upper, long stream)
{
	long res;

	if (upper < 0 || lower < 0 || upper < lower)
		{
		INTERNAL_ERROR("invalid RNG range");
		}
	res = UnifInt((long)lower, (long)upper, (long)stream);
	Seed[stream].usage += 1;

	return(res);
}
Ejemplo n.º 3
0
long 
SkewInt(long nLow, long nHigh, long nStream, double skewVal, long n)
/*
 * 
 */
{
	double	zipf;
	double  dRange;
	long    nTemp;
	double	multiplier;
	double	Czn;
	long	numDistinctValuesGenerated;


	/* check for validity of skewVal */
	if(skewVal < 0 || skewVal > 5)
		zipf = 0; /* assume uniform */
	else if(skewVal==5.0)
	{
		/* special case */
		/* check if any values have been generated for this column */
		if(NumDistinctValuesGenerated[nStream]==0)
		{
			/* pick a skew value to be used for this column*/
			zipf = (int) UnifInt(0,  4, 0);
			ColumnSkewValue[nStream] = zipf;
		}
		else
		{
			/* column skew value has been initialized before */
			zipf = ColumnSkewValue[nStream];
		}
	}
	else
	{
		/* skewVal is between 0 and 4 */
		zipf = skewVal;
	}

	/* If no values have been generated for this stream as yet, get multiplier */
	if(NumDistinctValuesGenerated[nStream]==0)
	{
		Multiplier[nStream] = GetMultiplier(n, zipf);
	}
	multiplier = Multiplier[nStream];

	/* 
	 * Check how many copies of the current value
	 * have already been generated for this stream.
	 * If we have generated enough, proceed to
	 * next value, and decide how many copies of
	 * this value should be generated.
	 */

	if(CurrentValueCounter[nStream] == CurrentValueTarget[nStream])
	{
		/* proceed to next value */
		if (nStream < 0 || nStream > MAX_STREAM)
			nStream = 0;
		if (nLow == nHigh)
			nTemp = nLow;
		else
		{
			if (nLow > nHigh)
			{
				nTemp = nLow;
				nLow = nHigh;
				nHigh = nTemp;
			}
			dRange = (double) (nHigh - nLow + 1);
			Seed[nStream] = NextRand(Seed[nStream]);
			nTemp = (long) (((double) Seed[nStream] / dM) * (dRange));
			nTemp += nLow;
			CurrentValue[nStream] = nTemp;
		}
	}
	else
	{
		/* return another copy of current value */
		nTemp = CurrentValue[nStream];
		CurrentValueCounter[nStream]++;
		return nTemp;
	}

	/*  
	 * check how many distinct values for this column
	 * have already been generated.
	 */
	numDistinctValuesGenerated = NumDistinctValuesGenerated[nStream] + 1;

	if(n<1)
		n = (nHigh - nLow + 1);

	/*
	* zipf is guaranteed to be in the range 0..4 
	* pick the multiplier 
	if(zipf == 0)
		multiplier = n;
	else if(zipf==1)
		multiplier = log(n) + 0.577 ;
	else if(zipf==2)
		multiplier = (PI*PI)/6.0;
	else if(zipf==3)
		multiplier = 1.202;
	else if(zipf==4)
		multiplier = (PI*PI*PI*PI)/90.0;
	*/

	Czn = n/multiplier;
	CurrentValueTarget[nStream]= 
		(long) (Czn/pow((double)numDistinctValuesGenerated, zipf));
	/* ensure that there is at least one value*/
	CurrentValueTarget[nStream] = (CurrentValueTarget[nStream] < 1) ? 1: CurrentValueTarget[nStream];
	CurrentValueCounter[nStream] = 1;
	NumDistinctValuesGenerated[nStream]++;

	return nTemp;
}
Ejemplo n.º 4
0
void
varsub(int qnum, int vnum, int flags)
{
    static char param[11][128];
    static FILE *lfp = NULL;
    char *ptr;
    int i = 0,
        size[10],
        tmp_date;

    if (vnum == 0)
    {
        if ((flags & DFLT) == 0)
        {
            switch(qnum)
            {
            case 1:
                sprintf(param[1], "%d", UnifInt((long)60,(long)120,(long)qnum));
                param[2][0] = '\0';
                break;
            case 2:
                sprintf(param[1], "%d",
                        UnifInt((long)P_SIZE_MIN, (long)P_SIZE_MAX, qnum));
                pick_str(&p_types_set, qnum, param[3]);
                ptr = param[3] + strlen(param[3]);
                while (*(ptr - 1) != ' ') ptr--;
                strcpy(param[2], ptr);
                pick_str(&regions, qnum, param[3]);
                param[4][0] = '\0';
                break;
            case 3:
                pick_str(&c_mseg_set, qnum, param[1]);
                /*
                 * pick a random offset within the month of march and add the
                 * appropriate magic numbers to position the output functions
                 * at the start of March '95
                 */
                tmp_date = UnifInt((long)0, (long)30, (long)qnum);
                strcpy(param[2], *(asc_date + tmp_date + 1155));
                if (oldtime)
                {
                    for (i=0; strcmp(*(asc_date + i), param[2]); i++);
                    sprintf(param[2],"%ld", julian(i + STARTDATE));
                }
                param[3][0] = '\0';
                break;
            case 4:
                tmp_date = UnifInt(1,58,qnum);
                sprintf(param[1],"19%02d-%02d-01",
                        93 + tmp_date/12, tmp_date%12 + 1);
                if (oldtime)
                {
                    for (i=0; strcmp(*(asc_date + i), param[1]); i++);
                    sprintf(param[1],"%ld", julian(i + STARTDATE));
                }
                param[2][0] = '\0';
                break;
            case 5:
                pick_str(&regions, qnum, param[1]);
                tmp_date = UnifInt((long)93,(long)97,(long)qnum);
                if (oldtime) sprintf(param[2],"%ld", tmp_date);
                else sprintf(param[2], "19%d-01-01", tmp_date);
                param[3][0] = '\0';
                break;
            case 6:
                tmp_date = UnifInt(93,97,qnum);
                if (oldtime)
                    sprintf(param[1],"%ld001", tmp_date);
                else
                    sprintf(param[1], "19%d-01-01", tmp_date);
                sprintf(param[2], "0.0%d", UnifInt(2, 9, qnum));
                sprintf(param[3], "%d", UnifInt((long)24, (long)25, (long)qnum));
                param[4][0] = '\0';
                break;
            case 7:
                tmp_date = pick_str(&nations2, qnum, param[1]);
                while (pick_str(&nations2, qnum, param[2]) == tmp_date);
                param[3][0] = '\0';
                break;
            case 8:
                tmp_date = pick_str(&nations2, qnum, param[1]);
                tmp_date = nations.list[tmp_date].weight;
                strcpy(param[2], regions.list[tmp_date].text);
                pick_str(&p_types_set, qnum, param[3]);
                param[4][0] = '\0';
                break;
            case 9:
                pick_str(&colors, qnum, param[1]);
                param[2][0] = '\0';
                break;
            case 10:
                tmp_date = UnifInt(1,24,qnum);
                sprintf(param[1],"19%02d-%02d-01",
                        93 + tmp_date/12, tmp_date%12 + 1);
                if (oldtime)
                {
                    for (i=0; strcmp(*(asc_date + i), param[1]); i++);
                    sprintf(param[1],"%ld", julian(i + STARTDATE));
                }
                param[2][0] = '\0';
                break;
            case 11:
                pick_str(&nations2, qnum, param[1]);
                sprintf(param[2], "%11.10f", Q11_FRACTION / flt_scale );
                param[3][0] = '\0';
                break;
            case 12:
                tmp_date = pick_str(&l_smode_set, qnum, param[1]);
                while (tmp_date == pick_str(&l_smode_set, qnum, param[2]));
                tmp_date = UnifInt(93,97,qnum);
                if (oldtime) sprintf(param[3],"%d", tmp_date*1000 + 1);
                else sprintf(param[3], "19%d-01-01", tmp_date);
                param[4][0] = '\0';
                break;
            case 13:
                sprintf(param[1], O_CLRK_FMT, O_CLRK_TAG,
                        UnifInt((long)1,
                                (long) MAX((scale * O_CLRK_SCL), O_CLRK_SCL),
                                (long)qnum));

                param[2][0] = '\0';
                break;
            case 14:
                tmp_date = UnifInt(1,60,qnum);
                sprintf(param[1],"19%02d-%02d-01",
                        93 + tmp_date/12, tmp_date%12 + 1);
                if (oldtime)
                {
                    for (i=0; strcmp(*(asc_date + i), param[1]); i++);
                    sprintf(param[1],"%ld", julian(i + STARTDATE));
                }
                param[2][0] = '\0';
                break;
            case 15:
                tmp_date = UnifInt(1,58,qnum);
                sprintf(param[1],"19%02d-%02d-01",
                        93 + tmp_date/12, tmp_date%12 + 1);
                if (oldtime)
                {
                    for (i=0; strcmp(*(asc_date + i), param[1]); i++);
                    sprintf(param[1],"%ld", julian(i + STARTDATE));
                }
                param[2][0] = '\0';
                break;
            case 16:
                sprintf(param[1], "Brand#%d%d",
                        UnifInt(1, 5, qnum),
                        UnifInt(1, 5, qnum));
                pick_str(&p_types_set, qnum, param[2]);
                ptr = param[2] + strlen(param[2]);
                while (*(--ptr) != ' ');
                *ptr = '\0';
                i=0;
next:
                size[i] = UnifInt(1, 50, qnum);
                tmp_date = 0;
                while (tmp_date < i)
                    if (size[i] == size[tmp_date])
                        goto next;
                    else
                        tmp_date++;
                sprintf(param[i + 3], "%d", size[i]);
                if (++i <= TYPE_CNT)
                    goto next;
                param[i + 2][0] = '\0';
                break;
            case 17:
                sprintf(param[1], "Brand#%ld%ld",
                        UnifInt(1, 5, qnum),
                        UnifInt(1, 5, qnum));
                pick_str(&p_cntr_set, qnum, param[2]);
                param[3][0] = '\0';
                break;
            case 18:
            case 19:
                break;
            default:
                fprintf(stderr,
                        "No variable definitions available for query %d\n",
                        qnum);
            }
        }

        if (flags & LOG)
        {
            if (lfp == NULL)
            {
                lfp = fopen(lfile, "a");
                OPEN_CHECK(lfp, lfile);
            }
            fprintf(lfp, "%d", qnum);
            for (i=1; i <= 10; i++)
                if (flags & DFLT)
                {
                    if (defaults[i - 1] == NULL)
                        break;
                    else
                        fprintf(lfp, "\t%s", defaults[i - 1]);
                }
                else
                {
                    if (param[i][0] == '\0')
                        break;
                    else
                        fprintf(lfp, "\t%s", param[i]);
                }
            fprintf(lfp, "\n");
        }
    }
    else
    {
        if (flags & DFLT)
        {
            /* to allow -d to work at all scale factors */
            if (qnum == 11 && vnum == 2)
                fprintf(ofp, "%11.10f", Q11_FRACTION/flt_scale);
            else if (defaults[qnum - 1][vnum - 1])
                fprintf(ofp, "%s", defaults[qnum - 1][vnum - 1]);
            else
                fprintf(stderr,
                        "Bad default request (q: %d, p: %d)\n",
                        qnum, vnum);
        }
        else
        {
            if (param[vnum])
                fprintf(ofp, "%s", param[vnum]);
            else
                fprintf(stderr, "Bad parameter request (q: %d, p: %d)\n",
                        qnum, vnum);
        }
    }
    return;
}
Ejemplo n.º 5
0
void
varsub(int qnum, int vnum, int flags)
{
    static char param[11][128];
    static char formats[23][128];
    static FILE *lfp = NULL;
    static int bInit = 0;
    long *lptr;
    char *ptr;
    int i = 0;
    DSS_HUGE tmp_date, tmp1, tmp2;
	
    if (!bInit)
    {
        sprintf(formats[4], "19%s-%s-01", HUGE_DATE_FORMAT, HUGE_DATE_FORMAT);
        sprintf(formats[5], "19%s-01-01", HUGE_DATE_FORMAT);
        sprintf(formats[6], "19%s-01-01", HUGE_DATE_FORMAT);
        sprintf(formats[7], "0.%s", HUGE_DATE_FORMAT); /* used by q6 */
        sprintf(formats[10], "19%s-%s-01", HUGE_DATE_FORMAT, HUGE_DATE_FORMAT);
        sprintf(formats[12], "19%s-01-01", HUGE_DATE_FORMAT);
        sprintf(formats[14], "19%s-01-01", HUGE_DATE_FORMAT);
        sprintf(formats[15], "19%s-01-01", HUGE_DATE_FORMAT);
	sprintf(formats[16], "Brand#%s%s", HUGE_FORMAT, HUGE_FORMAT);
	sprintf(formats[17], "Brand#%s%s", HUGE_FORMAT, HUGE_FORMAT);
	sprintf(formats[19], "Brand#%s%s", HUGE_FORMAT, HUGE_FORMAT);
        sprintf(formats[20], "19%s-01-01", HUGE_DATE_FORMAT);
        bInit = 1;
    }

    if (vnum == 0)
    {
		if ((flags & DFLT) == 0)
		{
			switch(qnum)
			{
			case 1:
				sprintf(param[1], HUGE_FORMAT, UnifInt((DSS_HUGE)60,(DSS_HUGE)120,qnum));
				param[2][0] = '\0';
				break;
			case 2:
				sprintf(param[1], HUGE_FORMAT,
					UnifInt((DSS_HUGE)P_SIZE_MIN, (DSS_HUGE)P_SIZE_MAX, qnum));
				pick_str(&p_types_set, qnum, param[3]);
				ptr = param[3] + strlen(param[3]);
				while (*(ptr - 1) != ' ') ptr--;
				strcpy(param[2], ptr);
				pick_str(&regions, qnum, param[3]);
				param[4][0] = '\0';
				break;
			case 3:
				pick_str(&c_mseg_set, qnum, param[1]);
				/*
				* pick a random offset within the month of march and add the
				* appropriate magic numbers to position the output functions 
				* at the start of March '95
				*/
            RANDOM(tmp_date, 0, 30, qnum);
				strcpy(param[2], *(asc_date + tmp_date + 1155));
				param[3][0] = '\0';
				break;
			case 4:
				tmp_date = UnifInt((DSS_HUGE)1,(DSS_HUGE)58,qnum);
				sprintf(param[1],formats[4],
					93 + tmp_date/12, tmp_date%12 + 1);
				param[2][0] = '\0';
				break;
			case 5:
				pick_str(&regions, qnum, param[1]);
				tmp_date = UnifInt((DSS_HUGE)93, (DSS_HUGE)97,qnum);
				sprintf(param[2], formats[5], tmp_date);
				param[3][0] = '\0';
				break;
			case 6:
				tmp_date = UnifInt((DSS_HUGE)93,(DSS_HUGE)97,qnum);
				sprintf(param[1], formats[6], tmp_date);
				sprintf(param[2], formats[7], 
                                    UnifInt((DSS_HUGE)2, (DSS_HUGE)9, qnum));
				sprintf(param[3], HUGE_FORMAT, UnifInt((DSS_HUGE)24, (DSS_HUGE)25, qnum));
				param[4][0] = '\0';
				break;
			case 7:
				tmp_date = pick_str(&nations2, qnum, param[1]);
				while (pick_str(&nations2, qnum, param[2]) == tmp_date);
				param[3][0] = '\0';
				break;
			case 8:
				tmp_date = pick_str(&nations2, qnum, param[1]);
				tmp_date = nations.list[tmp_date].weight;
				strcpy(param[2], regions.list[tmp_date].text);
				pick_str(&p_types_set, qnum, param[3]);
				param[4][0] = '\0';
				break;
			case 9:
				pick_str(&colors, qnum, param[1]);
				param[2][0] = '\0';
				break;
			case 10:
				tmp_date = UnifInt((DSS_HUGE)1,(DSS_HUGE)24,qnum);
				sprintf(param[1],formats[10],
					93 + tmp_date/12, tmp_date%12 + 1);
				param[2][0] = '\0';
				break;
			case 11:
				pick_str(&nations2, qnum, param[1]);
				sprintf(param[2], "%11.10f", Q11_FRACTION / flt_scale );
				param[3][0] = '\0';
				break;
			case 12:
				tmp_date = pick_str(&l_smode_set, qnum, param[1]);
				while (tmp_date == pick_str(&l_smode_set, qnum, param[2]));
				tmp_date = UnifInt((DSS_HUGE)93,(DSS_HUGE)97,qnum);
				sprintf(param[3], formats[12], tmp_date);
				param[4][0] = '\0';
				break;
			case 13:
				pick_str(&q13a, qnum, param[1]);
				pick_str(&q13b, qnum, param[2]);
				param[3][0] = '\0';
				break;
			case 14:
				tmp_date = UnifInt((DSS_HUGE)1,(DSS_HUGE)60,qnum);
				sprintf(param[1],formats[14],
					93 + tmp_date/12, tmp_date%12 + 1);
				param[2][0] = '\0';
				break;
			case 15:
				tmp_date = UnifInt((DSS_HUGE)1,(DSS_HUGE)58,qnum);
				sprintf(param[1],formats[15],
					93 + tmp_date/12, tmp_date%12 + 1);
				param[2][0] = '\0';
				break;
			case 16:
				tmp1 = UnifInt((DSS_HUGE)1, (DSS_HUGE)5, qnum); 
				tmp2 = UnifInt((DSS_HUGE)1, (DSS_HUGE)5, qnum);
				sprintf(param[1], formats[16], tmp1, tmp2);
				pick_str(&p_types_set, qnum, param[2]);
				ptr = param[2] + strlen(param[2]);
				while (*(--ptr) != ' ');
				*ptr = '\0';
				lptr = &sizes[0];
				for (i=3; i <= MAX_PARAM; i++)
				{
					sprintf(param[i], "%ld", *permute(lptr,50,qnum) + 1);
					lptr = (long *)NULL;
				}
					break;
			case 17:
				tmp1 = UnifInt((DSS_HUGE)1, (DSS_HUGE)5, qnum); 
				tmp2 = UnifInt((DSS_HUGE)1, (DSS_HUGE)5, qnum);
				sprintf(param[1], formats[17], tmp1, tmp2);
				pick_str(&p_cntr_set, qnum, param[2]);
				param[3][0] = '\0';
				break;
			case 18:
				sprintf(param[1], HUGE_FORMAT, UnifInt((DSS_HUGE)312, (DSS_HUGE)315, qnum));
				param[2][0] = '\0';
				break;
			case 19:
				tmp1 = UnifInt((DSS_HUGE)1, (DSS_HUGE)5, qnum); 
				tmp2 = UnifInt((DSS_HUGE)1, (DSS_HUGE)5, qnum);
				sprintf(param[1], formats[19], tmp1, tmp2);
				tmp1 = UnifInt((DSS_HUGE)1, (DSS_HUGE)5, qnum); 
				tmp2 = UnifInt((DSS_HUGE)1, (DSS_HUGE)5, qnum);
				sprintf(param[2], formats[19], tmp1, tmp2);
				tmp1 = UnifInt((DSS_HUGE)1, (DSS_HUGE)5, qnum); 
				tmp2 = UnifInt((DSS_HUGE)1, (DSS_HUGE)5, qnum);
				sprintf(param[3], formats[19], tmp1, tmp2);
				sprintf(param[4], HUGE_FORMAT, UnifInt((DSS_HUGE)1, (DSS_HUGE)10, qnum));
				sprintf(param[5], HUGE_FORMAT, UnifInt((DSS_HUGE)10, (DSS_HUGE)20, qnum));
				sprintf(param[6], HUGE_FORMAT, UnifInt((DSS_HUGE)20, (DSS_HUGE)30, qnum));
				param[7][0] = '\0';
				break;
			case 20:
				pick_str(&colors, qnum, param[1]);
				tmp_date = UnifInt((DSS_HUGE)93,(DSS_HUGE)97,qnum);
				sprintf(param[2], formats[20], tmp_date);
				pick_str(&nations2, qnum, param[3]);
				param[4][0] = '\0';
				break;
			case 21:
				pick_str(&nations2, qnum, param[1]);
				param[2][0] = '\0';
				break;
			case 22:
				lptr = &ccode[0];
				for (i=0; i <= 7; i++)
				{
					sprintf(param[i+1], "%ld", 10 + *permute(lptr,25, qnum));
					lptr = (long *)NULL;
				}
				param[8][0] = '\0';
				break;
			case 23:
			case 24:
                break;
			default:
				fprintf(stderr, 
					"No variable definitions available for query %d\n", 
                    qnum);
				return;
        }
    }
	
    if (flags & LOG)
	{
        if (lfp == NULL)
		{
            lfp = fopen(lfile, "a");
            OPEN_CHECK(lfp, lfile);
		}
        fprintf(lfp, "%d", qnum);
        for (i=1; i <= 10; i++)
            if (flags & DFLT)
			{
				if (defaults[qnum - 1][i - 1] == NULL)
					break;
				else
					fprintf(lfp, "\t%s", defaults[qnum - 1][i - 1]);
			}
            else
			{
				if (param[i][0] == '\0')
					break;
				else
					fprintf(lfp, "\t%s", param[i]);
			}
			fprintf(lfp, "\n");
	}
    }
    else
	{
        if (flags & DFLT)   
		{
            /* to allow -d to work at all scale factors */
            if (qnum == 11 && vnum == 2)
                fprintf(ofp, "%11.10f", Q11_FRACTION/flt_scale);
            else
                if (defaults[qnum - 1][vnum - 1])
                    fprintf(ofp, "%s", defaults[qnum - 1][vnum - 1]);
                else
					fprintf(stderr, 
					"Bad default request (q: %d, p: %d)\n",
					qnum, vnum);
		}
        else        
		{
            if (param[vnum] && vnum <= MAX_PARAM)
                fprintf(ofp, "%s", param[vnum]);
            else
				fprintf(stderr, "Bad parameter request (q: %d, p: %d)\n",
				qnum, vnum);
		}
	}
    return;
}