Editor/Inference/SamDecoderShape.cs
using System;

namespace HumanoidMocapX.Inference;

internal readonly record struct SamDecoderShape
{
    internal const int Layers = 6;
    internal int Tokens { get; }
    internal int ImageTokens { get; }
    internal int Width { get; }
    internal int ContextWidth { get; }
    internal int Heads { get; }
    internal int HeadWidth { get; }
    internal int HiddenWidth { get; }
    internal int AttentionWidth => Heads * HeadWidth;
    internal int TokenElements => Tokens * Width;
    internal int ImageElements => ImageTokens * ContextWidth;

    internal SamDecoderShape(int tokens, int imageTokens, int width = 1024, int contextWidth = 1280,
        int heads = 8, int headWidth = 64, int hiddenWidth = 1024)
    {
        if (tokens < 1 || tokens > 512 || imageTokens < 1 || imageTokens > 1024 || width < 1 || width > 2048
            || contextWidth < 1 || contextWidth > 2048 || heads < 1 || heads > 32 || headWidth < 1 || headWidth > 128
            || hiddenWidth < 1 || hiddenWidth > 8192) throw new ArgumentException("Invalid SAM decoder dimensions.");
        Tokens = tokens; ImageTokens = imageTokens; Width = width; ContextWidth = contextWidth;
        Heads = heads; HeadWidth = headWidth; HiddenWidth = hiddenWidth;
    }
}