// Code generated by protoc-gen-go. DO NOT EDIT.
// source: google/cloud/automl/v1beta1/model_evaluation.proto

package automl

import (
	fmt "fmt"
	math "math"

	proto "github.com/golang/protobuf/proto"
	timestamp "github.com/golang/protobuf/ptypes/timestamp"
	_ "google.golang.org/genproto/googleapis/api/annotations"
)

// Reference imports to suppress errors if they are not otherwise used.
var _ = proto.Marshal
var _ = fmt.Errorf
var _ = math.Inf

// This is a compile-time assertion to ensure that this generated file
// is compatible with the proto package it is being compiled against.
// A compilation error at this line likely means your copy of the
// proto package needs to be updated.
const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package

// Evaluation results of a model.
type ModelEvaluation struct {
	// Output only. Problem type specific evaluation metrics.
	//
	// Types that are valid to be assigned to Metrics:
	//	*ModelEvaluation_ClassificationEvaluationMetrics
	//	*ModelEvaluation_RegressionEvaluationMetrics
	//	*ModelEvaluation_TranslationEvaluationMetrics
	//	*ModelEvaluation_ImageObjectDetectionEvaluationMetrics
	//	*ModelEvaluation_VideoObjectTrackingEvaluationMetrics
	//	*ModelEvaluation_TextSentimentEvaluationMetrics
	//	*ModelEvaluation_TextExtractionEvaluationMetrics
	Metrics isModelEvaluation_Metrics `protobuf_oneof:"metrics"`
	// Output only. Resource name of the model evaluation.
	// Format:
	//
	// `projects/{project_id}/locations/{location_id}/models/{model_id}/modelEvaluations/{model_evaluation_id}`
	Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
	// Output only. The ID of the annotation spec that the model evaluation applies to. The
	// The ID is empty for the overall model evaluation.
	// For Tables annotation specs in the dataset do not exist and this ID is
	// always not set, but for CLASSIFICATION
	//
	// [prediction_type-s][google.cloud.automl.v1beta1.TablesModelMetadata.prediction_type]
	// the
	// [display_name][google.cloud.automl.v1beta1.ModelEvaluation.display_name]
	// field is used.
	AnnotationSpecId string `protobuf:"bytes,2,opt,name=annotation_spec_id,json=annotationSpecId,proto3" json:"annotation_spec_id,omitempty"`
	// Output only. The value of
	// [display_name][google.cloud.automl.v1beta1.AnnotationSpec.display_name] at
	// the moment when the model was trained. Because this field returns a value
	// at model training time, for different models trained from the same dataset,
	// the values may differ, since display names could had been changed between
	// the two model's trainings.
	// For Tables CLASSIFICATION
	//
	// [prediction_type-s][google.cloud.automl.v1beta1.TablesModelMetadata.prediction_type]
	// distinct values of the target column at the moment of the model evaluation
	// are populated here.
	// The display_name is empty for the overall model evaluation.
	DisplayName string `protobuf:"bytes,15,opt,name=display_name,json=displayName,proto3" json:"display_name,omitempty"`
	// Output only. Timestamp when this model evaluation was created.
	CreateTime *timestamp.Timestamp `protobuf:"bytes,5,opt,name=create_time,json=createTime,proto3" json:"create_time,omitempty"`
	// Output only. The number of examples used for model evaluation, i.e. for
	// which ground truth from time of model creation is compared against the
	// predicted annotations created by the model.
	// For overall ModelEvaluation (i.e. with annotation_spec_id not set) this is
	// the total number of all examples used for evaluation.
	// Otherwise, this is the count of examples that according to the ground
	// truth were annotated by the
	//
	// [annotation_spec_id][google.cloud.automl.v1beta1.ModelEvaluation.annotation_spec_id].
	EvaluatedExampleCount int32    `protobuf:"varint,6,opt,name=evaluated_example_count,json=evaluatedExampleCount,proto3" json:"evaluated_example_count,omitempty"`
	XXX_NoUnkeyedLiteral  struct{} `json:"-"`
	XXX_unrecognized      []byte   `json:"-"`
	XXX_sizecache         int32    `json:"-"`
}

func (m *ModelEvaluation) Reset()         { *m = ModelEvaluation{} }
func (m *ModelEvaluation) String() string { return proto.CompactTextString(m) }
func (*ModelEvaluation) ProtoMessage()    {}
func (*ModelEvaluation) Descriptor() ([]byte, []int) {
	return fileDescriptor_2d3cea51cfd5443a, []int{0}
}

