// activations.mbt
///|
/// Exponential function approximation using Taylor series.
pub fn exp(x : Double) -> Double {
if x == 0.0 {
return 1.0
}
let x_int = x.to_int()
let t = x - x_int.to_double()
let exp_t = 1.0 +
t +
t * t / 2.0 +
t * t * t / 6.0 +
t * t * t * t / 24.0 +
t * t * t * t * t / 120.0 +
t * t * t * t * t * t / 720.0 +
t * t * t * t * t * t * t / 5040.0
let e = 2.718281828459045
let mut exp_int = 1.0
if x_int > 0 {
for _ in 0.. Double {
if x <= 0.0 {
return -1000000000.0
}
let mut y = 0.0
for temp = x; temp > 2.0; temp = temp / 2.718281828459045 {
y = y + 1.0
}
for temp = x; temp < 0.5; temp = temp * 2.718281828459045 {
y = y - 1.0
}
for _ in 0..<5 {
let ey = exp(y)
y = y - 1.0 + x / ey
}
y
}
///|
/// Rectified Linear Unit (ReLU) activation.
pub fn Tensor::relu(self : Tensor) -> Tensor {
let size = self.data.length()
let data = Array::make(size, 0.0)
for i in 0.. 0.0 { v } else { 0.0 }
}
let req_grad = self.requires_grad
let out = Tensor::new(data, self.shape, requires_grad=req_grad)
if req_grad {
out.creator = Some(ReLU(self))
}
out
}
///|
/// Sigmoid activation.
pub fn Tensor::sigmoid(self : Tensor) -> Tensor {
let size = self.data.length()
let data = Array::make(size, 0.0)
for i in 0.. Tensor {
let size = self.data.length()
let data = Array::make(size, 0.0)
for i in 0..