def test_inequality(value1, value2): scalar1 = chainerx.Scalar(value1) scalar2 = chainerx.Scalar(value2) assert scalar1 != scalar2 assert scalar2 != scalar1 assert scalar2 != value1 assert value1 != scalar2 assert scalar1 != value2 assert value2 != scalar1
def test_sub_scalar(scalar, device, shape, dtype): if dtype == 'bool_': # Boolean subtract is deprecated. return chainerx.testing.ignore() x_np = array_utils.create_dummy_ndarray(numpy, shape, dtype) # Implicit casting in NumPy's multiply depends on the 'casting' argument, # which is not yet supported (ChainerX always casts). # Therefore, we explicitly cast the scalar to the dtype of the ndarray # before the multiplication for NumPy. expected = x_np - numpy.dtype(dtype).type(scalar) expected_rev = numpy.dtype(dtype).type(scalar) - x_np x = chainerx.array(x_np) scalar_chx = chainerx.Scalar(scalar, dtype) chainerx.testing.assert_array_equal_ex(x - scalar, expected) chainerx.testing.assert_array_equal_ex(x - scalar_chx, expected) chainerx.testing.assert_array_equal_ex(scalar - x, expected_rev) chainerx.testing.assert_array_equal_ex(scalar_chx - x, expected_rev) chainerx.testing.assert_array_equal_ex(chainerx.subtract(x, scalar), expected) chainerx.testing.assert_array_equal_ex(chainerx.subtract(x, scalar_chx), expected) chainerx.testing.assert_array_equal_ex(chainerx.subtract(scalar, x), expected_rev) chainerx.testing.assert_array_equal_ex(chainerx.subtract(scalar_chx, x), expected_rev)
def test_full_with_scalar(shape, dtype, value, device): scalar = chainerx.Scalar(value, dtype) a = chainerx.full(shape, scalar) if scalar.dtype.kind == 'f' and math.isnan(float(scalar)): assert all([math.isnan(el) for el in a._debug_flat_data]) else: assert a._debug_flat_data == [scalar.tolist()] * a.size
def test_init_without_dtype(value, dtype): scalar = chainerx.Scalar(value) assert scalar.dtype == dtype if math.isnan(value): assert math.isnan(scalar.tolist()) else: assert scalar.tolist() == value assert isinstance(scalar.tolist(), type(value))
def test_init_casted(value, cast_dtype, expected_value): scalar = chainerx.Scalar(value, cast_dtype) assert scalar.dtype == cast_dtype if math.isnan(expected_value): assert math.isnan(scalar.tolist()) else: assert scalar.tolist() == expected_value assert isinstance(scalar.tolist(), type(expected_value))
def test_equality(value1, value2): scalar1 = chainerx.Scalar(value1) scalar2 = chainerx.Scalar(value2) assert scalar1 == scalar2 assert scalar2 == scalar1 assert scalar1 == value1 assert value1 == scalar1 assert scalar2 == value2 assert value2 == scalar2 assert scalar2 == value1 assert value1 == scalar2 assert scalar1 == value2 assert value2 == scalar1
def test_cast(value): scalar = chainerx.Scalar(value) _check_cast_scalar_equals_data(scalar, value) _check_cast_scalar_equals_data(+scalar, +value) if isinstance(value, bool): with pytest.raises(chainerx.DtypeError): -scalar # should not be able to negate bool else: _check_cast_scalar_equals_data(-scalar, -value)
def test_dtype(value): scalar = chainerx.Scalar(value) if isinstance(value, bool): assert scalar.dtype == chainerx.bool_ elif isinstance(value, int): assert scalar.dtype == chainerx.int64 elif isinstance(value, float): assert scalar.dtype == chainerx.float64 else: assert False
def test_truediv_scalar(scalar, device, shape, numeric_dtype): x_np = array_utils.create_dummy_ndarray(numpy, shape, numeric_dtype) expected = x_np / scalar x = chainerx.array(x_np) scalar_chx = chainerx.Scalar(scalar, numeric_dtype) chainerx.testing.assert_array_equal_ex( x / scalar, expected, strides_check=False) chainerx.testing.assert_array_equal_ex( x / scalar_chx, expected, strides_check=False) chainerx.testing.assert_array_equal_ex( chainerx.divide(x, scalar), expected, strides_check=False) chainerx.testing.assert_array_equal_ex( chainerx.divide(x, scalar_chx), expected, strides_check=False)
def test_truediv_scalar(scalar, device, shape, numeric_dtype): x_np = array_utils.create_dummy_ndarray(numpy, shape, numeric_dtype) if 'int' in numeric_dtype: # NumPy does not support itruediv to integer arrays. expected = (x_np / scalar).astype(numeric_dtype) else: expected = x_np / scalar x = chainerx.array(x_np) scalar_chx = chainerx.Scalar(scalar, numeric_dtype) chainerx.testing.assert_array_equal_ex(x / scalar, expected) chainerx.testing.assert_array_equal_ex(x / scalar_chx, expected) chainerx.testing.assert_array_equal_ex(chainerx.divide(x, scalar), expected) chainerx.testing.assert_array_equal_ex(chainerx.divide(x, scalar_chx), expected)
def test_add_scalar(scalar, device, shape, dtype): x_np = array_utils.create_dummy_ndarray(numpy, shape, dtype) # Implicit casting in NumPy's multiply depends on the 'casting' argument, # which is not yet supported (ChainerX always casts). # Therefore, we explicitly cast the scalar to the dtype of the ndarray # before the multiplication for NumPy. expected = x_np + numpy.dtype(dtype).type(scalar) x = chainerx.array(x_np) scalar_chx = chainerx.Scalar(scalar, dtype) chainerx.testing.assert_array_equal_ex(x + scalar, expected) chainerx.testing.assert_array_equal_ex(x + scalar_chx, expected) chainerx.testing.assert_array_equal_ex(scalar + x, expected) chainerx.testing.assert_array_equal_ex(scalar_chx + x, expected) chainerx.testing.assert_array_equal_ex(chainerx.add(x, scalar), expected) chainerx.testing.assert_array_equal_ex(chainerx.add(x, scalar_chx), expected) chainerx.testing.assert_array_equal_ex(chainerx.add(scalar, x), expected) chainerx.testing.assert_array_equal_ex(chainerx.add(scalar_chx, x), expected)
def test_fill_with_scalar(xp, device, shape, dtype, value): a = xp.empty(shape, dtype) if xp is chainerx: value = chainerx.Scalar(value, dtype) a.fill(value) return a
@pytest.mark.parametrize('shape', [(), (1, ), (2, 3)]) def test_assert_array_equal_fail(shape, dtype): a, b = _make_onehot_arrays(shape, dtype, 0, 2) with pytest.raises(AssertionError): chainerx.testing.assert_array_equal(a, b) @pytest.mark.parametrize('value1,value2', [ (True, 1), (True, 1.0), (False, 0), (False, 0.0), (2.0, 2), (numpy.int32(2), 2.0), (chainerx.Scalar(2), 2.0), (chainerx.Scalar(2, chainerx.int64), numpy.float32(2)), (float('nan'), numpy.float32('nan')), ]) def test_assert_array_equal_scalar(value1, value2): chainerx.testing.assert_array_equal(value1, value2) chainerx.testing.assert_array_equal(value2, value1) @pytest.mark.parametrize('value1,value2', [ (2, 3), (2.0, 3), (True, 0), (True, -1), (False, 1), (float('nan'), float('inf')),
def test_init_invalid(): with pytest.raises(TypeError): chainerx.Scalar("1") # string, which is not a numeric
def test_repr(value): scalar = chainerx.Scalar(value) assert repr(scalar) == repr(value) assert str(scalar) == str(value)
def test_init_with_dtype(value, dtype_spec): expected_dtype = chainerx.dtype(dtype_spec) scalar = chainerx.Scalar(value, dtype_spec) assert scalar.dtype == expected_dtype assert scalar == chainerx.Scalar(value, expected_dtype)