001/*
002        AUTOMATICALLY GENERATED BY jTemp FROM
003        /Users/jsh2/Work/openimaj/target/checkout/machine-learning/nearest-neighbour/src/main/jtemp/org/openimaj/lsh/functions/#T#CauchyFactory.jtemp
004*/
005/**
006 * Copyright (c) 2011, The University of Southampton and the individual contributors.
007 * All rights reserved.
008 *
009 * Redistribution and use in source and binary forms, with or without modification,
010 * are permitted provided that the following conditions are met:
011 *
012 *   *  Redistributions of source code must retain the above copyright notice,
013 *      this list of conditions and the following disclaimer.
014 *
015 *   *  Redistributions in binary form must reproduce the above copyright notice,
016 *      this list of conditions and the following disclaimer in the documentation
017 *      and/or other materials provided with the distribution.
018 *
019 *   *  Neither the name of the University of Southampton nor the names of its
020 *      contributors may be used to endorse or promote products derived from this
021 *      software without specific prior written permission.
022 *
023 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
024 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
025 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
026 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
027 * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
028 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
029 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
030 * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
031 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
032 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
033 */
034package org.openimaj.lsh.functions;
035
036import org.openimaj.feature.DoubleFVComparison;
037
038import cern.jet.random.Uniform;
039import cern.jet.random.engine.MersenneTwister;
040
041/**
042 * A hash function factory for producing hash functions that use a Cauchy
043 * distribution to approximate L1 distance.
044 * 
045 * @author Jonathon Hare (jsh2@ecs.soton.ac.uk)
046 */
047public class DoubleCauchyFactory extends DoublePStableFactory {
048        private class Function extends PStableFunction {
049                Function(int ndims, MersenneTwister rng) {
050                        super(rng);
051
052                        final Uniform uniform = new Uniform(0, w, rng);
053                        b = (float) uniform.nextDouble();
054
055                        // random direction
056                        r = new double[ndims];
057                        for (int i = 0; i < ndims; i++) {
058                                r[i] = cauchy();
059                        }
060                }
061
062                private final double cauchy() {
063                        return Math.tan(Math.PI * (rng.nextDouble() - 0.5));
064                }
065        }
066
067        /**
068         * Construct the factory with the given parameters.
069         * 
070         * @param ndims
071         *            number of dimensions of the data
072         * @param rng
073         *            the random number generator
074         * @param w
075         *            the width parameter
076         */
077        public DoubleCauchyFactory(int ndims, MersenneTwister rng, double w) {
078                super(ndims, rng, w);
079        }
080
081        @Override
082        public Function create() {
083                return new Function(ndims, rng);
084        }
085
086        @Override
087        protected DoubleFVComparison fvDistanceFunction() {
088                return DoubleFVComparison.EUCLIDEAN;
089        }
090}