o
    Ei#                     @   s   d dl Z d dl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dd ZG dd deZ	dd Z
dS )    Nc                   @   s4   e Zd Zdd Zdd Zdd Zdd Zd	d
 ZdS )
Expressionc                 C   s   d S N selfr   r   M/home/ubuntu/veenaModal/venv/lib/python3.10/site-packages/einx/expr/solver.py__init__   s   zExpression.__init__c                 C      t | |gS r   Sumr   otherr   r   r   __add__	      zExpression.__add__c                 C      t || gS r   r
   r   r   r   r   __radd__   r   zExpression.__radd__c                 C   r	   r   Productr   r   r   r   __mul__   r   zExpression.__mul__c                 C   r   r   r   r   r   r   r   __rmul__   r   zExpression.__rmul__N)__name__
__module____qualname__r   r   r   r   r   r   r   r   r   r      s    r   c                   @   s>   e Zd ZdddZdd Zdd Zdd	 Zd
d Zdd ZdS )VariableTc                 C   s    t |  || _|| _|| _d S r   )r   r   idnameinteger)r   r   r   r   r   r   r   r      s   

zVariable.__init__c                 c       | V  d S r   r   r   r   r   r   __iter__      
zVariable.__iter__c                 C      t |to
| j|jkS r   
isinstancer   r   r   r   r   r   __eq__       zVariable.__eq__c                 C   
   t | jS r   )hashr   r   r   r   r   __hash__#      
zVariable.__hash__c                 C   s   | j  S r   r   r   r   r   r   __str__&   s   zVariable.__str__c                 C   s   t j| j| jdS )N)r   )sympySymbolr   r   r   r   r   r   r+   )   s   zVariable.sympyN)T	r   r   r   r   r   r#   r'   r*   r+   r   r   r   r   r      s    
r   c                   @   s<   e Zd Zdd Zdd Zdd Zdd Zd	d
 Zdd ZdS )Constantc                 C   s   t |  || _d S r   )r   r   value)r   r/   r   r   r   r   .   s   

zConstant.__init__c                 c   r   r   r   r   r   r   r   r   2   r   zConstant.__iter__c                 C   r    r   )r"   r.   r/   r   r   r   r   r#   5   r$   zConstant.__eq__c                 C   r%   r   )r&   r/   r   r   r   r   r'   8   r(   zConstant.__hash__c                 C   r%   r   )strr/   r   r   r   r   r*   ;   r(   zConstant.__str__c                 C   s   | j S r   r/   r   r   r   r   r+   >   s   zConstant.sympyNr-   r   r   r   r   r.   -   s    r.   c                   @   H   e Zd Zedd Zdd Zdd Zdd Zd	d
 Zdd Z	dd Z
dS )r   c                 C   sX   t | dkr
tdS t | dkr| d S tdd | D r(ttdd | D S t| S )Nr      c                 s       | ]}t |tV  qd S r   r"   r.   .0cr   r   r   	<genexpr>I       zSum.maybe.<locals>.<genexpr>c                 s       | ]}|j V  qd S r   r1   r6   r   r   r   r9   J       )lenr.   allsumr   childrenr   r   r   maybeC   s   z	Sum.maybec                 C      t |  dd |D | _d S )Nc                 S      g | ]}t |qS r   to_termr6   r   r   r   
<listcomp>P       z Sum.__init__.<locals>.<listcomp>r   r   rA   r   rA   r   r   r   r   N      
zSum.__init__c                 c   "    | V  | j D ]}|E d H  qd S r   r@   r   childr   r   r   r   R   
   
zSum.__iter__c                 C   r    r   )r"   r   rA   r   r   r   r   r#   W   r$   z
Sum.__eq__c                 C      t t| jS r   r&   tuplerA   r   r   r   r   r'   Z      zSum.__hash__c                 C      d dd | jD S )Nz + c                 s       | ]}t |V  qd S r   r0   r6   r   r   r   r9   ^       zSum.__str__.<locals>.<genexpr>joinrA   r   r   r   r   r*   ]   r$   zSum.__str__c                 C   s   t dd | jD S )Nc                 S      g | ]}|  qS r   r+   r6   r   r   r   rG   a   rH   zSum.sympy.<locals>.<listcomp>)r?   rA   r   r   r   r   r+   `   s   z	Sum.sympyNr   r   r   staticmethodrB   r   r   r#   r'   r*   r+   r   r   r   r   r   B       

