This is an automated email from the ASF dual-hosted git repository.

baunsgaard pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/systemml.git


The following commit(s) were added to refs/heads/master by this push:
     new b76915c  [SYSTEMDS-511] Add protobuf support
b76915c is described below

commit b76915c68e02f421027f6673851de7a8caf6d16f
Author: Herbert Mühlburger <[email protected]>
AuthorDate: Thu Jun 25 12:43:50 2020 +0200

    [SYSTEMDS-511] Add protobuf support
    
    Adds support for Protobuf file format, for both reads and write.
    
    AMLS project SS2020, part 1
    
    Closes #971
---
 dev/Tasks.txt                                      |    3 +
 pom.xml                                            |   14 +-
 src/main/java/org/apache/sysds/common/Types.java   |    3 +-
 .../apache/sysds/parser/dml/DmlBaseListener.java   |    2 +-
 .../java/org/apache/sysds/parser/dml/DmlLexer.java |    2 +-
 .../org/apache/sysds/parser/dml/DmlListener.java   |    2 +-
 .../org/apache/sysds/parser/dml/DmlParser.java     |    2 +-
 .../org/apache/sysds/protobuf/SysdsProtos.java     | 3063 ++++++++++++++++++++
 .../sysds/runtime/io/FrameReaderFactory.java       |   39 +-
 .../apache/sysds/runtime/io/FrameReaderProto.java  |   87 +
 .../sysds/runtime/io/FrameWriterFactory.java       |    5 +
 .../apache/sysds/runtime/io/FrameWriterProto.java  |   80 +
 src/main/resources/protobuf/Frame.proto            |   46 +
 .../io/proto/FrameReaderWriterProtoTest.java       |   81 +
 14 files changed, 3404 insertions(+), 25 deletions(-)

diff --git a/dev/Tasks.txt b/dev/Tasks.txt
index c84a523..673c737 100644
--- a/dev/Tasks.txt
+++ b/dev/Tasks.txt
@@ -349,3 +349,6 @@ SYSTEMDS-500 Documentation Webpage Reintroduction
 
 Others:
  * Break append instruction to cbind and rbind 
+
+SYSTEMDS-510 IO formats
+ * 511 Add protobuf support to write and read FrameBlocks to HDFS     OK
\ No newline at end of file
diff --git a/pom.xml b/pom.xml
index 0e4fe44..54cfb85 100644
--- a/pom.xml
+++ b/pom.xml
@@ -1034,6 +1034,18 @@
                        <artifactId>maven-gpg-plugin</artifactId>
                        <version>1.6</version>
                </dependency>
-  
+
+               <!-- 
https://github.com/protocolbuffers/protobuf/tree/master/java -->
+               <dependency>
+                       <groupId>com.google.protobuf</groupId>
+                       <artifactId>protobuf-java</artifactId>
+                       <version>3.12.2</version>
+               </dependency>
+
+               <dependency>
+                       <groupId>com.google.protobuf</groupId>
+                       <artifactId>protobuf-java-util</artifactId>
+                       <version>3.12.2</version>
+               </dependency>
        </dependencies>
 </project>
diff --git a/src/main/java/org/apache/sysds/common/Types.java 
b/src/main/java/org/apache/sysds/common/Types.java
index 996132f..02b1519 100644
--- a/src/main/java/org/apache/sysds/common/Types.java
+++ b/src/main/java/org/apache/sysds/common/Types.java
@@ -483,7 +483,8 @@ public class Types
                CSV,    // text dense representation
                LIBSVM, // text libsvm sparse row representation
                JSONL,  // text nested JSON (Line) representation
