source: src/Graph/DepthFirstSearchAnalysis.hpp@ b4f72c

Action_Thermostats Add_AtomRandomPerturbation Add_FitFragmentPartialChargesAction Add_RotateAroundBondAction Add_SelectAtomByNameAction Added_ParseSaveFragmentResults AddingActions_SaveParseParticleParameters Adding_Graph_to_ChangeBondActions Adding_MD_integration_tests Adding_ParticleName_to_Atom Adding_StructOpt_integration_tests AtomFragments Automaking_mpqc_open AutomationFragmentation_failures Candidate_v1.5.4 Candidate_v1.6.0 Candidate_v1.6.1 ChangeBugEmailaddress ChangingTestPorts ChemicalSpaceEvaluator CombiningParticlePotentialParsing Combining_Subpackages Debian_Package_split Debian_package_split_molecuildergui_only Disabling_MemDebug Docu_Python_wait EmpiricalPotential_contain_HomologyGraph EmpiricalPotential_contain_HomologyGraph_documentation Enable_parallel_make_install Enhance_userguide Enhanced_StructuralOptimization Enhanced_StructuralOptimization_continued Example_ManyWaysToTranslateAtom Exclude_Hydrogens_annealWithBondGraph FitPartialCharges_GlobalError Fix_BoundInBox_CenterInBox_MoleculeActions Fix_ChargeSampling_PBC Fix_ChronosMutex Fix_FitPartialCharges Fix_FitPotential_needs_atomicnumbers Fix_ForceAnnealing Fix_IndependentFragmentGrids Fix_ParseParticles Fix_ParseParticles_split_forward_backward_Actions Fix_PopActions Fix_QtFragmentList_sorted_selection Fix_Restrictedkeyset_FragmentMolecule Fix_StatusMsg Fix_StepWorldTime_single_argument Fix_Verbose_Codepatterns Fix_fitting_potentials Fixes ForceAnnealing_goodresults ForceAnnealing_oldresults ForceAnnealing_tocheck ForceAnnealing_with_BondGraph ForceAnnealing_with_BondGraph_continued ForceAnnealing_with_BondGraph_continued_betteresults ForceAnnealing_with_BondGraph_contraction-expansion FragmentAction_writes_AtomFragments FragmentMolecule_checks_bonddegrees GeometryObjects Gui_Fixes Gui_displays_atomic_force_velocity ImplicitCharges IndependentFragmentGrids IndependentFragmentGrids_IndividualZeroInstances IndependentFragmentGrids_IntegrationTest IndependentFragmentGrids_Sole_NN_Calculation JobMarket_RobustOnKillsSegFaults JobMarket_StableWorkerPool JobMarket_unresolvable_hostname_fix MoreRobust_FragmentAutomation ODR_violation_mpqc_open PartialCharges_OrthogonalSummation PdbParser_setsAtomName PythonUI_with_named_parameters QtGui_reactivate_TimeChanged_changes Recreated_GuiChecks Rewrite_FitPartialCharges RotateToPrincipalAxisSystem_UndoRedo SaturateAtoms_findBestMatching SaturateAtoms_singleDegree StoppableMakroAction Subpackage_CodePatterns Subpackage_JobMarket Subpackage_LinearAlgebra Subpackage_levmar Subpackage_mpqc_open Subpackage_vmg Switchable_LogView ThirdParty_MPQC_rebuilt_buildsystem TrajectoryDependenant_MaxOrder TremoloParser_IncreasedPrecision TremoloParser_MultipleTimesteps TremoloParser_setsAtomName Ubuntu_1604_changes stable
Last change on this file since b4f72c was 6d551c, checked in by Frederik Heber <heber@…>, 12 years ago

ListOfLocalAtoms is now a map, inherited into a distinct class.

  • this is preparatory for allowing arbitrary fragmentation of atoms not only of a single molecule.
  • Property mode set to 100644
