/* -*- tab-width: 4 -*-
*
* Electric(tm) VLSI Design System
*
* File: Individual.java
* Written by Team 4: Benedikt Mueller, Richard Fallert
*
* 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 Sun Microsystems and Static Free Software
*
* 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.genetic2;
import com.sun.electric.tool.placement.PlacementFrame.PlacementNetwork;
import com.sun.electric.tool.placement.PlacementFrame.PlacementNode;
import java.util.List;
import java.util.Random;
import java.util.concurrent.locks.ReadWriteLock;
import java.util.concurrent.locks.ReentrantReadWriteLock;
/**
* Abstract class representing an individual in a genetic algorithm.
* @see DeltaIndividual
*/
public abstract class Individual <I extends Individual> implements Comparable<I>
{
protected double[] badnessComponents = new double[3]; // how bad our individual is
private double[] hashes;
List<PlacementNode> nodesToPlace;
List<PlacementNetwork> allNetworks;
public ReadWriteLock rwLock;
double p;
public Reference ref;
/**
* Constructor to randomly initialize the genome (blocks).
* @param ref The Reference contains all needed information about the placement
*/
Individual(Reference ref)
{
this.ref = ref;
nodesToPlace = ref.nodesToPlace;
allNetworks = ref.allNetworks;
rwLock = new ReentrantReadWriteLock();
}
public abstract void evaluate();
public abstract void reboot(Random rand);
public double distance()
{
return 0.0;
}
public void setProgress(double p)
{
this.p = p;
}
public double getSize()
{
return 5.0;
}
public abstract double distance(I other);
public abstract void writeToPlacement(List<PlacementNode> nodesToPlace);
/**
* Method to compare the badness with another individual.
* @param other The Individual to be used as a reference.
* @return -1 if other has a higher badness, else 1.
*/
public int compareTo(I other)
{
if(getBadness() < other.getBadness())
{
return -1;
}
else
{
return 1;
}
}
/**
* Method to copy the genes (Blocks) and badness from another Individual.
* @param other The Individual to be cloned.
*/
public abstract void copyFrom(I other);
public abstract void mutate(Random rand);
/**
* Method to do a crossover of two genomes and write the result to the Individual's genome.
* Mutation and evaluation is also performed.
* @param mom One donor of genes.
* @param dad The other donor of genes.
*/
public abstract void deriveFrom(I mom, I dad, Random rand);
/**
* Calculates the overlap of all Blocks (PlacementNodes).
* @return the sum of the overlap areas.
*/
public abstract double calculateOverlap();
/**
* Method to calculate the bounding box area of the Blocks.
* @return the bounding box area of the Blocks.
*/
public abstract double getBoundingBoxArea();
/**
* Method to calculate the semiperimeter of the bounding box of the Blocks.
* @return the semiperimeter of the bounding box of the Blocks.
*/
public abstract double getSemiperimeterLength();
public abstract double getNetLength();
public double[] getBadnessComponents()
{
return badnessComponents;
}
/**
* Method to return the evaluated "un-fitness" of the Individual.
* @return the "un-fitness" of the placement solution.
*/
public double getBadness()
{
double badness = 0.0;
// wire length estimate:
badness += badnessComponents[0];
// overlap:
badness += badnessComponents[1]*20.0;
// bounding box area:
badness += badnessComponents[2]*20.0;
return badness;// + rand.nextGaussian()*1000.0*(1.0-((double)evolutionStep)/((double)evolutionSteps));
}
public void setBadness(double[] otherComponents)
{
for(int i = 0; i < badnessComponents.length; i++)
{
badnessComponents[i] = otherComponents[i];
}
}
public double getXHash()
{
return 0.0;
}
public double getYHash()
{
return 0.0;
}
public double getRotHash()
{
return 0.0;
}
public double[] getHashes()
{
return hashes;
}
public double getHash()
{
return 0.0;
}
}