using System; using System.Runtime.CompilerServices; using System.Numerics.Tensors; namespace Sandbox; /// /// Provides vectorized operations over a span of floats. /// public ref struct FloatSpan { Span _span; public FloatSpan( Span span ) { _span = span; } [MethodImpl( MethodImplOptions.AggressiveInlining )] public float Max() { return _span.IsEmpty ? 0.0f : TensorPrimitives.Max( _span ); } [MethodImpl( MethodImplOptions.AggressiveInlining )] public float Min() { return _span.IsEmpty ? 0.0f : TensorPrimitives.Min( _span ); } [MethodImpl( MethodImplOptions.AggressiveInlining )] public float Average() { return _span.IsEmpty ? 0.0f : TensorPrimitives.Average( _span ); } [MethodImpl( MethodImplOptions.AggressiveInlining )] public float Sum() { return _span.IsEmpty ? 0.0f : TensorPrimitives.Sum( _span ); } [MethodImpl( MethodImplOptions.AggressiveInlining )] public void Set( float value ) { _span.Fill( value ); } [MethodImpl( MethodImplOptions.AggressiveInlining )] public readonly void Set( ReadOnlySpan values ) { values.CopyTo( _span ); } [MethodImpl( MethodImplOptions.AggressiveInlining )] public readonly void CopyScaled( ReadOnlySpan values, float scale ) { TensorPrimitives.Multiply( values, scale, _span ); } [MethodImpl( MethodImplOptions.AggressiveInlining )] public readonly void Add( ReadOnlySpan values ) { TensorPrimitives.Add( _span, values, _span ); } [MethodImpl( MethodImplOptions.AggressiveInlining )] public readonly void AddScaled( ReadOnlySpan values, float scale ) { TensorPrimitives.MultiplyAdd( values, scale, _span, _span ); } [MethodImpl( MethodImplOptions.AggressiveInlining )] public readonly void Scale( float scale ) { TensorPrimitives.Multiply( _span, scale, _span ); } }