[PPL-devel] [GIT] ppl/ppl(sparse_matrices): Unlimited_Sparse_Row_Over_CO_Tree: optimize combine_needs_second().

Marco Poletti poletti.marco at gmail.com
Sun Apr 25 12:44:07 CEST 2010


Module: ppl/ppl
Branch: sparse_matrices
Commit: c75a75d9eb636efc7facf173d098aebb480d304b
URL:    http://www.cs.unipr.it/git/gitweb.cgi?p=ppl/ppl.git;a=commit;h=c75a75d9eb636efc7facf173d098aebb480d304b

Author: Marco Poletti <poletti.marco at gmail.com>
Date:   Sun Apr 25 12:43:06 2010 +0200

Unlimited_Sparse_Row_Over_CO_Tree: optimize combine_needs_second().

---

 src/Unlimited_Sparse_Row_Over_CO_Tree.templates.hh |  121 +++++---------------
 1 files changed, 27 insertions(+), 94 deletions(-)

diff --git a/src/Unlimited_Sparse_Row_Over_CO_Tree.templates.hh b/src/Unlimited_Sparse_Row_Over_CO_Tree.templates.hh
index 22b2181..eb5b2d4 100644
--- a/src/Unlimited_Sparse_Row_Over_CO_Tree.templates.hh
+++ b/src/Unlimited_Sparse_Row_Over_CO_Tree.templates.hh
@@ -76,74 +76,13 @@ template <typename Func1, typename Func2>
 void
 Unlimited_Sparse_Row_Over_CO_Tree
 ::combine_needs_second(const Unlimited_Sparse_Row_Over_CO_Tree& y,
-                       const Func1& g, const Func2& h) {
-  iterator i = begin();
-  iterator last_i = begin();
-  const_iterator j = y.begin();
-  if (!i.itr.is_at_end()) {
-    if (!j.itr.is_at_end()) {
-      if (i->first == j->first) {
-        g(i->second, j->second);
-        last_i = i;
-        ++i;
-        ++j;
-      } else
-        if (i->first < j->first) {
-          last_i = i;
-          ++i;
-        } else {
-          last_i = find_create(j->first);
-          h(last_i->second, j->second);
-          i = last_i;
-          ++i;
-          if (this == &y)
-            j = last_i;
-          ++j;
-        }
-    } else {
-      last_i = i;
-      ++i;
-    }
-  } else {
-    if (!j.itr.is_at_end()) {
-      last_i = find_create(j->first);
-      h(last_i->second, j->second);
-      i = last_i;
-      ++i;
-      if (this == &y)
-        j = last_i;
-      ++j;
-    } else {
-      PPL_ASSERT(i.itr.is_at_end());
-      PPL_ASSERT(j.itr.is_at_end());
-
-      return;
-    }
-  }
-  PPL_ASSERT(!last_i.itr.is_at_end());
-  while (!i.itr.is_at_end() && !j.itr.is_at_end())
-    if (i->first == j->first) {
-      g(i->second, j->second);
-      last_i = i;
-      ++i;
-      ++j;
-    } else
-      if (i->first < j->first) {
-        last_i = i;
-        i = lower_bound(j->first, i);
-      } else {
-        last_i = find_create(j->first, last_i);
-        h(last_i->second, j->second);
-        i = last_i;
-        ++i;
-        if (this == &y)
-          j = last_i;
-        ++j;
-      }
-  while (!j.itr.is_at_end()) {
-    last_i = find_create(j->first, last_i);
-    h(last_i->second, j->second);
-    ++j;
+                       const Func1& g, const Func2& /* h */) {
+  iterator i;
+  unordered_const_iterator j = y.unordered_begin();
+  unordered_const_iterator j_end = y.unordered_end();
+  for ( ; j != j_end; ++j) {
+    find_create_assign(j->first, i);
+    g(i->second, j->second);
   }
 }
 
@@ -153,42 +92,36 @@ Unlimited_Sparse_Row_Over_CO_Tree
 ::combine(const Unlimited_Sparse_Row_Over_CO_Tree& y, const Func1& f,
           const Func2& g, const Func3& h) {
   iterator i = begin();
-  iterator last_i = begin();
   const_iterator j = y.begin();
   if (!i.itr.is_at_end()) {
     if (!j.itr.is_at_end()) {
       if (i->first == j->first) {
         g(i->second, j->second);
-        last_i = i;
         ++i;
         ++j;
       } else
         if (i->first < j->first) {
           f(i->second);
-          last_i = i;
           ++i;
         } else {
-          last_i = find_create(j->first);
-          h(last_i->second, j->second);
-          i = last_i;
-          ++i;
+          find_create_assign(j->first, i);
+          h(i->second, j->second);
           if (this == &y)
-            j = last_i;
+            j = i;
+          ++i;
           ++j;
         }
     } else {
       f(i->second);
-      last_i = i;
       ++i;
     }
   } else {
     if (!j.itr.is_at_end()) {
-      last_i = find_create(j->first);
-      h(last_i->second, j->second);
-      i = last_i;
-      ++i;
+      find_create_assign(j->first, i);
+      h(i->second, j->second);
       if (this == &y)
-        j = last_i;
+        j = i;
+      ++i;
       ++j;
     } else {
       PPL_ASSERT(i.itr.is_at_end());
@@ -197,35 +130,35 @@ Unlimited_Sparse_Row_Over_CO_Tree
       return;
     }
   }
-  PPL_ASSERT(!last_i.itr.is_at_end());
   while (!i.itr.is_at_end() && !j.itr.is_at_end())
     if (i->first == j->first) {
       g(i->second, j->second);
-      last_i = i;
       ++i;
       ++j;
     } else
       if (i->first < j->first) {
         f(i->second);
-        last_i = i;
         ++i;
       } else {
-        last_i = find_create(j->first, last_i);
-        h(last_i->second, j->second);
-        i = last_i;
-        ++i;
+        --i;
+        find_create_hint_assign(j->first, i);
+        h(i->second, j->second);
         if (this == &y)
-          j = last_i;
+          j = i;
+        ++i;
         ++j;
       }
   while (!i.itr.is_at_end()) {
     f(i->second);
     ++i;
   }
-  while (!j.itr.is_at_end()) {
-    last_i = find_create(j->first, last_i);
-    h(last_i->second, j->second);
-    ++j;
+  if (!j.itr.is_at_end()) {
+    --i;
+    while (!j.itr.is_at_end()) {
+      find_create_hint_assign(j->first, i);
+      h(i->second, j->second);
+      ++j;
+    }
   }
 }
 




More information about the PPL-devel mailing list