Skip to content

Commit 14cf8a9

Browse files
committed
Merge branch 'master' into fix-sphinx/build_docs-warning-for-geodesy
2 parents 1827b0b + 47cd21a commit 14cf8a9

File tree

2 files changed

+45
-41
lines changed

2 files changed

+45
-41
lines changed

audio_filters/iir_filter.py

Lines changed: 19 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -10,13 +10,17 @@ class IIRFilter:
1010
1111
Implementation details:
1212
Based on the 2nd-order function from
13-
https://en.wikipedia.org/wiki/Digital_biquad_filter,
13+
https://en.wikipedia.org/wiki/Digital_biquad_filter,
1414
this generalized N-order function was made.
1515
1616
Using the following transfer function
17-
H(z)=\frac{b_{0}+b_{1}z^{-1}+b_{2}z^{-2}+...+b_{k}z^{-k}}{a_{0}+a_{1}z^{-1}+a_{2}z^{-2}+...+a_{k}z^{-k}}
17+
.. math:: H(z)=\frac{b_{0}+b_{1}z^{-1}+b_{2}z^{-2}+...+b_{k}z^{-k}}
18+
{a_{0}+a_{1}z^{-1}+a_{2}z^{-2}+...+a_{k}z^{-k}}
19+
1820
we can rewrite this to
19-
y[n]={\frac{1}{a_{0}}}\left(\left(b_{0}x[n]+b_{1}x[n-1]+b_{2}x[n-2]+...+b_{k}x[n-k]\right)-\left(a_{1}y[n-1]+a_{2}y[n-2]+...+a_{k}y[n-k]\right)\right)
21+
.. math:: y[n]={\frac{1}{a_{0}}}
22+
\left(\left(b_{0}x[n]+b_{1}x[n-1]+b_{2}x[n-2]+...+b_{k}x[n-k]\right)-
23+
\left(a_{1}y[n-1]+a_{2}y[n-2]+...+a_{k}y[n-k]\right)\right)
2024
"""
2125

2226
def __init__(self, order: int) -> None:
@@ -34,17 +38,19 @@ def __init__(self, order: int) -> None:
3438

3539
def set_coefficients(self, a_coeffs: list[float], b_coeffs: list[float]) -> None:
3640
"""
37-
Set the coefficients for the IIR filter. These should both be of size order + 1.
38-
a_0 may be left out, and it will use 1.0 as default value.
41+
Set the coefficients for the IIR filter.
42+
These should both be of size `order` + 1.
43+
:math:`a_0` may be left out, and it will use 1.0 as default value.
3944
4045
This method works well with scipy's filter design functions
41-
>>> # Make a 2nd-order 1000Hz butterworth lowpass filter
42-
>>> import scipy.signal
43-
>>> b_coeffs, a_coeffs = scipy.signal.butter(2, 1000,
44-
... btype='lowpass',
45-
... fs=48000)
46-
>>> filt = IIRFilter(2)
47-
>>> filt.set_coefficients(a_coeffs, b_coeffs)
46+
47+
>>> # Make a 2nd-order 1000Hz butterworth lowpass filter
48+
>>> import scipy.signal
49+
>>> b_coeffs, a_coeffs = scipy.signal.butter(2, 1000,
50+
... btype='lowpass',
51+
... fs=48000)
52+
>>> filt = IIRFilter(2)
53+
>>> filt.set_coefficients(a_coeffs, b_coeffs)
4854
"""
4955
if len(a_coeffs) < self.order:
5056
a_coeffs = [1.0, *a_coeffs]
@@ -68,7 +74,7 @@ def set_coefficients(self, a_coeffs: list[float], b_coeffs: list[float]) -> None
6874

6975
def process(self, sample: float) -> float:
7076
"""
71-
Calculate y[n]
77+
Calculate :math:`y[n]`
7278
7379
>>> filt = IIRFilter(2)
7480
>>> filt.process(0)

cellular_automata/wa_tor.py