File size: 5.0 KB
Line 
1/*
2 * DepthFirstSearchAnalysis.hpp
3 *
4 * Created on: Feb 16, 2011
5 * Author: heber
6 */
7
8#ifndef DEPTHFIRSTSEARCHANALYSIS_HPP_
9#define DEPTHFIRSTSEARCHANALYSIS_HPP_
10
11// include config.h
12#ifdef HAVE_CONFIG_H
13#include <config.h>
14#endif
15
16#include <deque>
17
18#include "ConnectedSubgraph.hpp"
19
20class atom;
21class bond;
22class ListOfLocalAtoms_t;
23class MoleculeLeafClass;
24class molecule;
25
26class DepthFirstSearchAnalysis
27{
28public:
29 /** Constructor of DepthFirstSearchAnalysis.
30 */
31 DepthFirstSearchAnalysis();
32
33 /** Destructor of DepthFirstSearchAnalysis.
34 */
35 ~DepthFirstSearchAnalysis();
36
37 /** Performs a Depth-First search on all atoms.
38 * Marks bonds in molecule as cyclic, bridge, ... and atoms as
39 * articulations points, ...
40 * We use the algorithm from [Even, Graph Algorithms, p.62].
41 * \param *&BackEdgeStack NULL pointer to std::deque<bond *> with all the found back edges, allocated and filled on return
42 * \return list of each disconnected subgraph as an individual molecule class structure
43 */
44 void operator()();
45
46 /** Scans through all bonds and set bond::Cyclic to true where atom::LowpointNr of both ends is equal: LP criterion.
47 * \note Hydrogen bonds can never by cyclic, thus no check for that
48 * \return number of cyclic bonds
49 */
50 unsigned int CyclicBondAnalysis() const;
51
52 /** Removes all molecules and assign anew with known ListOfConnectedSubgraphs.
53 *
54 */
55 void UpdateMoleculeStructure() const;
56
57 /** Creates a chained list of all present molecules.
58 *
59 * \warning returns allocated chained list as reference, has to be free'd item by item through the list
60 *
61 * @return start node of chained molecules list
62 */
63 MoleculeLeafClass *getMoleculeStructure() const;
64
65 /** Picks from a global stack with all back edges the ones in the fragment.
66 *
67 * Reference is the internal BackEdgeStack.
68 *
69 * \param ListOfLocalAtoms array of father atom::nr to local atom::nr (reverse of atom::father)
70 * \param *LocalStack stack to be filled
71 * \return true - everything ok, false - ReferenceStack was empty
72 */
73 bool PickLocalBackEdges(const ListOfLocalAtoms_t &ListOfLocalAtoms, std::deque<bond *> *&LocalStack) const;
74
75 /** Getter for BackEdgeStack.
76 *
77 * @return const reference to BackEdgeStack
78 */
79 const std::deque<bond *>& getBackEdgeStack() const;
80
81private:
82 /** Resets GraphNodeInfo::ComponentNr and GraphNodeInfo::GraphrNr.
83 *
84 */
85 void Init();
86
87 /** Returns next unused bond for this atom \a *vertex or NULL of none exists.
88 * \param *vertex atom to regard
89 * \return bond class or NULL
90 */
91 bond * FindNextUnused(atom *vertex) const;
92
93 /** Resets bond::Used flag of all bonds in this molecule.
94 * \return true - success, false - -failure
95 */
96 void ResetAllBondsToUnused() const;
97
98 /** Sets the next component number.
99 * This is O(N) as the number of bonds per atom is bound.
100 * \param *vertex atom whose next atom::*ComponentNr is to be set
101 * \param nr number to use
102 */
103 void SetNextComponentNumber(atom *vertex, int nr) const;
104
105 /** Sets atom::GraphNr and atom::LowpointNr to CurrentGraphNr.
106 * \param *Walker current node
107 */
108 void SetWalkersGraphNr(atom *&Walker);
109
110 /** During DFS goes along unvisited bond and touches other atom.
111 * Sets bond::type, if
112 * -# BackEdge: set atom::LowpointNr and push on \a BackEdgeStack
113 * -# TreeEgde: set atom::Ancestor and continue with Walker along this edge
114 * Continue until molecule::FindNextUnused() finds no more unused bonds.
115 * \param *&Walker current node
116 * \param *&Binder current edge
117 */
118 void ProbeAlongUnusedBond(atom *&Walker, bond *&Binder);
119
120 /** Checks whether we have a new component.
121 * if atom::LowpointNr of \a *&Walker is greater than atom::GraphNr of its atom::Ancestor, we have a new component.
122 * Meaning that if we touch upon a node who suddenly has a smaller atom::LowpointNr than its ancestor, then we
123 * have a found a new branch in the graph tree.
124 * \param *&Walker current node
125 * \param &LeafWalker contains reference to destination subgraph
126 */
127 void CheckForaNewComponent(atom *&Walker, ConnectedSubgraph &LeafWalker);
128
129 /** Cleans the root stack when we have found a component.
130 * If we are not BackStepping, then we clear the root stack by putting everything into a
131 * component down till we meet Root.
132 * \param *&Walker current node
133 * \param *&Binder current edge
134 * \param &LeafWalker contains reference to destination subgraph
135 */
136 void CleanRootStackDownTillWalker(atom *&Walker, bond *&Binder, ConnectedSubgraph &LeafWalker);
137
138 /** Output graph information per atom.
139 */
140 void OutputGraphInfoPerAtom() const;
141
142 /** Output graph information per bond.
143 */
144 void OutputGraphInfoPerBond() const;
145
146 std::deque<atom *> AtomStack;
147 std::deque<bond *> BackEdgeStack;
148 int CurrentGraphNr;
149 int ComponentNumber;
150 atom *Root;
151 bool BackStepping;
152
153 typedef std::list< ConnectedSubgraph > ConnectedSubgraphList;
154
155 ConnectedSubgraphList ListOfConnectedSubgraphs;
156};
157
158#endif /* DEPTHFIRSTSEARCHANALYSIS_HPP_ */
Note: See TracBrowser for help on using the repository browser.