diff --git a/src/org/openscience/smsd/algorithm/vflib/map/Match.java b/src/org/openscience/smsd/algorithm/vflib/map/Match.java index 6b28c23..75ab235 100644 --- a/src/org/openscience/smsd/algorithm/vflib/map/Match.java +++ b/src/org/openscience/smsd/algorithm/vflib/map/Match.java @@ -63,7 +63,7 @@ public class Match { @Override public String toString() { - return "Match{" + "query=" + query.getAtomMatcher().getQueryAtom().getID() + return "Match{" + "query=" + query.getAtomMatcher().getQueryAtom().getID() + ", target=" + target.getID() + '}'; } diff --git a/src/org/openscience/smsd/algorithm/vflib/map/VFMCSState.java b/src/org/openscience/smsd/algorithm/vflib/map/VFMCSState.java index 589f4e1..3f994e1 100644 --- a/src/org/openscience/smsd/algorithm/vflib/map/VFMCSState.java +++ b/src/org/openscience/smsd/algorithm/vflib/map/VFMCSState.java @@ -50,6 +50,7 @@ */ package org.openscience.smsd.algorithm.vflib.map; +import com.google.common.collect.HashBiMap; import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; @@ -74,12 +75,12 @@ @TestClass("org.openscience.cdk.smsd.algorithm.vflib.VFLibTest") public class VFMCSState implements IState { - private List candidates; - private IQuery query; - private IAtomContainer target; - private List queryPath; - private List targetPath; - private Map map; + private final List candidates; + private final IQuery query; + private final IAtomContainer target; + private final List queryPath; + private final List targetPath; + private final Map map; /** * initialize the VFState with query and target @@ -88,10 +89,10 @@ public class VFMCSState implements IState { * @param target */ public VFMCSState(IQuery query, IAtomContainer target) { - this.map = new HashMap(); - this.queryPath = new ArrayList(); - this.targetPath = new ArrayList(); - this.candidates = new ArrayList(); + this.map = HashBiMap.create(); + this.queryPath = new ArrayList<>(); + this.targetPath = new ArrayList<>(); + this.candidates = new ArrayList<>(); this.query = query; this.target = target; loadRootCandidates(); @@ -99,9 +100,9 @@ public VFMCSState(IQuery query, IAtomContainer target) { } private VFMCSState(VFMCSState state, Match match) { - this.candidates = new ArrayList(); - this.queryPath = new ArrayList(state.queryPath); - this.targetPath = new ArrayList(state.targetPath); + this.candidates = new ArrayList<>(); + this.queryPath = new ArrayList<>(state.queryPath); + this.targetPath = new ArrayList<>(state.targetPath); this.map = state.map; this.query = state.query; this.target = state.target; @@ -125,6 +126,12 @@ public void backTrack() { } map.clear(); for (int i = 0; i < queryPath.size() - 1; i++) { + if (map.containsKey(queryPath.get(i))) { + continue; + } + if (map.containsValue(targetPath.get(i))) { + continue; + } map.put(queryPath.get(i), targetPath.get(i)); } } @@ -134,7 +141,7 @@ public void backTrack() { */ @Override public Map getMap() { - return Collections.synchronizedMap(new HashMap(map)); + return Collections.synchronizedMap(new HashMap<>(map)); } /** @@ -173,10 +180,7 @@ public boolean isMatchFeasible(Match match) { if (!matchAtoms(match)) { return false; } - if (!matchBonds(match)) { - return false; - } - return true; + return matchBonds(match); } /**