You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@systemml.apache.org by mb...@apache.org on 2018/04/02 00:14:45 UTC

systemml git commit: [SYSTEMML-2078] Add support for builtin constants (PI, INF, NaN)

Repository: systemml
Updated Branches:
  refs/heads/master 607a402bc -> 4a822a22c


[SYSTEMML-2078] Add support for builtin constants (PI, INF, NaN)

Closes #752.


Project: http://git-wip-us.apache.org/repos/asf/systemml/repo
Commit: http://git-wip-us.apache.org/repos/asf/systemml/commit/4a822a22
Tree: http://git-wip-us.apache.org/repos/asf/systemml/tree/4a822a22
Diff: http://git-wip-us.apache.org/repos/asf/systemml/diff/4a822a22

Branch: refs/heads/master
Commit: 4a822a22c88b579e935a1b09051c1fe236e18a4b
Parents: 607a402
Author: EdgarLGB <gu...@atos.net>
Authored: Sun Apr 1 17:14:36 2018 -0700
Committer: Matthias Boehm <mb...@gmail.com>
Committed: Sun Apr 1 17:14:36 2018 -0700

----------------------------------------------------------------------
 .../apache/sysml/parser/BuiltinConstant.java    | 45 ++++++++++++++++++++
 .../org/apache/sysml/parser/StatementBlock.java | 13 ++++++
 .../parser/common/CommonSyntacticValidator.java | 10 ++++-
 .../integration/mlcontext/MLContextTest.java    |  8 ++++
 .../api/mlcontext/builtin-constants-test.dml    | 39 +++++++++++++++++
 5 files changed, 114 insertions(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/systemml/blob/4a822a22/src/main/java/org/apache/sysml/parser/BuiltinConstant.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/sysml/parser/BuiltinConstant.java b/src/main/java/org/apache/sysml/parser/BuiltinConstant.java
new file mode 100644
index 0000000..5325e80
--- /dev/null
+++ b/src/main/java/org/apache/sysml/parser/BuiltinConstant.java
@@ -0,0 +1,45 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ * 
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.sysml.parser;
+
+import org.apache.commons.lang3.EnumUtils;
+
+/**
+ * These are the builtin constants
+ */
+public enum BuiltinConstant {
+	PI(Math.PI),
+	INF(Double.POSITIVE_INFINITY),
+	NaN(Double.NaN);
+
+	private DoubleIdentifier _id;
+
+	private BuiltinConstant(double d) {
+		this._id = new DoubleIdentifier(d);
+	}
+
+	public DoubleIdentifier get() {
+		return this._id;
+	}
+
+	public static boolean contains(String name) {
+		return EnumUtils.isValidEnum(BuiltinConstant.class, name);
+	}
+}

http://git-wip-us.apache.org/repos/asf/systemml/blob/4a822a22/src/main/java/org/apache/sysml/parser/StatementBlock.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/sysml/parser/StatementBlock.java b/src/main/java/org/apache/sysml/parser/StatementBlock.java
index 1f0e81c..2957482 100644
--- a/src/main/java/org/apache/sysml/parser/StatementBlock.java
+++ b/src/main/java/org/apache/sysml/parser/StatementBlock.java
@@ -784,6 +784,12 @@ public class StatementBlock extends LiveVariableAnalysis implements ParseInfo
 		DataIdentifier target = as.getTarget();
 		Expression source = as.getSource();
 		
+		// check if target is builtin constant
+		if (target != null && BuiltinConstant.contains(target.getName())) {
+			target.raiseValidateError(String.format(
+				"Cannot assign a value to the builtin constant %s.", target.getName()), false);
+		}
+		
 		if (source instanceof FunctionCallIdentifier) {
 			((FunctionCallIdentifier) source).validateExpression(
 				dmlProg, ids.getVariables(),currConstVars, conditional);
@@ -899,6 +905,13 @@ public class StatementBlock extends LiveVariableAnalysis implements ParseInfo
 		MultiAssignmentStatement mas = (MultiAssignmentStatement) current;
 		ArrayList<DataIdentifier> targetList = mas.getTargetList();
 		Expression source = mas.getSource();
+
+		// check if target list contains builtin constant
+		targetList.forEach(target -> {
+			if (target != null && BuiltinConstant.contains(target.getName()))
+				target.raiseValidateError(String.format(
+					"Cannot assign a value to the builtin constant %s.", target.getName()), false);
+		});
 		
 		//MultiAssignmentStatments currently supports only External,
 		//User-defined, and Multi-return Builtin function expressions

http://git-wip-us.apache.org/repos/asf/systemml/blob/4a822a22/src/main/java/org/apache/sysml/parser/common/CommonSyntacticValidator.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/sysml/parser/common/CommonSyntacticValidator.java b/src/main/java/org/apache/sysml/parser/common/CommonSyntacticValidator.java
index cc67ebe..d1b8cf6 100644
--- a/src/main/java/org/apache/sysml/parser/common/CommonSyntacticValidator.java
+++ b/src/main/java/org/apache/sysml/parser/common/CommonSyntacticValidator.java
@@ -55,6 +55,7 @@ import org.apache.sysml.parser.Statement;
 import org.apache.sysml.parser.StringIdentifier;
 import org.apache.sysml.parser.dml.DmlSyntacticValidator;
 import org.apache.sysml.parser.pydml.PydmlSyntacticValidator;
+import org.apache.sysml.parser.BuiltinConstant;
 
 /**
  * Contains fields and (helper) methods common to {@link DmlSyntacticValidator} and {@link PydmlSyntacticValidator}
@@ -328,6 +329,13 @@ public abstract class CommonSyntacticValidator {
 	}
 
 	protected void exitDataIdExpressionHelper(ParserRuleContext ctx, ExpressionInfo me, ExpressionInfo dataInfo) {
+		// inject builtin constant
+		if (dataInfo.expr instanceof DataIdentifier) {
+			DataIdentifier id = ((DataIdentifier) dataInfo.expr);
+			if (BuiltinConstant.contains(id.getName())) { 
+				dataInfo.expr = BuiltinConstant.valueOf(id.getName()).get();
+			}
+		}
 		me.expr = dataInfo.expr;
 		// If "The parameter $X either needs to be passed through commandline or initialized to default value" validation
 		// error occurs, then dataInfo.expr is null which would cause a null pointer exception with the following code.
@@ -430,7 +438,7 @@ public abstract class CommonSyntacticValidator {
 				info.stmt = new AssignmentStatement(ctx, target, source, currentFile);
 			} catch (LanguageException e) {
 				// TODO: extract more meaningful info from this exception.
-				notifyErrorListeners("invalid assignment", lhsStart);
+				notifyErrorListeners("invalid assignment: " + e.getMessage(), lhsStart);
 				return;
 			}
 		}

http://git-wip-us.apache.org/repos/asf/systemml/blob/4a822a22/src/test/java/org/apache/sysml/test/integration/mlcontext/MLContextTest.java
----------------------------------------------------------------------
diff --git a/src/test/java/org/apache/sysml/test/integration/mlcontext/MLContextTest.java b/src/test/java/org/apache/sysml/test/integration/mlcontext/MLContextTest.java
index 39b9652..a9dcb23 100644
--- a/src/test/java/org/apache/sysml/test/integration/mlcontext/MLContextTest.java
+++ b/src/test/java/org/apache/sysml/test/integration/mlcontext/MLContextTest.java
@@ -90,6 +90,14 @@ import scala.collection.Seq;
 public class MLContextTest extends MLContextTestBase {
 
 	@Test
+	public void testBuiltinConstantsTest() {
+		System.out.println("MLContextTest - basic builtin constants test");
+		Script script = dmlFromFile(baseDirectory + File.separator + "builtin-constants-test.dml");
+		ml.execute(script);
+		Assert.assertTrue(Statistics.getNoOfExecutedSPInst() == 0);
+	}
+	
+	@Test
 	public void testBasicExecuteEvalTest() {
 		System.out.println("MLContextTest - basic eval test");
 		setExpectedStdOut("10");

http://git-wip-us.apache.org/repos/asf/systemml/blob/4a822a22/src/test/scripts/org/apache/sysml/api/mlcontext/builtin-constants-test.dml
----------------------------------------------------------------------
diff --git a/src/test/scripts/org/apache/sysml/api/mlcontext/builtin-constants-test.dml b/src/test/scripts/org/apache/sysml/api/mlcontext/builtin-constants-test.dml
new file mode 100644
index 0000000..05b832e
--- /dev/null
+++ b/src/test/scripts/org/apache/sysml/api/mlcontext/builtin-constants-test.dml
@@ -0,0 +1,39 @@
+#-------------------------------------------------------------
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+# 
+#   http://www.apache.org/licenses/LICENSE-2.0
+# 
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+#-------------------------------------------------------------
+
+# a func using builtin constant PI
+f1 = function (double r) return (double res) {
+  res = PI * r * r
+}
+
+# use builtin constant PI in main func
+res = PI * 1000
+print(res)
+
+# use builtin constant NaN
+print(NaN + 1)
+
+# use builtin constant INF
+if (1 / 0 == INF) {
+  print("1 / 0 is an infinity.")
+}
+
+print(f1(100))