source: src/Graph/CyclicStructureAnalysis.hpp@ 1ae9aa

Last change on this file since 1ae9aa was ec7511, checked in by Frederik Heber <heber@…>, 12 years ago

FIX: CyclicStructureAnalysis falsely used DFS, skipped some cycles.

  • FIX: CyclicStructureAnalysis did use DFS instead of BFS for finding cycles. Note that CyclicStructureAnalysis with coronene would find supercycles and not the smaller interconnected ones.
  • FIX: Cycles were skipped when all bonds marked cyclic, not enough. In interconnected aromatic rings, bonds may very well be marked as cyclic from earlier extraction of cycles and yet the specific cycle might not have been found yet (e.g. coronene). In this case we now check whether this particular cycle has already been extracted and only skip if so.
  • TESTFIX: added new fragmentation regression tests on some metallic systems.
  • this is mainly for regression on bond graph detection and cycle analysis.
  • Property mode set to 100644
File size: 2.1 KB
Line 
1/*
2 * CyclicStructureAnalysis.hpp
3 *
4 * Created on: Feb 16, 2011
5 * Author: heber
6 */
7
8#ifndef CYCLICSTRUCTUREANALYSIS_HPP_
9#define CYCLICSTRUCTUREANALYSIS_HPP_
10
11// include config.h
12#ifdef HAVE_CONFIG_H
13#include <config.h>
14#endif
15
16#include <deque>
17#include <map>
18#include <vector>
19
20#include "Bond/bond.hpp"
21#include "Bond/GraphEdge.hpp"
22#include "Fragmentation/KeySet.hpp"
23#include "Fragmentation/HydrogenSaturation_enum.hpp"
24#include "Helpers/defs.hpp"
25#include "types.hpp"
26
27class atom;
28class molecule;
29
30class CyclicStructureAnalysis
31{
32public:
33 //!> typedef for specifying a cycle
34 typedef KeySet cycle_t;
35 //!> typedef for specifying many cycles
36 typedef std::vector< cycle_t > cycles_t;
37
38 explicit CyclicStructureAnalysis(const enum HydrogenTreatment _treatment);
39 ~CyclicStructureAnalysis();
40
41 void Reset();
42 void operator()(std::deque<bond::ptr > * BackEdgeStack);
43
44 const std::map<atomId_t, int >& getMinimumRingSize() const;
45
46 /** Getter for all found cycles.
47 *
48 */
49 cycles_t getAllCycles() const {
50 return allcycles;
51 }
52
53private:
54
55 // init or reset
56 void InitNode(atomId_t atom_id);
57 void CleanAllTouched();
58 void InitializeToRoot(atom *&Walker);
59 // performing tasks
60 void CyclicBFSFromRootToRoot(atom *&OtherAtom, bond::ptr &BackEdge);
61 void RetrieveCycleMembers(atom *&OtherAtom, bond::ptr &BackEdge, int &MinRingSize, int &NumCycles);
62 cycle_t extractCurrentCycle(bond::ptr &BackEdge);
63 void BFSToNextCycle(atom *Walker);
64 void AssignRingSizetoNonCycleMembers(const int MinRingSize, const int NumCycles);
65 // output
66 void OutputAlreadyVisited(int *list);
67
68 std::map<atomId_t, atom *> PredecessorList;
69 std::map<atomId_t, int > ShortestPathList;
70 std::map<atomId_t, enum GraphEdge::Shading> ColorList;
71 std::map<atomId_t, int > MinimumRingSize;
72 std::deque<atom *> BFSStack;
73 std::deque<atom *> TouchedStack;
74 int BondOrder;
75 atom *Root;
76
77 //!> container for all found cycles, note that these are global ids
78 cycles_t allcycles;
79
80 //!> whether to treat hydrogen special or not
81 const enum HydrogenTreatment treatment;
82
83 bool BackStepping;
84 int CurrentGraphNr;
85 int ComponentNr;
86};
87
88#endif /* CYCLICSTRUCTUREANALYSIS_HPP_ */
Note: See TracBrowser for help on using the repository browser.