scalar-autograd
Version:
Scalar-based reverse-mode automatic differentiation in TypeScript.
50 lines (49 loc) • 1.73 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.ValueTrig = void 0;
const Value_1 = require("./Value");
class ValueTrig {
static sin(x) {
const s = Math.sin(x.data);
return Value_1.Value.make(s, x, null, (out) => () => {
if (x.requiresGrad)
x.grad += Math.cos(x.data) * out.grad;
}, `sin(${x.label})`);
}
static cos(x) {
const c = Math.cos(x.data);
return Value_1.Value.make(c, x, null, (out) => () => {
if (x.requiresGrad)
x.grad += -Math.sin(x.data) * out.grad;
}, `cos(${x.label})`);
}
static tan(x) {
const t = Math.tan(x.data);
return Value_1.Value.make(t, x, null, (out) => () => {
if (x.requiresGrad)
x.grad += (1 / (Math.cos(x.data) ** 2)) * out.grad;
}, `tan(${x.label})`);
}
static asin(x) {
const s = Math.asin(x.data);
return Value_1.Value.make(s, x, null, (out) => () => {
if (x.requiresGrad)
x.grad += (1 / Math.sqrt(1 - x.data * x.data)) * out.grad;
}, `asin(${x.label})`);
}
static acos(x) {
const c = Math.acos(x.data);
return Value_1.Value.make(c, x, null, (out) => () => {
if (x.requiresGrad)
x.grad += (-1 / Math.sqrt(1 - x.data * x.data)) * out.grad;
}, `acos(${x.label})`);
}
static atan(x) {
const a = Math.atan(x.data);
return Value_1.Value.make(a, x, null, (out) => () => {
if (x.requiresGrad)
x.grad += (1 / (1 + x.data * x.data)) * out.grad;
}, `atan(${x.label})`);
}
}
exports.ValueTrig = ValueTrig;