/* SIMPLIB0.C */
/*-
supporting functions for simplex fitting:
  
J.A. Rupley, Tucson, Arizona
rupley!local@megaron.arizona.edu
*/

#define SIMPLIB0

#include "simpdefs.h"

int
centroid(pdest, psrc, xvert)
	struct pstruct *pdest, *psrc[];
int             xvert;
{
	register int    i, j;

	for (i = 0; i < nparm; i++) {
		pdest->parm[i] = psrc[0]->parm[i];
		for (j = 1; j < xvert; j++)
			pdest->parm[i] = pdest->parm[i]
				+ (psrc[j]->parm[i]
				   - psrc[0]->parm[i]) / xvert;
	}
	return (OK);

}				/* END OF CENTROID    			 */

int
ptrial(pnew, p1, p2, coef2)
	struct pstruct *pnew, *p1, *p2;
	double          coef2;
{
	register int    i;

	for (i = 0; i < nparm; i++)
		pnew->parm[i] = p1->parm[i] +
			coef2 * (p2->parm[i] - p1->parm[i]);
	return (OK);
}				/* END OF PTRIAL			 */

void
pcopy(pdest, psrc)
	struct pstruct *pdest, *psrc;
{
	register int    i;

	pdest->val = psrc->val;
	for (i = 0; i < nparm; i++)
		pdest->parm[i] = psrc->parm[i];

}				/* END OF PCOPY				 */

/*
 * compare float contents of a structure member for records x and y 
 */
int
pvalcomp(p_px, p_py)
	struct pstruct **p_px, **p_py;
{

	if ((*p_px)->val < (*p_py)->val)
		return (-1);
	else if ((*p_px)->val > (*p_py)->val)
		return (1);
	else
		return (0);
}				/* END OF PVALCOMP			 */

void
ffitprint(fptr)
	FILE           *fptr;
{
	extern void     fpprint();
	extern void     fsprint();

	/* first all vertices of simplex */
	fprintf(fptr,
		"\1\f\n%-s\n\nsummary of simplex fitting results:\niteration number %d\n",
		title, iter);
	fsprint(fptr, "\nsimplex:\n");

	/* then centroid */
	fprintf(fptr,
		"\ncentroid:\nfunction value = %20.14e\n", pcent.val);
	fpprint(fptr, &pcent);

	/* then test for exit, etc */
	fprintf(fptr,
		"mean=%20.14e rms=%20.14e test=%20.14e\n", mean_func, rms_func, test);
	fprintf(fptr,
		"root mean square weighted error of best fit to data = %20.14e\n\n", rms_data);

}				/* END OF FFITPRINT			 */

void
fquadprint(fptr)
	FILE           *fptr;
{
	register int    i, k;

	extern void     fsprint();

	fprintf(fptr,
		"\1\f\n%-s\n\nsummary of results of quadratic fit\niteration number %d\n",
		title, iter);
	fprintf(fptr, "\nmean=%20.14e rms=%20.14e test=%20.14e\n",
		mean_func, rms_func, test);
	fprintf(fptr,
		"\nmse    = %20.14e   rms weighted error = %20.14e\n", mse, rms_data);
	fprintf(fptr,
		"\nyzero  = %20.14e\nymin   = %20.14e\ny-pmin = %20.14e\n\n",
		yzero, ymin, ypmin);

	fprintf(fptr,
		"parm free    q                 centroid          pmin              std_dev\n");

	for (i = 0; i < nfree; i++) {
		k = q.parmndx[i];
		fprintf(fptr, "%3d %3d %17.10e %17.10e %17.10e %17.10e\n",
		   k, i, q.q[i], pcent.parm[k], pmin.parm[k], q.std_dev[i]);
	}
}				/* END OF FQUADPRINT			 */

/*
 * print nfree x nfree matrix; calls fqprint()				 
 */
void
fmatprint(fptr, g)
	FILE           *fptr;
	double          g[][NPARM];
{
	register int    i;

	extern void     fqprint();

	for (i = 0; i < nfree; i++)
		fqprint(fptr, g[i]);
}				/* END OF FMATPRINT			 */

void
fqprint(fptr, g)
	FILE           *fptr;
	double         *g;
{
	register int    i;

	for (i = 0; i < nfree; i++) {
		if ((i > 0) && ((i % 4) == NULL))
			fprintf(fptr, "\n  ");
		fprintf(fptr, "%19.10e", g[i]);
	}
	fprintf(fptr, "\n");
}				/* END OF FQPRINT			 */

void
fpprint(fptr, g)
	FILE           *fptr;
	struct pstruct *g;
{
	register int    i;

	for (i = 0; i < nparm; i++) {
		if (i > 0 && (i % 4) == NULL)
			fprintf(fptr, "\n  ");
		fprintf(fptr, "%19.10e", g->parm[i]);
	}
	fprintf(fptr, "\n");
}				/* END OF FPPRINT			 */

void
fsprint(fptr, string)
	char           *string;
	FILE           *fptr;
{
	register int    j;

	extern void     fpprint();

	fprintf(fptr, "%s", string);
	for (j = 0; j < nvert; j++) {
		fprintf(fptr, "vertex = %d   function value = %20.14e\n",
			j, p[j].val);
		fpprint(fptr, &p[j]);
	}
}				/* END OF FSPRINT			 */

void
enditall()
{
	void            exit();

	exit(0);
}				/* END OF ENDITALL			 */