func (m *ModelEvaluation) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_ModelEvaluation.Unmarshal(m, b)
}
func (m *ModelEvaluation) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_ModelEvaluation.Marshal(b, m, deterministic)
}
func (m *ModelEvaluation) XXX_Merge(src proto.Message) {
	xxx_messageInfo_ModelEvaluation.Merge(m, src)
}
func (m *ModelEvaluation) XXX_Size() int {
	return xxx_messageInfo_ModelEvaluation.Size(m)
}
func (m *ModelEvaluation) XXX_DiscardUnknown() {
	xxx_messageInfo_ModelEvaluation.DiscardUnknown(m)
}

var xxx_messageInfo_ModelEvaluation proto.InternalMessageInfo

type isModelEvaluation_Metrics interface {
	isModelEvaluation_Metrics()
}

type ModelEvaluation_ClassificationEvaluationMetrics struct {
	ClassificationEvaluationMetrics *ClassificationEvaluationMetrics `protobuf:"bytes,8,opt,name=classification_evaluation_metrics,json=classificationEvaluationMetrics,proto3,oneof"`
}

type ModelEvaluation_RegressionEvaluationMetrics struct {
	RegressionEvaluationMetrics *RegressionEvaluationMetrics `protobuf:"bytes,24,opt,name=regression_evaluation_metrics,json=regressionEvaluationMetrics,proto3,oneof"`
}

type ModelEvaluation_TranslationEvaluationMetrics struct {
	TranslationEvaluationMetrics *TranslationEvaluationMetrics `protobuf:"bytes,9,opt,name=translation_evaluation_metrics,json=translationEvaluationMetrics,proto3,oneof"`
}

type ModelEvaluation_ImageObjectDetectionEvaluationMetrics struct {
	ImageObjectDetectionEvaluationMetrics *ImageObjectDetectionEvaluationMetrics `protobuf:"bytes,12,opt,name=image_object_detection_evaluation_metrics,json=imageObjectDetectionEvaluationMetrics,proto3,oneof"`
}

type ModelEvaluation_VideoObjectTrackingEvaluationMetrics struct {
	VideoObjectTrackingEvaluationMetrics *VideoObjectTrackingEvaluationMetrics `protobuf:"bytes,14,opt,name=video_object_tracking_evaluation_metrics,json=videoObjectTrackingEvaluationMetrics,proto3,oneof"`
}

type ModelEvaluation_TextSentimentEvaluationMetrics struct {
	TextSentimentEvaluationMetrics *TextSentimentEvaluationMetrics `protobuf:"bytes,11,opt,name=text_sentiment_evaluation_metrics,json=textSentimentEvaluationMetrics,proto3,oneof"`
}

type ModelEvaluation_TextExtractionEvaluationMetrics struct {
	TextExtractionEvaluationMetrics *TextExtractionEvaluationMetrics `protobuf:"bytes,13,opt,name=text_extraction_evaluation_metrics,json=textExtractionEvaluationMetrics,proto3,oneof"`
}

func (*ModelEvaluation_ClassificationEvaluationMetrics) isModelEvaluation_Metrics() {}

func (*ModelEvaluation_RegressionEvaluationMetrics) isModelEvaluation_Metrics() {}

func (*ModelEvaluation_TranslationEvaluationMetrics) isModelEvaluation_Metrics() {}

func (*ModelEvaluation_ImageObjectDetectionEvaluationMetrics) isModelEvaluation_Metrics() {}

func (*ModelEvaluation_VideoObjectTrackingEvaluationMetrics) isModelEvaluation_Metrics() {}

func (*ModelEvaluation_TextSentimentEvaluationMetrics) isModelEvaluation_Metrics() {}

func (*ModelEvaluation_TextExtractionEvaluationMetrics) isModelEvaluation_Metrics() {}

func (m *ModelEvaluation) GetMetrics() isModelEvaluation_Metrics {
	if m != nil {
		return m.Metrics
	}
	return nil
}

func (m *ModelEvaluation) GetClassificationEvaluationMetrics() *ClassificationEvaluationMetrics {
	if x, ok := m.GetMetrics().(*ModelEvaluation_ClassificationEvaluationMetrics); ok {
		return x.ClassificationEvaluationMetrics
	}
	return nil
}

