Skip to content

Commit 30fdf8c

Browse files
committed
Merge branch 'master' into fix-gaussian_elimination_pivoting
2 parents b01a53b + e6790b5 commit 30fdf8c

File tree

66 files changed

+714
-440
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

66 files changed

+714
-440
lines changed

.pre-commit-config.yaml

+6-5
Original file line numberDiff line numberDiff line change
@@ -16,20 +16,20 @@ repos:
1616
- id: auto-walrus
1717

1818
- repo: https://github.com/astral-sh/ruff-pre-commit
19-
rev: v0.4.2
19+
rev: v0.5.7
2020
hooks:
2121
- id: ruff
2222
- id: ruff-format
2323

2424
- repo: https://github.com/codespell-project/codespell
25-
rev: v2.2.6
25+
rev: v2.3.0
2626
hooks:
2727
- id: codespell
2828
additional_dependencies:
2929
- tomli
3030

3131
- repo: https://github.com/tox-dev/pyproject-fmt
32-
rev: "1.8.0"
32+
rev: "2.2.1"
3333
hooks:
3434
- id: pyproject-fmt
3535

@@ -42,15 +42,16 @@ repos:
4242
pass_filenames: false
4343

4444
- repo: https://github.com/abravalheri/validate-pyproject
45-
rev: v0.16
45+
rev: v0.18
4646
hooks:
4747
- id: validate-pyproject
4848

4949
- repo: https://github.com/pre-commit/mirrors-mypy
50-
rev: v1.10.0
50+
rev: v1.11.1
5151
hooks:
5252
- id: mypy
5353
args:
54+
- --explicit-package-bases
5455
- --ignore-missing-imports
5556
- --install-types # See mirrors-mypy README.md
5657
- --non-interactive

DIRECTORY.md

+3-3
Original file line numberDiff line numberDiff line change
@@ -540,8 +540,7 @@
540540
* [Lu Decomposition](linear_algebra/lu_decomposition.py)
541541
* Src
542542
* [Conjugate Gradient](linear_algebra/src/conjugate_gradient.py)
543-
* Gaussian Elimination Pivoting
544-
* [Gaussian Elimination Pivoting](linear_algebra/src/gaussian_elimination_pivoting/gaussian_elimination_pivoting.py)
543+
* [Gaussian Elimination Pivoting](linear_algebra/src/gaussian_elimination_pivoting.py)
545544
* [Lib](linear_algebra/src/lib.py)
546545
* [Polynom For Points](linear_algebra/src/polynom_for_points.py)
547546
* [Power Iteration](linear_algebra/src/power_iteration.py)
@@ -661,7 +660,6 @@
661660
* [Manhattan Distance](maths/manhattan_distance.py)
662661
* [Matrix Exponentiation](maths/matrix_exponentiation.py)
663662
* [Max Sum Sliding Window](maths/max_sum_sliding_window.py)
664-
* [Median Of Two Arrays](maths/median_of_two_arrays.py)
665663
* [Minkowski Distance](maths/minkowski_distance.py)
666664
* [Mobius Function](maths/mobius_function.py)
667665
* [Modular Division](maths/modular_division.py)
@@ -864,6 +862,7 @@
864862
* [Newtons Second Law Of Motion](physics/newtons_second_law_of_motion.py)
865863
* [Photoelectric Effect](physics/photoelectric_effect.py)
866864
* [Potential Energy](physics/potential_energy.py)
865+
* [Rainfall Intensity](physics/rainfall_intensity.py)
867866
* [Reynolds Number](physics/reynolds_number.py)
868867
* [Rms Speed Of Molecule](physics/rms_speed_of_molecule.py)
869868
* [Shear Stress](physics/shear_stress.py)
@@ -1260,6 +1259,7 @@
12601259
* [Can String Be Rearranged As Palindrome](strings/can_string_be_rearranged_as_palindrome.py)
12611260
* [Capitalize](strings/capitalize.py)
12621261
* [Check Anagrams](strings/check_anagrams.py)
1262+
* [Count Vowels](strings/count_vowels.py)
12631263
* [Credit Card Validator](strings/credit_card_validator.py)
12641264
* [Damerau Levenshtein Distance](strings/damerau_levenshtein_distance.py)
12651265
* [Detecting English Programmatically](strings/detecting_english_programmatically.py)

