This interface has been added in v1.3:

/**
 * Applies to samplers that can share state between instances. Samplers can be 
created with a
 * new source of randomness that sample from the same state.
 *
 * @param <R> Type of the sampler.
 * @since 1.3
 */
public interface SharedStateSampler<R> {
    /**
     * Create a new instance of the sampler with the same underlying state 
using the given
     * uniform random provider as the source of randomness.
     *
     * @param rng Generator of uniformly distributed random numbers.
     * @return the sampler
     */
    R withUniformRandomProvider(UniformRandomProvider rng);
}

All of the DiscreteSampler and ContinuousSampler classes have been updated to 
implement SharedStateSampler.

This is the equivalent of:

/**
 * Sampler that generates values of type {@code int} and can create new 
instances to sample
 * from the same state with a given source of randomness.
 *
 * @since 1.3
 */
public interface SharedStateDiscreteSampler
    extends DiscreteSampler, SharedStateSampler<SharedStateDiscreteSampler> {
    // Marker interface
}


If this combined marker interface is added to the library it would simplify a 
lot of the code for samplers which have internal delegates to avoid casting. 
With this interface they can hold a SharedStateDiscreteSampler rather than a 
DiscreteSampler delegate and directly use it to create new delegates.

For example PoissonSampler code which wraps a specific implementation:

/**
 * @param rng Generator of uniformly distributed random numbers.
 * @param source Source to copy.
 */
private PoissonSampler(UniformRandomProvider rng,
        PoissonSampler source) {
    super(null);

    if (source.poissonSamplerDelegate instanceof SmallMeanPoissonSampler) {
        poissonSamplerDelegate =
            
((SmallMeanPoissonSampler)source.poissonSamplerDelegate).withUniformRandomProvider(rng);
    } else {
        poissonSamplerDelegate =
            
((LargeMeanPoissonSampler)source.poissonSamplerDelegate).withUniformRandomProvider(rng);
    }
}

Becomes:

private PoissonSampler(UniformRandomProvider rng,
        PoissonSampler source) {
    super(null);
    poissonSamplerDelegate = 
source.poissonSamplerDelegate.withUniformRandomProvider(rng);
}


I propose to add:

public interface SharedStateDiscreteSampler
    extends DiscreteSampler, SharedStateSampler<SharedStateDiscreteSampler> {
    // Marker interface
}

public interface SharedStateContinuousSampler
    extends ContinuousSampler, SharedStateSampler<SharedStateContinuousSampler> 
{
    // Marker interface
}



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

Reply via email to