o
    GZhA                     @   s  d dl mZmZmZ d dlmZ d dlmZ d dlm	Z	 d dl
mZ d dl
mZ d dlmZ d dlmZ d d	l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mZmZm Z  d dl!m"Z"m#Z#m$Z$ d dl%m&Z& d dl'm(Z( d dlm)Z)m*Z* d dl+Z+d dl,m-Z-m.Z.m/Z/ 		d9ddZ0dd Z1d:ddZ2dd  Z3d!d" Z4d#d$ Z5d%d& Z6e.d'd( Z7e.d)d* Z8d+d, Z9d-d. Z:d/d0 Z;e.d1d2 Z<d3d4 Z=d5d6 Z>d7d8 Z?dS );    )RationalIoo)Eq)symbols)S)Matrix)
randMatrix)QAnd)xyzCNF
EncodedCNF)cosimport_module)	LRASolverUnhandledInputLRARationalHANDLE_NEGATION)randomchoicerandint)sympify	randprime)StrictLessThanStrictGreaterThanN)raisesXFAILskip   皙?TFc                    s   |ffdd	 t d| d  }g }t|D ]>}	t fdd|D  dd}
}g }|s5|t|
|g7 }|sA||
|k|
|kg7 }|sM||
|k |
|kg7 }|t| q|S )	Nc                    sX   t  | k r	tdS  r!dd tdD \}}t||tddg S tddtddg S )Nr   c                 S   s   g | ]}t d dqS )r   2   r   ).0_ r*   P/var/www/auris/lib/python3.10/site-packages/sympy/logic/tests/test_lra_theory.py
<listcomp>       z5make_random_problem.<locals>.rand.<locals>.<listcomp>r%      
   )r   r   ranger   r   r   )sparsityZint1Zint2)rationalr*   r+   rand   s   
z!make_random_problem.<locals>.randzx1:%sr/   c                 3   s    | ]}  | V  qd S Nr*   )r(   r   )r4   r*   r+   	<genexpr>%   s    z&make_random_problem.<locals>.<genexpr>r   )r2   )r   r1   sumr   appendr   )num_variablesnum_constraintsr2   r3   disable_strictdisable_nonstrictdisable_equality	variablesconstraintsr)   lhsrhsoptionsr*   )r4   r3   r+   make_random_problem   s   	"rC   c           	      C   s   ddl m} ddlm} ddlm} ||  }|d}|rB||}| }|| t|	 }|dkr5dS |dkr;d	S t
d
| d S )Nr   r   )smtlib_coder   z3satTZunsatFz/z3 was not able to check the satisfiability of )Zsympy.external.importtoolsr   Zsympy.printing.smtlibrD   sympy.logic.boolalgr   ZSolverZfrom_stringstrcheck
ValueError)	r?   r   rD   r   Zboolean_formularE   Zsmtlib_stringsresr*   r*   r+   check_if_satisfiable_with_z32   s    
rM      c              	      sp   t d t|D ]-} fdd| D }z| D ]}||dks#J q|W   S  ty5    d  Y qw d S )Nr/   c                    s&   i | ]\}}||d  |d    qS )r   r/   r*   )r(   keyvalZepsr*   r+   
<dictcomp>H   s   & z,find_rational_assignment.<locals>.<dictcomp>Tr%   )r   r1   itemssubsAssertionError)Zconstr
assignmentiterr)   assignconsr*   rQ   r+   find_rational_assignmentD   s   
rZ   c                 C   s   t | }t }|| |S r5   )r   	from_propr   from_cnf)bfcnfencr*   r*   r+   boolean_formula_to_encoded_cnfR   s   

