Coverage for src \ pavpen \ geometry_calculator \ vector_field_implementations \ tuple_float_vector_field_operations.py: 100%

24 statements  

« prev     ^ index     » next       coverage.py v7.13.5, created at 2026-04-27 03:59 -0400

1# SPDX-FileCopyrightText: 2026-present Pavel M. Penev <pavpen@gmail.com> 

2# 

3# SPDX-License-Identifier: MIT 

4 

5from typing import cast 

6 

7from pavpen.geometry_calculator.float_vector_field_operations import FloatVectorFieldOperations 

8 

9 

10class TupleFloatVectorFieldOperations[Vector: tuple[float, ...]](FloatVectorFieldOperations[Vector]): 

11 """Treats tuples of floats as vectors in an orthonormal space""" 

12 

13 @staticmethod 

14 def for_1d() -> "TupleFloatVectorFieldOperations[tuple[float]]": 

15 return TupleFloatVectorFieldOperations[tuple[float]](component_count=1) 

16 

17 @staticmethod 

18 def for_2d() -> "TupleFloatVectorFieldOperations[tuple[float, float]]": 

19 return TupleFloatVectorFieldOperations[tuple[float, float]](component_count=2) 

20 

21 @staticmethod 

22 def for_3d() -> "TupleFloatVectorFieldOperations[tuple[float, float,float]]": 

23 return TupleFloatVectorFieldOperations[tuple[float, float, float]](component_count=3) 

24 

25 def __init__(self, component_count: int) -> None: 

26 super().__init__() 

27 self._component_count = component_count 

28 

29 @property 

30 def additive_identity(self) -> Vector: 

31 return cast("Vector", (0,) * self._component_count) 

32 

33 def added(self, addend1: Vector, addend2: Vector) -> Vector: 

34 return cast( 

35 "Vector", 

36 tuple(coordinate1 + coordinate2 for coordinate1, coordinate2 in zip(addend1, addend2, strict=False)), 

37 ) 

38 

39 def scaled(self, multiplicand: Vector, scalar: float) -> Vector: 

40 return cast("Vector", tuple(coordinate * scalar for coordinate in multiplicand)) 

41 

42 def inner_multiplied(self, multiplicand1: Vector, multiplicand2: Vector) -> float: 

43 return sum( 

44 coordinate1 * coordinate2 for coordinate1, coordinate2 in zip(multiplicand1, multiplicand2, strict=False) 

45 )