B
    Afxa2r              	   @  sb  d Z ddlmZ ddlZddlZddlZddlZddlmZ ddl	m
Z
 ddlmZmZ ddlmZ ddlmZ dd	lmZmZ dd
lmZmZmZmZ ddlmZmZ ddlmZ ddlmZ ddl m!Z! erddl"m#Z# ddl$m%Z% ddl&m'Z' e(e)Z*e*+e  dddd fddZ,dd Z-e
dfddZ.dVddZ/dd Z0dWd d!Z1dXd"d#Z2G d$d% d%e3Z4G d&d' d'eZ5G d(d) d)e5Z6d*d+d,d-d.d/d0d1d2g	Z7d3d4 e7D Z8e9:d5d6Z;e<d7Z=d8d8d9d:d;Z>d8d<d=d>d?Z?G d@dA dAZ@G dBdC dCZAdYdDdEd'dFdGdHZBdIdJ ZCdKdL ZDG dMdN dNZEG dOdP dPeEZFd<dQdRdSZGd<dQdTdUZHdS )Zz
    pint.util
    ~~~~~~~~~

    Miscellaneous functions for pint.

    :copyright: 2016 by Pint Authors, see AUTHORS for more details.
    :license: BSD, see LICENSE for more details.
    )annotationsN)Mapping)Fraction)	lru_cachepartial)NullHandler)Number)NAMENUMBER)TYPE_CHECKINGClassVarOptionalUnion   )NUMERIC_TYPES	tokenizer)DefinitionSyntaxError)format_unit)build_eval_tree)UnitLike)Quantity)BaseRegistryc             C  s   t t| S )N)strint)x r   (lib/python3.7/site-packages/pint/util.py<lambda>)       r   c               sf   g }|r$| |rdndd|  |rF| fddt|| D 7 }n| fdd| D 7 }d|S )a&  Takes a 2D matrix (as nested list) and returns a string.

    Parameters
    ----------
    matrix :

    row_headers :
         (Default value = None)
    col_headers :
         (Default value = None)
    fmtfun :
         (Default value = lambda x: str(int(x)))

    Returns
    -------

    	 c               s0   g | ](\}}|d  d   fdd|D  qS )r   c             3  s   | ]} |V  qd S )Nr   ).0f)fmtfunr   r   	<genexpr>A   s    z.matrix_to_string.<locals>.<listcomp>.<genexpr>)join)r!   Zrhrow)r#   r   r   
<listcomp>A   s   z$matrix_to_string.<locals>.<listcomp>c               s$   g | ]}d   fdd|D qS )r   c             3  s   | ]} |V  qd S )Nr   )r!   r"   )r#   r   r   r$   E   s    z.matrix_to_string.<locals>.<listcomp>.<genexpr>)r%   )r!   r&   )r#   r   r   r'   E   s    
)appendr%   zip)matrixZrow_headersZcol_headersr#   retr   )r#   r   matrix_to_string(   s    
r-   c             C  s   dd t |  D S )zTakes a 2D matrix (as nested list) and returns the transposed version.

    Parameters
    ----------
    matrix :


    Returns
    -------

    c             S  s   g | ]}t |qS r   )list)r!   valr   r   r   r'   V   s    ztranspose.<locals>.<listcomp>)r*   )r+   r   r   r   	transposeJ   s    r0   Fc               s<  d}t | }|rt ndd }t|t|d  }g }xP|D ]H}g }	x4|D ],}
t|
trd|
}
n|
}
|	|
 qJW ||	 q<W |}fddtD }g }x~tD ]p}	||kr|||||fS |	}xP|| | dkr(|d7 }|kr q|	}|d7 }||kr|||||fS qW ||	 ||  ||< ||	< ||	 ||  ||< ||	< || ||	 |   fdd||	 D ||	<  fdd||	 D ||	< xttD ]h}||	krĐq|| |   fd	dt||	 || D ||<  fd