-               BINARY; // binary block representation 
(dense/sparse/ultra-sparse) 
+               BINARY, // binary block representation 
(dense/sparse/ultra-sparse)
+               PROTO;  // protocol buffer representation
                
                public boolean isIJVFormat() {
                        return this == TEXT || this == MM;
diff --git a/src/main/java/org/apache/sysds/parser/dml/DmlBaseListener.java 
b/src/main/java/org/apache/sysds/parser/dml/DmlBaseListener.java
index 70e7de4..b165586 100644
--- a/src/main/java/org/apache/sysds/parser/dml/DmlBaseListener.java
+++ b/src/main/java/org/apache/sysds/parser/dml/DmlBaseListener.java
@@ -1,4 +1,4 @@
-// Generated from org/apache/sysds/parser/dml/Dml.g4 by ANTLR 4.5.3
+// Generated from org\apache\sysds\parser\dml\Dml.g4 by ANTLR 4.5.3
 package org.apache.sysds.parser.dml;
 
 /*
diff --git a/src/main/java/org/apache/sysds/parser/dml/DmlLexer.java 
b/src/main/java/org/apache/sysds/parser/dml/DmlLexer.java
index 8ddedf1..3dd23d2 100644
--- a/src/main/java/org/apache/sysds/parser/dml/DmlLexer.java
+++ b/src/main/java/org/apache/sysds/parser/dml/DmlLexer.java
@@ -1,4 +1,4 @@
-// Generated from org/apache/sysds/parser/dml/Dml.g4 by ANTLR 4.5.3
+// Generated from org\apache\sysds\parser\dml\Dml.g4 by ANTLR 4.5.3
 package org.apache.sysds.parser.dml;
 
 /*
diff --git a/src/main/java/org/apache/sysds/parser/dml/DmlListener.java 
b/src/main/java/org/apache/sysds/parser/dml/DmlListener.java
index 434d085..36904af 100644
--- a/src/main/java/org/apache/sysds/parser/dml/DmlListener.java
+++ b/src/main/java/org/apache/sysds/parser/dml/DmlListener.java
@@ -1,4 +1,4 @@
-// Generated from org/apache/sysds/parser/dml/Dml.g4 by ANTLR 4.5.3
+// Generated from org\apache\sysds\parser\dml\Dml.g4 by ANTLR 4.5.3
 package org.apache.sysds.parser.dml;
 
 /*
diff --git a/src/main/java/org/apache/sysds/parser/dml/DmlParser.java 
b/src/main/java/org/apache/sysds/parser/dml/DmlParser.java
index 4a10457..c751526 100644
--- a/src/main/java/org/apache/sysds/parser/dml/DmlParser.java
+++ b/src/main/java/org/apache/sysds/parser/dml/DmlParser.java
@@ -1,4 +1,4 @@
-// Generated from org/apache/sysds/parser/dml/Dml.g4 by ANTLR 4.5.3
+// Generated from org\apache\sysds\parser\dml\Dml.g4 by ANTLR 4.5.3
 package org.apache.sysds.parser.dml;
 
 /*
diff --git a/src/main/java/org/apache/sysds/protobuf/SysdsProtos.java 
b/src/main/java/org/apache/sysds/protobuf/SysdsProtos.java
new file mode 100644
index 0000000..514d30c
--- /dev/null
+++ b/src/main/java/org/apache/sysds/protobuf/SysdsProtos.java
@@ -0,0 +1,3063 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: src/main/resources/protobuf/Frame.proto
+/*
+ * 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.sysds.protobuf;
+
+public final class SysdsProtos {
+       private static final com.google.protobuf.Descriptors.Descriptor 
internal_static_sysds_Frame_descriptor;
+       private static final 
com.google.protobuf.GeneratedMessageV3.FieldAccessorTable 
internal_static_sysds_Frame_fieldAccessorTable;
+       private static final com.google.protobuf.Descriptors.Descriptor 
internal_static_sysds_Row_descriptor;
+       private static final 
com.google.protobuf.GeneratedMessageV3.FieldAccessorTable 
internal_static_sysds_Row_fieldAccessorTable;
+       private static final com.google.protobuf.Descriptors.Descriptor 
internal_static_sysds_Schema_descriptor;
+       private static final 
com.google.protobuf.GeneratedMessageV3.FieldAccessorTable 
internal_static_sysds_Schema_fieldAccessorTable;
+       private static com.google.protobuf.Descriptors.FileDescriptor 
descriptor;
+
+       static {
+               java.lang.String[] descriptorData = 
{"\n\'src/main/resources/protobuf/Frame.prot"
+                       + 
"o\022\005sysds\"!\n\005Frame\022\030\n\004rows\030\001 \003(\0132\n.sysds."
+                       + "Row\"V\n\003Row\022\024\n\014column_names\030\001 
\003(\t\022\023\n\013colu"
+                       + "mn_data\030\002 
\003(\t\022$\n\rcolumn_schema\030\003 \003(\0132\r.s"
+                       + 
"ysds.Schema\"\221\001\n\006Schema\022*\n\tvalueType\030\001 \003("
+                       + "\0162\027.sysds.Schema.ValueType\"[\n\tValueType\022"
+                       + 
"\010\n\004FP32\020\000\022\010\n\004FP64\020\001\022\t\n\005INT32\020\002\022\t\n\005INT64\020"
+                       + 
"\003\022\013\n\007BOOLEAN\020\004\022\n\n\006STRING\020\005\022\013\n\007UNKNOWN\020\006B"
+                       + "*\n\031org.apache.sysds.protobufB\013SysdsProto" + 
"sP\000b\006proto3"};
+               descriptor = 
com.google.protobuf.Descriptors.FileDescriptor.internalBuildGeneratedFileFrom(descriptorData,
+                       new com.google.protobuf.Descriptors.FileDescriptor[] 
{});
+               internal_static_sysds_Frame_descriptor = 
getDescriptor().getMessageTypes().get(0);
+               internal_static_sysds_Frame_fieldAccessorTable = new 
com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
+                       internal_static_sysds_Frame_descriptor, new 
java.lang.String[] {"Rows",});
+               internal_static_sysds_Row_descriptor = 
getDescriptor().getMessageTypes().get(1);
+               internal_static_sysds_Row_fieldAccessorTable = new 
com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
+                       internal_static_sysds_Row_descriptor,
+                       new java.lang.String[] {"ColumnNames", "ColumnData", 
"ColumnSchema",});
+               internal_static_sysds_Schema_descriptor = 
getDescriptor().getMessageTypes().get(2);
+               internal_static_sysds_Schema_fieldAccessorTable = new 
com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
+                       internal_static_sysds_Schema_descriptor, new 
java.lang.String[] {"ValueType",});
+       }
+
+       private SysdsProtos() {
+       }
+
+       public static void 
registerAllExtensions(com.google.protobuf.ExtensionRegistryLite registry) {
+       }
+
+       public static void 
registerAllExtensions(com.google.protobuf.ExtensionRegistry registry) {
+               
registerAllExtensions((com.google.protobuf.ExtensionRegistryLite) registry);
+       }
+
+       public static com.google.protobuf.Descriptors.FileDescriptor 
getDescriptor() {
+               return descriptor;
+       }
+
+       public interface FrameOrBuilder extends
+               // @@protoc_insertion_point(interface_extends:sysds.Frame)
+               com.google.protobuf.MessageOrBuilder {
+
+               /**
+                * <code>repeated .sysds.Row rows = 1;</code>
+                */
+               java.util.List<org.apache.sysds.protobuf.SysdsProtos.Row> 
getRowsList();
+
+               /**
+                * <code>repeated .sysds.Row rows = 1;</code>
+                */
+               org.apache.sysds.protobuf.SysdsProtos.Row getRows(int index);
+
+               /**
+                * <code>repeated .sysds.Row rows = 1;</code>
+                */
+               int getRowsCount();
+
+               /**
+                * <code>repeated .sysds.Row rows = 1;</code>
+                */
+               java.util.List<? extends 
org.apache.sysds.protobuf.SysdsProtos.RowOrBuilder> getRowsOrBuilderList();
+
+               /**
+                * <code>repeated .sysds.Row rows = 1;</code>
+                */
+               org.apache.sysds.protobuf.SysdsProtos.RowOrBuilder 
getRowsOrBuilder(int index);
+       }
+
+       public interface RowOrBuilder extends
+               // @@protoc_insertion_point(interface_extends:sysds.Row)
+               com.google.protobuf.MessageOrBuilder {
+
+               /**
+                * <code>repeated string column_names = 1;</code>
+                *
+                * @return A list containing the columnNames.
+                */
+               java.util.List<java.lang.String> getColumnNamesList();
+
+               /**
+                * <code>repeated string column_names = 1;</code>
+                *
+                * @return The count of columnNames.
+                */
+               int getColumnNamesCount();
+
+               /**
+                * <code>repeated string column_names = 1;</code>
+                *
+                * @param index The index of the element to return.
+                * @return The columnNames at the given index.
+                */
+               java.lang.String getColumnNames(int index);
+
+               /**
+                * <code>repeated string column_names = 1;</code>
+                *
+                * @param index The index of the value to return.
+                * @return The bytes of the columnNames at the given index.
+                */
+               com.google.protobuf.ByteString getColumnNamesBytes(int index);
+
+               /**
+                * <code>repeated string column_data = 2;</code>
+                *
+                * @return A list containing the columnData.
+                */
+               java.util.List<java.lang.String> getColumnDataList();
+
+               /**
+                * <code>repeated string column_data = 2;</code>
+                *
+                * @return The count of columnData.
+                */
+               int getColumnDataCount();
+
+               /**
+                * <code>repeated string column_data = 2;</code>
+                *
+                * @param index The index of the element to return.
+                * @return The columnData at the given index.
+                */
+               java.lang.String getColumnData(int index);
+
+               /**
+                * <code>repeated string column_data = 2;</code>
+                *
+                * @param index The index of the value to return.
+                * @return The bytes of the columnData at the given index.
+                */
+               com.google.protobuf.ByteString getColumnDataBytes(int index);
+
+               /**
+                * <code>repeated .sysds.Schema column_schema = 3;</code>
+                */
+               java.util.List<org.apache.sysds.protobuf.SysdsProtos.Schema> 
getColumnSchemaList();
+
+               /**
+                * <code>repeated .sysds.Schema column_schema = 3;</code>
+                */
+               org.apache.sysds.protobuf.SysdsProtos.Schema 
getColumnSchema(int index);
+
+               /**
+                * <code>repeated .sysds.Schema column_schema = 3;</code>
+                */
+               int getColumnSchemaCount();
+
+               /**
+                * <code>repeated .sysds.Schema column_schema = 3;</code>
+                */
+               java.util.List<? extends 
org.apache.sysds.protobuf.SysdsProtos.SchemaOrBuilder> 
getColumnSchemaOrBuilderList();
+
+               /**
+                * <code>repeated .sysds.Schema column_schema = 3;</code>
+                */
+               org.apache.sysds.protobuf.SysdsProtos.SchemaOrBuilder 
getColumnSchemaOrBuilder(int index);
+       }
+
+       public interface SchemaOrBuilder extends
+               // @@protoc_insertion_point(interface_extends:sysds.Schema)
+               com.google.protobuf.MessageOrBuilder {
+
+               /**
+                * <code>repeated .sysds.Schema.ValueType valueType = 1;</code>
+                *
+                * @return A list containing the valueType.
+                */
+               
java.util.List<org.apache.sysds.protobuf.SysdsProtos.Schema.ValueType> 
getValueTypeList();
+
+               /**
+                * <code>repeated .sysds.Schema.ValueType valueType = 1;</code>
+                *
+                * @return The count of valueType.
+                */
+               int getValueTypeCount();
+
+               /**
+                * <code>repeated .sysds.Schema.ValueType valueType = 1;</code>
+                *
+                * @param index The index of the element to return.
+                * @return The valueType at the given index.
+                */
+               org.apache.sysds.protobuf.SysdsProtos.Schema.ValueType 
getValueType(int index);
+
+               /**
+                * <code>repeated .sysds.Schema.ValueType valueType = 1;</code>
+                *
+                * @return A list containing the enum numeric values on the 
wire for valueType.
+                */
+               java.util.List<java.lang.Integer> getValueTypeValueList();
+
+               /**
+                * <code>repeated .sysds.Schema.ValueType valueType = 1;</code>
+                *
+                * @param index The index of the value to return.
+                * @return The enum numeric value on the wire of valueType at 
the given index.
+                */
+               int getValueTypeValue(int index);
+       }
+
+       /**
+        * Protobuf type {@code sysds.Frame}
+        */
+       public static final class Frame extends 
com.google.protobuf.GeneratedMessageV3 implements
+               // @@protoc_insertion_point(message_implements:sysds.Frame)
+               FrameOrBuilder {
+               public static final int ROWS_FIELD_NUMBER = 1;
+               private static final long serialVersionUID = 0L;
+               // @@protoc_insertion_point(class_scope:sysds.Frame)
+               private static final 
org.apache.sysds.protobuf.SysdsProtos.Frame DEFAULT_INSTANCE;
+               private static final com.google.protobuf.Parser<Frame> PARSER = 
new com.google.protobuf.AbstractParser<Frame>() {
+                       @java.lang.Override
+                       public Frame 
parsePartialFrom(com.google.protobuf.CodedInputStream input,
+                               com.google.protobuf.ExtensionRegistryLite 
extensionRegistry)
+                               throws 
com.google.protobuf.InvalidProtocolBufferException {
+                               return new Frame(input, extensionRegistry);
+                       }
+               };
+
+               static {
+                       DEFAULT_INSTANCE = new 
org.apache.sysds.protobuf.SysdsProtos.Frame();
+               }
+
+               private 
java.util.List<org.apache.sysds.protobuf.SysdsProtos.Row> rows_;
+               private byte memoizedIsInitialized = -1;
+
+               // Use Frame.newBuilder() to construct.
+               private Frame(com.google.protobuf.GeneratedMessageV3.Builder<?> 
builder) {
+                       super(builder);
+               }
+
+               private Frame() {
+                       rows_ = java.util.Collections.emptyList();
+               }
+
+               private Frame(com.google.protobuf.CodedInputStream input,
+                       com.google.protobuf.ExtensionRegistryLite 
extensionRegistry)
+                       throws 
com.google.protobuf.InvalidProtocolBufferException {
+                       this();
+                       if(extensionRegistry == null) {
+                               throw new java.lang.NullPointerException();
+                       }
+                       int mutable_bitField0_ = 0;
+                       com.google.protobuf.UnknownFieldSet.Builder 
unknownFields = com.google.protobuf.UnknownFieldSet
+                               .newBuilder();
+                       try {
+                               boolean done = false;
+                               while(!done) {
+                                       int tag = input.readTag();
+                                       switch(tag) {
+                                               case 0:
+                                                       done = true;
+                                                       break;
+                                               case 10: {
+                                                       
if(!((mutable_bitField0_ & 0x00000001) != 0)) {
+                                                               rows_ = new 
java.util.ArrayList<org.apache.sysds.protobuf.SysdsProtos.Row>();
+                                                               
mutable_bitField0_ |= 0x00000001;
+                                                       }
+                                                       
rows_.add(input.readMessage(org.apache.sysds.protobuf.SysdsProtos.Row.parser(),
+                                                               
extensionRegistry));
+                                                       break;
+                                               }
+                                               default: {
+                                                       
if(!parseUnknownField(input, unknownFields, extensionRegistry, tag)) {
+                                                               done = true;
+                                                       }
+                                                       break;
+                                               }
+                                       }
+                               }
+                       }
+                       
catch(com.google.protobuf.InvalidProtocolBufferException e) {
+                               throw e.setUnfinishedMessage(this);
+                       }
+                       catch(java.io.IOException e) {
+                               throw new 
com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this);
+                       }
+                       finally {
+                               if(((mutable_bitField0_ & 0x00000001) != 0)) {
+                                       rows_ = 
java.util.Collections.unmodifiableList(rows_);
+                               }
+                               this.unknownFields = unknownFields.build();
+                               makeExtensionsImmutable();
+                       }
+               }
+
+               public static final com.google.protobuf.Descriptors.Descriptor 
getDescriptor() {
+                       return 
org.apache.sysds.protobuf.SysdsProtos.internal_static_sysds_Frame_descriptor;
+               }
+
+               public static org.apache.sysds.protobuf.SysdsProtos.Frame 
parseFrom(java.nio.ByteBuffer data)
+                       throws 
com.google.protobuf.InvalidProtocolBufferException {
+                       return PARSER.parseFrom(data);
+               }
+
+               public static org.apache.sysds.protobuf.SysdsProtos.Frame 
parseFrom(java.nio.ByteBuffer data,
+                       com.google.protobuf.ExtensionRegistryLite 
extensionRegistry)
+                       throws 
com.google.protobuf.InvalidProtocolBufferException {
+                       return PARSER.parseFrom(data, extensionRegistry);
+               }
+
+               public static org.apache.sysds.protobuf.SysdsProtos.Frame 
parseFrom(com.google.protobuf.ByteString data)
+                       throws 
com.google.protobuf.InvalidProtocolBufferException {
+                       return PARSER.parseFrom(data);
+               }
+
+               public static org.apache.sysds.protobuf.SysdsProtos.Frame 
parseFrom(com.google.protobuf.ByteString data,
+                       com.google.protobuf.ExtensionRegistryLite 
extensionRegistry)
+                       throws 
com.google.protobuf.InvalidProtocolBufferException {
+                       return PARSER.parseFrom(data, extensionRegistry);
+               }
+
+               public static org.apache.sysds.protobuf.SysdsProtos.Frame 
parseFrom(byte[] data)
+                       throws 
com.google.protobuf.InvalidProtocolBufferException {
+                       return PARSER.parseFrom(data);
+               }
+
+               public static org.apache.sysds.protobuf.SysdsProtos.Frame 
parseFrom(byte[] data,
+                       com.google.protobuf.ExtensionRegistryLite 
extensionRegistry)
+                       throws 
com.google.protobuf.InvalidProtocolBufferException {
+                       return PARSER.parseFrom(data, extensionRegistry);
+               }
+
+               public static org.apache.sysds.protobuf.SysdsProtos.Frame 
parseFrom(java.io.InputStream input)
+                       throws java.io.IOException {
+                       return 
com.google.protobuf.GeneratedMessageV3.parseWithIOException(PARSER, input);
+               }
+
+               public static org.apache.sysds.protobuf.SysdsProtos.Frame 
parseFrom(java.io.InputStream input,
+                       com.google.protobuf.ExtensionRegistryLite 
extensionRegistry) throws java.io.IOException {
+                       return 
com.google.protobuf.GeneratedMessageV3.parseWithIOException(PARSER, input, 
extensionRegistry);
+               }
+
+               public static org.apache.sysds.protobuf.SysdsProtos.Frame 
parseDelimitedFrom(java.io.InputStream input)
+                       throws java.io.IOException {
+                       return 
com.google.protobuf.GeneratedMessageV3.parseDelimitedWithIOException(PARSER, 
input);
+               }
+
+               public static org.apache.sysds.protobuf.SysdsProtos.Frame 
parseDelimitedFrom(java.io.InputStream input,
+                       com.google.protobuf.ExtensionRegistryLite 
extensionRegistry) throws java.io.IOException {
+                       return com.google.protobuf.GeneratedMessageV3
+                               .parseDelimitedWithIOException(PARSER, input, 
extensionRegistry);
+               }
+
+               public static org.apache.sysds.protobuf.SysdsProtos.Frame 
parseFrom(com.google.protobuf.CodedInputStream input)
+                       throws java.io.IOException {
+                       return 
com.google.protobuf.GeneratedMessageV3.parseWithIOException(PARSER, input);
+               }
+
+               public static org.apache.sysds.protobuf.SysdsProtos.Frame 
parseFrom(com.google.protobuf.CodedInputStream input,
+                       com.google.protobuf.ExtensionRegistryLite 
extensionRegistry) throws java.io.IOException {
+                       return 
com.google.protobuf.GeneratedMessageV3.parseWithIOException(PARSER, input, 
extensionRegistry);
+               }
+
+               public static Builder newBuilder() {
+                       return DEFAULT_INSTANCE.toBuilder();
+               }
+
+               public static Builder 
newBuilder(org.apache.sysds.protobuf.SysdsProtos.Frame prototype) {
+                       return 
DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype);
+               }
+
+               public static org.apache.sysds.protobuf.SysdsProtos.Frame 
getDefaultInstance() {
+                       return DEFAULT_INSTANCE;
+               }
+
+               public static com.google.protobuf.Parser<Frame> parser() {
+                       return PARSER;
+               }
+
+               @java.lang.Override
+               @SuppressWarnings({"unused"})
+               protected java.lang.Object newInstance(UnusedPrivateParameter 
unused) {
+                       return new Frame();
+               }
+
+               @java.lang.Override
+               public final com.google.protobuf.UnknownFieldSet 
getUnknownFields() {
+                       return this.unknownFields;
+               }
+
+               @java.lang.Override
+               protected 
com.google.protobuf.GeneratedMessageV3.FieldAccessorTable 
internalGetFieldAccessorTable() {
+                       return 
org.apache.sysds.protobuf.SysdsProtos.internal_static_sysds_Frame_fieldAccessorTable
+                               
.ensureFieldAccessorsInitialized(org.apache.sysds.protobuf.SysdsProtos.Frame.class,
+                                       
org.apache.sysds.protobuf.SysdsProtos.Frame.Builder.class);
+               }
+
+               /**
+                * <code>repeated .sysds.Row rows = 1;</code>
+                */
+               @java.lang.Override
+               public 
java.util.List<org.apache.sysds.protobuf.SysdsProtos.Row> getRowsList() {
+                       return rows_;
+               }
+
+               /**
+                * <code>repeated .sysds.Row rows = 1;</code>
+                */
+               @java.lang.Override
+               public java.util.List<? extends 
org.apache.sysds.protobuf.SysdsProtos.RowOrBuilder> getRowsOrBuilderList() {
+                       return rows_;
+               }
+
+               /**
+                * <code>repeated .sysds.Row rows = 1;</code>
+                */
+               @java.lang.Override
+               public int getRowsCount() {
+                       return rows_.size();
+               }
+
+               /**
+                * <code>repeated .sysds.Row rows = 1;</code>
+                */
+               @java.lang.Override
+               public org.apache.sysds.protobuf.SysdsProtos.Row getRows(int 
index) {
+                       return rows_.get(index);
+               }
+
+               /**
+                * <code>repeated .sysds.Row rows = 1;</code>
+                */
+               @java.lang.Override
+               public org.apache.sysds.protobuf.SysdsProtos.RowOrBuilder 
getRowsOrBuilder(int index) {
+                       return rows_.get(index);
+               }
+
+               @java.lang.Override
+               public final boolean isInitialized() {
+                       byte isInitialized = memoizedIsInitialized;
+                       if(isInitialized == 1)
+                               return true;
+                       if(isInitialized == 0)
+                               return false;
+
+                       memoizedIsInitialized = 1;
+                       return true;
+               }
+
+               @java.lang.Override
+               public void writeTo(com.google.protobuf.CodedOutputStream 
output) throws java.io.IOException {
+                       for(int i = 0; i < rows_.size(); i++) {
+                               output.writeMessage(1, rows_.get(i));
+                       }
+                       unknownFields.writeTo(output);
+               }
+
+               @java.lang.Override
+               public int getSerializedSize() {
+                       int size = memoizedSize;
+                       if(size != -1)
+                               return size;
+
+                       size = 0;
+                       for(int i = 0; i < rows_.size(); i++) {
+                               size += 
com.google.protobuf.CodedOutputStream.computeMessageSize(1, rows_.get(i));
+                       }
+                       size += unknownFields.getSerializedSize();
+                       memoizedSize = size;
+                       return size;
+               }
+
+               @java.lang.Override
+               public boolean equals(final java.lang.Object obj) {
+                       if(obj == this) {
+                               return true;
+                       }
+                       if(!(obj instanceof 
org.apache.sysds.protobuf.SysdsProtos.Frame)) {
+                               return super.equals(obj);
+                       }
+                       org.apache.sysds.protobuf.SysdsProtos.Frame other = 
(org.apache.sysds.protobuf.SysdsProtos.Frame) obj;
+
+                       if(!getRowsList().equals(other.getRowsList()))
+                               return false;
+                       if(!unknownFields.equals(other.unknownFields))
+                               return false;
+                       return true;
+               }
+
+               @java.lang.Override
+               public int hashCode() {
+                       if(memoizedHashCode != 0) {
+                               return memoizedHashCode;
+                       }
+                       int hash = 41;
+                       hash = (19 * hash) + getDescriptor().hashCode();
+                       if(getRowsCount() > 0) {
+                               hash = (37 * hash) + ROWS_FIELD_NUMBER;
+                               hash = (53 * hash) + getRowsList().hashCode();
+                       }
+                       hash = (29 * hash) + unknownFields.hashCode();
+                       memoizedHashCode = hash;
+                       return hash;
+               }
+
+               @java.lang.Override
+               public Builder newBuilderForType() {
+                       return newBuilder();
+               }
+
+               @java.lang.Override
+               public Builder toBuilder() {
+                       return this == DEFAULT_INSTANCE ? new Builder() : new 
Builder().mergeFrom(this);
+               }
+
+               @java.lang.Override
+               protected Builder 
newBuilderForType(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
+                       Builder builder = new Builder(parent);
+                       return builder;
+               }
+
+               @java.lang.Override
+               public com.google.protobuf.Parser<Frame> getParserForType() {
+                       return PARSER;
+               }
+
+               @java.lang.Override
+               public org.apache.sysds.protobuf.SysdsProtos.Frame 
getDefaultInstanceForType() {
+                       return DEFAULT_INSTANCE;
+               }
+
+               /**
+                * Protobuf type {@code sysds.Frame}
+                */
+               public static final class Builder extends 
com.google.protobuf.GeneratedMessageV3.Builder<Builder> implements
+                       // 
@@protoc_insertion_point(builder_implements:sysds.Frame)
+                       org.apache.sysds.protobuf.SysdsProtos.FrameOrBuilder {
+                       private int bitField0_;
+                       private 
java.util.List<org.apache.sysds.protobuf.SysdsProtos.Row> rows_ = 
java.util.Collections.emptyList();
+                       private 
com.google.protobuf.RepeatedFieldBuilderV3<org.apache.sysds.protobuf.SysdsProtos.Row,
 org.apache.sysds.protobuf.SysdsProtos.Row.Builder, 
org.apache.sysds.protobuf.SysdsProtos.RowOrBuilder> rowsBuilder_;
+
+                       // Construct using 
org.apache.sysds.protobuf.SysdsProtos.Frame.newBuilder()
+                       private Builder() {
+                               maybeForceBuilderInitialization();
+                       }
+
+                       private 
Builder(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
+                               super(parent);
+                               maybeForceBuilderInitialization();
+                       }
+
+                       public static final 
com.google.protobuf.Descriptors.Descriptor getDescriptor() {
+                               return 
org.apache.sysds.protobuf.SysdsProtos.internal_static_sysds_Frame_descriptor;
+                       }
+
+                       @java.lang.Override
+                       protected 
com.google.protobuf.GeneratedMessageV3.FieldAccessorTable 
internalGetFieldAccessorTable() {
+                               return 
org.apache.sysds.protobuf.SysdsProtos.internal_static_sysds_Frame_fieldAccessorTable
+                                       
.ensureFieldAccessorsInitialized(org.apache.sysds.protobuf.SysdsProtos.Frame.class,
+                                               
org.apache.sysds.protobuf.SysdsProtos.Frame.Builder.class);
+                       }
+
+                       private void maybeForceBuilderInitialization() {
+                               
if(com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders) {
+                                       getRowsFieldBuilder();
+                               }
+                       }
+
+                       @java.lang.Override
+                       public Builder clear() {
+                               super.clear();
+                               if(rowsBuilder_ == null) {
+                                       rows_ = 
java.util.Collections.emptyList();
+                                       bitField0_ = (bitField0_ & ~0x00000001);
+                               }
+                               else {
+                                       rowsBuilder_.clear();
+                               }
+                               return this;
+                       }
+
+                       @java.lang.Override
+                       public com.google.protobuf.Descriptors.Descriptor 
getDescriptorForType() {
+                               return 
org.apache.sysds.protobuf.SysdsProtos.internal_static_sysds_Frame_descriptor;
+                       }
+
+                       @java.lang.Override
+                       public org.apache.sysds.protobuf.SysdsProtos.Frame 
getDefaultInstanceForType() {
+                               return 
org.apache.sysds.protobuf.SysdsProtos.Frame.getDefaultInstance();
+                       }
+
+                       @java.lang.Override
+                       public org.apache.sysds.protobuf.SysdsProtos.Frame 
build() {
+                               org.apache.sysds.protobuf.SysdsProtos.Frame 
result = buildPartial();
+                               if(!result.isInitialized()) {
+                                       throw 
newUninitializedMessageException(result);
+                               }
+                               return result;
+                       }
+
+                       @java.lang.Override
+                       public org.apache.sysds.protobuf.SysdsProtos.Frame 
buildPartial() {
+                               org.apache.sysds.protobuf.SysdsProtos.Frame 
result = new org.apache.sysds.protobuf.SysdsProtos.Frame(
+                                       this);
+                               int from_bitField0_ = bitField0_;
+                               if(rowsBuilder_ == null) {
+                                       if(((bitField0_ & 0x00000001) != 0)) {
+                                               rows_ = 
java.util.Collections.unmodifiableList(rows_);
+                                               bitField0_ = (bitField0_ & 
~0x00000001);
+                                       }
+                                       result.rows_ = rows_;
+                               }
+                               else {
+                                       result.rows_ = rowsBuilder_.build();
+                               }
+                               onBuilt();
+                               return result;
+                       }
+
+                       @java.lang.Override
+                       public Builder clone() {
+                               return super.clone();
+                       }
+
+                       @java.lang.Override
+                       public Builder 
setField(com.google.protobuf.Descriptors.FieldDescriptor field, 
java.lang.Object value) {
+                               return super.setField(field, value);
+                       }
+
+                       @java.lang.Override
+                       public Builder 
clearField(com.google.protobuf.Descriptors.FieldDescriptor field) {
+                               return super.clearField(field);
+                       }
+
+                       @java.lang.Override
+                       public Builder 
clearOneof(com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+                               return super.clearOneof(oneof);
+                       }
+
+                       @java.lang.Override
+                       public Builder 
setRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, int 
index,
+                               java.lang.Object value) {
+                               return super.setRepeatedField(field, index, 
value);
+                       }
+
+                       @java.lang.Override
+                       public Builder 
addRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field,
+                               java.lang.Object value) {
+                               return super.addRepeatedField(field, value);
+                       }
+
+                       @java.lang.Override
+                       public Builder mergeFrom(com.google.protobuf.Message 
other) {
+                               if(other instanceof 
org.apache.sysds.protobuf.SysdsProtos.Frame) {
+                                       return 
mergeFrom((org.apache.sysds.protobuf.SysdsProtos.Frame) other);
+                               }
+                               else {
+                                       super.mergeFrom(other);
+                                       return this;
+                               }
+                       }
+
+                       public Builder 
mergeFrom(org.apache.sysds.protobuf.SysdsProtos.Frame other) {
+                               if(other == 
org.apache.sysds.protobuf.SysdsProtos.Frame.getDefaultInstance())
+                                       return this;
+                               if(rowsBuilder_ == null) {
+                                       if(!other.rows_.isEmpty()) {
+                                               if(rows_.isEmpty()) {
+                                                       rows_ = other.rows_;
+                                                       bitField0_ = 
(bitField0_ & ~0x00000001);
+                                               }
+                                               else {
+                                                       ensureRowsIsMutable();
+                                                       
rows_.addAll(other.rows_);
+                                               }
+                                               onChanged();
+                                       }
+                               }
+                               else {
+                                       if(!other.rows_.isEmpty()) {
+                                               if(rowsBuilder_.isEmpty()) {
+                                                       rowsBuilder_.dispose();
+                                                       rowsBuilder_ = null;
+                                                       rows_ = other.rows_;
+                                                       bitField0_ = 
(bitField0_ & ~0x00000001);
+                                                       rowsBuilder_ = 
com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders ? 
getRowsFieldBuilder() : null;
+                                               }
+                                               else {
+                                                       
rowsBuilder_.addAllMessages(other.rows_);
+                                               }
+                                       }
+                               }
+                               this.mergeUnknownFields(other.unknownFields);
+                               onChanged();
+                               return this;
+                       }
+
+                       @java.lang.Override
+                       public final boolean isInitialized() {
+                               return true;
+                       }
+
+                       @java.lang.Override
+                       public Builder 
mergeFrom(com.google.protobuf.CodedInputStream input,
+                               com.google.protobuf.ExtensionRegistryLite 
extensionRegistry) throws java.io.IOException {
+                               org.apache.sysds.protobuf.SysdsProtos.Frame 
parsedMessage = null;
+                               try {
+                                       parsedMessage = 
PARSER.parsePartialFrom(input, extensionRegistry);
+                               }
+                               
catch(com.google.protobuf.InvalidProtocolBufferException e) {
+                                       parsedMessage = 
(org.apache.sysds.protobuf.SysdsProtos.Frame) e.getUnfinishedMessage();
+                                       throw e.unwrapIOException();
+                               }
+                               finally {
+                                       if(parsedMessage != null) {
+                                               mergeFrom(parsedMessage);
+                                       }
+                               }
+                               return this;
+                       }
+
+                       private void ensureRowsIsMutable() {
+                               if(!((bitField0_ & 0x00000001) != 0)) {
+                                       rows_ = new 
java.util.ArrayList<org.apache.sysds.protobuf.SysdsProtos.Row>(rows_);
+                                       bitField0_ |= 0x00000001;
+                               }
+                       }
+
+                       /**
+                        * <code>repeated .sysds.Row rows = 1;</code>
+                        */
+                       public 
java.util.List<org.apache.sysds.protobuf.SysdsProtos.Row> getRowsList() {
+                               if(rowsBuilder_ == null) {
+                                       return 
java.util.Collections.unmodifiableList(rows_);
+                               }
+                               else {
+                                       return rowsBuilder_.getMessageList();
+                               }
+                       }
+
+                       /**
+                        * <code>repeated .sysds.Row rows = 1;</code>
+                        */
+                       public int getRowsCount() {
+                               if(rowsBuilder_ == null) {
+                                       return rows_.size();
+                               }
+                               else {
+                                       return rowsBuilder_.getCount();
+                               }
+                       }
+
+                       /**
+                        * <code>repeated .sysds.Row rows = 1;</code>
+                        */
+                       public org.apache.sysds.protobuf.SysdsProtos.Row 
getRows(int index) {
+                               if(rowsBuilder_ == null) {
+                                       return rows_.get(index);
+                               }
+                               else {
+                                       return rowsBuilder_.getMessage(index);
+                               }
+                       }
+
+                       /**
+                        * <code>repeated .sysds.Row rows = 1;</code>
+                        */
+                       public Builder setRows(int index, 
org.apache.sysds.protobuf.SysdsProtos.Row value) {
+                               if(rowsBuilder_ == null) {
+                                       if(value == null) {
+                                               throw new 
NullPointerException();
+                                       }
+                                       ensureRowsIsMutable();
+                                       rows_.set(index, value);
+                                       onChanged();
+                               }
+                               else {
+                                       rowsBuilder_.setMessage(index, value);
+                               }
+                               return this;
+                       }
+
+                       /**
+                        * <code>repeated .sysds.Row rows = 1;</code>
+                        */
+                       public Builder setRows(int index, 
org.apache.sysds.protobuf.SysdsProtos.Row.Builder builderForValue) {
+                               if(rowsBuilder_ == null) {
+                                       ensureRowsIsMutable();
+                                       rows_.set(index, 
builderForValue.build());
+                                       onChanged();
+                               }
+                               else {
+                                       rowsBuilder_.setMessage(index, 
builderForValue.build());
+                               }
+                               return this;
+                       }
+
+                       /**
+                        * <code>repeated .sysds.Row rows = 1;</code>
+                        */
+                       public Builder 
addRows(org.apache.sysds.protobuf.SysdsProtos.Row value) {
+                               if(rowsBuilder_ == null) {
+                                       if(value == null) {
+                                               throw new 
NullPointerException();
+                                       }
+                                       ensureRowsIsMutable();
+                                       rows_.add(value);
+                                       onChanged();
+                               }
+                               else {
+                                       rowsBuilder_.addMessage(value);
+                               }
+                               return this;
+                       }
+
+                       /**
+                        * <code>repeated .sysds.Row rows = 1;</code>
+                        */
+                       public Builder addRows(int index, 
org.apache.sysds.protobuf.SysdsProtos.Row value) {
+                               if(rowsBuilder_ == null) {
+                                       if(value == null) {
+                                               throw new 
NullPointerException();
+                                       }
+                                       ensureRowsIsMutable();
+                                       rows_.add(index, value);
+                                       onChanged();
+                               }
+                               else {
+                                       rowsBuilder_.addMessage(index, value);
+                               }
+                               return this;
+                       }
+
+                       /**
+                        * <code>repeated .sysds.Row rows = 1;</code>
+                        */
+                       public Builder 
addRows(org.apache.sysds.protobuf.SysdsProtos.Row.Builder builderForValue) {
+                               if(rowsBuilder_ == null) {
+                                       ensureRowsIsMutable();
+                                       rows_.add(builderForValue.build());
+                                       onChanged();
+                               }
+                               else {
+                                       
rowsBuilder_.addMessage(builderForValue.build());
+                               }
+                               return this;
+                       }
+
+                       /**
+                        * <code>repeated .sysds.Row rows = 1;</code>
+                        */
+                       public Builder addRows(int index, 
org.apache.sysds.protobuf.SysdsProtos.Row.Builder builderForValue) {
+                               if(rowsBuilder_ == null) {
+                                       ensureRowsIsMutable();
+                                       rows_.add(index, 
builderForValue.build());
+                                       onChanged();
+                               }
+                               else {
+                                       rowsBuilder_.addMessage(index, 
builderForValue.build());
+                               }
+                               return this;
+                       }
+
+                       /**
+                        * <code>repeated .sysds.Row rows = 1;</code>
+                        */
+                       public Builder addAllRows(java.lang.Iterable<? extends 
org.apache.sysds.protobuf.SysdsProtos.Row> values) {
+                               if(rowsBuilder_ == null) {
+                                       ensureRowsIsMutable();
+                                       
com.google.protobuf.AbstractMessageLite.Builder.addAll(values, rows_);
+                                       onChanged();
+                               }
+                               else {
+                                       rowsBuilder_.addAllMessages(values);
+                               }
+                               return this;
+                       }
+
+                       /**
+                        * <code>repeated .sysds.Row rows = 1;</code>
+                        */
+                       public Builder clearRows() {
+                               if(rowsBuilder_ == null) {
+                                       rows_ = 
java.util.Collections.emptyList();
+                                       bitField0_ = (bitField0_ & ~0x00000001);
+                                       onChanged();
+                               }
+                               else {
+                                       rowsBuilder_.clear();
+                               }
+                               return this;
+                       }
+
+                       /**
+                        * <code>repeated .sysds.Row rows = 1;</code>
+                        */
+                       public Builder removeRows(int index) {
+                               if(rowsBuilder_ == null) {
+                                       ensureRowsIsMutable();
+                                       rows_.remove(index);
+                                       onChanged();
+                               }
+                               else {
+                                       rowsBuilder_.remove(index);
+                               }
+                               return this;
+                       }
+
+                       /**
+                        * <code>repeated .sysds.Row rows = 1;</code>
+                        */
+                       public 
org.apache.sysds.protobuf.SysdsProtos.Row.Builder getRowsBuilder(int index) {
+                               return getRowsFieldBuilder().getBuilder(index);
+                       }
+
+                       /**
+                        * <code>repeated .sysds.Row rows = 1;</code>
+                        */
+                       public 
org.apache.sysds.protobuf.SysdsProtos.RowOrBuilder getRowsOrBuilder(int index) {
+                               if(rowsBuilder_ == null) {
+                                       return rows_.get(index);
+                               }
+                               else {
+                                       return 
rowsBuilder_.getMessageOrBuilder(index);
+                               }
+                       }
+
+                       /**
+                        * <code>repeated .sysds.Row rows = 1;</code>
+                        */
+                       public java.util.List<? extends 
org.apache.sysds.protobuf.SysdsProtos.RowOrBuilder> getRowsOrBuilderList() {
+                               if(rowsBuilder_ != null) {
+                                       return 
rowsBuilder_.getMessageOrBuilderList();
+                               }
+                               else {
+                                       return 
java.util.Collections.unmodifiableList(rows_);
+                               }
+                       }
+
+                       /**
+                        * <code>repeated .sysds.Row rows = 1;</code>
+                        */
+                       public 
org.apache.sysds.protobuf.SysdsProtos.Row.Builder addRowsBuilder() {
+                               return 
getRowsFieldBuilder().addBuilder(org.apache.sysds.protobuf.SysdsProtos.Row.getDefaultInstance());
+                       }
+
+                       /**
+                        * <code>repeated .sysds.Row rows = 1;</code>
+                        */
+                       public 
org.apache.sysds.protobuf.SysdsProtos.Row.Builder addRowsBuilder(int index) {
+                               return getRowsFieldBuilder().addBuilder(index,
+                                       
org.apache.sysds.protobuf.SysdsProtos.Row.getDefaultInstance());
+                       }
+
+                       /**
+                        * <code>repeated .sysds.Row rows = 1;</code>
+                        */
+                       public 
java.util.List<org.apache.sysds.protobuf.SysdsProtos.Row.Builder> 
getRowsBuilderList() {
+                               return getRowsFieldBuilder().getBuilderList();
+                       }
+
+                       private 
com.google.protobuf.RepeatedFieldBuilderV3<org.apache.sysds.protobuf.SysdsProtos.Row,
 org.apache.sysds.protobuf.SysdsProtos.Row.Builder, 
