// This file is part of Eigen, a lightweight C++ template library
// for linear algebra.
//
// Copyright (C) 2014 Benoit Steiner <benoit.steiner.goog@gmail.com>
//
// This Source Code Form is subject to the terms of the Mozilla
// Public License v. 2.0. If a copy of the MPL was not distributed
// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
// SPDX-License-Identifier: MPL-2.0

#include <numeric>

#include "main.h"

#include <Eigen/Tensor>

using Eigen::RowMajor;
using Eigen::Tensor;

static void test_1d() {
  Tensor<float, 1> vec1(6);
  Tensor<float, 1, RowMajor> vec2(6);

  vec1(0) = 4.0;
  vec2(0) = 0.0;
  vec1(1) = 8.0;
  vec2(1) = 1.0;
  vec1(2) = 15.0;
  vec2(2) = 2.0;
  vec1(3) = 16.0;
  vec2(3) = 3.0;
  vec1(4) = 23.0;
  vec2(4) = 4.0;
  vec1(5) = 42.0;
  vec2(5) = 5.0;

  float data3[6];
  TensorMap<Tensor<float, 1>> vec3(data3, 6);
  vec3 = vec1.sqrt();
  float data4[6];
  TensorMap<Tensor<float, 1, RowMajor>> vec4(data4, 6);
  vec4 = vec2.square();
  float data5[6];
  TensorMap<Tensor<float, 1, RowMajor>> vec5(data5, 6);
  vec5 = vec2.cube();

  VERIFY_IS_APPROX(vec3(0), sqrtf(4.0));
  VERIFY_IS_APPROX(vec3(1), sqrtf(8.0));
  VERIFY_IS_APPROX(vec3(2), sqrtf(15.0));
  VERIFY_IS_APPROX(vec3(3), sqrtf(16.0));
  VERIFY_IS_APPROX(vec3(4), sqrtf(23.0));
  VERIFY_IS_APPROX(vec3(5), sqrtf(42.0));

  VERIFY_IS_APPROX(vec4(0), 0.0f);
  VERIFY_IS_APPROX(vec4(1), 1.0f);
  VERIFY_IS_APPROX(vec4(2), 2.0f * 2.0f);
  VERIFY_IS_APPROX(vec4(3), 3.0f * 3.0f);
  VERIFY_IS_APPROX(vec4(4), 4.0f * 4.0f);
  VERIFY_IS_APPROX(vec4(5), 5.0f * 5.0f);

  VERIFY_IS_APPROX(vec5(0), 0.0f);
  VERIFY_IS_APPROX(vec5(1), 1.0f);
  VERIFY_IS_APPROX(vec5(2), 2.0f * 2.0f * 2.0f);
  VERIFY_IS_APPROX(vec5(3), 3.0f * 3.0f * 3.0f);
  VERIFY_IS_APPROX(vec5(4), 4.0f * 4.0f * 4.0f);
  VERIFY_IS_APPROX(vec5(5), 5.0f * 5.0f * 5.0f);

  vec3 = vec1 + vec2;
  VERIFY_IS_APPROX(vec3(0), 4.0f + 0.0f);
  VERIFY_IS_APPROX(vec3(1), 8.0f + 1.0f);
  VERIFY_IS_APPROX(vec3(2), 15.0f + 2.0f);
  VERIFY_IS_APPROX(vec3(3), 16.0f + 3.0f);
  VERIFY_IS_APPROX(vec3(4), 23.0f + 4.0f);
  VERIFY_IS_APPROX(vec3(5), 42.0f + 5.0f);
}

