Skip to content

Commit

Permalink
Re-write of the atom container permutation classes. An extra class 'P…
Browse files Browse the repository at this point in the history
…ermutor' is now the base class for permutations, and contains some more functionality than before.

Signed-off-by: maclean <gilleain.torrance@gmail.com>
Signed-off-by: Egon Willighagen <egonw@users.sourceforge.net>
  • Loading branch information
gilleain authored and egonw committed Sep 18, 2011
1 parent 04adfca commit acd8e9b
Show file tree
Hide file tree
Showing 4 changed files with 204 additions and 242 deletions.
109 changes: 47 additions & 62 deletions src/main/org/openscience/cdk/graph/AtomContainerAtomPermutor.java
@@ -1,10 +1,4 @@
/*
* $RCSfile$
* $Author$
* $Date$
* $Revision$
*
* Copyright (C) 1997-2007 The Chemistry Development Kit (CDK) project
/* Copyright (C) 2009 Gilleain Torrance <gilleain.torrance@gmail.com>
*
* Contact: cdk-devel@lists.sourceforge.net
*
Expand All @@ -29,67 +23,58 @@
*/
package org.openscience.cdk.graph;

import java.util.Iterator;

import org.openscience.cdk.Atom;
import org.openscience.cdk.interfaces.IAtom;
import org.openscience.cdk.interfaces.IAtomContainer;

