syntax = "proto3";

package tensorflow;

option cc_enable_arenas = true;
option java_outer_classname = "VariableProtos";
option java_multiple_files = true;
option java_package = "org.tensorflow.framework";

option go_package = "github.com/tensorflow/tensorflow/tensorflow/go/core/framework";

// Indicates when a distributed variable will be synced.
enum VariableSynchronization {
  // `AUTO`: Indicates that the synchronization will be determined by the
  // current `DistributionStrategy` (eg. With `MirroredStrategy` this would be
  // `ON_WRITE`).
  VARIABLE_SYNCHRONIZATION_AUTO = 0;
  // `NONE`: Indicates that there will only be one copy of the variable, so
  // there is no need to sync.
  VARIABLE_SYNCHRONIZATION_NONE = 1;
  // `ON_WRITE`: Indicates that the variable will be updated across devices
  // every time it is written.
  VARIABLE_SYNCHRONIZATION_ON_WRITE = 2;
  // `ON_READ`: Indicates that the variable will be aggregated across devices
  // when it is read (eg. when checkpointing or when evaluating an op that uses
  // the variable).
  VARIABLE_SYNCHRONIZATION_ON_READ = 3;
}

// Indicates how a distributed variable will be aggregated.
enum VariableAggregation {
  // `NONE`: This is the default, giving an error if you use a
  // variable-update operation with multiple replicas.
  VARIABLE_AGGREGATION_NONE = 0;
  // `SUM`: Add the updates across replicas.
  VARIABLE_AGGREGATION_SUM = 1;
  // `MEAN`: Take the arithmetic mean ("average") of the updates across
  // replicas.
  VARIABLE_AGGREGATION_MEAN = 2;
  // `ONLY_FIRST_REPLICA`: This is for when every replica is performing the same
  // update, but we only want to perform the update once. Used, e.g., for the
  // global step counter.
  VARIABLE_AGGREGATION_ONLY_FIRST_REPLICA = 3;
}

// Protocol buffer representing a Variable.
message VariableDef {
  // Name of the variable tensor.
  string variable_name = 1;

  // Name of the tensor holding the variable's initial value.
  string initial_value_name = 6;

  // Name of the initializer op.
  string initializer_name = 2;

  // Name of the snapshot tensor.
  string snapshot_name = 3;

  // Support for saving variables as slices of a larger variable.
  SaveSliceInfoDef save_slice_info_def = 4;

  // Whether to represent this as a ResourceVariable.
  bool is_resource = 5;

  // Whether this variable should be trained.
  bool trainable = 7;

  // Indicates when a distributed variable will be synced.
  VariableSynchronization synchronization = 8;

  // Indicates how a distributed variable will be aggregated.
  VariableAggregation aggregation = 9;
}

message SaveSliceInfoDef {
  // Name of the full variable of which this is a slice.
  string full_name = 1;
  // Shape of the full variable.
  repeated int64 full_shape = 2;
  // Offset of this variable into the full variable.
  repeated int64 var_offset = 3;
  // Shape of this variable.
  repeated int64 var_shape = 4;
}