static void test_2d() {
  float data1[6];
  TensorMap<Tensor<float, 2>> mat1(data1, 2, 3);
  float data2[6];
  TensorMap<Tensor<float, 2, RowMajor>> mat2(data2, 2, 3);

  mat1(0, 0) = 0.0;
  mat1(0, 1) = 1.0;
  mat1(0, 2) = 2.0;
  mat1(1, 0) = 3.0;
  mat1(1, 1) = 4.0;
  mat1(1, 2) = 5.0;

  mat2(0, 0) = -0.0;
  mat2(0, 1) = -1.0;
  mat2(0, 2) = -2.0;
  mat2(1, 0) = -3.0;
  mat2(1, 1) = -4.0;
  mat2(1, 2) = -5.0;

  Tensor<float, 2> mat3(2, 3);
  Tensor<float, 2, RowMajor> mat4(2, 3);
  mat3 = mat1.abs();
  mat4 = mat2.abs();

  VERIFY_IS_APPROX(mat3(0, 0), 0.0f);
  VERIFY_IS_APPROX(mat3(0, 1), 1.0f);
  VERIFY_IS_APPROX(mat3(0, 2), 2.0f);
  VERIFY_IS_APPROX(mat3(1, 0), 3.0f);
  VERIFY_IS_APPROX(mat3(1, 1), 4.0f);
  VERIFY_IS_APPROX(mat3(1, 2), 5.0f);

  VERIFY_IS_APPROX(mat4(0, 0), 0.0f);
  VERIFY_IS_APPROX(mat4(0, 1), 1.0f);
  VERIFY_IS_APPROX(mat4(0, 2), 2.0f);
  VERIFY_IS_APPROX(mat4(1, 0), 3.0f);
  VERIFY_IS_APPROX(mat4(1, 1), 4.0f);
  VERIFY_IS_APPROX(mat4(1, 2), 5.0f);
}

static void test_3d() {
  Tensor<float, 3> mat1(2, 3, 7);
  Tensor<float, 3, RowMajor> mat2(2, 3, 7);

  float val = 1.0f;
  for (int i = 0; i < 2; ++i) {
    for (int j = 0; j < 3; ++j) {
      for (int k = 0; k < 7; ++k) {
        mat1(i, j, k) = val;
        mat2(i, j, k) = val;
        val += 1.0f;
      }
    }
  }

  Tensor<float, 3> mat3(2, 3, 7);
  mat3 = mat1 + mat1;
  Tensor<float, 3, RowMajor> mat4(2, 3, 7);
  mat4 = mat2 * 3.14f;
  Tensor<float, 3> mat5(2, 3, 7);
  mat5 = (mat1 + mat1.constant(1)).inverse().log();
  Tensor<float, 3, RowMajor> mat6(2, 3, 7);
  mat6 = mat2.pow(0.5f) * 3.14f;
  Tensor<float, 3> mat7(2, 3, 7);
  mat7 = mat1.cwiseMax(mat5 * 2.0f).exp();
  Tensor<float, 3, RowMajor> mat8(2, 3, 7);
  mat8 = (-mat2).exp() * 3.14f;
  Tensor<float, 3, RowMajor> mat9(2, 3, 7);
  mat9 = mat2 + 3.14f;
  Tensor<float, 3, RowMajor> mat10(2, 3, 7);
  mat10 = mat2 - 3.14f;
  Tensor<float, 3, RowMajor> mat11(2, 3, 7);
  mat11 = mat2 / 3.14f;

  val = 1.0f;
  for (int i = 0; i < 2; ++i) {
    for (int j = 0; j < 3; ++j) {
      for (int k = 0; k < 7; ++k) {
        VERIFY_IS_APPROX(mat3(i, j, k), val + val);
        VERIFY_IS_APPROX(mat4(i, j, k), val * 3.14f);
        VERIFY_IS_APPROX(mat5(i, j, k), logf(1.0f / (val + 1)));
        VERIFY_IS_APPROX(mat6(i, j, k), sqrtf(val) * 3.14f);
        VERIFY_IS_APPROX(mat7(i, j, k), expf((std::max)(val, mat5(i, j, k) * 2.0f)));
        VERIFY_IS_APPROX(mat8(i, j, k), expf(-val) * 3.14f);
        VERIFY_IS_APPROX(mat9(i, j, k), val + 3.14f);
        VERIFY_IS_APPROX(mat10(i, j, k), val - 3.14f);
        VERIFY_IS_APPROX(mat11(i, j, k), val / 3.14f);
        val += 1.0f;
      }
    }
  }
}

static void test_constants() {
  Tensor<float, 3> mat1(2, 3, 7);
  Tensor<float, 3> mat2(2, 3, 7);
  Tensor<float, 3> mat3(2, 3, 7);

  float val = 1.0f;
  for (int i = 0; i < 2; ++i) {
    for (int j = 0; j < 3; ++j) {
      for (int k = 0; k < 7; ++k) {
        mat1(i, j, k) = val;
        val += 1.0f;
      }
    }
  }
  mat2 = mat1.constant(3.14f);
  mat3 = mat1.cwiseMax(7.3f).exp();

  val = 1.0f;
  for (int i = 0; i < 2; ++i) {
    for (int j = 0; j < 3; ++j) {
      for (int k = 0; k < 7; ++k) {
        VERIFY_IS_APPROX(mat2(i, j, k), 3.14f);
        VERIFY_IS_APPROX(mat3(i, j, k), expf((std::max)(val, 7.3f)));
        val += 1.0f;
      }
    }
  }
}