dt||	 || D ||< qW |d7 }qW |||||fS )a  Calculates the column echelon form using Gaussian elimination.

    Parameters
    ----------
    matrix :
        a 2D matrix as nested list.
    ntype :
        the numerical type to use in the calculation. (Default value = Fraction)
    transpose_result :
        indicates if the returned matrix should be transposed. (Default value = False)

    Returns
    -------
    type
        column echelon form, transformed identity matrix, swapped rows

    r   c             S  s   | S )Nr   )r   r   r   r   r   o   r   z%column_echelon_form.<locals>.<lambda>c               s$   g | ]  fd dt D qS )c               s$   g | ]} |krd ndqS )r   r   r   )r!   Znc)nntyper   r   r'      s    z2column_echelon_form.<locals>.<listcomp>.<listcomp>)range)r!   )r2   rows)r1   r   r'      s    z'column_echelon_form.<locals>.<listcomp>r   c               s   g | ]}|  qS r   r   )r!   mrx)lvr   r   r'      s    c               s   g | ]}|  qS r   r   )r!   r5   )r6   r   r   r'      s    c               s   g | ]\}}| |  qS r   r   )r!   rviv)r6   r   r   r'      s    c               s   g | ]\}}| |  qS r   r   )r!   r7   r8   )r6   r   r   r'      s    )r0   len
isinstancefloatZ
from_floatr)   r3   r*   )r+   r2   transpose_resultZleadMZ
_transposeZcolsZnew_Mr&   rr   IZswappedir   )r6   r2   r4   r   column_echelon_formY   sT    





$*rA   c               s  g t  }|dkr dd }t}n|j}|j}x|  D ]\}}t|trVtj||d}t|t	rp||
|}nt|ds||}n|j}|stdd |D rtd| ||f || }q6W t|}fd	d
|D }t|dd\}}	}
g }xt||	D ]\}}tdd |D r,qtdd |D  tdd |D tdd |D krhdnd|t	 fddt|D  qW |S )u9  Builds dimensionless quantities using the Buckingham π theorem

    Parameters
    ----------
    quantities : dict
        mapping between variable name and units
    registry :
         (Default value = None)

    Returns
    -------
    type
        a list of dimensionless quantities expressed as dicts

    Nc             S  s   | S )Nr   )r   r   r   r   r      r   zpi_theorem.<locals>.<lambda>)non_int_typedimensionalityc             s  s   | ]}| d  V  qdS )[N)
startswith)r!   keyr   r   r   r$      s    zpi_theorem.<locals>.<genexpr>zdA non dimension was found and a registry was not provided. Assuming that it is a dimension name: {}.c               s   g | ]  fd dD qS )c               s   g | ]\}}|  qS r   r   )r!   namerC   )	dimensionr   r   r'      s    z)pi_theorem.<locals>.<listcomp>.<listcomp>r   )r!   )quant)rH   r   r'      s   zpi_theorem.<locals>.<listcomp>F)r<   c             s  s   | ]}|d kV  qdS )r   Nr   )r!   elr   r   r   r$      s    c             s  s   | ]}|j V  qd S )N)denominator)r!   r"   r   r   r   r$      s    c             s  s   | ]}|d k V  qdS )r   Nr   )r!   r"   r   r   r   r$      s    c             s  s   | ]}|d kV  qdS )r   Nr   )r!   r"   r   r   r   r$      s    r   c             3  s8   | ]0\}}|j d kr|d  |j    |j fV  qdS )r   N)	numeratorrK   )r!   qr"   )max_dennegr   r   r$      s   )setr;   Zget_dimensionalityrB   itemsr:   r   ParserHelperfrom_stringdictUnitsContainerhasattrrC   anyloggerZwarningformatr)   unionkeysr.   rA   r*   maxsum)Z
quantitiesregistryZ
dimensionsZgetdimrB   rG   valueZdimsr=   identityZpivotresultsZrowmZrowir   )rO   rP   rI   r   
pi_theorem   sH    




.rc   c             #  s   x|| r|dd |   D |     dd |  D   s^tdddd |  D  fdd	|  D }  V  qW d
S )a]  Solve a dependency graph.

    Parameters
    ----------
    dependencies :
        dependency dictionary. For each key, the value is an iterable indicating its
        dependencies.

    Returns
    -------
    type
        iterator of sets, each containing keys of independents tasks dependent only of
        the previous tasks in the list.

    c             S  s   h | ]}|D ]}|qqS r   r   )r!   vr@   r   r   r   	<setcomp>  s    z%solve_dependencies.<locals>.<setcomp>c             s  s   | ]\}}|s|V  qd S )Nr   )r!   krd   r   r   r   r$     s    z%solve_dependencies.<locals>.<genexpr>z/Cyclic dependencies exist among these items: {}z, c             s  s   | ]}t |V  qd S )N)repr)r!   r   r   r   r   r$     s    c               s   i | ]\}}|r|  |qS r   r   )r!   rf   rd   )tr   r   