org.apache.sysds.protobuf.SysdsProtos.RowOrBuilder> getRowsFieldBuilder() {
+                               if(rowsBuilder_ == null) {
+                                       rowsBuilder_ = new 
com.google.protobuf.RepeatedFieldBuilderV3<org.apache.sysds.protobuf.SysdsProtos.Row,
 org.apache.sysds.protobuf.SysdsProtos.Row.Builder, 
org.apache.sysds.protobuf.SysdsProtos.RowOrBuilder>(
+                                               rows_, ((bitField0_ & 
0x00000001) != 0), getParentForChildren(), isClean());
+                                       rows_ = null;
+                               }
+                               return rowsBuilder_;
+                       }
+
+                       @java.lang.Override
+                       public final Builder setUnknownFields(final 
com.google.protobuf.UnknownFieldSet unknownFields) {
+                               return super.setUnknownFields(unknownFields);
+                       }
+
+                       @java.lang.Override
+                       public final Builder mergeUnknownFields(final 
com.google.protobuf.UnknownFieldSet unknownFields) {
+                               return super.mergeUnknownFields(unknownFields);
+                       }
+
+                       // @@protoc_insertion_point(builder_scope:sysds.Frame)
+               }
+
+       }
+
+       /**
+        * Protobuf type {@code sysds.Row}
+        */
+       public static final class Row extends 
com.google.protobuf.GeneratedMessageV3 implements
+               // @@protoc_insertion_point(message_implements:sysds.Row)
+               RowOrBuilder {
+               public static final int COLUMN_NAMES_FIELD_NUMBER = 1;
+               public static final int COLUMN_DATA_FIELD_NUMBER = 2;
+               public static final int COLUMN_SCHEMA_FIELD_NUMBER = 3;
+               private static final long serialVersionUID = 0L;
+               // @@protoc_insertion_point(class_scope:sysds.Row)
+               private static final org.apache.sysds.protobuf.SysdsProtos.Row 
DEFAULT_INSTANCE;
+               private static final com.google.protobuf.Parser<Row> PARSER = 
new com.google.protobuf.AbstractParser<Row>() {
+                       @java.lang.Override
+                       public Row 
parsePartialFrom(com.google.protobuf.CodedInputStream input,
+                               com.google.protobuf.ExtensionRegistryLite 
extensionRegistry)
+                               throws 
com.google.protobuf.InvalidProtocolBufferException {
+                               return new Row(input, extensionRegistry);
+                       }
+               };
+
+               static {
+                       DEFAULT_INSTANCE = new 
org.apache.sysds.protobuf.SysdsProtos.Row();
+               }
+
+               private com.google.protobuf.LazyStringList columnNames_;
+               private com.google.protobuf.LazyStringList columnData_;
+               private 
java.util.List<org.apache.sysds.protobuf.SysdsProtos.Schema> columnSchema_;
+               private byte memoizedIsInitialized = -1;
+
+               // Use Row.newBuilder() to construct.
+               private Row(com.google.protobuf.GeneratedMessageV3.Builder<?> 
builder) {
+                       super(builder);
+               }
+
+               private Row() {
+                       columnNames_ = 
com.google.protobuf.LazyStringArrayList.EMPTY;
+                       columnData_ = 
com.google.protobuf.LazyStringArrayList.EMPTY;
+                       columnSchema_ = java.util.Collections.emptyList();
+               }
+
+               private Row(com.google.protobuf.CodedInputStream input,
+                       com.google.protobuf.ExtensionRegistryLite 
extensionRegistry)
+                       throws 
com.google.protobuf.InvalidProtocolBufferException {
+                       this();
+                       if(extensionRegistry == null) {
+                               throw new java.lang.NullPointerException();
+                       }
+                       int mutable_bitField0_ = 0;
+                       com.google.protobuf.UnknownFieldSet.Builder 
unknownFields = com.google.protobuf.UnknownFieldSet
+                               .newBuilder();
+                       try {
+                               boolean done = false;
+                               while(!done) {
+                                       int tag = input.readTag();
+                                       switch(tag) {
+                                               case 0:
+                                                       done = true;
+                                                       break;
+                                               case 10: {
+                                                       java.lang.String s = 
input.readStringRequireUtf8();
+                                                       
if(!((mutable_bitField0_ & 0x00000001) != 0)) {
+                                                               columnNames_ = 
new com.google.protobuf.LazyStringArrayList();
+                                                               
mutable_bitField0_ |= 0x00000001;
+                                                       }
+                                                       columnNames_.add(s);
+                                                       break;
+                                               }
+                                               case 18: {
+                                                       java.lang.String s = 
input.readStringRequireUtf8();
+                                                       
if(!((mutable_bitField0_ & 0x00000002) != 0)) {
+                                                               columnData_ = 
new com.google.protobuf.LazyStringArrayList();
+                                                               
mutable_bitField0_ |= 0x00000002;
+                                                       }
+                                                       columnData_.add(s);
+                                                       break;
+                                               }
+                                               case 26: {
+                                                       
if(!((mutable_bitField0_ & 0x00000004) != 0)) {
+                                                               columnSchema_ = 
new java.util.ArrayList<org.apache.sysds.protobuf.SysdsProtos.Schema>();
+                                                               
mutable_bitField0_ |= 0x00000004;
+                                                       }
+                                                       
columnSchema_.add(input.readMessage(org.apache.sysds.protobuf.SysdsProtos.Schema.parser(),
+                                                               
extensionRegistry));
+                                                       break;
+                                               }
+                                               default: {
+                                                       
if(!parseUnknownField(input, unknownFields, extensionRegistry, tag)) {
+                                                               done = true;
+                                                       }
+                                                       break;
+                                               }
+                                       }
+                               }
+                       }
+                       
catch(com.google.protobuf.InvalidProtocolBufferException e) {
+                               throw e.setUnfinishedMessage(this);
+                       }
+                       catch(java.io.IOException e) {
+                               throw new 
com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this);
+                       }
+                       finally {
+                               if(((mutable_bitField0_ & 0x00000001) != 0)) {
+                                       columnNames_ = 
columnNames_.getUnmodifiableView();
+                               }
+                               if(((mutable_bitField0_ & 0x00000002) != 0)) {
+                                       columnData_ = 
columnData_.getUnmodifiableView();
+                               }
+                               if(((mutable_bitField0_ & 0x00000004) != 0)) {
+                                       columnSchema_ = 
java.util.Collections.unmodifiableList(columnSchema_);
+                               }
+                               this.unknownFields = unknownFields.build();
+                               makeExtensionsImmutable();
+                       }
+               }
+
+               public static final com.google.protobuf.Descriptors.Descriptor 
getDescriptor() {
+                       return 
org.apache.sysds.protobuf.SysdsProtos.internal_static_sysds_Row_descriptor;
+               }
+
+               public static org.apache.sysds.protobuf.SysdsProtos.Row 
parseFrom(java.nio.ByteBuffer data)
+                       throws 
com.google.protobuf.InvalidProtocolBufferException {
+                       return PARSER.parseFrom(data);
+               }
+
+               public static org.apache.sysds.protobuf.SysdsProtos.Row 
parseFrom(java.nio.ByteBuffer data,
+                       com.google.protobuf.ExtensionRegistryLite 
extensionRegistry)
+                       throws 
com.google.protobuf.InvalidProtocolBufferException {
+                       return PARSER.parseFrom(data, extensionRegistry);
+               }
+
+               public static org.apache.sysds.protobuf.SysdsProtos.Row 
parseFrom(com.google.protobuf.ByteString data)
+                       throws 
com.google.protobuf.InvalidProtocolBufferException {
+                       return PARSER.parseFrom(data);
+               }
+
+               public static org.apache.sysds.protobuf.SysdsProtos.Row 
parseFrom(com.google.protobuf.ByteString data,
+                       com.google.protobuf.ExtensionRegistryLite 
extensionRegistry)
+                       throws 
com.google.protobuf.InvalidProtocolBufferException {
+                       return PARSER.parseFrom(data, extensionRegistry);
+               }
+
+               public static org.apache.sysds.protobuf.SysdsProtos.Row 
parseFrom(byte[] data)
+                       throws 
com.google.protobuf.InvalidProtocolBufferException {
+                       return PARSER.parseFrom(data);
+               }
+
+               public static org.apache.sysds.protobuf.SysdsProtos.Row 
parseFrom(byte[] data,
+                       com.google.protobuf.ExtensionRegistryLite 
extensionRegistry)
+                       throws 
com.google.protobuf.InvalidProtocolBufferException {
+                       return PARSER.parseFrom(data, extensionRegistry);
+               }
+
+               public static org.apache.sysds.protobuf.SysdsProtos.Row 
parseFrom(java.io.InputStream input)
+                       throws java.io.IOException {
+                       return 
com.google.protobuf.GeneratedMessageV3.parseWithIOException(PARSER, input);
+               }
+
+               public static org.apache.sysds.protobuf.SysdsProtos.Row 
parseFrom(java.io.InputStream input,
+                       com.google.protobuf.ExtensionRegistryLite 
extensionRegistry) throws java.io.IOException {
+                       return 
com.google.protobuf.GeneratedMessageV3.parseWithIOException(PARSER, input, 
extensionRegistry);
+               }
+
+               public static org.apache.sysds.protobuf.SysdsProtos.Row 
parseDelimitedFrom(java.io.InputStream input)
+                       throws java.io.IOException {
+                       return 
com.google.protobuf.GeneratedMessageV3.parseDelimitedWithIOException(PARSER, 
input);
+               }
+
+               public static org.apache.sysds.protobuf.SysdsProtos.Row 
parseDelimitedFrom(java.io.InputStream input,
+                       com.google.protobuf.ExtensionRegistryLite 
extensionRegistry) throws java.io.IOException {
+                       return com.google.protobuf.GeneratedMessageV3
+                               .parseDelimitedWithIOException(PARSER, input, 
extensionRegistry);
+               }
+
+               public static org.apache.sysds.protobuf.SysdsProtos.Row 
parseFrom(com.google.protobuf.CodedInputStream input)
+                       throws java.io.IOException {
+                       return 
com.google.protobuf.GeneratedMessageV3.parseWithIOException(PARSER, input);
+               }
+
+               public static org.apache.sysds.protobuf.SysdsProtos.Row 
parseFrom(com.google.protobuf.CodedInputStream input,
+                       com.google.protobuf.ExtensionRegistryLite 
extensionRegistry) throws java.io.IOException {
+                       return 
com.google.protobuf.GeneratedMessageV3.parseWithIOException(PARSER, input, 
extensionRegistry);
+               }
+
+               public static Builder newBuilder() {
+                       return DEFAULT_INSTANCE.toBuilder();
+               }
+
+               public static Builder 
newBuilder(org.apache.sysds.protobuf.SysdsProtos.Row prototype) {
+                       return 
DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype);
+               }
+
+               public static org.apache.sysds.protobuf.SysdsProtos.Row 
getDefaultInstance() {
+                       return DEFAULT_INSTANCE;
+               }
+
+               public static com.google.protobuf.Parser<Row> parser() {
+                       return PARSER;
+               }
+
+               @java.lang.Override
+               @SuppressWarnings({"unused"})
+               protected java.lang.Object newInstance(UnusedPrivateParameter 
unused) {
+                       return new Row();
+               }
+
+               @java.lang.Override
+               public final com.google.protobuf.UnknownFieldSet 
getUnknownFields() {
+                       return this.unknownFields;
+               }
+
+               @java.lang.Override
+               protected 
com.google.protobuf.GeneratedMessageV3.FieldAccessorTable 
internalGetFieldAccessorTable() {
+                       return 
org.apache.sysds.protobuf.SysdsProtos.internal_static_sysds_Row_fieldAccessorTable
+                               
.ensureFieldAccessorsInitialized(org.apache.sysds.protobuf.SysdsProtos.Row.class,
+                                       
org.apache.sysds.protobuf.SysdsProtos.Row.Builder.class);
+               }
+
+               /**
+                * <code>repeated string column_names = 1;</code>
+                *
+                * @return A list containing the columnNames.
+                */
+               public com.google.protobuf.ProtocolStringList 
getColumnNamesList() {
+                       return columnNames_;
+               }
+
+               /**
+                * <code>repeated string column_names = 1;</code>
+                *
+                * @return The count of columnNames.
+                */
+               public int getColumnNamesCount() {
+                       return columnNames_.size();
+               }
+
+               /**
+                * <code>repeated string column_names = 1;</code>
+                *
+                * @param index The index of the element to return.
+                * @return The columnNames at the given index.
+                */
+               public java.lang.String getColumnNames(int index) {
+                       return columnNames_.get(index);
+               }
+
+               /**
+                * <code>repeated string column_names = 1;</code>
+                *
+                * @param index The index of the value to return.
+                * @return The bytes of the columnNames at the given index.
+                */
+               public com.google.protobuf.ByteString getColumnNamesBytes(int 
index) {
+                       return columnNames_.getByteString(index);
+               }
+
+               /**
+                * <code>repeated string column_data = 2;</code>
+                *
+                * @return A list containing the columnData.
+                */
+               public com.google.protobuf.ProtocolStringList 
getColumnDataList() {
+                       return columnData_;
+               }
+
+               /**
+                * <code>repeated string column_data = 2;</code>
+                *
+                * @return The count of columnData.
+                */
+               public int getColumnDataCount() {
+                       return columnData_.size();
+               }
+
+               /**
+                * <code>repeated string column_data = 2;</code>
+                *
+                * @param index The index of the element to return.
+                * @return The columnData at the given index.
+                */
+               public java.lang.String getColumnData(int index) {
+                       return columnData_.get(index);
+               }
+
+               /**
+                * <code>repeated string column_data = 2;</code>
+                *
+                * @param index The index of the value to return.
+                * @return The bytes of the columnData at the given index.
+                */
+               public com.google.protobuf.ByteString getColumnDataBytes(int 
index) {
+                       return columnData_.getByteString(index);
+               }
+
+               /**
+                * <code>repeated .sysds.Schema column_schema = 3;</code>
+                */
+               @java.lang.Override
+               public 
java.util.List<org.apache.sysds.protobuf.SysdsProtos.Schema> 
getColumnSchemaList() {
+                       return columnSchema_;
+               }
+
+               /**
+                * <code>repeated .sysds.Schema column_schema = 3;</code>
+                */
+               @java.lang.Override
+               public java.util.List<? extends 
org.apache.sysds.protobuf.SysdsProtos.SchemaOrBuilder> 
getColumnSchemaOrBuilderList() {
+                       return columnSchema_;
+               }
+
+               /**
+                * <code>repeated .sysds.Schema column_schema = 3;</code>
+                */
+               @java.lang.Override
+               public int getColumnSchemaCount() {
+                       return columnSchema_.size();
+               }
+
+               /**
+                * <code>repeated .sysds.Schema column_schema = 3;</code>
+                */
+               @java.lang.Override
+               public org.apache.sysds.protobuf.SysdsProtos.Schema 
getColumnSchema(int index) {
+                       return columnSchema_.get(index);
+               }
+
+               /**
+                * <code>repeated .sysds.Schema column_schema = 3;</code>
+                */
+               @java.lang.Override
+               public org.apache.sysds.protobuf.SysdsProtos.SchemaOrBuilder 
getColumnSchemaOrBuilder(int index) {
+                       return columnSchema_.get(index);
+               }
+
+               @java.lang.Override
+               public final boolean isInitialized() {
+                       byte isInitialized = memoizedIsInitialized;
+                       if(isInitialized == 1)
+                               return true;
+                       if(isInitialized == 0)
+                               return false;
+
+                       memoizedIsInitialized = 1;
+                       return true;
+               }
+
+               @java.lang.Override
+               public void writeTo(com.google.protobuf.CodedOutputStream 
output) throws java.io.IOException {
+                       for(int i = 0; i < columnNames_.size(); i++) {
+                               
com.google.protobuf.GeneratedMessageV3.writeString(output, 1, 
columnNames_.getRaw(i));
+                       }
+                       for(int i = 0; i < columnData_.size(); i++) {
+                               
com.google.protobuf.GeneratedMessageV3.writeString(output, 2, 
columnData_.getRaw(i));
+                       }
+                       for(int i = 0; i < columnSchema_.size(); i++) {
+                               output.writeMessage(3, columnSchema_.get(i));
+                       }
+                       unknownFields.writeTo(output);
+               }
+
+               @java.lang.Override
+               public int getSerializedSize() {
+                       int size = memoizedSize;
+                       if(size != -1)
+                               return size;
+
+                       size = 0;
+                       {
+                               int dataSize = 0;
+                               for(int i = 0; i < columnNames_.size(); i++) {
+                                       dataSize += 
computeStringSizeNoTag(columnNames_.getRaw(i));
+                               }
+                               size += dataSize;
+                               size += 1 * getColumnNamesList().size();
+                       }
+                       {
+                               int dataSize = 0;
+                               for(int i = 0; i < columnData_.size(); i++) {
+                                       dataSize += 
computeStringSizeNoTag(columnData_.getRaw(i));
+                               }
+                               size += dataSize;
+                               size += 1 * getColumnDataList().size();
+                       }
+                       for(int i = 0; i < columnSchema_.size(); i++) {
+                               size += 
com.google.protobuf.CodedOutputStream.computeMessageSize(3, 
columnSchema_.get(i));
+                       }
+                       size += unknownFields.getSerializedSize();
+                       memoizedSize = size;
+                       return size;
+               }
+
+               @java.lang.Override
+               public boolean equals(final java.lang.Object obj) {
+                       if(obj == this) {
+                               return true;
+                       }
+                       if(!(obj instanceof 
org.apache.sysds.protobuf.SysdsProtos.Row)) {
+                               return super.equals(obj);
+                       }
+                       org.apache.sysds.protobuf.SysdsProtos.Row other = 
(org.apache.sysds.protobuf.SysdsProtos.Row) obj;
+
+                       
if(!getColumnNamesList().equals(other.getColumnNamesList()))
+                               return false;
+                       
if(!getColumnDataList().equals(other.getColumnDataList()))
+                               return false;
+                       
if(!getColumnSchemaList().equals(other.getColumnSchemaList()))
+                               return false;
+                       if(!unknownFields.equals(other.unknownFields))
+                               return false;
+                       return true;
+               }
+
+               @java.lang.Override
+               public int hashCode() {
+                       if(memoizedHashCode != 0) {
+                               return memoizedHashCode;
+                       }
+                       int hash = 41;
+                       hash = (19 * hash) + getDescriptor().hashCode();
+                       if(getColumnNamesCount() > 0) {
+                               hash = (37 * hash) + COLUMN_NAMES_FIELD_NUMBER;
+                               hash = (53 * hash) + 
getColumnNamesList().hashCode();
+                       }
+                       if(getColumnDataCount() > 0) {
+                               hash = (37 * hash) + COLUMN_DATA_FIELD_NUMBER;
+                               hash = (53 * hash) + 
getColumnDataList().hashCode();
+                       }
+                       if(getColumnSchemaCount() > 0) {
+                               hash = (37 * hash) + COLUMN_SCHEMA_FIELD_NUMBER;
+                               hash = (53 * hash) + 
getColumnSchemaList().hashCode();
+                       }
+                       hash = (29 * hash) + unknownFields.hashCode();
+                       memoizedHashCode = hash;
+                       return hash;
+               }
+
+               @java.lang.Override
+               public Builder newBuilderForType() {
+                       return newBuilder();
+               }
+
+               @java.lang.Override
+               public Builder toBuilder() {
+                       return this == DEFAULT_INSTANCE ? new Builder() : new 
Builder().mergeFrom(this);
+               }
+
+               @java.lang.Override
+               protected Builder 
newBuilderForType(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
+                       Builder builder = new Builder(parent);
+                       return builder;
+               }
+
+               @java.lang.Override
+               public com.google.protobuf.Parser<Row> getParserForType() {
+                       return PARSER;
+               }
+
+               @java.lang.Override
+               public org.apache.sysds.protobuf.SysdsProtos.Row 
getDefaultInstanceForType() {
+                       return DEFAULT_INSTANCE;
+               }
+
+               /**
+                * Protobuf type {@code sysds.Row}
+                */
+               public static final class Builder extends 
com.google.protobuf.GeneratedMessageV3.Builder<Builder> implements
+                       // 
@@protoc_insertion_point(builder_implements:sysds.Row)
+                       org.apache.sysds.protobuf.SysdsProtos.RowOrBuilder {
+                       private int bitField0_;
+                       private com.google.protobuf.LazyStringList columnNames_ 
= com.google.protobuf.LazyStringArrayList.EMPTY;
+                       private com.google.protobuf.LazyStringList columnData_ 
= com.google.protobuf.LazyStringArrayList.EMPTY;
+                       private 
java.util.List<org.apache.sysds.protobuf.SysdsProtos.Schema> columnSchema_ = 
java.util.Collections
+                               .emptyList();
+                       private 
com.google.protobuf.RepeatedFieldBuilderV3<org.apache.sysds.protobuf.SysdsProtos.Schema,
 org.apache.sysds.protobuf.SysdsProtos.Schema.Builder, 
org.apache.sysds.protobuf.SysdsProtos.SchemaOrBuilder> columnSchemaBuilder_;
+
+                       // Construct using 
org.apache.sysds.protobuf.SysdsProtos.Row.newBuilder()
+                       private Builder() {
+                               maybeForceBuilderInitialization();
+                       }
+
+                       private 
Builder(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
+                               super(parent);
+                               maybeForceBuilderInitialization();
+                       }
+
+                       public static final 
com.google.protobuf.Descriptors.Descriptor getDescriptor() {
+                               return 
org.apache.sysds.protobuf.SysdsProtos.internal_static_sysds_Row_descriptor;
+                       }
+
+                       @java.lang.Override
+                       protected 
com.google.protobuf.GeneratedMessageV3.FieldAccessorTable 
internalGetFieldAccessorTable() {
+                               return 
org.apache.sysds.protobuf.SysdsProtos.internal_static_sysds_Row_fieldAccessorTable
+                                       
.ensureFieldAccessorsInitialized(org.apache.sysds.protobuf.SysdsProtos.Row.class,
+                                               
org.apache.sysds.protobuf.SysdsProtos.Row.Builder.class);
+                       }
+
+                       private void maybeForceBuilderInitialization() {
+                               
if(com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders) {
+                                       getColumnSchemaFieldBuilder();
+                               }
+                       }
+
+                       @java.lang.Override
+                       public Builder clear() {
+                               super.clear();
+                               columnNames_ = 
com.google.protobuf.LazyStringArrayList.EMPTY;
+                               bitField0_ = (bitField0_ & ~0x00000001);
+                               columnData_ = 
com.google.protobuf.LazyStringArrayList.EMPTY;
+                               bitField0_ = (bitField0_ & ~0x00000002);
+                               if(columnSchemaBuilder_ == null) {
+                                       columnSchema_ = 
java.util.Collections.emptyList();
+                                       bitField0_ = (bitField0_ & ~0x00000004);
+                               }
+                               else {
+                                       columnSchemaBuilder_.clear();
+                               }
+                               return this;
+                       }
+
+                       @java.lang.Override
+                       public com.google.protobuf.Descriptors.Descriptor 
getDescriptorForType() {
+                               return 
org.apache.sysds.protobuf.SysdsProtos.internal_static_sysds_Row_descriptor;
+                       }
+
+                       @java.lang.Override
+                       public org.apache.sysds.protobuf.SysdsProtos.Row 
getDefaultInstanceForType() {
+                               return 
org.apache.sysds.protobuf.SysdsProtos.Row.getDefaultInstance();
+                       }
+
+                       @java.lang.Override
+                       public org.apache.sysds.protobuf.SysdsProtos.Row 
build() {
+                               org.apache.sysds.protobuf.SysdsProtos.Row 
result = buildPartial();
+                               if(!result.isInitialized()) {
+                                       throw 
newUninitializedMessageException(result);
+                               }
+                               return result;
+                       }
+
+                       @java.lang.Override
+                       public org.apache.sysds.protobuf.SysdsProtos.Row 
buildPartial() {
+                               org.apache.sysds.protobuf.SysdsProtos.Row 
result = new org.apache.sysds.protobuf.SysdsProtos.Row(this);
+                               int from_bitField0_ = bitField0_;
+                               if(((bitField0_ & 0x00000001) != 0)) {
+                                       columnNames_ = 
columnNames_.getUnmodifiableView();
+                                       bitField0_ = (bitField0_ & ~0x00000001);
+                               }
+                               result.columnNames_ = columnNames_;
+                               if(((bitField0_ & 0x00000002) != 0)) {
+                                       columnData_ = 
columnData_.getUnmodifiableView();
+                                       bitField0_ = (bitField0_ & ~0x00000002);
+                               }
+                               result.columnData_ = columnData_;
+                               if(columnSchemaBuilder_ == null) {
+                                       if(((bitField0_ & 0x00000004) != 0)) {
+                                               columnSchema_ = 
java.util.Collections.unmodifiableList(columnSchema_);
+                                               bitField0_ = (bitField0_ & 
~0x00000004);
+                                       }
+                                       result.columnSchema_ = columnSchema_;
+                               }
+                               else {
+                                       result.columnSchema_ = 
columnSchemaBuilder_.build();
+                               }
+                               onBuilt();
+                               return result;
+                       }
+
+                       @java.lang.Override
+                       public Builder clone() {
+                               return super.clone();
+                       }
+
+                       @java.lang.Override
+                       public Builder 
setField(com.google.protobuf.Descriptors.FieldDescriptor field, 
java.lang.Object value) {
+                               return super.setField(field, value);
+                       }
+
+                       @java.lang.Override
+                       public Builder 
clearField(com.google.protobuf.Descriptors.FieldDescriptor field) {
+                               return super.clearField(field);
+                       }
+
+                       @java.lang.Override
+                       public Builder 
clearOneof(com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+                               return super.clearOneof(oneof);
+                       }
+
+                       @java.lang.Override
+                       public Builder 
setRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, int 
index,
+                               java.lang.Object value) {
+                               return super.setRepeatedField(field, index, 
value);
+                       }
+
+                       @java.lang.Override
+                       public Builder 
addRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field,
+                               java.lang.Object value) {
+                               return super.addRepeatedField(field, value);
+                       }
+
+                       @java.lang.Override
+                       public Builder mergeFrom(com.google.protobuf.Message 
other) {
+                               if(other instanceof 
org.apache.sysds.protobuf.SysdsProtos.Row) {
+                                       return 
mergeFrom((org.apache.sysds.protobuf.SysdsProtos.Row) other);
+                               }
+                               else {
+                                       super.mergeFrom(other);
+                                       return this;
+                               }
+                       }
+
+                       public Builder 
mergeFrom(org.apache.sysds.protobuf.SysdsProtos.Row other) {
+                               if(other == 
org.apache.sysds.protobuf.SysdsProtos.Row.getDefaultInstance())
+                                       return this;
+                               if(!other.columnNames_.isEmpty()) {
+                                       if(columnNames_.isEmpty()) {
+                                               columnNames_ = 
other.columnNames_;
+                                               bitField0_ = (bitField0_ & 
~0x00000001);
+                                       }
+                                       else {
+                                               ensureColumnNamesIsMutable();
+                                               
columnNames_.addAll(other.columnNames_);
+                                       }
+                                       onChanged();
+                               }
+                               if(!other.columnData_.isEmpty()) {
+                                       if(columnData_.isEmpty()) {
+                                               columnData_ = other.columnData_;
+                                               bitField0_ = (bitField0_ & 
~0x00000002);
+                                       }
+                                       else {
+                                               ensureColumnDataIsMutable();
+                                               
columnData_.addAll(other.columnData_);
+                                       }
+                                       onChanged();
+                               }
+                               if(columnSchemaBuilder_ == null) {
+                                       if(!other.columnSchema_.isEmpty()) {
+                                               if(columnSchema_.isEmpty()) {
+                                                       columnSchema_ = 
other.columnSchema_;
+                                                       bitField0_ = 
(bitField0_ & ~0x00000004);
+                                               }
+                                               else {
+                                                       
ensureColumnSchemaIsMutable();
+                                                       
columnSchema_.addAll(other.columnSchema_);
+                                               }
+                                               onChanged();
+                                       }
+                               }
+                               else {
+                                       if(!other.columnSchema_.isEmpty()) {
+                                               
if(columnSchemaBuilder_.isEmpty()) {
+                                                       
columnSchemaBuilder_.dispose();
+                                                       columnSchemaBuilder_ = 
null;
+                                                       columnSchema_ = 
other.columnSchema_;
+                                                       bitField0_ = 
(bitField0_ & ~0x00000004);
+                                                       columnSchemaBuilder_ = 
com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders ? 
getColumnSchemaFieldBuilder() : null;
+                                               }
+                                               else {
+                                                       
columnSchemaBuilder_.addAllMessages(other.columnSchema_);
+                                               }
+                                       }
+                               }
+                               this.mergeUnknownFields(other.unknownFields);
+                               onChanged();
+                               return this;
+                       }
+
+                       @java.lang.Override
+                       public final boolean isInitialized() {
+                               return true;
+                       }
+
+                       @java.lang.Override
+                       public Builder 
mergeFrom(com.google.protobuf.CodedInputStream input,
+                               com.google.protobuf.ExtensionRegistryLite 
extensionRegistry) throws java.io.IOException {
+                               org.apache.sysds.protobuf.SysdsProtos.Row 
parsedMessage = null;
+                               try {
+                                       parsedMessage = 
PARSER.parsePartialFrom(input, extensionRegistry);
+                               }
+                               
catch(com.google.protobuf.InvalidProtocolBufferException e) {
+                                       parsedMessage = 
(org.apache.sysds.protobuf.SysdsProtos.Row) e.getUnfinishedMessage();
+                                       throw e.unwrapIOException();
+                               }
+                               finally {
+                                       if(parsedMessage != null) {
+                                               mergeFrom(parsedMessage);
+                                       }
+                               }
+                               return this;
+                       }
+
+                       private void ensureColumnNamesIsMutable() {
+                               if(!((bitField0_ & 0x00000001) != 0)) {
+                                       columnNames_ = new 
com.google.protobuf.LazyStringArrayList(columnNames_);
+                                       bitField0_ |= 0x00000001;
+                               }
+                       }
+
+                       /**
+                        * <code>repeated string column_names = 1;</code>
+                        *
+                        * @return A list containing the columnNames.
+                        */
+                       public com.google.protobuf.ProtocolStringList 
getColumnNamesList() {
+                               return columnNames_.getUnmodifiableView();
+                       }
+
+                       /**
+                        * <code>repeated string column_names = 1;</code>
+                        *
+                        * @return The count of columnNames.
+                        */
+                       public int getColumnNamesCount() {
+                               return columnNames_.size();
+                       }
+
+                       /**
+                        * <code>repeated string column_names = 1;</code>
+                        *
+                        * @param index The index of the element to return.
+                        * @return The columnNames at the given index.
+                        */
+                       public java.lang.String getColumnNames(int index) {
+                               return columnNames_.get(index);
+                       }
+
+                       /**
+                        * <code>repeated string column_names = 1;</code>
+                        *
+                        * @param index The index of the value to return.
+                        * @return The bytes of the columnNames at the given 
index.
+                        */
+                       public com.google.protobuf.ByteString 
getColumnNamesBytes(int index) {
+                               return columnNames_.getByteString(index);
+                       }
+
+                       /**
+                        * <code>repeated string column_names = 1;</code>
+                        *
+                        * @param index The index to set the value at.
+                        * @param value The columnNames to set.
+                        * @return This builder for chaining.
+                        */
+                       public Builder setColumnNames(int index, 
java.lang.String value) {
+                               if(value == null) {
+                                       throw new NullPointerException();
+                               }
+                               ensureColumnNamesIsMutable();
+                               columnNames_.set(index, value);
+                               onChanged();
+                               return this;
+                       }
+
+                       /**
+                        * <code>repeated string column_names = 1;</code>
+                        *
+                        * @param value The columnNames to add.
+                        * @return This builder for chaining.
+                        */
+                       public Builder addColumnNames(java.lang.String value) {
+                               if(value == null) {
+                                       throw new NullPointerException();
+                               }
+                               ensureColumnNamesIsMutable();
+                               columnNames_.add(value);
+                               onChanged();
+                               return this;
+                       }
+
+                       /**
+                        * <code>repeated string column_names = 1;</code>
+                        *
+                        * @param values The columnNames to add.
+                        * @return This builder for chaining.
+                        */
+                       public Builder 
addAllColumnNames(java.lang.Iterable<java.lang.String> values) {
+                               ensureColumnNamesIsMutable();
+                               
com.google.protobuf.AbstractMessageLite.Builder.addAll(values, columnNames_);
+                               onChanged();
+                               return this;
+                       }
+
+                       /**
+                        * <code>repeated string column_names = 1;</code>
+                        *
+                        * @return This builder for chaining.
+                        */
+                       public Builder clearColumnNames() {
+                               columnNames_ = 
com.google.protobuf.LazyStringArrayList.EMPTY;
+                               bitField0_ = (bitField0_ & ~0x00000001);
+                               onChanged();
+                               return this;
+                       }
+
+                       /**
+                        * <code>repeated string column_names = 1;</code>
+                        *
+                        * @param value The bytes of the columnNames to add.
+                        * @return This builder for chaining.
+                        */
+                       public Builder 
addColumnNamesBytes(com.google.protobuf.ByteString value) {
+                               if(value == null) {
+                                       throw new NullPointerException();
+                               }
+                               checkByteStringIsUtf8(value);
+                               ensureColumnNamesIsMutable();
+                               columnNames_.add(value);
+                               onChanged();
+                               return this;
+                       }
+
+                       private void ensureColumnDataIsMutable() {
+                               if(!((bitField0_ & 0x00000002) != 0)) {
+                                       columnData_ = new 
com.google.protobuf.LazyStringArrayList(columnData_);
+                                       bitField0_ |= 0x00000002;
+                               }
+                       }
+
+                       /**
+                        * <code>repeated string column_data = 2;</code>
+                        *
+                        * @return A list containing the columnData.
+                        */
+                       public com.google.protobuf.ProtocolStringList 
getColumnDataList() {
+                               return columnData_.getUnmodifiableView();
+                       }
+
+                       /**
+                        * <code>repeated string column_data = 2;</code>
+                        *
+                        * @return The count of columnData.
+                        */
+                       public int getColumnDataCount() {
+                               return columnData_.size();
+                       }
+
+                       /**
+                        * <code>repeated string column_data = 2;</code>
+                        *
+                        * @param index The index of the element to return.
+                        * @return The columnData at the given index.
+                        */
+                       public java.lang.String getColumnData(int index) {
+                               return columnData_.get(index);
+                       }
+
+                       /**
+                        * <code>repeated string column_data = 2;</code>
+                        *
+                        * @param index The index of the value to return.
+                        * @return The bytes of the columnData at the given 
index.
+                        */
+                       public com.google.protobuf.ByteString 
getColumnDataBytes(int index) {
+                               return columnData_.getByteString(index);
+                       }
+
+                       /**
+                        * <code>repeated string column_data = 2;</code>
+                        *
+                        * @param index The index to set the value at.
+                        * @param value The columnData to set.
+                        * @return This builder for chaining.
+                        */
+                       public Builder setColumnData(int index, 
java.lang.String value) {
+                               if(value == null) {
+                                       throw new NullPointerException();
+                               }
+                               ensureColumnDataIsMutable();
+                               columnData_.set(index, value);
+                               onChanged();
+                               return this;
+                       }
+
+                       /**
+                        * <code>repeated string column_data = 2;</code>
+                        *
+                        * @param value The columnData to add.
+                        * @return This builder for chaining.
+                        */
+                       public Builder addColumnData(java.lang.String value) {
+                               if(value == null) {
+                                       throw new NullPointerException();
+                               }
+                               ensureColumnDataIsMutable();
+                               columnData_.add(value);
+                               onChanged();
+                               return this;
+                       }
+
+                       /**
+                        * <code>repeated string column_data = 2;</code>
+                        *
+                        * @param values The columnData to add.
+                        * @return This builder for chaining.
+                        */
+                       public Builder 
addAllColumnData(java.lang.Iterable<java.lang.String> values) {
+                               ensureColumnDataIsMutable();
+                               
com.google.protobuf.AbstractMessageLite.Builder.addAll(values, columnData_);
+                               onChanged();
+                               return this;
+                       }
+
+                       /**
+                        * <code>repeated string column_data = 2;</code>
+                        *
+                        * @return This builder for chaining.
+                        */
+                       public Builder clearColumnData() {
+                               columnData_ = 
com.google.protobuf.LazyStringArrayList.EMPTY;
+                               bitField0_ = (bitField0_ & ~0x00000002);
+                               onChanged();
+                               return this;
+                       }
+
+                       /**
+                        * <code>repeated string column_data = 2;</code>
+                        *
+                        * @param value The bytes of the columnData to add.
+                        * @return This builder for chaining.
+                        */
+                       public Builder 
addColumnDataBytes(com.google.protobuf.ByteString value) {
+                               if(value == null) {
+                                       throw new NullPointerException();
+                               }
+                               checkByteStringIsUtf8(value);
+                               ensureColumnDataIsMutable();
+                               columnData_.add(value);
+                               onChanged();
+                               return this;
+                       }
+
+                       private void ensureColumnSchemaIsMutable() {
+                               if(!((bitField0_ & 0x00000004) != 0)) {
+                                       columnSchema_ = new 
java.util.ArrayList<org.apache.sysds.protobuf.SysdsProtos.Schema>(
+                                               columnSchema_);
+                                       bitField0_ |= 0x00000004;
+                               }
+                       }
+
+                       /**
+                        * <code>repeated .sysds.Schema column_schema = 
3;</code>
+                        */
+                       public 
java.util.List<org.apache.sysds.protobuf.SysdsProtos.Schema> 
getColumnSchemaList() {
+                               if(columnSchemaBuilder_ == null) {
+                                       return 
java.util.Collections.unmodifiableList(columnSchema_);
+                               }
+                               else {
+                                       return 
columnSchemaBuilder_.getMessageList();
+                               }
+                       }
+
+                       /**
+                        * <code>repeated .sysds.Schema column_schema = 
3;</code>
+                        */
+                       public int getColumnSchemaCount() {
+                               if(columnSchemaBuilder_ == null) {
+                                       return columnSchema_.size();
+                               }
+                               else {
+                                       return columnSchemaBuilder_.getCount();
+                               }
+                       }
+
+                       /**
+                        * <code>repeated .sysds.Schema column_schema = 
3;</code>
+                        */
+                       public org.apache.sysds.protobuf.SysdsProtos.Schema 
getColumnSchema(int index) {
+                               if(columnSchemaBuilder_ == null) {
+                                       return columnSchema_.get(index);
+                               }
+                               else {
+                                       return 
columnSchemaBuilder_.getMessage(index);
+                               }
+                       }
+
+                       /**
+                        * <code>repeated .sysds.Schema column_schema = 
3;</code>
+                        */
+                       public Builder setColumnSchema(int index, 
org.apache.sysds.protobuf.SysdsProtos.Schema value) {
+                               if(columnSchemaBuilder_ == null) {
+                                       if(value == null) {
+                                               throw new 
NullPointerException();
+                                       }
+                                       ensureColumnSchemaIsMutable();
+                                       columnSchema_.set(index, value);
+                                       onChanged();
+                               }
+                               else {
+                                       columnSchemaBuilder_.setMessage(index, 
value);
+                               }
+                               return this;
+                       }
+
+                       /**
+                        * <code>repeated .sysds.Schema column_schema = 
3;</code>
+                        */
+                       public Builder setColumnSchema(int index,
+                               
org.apache.sysds.protobuf.SysdsProtos.Schema.Builder builderForValue) {
+                               if(columnSchemaBuilder_ == null) {
+                                       ensureColumnSchemaIsMutable();
+                                       columnSchema_.set(index, 
builderForValue.build());
+                                       onChanged();
+                               }
+                               else {
+                                       columnSchemaBuilder_.setMessage(index, 
builderForValue.build());
+                               }
+                               return this;
+                       }
+
+                       /**
+                        * <code>repeated .sysds.Schema column_schema = 
3;</code>
+                        */
+                       public Builder 
addColumnSchema(org.apache.sysds.protobuf.SysdsProtos.Schema value) {
+                               if(columnSchemaBuilder_ == null) {
+                                       if(value == null) {
+                                               throw new 
NullPointerException();
+                                       }
+                                       ensureColumnSchemaIsMutable();
+                                       columnSchema_.add(value);
+                                       onChanged();
+                               }
+                               else {
+                                       columnSchemaBuilder_.addMessage(value);
+                               }
+                               return this;
+                       }
+
+                       /**
+                        * <code>repeated .sysds.Schema column_schema = 
3;</code>
+                        */
+                       public Builder addColumnSchema(int index, 
org.apache.sysds.protobuf.SysdsProtos.Schema value) {
+                               if(columnSchemaBuilder_ == null) {
+                                       if(value == null) {
+                                               throw new 
NullPointerException();
+                                       }
+                                       ensureColumnSchemaIsMutable();
+                                       columnSchema_.add(index, value);
+                                       onChanged();
+                               }
+                               else {
+                                       columnSchemaBuilder_.addMessage(index, 
value);
+                               }
+                               return this;
+                       }
+
+                       /**
+                        * <code>repeated .sysds.Schema column_schema = 
3;</code>
+                        */
+                       public Builder 
addColumnSchema(org.apache.sysds.protobuf.SysdsProtos.Schema.Builder 
builderForValue) {
+                               if(columnSchemaBuilder_ == null) {
+                                       ensureColumnSchemaIsMutable();
+                                       
columnSchema_.add(builderForValue.build());
+                                       onChanged();
+                               }
+                               else {
+                                       
columnSchemaBuilder_.addMessage(builderForValue.build());
+                               }
+                               return this;
+                       }
+
+                       /**
+                        * <code>repeated .sysds.Schema column_schema = 
3;</code>
+                        */
+                       public Builder addColumnSchema(int index,
+                               
org.apache.sysds.protobuf.SysdsProtos.Schema.Builder builderForValue) {
+                               if(columnSchemaBuilder_ == null) {
+                                       ensureColumnSchemaIsMutable();
+                                       columnSchema_.add(index, 
builderForValue.build());
+                                       onChanged();
+                               }
+                               else {
+                                       columnSchemaBuilder_.addMessage(index, 
builderForValue.build());
+                               }
+                               return this;
+                       }
+
+                       /**
+                        * <code>repeated .sysds.Schema column_schema = 
3;</code>
+                        */
+                       public Builder addAllColumnSchema(
+                               java.lang.Iterable<? extends 
org.apache.sysds.protobuf.SysdsProtos.Schema> values) {
+                               if(columnSchemaBuilder_ == null) {
+                                       ensureColumnSchemaIsMutable();
+                                       
com.google.protobuf.AbstractMessageLite.Builder.addAll(values, columnSchema_);
+                                       onChanged();
+                               }
+                               else {
+                                       
columnSchemaBuilder_.addAllMessages(values);
+                               }
+                               return this;
+                       }
+
+                       /**
+                        * <code>repeated .sysds.Schema column_schema = 
3;</code>
+                        */
+                       public Builder clearColumnSchema() {
+                               if(columnSchemaBuilder_ == null) {
+                                       columnSchema_ = 
java.util.Collections.emptyList();
+                                       bitField0_ = (bitField0_ & ~0x00000004);
+                                       onChanged();
+                               }
+                               else {
+                                       columnSchemaBuilder_.clear();
+                               }
+                               return this;
+                       }
+
+                       /**
+                        * <code>repeated .sysds.Schema column_schema = 
3;</code>
+                        */
+                       public Builder removeColumnSchema(int index) {
+                               if(columnSchemaBuilder_ == null) {
+                                       ensureColumnSchemaIsMutable();
+                                       columnSchema_.remove(index);
+                                       onChanged();
+                               }
+                               else {
+                                       columnSchemaBuilder_.remove(index);
+                               }
+                               return this;
+                       }
+
+                       /**
+                        * <code>repeated .sysds.Schema column_schema = 
3;</code>
+                        */
+                       public 
org.apache.sysds.protobuf.SysdsProtos.Schema.Builder getColumnSchemaBuilder(int 
index) {
+                               return 
getColumnSchemaFieldBuilder().getBuilder(index);
+                       }
+
+                       /**
+                        * <code>repeated .sysds.Schema column_schema = 
3;</code>
+                        */
+                       public 
org.apache.sysds.protobuf.SysdsProtos.SchemaOrBuilder 
getColumnSchemaOrBuilder(int index) {
+                               if(columnSchemaBuilder_ == null) {
+                                       return columnSchema_.get(index);
+                               }
+                               else {
+                                       return 
columnSchemaBuilder_.getMessageOrBuilder(index);
+                               }
+                       }
+
+                       /**
+                        * <code>repeated .sysds.Schema column_schema = 
3;</code>
+                        */
+                       public java.util.List<? extends 
org.apache.sysds.protobuf.SysdsProtos.SchemaOrBuilder> 
getColumnSchemaOrBuilderList() {
+                               if(columnSchemaBuilder_ != null) {
+                                       return 
columnSchemaBuilder_.getMessageOrBuilderList();
+                               }
+                               else {
+                                       return 
java.util.Collections.unmodifiableList(columnSchema_);
+                               }
+                       }
+
+                       /**
+                        * <code>repeated .sysds.Schema column_schema = 
3;</code>
+                        */
+                       public 
org.apache.sysds.protobuf.SysdsProtos.Schema.Builder addColumnSchemaBuilder() {
+                               return getColumnSchemaFieldBuilder()
+                                       
.addBuilder(org.apache.sysds.protobuf.SysdsProtos.Schema.getDefaultInstance());
+                       }
+
+                       /**
+                        * <code>repeated .sysds.Schema column_schema = 
3;</code>
+                        */
+                       public 
org.apache.sysds.protobuf.SysdsProtos.Schema.Builder addColumnSchemaBuilder(int 
index) {
+                               return 
getColumnSchemaFieldBuilder().addBuilder(index,
+                                       
org.apache.sysds.protobuf.SysdsProtos.Schema.getDefaultInstance());
+                       }
+
+                       /**
+                        * <code>repeated .sysds.Schema column_schema = 
3;</code>
+                        */
+                       public 
java.util.List<org.apache.sysds.protobuf.SysdsProtos.Schema.Builder> 
getColumnSchemaBuilderList() {
+                               return 
getColumnSchemaFieldBuilder().getBuilderList();
+                       }
+
+                       private 
com.google.protobuf.RepeatedFieldBuilderV3<org.apache.sysds.protobuf.SysdsProtos.Schema,
 org.apache.sysds.protobuf.SysdsProtos.Schema.Builder, 
