Skip to content

Commit c7ff795

Browse files
fmuenkelchopan050
andauthored
Add support for arithmetic operators //, %, *, ** and / on ValueTracker (#4351)
Co-authored-by: Francisco Manríquez Novoa <[email protected]>
1 parent dea245a commit c7ff795

File tree

2 files changed

+79
-0
lines changed

2 files changed

+79
-0
lines changed

manim/mobject/value_tracker.py

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -118,21 +118,45 @@ def __iadd__(self, d_value: float | Mobject) -> Self:
118118
self.increment_value(d_value)
119119
return self
120120

121+
def __floordiv__(self, d_value: float) -> ValueTracker:
122+
"""Return a new :class:`ValueTracker` whose value is the floor division of the current
123+
tracker's value by ``d_value``.
124+
"""
125+
return ValueTracker(self.get_value() // d_value)
126+
121127
def __ifloordiv__(self, d_value: float) -> Self:
122128
"""Set the value of this ValueTracker to the floor division of the current value by ``d_value``."""
123129
self.set_value(self.get_value() // d_value)
124130
return self
125131

132+
def __mod__(self, d_value: float) -> ValueTracker:
133+
"""Return a new :class:`ValueTracker` whose value is the current tracker's value
134+
modulo ``d_value``.
135+
"""
136+
return ValueTracker(self.get_value() % d_value)
137+
126138
def __imod__(self, d_value: float) -> Self:
127139
"""Set the value of this ValueTracker to the current value modulo ``d_value``."""
128140
self.set_value(self.get_value() % d_value)
129141
return self
130142

143+
def __mul__(self, d_value: float) -> ValueTracker:
144+
"""Return a new :class:`ValueTracker` whose value is the current tracker's value multiplied by
145+
``d_value``.
146+
"""
147+
return ValueTracker(self.get_value() * d_value)
148+
131149
def __imul__(self, d_value: float) -> Self:
132150
"""Set the value of this ValueTracker to the product of the current value and ``d_value``."""
133151
self.set_value(self.get_value() * d_value)
134152
return self
135153

154+
def __pow__(self, d_value: float) -> ValueTracker:
155+
"""Return a new :class:`ValueTracker` whose value is the current tracker's value raised to the
156+
power of ``d_value``.
157+
"""
158+
return ValueTracker(self.get_value() ** d_value)
159+
136160
def __ipow__(self, d_value: float) -> Self:
137161
"""Set the value of this ValueTracker to the current value raised to the power of ``d_value``."""
138162
self.set_value(self.get_value() ** d_value)
@@ -157,6 +181,12 @@ def __isub__(self, d_value: float | Mobject) -> Self:
157181
self.increment_value(-d_value)
158182
return self
159183

184+
def __truediv__(self, d_value: float) -> ValueTracker:
185+
"""Return a new :class:`ValueTracker` whose value is the current tracker's value
186+
divided by ``d_value``.
187+
"""
188+
return ValueTracker(self.get_value() / d_value)
189+
160190
def __itruediv__(self, d_value: float) -> Self:
161191
"""Sets the value of this ValueTracker to the current value divided by ``d_value``."""
162192
self.set_value(self.get_value() / d_value)

tests/module/mobject/test_value_tracker.py

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,48 +39,97 @@ def test_value_tracker_bool():
3939
assert tracker
4040

4141

42+
def test_value_tracker_add():
43+
"""Test ValueTracker.__add__()"""
44+
tracker = ValueTracker(0.0)
45+
tracker2 = tracker + 10.0
46+
assert tracker2.get_value() == 10.0
47+
48+
4249
def test_value_tracker_iadd():
4350
"""Test ValueTracker.__iadd__()"""
4451
tracker = ValueTracker(0.0)
4552
tracker += 10.0
4653
assert tracker.get_value() == 10.0
4754

4855

56+
def test_value_tracker_floordiv():
57+
"""Test ValueTracker.__floordiv__()"""
58+
tracker = ValueTracker(5.0)
59+
tracker2 = tracker // 2.0
60+
assert tracker2.get_value() == 2.0
61+
62+
4963
def test_value_tracker_ifloordiv():
5064
"""Test ValueTracker.__ifloordiv__()"""
5165
tracker = ValueTracker(5.0)
5266
tracker //= 2.0
5367
assert tracker.get_value() == 2.0
5468

5569

70+
def test_value_tracker_mod():
71+
"""Test ValueTracker.__mod__()"""
72+
tracker = ValueTracker(20.0)
73+
tracker2 = tracker % 3.0
74+
assert tracker2.get_value() == 2.0
75+
76+
5677
def test_value_tracker_imod():
5778
"""Test ValueTracker.__imod__()"""
5879
tracker = ValueTracker(20.0)
5980
tracker %= 3.0
6081
assert tracker.get_value() == 2.0
6182

6283

84+
def test_value_tracker_mul():
85+
"""Test ValueTracker.__mul__()"""
86+
tracker = ValueTracker(3.0)
87+
tracker2 = tracker * 4.0
88+
assert tracker2.get_value() == 12.0
89+
90+
6391
def test_value_tracker_imul():
6492
"""Test ValueTracker.__imul__()"""
6593
tracker = ValueTracker(3.0)
6694
tracker *= 4.0
6795
assert tracker.get_value() == 12.0
6896

6997

98+
def test_value_tracker_pow():
99+
"""Test ValueTracker.__pow__()"""
100+
tracker = ValueTracker(3.0)
101+
tracker2 = tracker**3.0
102+
assert tracker2.get_value() == 27.0
103+
104+
70105
def test_value_tracker_ipow():
71106
"""Test ValueTracker.__ipow__()"""
72107
tracker = ValueTracker(3.0)
73108
tracker **= 3.0
74109
assert tracker.get_value() == 27.0
75110

76111

112+
def test_value_tracker_sub():
113+
"""Test ValueTracker.__sub__()"""
114+
tracker = ValueTracker(20.0)
115+
tracker2 = tracker - 10.0
116+
assert tracker2.get_value() == 10.0
117+
118+
77119
def test_value_tracker_isub():
78120
"""Test ValueTracker.__isub__()"""
79121
tracker = ValueTracker(20.0)
80122
tracker -= 10.0
81123
assert tracker.get_value() == 10.0
82124

83125

126+
def test_value_tracker_truediv():
127+
"""Test ValueTracker.__truediv__()"""
128+
tracker = ValueTracker(5.0)
129+
tracker2 = tracker / 2.0
130+
assert tracker2.get_value() == 2.5
131+
132+
84133
def test_value_tracker_itruediv():
85134
"""Test ValueTracker.__itruediv__()"""
86135
tracker = ValueTracker(5.0)

0 commit comments

Comments
 (0)