<dictcomp>  s    z&solve_dependencies.<locals>.<dictcomp>N)valuesr\   updaterR   
ValueErrorrZ   r%   )Zdependenciesr   )rh   r   solve_dependencies   s    rm   c             C  sr   |pg |g }||kr|S || kr&d S d }xB| | D ]6}||kr4t | |||}|r4|rft|t|k r4|}q4W |S )N)find_shortest_pathr9   )graphstartendpathZshortestnodenewpathr   r   r   rn     s    rn   c             C  sJ   || krd S |pt  }|| x$| | D ]}||kr*t| || q*W |S )N)rQ   addfind_connected_nodes)ro   rp   Zvisitedrs   r   r   r   rv   #  s    

rv   c               @  s    e Zd ZdZdd Zdd ZdS )udictz%Custom dict implementing __missing__.c             C  s   dS )Nr   r   )selfrF   r   r   r   __missing__4  s    zudict.__missing__c             C  s   t | S )N)rw   )rx   r   r   r   copy7  s    z
udict.copyN)__name__
__module____qualname____doc__ry   rz   r   r   r   r   rw   1  s   rw   c               @  s   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dddZdd Zdd Zdd Zdd Zdd Zdddd Zd!dd"d#Zd!dd$d%Zd!d!d&d'd(Zd6d!d!d&d*d+Zd,d- Zd.d/ ZeZd0d1 Zd2d3 Zd4d5 Zd)S )7rV   a  The UnitsContainer stores the product of units and their respective
    exponent and implements the corresponding operations.

    UnitsContainer is a read-only mapping. All operations (even in place ones)

    Parameters
    ----------

    Returns
    -------
    type


    )_d_hash_one_non_int_typeNone)returnc             O  s   |rt |d tr|d j}nt}|d|| _| jtkrBd| _n| d| _t||}|| _xp| D ]d\}}t |t	st
dt|t |tst
dt|t |tsht || jsh| |||< qhW d | _d S )Nr   rB   r   1zkey must be a str, not {}zvalue must be a number, not {})r:   rV   r   r;   popr   rw   r   rR   r   	TypeErrorrZ   typer   r   r   )rx   argskwargsZdefault_non_int_typedrF   r`   r   r   r   __init__M  s"    



zUnitsContainer.__init__c             C  s   |   S )N)__copy__)rx   r   r   r   rz   e  s    zUnitsContainer.copyc             C  s<   | j | | }|  }|r&||j |< n|j | d |_|S )N)r   rz   r   r   )rx   rF   r`   Znewvalnewr   r   r   ru   h  s    zUnitsContainer.addc             C  s,   |   }x|D ]}|j| qW d|_|S )zCreate a new UnitsContainer purged from given keys.

        Parameters
        ----------
        keys :


        Returns
        -------

        N)rz   r   r   r   )rx   r\   r   rf   r   r   r   remover  s
    
zUnitsContainer.removec             C  s$   |   }|j||j|< d|_|S )zCreate a new UnitsContainer in which an entry has been renamed.

        Parameters
        ----------
        oldkey :

        newkey :


        Returns
        -------

        N)rz   r   r   r   )rx   ZoldkeyZnewkeyr   r   r   r   rename  s    zUnitsContainer.renamec             C  s
   t | jS )N)iterr   )rx   r   r   r   __iter__  s    zUnitsContainer.__iter__r   c             C  s
   t | jS )N)r9   r   )rx   r   r   r   __len__  s    zUnitsContainer.__len__c             C  s
   | j | S )N)r   )rx   rF   r   r   r   __getitem__  s    zUnitsContainer.__getitem__c             C  s
   || j kS )N)r   )rx   rF   r   r   r   __contains__  s    zUnitsContainer.__contains__c             C  s$   | j d krtt| j | _ | j S )N)r   hash	frozensetr   rR   )rx   r   r   r   __hash__  s    
zUnitsContainer.__hash__c             C  s   | j | j| j| jfS )N)r   r   r   r   )rx   r   r   r   __getstate__  s    zUnitsContainer.__getstate__c             C  s   |\| _ | _| _| _d S )N)r   r   r   r   )rx   stater   r   r   __setstate__  s    zUnitsContainer.__setstate__boolc             C  sp   t |tr*t| t|kr"dS |j}n8t |trbyt|| j}W n tk
rZ   dS X |j}t	
| j|S )NF)r:   rV   r   r   r   rS   rT   r   r   rU   __eq__)rx   otherr   r   r   r     s    

