
    Mg(                     n   S SK r S SKrS SKJr  S SKJrJr  \" SS5      \" S5      S 5       5       r\" S5      S	 5       r\" S
5      S 5       r\" S5      S 5       r	\" S5      \" S5      S 5       5       r
\" S5      S 5       rS rS rS r\R                  SS4S jr\" S5      \" S5      S 5       5       rg)    N)Fore)aliasplugincalcevaluate	calculatec                     UR                  SS5      n[        U5      S:  a  [        XS S9  gU R                  S[        R
                  5        g)zI
Jarvis will get your calculations done!
-- Example:
    calculate 3 + 5
     c                     U $ )N )xs    ?/Users/admin/workspace/ai/Jarvis/jarviscli/plugins/evaluator.py<lambda>calculate.<locals>.<lambda>   s        	formatterError: Not in correct formatN)replacelenr   sayr   REDjarvisstempts      r   r   r   
   s<     IIc2E
5zA~Vk2

1488<r   solvec                 v   ^ [         R                  " S5      mU4S jnU4S jn[        X5      n[        XX2SS9  g)z^
Prints where expression equals zero
-- Example:
    solve x**2 + 5*x + 3
    solve x + 3 = 5
r   c                    > U S:X  a  gSn[        U 5       H&  u  p#TU;  a    gUT   nUSR                  X$5      -  nM(     U$ )Nr   zNo solution!r   zPlease use 'x' in expression.z
{}. x: {}
)	enumerateformat)	solutionsretcountpointx_valuer   s        r   _formatsolve.<locals>._format#   sR    >!%i0LE~6AhG=''77C	 1
 
