From 44db61985403ce5f16196eb185a842c809b274b2 Mon Sep 17 00:00:00 2001 From: "github-classroom[bot]" <66690702+github-classroom[bot]@users.noreply.github.com> Date: Fri, 10 Apr 2026 09:39:40 +0000 Subject: [PATCH 01/15] GitHub Classroom Autograding Workflow --- .github/workflows/classroom.yml | 67 +++++++++++++++++++++++++++++++++ 1 file changed, 67 insertions(+) create mode 100644 .github/workflows/classroom.yml diff --git a/.github/workflows/classroom.yml b/.github/workflows/classroom.yml new file mode 100644 index 00000000..694e0c44 --- /dev/null +++ b/.github/workflows/classroom.yml @@ -0,0 +1,67 @@ +name: Autograding Tests +'on': +- workflow_dispatch +- repository_dispatch +permissions: + checks: write + actions: read + contents: read +jobs: + run-autograding-tests: + runs-on: ubuntu-latest + if: github.actor != 'github-classroom[bot]' + steps: + - name: Checkout code + uses: actions/checkout@v4 + - name: Setup + id: setup + uses: classroom-resources/autograding-command-grader@v1 + with: + test-name: Setup + setup-command: sudo -H pip3 install -qr requirements.txt; sudo -H pip3 install + flake8==5.0.4 + command: flake8 --ignore "N801, E203, E266, E501, W503, F812, E741, N803, + N802, N806" minitorch/ tests/ project/; mypy minitorch/* + timeout: 10 + - name: Task 0.1 + id: task-0-1 + uses: classroom-resources/autograding-command-grader@v1 + with: + test-name: Task 0.1 + setup-command: sudo -H pip3 install -qr requirements.txt + command: pytest -m task0_1 + timeout: 10 + - name: Task 0.2 + id: task-0-2 + uses: classroom-resources/autograding-command-grader@v1 + with: + test-name: Task 0.2 + setup-command: sudo -H pip3 install -qr requirements.txt + command: pytest -m task0_2 + timeout: 10 + - name: Task 0.3 + id: task-0-3 + uses: classroom-resources/autograding-command-grader@v1 + with: + test-name: Task 0.3 + setup-command: sudo -H pip3 install -qr requirements.txt + command: pytest -m task0_3 + timeout: 10 + - name: Task 0.4 + id: task-0-4 + uses: classroom-resources/autograding-command-grader@v1 + with: + test-name: Task 0.4 + setup-command: sudo -H pip3 install -qr requirements.txt + command: pytest -m task0_4 + timeout: 10 + - name: Autograding Reporter + uses: classroom-resources/autograding-grading-reporter@v1 + env: + SETUP_RESULTS: "${{steps.setup.outputs.result}}" + TASK-0-1_RESULTS: "${{steps.task-0-1.outputs.result}}" + TASK-0-2_RESULTS: "${{steps.task-0-2.outputs.result}}" + TASK-0-3_RESULTS: "${{steps.task-0-3.outputs.result}}" + TASK-0-4_RESULTS: "${{steps.task-0-4.outputs.result}}" + with: + runners: setup,task-0-1,task-0-2,task-0-3,task-0-4 From e6fec65690eabd91873584c5078563a5a04dd95c Mon Sep 17 00:00:00 2001 From: "github-classroom[bot]" <66690702+github-classroom[bot]@users.noreply.github.com> Date: Fri, 10 Apr 2026 09:39:41 +0000 Subject: [PATCH 02/15] GitHub Classroom Feedback --- .github/.keep | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 .github/.keep diff --git a/.github/.keep b/.github/.keep new file mode 100644 index 00000000..e69de29b From cd38a67f81a0edc86d5c474ba0355691c60d7906 Mon Sep 17 00:00:00 2001 From: "github-classroom[bot]" <66690702+github-classroom[bot]@users.noreply.github.com> Date: Fri, 10 Apr 2026 09:39:42 +0000 Subject: [PATCH 03/15] Setting up GitHub Classroom Feedback From bcbca75de86d362925a6add39fb08bd98f8471b6 Mon Sep 17 00:00:00 2001 From: "github-classroom[bot]" <66690702+github-classroom[bot]@users.noreply.github.com> Date: Fri, 10 Apr 2026 09:39:45 +0000 Subject: [PATCH 04/15] add online IDE url --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 62e4d6ba..c4af69a0 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,4 @@ +[![Open in Visual Studio Code](https://classroom.github.com/assets/open-in-vscode-2e0aaae1b6195c2367325f4f02e2d04e9abb55f0b24a779b69b11b9e10269abc.svg)](https://classroom.github.com/online_ide?assignment_repo_id=23504068&assignment_repo_type=AssignmentRepo) # MiniTorch Module 0 From 60ddb725104633a9a046b2868a4ffb9f48e17251 Mon Sep 17 00:00:00 2001 From: Rahul Date: Sat, 11 Apr 2026 02:31:04 +0800 Subject: [PATCH 05/15] chore: update gitignore to exclude local ide settings --- .gitignore | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 9f521073..d4f3ef85 100644 --- a/.gitignore +++ b/.gitignore @@ -129,4 +129,7 @@ dmypy.json .pyre/ *.\#* data/ -pyodide \ No newline at end of file +pyodide + +# VS code configure +.vscode/ From 9e6eb5d095fdd1f09777a73902658f0475f6fb57 Mon Sep 17 00:00:00 2001 From: Rahul Date: Sat, 11 Apr 2026 17:06:00 +0800 Subject: [PATCH 06/15] First commit --- minitorch/operators.py | 326 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 326 insertions(+) diff --git a/minitorch/operators.py b/minitorch/operators.py index 37cc7c09..2d514f10 100644 --- a/minitorch/operators.py +++ b/minitorch/operators.py @@ -35,6 +35,278 @@ # TODO: Implement for Task 0.1. +def mul(x: float, y: float) -> float: + """Calculates $x*y$. + + Args: + ---- + x: First value x. + y: Second value y. + + Returns: + ------- + $x * y$. + + """ + return x * y + + +def id(x: float) -> float: + """Preserve input value unchanged. + + Args: + ---- + x: Input value x. + + Returns: + ------- + return Input value x out. + + """ + return x + + +def add(x: float, y: float) -> float: + """Add two floats $x + y$. + + Args: + ---- + x: First value x. + y: Second value y. + + Returns: + ------- + return $x + y$. + + """ + return x + y + + +def neg(x: float) -> float: + """Make input value change sign. + + Args: + ---- + x: input value x. + + Returns: + ------- + return $-x$. + + """ + return -1.0 * x + + +def lt(x: float, y: float) -> float: + """Checks if one number is less than another. + + Args: + ---- + x: First value x. + y: Second value y. + + Returns: + ------- + 1.0 if x is less than y else 0.0. + + """ + return 1.0 if x < y else 0.0 + + +def eq(x: float, y: float) -> float: + """Checks if two numbers are equal. + + Args: + ---- + x: First value x. + y: Second value y. + + Returns: + ------- + 1.0 if x is equal to y else 0.0. + + """ + return 1.0 if x == y else 0.0 + + +def max(x: float, y: float) -> float: + """Returns the larger of two numbers. + + Args: + ---- + x: First value x. + y: Second value y. + + Returns: + ------- + x if $x > y$ else y. + + """ + return x if x > y else y + + +def is_close(x: float, y: float) -> float: + """Check if two numbers are close in value. + + Args: + ---- + x: First value x. + y: Second value y. + + Returns: + ------- + 1.0 if $|x - y| < 1e-2$, else 0.0. + + """ + return 1.0 if abs(x - y) < 1e-2 else 0.0 + + +def sigmoid(x: float) -> float: + """Calculates the sigmoid function. + + The sigmoid function is defined as $f(x) = 1 / (1 + e^{-x})$. + It maps any real number to a value between 0.0 and 1.0. + + Args: + ---- + x: Input value. + + Returns: + ------- + The sigmoid of x. + + """ + if x >= 0: + return 1.0 / (1.0 + math.exp(-x)) + else: + # enhance numerical stability. + return math.exp(x) / (1.0 + math.exp(x)) + + +def relu(x: float) -> float: + r"""Applies the ReLU activation function. + + The Rectified Linear Unit (ReLU) is defined as $f(x) = \max(0, x)$. + It returns the input value if it is positive, and 0.0 otherwise. + + Args: + ---- + x: Input value x. + + Returns: + ------- + The ReLU of x. + + """ + return x if x > 0.0 else 0.0 + + +def log(x: float) -> float: + """Calculates the natural logarithm. + + The natural logarithm is the inverse of the exponential function, + defined for $x > 0$. + + Args: + ---- + x: Input value x. + + Returns: + ------- + The natural logarithm of x, clamped to a minimum positive epsilon. + + """ + return math.log(max(x, 1e-9)) + + +def exp(x: float) -> float: + """Calculates the exponential function. + + The exponential function is defined as $f(x) = e^x$. + + Args: + ---- + x: Input value. + + Returns: + ------- + The exponential of x. + + """ + return math.exp(x) + + +def inv(x: float) -> float: + """Calculates the reciprocal. + + The reciprocal is defined as $f(x) = 1 / x$. + + Args: + ---- + x: Input value. + + Returns: + ------- + The reciprocal of x ($1.0 / x$). + + """ + return 1.0 / x + + +def log_back(x: float, d: float) -> float: + r"""Computes the derivative of log times a second arg. + + $f(x) = \log(x)$, so $f'(x) = 1/x$. + The backward pass computes $d \times f'(x)$. + + Args: + ---- + x: The input value to the forward function. + d: The upstream gradient (gradient flowing back). + + Returns: + ------- + The gradient with respect to x. + + """ + return d / x + + +def inv_back(x: float, d: float) -> float: + r"""Computes the derivative of reciprocal times a second arg. + + $f(x) = 1/x \implies f'(x) = -1/x^2$. + The backward pass computes $d \times f'(x)$. + + Args: + ---- + x: The input value to the reciprocal function. + d: The upstream gradient (gradient flowing back). + + Returns: + ------- + The derivative $-d / x^2$. + + """ + return -(d / (x**2)) + + +def relu_back(x: float, d: float) -> float: + """Computes the derivative of ReLU times a second arg. + + Args: + ---- + x: The input value to the ReLU function during forward pass. + d: The gradient flowing back from the upper layer. + + Returns: + ------- + d if x is greater than 0, else 0.0. + + """ + return d if x > 0.0 else 0.0 + + # ## Task 0.3 # Small practice library of elementary higher-order functions. @@ -52,3 +324,57 @@ # TODO: Implement for Task 0.3. + + +def map(fn: Callable[[float], float]) -> Callable[[Iterable[float]], Iterable[float]]: + """Higher-order map that applies a function to a list.""" + + def _map(ls: Iterable[float]) -> Iterable[float]: + return [fn(x) for x in ls] + + return _map + + +def zipWith( + fn: Callable[[float, float], float], +) -> Callable[[Iterable[float], Iterable[float]], Iterable[float]]: + """Higher-order zipWith that combines two lists using a function.""" + + def _zipWith(ls1: Iterable[float], ls2: Iterable[float]) -> Iterable[float]: + return [fn(x, y) for x, y in zip(ls1, ls2)] + + return _zipWith + + +def reduce( + fn: Callable[[float, float], float], start: float +) -> Callable[[Iterable[float]], float]: + """Higher-order reduce that reduces a list to a single value.""" + + def _reduce(ls: Iterable[float]) -> float: + val = start + for x in ls: + val = fn(val, x) + return val + + return _reduce + + +def negList(ls: Iterable[float]) -> Iterable[float]: + """Negate each element in a list using map.""" + return map(neg)(ls) + + +def addLists(ls1: Iterable[float], ls2: Iterable[float]) -> Iterable[float]: + """Add corresponding elements from two lists using zipWith.""" + return zipWith(add)(ls1, ls2) + + +def sum(ls: Iterable[float]) -> float: + """Sum a list of numbers using reduce.""" + return reduce(add, 0.0)(ls) + + +def prod(ls: Iterable[float]) -> float: + """Product of a list of numbers using reduce.""" + return reduce(mul, 1.0)(ls) From 7ec186bc69573b661e4d25526dfa0d295ed69fcc Mon Sep 17 00:00:00 2001 From: Rahul Date: Sat, 11 Apr 2026 20:23:27 +0800 Subject: [PATCH 07/15] feat: complete task 0.2 property tests --- tests/test_operators.py | 44 ++++++++++++++++++++++++++++------------- 1 file changed, 30 insertions(+), 14 deletions(-) diff --git a/tests/test_operators.py b/tests/test_operators.py index f6e555af..a0c7c3f3 100644 --- a/tests/test_operators.py +++ b/tests/test_operators.py @@ -1,3 +1,4 @@ +import math from typing import Callable, List, Tuple import pytest @@ -23,6 +24,7 @@ relu, relu_back, sigmoid, + log, ) from .strategies import assert_close, small_floats @@ -104,44 +106,58 @@ def test_sigmoid(a: float) -> None: """Check properties of the sigmoid function, specifically * It is always between 0.0 and 1.0. * one minus sigmoid is the same as sigmoid of the negative - * It crosses 0 at 0.5 + * It crosses 0.5 at 0 * It is strictly increasing. """ - # TODO: Implement for Task 0.2. - raise NotImplementedError("Need to implement for Task 0.2") + s = sigmoid(a) + # check output always in [0.0,1.0]. + assert 0.0 <= s <= 1.0 + # check symmetry. + assert_close(1.0 - s, sigmoid(-a)) + # check central point + assert_close(sigmoid(0.0), 0.5) + # monotony of sigmoid. + assert sigmoid(a + 1.0) >= s @pytest.mark.task0_2 @given(small_floats, small_floats, small_floats) def test_transitive(a: float, b: float, c: float) -> None: """Test the transitive property of less-than (a < b and b < c implies a < c)""" - # TODO: Implement for Task 0.2. - raise NotImplementedError("Need to implement for Task 0.2") + # if a < b and b < c, then a < c. + if lt(a, b) and lt(b, c): + assert lt(a, c) @pytest.mark.task0_2 -def test_symmetric() -> None: +@given(small_floats, small_floats) +def test_symmetric(a: float, b: float) -> None: """Write a test that ensures that :func:`minitorch.operators.mul` is symmetric, i.e. gives the same value regardless of the order of its input. """ - # TODO: Implement for Task 0.2. - raise NotImplementedError("Need to implement for Task 0.2") + # Ensures that mul is symmetric: a*b = b*a. + assert_close(mul(a, b), mul(b, a)) @pytest.mark.task0_2 -def test_distribute() -> None: +@given(small_floats, small_floats, small_floats) +def test_distribute(x: float, y: float, z: float) -> None: r"""Write a test that ensures that your operators distribute, i.e. :math:`z \times (x + y) = z \times x + z \times y` """ - # TODO: Implement for Task 0.2. - raise NotImplementedError("Need to implement for Task 0.2") + # Ensures distribution: z * (x + y) = z * x + z * y. + left_side = mul(z, add(x, y)) + right_side = add(mul(z, x), mul(z, y)) + assert_close(left_side, right_side) @pytest.mark.task0_2 -def test_other() -> None: +@given(small_floats) +def test_other(a: float) -> None: """Write a test that ensures some other property holds for your functions.""" - # TODO: Implement for Task 0.2. - raise NotImplementedError("Need to implement for Task 0.2") + # Ensures a > 0 to test log. + val = abs(a) + 0.1 + assert_close(math.exp(log(val)), val) # ## Task 0.3 - Higher-order functions From d6c76e967577c677799ad4fb4e7eca57604fdd9c Mon Sep 17 00:00:00 2001 From: Rahul Date: Sat, 11 Apr 2026 20:52:47 +0800 Subject: [PATCH 08/15] docs: add missing docstrings to datasets --- minitorch/datasets.py | 48 +++++++++++++++++++++++++++++-------------- 1 file changed, 33 insertions(+), 15 deletions(-) diff --git a/minitorch/datasets.py b/minitorch/datasets.py index b3bd9faa..2577a613 100644 --- a/minitorch/datasets.py +++ b/minitorch/datasets.py @@ -4,7 +4,8 @@ from typing import List, Tuple -def make_pts(N): +def make_pts(N: int) -> list: + """Generate N random points.""" X = [] for i in range(N): x_1 = random.random() @@ -20,7 +21,8 @@ class Graph: y: List[int] -def simple(N): +def simple(N: int) -> tuple: + """Generate a simple dataset.""" X = make_pts(N) y = [] for x_1, x_2 in X: @@ -29,7 +31,8 @@ def simple(N): return Graph(N, X, y) -def diag(N): +def diag(N: int) -> tuple: + """Generate a diagonal dataset.""" X = make_pts(N) y = [] for x_1, x_2 in X: @@ -38,7 +41,8 @@ def diag(N): return Graph(N, X, y) -def split(N): +def split(N: int) -> tuple: + """Generate a split dataset.""" X = make_pts(N) y = [] for x_1, x_2 in X: @@ -47,7 +51,8 @@ def split(N): return Graph(N, X, y) -def xor(N): +def xor(N: int) -> tuple: + """Generate an XOR dataset.""" X = make_pts(N) y = [] for x_1, x_2 in X: @@ -56,7 +61,8 @@ def xor(N): return Graph(N, X, y) -def circle(N): +def circle(N: int) -> tuple: + """Generate a circular dataset.""" X = make_pts(N) y = [] for x_1, x_2 in X: @@ -66,20 +72,32 @@ def circle(N): return Graph(N, X, y) -def spiral(N): +def spiral(N: int) -> tuple: + """Generate a spiral dataset.""" - def x(t): + def x(t: float) -> float: return t * math.cos(t) / 20.0 - def y(t): + def y(t: float) -> float: return t * math.sin(t) / 20.0 - X = [(x(10.0 * (float(i) / (N // 2))) + 0.5, y(10.0 * (float(i) / (N // - 2))) + 0.5) for i in range(5 + 0, 5 + N // 2)] - X = X + [(y(-10.0 * (float(i) / (N // 2))) + 0.5, x(-10.0 * (float(i) / - (N // 2))) + 0.5) for i in range(5 + 0, 5 + N // 2)] + + X = [ + (x(10.0 * (float(i) / (N // 2))) + 0.5, y(10.0 * (float(i) / (N // 2))) + 0.5) + for i in range(5 + 0, 5 + N // 2) + ] + X = X + [ + (y(-10.0 * (float(i) / (N // 2))) + 0.5, x(-10.0 * (float(i) / (N // 2))) + 0.5) + for i in range(5 + 0, 5 + N // 2) + ] y2 = [0] * (N // 2) + [1] * (N // 2) return Graph(N, X, y2) -datasets = {'Simple': simple, 'Diag': diag, 'Split': split, 'Xor': xor, - 'Circle': circle, 'Spiral': spiral} +datasets = { + "Simple": simple, + "Diag": diag, + "Split": split, + "Xor": xor, + "Circle": circle, + "Spiral": spiral, +} From eb7359f598893f27573175e8d7ebd46ecb900cad Mon Sep 17 00:00:00 2001 From: Rahul Date: Sat, 11 Apr 2026 20:57:30 +0800 Subject: [PATCH 09/15] fix: update return types to satisfy mypy --- minitorch/datasets.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/minitorch/datasets.py b/minitorch/datasets.py index 2577a613..9dea8cd9 100644 --- a/minitorch/datasets.py +++ b/minitorch/datasets.py @@ -21,7 +21,7 @@ class Graph: y: List[int] -def simple(N: int) -> tuple: +def simple(N: int) -> Graph: """Generate a simple dataset.""" X = make_pts(N) y = [] @@ -31,7 +31,7 @@ def simple(N: int) -> tuple: return Graph(N, X, y) -def diag(N: int) -> tuple: +def diag(N: int) -> Graph: """Generate a diagonal dataset.""" X = make_pts(N) y = [] @@ -41,7 +41,7 @@ def diag(N: int) -> tuple: return Graph(N, X, y) -def split(N: int) -> tuple: +def split(N: int) -> Graph: """Generate a split dataset.""" X = make_pts(N) y = [] @@ -51,7 +51,7 @@ def split(N: int) -> tuple: return Graph(N, X, y) -def xor(N: int) -> tuple: +def xor(N: int) -> Graph: """Generate an XOR dataset.""" X = make_pts(N) y = [] @@ -61,7 +61,7 @@ def xor(N: int) -> tuple: return Graph(N, X, y) -def circle(N: int) -> tuple: +def circle(N: int) -> Graph: """Generate a circular dataset.""" X = make_pts(N) y = [] @@ -72,7 +72,7 @@ def circle(N: int) -> tuple: return Graph(N, X, y) -def spiral(N: int) -> tuple: +def spiral(N: int) -> Graph: """Generate a spiral dataset.""" def x(t: float) -> float: From 3f992bee06327f8d2f039cfb6427fb8aadd77ffc Mon Sep 17 00:00:00 2001 From: Rahul Date: Sat, 11 Apr 2026 21:05:27 +0800 Subject: [PATCH 10/15] fix: make CI commands platform-independent --- .github/workflows/classroom.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/classroom.yml b/.github/workflows/classroom.yml index 694e0c44..23c39ff7 100644 --- a/.github/workflows/classroom.yml +++ b/.github/workflows/classroom.yml @@ -21,7 +21,7 @@ jobs: setup-command: sudo -H pip3 install -qr requirements.txt; sudo -H pip3 install flake8==5.0.4 command: flake8 --ignore "N801, E203, E266, E501, W503, F812, E741, N803, - N802, N806" minitorch/ tests/ project/; mypy minitorch/* + N802, N806" minitorch/ tests/ project/ && mypy minitorch/ timeout: 10 - name: Task 0.1 id: task-0-1 From 26bdfd5fd0810710bf4ee29dc936df9efdadf2c8 Mon Sep 17 00:00:00 2001 From: Rahul Date: Sat, 11 Apr 2026 21:09:00 +0800 Subject: [PATCH 11/15] fix: make CI commands platform-independent --- .github/workflows/classroom.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/classroom.yml b/.github/workflows/classroom.yml index 23c39ff7..890c5e3c 100644 --- a/.github/workflows/classroom.yml +++ b/.github/workflows/classroom.yml @@ -21,7 +21,7 @@ jobs: setup-command: sudo -H pip3 install -qr requirements.txt; sudo -H pip3 install flake8==5.0.4 command: flake8 --ignore "N801, E203, E266, E501, W503, F812, E741, N803, - N802, N806" minitorch/ tests/ project/ && mypy minitorch/ + N802, N806" minitorch/ tests/ project/; mypy minitorch/ timeout: 10 - name: Task 0.1 id: task-0-1 From 1572a2b26805a5935858ffffbca15ca4ddde64e9 Mon Sep 17 00:00:00 2001 From: Rahul Date: Sat, 11 Apr 2026 21:12:11 +0800 Subject: [PATCH 12/15] fix: update colorama version to match system environment --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index c9cd8a02..ab3113ca 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,4 +1,4 @@ -colorama==0.4.3 +colorama==0.4.6 hypothesis == 6.54 numba == 0.60 numpy == 2.0.0 From 729b8eb63abfcf2f041f5340f9b0af1e04ad9288 Mon Sep 17 00:00:00 2001 From: Rahul Date: Sat, 11 Apr 2026 21:31:58 +0800 Subject: [PATCH 13/15] feat(task0.3) add test_sum_distribute --- tests/test_operators.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/tests/test_operators.py b/tests/test_operators.py index a0c7c3f3..94e0185d 100644 --- a/tests/test_operators.py +++ b/tests/test_operators.py @@ -184,8 +184,11 @@ def test_sum_distribute(ls1: List[float], ls2: List[float]) -> None: """Write a test that ensures that the sum of `ls1` plus the sum of `ls2` is the same as the sum of each element of `ls1` plus each element of `ls2`. """ - # TODO: Implement for Task 0.3. - raise NotImplementedError("Need to implement for Task 0.3") + left_side = minitorch.operators.sum(ls1) + minitorch.operators.sum(ls2) + sum_of_pairs = [a + b for a, b in zip(ls1, ls2)] + right_side = minitorch.operators.sum(sum_of_pairs) + + assert_close(left_side, right_side) @pytest.mark.task0_3 From e6fdc769871cf10bad31658cd05b57aa330a7da4 Mon Sep 17 00:00:00 2001 From: Rahul Date: Sat, 11 Apr 2026 22:19:43 +0800 Subject: [PATCH 14/15] feat: finish task0.5 --- README.md | 2 +- images/result.png | Bin 0 -> 94598 bytes minitorch/module.py | 25 +++++++++++++++++-------- 3 files changed, 18 insertions(+), 9 deletions(-) create mode 100644 images/result.png diff --git a/README.md b/README.md index c4af69a0..00d3d013 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ [![Open in Visual Studio Code](https://classroom.github.com/assets/open-in-vscode-2e0aaae1b6195c2367325f4f02e2d04e9abb55f0b24a779b69b11b9e10269abc.svg)](https://classroom.github.com/online_ide?assignment_repo_id=23504068&assignment_repo_type=AssignmentRepo) # MiniTorch Module 0 - +![Result](images/result.png) * Docs: https://minitorch.github.io/ diff --git a/images/result.png b/images/result.png new file mode 100644 index 0000000000000000000000000000000000000000..6dcbd1b993b5d02b0fa194e45f9b4f64aa7b5ac8 GIT binary patch literal 94598 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�A@EXDw>i$8PwIOD66nYFZV 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

dz<10%YAoD<`m4NSzE)_EA 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

E6-1h#QgnZ+-&%Y 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 literal 0 HcmV?d00001 diff --git a/minitorch/module.py b/minitorch/module.py index 0a66058c..fbac16d7 100644 --- a/minitorch/module.py +++ b/minitorch/module.py @@ -31,13 +31,15 @@ def modules(self) -> Sequence[Module]: def train(self) -> None: """Set the mode of this module and all descendent modules to `train`.""" - # TODO: Implement for Task 0.4. - raise NotImplementedError("Need to implement for Task 0.4") + self.training = True + for m in self._modules.values(): + m.train() def eval(self) -> None: """Set the mode of this module and all descendent modules to `eval`.""" - # TODO: Implement for Task 0.4. - raise NotImplementedError("Need to implement for Task 0.4") + self.training = False + for m in self._modules.values(): + m.eval() def named_parameters(self) -> Sequence[Tuple[str, Parameter]]: """Collect all the parameters of this module and its descendents. @@ -47,13 +49,19 @@ def named_parameters(self) -> Sequence[Tuple[str, Parameter]]: The name and `Parameter` of each ancestor parameter. """ - # TODO: Implement for Task 0.4. - raise NotImplementedError("Need to implement for Task 0.4") + result = [] + for k, v in self._parameters.items(): + result.append((k, v)) + + for mod_name, mod in self._modules.items(): + for sub_name, param in mod.named_parameters(): + result.append((f"{mod_name}.{sub_name}", param)) + + return result def parameters(self) -> Sequence[Parameter]: """Enumerate over all the parameters of this module and its descendents.""" - # TODO: Implement for Task 0.4. - raise NotImplementedError("Need to implement for Task 0.4") + return [p for _, p in self.named_parameters()] def add_parameter(self, k: str, v: Any) -> Parameter: """Manually add a parameter. Useful helper for scalar parameters. @@ -89,6 +97,7 @@ def __getattr__(self, key: str) -> Any: return None def __call__(self, *args: Any, **kwargs: Any) -> Any: + """Call the forward method.""" return self.forward(*args, **kwargs) def __repr__(self) -> str: From 16528e458ef0074014f9c6946da590066ff238ca Mon Sep 17 00:00:00 2001 From: Rahul Date: Sat, 11 Apr 2026 22:36:09 +0800 Subject: [PATCH 15/15] fix: fix setup-command to properly install dependencies --- .github/workflows/classroom.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/classroom.yml b/.github/workflows/classroom.yml index 890c5e3c..76974213 100644 --- a/.github/workflows/classroom.yml +++ b/.github/workflows/classroom.yml @@ -19,7 +19,7 @@ jobs: with: test-name: Setup setup-command: sudo -H pip3 install -qr requirements.txt; sudo -H pip3 install - flake8==5.0.4 + flake8==5.0.4 mypy command: flake8 --ignore "N801, E203, E266, E501, W503, F812, E741, N803, N802, N806" minitorch/ tests/ project/; mypy minitorch/ timeout: 10