// Copyright 2019 Huawei Technologies Co., Ltd.
//
// 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.

syntax = "proto2";

package mindinsight;
option cc_enable_arenas = true;

// The ANF IR define, include the tensor and graph define
import "mindinsight_anf_ir.proto";

// Event Protocol buffer, Top define
message Event {
  // Timestamp
  required double wall_time = 1;

  // The step of train.
  optional int64 step = 2;

  oneof what {
    // An event file was started, with the specified version.
    // Now version is "Mindspore.Event:1"
    string version = 3;

    // GraphDef.
    GraphProto graph_def = 4;

    // Summary data
    Summary summary = 5;

  }
}


// A Summary is a set of named values that be produced regularly during training
message Summary {
    message Image {
        // Dimensions of the image.
        required int32 height = 1;
        required int32 width = 2;
        // Valid colorspace values are
        //   1 - grayscale
        //   2 - grayscale + alpha
        //   3 - RGB
        //   4 - RGBA
        //   5 - DIGITAL_YUV
        //   6 - BGRA
        required int32 colorspace = 3;
        // Image data in encoded format. Now only support the RGB.
        required bytes encoded_image = 4;
    }

    message Histogram {
      message bucket{
          // Counting number of values fallen in [left, left + width).
          // For the rightmost bucket, the range is [left, left + width].
          required double left = 1;
          required double width = 2;
          required int64 count = 3;
      }

      repeated bucket buckets = 1;
      optional int64 nan_count = 2;
      optional int64 pos_inf_count = 3;
      optional int64 neg_inf_count = 4;

      // max, min, sum will not take nan and inf into account.
      // If there is no valid value in tensor, max and min will be nan, sum will be 0.
      optional double max = 5;
      optional double min = 6;
      optional double sum = 7;

      // total number of values. including nan and inf.
      optional int64 count = 8;
    }

    message Value {
        // Tag name for the data.
        required string tag = 1;

        // Value associated with the tag.
        oneof value {
            float scalar_value = 3;
            Image image = 4;
            TensorProto tensor = 8;
            Histogram histogram = 9;
        }
    }

    // Set of values for the summary.
    repeated Value value = 1;
}
