Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
79 commits
Select commit Hold shift + click to select a range
8d74800
carry over changes from sparseRows branch
Twolvero May 31, 2025
1eb446e
carry over changes from sparseRows branch
Twolvero May 31, 2025
7ebfd5f
implement DIV for scalarVector
Twolvero Jun 3, 2025
1a75704
adjust templates, so that DIV for scalarVector works
Twolvero Jun 3, 2025
f193ecb
fix sparse vector allocation
Twolvero Jun 4, 2025
7646eaa
add div to primitive tests and change primitives signature
Twolvero Jun 17, 2025
05561f2
optimize primitives
Twolvero Jun 18, 2025
36d9e7b
xor signature change
Twolvero Jun 18, 2025
6887783
optimize Equal, Notequal, Max
Twolvero Jun 18, 2025
c7deeb3
notEqual vec-vec implementation
Twolvero Jun 18, 2025
6fdea69
change signature of all primitives
Twolvero Jun 18, 2025
1fe5863
Merge branch 'Sparse-Row-Primitives' into Sparse-Row-Optimizer
Twolvero Jun 19, 2025
bce4a83
Merge branch 'Sparse-Row-Templates' into Sparse-Row-Optimizer
Twolvero Jun 19, 2025
d3c341e
add rowAggPattern49 to test files
Twolvero Jun 19, 2025
45fd365
work in progress
Twolvero Jun 19, 2025
b29b831
delete previous optimizer
Twolvero Jun 20, 2025
8a9a3a0
implement new optimizer for the Binary template
Twolvero Jun 20, 2025
5e5b665
debug
Twolvero Jun 20, 2025
0ca0296
implement branchless vectDiv and vectMult
Twolvero Jun 23, 2025
1a52829
change int naming convention
Twolvero Jun 23, 2025
959d076
cleanup code
Twolvero Jun 23, 2025
207c375
cleanup code
Twolvero Jun 23, 2025
193921a
literal val parse
Twolvero Jun 30, 2025
13db23f
literal val parse
Twolvero Jun 30, 2025
b14986b
implement BinaryOp and UnaryOp optimizer
Twolvero Jun 30, 2025
f574ea6
implement Unary Optimizer
Twolvero Jul 8, 2025
3f484b3
minor optimizations with the sparse row checks and correct mistake in…
Twolvero Jul 16, 2025
8926665
add vectMult for scalar-vector
Twolvero Jul 17, 2025
ecd9ffc
Merge branch 'Sparse-Row-Primitives' into Sparse-Row-Optimizer
Twolvero Jul 17, 2025
388da85
Merge branch 'Sparse-Row-Templates' into Sparse-Row-Optimizer
Twolvero Jul 17, 2025
207df6e
minor changes
Twolvero Jul 17, 2025
e25a851
due to DMLScript.SPARSE_INTERMEDIATE getting checked inside getTempla…
Twolvero Jul 17, 2025
4045b0b
make Ternary.java be able to process STMP sparse inputs
Twolvero Jul 17, 2025
6b3446d
Merge branch 'Sparse-Row-Templates' into Sparse-Row-Optimizer
Twolvero Jul 17, 2025
516906c
change test
Twolvero Jul 18, 2025
6171562
debug pow primitive
Twolvero Jul 18, 2025
ea849a0
change worst case flag
Twolvero Jul 18, 2025
accf02d
adjust SparseRowVector allocation
Twolvero Jul 19, 2025
7d38144
debug Unary class
Twolvero Jul 20, 2025
c79ca0e
debug Unary class - missing "("
Twolvero Jul 21, 2025
455d7f9
Merge branch 'Sparse-Row-Templates' into Sparse-Row-Optimizer
Twolvero Jul 22, 2025
74fd20c
Merge branch 'Sparse-Row-Primitives' into Sparse-Row-Optimizer
Twolvero Jul 22, 2025
0e82e9c
only one check is needed
Twolvero Jul 24, 2025
0702611
adjust len info
Twolvero Jul 25, 2025
3ba64c2
adjust alloc test to new alloc implementation
Twolvero Jul 25, 2025
cc1be65
debug %SLEN% implementation
Twolvero Jul 25, 2025
a15857b
Merge branch 'Sparse-Row-Primitives' into Sparse-Row-Optimizer
Twolvero Jul 25, 2025
cf7d36d
Merge branch 'Sparse-Row-Templates' into Sparse-Row-Optimizer
Twolvero Jul 25, 2025
abdfac7
implement Unary optimizer
Twolvero Jul 25, 2025
e2323f8
adapt new LEN feature for sparse rows
Twolvero Jul 25, 2025
8ce70d8
implement optimizer for unary
Twolvero Jul 25, 2025
46d7449
implement new sparse intermediates for vectWrite
Twolvero Jul 25, 2025
497e111
implement new vectWrite that use sparse intermediates
Twolvero Jul 25, 2025
83e0520
Merge branch 'Sparse-Row-Primitives' into Sparse-Row-Optimizer
Twolvero Jul 25, 2025
e150efb
Merge branch 'Sparse-Row-Templates' into Sparse-Row-Optimizer
Twolvero Jul 25, 2025
87dcaee
adjust method signature
Twolvero Jul 25, 2025
9051ff6
adjust method signature
Twolvero Jul 25, 2025
884217d
Merge branch 'Sparse-Row-Templates' into Sparse-Row-Optimizer
Twolvero Jul 25, 2025
26f104a
Merge branch 'Sparse-Row-Primitives' into Sparse-Row-Optimizer
Twolvero Jul 25, 2025
64e7984
debug div method
Twolvero Jul 25, 2025
2306b33
Merge branch 'Sparse-Row-Primitives' into Sparse-Row-Optimizer
Twolvero Jul 25, 2025
8eff701
debug binary class
Twolvero Jul 25, 2025
834b673
delete branching with tail for loops
Twolvero Aug 13, 2025
b9191c7
j = 0 needs to be changed to j = ai
Twolvero Aug 13, 2025
577fbe4
adjust optimizer values. Changed optimizer to be less harsh, as the b…
Twolvero Aug 13, 2025
d5c4b5f
update vect-vect primitives with branchless versions
Twolvero Aug 13, 2025
b3d4d6f
Merge branch 'Sparse-Row-Primitives' into Sparse-Row-Optimizer
Twolvero Aug 13, 2025
e3b3eba
correct Optimizer functionality
Twolvero Aug 13, 2025
7b5ccc5
debug vectMultWrite
Twolvero Aug 13, 2025
871732c
Merge branch 'Sparse-Row-Templates' into Sparse-Row-Optimizer
Twolvero Aug 13, 2025
e50fa72
minor value changes
Twolvero Aug 14, 2025
c086be7
create new test class
Twolvero Aug 14, 2025
e5943a3
debug setupSparseThreadLocalMem
Twolvero Aug 19, 2025
c761d8f
debug alen/blen replacement on vector-vector primitives
Twolvero Aug 19, 2025
7bca4e3
Merge branch 'Sparse-Row-Templates' into Sparse-Row-Optimizer
Twolvero Aug 19, 2025
bb9ab3b
Merge branch 'Sparse-Row-Primitives' into Sparse-Row-Optimizer
Twolvero Aug 19, 2025
304774b
debug unary primitives
Twolvero Aug 19, 2025
9c91268
Merge branch 'Sparse-Row-Primitives' into Sparse-Row-Optimizer
Twolvero Aug 19, 2025
63aac6b
add test case
Twolvero Aug 19, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 12 additions & 2 deletions src/main/java/org/apache/sysds/api/DMLOptions.java
Original file line number Diff line number Diff line change
Expand Up @@ -85,6 +85,7 @@ public class DMLOptions {
public boolean federatedCompilation = false; // Compile federated instructions based on input federation state and privacy constraints.
public boolean noFedRuntimeConversion = false; // If activated, no runtime conversion of CP instructions to FED instructions will be performed.
public int seed = -1; // The general seed for the execution, if -1 random (system time).
public boolean sparseIntermediate = false; // whether SparseRowIntermediates should be used for rowwise operations

public final static DMLOptions defaultOptions = new DMLOptions(null);

Expand Down Expand Up @@ -117,7 +118,8 @@ public String toString() {
", w=" + fedWorker +
", federatedCompilation=" + federatedCompilation +
", noFedRuntimeConversion=" + noFedRuntimeConversion +
", seed=" + seed +
", seed=" + seed +
", sparseIntermediate=" + sparseIntermediate +
'}';
}

Expand Down Expand Up @@ -350,6 +352,10 @@ else if (lineageType.equalsIgnoreCase("debugger"))
dmlOptions.seed = Integer.parseInt(line.getOptionValue("seed"));
}