r`   c                  C   s   t d\} }tdktt dktdt  t dkB @ ttt dtdt  t dkB @ }t|}tj|dd\}}|jj	dks@J t
|jd	ksIJ t
|jd
ksRJ |jtg dg dgksaJ dd |j D h dksqJ d S )Nzs1 s2r   r%         TZtesting_mode)r%      z
[_s1, _s2]z	[x, y, z])r/   r/   r   r.   r   )r.   r/   r   r.   c                 S   s(   h | ]}t |j|j|j|j|jfqS r*   )rH   varboundupperZequalitystrict)r(   br*   r*   r+   	<setcomp>f   s   ( z(test_from_encoded_cnf.<locals>.<setcomp>>   )r   r   FFF)_s1r%   TFF)_s2TFT)rl   r%   NTF)rm   TFF)r   r   r   r   r   r`   r   from_encoded_cnfAshaperH   ZslackZnonslackr   enc_to_boundaryvalues)s1s2phir_   lrar)   r*   r*   r+   test_from_encoded_cnfY   s   J$ry   c            
      C   s   ddl m}  ddlm}m} dt dt  dkdt dkdt d	kg}| t| }| }|	| | 
|\}}|d
 |d |d | \}}	|du sUJ d S )Nr   )r   r   re   r%      ro   rd   r/      T)!sympy.logic.algorithms.lra_theoryr   sympy.assumptions.cnfr   r   r   r   r[   r   r\   rp   
assert_litrI   )
r   r   r   rY   r^   r_   rx   r)   Zis_satrV   r*   r*   r+   test_problemm   s   *



