a
    J5d&                     @   s
  d dl Z ddlmZ ddlmZ g dZG dd dZG dd	 d	eZG d
d deZG dd deZ	G dd deZ
G dd deZG dd deZG dd deZG dd deZG dd deZG dd deZG dd deZG dd deZG d d! d!eZdS )"    N   )transformers)
exceptions)FieldTransformerFieldStringFieldIntegerField
FloatFieldNumberFieldIndexedCoordinatesFieldAdjacencyListFieldEdgeListFieldMatrixFieldEdgeDataFieldDepotsFieldDemandsField
ToursFieldc                   @   sJ   e Zd ZdZdZddddZdd Zdd	 Zd
d Zdd Z	dd Z
dS )r   a  Contains base functionality for all fields.

    The default value can be a callable, in which case it is invoked for each
    call to :func:`get_default_value`. The default can be set on an instance
    or as a class attribute, but the class attribute is only checked when the
    field is initially created.

    :param str keyword: keyword (typically all caps)
    :param default: a default value or callable that will return a default
    N)defaultc                C   s   || _ |p| jj| _d S N)keyword	__class__r   )selfr   r    r   K/var/www/html/django/DPS/env/lib/python3.9/site-packages/tsplib95/fields.py__init__(   s    zField.__init__c                 C   s   d| j j dt| j dS )N<(z)>)r   __qualname__reprr   r   r   r   r   __repr__,   s    zField.__repr__c                 C   s   t | jr|  S | jS )zReturn the default value.

        Callables are called for a default value to return each time.

        :return: the default value
        :rtype: Any
        )callabler   r   r   r   r   get_default_value/   s    
zField.get_default_valuec                 C   s
   t  dS )zConvert text into a value.

        This must be implemented in a subclass.

        :param str text:
        :return: a value
        NNotImplementedError)r   textr   r   r   parse;   s    zField.parsec                 C   s
   t  dS )zConvert a value into text.

        This must be implemented in a subclass.

        :param value: a value
        :return: text
        :rtype: str
        Nr#   r   valuer   r   r   renderE   s    	zField.renderc                 C   s   dS )zValidate a value.

        Raise an exception if the value fails validation.

        The default implementation does nothing.

        :param value: a value
        :raises Exception: if the value does not pass validation
        Nr   r'   r   r   r   validateP   s    zField.validate)__name__
__module__r   __doc__r   r   r    r"   r&   r)   r*   r   r   r   r   r      s   
r   c                       sd   e Zd ZdZdd fdd
Zedd Zedd	 Zej	d
d	 Zdd Z
dd Zdd Z  ZS )r   zField that delegates to a :class:`~tsplib95.transformers.Transformer`.

    :param str keyword: keyword
    :param callable transformer: transformer to use
    N)transformerc                   s   t  j|fi | || _d S r   )superr   tf)r   r   r.   kwargsr   r   r   r   c   s    zTransformerField.__init__c                 C   s   t  S )zConstruct an appropriate transformer for the field.

        :return: transformer
        :rtype: :class:`~tsplib95.transformers.Transformer`
        )TZTransformerclsr   r   r   build_transformerg   s    z"TransformerField.build_transformerc                 C   s   | j d u r|  | _ | j S r   )_tfr6   r   r   r   r   r0   p   s    

zTransformerField.tfc                 C   s
   || _ d S r   )r7   r'   r   r   r   r0   v   s    c              
   C   s^   z| j |W S  tjyX } z0| jj d| j d}tj||W Y d}~n
d}~0 0 dS )zzParse the text into a value using the transformer.

        :param str text: text to parse
        :return: value
        r   )N)r0   r&   r   ParsingErrorr   r   r   wrap)r   r%   econtextr   r   r   r&   z   s
    zTransformerField.parsec              
   C   s^   z| j |W S  tjyX } z0| jj d| j d}tj||W Y d}~n
