/*
  Copyright 2021 The TensorFlow Authors. All Rights Reserved.

 Licensed 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.
 ==============================================================================
 */

// Generated by the protocol buffer compiler.  DO NOT EDIT!
// source: tensorflow/core/framework/op_def.proto

package org.tensorflow.proto.framework;

/**
 * <pre>
 * Defines an operation. A NodeDef in a GraphDef specifies an Op by
 * using the "op" field which should match the name of a OpDef.
 * LINT.IfChange
 * </pre>
 *
 * Protobuf type {@code tensorflow.OpDef}
 */
public  final class OpDef extends
    com.google.protobuf.GeneratedMessageV3 implements
    // @@protoc_insertion_point(message_implements:tensorflow.OpDef)
    OpDefOrBuilder {
private static final long serialVersionUID = 0L;

  // Use OpDef.newBuilder() to construct.
  private OpDef(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) {
    super(builder);
  }

  private OpDef() {
    name_ = "";
    inputArg_ = java.util.Collections.emptyList();
    outputArg_ = java.util.Collections.emptyList();
    controlOutput_ = com.google.protobuf.LazyStringArrayList.EMPTY;
    attr_ = java.util.Collections.emptyList();
    summary_ = "";
    description_ = "";
  }

  @Override
  @SuppressWarnings({"unused"})
  protected Object newInstance(
      UnusedPrivateParameter unused) {
    return new OpDef();
  }

  @Override
  public final com.google.protobuf.UnknownFieldSet
  getUnknownFields() {
    return this.unknownFields;
  }

  private OpDef(
      com.google.protobuf.CodedInputStream input,
      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
      throws com.google.protobuf.InvalidProtocolBufferException {
    this();
    if (extensionRegistry == null) {
      throw new 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: {
            String s = input.readStringRequireUtf8();

            name_ = s;
            break;
          }
          case 18: {
            if (!((mutable_bitField0_ & 0x00000001) != 0)) {
              inputArg_ = new java.util.ArrayList<ArgDef>();
              mutable_bitField0_ |= 0x00000001;
            }
            inputArg_.add(
                input.readMessage(ArgDef.parser(), extensionRegistry));
            break;
          }
          case 26: {
            if (!((mutable_bitField0_ & 0x00000002) != 0)) {
              outputArg_ = new java.util.ArrayList<ArgDef>();
              mutable_bitField0_ |= 0x00000002;
            }
            outputArg_.add(
                input.readMessage(ArgDef.parser(), extensionRegistry));
            break;
          }
          case 34: {
            if (!((mutable_bitField0_ & 0x00000008) != 0)) {
              attr_ = new java.util.ArrayList<AttrDef>();
              mutable_bitField0_ |= 0x00000008;
            }
            attr_.add(
                input.readMessage(AttrDef.parser(), extensionRegistry));
            break;
          }
          case 42: {
            String s = input.readStringRequireUtf8();

            summary_ = s;
            break;
          }
          case 50: {
            String s = input.readStringRequireUtf8();

            description_ = s;
            break;
          }
          case 66: {
            OpDeprecation.Builder subBuilder = null;
            if (deprecation_ != null) {
              subBuilder = deprecation_.toBuilder();
            }
            deprecation_ = input.readMessage(OpDeprecation.parser(), extensionRegistry);
            if (subBuilder != null) {
              subBuilder.mergeFrom(deprecation_);
              deprecation_ = subBuilder.buildPartial();
            }

            break;
          }
          case 128: {

            isAggregate_ = input.readBool();
            break;
          }
          case 136: {

            isStateful_ = input.readBool();
            break;
          }
          case 144: {

            isCommutative_ = input.readBool();
            break;
          }
          case 152: {

            allowsUninitializedInput_ = input.readBool();
            break;
          }
          case 162: {
            String s = input.readStringRequireUtf8();
            if (!((mutable_bitField0_ & 0x00000004) != 0)) {
              controlOutput_ = new com.google.protobuf.LazyStringArrayList();
              mutable_bitField0_ |= 0x00000004;
            }
            controlOutput_.add(s);
            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)) {
        inputArg_ = java.util.Collections.unmodifiableList(inputArg_);
      }
      if (((mutable_bitField0_ & 0x00000002) != 0)) {
        outputArg_ = java.util.Collections.unmodifiableList(outputArg_);
      }
      if (((mutable_bitField0_ & 0x00000008) != 0)) {
        attr_ = java.util.Collections.unmodifiableList(attr_);
      }
      if (((mutable_bitField0_ & 0x00000004) != 0)) {
        controlOutput_ = controlOutput_.getUnmodifiableView();
      }
      this.unknownFields = unknownFields.build();
      makeExtensionsImmutable();
    }
  }

  public static final com.google.protobuf.Descriptors.Descriptor
  getDescriptor() {
    return OpDefProtos.internal_static_tensorflow_OpDef_descriptor;
  }

  @Override
  protected FieldAccessorTable
  internalGetFieldAccessorTable() {
    return OpDefProtos.internal_static_tensorflow_OpDef_fieldAccessorTable
        .ensureFieldAccessorsInitialized(
            OpDef.class, Builder.class);
  }

  public interface ArgDefOrBuilder extends
      // @@protoc_insertion_point(interface_extends:tensorflow.OpDef.ArgDef)
      com.google.protobuf.MessageOrBuilder {

    /**
     * <pre>
     * Name for the input/output.  Should match the regexp "[a-z][a-z0-9_]*".
     * </pre>
     *
     * <code>string name = 1;</code>
     */
    String getName();

    /**
     * <pre>
     * Name for the input/output.  Should match the regexp "[a-z][a-z0-9_]*".
     * </pre>
     *
     * <code>string name = 1;</code>
     */
    com.google.protobuf.ByteString
    getNameBytes();

    /**
     * <pre>
     * Human readable description.
     * </pre>
     *
     * <code>string description = 2;</code>
     */
    String getDescription();

    /**
     * <pre>
     * Human readable description.
     * </pre>
     *
     * <code>string description = 2;</code>
     */
    com.google.protobuf.ByteString
    getDescriptionBytes();

    /**
     * <pre>
     * Describes the type of one or more tensors that are accepted/produced
     * by this input/output arg.  The only legal combinations are:
     * * For a single tensor: either the "type" field is set or the
     *   "type_attr" field is set to the name of an attr with type "type".
     * * For a sequence of tensors with the same type: the "number_attr"
     *   field will be set to the name of an attr with type "int", and
     *   either the "type" or "type_attr" field will be set as for
     *   single tensors.
     * * For a sequence of tensors, the "type_list_attr" field will be set
     *   to the name of an attr with type "list(type)".
     * </pre>
     *
     * <code>.tensorflow.DataType type = 3;</code>
     */
    int getTypeValue();

    /**
     * <pre>
     * Describes the type of one or more tensors that are accepted/produced
     * by this input/output arg.  The only legal combinations are:
     * * For a single tensor: either the "type" field is set or the
     *   "type_attr" field is set to the name of an attr with type "type".
     * * For a sequence of tensors with the same type: the "number_attr"
     *   field will be set to the name of an attr with type "int", and
     *   either the "type" or "type_attr" field will be set as for
     *   single tensors.
     * * For a sequence of tensors, the "type_list_attr" field will be set
     *   to the name of an attr with type "list(type)".
     * </pre>
     *
     * <code>.tensorflow.DataType type = 3;</code>
     */
    DataType getType();

    /**
     * <pre>
     * if specified, attr must have type "type"
     * </pre>
     *
     * <code>string type_attr = 4;</code>
     */
    String getTypeAttr();

    /**
     * <pre>
     * if specified, attr must have type "type"
     * </pre>
     *
     * <code>string type_attr = 4;</code>
     */
    com.google.protobuf.ByteString
    getTypeAttrBytes();

    /**
     * <pre>
     * if specified, attr must have type "int"
     * </pre>
     *
     * <code>string number_attr = 5;</code>
     */
    String getNumberAttr();

    /**
     * <pre>
     * if specified, attr must have type "int"
     * </pre>
     *
     * <code>string number_attr = 5;</code>
     */
    com.google.protobuf.ByteString
    getNumberAttrBytes();

    /**
     * <pre>
     * If specified, attr must have type "list(type)", and none of
     * type, type_attr, and number_attr may be specified.
     * </pre>
     *
     * <code>string type_list_attr = 6;</code>
     */
    String getTypeListAttr();

    /**
     * <pre>
     * If specified, attr must have type "list(type)", and none of
     * type, type_attr, and number_attr may be specified.
     * </pre>
     *
     * <code>string type_list_attr = 6;</code>
     */
    com.google.protobuf.ByteString
    getTypeListAttrBytes();

    /**
     * <pre>
     * For inputs: if true, the inputs are required to be refs.
     *   By default, inputs can be either refs or non-refs.
     * For outputs: if true, outputs are refs, otherwise they are not.
     * </pre>
     *
     * <code>bool is_ref = 16;</code>
     */
    boolean getIsRef();
  }

  /**
   * <pre>
   * For describing inputs and outputs.
   * </pre>
   *
   * Protobuf type {@code tensorflow.OpDef.ArgDef}
   */
  public  static final class ArgDef extends
      com.google.protobuf.GeneratedMessageV3 implements
      // @@protoc_insertion_point(message_implements:tensorflow.OpDef.ArgDef)
      ArgDefOrBuilder {

    private static final long serialVersionUID = 0L;

    // Use ArgDef.newBuilder() to construct.
    private ArgDef(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) {
      super(builder);
    }

    private ArgDef() {
      name_ = "";
      description_ = "";
      type_ = 0;
      typeAttr_ = "";
      numberAttr_ = "";
      typeListAttr_ = "";
    }

    @Override
    @SuppressWarnings({"unused"})
    protected Object newInstance(
        UnusedPrivateParameter unused) {
      return new ArgDef();
    }

    @Override
    public final com.google.protobuf.UnknownFieldSet
    getUnknownFields() {
      return this.unknownFields;
    }

    private ArgDef(
        com.google.protobuf.CodedInputStream input,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      this();
      if (extensionRegistry == null) {
        throw new NullPointerException();
      }
      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: {
              String s = input.readStringRequireUtf8();

              name_ = s;
              break;
            }
            case 18: {
              String s = input.readStringRequireUtf8();

              description_ = s;
              break;
            }
            case 24: {
              int rawValue = input.readEnum();

              type_ = rawValue;
              break;
            }
            case 34: {
              String s = input.readStringRequireUtf8();

              typeAttr_ = s;
              break;
            }
            case 42: {
              String s = input.readStringRequireUtf8();

              numberAttr_ = s;
              break;
            }
            case 50: {
              String s = input.readStringRequireUtf8();

              typeListAttr_ = s;
              break;
            }
            case 128: {

              isRef_ = input.readBool();
              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 {
        this.unknownFields = unknownFields.build();
        makeExtensionsImmutable();
      }
    }

    public static final com.google.protobuf.Descriptors.Descriptor
    getDescriptor() {
      return OpDefProtos.internal_static_tensorflow_OpDef_ArgDef_descriptor;
    }

    @Override
    protected FieldAccessorTable
    internalGetFieldAccessorTable() {
      return OpDefProtos.internal_static_tensorflow_OpDef_ArgDef_fieldAccessorTable
          .ensureFieldAccessorsInitialized(
              ArgDef.class, Builder.class);
    }

    public static final int NAME_FIELD_NUMBER = 1;
    private volatile Object name_;

    /**
     * <pre>
     * Name for the input/output.  Should match the regexp "[a-z][a-z0-9_]*".
     * </pre>
     *
     * <code>string name = 1;</code>
     */
    public String getName() {
      Object ref = name_;
      if (ref instanceof String) {
        return (String) ref;
      } else {
        com.google.protobuf.ByteString bs =
            (com.google.protobuf.ByteString) ref;
        String s = bs.toStringUtf8();
        name_ = s;
        return s;
      }
    }

    /**
     * <pre>
     * Name for the input/output.  Should match the regexp "[a-z][a-z0-9_]*".
     * </pre>
     *
     * <code>string name = 1;</code>
     */
    public com.google.protobuf.ByteString
    getNameBytes() {
      Object ref = name_;
      if (ref instanceof String) {
        com.google.protobuf.ByteString b =
            com.google.protobuf.ByteString.copyFromUtf8(
                (String) ref);
        name_ = b;
        return b;
      } else {
        return (com.google.protobuf.ByteString) ref;
      }
    }

    public static final int DESCRIPTION_FIELD_NUMBER = 2;
    private volatile Object description_;

    /**
     * <pre>
     * Human readable description.
     * </pre>
     *
     * <code>string description = 2;</code>
     */
    public String getDescription() {
      Object ref = description_;
      if (ref instanceof String) {
        return (String) ref;
      } else {
        com.google.protobuf.ByteString bs =
            (com.google.protobuf.ByteString) ref;
        String s = bs.toStringUtf8();
        description_ = s;
        return s;
      }
    }

    /**
     * <pre>
     * Human readable description.
     * </pre>
     *
     * <code>string description = 2;</code>
     */
    public com.google.protobuf.ByteString
    getDescriptionBytes() {
      Object ref = description_;
      if (ref instanceof String) {
        com.google.protobuf.ByteString b =
            com.google.protobuf.ByteString.copyFromUtf8(
                (String) ref);
        description_ = b;
        return b;
      } else {
        return (com.google.protobuf.ByteString) ref;
      }
    }

    public static final int TYPE_FIELD_NUMBER = 3;
    private int type_;

    /**
     * <pre>
     * Describes the type of one or more tensors that are accepted/produced
     * by this input/output arg.  The only legal combinations are:
     * * For a single tensor: either the "type" field is set or the
     *   "type_attr" field is set to the name of an attr with type "type".
     * * For a sequence of tensors with the same type: the "number_attr"
     *   field will be set to the name of an attr with type "int", and
     *   either the "type" or "type_attr" field will be set as for
     *   single tensors.
     * * For a sequence of tensors, the "type_list_attr" field will be set
     *   to the name of an attr with type "list(type)".
     * </pre>
     *
     * <code>.tensorflow.DataType type = 3;</code>
     */
    public int getTypeValue() {
      return type_;
    }

    /**
     * <pre>
     * Describes the type of one or more tensors that are accepted/produced
     * by this input/output arg.  The only legal combinations are:
     * * For a single tensor: either the "type" field is set or the
     *   "type_attr" field is set to the name of an attr with type "type".
     * * For a sequence of tensors with the same type: the "number_attr"
     *   field will be set to the name of an attr with type "int", and
     *   either the "type" or "type_attr" field will be set as for
     *   single tensors.
     * * For a sequence of tensors, the "type_list_attr" field will be set
     *   to the name of an attr with type "list(type)".
     * </pre>
     *
     * <code>.tensorflow.DataType type = 3;</code>
     */
    public DataType getType() {
      @SuppressWarnings("deprecation")
      DataType result = DataType.valueOf(type_);
      return result == null ? DataType.UNRECOGNIZED : result;
    }

    public static final int TYPE_ATTR_FIELD_NUMBER = 4;
    private volatile Object typeAttr_;

    /**
     * <pre>
     * if specified, attr must have type "type"
     * </pre>
     *
     * <code>string type_attr = 4;</code>
     */
    public String getTypeAttr() {
      Object ref = typeAttr_;
      if (ref instanceof String) {
        return (String) ref;
      } else {
        com.google.protobuf.ByteString bs =
            (com.google.protobuf.ByteString) ref;
        String s = bs.toStringUtf8();
        typeAttr_ = s;
        return s;
      }
    }

    /**
     * <pre>
     * if specified, attr must have type "type"
     * </pre>
     *
     * <code>string type_attr = 4;</code>
     */
    public com.google.protobuf.ByteString
    getTypeAttrBytes() {
      Object ref = typeAttr_;
      if (ref instanceof String) {
        com.google.protobuf.ByteString b =
            com.google.protobuf.ByteString.copyFromUtf8(
                (String) ref);
        typeAttr_ = b;
        return b;
      } else {
        return (com.google.protobuf.ByteString) ref;
      }
    }

    public static final int NUMBER_ATTR_FIELD_NUMBER = 5;
    private volatile Object numberAttr_;

    /**
     * <pre>
     * if specified, attr must have type "int"
     * </pre>
     *
     * <code>string number_attr = 5;</code>
     */
    public String getNumberAttr() {
      Object ref = numberAttr_;
      if (ref instanceof String) {
        return (String) ref;
      } else {
        com.google.protobuf.ByteString bs =
            (com.google.protobuf.ByteString) ref;
        String s = bs.toStringUtf8();
        numberAttr_ = s;
        return s;
      }
    }

    /**
     * <pre>
     * if specified, attr must have type "int"
     * </pre>
     *
     * <code>string number_attr = 5;</code>
     */
    public com.google.protobuf.ByteString
    getNumberAttrBytes() {
      Object ref = numberAttr_;
      if (ref instanceof String) {
        com.google.protobuf.ByteString b =
            com.google.protobuf.ByteString.copyFromUtf8(
                (String) ref);
        numberAttr_ = b;
        return b;
      } else {
        return (com.google.protobuf.ByteString) ref;
      }
    }

    public static final int TYPE_LIST_ATTR_FIELD_NUMBER = 6;
    private volatile Object typeListAttr_;

    /**
     * <pre>
     * If specified, attr must have type "list(type)", and none of
     * type, type_attr, and number_attr may be specified.
     * </pre>
     *
     * <code>string type_list_attr = 6;</code>
     */
    public String getTypeListAttr() {
      Object ref = typeListAttr_;
      if (ref instanceof String) {
        return (String) ref;
      } else {
        com.google.protobuf.ByteString bs =
            (com.google.protobuf.ByteString) ref;
        String s = bs.toStringUtf8();
        typeListAttr_ = s;
        return s;
      }
    }

    /**
     * <pre>
     * If specified, attr must have type "list(type)", and none of
     * type, type_attr, and number_attr may be specified.
     * </pre>
     *
     * <code>string type_list_attr = 6;</code>
     */
    public com.google.protobuf.ByteString
    getTypeListAttrBytes() {
      Object ref = typeListAttr_;
      if (ref instanceof String) {
        com.google.protobuf.ByteString b =
            com.google.protobuf.ByteString.copyFromUtf8(
                (String) ref);
        typeListAttr_ = b;
        return b;
      } else {
        return (com.google.protobuf.ByteString) ref;
      }
    }

    public static final int IS_REF_FIELD_NUMBER = 16;
    private boolean isRef_;

    /**
     * <pre>
     * For inputs: if true, the inputs are required to be refs.
     *   By default, inputs can be either refs or non-refs.
     * For outputs: if true, outputs are refs, otherwise they are not.
     * </pre>
     *
     * <code>bool is_ref = 16;</code>
     */
    public boolean getIsRef() {
      return isRef_;
    }

    private byte memoizedIsInitialized = -1;

    @Override
    public final boolean isInitialized() {
      byte isInitialized = memoizedIsInitialized;
      if (isInitialized == 1) return true;
      if (isInitialized == 0) return false;

      memoizedIsInitialized = 1;
      return true;
    }

    @Override
    public void writeTo(com.google.protobuf.CodedOutputStream output)
        throws java.io.IOException {
      if (!getNameBytes().isEmpty()) {
        com.google.protobuf.GeneratedMessageV3.writeString(output, 1, name_);
      }
      if (!getDescriptionBytes().isEmpty()) {
        com.google.protobuf.GeneratedMessageV3.writeString(output, 2, description_);
      }
      if (type_ != DataType.DT_INVALID.getNumber()) {
        output.writeEnum(3, type_);
      }
      if (!getTypeAttrBytes().isEmpty()) {
        com.google.protobuf.GeneratedMessageV3.writeString(output, 4, typeAttr_);
      }
      if (!getNumberAttrBytes().isEmpty()) {
        com.google.protobuf.GeneratedMessageV3.writeString(output, 5, numberAttr_);
      }
      if (!getTypeListAttrBytes().isEmpty()) {
        com.google.protobuf.GeneratedMessageV3.writeString(output, 6, typeListAttr_);
      }
      if (isRef_ != false) {
        output.writeBool(16, isRef_);
      }
      unknownFields.writeTo(output);
    }

    @Override
    public int getSerializedSize() {
      int size = memoizedSize;
      if (size != -1) return size;

      size = 0;
      if (!getNameBytes().isEmpty()) {
        size += com.google.protobuf.GeneratedMessageV3.computeStringSize(1, name_);
      }
      if (!getDescriptionBytes().isEmpty()) {
        size += com.google.protobuf.GeneratedMessageV3.computeStringSize(2, description_);
      }
      if (type_ != DataType.DT_INVALID.getNumber()) {
        size += com.google.protobuf.CodedOutputStream
            .computeEnumSize(3, type_);
      }
      if (!getTypeAttrBytes().isEmpty()) {
        size += com.google.protobuf.GeneratedMessageV3.computeStringSize(4, typeAttr_);
      }
      if (!getNumberAttrBytes().isEmpty()) {
        size += com.google.protobuf.GeneratedMessageV3.computeStringSize(5, numberAttr_);
      }
      if (!getTypeListAttrBytes().isEmpty()) {
        size += com.google.protobuf.GeneratedMessageV3.computeStringSize(6, typeListAttr_);
      }
      if (isRef_ != false) {
        size += com.google.protobuf.CodedOutputStream
            .computeBoolSize(16, isRef_);
      }
      size += unknownFields.getSerializedSize();
      memoizedSize = size;
      return size;
    }

    @Override
    public boolean equals(final Object obj) {
      if (obj == this) {
        return true;
      }
      if (!(obj instanceof ArgDef)) {
        return super.equals(obj);
      }
      ArgDef other = (ArgDef) obj;

      if (!getName()
          .equals(other.getName())) {
        return false;
      }
      if (!getDescription()
          .equals(other.getDescription())) return false;
      if (type_ != other.type_) return false;
      if (!getTypeAttr()
          .equals(other.getTypeAttr())) return false;
      if (!getNumberAttr()
          .equals(other.getNumberAttr())) return false;
      if (!getTypeListAttr()
          .equals(other.getTypeListAttr())) return false;
      if (getIsRef()
          != other.getIsRef()) return false;
      if (!unknownFields.equals(other.unknownFields)) return false;
      return true;
    }

    @Override
    public int hashCode() {
      if (memoizedHashCode != 0) {
        return memoizedHashCode;
      }
      int hash = 41;
      hash = (19 * hash) + getDescriptor().hashCode();
      hash = (37 * hash) + NAME_FIELD_NUMBER;
      hash = (53 * hash) + getName().hashCode();
      hash = (37 * hash) + DESCRIPTION_FIELD_NUMBER;
      hash = (53 * hash) + getDescription().hashCode();
      hash = (37 * hash) + TYPE_FIELD_NUMBER;
      hash = (53 * hash) + type_;
      hash = (37 * hash) + TYPE_ATTR_FIELD_NUMBER;
      hash = (53 * hash) + getTypeAttr().hashCode();
      hash = (37 * hash) + NUMBER_ATTR_FIELD_NUMBER;
      hash = (53 * hash) + getNumberAttr().hashCode();
      hash = (37 * hash) + TYPE_LIST_ATTR_FIELD_NUMBER;
      hash = (53 * hash) + getTypeListAttr().hashCode();
      hash = (37 * hash) + IS_REF_FIELD_NUMBER;
      hash = (53 * hash) + com.google.protobuf.Internal.hashBoolean(
          getIsRef());
      hash = (29 * hash) + unknownFields.hashCode();
      memoizedHashCode = hash;
      return hash;
    }

    public static ArgDef parseFrom(
        java.nio.ByteBuffer data)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data);
    }

    public static ArgDef parseFrom(
        java.nio.ByteBuffer data,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data, extensionRegistry);
    }

    public static ArgDef parseFrom(
        com.google.protobuf.ByteString data)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data);
    }

    public static ArgDef parseFrom(
        com.google.protobuf.ByteString data,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data, extensionRegistry);
    }

    public static ArgDef parseFrom(byte[] data)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data);
    }

    public static ArgDef parseFrom(
        byte[] data,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data, extensionRegistry);
    }

    public static ArgDef parseFrom(java.io.InputStream input)
        throws java.io.IOException {
      return com.google.protobuf.GeneratedMessageV3
          .parseWithIOException(PARSER, input);
    }

    public static ArgDef 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 ArgDef parseDelimitedFrom(java.io.InputStream input)
        throws java.io.IOException {
      return com.google.protobuf.GeneratedMessageV3
          .parseDelimitedWithIOException(PARSER, input);
    }

    public static ArgDef 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 ArgDef parseFrom(
        com.google.protobuf.CodedInputStream input)
        throws java.io.IOException {
      return com.google.protobuf.GeneratedMessageV3
          .parseWithIOException(PARSER, input);
    }

    public static ArgDef parseFrom(
        com.google.protobuf.CodedInputStream input,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws java.io.IOException {
      return com.google.protobuf.GeneratedMessageV3
          .parseWithIOException(PARSER, input, extensionRegistry);
    }

    @Override
    public Builder newBuilderForType() { return newBuilder(); }

    public static Builder newBuilder() {
      return DEFAULT_INSTANCE.toBuilder();
    }

    public static Builder newBuilder(ArgDef prototype) {
      return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype);
    }

    @Override
    public Builder toBuilder() {
      return this == DEFAULT_INSTANCE
          ? new Builder() : new Builder().mergeFrom(this);
    }

    @Override
    protected Builder newBuilderForType(
        BuilderParent parent) {
      Builder builder = new Builder(parent);
      return builder;
    }

    /**
     * <pre>
     * For describing inputs and outputs.
     * </pre>
     *
     * Protobuf type {@code tensorflow.OpDef.ArgDef}
     */
    public static final class Builder extends
        com.google.protobuf.GeneratedMessageV3.Builder<Builder> implements
        // @@protoc_insertion_point(builder_implements:tensorflow.OpDef.ArgDef)
        ArgDefOrBuilder {

      public static final com.google.protobuf.Descriptors.Descriptor
      getDescriptor() {
        return OpDefProtos.internal_static_tensorflow_OpDef_ArgDef_descriptor;
      }

      @Override
      protected FieldAccessorTable
      internalGetFieldAccessorTable() {
        return OpDefProtos.internal_static_tensorflow_OpDef_ArgDef_fieldAccessorTable
            .ensureFieldAccessorsInitialized(
                ArgDef.class, Builder.class);
      }

      // Construct using org.tensorflow.proto.framework.OpDef.ArgDef.newBuilder()
      private Builder() {
        maybeForceBuilderInitialization();
      }

      private Builder(
          BuilderParent parent) {
        super(parent);
        maybeForceBuilderInitialization();
      }

      private void maybeForceBuilderInitialization() {
        if (com.google.protobuf.GeneratedMessageV3
            .alwaysUseFieldBuilders) {
        }
      }

      @Override
      public Builder clear() {
        super.clear();
        name_ = "";

        description_ = "";

        type_ = 0;

        typeAttr_ = "";

        numberAttr_ = "";

        typeListAttr_ = "";

        isRef_ = false;

        return this;
      }

      @Override
      public com.google.protobuf.Descriptors.Descriptor
      getDescriptorForType() {
        return OpDefProtos.internal_static_tensorflow_OpDef_ArgDef_descriptor;
      }

      @Override
      public ArgDef getDefaultInstanceForType() {
        return ArgDef.getDefaultInstance();
      }

      @Override
      public ArgDef build() {
        ArgDef result = buildPartial();
        if (!result.isInitialized()) {
          throw newUninitializedMessageException(result);
        }
        return result;
      }

      @Override
      public ArgDef buildPartial() {
        ArgDef result = new ArgDef(this);
        result.name_ = name_;
        result.description_ = description_;
        result.type_ = type_;
        result.typeAttr_ = typeAttr_;
        result.numberAttr_ = numberAttr_;
        result.typeListAttr_ = typeListAttr_;
        result.isRef_ = isRef_;
        onBuilt();
        return result;
      }

      @Override
      public Builder clone() {
        return super.clone();
      }

      @Override
      public Builder setField(
          com.google.protobuf.Descriptors.FieldDescriptor field,
          Object value) {
        return super.setField(field, value);
      }

      @Override
      public Builder clearField(
          com.google.protobuf.Descriptors.FieldDescriptor field) {
        return super.clearField(field);
      }

      @Override
      public Builder clearOneof(
          com.google.protobuf.Descriptors.OneofDescriptor oneof) {
        return super.clearOneof(oneof);
      }

      @Override
      public Builder setRepeatedField(
          com.google.protobuf.Descriptors.FieldDescriptor field,
          int index, Object value) {
        return super.setRepeatedField(field, index, value);
      }

      @Override
      public Builder addRepeatedField(
          com.google.protobuf.Descriptors.FieldDescriptor field,
          Object value) {
        return super.addRepeatedField(field, value);
      }

      @Override
      public Builder mergeFrom(com.google.protobuf.Message other) {
        if (other instanceof ArgDef) {
          return mergeFrom((ArgDef) other);
        } else {
          super.mergeFrom(other);
          return this;
        }
      }

      public Builder mergeFrom(ArgDef other) {
        if (other == ArgDef.getDefaultInstance()) {
          return this;
        }
        if (!other.getName().isEmpty()) {
          name_ = other.name_;
          onChanged();
        }
        if (!other.getDescription().isEmpty()) {
          description_ = other.description_;
          onChanged();
        }
        if (other.type_ != 0) {
          setTypeValue(other.getTypeValue());
        }
        if (!other.getTypeAttr().isEmpty()) {
          typeAttr_ = other.typeAttr_;
          onChanged();
        }
        if (!other.getNumberAttr().isEmpty()) {
          numberAttr_ = other.numberAttr_;
          onChanged();
        }
        if (!other.getTypeListAttr().isEmpty()) {
          typeListAttr_ = other.typeListAttr_;
          onChanged();
        }
        if (other.getIsRef() != false) {
          setIsRef(other.getIsRef());
        }
        this.mergeUnknownFields(other.unknownFields);
        onChanged();
        return this;
      }

      @Override
      public final boolean isInitialized() {
        return true;
      }

      @Override
      public Builder mergeFrom(
          com.google.protobuf.CodedInputStream input,
          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
          throws java.io.IOException {
        ArgDef parsedMessage = null;
        try {
          parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
        } catch (com.google.protobuf.InvalidProtocolBufferException e) {
          parsedMessage = (ArgDef) e.getUnfinishedMessage();
          throw e.unwrapIOException();
        } finally {
          if (parsedMessage != null) {
            mergeFrom(parsedMessage);
          }
        }
        return this;
      }

      private Object name_ = "";

      /**
       * <pre>
       * Name for the input/output.  Should match the regexp "[a-z][a-z0-9_]*".
       * </pre>
       *
       * <code>string name = 1;</code>
       */
      public String getName() {
        Object ref = name_;
        if (!(ref instanceof String)) {
          com.google.protobuf.ByteString bs =
              (com.google.protobuf.ByteString) ref;
          String s = bs.toStringUtf8();
          name_ = s;
          return s;
        } else {
          return (String) ref;
        }
      }

      /**
       * <pre>
       * Name for the input/output.  Should match the regexp "[a-z][a-z0-9_]*".
       * </pre>
       *
       * <code>string name = 1;</code>
       */
      public com.google.protobuf.ByteString
      getNameBytes() {
        Object ref = name_;
        if (ref instanceof String) {
          com.google.protobuf.ByteString b =
              com.google.protobuf.ByteString.copyFromUtf8(
                  (String) ref);
          name_ = b;
          return b;
        } else {
          return (com.google.protobuf.ByteString) ref;
        }
      }

      /**
       * <pre>
       * Name for the input/output.  Should match the regexp "[a-z][a-z0-9_]*".
       * </pre>
       *
       * <code>string name = 1;</code>
       */
      public Builder setName(
          String value) {
        if (value == null) {
          throw new NullPointerException();
        }

        name_ = value;
        onChanged();
        return this;
      }

      /**
       * <pre>
       * Name for the input/output.  Should match the regexp "[a-z][a-z0-9_]*".
       * </pre>
       *
       * <code>string name = 1;</code>
       */
      public Builder clearName() {

        name_ = getDefaultInstance().getName();
        onChanged();
        return this;
      }

      /**
       * <pre>
       * Name for the input/output.  Should match the regexp "[a-z][a-z0-9_]*".
       * </pre>
       *
       * <code>string name = 1;</code>
       */
      public Builder setNameBytes(
          com.google.protobuf.ByteString value) {
        if (value == null) {
          throw new NullPointerException();
        }
        checkByteStringIsUtf8(value);

        name_ = value;
        onChanged();
        return this;
      }

      private Object description_ = "";

      /**
       * <pre>
       * Human readable description.
       * </pre>
       *
       * <code>string description = 2;</code>
       */
      public String getDescription() {
        Object ref = description_;
        if (!(ref instanceof String)) {
          com.google.protobuf.ByteString bs =
              (com.google.protobuf.ByteString) ref;
          String s = bs.toStringUtf8();
          description_ = s;
          return s;
        } else {
          return (String) ref;
        }
      }

      /**
       * <pre>
       * Human readable description.
       * </pre>
       *
       * <code>string description = 2;</code>
       */
      public com.google.protobuf.ByteString
      getDescriptionBytes() {
        Object ref = description_;
        if (ref instanceof String) {
          com.google.protobuf.ByteString b =
              com.google.protobuf.ByteString.copyFromUtf8(
                  (String) ref);
          description_ = b;
          return b;
        } else {
          return (com.google.protobuf.ByteString) ref;
        }
      }

      /**
       * <pre>
       * Human readable description.
       * </pre>
       *
       * <code>string description = 2;</code>
       */
      public Builder setDescription(
          String value) {
        if (value == null) {
          throw new NullPointerException();
        }

        description_ = value;
        onChanged();
        return this;
      }

      /**
       * <pre>
       * Human readable description.
       * </pre>
       *
       * <code>string description = 2;</code>
       */
      public Builder clearDescription() {

        description_ = getDefaultInstance().getDescription();
        onChanged();
        return this;
      }

      /**
       * <pre>
       * Human readable description.
       * </pre>
       *
       * <code>string description = 2;</code>
       */
      public Builder setDescriptionBytes(
          com.google.protobuf.ByteString value) {
        if (value == null) {
          throw new NullPointerException();
        }
        checkByteStringIsUtf8(value);

        description_ = value;
        onChanged();
        return this;
      }

      private int type_ = 0;

      /**
       * <pre>
       * Describes the type of one or more tensors that are accepted/produced
       * by this input/output arg.  The only legal combinations are:
       * * For a single tensor: either the "type" field is set or the
       *   "type_attr" field is set to the name of an attr with type "type".
       * * For a sequence of tensors with the same type: the "number_attr"
       *   field will be set to the name of an attr with type "int", and
       *   either the "type" or "type_attr" field will be set as for
       *   single tensors.
       * * For a sequence of tensors, the "type_list_attr" field will be set
       *   to the name of an attr with type "list(type)".
       * </pre>
       *
       * <code>.tensorflow.DataType type = 3;</code>
       */
      public int getTypeValue() {
        return type_;
      }

      /**
       * <pre>
       * Describes the type of one or more tensors that are accepted/produced
       * by this input/output arg.  The only legal combinations are:
       * * For a single tensor: either the "type" field is set or the
       *   "type_attr" field is set to the name of an attr with type "type".
       * * For a sequence of tensors with the same type: the "number_attr"
       *   field will be set to the name of an attr with type "int", and
       *   either the "type" or "type_attr" field will be set as for
       *   single tensors.
       * * For a sequence of tensors, the "type_list_attr" field will be set
       *   to the name of an attr with type "list(type)".
       * </pre>
       *
       * <code>.tensorflow.DataType type = 3;</code>
       */
      public Builder setTypeValue(int value) {
        type_ = value;
        onChanged();
        return this;
      }

      /**
       * <pre>
       * Describes the type of one or more tensors that are accepted/produced
       * by this input/output arg.  The only legal combinations are:
       * * For a single tensor: either the "type" field is set or the
       *   "type_attr" field is set to the name of an attr with type "type".
       * * For a sequence of tensors with the same type: the "number_attr"
       *   field will be set to the name of an attr with type "int", and
       *   either the "type" or "type_attr" field will be set as for
       *   single tensors.
       * * For a sequence of tensors, the "type_list_attr" field will be set
       *   to the name of an attr with type "list(type)".
       * </pre>
       *
       * <code>.tensorflow.DataType type = 3;</code>
       */
      public DataType getType() {
        @SuppressWarnings("deprecation")
        DataType result = DataType.valueOf(type_);
        return result == null ? DataType.UNRECOGNIZED : result;
      }

      /**
       * <pre>
       * Describes the type of one or more tensors that are accepted/produced
       * by this input/output arg.  The only legal combinations are:
       * * For a single tensor: either the "type" field is set or the
       *   "type_attr" field is set to the name of an attr with type "type".
       * * For a sequence of tensors with the same type: the "number_attr"
       *   field will be set to the name of an attr with type "int", and
       *   either the "type" or "type_attr" field will be set as for
       *   single tensors.
       * * For a sequence of tensors, the "type_list_attr" field will be set
       *   to the name of an attr with type "list(type)".
       * </pre>
       *
       * <code>.tensorflow.DataType type = 3;</code>
       */
      public Builder setType(DataType value) {
        if (value == null) {
          throw new NullPointerException();
        }

        type_ = value.getNumber();
        onChanged();
        return this;
      }

      /**
       * <pre>
       * Describes the type of one or more tensors that are accepted/produced
       * by this input/output arg.  The only legal combinations are:
       * * For a single tensor: either the "type" field is set or the
       *   "type_attr" field is set to the name of an attr with type "type".
       * * For a sequence of tensors with the same type: the "number_attr"
       *   field will be set to the name of an attr with type "int", and
       *   either the "type" or "type_attr" field will be set as for
       *   single tensors.
       * * For a sequence of tensors, the "type_list_attr" field will be set
       *   to the name of an attr with type "list(type)".
       * </pre>
       *
       * <code>.tensorflow.DataType type = 3;</code>
       */
      public Builder clearType() {

        type_ = 0;
        onChanged();
        return this;
      }

      private Object typeAttr_ = "";

      /**
       * <pre>
       * if specified, attr must have type "type"
       * </pre>
       *
       * <code>string type_attr = 4;</code>
       */
      public String getTypeAttr() {
        Object ref = typeAttr_;
        if (!(ref instanceof String)) {
          com.google.protobuf.ByteString bs =
              (com.google.protobuf.ByteString) ref;
          String s = bs.toStringUtf8();
          typeAttr_ = s;
          return s;
        } else {
          return (String) ref;
        }
      }

      /**
       * <pre>
       * if specified, attr must have type "type"
       * </pre>
       *
       * <code>string type_attr = 4;</code>
       */
      public com.google.protobuf.ByteString
      getTypeAttrBytes() {
        Object ref = typeAttr_;
        if (ref instanceof String) {
          com.google.protobuf.ByteString b =
              com.google.protobuf.ByteString.copyFromUtf8(
                  (String) ref);
          typeAttr_ = b;
          return b;
        } else {
          return (com.google.protobuf.ByteString) ref;
        }
      }

      /**
       * <pre>
       * if specified, attr must have type "type"
       * </pre>
       *
       * <code>string type_attr = 4;</code>
       */
      public Builder setTypeAttr(
          String value) {
        if (value == null) {
          throw new NullPointerException();
        }

        typeAttr_ = value;
        onChanged();
        return this;
      }

      /**
       * <pre>
       * if specified, attr must have type "type"
       * </pre>
       *
       * <code>string type_attr = 4;</code>
       */
      public Builder clearTypeAttr() {

        typeAttr_ = getDefaultInstance().getTypeAttr();
        onChanged();
        return this;
      }

      /**
       * <pre>
       * if specified, attr must have type "type"
       * </pre>
       *
       * <code>string type_attr = 4;</code>
       */
      public Builder setTypeAttrBytes(
          com.google.protobuf.ByteString value) {
        if (value == null) {
          throw new NullPointerException();
        }
        checkByteStringIsUtf8(value);

        typeAttr_ = value;
        onChanged();
        return this;
      }

      private Object numberAttr_ = "";

      /**
       * <pre>
       * if specified, attr must have type "int"
       * </pre>
       *
       * <code>string number_attr = 5;</code>
       */
      public String getNumberAttr() {
        Object ref = numberAttr_;
        if (!(ref instanceof String)) {
          com.google.protobuf.ByteString bs =
              (com.google.protobuf.ByteString) ref;
          String s = bs.toStringUtf8();
          numberAttr_ = s;
          return s;
        } else {
          return (String) ref;
        }
      }

      /**
       * <pre>
       * if specified, attr must have type "int"
       * </pre>
       *
       * <code>string number_attr = 5;</code>
       */
      public com.google.protobuf.ByteString
      getNumberAttrBytes() {
        Object ref = numberAttr_;
        if (ref instanceof String) {
          com.google.protobuf.ByteString b =
              com.google.protobuf.ByteString.copyFromUtf8(
                  (String) ref);
          numberAttr_ = b;
          return b;
        } else {
          return (com.google.protobuf.ByteString) ref;
        }
      }

      /**
       * <pre>
       * if specified, attr must have type "int"
       * </pre>
       *
       * <code>string number_attr = 5;</code>
       */
      public Builder setNumberAttr(
          String value) {
        if (value == null) {
          throw new NullPointerException();
        }

        numberAttr_ = value;
        onChanged();
        return this;
      }

      /**
       * <pre>
       * if specified, attr must have type "int"
       * </pre>
       *
       * <code>string number_attr = 5;</code>
       */
      public Builder clearNumberAttr() {

        numberAttr_ = getDefaultInstance().getNumberAttr();
        onChanged();
        return this;
      }

      /**
       * <pre>
       * if specified, attr must have type "int"
       * </pre>
       *
       * <code>string number_attr = 5;</code>
       */
      public Builder setNumberAttrBytes(
          com.google.protobuf.ByteString value) {
        if (value == null) {
          throw new NullPointerException();
        }
        checkByteStringIsUtf8(value);

        numberAttr_ = value;
        onChanged();
        return this;
      }

      private Object typeListAttr_ = "";

      /**
       * <pre>
       * If specified, attr must have type "list(type)", and none of
       * type, type_attr, and number_attr may be specified.
       * </pre>
       *
       * <code>string type_list_attr = 6;</code>
       */
      public String getTypeListAttr() {
        Object ref = typeListAttr_;
        if (!(ref instanceof String)) {
          com.google.protobuf.ByteString bs =
              (com.google.protobuf.ByteString) ref;
          String s = bs.toStringUtf8();
          typeListAttr_ = s;
          return s;
        } else {
          return (String) ref;
        }
      }

      /**
       * <pre>
       * If specified, attr must have type "list(type)", and none of
       * type, type_attr, and number_attr may be specified.
       * </pre>
       *
       * <code>string type_list_attr = 6;</code>
       */
      public com.google.protobuf.ByteString
      getTypeListAttrBytes() {
        Object ref = typeListAttr_;
        if (ref instanceof String) {
          com.google.protobuf.ByteString b =
              com.google.protobuf.ByteString.copyFromUtf8(
                  (String) ref);
          typeListAttr_ = b;
          return b;
        } else {
          return (com.google.protobuf.ByteString) ref;
        }
      }

      /**
       * <pre>
       * If specified, attr must have type "list(type)", and none of
       * type, type_attr, and number_attr may be specified.
       * </pre>
       *
       * <code>string type_list_attr = 6;</code>
       */
      public Builder setTypeListAttr(
          String value) {
        if (value == null) {
          throw new NullPointerException();
        }

        typeListAttr_ = value;
        onChanged();
        return this;
      }

      /**
       * <pre>
       * If specified, attr must have type "list(type)", and none of
       * type, type_attr, and number_attr may be specified.
       * </pre>
       *
       * <code>string type_list_attr = 6;</code>
       */
      public Builder clearTypeListAttr() {

        typeListAttr_ = getDefaultInstance().getTypeListAttr();
        onChanged();
        return this;
      }

      /**
       * <pre>
       * If specified, attr must have type "list(type)", and none of
       * type, type_attr, and number_attr may be specified.
       * </pre>
       *
       * <code>string type_list_attr = 6;</code>
       */
      public Builder setTypeListAttrBytes(
          com.google.protobuf.ByteString value) {
        if (value == null) {
          throw new NullPointerException();
        }
        checkByteStringIsUtf8(value);

        typeListAttr_ = value;
        onChanged();
        return this;
      }

      private boolean isRef_ ;

      /**
       * <pre>
       * For inputs: if true, the inputs are required to be refs.
       *   By default, inputs can be either refs or non-refs.
       * For outputs: if true, outputs are refs, otherwise they are not.
       * </pre>
       *
       * <code>bool is_ref = 16;</code>
       */
      public boolean getIsRef() {
        return isRef_;
      }

      /**
       * <pre>
       * For inputs: if true, the inputs are required to be refs.
       *   By default, inputs can be either refs or non-refs.
       * For outputs: if true, outputs are refs, otherwise they are not.
       * </pre>
       *
       * <code>bool is_ref = 16;</code>
       */
      public Builder setIsRef(boolean value) {

        isRef_ = value;
        onChanged();
        return this;
      }

      /**
       * <pre>
       * For inputs: if true, the inputs are required to be refs.
       *   By default, inputs can be either refs or non-refs.
       * For outputs: if true, outputs are refs, otherwise they are not.
       * </pre>
       *
       * <code>bool is_ref = 16;</code>
       */
      public Builder clearIsRef() {

        isRef_ = false;
        onChanged();
        return this;
      }

      @Override
      public final Builder setUnknownFields(
          final com.google.protobuf.UnknownFieldSet unknownFields) {
        return super.setUnknownFields(unknownFields);
      }

      @Override
      public final Builder mergeUnknownFields(
          final com.google.protobuf.UnknownFieldSet unknownFields) {
        return super.mergeUnknownFields(unknownFields);
      }

      // @@protoc_insertion_point(builder_scope:tensorflow.OpDef.ArgDef)
    }

    // @@protoc_insertion_point(class_scope:tensorflow.OpDef.ArgDef)
    private static final ArgDef DEFAULT_INSTANCE;

    static {
      DEFAULT_INSTANCE = new ArgDef();
    }

    public static ArgDef getDefaultInstance() {
      return DEFAULT_INSTANCE;
    }

    private static final com.google.protobuf.Parser<ArgDef>
        PARSER = new com.google.protobuf.AbstractParser<ArgDef>() {
      @Override
      public ArgDef parsePartialFrom(
          com.google.protobuf.CodedInputStream input,
          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
          throws com.google.protobuf.InvalidProtocolBufferException {
        return new ArgDef(input, extensionRegistry);
      }
    };

    public static com.google.protobuf.Parser<ArgDef> parser() {
      return PARSER;
    }

    @Override
    public com.google.protobuf.Parser<ArgDef> getParserForType() {
      return PARSER;
    }

    @Override
    public ArgDef getDefaultInstanceForType() {
      return DEFAULT_INSTANCE;
    }

  }

  public interface AttrDefOrBuilder extends
      // @@protoc_insertion_point(interface_extends:tensorflow.OpDef.AttrDef)
      com.google.protobuf.MessageOrBuilder {

    /**
     * <pre>
     * A descriptive name for the argument.  May be used, e.g. by the
     * Python client, as a keyword argument name, and so should match
     * the regexp "[a-z][a-z0-9_]+".
     * </pre>
     *
     * <code>string name = 1;</code>
     */
    String getName();

    /**
     * <pre>
     * A descriptive name for the argument.  May be used, e.g. by the
     * Python client, as a keyword argument name, and so should match
     * the regexp "[a-z][a-z0-9_]+".
     * </pre>
     *
     * <code>string name = 1;</code>
     */
    com.google.protobuf.ByteString
    getNameBytes();

    /**
     * <pre>
     * One of the type names from attr_value.proto ("string", "list(string)",
     * "int", etc.).
     * </pre>
     *
     * <code>string type = 2;</code>
     */
    String getType();

    /**
     * <pre>
     * One of the type names from attr_value.proto ("string", "list(string)",
     * "int", etc.).
     * </pre>
     *
     * <code>string type = 2;</code>
     */
    com.google.protobuf.ByteString
    getTypeBytes();

    /**
     * <pre>
     * A reasonable default for this attribute if the user does not supply
     * a value.  If not specified, the user must supply a value.
     * </pre>
     *
     * <code>.tensorflow.AttrValue default_value = 3;</code>
     */
    boolean hasDefaultValue();

    /**
     * <pre>
     * A reasonable default for this attribute if the user does not supply
     * a value.  If not specified, the user must supply a value.
     * </pre>
     *
     * <code>.tensorflow.AttrValue default_value = 3;</code>
     */
    AttrValue getDefaultValue();

    /**
     * <pre>
     * A reasonable default for this attribute if the user does not supply
     * a value.  If not specified, the user must supply a value.
     * </pre>
     *
     * <code>.tensorflow.AttrValue default_value = 3;</code>
     */
    AttrValueOrBuilder getDefaultValueOrBuilder();

    /**
     * <pre>
     * Human-readable description.
     * </pre>
     *
     * <code>string description = 4;</code>
     */
    String getDescription();

    /**
     * <pre>
     * Human-readable description.
     * </pre>
     *
     * <code>string description = 4;</code>
     */
    com.google.protobuf.ByteString
    getDescriptionBytes();

    /**
     * <pre>
     * For type == "int", this is a minimum value.  For "list(___)"
     * types, this is the minimum length.
     * </pre>
     *
     * <code>bool has_minimum = 5;</code>
     */
    boolean getHasMinimum();

    /**
     * <code>int64 minimum = 6;</code>
     */
    long getMinimum();

    /**
     * <pre>
     * The set of allowed values.  Has type that is the "list" version
     * of the "type" field above (uses the "list" field of AttrValue).
     * If type == "type" or "list(type)" above, then the "type" field
     * of "allowed_values.list" has the set of allowed DataTypes.
     * If type == "string" or "list(string)", then the "s" field of
     * "allowed_values.list" has the set of allowed strings.
     * </pre>
     *
     * <code>.tensorflow.AttrValue allowed_values = 7;</code>
     */
    boolean hasAllowedValues();

    /**
     * <pre>
     * The set of allowed values.  Has type that is the "list" version
     * of the "type" field above (uses the "list" field of AttrValue).
     * If type == "type" or "list(type)" above, then the "type" field
     * of "allowed_values.list" has the set of allowed DataTypes.
     * If type == "string" or "list(string)", then the "s" field of
     * "allowed_values.list" has the set of allowed strings.
     * </pre>
     *
     * <code>.tensorflow.AttrValue allowed_values = 7;</code>
     */
    AttrValue getAllowedValues();

    /**
     * <pre>
     * The set of allowed values.  Has type that is the "list" version
     * of the "type" field above (uses the "list" field of AttrValue).
     * If type == "type" or "list(type)" above, then the "type" field
     * of "allowed_values.list" has the set of allowed DataTypes.
     * If type == "string" or "list(string)", then the "s" field of
     * "allowed_values.list" has the set of allowed strings.
     * </pre>
     *
     * <code>.tensorflow.AttrValue allowed_values = 7;</code>
     */
    AttrValueOrBuilder getAllowedValuesOrBuilder();
  }

  /**
   * <pre>
   * Description of the graph-construction-time configuration of this
   * Op.  That is to say, this describes the attr fields that will
   * be specified in the NodeDef.
   * </pre>
   *
   * Protobuf type {@code tensorflow.OpDef.AttrDef}
   */
  public  static final class AttrDef extends
      com.google.protobuf.GeneratedMessageV3 implements
      // @@protoc_insertion_point(message_implements:tensorflow.OpDef.AttrDef)
      AttrDefOrBuilder {

    private static final long serialVersionUID = 0L;

    // Use AttrDef.newBuilder() to construct.
    private AttrDef(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) {
      super(builder);
    }

    private AttrDef() {
      name_ = "";
      type_ = "";
      description_ = "";
    }

    @Override
    @SuppressWarnings({"unused"})
    protected Object newInstance(
        UnusedPrivateParameter unused) {
      return new AttrDef();
    }

    @Override
    public final com.google.protobuf.UnknownFieldSet
    getUnknownFields() {
      return this.unknownFields;
    }

    private AttrDef(
        com.google.protobuf.CodedInputStream input,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      this();
      if (extensionRegistry == null) {
        throw new NullPointerException();
      }
      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: {
              String s = input.readStringRequireUtf8();

              name_ = s;
              break;
            }
            case 18: {
              String s = input.readStringRequireUtf8();

              type_ = s;
              break;
            }
            case 26: {
              AttrValue.Builder subBuilder = null;
              if (defaultValue_ != null) {
                subBuilder = defaultValue_.toBuilder();
              }
              defaultValue_ = input.readMessage(AttrValue.parser(), extensionRegistry);
              if (subBuilder != null) {
                subBuilder.mergeFrom(defaultValue_);
                defaultValue_ = subBuilder.buildPartial();
              }

              break;
            }
            case 34: {
              String s = input.readStringRequireUtf8();

              description_ = s;
              break;
            }
            case 40: {

              hasMinimum_ = input.readBool();
              break;
            }
            case 48: {

              minimum_ = input.readInt64();
              break;
            }
            case 58: {
              AttrValue.Builder subBuilder = null;
              if (allowedValues_ != null) {
                subBuilder = allowedValues_.toBuilder();
              }
              allowedValues_ = input.readMessage(AttrValue.parser(), extensionRegistry);
              if (subBuilder != null) {
                subBuilder.mergeFrom(allowedValues_);
                allowedValues_ = subBuilder.buildPartial();
              }

              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 {
        this.unknownFields = unknownFields.build();
        makeExtensionsImmutable();
      }
    }

    public static final com.google.protobuf.Descriptors.Descriptor
    getDescriptor() {
      return OpDefProtos.internal_static_tensorflow_OpDef_AttrDef_descriptor;
    }

    @Override
    protected FieldAccessorTable
    internalGetFieldAccessorTable() {
      return OpDefProtos.internal_static_tensorflow_OpDef_AttrDef_fieldAccessorTable
          .ensureFieldAccessorsInitialized(
              AttrDef.class, Builder.class);
    }

    public static final int NAME_FIELD_NUMBER = 1;
    private volatile Object name_;

    /**
     * <pre>
     * A descriptive name for the argument.  May be used, e.g. by the
     * Python client, as a keyword argument name, and so should match
     * the regexp "[a-z][a-z0-9_]+".
     * </pre>
     *
     * <code>string name = 1;</code>
     */
    public String getName() {
      Object ref = name_;
      if (ref instanceof String) {
        return (String) ref;
      } else {
        com.google.protobuf.ByteString bs =
            (com.google.protobuf.ByteString) ref;
        String s = bs.toStringUtf8();
        name_ = s;
        return s;
      }
    }

    /**
     * <pre>
     * A descriptive name for the argument.  May be used, e.g. by the
     * Python client, as a keyword argument name, and so should match
     * the regexp "[a-z][a-z0-9_]+".
     * </pre>
     *
     * <code>string name = 1;</code>
     */
    public com.google.protobuf.ByteString
    getNameBytes() {
      Object ref = name_;
      if (ref instanceof String) {
        com.google.protobuf.ByteString b =
            com.google.protobuf.ByteString.copyFromUtf8(
                (String) ref);
        name_ = b;
        return b;
      } else {
        return (com.google.protobuf.ByteString) ref;
      }
    }

    public static final int TYPE_FIELD_NUMBER = 2;
    private volatile Object type_;

    /**
     * <pre>
     * One of the type names from attr_value.proto ("string", "list(string)",
     * "int", etc.).
     * </pre>
     *
     * <code>string type = 2;</code>
     */
    public String getType() {
      Object ref = type_;
      if (ref instanceof String) {
        return (String) ref;
      } else {
        com.google.protobuf.ByteString bs =
            (com.google.protobuf.ByteString) ref;
        String s = bs.toStringUtf8();
        type_ = s;
        return s;
      }
    }

    /**
     * <pre>
     * One of the type names from attr_value.proto ("string", "list(string)",
     * "int", etc.).
     * </pre>
     *
     * <code>string type = 2;</code>
     */
    public com.google.protobuf.ByteString
    getTypeBytes() {
      Object ref = type_;
      if (ref instanceof String) {
        com.google.protobuf.ByteString b =
            com.google.protobuf.ByteString.copyFromUtf8(
                (String) ref);
        type_ = b;
        return b;
      } else {
        return (com.google.protobuf.ByteString) ref;
      }
    }

    public static final int DEFAULT_VALUE_FIELD_NUMBER = 3;
    private AttrValue defaultValue_;

    /**
     * <pre>
     * A reasonable default for this attribute if the user does not supply
     * a value.  If not specified, the user must supply a value.
     * </pre>
     *
     * <code>.tensorflow.AttrValue default_value = 3;</code>
     */
    public boolean hasDefaultValue() {
      return defaultValue_ != null;
    }

    /**
     * <pre>
     * A reasonable default for this attribute if the user does not supply
     * a value.  If not specified, the user must supply a value.
     * </pre>
     *
     * <code>.tensorflow.AttrValue default_value = 3;</code>
     */
    public AttrValue getDefaultValue() {
      return defaultValue_ == null ? AttrValue.getDefaultInstance() : defaultValue_;
    }

    /**
     * <pre>
     * A reasonable default for this attribute if the user does not supply
     * a value.  If not specified, the user must supply a value.
     * </pre>
     *
     * <code>.tensorflow.AttrValue default_value = 3;</code>
     */
    public AttrValueOrBuilder getDefaultValueOrBuilder() {
      return getDefaultValue();
    }

    public static final int DESCRIPTION_FIELD_NUMBER = 4;
    private volatile Object description_;

    /**
     * <pre>
     * Human-readable description.
     * </pre>
     *
     * <code>string description = 4;</code>
     */
    public String getDescription() {
      Object ref = description_;
      if (ref instanceof String) {
        return (String) ref;
      } else {
        com.google.protobuf.ByteString bs =
            (com.google.protobuf.ByteString) ref;
        String s = bs.toStringUtf8();
        description_ = s;
        return s;
      }
    }

    /**
     * <pre>
     * Human-readable description.
     * </pre>
     *
     * <code>string description = 4;</code>
     */
    public com.google.protobuf.ByteString
    getDescriptionBytes() {
      Object ref = description_;
      if (ref instanceof String) {
        com.google.protobuf.ByteString b =
            com.google.protobuf.ByteString.copyFromUtf8(
                (String) ref);
        description_ = b;
        return b;
      } else {
        return (com.google.protobuf.ByteString) ref;
      }
    }

    public static final int HAS_MINIMUM_FIELD_NUMBER = 5;
    private boolean hasMinimum_;

    /**
     * <pre>
     * For type == "int", this is a minimum value.  For "list(___)"
     * types, this is the minimum length.
     * </pre>
     *
     * <code>bool has_minimum = 5;</code>
     */
    public boolean getHasMinimum() {
      return hasMinimum_;
    }

    public static final int MINIMUM_FIELD_NUMBER = 6;
    private long minimum_;

    /**
     * <code>int64 minimum = 6;</code>
     */
    public long getMinimum() {
      return minimum_;
    }

    public static final int ALLOWED_VALUES_FIELD_NUMBER = 7;
    private AttrValue allowedValues_;

    /**
     * <pre>
     * The set of allowed values.  Has type that is the "list" version
     * of the "type" field above (uses the "list" field of AttrValue).
     * If type == "type" or "list(type)" above, then the "type" field
     * of "allowed_values.list" has the set of allowed DataTypes.
     * If type == "string" or "list(string)", then the "s" field of
     * "allowed_values.list" has the set of allowed strings.
     * </pre>
     *
     * <code>.tensorflow.AttrValue allowed_values = 7;</code>
     */
    public boolean hasAllowedValues() {
      return allowedValues_ != null;
    }

    /**
     * <pre>
     * The set of allowed values.  Has type that is the "list" version
     * of the "type" field above (uses the "list" field of AttrValue).
     * If type == "type" or "list(type)" above, then the "type" field
     * of "allowed_values.list" has the set of allowed DataTypes.
     * If type == "string" or "list(string)", then the "s" field of
     * "allowed_values.list" has the set of allowed strings.
     * </pre>
     *
     * <code>.tensorflow.AttrValue allowed_values = 7;</code>
     */
    public AttrValue getAllowedValues() {
      return allowedValues_ == null ? AttrValue.getDefaultInstance() : allowedValues_;
    }

    /**
     * <pre>
     * The set of allowed values.  Has type that is the "list" version
     * of the "type" field above (uses the "list" field of AttrValue).
     * If type == "type" or "list(type)" above, then the "type" field
     * of "allowed_values.list" has the set of allowed DataTypes.
     * If type == "string" or "list(string)", then the "s" field of
     * "allowed_values.list" has the set of allowed strings.
     * </pre>
     *
     * <code>.tensorflow.AttrValue allowed_values = 7;</code>
     */
    public AttrValueOrBuilder getAllowedValuesOrBuilder() {
      return getAllowedValues();
    }

    private byte memoizedIsInitialized = -1;

    @Override
    public final boolean isInitialized() {
      byte isInitialized = memoizedIsInitialized;
      if (isInitialized == 1) return true;
      if (isInitialized == 0) return false;

      memoizedIsInitialized = 1;
      return true;
    }

    @Override
    public void writeTo(com.google.protobuf.CodedOutputStream output)
        throws java.io.IOException {
      if (!getNameBytes().isEmpty()) {
        com.google.protobuf.GeneratedMessageV3.writeString(output, 1, name_);
      }
      if (!getTypeBytes().isEmpty()) {
        com.google.protobuf.GeneratedMessageV3.writeString(output, 2, type_);
      }
      if (defaultValue_ != null) {
        output.writeMessage(3, getDefaultValue());
      }
      if (!getDescriptionBytes().isEmpty()) {
        com.google.protobuf.GeneratedMessageV3.writeString(output, 4, description_);
      }
      if (hasMinimum_ != false) {
        output.writeBool(5, hasMinimum_);
      }
      if (minimum_ != 0L) {
        output.writeInt64(6, minimum_);
      }
      if (allowedValues_ != null) {
        output.writeMessage(7, getAllowedValues());
      }
      unknownFields.writeTo(output);
    }

    @Override
    public int getSerializedSize() {
      int size = memoizedSize;
      if (size != -1) return size;

      size = 0;
      if (!getNameBytes().isEmpty()) {
        size += com.google.protobuf.GeneratedMessageV3.computeStringSize(1, name_);
      }
      if (!getTypeBytes().isEmpty()) {
        size += com.google.protobuf.GeneratedMessageV3.computeStringSize(2, type_);
      }
      if (defaultValue_ != null) {
        size += com.google.protobuf.CodedOutputStream
            .computeMessageSize(3, getDefaultValue());
      }
      if (!getDescriptionBytes().isEmpty()) {
        size += com.google.protobuf.GeneratedMessageV3.computeStringSize(4, description_);
      }
      if (hasMinimum_ != false) {
        size += com.google.protobuf.CodedOutputStream
            .computeBoolSize(5, hasMinimum_);
      }
      if (minimum_ != 0L) {
        size += com.google.protobuf.CodedOutputStream
            .computeInt64Size(6, minimum_);
      }
      if (allowedValues_ != null) {
        size += com.google.protobuf.CodedOutputStream
            .computeMessageSize(7, getAllowedValues());
      }
      size += unknownFields.getSerializedSize();
      memoizedSize = size;
      return size;
    }

    @Override
    public boolean equals(final Object obj) {
      if (obj == this) {
        return true;
      }
      if (!(obj instanceof AttrDef)) {
        return super.equals(obj);
      }
      AttrDef other = (AttrDef) obj;

      if (!getName()
          .equals(other.getName())) {
        return false;
      }
      if (!getType()
          .equals(other.getType())) return false;
      if (hasDefaultValue() != other.hasDefaultValue()) return false;
      if (hasDefaultValue()) {
        if (!getDefaultValue()
            .equals(other.getDefaultValue())) return false;
      }
      if (!getDescription()
          .equals(other.getDescription())) return false;
      if (getHasMinimum()
          != other.getHasMinimum()) return false;
      if (getMinimum()
          != other.getMinimum()) return false;
      if (hasAllowedValues() != other.hasAllowedValues()) return false;
      if (hasAllowedValues()) {
        if (!getAllowedValues()
            .equals(other.getAllowedValues())) return false;
      }
      if (!unknownFields.equals(other.unknownFields)) return false;
      return true;
    }

    @Override
    public int hashCode() {
      if (memoizedHashCode != 0) {
        return memoizedHashCode;
      }
      int hash = 41;
      hash = (19 * hash) + getDescriptor().hashCode();
      hash = (37 * hash) + NAME_FIELD_NUMBER;
      hash = (53 * hash) + getName().hashCode();
      hash = (37 * hash) + TYPE_FIELD_NUMBER;
      hash = (53 * hash) + getType().hashCode();
      if (hasDefaultValue()) {
        hash = (37 * hash) + DEFAULT_VALUE_FIELD_NUMBER;
        hash = (53 * hash) + getDefaultValue().hashCode();
      }
      hash = (37 * hash) + DESCRIPTION_FIELD_NUMBER;
      hash = (53 * hash) + getDescription().hashCode();
      hash = (37 * hash) + HAS_MINIMUM_FIELD_NUMBER;
      hash = (53 * hash) + com.google.protobuf.Internal.hashBoolean(
          getHasMinimum());
      hash = (37 * hash) + MINIMUM_FIELD_NUMBER;
      hash = (53 * hash) + com.google.protobuf.Internal.hashLong(
          getMinimum());
      if (hasAllowedValues()) {
        hash = (37 * hash) + ALLOWED_VALUES_FIELD_NUMBER;
        hash = (53 * hash) + getAllowedValues().hashCode();
      }
      hash = (29 * hash) + unknownFields.hashCode();
      memoizedHashCode = hash;
      return hash;
    }

    public static AttrDef parseFrom(
        java.nio.ByteBuffer data)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data);
    }

    public static AttrDef parseFrom(
        java.nio.ByteBuffer data,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data, extensionRegistry);
    }

    public static AttrDef parseFrom(
        com.google.protobuf.ByteString data)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data);
    }

    public static AttrDef parseFrom(
        com.google.protobuf.ByteString data,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data, extensionRegistry);
    }

    public static AttrDef parseFrom(byte[] data)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data);
    }

    public static AttrDef parseFrom(
        byte[] data,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data, extensionRegistry);
    }

    public static AttrDef parseFrom(java.io.InputStream input)
        throws java.io.IOException {
      return com.google.protobuf.GeneratedMessageV3
          .parseWithIOException(PARSER, input);
    }

    public static AttrDef 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 AttrDef parseDelimitedFrom(java.io.InputStream input)
        throws java.io.IOException {
      return com.google.protobuf.GeneratedMessageV3
          .parseDelimitedWithIOException(PARSER, input);
    }

    public static AttrDef 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 AttrDef parseFrom(
        com.google.protobuf.CodedInputStream input)
        throws java.io.IOException {
      return com.google.protobuf.GeneratedMessageV3
          .parseWithIOException(PARSER, input);
    }

    public static AttrDef parseFrom(
        com.google.protobuf.CodedInputStream input,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws java.io.IOException {
      return com.google.protobuf.GeneratedMessageV3
          .parseWithIOException(PARSER, input, extensionRegistry);
    }

    @Override
    public Builder newBuilderForType() { return newBuilder(); }

    public static Builder newBuilder() {
      return DEFAULT_INSTANCE.toBuilder();
    }

    public static Builder newBuilder(AttrDef prototype) {
      return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype);
    }

    @Override
    public Builder toBuilder() {
      return this == DEFAULT_INSTANCE
          ? new Builder() : new Builder().mergeFrom(this);
    }

    @Override
    protected Builder newBuilderForType(
        BuilderParent parent) {
      Builder builder = new Builder(parent);
      return builder;
    }

    /**
     * <pre>
     * Description of the graph-construction-time configuration of this
     * Op.  That is to say, this describes the attr fields that will
     * be specified in the NodeDef.
     * </pre>
     *
     * Protobuf type {@code tensorflow.OpDef.AttrDef}
     */
    public static final class Builder extends
        com.google.protobuf.GeneratedMessageV3.Builder<Builder> implements
        // @@protoc_insertion_point(builder_implements:tensorflow.OpDef.AttrDef)
        AttrDefOrBuilder {

      public static final com.google.protobuf.Descriptors.Descriptor
      getDescriptor() {
        return OpDefProtos.internal_static_tensorflow_OpDef_AttrDef_descriptor;
      }

      @Override
      protected FieldAccessorTable
      internalGetFieldAccessorTable() {
        return OpDefProtos.internal_static_tensorflow_OpDef_AttrDef_fieldAccessorTable
            .ensureFieldAccessorsInitialized(
                AttrDef.class, Builder.class);
      }

      // Construct using org.tensorflow.proto.framework.OpDef.AttrDef.newBuilder()
      private Builder() {
        maybeForceBuilderInitialization();
      }

      private Builder(
          BuilderParent parent) {
        super(parent);
        maybeForceBuilderInitialization();
      }

      private void maybeForceBuilderInitialization() {
        if (com.google.protobuf.GeneratedMessageV3
            .alwaysUseFieldBuilders) {
        }
      }

      @Override
      public Builder clear() {
        super.clear();
        name_ = "";

        type_ = "";

        if (defaultValueBuilder_ == null) {
          defaultValue_ = null;
        } else {
          defaultValue_ = null;
          defaultValueBuilder_ = null;
        }
        description_ = "";

        hasMinimum_ = false;

        minimum_ = 0L;

        if (allowedValuesBuilder_ == null) {
          allowedValues_ = null;
        } else {
          allowedValues_ = null;
          allowedValuesBuilder_ = null;
        }
        return this;
      }

      @Override
      public com.google.protobuf.Descriptors.Descriptor
      getDescriptorForType() {
        return OpDefProtos.internal_static_tensorflow_OpDef_AttrDef_descriptor;
      }

      @Override
      public AttrDef getDefaultInstanceForType() {
        return AttrDef.getDefaultInstance();
      }

      @Override
      public AttrDef build() {
        AttrDef result = buildPartial();
        if (!result.isInitialized()) {
          throw newUninitializedMessageException(result);
        }
        return result;
      }

      @Override
      public AttrDef buildPartial() {
        AttrDef result = new AttrDef(this);
        result.name_ = name_;
        result.type_ = type_;
        if (defaultValueBuilder_ == null) {
          result.defaultValue_ = defaultValue_;
        } else {
          result.defaultValue_ = defaultValueBuilder_.build();
        }
        result.description_ = description_;
        result.hasMinimum_ = hasMinimum_;
        result.minimum_ = minimum_;
        if (allowedValuesBuilder_ == null) {
          result.allowedValues_ = allowedValues_;
        } else {
          result.allowedValues_ = allowedValuesBuilder_.build();
        }
        onBuilt();
        return result;
      }

      @Override
      public Builder clone() {
        return super.clone();
      }

      @Override
      public Builder setField(
          com.google.protobuf.Descriptors.FieldDescriptor field,
          Object value) {
        return super.setField(field, value);
      }

      @Override
      public Builder clearField(
          com.google.protobuf.Descriptors.FieldDescriptor field) {
        return super.clearField(field);
      }

      @Override
      public Builder clearOneof(
          com.google.protobuf.Descriptors.OneofDescriptor oneof) {
        return super.clearOneof(oneof);
      }

      @Override
      public Builder setRepeatedField(
          com.google.protobuf.Descriptors.FieldDescriptor field,
          int index, Object value) {
        return super.setRepeatedField(field, index, value);
      }

      @Override
      public Builder addRepeatedField(
          com.google.protobuf.Descriptors.FieldDescriptor field,
          Object value) {
        return super.addRepeatedField(field, value);
      }

      @Override
      public Builder mergeFrom(com.google.protobuf.Message other) {
        if (other instanceof AttrDef) {
          return mergeFrom((AttrDef) other);
        } else {
          super.mergeFrom(other);
          return this;
        }
      }

      public Builder mergeFrom(AttrDef other) {
        if (other == AttrDef.getDefaultInstance()) {
          return this;
        }
        if (!other.getName().isEmpty()) {
          name_ = other.name_;
          onChanged();
        }
        if (!other.getType().isEmpty()) {
          type_ = other.type_;
          onChanged();
        }
        if (other.hasDefaultValue()) {
          mergeDefaultValue(other.getDefaultValue());
        }
        if (!other.getDescription().isEmpty()) {
          description_ = other.description_;
          onChanged();
        }
        if (other.getHasMinimum() != false) {
          setHasMinimum(other.getHasMinimum());
        }
        if (other.getMinimum() != 0L) {
          setMinimum(other.getMinimum());
        }
        if (other.hasAllowedValues()) {
          mergeAllowedValues(other.getAllowedValues());
        }
        this.mergeUnknownFields(other.unknownFields);
        onChanged();
        return this;
      }

      @Override
      public final boolean isInitialized() {
        return true;
      }

      @Override
      public Builder mergeFrom(
          com.google.protobuf.CodedInputStream input,
          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
          throws java.io.IOException {
        AttrDef parsedMessage = null;
        try {
          parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
        } catch (com.google.protobuf.InvalidProtocolBufferException e) {
          parsedMessage = (AttrDef) e.getUnfinishedMessage();
          throw e.unwrapIOException();
        } finally {
          if (parsedMessage != null) {
            mergeFrom(parsedMessage);
          }
        }
        return this;
      }

      private Object name_ = "";

      /**
       * <pre>
       * A descriptive name for the argument.  May be used, e.g. by the
       * Python client, as a keyword argument name, and so should match
       * the regexp "[a-z][a-z0-9_]+".
       * </pre>
       *
       * <code>string name = 1;</code>
       */
      public String getName() {
        Object ref = name_;
        if (!(ref instanceof String)) {
          com.google.protobuf.ByteString bs =
              (com.google.protobuf.ByteString) ref;
          String s = bs.toStringUtf8();
          name_ = s;
          return s;
        } else {
          return (String) ref;
        }
      }

      /**
       * <pre>
       * A descriptive name for the argument.  May be used, e.g. by the
       * Python client, as a keyword argument name, and so should match
       * the regexp "[a-z][a-z0-9_]+".
       * </pre>
       *
       * <code>string name = 1;</code>
       */
      public com.google.protobuf.ByteString
      getNameBytes() {
        Object ref = name_;
        if (ref instanceof String) {
          com.google.protobuf.ByteString b =
              com.google.protobuf.ByteString.copyFromUtf8(
                  (String) ref);
          name_ = b;
          return b;
        } else {
          return (com.google.protobuf.ByteString) ref;
        }
      }

      /**
       * <pre>
       * A descriptive name for the argument.  May be used, e.g. by the
       * Python client, as a keyword argument name, and so should match
       * the regexp "[a-z][a-z0-9_]+".
       * </pre>
       *
       * <code>string name = 1;</code>
       */
      public Builder setName(
          String value) {
        if (value == null) {
          throw new NullPointerException();
        }

        name_ = value;
        onChanged();
        return this;
      }

      /**
       * <pre>
       * A descriptive name for the argument.  May be used, e.g. by the
       * Python client, as a keyword argument name, and so should match
       * the regexp "[a-z][a-z0-9_]+".
       * </pre>
       *
       * <code>string name = 1;</code>
       */
      public Builder clearName() {

        name_ = getDefaultInstance().getName();
        onChanged();
        return this;
      }

      /**
       * <pre>
       * A descriptive name for the argument.  May be used, e.g. by the
       * Python client, as a keyword argument name, and so should match
       * the regexp "[a-z][a-z0-9_]+".
       * </pre>
       *
       * <code>string name = 1;</code>
       */
      public Builder setNameBytes(
          com.google.protobuf.ByteString value) {
        if (value == null) {
          throw new NullPointerException();
        }
        checkByteStringIsUtf8(value);

        name_ = value;
        onChanged();
        return this;
      }

      private Object type_ = "";

      /**
       * <pre>
       * One of the type names from attr_value.proto ("string", "list(string)",
       * "int", etc.).
       * </pre>
       *
       * <code>string type = 2;</code>
       */
      public String getType() {
        Object ref = type_;
        if (!(ref instanceof String)) {
          com.google.protobuf.ByteString bs =
              (com.google.protobuf.ByteString) ref;
          String s = bs.toStringUtf8();
          type_ = s;
          return s;
        } else {
          return (String) ref;
        }
      }

      /**
       * <pre>
       * One of the type names from attr_value.proto ("string", "list(string)",
       * "int", etc.).
       * </pre>
       *
       * <code>string type = 2;</code>
       */
      public com.google.protobuf.ByteString
      getTypeBytes() {
        Object ref = type_;
        if (ref instanceof String) {
          com.google.protobuf.ByteString b =
              com.google.protobuf.ByteString.copyFromUtf8(
                  (String) ref);
          type_ = b;
          return b;
        } else {
          return (com.google.protobuf.ByteString) ref;
        }
      }

      /**
       * <pre>
       * One of the type names from attr_value.proto ("string", "list(string)",
       * "int", etc.).
       * </pre>
       *
       * <code>string type = 2;</code>
       */
      public Builder setType(
          String value) {
        if (value == null) {
          throw new NullPointerException();
        }

        type_ = value;
        onChanged();
        return this;
      }

      /**
       * <pre>
       * One of the type names from attr_value.proto ("string", "list(string)",
       * "int", etc.).
       * </pre>
       *
       * <code>string type = 2;</code>
       */
      public Builder clearType() {

        type_ = getDefaultInstance().getType();
        onChanged();
        return this;
      }

      /**
       * <pre>
       * One of the type names from attr_value.proto ("string", "list(string)",
       * "int", etc.).
       * </pre>
       *
       * <code>string type = 2;</code>
       */
      public Builder setTypeBytes(
          com.google.protobuf.ByteString value) {
        if (value == null) {
          throw new NullPointerException();
        }
        checkByteStringIsUtf8(value);

        type_ = value;
        onChanged();
        return this;
      }

      private AttrValue defaultValue_;
      private com.google.protobuf.SingleFieldBuilderV3<
          AttrValue, AttrValue.Builder, AttrValueOrBuilder> defaultValueBuilder_;

      /**
       * <pre>
       * A reasonable default for this attribute if the user does not supply
       * a value.  If not specified, the user must supply a value.
       * </pre>
       *
       * <code>.tensorflow.AttrValue default_value = 3;</code>
       */
      public boolean hasDefaultValue() {
        return defaultValueBuilder_ != null || defaultValue_ != null;
      }

      /**
       * <pre>
       * A reasonable default for this attribute if the user does not supply
       * a value.  If not specified, the user must supply a value.
       * </pre>
       *
       * <code>.tensorflow.AttrValue default_value = 3;</code>
       */
      public AttrValue getDefaultValue() {
        if (defaultValueBuilder_ == null) {
          return defaultValue_ == null ? AttrValue.getDefaultInstance() : defaultValue_;
        } else {
          return defaultValueBuilder_.getMessage();
        }
      }

      /**
       * <pre>
       * A reasonable default for this attribute if the user does not supply
       * a value.  If not specified, the user must supply a value.
       * </pre>
       *
       * <code>.tensorflow.AttrValue default_value = 3;</code>
       */
      public Builder setDefaultValue(AttrValue value) {
        if (defaultValueBuilder_ == null) {
          if (value == null) {
            throw new NullPointerException();
          }
          defaultValue_ = value;
          onChanged();
        } else {
          defaultValueBuilder_.setMessage(value);
        }

        return this;
      }

      /**
       * <pre>
       * A reasonable default for this attribute if the user does not supply
       * a value.  If not specified, the user must supply a value.
       * </pre>
       *
       * <code>.tensorflow.AttrValue default_value = 3;</code>
       */
      public Builder setDefaultValue(
          AttrValue.Builder builderForValue) {
        if (defaultValueBuilder_ == null) {
          defaultValue_ = builderForValue.build();
          onChanged();
        } else {
          defaultValueBuilder_.setMessage(builderForValue.build());
        }

        return this;
      }

      /**
       * <pre>
       * A reasonable default for this attribute if the user does not supply
       * a value.  If not specified, the user must supply a value.
       * </pre>
       *
       * <code>.tensorflow.AttrValue default_value = 3;</code>
       */
      public Builder mergeDefaultValue(AttrValue value) {
        if (defaultValueBuilder_ == null) {
          if (defaultValue_ != null) {
            defaultValue_ =
                AttrValue.newBuilder(defaultValue_).mergeFrom(value).buildPartial();
          } else {
            defaultValue_ = value;
          }
          onChanged();
        } else {
          defaultValueBuilder_.mergeFrom(value);
        }

        return this;
      }

      /**
       * <pre>
       * A reasonable default for this attribute if the user does not supply
       * a value.  If not specified, the user must supply a value.
       * </pre>
       *
       * <code>.tensorflow.AttrValue default_value = 3;</code>
       */
      public Builder clearDefaultValue() {
        if (defaultValueBuilder_ == null) {
          defaultValue_ = null;
          onChanged();
        } else {
          defaultValue_ = null;
          defaultValueBuilder_ = null;
        }

        return this;
      }

      /**
       * <pre>
       * A reasonable default for this attribute if the user does not supply
       * a value.  If not specified, the user must supply a value.
       * </pre>
       *
       * <code>.tensorflow.AttrValue default_value = 3;</code>
       */
      public AttrValue.Builder getDefaultValueBuilder() {

        onChanged();
        return getDefaultValueFieldBuilder().getBuilder();
      }

      /**
       * <pre>
       * A reasonable default for this attribute if the user does not supply
       * a value.  If not specified, the user must supply a value.
       * </pre>
       *
       * <code>.tensorflow.AttrValue default_value = 3;</code>
       */
      public AttrValueOrBuilder getDefaultValueOrBuilder() {
        if (defaultValueBuilder_ != null) {
          return defaultValueBuilder_.getMessageOrBuilder();
        } else {
          return defaultValue_ == null ?
              AttrValue.getDefaultInstance() : defaultValue_;
        }
      }

      /**
       * <pre>
       * A reasonable default for this attribute if the user does not supply
       * a value.  If not specified, the user must supply a value.
       * </pre>
       *
       * <code>.tensorflow.AttrValue default_value = 3;</code>
       */
      private com.google.protobuf.SingleFieldBuilderV3<
          AttrValue, AttrValue.Builder, AttrValueOrBuilder>
      getDefaultValueFieldBuilder() {
        if (defaultValueBuilder_ == null) {
          defaultValueBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
              AttrValue, AttrValue.Builder, AttrValueOrBuilder>(
              getDefaultValue(),
              getParentForChildren(),
              isClean());
          defaultValue_ = null;
        }
        return defaultValueBuilder_;
      }

      private Object description_ = "";

      /**
       * <pre>
       * Human-readable description.
       * </pre>
       *
       * <code>string description = 4;</code>
       */
      public String getDescription() {
        Object ref = description_;
        if (!(ref instanceof String)) {
          com.google.protobuf.ByteString bs =
              (com.google.protobuf.ByteString) ref;
          String s = bs.toStringUtf8();
          description_ = s;
          return s;
        } else {
          return (String) ref;
        }
      }

      /**
       * <pre>
       * Human-readable description.
       * </pre>
       *
       * <code>string description = 4;</code>
       */
      public com.google.protobuf.ByteString
      getDescriptionBytes() {
        Object ref = description_;
        if (ref instanceof String) {
          com.google.protobuf.ByteString b =
              com.google.protobuf.ByteString.copyFromUtf8(
                  (String) ref);
          description_ = b;
          return b;
        } else {
          return (com.google.protobuf.ByteString) ref;
        }
      }

      /**
       * <pre>
       * Human-readable description.
       * </pre>
       *
       * <code>string description = 4;</code>
       */
      public Builder setDescription(
          String value) {
        if (value == null) {
          throw new NullPointerException();
        }

        description_ = value;
        onChanged();
        return this;
      }

      /**
       * <pre>
       * Human-readable description.
       * </pre>
       *
       * <code>string description = 4;</code>
       */
      public Builder clearDescription() {

        description_ = getDefaultInstance().getDescription();
        onChanged();
        return this;
      }

      /**
       * <pre>
       * Human-readable description.
       * </pre>
       *
       * <code>string description = 4;</code>
       */
      public Builder setDescriptionBytes(
          com.google.protobuf.ByteString value) {
        if (value == null) {
          throw new NullPointerException();
        }
        checkByteStringIsUtf8(value);

        description_ = value;
        onChanged();
        return this;
      }

      private boolean hasMinimum_ ;

      /**
       * <pre>
       * For type == "int", this is a minimum value.  For "list(___)"
       * types, this is the minimum length.
       * </pre>
       *
       * <code>bool has_minimum = 5;</code>
       */
      public boolean getHasMinimum() {
        return hasMinimum_;
      }

      /**
       * <pre>
       * For type == "int", this is a minimum value.  For "list(___)"
       * types, this is the minimum length.
       * </pre>
       *
       * <code>bool has_minimum = 5;</code>
       */
      public Builder setHasMinimum(boolean value) {

        hasMinimum_ = value;
        onChanged();
        return this;
      }

      /**
       * <pre>
       * For type == "int", this is a minimum value.  For "list(___)"
       * types, this is the minimum length.
       * </pre>
       *
       * <code>bool has_minimum = 5;</code>
       */
      public Builder clearHasMinimum() {

        hasMinimum_ = false;
        onChanged();
        return this;
      }

      private long minimum_ ;

      /**
       * <code>int64 minimum = 6;</code>
       */
      public long getMinimum() {
        return minimum_;
      }

      /**
       * <code>int64 minimum = 6;</code>
       */
      public Builder setMinimum(long value) {

        minimum_ = value;
        onChanged();
        return this;
      }

      /**
       * <code>int64 minimum = 6;</code>
       */
      public Builder clearMinimum() {

        minimum_ = 0L;
        onChanged();
        return this;
      }

      private AttrValue allowedValues_;
      private com.google.protobuf.SingleFieldBuilderV3<
          AttrValue, AttrValue.Builder, AttrValueOrBuilder> allowedValuesBuilder_;

      /**
       * <pre>
       * The set of allowed values.  Has type that is the "list" version
       * of the "type" field above (uses the "list" field of AttrValue).
       * If type == "type" or "list(type)" above, then the "type" field
       * of "allowed_values.list" has the set of allowed DataTypes.
       * If type == "string" or "list(string)", then the "s" field of
       * "allowed_values.list" has the set of allowed strings.
       * </pre>
       *
       * <code>.tensorflow.AttrValue allowed_values = 7;</code>
       */
      public boolean hasAllowedValues() {
        return allowedValuesBuilder_ != null || allowedValues_ != null;
      }

      /**
       * <pre>
       * The set of allowed values.  Has type that is the "list" version
       * of the "type" field above (uses the "list" field of AttrValue).
       * If type == "type" or "list(type)" above, then the "type" field
       * of "allowed_values.list" has the set of allowed DataTypes.
       * If type == "string" or "list(string)", then the "s" field of
       * "allowed_values.list" has the set of allowed strings.
       * </pre>
       *
       * <code>.tensorflow.AttrValue allowed_values = 7;</code>
       */
      public AttrValue getAllowedValues() {
        if (allowedValuesBuilder_ == null) {
          return allowedValues_ == null ? AttrValue.getDefaultInstance() : allowedValues_;
        } else {
          return allowedValuesBuilder_.getMessage();
        }
      }

      /**
       * <pre>
       * The set of allowed values.  Has type that is the "list" version
       * of the "type" field above (uses the "list" field of AttrValue).
       * If type == "type" or "list(type)" above, then the "type" field
       * of "allowed_values.list" has the set of allowed DataTypes.
       * If type == "string" or "list(string)", then the "s" field of
       * "allowed_values.list" has the set of allowed strings.
       * </pre>
       *
       * <code>.tensorflow.AttrValue allowed_values = 7;</code>
       */
      public Builder setAllowedValues(AttrValue value) {
        if (allowedValuesBuilder_ == null) {
          if (value == null) {
            throw new NullPointerException();
          }
          allowedValues_ = value;
          onChanged();
        } else {
          allowedValuesBuilder_.setMessage(value);
        }

        return this;
      }

      /**
       * <pre>
       * The set of allowed values.  Has type that is the "list" version
       * of the "type" field above (uses the "list" field of AttrValue).
       * If type == "type" or "list(type)" above, then the "type" field
       * of "allowed_values.list" has the set of allowed DataTypes.
       * If type == "string" or "list(string)", then the "s" field of
       * "allowed_values.list" has the set of allowed strings.
       * </pre>
       *
       * <code>.tensorflow.AttrValue allowed_values = 7;</code>
       */
      public Builder setAllowedValues(
          AttrValue.Builder builderForValue) {
        if (allowedValuesBuilder_ == null) {
          allowedValues_ = builderForValue.build();
          onChanged();
        } else {
          allowedValuesBuilder_.setMessage(builderForValue.build());
        }

        return this;
      }

      /**
       * <pre>
       * The set of allowed values.  Has type that is the "list" version
       * of the "type" field above (uses the "list" field of AttrValue).
       * If type == "type" or "list(type)" above, then the "type" field
       * of "allowed_values.list" has the set of allowed DataTypes.
       * If type == "string" or "list(string)", then the "s" field of
       * "allowed_values.list" has the set of allowed strings.
       * </pre>
       *
       * <code>.tensorflow.AttrValue allowed_values = 7;</code>
       */
      public Builder mergeAllowedValues(AttrValue value) {
        if (allowedValuesBuilder_ == null) {
          if (allowedValues_ != null) {
            allowedValues_ =
                AttrValue.newBuilder(allowedValues_).mergeFrom(value).buildPartial();
          } else {
            allowedValues_ = value;
          }
          onChanged();
        } else {
          allowedValuesBuilder_.mergeFrom(value);
        }

        return this;
      }

      /**
       * <pre>
       * The set of allowed values.  Has type that is the "list" version
       * of the "type" field above (uses the "list" field of AttrValue).
       * If type == "type" or "list(type)" above, then the "type" field
       * of "allowed_values.list" has the set of allowed DataTypes.
       * If type == "string" or "list(string)", then the "s" field of
       * "allowed_values.list" has the set of allowed strings.
       * </pre>
       *
       * <code>.tensorflow.AttrValue allowed_values = 7;</code>
       */
      public Builder clearAllowedValues() {
        if (allowedValuesBuilder_ == null) {
          allowedValues_ = null;
          onChanged();
        } else {
          allowedValues_ = null;
          allowedValuesBuilder_ = null;
        }

        return this;
      }

      /**
       * <pre>
       * The set of allowed values.  Has type that is the "list" version
       * of the "type" field above (uses the "list" field of AttrValue).
       * If type == "type" or "list(type)" above, then the "type" field
       * of "allowed_values.list" has the set of allowed DataTypes.
       * If type == "string" or "list(string)", then the "s" field of
       * "allowed_values.list" has the set of allowed strings.
       * </pre>
       *
       * <code>.tensorflow.AttrValue allowed_values = 7;</code>
       */
      public AttrValue.Builder getAllowedValuesBuilder() {

        onChanged();
        return getAllowedValuesFieldBuilder().getBuilder();
      }

      /**
       * <pre>
       * The set of allowed values.  Has type that is the "list" version
       * of the "type" field above (uses the "list" field of AttrValue).
       * If type == "type" or "list(type)" above, then the "type" field
       * of "allowed_values.list" has the set of allowed DataTypes.
       * If type == "string" or "list(string)", then the "s" field of
       * "allowed_values.list" has the set of allowed strings.
       * </pre>
       *
       * <code>.tensorflow.AttrValue allowed_values = 7;</code>
       */
      public AttrValueOrBuilder getAllowedValuesOrBuilder() {
        if (allowedValuesBuilder_ != null) {
          return allowedValuesBuilder_.getMessageOrBuilder();
        } else {
          return allowedValues_ == null ?
              AttrValue.getDefaultInstance() : allowedValues_;
        }
      }

      /**
       * <pre>
       * The set of allowed values.  Has type that is the "list" version
       * of the "type" field above (uses the "list" field of AttrValue).
       * If type == "type" or "list(type)" above, then the "type" field
       * of "allowed_values.list" has the set of allowed DataTypes.
       * If type == "string" or "list(string)", then the "s" field of
       * "allowed_values.list" has the set of allowed strings.
       * </pre>
       *
       * <code>.tensorflow.AttrValue allowed_values = 7;</code>
       */
      private com.google.protobuf.SingleFieldBuilderV3<
          AttrValue, AttrValue.Builder, AttrValueOrBuilder>
      getAllowedValuesFieldBuilder() {
        if (allowedValuesBuilder_ == null) {
          allowedValuesBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
              AttrValue, AttrValue.Builder, AttrValueOrBuilder>(
              getAllowedValues(),
              getParentForChildren(),
              isClean());
          allowedValues_ = null;
        }
        return allowedValuesBuilder_;
      }

      @Override
      public final Builder setUnknownFields(
          final com.google.protobuf.UnknownFieldSet unknownFields) {
        return super.setUnknownFields(unknownFields);
      }

      @Override
      public final Builder mergeUnknownFields(
          final com.google.protobuf.UnknownFieldSet unknownFields) {
        return super.mergeUnknownFields(unknownFields);
      }

      // @@protoc_insertion_point(builder_scope:tensorflow.OpDef.AttrDef)
    }

    // @@protoc_insertion_point(class_scope:tensorflow.OpDef.AttrDef)
    private static final AttrDef DEFAULT_INSTANCE;

    static {
      DEFAULT_INSTANCE = new AttrDef();
    }

    public static AttrDef getDefaultInstance() {
      return DEFAULT_INSTANCE;
    }

    private static final com.google.protobuf.Parser<AttrDef>
        PARSER = new com.google.protobuf.AbstractParser<AttrDef>() {
      @Override
      public AttrDef parsePartialFrom(
          com.google.protobuf.CodedInputStream input,
          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
          throws com.google.protobuf.InvalidProtocolBufferException {
        return new AttrDef(input, extensionRegistry);
      }
    };

    public static com.google.protobuf.Parser<AttrDef> parser() {
      return PARSER;
    }

    @Override
    public com.google.protobuf.Parser<AttrDef> getParserForType() {
      return PARSER;
    }

    @Override
    public AttrDef getDefaultInstanceForType() {
      return DEFAULT_INSTANCE;
    }

  }

  public static final int NAME_FIELD_NUMBER = 1;
  private volatile Object name_;

  /**
   * <pre>
   * Op names starting with an underscore are reserved for internal use.
   * Names should be CamelCase and match the regexp "[A-Z][a-zA-Z0-9&gt;_]*".
   * </pre>
   *
   * <code>string name = 1;</code>
   */
  public String getName() {
    Object ref = name_;
    if (ref instanceof String) {
      return (String) ref;
    } else {
      com.google.protobuf.ByteString bs =
          (com.google.protobuf.ByteString) ref;
      String s = bs.toStringUtf8();
      name_ = s;
      return s;
    }
  }

  /**
   * <pre>
   * Op names starting with an underscore are reserved for internal use.
   * Names should be CamelCase and match the regexp "[A-Z][a-zA-Z0-9&gt;_]*".
   * </pre>
   *
   * <code>string name = 1;</code>
   */
  public com.google.protobuf.ByteString
  getNameBytes() {
    Object ref = name_;
    if (ref instanceof String) {
      com.google.protobuf.ByteString b =
          com.google.protobuf.ByteString.copyFromUtf8(
              (String) ref);
      name_ = b;
      return b;
    } else {
      return (com.google.protobuf.ByteString) ref;
    }
  }

  public static final int INPUT_ARG_FIELD_NUMBER = 2;
  private java.util.List<ArgDef> inputArg_;

  /**
   * <pre>
   * Description of the input(s).
   * </pre>
   *
   * <code>repeated .tensorflow.OpDef.ArgDef input_arg = 2;</code>
   */
  public java.util.List<ArgDef> getInputArgList() {
    return inputArg_;
  }

  /**
   * <pre>
   * Description of the input(s).
   * </pre>
   *
   * <code>repeated .tensorflow.OpDef.ArgDef input_arg = 2;</code>
   */
  public java.util.List<? extends ArgDefOrBuilder>
  getInputArgOrBuilderList() {
    return inputArg_;
  }

  /**
   * <pre>
   * Description of the input(s).
   * </pre>
   *
   * <code>repeated .tensorflow.OpDef.ArgDef input_arg = 2;</code>
   */
  public int getInputArgCount() {
    return inputArg_.size();
  }

  /**
   * <pre>
   * Description of the input(s).
   * </pre>
   *
   * <code>repeated .tensorflow.OpDef.ArgDef input_arg = 2;</code>
   */
  public ArgDef getInputArg(int index) {
    return inputArg_.get(index);
  }

  /**
   * <pre>
   * Description of the input(s).
   * </pre>
   *
   * <code>repeated .tensorflow.OpDef.ArgDef input_arg = 2;</code>
   */
  public ArgDefOrBuilder getInputArgOrBuilder(
      int index) {
    return inputArg_.get(index);
  }

  public static final int OUTPUT_ARG_FIELD_NUMBER = 3;
  private java.util.List<ArgDef> outputArg_;

  /**
   * <pre>
   * Description of the output(s).
   * </pre>
   *
   * <code>repeated .tensorflow.OpDef.ArgDef output_arg = 3;</code>
   */
  public java.util.List<ArgDef> getOutputArgList() {
    return outputArg_;
  }

  /**
   * <pre>
   * Description of the output(s).
   * </pre>
   *
   * <code>repeated .tensorflow.OpDef.ArgDef output_arg = 3;</code>
   */
  public java.util.List<? extends ArgDefOrBuilder>
  getOutputArgOrBuilderList() {
    return outputArg_;
  }

  /**
   * <pre>
   * Description of the output(s).
   * </pre>
   *
   * <code>repeated .tensorflow.OpDef.ArgDef output_arg = 3;</code>
   */
  public int getOutputArgCount() {
    return outputArg_.size();
  }

  /**
   * <pre>
   * Description of the output(s).
   * </pre>
   *
   * <code>repeated .tensorflow.OpDef.ArgDef output_arg = 3;</code>
   */
  public ArgDef getOutputArg(int index) {
    return outputArg_.get(index);
  }

  /**
   * <pre>
   * Description of the output(s).
   * </pre>
   *
   * <code>repeated .tensorflow.OpDef.ArgDef output_arg = 3;</code>
   */
  public ArgDefOrBuilder getOutputArgOrBuilder(
      int index) {
    return outputArg_.get(index);
  }

  public static final int CONTROL_OUTPUT_FIELD_NUMBER = 20;
  private com.google.protobuf.LazyStringList controlOutput_;

  /**
   * <pre>
   * Named control outputs for this operation. Useful only for composite
   * operations (i.e. functions) which want to name different control outputs.
   * </pre>
   *
   * <code>repeated string control_output = 20;</code>
   */
  public com.google.protobuf.ProtocolStringList
  getControlOutputList() {
    return controlOutput_;
  }

  /**
   * <pre>
   * Named control outputs for this operation. Useful only for composite
   * operations (i.e. functions) which want to name different control outputs.
   * </pre>
   *
   * <code>repeated string control_output = 20;</code>
   */
  public int getControlOutputCount() {
    return controlOutput_.size();
  }

  /**
   * <pre>
   * Named control outputs for this operation. Useful only for composite
   * operations (i.e. functions) which want to name different control outputs.
   * </pre>
   *
   * <code>repeated string control_output = 20;</code>
   */
  public String getControlOutput(int index) {
    return controlOutput_.get(index);
  }

  /**
   * <pre>
   * Named control outputs for this operation. Useful only for composite
   * operations (i.e. functions) which want to name different control outputs.
   * </pre>
   *
   * <code>repeated string control_output = 20;</code>
   */
  public com.google.protobuf.ByteString
  getControlOutputBytes(int index) {
    return controlOutput_.getByteString(index);
  }

  public static final int ATTR_FIELD_NUMBER = 4;
  private java.util.List<AttrDef> attr_;

  /**
   * <code>repeated .tensorflow.OpDef.AttrDef attr = 4;</code>
   */
  public java.util.List<AttrDef> getAttrList() {
    return attr_;
  }

  /**
   * <code>repeated .tensorflow.OpDef.AttrDef attr = 4;</code>
   */
  public java.util.List<? extends AttrDefOrBuilder>
  getAttrOrBuilderList() {
    return attr_;
  }

  /**
   * <code>repeated .tensorflow.OpDef.AttrDef attr = 4;</code>
   */
  public int getAttrCount() {
    return attr_.size();
  }

  /**
   * <code>repeated .tensorflow.OpDef.AttrDef attr = 4;</code>
   */
  public AttrDef getAttr(int index) {
    return attr_.get(index);
  }

  /**
   * <code>repeated .tensorflow.OpDef.AttrDef attr = 4;</code>
   */
  public AttrDefOrBuilder getAttrOrBuilder(
      int index) {
    return attr_.get(index);
  }

  public static final int DEPRECATION_FIELD_NUMBER = 8;
  private OpDeprecation deprecation_;

  /**
   * <pre>
   * Optional deprecation based on GraphDef versions.
   * </pre>
   *
   * <code>.tensorflow.OpDeprecation deprecation = 8;</code>
   */
  public boolean hasDeprecation() {
    return deprecation_ != null;
  }

  /**
   * <pre>
   * Optional deprecation based on GraphDef versions.
   * </pre>
   *
   * <code>.tensorflow.OpDeprecation deprecation = 8;</code>
   */
  public OpDeprecation getDeprecation() {
    return deprecation_ == null ? OpDeprecation.getDefaultInstance() : deprecation_;
  }

  /**
   * <pre>
   * Optional deprecation based on GraphDef versions.
   * </pre>
   *
   * <code>.tensorflow.OpDeprecation deprecation = 8;</code>
   */
  public OpDeprecationOrBuilder getDeprecationOrBuilder() {
    return getDeprecation();
  }

  public static final int SUMMARY_FIELD_NUMBER = 5;
  private volatile Object summary_;

  /**
   * <pre>
   * One-line human-readable description of what the Op does.
   * </pre>
   *
   * <code>string summary = 5;</code>
   */
  public String getSummary() {
    Object ref = summary_;
    if (ref instanceof String) {
      return (String) ref;
    } else {
      com.google.protobuf.ByteString bs =
          (com.google.protobuf.ByteString) ref;
      String s = bs.toStringUtf8();
      summary_ = s;
      return s;
    }
  }

  /**
   * <pre>
   * One-line human-readable description of what the Op does.
   * </pre>
   *
   * <code>string summary = 5;</code>
   */
  public com.google.protobuf.ByteString
  getSummaryBytes() {
    Object ref = summary_;
    if (ref instanceof String) {
      com.google.protobuf.ByteString b =
          com.google.protobuf.ByteString.copyFromUtf8(
              (String) ref);
      summary_ = b;
      return b;
    } else {
      return (com.google.protobuf.ByteString) ref;
    }
  }

  public static final int DESCRIPTION_FIELD_NUMBER = 6;
  private volatile Object description_;

  /**
   * <pre>
   * Additional, longer human-readable description of what the Op does.
   * </pre>
   *
   * <code>string description = 6;</code>
   */
  public String getDescription() {
    Object ref = description_;
    if (ref instanceof String) {
      return (String) ref;
    } else {
      com.google.protobuf.ByteString bs =
          (com.google.protobuf.ByteString) ref;
      String s = bs.toStringUtf8();
      description_ = s;
      return s;
    }
  }

  /**
   * <pre>
   * Additional, longer human-readable description of what the Op does.
   * </pre>
   *
   * <code>string description = 6;</code>
   */
  public com.google.protobuf.ByteString
  getDescriptionBytes() {
    Object ref = description_;
    if (ref instanceof String) {
      com.google.protobuf.ByteString b =
          com.google.protobuf.ByteString.copyFromUtf8(
              (String) ref);
      description_ = b;
      return b;
    } else {
      return (com.google.protobuf.ByteString) ref;
    }
  }

  public static final int IS_COMMUTATIVE_FIELD_NUMBER = 18;
  private boolean isCommutative_;

  /**
   * <pre>
   * True if the operation is commutative ("op(a,b) == op(b,a)" for all inputs)
   * </pre>
   *
   * <code>bool is_commutative = 18;</code>
   */
  public boolean getIsCommutative() {
    return isCommutative_;
  }

  public static final int IS_AGGREGATE_FIELD_NUMBER = 16;
  private boolean isAggregate_;

  /**
   * <pre>
   * If is_aggregate is true, then this operation accepts N &gt;= 2
   * inputs and produces 1 output all of the same type.  Should be
   * associative and commutative, and produce output with the same
   * shape as the input.  The optimizer may replace an aggregate op
   * taking input from multiple devices with a tree of aggregate ops
   * that aggregate locally within each device (and possibly within
   * groups of nearby devices) before communicating.
   * TODO(josh11b): Implement that optimization.
   * </pre>
   *
   * <code>bool is_aggregate = 16;</code>
   */
  public boolean getIsAggregate() {
    return isAggregate_;
  }

  public static final int IS_STATEFUL_FIELD_NUMBER = 17;
  private boolean isStateful_;

  /**
   * <pre>
   * Ops are marked as stateful if their behavior depends on some state beyond
   * their input tensors (e.g. variable reading op) or if they have
   * a side-effect (e.g. printing or asserting ops). Equivalently, stateless ops
   * must always produce the same output for the same input and have
   * no side-effects.
   * By default Ops may be moved between devices.  Stateful ops should
   * either not be moved, or should only be moved if that state can also
   * be moved (e.g. via some sort of save / restore).
   * Stateful ops are guaranteed to never be optimized away by Common
   * Subexpression Elimination (CSE).
   * </pre>
   *
   * <code>bool is_stateful = 17;</code>
   */
  public boolean getIsStateful() {
    return isStateful_;
  }

  public static final int ALLOWS_UNINITIALIZED_INPUT_FIELD_NUMBER = 19;
  private boolean allowsUninitializedInput_;

  /**
   * <pre>
   * By default, all inputs to an Op must be initialized Tensors.  Ops
   * that may initialize tensors for the first time should set this
   * field to true, to allow the Op to take an uninitialized Tensor as
   * input.
   * </pre>
   *
   * <code>bool allows_uninitialized_input = 19;</code>
   */
  public boolean getAllowsUninitializedInput() {
    return allowsUninitializedInput_;
  }

  private byte memoizedIsInitialized = -1;

  @Override
  public final boolean isInitialized() {
    byte isInitialized = memoizedIsInitialized;
    if (isInitialized == 1) return true;
    if (isInitialized == 0) return false;

    memoizedIsInitialized = 1;
    return true;
  }

  @Override
  public void writeTo(com.google.protobuf.CodedOutputStream output)
      throws java.io.IOException {
    if (!getNameBytes().isEmpty()) {
      com.google.protobuf.GeneratedMessageV3.writeString(output, 1, name_);
    }
    for (int i = 0; i < inputArg_.size(); i++) {
      output.writeMessage(2, inputArg_.get(i));
    }
    for (int i = 0; i < outputArg_.size(); i++) {
      output.writeMessage(3, outputArg_.get(i));
    }
    for (int i = 0; i < attr_.size(); i++) {
      output.writeMessage(4, attr_.get(i));
    }
    if (!getSummaryBytes().isEmpty()) {
      com.google.protobuf.GeneratedMessageV3.writeString(output, 5, summary_);
    }
    if (!getDescriptionBytes().isEmpty()) {
      com.google.protobuf.GeneratedMessageV3.writeString(output, 6, description_);
    }
    if (deprecation_ != null) {
      output.writeMessage(8, getDeprecation());
    }
    if (isAggregate_ != false) {
      output.writeBool(16, isAggregate_);
    }
    if (isStateful_ != false) {
      output.writeBool(17, isStateful_);
    }
    if (isCommutative_ != false) {
      output.writeBool(18, isCommutative_);
    }
    if (allowsUninitializedInput_ != false) {
      output.writeBool(19, allowsUninitializedInput_);
    }
    for (int i = 0; i < controlOutput_.size(); i++) {
      com.google.protobuf.GeneratedMessageV3.writeString(output, 20, controlOutput_.getRaw(i));
    }
    unknownFields.writeTo(output);
  }

  @Override
  public int getSerializedSize() {
    int size = memoizedSize;
    if (size != -1) return size;

    size = 0;
    if (!getNameBytes().isEmpty()) {
      size += com.google.protobuf.GeneratedMessageV3.computeStringSize(1, name_);
    }
    for (int i = 0; i < inputArg_.size(); i++) {
      size += com.google.protobuf.CodedOutputStream
          .computeMessageSize(2, inputArg_.get(i));
    }
    for (int i = 0; i < outputArg_.size(); i++) {
      size += com.google.protobuf.CodedOutputStream
          .computeMessageSize(3, outputArg_.get(i));
    }
    for (int i = 0; i < attr_.size(); i++) {
      size += com.google.protobuf.CodedOutputStream
          .computeMessageSize(4, attr_.get(i));
    }
    if (!getSummaryBytes().isEmpty()) {
      size += com.google.protobuf.GeneratedMessageV3.computeStringSize(5, summary_);
    }
    if (!getDescriptionBytes().isEmpty()) {
      size += com.google.protobuf.GeneratedMessageV3.computeStringSize(6, description_);
    }
    if (deprecation_ != null) {
      size += com.google.protobuf.CodedOutputStream
          .computeMessageSize(8, getDeprecation());
    }
    if (isAggregate_ != false) {
      size += com.google.protobuf.CodedOutputStream
          .computeBoolSize(16, isAggregate_);
    }
    if (isStateful_ != false) {
      size += com.google.protobuf.CodedOutputStream
          .computeBoolSize(17, isStateful_);
    }
    if (isCommutative_ != false) {
      size += com.google.protobuf.CodedOutputStream
          .computeBoolSize(18, isCommutative_);
    }
    if (allowsUninitializedInput_ != false) {
      size += com.google.protobuf.CodedOutputStream
          .computeBoolSize(19, allowsUninitializedInput_);
    }
    {
      int dataSize = 0;
      for (int i = 0; i < controlOutput_.size(); i++) {
        dataSize += computeStringSizeNoTag(controlOutput_.getRaw(i));
      }
      size += dataSize;
      size += 2 * getControlOutputList().size();
    }
    size += unknownFields.getSerializedSize();
    memoizedSize = size;
    return size;
  }

  @Override
  public boolean equals(final Object obj) {
    if (obj == this) {
      return true;
    }
    if (!(obj instanceof OpDef)) {
      return super.equals(obj);
    }
    OpDef other = (OpDef) obj;

    if (!getName()
        .equals(other.getName())) {
      return false;
    }
    if (!getInputArgList()
        .equals(other.getInputArgList())) return false;
    if (!getOutputArgList()
        .equals(other.getOutputArgList())) return false;
    if (!getControlOutputList()
        .equals(other.getControlOutputList())) return false;
    if (!getAttrList()
        .equals(other.getAttrList())) return false;
    if (hasDeprecation() != other.hasDeprecation()) return false;
    if (hasDeprecation()) {
      if (!getDeprecation()
          .equals(other.getDeprecation())) return false;
    }
    if (!getSummary()
        .equals(other.getSummary())) return false;
    if (!getDescription()
        .equals(other.getDescription())) return false;
    if (getIsCommutative()
        != other.getIsCommutative()) return false;
    if (getIsAggregate()
        != other.getIsAggregate()) return false;
    if (getIsStateful()
        != other.getIsStateful()) return false;
    if (getAllowsUninitializedInput()
        != other.getAllowsUninitializedInput()) return false;
    if (!unknownFields.equals(other.unknownFields)) return false;
    return true;
  }

  @Override
  public int hashCode() {
    if (memoizedHashCode != 0) {
      return memoizedHashCode;
    }
    int hash = 41;
    hash = (19 * hash) + getDescriptor().hashCode();
    hash = (37 * hash) + NAME_FIELD_NUMBER;
    hash = (53 * hash) + getName().hashCode();
    if (getInputArgCount() > 0) {
      hash = (37 * hash) + INPUT_ARG_FIELD_NUMBER;
      hash = (53 * hash) + getInputArgList().hashCode();
    }
    if (getOutputArgCount() > 0) {
      hash = (37 * hash) + OUTPUT_ARG_FIELD_NUMBER;
      hash = (53 * hash) + getOutputArgList().hashCode();
    }
    if (getControlOutputCount() > 0) {
      hash = (37 * hash) + CONTROL_OUTPUT_FIELD_NUMBER;
      hash = (53 * hash) + getControlOutputList().hashCode();
    }
    if (getAttrCount() > 0) {
      hash = (37 * hash) + ATTR_FIELD_NUMBER;
      hash = (53 * hash) + getAttrList().hashCode();
    }
    if (hasDeprecation()) {
      hash = (37 * hash) + DEPRECATION_FIELD_NUMBER;
      hash = (53 * hash) + getDeprecation().hashCode();
    }
    hash = (37 * hash) + SUMMARY_FIELD_NUMBER;
    hash = (53 * hash) + getSummary().hashCode();
    hash = (37 * hash) + DESCRIPTION_FIELD_NUMBER;
    hash = (53 * hash) + getDescription().hashCode();
    hash = (37 * hash) + IS_COMMUTATIVE_FIELD_NUMBER;
    hash = (53 * hash) + com.google.protobuf.Internal.hashBoolean(
        getIsCommutative());
    hash = (37 * hash) + IS_AGGREGATE_FIELD_NUMBER;
    hash = (53 * hash) + com.google.protobuf.Internal.hashBoolean(
        getIsAggregate());
    hash = (37 * hash) + IS_STATEFUL_FIELD_NUMBER;
    hash = (53 * hash) + com.google.protobuf.Internal.hashBoolean(
        getIsStateful());
    hash = (37 * hash) + ALLOWS_UNINITIALIZED_INPUT_FIELD_NUMBER;
    hash = (53 * hash) + com.google.protobuf.Internal.hashBoolean(
        getAllowsUninitializedInput());
    hash = (29 * hash) + unknownFields.hashCode();
    memoizedHashCode = hash;
    return hash;
  }

  public static OpDef parseFrom(
      java.nio.ByteBuffer data)
      throws com.google.protobuf.InvalidProtocolBufferException {
    return PARSER.parseFrom(data);
  }

  public static OpDef parseFrom(
      java.nio.ByteBuffer data,
      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
      throws com.google.protobuf.InvalidProtocolBufferException {
    return PARSER.parseFrom(data, extensionRegistry);
  }

  public static OpDef parseFrom(
      com.google.protobuf.ByteString data)
      throws com.google.protobuf.InvalidProtocolBufferException {
    return PARSER.parseFrom(data);
  }

  public static OpDef parseFrom(
      com.google.protobuf.ByteString data,
      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
      throws com.google.protobuf.InvalidProtocolBufferException {
    return PARSER.parseFrom(data, extensionRegistry);
  }

  public static OpDef parseFrom(byte[] data)
      throws com.google.protobuf.InvalidProtocolBufferException {
    return PARSER.parseFrom(data);
  }

  public static OpDef parseFrom(
      byte[] data,
      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
      throws com.google.protobuf.InvalidProtocolBufferException {
    return PARSER.parseFrom(data, extensionRegistry);
  }

  public static OpDef parseFrom(java.io.InputStream input)
      throws java.io.IOException {
    return com.google.protobuf.GeneratedMessageV3
        .parseWithIOException(PARSER, input);
  }

  public static OpDef 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 OpDef parseDelimitedFrom(java.io.InputStream input)
      throws java.io.IOException {
    return com.google.protobuf.GeneratedMessageV3
        .parseDelimitedWithIOException(PARSER, input);
  }

  public static OpDef 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 OpDef parseFrom(
      com.google.protobuf.CodedInputStream input)
      throws java.io.IOException {
    return com.google.protobuf.GeneratedMessageV3
        .parseWithIOException(PARSER, input);
  }

  public static OpDef parseFrom(
      com.google.protobuf.CodedInputStream input,
      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
      throws java.io.IOException {
    return com.google.protobuf.GeneratedMessageV3
        .parseWithIOException(PARSER, input, extensionRegistry);
  }

  @Override
  public Builder newBuilderForType() { return newBuilder(); }

  public static Builder newBuilder() {
    return DEFAULT_INSTANCE.toBuilder();
  }

  public static Builder newBuilder(OpDef prototype) {
    return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype);
  }

  @Override
  public Builder toBuilder() {
    return this == DEFAULT_INSTANCE
        ? new Builder() : new Builder().mergeFrom(this);
  }

  @Override
  protected Builder newBuilderForType(
      BuilderParent parent) {
    Builder builder = new Builder(parent);
    return builder;
  }

  /**
   * <pre>
   * Defines an operation. A NodeDef in a GraphDef specifies an Op by
   * using the "op" field which should match the name of a OpDef.
   * LINT.IfChange
   * </pre>
   *
   * Protobuf type {@code tensorflow.OpDef}
   */
  public static final class Builder extends
      com.google.protobuf.GeneratedMessageV3.Builder<Builder> implements
      // @@protoc_insertion_point(builder_implements:tensorflow.OpDef)
      OpDefOrBuilder {

    public static final com.google.protobuf.Descriptors.Descriptor
    getDescriptor() {
      return OpDefProtos.internal_static_tensorflow_OpDef_descriptor;
    }

    @Override
    protected FieldAccessorTable
    internalGetFieldAccessorTable() {
      return OpDefProtos.internal_static_tensorflow_OpDef_fieldAccessorTable
          .ensureFieldAccessorsInitialized(
              OpDef.class, Builder.class);
    }

    // Construct using org.tensorflow.proto.framework.OpDef.newBuilder()
    private Builder() {
      maybeForceBuilderInitialization();
    }

    private Builder(
        BuilderParent parent) {
      super(parent);
      maybeForceBuilderInitialization();
    }

    private void maybeForceBuilderInitialization() {
      if (com.google.protobuf.GeneratedMessageV3
          .alwaysUseFieldBuilders) {
        getInputArgFieldBuilder();
        getOutputArgFieldBuilder();
        getAttrFieldBuilder();
      }
    }

    @Override
    public Builder clear() {
      super.clear();
      name_ = "";

      if (inputArgBuilder_ == null) {
        inputArg_ = java.util.Collections.emptyList();
        bitField0_ = (bitField0_ & ~0x00000001);
      } else {
        inputArgBuilder_.clear();
      }
      if (outputArgBuilder_ == null) {
        outputArg_ = java.util.Collections.emptyList();
        bitField0_ = (bitField0_ & ~0x00000002);
      } else {
        outputArgBuilder_.clear();
      }
      controlOutput_ = com.google.protobuf.LazyStringArrayList.EMPTY;
      bitField0_ = (bitField0_ & ~0x00000004);
      if (attrBuilder_ == null) {
        attr_ = java.util.Collections.emptyList();
        bitField0_ = (bitField0_ & ~0x00000008);
      } else {
        attrBuilder_.clear();
      }
      if (deprecationBuilder_ == null) {
        deprecation_ = null;
      } else {
        deprecation_ = null;
        deprecationBuilder_ = null;
      }
      summary_ = "";

      description_ = "";

      isCommutative_ = false;

      isAggregate_ = false;

      isStateful_ = false;

      allowsUninitializedInput_ = false;

      return this;
    }

    @Override
    public com.google.protobuf.Descriptors.Descriptor
    getDescriptorForType() {
      return OpDefProtos.internal_static_tensorflow_OpDef_descriptor;
    }

    @Override
    public OpDef getDefaultInstanceForType() {
      return OpDef.getDefaultInstance();
    }

    @Override
    public OpDef build() {
      OpDef result = buildPartial();
      if (!result.isInitialized()) {
        throw newUninitializedMessageException(result);
      }
      return result;
    }

    @Override
    public OpDef buildPartial() {
      OpDef result = new OpDef(this);
      int from_bitField0_ = bitField0_;
      result.name_ = name_;
      if (inputArgBuilder_ == null) {
        if (((bitField0_ & 0x00000001) != 0)) {
          inputArg_ = java.util.Collections.unmodifiableList(inputArg_);
          bitField0_ = (bitField0_ & ~0x00000001);
        }
        result.inputArg_ = inputArg_;
      } else {
        result.inputArg_ = inputArgBuilder_.build();
      }
      if (outputArgBuilder_ == null) {
        if (((bitField0_ & 0x00000002) != 0)) {
          outputArg_ = java.util.Collections.unmodifiableList(outputArg_);
          bitField0_ = (bitField0_ & ~0x00000002);
        }
        result.outputArg_ = outputArg_;
      } else {
        result.outputArg_ = outputArgBuilder_.build();
      }
      if (((bitField0_ & 0x00000004) != 0)) {
        controlOutput_ = controlOutput_.getUnmodifiableView();
        bitField0_ = (bitField0_ & ~0x00000004);
      }
      result.controlOutput_ = controlOutput_;
      if (attrBuilder_ == null) {
        if (((bitField0_ & 0x00000008) != 0)) {
          attr_ = java.util.Collections.unmodifiableList(attr_);
          bitField0_ = (bitField0_ & ~0x00000008);
        }
        result.attr_ = attr_;
      } else {
        result.attr_ = attrBuilder_.build();
      }
      if (deprecationBuilder_ == null) {
        result.deprecation_ = deprecation_;
      } else {
        result.deprecation_ = deprecationBuilder_.build();
      }
      result.summary_ = summary_;
      result.description_ = description_;
      result.isCommutative_ = isCommutative_;
      result.isAggregate_ = isAggregate_;
      result.isStateful_ = isStateful_;
      result.allowsUninitializedInput_ = allowsUninitializedInput_;
      onBuilt();
      return result;
    }

    @Override
    public Builder clone() {
      return super.clone();
    }

    @Override
    public Builder setField(
        com.google.protobuf.Descriptors.FieldDescriptor field,
        Object value) {
      return super.setField(field, value);
    }

    @Override
    public Builder clearField(
        com.google.protobuf.Descriptors.FieldDescriptor field) {
      return super.clearField(field);
    }

    @Override
    public Builder clearOneof(
        com.google.protobuf.Descriptors.OneofDescriptor oneof) {
      return super.clearOneof(oneof);
    }

    @Override
    public Builder setRepeatedField(
        com.google.protobuf.Descriptors.FieldDescriptor field,
        int index, Object value) {
      return super.setRepeatedField(field, index, value);
    }

    @Override
    public Builder addRepeatedField(
        com.google.protobuf.Descriptors.FieldDescriptor field,
        Object value) {
      return super.addRepeatedField(field, value);
    }

    @Override
    public Builder mergeFrom(com.google.protobuf.Message other) {
      if (other instanceof OpDef) {
        return mergeFrom((OpDef) other);
      } else {
        super.mergeFrom(other);
        return this;
      }
    }

    public Builder mergeFrom(OpDef other) {
      if (other == OpDef.getDefaultInstance()) {
        return this;
      }
      if (!other.getName().isEmpty()) {
        name_ = other.name_;
        onChanged();
      }
      if (inputArgBuilder_ == null) {
        if (!other.inputArg_.isEmpty()) {
          if (inputArg_.isEmpty()) {
            inputArg_ = other.inputArg_;
            bitField0_ = (bitField0_ & ~0x00000001);
          } else {
            ensureInputArgIsMutable();
            inputArg_.addAll(other.inputArg_);
          }
          onChanged();
        }
      } else {
        if (!other.inputArg_.isEmpty()) {
          if (inputArgBuilder_.isEmpty()) {
            inputArgBuilder_.dispose();
            inputArgBuilder_ = null;
            inputArg_ = other.inputArg_;
            bitField0_ = (bitField0_ & ~0x00000001);
            inputArgBuilder_ =
                com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders ?
                    getInputArgFieldBuilder() : null;
          } else {
            inputArgBuilder_.addAllMessages(other.inputArg_);
          }
        }
      }
      if (outputArgBuilder_ == null) {
        if (!other.outputArg_.isEmpty()) {
          if (outputArg_.isEmpty()) {
            outputArg_ = other.outputArg_;
            bitField0_ = (bitField0_ & ~0x00000002);
          } else {
            ensureOutputArgIsMutable();
            outputArg_.addAll(other.outputArg_);
          }
          onChanged();
        }
      } else {
        if (!other.outputArg_.isEmpty()) {
          if (outputArgBuilder_.isEmpty()) {
            outputArgBuilder_.dispose();
            outputArgBuilder_ = null;
            outputArg_ = other.outputArg_;
            bitField0_ = (bitField0_ & ~0x00000002);
            outputArgBuilder_ =
                com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders ?
                    getOutputArgFieldBuilder() : null;
          } else {
            outputArgBuilder_.addAllMessages(other.outputArg_);
          }
        }
      }
      if (!other.controlOutput_.isEmpty()) {
        if (controlOutput_.isEmpty()) {
          controlOutput_ = other.controlOutput_;
          bitField0_ = (bitField0_ & ~0x00000004);
        } else {
          ensureControlOutputIsMutable();
          controlOutput_.addAll(other.controlOutput_);
        }
        onChanged();
      }
      if (attrBuilder_ == null) {
        if (!other.attr_.isEmpty()) {
          if (attr_.isEmpty()) {
            attr_ = other.attr_;
            bitField0_ = (bitField0_ & ~0x00000008);
          } else {
            ensureAttrIsMutable();
            attr_.addAll(other.attr_);
          }
          onChanged();
        }
      } else {
        if (!other.attr_.isEmpty()) {
          if (attrBuilder_.isEmpty()) {
            attrBuilder_.dispose();
            attrBuilder_ = null;
            attr_ = other.attr_;
            bitField0_ = (bitField0_ & ~0x00000008);
            attrBuilder_ =
                com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders ?
                    getAttrFieldBuilder() : null;
          } else {
            attrBuilder_.addAllMessages(other.attr_);
          }
        }
      }
      if (other.hasDeprecation()) {
        mergeDeprecation(other.getDeprecation());
      }
      if (!other.getSummary().isEmpty()) {
        summary_ = other.summary_;
        onChanged();
      }
      if (!other.getDescription().isEmpty()) {
        description_ = other.description_;
        onChanged();
      }
      if (other.getIsCommutative() != false) {
        setIsCommutative(other.getIsCommutative());
      }
      if (other.getIsAggregate() != false) {
        setIsAggregate(other.getIsAggregate());
      }
      if (other.getIsStateful() != false) {
        setIsStateful(other.getIsStateful());
      }
      if (other.getAllowsUninitializedInput() != false) {
        setAllowsUninitializedInput(other.getAllowsUninitializedInput());
      }
      this.mergeUnknownFields(other.unknownFields);
      onChanged();
      return this;
    }

    @Override
    public final boolean isInitialized() {
      return true;
    }

    @Override
    public Builder mergeFrom(
        com.google.protobuf.CodedInputStream input,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws java.io.IOException {
      OpDef parsedMessage = null;
      try {
        parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
      } catch (com.google.protobuf.InvalidProtocolBufferException e) {
        parsedMessage = (OpDef) e.getUnfinishedMessage();
        throw e.unwrapIOException();
      } finally {
        if (parsedMessage != null) {
          mergeFrom(parsedMessage);
        }
      }
      return this;
    }

    private int bitField0_;

    private Object name_ = "";

    /**
     * <pre>
     * Op names starting with an underscore are reserved for internal use.
     * Names should be CamelCase and match the regexp "[A-Z][a-zA-Z0-9&gt;_]*".
     * </pre>
     *
     * <code>string name = 1;</code>
     */
    public String getName() {
      Object ref = name_;
      if (!(ref instanceof String)) {
        com.google.protobuf.ByteString bs =
            (com.google.protobuf.ByteString) ref;
        String s = bs.toStringUtf8();
        name_ = s;
        return s;
      } else {
        return (String) ref;
      }
    }

    /**
     * <pre>
     * Op names starting with an underscore are reserved for internal use.
     * Names should be CamelCase and match the regexp "[A-Z][a-zA-Z0-9&gt;_]*".
     * </pre>
     *
     * <code>string name = 1;</code>
     */
    public com.google.protobuf.ByteString
    getNameBytes() {
      Object ref = name_;
      if (ref instanceof String) {
        com.google.protobuf.ByteString b =
            com.google.protobuf.ByteString.copyFromUtf8(
                (String) ref);
        name_ = b;
        return b;
      } else {
        return (com.google.protobuf.ByteString) ref;
      }
    }

    /**
     * <pre>
     * Op names starting with an underscore are reserved for internal use.
     * Names should be CamelCase and match the regexp "[A-Z][a-zA-Z0-9&gt;_]*".
     * </pre>
     *
     * <code>string name = 1;</code>
     */
    public Builder setName(
        String value) {
      if (value == null) {
        throw new NullPointerException();
      }

      name_ = value;
      onChanged();
      return this;
    }

    /**
     * <pre>
     * Op names starting with an underscore are reserved for internal use.
     * Names should be CamelCase and match the regexp "[A-Z][a-zA-Z0-9&gt;_]*".
     * </pre>
     *
     * <code>string name = 1;</code>
     */
    public Builder clearName() {

      name_ = getDefaultInstance().getName();
      onChanged();
      return this;
    }

    /**
     * <pre>
     * Op names starting with an underscore are reserved for internal use.
     * Names should be CamelCase and match the regexp "[A-Z][a-zA-Z0-9&gt;_]*".
     * </pre>
     *
     * <code>string name = 1;</code>
     */
    public Builder setNameBytes(
        com.google.protobuf.ByteString value) {
      if (value == null) {
        throw new NullPointerException();
      }
      checkByteStringIsUtf8(value);

      name_ = value;
      onChanged();
      return this;
    }

    private java.util.List<ArgDef> inputArg_ =
        java.util.Collections.emptyList();

    private void ensureInputArgIsMutable() {
      if (!((bitField0_ & 0x00000001) != 0)) {
        inputArg_ = new java.util.ArrayList<ArgDef>(inputArg_);
        bitField0_ |= 0x00000001;
      }
    }

    private com.google.protobuf.RepeatedFieldBuilderV3<
        ArgDef, ArgDef.Builder, ArgDefOrBuilder> inputArgBuilder_;

    /**
     * <pre>
     * Description of the input(s).
     * </pre>
     *
     * <code>repeated .tensorflow.OpDef.ArgDef input_arg = 2;</code>
     */
    public java.util.List<ArgDef> getInputArgList() {
      if (inputArgBuilder_ == null) {
        return java.util.Collections.unmodifiableList(inputArg_);
      } else {
        return inputArgBuilder_.getMessageList();
      }
    }

    /**
     * <pre>
     * Description of the input(s).
     * </pre>
     *
     * <code>repeated .tensorflow.OpDef.ArgDef input_arg = 2;</code>
     */
    public int getInputArgCount() {
      if (inputArgBuilder_ == null) {
        return inputArg_.size();
      } else {
        return inputArgBuilder_.getCount();
      }
    }

    /**
     * <pre>
     * Description of the input(s).
     * </pre>
     *
     * <code>repeated .tensorflow.OpDef.ArgDef input_arg = 2;</code>
     */
    public ArgDef getInputArg(int index) {
      if (inputArgBuilder_ == null) {
        return inputArg_.get(index);
      } else {
        return inputArgBuilder_.getMessage(index);
      }
    }

    /**
     * <pre>
     * Description of the input(s).
     * </pre>
     *
     * <code>repeated .tensorflow.OpDef.ArgDef input_arg = 2;</code>
     */
    public Builder setInputArg(
        int index, ArgDef value) {
      if (inputArgBuilder_ == null) {
        if (value == null) {
          throw new NullPointerException();
        }
        ensureInputArgIsMutable();
        inputArg_.set(index, value);
        onChanged();
      } else {
        inputArgBuilder_.setMessage(index, value);
      }
      return this;
    }

    /**
     * <pre>
     * Description of the input(s).
     * </pre>
     *
     * <code>repeated .tensorflow.OpDef.ArgDef input_arg = 2;</code>
     */
    public Builder setInputArg(
        int index, ArgDef.Builder builderForValue) {
      if (inputArgBuilder_ == null) {
        ensureInputArgIsMutable();
        inputArg_.set(index, builderForValue.build());
        onChanged();
      } else {
        inputArgBuilder_.setMessage(index, builderForValue.build());
      }
      return this;
    }

    /**
     * <pre>
     * Description of the input(s).
     * </pre>
     *
     * <code>repeated .tensorflow.OpDef.ArgDef input_arg = 2;</code>
     */
    public Builder addInputArg(ArgDef value) {
      if (inputArgBuilder_ == null) {
        if (value == null) {
          throw new NullPointerException();
        }
        ensureInputArgIsMutable();
        inputArg_.add(value);
        onChanged();
      } else {
        inputArgBuilder_.addMessage(value);
      }
      return this;
    }

    /**
     * <pre>
     * Description of the input(s).
     * </pre>
     *
     * <code>repeated .tensorflow.OpDef.ArgDef input_arg = 2;</code>
     */
    public Builder addInputArg(
        int index, ArgDef value) {
      if (inputArgBuilder_ == null) {
        if (value == null) {
          throw new NullPointerException();
        }
        ensureInputArgIsMutable();
        inputArg_.add(index, value);
        onChanged();
      } else {
        inputArgBuilder_.addMessage(index, value);
      }
      return this;
    }

    /**
     * <pre>
     * Description of the input(s).
     * </pre>
     *
     * <code>repeated .tensorflow.OpDef.ArgDef input_arg = 2;</code>
     */
    public Builder addInputArg(
        ArgDef.Builder builderForValue) {
      if (inputArgBuilder_ == null) {
        ensureInputArgIsMutable();
        inputArg_.add(builderForValue.build());
        onChanged();
      } else {
        inputArgBuilder_.addMessage(builderForValue.build());
      }
      return this;
    }

    /**
     * <pre>
     * Description of the input(s).
     * </pre>
     *
     * <code>repeated .tensorflow.OpDef.ArgDef input_arg = 2;</code>
     */
    public Builder addInputArg(
        int index, ArgDef.Builder builderForValue) {
      if (inputArgBuilder_ == null) {
        ensureInputArgIsMutable();
        inputArg_.add(index, builderForValue.build());
        onChanged();
      } else {
        inputArgBuilder_.addMessage(index, builderForValue.build());
      }
      return this;
    }

    /**
     * <pre>
     * Description of the input(s).
     * </pre>
     *
     * <code>repeated .tensorflow.OpDef.ArgDef input_arg = 2;</code>
     */
    public Builder addAllInputArg(
        Iterable<? extends ArgDef> values) {
      if (inputArgBuilder_ == null) {
        ensureInputArgIsMutable();
        com.google.protobuf.AbstractMessageLite.Builder.addAll(
            values, inputArg_);
        onChanged();
      } else {
        inputArgBuilder_.addAllMessages(values);
      }
      return this;
    }

    /**
     * <pre>
     * Description of the input(s).
     * </pre>
     *
     * <code>repeated .tensorflow.OpDef.ArgDef input_arg = 2;</code>
     */
    public Builder clearInputArg() {
      if (inputArgBuilder_ == null) {
        inputArg_ = java.util.Collections.emptyList();
        bitField0_ = (bitField0_ & ~0x00000001);
        onChanged();
      } else {
        inputArgBuilder_.clear();
      }
      return this;
    }

    /**
     * <pre>
     * Description of the input(s).
     * </pre>
     *
     * <code>repeated .tensorflow.OpDef.ArgDef input_arg = 2;</code>
     */
    public Builder removeInputArg(int index) {
      if (inputArgBuilder_ == null) {
        ensureInputArgIsMutable();
        inputArg_.remove(index);
        onChanged();
      } else {
        inputArgBuilder_.remove(index);
      }
      return this;
    }

    /**
     * <pre>
     * Description of the input(s).
     * </pre>
     *
     * <code>repeated .tensorflow.OpDef.ArgDef input_arg = 2;</code>
     */
    public ArgDef.Builder getInputArgBuilder(
        int index) {
      return getInputArgFieldBuilder().getBuilder(index);
    }

    /**
     * <pre>
     * Description of the input(s).
     * </pre>
     *
     * <code>repeated .tensorflow.OpDef.ArgDef input_arg = 2;</code>
     */
    public ArgDefOrBuilder getInputArgOrBuilder(
        int index) {
      if (inputArgBuilder_ == null) {
        return inputArg_.get(index);
      } else {
        return inputArgBuilder_.getMessageOrBuilder(index);
      }
    }

    /**
     * <pre>
     * Description of the input(s).
     * </pre>
     *
     * <code>repeated .tensorflow.OpDef.ArgDef input_arg = 2;</code>
     */
    public java.util.List<? extends ArgDefOrBuilder>
    getInputArgOrBuilderList() {
      if (inputArgBuilder_ != null) {
        return inputArgBuilder_.getMessageOrBuilderList();
      } else {
        return java.util.Collections.unmodifiableList(inputArg_);
      }
    }

    /**
     * <pre>
     * Description of the input(s).
     * </pre>
     *
     * <code>repeated .tensorflow.OpDef.ArgDef input_arg = 2;</code>
     */
    public ArgDef.Builder addInputArgBuilder() {
      return getInputArgFieldBuilder().addBuilder(
          ArgDef.getDefaultInstance());
    }

    /**
     * <pre>
     * Description of the input(s).
     * </pre>
     *
     * <code>repeated .tensorflow.OpDef.ArgDef input_arg = 2;</code>
     */
    public ArgDef.Builder addInputArgBuilder(
        int index) {
      return getInputArgFieldBuilder().addBuilder(
          index, ArgDef.getDefaultInstance());
    }

    /**
     * <pre>
     * Description of the input(s).
     * </pre>
     *
     * <code>repeated .tensorflow.OpDef.ArgDef input_arg = 2;</code>
     */
    public java.util.List<ArgDef.Builder>
    getInputArgBuilderList() {
      return getInputArgFieldBuilder().getBuilderList();
    }

    private com.google.protobuf.RepeatedFieldBuilderV3<
        ArgDef, ArgDef.Builder, ArgDefOrBuilder>
    getInputArgFieldBuilder() {
      if (inputArgBuilder_ == null) {
        inputArgBuilder_ = new com.google.protobuf.RepeatedFieldBuilderV3<
            ArgDef, ArgDef.Builder, ArgDefOrBuilder>(
            inputArg_,
            ((bitField0_ & 0x00000001) != 0),
            getParentForChildren(),
            isClean());
        inputArg_ = null;
      }
      return inputArgBuilder_;
    }

    private java.util.List<ArgDef> outputArg_ =
        java.util.Collections.emptyList();

    private void ensureOutputArgIsMutable() {
      if (!((bitField0_ & 0x00000002) != 0)) {
        outputArg_ = new java.util.ArrayList<ArgDef>(outputArg_);
        bitField0_ |= 0x00000002;
      }
    }

    private com.google.protobuf.RepeatedFieldBuilderV3<
        ArgDef, ArgDef.Builder, ArgDefOrBuilder> outputArgBuilder_;

    /**
     * <pre>
     * Description of the output(s).
     * </pre>
     *
     * <code>repeated .tensorflow.OpDef.ArgDef output_arg = 3;</code>
     */
    public java.util.List<ArgDef> getOutputArgList() {
      if (outputArgBuilder_ == null) {
        return java.util.Collections.unmodifiableList(outputArg_);
      } else {
        return outputArgBuilder_.getMessageList();
      }
    }

    /**
     * <pre>
     * Description of the output(s).
     * </pre>
     *
     * <code>repeated .tensorflow.OpDef.ArgDef output_arg = 3;</code>
     */
    public int getOutputArgCount() {
      if (outputArgBuilder_ == null) {
        return outputArg_.size();
      } else {
        return outputArgBuilder_.getCount();
      }
    }

    /**
     * <pre>
     * Description of the output(s).
     * </pre>
     *
     * <code>repeated .tensorflow.OpDef.ArgDef output_arg = 3;</code>
     */
    public ArgDef getOutputArg(int index) {
      if (outputArgBuilder_ == null) {
        return outputArg_.get(index);
      } else {
        return outputArgBuilder_.getMessage(index);
      }
    }

    /**
     * <pre>
     * Description of the output(s).
     * </pre>
     *
     * <code>repeated .tensorflow.OpDef.ArgDef output_arg = 3;</code>
     */
    public Builder setOutputArg(
        int index, ArgDef value) {
      if (outputArgBuilder_ == null) {
        if (value == null) {
          throw new NullPointerException();
        }
        ensureOutputArgIsMutable();
        outputArg_.set(index, value);
        onChanged();
      } else {
        outputArgBuilder_.setMessage(index, value);
      }
      return this;
    }

    /**
     * <pre>
     * Description of the output(s).
     * </pre>
     *
     * <code>repeated .tensorflow.OpDef.ArgDef output_arg = 3;</code>
     */
    public Builder setOutputArg(
        int index, ArgDef.Builder builderForValue) {
      if (outputArgBuilder_ == null) {
        ensureOutputArgIsMutable();
        outputArg_.set(index, builderForValue.build());
        onChanged();
      } else {
        outputArgBuilder_.setMessage(index, builderForValue.build());
      }
      return this;
    }

    /**
     * <pre>
     * Description of the output(s).
     * </pre>
     *
     * <code>repeated .tensorflow.OpDef.ArgDef output_arg = 3;</code>
     */
    public Builder addOutputArg(ArgDef value) {
      if (outputArgBuilder_ == null) {
        if (value == null) {
          throw new NullPointerException();
        }
        ensureOutputArgIsMutable();
        outputArg_.add(value);
        onChanged();
      } else {
        outputArgBuilder_.addMessage(value);
      }
      return this;
    }

    /**
     * <pre>
     * Description of the output(s).
     * </pre>
     *
     * <code>repeated .tensorflow.OpDef.ArgDef output_arg = 3;</code>
     */
    public Builder addOutputArg(
        int index, ArgDef value) {
      if (outputArgBuilder_ == null) {
        if (value == null) {
          throw new NullPointerException();
        }
        ensureOutputArgIsMutable();
        outputArg_.add(index, value);
        onChanged();
      } else {
        outputArgBuilder_.addMessage(index, value);
      }
      return this;
    }

    /**
     * <pre>
     * Description of the output(s).
     * </pre>
     *
     * <code>repeated .tensorflow.OpDef.ArgDef output_arg = 3;</code>
     */
    public Builder addOutputArg(
        ArgDef.Builder builderForValue) {
      if (outputArgBuilder_ == null) {
        ensureOutputArgIsMutable();
        outputArg_.add(builderForValue.build());
        onChanged();
      } else {
        outputArgBuilder_.addMessage(builderForValue.build());
      }
      return this;
    }

    /**
     * <pre>
     * Description of the output(s).
     * </pre>
     *
     * <code>repeated .tensorflow.OpDef.ArgDef output_arg = 3;</code>
     */
    public Builder addOutputArg(
        int index, ArgDef.Builder builderForValue) {
      if (outputArgBuilder_ == null) {
        ensureOutputArgIsMutable();
        outputArg_.add(index, builderForValue.build());
        onChanged();
      } else {
        outputArgBuilder_.addMessage(index, builderForValue.build());
      }
      return this;
    }

    /**
     * <pre>
     * Description of the output(s).
     * </pre>
     *
     * <code>repeated .tensorflow.OpDef.ArgDef output_arg = 3;</code>
     */
    public Builder addAllOutputArg(
        Iterable<? extends ArgDef> values) {
      if (outputArgBuilder_ == null) {
        ensureOutputArgIsMutable();
        com.google.protobuf.AbstractMessageLite.Builder.addAll(
            values, outputArg_);
        onChanged();
      } else {
        outputArgBuilder_.addAllMessages(values);
      }
      return this;
    }

    /**
     * <pre>
     * Description of the output(s).
     * </pre>
     *
     * <code>repeated .tensorflow.OpDef.ArgDef output_arg = 3;</code>
     */
    public Builder clearOutputArg() {
      if (outputArgBuilder_ == null) {
        outputArg_ = java.util.Collections.emptyList();
        bitField0_ = (bitField0_ & ~0x00000002);
        onChanged();
      } else {
        outputArgBuilder_.clear();
      }
      return this;
    }

    /**
     * <pre>
     * Description of the output(s).
     * </pre>
     *
     * <code>repeated .tensorflow.OpDef.ArgDef output_arg = 3;</code>
     */
    public Builder removeOutputArg(int index) {
      if (outputArgBuilder_ == null) {
        ensureOutputArgIsMutable();
        outputArg_.remove(index);
        onChanged();
      } else {
        outputArgBuilder_.remove(index);
      }
      return this;
    }

    /**
     * <pre>
     * Description of the output(s).
     * </pre>
     *
     * <code>repeated .tensorflow.OpDef.ArgDef output_arg = 3;</code>
     */
    public ArgDef.Builder getOutputArgBuilder(
        int index) {
      return getOutputArgFieldBuilder().getBuilder(index);
    }

    /**
     * <pre>
     * Description of the output(s).
     * </pre>
     *
     * <code>repeated .tensorflow.OpDef.ArgDef output_arg = 3;</code>
     */
    public ArgDefOrBuilder getOutputArgOrBuilder(
        int index) {
      if (outputArgBuilder_ == null) {
        return outputArg_.get(index);
      } else {
        return outputArgBuilder_.getMessageOrBuilder(index);
      }
    }

    /**
     * <pre>
     * Description of the output(s).
     * </pre>
     *
     * <code>repeated .tensorflow.OpDef.ArgDef output_arg = 3;</code>
     */
    public java.util.List<? extends ArgDefOrBuilder>
    getOutputArgOrBuilderList() {
      if (outputArgBuilder_ != null) {
        return outputArgBuilder_.getMessageOrBuilderList();
      } else {
        return java.util.Collections.unmodifiableList(outputArg_);
      }
    }

    /**
     * <pre>
     * Description of the output(s).
     * </pre>
     *
     * <code>repeated .tensorflow.OpDef.ArgDef output_arg = 3;</code>
     */
    public ArgDef.Builder addOutputArgBuilder() {
      return getOutputArgFieldBuilder().addBuilder(
          ArgDef.getDefaultInstance());
    }

    /**
     * <pre>
     * Description of the output(s).
     * </pre>
     *
     * <code>repeated .tensorflow.OpDef.ArgDef output_arg = 3;</code>
     */
    public ArgDef.Builder addOutputArgBuilder(
        int index) {
      return getOutputArgFieldBuilder().addBuilder(
          index, ArgDef.getDefaultInstance());
    }

    /**
     * <pre>
     * Description of the output(s).
     * </pre>
     *
     * <code>repeated .tensorflow.OpDef.ArgDef output_arg = 3;</code>
     */
    public java.util.List<ArgDef.Builder>
    getOutputArgBuilderList() {
      return getOutputArgFieldBuilder().getBuilderList();
    }

    private com.google.protobuf.RepeatedFieldBuilderV3<
        ArgDef, ArgDef.Builder, ArgDefOrBuilder>
    getOutputArgFieldBuilder() {
      if (outputArgBuilder_ == null) {
        outputArgBuilder_ = new com.google.protobuf.RepeatedFieldBuilderV3<
            ArgDef, ArgDef.Builder, ArgDefOrBuilder>(
            outputArg_,
            ((bitField0_ & 0x00000002) != 0),
            getParentForChildren(),
            isClean());
        outputArg_ = null;
      }
      return outputArgBuilder_;
    }

    private com.google.protobuf.LazyStringList controlOutput_ = com.google.protobuf.LazyStringArrayList.EMPTY;

    private void ensureControlOutputIsMutable() {
      if (!((bitField0_ & 0x00000004) != 0)) {
        controlOutput_ = new com.google.protobuf.LazyStringArrayList(controlOutput_);
        bitField0_ |= 0x00000004;
      }
    }

    /**
     * <pre>
     * Named control outputs for this operation. Useful only for composite
     * operations (i.e. functions) which want to name different control outputs.
     * </pre>
     *
     * <code>repeated string control_output = 20;</code>
     */
    public com.google.protobuf.ProtocolStringList
    getControlOutputList() {
      return controlOutput_.getUnmodifiableView();
    }

    /**
     * <pre>
     * Named control outputs for this operation. Useful only for composite
     * operations (i.e. functions) which want to name different control outputs.
     * </pre>
     *
     * <code>repeated string control_output = 20;</code>
     */
    public int getControlOutputCount() {
      return controlOutput_.size();
    }

    /**
     * <pre>
     * Named control outputs for this operation. Useful only for composite
     * operations (i.e. functions) which want to name different control outputs.
     * </pre>
     *
     * <code>repeated string control_output = 20;</code>
     */
    public String getControlOutput(int index) {
      return controlOutput_.get(index);
    }

    /**
     * <pre>
     * Named control outputs for this operation. Useful only for composite
     * operations (i.e. functions) which want to name different control outputs.
     * </pre>
     *
     * <code>repeated string control_output = 20;</code>
     */
    public com.google.protobuf.ByteString
    getControlOutputBytes(int index) {
      return controlOutput_.getByteString(index);
    }

    /**
     * <pre>
     * Named control outputs for this operation. Useful only for composite
     * operations (i.e. functions) which want to name different control outputs.
     * </pre>
     *
     * <code>repeated string control_output = 20;</code>
     */
    public Builder setControlOutput(
        int index, String value) {
      if (value == null) {
        throw new NullPointerException();
      }
      ensureControlOutputIsMutable();
      controlOutput_.set(index, value);
      onChanged();
      return this;
    }

    /**
     * <pre>
     * Named control outputs for this operation. Useful only for composite
     * operations (i.e. functions) which want to name different control outputs.
     * </pre>
     *
     * <code>repeated string control_output = 20;</code>
     */
    public Builder addControlOutput(
        String value) {
      if (value == null) {
        throw new NullPointerException();
      }
      ensureControlOutputIsMutable();
      controlOutput_.add(value);
      onChanged();
      return this;
    }

    /**
     * <pre>
     * Named control outputs for this operation. Useful only for composite
     * operations (i.e. functions) which want to name different control outputs.
     * </pre>
     *
     * <code>repeated string control_output = 20;</code>
     */
    public Builder addAllControlOutput(
        Iterable<String> values) {
      ensureControlOutputIsMutable();
      com.google.protobuf.AbstractMessageLite.Builder.addAll(
          values, controlOutput_);
      onChanged();
      return this;
    }

    /**
     * <pre>
     * Named control outputs for this operation. Useful only for composite
     * operations (i.e. functions) which want to name different control outputs.
     * </pre>
     *
     * <code>repeated string control_output = 20;</code>
     */
    public Builder clearControlOutput() {
      controlOutput_ = com.google.protobuf.LazyStringArrayList.EMPTY;
      bitField0_ = (bitField0_ & ~0x00000004);
      onChanged();
      return this;
    }

    /**
     * <pre>
     * Named control outputs for this operation. Useful only for composite
     * operations (i.e. functions) which want to name different control outputs.
     * </pre>
     *
     * <code>repeated string control_output = 20;</code>
     */
    public Builder addControlOutputBytes(
        com.google.protobuf.ByteString value) {
      if (value == null) {
        throw new NullPointerException();
      }
      checkByteStringIsUtf8(value);
      ensureControlOutputIsMutable();
      controlOutput_.add(value);
      onChanged();
      return this;
    }

    private java.util.List<AttrDef> attr_ =
        java.util.Collections.emptyList();

    private void ensureAttrIsMutable() {
      if (!((bitField0_ & 0x00000008) != 0)) {
        attr_ = new java.util.ArrayList<AttrDef>(attr_);
        bitField0_ |= 0x00000008;
      }
    }

    private com.google.protobuf.RepeatedFieldBuilderV3<
        AttrDef, AttrDef.Builder, AttrDefOrBuilder> attrBuilder_;

    /**
     * <code>repeated .tensorflow.OpDef.AttrDef attr = 4;</code>
     */
    public java.util.List<AttrDef> getAttrList() {
      if (attrBuilder_ == null) {
        return java.util.Collections.unmodifiableList(attr_);
      } else {
        return attrBuilder_.getMessageList();
      }
    }

    /**
     * <code>repeated .tensorflow.OpDef.AttrDef attr = 4;</code>
     */
    public int getAttrCount() {
      if (attrBuilder_ == null) {
        return attr_.size();
      } else {
        return attrBuilder_.getCount();
      }
    }

    /**
     * <code>repeated .tensorflow.OpDef.AttrDef attr = 4;</code>
     */
    public AttrDef getAttr(int index) {
      if (attrBuilder_ == null) {
        return attr_.get(index);
      } else {
        return attrBuilder_.getMessage(index);
      }
    }

    /**
     * <code>repeated .tensorflow.OpDef.AttrDef attr = 4;</code>
     */
    public Builder setAttr(
        int index, AttrDef value) {
      if (attrBuilder_ == null) {
        if (value == null) {
          throw new NullPointerException();
        }
        ensureAttrIsMutable();
        attr_.set(index, value);
        onChanged();
      } else {
        attrBuilder_.setMessage(index, value);
      }
      return this;
    }

    /**
     * <code>repeated .tensorflow.OpDef.AttrDef attr = 4;</code>
     */
    public Builder setAttr(
        int index, AttrDef.Builder builderForValue) {
      if (attrBuilder_ == null) {
        ensureAttrIsMutable();
        attr_.set(index, builderForValue.build());
        onChanged();
      } else {
        attrBuilder_.setMessage(index, builderForValue.build());
      }
      return this;
    }

    /**
     * <code>repeated .tensorflow.OpDef.AttrDef attr = 4;</code>
     */
    public Builder addAttr(AttrDef value) {
      if (attrBuilder_ == null) {
        if (value == null) {
          throw new NullPointerException();
        }
        ensureAttrIsMutable();
        attr_.add(value);
        onChanged();
      } else {
        attrBuilder_.addMessage(value);
      }
      return this;
    }

    /**
     * <code>repeated .tensorflow.OpDef.AttrDef attr = 4;</code>
     */
    public Builder addAttr(
        int index, AttrDef value) {
      if (attrBuilder_ == null) {
        if (value == null) {
          throw new NullPointerException();
        }
        ensureAttrIsMutable();
        attr_.add(index, value);
        onChanged();
      } else {
        attrBuilder_.addMessage(index, value);
      }
      return this;
    }

    /**
     * <code>repeated .tensorflow.OpDef.AttrDef attr = 4;</code>
     */
    public Builder addAttr(
        AttrDef.Builder builderForValue) {
      if (attrBuilder_ == null) {
        ensureAttrIsMutable();
        attr_.add(builderForValue.build());
        onChanged();
      } else {
        attrBuilder_.addMessage(builderForValue.build());
      }
      return this;
    }

    /**
     * <code>repeated .tensorflow.OpDef.AttrDef attr = 4;</code>
     */
    public Builder addAttr(
        int index, AttrDef.Builder builderForValue) {
      if (attrBuilder_ == null) {
        ensureAttrIsMutable();
        attr_.add(index, builderForValue.build());
        onChanged();
      } else {
        attrBuilder_.addMessage(index, builderForValue.build());
      }
      return this;
    }

    /**
     * <code>repeated .tensorflow.OpDef.AttrDef attr = 4;</code>
     */
    public Builder addAllAttr(
        Iterable<? extends AttrDef> values) {
      if (attrBuilder_ == null) {
        ensureAttrIsMutable();
        com.google.protobuf.AbstractMessageLite.Builder.addAll(
            values, attr_);
        onChanged();
      } else {
        attrBuilder_.addAllMessages(values);
      }
      return this;
    }

    /**
     * <code>repeated .tensorflow.OpDef.AttrDef attr = 4;</code>
     */
    public Builder clearAttr() {
      if (attrBuilder_ == null) {
        attr_ = java.util.Collections.emptyList();
        bitField0_ = (bitField0_ & ~0x00000008);
        onChanged();
      } else {
        attrBuilder_.clear();
      }
      return this;
    }

    /**
     * <code>repeated .tensorflow.OpDef.AttrDef attr = 4;</code>
     */
    public Builder removeAttr(int index) {
      if (attrBuilder_ == null) {
        ensureAttrIsMutable();
        attr_.remove(index);
        onChanged();
      } else {
        attrBuilder_.remove(index);
      }
      return this;
    }

    /**
     * <code>repeated .tensorflow.OpDef.AttrDef attr = 4;</code>
     */
    public AttrDef.Builder getAttrBuilder(
        int index) {
      return getAttrFieldBuilder().getBuilder(index);
    }

    /**
     * <code>repeated .tensorflow.OpDef.AttrDef attr = 4;</code>
     */
    public AttrDefOrBuilder getAttrOrBuilder(
        int index) {
      if (attrBuilder_ == null) {
        return attr_.get(index);
      } else {
        return attrBuilder_.getMessageOrBuilder(index);
      }
    }

    /**
     * <code>repeated .tensorflow.OpDef.AttrDef attr = 4;</code>
     */
    public java.util.List<? extends AttrDefOrBuilder>
    getAttrOrBuilderList() {
      if (attrBuilder_ != null) {
        return attrBuilder_.getMessageOrBuilderList();
      } else {
        return java.util.Collections.unmodifiableList(attr_);
      }
    }

    /**
     * <code>repeated .tensorflow.OpDef.AttrDef attr = 4;</code>
     */
    public AttrDef.Builder addAttrBuilder() {
      return getAttrFieldBuilder().addBuilder(
          AttrDef.getDefaultInstance());
    }

    /**
     * <code>repeated .tensorflow.OpDef.AttrDef attr = 4;</code>
     */
    public AttrDef.Builder addAttrBuilder(
        int index) {
      return getAttrFieldBuilder().addBuilder(
          index, AttrDef.getDefaultInstance());
    }

    /**
     * <code>repeated .tensorflow.OpDef.AttrDef attr = 4;</code>
     */
    public java.util.List<AttrDef.Builder>
    getAttrBuilderList() {
      return getAttrFieldBuilder().getBuilderList();
    }

    private com.google.protobuf.RepeatedFieldBuilderV3<
        AttrDef, AttrDef.Builder, AttrDefOrBuilder>
    getAttrFieldBuilder() {
      if (attrBuilder_ == null) {
        attrBuilder_ = new com.google.protobuf.RepeatedFieldBuilderV3<
            AttrDef, AttrDef.Builder, AttrDefOrBuilder>(
            attr_,
            ((bitField0_ & 0x00000008) != 0),
            getParentForChildren(),
            isClean());
        attr_ = null;
      }
      return attrBuilder_;
    }

    private OpDeprecation deprecation_;
    private com.google.protobuf.SingleFieldBuilderV3<
        OpDeprecation, OpDeprecation.Builder, OpDeprecationOrBuilder> deprecationBuilder_;

    /**
     * <pre>
     * Optional deprecation based on GraphDef versions.
     * </pre>
     *
     * <code>.tensorflow.OpDeprecation deprecation = 8;</code>
     */
    public boolean hasDeprecation() {
      return deprecationBuilder_ != null || deprecation_ != null;
    }

    /**
     * <pre>
     * Optional deprecation based on GraphDef versions.
     * </pre>
     *
     * <code>.tensorflow.OpDeprecation deprecation = 8;</code>
     */
    public OpDeprecation getDeprecation() {
      if (deprecationBuilder_ == null) {
        return deprecation_ == null ? OpDeprecation.getDefaultInstance() : deprecation_;
      } else {
        return deprecationBuilder_.getMessage();
      }
    }

    /**
     * <pre>
     * Optional deprecation based on GraphDef versions.
     * </pre>
     *
     * <code>.tensorflow.OpDeprecation deprecation = 8;</code>
     */
    public Builder setDeprecation(OpDeprecation value) {
      if (deprecationBuilder_ == null) {
        if (value == null) {
          throw new NullPointerException();
        }
        deprecation_ = value;
        onChanged();
      } else {
        deprecationBuilder_.setMessage(value);
      }

      return this;
    }

    /**
     * <pre>
     * Optional deprecation based on GraphDef versions.
     * </pre>
     *
     * <code>.tensorflow.OpDeprecation deprecation = 8;</code>
     */
    public Builder setDeprecation(
        OpDeprecation.Builder builderForValue) {
      if (deprecationBuilder_ == null) {
        deprecation_ = builderForValue.build();
        onChanged();
      } else {
        deprecationBuilder_.setMessage(builderForValue.build());
      }

      return this;
    }

    /**
     * <pre>
     * Optional deprecation based on GraphDef versions.
     * </pre>
     *
     * <code>.tensorflow.OpDeprecation deprecation = 8;</code>
     */
    public Builder mergeDeprecation(OpDeprecation value) {
      if (deprecationBuilder_ == null) {
        if (deprecation_ != null) {
          deprecation_ =
              OpDeprecation.newBuilder(deprecation_).mergeFrom(value).buildPartial();
        } else {
          deprecation_ = value;
        }
        onChanged();
      } else {
        deprecationBuilder_.mergeFrom(value);
      }

      return this;
    }

    /**
     * <pre>
     * Optional deprecation based on GraphDef versions.
     * </pre>
     *
     * <code>.tensorflow.OpDeprecation deprecation = 8;</code>
     */
    public Builder clearDeprecation() {
      if (deprecationBuilder_ == null) {
        deprecation_ = null;
        onChanged();
      } else {
        deprecation_ = null;
        deprecationBuilder_ = null;
      }

      return this;
    }

    /**
     * <pre>
     * Optional deprecation based on GraphDef versions.
     * </pre>
     *
     * <code>.tensorflow.OpDeprecation deprecation = 8;</code>
     */
    public OpDeprecation.Builder getDeprecationBuilder() {

      onChanged();
      return getDeprecationFieldBuilder().getBuilder();
    }

    /**
     * <pre>
     * Optional deprecation based on GraphDef versions.
     * </pre>
     *
     * <code>.tensorflow.OpDeprecation deprecation = 8;</code>
     */
    public OpDeprecationOrBuilder getDeprecationOrBuilder() {
      if (deprecationBuilder_ != null) {
        return deprecationBuilder_.getMessageOrBuilder();
      } else {
        return deprecation_ == null ?
            OpDeprecation.getDefaultInstance() : deprecation_;
      }
    }

    /**
     * <pre>
     * Optional deprecation based on GraphDef versions.
     * </pre>
     *
     * <code>.tensorflow.OpDeprecation deprecation = 8;</code>
     */
    private com.google.protobuf.SingleFieldBuilderV3<
        OpDeprecation, OpDeprecation.Builder, OpDeprecationOrBuilder>
    getDeprecationFieldBuilder() {
      if (deprecationBuilder_ == null) {
        deprecationBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
            OpDeprecation, OpDeprecation.Builder, OpDeprecationOrBuilder>(
            getDeprecation(),
            getParentForChildren(),
            isClean());
        deprecation_ = null;
      }
      return deprecationBuilder_;
    }

    private Object summary_ = "";

    /**
     * <pre>
     * One-line human-readable description of what the Op does.
     * </pre>
     *
     * <code>string summary = 5;</code>
     */
    public String getSummary() {
      Object ref = summary_;
      if (!(ref instanceof String)) {
        com.google.protobuf.ByteString bs =
            (com.google.protobuf.ByteString) ref;
        String s = bs.toStringUtf8();
        summary_ = s;
        return s;
      } else {
        return (String) ref;
      }
    }

    /**
     * <pre>
     * One-line human-readable description of what the Op does.
     * </pre>
     *
     * <code>string summary = 5;</code>
     */
    public com.google.protobuf.ByteString
    getSummaryBytes() {
      Object ref = summary_;
      if (ref instanceof String) {
        com.google.protobuf.ByteString b =
            com.google.protobuf.ByteString.copyFromUtf8(
                (String) ref);
        summary_ = b;
        return b;
      } else {
        return (com.google.protobuf.ByteString) ref;
      }
    }

    /**
     * <pre>
     * One-line human-readable description of what the Op does.
     * </pre>
     *
     * <code>string summary = 5;</code>
     */
    public Builder setSummary(
        String value) {
      if (value == null) {
        throw new NullPointerException();
      }

      summary_ = value;
      onChanged();
      return this;
    }

    /**
     * <pre>
     * One-line human-readable description of what the Op does.
     * </pre>
     *
     * <code>string summary = 5;</code>
     */
    public Builder clearSummary() {

      summary_ = getDefaultInstance().getSummary();
      onChanged();
      return this;
    }

    /**
     * <pre>
     * One-line human-readable description of what the Op does.
     * </pre>
     *
     * <code>string summary = 5;</code>
     */
    public Builder setSummaryBytes(
        com.google.protobuf.ByteString value) {
      if (value == null) {
        throw new NullPointerException();
      }
      checkByteStringIsUtf8(value);

      summary_ = value;
      onChanged();
      return this;
    }

    private Object description_ = "";

    /**
     * <pre>
     * Additional, longer human-readable description of what the Op does.
     * </pre>
     *
     * <code>string description = 6;</code>
     */
    public String getDescription() {
      Object ref = description_;
      if (!(ref instanceof String)) {
        com.google.protobuf.ByteString bs =
            (com.google.protobuf.ByteString) ref;
        String s = bs.toStringUtf8();
        description_ = s;
        return s;
      } else {
        return (String) ref;
      }
    }

    /**
     * <pre>
     * Additional, longer human-readable description of what the Op does.
     * </pre>
     *
     * <code>string description = 6;</code>
     */
    public com.google.protobuf.ByteString
    getDescriptionBytes() {
      Object ref = description_;
      if (ref instanceof String) {
        com.google.protobuf.ByteString b =
            com.google.protobuf.ByteString.copyFromUtf8(
                (String) ref);
        description_ = b;
        return b;
      } else {
        return (com.google.protobuf.ByteString) ref;
      }
    }

    /**
     * <pre>
     * Additional, longer human-readable description of what the Op does.
     * </pre>
     *
     * <code>string description = 6;</code>
     */
    public Builder setDescription(
        String value) {
      if (value == null) {
        throw new NullPointerException();
      }

      description_ = value;
      onChanged();
      return this;
    }

    /**
     * <pre>
     * Additional, longer human-readable description of what the Op does.
     * </pre>
     *
     * <code>string description = 6;</code>
     */
    public Builder clearDescription() {

      description_ = getDefaultInstance().getDescription();
      onChanged();
      return this;
    }

    /**
     * <pre>
     * Additional, longer human-readable description of what the Op does.
     * </pre>
     *
     * <code>string description = 6;</code>
     */
    public Builder setDescriptionBytes(
        com.google.protobuf.ByteString value) {
      if (value == null) {
        throw new NullPointerException();
      }
      checkByteStringIsUtf8(value);

      description_ = value;
      onChanged();
      return this;
    }

    private boolean isCommutative_ ;

    /**
     * <pre>
     * True if the operation is commutative ("op(a,b) == op(b,a)" for all inputs)
     * </pre>
     *
     * <code>bool is_commutative = 18;</code>
     */
    public boolean getIsCommutative() {
      return isCommutative_;
    }

    /**
     * <pre>
     * True if the operation is commutative ("op(a,b) == op(b,a)" for all inputs)
     * </pre>
     *
     * <code>bool is_commutative = 18;</code>
     */
    public Builder setIsCommutative(boolean value) {

      isCommutative_ = value;
      onChanged();
      return this;
    }

    /**
     * <pre>
     * True if the operation is commutative ("op(a,b) == op(b,a)" for all inputs)
     * </pre>
     *
     * <code>bool is_commutative = 18;</code>
     */
    public Builder clearIsCommutative() {

      isCommutative_ = false;
      onChanged();
      return this;
    }

    private boolean isAggregate_ ;

    /**
     * <pre>
     * If is_aggregate is true, then this operation accepts N &gt;= 2
     * inputs and produces 1 output all of the same type.  Should be
     * associative and commutative, and produce output with the same
     * shape as the input.  The optimizer may replace an aggregate op
     * taking input from multiple devices with a tree of aggregate ops
     * that aggregate locally within each device (and possibly within
     * groups of nearby devices) before communicating.
     * TODO(josh11b): Implement that optimization.
     * </pre>
     *
     * <code>bool is_aggregate = 16;</code>
     */
    public boolean getIsAggregate() {
      return isAggregate_;
    }

    /**
     * <pre>
     * If is_aggregate is true, then this operation accepts N &gt;= 2
     * inputs and produces 1 output all of the same type.  Should be
     * associative and commutative, and produce output with the same
     * shape as the input.  The optimizer may replace an aggregate op
     * taking input from multiple devices with a tree of aggregate ops
     * that aggregate locally within each device (and possibly within
     * groups of nearby devices) before communicating.
     * TODO(josh11b): Implement that optimization.
     * </pre>
     *
     * <code>bool is_aggregate = 16;</code>
     */
    public Builder setIsAggregate(boolean value) {

      isAggregate_ = value;
      onChanged();
      return this;
    }

    /**
     * <pre>
     * If is_aggregate is true, then this operation accepts N &gt;= 2
     * inputs and produces 1 output all of the same type.  Should be
     * associative and commutative, and produce output with the same
     * shape as the input.  The optimizer may replace an aggregate op
     * taking input from multiple devices with a tree of aggregate ops
     * that aggregate locally within each device (and possibly within
     * groups of nearby devices) before communicating.
     * TODO(josh11b): Implement that optimization.
     * </pre>
     *
     * <code>bool is_aggregate = 16;</code>
     */
    public Builder clearIsAggregate() {

      isAggregate_ = false;
      onChanged();
      return this;
    }

    private boolean isStateful_ ;

    /**
     * <pre>
     * Ops are marked as stateful if their behavior depends on some state beyond
     * their input tensors (e.g. variable reading op) or if they have
     * a side-effect (e.g. printing or asserting ops). Equivalently, stateless ops
     * must always produce the same output for the same input and have
     * no side-effects.
     * By default Ops may be moved between devices.  Stateful ops should
     * either not be moved, or should only be moved if that state can also
     * be moved (e.g. via some sort of save / restore).
     * Stateful ops are guaranteed to never be optimized away by Common
     * Subexpression Elimination (CSE).
     * </pre>
     *
     * <code>bool is_stateful = 17;</code>
     */
    public boolean getIsStateful() {
      return isStateful_;
    }

    /**
     * <pre>
     * Ops are marked as stateful if their behavior depends on some state beyond
     * their input tensors (e.g. variable reading op) or if they have
     * a side-effect (e.g. printing or asserting ops). Equivalently, stateless ops
     * must always produce the same output for the same input and have
     * no side-effects.
     * By default Ops may be moved between devices.  Stateful ops should
     * either not be moved, or should only be moved if that state can also
     * be moved (e.g. via some sort of save / restore).
     * Stateful ops are guaranteed to never be optimized away by Common
     * Subexpression Elimination (CSE).
     * </pre>
     *
     * <code>bool is_stateful = 17;</code>
     */
    public Builder setIsStateful(boolean value) {

      isStateful_ = value;
      onChanged();
      return this;
    }

    /**
     * <pre>
     * Ops are marked as stateful if their behavior depends on some state beyond
     * their input tensors (e.g. variable reading op) or if they have
     * a side-effect (e.g. printing or asserting ops). Equivalently, stateless ops
     * must always produce the same output for the same input and have
     * no side-effects.
     * By default Ops may be moved between devices.  Stateful ops should
     * either not be moved, or should only be moved if that state can also
     * be moved (e.g. via some sort of save / restore).
     * Stateful ops are guaranteed to never be optimized away by Common
     * Subexpression Elimination (CSE).
     * </pre>
     *
     * <code>bool is_stateful = 17;</code>
     */
    public Builder clearIsStateful() {

      isStateful_ = false;
      onChanged();
      return this;
    }

    private boolean allowsUninitializedInput_ ;

    /**
     * <pre>
     * By default, all inputs to an Op must be initialized Tensors.  Ops
     * that may initialize tensors for the first time should set this
     * field to true, to allow the Op to take an uninitialized Tensor as
     * input.
     * </pre>
     *
     * <code>bool allows_uninitialized_input = 19;</code>
     */
    public boolean getAllowsUninitializedInput() {
      return allowsUninitializedInput_;
    }

    /**
     * <pre>
     * By default, all inputs to an Op must be initialized Tensors.  Ops
     * that may initialize tensors for the first time should set this
     * field to true, to allow the Op to take an uninitialized Tensor as
     * input.
     * </pre>
     *
     * <code>bool allows_uninitialized_input = 19;</code>
     */
    public Builder setAllowsUninitializedInput(boolean value) {

      allowsUninitializedInput_ = value;
      onChanged();
      return this;
    }

    /**
     * <pre>
     * By default, all inputs to an Op must be initialized Tensors.  Ops
     * that may initialize tensors for the first time should set this
     * field to true, to allow the Op to take an uninitialized Tensor as
     * input.
     * </pre>
     *
     * <code>bool allows_uninitialized_input = 19;</code>
     */
    public Builder clearAllowsUninitializedInput() {

      allowsUninitializedInput_ = false;
      onChanged();
      return this;
    }

    @Override
    public final Builder setUnknownFields(
        final com.google.protobuf.UnknownFieldSet unknownFields) {
      return super.setUnknownFields(unknownFields);
    }

    @Override
    public final Builder mergeUnknownFields(
        final com.google.protobuf.UnknownFieldSet unknownFields) {
      return super.mergeUnknownFields(unknownFields);
    }

    // @@protoc_insertion_point(builder_scope:tensorflow.OpDef)
  }

  // @@protoc_insertion_point(class_scope:tensorflow.OpDef)
  private static final OpDef DEFAULT_INSTANCE;

  static {
    DEFAULT_INSTANCE = new OpDef();
  }

  public static OpDef getDefaultInstance() {
    return DEFAULT_INSTANCE;
  }

  private static final com.google.protobuf.Parser<OpDef>
      PARSER = new com.google.protobuf.AbstractParser<OpDef>() {
    @Override
    public OpDef parsePartialFrom(
        com.google.protobuf.CodedInputStream input,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return new OpDef(input, extensionRegistry);
    }
  };

  public static com.google.protobuf.Parser<OpDef> parser() {
    return PARSER;
  }

  @Override
  public com.google.protobuf.Parser<OpDef> getParserForType() {
    return PARSER;
  }

  @Override
  public OpDef getDefaultInstanceForType() {
    return DEFAULT_INSTANCE;
  }

}

