@@ -349,6 +349,31 @@ def _copy_from_usm_ndarray_to_usm_ndarray(dst, src):
349
349
_copy_same_shape (dst , src_same_shape )
350
350
351
351
352
+ def _make_empty_like_orderK (X , dt , usm_type , dev ):
353
+ st = list (X .strides )
354
+ perm = sorted (
355
+ range (X .ndim ),
356
+ key = lambda d : builtins .abs (st [d ]) if X .shape [d ] > 1 else 0 ,
357
+ reverse = True ,
358
+ )
359
+ inv_perm = sorted (range (X .ndim ), key = lambda i : perm [i ])
360
+ sh = X .shape
361
+ sh_sorted = tuple (sh [i ] for i in perm )
362
+ R = dpt .empty (sh_sorted , dtype = dt , usm_type = usm_type , device = dev , order = "C" )
363
+ if min (st ) < 0 :
364
+ st_sorted = [st [i ] for i in perm ]
365
+ sl = tuple (
366
+ (
367
+ slice (None , None , - 1 )
368
+ if st_sorted [i ] < 0
369
+ else slice (None , None , None )
370
+ )
371
+ for i in range (X .ndim )
372
+ )
373
+ R = R [sl ]
374
+ return dpt .permute_dims (R , inv_perm )
375
+
376
+
352
377
def _empty_like_orderK (X , dt , usm_type = None , dev = None ):
353
378
"""Returns empty array like `x`, using order='K'
354
379
@@ -371,28 +396,28 @@ def _empty_like_orderK(X, dt, usm_type=None, dev=None):
371
396
return dpt .empty_like (
372
397
X , dtype = dt , usm_type = usm_type , device = dev , order = "F"
373
398
)
374
- st = list (X .strides )
375
- perm = sorted (
376
- range (X .ndim ),
377
- key = lambda d : builtins .abs (st [d ]) if X .shape [d ] > 1 else 0 ,
378
- reverse = True ,
379
- )
380
- inv_perm = sorted (range (X .ndim ), key = lambda i : perm [i ])
381
- sh = X .shape
382
- sh_sorted = tuple (sh [i ] for i in perm )
383
- R = dpt .empty (sh_sorted , dtype = dt , usm_type = usm_type , device = dev , order = "C" )
384
- if min (st ) < 0 :
385
- st_sorted = [st [i ] for i in perm ]
386
- sl = tuple (
387
- (
388
- slice (None , None , - 1 )
389
- if st_sorted [i ] < 0
390
- else slice (None , None , None )
391
- )
392
- for i in range (X .ndim )
399
+ return _make_empty_like_orderK (X , dt , usm_type , dev )
400
+
401
+
402
+ def _from_numpy_empty_like_orderK (X , dt , usm_type , dev ):
403
+ """Returns empty usm_ndarray like NumPy array `x`, using order='K'
404
+
405
+ For an array `x` that was obtained by permutation of a contiguous
406
+ array the returned array will have the same shape and the same
407
+ strides as `x`.
408
+ """
409
+ if not isinstance (X , np .ndarray ):
410
+ raise TypeError (f"Expected np.ndarray, got { type (X )} " )
411
+ fl = X .flags
412
+ if fl ["C" ] or X .size <= 1 :
413
+ return dpt .usm_ndarray (
414
+ X .shape , dtype = dt , usm_type = usm_type , device = dev , order = "C"
393
415
)
394
- R = R [sl ]
395
- return dpt .permute_dims (R , inv_perm )
416
+ elif fl ["F" ]:
417
+ return dpt .usm_ndarray (
418
+ X .shape , dtype = dt , usm_type = usm_type , device = dev , order = "F"
419
+ )
420
+ return _make_empty_like_orderK (X , dt , usm_type , dev )
396
421
397
422
398
423
def _empty_like_pair_orderK (X1 , X2 , dt , res_shape , usm_type , dev ):
0 commit comments