static void test_boolean() {
  const int kSize = 31;
  Tensor<int, 1> vec(kSize);
  std::iota(vec.data(), vec.data() + kSize, 0);

  // Test ||.
  Tensor<bool, 1> bool1 = (vec < vec.constant(1) || vec > vec.constant(4)).cast<bool>();
  for (int i = 0; i < kSize; ++i) {
    bool expected = i < 1 || i > 4;
    VERIFY_IS_EQUAL(bool1[i], expected);
  }

  // Test &&, including cast of operand vec.
  Tensor<bool, 1> bool2 = vec.cast<bool>() && (vec < vec.constant(4)).cast<bool>();
  for (int i = 0; i < kSize; ++i) {
    bool expected = bool(i) && i < 4;
    VERIFY_IS_EQUAL(bool2[i], expected);
  }

  // Compilation tests:
  // Test Tensor<bool> against results of cast or comparison; verifies that
  // CoeffReturnType is set to match Op return type of bool for Unary and Binary
  // Ops.
  Tensor<bool, 1> bool3 = vec.cast<bool>() && bool2;
  bool3 = (vec < vec.constant(4)).cast<bool>() && bool2;
}

static void test_functors() {
  Tensor<float, 3> mat1(2, 3, 7);
  Tensor<float, 3> mat2(2, 3, 7);
  Tensor<float, 3> mat3(2, 3, 7);

  float val = 1.0f;
  for (int i = 0; i < 2; ++i) {
    for (int j = 0; j < 3; ++j) {
      for (int k = 0; k < 7; ++k) {
        mat1(i, j, k) = val;
        val += 1.0f;
      }
    }
  }
  mat2 = mat1.inverse().unaryExpr(&asinf);
  mat3 = mat1.unaryExpr(&tanhf);

  val = 1.0f;
  for (int i = 0; i < 2; ++i) {
    for (int j = 0; j < 3; ++j) {
      for (int k = 0; k < 7; ++k) {
        VERIFY_IS_APPROX(mat2(i, j, k), asinf(1.0f / mat1(i, j, k)));
        VERIFY_IS_APPROX(mat3(i, j, k), tanhf(mat1(i, j, k)));
        val += 1.0f;
      }
    }
  }
}

static void test_type_casting() {
  Tensor<bool, 3> mat1(2, 3, 7);
  Tensor<float, 3> mat2(2, 3, 7);
  Tensor<double, 3> mat3(2, 3, 7);
  mat1.setRandom();
  mat2.setRandom();

  mat3 = mat1.cast<double>();
  for (int i = 0; i < 2; ++i) {
    for (int j = 0; j < 3; ++j) {
      for (int k = 0; k < 7; ++k) {
        VERIFY_IS_APPROX(mat3(i, j, k), mat1(i, j, k) ? 1.0 : 0.0);
      }
    }
  }

  mat3 = mat2.cast<double>();
  for (int i = 0; i < 2; ++i) {
    for (int j = 0; j < 3; ++j) {
      for (int k = 0; k < 7; ++k) {
        VERIFY_IS_APPROX(mat3(i, j, k), static_cast<double>(mat2(i, j, k)));
      }
    }
  }
}

static void test_select() {
  using TypedGTOp = internal::scalar_cmp_op<float, float, internal::cmp_GT, true>;

  Tensor<float, 3> selector(2, 3, 7);
  Tensor<float, 3> mat1(2, 3, 7);
  Tensor<float, 3> mat2(2, 3, 7);
  Tensor<float, 3> result(2, 3, 7);

  selector.setRandom();
  mat1.setRandom();
  mat2.setRandom();

  // test select with a boolean condition
  result = (selector > selector.constant(0.5f)).select(mat1, mat2);

  for (int i = 0; i < 2; ++i) {
    for (int j = 0; j < 3; ++j) {
      for (int k = 0; k < 7; ++k) {
        VERIFY_IS_APPROX(result(i, j, k), (selector(i, j, k) > 0.5f) ? mat1(i, j, k) : mat2(i, j, k));
      }
    }
  }

  // test select with a typed condition
  result = selector.binaryExpr(selector.constant(0.5f), TypedGTOp()).select(mat1, mat2);

  for (int i = 0; i < 2; ++i) {
    for (int j = 0; j < 3; ++j) {
      for (int k = 0; k < 7; ++k) {
        VERIFY_IS_APPROX(result(i, j, k), (selector(i, j, k) > 0.5f) ? mat1(i, j, k) : mat2(i, j, k));
      }
    }
  }
}

