/**
 * @file Math.hh
 *
 * Miscellaneous math utilities
 *
 * Author: Peter Helfer
 * Date: 2014-12-16
 */

#ifndef MATH_UTIL_HH
#define MATH_UTIL_HH

#include <math.h>
#include <vector>
using std::vector;

#include "Trace.hh"

namespace MathUtil {
    /**
     * Asigmoid function - grows from 0 to 1 as x grows from -inf to +inf
     * @param x The variable
     * @param k Higher value gives steeper slope
     * @param x_half The x-value where the asigmoid crosses y=0.5
     *
     * To concentrate almost all the action in the [0,1] interval,
     * try slew=10, x_half=0.5.
     */
    inline double asigmoid(double x, double k = 1.0, double x_half = 0.5)
    {
        return 1.0 / (1.0 + exp(-k * (x - x_half)));
    }

    /**
     * a * (1.0 - exp(k * x), grows from (0, 0) towards an asymptote.
     * @param x The variable
     * @param k Greater value for faster growth
     * @param a The asymptote
     *
     * With the default values, most of the action is in (0,0)-(1,1)
     */
    inline double asymptote(double x, double a = 1.0, double k = 5.0)
    {
        return a * (1.0 - exp(-k * x));
    }
}
#endif