I've submitted a PR with the functionality discussed in this thread for JumpableUniformRandomProvider [1].

Some notes:

- The jump must return a copy.

This requires a bit of code all the way up to the base implementations of IntProvider and LongProvider to copy the current state. I've done this explicitly with copy constructors to avoid using clone() [2].


- The jump has a few requirements that are tested:

1. The copy is a new instance of the same class.

2. The sequence output from the original RNG after the jump must match the reference implementation output.

3. The sequence output from the copy must match what would have been output from the original RNG.


- The default implementations of the providers have cached state

To ensure the state is copied this is tested by comparing the state of the copy with the state of the original pre-jump. This does not require any knowledge of the original state. Just that the state can be accesses using RestorableUniformRandomProvider.

To ensure that the state is cleared in the original RNG post-jump requires that the state pre-jump is not zero and the state after the jump is zero.

One method is to: create a generator, call nextInt or nextBoolean to make it cache some state, do the jump; compare the output of nextInt or nextBoolean to the copy and test it is different. However this requires that the initial state is new (all zero bytes) and so the test must be called in every test class for each generator by passing a new instance.

Alternatively a test is made using the state from RestorableUniformRandomProvider. The size of the default state is known and post-jump is checked to ensure it is zero. This test does not require the pre-jump state to be zero and thus can be put into a parametric test for all the JumpableUniformRandomProviders.

So the tests to check the output sequence post-jump are in the individual tests for each provider and a JumpableProvidersParametricTest tests the general requirements of a Jumpable RNG. This ensures all generators in the library pass tests to ensure common functionality (the copy is a new instance, the state is the same as the original, the post-jump state of the original has reset the cached state).


- Some providers are LongJumpable

This will be added for RNG-98 and I created this PR with future functionality in mind. The jump function to advance the state is named performJump. For those without a LongJump the coefficients are not passed as a parameter and can be hard coded. For any generator with a LongJump function the computation of the jump in the performJump function accepts an array of coefficients.  This will be called with the appropriate long jump coefficients to implement LongJumpable. The rest of the code will be unchanged and new tests can be added to check the long jump.


Comments are welcomed.

Alex


[1] https://github.com/apache/commons-rng/pull/48

[2] https://www.artima.com/intv/bloch13.html




---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscr...@commons.apache.org
For additional commands, e-mail: dev-h...@commons.apache.org

Reply via email to