// Nan propagation does currently not work like one would expect from std::max/std::min,
// so we disable it for now
#if !EIGEN_ARCH_ARM_OR_ARM64
template <typename Scalar>
void test_minmax_nan_propagation_templ() {
  for (int size = 1; size < 17; ++size) {
    const Scalar kNaN = std::numeric_limits<Scalar>::quiet_NaN();
    const Scalar kInf = std::numeric_limits<Scalar>::infinity();
    const Scalar kZero(0);
    Tensor<Scalar, 1> vec_full_nan(size);
    Tensor<Scalar, 1> vec_one_nan(size);
    Tensor<Scalar, 1> vec_zero(size);
    vec_full_nan.setConstant(kNaN);
    vec_zero.setZero();
    vec_one_nan.setZero();
    vec_one_nan(size / 2) = kNaN;

    auto verify_all_nan = [&](const Tensor<Scalar, 1>& v) {
      for (int i = 0; i < size; ++i) {
        VERIFY((numext::isnan)(v(i)));
      }
    };

    auto verify_all_zero = [&](const Tensor<Scalar, 1>& v) {
      for (int i = 0; i < size; ++i) {
        VERIFY_IS_EQUAL(v(i), Scalar(0));
      }
    };

    // Test NaN propagating max.
    // max(nan, nan) = nan
    // max(nan, 0) = nan
    // max(0, nan) = nan
    // max(0, 0) = 0
    verify_all_nan(vec_full_nan.template cwiseMax<PropagateNaN>(kNaN));
    verify_all_nan(vec_full_nan.template cwiseMax<PropagateNaN>(vec_full_nan));
    verify_all_nan(vec_full_nan.template cwiseMax<PropagateNaN>(kZero));
    verify_all_nan(vec_full_nan.template cwiseMax<PropagateNaN>(vec_zero));
    verify_all_nan(vec_zero.template cwiseMax<PropagateNaN>(kNaN));
    verify_all_nan(vec_zero.template cwiseMax<PropagateNaN>(vec_full_nan));
    verify_all_zero(vec_zero.template cwiseMax<PropagateNaN>(kZero));
    verify_all_zero(vec_zero.template cwiseMax<PropagateNaN>(vec_zero));

    // Test number propagating max.
    // max(nan, nan) = nan
    // max(nan, 0) = 0
    // max(0, nan) = 0
    // max(0, 0) = 0
    verify_all_nan(vec_full_nan.template cwiseMax<PropagateNumbers>(kNaN));
    verify_all_nan(vec_full_nan.template cwiseMax<PropagateNumbers>(vec_full_nan));
    verify_all_zero(vec_full_nan.template cwiseMax<PropagateNumbers>(kZero));
    verify_all_zero(vec_full_nan.template cwiseMax<PropagateNumbers>(vec_zero));
    verify_all_zero(vec_zero.template cwiseMax<PropagateNumbers>(kNaN));
    verify_all_zero(vec_zero.template cwiseMax<PropagateNumbers>(vec_full_nan));
    verify_all_zero(vec_zero.template cwiseMax<PropagateNumbers>(kZero));
    verify_all_zero(vec_zero.template cwiseMax<PropagateNumbers>(vec_zero));

    // Test NaN propagating min.
    // min(nan, nan) = nan
    // min(nan, 0) = nan
    // min(0, nan) = nan
    // min(0, 0) = 0
    verify_all_nan(vec_full_nan.template cwiseMin<PropagateNaN>(kNaN));
    verify_all_nan(vec_full_nan.template cwiseMin<PropagateNaN>(vec_full_nan));
    verify_all_nan(vec_full_nan.template cwiseMin<PropagateNaN>(kZero));
    verify_all_nan(vec_full_nan.template cwiseMin<PropagateNaN>(vec_zero));
    verify_all_nan(vec_zero.template cwiseMin<PropagateNaN>(kNaN));
    verify_all_nan(vec_zero.template cwiseMin<PropagateNaN>(vec_full_nan));
    verify_all_zero(vec_zero.template cwiseMin<PropagateNaN>(kZero));
    verify_all_zero(vec_zero.template cwiseMin<PropagateNaN>(vec_zero));

    // Test number propagating min.
    // min(nan, nan) = nan
    // min(nan, 0) = 0
    // min(0, nan) = 0
    // min(0, 0) = 0
    verify_all_nan(vec_full_nan.template cwiseMin<PropagateNumbers>(kNaN));
    verify_all_nan(vec_full_nan.template cwiseMin<PropagateNumbers>(vec_full_nan));
    verify_all_zero(vec_full_nan.template cwiseMin<PropagateNumbers>(kZero));
    verify_all_zero(vec_full_nan.template cwiseMin<PropagateNumbers>(vec_zero));
    verify_all_zero(vec_zero.template cwiseMin<PropagateNumbers>(kNaN));
    verify_all_zero(vec_zero.template cwiseMin<PropagateNumbers>(vec_full_nan));
    verify_all_zero(vec_zero.template cwiseMin<PropagateNumbers>(kZero));
    verify_all_zero(vec_zero.template cwiseMin<PropagateNumbers>(vec_zero));

    // Test min and max reduction
    Tensor<Scalar, 0> val;
    val = vec_zero.minimum();
    VERIFY_IS_EQUAL(val(), kZero);
    val = vec_zero.template minimum<PropagateNaN>();
    VERIFY_IS_EQUAL(val(), kZero);
    val = vec_zero.template minimum<PropagateNumbers>();
    VERIFY_IS_EQUAL(val(), kZero);
    val = vec_zero.maximum();
    VERIFY_IS_EQUAL(val(), kZero);
    val = vec_zero.template maximum<PropagateNaN>();
    VERIFY_IS_EQUAL(val(), kZero);
    val = vec_zero.template maximum<PropagateNumbers>();
    VERIFY_IS_EQUAL(val(), kZero);

    // Test NaN propagation for tensor of all NaNs.
    val = vec_full_nan.template minimum<PropagateNaN>();
    VERIFY((numext::isnan)(val()));
    val = vec_full_nan.template minimum<PropagateNumbers>();
    VERIFY_IS_EQUAL(val(), kInf);
    val = vec_full_nan.template maximum<PropagateNaN>();
    VERIFY((numext::isnan)(val()));
    val = vec_full_nan.template maximum<PropagateNumbers>();
    VERIFY_IS_EQUAL(val(), -kInf);

    // Test NaN propagation for tensor with a single NaN.
    val = vec_one_nan.template minimum<PropagateNaN>();
    VERIFY((numext::isnan)(val()));
    val = vec_one_nan.template minimum<PropagateNumbers>();
    VERIFY_IS_EQUAL(val(), (size == 1 ? kInf : kZero));
    val = vec_one_nan.template maximum<PropagateNaN>();
    VERIFY((numext::isnan)(val()));
    val = vec_one_nan.template maximum<PropagateNumbers>();
    VERIFY_IS_EQUAL(val(), (size == 1 ? -kInf : kZero));
  }
}
#else
template <typename Scalar>
void test_minmax_nan_propagation_templ() {}
#endif