r   c                   @   r2   )r   c                 C   sZ   t | dkr
tdS t | dkr| d S tdd | D r)ttdd | D S t| S )Nr   r3   c                 s   r4   r   r5   r6   r   r   r   r9   k   r:   z Product.maybe.<locals>.<genexpr>c                 s   r;   r   r1   r6   r   r   r   r9   l   r<   )r=   r.   r>   mathprodr   r@   r   r   r   rB   e   s   zProduct.maybec                 C   rC   )Nc                 S   rD   r   rE   r6   r   r   r   rG   r   rH   z$Product.__init__.<locals>.<listcomp>rI   rJ   r   r   r   r   p   rK   zProduct.__init__c                 c   rL   r   r@   rM   r   r   r   r   t   rO   zProduct.__iter__c                 C   r    r   )r"   r   rA   r   r   r   r   r#   y   r$   zProduct.__eq__c                 C   rP   r   rQ   r   r   r   r   r'   |   rS   zProduct.__hash__c                 C   rT   )Nz * c                 s   rU   r   rV   r6   r   r   r   r9      rW   z"Product.__str__.<locals>.<genexpr>rX   r   r   r   r   r*      r$   zProduct.__str__c                 C   s   t dd | jD S )Nc                 S   rZ   r   r[   r6   r   r   r   rG      rH   z!Product.sympy.<locals>.<listcomp>)r_   r`   rA   r   r   r   r   r+      r$   zProduct.sympyNr\   r   r   r   r   r   d   r^   r   c                 C   s2   t | tr	t| S t | tstdt|  | S )NzExpected Expression, got )r"   intr.   r   	TypeErrortype)xr   r   r   rF      s
   

rF   c                       s   e Zd Z fddZ  ZS )SolveExceptionc                    s   t  | d S r   )superr   )r   message	__class__r   r   r      s   zSolveException.__init__)r   r   r   r   __classcell__r   r   rh   r   re      s    re   c                    s~  dd | D } dd | D } t t| } dd | D i  | D ]}\}}t|trQt|trQ |j|j|jkrJtd |j |jh d|j	 d|j |j< qt|trt|tr |j|j|jkrxtd |j |jh d|j	 d|j |j< qt|trt|tr|j|jkrtd|j d	|j d
qdd D }| D ]2\}}t|trt|tr|j|v r|j|v sJ ||j }||j }|D ]}|||< |
| qqi dd | D  D ]u}t fdd|D r6 fdd|D }t|dkr-fdd|D }	t|	dkr#td| dtt|	 dtd| d|	 ttt|}
ntdt| dfdd|D  }
|D ]}|vsUJ |
|< qLqfddg }| D ];\}}|}|}t|trt|tr|j|jkrtd|j d	|j dqg||kr|||f qg|} i }t| dkrdd | D }tdd |D ri }nLtj|ddd}|g kri }n<t|tr
t|dkr
|\}t|dkrtd t|dkrtd!tt|}d"d t|D }ntd#i } D ](\}}
t|
tr%|
j||< qt|
tr:|
j|v r8||
j ||< qt |S )$Nc                 S   s    g | ]\}}t |t |fqS r   rE   r7   t1t2r   r   r   rG           zsolve.<locals>.<listcomp>c                 S   s    g | ]\}}||kr||fqS r   r   rk   r   r   r   rG      rn   c                 S   s2   i | ]}|D ]}|D ]}t |tr
|j|q
qqS r   r!   )r7   termstermvr   r   r   
<dictcomp>   s    

zsolve.<locals>.<dictcomp>zFound contradictory values z for expression ''z != z in input equationc                 S   s   i | ]}||hqS r   r   )r7   rq   r   r   r   rr      rH   c                 S   s   i | ]}t ||qS r   )r   )r7   sr   r   r   rr          c                 3   s    | ]}| v V  qd S r   r   r7   n	constantsr   r   r9      rW   zsolve.<locals>.<genexpr>c                    s   h | ]
}| v r | qS r   r   rv   rx   r   r   	<setcomp>   s    zsolve.<locals>.<setcomp>r3   c                       h | ]} | j qS r   r)   r7   a	variablesr   r   rz      ru   z for equivalent expressions zClass-zEquivalent expressions c                    r{   r   r)   r|   r~   r   r   rz      ru   c                    sz   t | tr| j v r | j S t | tr| S t | tr(tfdd| jD S t | tr:tfdd| jD S t )Nc                       g | ]} |qS r   r   r6   replacer   r   rG      rH   z*solve.<locals>.replace.<locals>.<listcomp>c                    r   r   r   r6   r   r   r   rG      rH   )	r"   r   r   r.   r   rB   rA   r   AssertionError)t)origvar_to_solvevarr   r   r   r      s   



zsolve.<locals>.replacez for same equivalence classr   c                 S   s$   g | ]\}}t |  |  qS r   )r+   Eqrk   r   r   r   rG      s   $ c                 s   s    | ]
}|j o
t|V  qd S r   )
is_Booleanbool)r7   eqr   r   r   r9      s    T)setmanual   zSympy returned no solutionsz*Sympy returned multiple possible solutionsc                 S   s$   i | ]\}}|j rt|t|qS r   )	is_numberr0   ra   )r7   krq   r   r   r   rr   
  s
    
z Sympy returned unexpected result)listr   r"   r   r.   getr   r/   re   r   addvaluesanyr=   nextiterappendr>   r+   solverR   zipitemsr   )	equationsrl   rm   classesset1set2t_ideclassclass_constantsnamesrq   rw   
equations2t1ot2o	solutionssympy_equationsorig_solutionsr   r   )ry   r   r   r   r   r      s   




r   )r+   r_   r   r   r.   r   r   rF   	Exceptionre   r   r   r   r   r   <module>   s    ""	