// 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));
      }
    }
  }

  // Test select with a materialized Tensor<bool> condition (including const TensorMap) across types and boundary sizes.
  for (int n : {0, 1, 7, 8, 15, 16, 17, 31, 32, 33}) {
    Tensor<bool, 1> cond(n);
    for (int i = 0; i < n; ++i) cond(i) = (i % 3) == 0;
    TensorMap<Tensor<const bool, 1>> const_cond_map(cond.data(), n);
    auto check_materialized_select = [&](auto dummy) {
      using T = decltype(dummy);
      Tensor<T, 1> a(n), b(n), out(n), out_const(n);
      a.setRandom();
      b.setRandom();
      TensorMap<Tensor<const T, 1>> const_a_map(a.data(), n);
      TensorMap<Tensor<const T, 1>> const_b_map(b.data(), n);
      out = cond.select(a, b);
      out_const = const_cond_map.select(const_a_map, const_b_map);
      for (int i = 0; i < n; ++i) {
        VERIFY_IS_EQUAL(out(i), cond(i) ? a(i) : b(i));
        VERIFY_IS_EQUAL(out_const(i), cond(i) ? a(i) : b(i));
      }
    };
    check_materialized_select(float(0));
    check_materialized_select(int(0));
    check_materialized_select(Eigen::half(0));
    check_materialized_select(Eigen::bfloat16(0));
    check_materialized_select(double(0));
  }

  // Test select with a non-bool condition whose scalar type differs from the branch type.
  {
    Tensor<float, 1> fcond(17);
    Tensor<int, 1> ia(17), ib(17), iout(17);
    for (int i = 0; i < 17; ++i) {
      fcond(i) = (i % 2 == 0) ? 0.5f : 0.0f;
      ia(i) = i + 10;
      ib(i) = -(i + 10);
    }
    iout = fcond.select(ia, ib);
    for (int i = 0; i < 17; ++i) {
      VERIFY_IS_EQUAL(iout(i), fcond(i) ? ia(i) : ib(i));
    }
  }
}

// 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());
}
