/* Exponential.m
 * 
 * Paul Rensing Mar 5, 1993
 *
 * Subclass of PFunction to manage an exponential function
 *
 * Copyright (C)  1993  The Board of Trustees of
 * The Leland Stanford Junior University. All Rights Reserved.
 */

#import "Exponential.h"

const char Exponential_h_rcsid[] = EXPONENTIAL_H_ID;
const char Exponential_m_rcsid[] = "$Id: Exponential.m,v 1.1 1993/03/10 20:12:27 rensing Exp $";

#import <objc/Storage.h>
#include <math.h>

@implementation Exponential 

static double exponential( double x, double binW, double *par )
{
    return binW * par[0] * exp( par[1] * x );
}

- init
{
    [super init];
    [[[self setTitle:"Exponential"] setFunctionPtr:exponential] setNumberArgs:2];
    [self registerFunc];	/* must be called after the above */
    [self setArgName:"Norm" at:0];
    [self setArgName:"ExpSlope" at:1];
    return self;
}

- setInitialValues
{
    fitParm            *parm;
    graphtype_t         type;

    [super setInitialValues];
    if (!disp)
	return self;

    type = h_getDispType(disp);

    parm = [variedParms elementAt:0];
    parm->lower_limit = disp->yAxis.low;
    parm->upper_limit = disp->yAxis.high;
    parm->value = 0.8 * parm->upper_limit;
    parm->step_size = 0.01 * (disp->yAxis.high - disp->yAxis.low);

    parm = [variedParms elementAt:1];
    if (disp->yAxis.low > 0)
	parm->upper_limit = (log(disp->yAxis.high) - log(disp->yAxis.low))
	  / (disp->xAxis.high - disp->xAxis.low);
    else
	parm->upper_limit = 10.0;
    parm->lower_limit = -parm->upper_limit;
    parm->step_size = 0.02 * fabs(parm->upper_limit);
    parm->value = 0.0;

    return self;
}

@end