in src/main/java/org/apache/sysds/runtime/iogen/RawIndex.java [44:143]
public RawIndex(String raw) {
this.raw = raw;
this.rawLength = raw.length();
this.numberBitSet = new BitSet(rawLength);
this.dotBitSet = new BitSet(rawLength);
this.eBitSet = new BitSet(rawLength);
this.plusMinusBitSet = new BitSet(rawLength);
this.reservedPositions = new BitSet(rawLength);
this.backupReservedPositions = new BitSet(rawLength);
this.actualNumericValues = null;
this.dotActualNumericValues = null;
this.dotEActualNumericValues = new HashMap<>();
for(int i = 0; i < this.rawLength; i++) {
switch(raw.charAt(i)) {
case '0':
case '1':
case '2':
case '3':
case '4':
case '5':
case '6':
case '7':
case '8':
case '9':
this.numberBitSet.set(i);
break;
case '+':
case '-':
this.plusMinusBitSet.set(i);
break;
case '.':
this.dotBitSet.set(i);
break;
case 'e':
case 'E':
this.eBitSet.set(i);
break;
}
}
// Clean unnecessary sets
// Clean for "."
for(int i = dotBitSet.nextSetBit(0); i != -1; i = dotBitSet.nextSetBit(i + 1)) {
boolean flag = false;
if(i > 0) {
if(i < rawLength - 2) {
flag = !numberBitSet.get(i - 1) && !numberBitSet.get(i + 1) && !plusMinusBitSet.get(i + 1) && !eBitSet.get(i + 1);
}
}
else if(i == rawLength - 1) {
flag = !numberBitSet.get(i - 1);
}
else if(i == 0) {
if(i < rawLength - 2) {
flag = !numberBitSet.get(i + 1) && !plusMinusBitSet.get(i + 1) && !eBitSet.get(i + 1);
}
else if(i == rawLength - 1) {
flag = true;
}
}
if(flag)
dotBitSet.set(i, false);
}
// Clean for "+/-"
for(int i = plusMinusBitSet.nextSetBit(0); i != -1; i = plusMinusBitSet.nextSetBit(i + 1)) {
boolean flag;
if(i < rawLength - 1) {
flag = numberBitSet.get(i + 1);
if(!flag && i < rawLength - 2)
flag = dotBitSet.get(i + 1) && numberBitSet.get(i + 2);
}
else {
flag = false;
}
if(!flag)
plusMinusBitSet.set(i, false);
}
// Clean for "e/E"
for(int i = eBitSet.nextSetBit(0); i != -1; i = eBitSet.nextSetBit(i + 1)) {
boolean flag = false;
if((i == 1 && !numberBitSet.get(0)) || i == 0 || i == rawLength - 1) {
flag = false;
}
else if(i > 1 && i < rawLength - 2) {
flag = numberBitSet.get(i - 1) || (numberBitSet.get(i - 2) && dotBitSet.get(i - 1));
if(flag)
flag = numberBitSet.get(i + 1) || (numberBitSet.get(i + 2) && plusMinusBitSet.get(i + 1));
}
else if(i == rawLength - 2) {
flag = numberBitSet.get(rawLength - 1);
}
if(!flag)
eBitSet.set(i, false);
}
if(numberBitSet.cardinality() > 0)
extractNumericDotEActualValues();
}