zUnitsContainer.__eq__r   c             C  s
   |  dS )Nr    )
__format__)rx   r   r   r   __str__  s    zUnitsContainer.__str__c             C  s,   dd dd t| j D  }d|S )Nz{%s}z, c             S  s   g | ]\}}d  ||qS )z'{}': {})rZ   )r!   rF   r`   r   r   r   r'     s    z+UnitsContainer.__repr__.<locals>.<listcomp>z<UnitsContainer({})>)r%   sortedr   rR   rZ   )rx   tmpr   r   r   __repr__  s    zUnitsContainer.__repr__)specr   c             C  s
   t | |S )N)r   )rx   r   r   r   r   r     s    zUnitsContainer.__format__Nc             K  s   t | |fd|i|S )Nr_   )r   )rx   r   r_   Zkwspecr   r   r   format_babel  s    zUnitsContainer.format_babelc             C  s4   t | j}| j |_| j|_| j|_| j|_|S )N)object__new__	__class__r   rz   r   r   r   )rx   outr   r   r   r     s    zUnitsContainer.__copy__c             C  sr   t || js"d}t|t||  }x<| D ]0\}}|j|  |7  < |j| dkr4|j|= q4W d |_|S )Nz$Cannot multiply UnitsContainer by {}r   )	r:   r   r   rZ   r   rz   rR   r   r   )rx   r   errr   rF   r`   r   r   r   __mul__  s    zUnitsContainer.__mul__c             C  s\   t |ts d}t|t||  }x(|j D ]\}}|j|  |9  < q4W d |_|S )Nz!Cannot power UnitsContainer by {})	r:   r   r   rZ   r   rz   r   rR   r   )rx   r   r   r   rF   r`   r   r   r   __pow__  s    
zUnitsContainer.__pow__c             C  sr   t || js"d}t|t||  }x<| D ]0\}}|j|  |8  < |j| dkr4|j|= q4W d |_|S )Nz"Cannot divide UnitsContainer by {}r   )	r:   r   r   rZ   r   rz   rR   r   r   )rx   r   r   r   rF   r`   r   r   r   __truediv__  s    zUnitsContainer.__truediv__c             C  s2   t || js*|dkr*d}t|t|| d S )Nr   z"Cannot divide {} by UnitsContainerrL   )r:   r   r   rZ   r   )rx   r   r   r   r   r   __rtruediv__  s    zUnitsContainer.__rtruediv__)N)r{   r|   r}   r~   	__slots__r   rz   ru   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   __rmul__r   r   r   r   r   r   r   rV   ;  s2   
	rV   c                  s   e Zd ZdZdZd( fdd	ZeefddZedefd	d
Z	ee
 efddZ fddZdd Z fddZ fddZ fddZ fddZejdfddZdd Zdd Zd d! ZeZd"d# Zd$d% ZeZd&d' Z  ZS ))rS   a  The ParserHelper stores in place the product of variables and
    their respective exponent and implements the corresponding operations.

    ParserHelper is a read-only mapping. All operations (even in place ones)

    Parameters
    ----------

    Returns
    -------
    type
        WARNING : The hash value used does not take into account the scale
        attribute so be careful if you use it as a dict key and then two unequal
        object can have the same hash.

    )scaler   c               s   t  j|| || _d S )N)superr   r   )rx   r   r   r   )r   r   r   r   !  s    zParserHelper.__init__c             C  s<   |t kr| d|dfg|dS |d}| |||fg|dS dS )zCreates a ParserHelper object with a single variable with exponent one.

        Equivalent to: ParserHelper({'word': 1})

        Parameters
        ----------
        input_word :


        Returns
        -------

        r   )rB   z1.0N)r;   )clsZ
input_wordrB   ZONEr   r   r   	from_word%  s    zParserHelper.from_wordFc             C  sx   |rt d|j}|j}|tkrV|tkrLyt|S  tk
rH   t|S X qt||S n|tkrltj	||dS t
dd S )Nz`use_decimal` is deprecated, use `non_int_type` keyword argument when instantiating the registry.
>>> from decimal import Decimal
>>> ureg = UnitRegistry(non_int_type=Decimal))rB   zunknown token type)DeprecationWarningr   stringr
   r;   r   rl   r	   rS   r   	Exception)r   tokenZuse_decimalrB   
