fixed memory overcommitment
authorAnatoly <Titov_AI@pnpi.nrcki.ru>
Mon, 18 Nov 2019 11:04:00 +0000 (14:04 +0300)
committerAnatoly <Titov_AI@pnpi.nrcki.ru>
Mon, 18 Nov 2019 11:04:00 +0000 (14:04 +0300)
dynamic domain creation

src/domains.cpp

index 11019405e2a69a366d51d30b794681ba25f3de74..f8449aba1bf476baf91f11be3b9712123df3f7e6 100644 (file)
@@ -318,26 +318,26 @@ bool check_domsizes(std::vector< std::vector< int > > cd_domsizes, int cd_domain
     return false;
 }
 
-void print_domains(std::vector< std::vector< std::vector< unsigned int > > > pd_domains, std::vector< int > index, std::string fnNdx_, int dms, double epsi, double delta, int window) {
-    FILE               *fpNdx_;
-    fpNdx_ = std::fopen(fnNdx_.c_str(), "w+");
+void print_domains(std::vector< std::vector< unsigned int > > pd_domains, std::vector< int > index, std::string fnNdx_, int dms, double epsi, double delta, int window, int st_pos) {
+    FILE               *fpNdx_, *fpNdx2_;
+    fpNdx_ = std::fopen(fnNdx_.c_str(), "a+");
+    fpNdx2_ = std::fopen(("SelectionList-" + fnNdx_.substr(0, fnNdx_.size() - 4)).c_str(), "a+");
     int write_count;
     for (unsigned int i1 = 0; i1 < pd_domains.size(); i1++) {
-        for (unsigned int i2 = 0; i2 < pd_domains[i1].size(); i2++) {
-            std::fprintf(fpNdx_, "[domain-stPos-%3d-num-%3d-dms-%3d-epsi-%4.3f-delta-%4.3f]\n", static_cast< int >(i1) * window / tau_jump, i2 + 1, dms, epsi, delta);
+            std::fprintf(fpNdx_, "[domain-stPos-%06d-num-%03d-dms-%03d-epsi-%04.3f-delta-%04.3f]\n", static_cast< int >(st_pos) * window / tau_jump, i1 + 1, dms, epsi, delta);
+            std::fprintf(fpNdx2_, "group %cdomain-stPos-%06d-num-%03d-dms-%03d-epsi-%04.3f-delta-%04.3f%c;\n", '"', static_cast< int >(st_pos) * window / tau_jump, i1 + 1, dms, epsi, delta, '"');
             write_count = 0;
-            for (unsigned int j = 0; j < pd_domains[i1][i2].size(); j++) {
+            for (unsigned int j = 0; j < pd_domains[i1].size(); j++) {
                 write_count++;
                 if (write_count > 20) {
                     write_count -= 20;
                     std::fprintf(fpNdx_, "\n");
                 }
-                std::fprintf(fpNdx_, "%5d ", index[pd_domains[i1][i2][j]] + 1);
-                std::printf("%5d ", index[pd_domains[i1][i2][j]] + 1);
+                std::fprintf(fpNdx_, "%5d ", index[pd_domains[i1][j]] + 1);
+                std::printf("%5d ", index[pd_domains[i1][j]] + 1);
             }
             std::printf("\n\n");
             std::fprintf(fpNdx_,"\n\n");
-        }
     }
     std::fprintf(fpNdx_,"\n");
     std::fclose(fpNdx_);
@@ -382,7 +382,8 @@ class Domains : public TrajectoryAnalysisModule
         std::vector< std::vector< std::vector< std::vector< node > > > >    graph;
 
 
-        std::vector< std::vector< std::vector< unsigned int > > >   domains;
+        //std::vector< std::vector< std::vector< unsigned int > > >   domains;
+        std::vector< std::vector< unsigned int > >                  domains;
         std::vector< std::vector< int > >                           domsizes;
 
         std::vector< int >                                          index;
@@ -465,21 +466,33 @@ Domains::initAnalysis(const TrajectoryAnalysisSettings &settings,
             reference.push_back(top.x().at(index[i]));
         }
     }
+    bone = static_cast< unsigned int >(index.size() - static_cast< unsigned int >(domain_min_size) + 1);
 
     graph.resize(1);
+    graph.front().resize(bone);
+    //graph.resize(bone);
 
-    bone = static_cast< unsigned int >(index.size() - static_cast< unsigned int >(domain_min_size) + 1);
-    graph[0].resize(bone);
     w_rls2.resize(bone);
     for (unsigned int i = 0; i < bone; i++) {
         w_rls2[i].resize(0);
         for (unsigned int j = 0; j < static_cast< unsigned int >(domain_min_size); j++) {
             w_rls2[i].push_back(std::make_pair(j + i, j + i));
         }
-        make_graph(index.size(), reference, graph[0][i]);
+        make_graph(index.size(), reference, graph.front()[i]);
+        //make_graph(index.size(), reference, graph[i]);
     }
 
     trajectory.resize(index.size());
+
+    std::vector< int > a;
+
+    /*for (int i = 0; i < 10; i++) {
+        a.push_back(i);
+    }
+    a.erase(a.begin());
+    for (int i = 0; i < 10; i++) {
+        std::cout << a[i] << " ";
+    }*/
 }
 
 void
@@ -493,27 +506,57 @@ Domains::analyzeFrame(int frnr, const t_trxframe &fr, t_pbc *pbc, TrajectoryAnal
         }
     }
 
