/* -*- tab-width: 4 -*-
*
* Electric(tm) VLSI Design System
*
* File: SubPopulationProcessing.java
* Written by Team 3: Christian Wittner, Ivan Dimitrov
*
* This code has been developed at the Karlsruhe Institute of Technology (KIT), Germany,
* as part of the course "Multicore Programming in Practice: Tools, Models, and Languages".
* Contact instructor: Dr. Victor Pankratius (pankratius@ipd.uka.de)
*
* Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 3 of the License, or
* (at your option) any later version.
*
* Electric(tm) is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with Electric(tm); see the file COPYING. If not, write to
* the Free Software Foundation, Inc., 59 Temple Place, Suite 330,
* Boston, Mass 02111-1307, USA.
*/
package com.sun.electric.tool.placement.genetic1.g1;
import com.sun.electric.tool.placement.PlacementFrame.PlacementNetwork;
import com.sun.electric.tool.placement.genetic1.Crossover;
import com.sun.electric.tool.placement.genetic1.GenePlacement;
import com.sun.electric.tool.placement.genetic1.Metric;
import com.sun.electric.tool.placement.genetic1.Population;
import com.sun.electric.tool.placement.genetic1.PopulationMutation;
import com.sun.electric.tool.placement.genetic1.Selection;
import java.util.List;
import java.util.Random;
import java.util.concurrent.Callable;
import java.util.logging.Level;
public class SubPopulationProcessing implements Callable<Population> {
static int idcounter = 0;
int id;
Random randomGenerator;
Population subPopulation;
GenePlacement placement;
Metric metric;
Crossover crossover;
PopulationMutation mutation;
Selection selection;
int epochLenght;
public SubPopulationProcessing(int epochLenght, long randomSeed,
int placementWidth, PlacementNodeProxy[] nodeProxies,
List<PlacementNetwork> networks, int chromosomeSize) {
this.epochLenght = epochLenght;
randomGenerator = new Random(randomSeed);
placement = new GenePlacementLeftRightAlignedDrop(placementWidth,
chromosomeSize, nodeProxies);
metric = new MetricBoundingBox3(networks, nodeProxies);
crossover = new CycleCrossoverFavoringStrongParents(0.7f,
randomGenerator, chromosomeSize);
mutation = new PopulationMutation2(chromosomeSize);
selection = new SelectionTournament();
id = idcounter++;
}
public Population call() throws Exception {
// assert (subPopulation != null && subPopulation.chromosomes.size() == GeneticPlacement
// .current_population_size_per_thread);
subPopulation.evaluate(metric, placement);
// assign random generator of this cpu to subgeneration
// any opertion (crossover, mutation) on this population can use it
// but none of this operations needs a handle on this class
subPopulation.setRandomGenerator(randomGenerator);
for (int threadGeneration = 0; threadGeneration < epochLenght; threadGeneration++) {
if (System.currentTimeMillis() > GeneticPlacement.MAX_RUNTIME)
break;
// assert (subPopulation.chromosomes.size() == GeneticPlacement
// .current_population_size_per_thread);
if (GeneticPlacement.IS_LOGGING_ENABLED)
GeneticPlacement.logger.log(Level.FINE, "Thread Generation :"
+ threadGeneration);
if (GeneticPlacement.IS_LOGGING_ENABLED)
GeneticPlacement.logger
.log(Level.FINE, "Task " + id
+ ":Start crossover in generation :"
+ threadGeneration);
// cross over
crossover.crossover(subPopulation);
if (GeneticPlacement.IS_LOGGING_ENABLED)
GeneticPlacement.logger.log(Level.FINE, "Task " + id
+ ":Done crossover in generation :" + threadGeneration);
if (GeneticPlacement.IS_LOGGING_ENABLED)
GeneticPlacement.logger.log(Level.FINE, "Task " + id
+ ":Start mutation in generation :" + threadGeneration);
// mutation
mutation.mutate(subPopulation);
if (GeneticPlacement.IS_LOGGING_ENABLED)
GeneticPlacement.logger.log(Level.FINE, "Task " + id
+ ":Done mutation in generation :" + threadGeneration);
// evaluate chromosomes
if (GeneticPlacement.IS_LOGGING_ENABLED)
GeneticPlacement.logger.log(Level.FINE, "Task " + id
+ ":Start evaluating subpopulation in generation :"
+ threadGeneration);
subPopulation.evaluate(metric, placement);
if (GeneticPlacement.IS_LOGGING_ENABLED)
GeneticPlacement.logger.log(Level.FINE, "Task " + id
+ ":Done evaluating subpopulation in generation :"
+ threadGeneration);
// status output
if (GeneticPlacement.IS_LOGGING_ENABLED)
GeneticPlacement.logger.log(Level.FINE, threadGeneration
+ " Generation best fitness"
+ subPopulation.getBest_fitness());
// selection
if (GeneticPlacement.IS_LOGGING_ENABLED)
GeneticPlacement.logger
.log(Level.FINE, "Task " + id
+ ":Start selection in generation :"
+ threadGeneration);
selection.selection(subPopulation);
if (GeneticPlacement.IS_LOGGING_ENABLED)
GeneticPlacement.logger.log(Level.FINE, "Task " + id
+ ":Done selection in generation :" + threadGeneration);
if (GeneticPlacement.IS_PROGRESS_LOGGING_ENABLED)
logProgress(threadGeneration);
}
// assert (!subPopulation.chromosomes.isEmpty() && subPopulation
// .chromosomes.size() == GeneticPlacement
// .current_population_size_per_thread);
return subPopulation;
}
// full telemetry output to log file
void logProgress(int threadGeneration) {
GeneticPlacement.PROGRESS_LOGGER
.println((System.currentTimeMillis() - GeneticPlacement.START_TIME) / 1000
+ ";"
+ id
+ ";"
+ threadGeneration
+ ";"
+ subPopulation.getBest_fitness()
+ ";"
+ subPopulation.chromosomes.size()
+ ";"
+ GeneticPlacement.current_population_size_per_thread
+ ";"
+ PopulationMutation2.chromosomeAlterPaddingRate
+ ";"
+ PopulationMutation2.genePaddingChangeRate_current
+ ";"
+ PopulationMutation2.chrosomeMaxPaddingChangeStep
+ ";"
+ PopulationMutation2.chromosomeMoveRate
+ ";"
+ PopulationMutation2.geneMoveRate_current
+ ";"
+ PopulationMutation2.geneMoveDistance
+ ";"
+ PopulationMutation2.chromosomeSwapRate
+ ";"
+ PopulationMutation2.geneSwapRate_current
+ ";"
+ PopulationMutation2.chromsomeRotationRate
+ ";"
+ "NA");
}
public void setSubPolulation(Population population) {
subPopulation = population;
}
}