Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
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
10 changes: 6 additions & 4 deletions docs/site/dml-language-reference.md
Original file line number Diff line number Diff line change
Expand Up @@ -2068,10 +2068,12 @@ The following example uses <code>transformapply()</code> with the input matrix a

**Table F5**: Frame processing built-in functions

Function | Description | Parameters | Example
-------- | ----------- | ---------- | -------
map() | It will execute the given lambda expression on a frame (cell, row or column wise). | Input: (X &lt;frame&gt;, y &lt;String&gt;, \[margin &lt;int&gt;\]) <br/>Output: &lt;frame&gt;. <br/> X is a frame and <br/>y is a String containing the lambda expression to be executed on frame X. <br/> margin - how to apply the lambda expression (0 indicates each cell, 1 - rows, 2 - columns). Output matrix dimensions are always equal to the input. | [map](#map)
tokenize() | Transforms a frame to tokenized frame using specification. Tokenization is valid only for string columns. | Input:<br/> target = &lt;frame&gt; <br/> spec = &lt;json specification&gt; <br/> Outputs: &lt;matrix&gt;, &lt;frame&gt; | [tokenize](#tokenize)
Function | Description | Parameters | Example
-------- |-----------------------------------------------------------------------------------------------------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -------
map() | It will execute the given lambda expression on a frame (cell, row or column wise). | Input: (X &lt;frame&gt;, y &lt;String&gt;, \[margin &lt;int&gt;\]) <br/>Output: &lt;frame&gt;. <br/> X is a frame and <br/>y is a String containing the lambda expression to be executed on frame X. <br/> margin - how to apply the lambda expression (0 indicates each cell, 1 - rows, 2 - columns). Output matrix dimensions are always equal to the input. | [map](#map)
tokenize() | Transforms a frame to tokenized frame using specification. Tokenization is valid only for string columns. | Input:<br/> target = &lt;frame&gt; <br/> spec = &lt;json specification&gt; <br/> Outputs: &lt;matrix&gt;, &lt;frame&gt; | [tokenize](#tokenize)
getNames() | Returns the column names of a frame as a single-row frame. | Input: X &lt;frame&gt; <br/> Output: &lt;frame&gt; | N = getNames(X)
setNames() | Sets the column names of a frame from a single-row frame containing string values. | Input:<br/> X = &lt;frame&gt;<br/> N = &lt;frame&gt;<br/> Output:&lt;frame&gt; | Y = setNames(X, N)

#### map

Expand Down
2 changes: 2 additions & 0 deletions src/main/java/org/apache/sysds/common/Builtins.java
Original file line number Diff line number Diff line change
Expand Up @@ -154,6 +154,7 @@ public enum Builtins {
GARCH("garch", true),
GAUSSIAN_CLASSIFIER("gaussianClassifier", true),
GET_ACCURACY("getAccuracy", true),
GET_NAMES("getNames", false),
GET_CATEGORICAL_MASK("getCategoricalMask", false),
GLM("glm", true),
GLM_PREDICT("glmPredict", true),
Expand Down Expand Up @@ -310,6 +311,7 @@ public enum Builtins {
SELVARTHRESH("selectByVarThresh", true),
SEQ("seq", false),
SES("ses", true),
SET_NAMES("setNames", false),
SYMMETRICDIFFERENCE("symmetricDifference", true),
SHAPEXPLAINER("shapExplainer", true),
SHERLOCK("sherlock", true),
Expand Down
1 change: 1 addition & 0 deletions src/main/java/org/apache/sysds/common/Opcodes.java
Original file line number Diff line number Diff line change
Expand Up @@ -352,6 +352,7 @@ public enum Opcodes {
MAPPM("map+*", InstructionType.Binary),
MAPMINUSMULT("map-*", InstructionType.Binary),
MAPDROPINVALIDLENGTH("mapdropInvalidLength", InstructionType.Binary),
SET_COLNAMES("set_colnames", InstructionType.Binary),

MAPGT("map>", InstructionType.Binary),
MAPGE("map>=", InstructionType.Binary),
Expand Down
3 changes: 2 additions & 1 deletion src/main/java/org/apache/sysds/common/Types.java
Original file line number Diff line number Diff line change
Expand Up @@ -641,7 +641,8 @@ public enum OpOp2 {
MINUS1_MULT(false), //1-X*Y
GET_CATEGORICAL_MASK(false), // get transformation mask
QUANTIZE_COMPRESS(false), //quantization-fused compression
UNION_DISTINCT(false);
UNION_DISTINCT(false),
SET_COLNAMES(false);

private final boolean _validOuter;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1095,13 +1095,34 @@ else if( getAllExpr().length == 2 ) { //binary
case TYPEOF:
case DETECTSCHEMA:
case COLNAMES:
case GET_NAMES:
checkNumParameters(1);
checkMatrixFrameParam(getFirstExpr());
output.setDataType(DataType.FRAME);
output.setDimensions(1, id.getDim2());
output.setBlocksize (id.getBlocksize());
output.setValueType(ValueType.STRING);
break;
case SET_NAMES:
//check if we use 2 parameters (Frame on which nemas are set and vector for names)
checkNumParameters(2);

// check if first paramters is a frame
checkMatrixFrameParam(getFirstExpr());

// check if second paramters is a vector 1xn Frame
checkMatrixFrameParam(getSecondExpr());

//output should be a frame
output.setDataType(DataType.FRAME);


checkMatrixFrameParam(getFirstExpr());
output.setDataType(DataType.FRAME);
output.setDimensions(id.getDim1(), id.getDim2());
output.setBlocksize (id.getBlocksize());
output.setValueType(ValueType.STRING);
break;
case CAST_AS_FRAME:
// operation as.frame
// overloaded to take either one argument or 2 where second is column names
Expand Down
16 changes: 16 additions & 0 deletions src/main/java/org/apache/sysds/parser/DMLTranslator.java
Original file line number Diff line number Diff line change
Expand Up @@ -2762,6 +2762,22 @@ else if ( in.length == 2 )
case TYPEOF:
case DET:
case DETECTSCHEMA:
case SET_NAMES:
currBuiltinOp = new BinaryOp(
target.getName(),
target.getDataType(),
target.getValueType(),
OpOp2.SET_COLNAMES, expr, expr2
);
break;
case GET_NAMES:
currBuiltinOp = new UnaryOp(
target.getName(),
target.getDataType(),
target.getValueType(),
OpOp1.COLNAMES, expr
);
break;
case COLNAMES:
currBuiltinOp = new UnaryOp(target.getName(), target.getDataType(),
target.getValueType(), OpOp1.valueOf(source.getOpCode().name()), expr);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -686,6 +686,8 @@ else if( opcode.equalsIgnoreCase(Opcodes.VALUESWAP.toString()))
return new BinaryOperator(Builtin.getBuiltinFnObject("valueSwap"));
else if( opcode.equalsIgnoreCase(Opcodes.FREPLICATE.toString()))
return new BinaryOperator(Builtin.getBuiltinFnObject("freplicate"));
else if( opcode.equalsIgnoreCase(Opcodes.SET_COLNAMES.toString()))
return new BinaryOperator(Builtin.getBuiltinFnObject("set_colnames"));

throw new RuntimeException("Unknown binary opcode " + opcode);
}
Expand Down Expand Up @@ -923,6 +925,9 @@ else if ( opcode.equalsIgnoreCase(Opcodes.DROPINVALIDLENGTH.toString()) || opcod
return new BinaryOperator(Builtin.getBuiltinFnObject("dropInvalidLength"));
else if ( opcode.equalsIgnoreCase(Opcodes.VALUESWAP.toString()) || opcode.equalsIgnoreCase("mapValueSwap") )
return new BinaryOperator(Builtin.getBuiltinFnObject("valueSwap"));
//TODO: Check what "|| opcode.equalsIgnoreCase("mapValueSwap"))" does
else if (opcode.equalsIgnoreCase(Opcodes.SET_COLNAMES.toString()) || opcode.equalsIgnoreCase("mapValueSwap"))
return new BinaryOperator(Builtin.getBuiltinFnObject("set_colnames"));

throw new DMLRuntimeException("Unknown binary opcode " + opcode);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,28 @@ else if(getOpcode().equals(Opcodes.APPLYSCHEMA.toString())) {
final int k = ((MultiThreadedOperator)_optr).getNumThreads();
final FrameBlock out = FrameLibApplySchema.applySchema(inBlock1, inBlock2, k);
ec.setFrameOutput(output.getName(), out);
}
else if(getOpcode().equals(Opcodes.SET_COLNAMES.toString())) {

FrameBlock in = ec.getFrameInput(input1.getName());
FrameBlock names = ec.getFrameInput(input2.getName());

String[] colNames = new String[(int) names.getNumColumns()];
for(int i = 0; i < colNames.length; i++){
colNames[i] = names.get(0, i).toString();
}

FrameBlock out = new FrameBlock(in);

out.setColumnNames(colNames);

ec.setFrameOutput(output.getName(), out);

ec.releaseFrameInput(input1.getName());

ec.releaseFrameInput(input2.getName());


}
else {
// Execute binary operations
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,14 @@ else if(getOpcode().equals(Opcodes.COLNAMES.toString())) {
ec.releaseFrameInput(input1.getName());
ec.setFrameOutput(output.getName(), retBlock);
}
//TODO: Check if new OPcode handling has to be implemented
else if(getOpcode().equals(Opcodes.COLNAMES.toString())) {
FrameBlock inBlock = ec.getFrameInput(input1.getName());
FrameBlock retBlock = inBlock.getColumnNamesAsFrame();
ec.releaseFrameInput(input1.getName());
ec.setFrameOutput(output.getName(), retBlock);
}

else
throw new DMLScriptException("Opcode '" + getOpcode() + "' is not a valid UnaryFrameCPInstruction");
}
Expand Down
Loading
Loading