class GaussianProposalDistribution implements ProposalDistribution {

    @Override
    public <T> double logProb(Probabilistic<T> variable, T ofValue, T givenValue) {
        if (!(ofValue instanceof DoubleTensor)) {
            throw new ClassCastException("Only DoubleTensor values are supported - not " + ofValue.getClass().getSimpleName());
        }
        if (!sigmas.containsKey(variable)) {
            throw new IllegalStateException("A sigma was not specified for variable " + variable);
        }
        Gaussian proposalDistribution = (Gaussian) Gaussian.withParameters((DoubleTensor) ofValue, sigmas.get(variable));
        return proposalDistribution.logProb((DoubleTensor) givenValue).sumNumber();
    }

    public  GaussianProposalDistribution(List<? extends Variable> variables, DoubleTensor sigma);
    public  GaussianProposalDistribution(List<? extends Variable> variables, DoubleTensor sigma, List<ProposalListener> listeners);
    public  GaussianProposalDistribution(Map<? extends Variable, DoubleTensor> sigmas);
    public  GaussianProposalDistribution(Map<? extends Variable, DoubleTensor> sigmas, List<ProposalListener> listeners);

}