Changeset c27778


Ignore:
Timestamp:
Jul 3, 2010, 2:02:26 PM (14 years ago)
Author:
Frederik Heber <heber@…>
Branches:
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
Children:
2a374e
Parents:
b9c847
git-author:
Frederik Heber <heber@…> (07/03/10 13:24:25)
git-committer:
Frederik Heber <heber@…> (07/03/10 14:02:26)
Message:

MEMFIXES: ListOfLocalAtoms in molecule::FragmentMolecule() was not free'd correctly.

NOTE: All of these lists and maps are hard to understand and make the code very confusing. It's really high time for refactoring.

Signed-off-by: Frederik Heber <heber@…>

Location:
src
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • src/Actions/FragmentationAction/DepthFirstSearchAction.cpp

    rb9c847 rc27778  
    4949    MoleculeLeafClass *Subgraphs = NULL;      // list of subgraphs from DFS analysis
    5050    int *MinimumRingSize = new int[mol->getAtomCount()];
    51     atom ***ListOfLocalAtoms = NULL;
     51    atom **ListOfAtoms = NULL;
    5252    class StackClass<bond *> *BackEdgeStack = NULL;
    5353    class StackClass<bond *> *LocalBackEdgeStack = NULL;
     
    5858      while (Subgraphs->next != NULL) {
    5959        Subgraphs = Subgraphs->next;
    60         Subgraphs->FillBondStructureFromReference(mol, FragmentCounter, ListOfLocalAtoms, false);  // we want to keep the created ListOfLocalAtoms
     60        ListOfAtoms = NULL;
     61        Subgraphs->FillBondStructureFromReference(mol, ListOfAtoms, false);  // we want to keep the created ListOfLocalAtoms
    6162        LocalBackEdgeStack = new StackClass<bond *> (Subgraphs->Leaf->BondCount);
    62         Subgraphs->Leaf->PickLocalBackEdges(ListOfLocalAtoms[FragmentCounter], BackEdgeStack, LocalBackEdgeStack);
     63        Subgraphs->Leaf->PickLocalBackEdges(ListOfAtoms, BackEdgeStack, LocalBackEdgeStack);
    6364        Subgraphs->Leaf->CyclicStructureAnalysis(LocalBackEdgeStack, MinimumRingSize);
    6465        delete(LocalBackEdgeStack);
    6566        delete(Subgraphs->previous);
     67        delete[](ListOfAtoms);  // and here we remove it
    6668        FragmentCounter++;
    6769      }
    6870      delete(Subgraphs);
    69       for (int i=0;i<FragmentCounter;i++)
    70         delete[](ListOfLocalAtoms[i]);
    71       delete[](ListOfLocalAtoms);
    7271    }
    7372    delete(BackEdgeStack);
  • src/molecule.hpp

    rb9c847 rc27778  
    426426
    427427  bool AddLeaf(molecule *ptr, MoleculeLeafClass *Previous);
    428   bool FillBondStructureFromReference(const molecule * const reference, int &FragmentCounter, atom ***&ListOfLocalAtoms, bool FreeList = false);
     428  bool FillBondStructureFromReference(const molecule * const reference, atom **&ListOfLocalAtoms, bool FreeList = false);
    429429  bool FillRootStackForSubgraphs(KeyStack *&RootStack, bool *AtomMask, int &FragmentCounter);
    430430  bool AssignKeySetsToFragment(molecule *reference, Graph *KeySetList, atom ***&ListOfLocalAtoms, Graph **&FragmentList, int &FragmentCounter, bool FreeList = false);
    431   bool FillListOfLocalAtoms(atom ***&ListOfLocalAtoms, const int FragmentCounter, const int GlobalAtomCount, bool &FreeList);
     431  bool FillListOfLocalAtoms(atom **&ListOfLocalAtoms, const int GlobalAtomCount, bool &FreeList);
    432432  void TranslateIndicesToGlobalIDs(Graph **FragmentList, int &FragmentCounter, int &TotalNumberOfKeySets, Graph &TotalGraph);
    433433  int Count() const;
  • src/molecule_fragmentation.cpp

    rb9c847 rc27778  
    629629    MinimumRingSize[i] = getAtomCount();
    630630  MolecularWalker = Subgraphs;
     631  const int LeafCount = Subgraphs->next->Count();
    631632  FragmentCounter = 0;
    632633  while (MolecularWalker->next != NULL) {
    633634    MolecularWalker = MolecularWalker->next;
    634635    // fill the bond structure of the individually stored subgraphs
    635     MolecularWalker->FillBondStructureFromReference(this, FragmentCounter, ListOfLocalAtoms, false);  // we want to keep the created ListOfLocalAtoms
     636    ListOfAtoms = NULL;
     637    MolecularWalker->FillBondStructureFromReference(this, ListOfAtoms, false);  // we want to keep the created ListOfLocalAtoms
    636638    DoLog(0) && (Log() << Verbose(0) << "Analysing the cycles of subgraph " << MolecularWalker->Leaf << " with nr. " << FragmentCounter << "." << endl);
    637639    LocalBackEdgeStack = new StackClass<bond *> (MolecularWalker->Leaf->BondCount);
     
    644646//        Log() << Verbose(0) << "\t" << ListOfLocalAtoms[FragmentCounter][i]->Name;
    645647    DoLog(0) && (Log() << Verbose(0) << "Gathering local back edges for subgraph " << MolecularWalker->Leaf << " with nr. " << FragmentCounter << "." << endl);
    646     MolecularWalker->Leaf->PickLocalBackEdges(ListOfLocalAtoms[FragmentCounter++], BackEdgeStack, LocalBackEdgeStack);
     648    MolecularWalker->Leaf->PickLocalBackEdges(ListOfAtoms, BackEdgeStack, LocalBackEdgeStack);
    647649    DoLog(0) && (Log() << Verbose(0) << "Analysing the cycles of subgraph " << MolecularWalker->Leaf << " with nr. " << FragmentCounter << "." << endl);
    648650    MolecularWalker->Leaf->CyclicStructureAnalysis(LocalBackEdgeStack, MinimumRingSize);
    649651    DoLog(0) && (Log() << Verbose(0) << "Done with Analysing the cycles of subgraph " << MolecularWalker->Leaf << " with nr. " << FragmentCounter << "." << endl);
    650652    delete(LocalBackEdgeStack);
     653    delete(ListOfAtoms);
     654    FragmentCounter++;
    651655  }
    652656  delete(BackEdgeStack);
     
    660664  // =================================== Begin of FRAGMENTATION ===============================
    661665  // ===== 6a. assign each keyset to its respective subgraph =====
    662   Subgraphs->next->AssignKeySetsToFragment(this, ParsedFragmentList, ListOfLocalAtoms, FragmentList, (FragmentCounter = 0), true);
     666  ListOfLocalAtoms = new atom **[LeafCount];
     667  for (int i=0;i<LeafCount;i++)
     668    ListOfLocalAtoms[i] = NULL;
     669  FragmentCounter = 0;
     670  Subgraphs->next->AssignKeySetsToFragment(this, ParsedFragmentList, ListOfLocalAtoms, FragmentList, FragmentCounter, true);
     671  delete[](ListOfLocalAtoms);
    663672
    664673  // ===== 6b. prepare and go into the adaptive (Order<0), single-step (Order==0) or incremental (Order>0) cycle
     
    695704  delete(ParsedFragmentList);
    696705  delete[](MinimumRingSize);
    697 
    698706
    699707  // ==================================== End of FRAGMENTATION ============================================
  • src/molecule_graph.cpp

    rb9c847 rc27778  
    664664  BFS.ColorList = new enum Shading[AtomCount];
    665665  BFS.BFSStack = new StackClass<atom *> (AtomCount);
     666  BFS.TouchedStack = new StackClass<atom *> (AtomCount);
    666667
    667668  for (int i = AtomCount; i--;) {
    668669    BFS.ShortestPathList[i] = -1;
    669670    BFS.PredecessorList[i] = 0;
     671    BFS.ColorList[i] = white;
    670672  }
    671673};
     
    681683  delete[](BFS.ColorList);
    682684  delete (BFS.BFSStack);
     685  delete (BFS.TouchedStack);
    683686  BFS.AtomCount = 0;
    684687};
     
    825828      MinRingSize = RingSize;
    826829  } else {
    827     DoLog(1) && (Log() << Verbose(1) << "No ring containing " << *BFS.Root << " with length equal to or smaller than " << MinimumRingSize[Walker->GetTrueFather()->nr] << " found." << endl);
     830    DoLog(1) && (Log() << Verbose(1) << "No ring containing " << *BFS.Root << " with length equal to or smaller than " << MinimumRingSize[BFS.Root->GetTrueFather()->nr] << " found." << endl);
    828831  }
    829832};
  • src/moleculelist.cpp

    rb9c847 rc27778  
    10171017 * \param *out output stream for debugging
    10181018 * \param *reference reference molecule with the bond structure to be copied
    1019  * \param &FragmentCounter Counter needed to address \a **ListOfLocalAtoms
    1020  * \param ***ListOfLocalAtoms Lookup table for each subgraph and index of each atom in \a *reference, may be NULL on start, then it is filled
     1019 * \param **&ListOfLocalAtoms Lookup table for this subgraph and index of each atom in \a *reference, may be NULL on start, then it is filled
    10211020 * \param FreeList true - ***ListOfLocalAtoms is free'd before return, false - it is not
    10221021 * \return true - success, false - faoilure
    10231022 */
    1024 bool MoleculeLeafClass::FillBondStructureFromReference(const molecule * const reference, int &FragmentCounter, atom ***&ListOfLocalAtoms, bool FreeList)
     1023bool MoleculeLeafClass::FillBondStructureFromReference(const molecule * const reference, atom **&ListOfLocalAtoms, bool FreeList)
    10251024{
    10261025  atom *OtherWalker = NULL;
     
    10311030  DoLog(1) && (Log() << Verbose(1) << "Begin of FillBondStructureFromReference." << endl);
    10321031  // fill ListOfLocalAtoms if NULL was given
    1033   if (!FillListOfLocalAtoms(ListOfLocalAtoms, FragmentCounter, reference->getAtomCount(), FreeList)) {
     1032  if (!FillListOfLocalAtoms(ListOfLocalAtoms, reference->getAtomCount(), FreeList)) {
    10341033    DoLog(1) && (Log() << Verbose(1) << "Filling of ListOfLocalAtoms failed." << endl);
    10351034    return false;
     
    10481047      AtomNo = Father->nr; // global id of the current walker
    10491048      for (BondList::const_iterator Runner = Father->ListOfBonds.begin(); Runner != Father->ListOfBonds.end(); (++Runner)) {
    1050         OtherWalker = ListOfLocalAtoms[FragmentCounter][(*Runner)->GetOtherAtom((*iter)->GetTrueFather())->nr]; // local copy of current bond partner of walker
     1049        OtherWalker = ListOfLocalAtoms[(*Runner)->GetOtherAtom((*iter)->GetTrueFather())->nr]; // local copy of current bond partner of walker
    10511050        if (OtherWalker != NULL) {
    10521051          if (OtherWalker->nr > (*iter)->nr)
    10531052            Leaf->AddBond((*iter), OtherWalker, (*Runner)->BondDegree);
    10541053        } else {
    1055           DoLog(1) && (Log() << Verbose(1) << "OtherWalker = ListOfLocalAtoms[" << FragmentCounter << "][" << (*Runner)->GetOtherAtom((*iter)->GetTrueFather())->nr << "] is NULL!" << endl);
     1054          DoLog(1) && (Log() << Verbose(1) << "OtherWalker = ListOfLocalAtoms[" << (*Runner)->GetOtherAtom((*iter)->GetTrueFather())->nr << "] is NULL!" << endl);
    10561055          status = false;
    10571056        }
     
    10621061  if ((FreeList) && (ListOfLocalAtoms != NULL)) {
    10631062    // free the index lookup list
    1064     delete[](ListOfLocalAtoms[FragmentCounter]);
    1065     if (FragmentCounter == 0) // first fragments frees the initial pointer to list
    1066       delete[](ListOfLocalAtoms);
     1063    delete[](ListOfLocalAtoms);
    10671064  }
    10681065  DoLog(1) && (Log() << Verbose(1) << "End of FillBondStructureFromReference." << endl);
     
    11101107/** Fills a lookup list of father's Atom::nr -> atom for each subgraph.
    11111108 * \param *out output stream from debugging
    1112  * \param ***ListOfLocalAtoms Lookup table for each subgraph and index of each atom in global molecule, may be NULL on start, then it is filled
    1113  * \param FragmentCounter counts the fragments as we move along the list
     1109 * \param **&ListOfLocalAtoms Lookup table for each subgraph and index of each atom in global molecule, may be NULL on start, then it is filled
    11141110 * \param GlobalAtomCount number of atoms in the complete molecule
    11151111 * \param &FreeList true - ***ListOfLocalAtoms is free'd before return, false - it is not
    1116  * \return true - success, false - failure
    1117  */
    1118 bool MoleculeLeafClass::FillListOfLocalAtoms(atom ***&ListOfLocalAtoms, const int FragmentCounter, const int GlobalAtomCount, bool &FreeList)
     1112 * \return true - success, false - failure (ListOfLocalAtoms != NULL)
     1113 */
     1114bool MoleculeLeafClass::FillListOfLocalAtoms(atom **&ListOfLocalAtoms, const int GlobalAtomCount, bool &FreeList)
    11191115{
    11201116  bool status = true;
    11211117
    1122   if (ListOfLocalAtoms == NULL) { // allocated initial pointer
    1123     // allocate and set each field to NULL
    1124     const int Counter = Count();
    1125     ASSERT(FragmentCounter < Counter, "FillListOfLocalAtoms: FragmenCounter greater than present fragments.");
    1126     ListOfLocalAtoms = new atom**[Counter];
    1127     if (ListOfLocalAtoms == NULL) {
    1128       FreeList = FreeList && false;
    1129       status = false;
    1130     }
    1131     for (int i=0;i<Counter;i++)
    1132       ListOfLocalAtoms[i] = NULL;
    1133   }
    1134 
    1135   if ((ListOfLocalAtoms != NULL) && (ListOfLocalAtoms[FragmentCounter] == NULL)) { // allocate and fill list of this fragment/subgraph
    1136     status = status && Leaf->CreateFatherLookupTable(ListOfLocalAtoms[FragmentCounter], GlobalAtomCount);
     1118  if (ListOfLocalAtoms == NULL) { // allocate and fill list of this fragment/subgraph
     1119    status = status && Leaf->CreateFatherLookupTable(ListOfLocalAtoms, GlobalAtomCount);
    11371120    FreeList = FreeList && true;
    1138   }
     1121  } else
     1122    return false;
    11391123
    11401124  return status;
     
    11581142  DoLog(1) && (Log() << Verbose(1) << "Begin of AssignKeySetsToFragment." << endl);
    11591143  // fill ListOfLocalAtoms if NULL was given
    1160   if (!FillListOfLocalAtoms(ListOfLocalAtoms, FragmentCounter, reference->getAtomCount(), FreeList)) {
     1144  if (!FillListOfLocalAtoms(ListOfLocalAtoms[FragmentCounter], reference->getAtomCount(), FreeList)) {
    11611145    DoLog(1) && (Log() << Verbose(1) << "Filling of ListOfLocalAtoms failed." << endl);
    11621146    return false;
     
    12031187    // free the index lookup list
    12041188    delete[](ListOfLocalAtoms[FragmentCounter]);
    1205     if (FragmentCounter == 0) // first fragments frees the initial pointer to list
    1206       delete[](ListOfLocalAtoms);
    12071189  }
    12081190  DoLog(1) && (Log() << Verbose(1) << "End of AssignKeySetsToFragment." << endl);
Note: See TracChangeset for help on using the changeset viewer.