o
    iA                     @   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*   [/home/kim/smarthome/.venv/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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   
r[   c                 C   s   t | }t }|| |S r5   )r   	from_propr   from_cnf)bfcnfencr*   r*   r+   boolean_formula_to_encoded_cnfR   s   

ra   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>>   )_s1r%   NTF)_s2TFF)r   r   FFF)rn   TFT)rm   r%   TFF)r   r   r   r   r   ra   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$rz   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   rf   r%      ro   re   r/      T)!sympy.logic.algorithms.lra_theoryr   sympy.assumptions.cnfr   r   r   r   r\   r   r]   rq   
assert_litrI   )
r   r   r   rZ   r_   r`   ry   r)   Zis_satrW   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}   rb   rc   r   ir.   rp   ro   r{   r%   r/   rf   r|   re   	   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>rd   c                 S   s   i | ]\}}||qS r*   r*   r(   rO   valuer*   r*   r+   rS      r-   z(test_random_problems.<locals>.<dictcomp>c                 S   s   h | ]	}|D ]}|qqS r*   r*   )r(   r   litr*   r*   r+   rl          z'test_random_problems.<locals>.<setcomp>c                    s$   g | ]}| j v r j | |fqS r*   )rt   r(   lry   r*   r+   r,         $ z(test_random_problems.<locals>.<listcomp>c                 S   s$   t | d j| d jt | d jfS )Nr   )rH   rg   rh   ri   )r   r*   r*   r+   <lambda>   r   z&test_random_problems.<locals>.<lambda>)rO   c                 S   s   g | ]}|j qS r*   )func)r(   rZ   r*   r*   r+   r,      s    c                 S   s   i | ]\}}|j |qS r*   )rg   r   r*   r*   r+   rS      s    c                 S   s   i | ]	\}}||d  qS )r   r*   r   r*   r*   r+   rS      r   c                    s   h | ]
} j |   qS r*   )rt   Zget_inequalityr   r   r*   r+   rl      s    c                    s   h | ]}|  qS r*   )rU   r   )
s_subs_revr*   r+   rl      r-   )"r   r$   r   r8   r   r   r   r   r1   rC   lenr   r   r\   r   r]   alldatar   rq   s_subsZ
run_checksrT   sortedresultr   rI   rM   r    r!   rU   r[   	itertoolscombinations)rE   Zspecial_casesx1Zx2Zx3Zfeasible_countir?   rx   r_   r`   r)   r   ZlitsZboundsrk   r   ZfeasibleZ
cons_funcsrW   rZ   Zrat_assignmentconflictZsubsetr*   )ry   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 )NTrd   r}   r   Fr.   r%   )r
   Zpositiver   negativezeror   ra   r   rq   encodingru   r   r   rt   rI   ltr^   r`   ry   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 Trd   r}   r   Fr%   )r
   Zpositive_infiniter   r   r   ra   r   rq   r   ru   r   r   rt   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%   Trd   r   r/   r.   )r
   r   ra   r   rq   r   rt   r   )r^   r`   ry   	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   rd   r%   Fr.   rf   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   ra   r   rq   r   r   r   rt   rI   r   r   ler   ger   )r^   r`   ry   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 NTrd   r   rq   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   ra   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   Trd   r}   )r   r   r   ra   r   rq   r   r   ru   r   r   rt   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   re   r   rc   )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/   Trd   r%   r   Fr   )r
   r   r   r   ra   r   rq   r   r   r   rt   rI   Zreset_boundsZall_varri   r   r   Zupper_from_eqZupper_from_neglowerZlower_from_eqZlower_from_negrY   rg   Zcol_idx)r^   r`   ry   r)   r   r   rg   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   rq   r   rI   )r_   r`   ry   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   r[   ra   rz   r   r   r   r   r   r   r   r   r   r   r   r*   r*   r*   r+   <module>   sP    

`
&
3

