- optimised memory storage for domains
authorAnatoly <Titov_AI@pnpi.nrcki.ru>
Fri, 2 Oct 2020 10:45:25 +0000 (13:45 +0300)
committerAnatoly <Titov_AI@pnpi.nrcki.ru>
Fri, 2 Oct 2020 10:45:25 +0000 (13:45 +0300)
- fixed some tests
- some minor style changes

src/domaintests.cpp
src/domaintype.cpp
src/domaintype.h

index d5e066998908cb7deb97af90558912e681372a4f..d5295f0bf71ca55158ef98a68a2b0ea5829b9ec0 100644 (file)
@@ -63,7 +63,7 @@ TEST( fitTests, fitTest_ApplyFit)
     std::vector< std::pair< size_t, size_t > > testPairs;
     testPairs.resize(0);
 
-    for (size_t i = 0; i < 27; i++) {
+    for (size_t i {0}; i < 27; i++) {
         testFrame1.push_back(x1 * static_cast< float >(i % 3) + y1 * static_cast< float >((i % 9) / 3) + z1 * static_cast< float >(i / 9));
         testFrame2.push_back(x2 * static_cast< float >(i % 3) + y2 * static_cast< float >((i % 9) / 3) + z2 * static_cast< float >(i / 9));
         testPairs.push_back(std::make_pair(i, i));
@@ -93,8 +93,8 @@ TEST( fitTests, fitTest_ApplyFit)
     ApplyFit(testFrame3, {2, 4, 8}, {M_PI / 6, M_PI / 6, M_PI / 6});
     CalcMid(testFrame1, testFrame3, mid1, mid2, testPairs);
     ASSERT_NEAR((mid1 - mid2).norm(), 0., 0.000001);
-    double testF = 0;
-    for (size_t i = 0; i < testFrame1.size(); i++) {
+    double testF {0};
+    for (size_t i {0}; i < testFrame1.size(); i++) {
         testF += F(testFrame1[i].toDVec(), testFrame3[i].toDVec(), angl);
     }
     ASSERT_NEAR(testF, 0., 0.000001);
@@ -111,7 +111,7 @@ TEST( fitTests, fitTest_CalcMid)
     std::vector< std::pair< size_t, size_t > > testPairs;
     testPairs.resize(0);
 
-    for (size_t i = 0; i < 27; i++) {
+    for (size_t i {0}; i < 27; i++) {
         testFrame1.push_back(x1 * static_cast< float >(i % 3) + y1 * static_cast< float >((i % 9) / 3) + z1 * static_cast< float >(i / 9));
         testFrame2.push_back(x2 * static_cast< float >(i % 3) + y2 * static_cast< float >((i % 9) / 3) + z2 * static_cast< float >(i / 9));
         testPairs.push_back(std::make_pair(i, i));
@@ -131,7 +131,7 @@ void myFitNewRoutine(const std::vector< RVec > &fr1, std::vector< RVec > fr2, co
     MyFitNew(fr1, fr2, testPairs, prc);
     tF = 0;
     DVec angl(0., 0., 0.);
-    for (size_t i = 0; i < fr1.size(); i++) {
+    for (size_t i {0}; i < fr1.size(); i++) {
         tF += F(fr1[i].toDVec(), fr2[i].toDVec(), angl);
     }
 }
@@ -153,13 +153,13 @@ TEST( fitTests, fitTest_MyFitNew)
      * optimal 3x3x3 cubes fitting
     */
 
-    for (size_t i = 0; i < 27; i++) {
+    for (size_t i {0}; i < 27; i++) {
         testFrame1.push_back(x1 * static_cast< float >(i % 3) + y1 * static_cast< float >((i % 9) / 3) + z1 * static_cast< float >(i / 9));
         testFrame2.push_back(testFrame1.back() + a);
         testPairs.push_back(std::make_pair(i, i));
     }
 
-    double testF = 0;
+    double testF {0};
 
     myFitNewRoutine(testFrame1, testFrame2, testPairs, 0.000'001, testF);
     ASSERT_NEAR(testF, 0, 0.000'001);
@@ -208,7 +208,7 @@ TEST( fitTests, fitTest_MyFitNew)
 
     testFrame1.resize(0);
     testFrame2.resize(0);
-    for (size_t i = 0; i < 27; i++) {
+    for (size_t i {0}; i < 27; i++) {
         testFrame1.push_back(x2 * static_cast< float >(i % 3) + y2 * static_cast< float >((i % 9) / 3) + z2 * static_cast< float >(i / 9));
         testFrame2.push_back(x3 * static_cast< float >(i % 3) + y3 * static_cast< float >((i % 9) / 3) + z3 * static_cast< float >(i / 9));
     }
@@ -272,36 +272,32 @@ TEST( domainTests, domainTest_setDefaults)
     std::vector< RVec > testRef;
     testRef.resize(0);
 
-    RVec testA, testB;
-    testA[0] = 0; testA[1] = 0; testA[2] = 0;
-    testB[0] = 1; testB[1] = 1; testB[2] = 1;
-    for (size_t i = 0; i < 100; i++) {
+    RVec testA(0., 0., 0.), testB(1., 1., 1.);
+    for (size_t i {0}; i < 100; i++) {
         testIndex.push_back(i);
         testRef.push_back(testA + testB * static_cast< float >(i));
     }
 
-    int testWindowSize = 500;
-    int testDomainMinimumSize = 5;
-    int testDomainSearchAlgorythm = 1;
-    int testTimeStepBetweenWindows = 100;
-    size_t testSliceNum = testIndex.size() - testDomainMinimumSize + 1;
-    double testEpsilon = 1.5;
-    double testDelta = 0.98;
-    std::string testOutPutFileName = "testString";
+    int testWindowSize {500};
+    int testDomainMinimumSize {5};
+    int testDomainSearchAlgorythm {1};
+    int testTimeStepBetweenWindows {100};
+    size_t testSliceNum {testIndex.size() - testDomainMinimumSize + 1};
+    double testEpsilon {1.5};
+    double testDelta {0.98};
+    std::string testOutPutFileName {"testString"};
 
     testDomain.setDefaults(testIndex, testRef, testWindowSize, testDomainMinimumSize, testDomainSearchAlgorythm, testTimeStepBetweenWindows, testSliceNum, testEpsilon, testDelta, testOutPutFileName);
 
     ASSERT_EQ(testDomain.graph.size(), 0);
     ASSERT_EQ(testDomain.structIndex, testIndex);
 
-    ASSERT_EQ(testDomain.ref.size(), testRef.size());
-    for (size_t i = 0; i < testRef.size(); i++) {
-        ASSERT_EQ(testDomain.ref[i][0], testRef[i][0]);
-        ASSERT_EQ(testDomain.ref[i][1], testRef[i][1]);
-        ASSERT_EQ(testDomain.ref[i][2], testRef[i][2]);
-        //ASSERT_EQ(testDomain.ref[i], testRef[i]); not working probably due to std::vector< ->float[3]<- > frame;
+    ASSERT_EQ(testDomain.refTable.size(), testRef.size());
+    for (size_t j {0}; j < testRef.size(); j++) {
+        for (size_t i {0}; i < testRef.size(); i++) {
+            ASSERT_NEAR(testDomain.refTable[j][i].norm(), (testRef[i] - testRef[j]).norm(), 0.000'01);
+        }
     }
-    //ASSERT_EQ(testDomain.ref, testRef); not working
 
     ASSERT_EQ(testDomain.eps, testEpsilon);
     ASSERT_EQ(testDomain.dlt, testDelta);
@@ -321,16 +317,16 @@ TEST( domainTests, domainTest_update)
     testTraj2.resize(0);
     testTraj3.resize(0);
     RVec testA(1, 2, 3), testB(1, 0, 0), testC(0, 1, 0);
-    for (size_t i0 = 0; i0 < 1000; i0++) {
+    for (size_t i0 {0}; i0 < 1000; i0++) {
         testTraj1.resize(testTraj1.size() + 1);
         testTraj2.resize(testTraj2.size() + 1);
         testTraj3.resize(testTraj3.size() + 1);
-        for (size_t i1 = 0; i1 < 10; i1++) {
+        for (size_t i1 {0}; i1 < 10; i1++) {
             testTraj1.back().push_back(static_cast< float >(i1) * testA + static_cast< float >(i0) * testB);
             testTraj2.back().push_back(static_cast< float >(i1) * testA + static_cast< float >(i0) * testB);
             testTraj3.back().push_back(static_cast< float >(i1) * testA + static_cast< float >(i0) * testB + static_cast< float >(i0) * testC);
         }
-        for (size_t i1 = 0; i1 < 10; i1++) {
+        for (size_t i1 {0}; i1 < 10; i1++) {
             testTraj1.back().push_back(static_cast< float >(i1) * testA - static_cast< float >(i0) * testB);
             testTraj2.back().push_back(static_cast< float >(i1) * testA + static_cast< float >(i0) * testC);
             testTraj3.back().push_back(static_cast< float >(i1) * testA + static_cast< float >(i0) * testB - static_cast< float >(i0) * testC);
@@ -340,18 +336,18 @@ TEST( domainTests, domainTest_update)
     testIndex.resize(0);
     std::vector< RVec > testRef;
     testRef.resize(0);
-    for (size_t i = 0; i < 20; i++) {
+    for (size_t i {0}; i < 20; i++) {
         testIndex.push_back(i);
         testRef.push_back(static_cast< float >(i % 10) * testA);
     }
-    int testWindowSize = 500;
-    int testDomainMinimumSize = 4;
-    int testDomainSearchAlgorythm = 0;
-    int testTimeStepBetweenWindows = 100;
-    size_t testSliceNum = testIndex.size() - testDomainMinimumSize + 1;
-    double testEpsilon = 1.5;
-    double testDelta = 0.98;
-    std::string testOutPutFileName1 = "testString1.ndx", testOutPutFileName2 = "testString2.ndx", testOutPutFileName3 = "testString3.ndx";
+    int testWindowSize {500};
+    int testDomainMinimumSize {4};
+    int testDomainSearchAlgorythm {0};
+    int testTimeStepBetweenWindows {100};
+    size_t testSliceNum {testIndex.size() - testDomainMinimumSize + 1};
+    double testEpsilon {1.5};
+    double testDelta {0.98};
+    std::string testOutPutFileName1 {"testString1.ndx"}, testOutPutFileName2 {"testString2.ndx"}, testOutPutFileName3 {"testString3.ndx"};
 
     domainType testDomain1, testDomain2, testDomain3;
     testDomain1.setDefaults(testIndex, testRef, testWindowSize, testDomainMinimumSize, testDomainSearchAlgorythm, testTimeStepBetweenWindows, testSliceNum, testEpsilon, testDelta, testOutPutFileName1);
@@ -359,7 +355,7 @@ TEST( domainTests, domainTest_update)
     testDomain3.setDefaults(testIndex, testRef, testWindowSize, testDomainMinimumSize, testDomainSearchAlgorythm, testTimeStepBetweenWindows, testSliceNum, testEpsilon, testDelta, testOutPutFileName3);
 
     std::vector< std::vector< RVec > > testTemp1, testTemp2, testTemp3;
-    for (size_t i = 0; i < 1000; i++) {
+    for (size_t i {0}; i < 1000; i++) {
         testTemp1.resize(0);
         testTemp2.resize(0);
         testTemp3.resize(0);
@@ -400,28 +396,28 @@ TEST( domainTests, domainTest_getDomains)
     testRef.resize(0);
 
     RVec testA(0, 0, 0), testB(1, 1, 1);
-    for (size_t i = 0; i < 100; i++) {
+    for (size_t i {0}; i < 100; i++) {
         testIndex.push_back(i);
         testRef.push_back(testA + testB * static_cast< float >(i));
     }
 
-    int testWindowSize = 100;
-    int testDomainMinimumSize = 5;
-    int testDomainSearchAlgorythm = 0;
-    int testTimeStepBetweenWindows = 100;
-    size_t testSliceNum = testIndex.size() - testDomainMinimumSize + 1;
-    double testEpsilon = 1.5;
-    double testDelta = 0.98;
-    std::string testOutPutFileName = "testString";
+    int testWindowSize {100};
+    int testDomainMinimumSize {5};
+    int testDomainSearchAlgorythm {0};
+    int testTimeStepBetweenWindows {100};
+    size_t testSliceNum {testIndex.size() - testDomainMinimumSize + 1};
+    double testEpsilon {1.5};
+    double testDelta {0.98};
+    std::string testOutPutFileName {"testString"};
 
     testDomain.setDefaults(testIndex, testRef, testWindowSize, testDomainMinimumSize, testDomainSearchAlgorythm, testTimeStepBetweenWindows, testSliceNum, testEpsilon, testDelta, testOutPutFileName);
 
     testDomain.graph.resize(1);
     testDomain.graph.front().resize(testSliceNum);
-    for (size_t i1 = 0; i1 < testSliceNum; i1++) {
+    for (size_t i1 {0}; i1 < testSliceNum; i1++) {
         testDomain.setGraph(testDomain.graph.front()[i1]);
-        for (size_t i2 = 0; i2 < testIndex.size(); i2++) {
-            for (size_t i3 = 0; i3 < testIndex.size(); i3++) {
+        for (size_t i2 {0}; i2 < testIndex.size(); i2++) {
+            for (size_t i3 {0}; i3 < testIndex.size(); i3++) {
                 testDomain.graph.front()[i1][i2][i3].num = 4;
             }
         }
@@ -429,13 +425,13 @@ TEST( domainTests, domainTest_getDomains)
     testDomain.getDomains();
     ASSERT_EQ(testDomain.domains.size(), 0);
 
-    for (int i0 = 0; i0 < 3; i0++) {
+    for (int i0 {0}; i0 < 3; i0++) {
         testDomain.graph.resize(1);
         testDomain.graph.front().resize(testSliceNum);
-        for (size_t i1 = 0; i1 < testSliceNum; i1++) {
+        for (size_t i1 {0}; i1 < testSliceNum; i1++) {
             testDomain.setGraph(testDomain.graph.front()[i1]);
-            for (size_t i2 = 0; i2 < testIndex.size(); i2++) {
-                for (size_t i3 = 0; i3 < testIndex.size(); i3++) {
+            for (size_t i2 {0}; i2 < testIndex.size(); i2++) {
+                for (size_t i3 {0}; i3 < testIndex.size(); i3++) {
                     testDomain.graph.front()[i1][i2][i3].num = 100;
                 }
             }
index 24cd958a34a22313e4dadb0f6dc93153e67561f3..1841698c5ece6a8d218bf985ef2063476aa6004a 100644 (file)
@@ -24,7 +24,13 @@ void domainType::setDefaults(const std::vector< size_t > &index, const std::vect
                         const std::string outPutFileName) {
     graph.resize(0);
     structIndex = index;
-    ref = reference;
+    refTable.resize(reference.size());
+    for (size_t i {0}; i < reference.size(); i++) {
+        refTable[i].resize(0);
+        for (size_t j {0}; j < reference.size(); j++) {
+            refTable[i].push_back(reference[i] - reference[j]);
+        }
+    }
     // слава шиве, слава индусам... зачем столько ифов?
     if (epsilon != -1) { eps = epsilon; }
     if (delta != -1) { dlt = delta; }
@@ -41,25 +47,25 @@ void domainType::setDefaults(const std::vector< size_t > &index, const std::vect
 // фукнция обновления данных для выделения структурных доменов
 void domainType::update(const std::vector< std::vector< RVec > > &frame, const int frameNumber) {
     // громакс считает с нуля, проверял; инициализируем новое "окно"
-    if ((frameNumber + 1) % ts == 1) {
+    if (frameNumber % ts == 0) {
         graph.resize(graph.size() + 1);
         graph.back().resize(structIndex.size() - static_cast< size_t >(dms) + 1);
-        for (size_t i {0}; i < graph.front().size(); i++) {
-            setGraph(graph.back()[i]);
+        for (auto &i : graph.back()) {
+            setGraph(i);
         }
     }
     // заполняем структуру данных для структурных доменов
-    for (size_t i {0}; i < graph.size(); i++) {
+    for (auto &i : graph) {
         #pragma omp parallel for
-        for (size_t j = 0; j < graph.front().size(); j++) {
-            for (size_t k1 {0}; k1 < graph[i][j].size(); k1++) {
-                for (size_t k2 {k1}; k2 < graph[i][j].size(); k2++) {
-                    if ((frame[j][k1] - frame[j][k2] - graph[i][j][k1][k2].radius).norm() <= static_cast< float >(eps)) {
+        for (size_t j = 0; j < i.size(); j++) {
+            for (size_t k1 {0}; k1 < i[j].size(); k1++) {
+                for (size_t k2 {k1}; k2 < i[j].size(); k2++) {
+                    if ((frame[j][k1] - frame[j][k2] - refTable[k1][k2]).norm() <= static_cast< float >(eps)) {
                         if (k1 != k2) {
-                            graph[i][j][k1][k2].num++;
-                            graph[i][j][k2][k1].num++;
+                            i[j][k1][k2].num++;
+                            i[j][k2][k1].num++;
                         } else {
-                            graph[i][j][k1][k2].num++;
+                            i[j][k1][k2].num++;
                         }
                     }
                 }
@@ -79,15 +85,14 @@ void domainType::update(const std::vector< std::vector< RVec > > &frame, const i
 }
 
 // инициализация матриц соотношений в структуре
-void domainType::setGraph(std::vector< std::vector< triple > > &smallGraph) {
+void domainType::setGraph(std::vector< std::vector< node > > &smallGraph) {
     smallGraph.resize(0);
-    smallGraph.resize(ref.size());
-    for (size_t i {0}; i < ref.size(); i++) {
+    smallGraph.resize(refTable.size());
+    for (size_t i {0}; i < refTable.size(); i++) {
         smallGraph[i].resize(0);
-        smallGraph[i].resize(ref.size());
-        for (size_t j {0}; j < ref.size(); j++) {
+        smallGraph[i].resize(refTable.size());
+        for (size_t j {0}; j < refTable.size(); j++) {
             smallGraph[i][j].num = 0;
-            smallGraph[i][j].radius = ref[i] - ref[j];
             smallGraph[i][j].check = false;
         }
     }
@@ -108,8 +113,6 @@ void domainType::deleteDomainFromGraph(const std::vector< size_t > &domain) {
 // подсчёт размеров всех потенциально возможных доменов и проверка на наличие домена для выделения
  bool domainType::searchDomainSizes() {
     bool flag {false};
-    domsizes.resize(0);
-    domsizes.resize(graph.front().size());
     for (size_t i {0}; i < graph.front().size(); i++) {
         domsizes[i].resize(0); // необходимо переопределять память
         domsizes[i].resize(graph.front()[i].size(), 0);
index 5d41fb413ce1cb2b5dfbbe72f73626a3fa9d8f4e..7eaab0ea0ae802579cee99ebda03f98126052868 100644 (file)
@@ -54,17 +54,16 @@ class domainType {
         // узел матрицы связности: число вхождений в один домен, вектор между элементами в референсной структуре, флаг для проверки
         // последние два пункта технически можно перевычеслять при каждом обращении, что сократит размер ячейки с 20 байт до 4
         // но замедлит скорость работы программы, возможно стоит проверить на больших структурах
-        struct triple {
+        struct node {
             int num;
-            RVec radius;
             bool check;
         };
-        // ��еференстная структура
-        std::vector< RVec >                                                 ref;                            // must be presented
+        // ��аблица векторных соотношений в референсной структуре
+        std::vector< std::vector< RVec > >                                  refTable;
         // индекс структуры
         std::vector< size_t >                                               structIndex;                    // must be presented
         // рабочие окна -> рассматриваемые основные последовательности -> матрица соотношений в структуре всё на всё
-        std::vector< std::vector< std::vector< std::vector< triple > > > >  graph;
+        std::vector< std::vector< std::vector< std::vector< node > > > >    graph;
         // списки доменов
         std::vector< std::vector< size_t > >                                domains;
         // размеры доменов для каждой основной последовательности
@@ -87,7 +86,7 @@ class domainType {
         std::string                                                         outPut      = "default.ndx";    // selectable
 
         // инициализация матриц соотношений в структуре
-        void setGraph(std::vector< std::vector< triple > > &smallGraph);
+        void setGraph(std::vector< std::vector< node > > &smallGraph);
 
         // "зануление" элементов матриц вошедших в домен
         void deleteDomainFromGraph(const std::vector< size_t > &domain);