Repository: systemml Updated Branches: refs/heads/master 614f5ab52 -> cca4f942c
[SYSTEMML-1790] Fix frame block reset w/ #rows larger than allocated A FrameBlock reset, e.g., on feeding the same reuse frame block multiple times into slice with different data sizes, currently does not work properly, leading to an ArrayIndexOutOfBoundsException on the actual data copy if the target is larger than then previously allocated block. This patch fixes this issue by providing reset functionality on the individual column arrays. Project: http://git-wip-us.apache.org/repos/asf/systemml/repo Commit: http://git-wip-us.apache.org/repos/asf/systemml/commit/7cd978df Tree: http://git-wip-us.apache.org/repos/asf/systemml/tree/7cd978df Diff: http://git-wip-us.apache.org/repos/asf/systemml/diff/7cd978df Branch: refs/heads/master Commit: 7cd978df5b218e6ba886ea6cb905abfac3aa49a7 Parents: 614f5ab Author: Matthias Boehm <[email protected]> Authored: Wed Jul 19 20:30:29 2017 -0700 Committer: Matthias Boehm <[email protected]> Committed: Thu Jul 20 01:24:22 2017 -0700 ---------------------------------------------------------------------- .../sysml/runtime/matrix/data/FrameBlock.java | 23 +++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/systemml/blob/7cd978df/src/main/java/org/apache/sysml/runtime/matrix/data/FrameBlock.java ---------------------------------------------------------------------- diff --git a/src/main/java/org/apache/sysml/runtime/matrix/data/FrameBlock.java b/src/main/java/org/apache/sysml/runtime/matrix/data/FrameBlock.java index 512b85c..bfe236e 100644 --- a/src/main/java/org/apache/sysml/runtime/matrix/data/FrameBlock.java +++ b/src/main/java/org/apache/sysml/runtime/matrix/data/FrameBlock.java @@ -360,7 +360,7 @@ public class FrameBlock implements Writable, CacheBlock, Externalizable } if(_coldata != null) { for( int i=0; i < _coldata.length; i++ ) - _coldata[i]._size = nrow; + _coldata[i].reset(nrow); } } @@ -1258,6 +1258,7 @@ public class FrameBlock implements Writable, CacheBlock, Externalizable public abstract void append(T value); public abstract Array clone(); public abstract Array slice(int rl, int ru); + public abstract void reset(int size); } private static class StringArray extends Array<String> { @@ -1307,6 +1308,11 @@ public class FrameBlock implements Writable, CacheBlock, Externalizable public Array slice(int rl, int ru) { return new StringArray(Arrays.copyOfRange(_data,rl,ru+1)); } + public void reset(int size) { + if( _data.length < size ) + _data = new String[size]; + _size = size; + } } private static class BooleanArray extends Array<Boolean> { @@ -1357,6 +1363,11 @@ public class FrameBlock implements Writable, CacheBlock, Externalizable public Array slice(int rl, int ru) { return new BooleanArray(Arrays.copyOfRange(_data,rl,ru+1)); } + public void reset(int size) { + if( _data.length < size ) + _data = new boolean[size]; + _size = size; + } } private static class LongArray extends Array<Long> { @@ -1407,6 +1418,11 @@ public class FrameBlock implements Writable, CacheBlock, Externalizable public Array slice(int rl, int ru) { return new LongArray(Arrays.copyOfRange(_data,rl,ru+1)); } + public void reset(int size) { + if( _data.length < size ) + _data = new long[size]; + _size = size; + } } private static class DoubleArray extends Array<Double> { @@ -1457,6 +1473,11 @@ public class FrameBlock implements Writable, CacheBlock, Externalizable public Array slice(int rl, int ru) { return new DoubleArray(Arrays.copyOfRange(_data,rl,ru+1)); } + public void reset(int size) { + if( _data.length < size ) + _data = new double[size]; + _size = size; + } } public static class ColumnMetadata implements Serializable {
