import os
[docs]
def cupy_to_numpy(arr):
    '''
    Return a numpy.array from a cupy.array or a numpy.array.
    PARAMETERS
    ----------    
	(numpy.array or cupy.array) arr:
		array to convert as numpy one 
    (if not already).
    RETURNS
    -------    
	(numpy.array) convarr:
		converted array.
    '''
    try:
        return arr.get() # if using GPU (cupy)
    except AttributeError:
        return arr 
[docs]
def set_gpu_computation(activate=True):
    '''
    Enable or disable GPU computation. To enable it, cupy and cucim modules
    are needed, it changes import as auski and aunp.
    PARAMETERS
    ----------    
	(bool) activate=False:
		activate or not GPU computation.
    RETURNS
    -------
	None
    '''
    global auski, aunp # strange names to avoid conflicts
    if activate == True:
        try:
            cuda_visible_devices = os.environ.get("CUDA_VISIBLE_DEVICES", "")
            if not cuda_visible_devices:
                raise LookupError("CUDA_VISIBLE_DEVICES is not set."
                            "Valid example: export CUDA_VISIBLE_DEVICES=1,3,0")
            visible_devices_list = cuda_visible_devices.split(',')
            if (len(visible_devices_list) <= 0):
                raise LookupError("CUDA_VISIBLE_DEVICES value is not valid. "
                            "Valid example: export CUDA_VISIBLE_DEVICES=1,3,0")
            import cucim.skimage as auski
            import cupy as aunp
            aunp.cuda.Device(visible_devices_list[0]).use()
            print(f"Device '{visible_devices_list[0]}' selected for "
                  "GPU computation.")
        except Exception as err:
            print(err)
            print("|WRN| Using CPU, cucim or cupy not available.")
            import skimage as auski
            import numpy as aunp
    else:
        import skimage as auski
        import numpy as aunp 
[docs]
def select_device(device):
    '''
    Select device used for some GPU computations of the current process.
    PARAMETERS
    ----------    
	(int or None) device:
		selected GPU (if None, does nothing).
    RETURNS
    -------
	None
    '''
    if device is not None:
        try:
            aunp.cuda.Device(device).use()
        except AttributeError:
            print(f"|WRN| Using CPU, can not select the device '{device}'")