o
    jg[%                     @   s.  d dl 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 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efddZeejejejejejejejejejejejej ej!hB Z"dd Z#dd Z$dd Z%ejejejejejejejejejejej dej!diZ&dd Z'dd Z(dS )    )global_assumptions)CNF
EncodedCNF)Q)satisfiable)UnhandledInputALLOWED_PRED)
MatrixKind)
NumberKind)AppliedPredicate)Mul)STc                 C   sZ   t | }t |  }t |}t }|| t  }|r"||}|| t|||S )aO  
    Function to evaluate the proposition with assumptions using SAT algorithm
    in conjunction with an Linear Real Arithmetic theory solver.

    Used to handle inequalities. Should eventually be depreciated and combined
    into satask, but infinity handling and other things need to be implemented
    before that can happen.
    )r   	from_propr   from_cnfextendadd_from_cnfcheck_satisfiability)propositionassumptionscontextprops_propscnfcontext_cnf r   T/var/www/html/zoom/venv/lib/python3.10/site-packages/sympy/assumptions/lra_satask.py
lra_satask   s   
	



r   c                 C   s  |  }|  }||  || t|\}}|D ]}|jtvr/|jtjkr/td| dq|D ]}|jt	t
krCtd| d|tjkrLtdq2t|D ]8}	t|j}
|	|jvrd|
d |j|	< |j|j|	 g t|j}
|	|jvr|
d |j|	< |j|j|	 g qQt|}t|}t|dddu}t|dddu}|r|rd S |r|sdS |s|rdS |s|std	d S d S )
NLRASolver: z is an unhandled predicatez is of MatrixKindzLRASolver: nan   T)use_lra_theoryFzInconsistent assumptions)copyr   "get_all_pred_and_expr_from_enc_cnffunction
WHITE_LISTr   ner   kindr	   r
   r   NaNextract_pred_from_old_assumlenencodingdataappend_preprocessr   
ValueError)prop_propfactbasesat_true	sat_falseall_pred	all_exprspredexprassmncan_be_truecan_be_falser   r   r   r   .   sJ   






r   c                 C   s  |   } d}dd | j D }i }g }| jD ]}g }|D ]}|dkr-|| d||< q|t| }|dk }	|dk|dk  }
t|}t|ts`||vrT|||< |d7 }|| }||
|  q|	rp|j	t
jkrpd}	t
j|j }|j	t
jkr|j\}}|	rt
||}||vr|||< |d7 }|| }|| qt
||t
||f}|D ]}||vr|||< |d7 }|| }|| qq|j	t
jkr|	rJ ||vr|||< |d7 }||| |
  q|| qt||d ksJ t||} | S )a!  
    Returns an encoded cnf with only Q.eq, Q.gt, Q.lt,
    Q.ge, and Q.le predicate.

    Converts every unequality into a disjunction of strict
    inequalities. For example, x != 3 would become
    x < 3 OR x > 3.

    Also converts all negated Q.ne predicates into
    equalities.
    r   c                 S   s   i | ]\}}||qS r   r   ).0keyvaluer   r   r   
<dictcomp>r   s    z_preprocess.<locals>.<dictcomp>r   F)r    r)   itemsr*   r+   abs_pred_to_binrel
isinstancer   r"   r   eqr$   	argumentsgtltr(   r   )enc_cnfcur_encrev_encodingnew_encodingnew_dataclause
new_clauselitr.   negatedsignarg1arg2new_propnew_enc	new_propsr   r   r   r,   `   sl   





r,   c                 C   s  t | ts| S | jtv rt| j }|du rdS || jd } | jtjkr/t| jd d} | S | jtjkr@t	| jd d} | S | jtj
krQt| jd d} | S | jtjkrbt| jd d} | S | jtjkrst| jd d} | S | jtjkrt| jd d} | S )NFr   )rB   r   r"   pred_to_pos_neg_zerorD   r   positiverE   negativerF   zerorC   nonpositivelenonnegativegenonzeror$   )r5   fr   r   r   rA      s2   



rA   Fc                 C   sD   t  }t  }| j D ]}t|tr|| ||j q||fS )N)setr)   keysrB   r   addupdaterD   )rG   r4   r3   r5   r   r   r   r!      s   

r!   c                 C   s\  g }| D ]}t |dsqt|jdkrq|jdur!td| dt|tr8tdd |jD r8td| d|j	dkrJ|j
dkrJtd| d|j	d	krWtd| d
|jd	krdtd| d|j
rp|t| q|jr||t| q|jr|t| q|jr|t| q|jr|t| q|jr|t| q|S )ar  
    Returns a list of relevant new assumption predicate
    based on any old assumptions.

    Raises an UnhandledInput exception if any of the assumptions are
    unhandled.

    Ignored predicate:
    - commutative
    - complex
    - algebraic
    - transcendental
    - extended_real
    - real
    - all matrix predicate
    - rational
    - irrational

    Example
    =======
    >>> from sympy.assumptions.lra_satask import extract_pred_from_old_assum
    >>> from sympy import symbols
    >>> x, y = symbols("x y", positive=True)
    >>> extract_pred_from_old_assum([x, y, 2])
    [Q.positive(x), Q.positive(y)]
    free_symbolsr   Tr   z must be realc                 s   s    | ]}|j d uV  qdS )TN)is_real)r;   argr   r   r   	<genexpr>  s    z.extract_pred_from_old_assum.<locals>.<genexpr>z is an integerFz can't be an integerz is irational)hasattrr(   rd   re   r   rB   r   anyargs
is_integeris_zerois_rationalr+   r   rY   is_positiverW   is_negativerX   
is_nonzeror^   is_nonpositiverZ   is_nonnegativer\   )r4   retr6   r   r   r   r'      s<   



r'   N))sympy.assumptions.assumer   sympy.assumptions.cnfr   r   sympy.assumptions.askr   sympy.logic.inferencer   !sympy.logic.algorithms.lra_theoryr   r   sympy.matrices.kindr	   sympy.core.kindr
   r   sympy.core.mulr   sympy.core.singletonr   r   rW   rX   rY   r^   rZ   r\   extended_positiveextended_negativeextended_nonpositiveextended_nonzeronegative_infinitepositive_infiniter#   r   r,   rA   rV   r!   r'   r   r   r   r   <module>   s:    2U

