void dss_random(DSS_HUGE *tgt, DSS_HUGE lower, DSS_HUGE upper, long stream) { *tgt = UnifInt(lower, upper, stream); Seed[stream].usage += 1; return; }
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); }
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; }
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(®ions, 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(®ions, 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; }
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(®ions, 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(®ions, 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; }