83char *option[N_OPTIONS] = {
98 "sddsgfit [<inputfile>] [<outputfile>] [-pipe=[input][,output]]\n"
99 " -columns=<x-name>,<y-name>[,ySigma=<sy-name>]\n"
100 " -fitRange=<lower>|@<parameter-name>,<upper>|@<parameter-name>\n"
102 " -verbosity=<integer>\n"
103 " -stepSize=<factor>\n"
104 " -tolerance=<value>\n"
105 " -guesses=[baseline=<value>|@<parameter-name>][,mean=<value>|@<parameter-name>]"
106 "[,height=<value>|@<parameter-name>][,sigma=<value>|@<parameter-name>]\n"
107 " -fixValue=[baseline=<value>|@<parameter-name>][,mean=<value>|@<parameter-name>]"
108 "[,height=<value>|@<parameter-name>][,sigma=<value>|@<parameter-name>]\n"
109 " -limits=[evaluations=<number>][,passes=<number>]\n"
110 " -majorOrder=row|column\n\n"
111 "Performs a Gaussian fit of the form:\n"
112 " y = <baseline> + <height> * exp(-0.5 * (x - <mean>)^2 / <sigma>^2)\n"
113 "Program by Michael Borland. (" __DATE__
" " __TIME__
", SVN revision: " SVN_VERSION
")\n";
115void report(
double res,
double *a,
long pass,
long n_eval,
long n_dimen);
116void setupOutputFile(
SDDS_DATASET *OutputTable,
long *xIndex,
long *yIndex,
long *syIndex,
long *fitIndex,
117 long *residualIndex,
long fullOutput,
char *output,
SDDS_DATASET *InputTable,
118 char *xName,
char *yName,
char *syName,
short columnMajorOrder);
119long computeStartingPoint(
double *a,
double *da,
double *x,
double *y, int64_t n,
unsigned long guessFlags,
120 double sigmaGuess,
double meanGuess,
double baselineGuess,
double heightGuess,
122double fitFunction(
double *a,
long *invalid);
123int64_t makeFilteredCopy(
double **xFit,
double **yFit,
double **syFit,
double *x,
double *y,
double *sy,
124 int64_t n,
double lower,
double upper);
126static double *xDataFit = NULL, *yDataFit = NULL, *syDataFit = NULL;
127static int64_t nDataFit = 0;
129#define GUESS_BASELINE_GIVEN 0x0001
130#define FIX_BASELINE_GIVEN (0x0001 << 4)
131#define GUESS_HEIGHT_GIVEN 0x0002
132#define FIX_HEIGHT_GIVEN (0x0002 << 4)
133#define GUESS_MEAN_GIVEN 0x0004
134#define FIX_MEAN_GIVEN (0x0004 << 4)
135#define GUESS_SIGMA_GIVEN 0x0008
136#define FIX_SIGMA_GIVEN (0x0008 << 4)
138#define BASELINE_INDEX 0
139#define HEIGHT_INDEX 1
143int main(
int argc,
char **argv) {
144 double *xData = NULL, *yData = NULL, *syData = NULL;
149 char *input, *output, *xName, *yName, *syName;
150 long xIndex, yIndex, fitIndex, residualIndex, syIndex_out, retval;
151 double *fitData, *residualData, rmsResidual, chiSqr, sigLevel;
152 unsigned long guessFlags, dummyFlags, pipeFlags, majorOrderFlag;
153 double sigmaGuess, meanGuess, baselineGuess, heightGuess;
154 double tolerance, stepSize;
155 double a[4], da[4], lower, upper, result;
156 double aLow[4], aHigh[4];
157 short disable[4] = {0, 0, 0, 0};
158 int32_t nEvalMax = 5000, nPassMax = 100;
159 long nEval, verbosity, fullOutput = 0;
161 short columnMajorOrder = -1;
162 char *lowerPar, *upperPar, *baselineGuessPar, *sigmaGuessPar, *meanGuessPar, *heightGuessPar;
165 argc =
scanargs(&s_arg, argc, argv);
166 if (argc < 2 || argc > (2 + N_OPTIONS)) {
170 for (i = 0; i < 4; i++) {
171 aLow[i] = -(aHigh[i] = DBL_MAX);
173 aLow[SIGMA_INDEX] = 0;
174 input = output = NULL;
178 guessFlags = sigmaGuess = heightGuess = baselineGuess = meanGuess = pipeFlags = 0;
179 xName = yName = syName = NULL;
181 lowerPar = upperPar = sigmaGuessPar = heightGuessPar = baselineGuessPar = meanGuessPar = NULL;
183 for (i_arg = 1; i_arg < argc; i_arg++) {
184 if (s_arg[i_arg].arg_type == OPTION) {
185 switch (
match_string(s_arg[i_arg].list[0], option, N_OPTIONS, 0)) {
186 case SET_MAJOR_ORDER:
188 s_arg[i_arg].n_items--;
189 if (s_arg[i_arg].n_items > 0 && (!
scanItemList(&majorOrderFlag, s_arg[i_arg].list + 1,
190 &s_arg[i_arg].n_items, 0,
"row", -1, NULL, 0, SDDS_ROW_MAJOR_ORDER,
191 "column", -1, NULL, 0, SDDS_COLUMN_MAJOR_ORDER, NULL))) {
192 SDDS_Bomb(
"invalid -majorOrder syntax/values");
194 if (majorOrderFlag & SDDS_COLUMN_MAJOR_ORDER) {
195 columnMajorOrder = 1;
196 }
else if (majorOrderFlag & SDDS_ROW_MAJOR_ORDER) {
197 columnMajorOrder = 0;
202 if (s_arg[i_arg].n_items != 3) {
205 if (s_arg[i_arg].list[1][0] ==
'@') {
206 cp_str(&lowerPar, s_arg[i_arg].list[1] + 1);
207 }
else if (sscanf(s_arg[i_arg].list[1],
"%lf", &lower) != 1) {
208 SDDS_Bomb(
"invalid fitRange lower value provided");
210 if (s_arg[i_arg].list[2][0] ==
'@') {
211 cp_str(&upperPar, s_arg[i_arg].list[2] + 1);
212 }
else if (sscanf(s_arg[i_arg].list[2],
"%lf", &upper) != 1) {
213 SDDS_Bomb(
"invalid fitRange upper value provided");
218 if (s_arg[i_arg].n_items != 2 ||
219 sscanf(s_arg[i_arg].list[1],
"%lf", &tolerance) != 1 ||
221 SDDS_Bomb(
"incorrect -tolerance syntax");
226 if (s_arg[i_arg].n_items != 2 ||
227 sscanf(s_arg[i_arg].list[1],
"%lf", &stepSize) != 1 ||
234 if (s_arg[i_arg].n_items != 2 ||
235 sscanf(s_arg[i_arg].list[1],
"%ld", &verbosity) != 1) {
236 SDDS_Bomb(
"incorrect -verbosity syntax");
241 if (s_arg[i_arg].n_items < 2) {
244 s_arg[i_arg].n_items -= 1;
245 dummyFlags = guessFlags;
246 if (!
scanItemList(&guessFlags, s_arg[i_arg].list + 1, &s_arg[i_arg].n_items, 0,
247 "baseline",
SDDS_STRING, &baselineGuessPar, 1, GUESS_BASELINE_GIVEN,
248 "height",
SDDS_STRING, &heightGuessPar, 1, GUESS_HEIGHT_GIVEN,
249 "mean",
SDDS_STRING, &meanGuessPar, 1, GUESS_MEAN_GIVEN,
250 "sigma",
SDDS_STRING, &sigmaGuessPar, 1, GUESS_SIGMA_GIVEN, NULL)) {
253 if (baselineGuessPar) {
254 if (baselineGuessPar[0] ==
'@') {
257 if (sscanf(baselineGuessPar,
"%lf", &baselineGuess) != 1) {
258 SDDS_Bomb(
"Invalid baseline guess value provided.");
260 free(baselineGuessPar);
261 baselineGuessPar = NULL;
264 if (heightGuessPar) {
265 if (heightGuessPar[0] ==
'@') {
268 if (sscanf(heightGuessPar,
"%lf", &heightGuess) != 1) {
269 SDDS_Bomb(
"Invalid height guess value provided.");
271 free(heightGuessPar);
272 heightGuessPar = NULL;
276 if (meanGuessPar[0] ==
'@') {
279 if (sscanf(meanGuessPar,
"%lf", &meanGuess) != 1) {
280 SDDS_Bomb(
"Invalid mean guess value provided.");
287 if (sigmaGuessPar[0] ==
'@') {
290 if (sscanf(sigmaGuessPar,
"%lf", &sigmaGuess) != 1) {
291 SDDS_Bomb(
"Invalid sigma guess value provided.");
294 sigmaGuessPar = NULL;
297 if ((dummyFlags >> 4) & guessFlags) {
298 SDDS_Bomb(
"can't have -fixedValue and -guesses for the same item");
300 guessFlags |= dummyFlags;
304 if (s_arg[i_arg].n_items < 2) {
307 s_arg[i_arg].n_items -= 1;
308 dummyFlags = guessFlags;
309 if (!
scanItemList(&guessFlags, s_arg[i_arg].list + 1, &s_arg[i_arg].n_items, 0,
310 "baseline",
SDDS_STRING, &baselineGuessPar, 1, FIX_BASELINE_GIVEN,
311 "height",
SDDS_STRING, &heightGuessPar, 1, FIX_HEIGHT_GIVEN,
312 "mean",
SDDS_STRING, &meanGuessPar, 1, FIX_MEAN_GIVEN,
313 "sigma",
SDDS_STRING, &sigmaGuessPar, 1, FIX_SIGMA_GIVEN, NULL)) {
316 if (dummyFlags & (guessFlags >> 4)) {
317 SDDS_Bomb(
"can't have -fixValue and -guesses for the same item");
319 guessFlags |= dummyFlags;
320 if (baselineGuessPar) {
321 if (baselineGuessPar[0] ==
'@') {
324 if (sscanf(baselineGuessPar,
"%lf", &baselineGuess) != 1) {
325 SDDS_Bomb(
"Invalid baseline guess value provided.");
327 free(baselineGuessPar);
328 baselineGuessPar = NULL;
331 if (heightGuessPar) {
332 if (heightGuessPar[0] ==
'@') {
335 if (sscanf(heightGuessPar,
"%lf", &heightGuess) != 1) {
336 SDDS_Bomb(
"Invalid height guess value provided.");
338 free(heightGuessPar);
339 heightGuessPar = NULL;
343 if (meanGuessPar[0] ==
'@') {
346 if (sscanf(meanGuessPar,
"%lf", &meanGuess) != 1) {
347 SDDS_Bomb(
"Invalid mean guess value provided.");
354 if (sigmaGuessPar[0] ==
'@') {
357 if (sscanf(sigmaGuessPar,
"%lf", &sigmaGuess) != 1) {
358 SDDS_Bomb(
"Invalid sigma guess value provided.");
361 sigmaGuessPar = NULL;
367 if (s_arg[i_arg].n_items != 3 && s_arg[i_arg].n_items != 4) {
370 xName = s_arg[i_arg].list[1];
371 yName = s_arg[i_arg].list[2];
372 s_arg[i_arg].n_items -= 3;
373 if (!
scanItemList(&dummyFlags, s_arg[i_arg].list + 3, &s_arg[i_arg].n_items, 0,
384 if (s_arg[i_arg].n_items < 2) {
387 s_arg[i_arg].n_items -= 1;
388 if (!
scanItemList(&dummyFlags, s_arg[i_arg].list + 1, &s_arg[i_arg].n_items, 0,
389 "evaluations",
SDDS_LONG, &nEvalMax, 1, 0,
390 "passes",
SDDS_LONG, &nPassMax, 1, 0, NULL) ||
391 nEvalMax <= 0 || nPassMax <= 0) {
397 if (!
processPipeOption(s_arg[i_arg].list + 1, s_arg[i_arg].n_items - 1, &pipeFlags)) {
403 fprintf(stderr,
"error: unknown/ambiguous option: %s\n", s_arg[i_arg].list[0]);
409 input = s_arg[i_arg].list[0];
410 }
else if (output == NULL) {
411 output = s_arg[i_arg].list[0];
420 for (i = 0; i < 4; i++) {
421 if ((guessFlags >> 4) & (1 << i)) {
426 if (!xName || !yName) {
427 SDDS_Bomb(
"-columns option must be given");
435 (syName && !
SDDS_FindColumn(&InputTable, FIND_NUMERIC_TYPE, syName, NULL))) {
436 SDDS_Bomb(
"one or more of the given data columns is nonexistent or nonnumeric");
439 setupOutputFile(&OutputTable, &xIndex, &yIndex, &syIndex_out, &fitIndex, &residualIndex,
440 fullOutput, output, &InputTable, xName, yName, syName, columnMajorOrder);
443 xData = yData = syData = NULL;
444 fitData = residualData = NULL;
475 if ((nDataFit = makeFilteredCopy(&xDataFit, &yDataFit, &syDataFit, xData, yData, syData, nData, lower, upper)) < 5) {
485 if (!computeStartingPoint(a, da, xDataFit, yDataFit, nDataFit, guessFlags, sigmaGuess, meanGuess,
486 baselineGuess, heightGuess, stepSize)) {
487 fprintf(stderr,
"error: couldn't compute starting point for page %ld--skipping\n", retval);
491 fprintf(stderr,
"starting values: sigma=%.6e mean=%.6e baseline=%.6e height=%.6e\n",
492 a[SIGMA_INDEX], a[MEAN_INDEX], a[BASELINE_INDEX], a[HEIGHT_INDEX]);
495 fprintf(stderr,
"starting steps: sigma=%.6e mean=%.6e baseline=%.6e height=%.6e\n",
496 da[SIGMA_INDEX], da[MEAN_INDEX], da[BASELINE_INDEX], da[HEIGHT_INDEX]);
499 nEval =
simplexMin(&result, a, da, aLow, aHigh, disable, 4, -DBL_MAX, tolerance,
500 fitFunction, (verbosity > 0 ? report : NULL),
501 nEvalMax, nPassMax, 12, 3, 1.0, 0);
502 if (xData != xDataFit) {
511 fprintf(stderr,
"%ld evaluations of fit function required, giving result %e\n", nEval, result);
514 fitData =
trealloc(fitData,
sizeof(*fitData) * nData);
515 residualData =
trealloc(residualData,
sizeof(*residualData) * nData);
516 for (i = 0, result = 0; i < nData; i++) {
517 fitData[i] = a[BASELINE_INDEX] + a[HEIGHT_INDEX] * exp(-
ipow((xData[i] - a[MEAN_INDEX]) / a[SIGMA_INDEX], 2) / 2);
518 residualData[i] = yData[i] - fitData[i];
519 result += sqr(residualData[i]);
521 rmsResidual = sqrt(result / nData);
523 for (i = 0, chiSqr = 0; i < nData; i++) {
524 chiSqr += sqr(residualData[i] / syData[i]);
527 double sy2 = result / (nData - 4);
528 for (i = 0, chiSqr = 0; i < nData; i++) {
529 chiSqr += sqr(residualData[i]) / sy2;
534 fprintf(stderr,
"sigma: %.15e\nmean: %.15e\nbaseline: %.15e\nheight: %.15e\n",
535 a[SIGMA_INDEX], a[MEAN_INDEX], a[BASELINE_INDEX], a[HEIGHT_INDEX]);
539 fprintf(stderr,
"Significance level: %.5e\n", sigLevel);
541 fprintf(stderr,
"RMS deviation: %.15e\n", rmsResidual);
546 !
SDDS_SetColumn(&OutputTable, SDDS_SET_BY_INDEX, xData, nData, xIndex) ||
547 !
SDDS_SetColumn(&OutputTable, SDDS_SET_BY_INDEX, fitData, nData, fitIndex) ||
549 "gfitSigma", a[SIGMA_INDEX],
550 "gfitMean", a[MEAN_INDEX],
551 "gfitBaseline", a[BASELINE_INDEX],
552 "gfitHeight", a[HEIGHT_INDEX],
553 "gfitRmsResidual", rmsResidual,
554 "gfitSigLevel", sigLevel, NULL) ||
556 (!
SDDS_SetColumn(&OutputTable, SDDS_SET_BY_INDEX, yData, nData, yIndex) ||
557 !
SDDS_SetColumn(&OutputTable, SDDS_SET_BY_INDEX, residualData, nData, residualIndex) ||
558 (syName && !
SDDS_SetColumn(&OutputTable, SDDS_SET_BY_INDEX, syData, nData, syIndex_out)))) ||
590 if (baselineGuessPar) {
591 free(baselineGuessPar);
593 if (heightGuessPar) {
594 free(heightGuessPar);
603void setupOutputFile(
SDDS_DATASET *OutputTable,
long *xIndex,
long *yIndex,
long *syIndex,
long *fitIndex,
604 long *residualIndex,
long fullOutput,
char *output,
SDDS_DATASET *InputTable,
605 char *xName,
char *yName,
char *syName,
short columnMajorOrder) {
606 char *name, *yUnits, *description, *xUnits;
608 static char *residualNamePart =
"Residual";
609 static char *residualDescriptionPart =
"Residual of Gaussian fit to ";
620 if (columnMajorOrder != -1) {
621 OutputTable->layout.data_mode.column_major = columnMajorOrder;
623 OutputTable->layout.data_mode.column_major = InputTable->layout.data_mode.column_major;
626 name =
tmalloc(
sizeof(*name) * (strlen(yName) + strlen(residualNamePart) + 1));
627 description =
tmalloc(
sizeof(*description) * (strlen(yName) + strlen(residualDescriptionPart) + 1));
640 sprintf(name,
"%s%s", yName, residualNamePart);
641 sprintf(description,
"%s%s", yName, residualDescriptionPart);
647 sprintf(name,
"%sFit", yName);
648 sprintf(description,
"Gaussian fit to %s", yName);
653 if (
SDDS_DefineParameter(OutputTable,
"gfitBaseline", NULL, yUnits,
"Baseline from Gaussian fit",
661 SDDS_DefineParameter(OutputTable,
"gfitRmsResidual", NULL, yUnits,
"RMS residual from Gaussian fit",
663 SDDS_DefineParameter(OutputTable,
"gfitSigLevel", NULL, NULL,
"Significance level from chi-squared test",
674double fitFunction(
double *a,
long *invalid) {
675 double sum, tmp, mean, sigma, base, norm;
679 sigma = a[SIGMA_INDEX];
680 mean = a[MEAN_INDEX];
681 base = a[BASELINE_INDEX];
682 norm = a[HEIGHT_INDEX];
685 for (i = sum = 0; i < nDataFit; i++) {
686 tmp = (xDataFit[i] - mean) / sigma;
687 tmp = yDataFit[i] - base - norm * exp(-sqr(tmp) / 2);
690 return (sum / nDataFit);
692 for (i = sum = 0; i < nDataFit; i++) {
693 tmp = (xDataFit[i] - mean) / sigma;
694 tmp = (yDataFit[i] - base - norm * exp(-sqr(tmp) / 2)) / syDataFit[i];
697 return (sum / nDataFit);
701void report(
double y,
double *x,
long pass,
long nEval,
long n_dimen) {
704 fprintf(stderr,
"pass %ld, after %ld evaluations: result = %.16e\na = ", pass, nEval, y);
705 for (i = 0; i < n_dimen; i++) {
706 fprintf(stderr,
"%.8e ", x[i]);
711long computeStartingPoint(
double *a,
double *da,
double *x,
double *y, int64_t n,
unsigned long guessFlags,
712 double sigmaGuess,
double meanGuess,
double baselineGuess,
double heightGuess,
714 double xhalf, dhalf, ymin, ymax, xcenter, tmp, xmax, xmin;
723 ymax = xmax = -DBL_MAX;
724 ymin = xmin = DBL_MAX;
725 for (i = 0; i < n; i++) {
726 if (xmax < fabs(x[i])) {
729 if (xmin > fabs(x[i])) {
744 for (i = 0; i < n; i++) {
745 tmp = fabs((fabs(y[i] - ymax) / (ymax - ymin)) - 0.5);
751 if (dhalf != DBL_MAX) {
752 a[SIGMA_INDEX] = fabs(xhalf - xcenter) / 1.177;
754 a[SIGMA_INDEX] = xmax - xmin;
756 a[MEAN_INDEX] = xcenter;
757 a[BASELINE_INDEX] = ymin;
758 a[HEIGHT_INDEX] = ymax - ymin;
760 if (guessFlags & (GUESS_SIGMA_GIVEN + FIX_SIGMA_GIVEN)) {
761 a[SIGMA_INDEX] = sigmaGuess;
763 if (guessFlags & (GUESS_MEAN_GIVEN + FIX_MEAN_GIVEN)) {
764 a[MEAN_INDEX] = meanGuess;
766 if (guessFlags & (GUESS_BASELINE_GIVEN + FIX_BASELINE_GIVEN)) {
767 a[BASELINE_INDEX] = baselineGuess;
769 if (guessFlags & (GUESS_HEIGHT_GIVEN + FIX_HEIGHT_GIVEN)) {
770 a[HEIGHT_INDEX] = heightGuess;
774 for (i = 0; i < 4; i++) {
775 if (!(da[i] = a[i] * stepSize))
782int64_t makeFilteredCopy(
double **xFit,
double **yFit,
double **syFit,
double *x,
double *y,
783 double *sy, int64_t n,
double lower,
double upper) {
786 if (!(*xFit = (
double *)malloc(
sizeof(**xFit) * n)) ||
787 !(*yFit = (
double *)malloc(
sizeof(**yFit) * n)) ||
788 (sy && !(*syFit = (
double *)malloc(
sizeof(**syFit) * n)))) {
792 for (i = j = 0; i < n; i++) {
793 if (x[i] < lower || x[i] > upper) {
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_SetParameters(SDDS_DATASET *SDDS_dataset, int32_t mode,...)
int32_t SDDS_SetColumn(SDDS_DATASET *SDDS_dataset, int32_t mode, void *data, int64_t rows,...)
Sets the values for one data column in the current data table of an SDDS dataset.
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_GetColumnInformation(SDDS_DATASET *SDDS_dataset, char *field_name, void *memory, int32_t mode,...)
Retrieves information about a specified column in 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_WritePage(SDDS_DATASET *SDDS_dataset)
Writes the current data table to the output file.
int32_t SDDS_DefineColumn(SDDS_DATASET *SDDS_dataset, const char *name, const char *symbol, const char *units, const char *description, const char *format_string, int32_t type, int32_t field_length)
Defines a data column within the SDDS dataset.
int32_t SDDS_WriteLayout(SDDS_DATASET *SDDS_dataset)
Writes the SDDS layout header to the output file.
int32_t SDDS_DefineParameter(SDDS_DATASET *SDDS_dataset, const char *name, const char *symbol, const char *units, const char *description, const char *format_string, int32_t type, char *fixed_value)
Defines a data parameter with a fixed string value.
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_GetColumnIndex(SDDS_DATASET *SDDS_dataset, char *name)
Retrieves the index of a named column in the SDDS dataset.
void SDDS_PrintErrors(FILE *fp, int32_t mode)
Prints recorded error messages to a specified file stream.
void SDDS_RegisterProgramName(const char *name)
Registers the executable program name for use in error messages.
char * SDDS_FindColumn(SDDS_DATASET *SDDS_dataset, int32_t mode,...)
Finds the first column in the SDDS dataset that matches the specified criteria.
void SDDS_Bomb(char *message)
Terminates the program after printing an error message and recorded errors.
#define SDDS_STRING
Identifier for the string data type.
#define SDDS_LONG
Identifier for the signed 32-bit integer data type.
#define SDDS_DOUBLE
Identifier for the double data type.
void * trealloc(void *old_ptr, uint64_t size_of_block)
Reallocates a memory block to a new size.
void * tmalloc(uint64_t size_of_block)
Allocates a memory block of the specified size with zero initialization.
void bomb(char *error, char *usage)
Reports error messages to the terminal and aborts the program.
char * cp_str(char **s, char *t)
Copies a string, allocating memory for storage.
double ipow(const double x, const int64_t p)
Compute x raised to the power p (x^p).
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.
double ChiSqrSigLevel(double ChiSquared0, long nu)
Computes the probability that a chi-squared variable exceeds a given value.
long simplexMin(double *yReturn, double *xGuess, double *dxGuess, double *xLowerLimit, double *xUpperLimit, short *disable, long dimensions, double target, double tolerance, double(*func)(double *x, long *invalid), void(*report)(double ymin, double *xmin, long pass, long evals, long dims), long maxEvaluations, long maxPasses, long maxDivisions, double divisorFactor, double passRangeFactor, unsigned long flags)
Top-level convenience function for simplex-based minimization.