This is an automated email from the ASF dual-hosted git repository.

baunsgaard pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/systemds.git


The following commit(s) were added to refs/heads/main by this push:
     new aaa01928ca [MINOR] Fix edgecase of Compressed OffsetSlice
aaa01928ca is described below

commit aaa01928caf7d48609e38c876b244e193d839502
Author: Sebastian Baunsgaard <[email protected]>
AuthorDate: Sat Dec 28 16:15:17 2024 +0100

    [MINOR] Fix edgecase of Compressed OffsetSlice
    
    This commit fixes an edgecase of offset slices where
    a single element is sliced.
    
    Closes #2163
    
    Signed-off-by: Sebastian Baunsgaard <[email protected]>
---
 .../runtime/compress/colgroup/offset/AOffset.java  |  5 +-
 .../compress/colgroup/offset/OffsetTwo.java        |  2 +-
 .../component/compress/offset/OffsetTests.java     | 89 ++++++++++++++++++----
 3 files changed, 81 insertions(+), 15 deletions(-)

diff --git 
a/src/main/java/org/apache/sysds/runtime/compress/colgroup/offset/AOffset.java 
b/src/main/java/org/apache/sysds/runtime/compress/colgroup/offset/AOffset.java
index 2930766964..8930074eb0 100644
--- 
a/src/main/java/org/apache/sysds/runtime/compress/colgroup/offset/AOffset.java
+++ 
b/src/main/java/org/apache/sysds/runtime/compress/colgroup/offset/AOffset.java
@@ -569,6 +569,8 @@ public abstract class AOffset implements Serializable {
                        else
                                return new OffsetSliceInfo(0, s, moveIndex(l));
                }
+               else if (u < first)
+                       return EMPTY_SLICE;
 
                final AIterator it = getIteratorSkipCache(l);
 