d}~0 0 dS )zzRender the value into text using the transformer.

        :param str text: value to render
        :return: text
        r   r8   N)r0   r)   r   ZRenderingErrorr   r   r   r:   )r   r(   r;   r<   r   r   r   r)      s
    zTransformerField.renderc                 C   s   | j |S )z^Validate the value using the transformer.

        :param str text: value to validate
        )r0   r*   r'   r   r   r   r*      s    zTransformerField.validate)r+   r,   r   r-   r   classmethodr6   propertyr0   setterr&   r)   r*   __classcell__r   r   r2   r   r   \   s   


r   c                   @   s   e Zd ZdZedd ZdS )r   zSimple string field.c                 C   s   t jtdS Nfunc)r3   FuncTstrr4   r   r   r   r6      s    zStringField.build_transformerN)r+   r,   r   r-   r=   r6   r   r   r   r   r      s   r   c                   @   s    e Zd ZdZdZedd ZdS )r   zSimple integer field.r   c                 C   s   t jtdS rA   )r3   rD   intr4   r   r   r   r6      s    zIntegerField.build_transformerNr+   r,   r   r-   r   r=   r6   r   r   r   r   r      s   r   c                   @   s    e Zd ZdZdZedd ZdS )r	   zSimple float field.g        c                 C   s   t jtdS rA   )r3   rD   floatr4   r   r   r   r6      s    zFloatField.build_transformerNrG   r   r   r   r   r	      s   r	   c                   @   s    e Zd ZdZdZedd ZdS )r
   z)Number field, supporting ints and floats.r   c                 C   s   t  S r   )r3   NumberTr4   r   r   r   r6      s    zNumberField.build_transformerNrG   r   r   r   r   r
      s   r
   c                       sN   e Zd ZdZeZdd fdd
Zedd Ze	dd	 Z
 fd
dZ  ZS )r   a  Field for coordinates by index.

    When given, ``dimensions`` stipulates the possible valid dimensionalities
    for the coordinates. For exapmle, ``dimensions=(2, 3)`` indicates the
    coordinates are either all 2d or all 3d, whereas ``dimensions=2`` indicates
    all coordinates must be 2d. The check is only enforced during validation.

    :param dimensions: one or more valid dimensionalities
    N
dimensionsc                   s"   t  j|i | | || _d S r   )r/   r   _tuplizerK   )r   rK   argsr1   r2   r   r   r      s    z IndexedCoordinatesField.__init__c                 C   s4   zt t| W S  ty.   | r&| fnd  Y S 0 d S r   )tupleiter	ExceptionrJ   r   r   r   rL      s    z IndexedCoordinatesField._tuplizec                 C   s,   t jtd}t jt  d}t j||ddS )NrB   r(   
keyr(   sep)r3   rD   rF   ListTrI   MapT)r5   rT   r(   r   r   r   r6      s    z)IndexedCoordinatesField.build_transformerc                    sV   t  | tdd | D }| jrR|dd | jD vrRd| j }t|d S )Nc                 s   s   | ]}t |V  qd S r   )len).0Zcoordr   r   r   	<genexpr>       z3IndexedCoordinatesField.validate.<locals>.<genexpr>c                 s   s   | ]}|hV  qd S r   r   )rY   dimr   r   r   rZ      r[   zHall coordinates must have the same dimensionality and it must be one of )r/   r*   setvaluesrK   r   ZValidationError)r   r(   Zcardserrorr2   r   r   r*      s    z IndexedCoordinatesField.validate)r+   r,   r   r-   dictr   r   staticmethodrL   r=   r6   r*   r@   r   r   r2   r   r      s   


