/* -*- tab-width: 4 -*- * * Electric(tm) VLSI Design System * * File: Chromosome.java * Written by Team 3: Christian Wittner * * 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.genetic1; import com.sun.electric.tool.placement.PlacementFrame.PlacementPort; import java.util.logging.Level; /** * Chromosome representing Placement. */ //TODO: remove comment from root element if you want to use xmlstorage. not java 1.5 compliant. or //include jar with jaxb for java 1.5. //@XmlRootElement public class Chromosome implements Comparable<Chromosome> { final static Level LOG_LEVEL = Level.FINEST; // true if chromsome was altered // just created, mutated public boolean altered; public Double fitness; final static boolean DEBUG = false; // stores the position of a certain index in the gene // in the first entry the position of the gene representing the first node // is stored public int[] Index2GenePositionInChromosome; public int[] GeneXPos; public int[] GeneYPos; public short[] GeneRotation; public short[] GeneYPadding; public short[] GeneXPadding; public Chromosome() { } public Chromosome(int nbrOfGenes) { altered = true; GeneXPos = new int[nbrOfGenes]; GeneYPos = new int[nbrOfGenes]; GeneRotation = new short[nbrOfGenes]; GeneYPadding = new short[nbrOfGenes]; GeneXPadding = new short[nbrOfGenes]; Index2GenePositionInChromosome = new int[nbrOfGenes]; fitness = new Double(Double.MAX_VALUE); } /** * Rotate by given angle in 10th degree. * * @param angle * the angle of rotation (in tenth-degrees) */ public void rotate(int angle, int geneIndex) { GeneRotation[geneIndex] = (short) ((GeneRotation[geneIndex] + angle) % 3600); altered = true; } /** * * @return Number of genes this chromosome consists of. */ public int size() { return Index2GenePositionInChromosome.length; } public int compareTo(Chromosome o) { return fitness.compareTo(o.fitness); } public Chromosome clone() { Chromosome newChromosome = new Chromosome(GeneXPos.length); newChromosome.fitness = fitness; newChromosome.Index2GenePositionInChromosome = Index2GenePositionInChromosome .clone(); assert (newChromosome.isIndex2GenePosValid()); newChromosome.GeneRotation = GeneRotation.clone(); newChromosome.GeneXPos = GeneXPos.clone(); newChromosome.GeneYPos = GeneYPos.clone(); newChromosome.GeneXPadding = GeneXPadding.clone(); newChromosome.GeneYPadding = GeneYPadding.clone(); assert newChromosome.altered == true; return newChromosome; } /** * Calculate port location with applied rotation angle of this gene. * * @param port * Port of which location is to be computed. * @return X coordinate offset relative to center of gene. */ public double getPortXOffset(PlacementPort port, int geneIndex) { switch (GeneRotation[geneIndex]) { case 0: return port.getOffX(); case 900: return -port.getOffY(); case 1800: return -port.getOffX(); case 2700: return port.getOffY(); default: System.err .println(this.getClass().getName() + " unsupported rotation angle: " + GeneRotation[geneIndex]); return -1; } } /** * Calculate port location with applied rotation angle of this gene. * * @param port * Port of which location is to be computed. * @return Y coordinate offset relative to center of gene. */ public double getPortYOffset(PlacementPort port, int geneIndex) { switch (GeneRotation[geneIndex]) { case 0: return port.getOffY(); case 900: return port.getOffX(); case 1800: return -port.getOffY(); case 2700: return -port.getOffX(); default: System.err .println(this.getClass().getName() + " unsupported rotation angle: " + GeneRotation[geneIndex]); return -1; } } /** * Use to assert that each index is represented exactly once in the * index2gene map. */ public boolean isIndex2GenePosValid() { // System.err.println("assertion running"); int matchCount; for (int i = 0; i < Index2GenePositionInChromosome.length; i++) { matchCount = 0; for (int z = 0; z < Index2GenePositionInChromosome.length; z++) { if (Index2GenePositionInChromosome[z] == i) { matchCount++; } } if (matchCount != 1) return false; } return true; } }