| @@ -199,6 +199,9 @@ MS_REG_GPU_KERNEL_ONE( | |||||
| MS_REG_GPU_KERNEL_ONE( | MS_REG_GPU_KERNEL_ONE( | ||||
| Div, KernelAttr().AddInputAttr(kNumberTypeInt32).AddInputAttr(kNumberTypeInt32).AddOutputAttr(kNumberTypeInt32), | Div, KernelAttr().AddInputAttr(kNumberTypeInt32).AddInputAttr(kNumberTypeInt32).AddOutputAttr(kNumberTypeInt32), | ||||
| BroadcastOpGpuKernel, int) | BroadcastOpGpuKernel, int) | ||||
| MS_REG_GPU_KERNEL_ONE( | |||||
| RealDiv, KernelAttr().AddInputAttr(kNumberTypeInt32).AddInputAttr(kNumberTypeInt32).AddOutputAttr(kNumberTypeInt32), | |||||
| BroadcastOpGpuKernel, int) | |||||
| MS_REG_GPU_KERNEL_ONE( | MS_REG_GPU_KERNEL_ONE( | ||||
| DivNoNan, KernelAttr().AddInputAttr(kNumberTypeInt32).AddInputAttr(kNumberTypeInt32).AddOutputAttr(kNumberTypeInt32), | DivNoNan, KernelAttr().AddInputAttr(kNumberTypeInt32).AddInputAttr(kNumberTypeInt32).AddOutputAttr(kNumberTypeInt32), | ||||
| BroadcastOpGpuKernel, int) | BroadcastOpGpuKernel, int) | ||||
| @@ -516,7 +516,8 @@ def linspace(start, stop, num=50, endpoint=True, retstep=False, dtype=None, axis | |||||
| iota_shape = _tuple_slice(iota_shape, None, axis) + (num,) + _tuple_slice(iota_shape, axis+1, None) | iota_shape = _tuple_slice(iota_shape, None, axis) + (num,) + _tuple_slice(iota_shape, axis+1, None) | ||||
| num_tensor = _type_convert(Tensor, num).astype(mstype.float32) | num_tensor = _type_convert(Tensor, num).astype(mstype.float32) | ||||
| div = (num_tensor - 1) if endpoint else num_tensor | div = (num_tensor - 1) if endpoint else num_tensor | ||||
| out = None | |||||
| delta = None | |||||
| if num > 1: | if num > 1: | ||||
| delta = (stop - start) / div | delta = (stop - start) / div | ||||
| # This is similar to how numpy and jax compute linspace | # This is similar to how numpy and jax compute linspace | ||||
| @@ -530,8 +531,7 @@ def linspace(start, stop, num=50, endpoint=True, retstep=False, dtype=None, axis | |||||
| delta = nan if endpoint else stop - start | delta = nan if endpoint else stop - start | ||||
| out = reshape(start, bounds_shape) | out = reshape(start, bounds_shape) | ||||
| else: # num == 0 | else: # num == 0 | ||||
| delta = nan | |||||
| out = _type_convert(Tensor, []).astype(dtype) | |||||
| _raise_value_error("cannot support Tensor with num=0.") | |||||
| if retstep: | if retstep: | ||||
| return out.astype(dtype), delta | return out.astype(dtype), delta | ||||
| return out.astype(dtype) | return out.astype(dtype) | ||||
| @@ -631,7 +631,7 @@ def geomspace(start, stop, num=50, endpoint=True, dtype=None, axis=0): | |||||
| root = num | root = num | ||||
| if endpoint: | if endpoint: | ||||
| root -= 1 | root -= 1 | ||||
| bases = F.tensor_pow(F.tensor_div(stop, start), asarray_const(1/(root))) | |||||
| bases = F.tensor_pow(F.tensor_div(stop, start), asarray_const(1./(root))) | |||||
| exponents = linspace(zeros(F.shape(bases)), F.fill(F.dtype(bases), F.shape(bases), root), | exponents = linspace(zeros(F.shape(bases)), F.fill(F.dtype(bases), F.shape(bases), root), | ||||
| num, endpoint=endpoint, dtype=dtype, axis=axis) | num, endpoint=endpoint, dtype=dtype, axis=axis) | ||||
| shape = F.shape(bases) | shape = F.shape(bases) | ||||
| @@ -1422,6 +1422,8 @@ def _split(x, indices_or_sections, opname, axis=0): | |||||
| arr_shape = x.shape | arr_shape = x.shape | ||||
| length_along_dim = arr_shape[axis] | length_along_dim = arr_shape[axis] | ||||
| if isinstance(indices_or_sections, int): | if isinstance(indices_or_sections, int): | ||||
| if indices_or_sections > length_along_dim: | |||||
| _raise_value_error("empty tensor encountered.") | |||||
| if opname == "split" or length_along_dim % indices_or_sections == 0: | if opname == "split" or length_along_dim % indices_or_sections == 0: | ||||
| res = P.Split(axis, indices_or_sections)(x) | res = P.Split(axis, indices_or_sections)(x) | ||||
| else: | else: | ||||
| @@ -1461,6 +1463,8 @@ def _split_sub_tensors(x, indices, axis): | |||||
| for i, idx in enumerate(indices): | for i, idx in enumerate(indices): | ||||
| begin[axis] = 0 if i == 0 else indices[i-1] | begin[axis] = 0 if i == 0 else indices[i-1] | ||||
| end[axis] = idx | end[axis] = idx | ||||
| if end[axis] <= begin[axis]: | |||||
| _raise_value_error("empty sub-tensor encountered.") | |||||
| sliced_tensor = F.strided_slice(x, _type_convert(tuple, begin), _type_convert(tuple, end), strides) | sliced_tensor = F.strided_slice(x, _type_convert(tuple, begin), _type_convert(tuple, end), strides) | ||||
| sub_tensors.append(sliced_tensor) | sub_tensors.append(sliced_tensor) | ||||
| return sub_tensors | return sub_tensors | ||||
| @@ -2136,19 +2140,19 @@ def choose(a, choices, mode='clip'): | |||||
| with ``shape Ba.shape`` is created as follows: | with ``shape Ba.shape`` is created as follows: | ||||
| - if ``mode='raise'`` (the default), then, first of all, each element of `a` | - if ``mode='raise'`` (the default), then, first of all, each element of `a` | ||||
| (and thus `Ba`) must be in the range `[0, n-1]`; now, suppose that `i` | |||||
| (in that range) is the value at the `(j0, j1, ..., jm)` position in | |||||
| `Ba` - then the value at the same position in the new array is the | |||||
| value in ``Bchoices[i]`` at that same position; | |||||
| (and thus `Ba`) must be in the range `[0, n-1]`; now, suppose that `i` | |||||
| (in that range) is the value at the `(j0, j1, ..., jm)` position in | |||||
| `Ba` - then the value at the same position in the new array is the | |||||
| value in ``Bchoices[i]`` at that same position; | |||||
| - if ``mode='wrap'``, values in `a` (and thus `Ba`) may be any (signed) | - if ``mode='wrap'``, values in `a` (and thus `Ba`) may be any (signed) | ||||
| integer; modular arithmetic is used to map integers outside the | |||||
| range ``[0, n-1]`` back into that range; and then the new array is | |||||
| constructed as above; | |||||
| integer; modular arithmetic is used to map integers outside the | |||||
| range ``[0, n-1]`` back into that range; and then the new array is | |||||
| constructed as above; | |||||
| - if ``mode='clip'``, values in `a` (and thus `Ba`) may be any (signed) integer; | - if ``mode='clip'``, values in `a` (and thus `Ba`) may be any (signed) integer; | ||||
| negative integers are mapped to 0; values greater than `n-1` are mapped to | |||||
| `n-1`; and then the new array is constructed as above. | |||||
| negative integers are mapped to 0; values greater than `n-1` are mapped to | |||||
| `n-1`; and then the new array is constructed as above. | |||||
| Note: | Note: | ||||
| Numpy argument `out` is not supported. | Numpy argument `out` is not supported. | ||||
| @@ -5645,10 +5645,10 @@ def bitwise_and(x1, x2, dtype=None): | |||||
| def bitwise_or(x1, x2, dtype=None): | def bitwise_or(x1, x2, dtype=None): | ||||
| """ | |||||
| r""" | |||||
| Computes the bit-wise OR of two arrays element-wise. | Computes the bit-wise OR of two arrays element-wise. | ||||
| Computes the bit-wise OR of the underlying binary representation of the integers in | Computes the bit-wise OR of the underlying binary representation of the integers in | ||||
| the input arrays. This ufunc implements the C/Python operator |. | |||||
| the input arrays. This ufunc implements the C/Python operator \|. | |||||
| Note: | Note: | ||||
| Numpy arguments `out`, `where`, `casting`, `order`, `subok`, `signature`, and `extobj` are | Numpy arguments `out`, `where`, `casting`, `order`, `subok`, `signature`, and `extobj` are | ||||