use plotpy::{Curve, Plot, Text};
use russell_lab::math::GOLDEN_RATIO;
use russell_lab::*;
const OUT_DIR: &str = "/tmp/russell_lab/";
fn main() -> Result<(), StrError> {
let xa = Vector::linspace(-1.0, 1.0, 101)?;
let xb = Vector::linspace(0.0, 3.0, 3 * 40 + 1)?;
let xc = Vector::linspace(-4.0, 4.0, 202)?;
let y_sign = xa.get_mapped(|x| math::sign(x));
let mut curve = Curve::new();
curve.set_marker_style("o").draw(xa.as_data(), y_sign.as_data());
let mut plot = Plot::new();
let path = format!("{}/math_plot_functions_sign.svg", OUT_DIR);
plot.add(&curve)
.grid_and_labels("$x$", "$\\mathrm{sign}(x)$")
.set_figure_size_points(GOLDEN_RATIO * 280.0, 280.0)
.save(&path)?;
let y_ramp = xa.get_mapped(|x| math::ramp(x));
let mut curve = Curve::new();
curve.set_line_width(2.5).draw(xa.as_data(), y_ramp.as_data());
let mut plot = Plot::new();
let path = format!("{}/math_plot_functions_ramp.svg", OUT_DIR);
plot.add(&curve)
.grid_and_labels("$x$", "$\\mathrm{ramp}(x)$")
.set_figure_size_points(GOLDEN_RATIO * 280.0, 280.0)
.save(&path)?;
let y_heaviside = xa.get_mapped(|x| math::heaviside(x));
let mut curve = Curve::new();
curve.set_marker_style("o").draw(xa.as_data(), y_heaviside.as_data());
let mut plot = Plot::new();
let path = format!("{}/math_plot_functions_heaviside.svg", OUT_DIR);
plot.add(&curve)
.grid_and_labels("$x$", "$\\mathrm{heaviside}(x)$")
.set_figure_size_points(GOLDEN_RATIO * 280.0, 280.0)
.save(&path)?;
let (a, b) = (1.0, 2.0);
let y_boxcar = xb.get_mapped(|x| math::boxcar(x, a, b));
let mut curve = Curve::new();
curve.set_marker_style("o").draw(xb.as_data(), y_boxcar.as_data());
let mut plot = Plot::new();
let path = format!("{}/math_plot_functions_boxcar.svg", OUT_DIR);
plot.add(&curve)
.grid_and_labels("$x$", &format!("$\\mathrm{{boxcar}}_{{({},{})}}(x)$", a, b))
.set_figure_size_points(GOLDEN_RATIO * 280.0, 280.0)
.save(&path)?;
let y_logistic = xc.get_mapped(|x| math::logistic(x));
let mut curve = Curve::new();
curve.set_line_width(2.5).draw(xc.as_data(), y_logistic.as_data());
let mut plot = Plot::new();
let path = format!("{}/math_plot_functions_logistic.svg", OUT_DIR);
plot.add(&curve)
.grid_and_labels("$x$", "$\\mathrm{logistic}(x)$")
.set_figure_size_points(GOLDEN_RATIO * 280.0, 280.0)
.save(&path)?;
let y_logistic_deriv1 = xc.get_mapped(|x| math::logistic_deriv1(x));
let mut curve = Curve::new();
curve
.set_line_width(2.5)
.draw(xc.as_data(), y_logistic_deriv1.as_data());
let mut plot = Plot::new();
let path = format!("{}/math_plot_functions_logistic_deriv1.svg", OUT_DIR);
plot.add(&curve)
.grid_and_labels("$x$", "$\\frac{d\\mathrm{logistic}(x)}{dx}$")
.set_figure_size_points(GOLDEN_RATIO * 280.0, 280.0)
.save(&path)?;
let beta = 10.0;
let y_smooth_ramp = xa.get_mapped(|x| math::smooth_ramp(x, beta));
let mut curve = Curve::new();
curve.set_line_width(2.5).draw(xa.as_data(), y_smooth_ramp.as_data());
let mut text = Text::new();
text.set_bbox(true)
.set_bbox_facecolor("pink")
.set_bbox_edgecolor("black");
text.draw(-1.0, 0.85, &format!("$\\beta = {}$", beta));
let mut plot = Plot::new();
let path = format!("{}/math_plot_functions_smooth_ramp.svg", OUT_DIR);
plot.add(&curve)
.add(&text)
.grid_and_labels("$x$", "$\\mathrm{SmoothRamp}(x)$")
.set_figure_size_points(GOLDEN_RATIO * 280.0, 280.0)
.save(&path)?;
let beta = 10.0;
let y_smooth_ramp_deriv1 = xa.get_mapped(|x| math::smooth_ramp_deriv1(x, beta));
let mut curve = Curve::new();
curve
.set_line_width(2.5)
.draw(xa.as_data(), y_smooth_ramp_deriv1.as_data());
let mut plot = Plot::new();
let path = format!("{}/math_plot_functions_smooth_ramp_deriv1.svg", OUT_DIR);
plot.add(&curve)
.add(&text)
.grid_and_labels("$x$", "$\\frac{d\\mathrm{SmoothRamp}(x)}{dx}$")
.set_figure_size_points(GOLDEN_RATIO * 280.0, 280.0)
.save(&path)?;
let beta = 10.0;
let y_smooth_ramp_deriv2 = xa.get_mapped(|x| math::smooth_ramp_deriv2(x, beta));
let mut curve = Curve::new();
curve
.set_line_width(2.5)
.draw(xa.as_data(), y_smooth_ramp_deriv2.as_data());
let mut plot = Plot::new();
let path = format!("{}/math_plot_functions_smooth_ramp_deriv2.svg", OUT_DIR);
plot.add(&curve)
.add(&text)
.grid_and_labels("$x$", "$\\frac{d^2\\mathrm{SmoothRamp}(x)}{dx^2}$")
.set_figure_size_points(GOLDEN_RATIO * 280.0, 280.0)
.save(&path)?;
Ok(())
}