This documentation is automatically generated by online-judge-tools/verification-helper
import cp_library.math.linalg.__header__
import operator
from numbers import Number
from typing import Sequence
from cp_library.math.linalg.elm_wise_mixin import ElmWiseMixin
class ElmWiseInPlaceMixin(ElmWiseMixin):
def ielm_wise(self, other, op):
if isinstance(other, Number):
for i in range(len(self)):
self[i] = op(self[i], other)
elif isinstance(other, Sequence) and len(self) == len(other):
for i in range(len(self)):
self[i] = op(self[i], other[i])
else:
raise ValueError("Operand must be a number or a list of the same length")
return self
def __iadd__(self, other): return self.ielm_wise(other, operator.add)
def __isub__(self, other): return self.ielm_wise(other, operator.sub)
def __imul__(self, other): return self.ielm_wise(other, operator.mul)
def __itruediv__(self, other): return self.ielm_wise(other, operator.truediv)
def __ifloordiv__(self, other): return self.ielm_wise(other, operator.floordiv)
def __imod__(self, other): return self.ielm_wise(other, operator.mod)
import operator
from numbers import Number
from typing import Sequence
from math import hypot
'''
╺━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╸
https://kobejean.github.io/cp-library
'''
class ElmWiseMixin:
def elm_wise(self, other, op):
if isinstance(other, Number):
return type(self)(op(x, other) for x in self)
if isinstance(other, Sequence):
return type(self)(op(x, y) for x, y in zip(self, other))
raise ValueError("Operand must be a number or a tuple of the same length")
def __add__(self, other): return self.elm_wise(other, operator.add)
def __radd__(self, other): return self.elm_wise(other, operator.add)
def __sub__(self, other): return self.elm_wise(other, operator.sub)
def __rsub__(self, other): return self.elm_wise(other, lambda x,y: operator.sub(y,x))
def __mul__(self, other): return self.elm_wise(other, operator.mul)
def __rmul__(self, other): return self.elm_wise(other, operator.mul)
def __truediv__(self, other): return self.elm_wise(other, operator.truediv)
def __rtruediv__(self, other): return self.elm_wise(other, lambda x,y: operator.truediv(y,x))
def __floordiv__(self, other): return self.elm_wise(other, operator.floordiv)
def __rfloordiv__(self, other): return self.elm_wise(other, lambda x,y: operator.floordiv(y,x))
def __mod__(self, other): return self.elm_wise(other, operator.mod)
def distance(self: 'ElmWiseMixin', other: 'ElmWiseMixin'):
diff = other-self
return hypot(*diff)
def magnitude(vec: 'ElmWiseMixin'):
return hypot(*vec)
def norm(vec: 'ElmWiseMixin'):
return vec / vec.magnitude()
class ElmWiseInPlaceMixin(ElmWiseMixin):
def ielm_wise(self, other, op):
if isinstance(other, Number):
for i in range(len(self)):
self[i] = op(self[i], other)
elif isinstance(other, Sequence) and len(self) == len(other):
for i in range(len(self)):
self[i] = op(self[i], other[i])
else:
raise ValueError("Operand must be a number or a list of the same length")
return self
def __iadd__(self, other): return self.ielm_wise(other, operator.add)
def __isub__(self, other): return self.ielm_wise(other, operator.sub)
def __imul__(self, other): return self.ielm_wise(other, operator.mul)
def __itruediv__(self, other): return self.ielm_wise(other, operator.truediv)
def __ifloordiv__(self, other): return self.ielm_wise(other, operator.floordiv)
def __imod__(self, other): return self.ielm_wise(other, operator.mod)