Repository: systemml Updated Branches: refs/heads/master 5b0a292d4 -> ee2b37e4f
[MINOR] Misc cleanups of JMLC script execution and output handling This patch cleans up various minor issues of JMLC script execution (e.g., unnecessary list creation and lookups) as well as introduces additional API calls to obtain matrix/frame blocks instead of two-dimensional double/string arrays in order to improve the memory efficiency of the JMLC API. Project: http://git-wip-us.apache.org/repos/asf/systemml/repo Commit: http://git-wip-us.apache.org/repos/asf/systemml/commit/dd6f46a9 Tree: http://git-wip-us.apache.org/repos/asf/systemml/tree/dd6f46a9 Diff: http://git-wip-us.apache.org/repos/asf/systemml/diff/dd6f46a9 Branch: refs/heads/master Commit: dd6f46a9ea83e890dde72a5c9b5a500bf76433a6 Parents: 5b0a292 Author: Matthias Boehm <[email protected]> Authored: Sat Jul 22 19:43:17 2017 -0700 Committer: Matthias Boehm <[email protected]> Committed: Sun Jul 23 15:27:06 2017 -0700 ---------------------------------------------------------------------- .../apache/sysml/api/jmlc/PreparedScript.java | 25 +++--- .../apache/sysml/api/jmlc/ResultVariables.java | 85 ++++++++++---------- .../controlprogram/LocalVariableMap.java | 47 +++++------ .../context/ExecutionContextFactory.java | 15 ++-- 4 files changed, 82 insertions(+), 90 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/systemml/blob/dd6f46a9/src/main/java/org/apache/sysml/api/jmlc/PreparedScript.java ---------------------------------------------------------------------- diff --git a/src/main/java/org/apache/sysml/api/jmlc/PreparedScript.java b/src/main/java/org/apache/sysml/api/jmlc/PreparedScript.java index d9f5992..563df41 100644 --- a/src/main/java/org/apache/sysml/api/jmlc/PreparedScript.java +++ b/src/main/java/org/apache/sysml/api/jmlc/PreparedScript.java @@ -19,13 +19,10 @@ package org.apache.sysml.api.jmlc; -import java.util.ArrayList; -import java.util.Collection; import java.util.Collections; import java.util.HashMap; import java.util.HashSet; import java.util.List; -import java.util.Map.Entry; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; @@ -387,28 +384,24 @@ public class PreparedScript throws DMLException { //add reused variables - for( Entry<String,Data> e : _inVarReuse.entrySet() ) - _vars.put(e.getKey(), e.getValue()); + _vars.putAll(_inVarReuse); //create and populate execution context - ExecutionContext ec = ExecutionContextFactory.createContext(_prog); - ec.setVariables(_vars); + ExecutionContext ec = ExecutionContextFactory.createContext(_vars, _prog); //core execute runtime program - _prog.execute( ec ); + _prog.execute(ec); //cleanup unnecessary outputs - Collection<String> tmpVars = new ArrayList<String>(_vars.keySet()); - for( String var : tmpVars ) - if( !_outVarnames.contains(var) ) - _vars.remove(var); + _vars.removeAllNotIn(_outVarnames); //construct results ResultVariables rvars = new ResultVariables(); - for( String ovar : _outVarnames ) - if( _vars.keySet().contains(ovar) ) - rvars.addResult(ovar, _vars.get(ovar)); - + for( String ovar : _outVarnames ) { + Data tmpVar = _vars.get(ovar); + if( tmpVar != null ) + rvars.addResult(ovar, tmpVar); + } return rvars; } http://git-wip-us.apache.org/repos/asf/systemml/blob/dd6f46a9/src/main/java/org/apache/sysml/api/jmlc/ResultVariables.java ---------------------------------------------------------------------- diff --git a/src/main/java/org/apache/sysml/api/jmlc/ResultVariables.java b/src/main/java/org/apache/sysml/api/jmlc/ResultVariables.java index c3454cd..3b31c5d 100644 --- a/src/main/java/org/apache/sysml/api/jmlc/ResultVariables.java +++ b/src/main/java/org/apache/sysml/api/jmlc/ResultVariables.java @@ -39,11 +39,9 @@ import org.apache.sysml.runtime.util.DataConverter; */ public class ResultVariables { - private HashMap<String, Data> _out = null; - public ResultVariables() - { + public ResultVariables() { _out = new HashMap<String, Data>(); } @@ -52,8 +50,7 @@ public class ResultVariables * * @return the set of output variable names */ - public Set<String> getVariableNames() - { + public Set<String> getVariableNames() { return _out.keySet(); } @@ -62,8 +59,7 @@ public class ResultVariables * * @return the number of output variables with data */ - public int size() - { + public int size() { return _out.size(); } @@ -74,14 +70,22 @@ public class ResultVariables * @return matrix as a two-dimensional double array * @throws DMLException if DMLException occurs */ - public double[][] getMatrix(String varname) - throws DMLException - { - if( !_out.containsKey(varname) ) - throw new DMLException("Non-existent output variable: "+varname); - - double[][] ret = null; + public double[][] getMatrix(String varname) throws DMLException { + return DataConverter.convertToDoubleMatrix(getMatrixBlock(varname)); + } + + /** + * Obtain the matrix represented by the given output variable. + * Calling this method avoids unnecessary output conversions. + * + * @param varname output variable name + * @return matrix as matrix block + * @throws DMLException if DMLException occurs + */ + public MatrixBlock getMatrixBlock(String varname) throws DMLException { Data dat = _out.get(varname); + if( dat == null ) + throw new DMLException("Non-existent output variable: "+varname); //basic checks for data type if( !(dat instanceof MatrixObject) ) @@ -90,10 +94,8 @@ public class ResultVariables //convert output matrix to double array MatrixObject mo = (MatrixObject)dat; MatrixBlock mb = mo.acquireRead(); - ret = DataConverter.convertToDoubleMatrix(mb); mo.release(); - - return ret; + return mb; } /** @@ -103,13 +105,24 @@ public class ResultVariables * @return frame as a two-dimensional string array * @throws DMLException if DMLException occurs */ - public String[][] getFrame(String varname) + public String[][] getFrame(String varname) throws DMLException { + return DataConverter.convertToStringFrame(getFrameBlock(varname)); + } + + /** + * Obtain the frame represented by the given output variable. + * Calling this method avoids unnecessary output conversions. + * + * @param varname output variable name + * @return frame as a frame block + * @throws DMLException if DMLException occurs + */ + public FrameBlock getFrameBlock(String varname) throws DMLException { - if( !_out.containsKey(varname) ) - throw new DMLException("Non-existent output variable: "+varname); - Data dat = _out.get(varname); + if( dat == null ) + throw new DMLException("Non-existent output variable: "+varname); //basic checks for data type if( !(dat instanceof FrameObject) ) @@ -117,11 +130,9 @@ public class ResultVariables //convert output matrix to double array FrameObject fo = (FrameObject)dat; - FrameBlock frame = fo.acquireRead(); - String[][] ret = DataConverter.convertToStringFrame(frame); + FrameBlock fb = fo.acquireRead(); fo.release(); - - return ret; + return fb; } /** @@ -133,8 +144,7 @@ public class ResultVariables * @throws DMLException if DMLException occurs */ public double getDouble(String varname) throws DMLException { - ScalarObject sObj = getScalarObject(varname); - return sObj.getDoubleValue(); + return getScalarObject(varname).getDoubleValue(); } /** @@ -146,8 +156,7 @@ public class ResultVariables * @throws DMLException if DMLException occurs */ public boolean getBoolean(String varname) throws DMLException { - ScalarObject sObj = getScalarObject(varname); - return sObj.getBooleanValue(); + return getScalarObject(varname).getBooleanValue(); } /** @@ -159,8 +168,7 @@ public class ResultVariables * @throws DMLException if DMLException occurs */ public long getLong(String varname) throws DMLException { - ScalarObject sObj = getScalarObject(varname); - return sObj.getLongValue(); + return getScalarObject(varname).getLongValue(); } /** @@ -172,8 +180,7 @@ public class ResultVariables * @throws DMLException if DMLException occurs */ public String getString(String varname) throws DMLException { - ScalarObject sObj = getScalarObject(varname); - return sObj.getStringValue(); + return getScalarObject(varname).getStringValue(); } /** @@ -185,14 +192,11 @@ public class ResultVariables * @throws DMLException if DMLException occurs */ public ScalarObject getScalarObject(String varname) throws DMLException { - if (!_out.containsKey(varname)) - throw new DMLException("Non-existent output variable: " + varname); - Data dat = _out.get(varname); - - if (!(dat instanceof ScalarObject)) { + if( dat == null ) + throw new DMLException("Non-existent output variable: " + varname); + if (!(dat instanceof ScalarObject)) throw new DMLException("Expected scalar result '" + varname + "' not a scalar."); - } return (ScalarObject) dat; } @@ -204,8 +208,7 @@ public class ResultVariables * @param ovar output variable name * @param data generated output data */ - protected void addResult(String ovar, Data data) - { + protected void addResult(String ovar, Data data) { _out.put(ovar, data); } } http://git-wip-us.apache.org/repos/asf/systemml/blob/dd6f46a9/src/main/java/org/apache/sysml/runtime/controlprogram/LocalVariableMap.java ---------------------------------------------------------------------- diff --git a/src/main/java/org/apache/sysml/runtime/controlprogram/LocalVariableMap.java b/src/main/java/org/apache/sysml/runtime/controlprogram/LocalVariableMap.java index d60ef24..94d85ad 100644 --- a/src/main/java/org/apache/sysml/runtime/controlprogram/LocalVariableMap.java +++ b/src/main/java/org/apache/sysml/runtime/controlprogram/LocalVariableMap.java @@ -20,6 +20,7 @@ package org.apache.sysml.runtime.controlprogram; import java.util.HashMap; +import java.util.Map; import java.util.Map.Entry; import java.util.Set; import java.util.StringTokenizer; @@ -43,20 +44,17 @@ public class LocalVariableMap implements Cloneable private HashMap <String, Data> localMap = null; private final long localID; - public LocalVariableMap() - { + public LocalVariableMap() { localMap = new HashMap <String, Data>(); localID = _seq.getNextID(); } - public LocalVariableMap(LocalVariableMap vars) - { + public LocalVariableMap(LocalVariableMap vars) { localMap = new HashMap <String, Data>(vars.localMap); localID = _seq.getNextID(); } - public Set<String> keySet() - { + public Set<String> keySet() { return localMap.keySet(); } @@ -66,8 +64,7 @@ public class LocalVariableMap implements Cloneable * @param name the variable name for the data object * @return the direct reference to the data object */ - public Data get( String name ) - { + public Data get( String name ) { return localMap.get( name ); } @@ -81,6 +78,10 @@ public class LocalVariableMap implements Cloneable public void put(String name, Data val) { localMap.put( name, val ); } + + public void putAll(Map<String, Data> vals) { + localMap.putAll(vals); + } public Data remove( String name ) { return localMap.remove( name ); @@ -95,25 +96,20 @@ public class LocalVariableMap implements Cloneable e -> !blacklist.contains(e.getKey())); } - public boolean hasReferences( Data d ) - { + public boolean hasReferences( Data d ) { return localMap.containsValue(d); } - public String serialize() - throws DMLRuntimeException - { + public String serialize() throws DMLRuntimeException { StringBuilder sb = new StringBuilder(); - int count = 0; - for (Entry <String, Data> e : localMap.entrySet ()) - { + for (Entry <String, Data> e : localMap.entrySet ()) { if (count != 0) sb.append (ELEMENT_DELIM); - sb.append (ProgramConverter.serializeDataObject (e.getKey(), e.getValue())); + sb.append(ProgramConverter + .serializeDataObject(e.getKey(), e.getValue())); count++; } - return sb.toString(); } @@ -122,24 +118,21 @@ public class LocalVariableMap implements Cloneable { StringTokenizer st2 = new StringTokenizer (varStr, ELEMENT_DELIM ); LocalVariableMap vars = new LocalVariableMap (); - while( st2.hasMoreTokens() ) - { + while( st2.hasMoreTokens() ) { String tmp = st2.nextToken().trim(); Object[] tmp2 = ProgramConverter.parseDataObject (tmp); - vars.put ((String) tmp2 [0], (Data) tmp2 [1]); + vars.put((String) tmp2 [0], (Data) tmp2 [1]); } return vars; } @Override - public String toString() - { + public String toString() { StringBuilder sb = new StringBuilder(); sb.append("Local Variable Map ID = \""); sb.append(localID); sb.append("\":"); sb.append(eol); - for (Entry <String, Data> pair : localMap.entrySet()) { sb.append(" "); sb.append(pair.getKey()); @@ -147,13 +140,11 @@ public class LocalVariableMap implements Cloneable sb.append(pair.getValue()); sb.append(eol); } - return sb.toString(); } @Override - public Object clone() - { - return new LocalVariableMap( this ); + public Object clone() { + return new LocalVariableMap(this); } } http://git-wip-us.apache.org/repos/asf/systemml/blob/dd6f46a9/src/main/java/org/apache/sysml/runtime/controlprogram/context/ExecutionContextFactory.java ---------------------------------------------------------------------- diff --git a/src/main/java/org/apache/sysml/runtime/controlprogram/context/ExecutionContextFactory.java b/src/main/java/org/apache/sysml/runtime/controlprogram/context/ExecutionContextFactory.java index 9fc871b..968b285 100644 --- a/src/main/java/org/apache/sysml/runtime/controlprogram/context/ExecutionContextFactory.java +++ b/src/main/java/org/apache/sysml/runtime/controlprogram/context/ExecutionContextFactory.java @@ -22,21 +22,26 @@ package org.apache.sysml.runtime.controlprogram.context; import org.apache.sysml.api.DMLScript; import org.apache.sysml.api.DMLScript.RUNTIME_PLATFORM; import org.apache.sysml.hops.OptimizerUtils; +import org.apache.sysml.runtime.controlprogram.LocalVariableMap; import org.apache.sysml.runtime.controlprogram.Program; public class ExecutionContextFactory { - public static ExecutionContext createContext() - { + public static ExecutionContext createContext() { return createContext( null ); } - public static ExecutionContext createContext( Program prog ) - { + public static ExecutionContext createContext(Program prog) { return createContext(true, prog); } + + public static ExecutionContext createContext(LocalVariableMap vars, Program prog) { + ExecutionContext ec = createContext(false, prog); + ec.setVariables(vars); + return ec; + } - public static ExecutionContext createContext( boolean allocateVars, Program prog ) + public static ExecutionContext createContext(boolean allocateVars, Program prog) { ExecutionContext ec = null;
