# automatically generated by the FlatBuffers compiler, do not modify

# namespace: tflite

import flatbuffers
from flatbuffers.compat import import_numpy
np = import_numpy()

class RandomOptions(object):
    __slots__ = ['_tab']

    @classmethod
    def GetRootAs(cls, buf, offset=0):
        n = flatbuffers.encode.Get(flatbuffers.packer.uoffset, buf, offset)
        x = RandomOptions()
        x.Init(buf, n + offset)
        return x

    @classmethod
    def GetRootAsRandomOptions(cls, buf, offset=0):
        """This method is deprecated. Please switch to GetRootAs."""
        return cls.GetRootAs(buf, offset)
    @classmethod
    def RandomOptionsBufferHasIdentifier(cls, buf, offset, size_prefixed=False):
        return flatbuffers.util.BufferHasIdentifier(buf, offset, b"\x54\x46\x4C\x33", size_prefixed=size_prefixed)

    # RandomOptions
    def Init(self, buf, pos):
        self._tab = flatbuffers.table.Table(buf, pos)

    # RandomOptions
    def Seed(self):
        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(4))
        if o != 0:
            return self._tab.Get(flatbuffers.number_types.Int64Flags, o + self._tab.Pos)
        return 0

    # RandomOptions
    def Seed2(self):
        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(6))
        if o != 0:
            return self._tab.Get(flatbuffers.number_types.Int64Flags, o + self._tab.Pos)
        return 0

def RandomOptionsStart(builder): builder.StartObject(2)
def Start(builder):
    return RandomOptionsStart(builder)
def RandomOptionsAddSeed(builder, seed): builder.PrependInt64Slot(0, seed, 0)
def AddSeed(builder, seed):
    return RandomOptionsAddSeed(builder, seed)
def RandomOptionsAddSeed2(builder, seed2): builder.PrependInt64Slot(1, seed2, 0)
def AddSeed2(builder, seed2):
    return RandomOptionsAddSeed2(builder, seed2)
def RandomOptionsEnd(builder): return builder.EndObject()
def End(builder):
    return RandomOptionsEnd(builder)