/*
 * Generated by EML-lang C backend
 * Source module: catenary
 * Source file:   /home/monogate/monogate/forge/examples/catenary.eml
 * Functions:     1
 * Constants:     2
 * Types:         0
 */

#include "libmonogate.h"
#include <stdint.h>
#include <math.h>
#include <assert.h>

static const double H_MIN = 1.0;
static const double H_MAX = 20.0;

/*
 * catenary
 * Chain order: 2     Cost class: p2-d5-w2-c0
 * EML depth:   5  Drift risk: MEDIUM
 * Dynamics:    0 osc, 0 decay  (predicted_r=0)
 * FPGA est:   5 MAC, 0 exp, 0 ln, 0 trig -> 10 cy @ 32-bit
 */
double catenary(double scale, double curv, double x) {
    assert(((mg_abs(scale) <= 5.0)) && "catenary: refinement violated on scale: (mg_abs(scale) <= 5.0)");
    assert(((mg_abs(curv) <= 0.5)) && "catenary: refinement violated on curv: (mg_abs(curv) <= 0.5)");
    assert(((mg_abs(x) <= 4.0)) && "catenary: refinement violated on x: (mg_abs(x) <= 4.0)");
    double raw = (scale * mg_cosh((curv * x)));
    return mg_clamp(raw, H_MIN, H_MAX);
}