r   c               	      s  t d} | d u rtd g }td\}}}||d|  dkd| d|  dkd	| d|  dkg |d
| dktd| dg |d| dk d| dkg |d
| dkd| dkd
| dkg |tt dktt dkg |tdktt dktdt  t dkg |d| d|  dkd| dkd| dkg |d| d
kd| dk d| dkg |d| dk d| dkg |d| dkd| | dkd| d|  dk |dkg |t|dtd| dtd	| dtd| d|  dg |td| dt|d|  dtd	| d|  dtd| dg |d| dk d| dkg |d
| d|  dkd| dkd| d|  dk d| d|  dkg ||d|  dkd| d|  dkd| d|  dk d
| d|  d	k g |d| dk d| d|  dk d| d|  dkd| d|  dkg |d| d|  d	kd| d|  dk d	| dkd| d	kg d}tdD ]x}|d dkrt	dddd}n7|d dkrt	dddddd}n&|d dkrt	ddddd}n|d dkrt	dddd}nt	dddd}|t
|k r || }d|v s*d|v r,qt| }|dkr7qt|}	t }
|
|	 td d! |
jD sQJ tj|
dd"\ } j}d _d#d$ | D d%d& |
jD } fd'd(|D }t|d)d* d+}|D ]\}} jr jd dkr n | q  }|d dkr|d7 }t|du sJ d,d( |D }|d }d-d$ | D }t|v st|v sd.d$ | D }|D ]}||dksJ qސqt||}|d usJ qt|du sJ |d }t
|dksJ  fd/d&|D }fd0d&|D }t|du s-J t !|t
|d D ]}t|du sBJ q7qd S )1NrE   zz3 is not installedzx1 x2 x3r|   ra   rb   r   ir.   rn   ro   rz   r%   r/   re   r{   rd   	   ir0      ir'   F)r9   r:   r3   T)r9   r:   r3   r=   r<   )r9   r:   r3   r;      c                 s   s    | ]}d |vV  qdS r   Nr*   r(   clauser*   r*   r+   r6          z'test_random_problems.<locals>.<genexpr>rc   c                 S   s   i | ]\}}||qS r*   r*   r(   rO   valuer*   r*   r+   rR      r-   z(test_random_problems.<locals>.<dictcomp>c                 S   s   h | ]	}|D ]}|qqS r*   r*   )r(   r   litr*   r*   r+   rk          z'test_random_problems.<locals>.<setcomp>c                    s$   g | ]}| j v r j | |fqS r*   )rs   r(   lrx   r*   r+   r,         $ z(test_random_problems.<locals>.<listcomp>c                 S   s$   t | d j| d jt | d jfS )Nr   )rH   rf   rg   rh   )r   r*   r*   r+   <lambda>   r   z&test_random_problems.<locals>.<lambda>)rO   c                 S   s   g | ]}|j qS r*   )func)r(   rY   r*   r*   r+   r,      s    c                 S   s   i | ]\}}|j |qS r*   )rf   r   r*   r*   r+   rR      s    c                 S   s   i | ]	\}}||d  qS )r   r*   r   r*   r*   r+   rR      r   c                    s   h | ]
} j |   qS r*   )rs   Zget_inequalityr   r   r*   r+   rk      s    c                    s   h | ]}|  qS r*   )rT   r   )
s_subs_revr*   r+   rk      r-   )"r   r$   r   r8   r   r   r   r   r1   rC   lenr   r   r[   r   r\   alldatar   rp   s_subsZ
run_checksrS   sortedresultr   rI   rM   r    r!   rT   rZ   	itertoolscombinations)rE   Zspecial_casesx1Zx2Zx3Zfeasible_countir?   rw   r^   r_   r)   r   ZlitsZboundsrj   r   ZfeasibleZ
cons_funcsrV   rY   Zrat_assignmentconflictZsubsetr*   )rx   r   r+   test_random_problems|   s   < (,0(:>FJNJB



r   c                  C   s  t tt t@ t t@ } t| }tj|dd\}}|j	
 D ]}||d ur, nq!t|jdks6J | d dks@J t tt td@ } t| }tj|dd\}}|j	
 D ]}||d urh nq]t|jdksrJ | d dks|J t tt t@ } t| }tj|dd\}}|j	
 D ]}||d ur nqt|jdksJ | d dksJ t tt t@ } t| }tj|dd\}}|j	
 D ]}||d ur nqt|jdksJ | d dksJ d S )NTrc   r|   r   Fr.   r%   )r
   Zpositiver   negativezeror   r`   r   rp   encodingrt   r   r   rs   rI   ltr]   r_   rx   r)   r   r*   r*   r+   test_pos_neg_zero   sH   r   c                  C   s~  t tt td@ t t@ } t| }tj|dd\}}|j	 D ]}|
|d ur- nq"t|jdks7J | d dksAJ t tt td@ t t@ } t| }tj|dd\}}|j	 D ]}|
|d urn nqct|jdksxJ | d dksJ t tt t@ } t| }tj|dd\}}|j	 D ]}|
|d ur nqt|jdksJ | d dksJ d S )Ni Trc   r|   r   Fr%   )r
   Zpositive_infiniter   r   r   r`   r   rp   r   rt   r   r   rs   rI   gtZnegative_infiniter   r*   r*   r+   test_pos_neg_infinite  s6     r   c                  C   s   t dd} t| }tj|dd\}}t|jdksJ |dggks$J t dd} t| }tj|dd\}}t|jdks@J |dggksHJ d S )Nr|   r%   Trc   r   r/   r.   )r
   r   r`   r   rp   r   rs   r   )r]   r_   rx   	conflictsr*   r*   r+   test_binrel_evaluation!  s   r   c                  C   s  t du sJ ttdttd @ } t| }tj|dd\}}|jD ]}|D ]}|| q'q#t	|j
dks9J | d dksCJ t| d ddgddgfv sUJ ttd ttd @ } t| }tj|dd\}}|jD ]}|D ]}|| qwqst	|j
dksJ | d dksJ ttd ttd @ } t| }tj|dd\}}|jD ]}|D ]}|| qqt	|j
dksJ | d dksJ ttd ttd @ } t| }tj|dd\}}|jD ]}|D ]}|| qqt	|j
dksJ | d dksJ ttt d ttt d @ ttd @ } t| }tj|dd\}}|jD ]}|D ]}|| q>q:t	|j
d	ksSJ | d dks^J t	| d d	kskJ td
d | d D s{J d S )NTr/   r   rc   r%   Fr.   re   r|   c                 s   s    | ]}|d kV  qdS r   r*   )r(   r   r*   r*   r+   r6   _  r   z test_negation.<locals>.<genexpr>)r   r
   r   r   r`   r   rp   r   r   r   rs   rI   r   r   ler   ger   )r]   r_   rx   r)   r   r   r*   r*   r+   test_negation/  sb   
