From 254049e93786740fa4dfd76ce60a70ec70fd7885 Mon Sep 17 00:00:00 2001 From: Devon Friend Date: Sat, 9 Mar 2024 18:40:16 -0800 Subject: [PATCH 1/5] Migrate code for issue 304 --- .../nodes/physics_engine/fluid_generation.py | 30 ++++++++-- .../unit/nodes/physics_engine/test_fluids.py | 59 ++++++++++++++++++- 2 files changed, 81 insertions(+), 8 deletions(-) diff --git a/src/boat_simulator/boat_simulator/nodes/physics_engine/fluid_generation.py b/src/boat_simulator/boat_simulator/nodes/physics_engine/fluid_generation.py index 8c544ee02..8ec2b44a2 100644 --- a/src/boat_simulator/boat_simulator/nodes/physics_engine/fluid_generation.py +++ b/src/boat_simulator/boat_simulator/nodes/physics_engine/fluid_generation.py @@ -1,10 +1,11 @@ """This module provides a generator for fluid vectors used within the physics engine.""" +from boat_simulator.common.utils import bound_to_180, rad_to_degrees import numpy as np +import math from numpy.typing import NDArray - from boat_simulator.common.generators import VectorGenerator -from boat_simulator.common.types import Scalar +from boat_simulator.common.types import Scalar, ScalarOrArray class FluidGenerator: @@ -17,18 +18,22 @@ class FluidGenerator: """ def __init__(self, generator: VectorGenerator): - self.__generator = generator - self.__velocity = np.array(self.__generator.next()) + self.__generator = generator # Vector generator instance to produce velocity vectors + self.__velocity = np.array(self.__generator.next()) # Initial velocity vector of the fluid def next(self) -> NDArray: """Generates the next velocity vector for the fluid simulation. - Returns: + Returns: NDArray: An array representing the updated velocity vector for the fluid simulation. """ # TODO: Implement this to generate the next velocity vector. + # Generate the next velocity vector using the provided vector generator + self.__velocity = np.array(self.__generator.next()) + return self.__velocity + raise NotImplementedError() @property @@ -39,6 +44,10 @@ def velocity(self) -> NDArray: NDArray: The velocity vector of the fluid, expressed in meters per second (m/s) and ranging from negative infinity to positive infinity. """ + + # Return the current velocity vector + return self.__velocity + raise NotImplementedError() @@ -53,6 +62,9 @@ def speed(self) -> Scalar: # TODO: Implement this using the current velocity vector. + # Calculate the magnitude (speed) of the velocity vector + return np.linalg.norm(self.__velocity) + raise NotImplementedError() @property @@ -66,4 +78,10 @@ def direction(self) -> Scalar: # TODO: Implement this using the current velocity vector. - raise NotImplementedError() + # Ensure the velocity vector is suitable for direction calculation + if self.__velocity.ndim > 1 or self.__velocity.size < 2: + raise ValueError("Velocity vector must be a 2D vector for direction calculation.") + # Calculate the angle of the velocity vector in radians, then convert to degrees and adjust to [-180, 180) range + angle_rad = np.arctan2(self.__velocity[1], self.__velocity[0]) + angle_deg = rad_to_degrees(angle_rad) + return bound_to_180(angle_deg) \ No newline at end of file diff --git a/src/boat_simulator/tests/unit/nodes/physics_engine/test_fluids.py b/src/boat_simulator/tests/unit/nodes/physics_engine/test_fluids.py index 28277d0c9..6d3d8fd0e 100644 --- a/src/boat_simulator/tests/unit/nodes/physics_engine/test_fluids.py +++ b/src/boat_simulator/tests/unit/nodes/physics_engine/test_fluids.py @@ -1,9 +1,64 @@ """Tests classes and functions in boat_simulator/nodes/physics_engine/fluids.py""" +import numpy as np +import pytest +from boat_simulator.common.generators import ConstantGenerator, GaussianGenerator, VectorGenerator +from boat_simulator.nodes.physics_engine.fluid_generation import FluidGenerator class TestFluidGenerator: - pass + @pytest.mark.parametrize("vector", [ + (np.array([1, 0])), + (np.array([0, 1])), + (np.array([1, 0])), + ]) + + def test_velocity_constant(self, vector): + vector_generator = ConstantGenerator(vector) + fluid_generator = FluidGenerator(vector_generator) + generated_fluid_vector = fluid_generator.next() + assert np.all(generated_fluid_vector == vector) + + def test_velocity_random(self): + vector_generator = VectorGenerator() + fluid_generator = FluidGenerator(vector_generator) + # generate first vector + generated_fluid_vector = fluid_generator.next() + # call it again (generate a new vector), and assign to different variable + # compare the two, they should not be equal + assert np.all(generated_fluid_vector == vector_generator) + + @pytest.mark.parametrize("vector", [ + (np.array([1, 0])), + (np.array([0, 1])), + (np.array([-1, 0])), + (np.array([0, -1])), + (np.array([1, 1])), + (np.array([-1, -1])), + ]) + + def test_speed(self, vector): + vector_generator = ConstantGenerator(constant=vector) + fluid_generator = FluidGenerator(generator=vector_generator) + generated_fluid_vector = fluid_generator.next() + assert np.all(vector == generated_fluid_vector) + assert(np.linalg.norm(vector) == fluid_generator.speed) + + @pytest.mark.parametrize("vector, expected_direction", [ + (np.array([1, 0]), 0), # Rightward, 0 degrees + (np.array([0, 1]), 90), # Upward, 90 degrees + (np.array([-1, 0]), -180), # Leftward, 180 or -180 degrees, normalized to 180 in this context + (np.array([0, -1]), -90), # Downward, -90 degrees + (np.array([1, 1]), 45), # Diagonal (right-upward), 45 degrees + (np.array([-1, -1]), -135), # Diagonal (left-downward), -135 degrees + ]) + def test_direction(self, vector, expected_direction): + vector_generator = ConstantGenerator(constant=vector) + fluid_generator = FluidGenerator(generator=vector_generator) + fluid_generator.next() # Generate the next fluid vector to set the internal state + calculated_direction = fluid_generator.direction + assert np.isclose(calculated_direction, expected_direction, atol=1e-7), f"Expected direction {expected_direction}, but got {calculated_direction}" + class TestWindGenerator: - pass + pass \ No newline at end of file From cde10df032304f2dfd2735031389e68e8f8f3457 Mon Sep 17 00:00:00 2001 From: Aryan Roshan Date: Sat, 16 Mar 2024 15:57:57 -0700 Subject: [PATCH 2/5] test 1 --- .../nodes/physics_engine/fluid_generation.py | 13 ++--- .../unit/nodes/physics_engine/test_fluids.py | 53 ++++++++++--------- 2 files changed, 32 insertions(+), 34 deletions(-) diff --git a/src/boat_simulator/boat_simulator/nodes/physics_engine/fluid_generation.py b/src/boat_simulator/boat_simulator/nodes/physics_engine/fluid_generation.py index 8ec2b44a2..6ce214eab 100644 --- a/src/boat_simulator/boat_simulator/nodes/physics_engine/fluid_generation.py +++ b/src/boat_simulator/boat_simulator/nodes/physics_engine/fluid_generation.py @@ -24,7 +24,7 @@ def __init__(self, generator: VectorGenerator): def next(self) -> NDArray: """Generates the next velocity vector for the fluid simulation. - Returns: + Returns: NDArray: An array representing the updated velocity vector for the fluid simulation. """ @@ -34,8 +34,6 @@ def next(self) -> NDArray: self.__velocity = np.array(self.__generator.next()) return self.__velocity - raise NotImplementedError() - @property def velocity(self) -> NDArray: """Returns the fluid's current velocity vector. @@ -44,13 +42,10 @@ def velocity(self) -> NDArray: NDArray: The velocity vector of the fluid, expressed in meters per second (m/s) and ranging from negative infinity to positive infinity. """ - + # Return the current velocity vector return self.__velocity - - raise NotImplementedError() - @property def speed(self) -> Scalar: """Calculates the current speed of the fluid. @@ -64,8 +59,6 @@ def speed(self) -> Scalar: # Calculate the magnitude (speed) of the velocity vector return np.linalg.norm(self.__velocity) - - raise NotImplementedError() @property def direction(self) -> Scalar: @@ -84,4 +77,4 @@ def direction(self) -> Scalar: # Calculate the angle of the velocity vector in radians, then convert to degrees and adjust to [-180, 180) range angle_rad = np.arctan2(self.__velocity[1], self.__velocity[0]) angle_deg = rad_to_degrees(angle_rad) - return bound_to_180(angle_deg) \ No newline at end of file + return bound_to_180(angle_deg) diff --git a/src/boat_simulator/tests/unit/nodes/physics_engine/test_fluids.py b/src/boat_simulator/tests/unit/nodes/physics_engine/test_fluids.py index 6d3d8fd0e..19e076417 100644 --- a/src/boat_simulator/tests/unit/nodes/physics_engine/test_fluids.py +++ b/src/boat_simulator/tests/unit/nodes/physics_engine/test_fluids.py @@ -2,39 +2,44 @@ import numpy as np import pytest -from boat_simulator.common.generators import ConstantGenerator, GaussianGenerator, VectorGenerator +from boat_simulator.common.generators import ConstantGenerator, GaussianGenerator, VectorGenerator, MVGaussianGenerator from boat_simulator.nodes.physics_engine.fluid_generation import FluidGenerator class TestFluidGenerator: - @pytest.mark.parametrize("vector", [ (np.array([1, 0])), (np.array([0, 1])), (np.array([1, 0])), ]) - def test_velocity_constant(self, vector): - vector_generator = ConstantGenerator(vector) - fluid_generator = FluidGenerator(vector_generator) - generated_fluid_vector = fluid_generator.next() - assert np.all(generated_fluid_vector == vector) + vector_generator = ConstantGenerator(constant=vector) + fluid_generator = FluidGenerator(generator=vector_generator) + first_fluid_vector = fluid_generator.velocity + assert np.all(first_fluid_vector == vector) - def test_velocity_random(self): - vector_generator = VectorGenerator() + @pytest.mark.parametrize( + "mean, cov", + [ + (np.array([1, 2]), np.array([[2, 1], [1, 2]])), + (np.array([4, 5]), np.array([[3, 1], [1, 3]])), + (np.array([100, 50]), np.array([[10, 5], [5, 10]])), + (np.array([120, 130]), np.array([[10, 5], [5, 10]])), + ], + ) + def test_velocity_random(self, mean, cov): + vector_generator = MVGaussianGenerator(mean=mean,cov=cov) fluid_generator = FluidGenerator(vector_generator) - # generate first vector - generated_fluid_vector = fluid_generator.next() - # call it again (generate a new vector), and assign to different variable - # compare the two, they should not be equal - assert np.all(generated_fluid_vector == vector_generator) + first_fluid_vector = fluid_generator.velocity + next_fluid_vector = fluid_generator.next() + assert np.all(next_fluid_vector != first_fluid_vector) @pytest.mark.parametrize("vector", [ (np.array([1, 0])), (np.array([0, 1])), (np.array([-1, 0])), - (np.array([0, -1])), - (np.array([1, 1])), + (np.array([0, -1])), + (np.array([1, 1])), (np.array([-1, -1])), ]) @@ -46,19 +51,19 @@ def test_speed(self, vector): assert(np.linalg.norm(vector) == fluid_generator.speed) @pytest.mark.parametrize("vector, expected_direction", [ - (np.array([1, 0]), 0), # Rightward, 0 degrees - (np.array([0, 1]), 90), # Upward, 90 degrees - (np.array([-1, 0]), -180), # Leftward, 180 or -180 degrees, normalized to 180 in this context - (np.array([0, -1]), -90), # Downward, -90 degrees - (np.array([1, 1]), 45), # Diagonal (right-upward), 45 degrees - (np.array([-1, -1]), -135), # Diagonal (left-downward), -135 degrees + (np.array([1, 0]), 0), + (np.array([0, 1]), 90), + (np.array([-1, 0]), -180), + (np.array([0, -1]), -90), + (np.array([1, 1]), 45), + (np.array([-1, -1]), -135), ]) + def test_direction(self, vector, expected_direction): vector_generator = ConstantGenerator(constant=vector) fluid_generator = FluidGenerator(generator=vector_generator) - fluid_generator.next() # Generate the next fluid vector to set the internal state calculated_direction = fluid_generator.direction assert np.isclose(calculated_direction, expected_direction, atol=1e-7), f"Expected direction {expected_direction}, but got {calculated_direction}" class TestWindGenerator: - pass \ No newline at end of file + pass From 62040433070f6ed16b0833cbe2ea1ee3ee81e94b Mon Sep 17 00:00:00 2001 From: Aryan Roshan Date: Thu, 21 Mar 2024 18:50:45 -0700 Subject: [PATCH 3/5] test 2 --- src/website/package-lock.json | 49 ++++++++++++----------------------- 1 file changed, 17 insertions(+), 32 deletions(-) diff --git a/src/website/package-lock.json b/src/website/package-lock.json index a33fa035d..9b687eae3 100644 --- a/src/website/package-lock.json +++ b/src/website/package-lock.json @@ -17,7 +17,7 @@ "leaflet-geometryutil": "^0.10.2", "mongodb": "^4.8.1", "mongoose": "^7.5.0", - "next": "*", + "next": "latest", "react": "^18.2.0", "react-dom": "^18.2.0", "react-leaflet": "^4.2.1", @@ -2725,7 +2725,7 @@ "version": "3.1.3", "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", - "devOptional": true, + "dev": true, "dependencies": { "normalize-path": "^3.0.0", "picomatch": "^2.0.4" @@ -2987,7 +2987,7 @@ "version": "2.2.0", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", - "devOptional": true, + "dev": true, "engines": { "node": ">=8" } @@ -3033,7 +3033,7 @@ "version": "3.0.2", "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "devOptional": true, + "dev": true, "dependencies": { "fill-range": "^7.0.1" }, @@ -3193,7 +3193,7 @@ "version": "3.5.3", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", - "devOptional": true, + "dev": true, "funding": [ { "type": "individual", @@ -3220,7 +3220,7 @@ "version": "5.1.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "devOptional": true, + "dev": true, "dependencies": { "is-glob": "^4.0.1" }, @@ -4525,7 +4525,7 @@ "version": "7.0.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "devOptional": true, + "dev": true, "dependencies": { "to-regex-range": "^5.0.1" }, @@ -5018,7 +5018,7 @@ "version": "4.3.4", "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.4.tgz", "integrity": "sha512-fsXeu4J4i6WNWSikpI88v/PcVflZz+6kMhUfIwc5SY+poQRPnaf5V7qds6SUyUN3cVxEzuCab7QIoLOQ+DQ1wA==", - "devOptional": true + "dev": true }, "node_modules/import-fresh": { "version": "3.3.0", @@ -5174,7 +5174,7 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "devOptional": true, + "dev": true, "dependencies": { "binary-extensions": "^2.0.0" }, @@ -5240,7 +5240,7 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "devOptional": true, + "dev": true, "engines": { "node": ">=0.10.0" } @@ -5285,7 +5285,7 @@ "version": "4.0.3", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "devOptional": true, + "dev": true, "dependencies": { "is-extglob": "^2.1.1" }, @@ -5318,7 +5318,7 @@ "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "devOptional": true, + "dev": true, "engines": { "node": ">=0.12.0" } @@ -6132,7 +6132,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "devOptional": true, + "dev": true, "engines": { "node": ">=0.10.0" } @@ -6402,7 +6402,7 @@ "version": "2.3.1", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "devOptional": true, + "dev": true, "engines": { "node": ">=8.6" }, @@ -6828,7 +6828,7 @@ "version": "3.6.0", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "devOptional": true, + "dev": true, "dependencies": { "picomatch": "^2.2.1" }, @@ -7102,7 +7102,7 @@ "version": "1.69.5", "resolved": "https://registry.npmjs.org/sass/-/sass-1.69.5.tgz", "integrity": "sha512-qg2+UCJibLr2LCVOt3OlPhr/dqVHWOa9XtZf2OjbLs/T4VPSJ00udtgJxH3neXZm+QqX8B+3cU7RaLqp1iVfcQ==", - "devOptional": true, + "dev": true, "dependencies": { "chokidar": ">=3.0.0 <4.0.0", "immutable": "^4.0.0", @@ -7801,21 +7801,6 @@ "node": ">=8" } }, - "node_modules/stylelint/node_modules/typescript": { - "version": "5.4.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.4.2.tgz", - "integrity": "sha512-+2/g0Fds1ERlP6JsakQQDXjZdZMM+rqpamFZJEKh4kwTIn3iDkgKtby0CeNd5ATNZ4Ry1ax15TMx0W2V+miizQ==", - "dev": true, - "optional": true, - "peer": true, - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=14.17" - } - }, "node_modules/stylis": { "version": "4.2.0", "license": "MIT" @@ -7956,7 +7941,7 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "devOptional": true, + "dev": true, "dependencies": { "is-number": "^7.0.0" }, From d7fe2a9bbff765e5bcb316dd4bdafafa6a4f1027 Mon Sep 17 00:00:00 2001 From: eomielan Date: Sat, 23 Mar 2024 17:12:29 -0700 Subject: [PATCH 4/5] Fix linter errors, remove TODOs, add test for next() --- .../nodes/physics_engine/fluid_generation.py | 32 +++--------- .../unit/nodes/physics_engine/test_fluids.py | 50 +++++++++++-------- 2 files changed, 36 insertions(+), 46 deletions(-) diff --git a/src/boat_simulator/boat_simulator/nodes/physics_engine/fluid_generation.py b/src/boat_simulator/boat_simulator/nodes/physics_engine/fluid_generation.py index 6ce214eab..731f290e1 100644 --- a/src/boat_simulator/boat_simulator/nodes/physics_engine/fluid_generation.py +++ b/src/boat_simulator/boat_simulator/nodes/physics_engine/fluid_generation.py @@ -1,25 +1,26 @@ """This module provides a generator for fluid vectors used within the physics engine.""" -from boat_simulator.common.utils import bound_to_180, rad_to_degrees import numpy as np -import math from numpy.typing import NDArray + from boat_simulator.common.generators import VectorGenerator -from boat_simulator.common.types import Scalar, ScalarOrArray +from boat_simulator.common.types import Scalar +from boat_simulator.common.utils import bound_to_180, rad_to_degrees class FluidGenerator: """This class provides functionality to generate velocity vectors representing fluid movements. Attributes: - `generator` (VectorGenerator): The vector generator used to generate fluid velocities. + `generator` (VectorGenerator): The vector generator used to generate 2D fluid velocities. `velocity` (NDArray): The most recently generated fluid velocity vector, expressed in - meters per second (m/s). + meters per second (m/s). It is expected to be a 2D vector. """ def __init__(self, generator: VectorGenerator): - self.__generator = generator # Vector generator instance to produce velocity vectors - self.__velocity = np.array(self.__generator.next()) # Initial velocity vector of the fluid + self.__generator = generator + self.__velocity = np.array(self.__generator.next()) + assert self.__velocity.shape == (2,) def next(self) -> NDArray: """Generates the next velocity vector for the fluid simulation. @@ -27,10 +28,6 @@ def next(self) -> NDArray: Returns: NDArray: An array representing the updated velocity vector for the fluid simulation. """ - - # TODO: Implement this to generate the next velocity vector. - - # Generate the next velocity vector using the provided vector generator self.__velocity = np.array(self.__generator.next()) return self.__velocity @@ -42,8 +39,6 @@ def velocity(self) -> NDArray: NDArray: The velocity vector of the fluid, expressed in meters per second (m/s) and ranging from negative infinity to positive infinity. """ - - # Return the current velocity vector return self.__velocity @property @@ -54,10 +49,6 @@ def speed(self) -> Scalar: Scalar: The speed of the fluid, expressed in meters per second (m/s) and within the range of 0 to positive infinity. """ - - # TODO: Implement this using the current velocity vector. - - # Calculate the magnitude (speed) of the velocity vector return np.linalg.norm(self.__velocity) @property @@ -68,13 +59,6 @@ def direction(self) -> Scalar: Scalar: The direction of the fluid, expressed in degrees and bounded between [-180, 180). """ - - # TODO: Implement this using the current velocity vector. - - # Ensure the velocity vector is suitable for direction calculation - if self.__velocity.ndim > 1 or self.__velocity.size < 2: - raise ValueError("Velocity vector must be a 2D vector for direction calculation.") - # Calculate the angle of the velocity vector in radians, then convert to degrees and adjust to [-180, 180) range angle_rad = np.arctan2(self.__velocity[1], self.__velocity[0]) angle_deg = rad_to_degrees(angle_rad) return bound_to_180(angle_deg) diff --git a/src/boat_simulator/tests/unit/nodes/physics_engine/test_fluids.py b/src/boat_simulator/tests/unit/nodes/physics_engine/test_fluids.py index 19e076417..f7d260a99 100644 --- a/src/boat_simulator/tests/unit/nodes/physics_engine/test_fluids.py +++ b/src/boat_simulator/tests/unit/nodes/physics_engine/test_fluids.py @@ -2,21 +2,26 @@ import numpy as np import pytest -from boat_simulator.common.generators import ConstantGenerator, GaussianGenerator, VectorGenerator, MVGaussianGenerator + +from boat_simulator.common.generators import ConstantGenerator, MVGaussianGenerator from boat_simulator.nodes.physics_engine.fluid_generation import FluidGenerator -class TestFluidGenerator: - @pytest.mark.parametrize("vector", [ +class TestFluidGenerator: + @pytest.mark.parametrize( + "vector", + [ (np.array([1, 0])), (np.array([0, 1])), (np.array([1, 0])), - ]) + ], + ) def test_velocity_constant(self, vector): vector_generator = ConstantGenerator(constant=vector) fluid_generator = FluidGenerator(generator=vector_generator) first_fluid_vector = fluid_generator.velocity assert np.all(first_fluid_vector == vector) + assert np.all(first_fluid_vector == fluid_generator.next()) @pytest.mark.parametrize( "mean, cov", @@ -28,42 +33,43 @@ def test_velocity_constant(self, vector): ], ) def test_velocity_random(self, mean, cov): - vector_generator = MVGaussianGenerator(mean=mean,cov=cov) + vector_generator = MVGaussianGenerator(mean=mean, cov=cov) fluid_generator = FluidGenerator(vector_generator) first_fluid_vector = fluid_generator.velocity next_fluid_vector = fluid_generator.next() assert np.all(next_fluid_vector != first_fluid_vector) - @pytest.mark.parametrize("vector", [ + @pytest.mark.parametrize( + "vector", + [ (np.array([1, 0])), (np.array([0, 1])), (np.array([-1, 0])), (np.array([0, -1])), (np.array([1, 1])), (np.array([-1, -1])), - ]) - + ], + ) def test_speed(self, vector): vector_generator = ConstantGenerator(constant=vector) fluid_generator = FluidGenerator(generator=vector_generator) generated_fluid_vector = fluid_generator.next() assert np.all(vector == generated_fluid_vector) - assert(np.linalg.norm(vector) == fluid_generator.speed) - - @pytest.mark.parametrize("vector, expected_direction", [ - (np.array([1, 0]), 0), - (np.array([0, 1]), 90), - (np.array([-1, 0]), -180), - (np.array([0, -1]), -90), - (np.array([1, 1]), 45), - (np.array([-1, -1]), -135), - ]) + assert np.linalg.norm(vector) == fluid_generator.speed + @pytest.mark.parametrize( + "vector, expected_direction", + [ + (np.array([1, 0]), 0), + (np.array([0, 1]), 90), + (np.array([-1, 0]), -180), + (np.array([0, -1]), -90), + (np.array([1, 1]), 45), + (np.array([-1, -1]), -135), + ], + ) def test_direction(self, vector, expected_direction): vector_generator = ConstantGenerator(constant=vector) fluid_generator = FluidGenerator(generator=vector_generator) calculated_direction = fluid_generator.direction - assert np.isclose(calculated_direction, expected_direction, atol=1e-7), f"Expected direction {expected_direction}, but got {calculated_direction}" - -class TestWindGenerator: - pass + assert np.isclose(calculated_direction, expected_direction, atol=1e-7) From 5d1ef067e3542468b8277eb07b9d6f691930ef6c Mon Sep 17 00:00:00 2001 From: Patrick Creighton Date: Fri, 5 Apr 2024 17:41:44 -0700 Subject: [PATCH 5/5] Revert "test 2" This reverts commit 62040433070f6ed16b0833cbe2ea1ee3ee81e94b. --- src/website/package-lock.json | 47 +++++++++++++++++++++++------------ 1 file changed, 31 insertions(+), 16 deletions(-) diff --git a/src/website/package-lock.json b/src/website/package-lock.json index ae4fd9da4..6881e5f99 100644 --- a/src/website/package-lock.json +++ b/src/website/package-lock.json @@ -2725,7 +2725,7 @@ "version": "3.1.3", "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", - "dev": true, + "devOptional": true, "dependencies": { "normalize-path": "^3.0.0", "picomatch": "^2.0.4" @@ -2987,7 +2987,7 @@ "version": "2.2.0", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", - "dev": true, + "devOptional": true, "engines": { "node": ">=8" } @@ -3033,7 +3033,7 @@ "version": "3.0.2", "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, + "devOptional": true, "dependencies": { "fill-range": "^7.0.1" }, @@ -3193,7 +3193,7 @@ "version": "3.5.3", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", - "dev": true, + "devOptional": true, "funding": [ { "type": "individual", @@ -3220,7 +3220,7 @@ "version": "5.1.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, + "devOptional": true, "dependencies": { "is-glob": "^4.0.1" }, @@ -4525,7 +4525,7 @@ "version": "7.0.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, + "devOptional": true, "dependencies": { "to-regex-range": "^5.0.1" }, @@ -5018,7 +5018,7 @@ "version": "4.3.4", "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.4.tgz", "integrity": "sha512-fsXeu4J4i6WNWSikpI88v/PcVflZz+6kMhUfIwc5SY+poQRPnaf5V7qds6SUyUN3cVxEzuCab7QIoLOQ+DQ1wA==", - "dev": true + "devOptional": true }, "node_modules/import-fresh": { "version": "3.3.0", @@ -5174,7 +5174,7 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dev": true, + "devOptional": true, "dependencies": { "binary-extensions": "^2.0.0" }, @@ -5240,7 +5240,7 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "dev": true, + "devOptional": true, "engines": { "node": ">=0.10.0" } @@ -5285,7 +5285,7 @@ "version": "4.0.3", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, + "devOptional": true, "dependencies": { "is-extglob": "^2.1.1" }, @@ -5318,7 +5318,7 @@ "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true, + "devOptional": true, "engines": { "node": ">=0.12.0" } @@ -6132,7 +6132,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true, + "devOptional": true, "engines": { "node": ">=0.10.0" } @@ -6402,7 +6402,7 @@ "version": "2.3.1", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true, + "devOptional": true, "engines": { "node": ">=8.6" }, @@ -6828,7 +6828,7 @@ "version": "3.6.0", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dev": true, + "devOptional": true, "dependencies": { "picomatch": "^2.2.1" }, @@ -7102,7 +7102,7 @@ "version": "1.69.5", "resolved": "https://registry.npmjs.org/sass/-/sass-1.69.5.tgz", "integrity": "sha512-qg2+UCJibLr2LCVOt3OlPhr/dqVHWOa9XtZf2OjbLs/T4VPSJ00udtgJxH3neXZm+QqX8B+3cU7RaLqp1iVfcQ==", - "dev": true, + "devOptional": true, "dependencies": { "chokidar": ">=3.0.0 <4.0.0", "immutable": "^4.0.0", @@ -7801,6 +7801,21 @@ "node": ">=8" } }, + "node_modules/stylelint/node_modules/typescript": { + "version": "5.4.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.4.2.tgz", + "integrity": "sha512-+2/g0Fds1ERlP6JsakQQDXjZdZMM+rqpamFZJEKh4kwTIn3iDkgKtby0CeNd5ATNZ4Ry1ax15TMx0W2V+miizQ==", + "dev": true, + "optional": true, + "peer": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, "node_modules/stylis": { "version": "4.2.0", "license": "MIT" @@ -7941,7 +7956,7 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, + "devOptional": true, "dependencies": { "is-number": "^7.0.0" },