func (m *ModelEvaluation) GetRegressionEvaluationMetrics() *RegressionEvaluationMetrics {
	if x, ok := m.GetMetrics().(*ModelEvaluation_RegressionEvaluationMetrics); ok {
		return x.RegressionEvaluationMetrics
	}
	return nil
}

func (m *ModelEvaluation) GetTranslationEvaluationMetrics() *TranslationEvaluationMetrics {
	if x, ok := m.GetMetrics().(*ModelEvaluation_TranslationEvaluationMetrics); ok {
		return x.TranslationEvaluationMetrics
	}
	return nil
}

func (m *ModelEvaluation) GetImageObjectDetectionEvaluationMetrics() *ImageObjectDetectionEvaluationMetrics {
	if x, ok := m.GetMetrics().(*ModelEvaluation_ImageObjectDetectionEvaluationMetrics); ok {
		return x.ImageObjectDetectionEvaluationMetrics
	}
	return nil
}

func (m *ModelEvaluation) GetVideoObjectTrackingEvaluationMetrics() *VideoObjectTrackingEvaluationMetrics {
	if x, ok := m.GetMetrics().(*ModelEvaluation_VideoObjectTrackingEvaluationMetrics); ok {
		return x.VideoObjectTrackingEvaluationMetrics
	}
	return nil
}

func (m *ModelEvaluation) GetTextSentimentEvaluationMetrics() *TextSentimentEvaluationMetrics {
	if x, ok := m.GetMetrics().(*ModelEvaluation_TextSentimentEvaluationMetrics); ok {
		return x.TextSentimentEvaluationMetrics
	}
	return nil
}

func (m *ModelEvaluation) GetTextExtractionEvaluationMetrics() *TextExtractionEvaluationMetrics {
	if x, ok := m.GetMetrics().(*ModelEvaluation_TextExtractionEvaluationMetrics); ok {
		return x.TextExtractionEvaluationMetrics
	}
	return nil
}

func (m *ModelEvaluation) GetName() string {
	if m != nil {
		return m.Name
	}
	return ""
}

func (m *ModelEvaluation) GetAnnotationSpecId() string {
	if m != nil {
		return m.AnnotationSpecId
	}
	return ""
}

func (m *ModelEvaluation) GetDisplayName() string {
	if m != nil {
		return m.DisplayName
	}
	return ""
}

func (m *ModelEvaluation) GetCreateTime() *timestamp.Timestamp {
	if m != nil {
		return m.CreateTime
	}
	return nil
}

func (m *ModelEvaluation) GetEvaluatedExampleCount() int32 {
	if m != nil {
		return m.EvaluatedExampleCount
	}
	return 0
}

// XXX_OneofWrappers is for the internal use of the proto package.
func (*ModelEvaluation) XXX_OneofWrappers() []interface{} {
	return []interface{}{
		(*ModelEvaluation_ClassificationEvaluationMetrics)(nil),
		(*ModelEvaluation_RegressionEvaluationMetrics)(nil),
		(*ModelEvaluation_TranslationEvaluationMetrics)(nil),
		(*ModelEvaluation_ImageObjectDetectionEvaluationMetrics)(nil),
		(*ModelEvaluation_VideoObjectTrackingEvaluationMetrics)(nil),
		(*ModelEvaluation_TextSentimentEvaluationMetrics)(nil),
		(*ModelEvaluation_TextExtractionEvaluationMetrics)(nil),
	}
}

func init() {
	proto.RegisterType((*ModelEvaluation)(nil), "google.cloud.automl.v1beta1.ModelEvaluation")
}

func init() {
	proto.RegisterFile("google/cloud/automl/v1beta1/model_evaluation.proto", fileDescriptor_2d3cea51cfd5443a)
}