if(line.hasOption("sparseIntermediate")){
dmlOptions.sparseIntermediate = true;
}

return dmlOptions;
}

Expand Down Expand Up @@ -431,7 +437,10 @@ private static Options createCLIOptions() {
Option commandlineSeed = OptionBuilder
.withDescription("A general seed for the execution through the commandline")
.hasArg().create("seed");

Option sparseRowIntermediates = OptionBuilder
.withDescription("If activated, sparseRowVector intermediates will be used to calculate rowwise operations.")
.create("sparseIntermediate");

options.addOption(configOpt);
options.addOption(cleanOpt);
options.addOption(statsOpt);
Expand All @@ -451,6 +460,7 @@ private static Options createCLIOptions() {
options.addOption(federatedCompilation);
options.addOption(noFedRuntimeConversion);
options.addOption(commandlineSeed);
options.addOption(sparseRowIntermediates);

// Either a clean(-clean), a file(-f), a script(-s) or help(-help) needs to be specified
OptionGroup fileOrScriptOpt = new OptionGroup()
Expand Down
4 changes: 4 additions & 0 deletions src/main/java/org/apache/sysds/api/DMLScript.java
Original file line number Diff line number Diff line change
Expand Up @@ -153,6 +153,9 @@ public class DMLScript
// Global seed
public static int SEED = -1;

// Sparse row flag
public static boolean SPARSE_INTERMEDIATE = false;

public static String MONITORING_ADDRESS = null;

// flag that indicates whether or not to suppress any prints to stdout
Expand Down Expand Up @@ -275,6 +278,7 @@ public static boolean executeScript( String[] args )
LINEAGE_ESTIMATE = dmlOptions.lineage_estimate;
LINEAGE_DEBUGGER = dmlOptions.lineage_debugger;
SEED = dmlOptions.seed;
SPARSE_INTERMEDIATE = dmlOptions.sparseIntermediate;


String fnameOptConfig = dmlOptions.configFile;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -470,7 +470,7 @@ public static Hop optimize( Hop root, boolean recompile ) {
* @param recompile true if invoked during dynamic recompilation
* @return dag root nodes of modified dag
*/
public static ArrayList<Hop> optimize(ArrayList<Hop> roots, boolean recompile)
public static ArrayList<Hop> optimize(ArrayList<Hop> roots, boolean recompile)
{
if( roots == null || roots.isEmpty() )
return roots;
Expand Down
20 changes: 18 additions & 2 deletions src/main/java/org/apache/sysds/hops/codegen/cplan/CNode.java
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@

package org.apache.sysds.hops.codegen.cplan;

import org.apache.sysds.api.DMLScript;
import org.apache.sysds.common.Types.DataType;
import org.apache.sysds.hops.codegen.SpoofCompiler.GeneratorAPI;
import org.apache.sysds.hops.codegen.template.TemplateUtils;
Expand Down Expand Up @@ -77,6 +78,14 @@ public String createVarname() {
_genVar = "TMP"+_seqVar.getNextID();
return _genVar;
}

public String createVarname(boolean sparse) {
if(!sparse) {
return createVarname();
} else {
return _genVar = "S" + createVarname();
}
}

public String getVarname() {
return _genVar;
Expand All @@ -98,6 +107,8 @@ public String getVectorLength(GeneratorAPI api) {
return "len";
if(getVarname().startsWith("b"))
return getVarname() + ".clen";
else if(getVarname().startsWith("STMP"))
return "len";
else if(_dataType == DataType.MATRIX)
return getVarname() + ".length";
}
Expand Down Expand Up @@ -222,8 +233,13 @@ public boolean equals(Object that) {

protected String replaceUnaryPlaceholders(String tmp, String varj, boolean vectIn, GeneratorAPI api) {
//replace sparse and dense inputs
tmp = tmp.replace("%IN1v%", varj+"vals");
tmp = tmp.replace("%IN1i%", varj+"ix");
if(DMLScript.SPARSE_INTERMEDIATE) {
tmp = tmp.replace("%IN1v%", varj.startsWith("STMP") ? varj+".values()" : varj+"vals");
tmp = tmp.replace("%IN1i%", varj.startsWith("STMP") ? varj+".indexes()" :varj+"ix");
} else {
tmp = tmp.replace("%IN1v%", varj+"vals");
tmp = tmp.replace("%IN1i%", varj+"ix");
}
tmp = tmp.replace("%IN1%",
(vectIn && TemplateUtils.isMatrix(_inputs.get(0))) ?
((api == GeneratorAPI.JAVA) ? varj + ".values(rix)" : varj + ".vals(0)" ) :
Expand Down
197 changes: 169 additions & 28 deletions src/main/java/org/apache/sysds/hops/codegen/cplan/CNodeBinary.java
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@
import java.util.Arrays;

import org.apache.commons.lang3.StringUtils;
import org.apache.sysds.api.DMLScript;
import org.apache.sysds.common.Opcodes;
import org.apache.sysds.hops.codegen.template.TemplateUtils;
import org.apache.sysds.common.Types.DataType;
Expand Down Expand Up @@ -126,7 +127,8 @@ public boolean isNotSupportedBySpoofCUDA() {
}

private final BinType _type;

private boolean sparseTemplate;

public CNodeBinary( CNode in1, CNode in2, BinType type ) {
//canonicalize commutative matrix-scalar operations
//to increase reuse potential
Expand All @@ -143,6 +145,23 @@ public CNodeBinary( CNode in1, CNode in2, BinType type ) {
setOutputDims();
}

public CNodeBinary( CNode in1, CNode in2, BinType type, double sparsityEst, double scalarVal ) {
//canonicalize commutative matrix-scalar operations
//to increase reuse potential
if( type.isCommutative() && in1 instanceof CNodeData
&& in1.getDataType()==DataType.SCALAR ) {
CNode tmp = in1;
in1 = in2;
in2 = tmp;
}

_inputs.add(in1);
_inputs.add(in2);
_type = type;
setOutputDims();
sparseTemplate = getTemplateType(sparsityEst, scalarVal);
}

public BinType getType() {
return _type;
}
Expand All @@ -157,60 +176,63 @@ public String codegen(boolean sparse, GeneratorAPI api) {
//generate children
sb.append(_inputs.get(0).codegen(sparse, api));
sb.append(_inputs.get(1).codegen(sparse, api));

//generate binary operation (use sparse template, if data input)
boolean lsparseLhs = sparse && _inputs.get(0) instanceof CNodeData
&& _inputs.get(0).getVarname().startsWith("a");
boolean lsparseRhs = sparse && _inputs.get(1) instanceof CNodeData
&& _inputs.get(1).getVarname().startsWith("a");
boolean lsparseLhs = sparse ? _inputs.get(0) instanceof CNodeData
&& _inputs.get(0).getVarname().startsWith("a") ||
_inputs.get(0).getVarname().startsWith("STMP") : false;
boolean lsparseRhs = sparse ? _inputs.get(1) instanceof CNodeData
&& _inputs.get(1).getVarname().startsWith("a") ||
_inputs.get(1).getVarname().startsWith("STMP") : false;
boolean scalarInput = _inputs.get(0).getDataType().isScalar();
boolean scalarVector = (_inputs.get(0).getDataType().isScalar()
&& _inputs.get(1).getDataType().isMatrix());
boolean vectorVector = _inputs.get(0).getDataType().isMatrix()
&& _inputs.get(1).getDataType().isMatrix();
String var = createVarname();
String var = createVarname(sparse && sparseTemplate && getOutputType(scalarVector, lsparseLhs, lsparseRhs));
String tmp = getLanguageTemplateClass(this, api)
.getTemplate(_type, lsparseLhs, lsparseRhs, scalarVector, scalarInput, vectorVector);
.getTemplate(_type, lsparseLhs, lsparseRhs, scalarVector, scalarInput, vectorVector, sparseTemplate);

tmp = tmp.replace("%TMP%", var);

//replace input references and start indexes
for( int j=0; j<2; j++ ) {
String varj = _inputs.get(j).getVarname(api);

//replace sparse and dense inputs
tmp = tmp.replace("%IN"+(j+1)+"v%", varj+"vals");
tmp = tmp.replace("%IN"+(j+1)+"i%", varj+"ix");
tmp = tmp.replace("%IN"+(j+1)+"v%", varj.startsWith("STMP") ? varj+".values()" : varj+"vals");
tmp = tmp.replace("%IN"+(j+1)+"i%", varj.startsWith("STMP") ? varj+".indexes()" : varj+"ix");
tmp = tmp.replace("%IN"+(j+1)+"%",
varj.startsWith("a") ? (api == GeneratorAPI.JAVA ? varj :
(_inputs.get(j).getDataType() == DataType.MATRIX ? varj + ".vals(0)" : varj)) :
varj.startsWith("b") ? (api == GeneratorAPI.JAVA ? varj + ".values(rix)" :
(_type == BinType.VECT_MATRIXMULT ? varj : varj + ".vals(0)")) :
_inputs.get(j).getDataType() == DataType.MATRIX ? (api == GeneratorAPI.JAVA ? varj : varj + ".vals(0)") : varj);

varj.startsWith("a") ? (api == GeneratorAPI.JAVA ? varj :
(_inputs.get(j).getDataType() == DataType.MATRIX ? varj + ".vals(0)" : varj)) :
varj.startsWith("b") ? (api == GeneratorAPI.JAVA ? varj + ".values(rix)" :
(_type == BinType.VECT_MATRIXMULT ? varj : varj + ".vals(0)")) :
_inputs.get(j).getDataType() == DataType.MATRIX ? (api == GeneratorAPI.JAVA ? varj : varj + ".vals(0)") : varj);

tmp = tmp.replace("%SLEN"+(j+1)+"%", varj.startsWith("STMP") ? varj+".size()" : varj.startsWith("a") ? "alen" : "blen");

//replace start position of main input
tmp = tmp.replace("%POS"+(j+1)+"%", (_inputs.get(j) instanceof CNodeData
&& _inputs.get(j).getDataType().isMatrix()) ? (!varj.startsWith("b")) ? varj+"i" :
((TemplateUtils.isMatrix(_inputs.get(j)) || (_type.isElementwise()
&& TemplateUtils.isColVector(_inputs.get(j)))) && _type!=BinType.VECT_MATRIXMULT) ?
tmp = tmp.replace("%POS"+(j+1)+"%", (_inputs.get(j) instanceof CNodeData
&& _inputs.get(j).getDataType().isMatrix()) ? (!varj.startsWith("b")) ? varj+"i" :
((TemplateUtils.isMatrix(_inputs.get(j)) || (_type.isElementwise()
&& TemplateUtils.isColVector(_inputs.get(j)))) && _type!=BinType.VECT_MATRIXMULT) ?
varj + ".pos(rix)" : "0" : "0");
}
//replace length information (e.g., after matrix mult)
if( _type == BinType.VECT_OUTERMULT_ADD || (_type == BinType.VECT_CBIND && vectorVector) ) {
if( _type == BinType.VECT_OUTERMULT_ADD || (_type == BinType.VECT_CBIND && vectorVector)) {
for( int j=0; j<2; j++ )
tmp = tmp.replace("%LEN"+(j+1)+"%", _inputs.get(j).getVectorLength(api));
}
else { //general case
else { //general case
CNode mInput = getIntermediateInputVector();
if( mInput != null )
tmp = tmp.replace("%LEN%", mInput.getVectorLength(api));
}

sb.append(tmp);

//mark as generated
_generated = true;

return sb.toString();
}

Expand All @@ -219,7 +241,126 @@ private CNode getIntermediateInputVector() {
if( getInput().get(i).getDataType().isMatrix() )
return getInput().get(i);
return null;
}
}

private boolean getTemplateType(double sparsityEst, double scalarVal) {
if(!DMLScript.SPARSE_INTERMEDIATE)
return false;
else {
switch(_type) {
case VECT_MULT:
case VECT_DIV:
case VECT_LESS:
case VECT_MINUS:
case VECT_PLUS:
case VECT_XOR:
case VECT_BITWAND:
case VECT_BIASADD:
case VECT_BIASMULT:
case VECT_MIN:
case VECT_MAX:
case VECT_NOTEQUAL:
case VECT_GREATER:
case VECT_EQUAL:
case VECT_LESSEQUAL:
case VECT_GREATEREQUAL: return sparsityEst < 0.1;
case VECT_MULT_SCALAR:
case VECT_DIV_SCALAR:
case VECT_XOR_SCALAR:
case VECT_BITWAND_SCALAR: return sparsityEst < 0.3;
case VECT_GREATER_SCALAR: {
if(scalarVal != Double.NaN) {
return _inputs.get(1).getDataType().isScalar() ? scalarVal >= 0 && sparsityEst < 0.2
: _inputs.get(0).getDataType().isScalar() && scalarVal < 0 && sparsityEst < 0.2;
} else
return false;
}
case VECT_GREATEREQUAL_SCALAR: {
if(scalarVal != Double.NaN) {
return _inputs.get(1).getDataType().isScalar() ? scalarVal > 0 && sparsityEst < 0.2
: _inputs.get(0).getDataType().isScalar() && scalarVal <= 0 && sparsityEst < 0.2;
} else
return false;
}
case VECT_MIN_SCALAR: {
if(scalarVal != Double.NaN) {
return _inputs.get(1).getDataType().isScalar() ? scalarVal >= 0 && sparsityEst < 0.2
: _inputs.get(0).getDataType().isScalar() && scalarVal >= 0 && sparsityEst < 0.2;
} else
return false;
}
case VECT_LESS_SCALAR: {
if(scalarVal != Double.NaN) {
return _inputs.get(1).getDataType().isScalar() ? scalarVal <= 0 && sparsityEst < 0.2
: _inputs.get(0).getDataType().isScalar() && scalarVal > 0 && sparsityEst < 0.2;
} else
return false;
}
case VECT_LESSEQUAL_SCALAR: {
if(scalarVal != Double.NaN) {
return _inputs.get(1).getDataType().isScalar() ? scalarVal < 0 && sparsityEst < 0.2
: _inputs.get(0).getDataType().isScalar() && scalarVal >= 0 && sparsityEst < 0.2;
} else
return false;
}
case VECT_MAX_SCALAR: {
if(scalarVal != Double.NaN) {
return _inputs.get(1).getDataType().isScalar() ? scalarVal <= 0 && sparsityEst < 0.2
: _inputs.get(0).getDataType().isScalar() && scalarVal <= 0 && sparsityEst < 0.2;
} else
return false;
}
case VECT_POW_SCALAR:
case VECT_EQUAL_SCALAR:{
if(scalarVal != Double.NaN) {
return _inputs.get(1).getDataType().isScalar() ? scalarVal != 0 && sparsityEst < 0.2
: _inputs.get(0).getDataType().isScalar() && scalarVal != 0 && sparsityEst < 0.2;
} else
return false;
}
case VECT_NOTEQUAL_SCALAR:{
if(scalarVal != Double.NaN) {
return _inputs.get(1).getDataType().isScalar() ? scalarVal == 0 && sparsityEst < 0.2
: _inputs.get(0).getDataType().isScalar() && scalarVal == 0 && sparsityEst < 0.2;
} else
return false;
}
default: return sparsityEst < 0.3;
}
}
}

public boolean getOutputType(boolean scalarVector, boolean lsparseLhs, boolean lsparseRhs) {
switch(_type) {
case VECT_POW_SCALAR: return !scalarVector && lsparseLhs;
case VECT_MULT_SCALAR:
case VECT_DIV_SCALAR:
case VECT_XOR_SCALAR:
case VECT_MIN_SCALAR:
case VECT_MAX_SCALAR:
case VECT_EQUAL_SCALAR:
case VECT_NOTEQUAL_SCALAR:
case VECT_LESS_SCALAR:
case VECT_LESSEQUAL_SCALAR:
case VECT_GREATER_SCALAR:
case VECT_GREATEREQUAL_SCALAR:
case VECT_BITWAND_SCALAR: return lsparseLhs || lsparseRhs;
case VECT_MULT:
case VECT_DIV:
case VECT_MINUS:
case VECT_PLUS:
case VECT_XOR:
case VECT_BITWAND:
case VECT_BIASADD:
case VECT_BIASMULT:
case VECT_MIN:
case VECT_MAX:
case VECT_NOTEQUAL:
case VECT_LESS:
case VECT_GREATER: return lsparseLhs && lsparseRhs;
default: return false;
}
}

@Override
public String toString() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -60,7 +60,10 @@ public String getTemplate(boolean sparseGen, long len, ArrayList<CNode> inputs,
sb.append( sparseInput ?
" LibSpoofPrimitives.vectWrite("+varj+"vals, %TMP%, "
+varj+"ix, "+pos+", "+off+", "+input._cols+");\n" :
" LibSpoofPrimitives.vectWrite("+(varj.startsWith("b")?varj+".values(rix)":varj)
varj.startsWith("STMP") ?
" LibSpoofPrimitives.vectWrite("+varj+".values(), %TMP%, "
+varj+".indexes(), "+pos+", "+off+", "+varj+".size());\n" :
" LibSpoofPrimitives.vectWrite("+(varj.startsWith("b")?varj+".values(rix)":varj)
+", %TMP%, "+pos+", "+off+", "+input._cols+");\n");
off += input._cols;
}
Expand Down
Loading
Loading