audio_filters/show_response.py

+2-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
from __future__ import annotations
22

3+
from abc import abstractmethod
34
from math import pi
45
from typing import Protocol
56

@@ -8,14 +9,14 @@
89

910

1011
class FilterType(Protocol):
12+
@abstractmethod
1113
def process(self, sample: float) -> float:
1214
"""
1315
Calculate y[n]
1416
1517
>>> issubclass(FilterType, Protocol)
1618
True
1719
"""
18-
return 0.0
1920

2021

2122
def get_bounds(

backtracking/all_permutations.py

+36
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,42 @@ def create_state_space_tree(
2323
Creates a state space tree to iterate through each branch using DFS.
2424
We know that each state has exactly len(sequence) - index children.
2525
It terminates when it reaches the end of the given sequence.
26+
27+
:param sequence: The input sequence for which permutations are generated.
28+
:param current_sequence: The current permutation being built.
29+
:param index: The current index in the sequence.
30+
:param index_used: list to track which elements are used in permutation.
31+
32+
Example 1:
33+
>>> sequence = [1, 2, 3]
34+
>>> current_sequence = []
35+
>>> index_used = [False, False, False]
36+
>>> create_state_space_tree(sequence, current_sequence, 0, index_used)
37+
[1, 2, 3]
38+
[1, 3, 2]
39+
[2, 1, 3]
40+
[2, 3, 1]
41+
[3, 1, 2]
42+
[3, 2, 1]
43+
44+
Example 2:
45+
>>> sequence = ["A", "B", "C"]
46+
>>> current_sequence = []
47+
>>> index_used = [False, False, False]
48+
>>> create_state_space_tree(sequence, current_sequence, 0, index_used)
49+
['A', 'B', 'C']
50+
['A', 'C', 'B']
51+
['B', 'A', 'C']
52+
['B', 'C', 'A']
53+
['C', 'A', 'B']
54+
['C', 'B', 'A']
55+
56+
Example 3:
57+
>>> sequence = [1]
58+
>>> current_sequence = []
59+
>>> index_used = [False]
60+
>>> create_state_space_tree(sequence, current_sequence, 0, index_used)
61+
[1]
2662
"""
2763

2864
if index == len(sequence):

backtracking/all_subsequences.py

+51-1
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,56 @@ def create_state_space_tree(
2222
Creates a state space tree to iterate through each branch using DFS.
2323
We know that each state has exactly two children.
2424
It terminates when it reaches the end of the given sequence.
25+
26+
:param sequence: The input sequence for which subsequences are generated.
27+
:param current_subsequence: The current subsequence being built.
28+
:param index: The current index in the sequence.
29+
30+
Example:
31+
>>> sequence = [3, 2, 1]
32+
>>> current_subsequence = []
33+
>>> create_state_space_tree(sequence, current_subsequence, 0)
34+
[]
35+
[1]
36+
[2]
37+
[2, 1]
38+
[3]
39+
[3, 1]
40+
[3, 2]
41+
[3, 2, 1]
42+
43+
>>> sequence = ["A", "B"]
44+
>>> current_subsequence = []
45+
>>> create_state_space_tree(sequence, current_subsequence, 0)
46+
[]
47+
['B']
48+
['A']
49+
['A', 'B']
50+
51+
>>> sequence = []
52+
>>> current_subsequence = []
53+
>>> create_state_space_tree(sequence, current_subsequence, 0)
54+
[]
55+
56+
>>> sequence = [1, 2, 3, 4]
57+
>>> current_subsequence = []
58+
>>> create_state_space_tree(sequence, current_subsequence, 0)
59+
[]
60+
[4]
61+
[3]
62+
[3, 4]
63+
[2]
64+
[2, 4]
65+
[2, 3]
66+
[2, 3, 4]
67+
[1]
68+
[1, 4]
69+
[1, 3]
70+
[1, 3, 4]
71+
[1, 2]
72+
[1, 2, 4]
73+
[1, 2, 3]
74+
[1, 2, 3, 4]
2575
"""
2676

2777
if index == len(sequence):
@@ -35,7 +85,7 @@ def create_state_space_tree(
3585

3686

3787
if __name__ == "__main__":
38-
seq: list[Any] = [3, 1, 2, 4]
88+
seq: list[Any] = [1, 2, 3]
3989
generate_all_subsequences(seq)
4090

4191
seq.clear()

backtracking/knight_tour.py

+3-3
Original file line numberDiff line numberDiff line change
@@ -24,10 +24,10 @@ def get_valid_pos(position: tuple[int, int], n: int) -> list[tuple[int, int]]:
2424
]
2525
permissible_positions = []
2626

27-
for position in positions:
28-
y_test, x_test = position
27+
for inner_position in positions:
28+
y_test, x_test = inner_position
2929
if 0 <= y_test < n and 0 <= x_test < n:
30-
permissible_positions.append(position)
30+
permissible_positions.append(inner_position)
3131

3232
return permissible_positions
3333

bit_manipulation/binary_and_operator.py

+3-3
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ def binary_and(a: int, b: int) -> str:
2626
>>> binary_and(0, 1.1)
2727
Traceback (most recent call last):
2828
...
29-
TypeError: 'float' object cannot be interpreted as an integer
29+
ValueError: Unknown format code 'b' for object of type 'float'
3030
>>> binary_and("0", "1")
3131
Traceback (most recent call last):
3232
...
@@ -35,8 +35,8 @@ def binary_and(a: int, b: int) -> str:
3535
if a < 0 or b < 0:
3636
raise ValueError("the value of both inputs must be positive")
3737

38-
a_binary = str(bin(a))[2:] # remove the leading "0b"
39-
b_binary = str(bin(b))[2:] # remove the leading "0b"
38+
a_binary = format(a, "b")
39+
b_binary = format(b, "b")
4040

4141
max_len = max(len(a_binary), len(b_binary))
4242

computer_vision/haralick_descriptors.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -141,7 +141,7 @@ def transform(
141141

142142
center_x, center_y = (x // 2 for x in kernel.shape)
143143

144-
# Use padded image when applying convolotion
144+
# Use padded image when applying convolution
145145
# to not go out of bounds of the original the image
146146
transformed = np.zeros(image.shape, dtype=np.uint8)
147147
padded = np.pad(image, 1, "constant", constant_values=constant)

conversions/weight_conversion.py

+6
Original file line numberDiff line numberDiff line change
@@ -297,6 +297,12 @@ def weight_conversion(from_type: str, to_type: str, value: float) -> float:
297297
1.660540199e-23
298298
>>> weight_conversion("atomic-mass-unit","atomic-mass-unit",2)
299299
1.999999998903455
300+
>>> weight_conversion("slug", "kilogram", 1)
301+
Traceback (most recent call last):
302+
...
303+
ValueError: Invalid 'from_type' or 'to_type' value: 'slug', 'kilogram'
304+
Supported values are: kilogram, gram, milligram, metric-ton, long-ton, short-ton, \
305+
pound, stone, ounce, carrat, atomic-mass-unit
300306
"""
301307
if to_type not in KILOGRAM_CHART or from_type not in WEIGHT_TYPE_CHART:
302308
msg = (

data_structures/binary_tree/is_sorted.py

+3-3
Original file line numberDiff line numberDiff line change
@@ -80,9 +80,9 @@ def is_sorted(self) -> bool:
8080
"""
8181
if self.left and (self.data < self.left.data or not self.left.is_sorted):
8282
return False
83-
if self.right and (self.data > self.right.data or not self.right.is_sorted):
84-
return False
85-
return True
83+
return not (
84+
self.right and (self.data > self.right.data or not self.right.is_sorted)
85+
)
8686

8787

8888
if __name__ == "__main__":

data_structures/binary_tree/red_black_tree.py

+9-28
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,3 @@
1-
"""
2-
psf/black : true
3-
ruff : passed
4-
"""
5-
61
from __future__ import annotations
72

83
from collections.abc import Iterator
@@ -321,9 +316,7 @@ def check_coloring(self) -> bool:
321316
return False
322317
if self.left and not self.left.check_coloring():
323318
return False
324-
if self.right and not self.right.check_coloring():
325-
return False
326-
return True
319+
return not (self.right and not self.right.check_coloring())
327320

328321
def black_height(self) -> int | None:
329322
"""Returns the number of black nodes from this node to the
@@ -561,9 +554,7 @@ def test_rotations() -> bool:
561554
right_rot.right.right = RedBlackTree(10, parent=right_rot.right)
562555
right_rot.right.right.left = RedBlackTree(5, parent=right_rot.right.right)
563556
right_rot.right.right.right = RedBlackTree(20, parent=right_rot.right.right)
564-
if tree != right_rot:
565-
return False
566-
return True
557+
return tree == right_rot
567558

568559

569560
def test_insertion_speed() -> bool:
@@ -606,13 +597,11 @@ def test_insert_and_search() -> bool:
606597
tree.insert(12)
607598
tree.insert(10)
608599
tree.insert(11)
609-
if 5 in tree or -6 in tree or -10 in tree or 13 in tree:
600+
if any(i in tree for i in (5, -6, -10, 13)):
610601
# Found something not in there
611602
return False
612-
if not (11 in tree and 12 in tree and -8 in tree and 0 in tree):
613-
# Didn't find something in there
614-
return False
615-
return True
603+
# Find all these things in there
604+
return all(i in tree for i in (11, 12, -8, 0))
616605

617606

618607
def test_insert_delete() -> bool:
@@ -634,9 +623,7 @@ def test_insert_delete() -> bool:
634623
tree = tree.remove(9)
635624
if not tree.check_color_properties():
636625
return False
637-
if list(tree.inorder_traverse()) != [-8, 0, 4, 8, 10, 11, 12]:
638-
return False
639-
return True
626+
return list(tree.inorder_traverse()) == [-8, 0, 4, 8, 10, 11, 12]
640627

641628

642629
def test_floor_ceil() -> bool:
@@ -664,9 +651,7 @@ def test_min_max() -> bool:
664651
tree.insert(24)
665652
tree.insert(20)
666653
tree.insert(22)
667-
if tree.get_max() != 22 or tree.get_min() != -16:
668-
return False
669-
return True
654+
return not (tree.get_max() != 22 or tree.get_min() != -16)
670655

671656

672657
def test_tree_traversal() -> bool:
@@ -682,9 +667,7 @@ def test_tree_traversal() -> bool:
682667
return False
683668
if list(tree.preorder_traverse()) != [0, -16, 16, 8, 22, 20, 24]:
684669
return False
685-
if list(tree.postorder_traverse()) != [-16, 8, 20, 24, 22, 16, 0]:
686-
return False
687-
return True
670+
return list(tree.postorder_traverse()) == [-16, 8, 20, 24, 22, 16, 0]
688671

689672

690673
def test_tree_chaining() -> bool:
@@ -695,9 +678,7 @@ def test_tree_chaining() -> bool:
695678
return False
696679
if list(tree.preorder_traverse()) != [0, -16, 16, 8, 22, 20, 24]:
697680
return False
698-
if list(tree.postorder_traverse()) != [-16, 8, 20, 24, 22, 16, 0]:
699-
return False
700-
return True
681+
return list(tree.postorder_traverse()) == [-16, 8, 20, 24, 22, 16, 0]
701682

702683

703684
def print_results(msg: str, passes: bool) -> None:

data_structures/binary_tree/segment_tree.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -98,7 +98,7 @@ def query_recursive(self, idx, left, right, a, b):
9898

9999
def show_data(self):
100100
show_list = []
101-
for i in range(1, N + 1):
101+
for i in range(1, self.N + 1):
102102
show_list += [self.query(i, i)]
103103
print(show_list)
104104

data_structures/binary_tree/treap.py

+1-3
Original file line numberDiff line numberDiff line change
@@ -39,9 +39,7 @@ def split(root: Node | None, value: int) -> tuple[Node | None, Node | None]:
3939
Left tree contains all values less than split value.
4040
Right tree contains all values greater or equal, than split value
4141
"""
42-
if root is None: # None tree is split into 2 Nones
43-
return None, None
44-
elif root.value is None:
42+
if root is None or root.value is None: # None tree is split into 2 Nones
4543
return None, None
4644
elif value < root.value:
4745
"""

0 commit comments

Comments
 (0)