syntax = "proto2";

package caffe2;

// A few notes about the Caffe2's protobuffer convention:
// (1) Most objects are registered by their types, such as operators and nets.
//     For these, we have a string-type field "type" for registration purposes.
// (2) We do not use extension because that used to create quite some conflicts
//     in Caffe's protobuf design.
// (3) We have not used any proto3 specific features, such as Any or Map. This
//     is mainly for backward compatibility purposes but we may consider using
//     those in the future.

// A two number summary for a value. It also has count for restoring.
message TwoNumberStatsProto {
  optional float mean = 1;
  optional float stddev = 2;
  optional int64 count = 3;
}

// Blob profiling information. Profile for a blob is created every time
// a node outputs to the blob.
message BlobProfile {
  // Name of the blob (corresponds to OperatorDef.output).
  optional string name = 1; // required

  // Profiling statistics.
  optional TwoNumberStatsProto bytes_used = 3;
}

// Protobuf format to serialize profiler data.
message ProfDAGProto {
  // The name for the operator
  required string name = 1;
  // The mean execution time
  required float mean = 2;
  // The standard deviation
  required float stddev = 3;

  // New field to represent the numbers above, and with count.
  optional TwoNumberStatsProto execution_time = 4;

  // Blob profiles that this node outputs.
  repeated BlobProfile output_profile = 5;

  // The extra_info from the operator device option.
  repeated string extra_info = 7;
}

// Operator profiling information.
//
// Note: The indices for elements of 'stats' and the indices of
// 'output_profile' inside each 'stats' are assumed to match the
// indices of 'op' elements of a corresponding NetDef and the 'output'
// indices within each 'op'.
message ProfDAGProtos {
  repeated ProfDAGProto stats = 1;
  optional string net_name = 2;
  repeated OpProfile ops_stats = 3;
}

// Represents specification of an operation cost.
message OpProfile {
  optional string idx = 1;
  optional string net_name = 2;
  optional string type = 3;
  optional float exec_time_secs = 4;
}