static void test_clip() {
  Tensor<float, 1> vec(6);
  vec(0) = 4.0;
  vec(1) = 8.0;
  vec(2) = 15.0;
  vec(3) = 16.0;
  vec(4) = 23.0;
  vec(5) = 42.0;

  float kMin = 20;
  float kMax = 30;

  Tensor<float, 1> vec_clipped(6);
  vec_clipped = vec.clip(kMin, kMax);
  for (int i = 0; i < 6; ++i) {
    VERIFY_IS_EQUAL(vec_clipped(i), numext::mini(numext::maxi(vec(i), kMin), kMax));
  }
}

static void test_minmax_nan_propagation() {
  test_minmax_nan_propagation_templ<float>();
  test_minmax_nan_propagation_templ<double>();
}

// A scalar operand whose type differs from the tensor's Scalar (e.g. a double literal against a
// float tensor, or an int against a float tensor) must bind to the scalar operators through an
// implicit conversion rather than being deduced as a broken tensor-tensor expression.
static void test_mixed_scalar_arithmetic() {
  Tensor<float, 2> in(2, 2);
  in.setConstant(2.0f);

  Tensor<float, 2> out = in + 0.5;  // double literal
  VERIFY_IS_EQUAL(out(0, 0), 2.5f);
  out = 0.5 + in;
  VERIFY_IS_EQUAL(out(0, 0), 2.5f);
  out = in - 0.5;
  VERIFY_IS_EQUAL(out(0, 0), 1.5f);
  out = in * 2;  // int literal
  VERIFY_IS_EQUAL(out(0, 0), 4.0f);
  out = in / 0.5;
  VERIFY_IS_EQUAL(out(0, 0), 4.0f);
  out = in.cwiseMax(0.5);
  VERIFY_IS_EQUAL(out(0, 0), 2.0f);
  out = in.cwiseMin(0.5);
  VERIFY_IS_EQUAL(out(0, 0), 0.5f);

  // In-place compound assignment with a differing scalar type.
  out = in;
  out += 0.5;
  VERIFY_IS_EQUAL(out(0, 0), 2.5f);
  out -= 0.5;
  VERIFY_IS_EQUAL(out(0, 0), 2.0f);
  out *= 2;  // int literal
  VERIFY_IS_EQUAL(out(0, 0), 4.0f);
  out /= 0.5;
  VERIFY_IS_EQUAL(out(0, 0), 8.0f);

  // Tensor-tensor operators must keep working through the constrained overloads.
  Tensor<float, 2> other(2, 2);
  other.setConstant(3.0f);
  out = in + other;
  VERIFY_IS_EQUAL(out(0, 0), 5.0f);
  out += other;
  VERIFY_IS_EQUAL(out(0, 0), 8.0f);
  out = in.cwiseMax(other);
  VERIFY_IS_EQUAL(out(0, 0), 3.0f);
}

