This is an automated email from the ASF dual-hosted git repository.
mboehm7 pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/systemds.git
The following commit(s) were added to refs/heads/master by this push:
new 83e5eef [SYSTEMDS-2789] Cleanup disguised missing value detection
83e5eef is described below
commit 83e5eefd4f30095f05d8dfc549a2db1aae66f766
Author: Matthias Boehm <[email protected]>
AuthorDate: Sat Jan 9 21:38:22 2021 +0100
[SYSTEMDS-2789] Cleanup disguised missing value detection
* Fix thread-safeness for parfor environments (no static instance vars)
* Fix hashmap/iterator handling (removed HashedMap, unnecessary casts)
* Fix formatting related test
DIA project WS2020/21, part 2
Co-authored-by: David Kerschbaumer <[email protected]>
Co-authored-by: Patrick Lovric <[email protected]>
Co-authored-by: Valentin Edelsbrunner <[email protected]>
---
.../sysds/runtime/matrix/data/FrameBlock.java | 23 +-
.../org/apache/sysds/runtime/util/DMVUtils.java | 73 ++---
.../test/functions/builtin/BuiltinDMVTest.java | 314 ++++++++++-----------
3 files changed, 188 insertions(+), 222 deletions(-)
diff --git a/src/main/java/org/apache/sysds/runtime/matrix/data/FrameBlock.java
b/src/main/java/org/apache/sysds/runtime/matrix/data/FrameBlock.java
index d157e37..e33052d 100644
--- a/src/main/java/org/apache/sysds/runtime/matrix/data/FrameBlock.java
+++ b/src/main/java/org/apache/sysds/runtime/matrix/data/FrameBlock.java
@@ -2102,9 +2102,7 @@ public class FrameBlock implements CacheBlock,
Externalizable {
}
public FrameBlock map(String lambdaExpr) {
- if(!lambdaExpr.contains("->"))
- {
- //return map(getCompiledFunctionBlock(lambdaExpr));
+ if(!lambdaExpr.contains("->")) {
String args =
lambdaExpr.substring(lambdaExpr.indexOf('(') + 1, lambdaExpr.indexOf(')'));
if(args.contains(",")) {
String[] arguments = args.split(",");
@@ -2134,18 +2132,15 @@ public class FrameBlock implements CacheBlock,
Externalizable {
}
public static FrameMapFunction getCompiledFunction(String lambdaExpr) {
- String varname;
- String expr;
-
String cname = "StringProcessing"+CLASS_ID.getNextID();
StringBuilder sb = new StringBuilder();
-
-
String[] parts = lambdaExpr.split("->");
+
if( parts.length != 2 )
throw new DMLRuntimeException("Unsupported lambda
expression: "+lambdaExpr);
- varname = parts[0].trim();
- expr = parts[1].trim();
+
+ String varname = parts[0].trim();
+ String expr = parts[1].trim();
// construct class code
sb.append("import
org.apache.sysds.runtime.util.UtilFunctions;\n");
@@ -2158,7 +2153,7 @@ public class FrameBlock implements CacheBlock,
Externalizable {
// compile class, and create FrameMapFunction object
try {
return (FrameMapFunction) CodegenUtils
- .compileClass(cname,
sb.toString()).newInstance();
+ .compileClass(cname,
sb.toString()).newInstance();
}
catch(InstantiationException | IllegalAccessException e) {
throw new DMLRuntimeException("Failed to compile
FrameMapFunction.", e);
@@ -2167,13 +2162,9 @@ public class FrameBlock implements CacheBlock,
Externalizable {
public FrameBlockMapFunction getCompiledFunctionBlock(String
lambdaExpression) {
- // split lambda expression
- String expr;
-
String cname = "StringProcessing"+CLASS_ID.getNextID();
StringBuilder sb = new StringBuilder();
-
- expr = lambdaExpression;
+ String expr = lambdaExpression;
sb.append("import
org.apache.sysds.runtime.util.UtilFunctions;\n");
sb.append("import
org.apache.sysds.runtime.matrix.data.FrameBlock.FrameBlockMapFunction;\n");
diff --git a/src/main/java/org/apache/sysds/runtime/util/DMVUtils.java
b/src/main/java/org/apache/sysds/runtime/util/DMVUtils.java
index e850d01..95ce669 100644
--- a/src/main/java/org/apache/sysds/runtime/util/DMVUtils.java
+++ b/src/main/java/org/apache/sysds/runtime/util/DMVUtils.java
@@ -19,13 +19,13 @@
package org.apache.sysds.runtime.util;
-import org.apache.commons.collections.map.HashedMap;
+import org.apache.sysds.runtime.DMLRuntimeException;
import org.apache.sysds.runtime.matrix.data.FrameBlock;
import java.util.ArrayList;
import java.util.HashMap;
-import java.util.Iterator;
import java.util.Map;
+import java.util.Map.Entry;
public class DMVUtils {
public static final char DIGIT = 'd';
@@ -37,20 +37,17 @@ public class DMVUtils {
public static final char OTHER = 'y';
public static final char ARBITRARY_LEN = '+';
public static final char MINUS = '-';
- public static String DISGUISED_VAL = "";
public enum LEVEL_ENUM { LEVEL1, LEVEL2, LEVEL3, LEVEL4, LEVEL5, LEVEL6}
public static FrameBlock syntacticalPatternDiscovery(FrameBlock frame,
double threshold, String disguised_value) {
-
// Preparation
- DISGUISED_VAL = disguised_value;
+ String disguisedVal = disguised_value;
int numCols = frame.getNumColumns();
int numRows = frame.getNumRows();
- ArrayList<Map<String, Integer>> table_Hist = new
ArrayList(numCols); // list of every column with values and their frequency
+ ArrayList<Map<String, Integer>> table_Hist = new
ArrayList<>(numCols); // list of every column with values and their frequency
- int idx;
- for (idx = 0; idx < numCols; idx++) {
+ for (int idx = 0; idx < numCols; idx++) {
Object c = frame.getColumnData(idx);
String[] column = (String[]) c;
String key = "";
@@ -61,10 +58,10 @@ public class DMVUtils {
}
// Syntactic Pattern Discovery
- idx = -1;
+ int idx = -1;
for (Map<String, Integer> col_Hist : table_Hist) {
idx++;
- Map<String, Double> dominant_patterns_ratio = new
HashedMap();
+ Map<String, Double> dominant_patterns_ratio = new
HashMap<>();
Map<String, Integer> prev_pattern_hist = col_Hist;
for(LEVEL_ENUM level : LEVEL_ENUM.values()) {
dominant_patterns_ratio.clear();
@@ -72,7 +69,7 @@ public class DMVUtils {
dominant_patterns_ratio =
calculatePatternsRatio(current_pattern_hist, numRows);
String dominant_pattern =
findDominantPattern(dominant_patterns_ratio, threshold);
if(dominant_pattern != null) { //found pattern
- detectDisguisedValues(dominant_pattern,
frame.getColumnData(idx), idx, frame, level);
+ detectDisguisedValues(dominant_pattern,
frame.getColumnData(idx), idx, frame, level, disguisedVal);
break;
}
prev_pattern_hist = current_pattern_hist;
@@ -83,13 +80,10 @@ public class DMVUtils {
public static Map<String, Double> calculatePatternsRatio(Map<String,
Integer> patterns_hist, int nr_entries) {
- Map<String, Double> patterns_ratio_map = new HashedMap();
- Iterator it = patterns_hist.entrySet().iterator();
- while(it.hasNext()) {
- Map.Entry pair = (Map.Entry) it.next();
- String pattern = (String) pair.getKey();
- Double nr_occurences = new
Double((Integer)pair.getValue());
-
+ Map<String, Double> patterns_ratio_map = new HashMap<>();
+ for(Entry<String, Integer> e : patterns_hist.entrySet()) {
+ String pattern = e.getKey();
+ double nr_occurences = e.getValue();
double current_ratio = nr_occurences / nr_entries; //
percentage of current pattern in column
patterns_ratio_map.put(pattern, current_ratio);
}
@@ -97,16 +91,11 @@ public class DMVUtils {
}
public static String findDominantPattern(Map<String, Double>
dominant_patterns, double threshold) {
-
- Iterator it = dominant_patterns.entrySet().iterator();
- while(it.hasNext()) {
- Map.Entry pair = (Map.Entry) it.next();
- String pattern = (String) pair.getKey();
- Double pattern_ratio = (Double)pair.getValue();
-
+ for(Entry<String, Double> e : dominant_patterns.entrySet()) {
+ String pattern = e.getKey();
+ Double pattern_ratio = e.getValue();
if(pattern_ratio > threshold)
return pattern;
-
}
return null;
}
@@ -119,28 +108,24 @@ public class DMVUtils {
return;
}
- if (!(maps.get(idx).containsKey(key))) {
+ if (!(maps.get(idx).containsKey(key)))
maps.get(idx).put(key, 1);
- } else {
+ else
maps.get(idx).compute(key, (k, v) -> v + 1);
- }
}
private static void addDistinctValueOrIncrementCounter(Map<String,
Integer> map, String encoded_value, Integer nr_occurrences) {
- if (!(map.containsKey(encoded_value))) {
+ if (!(map.containsKey(encoded_value)))
map.put(encoded_value, nr_occurrences);
- } else {
+ else
map.compute(encoded_value, (k, v) -> v +
nr_occurrences);
- }
}
public static Map<String, Integer> LevelsExecutor(Map<String, Integer>
old_pattern_hist, LEVEL_ENUM level) {
- Map<String, Integer> new_pattern_hist = new HashedMap();
- Iterator it = old_pattern_hist.entrySet().iterator();
- while (it.hasNext()) {
- Map.Entry pair = (Map.Entry) it.next();
- String pattern = (String) pair.getKey();
- Integer nr_of_occurrences = (Integer)pair.getValue();
+ Map<String, Integer> new_pattern_hist = new HashMap<>();
+ for(Entry<String, Integer> e : old_pattern_hist.entrySet()) {
+ String pattern = e.getKey();
+ Integer nr_of_occurrences = e.getValue();
String new_pattern;
switch(level) {
@@ -219,7 +204,6 @@ public class DMVUtils {
return tmp.toString();
}
-
public static String removeUpperLowerCase(String pattern) {
char[] chars = pattern.toCharArray();
StringBuilder tmp = new StringBuilder();
@@ -290,7 +274,7 @@ public class DMVUtils {
}
private static void detectDisguisedValues(String dom_pattern, Object
col, int col_idx,
- FrameBlock frameBlock, LEVEL_ENUM level)
+ FrameBlock frameBlock, LEVEL_ENUM level, String disguisedVal)
{
int row_idx = -1;
String pattern = "";
@@ -329,13 +313,14 @@ public class DMVUtils {
pattern =
removeInnerCharacterInPattern(pattern, DIGIT, DOT);
pattern =
removeInnerCharacterInPattern(pattern, ALPHA, SPACE);
pattern =
acceptNegativeNumbersAsDigits(pattern);
+ break;
default:
- //System.out.println("Could not find
suitable level");
+ throw new DMLRuntimeException("Could
not find suitable level");
}
row_idx++;
- if(pattern.equals(dom_pattern)) continue;
-// System.out.println("[" + level +"] Disguised value: " +
frameBlock.get(row_idx, col_idx) + " (c=" + col_idx + ",r=" + row_idx + ")");
- frameBlock.set(row_idx, col_idx, DISGUISED_VAL);
+ if(pattern.equals(dom_pattern))
+ continue;
+ frameBlock.set(row_idx, col_idx, disguisedVal);
}
}
}
diff --git
a/src/test/java/org/apache/sysds/test/functions/builtin/BuiltinDMVTest.java
b/src/test/java/org/apache/sysds/test/functions/builtin/BuiltinDMVTest.java
index 10f4143..ccfabbf 100644
--- a/src/test/java/org/apache/sysds/test/functions/builtin/BuiltinDMVTest.java
+++ b/src/test/java/org/apache/sysds/test/functions/builtin/BuiltinDMVTest.java
@@ -35,166 +35,156 @@ import org.apache.sysds.test.TestUtils;
public class BuiltinDMVTest extends AutomatedTestBase {
- private final static String TEST_NAME = "disguisedMissingValue";
- private final static String TEST_DIR = "functions/builtin/";
- private static final String TEST_CLASS_DIR = TEST_DIR +
BuiltinOutlierTest.class.getSimpleName() + "/";
-
- @BeforeClass
- public static void init() {
- TestUtils.clearDirectory(TEST_DATA_DIR + TEST_CLASS_DIR);
- }
-
- @AfterClass
- public static void cleanUp() {
- if (TEST_CACHE_ENABLED) {
- TestUtils.clearDirectory(TEST_DATA_DIR + TEST_CLASS_DIR);
- }
- }
-
- @Override
- public void setUp() {
- TestUtils.clearAssertionInformation();
- addTestConfiguration(TEST_NAME,new TestConfiguration(TEST_CLASS_DIR,
TEST_NAME,new String[]{"B"}));
- if (TEST_CACHE_ENABLED) {
- setOutAndExpectedDeletionDisabled(true);
- }
- }
-
- @Test
- public void NormalStringFrameTest() {
- FrameBlock f = generateRandomFrameBlock(1000, 4,null);
- String[] disguised_values = new String[]{"?", "9999", "?", "9999"};
- ArrayList<List<Integer>> positions = getDisguisedPositions(f, 4,
disguised_values);
- runMissingValueTest(f, ExecType.CP, 0.8, "DMV", positions);
- }
-
- @Test
- public void PreDefinedStringsFrameTest() {
- String[] testarray0 = new String[]{"77","77","55","89","43", "99",
"46"}; // detect Weg
- String[] testarray1 = new
String[]{"8010","9999","8456","4565","89655", "86542", "45624"}; // detect ?
- String[] testarray2 = new String[]{"David K","Valentin E","Patrick
L","VEVE","DK", "VE", "PL"}; // detect 45
- String[] testarray3 = new
String[]{"3.42","45","0.456",".45","4589.245", "97", "33"}; // detect ka
- String[] testarray4 = new String[]{"99","123","158","146","158",
"174", "201"}; // detect 9999
-
- String[][] teststrings = new String[][]{testarray0, testarray1,
testarray2, testarray3, testarray4};
- FrameBlock f = generateRandomFrameBlock(7, 5, teststrings);
- String[] disguised_values = new String[]{"Patrick-Lovric-Weg-666",
"?", "45", "ka", "9999"};
- ArrayList<List<Integer>> positions = getDisguisedPositions(f, 1,
disguised_values);
- runMissingValueTest(f, ExecType.CP, 0.7,"NA", positions);
- }
-
- @Test
- public void PreDefinedDoubleFrame() {
- Double[] test_val = new Double[10000];
- for(int i = 0; i < test_val.length; i++) {
- test_val[i] = TestUtils.getPositiveRandomDouble();
- }
- String[] test_string = new String[test_val.length];
- for(int j = 0; j < test_val.length; j++) {
- test_string[j] = test_val[j].toString();
- }
-
- String[][] teststrings = new String[][]{test_string};
- FrameBlock f = generateRandomFrameBlock(test_string.length, 1,
teststrings);
- String[] disguised_values = new String[]{"9999999999"};
- ArrayList<List<Integer>> positions = getDisguisedPositions(f, 10,
disguised_values);
- runMissingValueTest(f, ExecType.CP, 0.6, "-1", positions);
- }
-
- private void runMissingValueTest(FrameBlock test_frame, ExecType et,
Double threshold, String replacement,
- ArrayList<List<Integer>> positions)
- {
- Types.ExecMode platformOld = setExecMode(et);
-
- try {
- getAndLoadTestConfiguration(TEST_NAME);
-
- String HOME = SCRIPT_DIR + TEST_DIR;
- fullDMLScriptName = HOME + TEST_NAME + ".dml";
- programArgs = new String[] {"-nvargs", "F=" + input("F"), "O=" +
output("O"),
- "threshold=" + threshold, "replacement=" + replacement
- };
-
- FrameWriterFactory.createFrameWriter(Types.FileFormat.CSV).
- writeFrameToHDFS(test_frame, input("F"),
test_frame.getNumRows(), test_frame.getNumColumns());
-
- runTest(true, false, null, -1);
-
- FrameBlock outputFrame = readDMLFrameFromHDFS("O",
Types.FileFormat.CSV);
-
- for(int i = 0; i < positions.size(); i++) {
- String[] output = (String[]) outputFrame.getColumnData(i);
- for(int j = 0; j < positions.get(i).size(); j++) {
- if(replacement.equals("NA")) {
- TestUtils.compareScalars(null,
output[positions.get(i).get(j)]);
- }
- else {
- TestUtils.compareScalars(replacement,
output[positions.get(i).get(j)]);
- }
- }
- }
- }
- catch (Exception ex) {
- throw new RuntimeException(ex);
- }
- finally {
- resetExecMode(platformOld);
- }
- }
-
- private FrameBlock generateRandomFrameBlock(int rows, int cols, String[][]
defined_strings)
- {
- Types.ValueType[] schema = new Types.ValueType[cols];
- for(int i = 0; i < cols; i++) {
- schema[i] = Types.ValueType.STRING;
- }
-
- if(defined_strings != null)
- {
- String[] names = new String[cols];
- for(int i = 0; i < cols; i++)
- names[i] = schema[i].toString();
- FrameBlock frameBlock = new FrameBlock(schema, names);
- frameBlock.ensureAllocatedColumns(rows);
- for(int row = 0; row < rows; row++)
- for(int col = 0; col < cols; col++)
- frameBlock.set(row, col, defined_strings[col][row]);
- return frameBlock;
- }
- return TestUtils.generateRandomFrameBlock(rows, cols, schema
,TestUtils.getPositiveRandomInt());
- }
-
- private ArrayList<List<Integer>> getDisguisedPositions(FrameBlock frame,
int amountValues, String[] disguisedValue)
- {
- ArrayList<List<Integer>> positions = new ArrayList<>();
- int counter;
- for(int i = 0; i < frame.getNumColumns(); i++)
- {
- counter = 0;
- List<Integer> arrayToFill = new ArrayList<>();
- while(counter < frame.getNumRows() && counter < amountValues)
- {
- int position = TestUtils.getPositiveRandomInt() %
frame.getNumRows();
- while(counter != 0 && arrayToFill.contains(position))
- {
- position = (position + TestUtils.getPositiveRandomInt() +
5) % frame.getNumRows();
- }
- arrayToFill.add(position);
- if(disguisedValue.length > 1)
- {
- frame.set(position, i, disguisedValue[i]);
- }
- else if (disguisedValue.length == 1)
- {
- frame.set(position, i, disguisedValue[0]);
- }
-
- counter++;
- }
- positions.add(i, arrayToFill);
- }
-
- return positions;
- }
-
+ private final static String TEST_NAME = "disguisedMissingValue";
+ private final static String TEST_DIR = "functions/builtin/";
+ private static final String TEST_CLASS_DIR = TEST_DIR +
BuiltinOutlierTest.class.getSimpleName() + "/";
+
+ @BeforeClass
+ public static void init() {
+ TestUtils.clearDirectory(TEST_DATA_DIR + TEST_CLASS_DIR);
+ }
+
+ @AfterClass
+ public static void cleanUp() {
+ if (TEST_CACHE_ENABLED) {
+ TestUtils.clearDirectory(TEST_DATA_DIR +
TEST_CLASS_DIR);
+ }
+ }
+
+ @Override
+ public void setUp() {
+ TestUtils.clearAssertionInformation();
+ addTestConfiguration(TEST_NAME,new
TestConfiguration(TEST_CLASS_DIR, TEST_NAME,new String[]{"B"}));
+ if (TEST_CACHE_ENABLED) {
+ setOutAndExpectedDeletionDisabled(true);
+ }
+ }
+
+ @Test
+ public void NormalStringFrameTest() {
+ FrameBlock f = generateRandomFrameBlock(1000, 4,null);
+ String[] disguised_values = new String[]{"?", "9999", "?",
"9999"};
+ ArrayList<List<Integer>> positions = getDisguisedPositions(f,
4, disguised_values);
+ runMissingValueTest(f, ExecType.CP, 0.8, "DMV", positions);
+ }
+
+ @Test
+ public void PreDefinedStringsFrameTest() {
+ String[] testarray0 = new String[]{"77","77","55","89","43",
"99", "46"}; // detect Weg
+ String[] testarray1 = new
String[]{"8010","9999","8456","4565","89655", "86542", "45624"}; // detect ?
+ String[] testarray2 = new String[]{"David K","Valentin
E","Patrick L","VEVE","DK", "VE", "PL"}; // detect 45
+ String[] testarray3 = new
String[]{"3.42","45","0.456",".45","4589.245", "97", "33"}; // detect ka
+ String[] testarray4 = new
String[]{"99","123","158","146","158", "174", "201"}; // detect 9999
+
+ String[][] teststrings = new String[][]{testarray0, testarray1,
testarray2, testarray3, testarray4};
+ FrameBlock f = generateRandomFrameBlock(7, 5, teststrings);
+ String[] disguised_values = new
String[]{"Patrick-Lovric-Weg-666", "?", "45", "ka", "9999"};
+ ArrayList<List<Integer>> positions = getDisguisedPositions(f,
1, disguised_values);
+ runMissingValueTest(f, ExecType.CP, 0.7,"NA", positions);
+ }
+
+ @Test
+ public void PreDefinedDoubleFrame() {
+ Double[] test_val = new Double[10000];
+ for(int i = 0; i < test_val.length; i++) {
+ test_val[i] = TestUtils.getPositiveRandomDouble();
+ }
+ String[] test_string = new String[test_val.length];
+ for(int j = 0; j < test_val.length; j++) {
+ test_string[j] = test_val[j].toString();
+ }
+
+ String[][] teststrings = new String[][]{test_string};
+ FrameBlock f = generateRandomFrameBlock(test_string.length, 1,
teststrings);
+ String[] disguised_values = new String[]{"9999999999"};
+ ArrayList<List<Integer>> positions = getDisguisedPositions(f,
10, disguised_values);
+ runMissingValueTest(f, ExecType.CP, 0.6, "-1", positions);
+ }
+
+ private void runMissingValueTest(FrameBlock test_frame, ExecType et,
Double threshold, String replacement,
+ ArrayList<List<Integer>> positions)
+ {
+ Types.ExecMode platformOld = setExecMode(et);
+
+ try {
+ getAndLoadTestConfiguration(TEST_NAME);
+
+ String HOME = SCRIPT_DIR + TEST_DIR;
+ fullDMLScriptName = HOME + TEST_NAME + ".dml";
+ programArgs = new String[] {"-nvargs", "F=" +
input("F"),
+ "O=" + output("O"), "threshold=" + threshold,
"replacement=" + replacement};
+
+
FrameWriterFactory.createFrameWriter(Types.FileFormat.CSV).
+ writeFrameToHDFS(test_frame,
input("F"), test_frame.getNumRows(), test_frame.getNumColumns());
+
+ runTest(true, false, null, -1);
+
+ FrameBlock outputFrame = readDMLFrameFromHDFS("O",
Types.FileFormat.CSV);
+
+ for(int i = 0; i < positions.size(); i++) {
+ String[] output = (String[])
outputFrame.getColumnData(i);
+ for(int j = 0; j < positions.get(i).size();
j++) {
+ if(replacement.equals("NA")) {
+ TestUtils.compareScalars(null,
output[positions.get(i).get(j)]);
+ }
+ else {
+ TestUtils.compareScalars(replacement,
output[positions.get(i).get(j)]);
+ }
+ }
+ }
+ }
+ catch (Exception ex) {
+ throw new RuntimeException(ex);
+ }
+ finally {
+ resetExecMode(platformOld);
+ }
+ }
+
+ private static FrameBlock generateRandomFrameBlock(int rows, int cols,
String[][] defined_strings)
+ {
+ Types.ValueType[] schema = new Types.ValueType[cols];
+ for(int i = 0; i < cols; i++) {
+ schema[i] = Types.ValueType.STRING;
+ }
+
+ if(defined_strings != null) {
+ String[] names = new String[cols];
+ for(int i = 0; i < cols; i++)
+ names[i] = schema[i].toString();
+ FrameBlock frameBlock = new FrameBlock(schema, names);
+ frameBlock.ensureAllocatedColumns(rows);
+ for(int row = 0; row < rows; row++)
+ for(int col = 0; col < cols; col++)
+ frameBlock.set(row, col,
defined_strings[col][row]);
+ return frameBlock;
+ }
+ return TestUtils.generateRandomFrameBlock(rows, cols, schema
,TestUtils.getPositiveRandomInt());
+ }
+
+ private static ArrayList<List<Integer>>
getDisguisedPositions(FrameBlock frame,
+ int amountValues, String[] disguisedValue)
+ {
+ ArrayList<List<Integer>> positions = new ArrayList<>();
+ int counter;
+ for(int i = 0; i < frame.getNumColumns(); i++) {
+ counter = 0;
+ List<Integer> arrayToFill = new ArrayList<>();
+ while(counter < frame.getNumRows() && counter <
amountValues) {
+ int position = TestUtils.getPositiveRandomInt()
% frame.getNumRows();
+ while(counter != 0 &&
arrayToFill.contains(position)) {
+ position = (position +
TestUtils.getPositiveRandomInt() + 5) % frame.getNumRows();
+ }
+ arrayToFill.add(position);
+ if(disguisedValue.length > 1)
+ frame.set(position, i,
disguisedValue[i]);
+ else if (disguisedValue.length == 1)
+ frame.set(position, i,
disguisedValue[0]);
+ counter++;
+ }
+ positions.add(i, arrayToFill);
+ }
+
+ return positions;
+ }
}