
    3j                     H   S SK r SSKJr  SSKJr  SSKJrJrJrJrJ	r	   " S S\R                  5      r " S	 S
\R                  5      r " S S\R                  5      r     SS\S\\   S\\   S\\\S4      S\\ R                     S\\	\\ R"                  4      4S jjrg)    N   )brownian_base)brownian_interval   )OptionalScalarTensorTupleUnionc                   x   ^  \ rS rSrU 4S jrS
S jrS r\S 5       r\S 5       r	\S 5       r
\S 5       rS	rU =r$ )ReverseBrownian   c                 6   > [         [        U ]  5         Xl        g N)superr   __init__base_brownian)selfr   	__class__s     T/home/wildlama/miniconda3/lib/python3.13/site-packages/torchsde/_brownian/derived.pyr   ReverseBrownian.__init__   s    ot-/*    c                 (    U R                  U* U* X4S9$ N)return_Ureturn_Ar   )r   tatbr   r   s        r   __call__ReverseBrownian.__call__   s      !!2#sX!QQr   c                 N    U R                   R                   SU R                   S3$ )Nz(base_brownian=))r   __name__r   r   s    r   __repr__ReverseBrownian.__repr__    s'    ..))*/$:L:L9MQOOr   c                 .    U R                   R                  $ r   )r   dtyper%   s    r   r)   ReverseBrownian.dtype#       !!'''r   c                 .    U R                   R                  $ r   )r   devicer%   s    r   r-   ReverseBrownian.device'   s    !!(((r   c                 .    U R                   R                  $ r   )r   shaper%   s    r   r0   ReverseBrownian.shape+   r+   r   c                 .    U R                   R                  $ r   )r   levy_area_approximationr%   s    r   r3   'ReverseBrownian.levy_area_approximation/   s    !!999r   r   NFF)r$   
__module____qualname____firstlineno__r   r    r&   propertyr)   r-   r0   r3   __static_attributes____classcell__r   s   @r   r   r      sd    +R
P ( ( ) ) ( ( : :r   r   c                      ^  \ rS rSrSrSS\S\S\4U 4S jjjrSS jr	S r
\S	 5       r\S
 5       r\S 5       r\S 5       rSrU =r$ )BrownianPath4   zBrownian path, storing every computed value.

Useful for speed, when memory isn't a concern.

To use:
>>> bm = BrownianPath(t0=0.0, w0=torch.zeros(4, 1))
>>> bm(0., 0.5)
tensor([[ 0.0733],
        [-0.5692],
        [ 0.1872],
        [-0.3889]])
t0w0window_sizec           	         > US-   nX l         [        R                  " XUR                  UR                  UR
                  SS9U l        [        [        U ]'  5         g)zwInitialize Brownian path.
Arguments:
    t0: Initial time.
    w0: Initial state.
    window_size: Unused; deprecated.
r   N)r@   t1sizer)   r-   
cache_size)
_w0r   BrownianIntervalr0   r)   r-   	_intervalr   r>   r   )r   r@   rA   rB   rD   r   s        r   r   BrownianPath.__init__B   sN     !V*;;rrxx_a_g_gCE99Y]_lD*,r   c                 d    U R                  XX4S9nUc  U(       d  U(       d  XPR                  -   nU$ r   rI   rG   r   tr   r   r   outs         r   r    BrownianPath.__call__O   -    nnQXnI:hx.C
r   c                 N    U R                   R                   SU R                   S3$ Nz
(interval=r#   r   r$   rI   r%   s    r   r&   BrownianPath.__repr__V   %    ..))**T^^4DAFFr   c                 .    U R                   R                  $ r   rI   r)   r%   s    r   r)   BrownianPath.dtypeY       ~~###r   c                 .    U R                   R                  $ r   rI   r-   r%   s    r   r-   BrownianPath.device]       ~~$$$r   c                 .    U R                   R                  $ r   rI   r0   r%   s    r   r0   BrownianPath.shapea   rZ   r   c                 .    U R                   R                  $ r   rI   r3   r%   s    r   r3   $BrownianPath.levy_area_approximatione       ~~555r   rL   )   r5   )r$   r6   r7   r8   __doc__r   r	   intr   r    r&   r9   r)   r-   r0   r3   r:   r;   r<   s   @r   r>   r>   4   s    -6 -v -C - -G $ $ % % $ $ 6 6r   r>   c                      ^  \ rS rSrSr       SS\S\S\\   S\\   S\\   S\	S	\S
\S\\	   4U 4S jjjr
SS jrS r\S 5       r\S 5       r\S 5       r\S 5       rSrU =r$ )BrownianTreej   a  Brownian tree with fixed entropy.

Useful when the map from entropy -> Brownian motion shouldn't depend on the
locations and order of the query points. (As the usual BrownianInterval
does - note that BrownianTree is slower as a result though.)

To use:
>>> bm = BrownianTree(t0=0.0, w0=torch.zeros(4, 1))
>>> bm(0., 0.5)
tensor([[ 0.0733],
        [-0.5692],
        [ 0.1872],
        [-0.3889]], device='cuda:0')
r@   rA   rD   w1entropytol	pool_sizecache_depthsafetyc
                    > Uc  US-   nUc  Sn
OXB-
  n
X l         [        R                  " UUUR                  UR                  UR
                  UUUSU
S9
U l        [        [        U ]'  5         g)a|  Initialize the Brownian tree.

The random value generation process exploits the parallel random number paradigm and uses
`numpy.random.SeedSequence`. The default generator is PCG64 (used by `default_rng`).

Arguments:
    t0: Initial time.
    w0: Initial state.
    t1: Terminal time.
    w1: Terminal state.
    entropy: Global seed, defaults to `None` for random entropy.
    tol: Error tolerance before the binary search is terminated; the search depth ~ log2(tol).
    pool_size: Size of the pooled entropy. This parameter affects the query speed significantly.
    cache_depth: Unused; deprecated.
    safety: Unused; deprecated.
Nr   T)
r@   rD   rE   r)   r-   rm   rn   ro   halfway_treeW)
rG   r   rH   r0   r)   r-   rI   r   rj   r   )r   r@   rA   rD   rl   rm   rn   ro   rp   rq   rt   r   s              r   r   BrownianTree.__init__z   st    4 :aB:AA*;;r?AACBD((CE99DK@CFOIM>?	A 	lD*,r   c                 d    U R                  XX4S9nUc  U(       d  U(       d  XPR                  -   nU$ r   rL   rM   s         r   r    BrownianTree.__call__   rQ   r   c                 N    U R                   R                   SU R                   S3$ rS   rT   r%   s    r   r&   BrownianTree.__repr__   rV   r   c                 .    U R                   R                  $ r   rX   r%   s    r   r)   BrownianTree.dtype   rZ   r   c                 .    U R                   R                  $ r   r\   r%   s    r   r-   BrownianTree.device   r^   r   c                 .    U R                   R                  $ r   r`   r%   s    r   r0   BrownianTree.shape   rZ   r   c                 .    U R                   R                  $ r   rc   r%   s    r   r3   $BrownianTree.levy_area_approximation   re   r   rL   )NNNgư>   	   Nr5   )r$   r6   r7   r8   rg   r   r	   r   rh   floatr   r    r&   r9   r)   r-   r0   r3   r:   r;   r<   s   @r   rj   rj   j   s    " )-(,*.""$$%+/+-6 +-+-f%+- f%+- #3-	+-
 +-  +- "+- "%+- +-ZG $ $ % % $ $ 6 6r   rj   yr@   rD   rE   .r)   r-   c           	          Uc  U R                   OUnUc  U R                  OUnUc  U R                  OUn[        R                  " SXX4US.UD6$ )zZReturns a BrownianInterval object with the same size, device, and dtype as a given tensor.)r@   rD   rE   r)   r-    )r0   r)   r-   r   rH   )r   r@   rD   rE   r)   r-   kwargss          r   brownian_interval_liker      sP     l177D}AGG%EQXXVF--l[alekllr   )g        g      ?NNN)torch r   r   typesr   r   r	   r
   r   BaseBrownianr   r>   rj   rh   r)   strr-   r   r   r   r   <module>r      s       : ::m00 :<36=-- 36lU6=-- U6r 3524=A:>HLmf m'/m'/m "*%S/!:m #+5;;"7	m
 $,E#u||2C,D#Emr   