// Path: lcs-helper/src/main/java/com/fillumina/lcs/helper/LcsList.java
// public interface LcsList {
// 
//     <T> List<T> lcs(T[] xs, T[] ys);
// }
// 
// Path: lcs-test-util/src/main/java/com/fillumina/lcs/testutil/RandomSequenceGenerator.java
// public class RandomSequenceGenerator {
// 
//     private final int total, lcs;
//     private final long seed;
//     private final List<Integer> lcsList;
//     private Integer[] a, b;
// 
//     /**
//      *
//      * @param total length of the sequences
//      * @param lcs   length of the longest common sequence (lcs <= total)
//      */
//     public RandomSequenceGenerator(final int total, final int lcs) {
//         this(total, lcs, System.nanoTime());
//     }
// 
//     /**
//      *
//      * @param total length of the sequences
//      * @param lcs   length of the longest common sequence
//      * @param seed  seed of the random number generator. To the same
//      *              seeds correspond same random generations (useful for
//      *              debugging).
//      */
//     public RandomSequenceGenerator(final int total, final int lcs,
//             final long seed) {
//         assert lcs <= total;
//         this.total = total;
//         this.lcs = lcs;
//         this.seed = seed;
// 
//         this.a = new Integer[total];
//         this.b = new Integer[total];
//         createSequences(total);
// 
//         Integer[] lcsArray = createLcsArray(lcs);
// 
//         Random rnd = new Random(seed);
//         setLcsSequenceRandomlyIntoList(a, lcsArray, rnd);
//         setLcsSequenceRandomlyIntoList(b, lcsArray, rnd);
// 
//         this.lcsList = Arrays.asList(lcsArray);
//     }
// 
//     private void createSequences(final int total) {
//         int index;
//         for (int i = 0; i < total; i++) {
//             index = i * 2;
//             a[i] = index;
//             b[i] = index+1;
//         }
//     }
// 
//     private static Integer[] createLcsArray(final int lcs) {
//         Integer[] lcsArray = new Integer[lcs];
//         for (int i = 1; i <= lcs; i++) {
//             lcsArray[i-1] = -i;
//         }
//         return lcsArray;
//     }
// 
//     private void setLcsSequenceRandomlyIntoList(Integer[] array,
//             final Integer[] lcsArray, final Random rnd) {
//         int max = lcs;
//         TreeSet<Integer> set = new TreeSet<>();
//         for (int i=0; i<max; i++) {
//             if (!set.add(rnd.nextInt(total))) {
//                 max++;
//             }
//         }
//         assert set.size() == lcs;
//         int index = 0;
//         Iterator<Integer> i = set.iterator();
//         while(i.hasNext()) {
//             array[i.next()] = lcsArray[index];
//             index++;
//         }
//     }
// 
//     public List<Integer> getLcs() {
//         return lcsList;
//     }
// 
//     public List<Integer> getA() {
//         return Arrays.asList(a);
//     }
// 
//     public List<Integer> getB() {
//         return Arrays.asList(b);
//     }
// 
//     public Integer[] getArrayA() {
//         return Arrays.copyOf(a, a.length);
//     }
// 
//     public Integer[] getArrayB() {
//         return Arrays.copyOf(b, b.length);
//     }
// 
//     public long getSeed() {
//         return seed;
//     }
// 
//     @Override
//     public String toString() {
//         return "RandomSequenceGenerator (lcs= " + lcs +
//                 ", seed= " + seed + "L ):\n" +
//                 " a=" + a.toString() +
//                 "\n b=" + b.toString() +
//                 "\n";
//     }
// }


import com.fillumina.lcs.helper.LcsList;
import com.fillumina.lcs.testutil.RandomSequenceGenerator;
import com.fillumina.performance.consumer.assertion.PerformanceAssertion;
import com.fillumina.performance.producer.TestContainer;
import com.fillumina.performance.template.AutoProgressionPerformanceTemplate;
import com.fillumina.performance.template.ProgressionConfigurator;
import java.util.List;
import java.util.concurrent.TimeUnit;
import static org.junit.Assert.assertEquals;
package com.fillumina.lcs;


/**
 * Confront the performances of different algorithms. Note that performances
 * can vary for different values of {@link #TOTAL} and {@link #LCS}.
 *
 * @author Francesco Illuminati
 */
public class AlgorithmsPerformanceTest extends AutoProgressionPerformanceTemplate {

