package presenter.algorithms.util;

import model.Line;
import model.Point;

import java.util.ArrayList;
import java.util.concurrent.ThreadLocalRandom;

/**
 * Implementierung verschiedener Algorithmen zur Berechnung von Ausgleichsgeraden.
 *
 * @Author: Armin Wolf
 * @Email: a_wolf28@uni-muenster.de
 * @Date: 26.06.2017.
 */
public class RandomSampler {

    /**
     * Diese Methode liefert eine <code>r</code> Elementige zufällige Stichprobe an Geraden.
     *
     * @param set Die gesammtmenge der Geraden aus denen gewählt werden soll
     * @param r   Anzahl der zu wählenden Geraden
     * @return <code>r</code> Elementige zufällige Stichprobe an Geraden
     */
    public static ArrayList<Line> run(ArrayList<Line> set, Double r, Integer indexOfEnd) {

        ArrayList<Line> sampledLines = new ArrayList<>();

        for (int i = 0; i < r; i++) {
            sampledLines.add(set.get(ThreadLocalRandom.current().nextInt(0, indexOfEnd)));
        }

        return sampledLines;
    }

    /**
     * Diese Methode liefert eine <code>r</code> Elementige zufällige Stichprobe van Schnittpunkten.
     *
     * @param set Die gesammtmenge der Geraden aus denen gewählt werden soll
     * @param r   Anzahl der zu wählenden Geraden
     * @return <code>r</code> Elementige zufällige Stichprobe an Schnittpunkten
     */
    public static ArrayList<Double> run(ArrayList<Point> set, Double r) {

        ArrayList<Double> sampledLines = new ArrayList<>();
        Integer indexOfEnd = set.size();

        for (int i = 0; i < r; i++) {
            Double px = set.get(ThreadLocalRandom.current().nextInt(0, indexOfEnd)).getX();
            if (!sampledLines.contains(px))
                sampledLines.add(px);
        }

        return sampledLines;
    }
}