var fileDescriptor_2d3cea51cfd5443a = []byte{
	// 651 bytes of a gzipped FileDescriptorProto
	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x8c, 0x94, 0xdf, 0x6a, 0x14, 0x31,
	0x14, 0xc6, 0x4d, 0xb1, 0xd5, 0xcd, 0x56, 0x2b, 0x01, 0x71, 0x69, 0x6b, 0xff, 0xa1, 0xb0, 0x62,
	0x9d, 0x69, 0x2b, 0x88, 0x6e, 0xbd, 0x69, 0x6b, 0xd1, 0x82, 0x55, 0xd9, 0x96, 0x5e, 0x48, 0x61,
	0xc8, 0x66, 0x4e, 0x87, 0x68, 0x66, 0x32, 0x4c, 0xb2, 0xcb, 0x7a, 0x23, 0x78, 0x27, 0xfa, 0x08,
	0x82, 0x77, 0xbe, 0x8c, 0x2f, 0xe1, 0xbd, 0x4f, 0x21, 0x93, 0xc9, 0xee, 0x4e, 0x25, 0xc6, 0xde,
	0xed, 0xcc, 0xf7, 0x9d, 0x6f, 0x7e, 0x39, 0x67, 0x73, 0xf0, 0x56, 0x22, 0x65, 0x22, 0x20, 0x64,
	0x42, 0xf6, 0xe3, 0x90, 0xf6, 0xb5, 0x4c, 0x45, 0x38, 0xd8, 0xec, 0x81, 0xa6, 0x9b, 0x61, 0x2a,
	0x63, 0x10, 0x11, 0x0c, 0xa8, 0xe8, 0x53, 0xcd, 0x65, 0x16, 0xe4, 0x85, 0xd4, 0x92, 0x2c, 0x54,
	0x35, 0x81, 0xa9, 0x09, 0xaa, 0x9a, 0xc0, 0xd6, 0xcc, 0x6f, 0xf8, 0x02, 0x99, 0xa0, 0x4a, 0xf1,
	0x33, 0xce, 0x6a, 0x71, 0xf3, 0xf7, 0x7d, 0x15, 0x31, 0x68, 0x60, 0x35, 0xf3, 0xba, 0xcf, 0x5c,
	0x40, 0x52, 0x80, 0x52, 0x13, 0x77, 0xdb, 0xe7, 0xd6, 0xb4, 0x27, 0x40, 0x59, 0xe7, 0xa6, 0xd7,
	0x09, 0x43, 0x1d, 0xc1, 0x50, 0x17, 0xb4, 0x8e, 0xb2, 0xf1, 0xdf, 0x12, 0x05, 0x99, 0xe6, 0x29,
	0x64, 0xda, 0x56, 0x3c, 0xf0, 0x56, 0x14, 0x34, 0x53, 0xa2, 0xde, 0x98, 0x65, 0x6b, 0x37, 0x4f,
	0xbd, 0xfe, 0x59, 0x58, 0x86, 0x29, 0x4d, 0xd3, 0xdc, 0x1a, 0x16, 0xad, 0x81, 0xe6, 0x3c, 0xa4,
	0x59, 0x26, 0xb5, 0xa9, 0xb6, 0x47, 0x5a, 0xfb, 0xd5, 0xc0, 0x73, 0x87, 0xe5, 0x04, 0xf7, 0xc7,
	0x03, 0x24, 0x5f, 0x10, 0x5e, 0x3d, 0x3f, 0x84, 0xda, 0x78, 0xa3, 0x14, 0x74, 0xc1, 0x99, 0x6a,
	0x5d, 0x5d, 0x41, 0xed, 0xe6, 0xd6, 0xd3, 0xc0, 0x33, 0xe7, 0x60, 0xef, 0x5c, 0xca, 0xe4, 0x13,
	0x87, 0x55, 0xc6, 0x8b, 0x4b, 0xdd, 0x65, 0xe6, 0xb7, 0x90, 0x8f, 0xf8, 0xf6, 0x64, 0x62, 0x2e,
	0x8e, 0x96, 0xe1, 0x78, 0xec, 0xe5, 0xe8, 0x8e, 0x13, 0x5c, 0x0c, 0x0b, 0xc5, 0xbf, 0x65, 0xf2,
	0x09, 0xe1, 0xa5, 0x5a, 0xd7, 0x5d, 0x04, 0x0d, 0x43, 0xf0, 0xc4, 0x4b, 0x70, 0x3c, 0x89, 0x70,
	0x21, 0x2c, 0x6a, 0x8f, 0x4e, 0xbe, 0x23, 0x7c, 0x8f, 0xa7, 0x34, 0x81, 0x48, 0xf6, 0xde, 0x01,
	0xd3, 0xd1, 0xf8, 0x0f, 0xef, 0xc2, 0x99, 0x35, 0x38, 0xbb, 0x5e, 0x9c, 0x83, 0x32, 0xed, 0xb5,
	0x09, 0x7b, 0x36, 0xca, 0x72, 0x71, 0xdd, 0xe5, 0x17, 0x31, 0x92, 0x6f, 0x08, 0xb7, 0x07, 0x3c,
	0x06, 0x39, 0x02, 0x2c, 0x6f, 0xc1, 0x7b, 0x9e, 0x25, 0x2e, 0xbe, 0xeb, 0x86, 0x6f, 0xc7, 0xcb,
	0x77, 0x52, 0x86, 0x55, 0x9f, 0x3d, 0xb6, 0x51, 0x2e, 0xbc, 0x3b, 0x83, 0x0b, 0xf8, 0xc8, 0x67,
	0x84, 0x57, 0xcf, 0x5f, 0x35, 0x17, 0x56, 0xd3, 0x60, 0x6d, 0xfb, 0xa7, 0x08, 0x43, 0x7d, 0x34,
	0x0a, 0x71, 0x01, 0x2d, 0x69, 0xaf, 0x83, 0x7c, 0x45, 0x78, 0xed, 0xaf, 0x45, 0xe1, 0x62, 0xb9,
	0x76, 0x81, 0xbb, 0x55, 0xb2, 0xec, 0x8f, 0x53, 0x9c, 0x77, 0x4b, 0xfb, 0x2d, 0x84, 0xe0, 0xcb,
	0x19, 0x4d, 0xa1, 0x85, 0x56, 0x50, 0xbb, 0xd1, 0x35, 0xbf, 0xc9, 0x3a, 0x26, 0x93, 0x2d, 0x11,
	0xa9, 0x1c, 0x58, 0xc4, 0xe3, 0xd6, 0x94, 0x71, 0xdc, 0x98, 0x28, 0x47, 0x39, 0xb0, 0x83, 0x98,
	0xac, 0xe2, 0xd9, 0x98, 0xab, 0x5c, 0xd0, 0x0f, 0x91, 0x49, 0x9a, 0x33, 0xbe, 0xa6, 0x7d, 0xf7,
	0xaa, 0x0c, 0xdc, 0xc6, 0x4d, 0x56, 0x00, 0xd5, 0x10, 0x95, 0x4d, 0x69, 0x4d, 0x9b, 0xa3, 0xcd,
	0x8f, 0x8e, 0x36, 0x5a, 0x5b, 0xc1, 0xf1, 0x68, 0x6d, 0x75, 0x71, 0x65, 0x2f, 0x5f, 0x90, 0x47,
	0xf8, 0x96, 0x6d, 0x0f, 0xc4, 0x11, 0x0c, 0x69, 0x9a, 0x0b, 0x88, 0x98, 0xec, 0x67, 0xba, 0x35,
	0xb3, 0x82, 0xda, 0xd3, 0xdd, 0x9b, 0x63, 0x79, 0xbf, 0x52, 0xf7, 0x4a, 0x71, 0xb7, 0x81, 0xaf,
	0xd8, 0x5e, 0xee, 0xfe, 0x40, 0x78, 0x99, 0xc9, 0xd4, 0xd7, 0xcb, 0x37, 0xe8, 0xed, 0x8e, 0x95,
	0x13, 0x29, 0x68, 0x96, 0x04, 0xb2, 0x48, 0xc2, 0x04, 0x32, 0x43, 0x17, 0x56, 0x12, 0xcd, 0xb9,
	0x72, 0x2e, 0xe5, 0xed, 0xea, 0xf1, 0xe7, 0xd4, 0xc2, 0x73, 0x63, 0x3c, 0xdd, 0x2b, 0x4d, 0xa7,
	0x3b, 0x7d, 0x2d, 0x0f, 0xc5, 0xe9, 0x49, 0x65, 0xfa, 0x3d, 0xb5, 0x54, 0xa9, 0x9d, 0x8e, 0x91,
	0x3b, 0x1d, 0xa3, 0xbf, 0xec, 0x74, 0xac, 0xa1, 0x37, 0x63, 0x3e, 0xf6, 0xf0, 0x4f, 0x00, 0x00,
	0x00, 0xff, 0xff, 0x1e, 0x8c, 0x9f, 0x9c, 0x6d, 0x07, 0x00, 0x00,
}