org.apache.sysds.protobuf.SysdsProtos.SchemaOrBuilder> 
getColumnSchemaFieldBuilder() {
+                               if(columnSchemaBuilder_ == null) {
+                                       columnSchemaBuilder_ = new 
com.google.protobuf.RepeatedFieldBuilderV3<org.apache.sysds.protobuf.SysdsProtos.Schema,
 org.apache.sysds.protobuf.SysdsProtos.Schema.Builder, 
org.apache.sysds.protobuf.SysdsProtos.SchemaOrBuilder>(
+                                               columnSchema_, ((bitField0_ & 
0x00000004) != 0), getParentForChildren(), isClean());
+                                       columnSchema_ = null;
+                               }
+                               return columnSchemaBuilder_;
+                       }
+
+                       @java.lang.Override
+                       public final Builder setUnknownFields(final 
com.google.protobuf.UnknownFieldSet unknownFields) {
+                               return super.setUnknownFields(unknownFields);
+                       }
+
+                       @java.lang.Override
+                       public final Builder mergeUnknownFields(final 
com.google.protobuf.UnknownFieldSet unknownFields) {
+                               return super.mergeUnknownFields(unknownFields);
+                       }
+
+                       // @@protoc_insertion_point(builder_scope:sysds.Row)
+               }
+
+       }
+
+       /**
+        * Protobuf type {@code sysds.Schema}
+        */
+       public static final class Schema extends 
com.google.protobuf.GeneratedMessageV3 implements
+               // @@protoc_insertion_point(message_implements:sysds.Schema)
+               SchemaOrBuilder {
+               public static final int VALUETYPE_FIELD_NUMBER = 1;
+               private static final long serialVersionUID = 0L;
+               private static final 
com.google.protobuf.Internal.ListAdapter.Converter<java.lang.Integer, 
org.apache.sysds.protobuf.SysdsProtos.Schema.ValueType> valueType_converter_ = 
new com.google.protobuf.Internal.ListAdapter.Converter<java.lang.Integer, 
org.apache.sysds.protobuf.SysdsProtos.Schema.ValueType>() {
+                       public 
org.apache.sysds.protobuf.SysdsProtos.Schema.ValueType 
convert(java.lang.Integer from) {
+                               @SuppressWarnings("deprecation")
+                               
org.apache.sysds.protobuf.SysdsProtos.Schema.ValueType result = 
org.apache.sysds.protobuf.SysdsProtos.Schema.ValueType
+                                       .valueOf(from);
+                               return result == null ? 
org.apache.sysds.protobuf.SysdsProtos.Schema.ValueType.UNRECOGNIZED : result;
+                       }
+               };
+               // @@protoc_insertion_point(class_scope:sysds.Schema)
+               private static final 
org.apache.sysds.protobuf.SysdsProtos.Schema DEFAULT_INSTANCE;
+               private static final com.google.protobuf.Parser<Schema> PARSER 
= new com.google.protobuf.AbstractParser<Schema>() {
+                       @java.lang.Override
+                       public Schema 
parsePartialFrom(com.google.protobuf.CodedInputStream input,
+                               com.google.protobuf.ExtensionRegistryLite 
extensionRegistry)
+                               throws 
com.google.protobuf.InvalidProtocolBufferException {
+                               return new Schema(input, extensionRegistry);
+                       }
+               };
+
+               static {
+                       DEFAULT_INSTANCE = new 
org.apache.sysds.protobuf.SysdsProtos.Schema();
+               }
+
+               private java.util.List<java.lang.Integer> valueType_;
+               private int valueTypeMemoizedSerializedSize;
+               private byte memoizedIsInitialized = -1;
+
+               // Use Schema.newBuilder() to construct.
+               private 
Schema(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) {
+                       super(builder);
+               }
+
+               private Schema() {
+                       valueType_ = java.util.Collections.emptyList();
+               }
+
+               private Schema(com.google.protobuf.CodedInputStream input,
+                       com.google.protobuf.ExtensionRegistryLite 
extensionRegistry)
+                       throws 
com.google.protobuf.InvalidProtocolBufferException {
+                       this();
+                       if(extensionRegistry == null) {
+                               throw new java.lang.NullPointerException();
+                       }
+                       int mutable_bitField0_ = 0;
+                       com.google.protobuf.UnknownFieldSet.Builder 
unknownFields = com.google.protobuf.UnknownFieldSet
+                               .newBuilder();
+                       try {
+                               boolean done = false;
+                               while(!done) {
+                                       int tag = input.readTag();
+                                       switch(tag) {
+                                               case 0:
+                                                       done = true;
+                                                       break;
+                                               case 8: {
+                                                       int rawValue = 
input.readEnum();
+                                                       
if(!((mutable_bitField0_ & 0x00000001) != 0)) {
+                                                               valueType_ = 
new java.util.ArrayList<java.lang.Integer>();
+                                                               
mutable_bitField0_ |= 0x00000001;
+                                                       }
+                                                       
valueType_.add(rawValue);
+                                                       break;
+                                               }
+                                               case 10: {
+                                                       int length = 
input.readRawVarint32();
+                                                       int oldLimit = 
input.pushLimit(length);
+                                                       
while(input.getBytesUntilLimit() > 0) {
+                                                               int rawValue = 
input.readEnum();
+                                                               
if(!((mutable_bitField0_ & 0x00000001) != 0)) {
+                                                                       
valueType_ = new java.util.ArrayList<java.lang.Integer>();
+                                                                       
mutable_bitField0_ |= 0x00000001;
+                                                               }
+                                                               
valueType_.add(rawValue);
+                                                       }
+                                                       
input.popLimit(oldLimit);
+                                                       break;
+                                               }
+                                               default: {
+                                                       
if(!parseUnknownField(input, unknownFields, extensionRegistry, tag)) {
+                                                               done = true;
+                                                       }
+                                                       break;
+                                               }
+                                       }
+                               }
+                       }
+                       
catch(com.google.protobuf.InvalidProtocolBufferException e) {
+                               throw e.setUnfinishedMessage(this);
+                       }
+                       catch(java.io.IOException e) {
+                               throw new 
com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this);
+                       }
+                       finally {
+                               if(((mutable_bitField0_ & 0x00000001) != 0)) {
+                                       valueType_ = 
java.util.Collections.unmodifiableList(valueType_);
+                               }
+                               this.unknownFields = unknownFields.build();
+                               makeExtensionsImmutable();
+                       }
+               }
+
+               public static final com.google.protobuf.Descriptors.Descriptor 
getDescriptor() {
+                       return 
org.apache.sysds.protobuf.SysdsProtos.internal_static_sysds_Schema_descriptor;
+               }
+
+               public static org.apache.sysds.protobuf.SysdsProtos.Schema 
parseFrom(java.nio.ByteBuffer data)
+                       throws 
com.google.protobuf.InvalidProtocolBufferException {
+                       return PARSER.parseFrom(data);
+               }
+
+               public static org.apache.sysds.protobuf.SysdsProtos.Schema 
parseFrom(java.nio.ByteBuffer data,
+                       com.google.protobuf.ExtensionRegistryLite 
extensionRegistry)
+                       throws 
com.google.protobuf.InvalidProtocolBufferException {
+                       return PARSER.parseFrom(data, extensionRegistry);
+               }
+
+               public static org.apache.sysds.protobuf.SysdsProtos.Schema 
parseFrom(com.google.protobuf.ByteString data)
+                       throws 
com.google.protobuf.InvalidProtocolBufferException {
+                       return PARSER.parseFrom(data);
+               }
+
+               public static org.apache.sysds.protobuf.SysdsProtos.Schema 
parseFrom(com.google.protobuf.ByteString data,
+                       com.google.protobuf.ExtensionRegistryLite 
extensionRegistry)
+                       throws 
com.google.protobuf.InvalidProtocolBufferException {
+                       return PARSER.parseFrom(data, extensionRegistry);
+               }
+
+               public static org.apache.sysds.protobuf.SysdsProtos.Schema 
parseFrom(byte[] data)
+                       throws 
com.google.protobuf.InvalidProtocolBufferException {
+                       return PARSER.parseFrom(data);
+               }
+
+               public static org.apache.sysds.protobuf.SysdsProtos.Schema 
parseFrom(byte[] data,
+                       com.google.protobuf.ExtensionRegistryLite 
extensionRegistry)
+                       throws 
com.google.protobuf.InvalidProtocolBufferException {
+                       return PARSER.parseFrom(data, extensionRegistry);
+               }
+
+               public static org.apache.sysds.protobuf.SysdsProtos.Schema 
parseFrom(java.io.InputStream input)
+                       throws java.io.IOException {
+                       return 
com.google.protobuf.GeneratedMessageV3.parseWithIOException(PARSER, input);
+               }
+
+               public static org.apache.sysds.protobuf.SysdsProtos.Schema 
parseFrom(java.io.InputStream input,
+                       com.google.protobuf.ExtensionRegistryLite 
extensionRegistry) throws java.io.IOException {
+                       return 
com.google.protobuf.GeneratedMessageV3.parseWithIOException(PARSER, input, 
extensionRegistry);
+               }
+
+               public static org.apache.sysds.protobuf.SysdsProtos.Schema 
parseDelimitedFrom(java.io.InputStream input)
+                       throws java.io.IOException {
+                       return 
com.google.protobuf.GeneratedMessageV3.parseDelimitedWithIOException(PARSER, 
input);
+               }
+
+               public static org.apache.sysds.protobuf.SysdsProtos.Schema 
parseDelimitedFrom(java.io.InputStream input,
+                       com.google.protobuf.ExtensionRegistryLite 
extensionRegistry) throws java.io.IOException {
+                       return com.google.protobuf.GeneratedMessageV3
+                               .parseDelimitedWithIOException(PARSER, input, 
extensionRegistry);
+               }
+
+               public static org.apache.sysds.protobuf.SysdsProtos.Schema 
parseFrom(com.google.protobuf.CodedInputStream input)
+                       throws java.io.IOException {
+                       return 
com.google.protobuf.GeneratedMessageV3.parseWithIOException(PARSER, input);
+               }
+
+               public static org.apache.sysds.protobuf.SysdsProtos.Schema 
parseFrom(com.google.protobuf.CodedInputStream input,
+                       com.google.protobuf.ExtensionRegistryLite 
extensionRegistry) throws java.io.IOException {
+                       return 
com.google.protobuf.GeneratedMessageV3.parseWithIOException(PARSER, input, 
extensionRegistry);
+               }
+
+               public static Builder newBuilder() {
+                       return DEFAULT_INSTANCE.toBuilder();
+               }
+
+               public static Builder 
newBuilder(org.apache.sysds.protobuf.SysdsProtos.Schema prototype) {
+                       return 
DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype);
+               }
+
+               public static org.apache.sysds.protobuf.SysdsProtos.Schema 
getDefaultInstance() {
+                       return DEFAULT_INSTANCE;
+               }
+
+               public static com.google.protobuf.Parser<Schema> parser() {
+                       return PARSER;
+               }
+
+               @java.lang.Override
+               @SuppressWarnings({"unused"})
+               protected java.lang.Object newInstance(UnusedPrivateParameter 
unused) {
+                       return new Schema();
+               }
+
+               @java.lang.Override
+               public final com.google.protobuf.UnknownFieldSet 
getUnknownFields() {
+                       return this.unknownFields;
+               }
+
+               @java.lang.Override
+               protected 
com.google.protobuf.GeneratedMessageV3.FieldAccessorTable 
internalGetFieldAccessorTable() {
+                       return 
org.apache.sysds.protobuf.SysdsProtos.internal_static_sysds_Schema_fieldAccessorTable
+                               
.ensureFieldAccessorsInitialized(org.apache.sysds.protobuf.SysdsProtos.Schema.class,
+                                       
org.apache.sysds.protobuf.SysdsProtos.Schema.Builder.class);
+               }
+
+               /**
+                * <code>repeated .sysds.Schema.ValueType valueType = 1;</code>
+                *
+                * @return A list containing the valueType.
+                */
+               @java.lang.Override
+               public 
java.util.List<org.apache.sysds.protobuf.SysdsProtos.Schema.ValueType> 
getValueTypeList() {
+                       return new 
com.google.protobuf.Internal.ListAdapter<java.lang.Integer, 
org.apache.sysds.protobuf.SysdsProtos.Schema.ValueType>(
+                               valueType_, valueType_converter_);
+               }
+
+               /**
+                * <code>repeated .sysds.Schema.ValueType valueType = 1;</code>
+                *
+                * @return The count of valueType.
+                */
+               @java.lang.Override
+               public int getValueTypeCount() {
+                       return valueType_.size();
+               }
+
+               /**
+                * <code>repeated .sysds.Schema.ValueType valueType = 1;</code>
+                *
+                * @param index The index of the element to return.
+                * @return The valueType at the given index.
+                */
+               @java.lang.Override
+               public org.apache.sysds.protobuf.SysdsProtos.Schema.ValueType 
getValueType(int index) {
+                       return 
valueType_converter_.convert(valueType_.get(index));
+               }
+
+               /**
+                * <code>repeated .sysds.Schema.ValueType valueType = 1;</code>
+                *
+                * @return A list containing the enum numeric values on the 
wire for valueType.
+                */
+               @java.lang.Override
+               public java.util.List<java.lang.Integer> 
getValueTypeValueList() {
+                       return valueType_;
+               }
+
+               /**
+                * <code>repeated .sysds.Schema.ValueType valueType = 1;</code>
+                *
+                * @param index The index of the value to return.
+                * @return The enum numeric value on the wire of valueType at 
the given index.
+                */
+               @java.lang.Override
+               public int getValueTypeValue(int index) {
+                       return valueType_.get(index);
+               }
+
+               @java.lang.Override
+               public final boolean isInitialized() {
+                       byte isInitialized = memoizedIsInitialized;
+                       if(isInitialized == 1)
+                               return true;
+                       if(isInitialized == 0)
+                               return false;
+
+                       memoizedIsInitialized = 1;
+                       return true;
+               }
+
+               @java.lang.Override
+               public void writeTo(com.google.protobuf.CodedOutputStream 
output) throws java.io.IOException {
+                       getSerializedSize();
+                       if(getValueTypeList().size() > 0) {
+                               output.writeUInt32NoTag(10);
+                               
output.writeUInt32NoTag(valueTypeMemoizedSerializedSize);
+                       }
+                       for(int i = 0; i < valueType_.size(); i++) {
+                               output.writeEnumNoTag(valueType_.get(i));
+                       }
+                       unknownFields.writeTo(output);
+               }
+
+               @java.lang.Override
+               public int getSerializedSize() {
+                       int size = memoizedSize;
+                       if(size != -1)
+                               return size;
+
+                       size = 0;
+                       {
+                               int dataSize = 0;
+                               for(int i = 0; i < valueType_.size(); i++) {
+                                       dataSize += 
com.google.protobuf.CodedOutputStream.computeEnumSizeNoTag(valueType_.get(i));
+                               }
+                               size += dataSize;
+                               if(!getValueTypeList().isEmpty()) {
+                                       size += 1;
+                                       size += 
com.google.protobuf.CodedOutputStream.computeUInt32SizeNoTag(dataSize);
+                               }
+                               valueTypeMemoizedSerializedSize = dataSize;
+                       }
+                       size += unknownFields.getSerializedSize();
+                       memoizedSize = size;
+                       return size;
+               }
+
+               @java.lang.Override
+               public boolean equals(final java.lang.Object obj) {
+                       if(obj == this) {
+                               return true;
+                       }
+                       if(!(obj instanceof 
org.apache.sysds.protobuf.SysdsProtos.Schema)) {
+                               return super.equals(obj);
+                       }
+                       org.apache.sysds.protobuf.SysdsProtos.Schema other = 
(org.apache.sysds.protobuf.SysdsProtos.Schema) obj;
+
+                       if(!valueType_.equals(other.valueType_))
+                               return false;
+                       if(!unknownFields.equals(other.unknownFields))
+                               return false;
+                       return true;
+               }
+
+               @java.lang.Override
+               public int hashCode() {
+                       if(memoizedHashCode != 0) {
+                               return memoizedHashCode;
+                       }
+                       int hash = 41;
+                       hash = (19 * hash) + getDescriptor().hashCode();
+                       if(getValueTypeCount() > 0) {
+                               hash = (37 * hash) + VALUETYPE_FIELD_NUMBER;
+                               hash = (53 * hash) + valueType_.hashCode();
+                       }
+                       hash = (29 * hash) + unknownFields.hashCode();
+                       memoizedHashCode = hash;
+                       return hash;
+               }
+
+               @java.lang.Override
+               public Builder newBuilderForType() {
+                       return newBuilder();
+               }
+
+               @java.lang.Override
+               public Builder toBuilder() {
+                       return this == DEFAULT_INSTANCE ? new Builder() : new 
Builder().mergeFrom(this);
+               }
+
+               @java.lang.Override
+               protected Builder 
newBuilderForType(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
+                       Builder builder = new Builder(parent);
+                       return builder;
+               }
+
+               @java.lang.Override
+               public com.google.protobuf.Parser<Schema> getParserForType() {
+                       return PARSER;
+               }
+
+               @java.lang.Override
+               public org.apache.sysds.protobuf.SysdsProtos.Schema 
getDefaultInstanceForType() {
+                       return DEFAULT_INSTANCE;
+               }
+
+               /**
+                * Protobuf enum {@code sysds.Schema.ValueType}
+                */
+               public enum ValueType implements 
com.google.protobuf.ProtocolMessageEnum {
+                       /**
+                        * <code>FP32 = 0;</code>
+                        */
+                       FP32(0),
+                       /**
+                        * <code>FP64 = 1;</code>
+                        */
+                       FP64(1),
+                       /**
+                        * <code>INT32 = 2;</code>
+                        */
+                       INT32(2),
+                       /**
+                        * <code>INT64 = 3;</code>
+                        */
+                       INT64(3),
+                       /**
+                        * <code>BOOLEAN = 4;</code>
+                        */
+                       BOOLEAN(4),
+                       /**
+                        * <code>STRING = 5;</code>
+                        */
+                       STRING(5),
+                       /**
+                        * <code>UNKNOWN = 6;</code>
+                        */
+                       UNKNOWN(6), UNRECOGNIZED(-1),;
+
+                       /**
+                        * <code>FP32 = 0;</code>
+                        */
+                       public static final int FP32_VALUE = 0;
+                       /**
+                        * <code>FP64 = 1;</code>
+                        */
+                       public static final int FP64_VALUE = 1;
+                       /**
+                        * <code>INT32 = 2;</code>
+                        */
+                       public static final int INT32_VALUE = 2;
+                       /**
+                        * <code>INT64 = 3;</code>
+                        */
+                       public static final int INT64_VALUE = 3;
+                       /**
+                        * <code>BOOLEAN = 4;</code>
+                        */
+                       public static final int BOOLEAN_VALUE = 4;
+                       /**
+                        * <code>STRING = 5;</code>
+                        */
+                       public static final int STRING_VALUE = 5;
+                       /**
+                        * <code>UNKNOWN = 6;</code>
+                        */
+                       public static final int UNKNOWN_VALUE = 6;
+                       private static final 
com.google.protobuf.Internal.EnumLiteMap<ValueType> internalValueMap = new 
com.google.protobuf.Internal.EnumLiteMap<ValueType>() {
+                               public ValueType findValueByNumber(int number) {
+                                       return ValueType.forNumber(number);
+                               }
+                       };
+                       private static final ValueType[] VALUES = values();
+                       private final int value;
+
+                       private ValueType(int value) {
+                               this.value = value;
+                       }
+
+                       /**
+                        * @param value The numeric wire value of the 
corresponding enum entry.
+                        * @return The enum associated with the given numeric 
wire value.
+                        * @deprecated Use {@link #forNumber(int)} instead.
+                        */
+                       @java.lang.Deprecated
+                       public static ValueType valueOf(int value) {
+                               return forNumber(value);
+                       }
+
+                       /**
+                        * @param value The numeric wire value of the 
corresponding enum entry.
+                        * @return The enum associated with the given numeric 
wire value.
+                        */
+                       public static ValueType forNumber(int value) {
+                               switch(value) {
+                                       case 0:
+                                               return FP32;
+                                       case 1:
+                                               return FP64;
+                                       case 2:
+                                               return INT32;
+                                       case 3:
+                                               return INT64;
+                                       case 4:
+                                               return BOOLEAN;
+                                       case 5:
+                                               return STRING;
+                                       case 6:
+                                               return UNKNOWN;
+                                       default:
+                                               return null;
+                               }
+                       }
+
+                       public static 
com.google.protobuf.Internal.EnumLiteMap<ValueType> internalGetValueMap() {
+                               return internalValueMap;
+                       }
+
+                       public static final 
com.google.protobuf.Descriptors.EnumDescriptor getDescriptor() {
+                               return 
org.apache.sysds.protobuf.SysdsProtos.Schema.getDescriptor().getEnumTypes().get(0);
+                       }
+
+                       public static ValueType 
valueOf(com.google.protobuf.Descriptors.EnumValueDescriptor desc) {
+                               if(desc.getType() != getDescriptor()) {
+                                       throw new 
java.lang.IllegalArgumentException("EnumValueDescriptor is not for this type.");
+                               }
+                               if(desc.getIndex() == -1) {
+                                       return UNRECOGNIZED;
+                               }
+                               return VALUES[desc.getIndex()];
+                       }
+
+                       public final int getNumber() {
+                               if(this == UNRECOGNIZED) {
+                                       throw new 
java.lang.IllegalArgumentException("Can't get the number of an unknown enum 
value.");
+                               }
+                               return value;
+                       }
+
+                       public final 
com.google.protobuf.Descriptors.EnumValueDescriptor getValueDescriptor() {
+                               if(this == UNRECOGNIZED) {
+                                       throw new 
java.lang.IllegalStateException(
+                                               "Can't get the descriptor of an 
unrecognized enum value.");
+                               }
+                               return 
getDescriptor().getValues().get(ordinal());
+                       }
+
+                       public final 
com.google.protobuf.Descriptors.EnumDescriptor getDescriptorForType() {
+                               return getDescriptor();
+                       }
+
+                       // 
@@protoc_insertion_point(enum_scope:sysds.Schema.ValueType)
+               }
+
+               /**
+                * Protobuf type {@code sysds.Schema}
+                */
+               public static final class Builder extends 
com.google.protobuf.GeneratedMessageV3.Builder<Builder> implements
+                       // 
@@protoc_insertion_point(builder_implements:sysds.Schema)
+                       org.apache.sysds.protobuf.SysdsProtos.SchemaOrBuilder {
+                       private int bitField0_;
+                       private java.util.List<java.lang.Integer> valueType_ = 
java.util.Collections.emptyList();
+
+                       // Construct using 
org.apache.sysds.protobuf.SysdsProtos.Schema.newBuilder()
+                       private Builder() {
+                               maybeForceBuilderInitialization();
+                       }
+
+                       private 
Builder(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
+                               super(parent);
+                               maybeForceBuilderInitialization();
+                       }
+
+                       public static final 
com.google.protobuf.Descriptors.Descriptor getDescriptor() {
+                               return 
org.apache.sysds.protobuf.SysdsProtos.internal_static_sysds_Schema_descriptor;
+                       }
+
+                       @java.lang.Override
+                       protected 
com.google.protobuf.GeneratedMessageV3.FieldAccessorTable 
internalGetFieldAccessorTable() {
+                               return 
org.apache.sysds.protobuf.SysdsProtos.internal_static_sysds_Schema_fieldAccessorTable
+                                       
.ensureFieldAccessorsInitialized(org.apache.sysds.protobuf.SysdsProtos.Schema.class,
+                                               
org.apache.sysds.protobuf.SysdsProtos.Schema.Builder.class);
+                       }
+
+                       private void maybeForceBuilderInitialization() {
+                               
if(com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders) {
+                               }
+                       }
+
+                       @java.lang.Override
+                       public Builder clear() {
+                               super.clear();
+                               valueType_ = java.util.Collections.emptyList();
+                               bitField0_ = (bitField0_ & ~0x00000001);
+                               return this;
+                       }
+
+                       @java.lang.Override
+                       public com.google.protobuf.Descriptors.Descriptor 
getDescriptorForType() {
+                               return 
org.apache.sysds.protobuf.SysdsProtos.internal_static_sysds_Schema_descriptor;
+                       }
+
+                       @java.lang.Override
+                       public org.apache.sysds.protobuf.SysdsProtos.Schema 
getDefaultInstanceForType() {
+                               return 
org.apache.sysds.protobuf.SysdsProtos.Schema.getDefaultInstance();
+                       }
+
+                       @java.lang.Override
+                       public org.apache.sysds.protobuf.SysdsProtos.Schema 
build() {
+                               org.apache.sysds.protobuf.SysdsProtos.Schema 
result = buildPartial();
+                               if(!result.isInitialized()) {
+                                       throw 
newUninitializedMessageException(result);
+                               }
+                               return result;
+                       }
+
+                       @java.lang.Override
+                       public org.apache.sysds.protobuf.SysdsProtos.Schema 
buildPartial() {
+                               org.apache.sysds.protobuf.SysdsProtos.Schema 
result = new org.apache.sysds.protobuf.SysdsProtos.Schema(
+                                       this);
+                               int from_bitField0_ = bitField0_;
+                               if(((bitField0_ & 0x00000001) != 0)) {
+                                       valueType_ = 
java.util.Collections.unmodifiableList(valueType_);
+                                       bitField0_ = (bitField0_ & ~0x00000001);
+                               }
+                               result.valueType_ = valueType_;
+                               onBuilt();
+                               return result;
+                       }
+
+                       @java.lang.Override
+                       public Builder clone() {
+                               return super.clone();
+                       }
+
+                       @java.lang.Override
+                       public Builder 
setField(com.google.protobuf.Descriptors.FieldDescriptor field, 
java.lang.Object value) {
+                               return super.setField(field, value);
+                       }
+
+                       @java.lang.Override
+                       public Builder 
clearField(com.google.protobuf.Descriptors.FieldDescriptor field) {
+                               return super.clearField(field);
+                       }
+
+                       @java.lang.Override
+                       public Builder 
clearOneof(com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+                               return super.clearOneof(oneof);
+                       }
+
+                       @java.lang.Override
+                       public Builder 
setRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, int 
index,
+                               java.lang.Object value) {
+                               return super.setRepeatedField(field, index, 
value);
+                       }
+
+                       @java.lang.Override
+                       public Builder 
addRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field,
+                               java.lang.Object value) {
+                               return super.addRepeatedField(field, value);
+                       }
+
+                       @java.lang.Override
+                       public Builder mergeFrom(com.google.protobuf.Message 
other) {
+                               if(other instanceof 
org.apache.sysds.protobuf.SysdsProtos.Schema) {
+                                       return 
mergeFrom((org.apache.sysds.protobuf.SysdsProtos.Schema) other);
+                               }
+                               else {
+                                       super.mergeFrom(other);
+                                       return this;
+                               }
+                       }
+
+                       public Builder 
mergeFrom(org.apache.sysds.protobuf.SysdsProtos.Schema other) {
+                               if(other == 
org.apache.sysds.protobuf.SysdsProtos.Schema.getDefaultInstance())
+                                       return this;
+                               if(!other.valueType_.isEmpty()) {
+                                       if(valueType_.isEmpty()) {
+                                               valueType_ = other.valueType_;
+                                               bitField0_ = (bitField0_ & 
~0x00000001);
+                                       }
+                                       else {
+                                               ensureValueTypeIsMutable();
+                                               
valueType_.addAll(other.valueType_);
+                                       }
+                                       onChanged();
+                               }
+                               this.mergeUnknownFields(other.unknownFields);
+                               onChanged();
+                               return this;
+                       }
+
+                       @java.lang.Override
+                       public final boolean isInitialized() {
+                               return true;
+                       }
+
+                       @java.lang.Override
+                       public Builder 
mergeFrom(com.google.protobuf.CodedInputStream input,
+                               com.google.protobuf.ExtensionRegistryLite 
extensionRegistry) throws java.io.IOException {
+                               org.apache.sysds.protobuf.SysdsProtos.Schema 
parsedMessage = null;
+                               try {
+                                       parsedMessage = 
PARSER.parsePartialFrom(input, extensionRegistry);
+                               }
+                               
catch(com.google.protobuf.InvalidProtocolBufferException e) {
+                                       parsedMessage = 
(org.apache.sysds.protobuf.SysdsProtos.Schema) e.getUnfinishedMessage();
+                                       throw e.unwrapIOException();
+                               }
+                               finally {
+                                       if(parsedMessage != null) {
+                                               mergeFrom(parsedMessage);
+                                       }
+                               }
+                               return this;
+                       }
+
+                       private void ensureValueTypeIsMutable() {
+                               if(!((bitField0_ & 0x00000001) != 0)) {
+                                       valueType_ = new 
java.util.ArrayList<java.lang.Integer>(valueType_);
+                                       bitField0_ |= 0x00000001;
+                               }
+                       }
+
+                       /**
+                        * <code>repeated .sysds.Schema.ValueType valueType = 
1;</code>
+                        *
+                        * @return A list containing the valueType.
+                        */
+                       public 
java.util.List<org.apache.sysds.protobuf.SysdsProtos.Schema.ValueType> 
getValueTypeList() {
+                               return new 
com.google.protobuf.Internal.ListAdapter<java.lang.Integer, 
org.apache.sysds.protobuf.SysdsProtos.Schema.ValueType>(
+                                       valueType_, valueType_converter_);
+                       }
+
+                       /**
+                        * <code>repeated .sysds.Schema.ValueType valueType = 
1;</code>
+                        *
+                        * @return The count of valueType.
+                        */
+                       public int getValueTypeCount() {
+                               return valueType_.size();
+                       }
+
+                       /**
+                        * <code>repeated .sysds.Schema.ValueType valueType = 
1;</code>
+                        *
+                        * @param index The index of the element to return.
+                        * @return The valueType at the given index.
+                        */
+                       public 
org.apache.sysds.protobuf.SysdsProtos.Schema.ValueType getValueType(int index) {
+                               return 
valueType_converter_.convert(valueType_.get(index));
+                       }
+
+                       /**
+                        * <code>repeated .sysds.Schema.ValueType valueType = 
1;</code>
+                        *
+                        * @param index The index to set the value at.
+                        * @param value The valueType to set.
+                        * @return This builder for chaining.
+                        */
+                       public Builder setValueType(int index, 
org.apache.sysds.protobuf.SysdsProtos.Schema.ValueType value) {
+                               if(value == null) {
+                                       throw new NullPointerException();
+                               }
+                               ensureValueTypeIsMutable();
+                               valueType_.set(index, value.getNumber());
+                               onChanged();
+                               return this;
+                       }
+
+                       /**
+                        * <code>repeated .sysds.Schema.ValueType valueType = 
1;</code>
+                        *
+                        * @param value The valueType to add.
+                        * @return This builder for chaining.
+                        */
+                       public Builder 
addValueType(org.apache.sysds.protobuf.SysdsProtos.Schema.ValueType value) {
+                               if(value == null) {
+                                       throw new NullPointerException();
+                               }
+                               ensureValueTypeIsMutable();
+                               valueType_.add(value.getNumber());
+                               onChanged();
+                               return this;
+                       }
+
+                       /**
+                        * <code>repeated .sysds.Schema.ValueType valueType = 
1;</code>
+                        *
+                        * @param values The valueType to add.
+                        * @return This builder for chaining.
+                        */
+                       public Builder addAllValueType(
+                               java.lang.Iterable<? extends 
org.apache.sysds.protobuf.SysdsProtos.Schema.ValueType> values) {
+                               ensureValueTypeIsMutable();
+                               
for(org.apache.sysds.protobuf.SysdsProtos.Schema.ValueType value : values) {
+                                       valueType_.add(value.getNumber());
+                               }
+                               onChanged();
+                               return this;
+                       }
+
+                       /**
+                        * <code>repeated .sysds.Schema.ValueType valueType = 
1;</code>
+                        *
+                        * @return This builder for chaining.
+                        */
+                       public Builder clearValueType() {
+                               valueType_ = java.util.Collections.emptyList();
+                               bitField0_ = (bitField0_ & ~0x00000001);
+                               onChanged();
+                               return this;
+                       }
+
+                       /**
+                        * <code>repeated .sysds.Schema.ValueType valueType = 
1;</code>
+                        *
+                        * @return A list containing the enum numeric values on 
the wire for valueType.
+                        */
+                       public java.util.List<java.lang.Integer> 
getValueTypeValueList() {
+                               return 
java.util.Collections.unmodifiableList(valueType_);
+                       }
+
+                       /**
+                        * <code>repeated .sysds.Schema.ValueType valueType = 
1;</code>
+                        *
+                        * @param index The index of the value to return.
+                        * @return The enum numeric value on the wire of 
valueType at the given index.
+                        */
+                       public int getValueTypeValue(int index) {
+                               return valueType_.get(index);
+                       }
+
+                       /**
+                        * <code>repeated .sysds.Schema.ValueType valueType = 
1;</code>
+                        *
+                        * @param index The index of the value to return.
+                        * @return The enum numeric value on the wire of 
valueType at the given index.
+                        * @return This builder for chaining.
+                        */
+                       public Builder setValueTypeValue(int index, int value) {
+                               ensureValueTypeIsMutable();
+                               valueType_.set(index, value);
+                               onChanged();
+                               return this;
+                       }
+
+                       /**
+                        * <code>repeated .sysds.Schema.ValueType valueType = 
1;</code>
+                        *
+                        * @param value The enum numeric value on the wire for 
valueType to add.
+                        * @return This builder for chaining.
+                        */
+                       public Builder addValueTypeValue(int value) {
+                               ensureValueTypeIsMutable();
+                               valueType_.add(value);
+                               onChanged();
+                               return this;
+                       }
+
+                       /**
+                        * <code>repeated .sysds.Schema.ValueType valueType = 
1;</code>
+                        *
+                        * @param values The enum numeric values on the wire 
for valueType to add.
+                        * @return This builder for chaining.
+                        */
+                       public Builder 
addAllValueTypeValue(java.lang.Iterable<java.lang.Integer> values) {
+                               ensureValueTypeIsMutable();
+                               for(int value : values) {
+                                       valueType_.add(value);
+                               }
+                               onChanged();
+                               return this;
+                       }
+
+                       @java.lang.Override
+                       public final Builder setUnknownFields(final 
com.google.protobuf.UnknownFieldSet unknownFields) {
+                               return super.setUnknownFields(unknownFields);
+                       }
+
+                       @java.lang.Override
+                       public final Builder mergeUnknownFields(final 
com.google.protobuf.UnknownFieldSet unknownFields) {
+                               return super.mergeUnknownFields(unknownFields);
+                       }
+
+                       // @@protoc_insertion_point(builder_scope:sysds.Schema)
+               }
+
+       }
+
+       // @@protoc_insertion_point(outer_class_scope)
+}
diff --git a/src/main/java/org/apache/sysds/runtime/io/FrameReaderFactory.java 
b/src/main/java/org/apache/sysds/runtime/io/FrameReaderFactory.java
index 4510133..9b38d96 100644
--- a/src/main/java/org/apache/sysds/runtime/io/FrameReaderFactory.java
+++ b/src/main/java/org/apache/sysds/runtime/io/FrameReaderFactory.java
@@ -19,51 +19,52 @@
 
 package org.apache.sysds.runtime.io;
 