+    int temp = graph.size() - tau_jump;
+
+    if (temp > 0) {
+        domains.resize(0);
+        std::vector< unsigned int > a;
+        a.resize(0);
+        domsizes.resize(0);
+        check_domains(delta, window, graph[0]);
+        std::cout << "finding domains' sizes\n";
+        find_domain_sizes(graph[0], domsizes);
+        while (check_domsizes(domsizes, domain_min_size)) {
+            domains.push_back(a);
+            if (DomainSearchingAlgorythm == 0) {
+                get_maxsized_domain(domains.back(), graph[0], domsizes);
+            } else if (DomainSearchingAlgorythm == 1) {
+                get_min_domain(domains.back(), graph[0], domsizes, domain_min_size);
+            }
+            std::cout << "new domain: " << domains.back().size() << " atoms\n";
+            delete_domain_from_graph(graph[0], domains.back());
+            domsizes.resize(0);
+            find_domain_sizes(graph[0], domsizes);
+        }
+        graph.erase(graph.begin());
+        graph.resize(graph.size() - 1);
+        std::cout << (frnr + 1) / (window / tau_jump) - tau_jump << " window's domains have been evaluated\n";
+        print_domains(domains, index, fnNdx_, domain_min_size, epsi, delta, window, (frnr + 1) / (window / tau_jump) - tau_jump); // see function for details | numbers from index
+    }
+
     for (unsigned int i = 0; i < index.size(); i++) {
         trajectory[i] = fr.x[index[i]];
     }
     frames++;
 
-    #pragma omp parallel for ordered schedule(dynamic) shared(w_rls2, graph) firstprivate(trajectory, reference, epsi)
+    #pragma omp parallel for ordered schedule(dynamic) shared(w_rls2, graph) firstprivate(trajectory, reference, epsi, frnr, window)
     for (unsigned int j = 0; j < bone; j++) {
         std::vector < RVec > temp = trajectory;
         MyFitNew(reference, temp, w_rls2[j], 0);
-        for (unsigned int i = static_cast< unsigned int >(std::max(0, (frnr + 1) / (window / tau_jump) - tau_jump + 1)); i < graph.size(); i++) {
+        for (unsigned int i = 0; i < graph.size(); i++) {
             update_graph(graph[i][j], temp, epsi);
         }
     }
     #pragma omp barrier
-    std::cout << "frame: " << frames << " analyzed\n";
+
+
+    std::cout << "frame: " << frnr << " analyzed\n";
 }
 
 void
 Domains::finishAnalysis(int nframes)
 {
-    graph.resize(graph.size() - tau_jump);
+    /*graph.resize(graph.size() - tau_jump);
     std::cout << "graph size: " << graph.size() << "\n";
     frames -= 1;
 
@@ -527,18 +570,10 @@ Domains::finishAnalysis(int nframes)
     for (unsigned int i = 0; i < graph.size(); i++) {
         domsizes.resize(0);
         domains[i].resize(0);
-        check_domains(delta, frames, graph[i]);
+        check_domains(delta, window, graph[i]);
         std::cout << "finding domains' sizes\n";
         find_domain_sizes(graph[i], domsizes);
 
-        /*for (int j1 = 0; j1 < domsizes.size(); j1++) {
-            for (int j2 = 0; j2 < domsizes[j1].size(); j2++) {
-                if (domsizes[j1][j2] != 0) {
-                    std::cout << domsizes[j1][j2] << " ";
-                }
-            }
-        }*/
-
         while (check_domsizes(domsizes, domain_min_size)) {
             domains[i].push_back(a);
             if (DomainSearchingAlgorythm == 0) {
@@ -551,14 +586,15 @@ Domains::finishAnalysis(int nframes)
             domsizes.resize(0);
             find_domain_sizes(graph[i], domsizes);
         }
-    }
+        std::cout << i * window / tau_jump << " window's domains have been evaluated\n";
+    }*/
 }
 
 void
 Domains::writeOutput()
 {
-    std::cout << "making output file\n";
-    print_domains(domains, index, fnNdx_, domain_min_size, epsi, delta, window); // see function for details | numbers from index
+    //std::cout << "making output file\n";
+    //print_domains(domains, index, fnNdx_, domain_min_size, epsi, delta, window); // see function for details | numbers from index
     std::cout << "\n END \n";
 }