use of org.apache.sysml.parser.DataIdentifier in project incubator-systemml by apache.
the class DmlSyntacticValidator method exitExternalFunctionDefExpression.
@Override
public void exitExternalFunctionDefExpression(ExternalFunctionDefExpressionContext ctx) {
ExternalFunctionStatement functionStmt = new ExternalFunctionStatement();
ArrayList<DataIdentifier> functionInputs = getFunctionParameters(ctx.inputParams);
functionStmt.setInputParams(functionInputs);
// set function outputs
ArrayList<DataIdentifier> functionOutputs = getFunctionParameters(ctx.outputParams);
functionStmt.setOutputParams(functionOutputs);
// set function name
functionStmt.setName(ctx.name.getText());
// set other parameters
HashMap<String, String> otherParams = new HashMap<>();
boolean atleastOneClassName = false;
for (StrictParameterizedKeyValueStringContext otherParamCtx : ctx.otherParams) {
String paramName = otherParamCtx.paramName.getText();
String val = "";
String text = otherParamCtx.paramVal.getText();
// First unquote the string
if ((text.startsWith("\"") && text.endsWith("\"")) || (text.startsWith("\'") && text.endsWith("\'"))) {
if (text.length() > 2) {
val = text.substring(1, text.length() - 1);
}
// Empty value allowed
} else {
notifyErrorListeners("the value of user parameter for external function should be of type string", ctx.start);
return;
}
otherParams.put(paramName, val);
if (paramName.equals(ExternalFunctionStatement.CLASS_NAME)) {
atleastOneClassName = true;
}
}
functionStmt.setOtherParams(otherParams);
if (!atleastOneClassName) {
notifyErrorListeners("The \'" + ExternalFunctionStatement.CLASS_NAME + "\' argument needs to be passed to the externalFunction 'implemented in' clause.", ctx.start);
return;
}
ctx.info.stmt = functionStmt;
setFileLineColumn(ctx.info.stmt, ctx);
ctx.info.functionName = ctx.name.getText();
}
use of org.apache.sysml.parser.DataIdentifier in project incubator-systemml by apache.
the class PydmlSyntacticValidator method exitParForStatement.
@Override
public void exitParForStatement(ParForStatementContext ctx) {
ParForStatement parForStmt = new ParForStatement();
DataIdentifier iterVar = new DataIdentifier(ctx.iterVar.getText());
HashMap<String, String> parForParamValues = new HashMap<>();
if (ctx.parForParams != null && ctx.parForParams.size() > 0) {
for (StrictParameterizedExpressionContext parForParamCtx : ctx.parForParams) {
String paramVal = parForParamCtx.paramVal.getText();
if (argVals.containsKey(paramVal))
paramVal = argVals.get(paramVal);
parForParamValues.put(parForParamCtx.paramName.getText(), paramVal);
}
}
// 1/-1
Expression incrementExpr = null;
if (ctx.iterPred.info.increment != null) {
incrementExpr = ctx.iterPred.info.increment;
}
IterablePredicate predicate = new IterablePredicate(ctx, iterVar, ctx.iterPred.info.from, ctx.iterPred.info.to, incrementExpr, parForParamValues, currentFile);
parForStmt.setPredicate(predicate);
if (ctx.body.size() > 0) {
for (StatementContext stmtCtx : ctx.body) {
parForStmt.addStatementBlock(getStatementBlock(stmtCtx.info.stmt));
}
parForStmt.mergeStatementBlocks();
}
ctx.info.stmt = parForStmt;
}
use of org.apache.sysml.parser.DataIdentifier in project incubator-systemml by apache.
the class PydmlSyntacticValidator method exitFunctionCallMultiAssignmentStatement.
@Override
public void exitFunctionCallMultiAssignmentStatement(FunctionCallMultiAssignmentStatementContext ctx) {
String[] names = getQualifiedNames(ctx.name.getText());
if (names == null) {
notifyErrorListeners("incorrect function name (only namespace.functionName allowed. Hint: If you are trying to use builtin functions, you can skip the namespace)", ctx.name);
return;
}
String namespace = names[0];
String functionName = names[1];
ArrayList<ParameterExpression> paramExpression = getParameterExpressionList(ctx.paramExprs);
ConvertedDMLSyntax convertedSyntax = convertToDMLSyntax(ctx, namespace, functionName, paramExpression, ctx.name);
if (convertedSyntax == null) {
return;
} else {
namespace = convertedSyntax.namespace;
functionName = convertedSyntax.functionName;
paramExpression = convertedSyntax.paramExpression;
}
// No need to support dot() function since it will never return multi-assignment function
FunctionCallIdentifier functCall = new FunctionCallIdentifier(paramExpression);
functCall.setFunctionName(functionName);
functCall.setFunctionNamespace(namespace);
final ArrayList<DataIdentifier> targetList = new ArrayList<>();
for (DataIdentifierContext dataCtx : ctx.targetList) {
if (dataCtx.dataInfo.expr instanceof DataIdentifier) {
targetList.add((DataIdentifier) dataCtx.dataInfo.expr);
} else {
notifyErrorListeners("incorrect type for variable ", dataCtx.start);
return;
}
}
if (namespace.equals(DMLProgram.DEFAULT_NAMESPACE)) {
Expression e = buildForBuiltInFunction(ctx, functionName, paramExpression);
if (e != null) {
setMultiAssignmentStatement(targetList, e, ctx, ctx.info);
return;
}
}
// Override default namespace for imported non-built-in function
String inferNamespace = (sourceNamespace != null && sourceNamespace.length() > 0 && DMLProgram.DEFAULT_NAMESPACE.equals(namespace)) ? sourceNamespace : namespace;
functCall.setFunctionNamespace(inferNamespace);
setMultiAssignmentStatement(targetList, functCall, ctx, ctx.info);
}
use of org.apache.sysml.parser.DataIdentifier in project incubator-systemml by apache.
the class PydmlSyntacticValidator method convertPythonBuiltinFunctionToDMLSyntax.
// TODO : Clean up to use Map or some other structure
/**
* Check function name, namespace, parameters (#params & possible values) and produce useful messages/hints
* @param ctx antlr rule context
* @param namespace Namespace of the function
* @param functionName Name of the builtin function
* @param paramExpression Array of parameter names and values
* @param fnName Token of the builtin function identifier
* @return common syntax format for runtime
*/
private ConvertedDMLSyntax convertPythonBuiltinFunctionToDMLSyntax(ParserRuleContext ctx, String namespace, String functionName, ArrayList<ParameterExpression> paramExpression, Token fnName) {
if (sources.containsValue(namespace) || functions.contains(functionName)) {
return new ConvertedDMLSyntax(namespace, functionName, paramExpression);
}
if (namespace.equals(DMLProgram.DEFAULT_NAMESPACE) && functionName.equals("len")) {
if (paramExpression.size() != 1) {
notifyErrorListeners("The builtin function \'" + functionName + "\' accepts 1 arguments", fnName);
return null;
}
functionName = "length";
} else if (functionName.equals("sum") || functionName.equals("mean") || functionName.equals("avg") || functionName.equals("min") || functionName.equals("max") || functionName.equals("argmax") || functionName.equals("argmin") || functionName.equals("cumsum") || functionName.equals("transpose") || functionName.equals("trace") || functionName.equals("var") || functionName.equals("sd")) {
// can mean sum of all cells or row-wise or columnwise sum
if (namespace.equals(DMLProgram.DEFAULT_NAMESPACE) && paramExpression.size() == 1) {
// otherwise same function name
if (functionName.equals("avg")) {
functionName = "mean";
} else if (functionName.equals("transpose")) {
functionName = "t";
} else if (functionName.equals("argmax") || functionName.equals("argmin") || functionName.equals("cumsum")) {
notifyErrorListeners("The builtin function \'" + functionName + "\' for entire matrix is not supported", fnName);
return null;
}
} else if (!(namespace.equals(DMLProgram.DEFAULT_NAMESPACE)) && paramExpression.size() == 0) {
// x.sum() => sum(x)
paramExpression = new ArrayList<>();
paramExpression.add(new ParameterExpression(null, new DataIdentifier(namespace)));
// otherwise same function name
if (functionName.equals("avg")) {
functionName = "mean";
} else if (functionName.equals("transpose")) {
functionName = "t";
} else if (functionName.equals("argmax") || functionName.equals("argmin") || functionName.equals("cumsum")) {
notifyErrorListeners("The builtin function \'" + functionName + "\' for entire matrix is not supported", fnName);
return null;
}
} else if (namespace.equals(DMLProgram.DEFAULT_NAMESPACE) && paramExpression.size() == 2) {
// sum(x, axis=1) => rowSums(x)
int axis = getAxis(paramExpression.get(1));
if (axis == -1 && (functionName.equals("min") || functionName.equals("max"))) {
// Do nothing
// min(2, 3)
} else if (axis == -1) {
notifyErrorListeners("The builtin function \'" + functionName + "\' for given arguments is not supported", fnName);
return null;
} else {
ArrayList<ParameterExpression> temp = new ArrayList<>();
temp.add(paramExpression.get(0));
paramExpression = temp;
functionName = getPythonAggFunctionNames(functionName, axis);
if (functionName.equals("Not Supported")) {
notifyErrorListeners("The builtin function \'" + functionName + "\' for given arguments is not supported", fnName);
return null;
}
}
} else if (!(namespace.equals(DMLProgram.DEFAULT_NAMESPACE)) && paramExpression.size() == 1) {
// x.sum(axis=1) => rowSums(x)
int axis = getAxis(paramExpression.get(0));
if (axis == -1) {
notifyErrorListeners("The builtin function \'" + functionName + "\' for given arguments is not supported", fnName);
return null;
} else {
paramExpression = new ArrayList<>();
paramExpression.add(new ParameterExpression(null, new DataIdentifier(namespace)));
functionName = getPythonAggFunctionNames(functionName, axis);
if (functionName.equals("Not Supported")) {
notifyErrorListeners("The builtin function \'" + functionName + "\' for given arguments is not supported", fnName);
return null;
}
}
} else {
notifyErrorListeners("Incorrect number of arguments for the builtin function \'" + functionName + "\'.", fnName);
return null;
}
namespace = DMLProgram.DEFAULT_NAMESPACE;
} else if (namespace.equals(DMLProgram.DEFAULT_NAMESPACE) && functionName.equals("concatenate")) {
if (paramExpression.size() != 2) {
notifyErrorListeners("The builtin function \'" + functionName + "\' accepts 2 arguments (Note: concatenate append columns of two matrices)", fnName);
return null;
}
functionName = "append";
namespace = DMLProgram.DEFAULT_NAMESPACE;
} else if (namespace.equals(DMLProgram.DEFAULT_NAMESPACE) && functionName.equals("minimum")) {
if (paramExpression.size() != 2) {
notifyErrorListeners("The builtin function \'" + functionName + "\' accepts 2 arguments", fnName);
return null;
}
functionName = "min";
namespace = DMLProgram.DEFAULT_NAMESPACE;
} else if (namespace.equals(DMLProgram.DEFAULT_NAMESPACE) && functionName.equals("maximum")) {
if (paramExpression.size() != 2) {
notifyErrorListeners("The builtin function \'" + functionName + "\' accepts 2 arguments", fnName);
return null;
}
functionName = "max";
namespace = DMLProgram.DEFAULT_NAMESPACE;
} else if (!(namespace.equals(DMLProgram.DEFAULT_NAMESPACE)) && functionName.equals("shape")) {
if (paramExpression.size() != 1) {
notifyErrorListeners("The builtin function \'" + functionName + "\' accepts only 1 argument (0 or 1)", fnName);
return null;
}
int axis = getAxis(paramExpression.get(0));
if (axis == -1) {
notifyErrorListeners("The builtin function \'" + functionName + "\' accepts only 1 argument (0 or 1)", fnName);
return null;
}
paramExpression = new ArrayList<>();
paramExpression.add(new ParameterExpression(null, new DataIdentifier(namespace)));
namespace = DMLProgram.DEFAULT_NAMESPACE;
if (axis == 0) {
functionName = "nrow";
} else if (axis == 1) {
functionName = "ncol";
}
} else if (namespace.equals("random") && functionName.equals("normal")) {
if (paramExpression.size() != 3) {
String qualifiedName = namespace + namespaceResolutionOp() + functionName;
notifyErrorListeners("The builtin function \'" + qualifiedName + "\' accepts exactly 3 arguments (number of rows, number of columns, sparsity)", fnName);
return null;
}
paramExpression.get(0).setName("rows");
paramExpression.get(1).setName("cols");
paramExpression.get(2).setName("sparsity");
paramExpression.add(new ParameterExpression("pdf", new StringIdentifier(ctx, "normal", currentFile)));
functionName = "rand";
namespace = DMLProgram.DEFAULT_NAMESPACE;
} else if (namespace.equals("random") && functionName.equals("poisson")) {
if (paramExpression.size() != 4) {
String qualifiedName = namespace + namespaceResolutionOp() + functionName;
notifyErrorListeners("The builtin function \'" + qualifiedName + "\' accepts exactly 3 arguments (number of rows, number of columns, sparsity, lambda)", fnName);
return null;
}
paramExpression.get(0).setName("rows");
paramExpression.get(1).setName("cols");
paramExpression.get(2).setName("sparsity");
paramExpression.get(3).setName("lambda");
paramExpression.add(new ParameterExpression("pdf", new StringIdentifier(ctx, "poisson", currentFile)));
functionName = "rand";
namespace = DMLProgram.DEFAULT_NAMESPACE;
} else if (namespace.equals("random") && functionName.equals("uniform")) {
if (paramExpression.size() != 5) {
String qualifiedName = namespace + namespaceResolutionOp() + functionName;
notifyErrorListeners("The builtin function \'" + qualifiedName + "\' accepts exactly 5 arguments (number of rows, number of columns, sparsity, min, max)", fnName);
return null;
}
paramExpression.get(0).setName("rows");
paramExpression.get(1).setName("cols");
paramExpression.get(2).setName("sparsity");
paramExpression.get(3).setName("min");
paramExpression.get(4).setName("max");
paramExpression.add(new ParameterExpression("pdf", new StringIdentifier(ctx, "uniform", currentFile)));
functionName = "rand";
namespace = DMLProgram.DEFAULT_NAMESPACE;
} else if (namespace.equals(DMLProgram.DEFAULT_NAMESPACE) && functionName.equals("full")) {
if (paramExpression.size() != 3) {
notifyErrorListeners("The builtin function \'" + functionName + "\' accepts exactly 3 arguments (constant float value, number of rows, number of columns)", fnName);
return null;
}
paramExpression.get(1).setName("rows");
paramExpression.get(2).setName("cols");
functionName = "matrix";
namespace = DMLProgram.DEFAULT_NAMESPACE;
} else if (namespace.equals(DMLProgram.DEFAULT_NAMESPACE) && functionName.equals("matrix")) {
// This can either be string initializer or as.matrix function
if (paramExpression.size() != 1) {
notifyErrorListeners("The builtin function \'" + functionName + "\' accepts exactly 1 argument (either str or float value)", fnName);
return null;
}
if (paramExpression.get(0).getExpr() instanceof StringIdentifier) {
String initializerString = ((StringIdentifier) paramExpression.get(0).getExpr()).getValue().trim();
if (!initializerString.startsWith("[") || !initializerString.endsWith("]")) {
notifyErrorListeners("Incorrect initializer string for builtin function \'" + functionName + "\' (Eg: matrix(\"[1 2 3; 4 5 6]\"))", fnName);
return null;
}
int rows = StringUtils.countMatches(initializerString, ";") + 1;
// Make sure user doesnot have pretty string
initializerString = initializerString.replaceAll("; ", ";");
initializerString = initializerString.replaceAll(" ;", ";");
initializerString = initializerString.replaceAll("\\[ ", "\\[");
initializerString = initializerString.replaceAll(" \\]", "\\]");
// Each row has ncol-1 spaces
// #spaces = nrow * (ncol-1)
// ncol = (#spaces / nrow) + 1
int cols = (StringUtils.countMatches(initializerString, " ") / rows) + 1;
initializerString = initializerString.replaceAll(";", " ");
initializerString = initializerString.replaceAll("\\[", "");
initializerString = initializerString.replaceAll("\\]", "");
paramExpression = new ArrayList<>();
paramExpression.add(new ParameterExpression(null, new StringIdentifier(ctx, initializerString, currentFile)));
paramExpression.add(new ParameterExpression("rows", new IntIdentifier(ctx, rows, currentFile)));
paramExpression.add(new ParameterExpression("cols", new IntIdentifier(ctx, cols, currentFile)));
} else {
functionName = "as.matrix";
}
namespace = DMLProgram.DEFAULT_NAMESPACE;
} else if (namespace.equals(DMLProgram.DEFAULT_NAMESPACE) && functionName.equals("scalar")) {
if (paramExpression.size() != 1) {
notifyErrorListeners("The builtin function \'" + functionName + "\' accepts exactly 1 argument", fnName);
return null;
}
functionName = "as.scalar";
namespace = DMLProgram.DEFAULT_NAMESPACE;
} else if (namespace.equals(DMLProgram.DEFAULT_NAMESPACE) && functionName.equals("float")) {
if (paramExpression.size() != 1) {
notifyErrorListeners("The builtin function \'" + functionName + "\' accepts exactly 1 argument", fnName);
return null;
}
functionName = "as.double";
namespace = DMLProgram.DEFAULT_NAMESPACE;
} else if (namespace.equals(DMLProgram.DEFAULT_NAMESPACE) && functionName.equals("int")) {
if (paramExpression.size() != 1) {
notifyErrorListeners("The builtin function \'" + functionName + "\' accepts exactly 1 argument", fnName);
return null;
}
functionName = "as.integer";
namespace = DMLProgram.DEFAULT_NAMESPACE;
} else if (namespace.equals(DMLProgram.DEFAULT_NAMESPACE) && functionName.equals("bool")) {
if (paramExpression.size() != 1) {
notifyErrorListeners("The builtin function \'" + functionName + "\' accepts exactly 1 argument", fnName);
return null;
}
functionName = "as.logical";
namespace = DMLProgram.DEFAULT_NAMESPACE;
} else if (!(namespace.equals(DMLProgram.DEFAULT_NAMESPACE)) && functionName.equals("reshape")) {
if (paramExpression.size() != 2) {
notifyErrorListeners("The builtin function \'" + functionName + "\' accepts exactly 2 arguments (number of rows, number of columns)", fnName);
return null;
}
paramExpression.get(0).setName("rows");
paramExpression.get(1).setName("cols");
ArrayList<ParameterExpression> temp = new ArrayList<>();
temp.add(new ParameterExpression(null, new DataIdentifier(namespace)));
temp.add(paramExpression.get(0));
temp.add(paramExpression.get(1));
paramExpression = temp;
functionName = "matrix";
namespace = DMLProgram.DEFAULT_NAMESPACE;
} else if (namespace.equals(DMLProgram.DEFAULT_NAMESPACE) && functionName.equals("removeEmpty")) {
if (paramExpression.size() != 2) {
notifyErrorListeners("The builtin function \'" + functionName + "\' accepts exactly 2 arguments (matrix, axis=0 or 1)", fnName);
return null;
}
int axis = getAxis(paramExpression.get(1));
if (axis == -1) {
notifyErrorListeners("The builtin function \'" + functionName + "\' accepts exactly 2 arguments (matrix, axis=0 or 1)", fnName);
return null;
}
StringIdentifier marginVal = null;
if (axis == 0) {
marginVal = new StringIdentifier(ctx, "rows", currentFile);
} else {
marginVal = new StringIdentifier(ctx, "cols", currentFile);
}
paramExpression.get(0).setName("target");
paramExpression.get(1).setName("margin");
paramExpression.get(1).setExpr(marginVal);
functionName = "removeEmpty";
namespace = DMLProgram.DEFAULT_NAMESPACE;
} else if (namespace.equals(DMLProgram.DEFAULT_NAMESPACE) && functionName.equals("replace")) {
if (paramExpression.size() != 3) {
notifyErrorListeners("The builtin function \'" + functionName + "\' accepts exactly 3 arguments (matrix, scalar value that should be replaced (pattern), scalar value (replacement))", fnName);
return null;
}
paramExpression.get(0).setName("target");
paramExpression.get(1).setName("pattern");
paramExpression.get(2).setName("replacement");
functionName = "replace";
namespace = DMLProgram.DEFAULT_NAMESPACE;
} else if (namespace.equals(DMLProgram.DEFAULT_NAMESPACE) && functionName.equals("range")) {
if (paramExpression.size() < 2) {
notifyErrorListeners("The builtin function \'" + functionName + "\' accepts 3 arguments (from, to, increment), with the first 2 lacking default values", fnName);
return null;
} else if (paramExpression.size() > 3) {
notifyErrorListeners("The builtin function \'" + functionName + "\' accepts 3 arguments (from, to, increment)", fnName);
}
functionName = "seq";
namespace = DMLProgram.DEFAULT_NAMESPACE;
} else if (namespace.equals("norm") && functionName.equals("cdf")) {
if (paramExpression.size() != 3) {
String qualifiedName = namespace + namespaceResolutionOp() + functionName;
notifyErrorListeners("The builtin function \'" + qualifiedName + "\' accepts exactly 3 arguments (target, mean, sd)", fnName);
return null;
}
functionName = "cdf";
paramExpression.get(0).setName("target");
paramExpression.get(1).setName("mean");
paramExpression.get(2).setName("sd");
paramExpression.add(new ParameterExpression("dist", new StringIdentifier(ctx, "normal", currentFile)));
namespace = DMLProgram.DEFAULT_NAMESPACE;
} else if (namespace.equals("expon") && functionName.equals("cdf")) {
if (paramExpression.size() != 2) {
String qualifiedName = namespace + namespaceResolutionOp() + functionName;
notifyErrorListeners("The builtin function \'" + qualifiedName + "\' accepts exactly 2 arguments (target, mean)", fnName);
return null;
}
functionName = "cdf";
paramExpression.get(0).setName("target");
paramExpression.get(1).setName("mean");
paramExpression.add(new ParameterExpression("dist", new StringIdentifier(ctx, "exp", currentFile)));
namespace = DMLProgram.DEFAULT_NAMESPACE;
} else if (namespace.equals("chi") && functionName.equals("cdf")) {
if (paramExpression.size() != 2) {
String qualifiedName = namespace + namespaceResolutionOp() + functionName;
notifyErrorListeners("The builtin function \'" + qualifiedName + "\' accepts exactly 2 arguments (target, df)", fnName);
return null;
}
functionName = "cdf";
paramExpression.get(0).setName("target");
paramExpression.get(1).setName("df");
paramExpression.add(new ParameterExpression("dist", new StringIdentifier(ctx, "chisq", currentFile)));
namespace = DMLProgram.DEFAULT_NAMESPACE;
} else if (namespace.equals("f") && functionName.equals("cdf")) {
if (paramExpression.size() != 3) {
String qualifiedName = namespace + namespaceResolutionOp() + functionName;
notifyErrorListeners("The builtin function \'" + qualifiedName + "\' accepts exactly 3 arguments (target, df1, df2)", fnName);
return null;
}
functionName = "cdf";
paramExpression.get(0).setName("target");
paramExpression.get(1).setName("df1");
paramExpression.get(2).setName("df2");
paramExpression.add(new ParameterExpression("dist", new StringIdentifier(ctx, "f", currentFile)));
namespace = DMLProgram.DEFAULT_NAMESPACE;
} else if (namespace.equals("t") && functionName.equals("cdf")) {
if (paramExpression.size() != 2) {
String qualifiedName = namespace + namespaceResolutionOp() + functionName;
notifyErrorListeners("The builtin function \'" + qualifiedName + "\' accepts exactly 2 arguments (target, df)", fnName);
return null;
}
functionName = "cdf";
paramExpression.get(0).setName("target");
paramExpression.get(1).setName("df");
paramExpression.add(new ParameterExpression("dist", new StringIdentifier(ctx, "t", currentFile)));
namespace = DMLProgram.DEFAULT_NAMESPACE;
} else if (namespace.equals(DMLProgram.DEFAULT_NAMESPACE) && functionName.equals("percentile")) {
if (paramExpression.size() != 2 && paramExpression.size() != 3) {
notifyErrorListeners("The builtin function \'" + functionName + "\' accepts either 2 or 3 arguments", fnName);
return null;
}
functionName = "quantile";
namespace = DMLProgram.DEFAULT_NAMESPACE;
} else if (namespace.equals(DMLProgram.DEFAULT_NAMESPACE) && functionName.equals("arcsin")) {
functionName = "asin";
} else if (namespace.equals(DMLProgram.DEFAULT_NAMESPACE) && functionName.equals("arccos")) {
functionName = "acos";
} else if (namespace.equals(DMLProgram.DEFAULT_NAMESPACE) && functionName.equals("arctan")) {
functionName = "atan";
} else if (namespace.equals(DMLProgram.DEFAULT_NAMESPACE) && functionName.equals("load")) {
functionName = "read";
} else if (namespace.equals(DMLProgram.DEFAULT_NAMESPACE) && functionName.equals("eigen")) {
functionName = "eig";
} else if (namespace.equals(DMLProgram.DEFAULT_NAMESPACE) && functionName.equals("power")) {
if (paramExpression.size() != 2) {
notifyErrorListeners("The builtin function \'" + functionName + "\' accepts exactly 2 arguments", fnName);
return null;
}
} else if (namespace.equals(DMLProgram.DEFAULT_NAMESPACE) && functionName.equals("dot")) {
if (paramExpression.size() != 2) {
notifyErrorListeners("The builtin function \'" + functionName + "\' accepts exactly 2 arguments", fnName);
return null;
}
}
return new ConvertedDMLSyntax(namespace, functionName, paramExpression);
}
use of org.apache.sysml.parser.DataIdentifier in project incubator-systemml by apache.
the class PydmlSyntacticValidator method exitExternalFunctionDefExpression.
@Override
public void exitExternalFunctionDefExpression(ExternalFunctionDefExpressionContext ctx) {
ExternalFunctionStatement functionStmt = new ExternalFunctionStatement();
ArrayList<DataIdentifier> functionInputs = getFunctionParameters(ctx.inputParams);
functionStmt.setInputParams(functionInputs);
// set function outputs
ArrayList<DataIdentifier> functionOutputs = getFunctionParameters(ctx.outputParams);
functionStmt.setOutputParams(functionOutputs);
// set function name
functionStmt.setName(ctx.name.getText());
// set other parameters
HashMap<String, String> otherParams = new HashMap<>();
boolean atleastOneClassName = false;
for (StrictParameterizedKeyValueStringContext otherParamCtx : ctx.otherParams) {
String paramName = otherParamCtx.paramName.getText();
String val = "";
String text = otherParamCtx.paramVal.getText();
// First unquote the string
if ((text.startsWith("\"") && text.endsWith("\"")) || (text.startsWith("\'") && text.endsWith("\'"))) {
if (text.length() > 2) {
val = text.substring(1, text.length() - 1);
}
// Empty value allowed
} else {
notifyErrorListeners("the value of user parameter for external function should be of type str", ctx.start);
return;
}
otherParams.put(paramName, val);
if (paramName.equals("classname")) {
atleastOneClassName = true;
}
}
functionStmt.setOtherParams(otherParams);
if (!atleastOneClassName) {
notifyErrorListeners("the parameter \'className\' needs to be passed for defExternal", ctx.start);
return;
}
ctx.info.stmt = functionStmt;
setFileLineColumn(ctx.info.stmt, ctx);
ctx.info.functionName = ctx.name.getText();
}
Aggregations