r   c                   @   s    e Zd ZdZeZedd ZdS )r   zField for an adjancency list.c                 C   s*   t jt jtdt jt jtdddddS )NrB   rQ   )-1z -1
rb   )rT   r(   rU   terminal)r3   rW   rD   rF   rV   r4   r   r   r   r6      s
    z$AdjacencyListField.build_transformerNr+   r,   r   r-   r`   r   r=   r6   r   r   r   r   r      s   r   c                   @   s    e Zd ZdZeZedd ZdS )r   zField for a list of edges.c                 C   s&   t jt jtddd}t j|dddS )NrB      )r(   sizerb   rR   )r(   rc   rU   )r3   rV   rD   rF   )r5   edger   r   r   r6      s    zEdgeListField.build_transformerNr+   r,   r   r-   listr   r=   r6   r   r   r   r   r      s   r   c                   @   s    e Zd ZdZeZedd ZdS )r   zField for a matrix of numbers.c                 C   s   t jt  d}t j|ddS )NrQ   rR   )r(   rU   )r3   rV   rI   )r5   rowr   r   r   r6     s    zMatrixField.build_transformerNrh   r   r   r   r   r      s   r   c                   @   s    e Zd ZdZeZedd ZdS )r   zField for edge data.c                 C   s   t  }t }t||S r   )r   r6   r   r3   ZUnionT)r5   Zadj_listZ	edge_listr   r   r   r6     s    zEdgeDataField.build_transformerNrd   r   r   r   r   r     s   r   c                   @   s    e Zd ZdZeZedd ZdS )r   zField for depots.c                 C   s   t jtd}t j|ddS )NrB   rb   )r(   rc   )r3   rD   rF   rV   )r5   Zdepotr   r   r   r6     s    zDepotsField.build_transformerNrh   r   r   r   r   r     s   r   c                   @   s    e Zd ZdZeZedd ZdS )r   zField for demands.c                 C   s(   t jtd}t jtd}t j||ddS )NrB   rR   rS   )r3   rD   rF   rW   )r5   nodeZdemandr   r   r   r6   '  s    zDemandsField.build_transformerNrd   r   r   r   r   r   "  s   r   c                       s:   e Zd ZdZeZdd fdd
Zdd Zdd	 Z  Z	S )
r   zField for one or more tours.T)require_terminalc                   sH   t  j|  d| _|| _td| j d| _td| j d| _d S )Nrb   z(?:(?:\s+|\b|^)z)+$z
(?:\s+|\b)z
(?:\b|\s+))r/   r   rc   rl   recompile_end_terminals_any_terminal)r   rl   rM   r2   r   r   r   3  s
    zToursField.__init__c           	      C   s   |  }|sg S | j|}|sR| jrR| d }d| j dt| }t||rf|d|	  }| j
|}ttd|}|sg S g }|D ]f}zdd |   D }W n< ty } z$dt| }t|W Y d}~qd}~0 0 || q|S )zParse the text into a list of tours.

        :param str text: text to parse
        :return: tours
        :rtype: list
        zmust terminate in "z", not Nc                 S   s   g | ]}t |qS r   )rF   )rY   nr   r   r   
<listcomp>[  r[   z$ToursField.parse.<locals>.<listcomp>z&could not convert text to node index: )stripro   searchrl   splitrc   r   r   r9   startrp   ri   filter
ValueErrorappend)	r   r%   matchrc   r_   Ztextstourstourr;   r   r   r   r&   :  s2    


 zToursField.parsec                 C   sV   |sdS g }|D ],}|rd dd |D }|| d q|rL|dg7 }d |S )zRender the tours as text.

        :param list tours: tours to render
        :return: rendered text
        :rtype: str
          c                 s   s   | ]}t |V  qd S r   )rE   )rY   ir   r   r   rZ   q  r[   z$ToursField.render.<locals>.<genexpr>z -1rb   rR   )joinrz   )r   r|   Ztour_stringsr}   Ztour_stringr   r   r   r)   d  s    
zToursField.render)
r+   r,   r   r-   ri   r   r   r&   r)   r@   r   r   r2   r   r   .  s
   *r   )rm   r~   r   r3   r   __all__r   r   r   r   r	   r
   r   r   r   r   r   r   r   r   r   r   r   r   <module>   s"   B>


(