$


2
$r   c                     s6  t j} td| tt| @ }t| tt fdd tdtttt@ }t| tt	 fdd tdt
dttt
d@ }t| tt	 fdd tdtttt@ }t| tt	 fdd ttd t d}t| tt	 fd	d tttt d}t| tt	 fd
d d S )Nr|   c                         t j ddS NTrc   r   rp   r*   r_   r*   r+   r   f      z&test_unhandled_input.<locals>.<lambda>c                      r   r   r   r*   r   r*   r+   r   j  r   infc                      r   r   r   r*   r   r*   r+   r   n  r   c                      r   r   r   r*   r   r*   r+   r   r  r   r%   c                      r   r   r   r*   r   r*   r+   r   w  r   c                      r   r   r   r*   r   r*   r+   r   {  r   )r   NaNr
   r   r   r`   r"   rJ   r   r   floatr   r   )nanr]   r*   r   r+   test_unhandled_inputb  s&    r   c                  C   s   t  t td kt dk@ ttdk@ } t| }tj|dd\}}t|j D ]}|	|d ur3 nq(t
|jdks=J | d dksGJ d S )Nr   r   Trc   r|   )r   r   r   r`   r   rp   r   r   rt   r   r   rs   rI   r   r*   r*   r+   !test_infinite_strict_inequalities}  s   (	r   c                  C   sp   t dD ]1} td}| }t dD ]"} tddtdd}}|||f dkr4t||| |ks4J qqd S )Nr0   rd   r   rb   )r1   r	   rrefr   r   Z_pivot)r)   mr   r   jr*   r*   r+   
test_pivot  s   r   c                  C   s>  t tdt td@ } t| }tj|dd\}}|jD ]}|D ]}|| q qt	|j
dks2J | d dks<J |  | d dksJJ |jD ]O}|jttddks[J |jdksbJ |jdksiJ |jttd dksvJ |jdks}J |jdksJ |jtddksJ |jd usJ |jd usJ qMd S )Nr/   Trc   r%   r   Fr   )r
   r   r   r   r`   r   rp   r   r   r   rs   rI   Zreset_boundsZall_varrh   r   r   Zupper_from_eqZupper_from_neglowerZlower_from_eqZlower_from_negrX   rf   Zcol_idx)r]   r_   rx   r)   r   r   rf   r*   r*   r+   test_reset_bounds  s,   

r   c                  C   sL   t  } t }||  t|\}}t|dksJ | di fks$J d S )Nr   T)r   r   r\   r   rp   r   rI   )r^   r_   rx   r   r*   r*   r+   test_empty_cnf  s   
r   )r%   r%   r&   TFFF)rN   )@Zsympy.core.numbersr   r   r   Zsympy.core.relationalr   Zsympy.core.symbolr   Zsympy.core.singletonr   Zsympy.matrices.denser   r	   Zsympy.assumptions.askr
   rG   r   Z	sympy.abcr   r   r   r~   r   r   Z(sympy.functions.elementary.trigonometricr   Zsympy.externalr   r}   r   r   r   r   Zsympy.core.randomr   r   r   Zsympy.core.sympifyr   Zsympy.ntheory.generater   r    r!   r   Zsympy.testing.pytestr"   r#   r$   rC   rM   rZ   r`   ry   r   r   r   r   r   r   r   r   r   r   r   r*   r*   r*   r+   <module>   sP    

`
&
3

