Skip to content

Commit

Permalink
completed arithmetic and transcendental
Browse files Browse the repository at this point in the history
  • Loading branch information
lucaferranti committed Jun 10, 2022
1 parent 2898e90 commit a6d688f
Show file tree
Hide file tree
Showing 4 changed files with 44 additions and 10 deletions.
5 changes: 1 addition & 4 deletions src/ForwardModeAD.chpl
Original file line number Diff line number Diff line change
Expand Up @@ -33,9 +33,6 @@ module ForwardModeAD {
}

proc main() {
var x = new DualNumber(0.0, 0.0);
var y = new DualNumber(1e-16, -1e-16);
writeln(isclose(0.0, 1e-16, atol=1e-10));
writeln(isclose(x, y, atol=1e-10));
var x = new DualNumber(-1, 0.0);
}
}
7 changes: 7 additions & 0 deletions src/arithmetic.chpl
Original file line number Diff line number Diff line change
Expand Up @@ -27,4 +27,11 @@ module arithmetic {
return new DualNumber(prim(a) ** b, b * (prim(a) ** (b - 1)) * dual(a));
}

proc sqrt(a : DualNumber) {
return new DualNumber(sqrt(prim(a)), 0.5 * dual(a) / sqrt(prim(a)));
}

proc cbrt(a : DualNumber) {
return new DualNumber(cbrt(prim(a)), 1.0 / 3.0 * dual(a) / cbrt(prim(a) ** 2));
}
}
21 changes: 16 additions & 5 deletions src/transcendental.chpl
Original file line number Diff line number Diff line change
@@ -1,17 +1,28 @@
module transcendental {
use ForwardModeAD;

operator **(a : real, b : DualNumber) {
return new DualNumber(a ** prim(b), log(a) * (a ** prim(b)) * dual(b));
}


operator **(a : DualNumber, b : DualNumber) {
var f = prim(a) ** prim(b);
var df = f * (dual(b) * log(prim(a)) + prim(b) * dual(a) / prim(a));
return new DualNumber(f, df);
}

proc exp(a : DualNumber) { return new DualNumber(exp(prim(a)), dual(a) * exp(prim(a))); }

proc exp2(a : DualNumber) {}
proc exp2(a : DualNumber) {return new DualNumber(exp2(prim(a)), ln_2 * exp2(prim(a)) * dual(a));}

proc expm1(a : DualNumber) {}
proc expm1(a : DualNumber) {return new DualNumber(expm1(prim(a)), exp(prim(a)) * dual(a));}

proc log(a : DualNumber) { return new DualNumber(log(prim(a)), dual(a) / prim(a)); }

proc log2(a : DualNumber) {}
proc log2(a : DualNumber) {return new DualNumber(log2(prim(a)), dual(a)/(prim(a) * ln_2));}

proc log10(a : DualNumber) {}
proc log10(a : DualNumber) {return new DualNumber(log10(prim(a)), dual(a) / (prim(a) * ln_10));}

proc log1p(a : DualNumber) {}
proc log1p(a : DualNumber) {return new DualNumber(log1p(prim(a)), dual(a) / (prim(a) + 1));}
}
21 changes: 20 additions & 1 deletion test/test_dual_algebra.chpl
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,9 @@ proc test_arithmetic_operations(test : borrowed Test) throws {

test.assertEqual(y ** 3, new DualNumber(27, 108));
test.assertEqual(y ** 0.4, new DualNumber(1.5518455739153598, 0.8276509727548587));

test.assertEqual(sqrt(y), new DualNumber(sqrt(3), 2.0 / sqrt(3)));
test.assertEqual(cbrt(y), new DualNumber(cbrt(3), 4.0 / 3.0 / cbrt(9)));
}


Expand All @@ -46,7 +49,23 @@ proc test_trigonometric_operations(test : borrowed Test) throws {
}

proc test_transcendental_functions(test : borrowed Test) throws {

var x = new DualNumber(2, 3);

test.assertEqual(2 ** x, new DualNumber(4, 12 * ln_2));

test.assertEqual(x ** x, new DualNumber(4, 12 * (ln_2 + 1)));

test.assertEqual(exp(x), new DualNumber(exp(2), 3 * exp(2)));

test.assertEqual(exp2(x), new DualNumber(4, 12 * ln_2));

test.assertEqual(expm1(x), new DualNumber(expm1(2), 3 * exp(2)));

test.assertEqual(log(x), new DualNumber(ln_2, 1.5));

test.assertEqual(log2(x), new DualNumber(1, 1.5 / ln_2));

test.assertEqual(log1p(x), new DualNumber(log1p(2), 1));
}

proc test_hyperbolic_functions(test : borrowed Test) throws {
Expand Down

0 comments on commit a6d688f

Please sign in to comment.