Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
96 changes: 62 additions & 34 deletions include/hyperjet/hyperjet.h
Original file line number Diff line number Diff line change
Expand Up @@ -1746,9 +1746,14 @@ log10(const DDScalar<TOrder, TScalar, TSize> &a) {
return a.log10();
}

template <typename TScalar> class SScalar {
// Derivatives keyed by name rather than by index. The variable set does not
// have to be known in advance: an operation takes the union of the names of its
// operands. Second order is not implemented yet, hence the constraint.
template <index TOrder, typename TScalar = double>
requires(TOrder == 1)
class SScalar {
public: // types
using Type = SScalar<TScalar>;
using Type = SScalar<TOrder, TScalar>;
using Scalar = TScalar;

// The interface type for construction and eval. A map is what callers, and
Expand Down Expand Up @@ -2341,147 +2346,170 @@ template <typename TScalar> class SScalar {

// std::abs

template <typename TScalar> SScalar<TScalar> abs(const SScalar<TScalar> &a) {
template <index TOrder, typename TScalar>
SScalar<TOrder, TScalar> abs(const SScalar<TOrder, TScalar> &a) {
return a.abs();
}

// std::pow

template <typename TScalar>
SScalar<TScalar> pow(const SScalar<TScalar> &a, const index b) {
template <index TOrder, typename TScalar>
SScalar<TOrder, TScalar> pow(const SScalar<TOrder, TScalar> &a, const index b) {
return a.pow(b);
}

template <typename TScalar>
SScalar<TScalar> pow(const SScalar<TScalar> &a, const TScalar b) {
template <index TOrder, typename TScalar>
SScalar<TOrder, TScalar> pow(const SScalar<TOrder, TScalar> &a,
const TScalar b) {
return a.pow(b);
}

// std::sqrt

template <typename TScalar> SScalar<TScalar> sqrt(const SScalar<TScalar> &a) {
template <index TOrder, typename TScalar>
SScalar<TOrder, TScalar> sqrt(const SScalar<TOrder, TScalar> &a) {
return a.sqrt();
}

// std::cbrt

template <typename TScalar> SScalar<TScalar> cbrt(const SScalar<TScalar> &a) {
template <index TOrder, typename TScalar>
SScalar<TOrder, TScalar> cbrt(const SScalar<TOrder, TScalar> &a) {
return a.cbrt();
}

// std::cos

template <typename TScalar> SScalar<TScalar> cos(const SScalar<TScalar> &a) {
template <index TOrder, typename TScalar>
SScalar<TOrder, TScalar> cos(const SScalar<TOrder, TScalar> &a) {
return a.cos();
}

// std::sin

template <typename TScalar> SScalar<TScalar> sin(const SScalar<TScalar> &a) {
template <index TOrder, typename TScalar>
SScalar<TOrder, TScalar> sin(const SScalar<TOrder, TScalar> &a) {
return a.sin();
}

// std::tan

template <typename TScalar> SScalar<TScalar> tan(const SScalar<TScalar> &a) {
template <index TOrder, typename TScalar>
SScalar<TOrder, TScalar> tan(const SScalar<TOrder, TScalar> &a) {
return a.tan();
}

// std::acos

template <typename TScalar> SScalar<TScalar> acos(const SScalar<TScalar> &a) {
template <index TOrder, typename TScalar>
SScalar<TOrder, TScalar> acos(const SScalar<TOrder, TScalar> &a) {
return a.acos();
}

// std::asin

template <typename TScalar> SScalar<TScalar> asin(const SScalar<TScalar> &a) {
template <index TOrder, typename TScalar>
SScalar<TOrder, TScalar> asin(const SScalar<TOrder, TScalar> &a) {
return a.asin();
}

// std::atan

template <typename TScalar> SScalar<TScalar> atan(const SScalar<TScalar> &a) {
template <index TOrder, typename TScalar>
SScalar<TOrder, TScalar> atan(const SScalar<TOrder, TScalar> &a) {
return a.atan();
}

// std::atan2

template <typename TScalar>
SScalar<TScalar> atan2(const SScalar<TScalar> &a, const SScalar<TScalar> &b) {
template <index TOrder, typename TScalar>
SScalar<TOrder, TScalar> atan2(const SScalar<TOrder, TScalar> &a,
const SScalar<TOrder, TScalar> &b) {
return a.atan2(b);
}

// std::hypot

template <typename TScalar>
SScalar<TScalar> hypot(const SScalar<TScalar> &a, const SScalar<TScalar> &b) {
return SScalar<TScalar>::hypot(a, b);
template <index TOrder, typename TScalar>
SScalar<TOrder, TScalar> hypot(const SScalar<TOrder, TScalar> &a,
const SScalar<TOrder, TScalar> &b) {
return SScalar<TOrder, TScalar>::hypot(a, b);
}

template <typename TScalar>
SScalar<TScalar> hypot(const SScalar<TScalar> &a, const SScalar<TScalar> &b,
const SScalar<TScalar> &c) {
return SScalar<TScalar>::hypot(a, b, c);
template <index TOrder, typename TScalar>
SScalar<TOrder, TScalar> hypot(const SScalar<TOrder, TScalar> &a,
const SScalar<TOrder, TScalar> &b,
const SScalar<TOrder, TScalar> &c) {
return SScalar<TOrder, TScalar>::hypot(a, b, c);
}

// std::cosh

template <typename TScalar> SScalar<TScalar> cosh(const SScalar<TScalar> &a) {
template <index TOrder, typename TScalar>
SScalar<TOrder, TScalar> cosh(const SScalar<TOrder, TScalar> &a) {
return a.cosh();
}

// std::sinh

template <typename TScalar> SScalar<TScalar> sinh(const SScalar<TScalar> &a) {
template <index TOrder, typename TScalar>
SScalar<TOrder, TScalar> sinh(const SScalar<TOrder, TScalar> &a) {
return a.sinh();
}

// std::tanh

template <typename TScalar> SScalar<TScalar> tanh(const SScalar<TScalar> &a) {
template <index TOrder, typename TScalar>
SScalar<TOrder, TScalar> tanh(const SScalar<TOrder, TScalar> &a) {
return a.tanh();
}

// std::acosh

template <typename TScalar> SScalar<TScalar> acosh(const SScalar<TScalar> &a) {
template <index TOrder, typename TScalar>
SScalar<TOrder, TScalar> acosh(const SScalar<TOrder, TScalar> &a) {
return a.acosh();
}

// std::asin

template <typename TScalar> SScalar<TScalar> asinh(const SScalar<TScalar> &a) {
template <index TOrder, typename TScalar>
SScalar<TOrder, TScalar> asinh(const SScalar<TOrder, TScalar> &a) {
return a.asinh();
}

// std::atan

template <typename TScalar> SScalar<TScalar> atanh(const SScalar<TScalar> &a) {
template <index TOrder, typename TScalar>
SScalar<TOrder, TScalar> atanh(const SScalar<TOrder, TScalar> &a) {
return a.atanh();
}

// std::exp

template <typename TScalar> SScalar<TScalar> exp(const SScalar<TScalar> &a) {
template <index TOrder, typename TScalar>
SScalar<TOrder, TScalar> exp(const SScalar<TOrder, TScalar> &a) {
return a.exp();
}

// std::log

template <typename TScalar> SScalar<TScalar> log(const SScalar<TScalar> &a) {
template <index TOrder, typename TScalar>
SScalar<TOrder, TScalar> log(const SScalar<TOrder, TScalar> &a) {
return a.log();
}

// std::log2

template <typename TScalar> SScalar<TScalar> log2(const SScalar<TScalar> &a) {
template <index TOrder, typename TScalar>
SScalar<TOrder, TScalar> log2(const SScalar<TOrder, TScalar> &a) {
return a.log2();
}

// std::log10

template <typename TScalar> SScalar<TScalar> log10(const SScalar<TScalar> &a) {
template <index TOrder, typename TScalar>
SScalar<TOrder, TScalar> log10(const SScalar<TOrder, TScalar> &a) {
return a.log10();
}

Expand Down
2 changes: 1 addition & 1 deletion python/src/bind_sscalar.cpp
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
#include "common.h"

void bind_sscalar(pybind11::module &m) {
using T = hj::SScalar<double>;
using T = hj::SScalar<1, double>;

auto cls = py::class_<T>(m, "SScalar");

Expand Down
12 changes: 6 additions & 6 deletions test/src/test.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -627,12 +627,12 @@ TEST_CASE("Dynamic size checks") {
CHECK_THROWS_AS(b.hm("full", out_too_small), std::runtime_error);
}

const SScalar<double> s1(3.0, {{"x", 1.0}, {"y", 6.0}, {"z", 4.0}});
const SScalar<double> s2(4.0, {{"x", 7.0}, {"y", 1.0}});
const SScalar<double> s3(0.3, {{"x", 0.1}, {"y", 0.8}, {"z", 0.2}});
const SScalar<1, double> s1(3.0, {{"x", 1.0}, {"y", 6.0}, {"z", 4.0}});
const SScalar<1, double> s2(4.0, {{"x", 7.0}, {"y", 1.0}});
const SScalar<1, double> s3(0.3, {{"x", 0.1}, {"y", 0.8}, {"z", 0.2}});

TEST_CASE("SScalar init") {
using Dual = SScalar<double>;
using Dual = SScalar<1, double>;

const auto x = Dual(1.5, {{"x", 2.0}, {"y", 1.0}});

Expand All @@ -646,7 +646,7 @@ TEST_CASE("SScalar init") {
}

TEST_CASE("SScalar constant") {
using Dual = SScalar<double>;
using Dual = SScalar<1, double>;

const auto x = Dual::constant(1.5);

Expand All @@ -659,7 +659,7 @@ TEST_CASE("SScalar constant") {
}

TEST_CASE("SScalar variable") {
using Dual = SScalar<double>;
using Dual = SScalar<1, double>;

const auto x = Dual::variable("x", 1.5);

Expand Down
2 changes: 1 addition & 1 deletion test/src/test_sscalar.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@

namespace {

using S = hyperjet::SScalar<double>;
using S = hyperjet::SScalar<1, double>;

const S s1(3.0, {{"x", 1.0}, {"y", 6.0}, {"z", 4.0}});
const S s2(4.0, {{"x", 7.0}, {"y", 1.0}});
Expand Down
Loading