o
    ?e                     @   s   d Z ddlmZ ddlmZ ddlmZ ddlmZ dddZd	d
 Z	dd Z
G dd deZG dd deZdd Zdd Zdd ZdS )z!Device-related support functions.    )context)configdevice)opsNc                 C   s   t | tjrtj| j} ntj| } | jdu s)| j| j ks)J d| jf tjddddd}t	
 rQtjtdd j}|jrK||}n|jdd}|r\|tj|}|| }| S )a  Canonicalize device string.

  If d has missing components, the rest would be deduced from the `default`
  argument or from '/replica:0/task:0/device:CPU:0'. For example:
    If d = '/cpu:0', default='/job:worker/task:1', it returns
      '/job:worker/replica:0/task:1/device:CPU:0'.
    If d = '/cpu:0', default='/job:worker', it returns
      '/job:worker/replica:0/task:0/device:CPU:0'.
    If d = '/gpu:0', default=None, it returns
      '/replica:0/task:0/device:GPU:0'.

  Note: This uses "job:localhost" as the default if executing eagerly.

  Args:
    d: a device string or tf.config.LogicalDevice
    default: a string for default device if d doesn't have all components.

  Returns:
    a canonicalized device string.
  Nz"Device type '%s' must be all-caps.r   CPU)replicataskdevice_typedevice_index	localhost)job)
isinstancer   ZLogicalDevice	tf_device
DeviceSpecfrom_stringnamer
   upperr   #executing_eagerly_outside_functionsr   Zlist_logical_devicesr   Zmake_merged_specreplace	to_string)ddefaultresultZhost_cpu r   i/home/www/facesmatcher.com/pyenv/lib/python3.10/site-packages/tensorflow/python/distribute/device_util.pycanonicalize   s,   


r   c                 C   s,   t | }tj|}|jdddd}| S )a  Partially canonicalize device string.

  This returns device string from `d` without including job and task.
  This is most useful for parameter server strategy where the device strings are
  generated on the chief, but executed on workers.

   For example:
    If d = '/cpu:0', default='/job:worker/task:1', it returns
      '/replica:0/device:CPU:0'.
    If d = '/cpu:0', default='/job:worker', it returns
      '/replica:0/device:CPU:0'.
    If d = '/gpu:0', default=None, it returns
      '/replica:0/device:GPU:0'.

  Note: This uses "job:localhost" as the default if executing eagerly.

  Args:
    d: a device string or tf.config.LogicalDevice

  Returns:
    a partially canonicalized device string.
  Nr   )r   r	   r   )r   r   r   r   r   r   )r   Zcanonicalized_devicespecr   r   r   !canonicalize_without_job_and_taskL   s   r   c                 C   s   t | t dS )z0Canonicalize `d` with current device as default.)r   )r   current)r   r   r   r   resolvei   s   r    c                   @   s    e Zd ZdZddgZdd ZdS )_FakeNodeDefz"A fake NodeDef for _FakeOperation.opr   c                 C   s   d| _ d| _d S N )r"   r   selfr   r   r   __init__s   s   
z_FakeNodeDef.__init__N)__name__
__module____qualname____doc__	__slots__r'   r   r   r   r   r!   n   s    r!   c                   @   s(   e Zd ZdZdd Zdd Zdd ZdS )	_FakeOperationz4A fake Operation object to pass to device functions.c                 C   s   d| _ d| _d| _t | _d S r#   )r   typer   r!   Znode_defr%   r   r   r   r'   {   s   z_FakeOperation.__init__c                 C   s   t || _d S N)r   Z_device_stringr   )r&   r   r   r   r   _set_device   s   z_FakeOperation._set_devicec                 C   s
   || _ d S r/   r   )r&   Z
device_strr   r   r   _set_device_from_string   s   
z&_FakeOperation._set_device_from_stringN)r(   r)   r*   r+   r'   r0   r1   r   r   r   r   r-   x   s
    r-   c                  C   s4   t  rt j} | S t }t  | |j} | S )z;Return a string (not canonicalized) for the current device.)r   r   r   Zdevice_namer-   Zget_default_graphZ_apply_device_functionsr   )r   r"   r   r   r   r      s   
r   c                 C   s*   t j| }t j|j|j|jddd S )z;Returns the corresponding host device for the given device.r   r   )r   r   r	   r
   r   )r   r   r   r   r   r	   r   )r   r   r   r   r   get_host_for_device   s   r2   c                 C   s   t dd t| D pdS )z-Returns device strings for local GPUs or CPU.c                 s   s    | ]}d | V  qdS )z/device:GPU:%dNr   ).0ir   r   r   	<genexpr>   s    z.local_devices_from_num_gpus.<locals>.<genexpr>)z/device:CPU:0)tuplerange)Znum_gpusr   r   r   local_devices_from_num_gpus   s   r8   r/   )r+   Ztensorflow.python.eagerr   Ztensorflow.python.frameworkr   r   r   r   r   r   r    objectr!   r-   r   r2   r8   r   r   r   r   <module>   s   
4
