class FunAlgorithm {

    public void run(List<PositionListIndex> pliList)
            throws InputIterationException, CouldNotReceiveResultException, ColumnNameMismatchException {

        LinkedList<FunQuadruple> lkminusOne = new LinkedList<>();
        lkminusOne.add(new FunQuadruple(new ColumnCombinationBitset(), Long.MAX_VALUE,
                new ColumnCombinationBitset(), new ColumnCombinationBitset()));

        LinkedList<FunQuadruple> lk = new LinkedList<>();
        for (int i = 0; i < numberOfColumns; i++) {
            PositionListIndex currentPli = pliList.get(i);
            plis.put(new ColumnCombinationBitset(i), currentPli);
            lk.add(new FunQuadruple(
                    new ColumnCombinationBitset(i), currentPli
                    .getRawKeyError(),
                    new ColumnCombinationBitset(i),
                    new ColumnCombinationBitset(i)));
            if (!currentPli.isUnique()) {
                rDash.addColumn(i);
            }
        }
        while (!lk.isEmpty()) {
            computeClosure(lkminusOne);
            computeQuasiClosure(lk, lkminusOne);
            displayFD(lkminusOne);
            purePrune(lk, lkminusOne);
            lkminusOne = lk;
            lk = generateCandidates(lk);
        }
        computeClosure(lkminusOne);
        displayFD(lkminusOne);
    }

    public  FunAlgorithm(String relationName, List<String> columnNames,
                        FunctionalDependencyResultReceiver fdReceiver);
    public  FunAlgorithm(String relationName, List<String> columnNames,
                        FunctionalDependencyResultReceiver fdReceiver,
                        UniqueColumnCombinationResultReceiver uccReceiver);

}