o
    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 }|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*   U/var/www/vscode/kcb/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   )sparsityint1int2)rationalr*   r+   rand   s   
z!make_random_problem.<locals>.randzx1:%sr/   c                 3   s    | ]}  | V  qd S Nr*   )r(   r   )r6   r*   r+   	<genexpr>%   s    z&make_random_problem.<locals>.<genexpr>r   )r2   )r   r1   sumr   appendr   )num_variablesnum_constraintsr2   r5   disable_strictdisable_nonstrictdisable_equality	variablesconstraintsr)   lhsrhsoptionsr*   )r6   r5   r+   make_random_problem   s   	"rE   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satTunsatFz/z3 was not able to check the satisfiability of )sympy.external.importtoolsr   sympy.printing.smtlibrF   sympy.logic.boolalgr   Solverfrom_stringstrcheck
ValueError)	rA   r   rF   r   boolean_formularG   smtlib_stringsresr*   r*   r+   check_if_satisfiable_with_z32   s    
rV      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)constr
assignmentiterr)   assignconsr*   rZ   r+   find_rational_assignmentD   s   
re   c                 C   s   t | }t }|| |S r7   )r   	from_propr   from_cnf)bfcnfencr*   r*   r+   boolean_formula_to_encoded_cnfR   s   

rk   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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*   )rO   varboundupperequalitystrict)r(   br*   r*   r+   	<setcomp>f   s   ( z(test_from_encoded_cnf.<locals>.<setcomp>>   r   r   FFF_s1r%   NTFr{   r%   TFF_s2TFFr~   TFT)r   r   r   r   r   rk   r   from_encoded_cnfAshaperO   slacknonslackr   enc_to_boundaryvalues)s1s2phirj   lrar)   r*   r*   r+   test_from_encoded_cnfY   s   J$r   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   rq   r%      r   rp   r/      T)!sympy.logic.algorithms.lra_theoryr   sympy.assumptions.cnfr   r   r   r   rf   r   rg   r   
assert_litrP   )
r   r   r   rd   ri   rj   r   r)   is_satra   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 )1NrG   zz3 is not installedzx1 x2 x3r   rl   rm   r   ir.   r   r   r   r%   r/   rq   r   rp   	   ir0      ir'   F)r;   r<   r5   T)r;   r<   r5   r?   r>   )r;   r<   r5   r=      c                 s   s    | ]}d |vV  qdS r   Nr*   r(   clauser*   r*   r+   r8          z'test_random_problems.<locals>.<genexpr>rn   c                 S   s   i | ]\}}||qS r*   r*   r(   rX   valuer*   r*   r+   r\      r-   z(test_random_problems.<locals>.<dictcomp>c                 S   s   h | ]	}|D ]}|qqS r*   r*   )r(   r   litr*   r*   r+   rx          z'test_random_problems.<locals>.<setcomp>c                    s$   g | ]}| j v r j | |fqS r*   )r   r(   lr   r*   r+   r,         $ z(test_random_problems.<locals>.<listcomp>c                 S   s$   t | d j| d jt | d jfS )Nr   )rO   rr   rs   rt   )r   r*   r*   r+   <lambda>   r   z&test_random_problems.<locals>.<lambda>)rX   c                 S   s   g | ]}|j qS r*   )func)r(   rd   r*   r*   r+   r,      s    c                 S   s   i | ]\}}|j |qS r*   )rr   r   r*   r*   r+   r\      s    c                 S   s   i | ]	\}}||d  qS )r   r*   r   r*   r*   r+   r\      r   c                    s   h | ]
} j |   qS r*   )r   get_inequalityr   r   r*   r+   rx      s    c                    s   h | ]}|  qS r*   )r^   r   )
s_subs_revr*   r+   rx      r-   )"r   r$   r   r:   r   r   r   r   r1   rE   lenr   r   rf   r   rg   alldatar   r   s_subs
run_checksr]   sortedresultr   rP   rV   r    r!   r^   re   	itertoolscombinations)rG   special_casesx1x2x3feasible_countirA   r   ri   rj   r)   r   litsboundsrw   r   feasible
cons_funcsra   rd   rat_assignmentconflictsubsetr*   )r   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 )NTrn   r   r   Fr.   r%   )r
   positiver   negativezeror   rk   r   r   encodingr   r   r   r   rP   ltrh   rj   r   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 Trn   r   r   Fr%   )r
   positive_infiniter   r   r   rk   r   r   r   r   r   r   r   rP   gt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%   Trn   r   r/   r.   )r
   r   rk   r   r   r   r   r   )rh   rj   r   	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   rn   r%   Fr.   rq   r   c                 s   s    | ]}|d kV  qdS r   r*   )r(   r   r*   r*   r+   r8   _  r   z test_negation.<locals>.<genexpr>)r   r
   r   r   rk   r   r   r   r   r   r   rP   r   r   ler   ger   )rh   rj   r   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 NTrn   r   r   r*   rj   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   rk   r"   rQ   r   r   floatr   r   )nanrh   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   Trn   r   )r   r   r   rk   r   r   r   r   r   r   r   r   rP   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   rp   r   rm   )r1   r	   rrefr   r   _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/   Trn   r%   r   Fr   )r
   r   r   r   rk   r   r   r   r   r   r   rP   reset_boundsall_varrt   r   r   upper_from_equpper_from_neglowerlower_from_eqlower_from_negrc   rr   col_idx)rh   rj   r   r)   r   r   rr   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   rg   r   r   r   rP   )ri   rj   r   r   r*   r*   r+   test_empty_cnf  s   
r   )r%   r%   r&   TFFF)rW   )@sympy.core.numbersr   r   r   sympy.core.relationalr   sympy.core.symbolr   sympy.core.singletonr   sympy.matrices.denser   r	   sympy.assumptions.askr
   rL   r   	sympy.abcr   r   r   r   r   r   (sympy.functions.elementary.trigonometricr   sympy.externalr   r   r   r   r   r   sympy.core.randomr   r   r   sympy.core.sympifyr   sympy.ntheory.generater   r    r!   r   sympy.testing.pytestr"   r#   r$   rE   rV   re   rk   r   r   r   r   r   r   r   r   r   r   r   r   r*   r*   r*   r+   <module>   sP    

`
&
3

