B
     \                 @   s   d dl mZ d dlZd dl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ZdZd	Zd
ZdZdZdZdZdd Zdd Zdd Zdd Zdd Zdd Zdd ZG dd deZ e!dkre"  dS )     )print_functionN)compile_isolatedcompile_extraFlags)typestyping   )TestCaseg{Gz?g333333?g:p?g[2ֿgh^_?gxN#gC)H?gQ63E?c             C   sj   dddt |    }tt d|  |   |t|t|t|t|t          }t 	| dkd| |S )Ng      ?gqq?g      r   )
npabsRSQRT2PIexpA1A2A3A4A5where)dKret_val r   <lib/python3.7/site-packages/numba/tests/test_blackscholes.py	cnd_array   s    *r   c             C   sh   dddt |    }tt d|  |   |t|t|t|t|t          }| dkrdd| }|S )Ng      ?gqq?g      r   )	mathZfabsr   r   r   r   r   r   r   )r   r   r   r   r   r   cnd    s    *r   c             C   s   | }|}|}|}|}	t |}
t || |d|	 |	  |  |	|
  }||	|
  }t|}t|}t | | }|| || |  }|| d|  |d|   }||fS )Ng      ?g      ?)r
   sqrtlogr   r   )
stockPriceoptionStrikeoptionYearsRiskfree
VolatilitySXTRVsqrtTd1d2cndd1cndd2expRT
callResult	putResultr   r   r   blackscholes_arrayexpr)   s    
*r0   c             C   s   | }|}|}|}|}	t |}
t || |d|	 |	  |  |	|
  }||	|
  }t|}t|}t | | }|| || |  }|| d|  |d|   }||fS )Ng      ?g      ?)r
   r   r   cnd_array_jittedr   )r   r   r    r!   r"   r#   r$   r%   r&   r'   r(   r)   r*   r+   r,   r-   r.   r/   r   r   r   blackscholes_arrayexpr_jitted=   s    
*r2   c             C   s   |}|}|}	|}
|}xt t|D ]}t|	| }t|| ||  |
d| |  |	|   ||  }|||  }t|}t|}td|
 |	|  }|| | || | |  | |< || | d|  || d|   ||< q"W d S )Ng      ?g      g      ?)rangelenr   r   r   r   r   )r.   r/   r   r   r    r!   r"   r#   r$   r%   r&   r'   ir(   r)   r*   r+   r,   r-   r   r   r   blackscholes_scalarQ   s    6 r6   c             C   s   |}|}|}	|}
|}xt t|D ]}t|	| }t|| ||  |
d| |  |	|   ||  }|||  }t|}t|}td|
 |	|  }|| | || | |  | |< || | d|  || d|   ||< q"W d S )Ng      ?g      g      ?)r3   r4   r   r   r   
cnd_jittedr   )r.   r/   r   r   r    r!   r"   r#   r$   r%   r&   r'   r5   r(   r)   r*   r+   r,   r-   r   r   r   blackscholes_scalar_jittedd   s    6 r8   c             C   s   d|  | | |  S )Ng      ?r   )Zrand_varZlowZhighr   r   r   	randfloatw   s    r9   c               @   s   e Zd Zdd Zdd ZdS )TestBlackScholesc             C   s  t  }|d tj}t|dd}tt|f|d}|jatt	|||||f|d}|j}d}d}t
| j|dd}	t
| j|d	d
}
t
| j|dd}|	|
|ttf}t| \}}|| \}}t|| }| t|  }td|  td|   | | d d S )NZenable_pyobjectr   C)argsflagsi  
   g      @g      >@g      ?g      Y@g      ?g      $@zL1 norm: %EzMax absolute error: %Er   )r   setr   float64Arrayr   r   entry_pointr1   r2   r9   randomrandom_sampleRISKFREE
VOLATILITYr0   r
   r   sumprintmaxZassertEqual)selfr=   ZscaltyZarrtycr1cr2	jitted_bsOPT_N
iterationsr   r   r    r<   callResultGoldputResultGoldcallResultNumbaputResultNumbadeltaL1normr   r   r   test_array_expr|   s.    
z TestBlackScholes.test_array_exprc          	   C   st  t  }tttjf}|ja|j}|j}t	
dt|jg}|t| ttjdd}|fd tjtjf }t||t|d |i d}|j}	d}
d}t|
}t|
}t|
}t|
}t| j|
dd	}t| j|
d
d}t| j|
dd}|||ttf}t||f|  |	||f|  t|| }| t|  }td|  td|   | | d d S )Nr7   r   r;      )r<   Zreturn_typer=   localsi  r>   g      @g      >@g      ?g      Y@g      ?g      $@zL1 norm: %EzMax absolute error: %Er   )r   r   r   r   r@   rB   r7   Ztyping_contextZtarget_contextr   Zmake_concrete_template	signatureZinsert_user_functionrA   r   r8   r
   Zzerosr9   rC   rD   rE   rF   r6   r   rG   rH   rI   ZassertAlmostEqual)rJ   r=   rK   ZtyctxZctxrY   ZarrayZargtysrL   rM   rN   rO   rP   rQ   rR   rS   r   r   r    r<   rT   rU   r   r   r   test_scalar   s>    




zTestBlackScholes.test_scalarN)__name__
__module____qualname__rV   rZ   r   r   r   r   r:   {   s   !r:   __main__)#Z
__future__r   r   Znumpyr
   Znumba.unittest_supportZunittest_supportZunittestZnumba.compilerr   r   r   Znumbar   r   Zsupportr	   rE   rF   r   r   r   r   r   r   r   r   r0   r2   r6   r8   r9   r:   r[   mainr   r   r   r   <module>   s0   	Q