-import org.apache.sysds.conf.ConfigurationManager;
 import org.apache.sysds.common.Types.FileFormat;
 import org.apache.sysds.conf.CompilerConfig.ConfigType;
+import org.apache.sysds.conf.ConfigurationManager;
 import org.apache.sysds.runtime.DMLRuntimeException;
 
-public class FrameReaderFactory
-{
-       public static FrameReader createFrameReader( FileFormat fmt ) {
-               FileFormatProperties props = (fmt==FileFormat.CSV) ?
-                       new FileFormatPropertiesCSV() : null;
+public class FrameReaderFactory {
+       public static FrameReader createFrameReader(FileFormat fmt) {
+               FileFormatProperties props = (fmt == FileFormat.CSV) ? new 
FileFormatPropertiesCSV() : null;
                return createFrameReader(fmt, props);
        }
 
-       public static FrameReader createFrameReader( FileFormat fmt, 
FileFormatProperties props ) {
+       public static FrameReader createFrameReader(FileFormat fmt, 
FileFormatProperties props) {
                FrameReader reader = null;
 
                switch(fmt) {
                        case TEXT:
-                               if( 
ConfigurationManager.getCompilerConfigFlag(ConfigType.PARALLEL_CP_READ_TEXTFORMATS)
 )
+                               
if(ConfigurationManager.getCompilerConfigFlag(ConfigType.PARALLEL_CP_READ_TEXTFORMATS))
                                        reader = new 
FrameReaderTextCellParallel();
                                else
                                        reader = new FrameReaderTextCell();
                                break;
-                               
+
                        case CSV:
-                               if( props!=null && !(props instanceof 
FileFormatPropertiesCSV) )
+                               if(props != null && !(props instanceof 
FileFormatPropertiesCSV))
                                        throw new DMLRuntimeException("Wrong 
type of file format properties for CSV writer.");
-                               if( 
ConfigurationManager.getCompilerConfigFlag(ConfigType.PARALLEL_CP_READ_TEXTFORMATS)
 )
-                                       reader = new 
FrameReaderTextCSVParallel( (FileFormatPropertiesCSV)props );
+                               
if(ConfigurationManager.getCompilerConfigFlag(ConfigType.PARALLEL_CP_READ_TEXTFORMATS))
+                                       reader = new 
FrameReaderTextCSVParallel((FileFormatPropertiesCSV) props);
                                else
-                                       reader = new FrameReaderTextCSV( 
(FileFormatPropertiesCSV)props );
+                                       reader = new 
FrameReaderTextCSV((FileFormatPropertiesCSV) props);
                                break;
-                               
+
                        case BINARY:
-                               if( 
ConfigurationManager.getCompilerConfigFlag(ConfigType.PARALLEL_CP_READ_BINARYFORMATS)
 )
+                               
if(ConfigurationManager.getCompilerConfigFlag(ConfigType.PARALLEL_CP_READ_BINARYFORMATS))
                                        reader = new 
FrameReaderBinaryBlockParallel();
                                else
                                        reader = new FrameReaderBinaryBlock();
                                break;
-                               
+                       case PROTO:
+                               // TODO performance improvement: add parallel 
reader
+                               reader = new FrameReaderProto();
+                               break;
+
                        default:
-                               throw new DMLRuntimeException(
-                                       "Failed to create frame reader for 
unknown format: " + fmt.toString());
+                               throw new DMLRuntimeException("Failed to create 
frame reader for unknown format: " + fmt.toString());
                }
-               
+
                return reader;
        }
 }
diff --git a/src/main/java/org/apache/sysds/runtime/io/FrameReaderProto.java 
b/src/main/java/org/apache/sysds/runtime/io/FrameReaderProto.java
new file mode 100644
index 0000000..34f0dbb
--- /dev/null
+++ b/src/main/java/org/apache/sysds/runtime/io/FrameReaderProto.java
@@ -0,0 +1,87 @@
+/*
+ * 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.sysds.runtime.io;
+
+import java.io.IOException;
+import java.io.InputStream;
+
+import org.apache.hadoop.fs.FSDataInputStream;
+import org.apache.hadoop.fs.FileSystem;
+import org.apache.hadoop.fs.Path;
+import org.apache.hadoop.mapred.FileInputFormat;
+import org.apache.hadoop.mapred.JobConf;
+import org.apache.sysds.common.Types;
+import org.apache.sysds.conf.ConfigurationManager;
+import org.apache.sysds.protobuf.SysdsProtos;
+import org.apache.sysds.runtime.DMLRuntimeException;
+import org.apache.sysds.runtime.matrix.data.FrameBlock;
+import org.apache.sysds.runtime.util.UtilFunctions;
+
+public class FrameReaderProto extends FrameReader {
+       @Override
+       public FrameBlock readFrameFromHDFS(String fname, Types.ValueType[] 
schema, String[] names, long rlen, long clen)
+               throws IOException {
+               // prepare file access
+               JobConf jobConf = new 
JobConf(ConfigurationManager.getCachedJobConf());
+               Path path = new Path(fname);
+               FileSystem fileSystem = IOUtilFunctions.getFileSystem(path, 
jobConf);
+               FileInputFormat.addInputPath(jobConf, path);
+
+               // check existence and non-empty file
+               checkValidInputFile(fileSystem, path);
+
+               Types.ValueType[] outputSchema = createOutputSchema(schema, 
clen);
+               String[] outputNames = createOutputNames(names, clen);
+               FrameBlock outputFrameBlock = 
createOutputFrameBlock(outputSchema, outputNames, rlen);
+
+               // core read (sequential/parallel)
+               readProtoFrameFromHDFS(path, fileSystem, outputFrameBlock, 
rlen, clen);
+               return outputFrameBlock;
+       }
+
+       private void readProtoFrameFromHDFS(Path path, FileSystem fileSystem, 
FrameBlock dest, long rlen, long clen)
+               throws IOException {
+               SysdsProtos.Frame frame = readProtoFrameFromFile(path, 
fileSystem);
+               for(int row = 0; row < rlen; row++) {
+                       for(int column = 0; column < clen; column++) {
+                               dest.set(row,
+                                       column,
+                                       
UtilFunctions.stringToObject(Types.ValueType.STRING, 
frame.getRows(row).getColumnData(column)));
+                       }
+               }
+               IOUtilFunctions.deleteCrcFilesFromLocalFileSystem(fileSystem, 
path);
+       }
+
+       private SysdsProtos.Frame readProtoFrameFromFile(Path path, FileSystem 
fileSystem) throws IOException {
+               FSDataInputStream fsDataInputStream = fileSystem.open(path);
+               try {
+                       return 
SysdsProtos.Frame.newBuilder().mergeFrom(fsDataInputStream).build();
+               }
+               finally {
+                       IOUtilFunctions.closeSilently(fsDataInputStream);
+               }
+       }
+
+       @Override
+       public FrameBlock readFrameFromInputStream(InputStream is, 
Types.ValueType[] schema, String[] names, long rlen,
+               long clen) {
+               throw new DMLRuntimeException("Not implemented yet.");
+       }
+}
diff --git a/src/main/java/org/apache/sysds/runtime/io/FrameWriterFactory.java 
b/src/main/java/org/apache/sysds/runtime/io/FrameWriterFactory.java
index f34e458..3df8191 100644
--- a/src/main/java/org/apache/sysds/runtime/io/FrameWriterFactory.java
+++ b/src/main/java/org/apache/sysds/runtime/io/FrameWriterFactory.java
@@ -55,6 +55,11 @@ public class FrameWriterFactory
                                else
                                        writer = new FrameWriterBinaryBlock();
                                break;
+
+                       case PROTO:
+                               // TODO performance improvement: add parallel 
reader
+                               writer = new FrameWriterProto();
+                               break;
                        
                        default:
                                throw new DMLRuntimeException("Failed to create 
frame writer for unknown format: " + fmt.toString());
diff --git a/src/main/java/org/apache/sysds/runtime/io/FrameWriterProto.java 
b/src/main/java/org/apache/sysds/runtime/io/FrameWriterProto.java
new file mode 100644
index 0000000..1e0ae4d
--- /dev/null
+++ b/src/main/java/org/apache/sysds/runtime/io/FrameWriterProto.java
@@ -0,0 +1,80 @@
+/*
+ * 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.sysds.runtime.io;
+
+import java.io.IOException;
+import java.io.OutputStream;
+import java.util.Arrays;
+import java.util.Iterator;
+
+import org.apache.hadoop.fs.FileSystem;
+import org.apache.hadoop.fs.Path;
+import org.apache.hadoop.mapred.JobConf;
+import org.apache.sysds.conf.ConfigurationManager;
+import org.apache.sysds.protobuf.SysdsProtos;
+import org.apache.sysds.runtime.matrix.data.FrameBlock;
+import org.apache.sysds.runtime.util.HDFSTool;
+
+public class FrameWriterProto extends FrameWriter {
+       @Override
+       public void writeFrameToHDFS(FrameBlock src, String fname, long rlen, 
long clen) throws IOException {
+               // prepare file access
+               JobConf job = new 
JobConf(ConfigurationManager.getCachedJobConf());
+               Path path = new Path(fname);
+
+               // if the file already exists on HDFS, remove it.
+               HDFSTool.deleteFileIfExistOnHDFS(fname);
+
+               // validity check frame dimensions
+               if(src.getNumRows() != rlen || src.getNumColumns() != clen) {
+                       throw new IOException("Frame dimensions mismatch with 
metadata: " + src.getNumRows() + "x"
+                               + src.getNumColumns() + " vs " + rlen + "x" + 
clen + ".");
+               }
+
+               writeProtoFrameToHDFS(path, job, src, rlen, clen);
+       }
+
+       protected void writeProtoFrameToHDFS(Path path, JobConf jobConf, 
FrameBlock src, long rlen, long clen)
+               throws IOException {
+               FileSystem fileSystem = IOUtilFunctions.getFileSystem(path, 
jobConf);
+               writeProtoFrameToFile(path, fileSystem, src, 0, (int) rlen);
+               IOUtilFunctions.deleteCrcFilesFromLocalFileSystem(fileSystem, 
path);
+       }
+
+       protected void writeProtoFrameToFile(Path path, FileSystem fileSystem, 
FrameBlock src, int lowerRowBound,
+               int upperRowBound) throws IOException {
+               // Current Protobuf protocol is based on 32-bit signed 
arithmetic, meaning potential problems in files of > 2GB.
+               // see:
+               // 
https://stackoverflow.com/questions/34128872/google-protobuf-maximum-size#:~:text=Protobuf%20has%20a%20hard%20limit,manually%20if%20you%20need%20to.
+               OutputStream outputStream = fileSystem.create(path, true);
+               SysdsProtos.Frame.Builder frameBuilder = 
SysdsProtos.Frame.newBuilder();
+               try {
+                       Iterator<String[]> stringRowIterator = 
src.getStringRowIterator(lowerRowBound, upperRowBound);
+                       while(stringRowIterator.hasNext()) {
+                               String[] row = stringRowIterator.next();
+                               
frameBuilder.addRowsBuilder().addAllColumnData(Arrays.asList(row));
+                       }
+                       frameBuilder.build().writeTo(outputStream);
+               }
+               finally {
+                       IOUtilFunctions.closeSilently(outputStream);
+               }
+       }
+}
diff --git a/src/main/resources/protobuf/Frame.proto 
b/src/main/resources/protobuf/Frame.proto
new file mode 100644
index 0000000..f459bcf
--- /dev/null
+++ b/src/main/resources/protobuf/Frame.proto
@@ -0,0 +1,46 @@
+/*
+ * 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.
+ */
+syntax = "proto3";
+package sysds;
+option java_package = "org.apache.sysds.protobuf";
+option java_outer_classname = "SysdsProtos";
+option java_multiple_files = false;
+
+message Frame {
+    repeated Row rows = 1;
+}
+
+message Row {
+    repeated string column_names = 1;
+    repeated string column_data = 2;
+    repeated Schema column_schema = 3;
+}
+
+message Schema {
+    enum ValueType {
+        FP32 = 0;
+        FP64 = 1;
+        INT32 = 2;
+        INT64 = 3;
+        BOOLEAN = 4;
+        STRING = 5;
+        UNKNOWN = 6;
+    }
+    repeated ValueType valueType = 1;
+}
diff --git 
a/src/test/java/org/apache/sysds/test/functions/io/proto/FrameReaderWriterProtoTest.java
 
b/src/test/java/org/apache/sysds/test/functions/io/proto/FrameReaderWriterProtoTest.java
new file mode 100644
index 0000000..38541f5
--- /dev/null
+++ 
b/src/test/java/org/apache/sysds/test/functions/io/proto/FrameReaderWriterProtoTest.java
@@ -0,0 +1,81 @@
+/*
+ * 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.sysds.test.functions.io.proto;
+
+import java.io.IOException;
+import java.util.Random;
+
+import org.apache.sysds.common.Types;
+import org.apache.sysds.runtime.io.FrameReader;
+import org.apache.sysds.runtime.io.FrameReaderFactory;
+import org.apache.sysds.runtime.io.FrameWriter;
+import org.apache.sysds.runtime.io.FrameWriterFactory;
+import org.apache.sysds.runtime.matrix.data.FrameBlock;
+import org.apache.sysds.runtime.util.DataConverter;
+import org.apache.sysds.test.TestUtils;
+import org.junit.Test;
+
+public class FrameReaderWriterProtoTest {
+
+       private static final String FILENAME_SINGLE = 
"target/testTemp/functions/data/FrameReaderWriterProtoTest/testFrameBlock.proto";
+       private static final long SEED = 4669201;
+
+       private FrameWriter frameWriterProto = 
FrameWriterFactory.createFrameWriter(Types.FileFormat.PROTO);
+       private FrameReader frameReaderProto = 
FrameReaderFactory.createFrameReader(Types.FileFormat.PROTO);
+
+       @Test
+       public void 
testWriteReadFrameBlockWithSinleRowAndSingleColumnFromHDFS() throws IOException 
{
+               testWriteReadFrameBlockWith(1, 1);
+       }
+
+       @Test
+       public void 
testWriteReadFrameBlockWithSingleRowAndMultipleColumnsFromHDFS() throws 
IOException {
+               testWriteReadFrameBlockWith(1, 23);
+       }
+
+       @Test
+       public void 
testWriteReadFrameBlockWithMultipleRowsAndSingleColumnFromHDFS() throws 
IOException {
+               testWriteReadFrameBlockWith(21, 1);
+       }
+
+       @Test
+       public void 
testWriteReadFrameBlockWithSmallMultipleRowsAndMultipleColumnsFromHDFS() throws 
IOException {
+               testWriteReadFrameBlockWith(42, 35);
+       }
+
+       @Test
+       public void 
testWriteReadFrameBlockWithMediumMultipleRowsAndMultipleColumnsFromHDFS() 
throws IOException {
+               testWriteReadFrameBlockWith(694, 164);
+       }
+
+       public void testWriteReadFrameBlockWith(int rows, int cols) throws 
IOException {
+               final Random random = new Random(SEED);
+               Types.ValueType[] schema = TestUtils.generateRandomSchema(cols, 
random);
+               FrameBlock expectedFrame = 
TestUtils.generateRandomFrameBlock(rows, cols, schema, random);
+
+               frameWriterProto.writeFrameToHDFS(expectedFrame, 
FILENAME_SINGLE, rows, cols);
+               FrameBlock actualFrame = 
frameReaderProto.readFrameFromHDFS(FILENAME_SINGLE, schema, rows, cols);
+
+               String[][] expected = 
DataConverter.convertToStringFrame(expectedFrame);
+               String[][] actual = 
DataConverter.convertToStringFrame(actualFrame);
+
+               TestUtils.compareFrames(expected, actual, rows, cols);
+       }
+}

Reply via email to