func (*ReportWorkRequest) XXX_OneofFuncs() (func(msg proto.Message, b *proto.Buffer) error, func(msg proto.Message, tag, wire int, b *proto.Buffer) (bool, error), func(msg proto.Message) (n int), []interface{}) {
	return _ReportWorkRequest_OneofMarshaler, _ReportWorkRequest_OneofUnmarshaler, _ReportWorkRequest_OneofSizer, []interface{}{
		(*ReportWorkRequest_Work)(nil),
		(*ReportWorkRequest_Weights)(nil),
	}
}
XXX_OneofFuncs is for the internal use of the proto package.
package aggregatorpb
import proto "github.com/gogo/protobuf/proto"
import fmt "fmt"
import math "math"
import _ "github.com/gogo/protobuf/gogoproto"
import _ "github.com/golang/protobuf/ptypes/timestamp"
import time "time"
import strconv "strconv"
import bytes "bytes"
import strings "strings"
import reflect "reflect"
import context "golang.org/x/net/context"
import grpc "google.golang.org/grpc"
import binary "encoding/binary"
import types "github.com/gogo/protobuf/types"
import io "io"
var _ = proto.Marshal
var _ = fmt.Errorf
var _ = math.Inf
var _ = time.Kitchen
const _ = proto.GoGoProtoPackageIsVersion2  
type TrainingStatus int32
const (
	SCHEDULED TrainingStatus = 0
	TRAINING  TrainingStatus = 1
	SUCCEEDED TrainingStatus = 2
	FAILED    TrainingStatus = 3
	CANCELED  TrainingStatus = 4
)
var TrainingStatus_name = map[int32]string{
	0: "SCHEDULED",
	1: "TRAINING",
	2: "SUCCEEDED",
	3: "FAILED",
	4: "CANCELED",
}
var TrainingStatus_value = map[string]int32{
	"SCHEDULED": 0,
	"TRAINING":  1,
	"SUCCEEDED": 2,
	"FAILED":    3,
	"CANCELED":  4,
}
func (TrainingStatus) EnumDescriptor() ([]byte, []int) { return fileDescriptorAggregator, []int{0} }
type Repeat int32
const (
	NEVER   Repeat = 0
	HOURLY  Repeat = 1
	DAILY   Repeat = 2
	WEEKLY  Repeat = 3
	MONTHLY Repeat = 4
)
var Repeat_name = map[int32]string{
	0: "NEVER",
	1: "HOURLY",
	2: "DAILY",
	3: "WEEKLY",
	4: "MONTHLY",
}
var Repeat_value = map[string]int32{
	"NEVER":   0,
	"HOURLY":  1,
	"DAILY":   2,
	"WEEKLY":  3,
	"MONTHLY": 4,
}
func (Repeat) EnumDescriptor() ([]byte, []int) { return fileDescriptorAggregator, []int{1} }
type ErrorType int32
const (
	ERROR_UNKNOWN   ErrorType = 0
	ERROR_TRAINING  ErrorType = 1
	ERROR_INFERENCE ErrorType = 2
)
var ErrorType_name = map[int32]string{
	0: "ERROR_UNKNOWN",
	1: "ERROR_TRAINING",
	2: "ERROR_INFERENCE",
}
var ErrorType_value = map[string]int32{
	"ERROR_UNKNOWN":   0,
	"ERROR_TRAINING":  1,
	"ERROR_INFERENCE": 2,
}
func (ErrorType) EnumDescriptor() ([]byte, []int) { return fileDescriptorAggregator, []int{2} }
type HyperParams struct {
	BatchSize        int64   `protobuf:"varint,2,opt,name=batch_size,json=batchSize,proto3" json:"batch_size,omitempty"`
	NumRounds        int64   `protobuf:"varint,3,opt,name=num_rounds,json=numRounds,proto3" json:"num_rounds,omitempty"`
	LearningRate     float64 `protobuf:"fixed64,4,opt,name=learning_rate,json=learningRate,proto3" json:"learning_rate,omitempty"`
	NumLocalRounds   int64   `protobuf:"varint,5,opt,name=num_local_rounds,json=numLocalRounds,proto3" json:"num_local_rounds,omitempty"`
	QuantizedUpdates bool    `protobuf:"varint,6,opt,name=quantized_updates,json=quantizedUpdates,proto3" json:"quantized_updates,omitempty"`
	NumClients       int64   `protobuf:"varint,7,opt,name=num_clients,json=numClients,proto3" json:"num_clients,omitempty"`
}
func (m *HyperParams) Reset()                    { *m = HyperParams{} }
func (*HyperParams) ProtoMessage()               {}
func (*HyperParams) Descriptor() ([]byte, []int) { return fileDescriptorAggregator, []int{0} }
func (m *HyperParams) GetBatchSize() int64 {
	if m != nil {
		return m.BatchSize
	}
	return 0
}
func (m *HyperParams) GetNumRounds() int64 {
	if m != nil {
		return m.NumRounds
	}
	return 0
}
func (m *HyperParams) GetLearningRate() float64 {
	if m != nil {
		return m.LearningRate
	}
	return 0
}
func (m *HyperParams) GetNumLocalRounds() int64 {
	if m != nil {
		return m.NumLocalRounds
	}
	return 0
}
func (m *HyperParams) GetQuantizedUpdates() bool {
	if m != nil {
		return m.QuantizedUpdates
	}
	return false
}
func (m *HyperParams) GetNumClients() int64 {
	if m != nil {
		return m.NumClients
	}
	return 0
}
type SchedulingInfo struct {
	Scheduled *time.Time `protobuf:"bytes,1,opt,name=scheduled,stdtime" json:"scheduled,omitempty"`
	Repeat    Repeat     `protobuf:"varint,2,opt,name=repeat,proto3,enum=aggregatorpb.Repeat" json:"repeat,omitempty"`
}
func (m *SchedulingInfo) Reset()                    { *m = SchedulingInfo{} }
func (*SchedulingInfo) ProtoMessage()               {}
func (*SchedulingInfo) Descriptor() ([]byte, []int) { return fileDescriptorAggregator, []int{1} }
func (m *SchedulingInfo) GetScheduled() *time.Time {
	if m != nil {
		return m.Scheduled
	}
	return nil
}
func (m *SchedulingInfo) GetRepeat() Repeat {
	if m != nil {
		return m.Repeat
	}
	return NEVER
}
type Work struct {
	Id          ModelID `protobuf:"bytes,1,opt,name=id" json:"id"`
	NumExamples int64   `protobuf:"varint,2,opt,name=num_examples,json=numExamples,proto3" json:"num_examples,omitempty"`
	NumClients  int64   `protobuf:"varint,3,opt,name=num_clients,json=numClients,proto3" json:"num_clients,omitempty"`
	Epoch       int64   `protobuf:"varint,4,opt,name=epoch,proto3" json:"epoch,omitempty"`
	HyperParams HyperParams `protobuf:"bytes,7,opt,name=hyper_params,json=hyperParams" json:"hyper_params"`
	TimeTaken float64 `protobuf:"fixed64,8,opt,name=time_taken,json=timeTaken,proto3" json:"time_taken,omitempty"`
	Started time.Time `protobuf:"bytes,11,opt,name=started,stdtime" json:"started"`
	Metrics []float64 `protobuf:"fixed64,9,rep,packed,name=metrics" json:"metrics,omitempty"`
}
func (m *Work) Reset()                    { *m = Work{} }
func (*Work) ProtoMessage()               {}
func (*Work) Descriptor() ([]byte, []int) { return fileDescriptorAggregator, []int{2} }
func (m *Work) GetId() ModelID {
	if m != nil {
		return m.Id
	}
	return ModelID{}
}
func (m *Work) GetNumExamples() int64 {
	if m != nil {
		return m.NumExamples
	}
	return 0
}
func (m *Work) GetNumClients() int64 {
	if m != nil {
		return m.NumClients
	}
	return 0
}
func (m *Work) GetEpoch() int64 {
	if m != nil {
		return m.Epoch
	}
	return 0
}
func (m *Work) GetHyperParams() HyperParams {
	if m != nil {
		return m.HyperParams
	}
	return HyperParams{}
}
func (m *Work) GetTimeTaken() float64 {
	if m != nil {
		return m.TimeTaken
	}
	return 0
}
func (m *Work) GetStarted() time.Time {
	if m != nil {
		return m.Started
	}
	return time.Time{}
}
func (m *Work) GetMetrics() []float64 {
	if m != nil {
		return m.Metrics
	}
	return nil
}
type ModelID struct {
	Domain    string `protobuf:"bytes,1,opt,name=domain,proto3" json:"domain,omitempty"`
	ModelType string `protobuf:"bytes,2,opt,name=model_type,json=modelType,proto3" json:"model_type,omitempty"`
	Id        uint64 `protobuf:"varint,3,opt,name=id,proto3" json:"id,omitempty"`
}
func (m *ModelID) Reset()                    { *m = ModelID{} }
func (*ModelID) ProtoMessage()               {}
func (*ModelID) Descriptor() ([]byte, []int) { return fileDescriptorAggregator, []int{3} }
func (m *ModelID) GetDomain() string {
	if m != nil {
		return m.Domain
	}
	return ""
}
func (m *ModelID) GetModelType() string {
	if m != nil {
		return m.ModelType
	}
	return ""
}
func (m *ModelID) GetId() uint64 {
	if m != nil {
		return m.Id
	}
	return 0
}
type GetWorkRequest struct {
	Id ModelID `protobuf:"bytes,1,opt,name=id" json:"id"`
}
func (m *GetWorkRequest) Reset()                    { *m = GetWorkRequest{} }
func (*GetWorkRequest) ProtoMessage()               {}
func (*GetWorkRequest) Descriptor() ([]byte, []int) { return fileDescriptorAggregator, []int{4} }
func (m *GetWorkRequest) GetId() ModelID {
	if m != nil {
		return m.Id
	}
	return ModelID{}
}
type FindWorkRequest struct {
	Id ModelID `protobuf:"bytes,1,opt,name=id" json:"id"`
}
func (m *FindWorkRequest) Reset()                    { *m = FindWorkRequest{} }
func (*FindWorkRequest) ProtoMessage()               {}
func (*FindWorkRequest) Descriptor() ([]byte, []int) { return fileDescriptorAggregator, []int{5} }
func (m *FindWorkRequest) GetId() ModelID {
	if m != nil {
		return m.Id
	}
	return ModelID{}
}
type FindWorkResponse struct {
	AggregatorAddr string `protobuf:"bytes,1,opt,name=aggregator_addr,json=aggregatorAddr,proto3" json:"aggregator_addr,omitempty"`
}
func (m *FindWorkResponse) Reset()                    { *m = FindWorkResponse{} }
func (*FindWorkResponse) ProtoMessage()               {}
func (*FindWorkResponse) Descriptor() ([]byte, []int) { return fileDescriptorAggregator, []int{6} }
func (m *FindWorkResponse) GetAggregatorAddr() string {
	if m != nil {
		return m.AggregatorAddr
	}
	return ""
}
type ModelWeightChunk struct {
	Body []byte `protobuf:"bytes,1,opt,name=body,proto3" json:"body,omitempty"`
	More bool   `protobuf:"varint,2,opt,name=more,proto3" json:"more,omitempty"`
	Id uint64 `protobuf:"varint,3,opt,name=id,proto3" json:"id,omitempty"`
}
func (m *ModelWeightChunk) Reset()                    { *m = ModelWeightChunk{} }
func (*ModelWeightChunk) ProtoMessage()               {}
func (*ModelWeightChunk) Descriptor() ([]byte, []int) { return fileDescriptorAggregator, []int{7} }
func (m *ModelWeightChunk) GetBody() []byte {
	if m != nil {
		return m.Body
	}
	return nil
}
func (m *ModelWeightChunk) GetMore() bool {
	if m != nil {
		return m.More
	}
	return false
}
func (m *ModelWeightChunk) GetId() uint64 {
	if m != nil {
		return m.Id
	}
	return 0
}
type GetWorkResponse struct {
	Type isGetWorkResponse_Type `protobuf_oneof:"type"`
}
func (m *GetWorkResponse) Reset()                    { *m = GetWorkResponse{} }
func (*GetWorkResponse) ProtoMessage()               {}
func (*GetWorkResponse) Descriptor() ([]byte, []int) { return fileDescriptorAggregator, []int{8} }
type isGetWorkResponse_Type interface {
	isGetWorkResponse_Type()
	Equal(interface{}) bool
	MarshalTo([]byte) (int, error)
	Size() int
}
type GetWorkResponse_Work struct {
	Work *Work `protobuf:"bytes,1,opt,name=work,oneof"`
}
type GetWorkResponse_Weights struct {
	Weights *ModelWeightChunk `protobuf:"bytes,2,opt,name=weights,oneof"`
}
func (*GetWorkResponse_Work) isGetWorkResponse_Type()    {}
func (*GetWorkResponse_Weights) isGetWorkResponse_Type() {}
func (m *GetWorkResponse) GetType() isGetWorkResponse_Type {
	if m != nil {
		return m.Type
	}
	return nil
}
func (m *GetWorkResponse) GetWork() *Work {
	if x, ok := m.GetType().(*GetWorkResponse_Work); ok {
		return x.Work
	}
	return nil
}
func (m *GetWorkResponse) GetWeights() *ModelWeightChunk {
	if x, ok := m.GetType().(*GetWorkResponse_Weights); ok {
		return x.Weights
	}
	return nil
}
func (*GetWorkResponse) XXX_OneofFuncs() (func(msg proto.Message, b *proto.Buffer) error, func(msg proto.Message, tag, wire int, b *proto.Buffer) (bool, error), func(msg proto.Message) (n int), []interface{}) {
	return _GetWorkResponse_OneofMarshaler, _GetWorkResponse_OneofUnmarshaler, _GetWorkResponse_OneofSizer, []interface{}{
		(*GetWorkResponse_Work)(nil),
		(*GetWorkResponse_Weights)(nil),
	}
}
func _GetWorkResponse_OneofMarshaler(msg proto.Message, b *proto.Buffer) error {
	m := msg.(*GetWorkResponse)
	switch x := m.Type.(type) {
	case *GetWorkResponse_Work:
		_ = b.EncodeVarint(1<<3 | proto.WireBytes)
		if err := b.EncodeMessage(x.Work); err != nil {
			return err
		}
	case *GetWorkResponse_Weights:
		_ = b.EncodeVarint(2<<3 | proto.WireBytes)
		if err := b.EncodeMessage(x.Weights); err != nil {
			return err
		}
	case nil:
	default:
		return fmt.Errorf("GetWorkResponse.Type has unexpected type %T", x)
	}
	return nil
}
func _GetWorkResponse_OneofUnmarshaler(msg proto.Message, tag, wire int, b *proto.Buffer) (bool, error) {
	m := msg.(*GetWorkResponse)
	switch tag {
	case 1:  
		if wire != proto.WireBytes {
			return true, proto.ErrInternalBadWireType
		}
		msg := new(Work)
		err := b.DecodeMessage(msg)
		m.Type = &GetWorkResponse_Work{msg}
		return true, err
	case 2:  
		if wire != proto.WireBytes {
			return true, proto.ErrInternalBadWireType
		}
		msg := new(ModelWeightChunk)
		err := b.DecodeMessage(msg)
		m.Type = &GetWorkResponse_Weights{msg}
		return true, err
	default:
		return false, nil
	}
}
func _GetWorkResponse_OneofSizer(msg proto.Message) (n int) {
	m := msg.(*GetWorkResponse)
	switch x := m.Type.(type) {
	case *GetWorkResponse_Work:
		s := proto.Size(x.Work)
		n += proto.SizeVarint(1<<3 | proto.WireBytes)
		n += proto.SizeVarint(uint64(s))
		n += s
	case *GetWorkResponse_Weights:
		s := proto.Size(x.Weights)
		n += proto.SizeVarint(2<<3 | proto.WireBytes)
		n += proto.SizeVarint(uint64(s))
		n += s
	case nil:
	default:
		panic(fmt.Sprintf("proto: unexpected type %T in oneof", x))
	}
	return n
}
type ReportWorkRequest struct {
	Type isReportWorkRequest_Type `protobuf_oneof:"type"`
}
func (m *ReportWorkRequest) Reset()                    { *m = ReportWorkRequest{} }
func (*ReportWorkRequest) ProtoMessage()               {}
func (*ReportWorkRequest) Descriptor() ([]byte, []int) { return fileDescriptorAggregator, []int{9} }
type isReportWorkRequest_Type interface {
	isReportWorkRequest_Type()
	Equal(interface{}) bool
	MarshalTo([]byte) (int, error)
	Size() int
}
type ReportWorkRequest_Work struct {
	Work *Work `protobuf:"bytes,1,opt,name=work,oneof"`
}
type ReportWorkRequest_Weights struct {
	Weights *ModelWeightChunk `protobuf:"bytes,2,opt,name=weights,oneof"`
}
func (*ReportWorkRequest_Work) isReportWorkRequest_Type()    {}
func (*ReportWorkRequest_Weights) isReportWorkRequest_Type() {}
func (m *ReportWorkRequest) GetType() isReportWorkRequest_Type {
	if m != nil {
		return m.Type
	}
	return nil
}
func (m *ReportWorkRequest) GetWork() *Work {
	if x, ok := m.GetType().(*ReportWorkRequest_Work); ok {
		return x.Work
	}
	return nil
}
func (m *ReportWorkRequest) GetWeights() *ModelWeightChunk {
	if x, ok := m.GetType().(*ReportWorkRequest_Weights); ok {
		return x.Weights
	}
	return nil
}