Lines changed: 26 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
"""
22
Wa-Tor algorithm (1984)
33
4-
@ https://en.wikipedia.org/wiki/Wa-Tor
5-
@ https://beltoforion.de/en/wator/
6-
@ https://beltoforion.de/en/wator/images/wator_medium.webm
4+
| @ https://en.wikipedia.org/wiki/Wa-Tor
5+
| @ https://beltoforion.de/en/wator/
6+
| @ https://beltoforion.de/en/wator/images/wator_medium.webm
77
88
This solution aims to completely remove any systematic approach
99
to the Wa-Tor planet, and utilise fully random methods.
@@ -97,8 +97,8 @@ class WaTor:
9797
9898
:attr time_passed: A function that is called every time
9999
time passes (a chronon) in order to visually display
100-
the new Wa-Tor planet. The time_passed function can block
101-
using time.sleep to slow the algorithm progression.
100+
the new Wa-Tor planet. The `time_passed` function can block
101+
using ``time.sleep`` to slow the algorithm progression.
102102
103103
>>> wt = WaTor(10, 15)
104104
>>> wt.width
@@ -216,7 +216,7 @@ def get_surrounding_prey(self, entity: Entity) -> list[Entity]:
216216
"""
217217
Returns all the prey entities around (N, S, E, W) a predator entity.
218218
219-
Subtly different to the try_to_move_to_unoccupied square.
219+
Subtly different to the `move_and_reproduce`.
220220
221221
>>> wt = WaTor(WIDTH, HEIGHT)
222222
>>> wt.set_planet([
@@ -260,7 +260,7 @@ def move_and_reproduce(
260260
"""
261261
Attempts to move to an unoccupied neighbouring square
262262
in either of the four directions (North, South, East, West).
263-
If the move was successful and the remaining_reproduction time is
263+
If the move was successful and the `remaining_reproduction_time` is
264264
equal to 0, then a new prey or predator can also be created
265265
in the previous square.
266266
@@ -351,12 +351,12 @@ def perform_prey_actions(
351351
Performs the actions for a prey entity
352352
353353
For prey the rules are:
354-
1. At each chronon, a prey moves randomly to one of the adjacent unoccupied
355-
squares. If there are no free squares, no movement takes place.
356-
2. Once a prey has survived a certain number of chronons it may reproduce.
357-
This is done as it moves to a neighbouring square,
358-
leaving behind a new prey in its old position.
359-
Its reproduction time is also reset to zero.
354+
1. At each chronon, a prey moves randomly to one of the adjacent unoccupied
355+
squares. If there are no free squares, no movement takes place.
356+
2. Once a prey has survived a certain number of chronons it may reproduce.
357+
This is done as it moves to a neighbouring square,
358+
leaving behind a new prey in its old position.
359+
Its reproduction time is also reset to zero.
360360
361361
>>> wt = WaTor(WIDTH, HEIGHT)
362362
>>> reproducable_entity = Entity(True, coords=(0, 1))
@@ -382,15 +382,15 @@ def perform_predator_actions(
382382
:param occupied_by_prey_coords: Move to this location if there is prey there
383383
384384
For predators the rules are:
385-
1. At each chronon, a predator moves randomly to an adjacent square occupied
386-
by a prey. If there is none, the predator moves to a random adjacent
387-
unoccupied square. If there are no free squares, no movement takes place.
388-
2. At each chronon, each predator is deprived of a unit of energy.
389-
3. Upon reaching zero energy, a predator dies.
390-
4. If a predator moves to a square occupied by a prey,
391-
it eats the prey and earns a certain amount of energy.
392-
5. Once a predator has survived a certain number of chronons
393-
it may reproduce in exactly the same way as the prey.
385+
1. At each chronon, a predator moves randomly to an adjacent square occupied
386+
by a prey. If there is none, the predator moves to a random adjacent
387+
unoccupied square. If there are no free squares, no movement takes place.
388+
2. At each chronon, each predator is deprived of a unit of energy.
389+
3. Upon reaching zero energy, a predator dies.
390+
4. If a predator moves to a square occupied by a prey,
391+
it eats the prey and earns a certain amount of energy.
392+
5. Once a predator has survived a certain number of chronons
393+
it may reproduce in exactly the same way as the prey.
394394
395395
>>> wt = WaTor(WIDTH, HEIGHT)
396396
>>> wt.set_planet([[Entity(True, coords=(0, 0)), Entity(False, coords=(0, 1))]])
@@ -430,7 +430,7 @@ def perform_predator_actions(
430430

431431
def run(self, *, iteration_count: int) -> None:
432432
"""
433-
Emulate time passing by looping iteration_count times
433+
Emulate time passing by looping `iteration_count` times
434434
435435
>>> wt = WaTor(WIDTH, HEIGHT)
436436
>>> wt.run(iteration_count=PREDATOR_INITIAL_ENERGY_VALUE - 1)
@@ -484,11 +484,9 @@ def visualise(wt: WaTor, iter_number: int, *, colour: bool = True) -> None:
484484
an ascii code in terminal to clear and re-print
485485
the Wa-Tor planet at intervals.
486486
487-
Uses ascii colour codes to colourfully display
488-
the predators and prey.
489-
490-
(0x60f197) Prey = #
491-
(0xfffff) Predator = x
487+
Uses ascii colour codes to colourfully display the predators and prey:
488+
* (0x60f197) Prey = ``#``
489+
* (0xfffff) Predator = ``x``
492490
493491
>>> wt = WaTor(30, 30)
494492
>>> wt.set_planet([

0 commit comments

Comments
 (0)