token_typeZ
token_textr   r   r   
eval_token:  s    
zParserHelper.eval_tokenc             C  s   |s| |dS t |}d|kr8|dddd}d}nd}t|}t|t| j|d}t|trrt	||dS |rt	|j
dd	 | D |d}x,t|D ] }| d
kr|j|= tj|_
qW |S )zParse linear expression mathematical units and return a quantity object.

        Parameters
        ----------
        input_string :


        Returns
        -------

        )rB   rD   __obra__]__cbra__TFc             S  s&   i | ]\}}|| d d ddqS )r   rD   r   r   )replace)r!   rF   r`   r   r   r   ri   y  s   z,ParserHelper.from_string.<locals>.<dictcomp>nan)string_preprocessorr   r   r   Zevaluater   r   r:   r   rS   r   rR   r.   lowerr   mathr   )r   input_stringrB   Zrepsgenr,   rf   r   r   r   rT   T  s0    


zParserHelper.from_stringc               s   t   }| j|_|S )N)r   r   r   )rx   r   )r   r   r   r     s    
zParserHelper.__copy__c             C  s   |   S )N)r   )rx   r   r   r   rz     s    zParserHelper.copyc               s    | j dkrd}t|t  S )Nr   z@Only scale 1 ParserHelper instance should be considered hashable)r   rl   r   r   )rx   mess)r   r   r   r     s    
zParserHelper.__hash__c               s   t   | jf S )N)r   r   r   )rx   )r   r   r   r     s    zParserHelper.__getstate__c               s"   t  |d d  |d | _d S )NrL   )r   r   r   )rx   r   )r   r   r   r     s    zParserHelper.__setstate__c               sx   t |tr"| j|jko t |S t |tr>| t|| jkS t |tr^| j|ko\t	| j
 S | jdkort |S d S )Nr   )r:   rS   r   r   r   r   rT   r   r   r9   r   )rx   r   )r   r   r   r     s    


zParserHelper.__eq__Tc             C  sl   t | j}x"|D ]\}}||| |||< qW |rXdd | D }x|D ]
}||= qJW | j| j|| jdS )Nc             S  s   g | ]\}}|d kr|qS )r   r   )r!   rF   r`   r   r   r   r'     s    z(ParserHelper.operate.<locals>.<listcomp>)rB   )rw   r   rR   r   r   r   )rx   rR   opZcleanupr   rF   r`   r\   r   r   r   operate  s    


zParserHelper.operatec             C  s0   dd dd t| j D  }d| j|S )Nz{%s}z, c             S  s   g | ]\}}d  ||qS )z'{}': {})rZ   )r!   rF   r`   r   r   r   r'     s    z(ParserHelper.__str__.<locals>.<listcomp>z{} {})r%   r   r   rR   rZ   r   )rx   r   r   r   r   r     s    zParserHelper.__str__c             C  s0   dd dd t| j D  }d| j|S )Nz{%s}z, c             S  s   g | ]\}}d  ||qS )z'{}': {})rZ   )r!   rF   r`   r   r   r   r'     s    z)ParserHelper.__repr__.<locals>.<listcomp>z<ParserHelper({}, {})>)r%   r   r   rR   rZ   r   )rx   r   r   r   r   r     s    zParserHelper.__repr__c             C  sz   t |tr| || j}n\t |tr<|  }| j|9  _n:t || jrh| |	 }| j|j9  _n| |	 }|S )N)
r:   r   ru   r   r   rz   r   r   r   rR   )rx   r   r   r   r   r   r     s    

zParserHelper.__mul__c             C  sB   | j  }x| j D ]}||  |9  < qW | j| j| || jdS )N)rB   )r   rz   r   r   r   )rx   r   r   rF   r   r   r   r     s    
zParserHelper.__pow__c             C  s   t |tr| |d}ndt |tr:|  }| j|  _nBt || jrj| | t	j
}| j|j  _n| | t	j
}|S )NrL   )r:   r   ru   r   rz   r   r   r   rR   operatorsub)rx   r   r   r   r   r   r     s    

zParserHelper.__truediv__c             C  s   |  d}t|tr$||| j}n\t|tr>| j|9  _nBt|| jrn| |	 t
j}| j|j9  _n||	 t
j}|S )NrL   )r   r:   r   ru   r   r   r   r   r   rR   r   )rx   r   r   r   r   r   r     s    


