Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

>0.2.0 feature list #47

Open
5 of 15 tasks
patrick-kidger opened this issue Sep 4, 2020 · 3 comments
Open
5 of 15 tasks

>0.2.0 feature list #47

patrick-kidger opened this issue Sep 4, 2020 · 3 comments
Milestone

Comments

@patrick-kidger
Copy link
Collaborator

patrick-kidger commented Sep 4, 2020

Creating a list of potential features that may be nice to have, but aren't necessarily a priority right now.

Tests:

  • Write tests for full Levy area.
  • Write tests for sdeint actually approximating the analytical solution...
  • Write tests that logqp is computing the thing it's supposed to compute.
  • Fix BI doesn't pass tests when alpha=1e-2 issue. Very likely, something is wrong.

Maybe?

  • Derivative-using Stratonovich Milstein w/ scalar noise doesn't look like it's getting the right weak/strong convergence behaviour. (Curved line on log-log plot).
  • Use batch-vjp to compute dg_ga, if and when batch-vjp ever becomes available.
  • Add static tensors as an input to sdeint, sdeint_adjoint
  • C++ BInterval/BPath (to discuss) (If we do this, then Need to add OpenMP flag. #54 is relevant)
@patrick-kidger patrick-kidger changed the title To-do list Eventual feature list Sep 4, 2020
@lxuechen lxuechen added this to the v0.2.0 milestone Sep 7, 2020
@patrick-kidger patrick-kidger changed the title Eventual feature list >0.2.0 feature list Oct 15, 2020
@patrick-kidger patrick-kidger modified the milestones: v0.2.0, 0.3.0? Oct 18, 2020
@jparkhill
Copy link

My number one desired feature is antithetic sampling as an option for sdeint. It's pretty cumbersome to achieve this without editing the package by changing the BrownianInterval's W.

@patrick-kidger
Copy link
Collaborator Author

I've not filled in every detail, but I'd have thought something like this should work:

class AntitheticBrownian(BaseBrownian):
   def __init__(self, bm):
       self.bm = bm

    def __call__(self, ta, tb):
        return -self.bm(ta, tb)

bm = BrownianInterval(...)
ys = torchsde(bm=bm, ...)

abm = AntitheticBrownian(bm)
ays = torchsde(bm=abm, ...)

ys = torch.cat([ys, ays])

Does this approach fail / am I missing something / are you trying to achieve something beyond this?

@jparkhill
Copy link

jparkhill commented Aug 12, 2021

Does work, but it's still much uglier than it needs to be vs sdeint(...,antithetic=True). For innumerable financial applications of this library, this type of option is... priceless ;p Here's a filled in version in case anyone else is following along:

ts = tch.linspace(0,1.,365)
ntraj = 1000
bm = torchsde.BrownianInterval(ts[0], ts[-1], size=(ntraj,sde.brownian_size), levy_area_approximation='space-time')
ys_ = torchsde.sdeint(sde,sde.y0(ntraj=ntraj), ts, bm=bm)
class AntitheticBrownian(torchsde.BrownianInterval):
    def __init__(self, t0, t1, size, bm):
        super(AntitheticBrownian, self).__init__(t0,t1,size, levy_area_approximation='space-time')
        self.bm = bm
    def __call__(self, ta, tb=None, return_U=False, return_A=False):
        Z = self.bm(ta, tb, return_U, return_A)
        if return_U:
            if return_A:
                return -Z[0], Z[1], Z[2]
            else:
                return -Z[0], Z[1]
        else:
            if return_A:
                return -Z[0], Z[1]
            else:
                return -Z
abm = AntitheticBrownian(ts[0], ts[-1], (ntraj,sde.brownian_size), bm)
ays = torchsde.sdeint(sde,sde.y0(ntraj=ntraj), ts, bm=abm)
ys = torch.cat([ys_, ays],1)```

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

3 participants