/**
* This class allows to iterate trough the set of all possible
* permutations of the atom order in a given atom container.
* It allows to check for a dependency of algorithm results
* on the atom order.
*
* <p>The permutation code here is based on a pseudo code example
* on a tutorial site created and maintained by Phillip P. Fuchs:
* <a href="http://www.geocities.com/permute_it/pseudo2.html">http://www.geocities.com/permute_it/pseudo2.html</a>.
* An atom container atom permutor that uses ranking and unranking to calculate
* the next permutation in the series.</p>
*
* <p>Typical use:<pre>
* AtomContainerAtomPermutor permutor = new AtomContainerAtomPermutor(container);
* while (permutor.hasNext()) {
* IAtomContainer permutedContainer = permutor.next();
* ...
* }</pre>
*
*@author steinbeck
* @cdk.githash
*@cdk.created 2005-05-04
*@cdk.keyword permutation
* @author maclean
* @cdk.created 2009-09-09
* @cdk.keyword permutation
* @cdk.module standard
*/
public class AtomContainerAtomPermutor extends AtomContainerPermutor
{

public AtomContainerAtomPermutor(IAtomContainer ac)
{
setAtomContainer(ac);
N = atomContainer.getAtomCount();
initBookkeeping();
initObjectArray();
}

public void initObjectArray()
{
Iterator<IAtom> atoms = atomContainer.atoms().iterator();
objects = new Object[atomContainer.getAtomCount()];
int count = -1;
while (atoms.hasNext())
{
objects[++count] = atoms.next();
}
}

IAtomContainer makeResult()
{
Atom[] atoms = new Atom[objects.length];
for (int f = 0; f < objects.length; f++)
{
atoms[f] = ((Atom)objects[f]);
}
IAtomContainer ac = atomContainer.getBuilder().newInstance(IAtomContainer.class,atomContainer);
ac.setAtoms(atoms);
IAtomContainer clone = null;
try {
clone = (IAtomContainer)ac.clone();
} catch (CloneNotSupportedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return clone;
}

public class AtomContainerAtomPermutor extends AtomContainerPermutor {

/**
* A permutor wraps the original atom container, and produces cloned
* (and permuted!) copies on demand.
*
* @param atomContainer
*/
public AtomContainerAtomPermutor(IAtomContainer atomContainer) {
super(atomContainer.getAtomCount(), atomContainer);
}

/**
* Generate the atom container with this permutation of the atoms.
*
* @param permutation the permutation to use
* @return the
*/
public IAtomContainer containerFromPermutation(int[] permutation) {
try {
IAtomContainer permutedContainer =
(IAtomContainer) atomContainer.clone();
IAtom[] atoms = new IAtom[atomContainer.getAtomCount()];
for (int i = 0; i < atomContainer.getAtomCount(); i++) {
atoms[permutation[i]] = permutedContainer.getAtom(i);
}
permutedContainer.setAtoms(atoms);
return permutedContainer;
} catch (CloneNotSupportedException c) {
return null;
}
}

}

128 changes: 57 additions & 71 deletions src/main/org/openscience/cdk/graph/AtomContainerBondPermutor.java
@@ -1,93 +1,79 @@
/*
* $RCSfile$
* $Author$
* $Date$
* $Revision$
/* Copyright (C) 2009 Gilleain Torrance <gilleain.torrance@gmail.com>
*
* Copyright (C) 1997-2007 The Chemistry Development Kit (CDK) project
* Contact: cdk-devel@lists.sourceforge.net
*
* 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 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.
* 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.graph;

import java.util.Iterator;

import org.openscience.cdk.interfaces.IAtomContainer;
import org.openscience.cdk.interfaces.IBond;


/**
* This class allows to iterate trough the set of all possible
* permutations of the bond order in a given atom container.
* It allows to check for a dependency of algorithm results
* on the bond order.
*
* <p>The permutation code here is based on a pseudo code example
* on a tutorial site created and maintained by Phillip P. Fuchs:
* <a href="http://www.geocities.com/permute_it/pseudo2.html">http://www.geocities.com/permute_it/pseudo2.html</a>.
* This class allows the user to iterate through the set of all possible
* permutations of the bond order in a given atom container. This provides a
* means to check the dependency of an algorithm's results on the bond order of
* the input atom container.
*
* <p>Typical use:<pre>
* AtomContainerBondPermutor permutor = new AtomContainerBondPermutor(container);
* while (permutor.hasNext()) {
* IAtomContainer permutedContainer = permutor.next();
* ...
* }</pre>
*
*@author steinbeck
*
* @author maclean
* @cdk.githash
*@cdk.created 2005-05-04
*@cdk.keyword permutation
* @cdk.created 2009-09-09
* @cdk.keyword permutation
* @cdk.module standard
*/
public class AtomContainerBondPermutor extends AtomContainerPermutor
{
public class AtomContainerBondPermutor extends AtomContainerPermutor {

public AtomContainerBondPermutor(IAtomContainer ac)
{
setAtomContainer(ac);
N = atomContainer.getBondCount();
initBookkeeping();
initObjectArray();
/**
* A permutor wraps the original atom container, and produces cloned
* (and permuted!) copies on demand.
*
* @param atomContainer
*/
public AtomContainerBondPermutor(IAtomContainer atomContainer) {
super(atomContainer.getBondCount(), atomContainer);
}

public void initObjectArray() {
Iterator bonds = atomContainer.bonds().iterator();
objects = new Object[atomContainer.getBondCount()];
int i = 0;
while (bonds.hasNext()) {
objects[i] = bonds.next();
i++;
}
}

IAtomContainer makeResult()
{
IBond[] bonds = new IBond[objects.length];
for (int f = 0; f < objects.length; f++)
{
bonds[f] = ((IBond)objects[f]);
}
IAtomContainer ac = atomContainer.getBuilder().newInstance(IAtomContainer.class,atomContainer);
ac.setBonds(bonds);
IAtomContainer clone = null;
/* (non-Javadoc)
* @see org.openscience.cdk.graph.AtomContainerPermutor#containerFromPermutation(int[])
*/
public IAtomContainer containerFromPermutation(int[] permutation) {
try {
clone = (IAtomContainer)ac.clone();
} catch (CloneNotSupportedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
IAtomContainer permutedContainer =
(IAtomContainer) super.atomContainer.clone();
int n = permutedContainer.getBondCount();
IBond[] permutedBonds = new IBond[n];
for (int i = 0; i < n; i++) {
permutedBonds[i] = permutedContainer.getBond(permutation[i]);
}
permutedContainer.setBonds(permutedBonds);
return permutedContainer;
} catch (CloneNotSupportedException cne) {
return null;
}
return clone;
}

}
Expand Down

0 comments on commit acd8e9b

Please sign in to comment.