// This is a generated file! Please edit source .ksy file and use kaitai-struct-compiler to rebuild
using System;
using System.Collections.Generic;
namespace Kaitai
{
///
/// GGUF is the file format of the [ggml](https://github.com/ggml-org/ggml)
/// tensor library for storing machine learning models, used for example by
/// [llama.cpp](https://github.com/ggml-org/llama.cpp) for inference. It
/// replaced the older GGML, GGMF and GGJT formats.
///
/// A GGUF file consists of a header with metadata as key-value pairs (model
/// architecture, hyperparameters, tokenizer, etc.), a description of each
/// tensor (name, dimensions, type and offset), and finally the tensor data.
///
///
/// Reference: Git tag "v0.27.0"
///
public partial class Gguf : KaitaiStruct
{
public static Gguf FromFile(string fileName)
{
return new Gguf(new KaitaiStream(fileName));
}
public enum GgmlType
{
F32 = 0,
F16 = 1,
Q40 = 2,
Q41 = 3,
Q42 = 4,
Q43 = 5,
Q50 = 6,
Q51 = 7,
Q80 = 8,
Q81 = 9,
Q2K = 10,
Q3K = 11,
Q4K = 12,
Q5K = 13,
Q6K = 14,
Q8K = 15,
Iq2Xxs = 16,
Iq2Xs = 17,
Iq3Xxs = 18,
Iq1S = 19,
Iq4Nl = 20,
Iq3S = 21,
Iq2S = 22,
Iq4Xs = 23,
I8 = 24,
I16 = 25,
I32 = 26,
I64 = 27,
F64 = 28,
Iq1M = 29,
Bf16 = 30,
Q4044 = 31,
Q4048 = 32,
Q4088 = 33,
Tq10 = 34,
Tq20 = 35,
Iq4Nl44 = 36,
Iq4Nl48 = 37,
Iq4Nl88 = 38,
Mxfp4 = 39,
Nvfp4 = 40,
Q10 = 41,
Q20 = 42,
}
public enum GgufType
{
Uint8 = 0,
Int8 = 1,
Uint16 = 2,
Int16 = 3,
Uint32 = 4,
Int32 = 5,
Float32 = 6,
Bool = 7,
String = 8,
Array = 9,
Uint64 = 10,
Int64 = 11,
Float64 = 12,
}
public Gguf(KaitaiStream p__io, KaitaiStruct p__parent = null, Gguf p__root = null) : base(p__io)
{
m_parent = p__parent;
m_root = p__root ?? this;
f_isBigEndian = false;
f_lenFile = false;
f_versionLe = false;
_read();
}
private void _read()
{
_magic = m_io.ReadBytes(4);
if (!((KaitaiStream.ByteArrayCompare(_magic, new byte[] { 71, 71, 85, 70 }) == 0)))
{
throw new ValidationNotEqualError(new byte[] { 71, 71, 85, 70 }, _magic, m_io, "/seq/0");
}
_body = new GgufBody(m_io, this, m_root);
}
public partial class GgufBody : KaitaiStruct
{
public static GgufBody FromFile(string fileName)
{
return new GgufBody(new KaitaiStream(fileName));
}
private bool? m_isLe;
public GgufBody(KaitaiStream p__io, Gguf p__parent = null, Gguf p__root = null) : base(p__io)
{
m_parent = p__parent;
m_root = p__root;
f_alignment = false;
f_ofsTensorData = false;
_read();
}
private void _read()
{
{
bool on = M_Root.IsBigEndian;
if (on == true)
{
m_isLe = (bool) (false);
}
else if (on == false)
{
m_isLe = (bool) (true);
}
}
if (m_isLe == null) {
throw new UndecidedEndiannessError();
} else if (m_isLe == true) {
_readLE();
} else {
_readBE();
}
}
private void _readLE()
{
_version = m_io.ReadU4le();
if (!(_version >= 2))
{
throw new ValidationLessThanError(2, _version, m_io, "/types/gguf_body/seq/0");
}
if (!(_version <= 3))
{
throw new ValidationGreaterThanError(3, _version, m_io, "/types/gguf_body/seq/0");
}
_numTensorInfos = m_io.ReadU8le();
_numKvPairs = m_io.ReadU8le();
_kvPairs = new List();
for (var i = 0; i < NumKvPairs; i++)
{
_kvPairs.Add(new GgufKv((i != 0 ? KvPairs[i - 1].Alignment : 32), m_io, this, m_root, m_isLe));
}
_tensorInfos = new List();
for (var i = 0; i < NumTensorInfos; i++)
{
_tensorInfos.Add(new GgufTensorInfo((i != 0 ? TensorInfos[i - 1].ExpectedNextOffset : 0), m_io, this, m_root, m_isLe));
}
if (NumTensorInfos != 0) {
_padding = m_io.ReadBytes(KaitaiStream.Mod(Alignment - KaitaiStream.Mod(M_Io.Pos, Alignment), Alignment));
}
if (OfsTensorData < 0) {
__unnamed6 = m_io.ReadBytes(0);
}
}
private void _readBE()
{
_version = m_io.ReadU4be();
if (!(_version >= 2))
{
throw new ValidationLessThanError(2, _version, m_io, "/types/gguf_body/seq/0");
}
if (!(_version <= 3))
{
throw new ValidationGreaterThanError(3, _version, m_io, "/types/gguf_body/seq/0");
}
_numTensorInfos = m_io.ReadU8be();
_numKvPairs = m_io.ReadU8be();
_kvPairs = new List();
for (var i = 0; i < NumKvPairs; i++)
{
_kvPairs.Add(new GgufKv((i != 0 ? KvPairs[i - 1].Alignment : 32), m_io, this, m_root, m_isLe));
}
_tensorInfos = new List();
for (var i = 0; i < NumTensorInfos; i++)
{
_tensorInfos.Add(new GgufTensorInfo((i != 0 ? TensorInfos[i - 1].ExpectedNextOffset : 0), m_io, this, m_root, m_isLe));
}
if (NumTensorInfos != 0) {
_padding = m_io.ReadBytes(KaitaiStream.Mod(Alignment - KaitaiStream.Mod(M_Io.Pos, Alignment), Alignment));
}
if (OfsTensorData < 0) {
__unnamed6 = m_io.ReadBytes(0);
}
}
///
/// Nested arrays are supported. Although ggml (v0.27.0) doesn't support them,
/// they are explicitly allowed by `gguf.md` - see
/// <https://github.com/ggml-org/ggml/blob/a05c9922613c6a2230dbb1d0de679519ecafb4f0/docs/gguf.md?plain=1#L221>.
///
public partial class GgufArray : KaitaiStruct
{
public static GgufArray FromFile(string fileName)
{
return new GgufArray(new KaitaiStream(fileName));
}
private bool? m_isLe;
public GgufArray(KaitaiStream p__io, Gguf.GgufBody.GgufValue p__parent = null, Gguf p__root = null, bool? isLe = null) : base(p__io)
{
m_parent = p__parent;
m_root = p__root;
m_isLe = isLe;
_read();
}
private void _read()
{
if (m_isLe == null) {
throw new UndecidedEndiannessError();
} else if (m_isLe == true) {
_readLE();
} else {
_readBE();
}
}
private void _readLE()
{
_type = ((Gguf.GgufType) m_io.ReadU4le());
if (!Enum.IsDefined(typeof(GgufType), _type))
{
throw new ValidationNotInEnumError(_type, m_io, "/types/gguf_body/types/gguf_array/seq/0");
}
_numElems = m_io.ReadU8le();
_elems = new List();
for (var i = 0; i < NumElems; i++)
{
_elems.Add(new GgufValue(Type, m_io, this, m_root, m_isLe));
}
}
private void _readBE()
{
_type = ((Gguf.GgufType) m_io.ReadU4be());
if (!Enum.IsDefined(typeof(GgufType), _type))
{
throw new ValidationNotInEnumError(_type, m_io, "/types/gguf_body/types/gguf_array/seq/0");
}
_numElems = m_io.ReadU8be();
_elems = new List();
for (var i = 0; i < NumElems; i++)
{
_elems.Add(new GgufValue(Type, m_io, this, m_root, m_isLe));
}
}
private GgufType _type;
private ulong _numElems;
private List _elems;
private Gguf m_root;
private Gguf.GgufBody.GgufValue m_parent;
public GgufType Type { get { return _type; } }
public ulong NumElems { get { return _numElems; } }
public List Elems { get { return _elems; } }
public Gguf M_Root { get { return m_root; } }
public Gguf.GgufBody.GgufValue M_Parent { get { return m_parent; } }
}
public partial class GgufBool : KaitaiStruct
{
public static GgufBool FromFile(string fileName)
{
return new GgufBool(new KaitaiStream(fileName));
}
private bool? m_isLe;
public GgufBool(KaitaiStream p__io, Gguf.GgufBody.GgufValue p__parent = null, Gguf p__root = null, bool? isLe = null) : base(p__io)
{
m_parent = p__parent;
m_root = p__root;
m_isLe = isLe;
f_value = false;
_read();
}
private void _read()
{
if (m_isLe == null) {
throw new UndecidedEndiannessError();
} else if (m_isLe == true) {
_readLE();
} else {
_readBE();
}
}
private void _readLE()
{
_valueRaw = m_io.ReadU1();
if (!(_valueRaw <= 1))
{
throw new ValidationGreaterThanError(1, _valueRaw, m_io, "/types/gguf_body/types/gguf_bool/seq/0");
}
}
private void _readBE()
{
_valueRaw = m_io.ReadU1();
if (!(_valueRaw <= 1))
{
throw new ValidationGreaterThanError(1, _valueRaw, m_io, "/types/gguf_body/types/gguf_bool/seq/0");
}
}
private bool f_value;
private bool _value;
///
/// Reference: Git tag "v0.27.0"
///
public bool Value
{
get
{
if (f_value)
return _value;
f_value = true;
_value = (bool) (ValueRaw != 0);
return _value;
}
}
private byte _valueRaw;
private Gguf m_root;
private Gguf.GgufBody.GgufValue m_parent;
public byte ValueRaw { get { return _valueRaw; } }
public Gguf M_Root { get { return m_root; } }
public Gguf.GgufBody.GgufValue M_Parent { get { return m_parent; } }
}
public partial class GgufFloat32 : KaitaiStruct
{
public static GgufFloat32 FromFile(string fileName)
{
return new GgufFloat32(new KaitaiStream(fileName));
}
private bool? m_isLe;
public GgufFloat32(KaitaiStream p__io, Gguf.GgufBody.GgufValue p__parent = null, Gguf p__root = null, bool? isLe = null) : base(p__io)
{
m_parent = p__parent;
m_root = p__root;
m_isLe = isLe;
_read();
}
private void _read()
{
if (m_isLe == null) {
throw new UndecidedEndiannessError();
} else if (m_isLe == true) {
_readLE();
} else {
_readBE();
}
}
private void _readLE()
{
_value = m_io.ReadF4le();
}
private void _readBE()
{
_value = m_io.ReadF4be();
}
private float _value;
private Gguf m_root;
private Gguf.GgufBody.GgufValue m_parent;
public float Value { get { return _value; } }
public Gguf M_Root { get { return m_root; } }
public Gguf.GgufBody.GgufValue M_Parent { get { return m_parent; } }
}
public partial class GgufFloat64 : KaitaiStruct
{
public static GgufFloat64 FromFile(string fileName)
{
return new GgufFloat64(new KaitaiStream(fileName));
}
private bool? m_isLe;
public GgufFloat64(KaitaiStream p__io, Gguf.GgufBody.GgufValue p__parent = null, Gguf p__root = null, bool? isLe = null) : base(p__io)
{
m_parent = p__parent;
m_root = p__root;
m_isLe = isLe;
_read();
}
private void _read()
{
if (m_isLe == null) {
throw new UndecidedEndiannessError();
} else if (m_isLe == true) {
_readLE();
} else {
_readBE();
}
}
private void _readLE()
{
_value = m_io.ReadF8le();
}
private void _readBE()
{
_value = m_io.ReadF8be();
}
private double _value;
private Gguf m_root;
private Gguf.GgufBody.GgufValue m_parent;
public double Value { get { return _value; } }
public Gguf M_Root { get { return m_root; } }
public Gguf.GgufBody.GgufValue M_Parent { get { return m_parent; } }
}
public partial class GgufInt16 : KaitaiStruct
{
public static GgufInt16 FromFile(string fileName)
{
return new GgufInt16(new KaitaiStream(fileName));
}
private bool? m_isLe;
public GgufInt16(KaitaiStream p__io, Gguf.GgufBody.GgufValue p__parent = null, Gguf p__root = null, bool? isLe = null) : base(p__io)
{
m_parent = p__parent;
m_root = p__root;
m_isLe = isLe;
_read();
}
private void _read()
{
if (m_isLe == null) {
throw new UndecidedEndiannessError();
} else if (m_isLe == true) {
_readLE();
} else {
_readBE();
}
}
private void _readLE()
{
_value = m_io.ReadS2le();
}
private void _readBE()
{
_value = m_io.ReadS2be();
}
private short _value;
private Gguf m_root;
private Gguf.GgufBody.GgufValue m_parent;
public short Value { get { return _value; } }
public Gguf M_Root { get { return m_root; } }
public Gguf.GgufBody.GgufValue M_Parent { get { return m_parent; } }
}
public partial class GgufInt32 : KaitaiStruct
{
public static GgufInt32 FromFile(string fileName)
{
return new GgufInt32(new KaitaiStream(fileName));
}
private bool? m_isLe;
public GgufInt32(KaitaiStream p__io, Gguf.GgufBody.GgufValue p__parent = null, Gguf p__root = null, bool? isLe = null) : base(p__io)
{
m_parent = p__parent;
m_root = p__root;
m_isLe = isLe;
_read();
}
private void _read()
{
if (m_isLe == null) {
throw new UndecidedEndiannessError();
} else if (m_isLe == true) {
_readLE();
} else {
_readBE();
}
}
private void _readLE()
{
_value = m_io.ReadS4le();
}
private void _readBE()
{
_value = m_io.ReadS4be();
}
private int _value;
private Gguf m_root;
private Gguf.GgufBody.GgufValue m_parent;
public int Value { get { return _value; } }
public Gguf M_Root { get { return m_root; } }
public Gguf.GgufBody.GgufValue M_Parent { get { return m_parent; } }
}
public partial class GgufInt64 : KaitaiStruct
{
public static GgufInt64 FromFile(string fileName)
{
return new GgufInt64(new KaitaiStream(fileName));
}
private bool? m_isLe;
public GgufInt64(KaitaiStream p__io, Gguf.GgufBody.GgufValue p__parent = null, Gguf p__root = null, bool? isLe = null) : base(p__io)
{
m_parent = p__parent;
m_root = p__root;
m_isLe = isLe;
_read();
}
private void _read()
{
if (m_isLe == null) {
throw new UndecidedEndiannessError();
} else if (m_isLe == true) {
_readLE();
} else {
_readBE();
}
}
private void _readLE()
{
_value = m_io.ReadS8le();
}
private void _readBE()
{
_value = m_io.ReadS8be();
}
private long _value;
private Gguf m_root;
private Gguf.GgufBody.GgufValue m_parent;
public long Value { get { return _value; } }
public Gguf M_Root { get { return m_root; } }
public Gguf.GgufBody.GgufValue M_Parent { get { return m_parent; } }
}
public partial class GgufInt8 : KaitaiStruct
{
public static GgufInt8 FromFile(string fileName)
{
return new GgufInt8(new KaitaiStream(fileName));
}
private bool? m_isLe;
public GgufInt8(KaitaiStream p__io, Gguf.GgufBody.GgufValue p__parent = null, Gguf p__root = null, bool? isLe = null) : base(p__io)
{
m_parent = p__parent;
m_root = p__root;
m_isLe = isLe;
_read();
}
private void _read()
{
if (m_isLe == null) {
throw new UndecidedEndiannessError();
} else if (m_isLe == true) {
_readLE();
} else {
_readBE();
}
}
private void _readLE()
{
_value = m_io.ReadS1();
}
private void _readBE()
{
_value = m_io.ReadS1();
}
private sbyte _value;
private Gguf m_root;
private Gguf.GgufBody.GgufValue m_parent;
public sbyte Value { get { return _value; } }
public Gguf M_Root { get { return m_root; } }
public Gguf.GgufBody.GgufValue M_Parent { get { return m_parent; } }
}
///
/// Reference: Git tag "v0.27.0"
///
public partial class GgufKv : KaitaiStruct
{
private bool? m_isLe;
public GgufKv(uint p_prevAlignment, KaitaiStream p__io, Gguf.GgufBody p__parent = null, Gguf p__root = null, bool? isLe = null) : base(p__io)
{
m_parent = p__parent;
m_root = p__root;
m_isLe = isLe;
_prevAlignment = p_prevAlignment;
f_alignment = false;
_read();
}
private void _read()
{
if (m_isLe == null) {
throw new UndecidedEndiannessError();
} else if (m_isLe == true) {
_readLE();
} else {
_readBE();
}
}
private void _readLE()
{
_key = new GgufStr(m_io, this, m_root, m_isLe);
{
GgufStr M_ = _key;
if (!(M_.LenValue != 0))
{
throw new ValidationExprError(_key, m_io, "/types/gguf_body/types/gguf_kv/seq/0");
}
}
_type = ((Gguf.GgufType) m_io.ReadU4le());
if (!Enum.IsDefined(typeof(GgufType), _type))
{
throw new ValidationNotInEnumError(_type, m_io, "/types/gguf_body/types/gguf_kv/seq/1");
}
_value = new GgufValue(Type, m_io, this, m_root, m_isLe);
{
GgufValue M_ = _value;
if (!((Key.Value == "general.alignment" ? ((Type == Gguf.GgufType.Uint32) && (((Gguf.GgufBody.GgufUint32) (M_.Value)).Value != 0) && ((((Gguf.GgufBody.GgufUint32) (M_.Value)).Value & ((Gguf.GgufBody.GgufUint32) (M_.Value)).Value - 1) == 0)) : true)))
{
throw new ValidationExprError(_value, m_io, "/types/gguf_body/types/gguf_kv/seq/2");
}
}
}
private void _readBE()
{
_key = new GgufStr(m_io, this, m_root, m_isLe);
{
GgufStr M_ = _key;
if (!(M_.LenValue != 0))
{
throw new ValidationExprError(_key, m_io, "/types/gguf_body/types/gguf_kv/seq/0");
}
}
_type = ((Gguf.GgufType) m_io.ReadU4be());
if (!Enum.IsDefined(typeof(GgufType), _type))
{
throw new ValidationNotInEnumError(_type, m_io, "/types/gguf_body/types/gguf_kv/seq/1");
}
_value = new GgufValue(Type, m_io, this, m_root, m_isLe);
{
GgufValue M_ = _value;
if (!((Key.Value == "general.alignment" ? ((Type == Gguf.GgufType.Uint32) && (((Gguf.GgufBody.GgufUint32) (M_.Value)).Value != 0) && ((((Gguf.GgufBody.GgufUint32) (M_.Value)).Value & ((Gguf.GgufBody.GgufUint32) (M_.Value)).Value - 1) == 0)) : true)))
{
throw new ValidationExprError(_value, m_io, "/types/gguf_body/types/gguf_kv/seq/2");
}
}
}
private bool f_alignment;
private uint _alignment;
public uint Alignment
{
get
{
if (f_alignment)
return _alignment;
f_alignment = true;
_alignment = (uint) ((Key.Value == "general.alignment" ? ((Gguf.GgufBody.GgufUint32) (Value.Value)).Value : PrevAlignment));
return _alignment;
}
}
private GgufStr _key;
private GgufType _type;
private GgufValue _value;
private uint _prevAlignment;
private Gguf m_root;
private Gguf.GgufBody m_parent;
public GgufStr Key { get { return _key; } }
public GgufType Type { get { return _type; } }
public GgufValue Value { get { return _value; } }
public uint PrevAlignment { get { return _prevAlignment; } }
public Gguf M_Root { get { return m_root; } }
public Gguf.GgufBody M_Parent { get { return m_parent; } }
}
///
/// Reference: Git tag "v0.27.0"
///
public partial class GgufStr : KaitaiStruct
{
public static GgufStr FromFile(string fileName)
{
return new GgufStr(new KaitaiStream(fileName));
}
private bool? m_isLe;
public GgufStr(KaitaiStream p__io, KaitaiStruct p__parent = null, Gguf p__root = null, bool? isLe = null) : base(p__io)
{
m_parent = p__parent;
m_root = p__root;
m_isLe = isLe;
_read();
}
private void _read()
{
if (m_isLe == null) {
throw new UndecidedEndiannessError();
} else if (m_isLe == true) {
_readLE();
} else {
_readBE();
}
}
private void _readLE()
{
_lenValue = m_io.ReadU8le();
_value = System.Text.Encoding.GetEncoding("UTF-8").GetString(m_io.ReadBytes(LenValue));
}
private void _readBE()
{
_lenValue = m_io.ReadU8be();
_value = System.Text.Encoding.GetEncoding("UTF-8").GetString(m_io.ReadBytes(LenValue));
}
private ulong _lenValue;
private string _value;
private Gguf m_root;
private KaitaiStruct m_parent;
public ulong LenValue { get { return _lenValue; } }
public string Value { get { return _value; } }
public Gguf M_Root { get { return m_root; } }
public KaitaiStruct M_Parent { get { return m_parent; } }
}
///
/// Reference: Git tag "v0.27.0"
///
public partial class GgufTensorInfo : KaitaiStruct
{
private bool? m_isLe;
public GgufTensorInfo(ulong p_expectedOffset, KaitaiStream p__io, Gguf.GgufBody p__parent = null, Gguf p__root = null, bool? isLe = null) : base(p__io)
{
m_parent = p__parent;
m_root = p__root;
m_isLe = isLe;
_expectedOffset = p_expectedOffset;
f_data = false;
f_dumpDims = false;
f_expectedNextOffset = false;
f_lenBlock = false;
f_lenData = false;
f_lenPadding = false;
f_numBlocks = false;
f_numElements = false;
f_numElementsPerBlock = false;
f_padding = false;
_read();
}
private void _read()
{
if (m_isLe == null) {
throw new UndecidedEndiannessError();
} else if (m_isLe == true) {
_readLE();
} else {
_readBE();
}
}
private void _readLE()
{
_name = new GgufStr(m_io, this, m_root, m_isLe);
{
GgufStr M_ = _name;
if (!(M_.LenValue < 64))
{
throw new ValidationExprError(_name, m_io, "/types/gguf_body/types/gguf_tensor_info/seq/0");
}
}
_numDims = m_io.ReadU4le();
if (!(_numDims <= 4))
{
throw new ValidationGreaterThanError(4, _numDims, m_io, "/types/gguf_body/types/gguf_tensor_info/seq/1");
}
_dims = new List();
for (var i = 0; i < NumDims; i++)
{
_dims.Add(m_io.ReadS8le());
if (!(_dims[i] >= 0))
{
throw new ValidationLessThanError(0, _dims[i], m_io, "/types/gguf_body/types/gguf_tensor_info/seq/2");
}
}
_type = ((Gguf.GgmlType) m_io.ReadU4le());
{
GgmlType M_ = _type;
if (!( ((((int) M_) < 43) && (NumElementsPerBlock != 0) && (KaitaiStream.Mod((NumDims > 0 ? Dims[0] : 1), NumElementsPerBlock) == 0)) ))
{
throw new ValidationExprError(_type, m_io, "/types/gguf_body/types/gguf_tensor_info/seq/3");
}
}
_offset = m_io.ReadU8le();
if (!(_offset == ExpectedOffset))
{
throw new ValidationNotEqualError(ExpectedOffset, _offset, m_io, "/types/gguf_body/types/gguf_tensor_info/seq/4");
}
}
private void _readBE()
{
_name = new GgufStr(m_io, this, m_root, m_isLe);
{
GgufStr M_ = _name;
if (!(M_.LenValue < 64))
{
throw new ValidationExprError(_name, m_io, "/types/gguf_body/types/gguf_tensor_info/seq/0");
}
}
_numDims = m_io.ReadU4be();
if (!(_numDims <= 4))
{
throw new ValidationGreaterThanError(4, _numDims, m_io, "/types/gguf_body/types/gguf_tensor_info/seq/1");
}
_dims = new List();
for (var i = 0; i < NumDims; i++)
{
_dims.Add(m_io.ReadS8be());
if (!(_dims[i] >= 0))
{
throw new ValidationLessThanError(0, _dims[i], m_io, "/types/gguf_body/types/gguf_tensor_info/seq/2");
}
}
_type = ((Gguf.GgmlType) m_io.ReadU4be());
{
GgmlType M_ = _type;
if (!( ((((int) M_) < 43) && (NumElementsPerBlock != 0) && (KaitaiStream.Mod((NumDims > 0 ? Dims[0] : 1), NumElementsPerBlock) == 0)) ))
{
throw new ValidationExprError(_type, m_io, "/types/gguf_body/types/gguf_tensor_info/seq/3");
}
}
_offset = m_io.ReadU8be();
if (!(_offset == ExpectedOffset))
{
throw new ValidationNotEqualError(ExpectedOffset, _offset, m_io, "/types/gguf_body/types/gguf_tensor_info/seq/4");
}
}
private bool f_data;
private byte[] _data;
public byte[] Data
{
get
{
if (f_data)
return _data;
f_data = true;
long _pos = m_io.Pos;
m_io.Seek(M_Parent.OfsTensorData + Offset);
if (m_isLe == true) {
_data = m_io.ReadBytes(LenData);
} else {
_data = m_io.ReadBytes(LenData);
}
m_io.Seek(_pos);
return _data;
}
}
private bool f_dumpDims;
private string _dumpDims;
///
/// `dims` joined with the string `" x "`. This is necessary for
/// `-webide-representation`, which cannot format `dims` directly -
/// see <https://github.com/kaitai-io/kaitai_struct_webide/issues/160>.
///
public string DumpDims
{
get
{
if (f_dumpDims)
return _dumpDims;
f_dumpDims = true;
_dumpDims = (string) ((((NumDims > 0 ? Dims[0].ToString() : "") + (NumDims > 1 ? " x " + Dims[1].ToString() : "")) + (NumDims > 2 ? " x " + Dims[2].ToString() : "")) + (NumDims > 3 ? " x " + Dims[3].ToString() : ""));
return _dumpDims;
}
}
private bool f_expectedNextOffset;
private ulong _expectedNextOffset;
///
/// `offset` that the next tensor must have
///
public ulong ExpectedNextOffset
{
get
{
if (f_expectedNextOffset)
return _expectedNextOffset;
f_expectedNextOffset = true;
_expectedNextOffset = (ulong) (((ulong) ((Offset + LenData) + LenPadding)));
return _expectedNextOffset;
}
}
private bool f_lenBlock;
private int _lenBlock;
///
/// Size of a block in bytes
///
public int LenBlock
{
get
{
if (f_lenBlock)
return _lenBlock;
f_lenBlock = true;
_lenBlock = (int) (new List { 4, 2, 18, 20, 0, 0, 22, 24, 34, 36, 84, 110, 144, 176, 210, 292, 66, 74, 98, 50, 18, 110, 82, 136, 1, 2, 4, 8, 8, 56, 2, 0, 0, 0, 54, 66, 0, 0, 0, 17, 36, 18, 18 }[((int) Type)]);
return _lenBlock;
}
}
private bool f_lenData;
private ulong _lenData;
public ulong LenData
{
get
{
if (f_lenData)
return _lenData;
f_lenData = true;
_lenData = (ulong) (((ulong) (LenBlock * NumBlocks)));
return _lenData;
}
}
private bool f_lenPadding;
private int _lenPadding;
///
/// Number of padding bytes after the data
///
public int LenPadding
{
get
{
if (f_lenPadding)
return _lenPadding;
f_lenPadding = true;
_lenPadding = (int) (KaitaiStream.Mod(M_Parent.Alignment - KaitaiStream.Mod(LenData, M_Parent.Alignment), M_Parent.Alignment));
return _lenPadding;
}
}
private bool f_numBlocks;
private long _numBlocks;
public long NumBlocks
{
get
{
if (f_numBlocks)
return _numBlocks;
f_numBlocks = true;
_numBlocks = (long) (((long) (NumElements / NumElementsPerBlock)));
return _numBlocks;
}
}
private bool f_numElements;
private long _numElements;
public long NumElements
{
get
{
if (f_numElements)
return _numElements;
f_numElements = true;
_numElements = (long) (((long) ((((NumDims > 0 ? Dims[0] : 1) * (NumDims > 1 ? Dims[1] : 1)) * (NumDims > 2 ? Dims[2] : 1)) * (NumDims > 3 ? Dims[3] : 1))));
return _numElements;
}
}
private bool f_numElementsPerBlock;
private int _numElementsPerBlock;
///
/// Number of elements in a block
///
public int NumElementsPerBlock
{
get
{
if (f_numElementsPerBlock)
return _numElementsPerBlock;
f_numElementsPerBlock = true;
_numElementsPerBlock = (int) (new List { 1, 1, 32, 32, 0, 0, 32, 32, 32, 32, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 32, 256, 256, 256, 1, 1, 1, 1, 1, 256, 1, 0, 0, 0, 256, 256, 0, 0, 0, 32, 64, 128, 64 }[((int) Type)]);
return _numElementsPerBlock;
}
}
private bool f_padding;
private byte[] _padding;
///
/// Padding after the data. ggml requires it even after the last tensor
/// when reading the tensor data.
///
///
/// Reference: Git tag "v0.27.0"
///
public byte[] Padding
{
get
{
if (f_padding)
return _padding;
f_padding = true;
long _pos = m_io.Pos;
m_io.Seek((M_Parent.OfsTensorData + Offset) + LenData);
if (m_isLe == true) {
_padding = m_io.ReadBytes(LenPadding);
} else {
_padding = m_io.ReadBytes(LenPadding);
}
m_io.Seek(_pos);
return _padding;
}
}
private GgufStr _name;
private uint _numDims;
private List _dims;
private GgmlType _type;
private ulong _offset;
private ulong _expectedOffset;
private Gguf m_root;
private Gguf.GgufBody m_parent;
public GgufStr Name { get { return _name; } }
public uint NumDims { get { return _numDims; } }
public List Dims { get { return _dims; } }
public GgmlType Type { get { return _type; } }
///
/// Offset of the tensor's data, relative to `_parent.ofs_tensor_data`
///
public ulong Offset { get { return _offset; } }
public ulong ExpectedOffset { get { return _expectedOffset; } }
public Gguf M_Root { get { return m_root; } }
public Gguf.GgufBody M_Parent { get { return m_parent; } }
}
public partial class GgufUint16 : KaitaiStruct
{
public static GgufUint16 FromFile(string fileName)
{
return new GgufUint16(new KaitaiStream(fileName));
}
private bool? m_isLe;
public GgufUint16(KaitaiStream p__io, Gguf.GgufBody.GgufValue p__parent = null, Gguf p__root = null, bool? isLe = null) : base(p__io)
{
m_parent = p__parent;
m_root = p__root;
m_isLe = isLe;
_read();
}
private void _read()
{
if (m_isLe == null) {
throw new UndecidedEndiannessError();
} else if (m_isLe == true) {
_readLE();
} else {
_readBE();
}
}
private void _readLE()
{
_value = m_io.ReadU2le();
}
private void _readBE()
{
_value = m_io.ReadU2be();
}
private ushort _value;
private Gguf m_root;
private Gguf.GgufBody.GgufValue m_parent;
public ushort Value { get { return _value; } }
public Gguf M_Root { get { return m_root; } }
public Gguf.GgufBody.GgufValue M_Parent { get { return m_parent; } }
}
public partial class GgufUint32 : KaitaiStruct
{
public static GgufUint32 FromFile(string fileName)
{
return new GgufUint32(new KaitaiStream(fileName));
}
private bool? m_isLe;
public GgufUint32(KaitaiStream p__io, Gguf.GgufBody.GgufValue p__parent = null, Gguf p__root = null, bool? isLe = null) : base(p__io)
{
m_parent = p__parent;
m_root = p__root;
m_isLe = isLe;
_read();
}
private void _read()
{
if (m_isLe == null) {
throw new UndecidedEndiannessError();
} else if (m_isLe == true) {
_readLE();
} else {
_readBE();
}
}
private void _readLE()
{
_value = m_io.ReadU4le();
}
private void _readBE()
{
_value = m_io.ReadU4be();
}
private uint _value;
private Gguf m_root;
private Gguf.GgufBody.GgufValue m_parent;
public uint Value { get { return _value; } }
public Gguf M_Root { get { return m_root; } }
public Gguf.GgufBody.GgufValue M_Parent { get { return m_parent; } }
}
public partial class GgufUint64 : KaitaiStruct
{
public static GgufUint64 FromFile(string fileName)
{
return new GgufUint64(new KaitaiStream(fileName));
}
private bool? m_isLe;
public GgufUint64(KaitaiStream p__io, Gguf.GgufBody.GgufValue p__parent = null, Gguf p__root = null, bool? isLe = null) : base(p__io)
{
m_parent = p__parent;
m_root = p__root;
m_isLe = isLe;
_read();
}
private void _read()
{
if (m_isLe == null) {
throw new UndecidedEndiannessError();
} else if (m_isLe == true) {
_readLE();
} else {
_readBE();
}
}
private void _readLE()
{
_value = m_io.ReadU8le();
}
private void _readBE()
{
_value = m_io.ReadU8be();
}
private ulong _value;
private Gguf m_root;
private Gguf.GgufBody.GgufValue m_parent;
public ulong Value { get { return _value; } }
public Gguf M_Root { get { return m_root; } }
public Gguf.GgufBody.GgufValue M_Parent { get { return m_parent; } }
}
public partial class GgufUint8 : KaitaiStruct
{
public static GgufUint8 FromFile(string fileName)
{
return new GgufUint8(new KaitaiStream(fileName));
}
private bool? m_isLe;
public GgufUint8(KaitaiStream p__io, Gguf.GgufBody.GgufValue p__parent = null, Gguf p__root = null, bool? isLe = null) : base(p__io)
{
m_parent = p__parent;
m_root = p__root;
m_isLe = isLe;
_read();
}
private void _read()
{
if (m_isLe == null) {
throw new UndecidedEndiannessError();
} else if (m_isLe == true) {
_readLE();
} else {
_readBE();
}
}
private void _readLE()
{
_value = m_io.ReadU1();
}
private void _readBE()
{
_value = m_io.ReadU1();
}
private byte _value;
private Gguf m_root;
private Gguf.GgufBody.GgufValue m_parent;
public byte Value { get { return _value; } }
public Gguf M_Root { get { return m_root; } }
public Gguf.GgufBody.GgufValue M_Parent { get { return m_parent; } }
}
///
/// Reference: Git tag "v0.27.0"
///
public partial class GgufValue : KaitaiStruct
{
private bool? m_isLe;
public GgufValue(GgufType p_type, KaitaiStream p__io, KaitaiStruct p__parent = null, Gguf p__root = null, bool? isLe = null) : base(p__io)
{
m_parent = p__parent;
m_root = p__root;
m_isLe = isLe;
_type = p_type;
_read();
}
private void _read()
{
if (m_isLe == null) {
throw new UndecidedEndiannessError();
} else if (m_isLe == true) {
_readLE();
} else {
_readBE();
}
}
private void _readLE()
{
switch (Type) {
case Gguf.GgufType.Array: {
_value = new GgufArray(m_io, this, m_root, m_isLe);
break;
}
case Gguf.GgufType.Bool: {
_value = new GgufBool(m_io, this, m_root, m_isLe);
break;
}
case Gguf.GgufType.Float32: {
_value = new GgufFloat32(m_io, this, m_root, m_isLe);
break;
}
case Gguf.GgufType.Float64: {
_value = new GgufFloat64(m_io, this, m_root, m_isLe);
break;
}
case Gguf.GgufType.Int16: {
_value = new GgufInt16(m_io, this, m_root, m_isLe);
break;
}
case Gguf.GgufType.Int32: {
_value = new GgufInt32(m_io, this, m_root, m_isLe);
break;
}
case Gguf.GgufType.Int64: {
_value = new GgufInt64(m_io, this, m_root, m_isLe);
break;
}
case Gguf.GgufType.Int8: {
_value = new GgufInt8(m_io, this, m_root, m_isLe);
break;
}
case Gguf.GgufType.String: {
_value = new GgufStr(m_io, this, m_root, m_isLe);
break;
}
case Gguf.GgufType.Uint16: {
_value = new GgufUint16(m_io, this, m_root, m_isLe);
break;
}
case Gguf.GgufType.Uint32: {
_value = new GgufUint32(m_io, this, m_root, m_isLe);
break;
}
case Gguf.GgufType.Uint64: {
_value = new GgufUint64(m_io, this, m_root, m_isLe);
break;
}
case Gguf.GgufType.Uint8: {
_value = new GgufUint8(m_io, this, m_root, m_isLe);
break;
}
}
}
private void _readBE()
{
switch (Type) {
case Gguf.GgufType.Array: {
_value = new GgufArray(m_io, this, m_root, m_isLe);
break;
}
case Gguf.GgufType.Bool: {
_value = new GgufBool(m_io, this, m_root, m_isLe);
break;
}
case Gguf.GgufType.Float32: {
_value = new GgufFloat32(m_io, this, m_root, m_isLe);
break;
}
case Gguf.GgufType.Float64: {
_value = new GgufFloat64(m_io, this, m_root, m_isLe);
break;
}
case Gguf.GgufType.Int16: {
_value = new GgufInt16(m_io, this, m_root, m_isLe);
break;
}
case Gguf.GgufType.Int32: {
_value = new GgufInt32(m_io, this, m_root, m_isLe);
break;
}
case Gguf.GgufType.Int64: {
_value = new GgufInt64(m_io, this, m_root, m_isLe);
break;
}
case Gguf.GgufType.Int8: {
_value = new GgufInt8(m_io, this, m_root, m_isLe);
break;
}
case Gguf.GgufType.String: {
_value = new GgufStr(m_io, this, m_root, m_isLe);
break;
}
case Gguf.GgufType.Uint16: {
_value = new GgufUint16(m_io, this, m_root, m_isLe);
break;
}
case Gguf.GgufType.Uint32: {
_value = new GgufUint32(m_io, this, m_root, m_isLe);
break;
}
case Gguf.GgufType.Uint64: {
_value = new GgufUint64(m_io, this, m_root, m_isLe);
break;
}
case Gguf.GgufType.Uint8: {
_value = new GgufUint8(m_io, this, m_root, m_isLe);
break;
}
}
}
private KaitaiStruct _value;
private GgufType _type;
private Gguf m_root;
private KaitaiStruct m_parent;
public KaitaiStruct Value { get { return _value; } }
public GgufType Type { get { return _type; } }
public Gguf M_Root { get { return m_root; } }
public KaitaiStruct M_Parent { get { return m_parent; } }
}
private bool f_alignment;
private uint _alignment;
///
/// Global alignment - from the `general.alignment` key, or 32 if there's no
/// such key.
///
///
/// Reference: Git tag "v0.27.0"
///
public uint Alignment
{
get
{
if (f_alignment)
return _alignment;
f_alignment = true;
_alignment = (uint) ((KvPairs.Count != 0 ? KvPairs[KvPairs.Count - 1].Alignment : 32));
return _alignment;
}
}
private bool f_ofsTensorData;
private ulong _ofsTensorData;
///
/// Offset of the tensor data. Each tensor's `offset` is relative to this
/// position.
///
public ulong OfsTensorData
{
get
{
if (f_ofsTensorData)
return _ofsTensorData;
f_ofsTensorData = true;
_ofsTensorData = (ulong) (((ulong) (M_Io.Pos)));
return _ofsTensorData;
}
}
private uint _version;
private ulong _numTensorInfos;
private ulong _numKvPairs;
private List _kvPairs;
private List _tensorInfos;
private byte[] _padding;
private byte[] __unnamed6;
private Gguf m_root;
private Gguf m_parent;
///
/// File format version. Version 1 used 32-bit counts and lengths, which
/// this Kaitai Struct implementation doesn't support, and neither does
/// ggml.
///
public uint Version { get { return _version; } }
///
/// The number of tensors in the file
///
public ulong NumTensorInfos { get { return _numTensorInfos; } }
///
/// The number of key-value pairs in the file header
///
public ulong NumKvPairs { get { return _numKvPairs; } }
///
/// Key-value pairs. ggml (v0.27.0)
/// [rejects](https://github.com/ggml-org/ggml/blob/a05c9922613c6a2230dbb1d0de679519ecafb4f0/src/gguf.cpp#L575-L578)
/// duplicate keys, but this Kaitai Struct implementation can't detect
/// them. If there are multiple `general.alignment` keys, the last one is
/// used for the `alignment` value instance.
///
public List KvPairs { get { return _kvPairs; } }
///
/// Tensor metadata. ggml (v0.27.0)
/// [rejects](https://github.com/ggml-org/ggml/blob/a05c9922613c6a2230dbb1d0de679519ecafb4f0/src/gguf.cpp#L664-L669)
/// duplicate tensor names, but this Kaitai Struct implementation can't
/// detect them.
///
public List TensorInfos { get { return _tensorInfos; } }
///
/// Reference: Git tag "v0.27.0"
///
public byte[] Padding { get { return _padding; } }
public byte[] Unnamed_6 { get { return __unnamed6; } }
public Gguf M_Root { get { return m_root; } }
public Gguf M_Parent { get { return m_parent; } }
}
private bool f_isBigEndian;
private bool _isBigEndian;
public bool IsBigEndian
{
get
{
if (f_isBigEndian)
return _isBigEndian;
f_isBigEndian = true;
_isBigEndian = (bool) ((VersionLe & 65535) == 0);
return _isBigEndian;
}
}
private bool f_lenFile;
private ulong _lenFile;
///
/// Length of the file (computed from the header), including the padding after
/// the last tensor's data.
///
/// This Kaitai Struct implementation stops parsing where the tensor data
/// starts (which is read lazily, i.e. only on demand). Without reading the
/// tensor data, you can use this expected file size to check whether the file
/// has been truncated, to carve the file out of a larger one, etc.
///
public ulong LenFile
{
get
{
if (f_lenFile)
return _lenFile;
f_lenFile = true;
_lenFile = (ulong) (((ulong) (Body.OfsTensorData + (Body.NumTensorInfos != 0 ? Body.TensorInfos[Body.TensorInfos.Count - 1].ExpectedNextOffset : 0))));
return _lenFile;
}
}
private bool f_versionLe;
private uint _versionLe;
public uint VersionLe
{
get
{
if (f_versionLe)
return _versionLe;
f_versionLe = true;
long _pos = m_io.Pos;
m_io.Seek(4);
_versionLe = m_io.ReadU4le();
m_io.Seek(_pos);
return _versionLe;
}
}
private byte[] _magic;
private GgufBody _body;
private Gguf m_root;
private KaitaiStruct m_parent;
///
/// GGUF file magic
///
public byte[] Magic { get { return _magic; } }
public GgufBody Body { get { return _body; } }
public Gguf M_Root { get { return m_root; } }
public KaitaiStruct M_Parent { get { return m_parent; } }
}
}