U
    L?hA                     @   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 }|sj|t|
|g7 }|s||
|k|
|kg7 }|s||
|k |
|kg7 }|t| q,|S )	Nc                    s\   t  | k rtdS  rBdd tdD \}}t||tddg S tddtddg S d S )Nr   c                 S   s   g | ]}t d dqS )r   2   r   ).0_ r*   S/var/www/html/venv/lib/python3.8/site-packages/sympy/logic/tests/test_lra_theory.py
<listcomp>   s     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   )r3   r*   r+   	<genexpr>%   s     z&make_random_problem.<locals>.<genexpr>r   )r1   )r   r0   sumr   appendr   )num_variablesnum_constraintsr1   r2   disable_strictdisable_nonstrictdisable_equality	variablesconstraintsr)   lhsrhsoptionsr*   )r3   r2   r+   make_random_problem   s    	"rB   c           	      C   s   ddl m} ddlm} ddlm} ||  }|d}|r||}| }|| t|	 }|dkrjdS |dkrvd	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.smtlibrC   sympy.logic.boolalgr   ZSolverZfrom_stringstrcheck
ValueError)	r>   r   rC   r   Zboolean_formularD   Zsmtlib_stringsresr*   r*   r+   check_if_satisfiable_with_z32   s    
rL      c              	      st   t d t|D ]^} fdd| D }z&| D ]}||dks0tq0|W   S  tk
rl    d  Y qX q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   r0   itemssubsAssertionError)Zconstr
assignmentiterr)   assignconsr*   rP   r+   find_rational_assignmentD   s    
rZ   c                 C   s   t | }t }|| |S r4   )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st
t|jd	kst
t|jd
kst
|jtdddddgdddddggkst
dd |j D dddddhkst
d S )Nzs1 s2r   r%         TZtesting_mode)r%      z
[_s1, _s2]z	[x, y, z]r.   r-   c                 S   s(   h | ] }t |j|j|j|j|jfqS r*   )rG   varboundupperZequalitystrict)r(   br*   r*   r+   	<setcomp>f   s     z(test_from_encoded_cnf.<locals>.<setcomp>)_s1r%   NTF)rl   r%   TFF)_s2TFT)rm   TFF)r   r   FFF)r   r   r   r   r   r`   r   from_encoded_cnfAshaperU   rG   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kst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_litrH   rU   )
r   r   r   rY   r^   r_   rx   r)   Zis_satrV   r*   r*   r+   test_problemm   s    *



r   c               	      s  t d} | d k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 ]}|d dkrt	dddd}nn|d dkrt	dddddd}nL|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|ksd|krXqt| }|dkrnqt|}	t }
|
|	 td d! |
jD sttj|
dd"\ } j}d _d#d$ | D d%d& |
jD } fd'd(|D }t|d)d* d+}|D ]2\}} jr. jd dkr. q< | q  }|d dkr|d7 }t|dksltd,d( |D }|d }d-d$ | D }t|kst|ksd.d$ | D }|D ]}||dkstqnt ||}|d k	stnt|dkst|d }t
|dks"t fd/d&|D }fd0d&|D }t|dksXtt!"|t
|d D ]}t|dksltqlqd S )1NrD   zz3 is not installedzx1 x2 x3r|   ra   rb   r   ir-   rn   ro   rz   r%   r.   re   r{   rd   	   ir/      ir'   F)r8   r9   r2   T)r8   r9   r2   r<   r;   )r8   r9   r2   r:      c                 s   s   | ]}d |kV  qdS r   Nr*   r(   clauser*   r*   r+   r5      s     z'test_random_problems.<locals>.<genexpr>rc   c                 S   s   i | ]\}}||qS r*   r*   r(   rN   valuer*   r*   r+   rR      s      z(test_random_problems.<locals>.<dictcomp>c                 S   s   h | ]}|D ]}|qqS r*   r*   )r(   r   litr*   r*   r+   rk      s       z'test_random_problems.<locals>.<setcomp>c                    s$   g | ]}| j kr j | |fqS r*   )rs   r(   lrx   r*   r+   r,      s     
 z(test_random_problems.<locals>.<listcomp>c                 S   s$   t | d j| d jt | d jfS )Nr   )rG   rf   rg   rh   )r   r*   r*   r+   <lambda>       z&test_random_problems.<locals>.<lambda>)rN   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      s      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      s     )#r   r$   r   r7   r   r   r   r   r0   rB   lenr   r   r[   r   r\   alldatarU   r   rp   s_subsZ
run_checksrS   sortedresultr   rH   rL   r    r!   rT   rZ   	itertoolscombinations)rD   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 k	rB qZqBt|jdkslt| d dkstt tt td@ } t| }tj|dd\}}|j	
 D ]}||d k	r qqt|jdkst| d dkstt tt t@ } t| }tj|dd\}}|j	
 D ]}||d k	r0 qNq0t|jdksbt| d dksxtt tt t@ } t| }tj|dd\}}|j	
 D ]}||d k	r qΐqt|jdkst| d dkstd S )NTrc   r|   r   Fr-   r%   )r
   Zpositiver   negativezeror   r`   r   rp   encodingrt   r   r   rs   rU   rH   ltr]   r_   rx   r)   r   r*   r*   r+   test_pos_neg_zero   s@    

