@@ -1875,6 +1875,16 @@ def _apply_pivots_rows(A_dp, piv_dp):
1875
1875
rows = dpnp .asarray (rows )
1876
1876
return A_dp [rows ]
1877
1877
1878
+ @staticmethod
1879
+ def _make_nonsingular_np (shape , dtype , order ):
1880
+ A = generate_random_numpy_array (shape , dtype , order )
1881
+ m , n = shape
1882
+ k = min (m , n )
1883
+ for i in range (k ):
1884
+ off = numpy .sum (numpy .abs (A [i , :n ])) - numpy .abs (A [i , i ])
1885
+ A [i , i ] = A .dtype .type (off + 1.0 )
1886
+ return A
1887
+
1878
1888
@staticmethod
1879
1889
def _split_lu (lu , m , n ):
1880
1890
L = dpnp .tril (lu , k = - 1 )
@@ -1889,7 +1899,7 @@ def _split_lu(lu, m, n):
1889
1899
@pytest .mark .parametrize ("order" , ["C" , "F" ])
1890
1900
@pytest .mark .parametrize ("dtype" , get_all_dtypes (no_bool = True ))
1891
1901
def test_lu_factor (self , shape , order , dtype ):
1892
- a_np = generate_random_numpy_array (shape , dtype , order )
1902
+ a_np = self . _make_nonsingular_np (shape , dtype , order )
1893
1903
a_dp = dpnp .array (a_np , order = order )
1894
1904
1895
1905
lu , piv = dpnp .linalg .lu_factor (
@@ -1991,12 +2001,7 @@ def test_empty_inputs(self, shape):
1991
2001
],
1992
2002
)
1993
2003
def test_strided (self , sl ):
1994
- base = (
1995
- numpy .arange (7 * 7 , dtype = dpnp .default_float_type ()).reshape (
1996
- 7 , 7 , order = "F"
1997
- )
1998
- + 0.1
1999
- )
2004
+ base = self ._make_nonsingular_np ((7 , 7 ), dpnp .default_float_type (), "F" )
2000
2005
a_np = base [sl ]
2001
2006
a_dp = dpnp .array (a_np )
2002
2007
@@ -2037,6 +2042,22 @@ def _apply_pivots_rows(A_dp, piv_dp):
2037
2042
rows = dpnp .asarray (rows )
2038
2043
return A_dp [rows ]
2039
2044
2045
+ @staticmethod
2046
+ def _make_nonsingular_nd_np (shape , dtype , order ):
2047
+ A = generate_random_numpy_array (shape , dtype , order )
2048
+ m , n = shape [- 2 ], shape [- 1 ]
2049
+ k = min (m , n )
2050
+ A3 = A .reshape ((- 1 , m , n ))
2051
+ for B in A3 :
2052
+ for i in range (k ):
2053
+ off = numpy .sum (numpy .abs (B [i , :n ])) - numpy .abs (B [i , i ])
2054
+ B [i , i ] = A .dtype .type (off + 1.0 )
2055
+
2056
+ A = A3 .reshape (shape )
2057
+ # Ensure reshapes did not break memory order
2058
+ A = numpy .array (A , order = order )
2059
+ return A
2060
+
2040
2061
@staticmethod
2041
2062
def _split_lu (lu , m , n ):
2042
2063
L = dpnp .tril (lu , k = - 1 )
@@ -2053,7 +2074,7 @@ def _split_lu(lu, m, n):
2053
2074
@pytest .mark .parametrize ("order" , ["C" , "F" ])
2054
2075
@pytest .mark .parametrize ("dtype" , get_all_dtypes (no_bool = True ))
2055
2076
def test_lu_factor_batched (self , shape , order , dtype ):
2056
- a_np = generate_random_numpy_array (shape , dtype , order )
2077
+ a_np = self . _make_nonsingular_nd_np (shape , dtype , order )
2057
2078
a_dp = dpnp .array (a_np , order = order )
2058
2079
2059
2080
lu , piv = dpnp .linalg .lu_factor (
@@ -2077,7 +2098,8 @@ def test_lu_factor_batched(self, shape, order, dtype):
2077
2098
@pytest .mark .parametrize ("dtype" , get_float_complex_dtypes ())
2078
2099
@pytest .mark .parametrize ("order" , ["C" , "F" ])
2079
2100
def test_overwrite (self , dtype , order ):
2080
- a_dp = dpnp .arange (2 * 2 * 3 , dtype = dtype ).reshape (3 , 2 , 2 , order = order )
2101
+ a_np = self ._make_nonsingular_nd_np ((3 , 2 , 2 ), dtype , order )
2102
+ a_dp = dpnp .array (a_np , order = order )
2081
2103
a_dp_orig = a_dp .copy ()
2082
2104
lu , piv = dpnp .linalg .lu_factor (
2083
2105
a_dp , overwrite_a = True , check_finite = False
@@ -2108,13 +2130,11 @@ def test_empty_inputs(self, shape):
2108
2130
assert piv .shape == (* shape [:- 2 ], min (m , n ))
2109
2131
2110
2132
def test_strided (self ):
2111
- a = (
2112
- dpnp .arange (5 * 3 * 3 , dtype = dpnp .default_float_type ()).reshape (
2113
- 5 , 3 , 3 , order = "F"
2114
- )
2115
- + 0.1
2133
+ a_np = self ._make_nonsingular_nd_np (
2134
+ (5 , 3 , 3 ), dpnp .default_float_type (), "F"
2116
2135
)
2117
- a_stride = a [::2 ]
2136
+ a_dp = dpnp .array (a_np , order = "F" )
2137
+ a_stride = a_dp [::2 ]
2118
2138
lu , piv = dpnp .linalg .lu_factor (a_stride , check_finite = False )
2119
2139
for i in range (a_stride .shape [0 ]):
2120
2140
L , U = self ._split_lu (lu [i ], 3 , 3 )
0 commit comments