84static char *option[CLO_OPTIONS] = {
99 "Usage: sddssampledist [<input>] [<output>] [-pipe=[in][,out]]\n"
100 " -columns=independentVariable=<name>,{cdf=<CDFName> | df=<DFName>}"
101 "[,output=<name>][,units=<string>][,factor=<value>][,offset=<value>]"
102 "[,datafile=<filename>][,haltonRadix=<primeNumber>[,haltonOffset=<integer>]"
103 "[,randomize[,group=<groupID>]]]\n"
104 " [-columns=...] [-samples=<integer>] [-seed=<integer>] [-verbose]\n"
105 " [-gaussian=columnName=<columnName>[,meanValue=<value>|@<parameter_name>]"
106 "[,sigmaValue=<value>|@<parameter_name>][,units=<string>]]\n"
107 " [-uniform=columnName=<columnName>[,minimumValue=<value>|@<parameter_name>]"
108 "[,maximumValue=<value>|@<parameter_name>][,units=<string>]]\n"
109 " [-poisson=columnName=<columnName>[,meanValue=<value>|@<parameter_name>]"
110 "[,units=<string>]] [-optimalHalton] [-majorOrder=row|column] [-threads=<number>]\n";
114 " -columns Specifies the independent variable and its distribution.\n"
116 " -columns=independentVariable=<name>,{cdf=<CDFName> | df=<DFName>}\n"
117 " [,output=<name>][,units=<string>][,factor=<value>][,offset=<value>]\n"
118 " [,datafile=<filename>][,haltonRadix=<primeNumber>]\n"
119 " [,haltonOffset=<integer>][,randomize[,group=<groupID>]]\n"
121 " Defines the independent variable and its distribution function (CDF or DF).\n"
122 " Additional qualifiers allow for customization of output names, units,\n"
123 " scaling factors, offsets, data sources, Halton sequence parameters,\n"
124 " and randomization groups.\n\n"
125 " -gaussian Samples from a Gaussian distribution.\n"
127 " -gaussian=columnName=<columnName>[,meanValue=<value>|@<parameter_name>]\n"
128 " [,sigmaValue=<value>|@<parameter_name>][,units=<string>]\n"
130 " Generates Gaussian-distributed samples with specified mean and sigma.\n"
131 " Parameters can be directly provided or referenced from input file parameters.\n\n";
134 " -uniform Samples from a Uniform distribution.\n"
136 " -uniform=columnName=<columnName>[,minimumValue=<value>|@<parameter_name>]\n"
137 " [,maximumValue=<value>|@<parameter_name>][,units=<string>]\n"
139 " Generates uniformly distributed samples within specified minimum and maximum values.\n"
140 " Parameters can be directly provided or referenced from input file parameters.\n\n"
141 " -poisson Samples from a Poisson distribution.\n"
143 " -poisson=columnName=<columnName>[,meanValue=<value>|@<parameter_name>]\n"
144 " [,units=<string>]\n"
146 " Generates Poisson-distributed samples with a specified mean.\n"
147 " The mean can be directly provided or referenced from an input file parameter.\n\n"
148 " -samples Specifies the number of samples to generate.\n"
149 " -seed Specifies the seed for the random number generator.\n"
150 " If not provided or non-positive, the seed is derived from the system clock.\n"
151 " -optimalHalton Uses an improved Halton sequence for generating random numbers.\n"
152 " -majorOrder Specifies the output file order as row-major or column-major.\n"
154 " -majorOrder=row|column\n"
155 " -threads Number of datafile-backed distributions to read concurrently.\n"
156 " Sampling and SDDS output operations remain serial. The default is 1.\n"
157 " -verbose Enables verbose output, printing information to stderr during execution.\n\n"
158 "Program by Michael Borland. (" __DATE__
" " __TIME__
", SVN revision: " SVN_VERSION
")\n";
160#define SEQ_DATAFILE 0x0001UL
161#define SEQ_INDEPNAME 0x0002UL
162#define SEQ_CDFNAME 0x0004UL
163#define SEQ_DFNAME 0x0008UL
164#define SEQ_OUTPUTNAME 0x0010UL
165#define SEQ_HALTONRADIX 0x0020UL
166#define SEQ_RANDOMIZE 0x0040UL
167#define SEQ_RANDOMGROUP 0x0080UL
168#define SEQ_UNITSGIVEN 0x0100UL
169#define SEQ_HALTONOFFSET 0x0200UL
170#define SEQ_DIRECT_GAUSSIAN 0x0400UL
171#define SEQ_DIRECT_UNIFORM 0x0800UL
172#define SEQ_DIRECT_POISSON 0x1000UL
177 char *dataFileName, *indepName, *CDFName, *DFName, *outputName, *units, *meanPar, *sigmaPar, *minPar, *maxPar;
179 int32_t haltonRadix, randomizationGroup, haltonOffset;
180 double factor, offset, mean, min, max, sigma;
189long CreatePoissonDistributionTable(
double **x,
double **pos_CDF,
double mean);
191int main(
int argc,
char **argv) {
193 char *input, *output, *meanPar, *sigmaPar, *maxPar, *minPar;
194 long i, mainInputOpened, haltonID = 0, requireInput = 0;
195 unsigned long pipeFlags, majorOrderFlag;
196 SCANNED_ARG *scanned;
198 long randomNumberSeed = 0;
200 long samples, seqRequests, randomizationGroups = 0;
202 double *sample, *IVValue, *CDFValue;
203 char msgBuffer[1000];
205 long verbose, optimalHalton = 0;
206 short columnMajorOrder = -1;
208 int *dataFilePageStatus = NULL;
211 argc =
scanargs(&scanned, argc, argv);
213 fprintf(stderr,
"%s%s%s\n", USAGE1, USAGE2, USAGE3);
218 output = input = NULL;
220 samples = values = 0;
221 sample = IVValue = CDFValue = NULL;
223 maxPar = minPar = meanPar = sigmaPar = NULL;
225 for (iArg = 1; iArg < argc; iArg++) {
226 if (scanned[iArg].arg_type == OPTION) {
228 switch (
match_string(scanned[iArg].list[0], option, CLO_OPTIONS, 0)) {
229 case CLO_MAJOR_ORDER:
231 scanned[iArg].n_items--;
232 if (scanned[iArg].n_items > 0 &&
233 (!
scanItemList(&majorOrderFlag, scanned[iArg].list + 1, &scanned[iArg].n_items, 0,
234 "row", -1, NULL, 0, SDDS_ROW_MAJOR_ORDER,
235 "column", -1, NULL, 0, SDDS_COLUMN_MAJOR_ORDER, NULL)))
236 SDDS_Bomb(
"invalid -majorOrder syntax/values");
237 if (majorOrderFlag & SDDS_COLUMN_MAJOR_ORDER)
238 columnMajorOrder = 1;
239 else if (majorOrderFlag & SDDS_ROW_MAJOR_ORDER)
240 columnMajorOrder = 0;
243 if (scanned[iArg].n_items < 3)
245 if (!(seqRequest =
SDDS_Realloc(seqRequest,
sizeof(*seqRequest) * (seqRequests + 1))))
247 scanned[iArg].n_items -= 1;
248 memset(seqRequest + seqRequests, 0,
sizeof(*seqRequest));
250 seqRequest[seqRequests].randomizationGroup = -1;
251 seqRequest[seqRequests].factor = 1;
252 seqRequest[seqRequests].offset = 0;
254 scanned[iArg].list + 1, &scanned[iArg].n_items, 0,
255 "datafile",
SDDS_STRING, &seqRequest[seqRequests].dataFileName, 1, SEQ_DATAFILE,
256 "independentvariable",
SDDS_STRING, &seqRequest[seqRequests].indepName, 1, SEQ_INDEPNAME,
257 "cdf",
SDDS_STRING, &seqRequest[seqRequests].CDFName, 1, SEQ_CDFNAME,
258 "df",
SDDS_STRING, &seqRequest[seqRequests].DFName, 1, SEQ_DFNAME,
259 "output",
SDDS_STRING, &seqRequest[seqRequests].outputName, 1, SEQ_OUTPUTNAME,
260 "units",
SDDS_STRING, &seqRequest[seqRequests].units, 1, SEQ_UNITSGIVEN,
261 "haltonradix",
SDDS_LONG, &seqRequest[seqRequests].haltonRadix, 1, SEQ_HALTONRADIX,
262 "haltonoffset",
SDDS_LONG, &seqRequest[seqRequests].haltonOffset, 1, SEQ_HALTONOFFSET,
263 "randomize", -1, NULL, 0, SEQ_RANDOMIZE,
264 "group",
SDDS_LONG, &seqRequest[seqRequests].randomizationGroup, 1, SEQ_RANDOMGROUP,
265 "factor",
SDDS_DOUBLE, &seqRequest[seqRequests].factor, 1, 0,
266 "offset",
SDDS_DOUBLE, &seqRequest[seqRequests].offset, 1, 0, NULL) ||
267 bitsSet(seqRequest[seqRequests].flags & (SEQ_INDEPNAME + SEQ_CDFNAME + SEQ_DFNAME)) != 2)
269 if (seqRequest[seqRequests].flags & SEQ_RANDOMGROUP && seqRequest[seqRequests].randomizationGroup <= 0)
270 SDDS_Bomb(
"use a positive integer for the randomization group ID");
271 if (seqRequest[seqRequests].flags & SEQ_CDFNAME && seqRequest[seqRequests].flags & SEQ_DFNAME)
272 SDDS_Bomb(
"give df or cdf for -columns, not both");
273 if (seqRequest[seqRequests].flags & SEQ_HALTONRADIX && !
is_prime(seqRequest[seqRequests].haltonRadix))
274 SDDS_Bomb(
"halton radix must be a prime number");
276 scanned[iArg].n_items += 1;
279 if (scanned[iArg].n_items < 2)
281 if (!(seqRequest =
SDDS_Realloc(seqRequest,
sizeof(*seqRequest) * (seqRequests + 1))))
283 memset(seqRequest + seqRequests, 0,
sizeof(*seqRequest));
284 scanned[iArg].n_items -= 1;
285 seqRequest[seqRequests].randomizationGroup = -1;
286 seqRequest[seqRequests].mean = 0;
287 seqRequest[seqRequests].sigma = 1;
289 scanned[iArg].list + 1, &scanned[iArg].n_items, 0,
290 "columnName",
SDDS_STRING, &seqRequest[seqRequests].outputName, 1, SEQ_OUTPUTNAME,
293 "units",
SDDS_STRING, &seqRequest[seqRequests].units, 1, SEQ_UNITSGIVEN, NULL))
295 seqRequest[seqRequests].flags |= SEQ_DIRECT_GAUSSIAN;
296 if (!(seqRequest[seqRequests].flags & SEQ_OUTPUTNAME) || !(seqRequest[seqRequests].outputName))
297 SDDS_Bomb(
"columnName is not provided for gaussian distribution/");
301 else if (!
get_double(&seqRequest[seqRequests].mean, meanPar))
302 SDDS_Bomb(
"Invalid value given for mean value of -gaussian distribution.");
309 else if (!
get_double(&seqRequest[seqRequests].sigma, sigmaPar))
310 SDDS_Bomb(
"Invalid value given for sigma value of -gaussian distribution.");
315 scanned[iArg].n_items += 1;
318 if (scanned[iArg].n_items < 2)
320 if (!(seqRequest =
SDDS_Realloc(seqRequest,
sizeof(*seqRequest) * (seqRequests + 1))))
322 memset(seqRequest + seqRequests, 0,
sizeof(*seqRequest));
323 scanned[iArg].n_items -= 1;
324 memset(seqRequest + seqRequests, 0,
sizeof(*seqRequest));
325 seqRequest[seqRequests].randomizationGroup = -1;
326 seqRequest[seqRequests].min = 0;
327 seqRequest[seqRequests].max = 1;
329 scanned[iArg].list + 1, &scanned[iArg].n_items, 0,
330 "columnName",
SDDS_STRING, &seqRequest[seqRequests].outputName, 1, SEQ_OUTPUTNAME,
333 "units",
SDDS_STRING, &seqRequest[seqRequests].units, 1, SEQ_UNITSGIVEN, NULL))
335 seqRequest[seqRequests].flags |= SEQ_DIRECT_UNIFORM;
336 if (!(seqRequest[seqRequests].flags & SEQ_OUTPUTNAME) ||
337 !(seqRequest[seqRequests].outputName))
338 SDDS_Bomb(
"columnName is not provided for uniform distribution/");
342 else if (!
get_double(&seqRequest[seqRequests].min, minPar))
343 SDDS_Bomb(
"Invalid value given for minimum value of -uniform distribution.");
350 else if (!
get_double(&seqRequest[seqRequests].max, maxPar))
351 SDDS_Bomb(
"Invalid value given for maximum value of -uniform distribution.");
356 scanned[iArg].n_items += 1;
359 if (scanned[iArg].n_items < 2)
361 if (!(seqRequest =
SDDS_Realloc(seqRequest,
sizeof(*seqRequest) * (seqRequests + 1))))
363 memset(seqRequest + seqRequests, 0,
sizeof(*seqRequest));
364 scanned[iArg].n_items -= 1;
365 memset(seqRequest + seqRequests, 0,
sizeof(*seqRequest));
366 seqRequest[seqRequests].randomizationGroup = -1;
367 seqRequest[seqRequests].mean = 1;
369 scanned[iArg].list + 1, &scanned[iArg].n_items, 0,
370 "columnName",
SDDS_STRING, &seqRequest[seqRequests].outputName, 1, SEQ_OUTPUTNAME,
372 "units",
SDDS_STRING, &seqRequest[seqRequests].units, 1, SEQ_UNITSGIVEN, NULL))
374 seqRequest[seqRequests].flags |= SEQ_DIRECT_POISSON;
375 if (!(seqRequest[seqRequests].flags & SEQ_OUTPUTNAME) || !(seqRequest[seqRequests].outputName))
376 SDDS_Bomb(
"columnName is not provided for poisson distribution/");
380 else if (!
get_double(&seqRequest[seqRequests].mean, meanPar))
381 SDDS_Bomb(
"Invalid value given for mean value of -poisson distribution.");
386 scanned[iArg].n_items += 1;
389 if (scanned[iArg].n_items != 2 ||
390 sscanf(scanned[iArg].list[1],
"%ld", &samples) != 1 ||
395 if (scanned[iArg].n_items != 2 ||
396 sscanf(scanned[iArg].list[1],
"%ld", &randomNumberSeed) != 1)
400 if (!
processPipeOption(scanned[iArg].list + 1, scanned[iArg].n_items - 1, &pipeFlags))
406 case CLO_OPTIMAL_HALTON:
410 if (scanned[iArg].n_items != 2 ||
411 sscanf(scanned[iArg].list[1],
"%d", &threads) != 1 ||
416 fprintf(stderr,
"error: unknown/ambiguous option: %s\n", scanned[iArg].list[0]);
422 input = scanned[iArg].list[0];
424 output = scanned[iArg].list[0];
431 SDDS_Bomb(
"give one or more -columns options");
435 for (i = 0; i < seqRequests; i++) {
436 if (!(seqRequest[i].flags & (SEQ_DATAFILE | SEQ_DIRECT_GAUSSIAN | SEQ_DIRECT_UNIFORM | SEQ_DIRECT_POISSON)))
439 if (i == seqRequests) {
445 pipeFlags |= USE_STDIN;
446 if (input && !output) {
449 pipeFlags |= USE_STDIN;
451 sprintf(msgBuffer,
"%s exists already (sddssampledist)", output);
463 fprintf(stderr,
"Initialized output file %s\n", output);
466 for (i = mainInputOpened = 0; i < seqRequests; i++) {
467 if (seqRequest[i].flags & SEQ_DIRECT_GAUSSIAN) {
468 if (seqRequest[i].meanPar || seqRequest[i].sigmaPar) {
469 if (!mainInputOpened) {
477 if ((seqRequest[i].meanPar &&
479 (seqRequest[i].sigmaPar &&
487 }
else if (seqRequest[i].flags & SEQ_DIRECT_UNIFORM) {
488 if (seqRequest[i].minPar || seqRequest[i].maxPar) {
489 if (!mainInputOpened) {
497 if ((seqRequest[i].minPar &&
499 (seqRequest[i].maxPar &&
507 }
else if (seqRequest[i].flags & SEQ_DIRECT_POISSON) {
508 if (seqRequest[i].meanPar) {
509 if (!mainInputOpened) {
525 if (seqRequest[i].flags & SEQ_RANDOMIZE) {
528 if (seqRequest[i].flags & SEQ_RANDOMGROUP) {
529 newGroupID = seqRequest[i].randomizationGroup;
530 for (j = 0; j < randomizationGroups; j++)
531 if (randomizationData[j].group == newGroupID) {
536 seqRequest[i].randomizationGroup = newGroupID = -(i + 1);
538 if (newGroupID != 0) {
539 if (!(randomizationData =
SDDS_Realloc(randomizationData,
sizeof(*randomizationData) * (randomizationGroups + 1))))
541 randomizationData[randomizationGroups].group = newGroupID;
542 randomizationData[randomizationGroups].order = NULL;
543 randomizationGroups++;
546 if (seqRequest[i].flags & SEQ_DATAFILE) {
549 SDDSptr = &seqRequest[i].SDDSin;
551 if (!mainInputOpened) {
561 ((seqRequest[i].flags & SEQ_CDFNAME) &&
563 ((seqRequest[i].flags & SEQ_DFNAME) &&
571 if (seqRequest[i].flags & SEQ_UNITSGIVEN &&
577 fprintf(stderr,
"Initialized input files\n");
579 if (columnMajorOrder != -1)
580 SDDSout.layout.data_mode.column_major = columnMajorOrder;
582 SDDSout.layout.data_mode.column_major = 0;
587 if (randomNumberSeed <= 0) {
588 randomNumberSeed = (long)time((time_t *)NULL);
589 randomNumberSeed = 2 * (randomNumberSeed / 2) + 1;
590#if defined(_WIN32) || defined(__APPLE__)
598 if (!(sample = calloc(samples,
sizeof(*sample))))
600 if (!(dataFilePageStatus = calloc(seqRequests,
sizeof(*dataFilePageStatus))))
604 fprintf(stderr,
"Beginning page loop\n");
607 for (i = 0; i < seqRequests; i++)
608 dataFilePageStatus[i] = 1;
609#pragma omp parallel for if (threads > 1 && seqRequests > 1) num_threads(threads) schedule(dynamic)
610 for (i = 0; i < seqRequests; i++) {
611 if (seqRequest[i].flags & SEQ_DATAFILE)
612 dataFilePageStatus[i] =
SDDS_ReadPage(&seqRequest[i].SDDSin);
614 for (i = 0; i < seqRequests; i++)
615 if ((seqRequest[i].flags & SEQ_DATAFILE) && dataFilePageStatus[i] <= 0)
617 if (i != seqRequests)
622 fprintf(stderr,
"Defining randomization tables\n");
624 for (i = 0; i < randomizationGroups; i++) {
625 if (!(randomizationData[i].order =
SDDS_Malloc(
sizeof(*randomizationData[i].order) * samples)))
627 for (j = 0; j < samples; j++)
628 randomizationData[i].order[j] = j;
629 randomizeOrder((
char *)randomizationData[i].order,
sizeof(*randomizationData[i].order), samples, 0,
random_1);
632 fprintf(stderr,
"Beginning loop over sequence requests\n");
633 for (i = 0; i < seqRequests; i++) {
635 fprintf(stderr,
"Processing sequence request %ld\n", i);
636 if (seqRequest[i].flags & SEQ_DIRECT_GAUSSIAN) {
637 if ((seqRequest[i].meanPar &&
639 (seqRequest[i].sigmaPar &&
642 for (j = 0; j < samples; j++)
644 }
else if (seqRequest[i].flags & SEQ_DIRECT_UNIFORM) {
645 if ((seqRequest[i].minPar &&
647 (seqRequest[i].maxPar &&
650 for (j = 0; j < samples; j++)
651 sample[j] = seqRequest[i].min + (seqRequest[i].max - seqRequest[i].min) *
random_1(1);
652 }
else if (seqRequest[i].flags & SEQ_DIRECT_POISSON) {
653 double *pos_x, *pos_cdf, CDF;
654 long pos_points, code;
655 pos_x = pos_cdf = NULL;
656 if ((seqRequest[i].meanPar &&
659 pos_points = CreatePoissonDistributionTable(&pos_x, &pos_cdf, seqRequest[i].mean);
661 for (j = 0; j < samples; j++) {
663 sample[j] = (int)(
interp(pos_x, pos_cdf, pos_points, CDF, 0, 1, &code));
669 if (input && !(seqRequest[i].flags & SEQ_DATAFILE))
672 SDDSptr = &seqRequest[i].SDDSin;
675 (seqRequest[i].flags & SEQ_CDFNAME &&
677 (seqRequest[i].flags & SEQ_DFNAME &&
681 sprintf(msgBuffer,
"empty page for file %s\n",
682 (seqRequest[i].flags & SEQ_DATAFILE) ? seqRequest[i].dataFileName : input);
686 fprintf(stderr,
"Checking and converting CDF/DF values\n");
688 for (j = 1; j < values; j++) {
689 if (IVValue[j - 1] > IVValue[j]) {
690 sprintf(msgBuffer,
"random variate values not monotonically increasing for %s",
691 (seqRequest[i].flags & SEQ_DATAFILE) ? seqRequest[i].dataFileName : input);
694 if (seqRequest[i].flags & SEQ_DFNAME)
696 CDFValue[j] += CDFValue[j - 1];
697 if (CDFValue[j] < CDFValue[j - 1]) {
698 sprintf(msgBuffer,
"CDF values decreasing for %s",
699 (seqRequest[i].flags & SEQ_DATAFILE) ? seqRequest[i].dataFileName : input);
704 fprintf(stderr,
"Normalizing CDF\n");
706 if (CDFValue[values - 1] <= 0) {
707 sprintf(msgBuffer,
"CDF not valid for %s\n", seqRequest[i].dataFileName);
710 for (j = 0; j < values; j++)
711 CDFValue[j] /= CDFValue[values - 1];
712 if (seqRequest[i].flags & SEQ_HALTONRADIX) {
714 fprintf(stderr,
"Starting halton sequence, offset=%" PRId32
"\n", seqRequest[i].haltonOffset);
719 while (seqRequest[i].haltonOffset-- > 0) {
727 fprintf(stderr,
"Generating samples\n");
728 for (j = 0; j < samples; j++) {
732 if (seqRequest[i].flags & SEQ_HALTONRADIX) {
739 if (CDF <= CDFValue[values - 1] && CDF >= CDFValue[0])
742 sample[j] = seqRequest[i].factor *
interp(IVValue, CDFValue, values, CDF, 0, 1, &code) + seqRequest[i].offset;
744 if (seqRequest[i].flags & SEQ_RANDOMIZE) {
748 fprintf(stderr,
"Randomizing order of values\n");
749 if (!(sample1 = malloc(
sizeof(*sample1) * samples)))
751 for (l = 0; l < randomizationGroups; l++)
752 if (randomizationData[l].group == seqRequest[i].randomizationGroup)
754 if (l == randomizationGroups)
755 SDDS_Bomb(
"problem with construction of randomization groups!");
756 for (k = 0; k < samples; k++)
757 sample1[k] = sample[randomizationData[l].order[k]];
765 fprintf(stderr,
"Setting SDDS column values\n");
767 seqRequest[i].outputName ? seqRequest[i].outputName : seqRequest[i].indepName))
771 fprintf(stderr,
"Writing data page\n");
778 fprintf(stderr,
"Exited read loop\n");
780 free(dataFilePageStatus);
783 for (i = 0; i < seqRequests; i++) {
784 if (seqRequest[i].dataFileName)
785 free(seqRequest[i].dataFileName);
786 if (seqRequest[i].indepName)
787 free(seqRequest[i].indepName);
788 if (seqRequest[i].outputName)
789 free(seqRequest[i].outputName);
790 if (seqRequest[i].DFName)
791 free(seqRequest[i].DFName);
792 if (seqRequest[i].CDFName)
793 free(seqRequest[i].CDFName);
794 if (seqRequest[i].units)
795 free(seqRequest[i].units);
796 if (seqRequest[i].meanPar)
797 free(seqRequest[i].meanPar);
798 if (seqRequest[i].sigmaPar)
799 free(seqRequest[i].sigmaPar);
800 if (seqRequest[i].minPar)
801 free(seqRequest[i].minPar);
802 if (seqRequest[i].maxPar)
803 free(seqRequest[i].maxPar);
804 if (seqRequest[i].flags & SEQ_DATAFILE && !
SDDS_Terminate(&(seqRequest[i].SDDSin)))
808 for (i = 0; i < randomizationGroups; i++)
809 free(randomizationData[i].order);
810 if (randomizationData)
811 free(randomizationData);
818long CreatePoissonDistributionTable(
double **x,
double **pos_CDF,
double mean) {
819 long i, npoints = 20, count = 0;
823 *x = *pos_CDF = NULL;
824 if (!(*x = malloc(
sizeof(**x) * npoints)) ||
825 !(pos = malloc(
sizeof(*pos) * npoints)) ||
826 !(*pos_CDF = malloc(
sizeof(**pos_CDF) * npoints)))
830 if (count + 2 >= npoints) {
833 *pos_CDF =
SDDS_Realloc(*pos_CDF,
sizeof(**pos_CDF) * npoints);
840 (*pos_CDF)[count] = pos[i];
843 pos[i] = pos[i - 1] * mean / i;
844 (*pos_CDF)[count] = (*pos_CDF)[count - 1];
845 (*pos_CDF)[count + 1] = (*pos_CDF)[count - 1] + pos[i];
847 if (1.0 - (*pos_CDF)[count + 1] <= 1.0e-15)
SDDS (Self Describing Data Set) Data Types Definitions and Function Prototypes.
int32_t SDDS_CopyParameters(SDDS_DATASET *SDDS_target, SDDS_DATASET *SDDS_source)
int32_t SDDS_StartPage(SDDS_DATASET *SDDS_dataset, int64_t expected_n_rows)
int32_t SDDS_SetColumnFromDoubles(SDDS_DATASET *SDDS_dataset, int32_t mode, double *data, int64_t rows,...)
Sets the values for a single data column using double-precision floating-point numbers.
int32_t SDDS_ChangeColumnInformation(SDDS_DATASET *SDDS_dataset, char *field_name, void *memory, int32_t mode,...)
Modifies a specific field in a column definition within the SDDS dataset.
int32_t SDDS_InitializeOutput(SDDS_DATASET *SDDS_dataset, int32_t data_mode, int32_t lines_per_row, const char *description, const char *contents, const char *filename)
Initializes the SDDS output dataset.
int32_t SDDS_DefineSimpleColumn(SDDS_DATASET *SDDS_dataset, const char *name, const char *unit, int32_t type)
Defines a simple data column within the SDDS dataset.
int32_t SDDS_WritePage(SDDS_DATASET *SDDS_dataset)
Writes the current data table to the output file.
int32_t SDDS_WriteLayout(SDDS_DATASET *SDDS_dataset)
Writes the SDDS layout header to the output file.
int32_t SDDS_TransferColumnDefinition(SDDS_DATASET *target, SDDS_DATASET *source, char *name, char *newName)
Transfers a column definition from a source dataset to a target dataset.
int32_t SDDS_TransferAllParameterDefinitions(SDDS_DATASET *SDDS_target, SDDS_DATASET *SDDS_source, uint32_t mode)
Transfers all parameter definitions from a source dataset to a target dataset.
int32_t SDDS_CheckColumn(SDDS_DATASET *SDDS_dataset, char *name, char *units, int32_t type, FILE *fp_message)
Checks if a column exists in the SDDS dataset with the specified name, units, and type.
void SDDS_PrintErrors(FILE *fp, int32_t mode)
Prints recorded error messages to a specified file stream.
void * SDDS_Malloc(size_t size)
Allocates memory of a specified size.
void SDDS_RegisterProgramName(const char *name)
Registers the executable program name for use in error messages.
void SDDS_Bomb(char *message)
Terminates the program after printing an error message and recorded errors.
int32_t SDDS_CheckParameter(SDDS_DATASET *SDDS_dataset, char *name, char *units, int32_t type, FILE *fp_message)
Checks if a parameter exists in the SDDS dataset with the specified name, units, and type.
int32_t SDDS_CopyString(char **target, const char *source)
Copies a source string to a target string with memory allocation.
void * SDDS_Realloc(void *old_ptr, size_t new_size)
Reallocates memory to a new size.
#define SDDS_STRING
Identifier for the string data type.
#define SDDS_LONG
Identifier for the signed 32-bit integer data type.
#define SDDS_ANY_NUMERIC_TYPE
Special identifier used by SDDS_Check*() routines to accept any numeric type.
#define SDDS_DOUBLE
Identifier for the double data type.
long bitsSet(unsigned long data)
Counts the number of set bits (1s) in the given data.
int get_double(double *dptr, char *s)
Parses a double value from the given string.
double random_1(long iseed)
Generate a uniform random double in [0,1] using a custom seed initialization.
long randomizeOrder(char *ptr, long size, long length, long iseed, double(*urandom)(long iseed1))
Randomize the order of an array of elements.
double gauss_rn_lim(double mean, double sigma, double limit_in_sigmas, double(*urandom)(long iseed))
Generate a Gaussian-distributed random number with specified mean, sigma, and optional cutoff.
int64_t is_prime(int64_t number)
Determine if a number is prime.
long fexists(const char *filename)
Checks if a file exists.
int32_t startModHaltonSequence(int32_t *radix, double tiny)
Start a modified Halton sequence.
double nextModHaltonSequencePoint(long ID)
Retrieve the next point from the modified Halton sequence.
int32_t startHaltonSequence(int32_t *radix, double value)
Initialize and start a new Halton sequence.
double nextHaltonSequencePoint(long ID)
Get the next point in a Halton sequence.
double interp(double *f, double *x, long n, double xo, long warnings, long order, long *returnCode)
Performs simple linear interpolation of data.
long match_string(char *string, char **option, long n_options, long mode)
Matches a given string against an array of option strings based on specified modes.
int scanargs(SCANNED_ARG **scanned, int argc, char **argv)
long processPipeOption(char **item, long items, unsigned long *flags)
void processFilenames(char *programName, char **input, char **output, unsigned long pipeFlags, long noWarnings, long *tmpOutputUsed)
void free_scanargs(SCANNED_ARG **scanned, int argc)
long scanItemList(unsigned long *flags, char **item, long *items, unsigned long mode,...)
Scans a list of items and assigns values based on provided keywords and types.
int wild_match(char *string, char *template)
Determine whether one string is a wildcard match for another.