zParserHelper.__rtruediv__)r   )r{   r|   r}   r~   r   r   classmethodr;   r   r   r   rT   r   rz   r   r   r   r   r   iaddr   r   r   r   r   r   r   __floordiv__r   __classcell__r   r   )r   r   rS     s2   1
rS   )   °z degree)z([\w\.\-\+\*\\\^])\s+z\1 )z({}) squaredz\1**2)z
({}) cubedz\1**3)z
cubic ({})z\1**3)zsquare ({})z\1**2)zsq ({})z\1**2)z3\b([0-9]+\.?[0-9]*)(?=[e|E][a-zA-Z]|[a-df-zA-DF-Z])z\1*)z([\w\.\-])\s+(?=\w)z\1*c             C  s$   g | ]\}}t |d |fqS )z[_a-zA-Z][_a-zA-Z0-9]*)recompilerZ   )r!   abr   r   r   r'     s    r'   u    ⁰¹²³⁴⁵⁶⁷⁸⁹·⁻z0123456789*-uI   (⁻?[⁰¹²³⁴⁵⁶⁷⁸⁹]+(?:\.[⁰¹²³⁴⁵⁶⁷⁸⁹]*)?)r   )r   r   c             C  s\   |  dd} |  dd} xtD ]\}}||| } qW td| } | t} |  dd} | S )N,r    z per /z**(\1)^z**)r   _subs_rer   _pretty_exp_re	translate_pretty_table)r   r   r   r   r   r   r   	  s    
r   r   )rG   r   c             C  s   | d dko| d dkS )Nr   rD   rL   r   r   )rG   r   r   r   _is_dim  s    r   c               @  s8   e Zd ZU dZded< ded< dd Zdd	d
dZdS )SharedRegistryObjecta  Base class for object keeping a reference to the registree.

    Such object are for now Quantity and Unit, in a number of places it is
    that an object from this class has a '_units' attribute.

    Parameters
    ----------

    Returns
    -------

    zClassVar[BaseRegistry]	_REGISTRYrV   _unitsc             O  s.   t | }t| ds*ddlm} | |_|S )Nr   r   )application_registry)r   r   rW   r    r   getr   )r   r   r   instr   r   r   r   r   .  s
    


zSharedRegistryObject.__new__r   )r   c             C  sF   | j t|ddkrdS t|tr>d}t|| jj|jjndS dS )a;  Check if the other object use a registry and if so that it is the
        same registry.

        Parameters
        ----------
        other :


        Returns
        -------
        type
            other don't use a registry and raise ValueError if other don't use the
            same unit registry.

        r   NTz6Cannot operate with {} and {} of different registries.F)r   getattrr:   r   rl   rZ   r   r{   )rx   r   r   r   r   r   _check8  s    
zSharedRegistryObject._checkN)r{   r|   r}   r~   __annotations__r   r   r   r   r   r   r     s
   

r   c               @  s2   e Zd ZU dZded< dd Zdd Zdd	 Zd
S )PrettyIPythonz(Mixin to add pretty-printers for IPythonr   default_formatc             C  s"   d| j krd| S d| S d S )N~z{:~H}z{:H})r   rZ   )rx   r   r   r   _repr_html_Y  s    

zPrettyIPython._repr_html_c             C  s"   d| j krd| S d| S d S )Nr   z${:~L}$z${:L}$)r   rZ   )rx   r   r   r   _repr_latex__  s    

zPrettyIPython._repr_latex_c             C  s0   d| j kr|d|  n|d|  d S )Nr   z{:~P}z{:P})r   textrZ   )rx   pcycler   r   r   _repr_pretty_e  s    
zPrettyIPython._repr_pretty_N)r{   r|   r}   r~   r   r   r   r   r   r   r   r   r   T  s
   
r   zUnion[UnitLike, Quantity]zOptional[BaseRegistry])	unit_liker_   r   c             C  sj   t |  }t|kr| S t|kr&| jS t|krH|r<|| S t| S nt	|krf|r^|| S t| S dS )zConvert a unit compatible type to a UnitsContainer.

    Parameters
    ----------
    unit_like :

    registry :
         (Default value = None)

    Returns
    -------

    N)
r   mrorV   r   r   r   Z_parse_unitsrS   rT   rU   )r   r_   r   r   r   r   to_units_containerl  s    