    private static final int TOTAL = 30;
    private static final int LCS = 20;
    private static final long SEED = System.nanoTime();

// Path: lcs-helper/src/main/java/com/fillumina/lcs/helper/LcsList.java
// public interface LcsList {
// 
//     <T> List<T> lcs(T[] xs, T[] ys);
// }
// 
// Path: lcs-test-util/src/main/java/com/fillumina/lcs/testutil/RandomSequenceGenerator.java
// public class RandomSequenceGenerator {
// 
//     private final int total, lcs;
//     private final long seed;
//     private final List<Integer> lcsList;
//     private Integer[] a, b;
// 
//     /**
//      *
//      * @param total length of the sequences
//      * @param lcs   length of the longest common sequence (lcs <= total)
//      */
//     public RandomSequenceGenerator(final int total, final int lcs) {
//         this(total, lcs, System.nanoTime());
//     }
// 
//     /**
//      *
//      * @param total length of the sequences
//      * @param lcs   length of the longest common sequence
//      * @param seed  seed of the random number generator. To the same
//      *              seeds correspond same random generations (useful for
//      *              debugging).
//      */
//     public RandomSequenceGenerator(final int total, final int lcs,
//             final long seed) {
//         assert lcs <= total;
//         this.total = total;
//         this.lcs = lcs;
//         this.seed = seed;
// 
//         this.a = new Integer[total];
//         this.b = new Integer[total];
//         createSequences(total);
// 
//         Integer[] lcsArray = createLcsArray(lcs);
// 
//         Random rnd = new Random(seed);
//         setLcsSequenceRandomlyIntoList(a, lcsArray, rnd);
//         setLcsSequenceRandomlyIntoList(b, lcsArray, rnd);
// 
//         this.lcsList = Arrays.asList(lcsArray);
//     }
// 
//     private void createSequences(final int total) {
//         int index;
//         for (int i = 0; i < total; i++) {
//             index = i * 2;
//             a[i] = index;
//             b[i] = index+1;
//         }
//     }
// 
//     private static Integer[] createLcsArray(final int lcs) {
//         Integer[] lcsArray = new Integer[lcs];
//         for (int i = 1; i <= lcs; i++) {
//             lcsArray[i-1] = -i;
//         }
//         return lcsArray;
//     }
// 
//     private void setLcsSequenceRandomlyIntoList(Integer[] array,
//             final Integer[] lcsArray, final Random rnd) {
//         int max = lcs;
//         TreeSet<Integer> set = new TreeSet<>();
//         for (int i=0; i<max; i++) {
//             if (!set.add(rnd.nextInt(total))) {
//                 max++;
//             }
//         }
//         assert set.size() == lcs;
//         int index = 0;
//         Iterator<Integer> i = set.iterator();
//         while(i.hasNext()) {
//             array[i.next()] = lcsArray[index];
//             index++;
//         }
//     }
// 
//     public List<Integer> getLcs() {
//         return lcsList;
//     }
// 
//     public List<Integer> getA() {
//         return Arrays.asList(a);
//     }
// 
//     public List<Integer> getB() {
//         return Arrays.asList(b);
//     }
// 
//     public Integer[] getArrayA() {
//         return Arrays.copyOf(a, a.length);
//     }
// 
//     public Integer[] getArrayB() {
//         return Arrays.copyOf(b, b.length);
//     }
// 
//     public long getSeed() {
//         return seed;
//     }
// 
//     @Override
//     public String toString() {
//         return "RandomSequenceGenerator (lcs= " + lcs +
//                 ", seed= " + seed + "L ):\n" +
//                 " a=" + a.toString() +
//                 "\n b=" + b.toString() +
//                 "\n";
//     }
// }


// Path: lcs/src/test/java/com/fillumina/lcs/AlgorithmsPerformanceTest.java
import com.fillumina.lcs.helper.LcsList;
import com.fillumina.lcs.testutil.RandomSequenceGenerator;
import com.fillumina.performance.consumer.assertion.PerformanceAssertion;
import com.fillumina.performance.producer.TestContainer;
import com.fillumina.performance.template.AutoProgressionPerformanceTemplate;
import com.fillumina.performance.template.ProgressionConfigurator;
import java.util.List;
import java.util.concurrent.TimeUnit;
import static org.junit.Assert.assertEquals;

package com.fillumina.lcs;


/**
 * Confront the performances of different algorithms. Note that performances
 * can vary for different values of {@link #TOTAL} and {@link #LCS}.
 *
 * @author Francesco Illuminati
 */
public class AlgorithmsPerformanceTest extends AutoProgressionPerformanceTemplate {

    private static final int TOTAL = 30;
    private static final int LCS = 20;
    private static final long SEED = System.nanoTime();

    private final RandomSequenceGenerator generator;