// Path: src/ch/epfl/bigdata/ts/ga/Chromosome.java
// public class Chromosome {
// 
// 	private List<Gene> genes; //TODO: check if HashMap of genes would be more suitable
// 	private double fitness = 0, fitnessSelection = 0;
//     private int numberOfTransactions=0;
// 
// 	public Chromosome(List<Gene> genes) { //TODO: organize Gene and Chromosome
// 		this.genes = genes;
// 	}
// 
// 	public Chromosome(Chromosome chr) {
// 		genes = new ArrayList<Gene>();
// 		for(int i = 0; i < chr.genes.size(); i++) {
// 			genes.add(new Gene(chr.genes.get(i)));
// 		}
// 	}
// 
// 	public double getFitness() {
// 		return fitness;
// 	}
// 
// 	public void setFitness(double fitness) {
// 		this.fitness = fitness;
// 	}
// 
// 	public double getFitnessSelection() {
// 		return fitnessSelection;
// 	}
// 
// 	public void setFitnessSelection(double fitnessSelection) {
// 		this.fitnessSelection = fitnessSelection;
// 	}
// 
// 	public int getNumGenes() {
// 		return genes.size();
// 	}
// 
// 	public List<Gene> getGenes() {
// 		return genes;
// 	}
// 
//     public int getNumberOfTransactions() {
//         return numberOfTransactions;
//     }
// 
//     public void setNumberOfTransactions(int numberOfTransactions) {
//         this.numberOfTransactions = numberOfTransactions;
//     }
// 
// 
// 	public void copyGenes(int startPoint, int endPoint, Chromosome child) {
// 		for(int i = startPoint; i < endPoint; i++) {
// 			child.genes.add(genes.get(i));
// 		}
// 	}
// 
// 	public void addGene(Gene gene) {
// 		genes.add(gene);
// 	}
// 
// 	public String toString() {
// 		StringBuilder sb = new StringBuilder();
// 		for(int i = 0; i < genes.size(); i++) {
// 			sb.append(genes.get(i));
// 		}
// 		return sb.toString();
// 	}
// }
// 
// Path: src/ch/epfl/bigdata/ts/ga/Gene.java
// public class Gene {
//     private double value;
//     String name = "";
// 
//     public Gene(String name, double value) {
//         this.name = name;
//         this.value = value;
//     }
// 
//     public Gene(double value) {
//         this.value = value;
//     }
// 
//     public Gene(Gene gene) {
//         this(gene.name, gene.value);
//     }
// 
//     public String getName() {
//         return name;
//     }
// 
//     public double getValue() {
//         return value;
//     }
// 
//     public void setValue(double value) {
//         this.value = value;
//     }
// 
//     public String toString() {
//         return name + " " + value + " ";
//     }
// }
// 
// Path: src/ch/epfl/bigdata/ts/ga/util/Range.java
// public class Range {
// 	public static Random R = new Random(System.currentTimeMillis());
//     private double upper, lower;
// 
//     public Range(double lower, double upper) {
//         this.upper = upper;
//         this.lower = lower;
//     }
// 
//     public double getLower() {
//         return lower;
//     }
// 
//     public double getUpper() {
//         return upper;
//     }
// 
// }


import java.util.ArrayList;
import ch.epfl.bigdata.ts.ga.Chromosome;
import ch.epfl.bigdata.ts.ga.Gene;
import ch.epfl.bigdata.ts.ga.util.Range;

package ch.epfl.bigdata.ts.ga.crossover;

public class UniformCrossover implements CrossoverMethod {
	public Chromosome cross(Chromosome chr1, Chromosome chr2) {

// Path: src/ch/epfl/bigdata/ts/ga/Chromosome.java
// public class Chromosome {
// 
// 	private List<Gene> genes; //TODO: check if HashMap of genes would be more suitable
// 	private double fitness = 0, fitnessSelection = 0;
//     private int numberOfTransactions=0;
// 
// 	public Chromosome(List<Gene> genes) { //TODO: organize Gene and Chromosome
// 		this.genes = genes;
// 	}
// 
// 	public Chromosome(Chromosome chr) {
// 		genes = new ArrayList<Gene>();
// 		for(int i = 0; i < chr.genes.size(); i++) {
// 			genes.add(new Gene(chr.genes.get(i)));
// 		}
// 	}
// 
// 	public double getFitness() {
// 		return fitness;
// 	}
// 
// 	public void setFitness(double fitness) {
// 		this.fitness = fitness;
// 	}
// 
// 	public double getFitnessSelection() {
// 		return fitnessSelection;
// 	}
// 
// 	public void setFitnessSelection(double fitnessSelection) {
// 		this.fitnessSelection = fitnessSelection;
// 	}
// 
// 	public int getNumGenes() {
// 		return genes.size();
// 	}
// 
// 	public List<Gene> getGenes() {
// 		return genes;
// 	}
// 
//     public int getNumberOfTransactions() {
//         return numberOfTransactions;
//     }
// 
//     public void setNumberOfTransactions(int numberOfTransactions) {
//         this.numberOfTransactions = numberOfTransactions;
//     }
// 
// 
// 	public void copyGenes(int startPoint, int endPoint, Chromosome child) {
// 		for(int i = startPoint; i < endPoint; i++) {
// 			child.genes.add(genes.get(i));
// 		}
// 	}
// 
// 	public void addGene(Gene gene) {
// 		genes.add(gene);
// 	}
// 
// 	public String toString() {
// 		StringBuilder sb = new StringBuilder();
// 		for(int i = 0; i < genes.size(); i++) {
// 			sb.append(genes.get(i));
// 		}
// 		return sb.toString();
// 	}
// }
// 
// Path: src/ch/epfl/bigdata/ts/ga/Gene.java
// public class Gene {
//     private double value;
//     String name = "";
// 
//     public Gene(String name, double value) {
//         this.name = name;
//         this.value = value;
//     }
// 
//     public Gene(double value) {
//         this.value = value;
//     }
// 
//     public Gene(Gene gene) {
//         this(gene.name, gene.value);
//     }
// 
//     public String getName() {
//         return name;
//     }
// 
//     public double getValue() {
//         return value;
//     }
// 
//     public void setValue(double value) {
//         this.value = value;
//     }
// 
//     public String toString() {
//         return name + " " + value + " ";
//     }
// }
// 
// Path: src/ch/epfl/bigdata/ts/ga/util/Range.java
// public class Range {
// 	public static Random R = new Random(System.currentTimeMillis());
//     private double upper, lower;
// 
//     public Range(double lower, double upper) {
//         this.upper = upper;
//         this.lower = lower;
//     }
// 
//     public double getLower() {
//         return lower;
//     }
// 
//     public double getUpper() {
//         return upper;
//     }
// 
// }


// Path: src/ch/epfl/bigdata/ts/ga/crossover/UniformCrossover.java
import java.util.ArrayList;
import ch.epfl.bigdata.ts.ga.Chromosome;
import ch.epfl.bigdata.ts.ga.Gene;
import ch.epfl.bigdata.ts.ga.util.Range;

package ch.epfl.bigdata.ts.ga.crossover;

public class UniformCrossover implements CrossoverMethod {
	public Chromosome cross(Chromosome chr1, Chromosome chr2) {

		Chromosome offspring = new Chromosome(new ArrayList<Gene>());