r   c             C  sn   t  }xP| j D ]B\}}| j|}t|dks6t|d \}}}||  |7  < qW tdd | D S )zQ

    Parameters
    ----------
    q :


    Returns
    -------
    type


    r   r   c             S  s   i | ]\}}|d kr||qS )r   r   )r!   rf   rd   r   r   r   ri     s    z#infer_base_unit.<locals>.<dictcomp>)rw   r   rR   r   Zparse_unit_namer9   AssertionErrorrV   )rN   r   Z	unit_nameZpowerZ
candidates_Z	base_unitr   r   r   infer_base_unit  s    r   c             C  sL   | ds8t|ddks8|drH|dd  sHtd| |f dS )as  Helper function invoked at start of all overridden ``__getattr__``.

    Raise AttributeError if the user tries to ask for a _ or __ attribute,
    *unless* it is immediately followed by a number, to enable units
    encompassing constants, such as ``L / _100km``.

    Parameters
    ----------
    item : string
        Item to be found.


    Returns
    -------

    __r   r   z%r object has no attribute %rN)endswithr9   lstriprE   isdigitAttributeError)rx   itemr   r   r   getattr_maybe_raise  s    
r   c               @  s4   e Zd ZdZdd Zdd Zdd ZeZdd	 Zd
S )SourceIteratoraR  Iterator to facilitate reading the definition files.

    Accepts any sequence (like a list of lines, a file or another SourceIterator)

    The iterator yields the line number and line (skipping comments and empty lines)
    and stripping white spaces.

    for lineno, line in SourceIterator(sequence):
        # do something here

    c             C  s6   t |tr|S t| }|d k	r2t|d|_d|_|S )Nr   )NN)r:   r   r   r   	enumerateinternallast)r   Zsequenceobjr   r   r   r     s    

zSourceIterator.__new__c             C  s   | S )Nr   )rx   r   r   r   r     s    zSourceIterator.__iter__c             C  sL   d}x4|r| dr8t| j\}}|ddd  }qW ||f| _||fS )Nr    #r   r   )rE   nextr   splitstripr   )rx   linelinenor   r   r   __next__  s    
zSourceIterator.__next__c             C  s   t | S )zIterate block including header.)BlockIterator)rx   r   r   r   
block_iter  s    zSourceIterator.block_iterN)	r{   r|   r}   r~   r   r   r  r   r  r   r   r   r   r     s   	r   c               @  s$   e Zd ZdZdd Zdd ZeZdS )r  z}Like SourceIterator but stops when it finds '@end'
    It also raises an error if another '@' directive is found inside.
    c             C  s&   t | d }|j|_|j|_d|_|S )NF)r   r   r   r   	done_last)r   Zline_iteratorr   r   r   r   r     s
    zBlockIterator.__new__c             C  sN   | j sd| _ | jS t| \}}|dr0tn|drFtd|d||fS )NTz@end@zcannot nest @ directives)r  )r  r   r   r  rE   StopIterationr   )rx   r  r  r   r   r   r    s    

zBlockIterator.__next__N)r{   r|   r}   r~   r   r  r   r   r   r   r   r    s   r  )r   c             C  s&   yt |  W n tk
r    dS X dS )a  Check whether or not an object can be iterated over.

    Vendored from numpy under the terms of the BSD 3-Clause License. (Copyright
    (c) 2005-2019, NumPy Developers.)

    Parameters
    ----------
    value :
        Input object.
    type :
        object
    y :

    FT)r   r   )yr   r   r   iterable	  s
    r  c             C  s&   yt |  W n tk
r    dS X dS )zCheck whether or not an object has a defined length.

    Parameters
    ----------
    value :
        Input object.
    type :
        object
    y :

    FT)r9   r   )r  r   r   r   sized  s
    r  )N)N)N)N)Ir~   Z
__future__r   Zloggingr   r   r   Zcollections.abcr   Z	fractionsr   	functoolsr   r   r   Znumbersr   r   r	   r
   typingr   r   r   r   compatr   r   errorsr   Z
formattingr   Z	pint_evalr   Z_typingr   Zquantityr   r_   r   Z	getLoggerr{   rY   Z
addHandlerr-   r0   rA   rc   rm   rn   rv   rU   rw   rV   rS   Z_subs_re_listr   r   	maketransr   r   r   r   r   r   r   r   r   r   r   r  r  r  r   r   r   r   <module>	   sr   
!M
L!


 S g
7 ,