r   c                 0   > [         R                  " U TSS9$ NT)dictsympyr   )exprr   s    r   _calcsolve.<locals>._calc.   s    {{4..r   F
calculatorr   do_evalfN)r/   Symbolremove_equalsr   )r   r   r)   r1   r   s       @r   r   r      s5     	SA	/ 	f Au%Hr   	equationsc                   ^ [         R                  " S5      u  p#pEpgpppn[         R                  " S5      u  nnnnnnnnnnnnn/ mSnU R                  SR                  U5      5      nUS:w  aU  US-  n[	        U5      n[        U U5      nTR                  U5        U R                  SR                  U5      5      nUS:w  a  MU  [        U UU4S jS9  g)	a  
Solves linear equations system

Use variables: a, b, c, ..., x, y,z

Example:

~> Hi, what can I do for you?
equations
1. Equation: x**2 + 2y - z = 6
2. Equation: (x-1)(y-1) = 0
3. Equation: y**2 - x -10 = y**2 -y
4. Equation:
[{x: -9, y: 1, z: 77}, {x: 1, y: 11, z: 17}]

za,b,c,d,e,f,g,h,i,j,k,l,mzn,o,p,q,r,s,t,u,v,w,x,y,zr   z{}. Equation: r   c                 0   > [         R                  " U TSS9$ r,   r.   )r0   r8   s    r   r   equations.<locals>.<lambda>Y   s    !r   )r4   N)r/   symbolsinputr#   format_expressionr7   appendr   )r   termabcdefghijklmnopqrr   tuvwr   yzr&   
user_inputr8   s                                 @r   r8   r8   5   s    $ -2MM#-%)A!aA!,1MM#-%)Aq!Q1aAq!Q IE.55e<=J


&z2
"6:6
$\\"2"9"9%"@A
 
 	r   factorc                     UR                  SS5      n[        U5      S:  a  [        X[        R                  S9  gU R                  S[        R                  5        g)z8
Jarvis will factories
-- Example:
    factor x**2-y**2
r
   r   r   r   r   N)r   r   r   r/   rZ   r   r   r   r   s      r   rZ   rZ   _   s@     IIc2E
5zA~Vell3

1488<r   z
curve plotplotc                    S n[        U5      S:X  a  U R                  S5        g [        X[        USS9  g! [         a#    U R                  S[
        R                  5         g[         a    U R                  S5         gf = f)	z=
Plot graph
-- Example:
    plot x**2
    plot y=x(x+1)(x-1)
c                     [         R                  " U S   SS9n[        S[        U 5      5       H2  n[         R                  " X   SS9X'   UR	                  X   S   5        M4     UR                  5         g)Nr   F)showr   r   )r/   r\   ranger   r?   r_   )r0   plotsrI   s      r   _plotplot.<locals>._plotv   s_    

47/q#d)$Ajju5DGLL$ % 	

r   r   z3Missing parameter: function (e.g. call 'plot x**2')NFr3   zCannot plot...z(Cannot plot - values probably too big...)r   r   r   solve_y
ValueErrorr   r   OverflowError)r   r   rb   s      r   r\   r\   m   sn     1v{

HI?V7eeL /

#TXX. ?

=>?s   7 *B #B ?B limitc           	      h   SS jnUS:X  a  U R                  S5        gUR                  5       n/ nSnU H{  nUS   S:X  ak  USS R                  5       (       a  UR                  [	        USS 5      5        MC  U R                  SR                  USS 5      [        R                  5        Mw  XV-  nM}     [        X5      n[        U5      n [        X5      n[        R                  " S
5      nU R                  SR                  U" UU[        R                  R                   75      5      [        R"                  5        U R                  SR                  U" UU[        R                  R                   * 5      5      [        R"                  5        U Hq  nU" XWUSS9n	U" XWUSS9n
U R                  SR                  X5      [        R"                  5        U R                  SR                  X5      [        R"                  5        Ms     g! [        R                  [        4 a    U R                  S	5         gf = f)z
Prints limit to +/- infinity or to number +-. Use 'x' as variable.
-- Examples:
    limit 1/x
    limit @1 1/(1-x)
    limit @1 @2 1/((1-x)(2-x))
r   c                      [         R                  " XX#5      R                  5       $ ! [         R                   a     g[         a     gf = f)NErrorSorry, cannot solve...)r/   LimitdoitSympifyErrorNotImplementedError)r@   r   to	directorys       r   	try_limitlimit.<locals>.try_limit   sD    	,;;t6;;==!! 	" 	,+	,s   $' A		A	A	zUsage: limit TERMNr   @r   zError: {} Not a numberzError, not a valid termr   u   lim ->  ∞	= {}u   lim -> -∞	= {}+)rq   -zlim -> {}(+)	= {}zlim -> {}(-)	= {})r   )r   split	isnumericr?   intr#   r   r   r7   r>   rd   r/   rn   	TypeErrorr6   SInfinityBLUE)r   r   rr   s_splitlimit_tor@   tokenr   rg   
limit_pluslimit_minuss              r   rg   rg      s   , 	Bw

&'ggiGHD8s?QRy""$$E!"I/

3::!"I $* MD  &DT"Dv$
 	SA JJ")))D23egg6F6F5F+H IJN))U
JJ")))D23egg6F6F5F+H IJN))U t=
#>

'..uA499M

'..uBDIIN  	* 

,-s   
H +H10H1c                     UR                  S5      n[        U5      S:X  a  U$ [        U5      S:w  a"  U R                  S[        R                  5        U$ SR                  US   US   5      $ )z
User should be able to input equations like x + y = 1.
SymPy only accepts equations like: x + y - 1 = 0.
=> This method Finds '=' and move everything beyond to left side
=r      z"Warning! More than one = detected!z	{} - ({})r   )rw   r   r   r   r   r#   )r   equationrw   s      r   r7   r7      s`     NN3E
5zQ
5zQ

7BeAha11r   c                    [         R                  U 5      n U R                  SS5      n U R                  SS5      n U R                  SS5      n U R                  SS5      n U R                  S	S5      n U R                  S
S5      n [        R                  " S5      nUR                  SU 5      n [        R                  " S5      nUR                  SU 5      n U R                  SS5      n U $ )Npowerz**plusru   minusrv   	dividedby/by^z(\d+)([abcxyz])z\1*\2z([abcxyz])\(z\1*(z)(z)*()strlowerr   recompilesub)r   rP   s     r   r>   r>      s    		!A			'4 A			&#A			'3A			+s#A			$A			#tA 	

%&A	hA 	

?#A	gqA 	
		$AHr   c                 @   SU;   a  [         R                  " S5      nO>SU;   a  SU;   a  [         R                  " S5      nO[        U SR                  U5      5      $ [	        X5      n [         R
                  " X5      n[        U5      S:X  a  gU$ ! [         a     gf = f)NrW   r   r   z({}) -yunknownr   0)r/   r6   rd   r#   r7   r   ro   r   )r   r   symbolresultss       r   rd   rd      s    
axc"	cQhc"vy//233f A++a( 7|q  s   (B 
BBTc                 h   [        U5      n U" U5      nUbv  SU;   ah  SU;   ab  SU;  a\  [        R                  " S5      n[        R                  R                  [        R                  " XeS   5      XeS   S-
  US   S-   45      nOU" U5      nU(       a  UR                  5       nU R                  [        U5      [        R                  5        g ! [        R                   a#    U R                  S[        R
                  5         g [         a#    U R                  S[        R
                  5         g f = f)Nz.Error: Something is wrong with your expressionzSorry, cannot solver   r   rW   r      )r>   r/   rn   r   r   r   ro   r6   plottingplot_implicitEqevalfr   r}   )r   r   r4   r   r5   resultr   s          r   r   r     s    !AA !8qS\S!A^^11%((1Qi2H1UViZ[m]cde]fij]jJklFv&F
JJs6{DII&#  

CTXXN 

($((3s   C 4D1)D10D1zcurve sketchcurvesketchc           	         [        U5      S:X  a  U R                  S5        gS n[        X5      n[        U5      n[	        X5      nU4S jnU" X5        U" U S5        U R                  SR                  U5      5        U" U S5        U R                  S	R                  U5      5        U" U S
5        U R                  SR                  U5      5        U" U S5        U R                  [        U" S5      R                  S5      5      [        R                  5        U" U S5        U R                  SR                  U5      5        U" U S5        [        R                  " S5      n[        R                  " X55      R                  5       n[        R                  " Xe5      R                  5       n[        R                  " Xu5      R                  5       nU R                  SR                  U5      [        R                  5        U R                  SR                  U5      [        R                  5        U R                  SR                  U5      [        R                  5        U" U S5        U R                  SR                  [        R                  " X55      R                  5       5      [        R                  5        U" U S5         [        R                   " U5      n	U	 H}  n[        U" U5      R                  S5      5      n
 ['        U" XWS95      nUc  SnOUS:  a  SnOUS:  a  SnOSnU R                  SR                  XZU5      [        R                  5        M     U" U S5         [        R                   " U5      n	U	 Ha  nU" U5      n
 ['        U" XXS95      nUS:w  d  M#  U R                  S!R                  XZR                  S5      5      [        R                  5        Mc     U" U S"5        g! ["         a&    U R                  S[        R$                  5        / n	 GNCf = f! [(         a    Sn GN![*         a    Sn GN/f = f! ["         a%    U R                  S[        R$                  5        / n	 Nf = f! [(         a    S n Nf = f)#a  
Prints useful information about a graph of a function.
* Limit
* Intersection x/y axis
* Derivative and Integral
* Minima / Maxima / Turning point
-- Example:
    curve sketch y=x**2+10x-5
    curve sketch y=sqrt((x+1)(x-1))
    curve sketch y=1/3x**3-2x**2+3x
r   zCMissing parameter: function (e.g. call 'curve sketch y=x**2+10x-5')Nc                     U R                  SR                  SR                  U5      5      [        R                  5        g )Nz
{:#^50}z {} )r   r#   r   MAGENTA)r   headlines     r   sectioncurvesketch.<locals>.section1  s(    

;%%fmmH&=>Mr   c                 N    [         R                  " S5      nUR                  X 0S9$ )Nr   )subs)r/   r6   r   )x_valfuncr   s      r   get_ycurvesketch.<locals>.get_y8  s#    LLzzzz**r   Graphzplot {}rl   zlimit {}zIntersection x-axiszsolve {}zIntersection y-axis	   Factorz	factor {}
Derivativer   z1. Derivative: {}z2. Derivative: {}z3. Derivative: {}IntegralzF(x) = {} + tzMaxima / Minimark   )r   r   MinimaMaximar   z({}/{}) : {}zTurning Pointz({}/{})r   )r   r   r7   r>   rd   evalr#   r   roundr   r}   r/   r6   r   rm   r   r   ro   r   floatre   rz   )r   r   r   r@   r   r   derivative_1derivative_2derivative_3critical_pointsrW   isminmaxminmaxis_turning_points                 r   r   r     s    1v{

Q	SN #DT"D6 D + FFG
KK	  #$FG
KK
!!$'(F)*
KK
!!$'(F)*
JJs58>>!$%tyy1FH
KK""4()FL!SA##D,113L##L499;L##L499;L
JJ")),7C
JJ")),7C
JJ")),7CFJ
JJ%%ennT&=&B&B&DEtyyQF%&++l3
 aq!"	U189H F\F\FF

>((v6		B) , FO$++l3
 !H	"$U1%@A q JJy''771:6		B  FBY  

+TXX6  	H 	H	$  

+TXX6  	"!	"sN   ;O% 7PP9 Q+%,PPP6'P65P69,Q('Q(+Q:9Q:)r   r/   coloramar   r   r   r   r   r8   rZ   r\   rg   r7   r>   rd   sympifyr   r   r   r   r   <module>r      s   	     vz
=  
= I I6 & &R 
= 
= |?  ?: 7O 7Ot2 2*  %}}t '2 ~h  hr   