/* $Revision$ $Author$ $Date$ * * Copyright (C) 1997-2007 The CDK project * * Contact: cdk-devel@lists.sourceforge.net * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public License * as published by the Free Software Foundation; either version 2.1 * of the License, or (at your option) any later version. * All we ask is that proper credit is given for our work, which includes * - but is not limited to - adding the above copyright notice to the beginning * of your source code files, and to any copyright notice that you may distribute * with programs based on this work. * * This program 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 Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. */ package org.openscience.cdk.structgen.stochastic.operator; import java.util.ArrayList; import java.util.List; import org.openscience.cdk.graph.matrix.ConnectionMatrix; import org.openscience.cdk.interfaces.IAtomContainer; import org.openscience.cdk.math.RandomNumbersTool; /** * @cdk.module structgen * @cdk.githash */ public class ChemGraph { /*Number of atoms in this structure*/ protected int dim; /*Number of atoms needed to form subgraph*/ protected int numAtoms; protected double[][] contab; /*Number of atoms that have been traversed */ protected int travIndex; /*Flag: true if atom visited during a traversal*/ protected boolean[] visited; /*Depth first traversal of the graph*/ protected List<Integer> subGraph; public ChemGraph(IAtomContainer chrom) { dim = chrom.getAtomCount(); numAtoms = (int)(dim/2); contab = new double[dim][dim]; contab = ConnectionMatrix.getMatrix(chrom); } public List<Integer> pickDFgraph() { //depth first search from a randomly selected atom travIndex = 0; subGraph = new ArrayList<Integer>(); visited = new boolean[dim]; for (int atom = 0; atom < dim; atom++) visited[atom] = false; int seedAtom = RandomNumbersTool.randomInt(0,dim-1); recursiveDFT(seedAtom); return subGraph; } private void recursiveDFT(int atom) { if ((travIndex < numAtoms)&&(!visited[atom])) { subGraph.add(Integer.valueOf(atom)); travIndex++; visited[atom] = true; // for (int nextAtom = 0; nextAtom < dim; nextAtom++) //not generalized // if (contab[atom][nextAtom] != 0) recursiveDFT(nextAtom); List<Integer> adjSet = new ArrayList<Integer>(); for (int nextAtom = 0; nextAtom < dim; nextAtom++) { if ((int)contab[atom][nextAtom] != 0) { adjSet.add(Integer.valueOf(nextAtom)); } } while (adjSet.size() > 0) { int adjIndex = RandomNumbersTool.randomInt(0,adjSet.size()-1); recursiveDFT(((Integer)adjSet.get(adjIndex)).intValue()); adjSet.remove(adjIndex); } } } public List<Integer> pickBFgraph() { //breadth first search from a randomly selected atom travIndex = 0; subGraph = new ArrayList<Integer>(); visited = new boolean[dim]; for (int atom = 0; atom < dim; atom++) visited[atom] = false; int seedAtom = RandomNumbersTool.randomInt(0,dim-1); List<Integer> atomQueue = new ArrayList<Integer>(); atomQueue.add(Integer.valueOf(seedAtom)); visited[seedAtom] = true; while (!atomQueue.isEmpty()&&(subGraph.size()<numAtoms)) { int foreAtom = ((Integer)atomQueue.get(0)).intValue(); subGraph.add(Integer.valueOf(foreAtom)); atomQueue.remove(0); travIndex++; List<Integer> adjSet = new ArrayList<Integer>(); for (int nextAtom = 0; nextAtom < dim; nextAtom++) { if (((int)contab[foreAtom][nextAtom] != 0)&&(!visited[nextAtom])) { adjSet.add(Integer.valueOf(nextAtom)); } } while (adjSet.size() > 0) { int adjIndex = RandomNumbersTool.randomInt(0,adjSet.size()-1); atomQueue.add((Integer)adjSet.get(adjIndex)); visited[((Integer)adjSet.get(adjIndex)).intValue()] = true; adjSet.remove(adjIndex); } } return subGraph; } public List<Integer> getSubgraph() { return subGraph; } public void setSubgraph(List<Integer> subgraph) { subGraph = subgraph; } public int getNumAtoms() { return numAtoms; } public void setNumAtoms(int numatoms) { numAtoms = numatoms; } }