All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.openscience.cdk.hash.ConjugatedAtomEncoder Maven / Gradle / Ivy

/*
 * Copyright (c) 2013 John May 
 *
 * Contact: [email protected]
 *
 * 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 U
 */

package org.openscience.cdk.hash;

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

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

/**
 * An atom encoder which takes several atom encodes and combines the encodings
 * into a single encoder. The order of the encoders matter and for persistent
 * results should be ordered before construction.
 *
 * 
 * // import org.openscience.cdk.hash.seed.BasicAtomEncoder.*
 * AtomEncoder encoder = new ConjugatedAtomEncoder(Arrays.asList(ATOMIC_NUMBER,
 *                                                               FORMAL_CHARGE));
 *
 * // convenience constructor using var-args
 * AtomEncoder encoder = ConjugatedAtomEncoder.create(ATOMIC_NUMBER,
 *                                                    FORMAL_CHARGE);
 *
 * // specifying a custom encoder
 * AtomEncoder encoder =
 *   ConjugatedAtomEncoder.create(ATOMIC_NUMBER,
 *                                FORMAL_CHARGE,
 *                                new AtomEncoder(){
 *                                  public int encode(IAtom a, IAtomContainer c){
 *                                    return a.getSymbol().hashCode();
 *                                  }
 *                                });
 *
 * 
* * @author John May * @cdk.module hash * @cdk.githash */ final class ConjugatedAtomEncoder implements AtomEncoder { /* ordered list of encoders */ private final List encoders; /** * Create a new conjugated encoder for the specified list of atom encoders. * The encoders are combined in an order dependant manner. * * @param encoders non-empty list of encoders * @throws NullPointerException the list of encoders was null * @throws IllegalArgumentException the list of encoders was empty */ public ConjugatedAtomEncoder(List encoders) { if (encoders == null) throw new NullPointerException("null list of encoders"); if (encoders.isEmpty()) throw new IllegalArgumentException("no encoders provided"); this.encoders = Collections.unmodifiableList(new ArrayList(encoders)); } /** * @inheritDoc */ @Override public int encode(IAtom atom, IAtomContainer container) { int hash = 179426549; for (AtomEncoder encoder : encoders) hash = 31 * hash + encoder.encode(atom, container); return hash; } /** * Convenience method for creating a conjugated encoder from one or more * {@link AtomEncoder}s. * *
     * // import org.openscience.cdk.hash.seed.BasicAtomEncoder.*
     * AtomEncoder encoder = ConjugatedAtomEncoder.create(ATOMIC_NUMBER,
     *                                                    FORMAL_CHARGE);
     * 
* * @param encoder the first encoder * @param encoders the other encoders * @return a new conjugated encoder * @throws NullPointerException either argument was null */ public static AtomEncoder create(AtomEncoder encoder, AtomEncoder... encoders) { if (encoder == null || encoders == null) throw new NullPointerException("null encoders provided"); List tmp = new ArrayList(encoders.length + 1); tmp.add(encoder); for (AtomEncoder e : encoders) tmp.add(e); return new ConjugatedAtomEncoder(tmp); } }




© 2015 - 2024 Weber Informatics LLC | Privacy Policy