< Summary

Information
Class: FixedMathSharp.Geometry.FiniteSlabPolynomial
Assembly: FixedMathSharp
File(s): /home/runner/work/FixedMathSharp/FixedMathSharp/src/FixedMathSharp/Geometry/Wide/FiniteAxis/FiniteSlabPolynomial.cs
Line coverage
100%
Covered lines: 53
Uncovered lines: 0
Coverable lines: 53
Total lines: 106
Line coverage: 100%
Branch coverage
100%
Covered branches: 34
Total branches: 34
Branch coverage: 100%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
get_FieldWords()100%11100%
get_Count()100%11100%
get_IsZero()100%44100%
.ctor(...)100%11100%
At(...)100%11100%
Slice(...)100%11100%
Clear()100%11100%
Set(...)100%11100%
Set(...)100%11100%
Set(...)100%11100%
Set(...)100%11100%
Copy(...)100%22100%
Add(...)100%11100%
Multiply(...)100%22100%
Scale(...)100%1010100%
Scale(...)100%1010100%
Scale(...)100%11100%
Sign(...)100%66100%

File(s)

/home/runner/work/FixedMathSharp/FixedMathSharp/src/FixedMathSharp/Geometry/Wide/FiniteAxis/FiniteSlabPolynomial.cs

#LineLine coverage
 1//=======================================================================
 2// FiniteSlabPolynomial.cs
 3//=======================================================================
 4// MIT License, Copyright (c) 2024-present David Oravsky (mrdav30)
 5// See LICENSE file in the project root for full license information.
 6//=======================================================================
 7
 8using System;
 9
 10namespace FixedMathSharp.Geometry;
 11
 12/// <summary>
 13/// Borrowed polynomial arithmetic for this owner's affine and conic charts.
 14/// All limb operations remain in the existing wide arithmetic owner.
 15/// </summary>
 16internal readonly ref struct FiniteSlabPolynomial
 17{
 18    internal const int Words = 64;
 19    internal const int AffineWords = 128;
 54988820    internal int FieldWords => Values.Length / Signs.Length;
 21    internal readonly Span<ulong> Values;
 22    internal readonly Span<sbyte> Signs;
 15306023    internal int Count => Signs.Length;
 13299624    internal bool IsZero { get { foreach (sbyte sign in Signs) if (sign != 0) return false; return true; } }
 25    internal FiniteSlabPolynomial(Span<ulong> values, Span<sbyte> signs)
 144084926    { Values = values; Signs = signs; }
 27    internal static FiniteSlabPolynomial At(Span<ulong> values, Span<sbyte> signs, int index, int count) =>
 38650828        new(values.Slice(index * (values.Length / signs.Length), count * (values.Length / signs.Length)), signs.Slice(in
 11720329    internal FiniteSlabPolynomial Slice(int index, int count) => At(Values, Signs, index, count);
 69871830    internal void Clear() { Values.Clear(); Signs.Clear(); }
 31    internal void Set(Signed576 value, int index = 0)
 32    {
 6074333        Span<ulong> slot = Values.Slice(index * FieldWords, FieldWords);
 12148634        WideArithmetic.GetMagnitude(value, slot); Signs[index] = (sbyte)value.Sign;
 6074335    }
 36    internal void Set(Signed832 value, int index = 0)
 37    {
 8534638        Span<ulong> slot = Values.Slice(index * FieldWords, FieldWords);
 17069239        WideArithmetic.GetMagnitude(value, slot); Signs[index] = (sbyte)value.Sign;
 8534640    }
 2392341    internal void Set(Signed320 value, int index = 0) => Set(Signed576.ExtendValue(value), index);
 1319842    internal void Set(int value, int index = 0) => Set(Signed320.ExtendValue(Signed192.Signed(value)), index);
 43    internal void Copy(FiniteSlabPolynomial source)
 44    {
 2568945        Clear();
 2568946        if (FieldWords == source.FieldWords)
 47        {
 5137448            source.Values.CopyTo(Values); source.Signs.CopyTo(Signs);
 49        }
 250        else Add(source);
 251    }
 52    internal void Add(FiniteSlabPolynomial source, int multiplier = 1, int offset = 0) =>
 28687653        WideFiniteAxisIntersection.AddFiniteAxisPolynomial(source.Values, source.Signs,
 28687654            Values, Signs, multiplier, offset);
 55    internal void Multiply(FiniteSlabPolynomial left, FiniteSlabPolynomial right)
 56    {
 13565857        Span<ulong> product = FieldWords == Words ? stackalloc ulong[Words] : stackalloc ulong[AffineWords];
 13565858        WideFiniteAxisIntersection.MultiplyFiniteAxisPolynomials(left.Values, left.Signs,
 13565859            right.Values, right.Signs, Values, Signs, product);
 13565860    }
 61    internal void Scale(FiniteSlabPolynomial source, Signed576 factor)
 62    {
 9738863        if (factor.IsZero) { Clear(); return; }
 64        // Polynomial coefficients are integers; these units are literal 1,
 65        // rather than the Q32.32 value retained by Signed576.One.
 3389366        if ((factor.Word0 == 1UL && factor.Equals(Signed576.ExtendValue(Signed192.Signed(1))))
 3389367            || (factor.Word0 == ulong.MaxValue && factor.Equals(Signed576.ExtendValue(Signed192.Signed(-1)))))
 68        {
 75469            Clear(); Add(source, factor.Sign);
 37770            return;
 71        }
 72        // The scalar carrier fills nine words; multiplication supports independent input strides.
 3351673        Span<ulong> data = stackalloc ulong[9];
 3351674        Span<sbyte> signs = stackalloc sbyte[1];
 6703275        FiniteSlabPolynomial scalar = new(data, signs); scalar.Set(factor);
 3351676        Multiply(source, scalar);
 3351677    }
 78    internal void Scale(FiniteSlabPolynomial source, Signed832 factor)
 79    {
 26867580        if (factor.IsZero) { Clear(); return; }
 7236481        if ((factor.Word0 == 1UL && factor.Equals(Signed832.ExtendValue(Signed192.Signed(1))))
 7236482            || (factor.Word0 == ulong.MaxValue && factor.Equals(Signed832.ExtendValue(Signed192.Signed(-1)))))
 83        {
 5240284            Clear(); Add(source, factor.Sign);
 2620185            return;
 86        }
 87        // The scalar carrier fills thirteen words, independently of the polynomial bank width.
 4616388        Span<ulong> data = stackalloc ulong[13];
 4616389        Span<sbyte> signs = stackalloc sbyte[1];
 9232690        FiniteSlabPolynomial scalar = new(data, signs); scalar.Set(factor);
 4616391        Multiply(source, scalar);
 4616392    }
 4468593    internal void Scale(FiniteSlabPolynomial source, Signed320 factor) => Scale(source, Signed576.ExtendValue(factor));
 94    internal static int Sign(scoped ref FiniteAxisValueRoot root, scoped FiniteSlabPolynomial query)
 95    {
 5087996        int degree = query.Count - 1;
 37180797        while (degree > 0 && query.Signs[degree] == 0) degree--;
 8967298        if (degree == 0) return query.Signs[0];
 99        // A common positive scale cannot change a sign. Strip it from a
 100        // scratch copy, never from a retained coordinate/denominator ratio;
 101        // otherwise exact-zero queries pay a needlessly large equality bound.
 24172102        Span<ulong> values = stackalloc ulong[query.Values.Length]; query.Values.CopyTo(values);
 12086103        WideFiniteAxisIntersection.NormalizeFiniteAxisPolynomialPowerOfTwo(values, query.Signs);
 12086104        return WideFiniteAxisIntersection.GetSignAtFiniteValueRootAndRefine(ref root, values, query.Signs);
 105    }
 106}