81static char *option[CLO_OPTIONS] = {
95 "Usage: sddssampledist [<input>] [<output>] [-pipe=[in][,out]]\n"
96 " -columns=independentVariable=<name>,{cdf=<CDFName> | df=<DFName>}"
97 "[,output=<name>][,units=<string>][,factor=<value>][,offset=<value>]"
98 "[,datafile=<filename>][,haltonRadix=<primeNumber>[,haltonOffset=<integer>]"
99 "[,randomize[,group=<groupID>]]]\n"
100 " [-columns=...] [-samples=<integer>] [-seed=<integer>] [-verbose]\n"
101 " [-gaussian=columnName=<columnName>[,meanValue=<value>|@<parameter_name>]"
102 "[,sigmaValue=<value>|@<parameter_name>][,units=<string>]]\n"
103 " [-uniform=columnName=<columnName>[,minimumValue=<value>|@<parameter_name>]"
104 "[,maximumValue=<value>|@<parameter_name>][,units=<string>]]\n"
105 " [-poisson=columnName=<columnName>[,meanValue=<value>|@<parameter_name>]"
106 "[,units=<string>]] [-optimalHalton] [-majorOrder=row|column]\n";
110 " -columns Specifies the independent variable and its distribution.\n"
112 " -columns=independentVariable=<name>,{cdf=<CDFName> | df=<DFName>}\n"
113 " [,output=<name>][,units=<string>][,factor=<value>][,offset=<value>]\n"
114 " [,datafile=<filename>][,haltonRadix=<primeNumber>]\n"
115 " [,haltonOffset=<integer>][,randomize[,group=<groupID>]]\n"
117 " Defines the independent variable and its distribution function (CDF or DF).\n"
118 " Additional qualifiers allow for customization of output names, units,\n"
119 " scaling factors, offsets, data sources, Halton sequence parameters,\n"
120 " and randomization groups.\n\n"
121 " -gaussian Samples from a Gaussian distribution.\n"
123 " -gaussian=columnName=<columnName>[,meanValue=<value>|@<parameter_name>]\n"
124 " [,sigmaValue=<value>|@<parameter_name>][,units=<string>]\n"
126 " Generates Gaussian-distributed samples with specified mean and sigma.\n"
127 " Parameters can be directly provided or referenced from input file parameters.\n\n";
130 " -uniform Samples from a Uniform distribution.\n"
132 " -uniform=columnName=<columnName>[,minimumValue=<value>|@<parameter_name>]\n"
133 " [,maximumValue=<value>|@<parameter_name>][,units=<string>]\n"
135 " Generates uniformly distributed samples within specified minimum and maximum values.\n"
136 " Parameters can be directly provided or referenced from input file parameters.\n\n"
137 " -poisson Samples from a Poisson distribution.\n"
139 " -poisson=columnName=<columnName>[,meanValue=<value>|@<parameter_name>]\n"
140 " [,units=<string>]\n"
142 " Generates Poisson-distributed samples with a specified mean.\n"
143 " The mean can be directly provided or referenced from an input file parameter.\n\n"
144 " -samples Specifies the number of samples to generate.\n"
145 " -seed Specifies the seed for the random number generator.\n"
146 " If not provided or non-positive, the seed is derived from the system clock.\n"
147 " -optimalHalton Uses an improved Halton sequence for generating random numbers.\n"
148 " -majorOrder Specifies the output file order as row-major or column-major.\n"
150 " -majorOrder=row|column\n"
151 " -verbose Enables verbose output, printing information to stderr during execution.\n\n"
152 "Program by Michael Borland. (" __DATE__
" " __TIME__
", SVN revision: " SVN_VERSION
")\n";
154#define SEQ_DATAFILE 0x0001UL
155#define SEQ_INDEPNAME 0x0002UL
156#define SEQ_CDFNAME 0x0004UL
157#define SEQ_DFNAME 0x0008UL
158#define SEQ_OUTPUTNAME 0x0010UL
159#define SEQ_HALTONRADIX 0x0020UL
160#define SEQ_RANDOMIZE 0x0040UL
161#define SEQ_RANDOMGROUP 0x0080UL
162#define SEQ_UNITSGIVEN 0x0100UL
163#define SEQ_HALTONOFFSET 0x0200UL
164#define SEQ_DIRECT_GAUSSIAN 0x0400UL
165#define SEQ_DIRECT_UNIFORM 0x0800UL
166#define SEQ_DIRECT_POISSON 0x1000UL
171 char *dataFileName, *indepName, *CDFName, *DFName, *outputName, *units, *meanPar, *sigmaPar, *minPar, *maxPar;
173 int32_t haltonRadix, randomizationGroup, haltonOffset;
174 double factor, offset, mean, min, max, sigma;
183long CreatePoissonDistributionTable(
double **x,
double **pos_CDF,
double mean);
185int main(
int argc,
char **argv) {
187 char *input, *output, *meanPar, *sigmaPar, *maxPar, *minPar;
188 long i, mainInputOpened, haltonID = 0, requireInput = 0;
189 unsigned long pipeFlags, majorOrderFlag;
190 SCANNED_ARG *scanned;
192 long randomNumberSeed = 0;
194 long samples, seqRequests, randomizationGroups = 0;
196 double *sample, *IVValue, *CDFValue;
197 char msgBuffer[1000];
199 long verbose, optimalHalton = 0;
200 short columnMajorOrder = -1;
203 argc =
scanargs(&scanned, argc, argv);
205 fprintf(stderr,
"%s%s%s\n", USAGE1, USAGE2, USAGE3);
210 output = input = NULL;
212 samples = values = 0;
213 sample = IVValue = CDFValue = NULL;
215 maxPar = minPar = meanPar = sigmaPar = NULL;
217 for (iArg = 1; iArg < argc; iArg++) {
218 if (scanned[iArg].arg_type == OPTION) {
220 switch (
match_string(scanned[iArg].list[0], option, CLO_OPTIONS, 0)) {
221 case CLO_MAJOR_ORDER:
223 scanned[iArg].n_items--;
224 if (scanned[iArg].n_items > 0 &&
225 (!
scanItemList(&majorOrderFlag, scanned[iArg].list + 1, &scanned[iArg].n_items, 0,
226 "row", -1, NULL, 0, SDDS_ROW_MAJOR_ORDER,
227 "column", -1, NULL, 0, SDDS_COLUMN_MAJOR_ORDER, NULL)))
228 SDDS_Bomb(
"invalid -majorOrder syntax/values");
229 if (majorOrderFlag & SDDS_COLUMN_MAJOR_ORDER)
230 columnMajorOrder = 1;
231 else if (majorOrderFlag & SDDS_ROW_MAJOR_ORDER)
232 columnMajorOrder = 0;
235 if (scanned[iArg].n_items < 3)
237 if (!(seqRequest =
SDDS_Realloc(seqRequest,
sizeof(*seqRequest) * (seqRequests + 1))))
239 scanned[iArg].n_items -= 1;
240 memset(seqRequest + seqRequests, 0,
sizeof(*seqRequest));
242 seqRequest[seqRequests].randomizationGroup = -1;
243 seqRequest[seqRequests].factor = 1;
244 seqRequest[seqRequests].offset = 0;
246 scanned[iArg].list + 1, &scanned[iArg].n_items, 0,
247 "datafile",
SDDS_STRING, &seqRequest[seqRequests].dataFileName, 1, SEQ_DATAFILE,
248 "independentvariable",
SDDS_STRING, &seqRequest[seqRequests].indepName, 1, SEQ_INDEPNAME,
249 "cdf",
SDDS_STRING, &seqRequest[seqRequests].CDFName, 1, SEQ_CDFNAME,
250 "df",
SDDS_STRING, &seqRequest[seqRequests].DFName, 1, SEQ_DFNAME,
251 "output",
SDDS_STRING, &seqRequest[seqRequests].outputName, 1, SEQ_OUTPUTNAME,
252 "units",
SDDS_STRING, &seqRequest[seqRequests].units, 1, SEQ_UNITSGIVEN,
253 "haltonradix",
SDDS_LONG, &seqRequest[seqRequests].haltonRadix, 1, SEQ_HALTONRADIX,
254 "haltonoffset",
SDDS_LONG, &seqRequest[seqRequests].haltonOffset, 1, SEQ_HALTONOFFSET,
255 "randomize", -1, NULL, 0, SEQ_RANDOMIZE,
256 "group",
SDDS_LONG, &seqRequest[seqRequests].randomizationGroup, 1, SEQ_RANDOMGROUP,
257 "factor",
SDDS_DOUBLE, &seqRequest[seqRequests].factor, 1, 0,
258 "offset",
SDDS_DOUBLE, &seqRequest[seqRequests].offset, 1, 0, NULL) ||
259 bitsSet(seqRequest[seqRequests].flags & (SEQ_INDEPNAME + SEQ_CDFNAME + SEQ_DFNAME)) != 2)
261 if (seqRequest[seqRequests].flags & SEQ_RANDOMGROUP && seqRequest[seqRequests].randomizationGroup <= 0)
262 SDDS_Bomb(
"use a positive integer for the randomization group ID");
263 if (seqRequest[seqRequests].flags & SEQ_CDFNAME && seqRequest[seqRequests].flags & SEQ_DFNAME)
264 SDDS_Bomb(
"give df or cdf for -columns, not both");
265 if (seqRequest[seqRequests].flags & SEQ_HALTONRADIX && !
is_prime(seqRequest[seqRequests].haltonRadix))
266 SDDS_Bomb(
"halton radix must be a prime number");
268 scanned[iArg].n_items += 1;
271 if (scanned[iArg].n_items < 2)
273 if (!(seqRequest =
SDDS_Realloc(seqRequest,
sizeof(*seqRequest) * (seqRequests + 1))))
275 memset(seqRequest + seqRequests, 0,
sizeof(*seqRequest));
276 scanned[iArg].n_items -= 1;
277 seqRequest[seqRequests].randomizationGroup = -1;
278 seqRequest[seqRequests].mean = 0;
279 seqRequest[seqRequests].sigma = 1;
281 scanned[iArg].list + 1, &scanned[iArg].n_items, 0,
282 "columnName",
SDDS_STRING, &seqRequest[seqRequests].outputName, 1, SEQ_OUTPUTNAME,
285 "units",
SDDS_STRING, &seqRequest[seqRequests].units, 1, SEQ_UNITSGIVEN, NULL))
287 seqRequest[seqRequests].flags |= SEQ_DIRECT_GAUSSIAN;
288 if (!(seqRequest[seqRequests].flags & SEQ_OUTPUTNAME) || !(seqRequest[seqRequests].outputName))
289 SDDS_Bomb(
"columnName is not provided for gaussian distribution/");
293 else if (!
get_double(&seqRequest[seqRequests].mean, meanPar))
294 SDDS_Bomb(
"Invalid value given for mean value of -gaussian distribution.");
301 else if (!
get_double(&seqRequest[seqRequests].sigma, sigmaPar))
302 SDDS_Bomb(
"Invalid value given for sigma value of -gaussian distribution.");
307 scanned[iArg].n_items += 1;
310 if (scanned[iArg].n_items < 2)
312 if (!(seqRequest =
SDDS_Realloc(seqRequest,
sizeof(*seqRequest) * (seqRequests + 1))))
314 memset(seqRequest + seqRequests, 0,
sizeof(*seqRequest));
315 scanned[iArg].n_items -= 1;
316 memset(seqRequest + seqRequests, 0,
sizeof(*seqRequest));
317 seqRequest[seqRequests].randomizationGroup = -1;
318 seqRequest[seqRequests].min = 0;
319 seqRequest[seqRequests].max = 1;
321 scanned[iArg].list + 1, &scanned[iArg].n_items, 0,
322 "columnName",
SDDS_STRING, &seqRequest[seqRequests].outputName, 1, SEQ_OUTPUTNAME,
325 "units",
SDDS_STRING, &seqRequest[seqRequests].units, 1, SEQ_UNITSGIVEN, NULL))
327 seqRequest[seqRequests].flags |= SEQ_DIRECT_UNIFORM;
328 if (!(seqRequest[seqRequests].flags & SEQ_OUTPUTNAME) ||
329 !(seqRequest[seqRequests].outputName))
330 SDDS_Bomb(
"columnName is not provided for uniform distribution/");
334 else if (!
get_double(&seqRequest[seqRequests].min, minPar))
335 SDDS_Bomb(
"Invalid value given for minimum value of -uniform distribution.");
342 else if (!
get_double(&seqRequest[seqRequests].max, maxPar))
343 SDDS_Bomb(
"Invalid value given for maximum value of -uniform distribution.");
348 scanned[iArg].n_items += 1;
351 if (scanned[iArg].n_items < 2)
353 if (!(seqRequest =
SDDS_Realloc(seqRequest,
sizeof(*seqRequest) * (seqRequests + 1))))
355 memset(seqRequest + seqRequests, 0,
sizeof(*seqRequest));
356 scanned[iArg].n_items -= 1;
357 memset(seqRequest + seqRequests, 0,
sizeof(*seqRequest));
358 seqRequest[seqRequests].randomizationGroup = -1;
359 seqRequest[seqRequests].mean = 1;
361 scanned[iArg].list + 1, &scanned[iArg].n_items, 0,
362 "columnName",
SDDS_STRING, &seqRequest[seqRequests].outputName, 1, SEQ_OUTPUTNAME,
364 "units",
SDDS_STRING, &seqRequest[seqRequests].units, 1, SEQ_UNITSGIVEN, NULL))
366 seqRequest[seqRequests].flags |= SEQ_DIRECT_POISSON;
367 if (!(seqRequest[seqRequests].flags & SEQ_OUTPUTNAME) || !(seqRequest[seqRequests].outputName))
368 SDDS_Bomb(
"columnName is not provided for poisson distribution/");
372 else if (!
get_double(&seqRequest[seqRequests].mean, meanPar))
373 SDDS_Bomb(
"Invalid value given for mean value of -poisson distribution.");
378 scanned[iArg].n_items += 1;
381 if (scanned[iArg].n_items != 2 ||
382 sscanf(scanned[iArg].list[1],
"%ld", &samples) != 1 ||
387 if (scanned[iArg].n_items != 2 ||
388 sscanf(scanned[iArg].list[1],
"%ld", &randomNumberSeed) != 1)
392 if (!
processPipeOption(scanned[iArg].list + 1, scanned[iArg].n_items - 1, &pipeFlags))
398 case CLO_OPTIMAL_HALTON:
402 fprintf(stderr,
"error: unknown/ambiguous option: %s\n", scanned[iArg].list[0]);
408 input = scanned[iArg].list[0];
410 output = scanned[iArg].list[0];
417 SDDS_Bomb(
"give one or more -columns options");
421 for (i = 0; i < seqRequests; i++) {
422 if (!(seqRequest[i].flags & (SEQ_DATAFILE | SEQ_DIRECT_GAUSSIAN | SEQ_DIRECT_UNIFORM | SEQ_DIRECT_POISSON)))
425 if (i == seqRequests) {
431 pipeFlags |= USE_STDIN;
432 if (input && !output) {
435 pipeFlags |= USE_STDIN;
437 sprintf(msgBuffer,
"%s exists already (sddssampledist)", output);
449 fprintf(stderr,
"Initialized output file %s\n", output);
452 for (i = mainInputOpened = 0; i < seqRequests; i++) {
453 if (seqRequest[i].flags & SEQ_DIRECT_GAUSSIAN) {
454 if (seqRequest[i].meanPar || seqRequest[i].sigmaPar) {
455 if (!mainInputOpened) {
463 if ((seqRequest[i].meanPar &&
465 (seqRequest[i].sigmaPar &&
473 }
else if (seqRequest[i].flags & SEQ_DIRECT_UNIFORM) {
474 if (seqRequest[i].minPar || seqRequest[i].maxPar) {
475 if (!mainInputOpened) {
483 if ((seqRequest[i].minPar &&
485 (seqRequest[i].maxPar &&
493 }
else if (seqRequest[i].flags & SEQ_DIRECT_POISSON) {
494 if (seqRequest[i].meanPar) {
495 if (!mainInputOpened) {
511 if (seqRequest[i].flags & SEQ_RANDOMIZE) {
514 if (seqRequest[i].flags & SEQ_RANDOMGROUP) {
515 newGroupID = seqRequest[i].randomizationGroup;
516 for (j = 0; j < randomizationGroups; j++)
517 if (randomizationData[j].group == newGroupID) {
522 seqRequest[i].randomizationGroup = newGroupID = -(i + 1);
524 if (newGroupID != 0) {
525 if (!(randomizationData =
SDDS_Realloc(randomizationData,
sizeof(*randomizationData) * (randomizationGroups + 1))))
527 randomizationData[randomizationGroups].group = newGroupID;
528 randomizationData[randomizationGroups].order = NULL;
529 randomizationGroups++;
532 if (seqRequest[i].flags & SEQ_DATAFILE) {
535 SDDSptr = &seqRequest[i].SDDSin;
537 if (!mainInputOpened) {
547 ((seqRequest[i].flags & SEQ_CDFNAME) &&
549 ((seqRequest[i].flags & SEQ_DFNAME) &&
557 if (seqRequest[i].flags & SEQ_UNITSGIVEN &&
563 fprintf(stderr,
"Initialized input files\n");
565 if (columnMajorOrder != -1)
566 SDDSout.layout.data_mode.column_major = columnMajorOrder;
568 SDDSout.layout.data_mode.column_major = 0;
573 if (randomNumberSeed <= 0) {
574 randomNumberSeed = (long)time((time_t *)NULL);
575 randomNumberSeed = 2 * (randomNumberSeed / 2) + 1;
576#if defined(_WIN32) || defined(__APPLE__)
584 if (!(sample = calloc(samples,
sizeof(*sample))))
588 fprintf(stderr,
"Beginning page loop\n");
591 for (i = 0; i < seqRequests; i++) {
592 if (seqRequest[i].flags & SEQ_DATAFILE &&
SDDS_ReadPage(&seqRequest[i].SDDSin) <= 0)
595 if (i != seqRequests)
600 fprintf(stderr,
"Defining randomization tables\n");
602 for (i = 0; i < randomizationGroups; i++) {
603 if (!(randomizationData[i].order =
SDDS_Malloc(
sizeof(*randomizationData[i].order) * samples)))
605 for (j = 0; j < samples; j++)
606 randomizationData[i].order[j] = j;
607 randomizeOrder((
char *)randomizationData[i].order,
sizeof(*randomizationData[i].order), samples, 0,
random_1);
610 fprintf(stderr,
"Beginning loop over sequence requests\n");
611 for (i = 0; i < seqRequests; i++) {
613 fprintf(stderr,
"Processing sequence request %ld\n", i);
614 if (seqRequest[i].flags & SEQ_DIRECT_GAUSSIAN) {
615 if ((seqRequest[i].meanPar &&
617 (seqRequest[i].sigmaPar &&
620 for (j = 0; j < samples; j++)
622 }
else if (seqRequest[i].flags & SEQ_DIRECT_UNIFORM) {
623 if ((seqRequest[i].minPar &&
625 (seqRequest[i].maxPar &&
628 for (j = 0; j < samples; j++)
629 sample[j] = seqRequest[i].min + (seqRequest[i].max - seqRequest[i].min) *
random_1(1);
630 }
else if (seqRequest[i].flags & SEQ_DIRECT_POISSON) {
631 double *pos_x, *pos_cdf, CDF;
632 long pos_points, code;
633 pos_x = pos_cdf = NULL;
634 if ((seqRequest[i].meanPar &&
637 pos_points = CreatePoissonDistributionTable(&pos_x, &pos_cdf, seqRequest[i].mean);
639 for (j = 0; j < samples; j++) {
641 sample[j] = (int)(
interp(pos_x, pos_cdf, pos_points, CDF, 0, 1, &code));
647 if (input && !(seqRequest[i].flags & SEQ_DATAFILE))
650 SDDSptr = &seqRequest[i].SDDSin;
653 (seqRequest[i].flags & SEQ_CDFNAME &&
655 (seqRequest[i].flags & SEQ_DFNAME &&
659 sprintf(msgBuffer,
"empty page for file %s\n",
660 (seqRequest[i].flags & SEQ_DATAFILE) ? seqRequest[i].dataFileName : input);
664 fprintf(stderr,
"Checking and converting CDF/DF values\n");
666 for (j = 1; j < values; j++) {
667 if (IVValue[j - 1] > IVValue[j]) {
668 sprintf(msgBuffer,
"random variate values not monotonically increasing for %s",
669 (seqRequest[i].flags & SEQ_DATAFILE) ? seqRequest[i].dataFileName : input);
672 if (seqRequest[i].flags & SEQ_DFNAME)
674 CDFValue[j] += CDFValue[j - 1];
675 if (CDFValue[j] < CDFValue[j - 1]) {
676 sprintf(msgBuffer,
"CDF values decreasing for %s",
677 (seqRequest[i].flags & SEQ_DATAFILE) ? seqRequest[i].dataFileName : input);
682 fprintf(stderr,
"Normalizing CDF\n");
684 if (CDFValue[values - 1] <= 0) {
685 sprintf(msgBuffer,
"CDF not valid for %s\n", seqRequest[i].dataFileName);
688 for (j = 0; j < values; j++)
689 CDFValue[j] /= CDFValue[values - 1];
690 if (seqRequest[i].flags & SEQ_HALTONRADIX) {
692 fprintf(stderr,
"Starting halton sequence, offset=%" PRId32
"\n", seqRequest[i].haltonOffset);
697 while (seqRequest[i].haltonOffset-- > 0) {
705 fprintf(stderr,
"Generating samples\n");
706 for (j = 0; j < samples; j++) {
710 if (seqRequest[i].flags & SEQ_HALTONRADIX) {
717 if (CDF <= CDFValue[values - 1] && CDF >= CDFValue[0])
720 sample[j] = seqRequest[i].factor *
interp(IVValue, CDFValue, values, CDF, 0, 1, &code) + seqRequest[i].offset;
722 if (seqRequest[i].flags & SEQ_RANDOMIZE) {
726 fprintf(stderr,
"Randomizing order of values\n");
727 if (!(sample1 = malloc(
sizeof(*sample1) * samples)))
729 for (l = 0; l < randomizationGroups; l++)
730 if (randomizationData[l].group == seqRequest[i].randomizationGroup)
732 if (l == randomizationGroups)
733 SDDS_Bomb(
"problem with construction of randomization groups!");
734 for (k = 0; k < samples; k++)
735 sample1[k] = sample[randomizationData[l].order[k]];
743 fprintf(stderr,
"Setting SDDS column values\n");
745 seqRequest[i].outputName ? seqRequest[i].outputName : seqRequest[i].indepName))
749 fprintf(stderr,
"Writing data page\n");
756 fprintf(stderr,
"Exited read loop\n");
760 for (i = 0; i < seqRequests; i++) {
761 if (seqRequest[i].dataFileName)
762 free(seqRequest[i].dataFileName);
763 if (seqRequest[i].indepName)
764 free(seqRequest[i].indepName);
765 if (seqRequest[i].outputName)
766 free(seqRequest[i].outputName);
767 if (seqRequest[i].DFName)
768 free(seqRequest[i].DFName);
769 if (seqRequest[i].CDFName)
770 free(seqRequest[i].CDFName);
771 if (seqRequest[i].units)
772 free(seqRequest[i].units);
773 if (seqRequest[i].meanPar)
774 free(seqRequest[i].meanPar);
775 if (seqRequest[i].sigmaPar)
776 free(seqRequest[i].sigmaPar);
777 if (seqRequest[i].minPar)
778 free(seqRequest[i].minPar);
779 if (seqRequest[i].maxPar)
780 free(seqRequest[i].maxPar);
781 if (seqRequest[i].flags & SEQ_DATAFILE && !
SDDS_Terminate(&(seqRequest[i].SDDSin)))
785 for (i = 0; i < randomizationGroups; i++)
786 free(randomizationData[i].order);
787 if (randomizationData)
788 free(randomizationData);
795long CreatePoissonDistributionTable(
double **x,
double **pos_CDF,
double mean) {
796 long i, npoints = 20, count = 0;
800 *x = *pos_CDF = NULL;
801 if (!(*x = malloc(
sizeof(**x) * npoints)) ||
802 !(pos = malloc(
sizeof(*pos) * npoints)) ||
803 !(*pos_CDF = malloc(
sizeof(**pos_CDF) * npoints)))
807 if (count + 2 >= npoints) {
810 *pos_CDF =
SDDS_Realloc(*pos_CDF,
sizeof(**pos_CDF) * npoints);
817 (*pos_CDF)[count] = pos[i];
820 pos[i] = pos[i - 1] * mean / i;
821 (*pos_CDF)[count] = (*pos_CDF)[count - 1];
822 (*pos_CDF)[count + 1] = (*pos_CDF)[count - 1] + pos[i];
824 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.