@Test
  public void testElementWiseOps() {
    IComplexNDArray n1 = Nd4j.complexScalar(1);
    IComplexNDArray n2 = Nd4j.complexScalar(2);
    assertEquals(Nd4j.complexScalar(3), n1.add(n2));
    assertFalse(n1.add(n2).equals(n1));

    IComplexNDArray n3 = Nd4j.complexScalar(3);
    IComplexNDArray n4 = Nd4j.complexScalar(4);
    IComplexNDArray subbed = n4.sub(n3);
    IComplexNDArray mulled = n4.mul(n3);
    IComplexNDArray div = n4.div(n3);

    assertFalse(subbed.equals(n4));
    assertFalse(mulled.equals(n4));
    assertEquals(Nd4j.complexScalar(1), subbed);
    assertEquals(Nd4j.complexScalar(12), mulled);
    assertEquals(Nd4j.complexScalar(1.3333333333333333), div);

    IComplexNDArray multiDimensionElementWise =
        Nd4j.createComplex(Nd4j.create(Nd4j.linspace(1, 24, 24).data(), new int[] {4, 3, 2}));
    IComplexNumber sum2 = multiDimensionElementWise.sumComplex();
    assertEquals(sum2, Nd4j.createDouble(300, 0));
    IComplexNDArray added = multiDimensionElementWise.add(Nd4j.complexScalar(1));
    IComplexDouble sum3 = (IComplexDouble) added.sumComplex();
    assertEquals(sum3, Nd4j.createDouble(324, 0));
  }
  @Test
  public void testComplexCalculation() {
    IComplexNDArray arr =
        Nd4j.createComplex(
            new IComplexNumber[][] {
              {Nd4j.createComplexNumber(1, 1), Nd4j.createComplexNumber(2, 1)},
              {Nd4j.createComplexNumber(3, 2), Nd4j.createComplexNumber(4, 2)}
            });

    IComplexNumber scalar = arr.sumComplex();
    double sum = scalar.realComponent().doubleValue();
    assertEquals(10, sum, 1e-1);

    double sumImag = scalar.imaginaryComponent().doubleValue();
    assertEquals(6, sumImag, 1e-1);

    IComplexNDArray res = arr.add(Nd4j.createComplexNumber(1, 1));
    scalar = res.sumComplex();
    sum = scalar.realComponent().doubleValue();
    assertEquals(14, sum, 1e-1);
    sumImag = scalar.imaginaryComponent().doubleValue();
    assertEquals(10, sumImag, 1e-1);

    // original array should keep as it is
    sum = arr.sumComplex().realComponent().doubleValue();
    assertEquals(10, sum, 1e-1);
  }
  @Test
  public void testBasicOperations() {
    IComplexNDArray arr =
        Nd4j.createComplex(new double[] {0, 1, 2, 1, 1, 2, 3, 4}, new int[] {2, 2});
    IComplexNumber scalar = arr.sumComplex();
    double sum = scalar.realComponent().doubleValue();
    assertEquals(6, sum, 1e-1);
    arr.addi(1);
    scalar = arr.sumComplex();
    sum = scalar.realComponent().doubleValue();
    assertEquals(10, sum, 1e-1);
    arr.subi(Nd4j.createDouble(1, 0));
    scalar = arr.sumComplex();

    sum = scalar.realComponent().doubleValue();
    assertEquals(6, sum, 1e-1);
  }
 @Test
 public void testSum() {
   IComplexNDArray n =
       Nd4j.createComplex(Nd4j.create(Nd4j.linspace(1, 8, 8).data(), new int[] {2, 2, 2}));
   assertEquals(Nd4j.createDouble(36, 0), n.sumComplex());
 }