tests/common/mhr_fixture.cs
using HumanoidMocapX.Inference;

static class MhrFixture
{
    internal const int Joints = 5, Vertices = 4, Identities = 3, Expressions = 2, ModelParameters = 9, Hidden = 7;
    internal static readonly long[] Indices = { 0, 1, 1, 2, 4, 6, 2, 0, 0, 1, 1, 4, 8, 17, 6, 9 };

    internal static Dictionary<string, Tensor> Tensors()
    {
        var values = new Dictionary<string, Tensor>();
        OmegaFixture.Add(values, MhrSkeleton.Prefix + "blend_shape.base_shape", 3, Vertices);
        OmegaFixture.Add(values, MhrSkeleton.Prefix + "blend_shape.shape_vectors", 3, Vertices, Identities);
        OmegaFixture.Add(values, "face_expressions_model.shape_vectors", 3, Vertices, Expressions);
        OmegaFixture.Add(values, MhrCorrectives.Prefix + "0.sparse_weight", Indices.Length / 2);
        OmegaFixture.Add(values, MhrCorrectives.Prefix + "2.weight", Hidden, Vertices * 3);
        OmegaFixture.Add(values, MhrSkeleton.Prefix + "parameter_transform.parameter_transform", ModelParameters + Identities, Joints * 7);
        OmegaFixture.Add(values, MhrSkeleton.Prefix + "skeleton.joint_translation_offsets", 3, Joints);
        var pre = new float[Joints * 4]; for (var i = 0; i < Joints; i++) pre[i * 4 + 3] = 1;
        var name = MhrSkeleton.Prefix + "skeleton.joint_prerotations"; values.Add(name, new(name, pre, new[] { 4, Joints }));
        return values;
    }

    internal static MhrBody Body(Dictionary<string, Tensor> tensors)
    {
        var weights = new FlowWeights(tensors); var parents = new[] { -1, 0, 1, 1, 3 };
        return new(new(weights, parents, ModelParameters + Identities), Skinning(),
            new(weights, Vertices, Identities, Expressions), new(weights, Indices, Joints, Hidden, Vertices));
    }

    internal static MhrSkinning Skinning()
    {
        var bind = new float[Joints * 8];
        for (var i = 0; i < Joints; i++) { bind[i * 8 + 6] = 1; bind[i * 8 + 7] = 1; }
        return new(bind, new[] { 0, 2, 3, 4 }, new[] { 0, 1, 2, 3 }, new[] { 1f, 1, 1, 1 }, Vertices);
    }
}