template <typename Scalar>
static void test_const_tensor_map_scalar_arithmetic() {
  Tensor<Scalar, 1> storage(2);
  storage.setConstant(Scalar(2));
  const TensorMap<const Tensor<Scalar, 1>> input(storage.data(), storage.dimensions());
  const Scalar scale = Scalar(3);

  Tensor<Scalar, 1> output = scale * input;
  VERIFY_IS_EQUAL(output(0), Scalar(6));
  VERIFY_IS_EQUAL(output(1), Scalar(6));
}

// A scalar on the left of a comparison reflects to the member comparison: scalar < tensor is
// tensor > scalar, etc. The scalar type may differ from the tensor Scalar.
static void test_scalar_lhs_comparison() {
  Tensor<float, 1> v(5);
  for (int i = 0; i < 5; ++i) v(i) = float(i);  // 0, 1, 2, 3, 4

  Tensor<bool, 1> lt = (2.0 < v);   // true where v > 2
  Tensor<bool, 1> le = (2.0 <= v);  // true where v >= 2
  Tensor<bool, 1> gt = (2.0 > v);   // true where v < 2
  Tensor<bool, 1> ge = (2.0 >= v);  // true where v <= 2
  Tensor<bool, 1> eq = (3.0 == v);  // true where v == 3
  Tensor<bool, 1> ne = (3.0 != v);  // true where v != 3
  for (int i = 0; i < 5; ++i) {
    VERIFY_IS_EQUAL(lt(i), v(i) > 2.0f);
    VERIFY_IS_EQUAL(le(i), v(i) >= 2.0f);
    VERIFY_IS_EQUAL(gt(i), v(i) < 2.0f);
    VERIFY_IS_EQUAL(ge(i), v(i) <= 2.0f);
    VERIFY_IS_EQUAL(eq(i), v(i) == 3.0f);
    VERIFY_IS_EQUAL(ne(i), v(i) != 3.0f);
  }
}

EIGEN_DECLARE_TEST(tensor_expr) {
  CALL_SUBTEST(test_1d());
  CALL_SUBTEST(test_2d());
  CALL_SUBTEST(test_3d());
  CALL_SUBTEST(test_constants());
  CALL_SUBTEST(test_boolean());
  CALL_SUBTEST(test_functors());
  CALL_SUBTEST(test_type_casting());
  CALL_SUBTEST(test_select());
  CALL_SUBTEST(test_clip());
  CALL_SUBTEST(test_minmax_nan_propagation());
  CALL_SUBTEST(test_mixed_scalar_arithmetic());
  CALL_SUBTEST(test_const_tensor_map_scalar_arithmetic<Eigen::half>());
  CALL_SUBTEST(test_const_tensor_map_scalar_arithmetic<Eigen::bfloat16>());
  CALL_SUBTEST(test_scalar_lhs_comparison());
}
