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

package automl

import (
	fmt "fmt"
	math "math"

	proto "github.com/golang/protobuf/proto"
	_ "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

// Dataset metadata that is specific to translation.
type TranslationDatasetMetadata struct {
	// Required. The BCP-47 language code of the source language.
	SourceLanguageCode string `protobuf:"bytes,1,opt,name=source_language_code,json=sourceLanguageCode,proto3" json:"source_language_code,omitempty"`
	// Required. The BCP-47 language code of the target language.
	TargetLanguageCode   string   `protobuf:"bytes,2,opt,name=target_language_code,json=targetLanguageCode,proto3" json:"target_language_code,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_TranslationDatasetMetadata proto.InternalMessageInfo

func (m *TranslationDatasetMetadata) GetSourceLanguageCode() string {
	if m != nil {
		return m.SourceLanguageCode
	}
	return ""
}

func (m *TranslationDatasetMetadata) GetTargetLanguageCode() string {
	if m != nil {
		return m.TargetLanguageCode
	}
	return ""
}

// Evaluation metrics for the dataset.
type TranslationEvaluationMetrics struct {
	// Output only. BLEU score.
	BleuScore float64 `protobuf:"fixed64,1,opt,name=bleu_score,json=bleuScore,proto3" json:"bleu_score,omitempty"`
	// Output only. BLEU score for base model.
	BaseBleuScore        float64  `protobuf:"fixed64,2,opt,name=base_bleu_score,json=baseBleuScore,proto3" json:"base_bleu_score,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *TranslationEvaluationMetrics) Reset()         { *m = TranslationEvaluationMetrics{} }
func (m *TranslationEvaluationMetrics) String() string { return proto.CompactTextString(m) }
func (*TranslationEvaluationMetrics) ProtoMessage()    {}
func (*TranslationEvaluationMetrics) Descriptor() ([]byte, []int) {
	return fileDescriptor_74f6484316c15700, []int{1}
}

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

var xxx_messageInfo_TranslationEvaluationMetrics proto.InternalMessageInfo

func (m *TranslationEvaluationMetrics) GetBleuScore() float64 {
	if m != nil {
		return m.BleuScore
	}
	return 0
}

func (m *TranslationEvaluationMetrics) GetBaseBleuScore() float64 {
	if m != nil {
		return m.BaseBleuScore
	}
	return 0
}

// Model metadata that is specific to translation.
type TranslationModelMetadata struct {
	// The resource name of the model to use as a baseline to train the custom
	// model. If unset, we use the default base model provided by Google
	// Translate. Format:
	// `projects/{project_id}/locations/{location_id}/models/{model_id}`
	BaseModel string `protobuf:"bytes,1,opt,name=base_model,json=baseModel,proto3" json:"base_model,omitempty"`
	// Output only. Inferred from the dataset.
	// The source languge (The BCP-47 language code) that is used for training.
	SourceLanguageCode string `protobuf:"bytes,2,opt,name=source_language_code,json=sourceLanguageCode,proto3" json:"source_language_code,omitempty"`
	// Output only. The target languge (The BCP-47 language code) that is used for
	// training.
	TargetLanguageCode   string   `protobuf:"bytes,3,opt,name=target_language_code,json=targetLanguageCode,proto3" json:"target_language_code,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *TranslationModelMetadata) Reset()         { *m = TranslationModelMetadata{} }
func (m *TranslationModelMetadata) String() string { return proto.CompactTextString(m) }
func (*TranslationModelMetadata) ProtoMessage()    {}
func (*TranslationModelMetadata) Descriptor() ([]byte, []int) {
	return fileDescriptor_74f6484316c15700, []int{2}
}

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

var xxx_messageInfo_TranslationModelMetadata proto.InternalMessageInfo

func (m *TranslationModelMetadata) GetBaseModel() string {
	if m != nil {
		return m.BaseModel
	}
	return ""
}

func (m *TranslationModelMetadata) GetSourceLanguageCode() string {
	if m != nil {
		return m.SourceLanguageCode
	}
	return ""
}

func (m *TranslationModelMetadata) GetTargetLanguageCode() string {
	if m != nil {
		return m.TargetLanguageCode
	}
	return ""
}

// Annotation details specific to translation.
type TranslationAnnotation struct {
	// Output only . The translated content.
	TranslatedContent    *TextSnippet `protobuf:"bytes,1,opt,name=translated_content,json=translatedContent,proto3" json:"translated_content,omitempty"`
	XXX_NoUnkeyedLiteral struct{}     `json:"-"`
	XXX_unrecognized     []byte       `json:"-"`
	XXX_sizecache        int32        `json:"-"`
}

func (m *TranslationAnnotation) Reset()         { *m = TranslationAnnotation{} }
func (m *TranslationAnnotation) String() string { return proto.CompactTextString(m) }
func (*TranslationAnnotation) ProtoMessage()    {}
func (*TranslationAnnotation) Descriptor() ([]byte, []int) {
	return fileDescriptor_74f6484316c15700, []int{3}
}

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

var xxx_messageInfo_TranslationAnnotation proto.InternalMessageInfo

func (m *TranslationAnnotation) GetTranslatedContent() *TextSnippet {
	if m != nil {
		return m.TranslatedContent
	}
	return nil
}

func init() {
	proto.RegisterType((*TranslationDatasetMetadata)(nil), "google.cloud.automl.v1beta1.TranslationDatasetMetadata")
	proto.RegisterType((*TranslationEvaluationMetrics)(nil), "google.cloud.automl.v1beta1.TranslationEvaluationMetrics")
	proto.RegisterType((*TranslationModelMetadata)(nil), "google.cloud.automl.v1beta1.TranslationModelMetadata")
	proto.RegisterType((*TranslationAnnotation)(nil), "google.cloud.automl.v1beta1.TranslationAnnotation")
}

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

var fileDescriptor_74f6484316c15700 = []byte{
	// 399 bytes of a gzipped FileDescriptorProto
	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x94, 0x92, 0x4f, 0xcb, 0xd3, 0x40,
	0x10, 0xc6, 0x49, 0x04, 0xa1, 0x2b, 0xa2, 0x06, 0x85, 0x97, 0xbe, 0x15, 0xa5, 0x07, 0xe9, 0x41,
	0x13, 0xab, 0x47, 0x4f, 0x6d, 0x15, 0x2f, 0x06, 0x4a, 0x5b, 0x14, 0xa4, 0x10, 0x26, 0xc9, 0xb0,
	0x04, 0x36, 0x3b, 0x21, 0x3b, 0x29, 0x1e, 0xfd, 0x14, 0xde, 0xfc, 0x42, 0x7e, 0x2a, 0xd9, 0xdd,
	0xb4, 0x0d, 0x62, 0x0b, 0xef, 0x2d, 0x99, 0xf9, 0xcd, 0x33, 0x7f, 0xf6, 0x11, 0x6f, 0x24, 0x91,
	0x54, 0x98, 0x14, 0x8a, 0xba, 0x32, 0x81, 0x8e, 0xa9, 0x56, 0xc9, 0x61, 0x9e, 0x23, 0xc3, 0x3c,
	0xe1, 0x16, 0xb4, 0x51, 0xc0, 0x15, 0xe9, 0xb8, 0x69, 0x89, 0x29, 0xba, 0xf5, 0x78, 0xec, 0xf0,
	0xd8, 0xe3, 0x71, 0x8f, 0x8f, 0x5f, 0x5f, 0xd3, 0x2a, 0x81, 0x21, 0xab, 0x18, 0x6b, 0xe3, 0xa5,
	0xc6, 0x93, 0x9e, 0x86, 0xa6, 0x4a, 0x40, 0x6b, 0x62, 0xd7, 0xa7, 0xcf, 0x4e, 0x7f, 0x06, 0x62,
	0xbc, 0x3b, 0xb7, 0xff, 0x08, 0x0c, 0x06, 0x39, 0x45, 0x06, 0x2b, 0x14, 0xbd, 0x15, 0x4f, 0x0d,
	0x75, 0x6d, 0x81, 0x99, 0x02, 0x2d, 0x3b, 0x90, 0x98, 0x15, 0x54, 0xe2, 0x4d, 0xf0, 0x32, 0x98,
	0x8d, 0x36, 0x91, 0xcf, 0x7d, 0xe9, 0x53, 0x2b, 0x2a, 0xd1, 0x56, 0x30, 0xb4, 0x12, 0xf9, 0x9f,
	0x8a, 0xd0, 0x57, 0xf8, 0xdc, 0xb0, 0x62, 0x8a, 0x62, 0x32, 0x98, 0xe0, 0xd3, 0x01, 0x54, 0xe7,
	0xbe, 0x52, 0xe4, 0xb6, 0x2a, 0x4c, 0xf4, 0x5c, 0x88, 0x5c, 0x61, 0x97, 0x99, 0x82, 0x5a, 0xdf,
	0x39, 0xd8, 0x8c, 0x6c, 0x64, 0x6b, 0x03, 0xd1, 0x2b, 0xf1, 0x28, 0x07, 0x83, 0xd9, 0x80, 0x09,
	0x1d, 0xf3, 0xd0, 0x86, 0x97, 0x47, 0x6e, 0xfa, 0x3b, 0x10, 0x37, 0x83, 0x3e, 0x29, 0x95, 0xa8,
	0x4e, 0x7b, 0xda, 0x1e, 0x56, 0xa4, 0xb6, 0xd1, 0x7e, 0xbb, 0x91, 0x8d, 0x38, 0xec, 0xe2, 0x19,
	0xc2, 0x3b, 0x9f, 0xe1, 0xde, 0xc5, 0x33, 0x34, 0xe2, 0xd9, 0x60, 0xbc, 0xc5, 0xe9, 0xa5, 0xa2,
	0x6f, 0x22, 0x3a, 0x1a, 0x04, 0xcb, 0xac, 0x20, 0xcd, 0xa8, 0xd9, 0xcd, 0xf8, 0xe0, 0xdd, 0x2c,
	0xbe, 0x62, 0x94, 0x78, 0x87, 0x3f, 0x78, 0xab, 0xab, 0xa6, 0x41, 0xde, 0x3c, 0x39, 0x6b, 0xac,
	0xbc, 0xc4, 0xf2, 0x57, 0x20, 0x5e, 0x14, 0x54, 0x5f, 0x93, 0x58, 0x3e, 0x1e, 0xcc, 0xb4, 0xb6,
	0x8e, 0x59, 0x07, 0xdf, 0x17, 0x7d, 0x81, 0x24, 0xbb, 0x5b, 0x4c, 0xad, 0x4c, 0x24, 0x6a, 0xe7,
	0xa7, 0xc4, 0xa7, 0xa0, 0xa9, 0xcc, 0x7f, 0xed, 0xf9, 0xc1, 0xff, 0xfe, 0x09, 0x6f, 0x3f, 0x3b,
	0x70, 0xbf, 0xb2, 0xd0, 0x7e, 0xd1, 0x31, 0xa5, 0x6a, 0xff, 0xd5, 0x43, 0xf9, 0x7d, 0xa7, 0xf5,
	0xfe, 0x6f, 0x00, 0x00, 0x00, 0xff, 0xff, 0x2c, 0xcc, 0xe5, 0xfe, 0x35, 0x03, 0x00, 0x00,
}
