// Copyright 2021 Google LLC
//
// 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 = "proto3";

package google.cloud.aiplatform.v1.schema.trainingjob.definition;

import "google/api/annotations.proto";

option csharp_namespace = "Google.Cloud.AIPlatform.V1.Schema.TrainingJob.Definition";
option go_package = "google.golang.org/genproto/googleapis/cloud/aiplatform/v1/schema/trainingjob/definition;definition";
option java_multiple_files = true;
option java_outer_classname = "AutoMLImageObjectDetectionProto";
option java_package = "com.google.cloud.aiplatform.v1.schema.trainingjob.definition";
option php_namespace = "Google\\Cloud\\AIPlatform\\V1\\Schema\\TrainingJob\\Definition";
option ruby_package = "Google::Cloud::AIPlatform::V1::Schema::TrainingJob::Definition";

// A TrainingJob that trains and uploads an AutoML Image Object Detection Model.
message AutoMlImageObjectDetection {
  // The input parameters of this TrainingJob.
  AutoMlImageObjectDetectionInputs inputs = 1;

  // The metadata information
  AutoMlImageObjectDetectionMetadata metadata = 2;
}

message AutoMlImageObjectDetectionInputs {
  enum ModelType {
    // Should not be set.
    MODEL_TYPE_UNSPECIFIED = 0;

    // A model best tailored to be used within Google Cloud, and which cannot
    // be exported. Expected to have a higher latency, but should also have a
    // higher prediction quality than other cloud models.
    CLOUD_HIGH_ACCURACY_1 = 1;

    // A model best tailored to be used within Google Cloud, and which cannot
    // be exported. Expected to have a low latency, but may have lower
    // prediction quality than other cloud models.
    CLOUD_LOW_LATENCY_1 = 2;

    // A model that, in addition to being available within Google
    // Cloud can also be exported (see ModelService.ExportModel) and
    // used on a mobile or edge device with TensorFlow afterwards.
    // Expected to have low latency, but may have lower prediction
    // quality than other mobile models.
    MOBILE_TF_LOW_LATENCY_1 = 3;

    // A model that, in addition to being available within Google
    // Cloud can also be exported (see ModelService.ExportModel) and
    // used on a mobile or edge device with TensorFlow afterwards.
    MOBILE_TF_VERSATILE_1 = 4;

    // A model that, in addition to being available within Google
    // Cloud, can also be exported (see ModelService.ExportModel) and
    // used on a mobile or edge device with TensorFlow afterwards.
    // Expected to have a higher latency, but should also have a higher
    // prediction quality than other mobile models.
    MOBILE_TF_HIGH_ACCURACY_1 = 5;
  }

  ModelType model_type = 1;

  // The training budget of creating this model, expressed in milli node
  // hours i.e. 1,000 value in this field means 1 node hour. The actual
  // metadata.costMilliNodeHours will be equal or less than this value.
  // If further model training ceases to provide any improvements, it will
  // stop without using the full budget and the metadata.successfulStopReason
  // will be `model-converged`.
  // Note, node_hour  = actual_hour * number_of_nodes_involved.
  // For modelType `cloud`(default), the budget must be between 20,000
  // and 900,000 milli node hours, inclusive. The default value is 216,000
  // which represents one day in wall time, considering 9 nodes are used.
  // For model types `mobile-tf-low-latency-1`, `mobile-tf-versatile-1`,
  // `mobile-tf-high-accuracy-1`
  // the training budget must be between 1,000 and 100,000 milli node hours,
  // inclusive. The default value is 24,000 which represents one day in
  // wall time on a single node that is used.
  int64 budget_milli_node_hours = 2;

  // Use the entire training budget. This disables the early stopping feature.
  // When false the early stopping feature is enabled, which means that AutoML
  // Image Object Detection might stop training before the entire training
  // budget has been used.
  bool disable_early_stopping = 3;
}

message AutoMlImageObjectDetectionMetadata {
  enum SuccessfulStopReason {
    // Should not be set.
    SUCCESSFUL_STOP_REASON_UNSPECIFIED = 0;

    // The inputs.budgetMilliNodeHours had been reached.
    BUDGET_REACHED = 1;

    // Further training of the Model ceased to increase its quality, since it
    // already has converged.
    MODEL_CONVERGED = 2;
  }

  // The actual training cost of creating this model, expressed in
  // milli node hours, i.e. 1,000 value in this field means 1 node hour.
  // Guaranteed to not exceed inputs.budgetMilliNodeHours.
  int64 cost_milli_node_hours = 1;

  // For successful job completions, this is the reason why the job has
  // finished.
  SuccessfulStopReason successful_stop_reason = 2;
}