r   c                  C   s  t tt td@ t t@ } t| }tj|dd\}}|j	 D ]}|
|d k	rD q\qDt|jdksnt| d dkstt tt td@ t t@ } t| }tj|dd\}}|j	 D ]}|
|d k	r qqt|jdkst| d dkstt tt t@ } t| }tj|dd\}}|j	 D ]}|
|d k	r> q\q>t|jdkspt| d dkstd S )Ni Trc   r|   r   Fr%   )r
   Zpositive_infiniter   r   r   r`   r   rp   r   rt   r   r   rs   rU   rH   gtZnegative_infiniter   r*   r*   r+   test_pos_neg_infinite  s0      
r   c                  C   s   t dd} t| }tj|dd\}}t|jdks8t|dggksHtt dd} t| }tj|dd\}}t|jdkst|dggkstd S )Nr|   r%   Trc   r   r.   r-   )	r
   r   r`   r   rp   r   rs   rU   r   )r]   r_   rx   	conflictsr*   r*   r+   test_binrel_evaluation!  s    r   c                  C   s
  t dkstttdttd @ } t| }tj|dd\}}|jD ]}|D ]}|	| qNqFt
|jdksrt| d dkstt| d ddgddgfkstttd ttd @ } t| }tj|dd\}}|jD ]}|D ]}|	| qqt
|jdkst| d dks*tttd ttd @ } t| }tj|dd\}}|jD ]}|D ]}|	| qnqft
|jdkst| d dkstttd ttd @ } t| }tj|dd\}}|jD ]}|D ]}|	| qqt
|jdkst| d dks2tttt d ttt d @ ttd @ } t| }tj|dd\}}|jD ]}|D ]}|	| qqt
|jd	kst| d dkstt
| d d	ksttd
d | d D st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+   r5   _  s     z test_negation.<locals>.<genexpr>)r   rU   r
   r   r   r`   r   rp   r   r   r   rs   rH   r   r   ler   ger   )r]   r_   rx   r)   r   r   r*   r*   r+   test_negation/  sX    
$


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                      s   t j ddS NTrc   r   rp   r*   r_   r*   r+   r   f  r   z&test_unhandled_input.<locals>.<lambda>c                      s   t j ddS r   r   r*   r   r*   r+   r   j  r   infc                      s   t j ddS r   r   r*   r   r*   r+   r   n  r   c                      s   t j ddS r   r   r*   r   r*   r+   r   r  r   r%   c                      s   t j ddS r   r   r*   r   r*   r+   r   w  r   c                      s   t j ddS r   r   r*   r   r*   r+   r   {  r   )r   NaNr
   r   r   r`   r"   rI   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 k	rP qhqPt
|jdkszt| d dkstd S )Nr   r   Trc   r|   )r   r   r   r`   r   rp   r   r   rt   r   r   rs   rU   rH   r   r*   r*   r+   !test_infinite_strict_inequalities}  s    	(r   c                  C   sp   t dD ]b} td}| }t dD ]D} tddtdd }}|||f dkr$t||| |ks$tq$qd S )Nr/   rd   r   rb   )r0   r	   rrefr   r   Z_pivotrU   )r)   mr   r   jr*   r*   r+   
test_pivot  s    r   c                  C   sD  t tdt td@ } t| }tj|dd\}}|jD ]}|D ]}|| q@q8t	|j
dksdt| d dksxt|  | d dkst|jD ]}|jttddkst|jdkst|jdkst|jttd dkst|jdkst|jdks
t|jtddks t|jd k	s0t|jd k	stqd S )Nr.   Trc   r%   r   Fr   )r
   r   r   r   r`   r   rp   r   r   r   rs   rU   rH   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s4t| di fksHtd S )Nr   T)r   r   r\   r   rp   r   rU   rH   )r^   r_   rx   r   r*   r*   r+   test_empty_cnf  s    
r   )r%   r%   r&   TFFF)rM   )@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
   rF   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$   rB   rL   rZ   r`   ry   r   r   r   r   r   r   r   r   r   r   r   r*   r*   r*   r+   <module>   sR         

`
&
3