@@ -587,6 +589,7 @@ public abstract class AOffset implements Serializable {
                final int low = it.getDataIndex();
                final int lowOff = it.getOffsetsIndex();
                final int lowValue = it.value();
+
                // set c
                int high = low;
                int highOff = lowOff;
@@ -607,7 +610,7 @@ public abstract class AOffset implements Serializable {
 
        private final OffsetSliceInfo constructSliceReturn(int l, int u, int 
low, int high, int lowOff, int highOff,
                int lowValue, int highValue) {
-               if(low == high)
+               if(low == high) // Implicit lowValue == highValue
                        return new OffsetSliceInfo(low, high + 1, new 
OffsetSingle(lowValue - l));
                else if(low + 1 == high)
                        return new OffsetSliceInfo(low, high + 1, new 
OffsetTwo(lowValue - l, highValue - l));
diff --git 
a/src/main/java/org/apache/sysds/runtime/compress/colgroup/offset/OffsetTwo.java
 
b/src/main/java/org/apache/sysds/runtime/compress/colgroup/offset/OffsetTwo.java
index 9c53e85e70..48ce65f171 100644
--- 
a/src/main/java/org/apache/sysds/runtime/compress/colgroup/offset/OffsetTwo.java
+++ 
b/src/main/java/org/apache/sysds/runtime/compress/colgroup/offset/OffsetTwo.java
@@ -97,7 +97,7 @@ public class OffsetTwo extends AOffset {
        @Override
        public OffsetSliceInfo slice(int l, int u) {
                if(l <= first) {
-                       if(u < first)
+                       if(u <= first)
                                return EMPTY_SLICE;
                        else if(u > last)
                                return new OffsetSliceInfo(0, 2, moveIndex(l));
diff --git 
a/src/test/java/org/apache/sysds/test/component/compress/offset/OffsetTests.java
 
b/src/test/java/org/apache/sysds/test/component/compress/offset/OffsetTests.java
index 09f3dbe749..7e74fe0fb8 100644
--- 
a/src/test/java/org/apache/sysds/test/component/compress/offset/OffsetTests.java
+++ 
b/src/test/java/org/apache/sysds/test/component/compress/offset/OffsetTests.java
@@ -58,7 +58,7 @@ import org.junit.runners.Parameterized.Parameters;
 
 @RunWith(value = Parameterized.class)
 public class OffsetTests {
-       static{
+       static {
                CompressedMatrixBlock.debug = true;
        }
 
@@ -77,6 +77,10 @@ public class OffsetTests {
                for(OFF_TYPE t : OFF_TYPE.values()) {
                        tests.add(new Object[] {new int[] {}, t});
                        tests.add(new Object[] {new int[] {1, 2}, t});
+                       tests.add(new Object[] {new int[] {1, 3, 5, 7}, t});
+                       tests.add(new Object[] {new int[] {2, 3, 6, 7}, t});
+                       tests.add(new Object[] {new int[] {2, 5, 10, 12}, t});
+                       tests.add(new Object[] {new int[] {2, 6, 8, 14}, t});
                        tests.add(new Object[] {new int[] {2, 142}, t});
                        tests.add(new Object[] {new int[] {142, 421}, t});
                        tests.add(new Object[] {new int[] {1, 1023}, t});
@@ -562,6 +566,46 @@ public class OffsetTests {
                slice(0, 100);
        }
 
+       @Test
+       public void slice1_2() {
+               slice(1, 2);
+       }
+
+       @Test
+       public void slice3_4() {
+               slice(3, 4);
+       }
+
+       @Test
+       public void sliceRange() {
+               for(int i = 0; i < 100; i++) {
+                       // not allowed to slice smaller or equal range.
+                       // slice(i, i - 1);
+                       // slice(i, i);
+                       slice(i, i + 1);
+                       slice(i, i + 2);
+                       slice(i, i + 3);
+               }
+       }
+
+       @Test
+       public void sliceRange256() {
+               slice(250, 260);
+               slice(254, 260);
+               slice(254, 257);
+               slice(255, 257);
+               slice(255, 256);
+       }
+
+       @Test
+       public void sliceRange2x256() {
+               slice(250 * 2, 260 * 2);
+               slice(254 * 2, 260 * 2);
+               slice(254 * 2, 257 * 2);
+               slice(255 * 2, 257 * 2);
+               slice(255 * 2, 256 * 2);
+       }
+
        @Test
        public void sliceToLast() {
                if(data.length > 1)
@@ -579,11 +623,6 @@ public class OffsetTests {
                slice(100, 10000);
        }
 
-       @Test
-       public void verify() {
-               o.verify(o.getSize());
-       }
-
        @Test
        public void slice1to4() {
                slice(1, 4);
@@ -594,7 +633,7 @@ public class OffsetTests {
                if(data.length > 1) {
                        int n = data[data.length - 1];
                        for(int i = 0; i < n && i < 100; i++) {
-                               for(int j = i; j < n + 1 && j < 100; j++) {
+                               for(int j = i+1; j < n + 1 && j < 100; j++) {
                                        slice(i, j, false);
                                }
                        }
@@ -624,12 +663,28 @@ public class OffsetTests {
                                int i = 0;
                                while(i < data.length && data[i] < l)
                                        i++;
-
-                               while(data[i] < u) {
-                                       assertEquals(data[i] - l, it.value());
-                                       if(a.offsetSlice.getOffsetToLast() > 
it.value())
-                                               it.next();
-                                       i++;
+                                       
+                               if(! (a.offsetSlice instanceof OffsetEmpty)){
+                                       int t = 0;
+                                       final int lasstSliceOffset = 
a.offsetSlice.getOffsetToLast();
+                                       while(data[i] < u) {
+                                               assertEquals(data[i] - l, 
it.value());
+                                               if(lasstSliceOffset > 
it.value())
+                                                       it.next();
+                                               i++;
+                                               t++;
+                                       }
+
+                                       int sliceSize = a.offsetSlice.getSize();
+                                       if(sliceSize != t) {
+                                               fail("Slice size is not equal 
to elements that should have been sliced:\n" + sliceSize + " vs " + t
+                                                       + "\n" + a + "\nrange: 
" + l + " " + u + "\ninput " + o);
+                                       }
+                               }
+                               else {
+                                       if( i < data.length){
+                                               assertTrue(data[i] >= u);
+                                       }
                                }
                        }
                }
@@ -640,6 +695,14 @@ public class OffsetTests {
 
        }
 
+
+       @Test
+       public void verify() {
+               o.verify(o.getSize());
+       }
+
+
+
        @Test
        public void append() {
                if(data.length > 0) {

Reply via email to