From 8ce89c7183aa420ad44fb69f52bf0b4103f3f877 Mon Sep 17 00:00:00 2001 From: linomp Date: Mon, 25 Dec 2023 11:16:48 -0500 Subject: [PATCH 1/7] implement temperature degradation --- ...game.conf => api.pdmgame.xmp.systems.conf} | 3 -- conf-backups/app.pdmgame.xmp.systems.conf | 26 +++++++++ mvp/server/analysis.py | 51 ++++++++++++++++-- mvp/server/constants.py | 2 +- mvp/server/data_models.py | 45 +++++++++++----- mvp/server/requirements.txt | Bin 2586 -> 2730 bytes mvp/server/tests/__init__.py | 0 mvp/server/tests/test_analysis.py | 15 ++++++ mvp/server/tests/test_data_models.py | 49 +++++++++++++++++ 9 files changed, 170 insertions(+), 21 deletions(-) rename conf-backups/{api.pdmgame.conf => api.pdmgame.xmp.systems.conf} (99%) create mode 100644 conf-backups/app.pdmgame.xmp.systems.conf create mode 100644 mvp/server/tests/__init__.py create mode 100644 mvp/server/tests/test_analysis.py create mode 100644 mvp/server/tests/test_data_models.py diff --git a/conf-backups/api.pdmgame.conf b/conf-backups/api.pdmgame.xmp.systems.conf similarity index 99% rename from conf-backups/api.pdmgame.conf rename to conf-backups/api.pdmgame.xmp.systems.conf index 5f46024..5311886 100644 --- a/conf-backups/api.pdmgame.conf +++ b/conf-backups/api.pdmgame.xmp.systems.conf @@ -14,7 +14,6 @@ server { ssl_certificate_key /etc/letsencrypt/live/api.pdmgame.xmp.systems/privkey.pem; # managed by Certbot include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot - } server { if ($host = api.pdmgame.xmp.systems) { @@ -25,6 +24,4 @@ server { listen 80; server_name api.pdmgame.xmp.systems; return 404; # managed by Certbot - - } \ No newline at end of file diff --git a/conf-backups/app.pdmgame.xmp.systems.conf b/conf-backups/app.pdmgame.xmp.systems.conf new file mode 100644 index 0000000..200123f --- /dev/null +++ b/conf-backups/app.pdmgame.xmp.systems.conf @@ -0,0 +1,26 @@ +server { + server_name app.pdmgame.xmp.systems; + + location / { + proxy_pass http://127.0.0.1:8000; # Change this to the address where your app is running + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + } + + listen 443 ssl; # managed by Certbot + ssl_certificate /etc/letsencrypt/live/app.pdmgame.xmp.systems/fullchain.pem; # managed by Certbot + ssl_certificate_key /etc/letsencrypt/live/app.pdmgame.xmp.systems/privkey.pem; # managed by Certbot + include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot + ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot +} +server { + if ($host = app.pdmgame.xmp.systems) { + return 301 https://$host$request_uri; + } # managed by Certbot + + listen 80; + server_name app.pdmgame.xmp.systems; + return 404; # managed by Certbot +} \ No newline at end of file diff --git a/mvp/server/analysis.py b/mvp/server/analysis.py index 6bdaec6..5e10d12 100644 --- a/mvp/server/analysis.py +++ b/mvp/server/analysis.py @@ -1,14 +1,57 @@ import math +from mvp.server.constants import TIMESTEPS_PER_MOVE + + +def get_health_percentage(current_timestep: int) -> int: + health_decay_speed = compute_decay_speed(current_timestep) + raw_val = round(exponential_decay(current_timestep, start=100, decay_speed=health_decay_speed)) + return min(100, max(0, raw_val)) + def exponential_decay(t: int, start: int, decay_speed: float) -> float: return start - math.exp(t * decay_speed) -def get_health_percentage(current_step: int) -> int: - raw_val = round(exponential_decay(current_step, start=100, decay_speed=0.2)) - return min(100, max(0, raw_val)) +def compute_decay_speed(t: int) -> float: + # Made-up calculation involving operational parameters: temperature, oil age, mechanical wear + # - temperature grows linearly over the 8 hours of a shift (resets every 8 hours) + # - oil age grows monotonically, directly proportional to temperature and resets only after every maintenance routine + # - mechanical wear grows monotonically, directly proportional to oil age, for now it never resets (such that at some point, the machine will definitely break and game over) + + parameter_values = get_parameter_values(t) + + # TODO: calibrate these weights + computed = parameter_values["temperature"] * 0.01 + parameter_values["oil_age"] * 0.01 + parameter_values[ + "mechanical_wear"] * 0.01 + + # decay speed will always bet between 0.1 and 0.2 + return max(min(0.1, computed), 0.2) + + +def get_parameter_values(current_timestep: int) -> dict[str, float]: + return { + "temperature": get_machine_temperature(current_timestep), + "oil_age": get_oil_age(current_timestep), + "mechanical_wear": get_mechanical_wear(current_timestep) + } + + +def get_machine_temperature(t: int) -> float: + base_value = t % TIMESTEPS_PER_MOVE + noise = 0 + # TODO: add noise + # noise = max(min(0., np.random.normal(base_value, 10)), 10) + return base_value + noise + + +def get_oil_age(t: int) -> float: + return 0. + + +def get_mechanical_wear(t: int) -> float: + return 0. -def default_rul_prediction_fn(current_step: int) -> int | None: +def default_rul_prediction_fn(current_timestep: int) -> int | None: return None diff --git a/mvp/server/constants.py b/mvp/server/constants.py index 9369d6a..0a3359e 100644 --- a/mvp/server/constants.py +++ b/mvp/server/constants.py @@ -1,3 +1,3 @@ DEFAULT_SESSION_ID = 'test' GAME_TICK_INTERVAL = 0.5 -STEPS_PER_MOVE = 8 +TIMESTEPS_PER_MOVE = 8 # we conceptualize every player move as a full working day, or "8 hours" diff --git a/mvp/server/data_models.py b/mvp/server/data_models.py index f68cba9..8993f51 100644 --- a/mvp/server/data_models.py +++ b/mvp/server/data_models.py @@ -3,35 +3,52 @@ from pydantic import BaseModel -from mvp.server.analysis import get_health_percentage, default_rul_prediction_fn -from mvp.server.constants import STEPS_PER_MOVE +from mvp.server.analysis import get_health_percentage, default_rul_prediction_fn, get_parameter_values +from mvp.server.constants import TIMESTEPS_PER_MOVE + + +class OperationalParameters(BaseModel): + temperature: float + oil_age: float + mechanical_wear: float + + @staticmethod + def from_dict(json: dict[str, Any]): + return OperationalParameters( + temperature=json.get("temperature", 0), + oil_age=json.get("oil_age", 0), + mechanical_wear=json.get("mechanical_wear", 0) + ) class MachineStats(BaseModel): - rul: int | None = None + predicted_rul: int | None = None health_percentage: int + operational_parameters: OperationalParameters | None = None @staticmethod - def from_json(json: dict[str, Any]): - return MachineStats(rul=json.get("rul", None), health_percentage=json.get("health_percentage", 0)) + def from_dict(json: dict[str, Any]): + return MachineStats(predicted_rul=json.get("predicted_rul", None), + health_percentage=json.get("health_percentage", 0)) def is_broken(self) -> bool: if self.health_percentage <= 0: return True - if self.rul is not None and self.rul <= 0: + if self.predicted_rul is not None and self.predicted_rul <= 0: return True return False def __str__(self): - return f"MachineStats(rul={self.rul}, health_percentage={self.health_percentage})" + return f"MachineStats(predicted_rul={self.predicted_rul}, health_percentage={self.health_percentage})" class GameSession(BaseModel): id: str current_step: int = 0 machine_stats: MachineStats | None = None + operational_parameters: OperationalParameters | None = None # This function can be updated in-game, to simulate a change in the model (an "upgrade" for the player) rul_predictor: Callable[[int], int | None] = default_rul_prediction_fn @@ -41,14 +58,15 @@ def __init__(self, id: str, current_step: int = 0): # init player's machine self.machine_stats = MachineStats( - rul=None, - health_percentage=get_health_percentage(self.current_step) + predicted_rul=None, + health_percentage=get_health_percentage(self.current_step), + operational_parameters=OperationalParameters.from_dict(get_parameter_values(self.current_step)) ) async def advance_one_turn(self) -> list[MachineStats]: collected_machine_stats_during_turn = [] - for _ in range(STEPS_PER_MOVE): + for _ in range(TIMESTEPS_PER_MOVE): # collect stats collected_machine_stats_during_turn.append(self.machine_stats) @@ -67,7 +85,8 @@ async def advance_one_turn(self) -> list[MachineStats]: def _update_machine_stats(self): self.machine_stats.health_percentage = get_health_percentage(self.current_step) - self.machine_stats.rul = self.rul_predictor(self.current_step) + self.machine_stats.operational_parameters = get_parameter_values(self.current_step) + self.machine_stats.predicted_rul = self.rul_predictor(self.current_step) def _log(self, multiple=5): if self.current_step % multiple == 0: @@ -88,9 +107,9 @@ def from_session(session: 'GameSession'): ) @staticmethod - def from_json(json: dict[str, Any]): + def from_dict(json: dict[str, Any]): return GameSessionDTO( id=json.get("id", ""), current_step=json.get("current_step", 0), - machine_stats=MachineStats.from_json(json.get("machine_stats", {})) + machine_stats=MachineStats.from_dict(json.get("machine_stats", {})) ) diff --git a/mvp/server/requirements.txt b/mvp/server/requirements.txt index ee51abe350aa391d50eb1bab6f65ac8c6496f7a1..ae288272c2e1913a7e8598ff2bfe77ff820bfc75 100644 GIT binary patch delta 132 zcmbOwvPyIV6SHI 0 + game_session.machine_stats.health_percentage = 50 + game_session.machine_stats.predicted_rul = 10 + assert game_session.machine_stats.is_broken() is False From 654fff0c9b6b992357601b0c6342a8118b0561aa Mon Sep 17 00:00:00 2001 From: linomp Date: Mon, 25 Dec 2023 11:22:49 -0500 Subject: [PATCH 2/7] add github workflow files --- .github/workflows/PR_BE.yml | 29 +++++++++++++++++++++++++++++ .github/workflows/PR_FE.yml | 29 +++++++++++++++++++++++++++++ 2 files changed, 58 insertions(+) create mode 100644 .github/workflows/PR_BE.yml create mode 100644 .github/workflows/PR_FE.yml diff --git a/.github/workflows/PR_BE.yml b/.github/workflows/PR_BE.yml new file mode 100644 index 0000000..868a420 --- /dev/null +++ b/.github/workflows/PR_BE.yml @@ -0,0 +1,29 @@ +name: Python Tests + +on: + pull_request: + branches: + - main + +jobs: + test: + runs-on: ubuntu-latest + + steps: + - name: Checkout code + uses: actions/checkout@v2 + + - name: Set up Python + uses: actions/setup-python@v2 + with: + python-version: '3.11' + + - name: Install dependencies + run: | + python -m pip install --upgrade pip + pip install -r mvp/server/requirements.txt + + - name: Run tests + run: | + cd mvp/server + python -m pytest tests/ diff --git a/.github/workflows/PR_FE.yml b/.github/workflows/PR_FE.yml new file mode 100644 index 0000000..d0fb959 --- /dev/null +++ b/.github/workflows/PR_FE.yml @@ -0,0 +1,29 @@ +name: Frontend Build + +on: + pull_request: + branches: + - main + +jobs: + build: + runs-on: ubuntu-latest + + steps: + - name: Checkout code + uses: actions/checkout@v2 + + - name: Set up Node.js + uses: actions/setup-node@v2 + with: + node-version: '16' # Replace with your Node.js version + + - name: Install dependencies + run: | + cd mvp/client + npm install + + - name: Build frontend + run: | + cd mvp/client + npm run build From 2e85ad09fd9e1db8333ab9ccb56184e564a851eb Mon Sep 17 00:00:00 2001 From: linomp Date: Mon, 25 Dec 2023 11:25:35 -0500 Subject: [PATCH 3/7] workflow files --- .github/workflows/PR_BE.yml | 2 +- .github/workflows/PR_FE.yml | 4 +--- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/.github/workflows/PR_BE.yml b/.github/workflows/PR_BE.yml index 868a420..878f3dc 100644 --- a/.github/workflows/PR_BE.yml +++ b/.github/workflows/PR_BE.yml @@ -1,4 +1,4 @@ -name: Python Tests +name: MVP Python Tests on: pull_request: diff --git a/.github/workflows/PR_FE.yml b/.github/workflows/PR_FE.yml index d0fb959..af4febf 100644 --- a/.github/workflows/PR_FE.yml +++ b/.github/workflows/PR_FE.yml @@ -1,4 +1,4 @@ -name: Frontend Build +name: MVP Frontend Build on: pull_request: @@ -15,8 +15,6 @@ jobs: - name: Set up Node.js uses: actions/setup-node@v2 - with: - node-version: '16' # Replace with your Node.js version - name: Install dependencies run: | From b58d51c4367af02cd54800448583500915d82fa8 Mon Sep 17 00:00:00 2001 From: linomp Date: Mon, 25 Dec 2023 12:39:07 -0500 Subject: [PATCH 4/7] update client & fix some issues (still work to do) --- mvp/client/src/generated/index.ts | 1 + .../src/generated/models/MachineStats.ts | 5 ++++- .../generated/models/OperationalParameters.ts | 10 +++++++++ .../src/generated/services/SessionsService.ts | 4 ++-- mvp/client/src/routes/+page.svelte | 20 ++++++++---------- mvp/server/analysis.py | 16 ++++++-------- mvp/server/data_models.py | 13 ++++++------ mvp/server/requirements.txt | Bin 2730 -> 1290 bytes mvp/server/tests/test_data_models.py | 2 +- 9 files changed, 40 insertions(+), 31 deletions(-) create mode 100644 mvp/client/src/generated/models/OperationalParameters.ts diff --git a/mvp/client/src/generated/index.ts b/mvp/client/src/generated/index.ts index 813cbf4..bd668b7 100644 --- a/mvp/client/src/generated/index.ts +++ b/mvp/client/src/generated/index.ts @@ -10,6 +10,7 @@ export type { OpenAPIConfig } from './core/OpenAPI'; export type { GameSessionDTO } from './models/GameSessionDTO'; export type { HTTPValidationError } from './models/HTTPValidationError'; export type { MachineStats } from './models/MachineStats'; +export type { OperationalParameters } from './models/OperationalParameters'; export type { ValidationError } from './models/ValidationError'; export { DefaultService } from './services/DefaultService'; diff --git a/mvp/client/src/generated/models/MachineStats.ts b/mvp/client/src/generated/models/MachineStats.ts index 95d4ad6..4f45bfd 100644 --- a/mvp/client/src/generated/models/MachineStats.ts +++ b/mvp/client/src/generated/models/MachineStats.ts @@ -3,7 +3,10 @@ /* tslint:disable */ /* eslint-disable */ +import type { OperationalParameters } from './OperationalParameters'; + export type MachineStats = { - rul?: (number | null); + predicted_rul?: (number | null); health_percentage: number; + operational_parameters?: (OperationalParameters | null); }; diff --git a/mvp/client/src/generated/models/OperationalParameters.ts b/mvp/client/src/generated/models/OperationalParameters.ts new file mode 100644 index 0000000..2ed81f6 --- /dev/null +++ b/mvp/client/src/generated/models/OperationalParameters.ts @@ -0,0 +1,10 @@ +/* generated using openapi-typescript-codegen -- do no edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + +export type OperationalParameters = { + temperature: number; + oil_age: number; + mechanical_wear: number; +}; diff --git a/mvp/client/src/generated/services/SessionsService.ts b/mvp/client/src/generated/services/SessionsService.ts index 5dc6df9..43451ad 100644 --- a/mvp/client/src/generated/services/SessionsService.ts +++ b/mvp/client/src/generated/services/SessionsService.ts @@ -44,12 +44,12 @@ sessionId: string, } /** - * Advance Session Turn + * Advance * @param sessionId * @returns GameSessionDTO Successful Response * @throws ApiError */ - public static advanceSessionTurnSessionTurnsPut( + public static advanceSessionTurnsPut( sessionId: string, ): CancelablePromise { return __request(OpenAPI, { diff --git a/mvp/client/src/routes/+page.svelte b/mvp/client/src/routes/+page.svelte index 9d2e789..fd8fbe9 100644 --- a/mvp/client/src/routes/+page.svelte +++ b/mvp/client/src/routes/+page.svelte @@ -46,21 +46,19 @@ if (!gameSession || gameOver) { return; } + // TODO: migrate this polling strategy to a websocket connection + // start fetching machine health every second while the day is advancing + const intervalId = setInterval(fetchExistingSession, 700); + advanceButtonDisabled = true; try { - // start fetching machine health every second while the day is advancing - const intervalId = setInterval(fetchExistingSession, 700); - - advanceButtonDisabled = true; - gameSession = await SessionsService.advanceSessionTurnSessionTurnsPut(gameSession?.id); - advanceButtonDisabled = false; - - // stop fetching machine health until the player advances to next day again - clearInterval(intervalId); - - // TODO: migrate this polling strategy to a websocket connection + gameSession = await SessionsService.advanceSessionTurnsPut(gameSession?.id); } catch (error) { console.error('Error advancing day:', error); + } finally { + // stop fetching machine health until the player advances to next day again + clearInterval(intervalId); + advanceButtonDisabled = false; } }; diff --git a/mvp/server/analysis.py b/mvp/server/analysis.py index 5e10d12..1dfcbe9 100644 --- a/mvp/server/analysis.py +++ b/mvp/server/analysis.py @@ -3,14 +3,14 @@ from mvp.server.constants import TIMESTEPS_PER_MOVE -def get_health_percentage(current_timestep: int) -> int: +def get_health_percentage(current_timestep: int, initial_value=100) -> int: health_decay_speed = compute_decay_speed(current_timestep) - raw_val = round(exponential_decay(current_timestep, start=100, decay_speed=health_decay_speed)) + raw_val = round(exponential_decay(current_timestep, initial_value=initial_value, decay_speed=health_decay_speed)) return min(100, max(0, raw_val)) -def exponential_decay(t: int, start: int, decay_speed: float) -> float: - return start - math.exp(t * decay_speed) +def exponential_decay(t: int, initial_value: int, decay_speed: float) -> float: + return initial_value - math.exp(t * decay_speed) def compute_decay_speed(t: int) -> float: @@ -26,7 +26,7 @@ def compute_decay_speed(t: int) -> float: "mechanical_wear"] * 0.01 # decay speed will always bet between 0.1 and 0.2 - return max(min(0.1, computed), 0.2) + return min(computed / 3, 0.3) def get_parameter_values(current_timestep: int) -> dict[str, float]: @@ -38,11 +38,7 @@ def get_parameter_values(current_timestep: int) -> dict[str, float]: def get_machine_temperature(t: int) -> float: - base_value = t % TIMESTEPS_PER_MOVE - noise = 0 - # TODO: add noise - # noise = max(min(0., np.random.normal(base_value, 10)), 10) - return base_value + noise + return max(0, t - 1) % TIMESTEPS_PER_MOVE def get_oil_age(t: int) -> float: diff --git a/mvp/server/data_models.py b/mvp/server/data_models.py index 8993f51..79bff9b 100644 --- a/mvp/server/data_models.py +++ b/mvp/server/data_models.py @@ -13,7 +13,7 @@ class OperationalParameters(BaseModel): mechanical_wear: float @staticmethod - def from_dict(json: dict[str, Any]): + def from_dict(json: dict[str, float]) -> 'OperationalParameters': return OperationalParameters( temperature=json.get("temperature", 0), oil_age=json.get("oil_age", 0), @@ -41,14 +41,14 @@ def is_broken(self) -> bool: return False def __str__(self): - return f"MachineStats(predicted_rul={self.predicted_rul}, health_percentage={self.health_percentage})" + return (f"MachineStats(predicted_rul={self.predicted_rul}, health_percentage={self.health_percentage}), " + f"operational_parameters={self.operational_parameters})") class GameSession(BaseModel): id: str current_step: int = 0 machine_stats: MachineStats | None = None - operational_parameters: OperationalParameters | None = None # This function can be updated in-game, to simulate a change in the model (an "upgrade" for the player) rul_predictor: Callable[[int], int | None] = default_rul_prediction_fn @@ -84,11 +84,12 @@ async def advance_one_turn(self) -> list[MachineStats]: return collected_machine_stats_during_turn def _update_machine_stats(self): - self.machine_stats.health_percentage = get_health_percentage(self.current_step) + self.machine_stats.health_percentage = get_health_percentage(self.current_step, + initial_value=self.machine_stats.health_percentage) self.machine_stats.operational_parameters = get_parameter_values(self.current_step) self.machine_stats.predicted_rul = self.rul_predictor(self.current_step) - def _log(self, multiple=5): + def _log(self, multiple=1): if self.current_step % multiple == 0: print(f"GameSession '{self.id}' - step: {self.current_step} - {self.machine_stats}") @@ -103,7 +104,7 @@ def from_session(session: 'GameSession'): return GameSessionDTO( id=session.id, current_step=session.current_step, - machine_stats=session.machine_stats + machine_stats=session.machine_stats, ) @staticmethod diff --git a/mvp/server/requirements.txt b/mvp/server/requirements.txt index ae288272c2e1913a7e8598ff2bfe77ff820bfc75..918b104ce6b5501b29f86428b6bb923779633c8c 100644 GIT binary patch literal 1290 zcmYLJO>f&U487~WSnx-Zt_L4>8ZfLtfSq$=OqRGd{$48TA za(Nv0y4S6u5F!)Xso`6)WgJ_5sNtK7<2dLC-6>+u_|gx$!>5yX;c5ZU;bW@|nTzEZ zJu>!s(7iG?vzr|XS}Eyt_n^#$a2TyL+Xbu+dFd|$8W$!TJ$l~LPBGw4{8b} z-S`p%z!2z_UC8<76%Z3~1V}HObc%&LHB(_qXx!?q-GTVo@pKx;9WuI3{cwD|gUKYj zR$aQTCL=*zn3IXw%3Liv$@@N*NYd57yQKF}PPr+78A zEtIcQd<%`^Cfx*0N}mv2({GwFm2?}_GOgLynb9n)i{zs30k4>)laxL}K9$H^>Fk1# zm#roW6Wv)4>gc?WZ>WW`Xq5bVK36C-Rw+l0r**C)>>*vcQO-5Jt^#k!z|IIO5%cri z*mutK>BPF)uWzsqgU+1-y4*pYx2++2r}q-I;-^-_QKwcNZ|B7Z-l`sIFSdop@d17s zkS?!=$}Jc%Jhoehtv+e6OuMp!U_Ic3r+BfMBHQq~8AW*1;Ievli87!eJ$!-q2MT3H z!`-0A+n?`Gzr-GpO=UaVY|&RVZuNjeLG14eLX|E8t;)_^&`Ayvk2ICKUX%;X;$TRW z$;Fmsp(H0L&?UHemU*yq`Notznbfo7?Mqc7FSd^@8sQ>@~ literal 2730 zcmZveOK;mi421Vwpg%=HtUTHtdg!S@(EtH@>M8Ieex#1<+HxNL@onehXtPop7)BhC z9FoIXuKxZRr*&%6IIYqyeb(n9oupdd)AT;Q)AL53O?b5FHqBC{-_L2Q-}~@CmG9-i z|5;d@u$}4o2Yp8!R;$=u7gr~&qnF5u>R2h)FCn`UY(%?~scM;~rL3*cH}ZCV>IJEe z9Mgzyg*4Zferm<%Tp*5wNoQbFI9lu$HzKVm0*7iJgPJzRc(Yh z4jepS=Um^*@R%vfUfew^<5HeYpujdh?%+0JS3;`NLs!jAf9cx1;BVeegtZZ3+c7+s zAODT@+})FZq$ zPp;MdEoH}JI7M(!k*ml)PcJ#@PM73Zsrp7e!Y`GX+m(2Ojh&F0(M0^+hg!z+hd)P< z<&(bd1jR8=W`SZBfolC1pH{4b(a4TEH|d}!R+net-o6Q;Nq6$BU#g>fTkjM@o_%P~ za|Xk+hXL30mS3eP&fHWPsFTxx%8lnrhB|jn^t_W=XYzbh?n*JJ9SvswO6IH1`yl%d z{hoId%!)gU>E8?OAk=jrSOK}mMi%B^boUP9u7>I4?s9f!fkK(=RyjFaWAO}=c^c*X z;nBn_hWxv-YelW~p;z$1^?Wk^TJ+PDE&lL`_Q3czJOt3ZNu8I9ZMI_A|1pJ!e?rwqO@A2Q1|9l={|6J@4h+C}X}g$mxyUNAtd{ zf?Kc;(X};57gYJSKQp~mhKHynZ==Fa-o@;TgVY0?=!{K5_0+@Hd&bot!&2@RR5aYh z@boi%NmuE6`1+2_I$}3+y7=qfv)ajYCbjiFf2%IDS@^b(yV!-&mXT)^JF(oGJJmH4 z$K}kE!CvNTuV`;tXLY40buUKPAlpDj!H%_!%{kX6&yDDEntTtjC9F{21;p3ATOBVr z;KpQYn{klp-j??K*bR92?0Vi=Q=D25^1OWV-Cw?GJTrHIV$2=Zoo2u-;kOq0KabPk zHyxj?8&%0EWnM5=HZRJinv8esH0t}NuMv1_^=`q2VuQQhvKbD8?a1?j>y7K1?JW8n z?uLW(?VF5lG7oi}J9-|f^Zz#sE6ejK>^!Q Date: Thu, 28 Dec 2023 10:38:12 -0500 Subject: [PATCH 5/7] fix tests --- mvp/server/analysis.py | 20 ++++++-------- mvp/server/api.py | 2 +- mvp/server/data_models.py | 39 ++++++++++++++++------------ mvp/server/math_utils.py | 13 ++++++++++ mvp/server/tests/test_analysis.py | 25 +++++++++++------- mvp/server/tests/test_data_models.py | 2 +- 6 files changed, 62 insertions(+), 39 deletions(-) create mode 100644 mvp/server/math_utils.py diff --git a/mvp/server/analysis.py b/mvp/server/analysis.py index 1dfcbe9..182dead 100644 --- a/mvp/server/analysis.py +++ b/mvp/server/analysis.py @@ -1,6 +1,5 @@ -import math - from mvp.server.constants import TIMESTEPS_PER_MOVE +from mvp.server.math_utils import exponential_decay, linear_growth_with_reset def get_health_percentage(current_timestep: int, initial_value=100) -> int: @@ -9,17 +8,13 @@ def get_health_percentage(current_timestep: int, initial_value=100) -> int: return min(100, max(0, raw_val)) -def exponential_decay(t: int, initial_value: int, decay_speed: float) -> float: - return initial_value - math.exp(t * decay_speed) - - -def compute_decay_speed(t: int) -> float: +def compute_decay_speed(current_timestep: int) -> float: # Made-up calculation involving operational parameters: temperature, oil age, mechanical wear # - temperature grows linearly over the 8 hours of a shift (resets every 8 hours) # - oil age grows monotonically, directly proportional to temperature and resets only after every maintenance routine # - mechanical wear grows monotonically, directly proportional to oil age, for now it never resets (such that at some point, the machine will definitely break and game over) - parameter_values = get_parameter_values(t) + parameter_values = get_parameter_values(current_timestep) # TODO: calibrate these weights computed = parameter_values["temperature"] * 0.01 + parameter_values["oil_age"] * 0.01 + parameter_values[ @@ -37,15 +32,16 @@ def get_parameter_values(current_timestep: int) -> dict[str, float]: } -def get_machine_temperature(t: int) -> float: - return max(0, t - 1) % TIMESTEPS_PER_MOVE +def get_machine_temperature(current_timestep: int) -> float: + # return max(0, current_timestep - 1) % TIMESTEPS_PER_MOVE + return linear_growth_with_reset(initial_value=0, period=TIMESTEPS_PER_MOVE, time=current_timestep) -def get_oil_age(t: int) -> float: +def get_oil_age(current_timestep: int) -> float: return 0. -def get_mechanical_wear(t: int) -> float: +def get_mechanical_wear(current_timestep: int) -> float: return 0. diff --git a/mvp/server/api.py b/mvp/server/api.py index e6ddf58..c0f6120 100644 --- a/mvp/server/api.py +++ b/mvp/server/api.py @@ -35,7 +35,7 @@ async def create_session() -> GameSessionDTO: new_session_id = uuid.uuid4().hex if new_session_id not in sessions: - session = GameSession(id=new_session_id) + session = GameSession.new_game_session(id=new_session_id) sessions[new_session_id] = session return GameSessionDTO.from_session(sessions[new_session_id]) diff --git a/mvp/server/data_models.py b/mvp/server/data_models.py index 79bff9b..331de2a 100644 --- a/mvp/server/data_models.py +++ b/mvp/server/data_models.py @@ -24,12 +24,7 @@ def from_dict(json: dict[str, float]) -> 'OperationalParameters': class MachineStats(BaseModel): predicted_rul: int | None = None health_percentage: int - operational_parameters: OperationalParameters | None = None - - @staticmethod - def from_dict(json: dict[str, Any]): - return MachineStats(predicted_rul=json.get("predicted_rul", None), - health_percentage=json.get("health_percentage", 0)) + operational_parameters: OperationalParameters def is_broken(self) -> bool: if self.health_percentage <= 0: @@ -40,6 +35,16 @@ def is_broken(self) -> bool: return False + @staticmethod + def from_dict(json: dict[str, Any]): + return MachineStats( + predicted_rul=json.get("predicted_rul", None), + health_percentage=json.get("health_percentage", 0), + operational_parameters=OperationalParameters.from_dict( + json.get("operational_parameters", {}) + ) + ) + def __str__(self): return (f"MachineStats(predicted_rul={self.predicted_rul}, health_percentage={self.health_percentage}), " f"operational_parameters={self.operational_parameters})") @@ -48,19 +53,21 @@ def __str__(self): class GameSession(BaseModel): id: str current_step: int = 0 - machine_stats: MachineStats | None = None + machine_stats: MachineStats - # This function can be updated in-game, to simulate a change in the model (an "upgrade" for the player) + # TODO: Update this function in-game, to simulate a change in the model (an "upgrade" for the player) rul_predictor: Callable[[int], int | None] = default_rul_prediction_fn - def __init__(self, id: str, current_step: int = 0): - super().__init__(id=id, current_step=current_step) - - # init player's machine - self.machine_stats = MachineStats( - predicted_rul=None, - health_percentage=get_health_percentage(self.current_step), - operational_parameters=OperationalParameters.from_dict(get_parameter_values(self.current_step)) + @staticmethod + def new_game_session(id: str, current_step: int = 0): + return GameSession( + id=id, + current_step=0, + machine_stats=MachineStats( + predicted_rul=None, + health_percentage=get_health_percentage(current_step), + operational_parameters=OperationalParameters.from_dict(get_parameter_values(current_step)) + ) ) async def advance_one_turn(self) -> list[MachineStats]: diff --git a/mvp/server/math_utils.py b/mvp/server/math_utils.py new file mode 100644 index 0000000..b1900ed --- /dev/null +++ b/mvp/server/math_utils.py @@ -0,0 +1,13 @@ +import math + + +def linear_growth_with_reset(initial_value, period, time): + growth_rate = 1 + effective_time = time % period + current_value = initial_value + growth_rate * effective_time + current_value %= (initial_value + period) + return current_value + + +def exponential_decay(current_timestep: int, initial_value: int, decay_speed: float) -> float: + return initial_value - math.exp(current_timestep * decay_speed) diff --git a/mvp/server/tests/test_analysis.py b/mvp/server/tests/test_analysis.py index 2e46dc6..d8dc169 100644 --- a/mvp/server/tests/test_analysis.py +++ b/mvp/server/tests/test_analysis.py @@ -4,12 +4,19 @@ from mvp.server.constants import TIMESTEPS_PER_MOVE -def test_get_machine_temperature(): - for i in range(0, 40): - # check that it grows monotonically until the last timestep of the move - if i % TIMESTEPS_PER_MOVE != TIMESTEPS_PER_MOVE - 1: - assert get_machine_temperature(i) <= get_machine_temperature(i + 1) - - # check that it resets after the last timestep of the move - assert pytest.approx(get_machine_temperature(i), 10) == pytest.approx( - get_machine_temperature(i + TIMESTEPS_PER_MOVE), 10) +def test_temperature_grows_monotonically(): + # check that it grows monotonically until the last timestep of the move + assert all( + get_machine_temperature(i) <= get_machine_temperature(i + 1) + for i in range(0, TIMESTEPS_PER_MOVE - 1) + ) + + +def test_temperature_is_periodic(): + # check that it resets after the last timestep of the move + assert all( + pytest.approx( + get_machine_temperature(i), 10) == pytest.approx(get_machine_temperature(i + TIMESTEPS_PER_MOVE), + 10) + for i in range(0, 40) + ) diff --git a/mvp/server/tests/test_data_models.py b/mvp/server/tests/test_data_models.py index caff593..b930c68 100644 --- a/mvp/server/tests/test_data_models.py +++ b/mvp/server/tests/test_data_models.py @@ -6,7 +6,7 @@ @pytest.fixture def game_session(): - return GameSession(id="test_session") + return GameSession.new_game_session(id="test_session", current_step=0) def test_game_session_initialization(game_session): From 44ab48cdcf1d0283dbcfb4a301a10e2b62fc25c6 Mon Sep 17 00:00:00 2001 From: linomp Date: Fri, 29 Dec 2023 17:30:42 -0500 Subject: [PATCH 6/7] fixed some stuff & refactors --- README.md | 2 +- media/29_12_2023.PNG | Bin 0 -> 172559 bytes mvp/client/src/routes/+page.svelte | 54 ++++---- mvp/server/analysis.py | 54 +++----- mvp/server/api.py | 7 +- mvp/server/constants.py | 4 + mvp/server/data_models.py | 123 ------------------ mvp/server/data_models/GameSession.py | 71 ++++++++++ mvp/server/data_models/MachineStats.py | 122 +++++++++++++++++ mvp/server/data_models/__init__.py | 0 mvp/server/math_utils.py | 22 +++- mvp/server/tests/test_analysis.py | 22 ---- ...st_data_models.py => test_game_session.py} | 2 +- mvp/server/tests/test_machine_stats.py | 20 +++ 14 files changed, 282 insertions(+), 221 deletions(-) create mode 100644 media/29_12_2023.PNG delete mode 100644 mvp/server/data_models.py create mode 100644 mvp/server/data_models/GameSession.py create mode 100644 mvp/server/data_models/MachineStats.py create mode 100644 mvp/server/data_models/__init__.py delete mode 100644 mvp/server/tests/test_analysis.py rename mvp/server/tests/{test_data_models.py => test_game_session.py} (96%) create mode 100644 mvp/server/tests/test_machine_stats.py diff --git a/README.md b/README.md index f45b6f0..1080b8a 100644 --- a/README.md +++ b/README.md @@ -1 +1 @@ -![image](https://github.com/linomp/pdm-game/assets/40581019/0bda82aa-9577-4127-8fee-c9a4981cd4cd) +![image](./media/29_12_2023.PNG) diff --git a/media/29_12_2023.PNG b/media/29_12_2023.PNG new file mode 100644 index 0000000000000000000000000000000000000000..605bcda84d2b7115695d9a27619ea23a54912dee GIT binary patch literal 172559 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∈5$ho}2T&n9T3||i1d+>mVZ@$Ueb?XTa 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%0AsFdG>{8|0)T2@drEaOU{?m^8ld8->2m%b- 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

qPey+rihu)Za-djr`=#xx*9V6K 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%0A7(a90La~OcY&xBp% zF9QaU6ujy4U26x94wDd5@t$3cyG?Hko2btlp+d(ZDIIjc4wR7=IF?5th_ zn=(v-ez``i6o{dM%o{fCISa4~lsQeEP;+kldQLH1)%*^ZBR%?{`+ zsfjKa+=Zbz|B`XoK+`}etKHP0?f7Sd&T8)t_pgVfnQI@zv>+rPkqd#z0j|I%!w^M-1$Ea$MT3GyqYpSh9Q}yUp zB=fjZaDh%WB(Ha&kT8EYU~-ctGF7Nh3no}SqoZW3>lujsBx1aQQxJQPa(8;#ghI|B zy2#V#MmfJdNcY2aP-?DpEESZUBNF+ql8la)xx5H6y;v5tlv;3Yxq0`@O1IU*is1@) zk%~TL-%d%RY0tHb(hZa}!tEfM;8(-sMI*0$%aJQ;j(zxW`ZG6K(uGhe--ZeB#T=hQ zU060Q`W|m_{}ogwnAbX&#r`TjuJ_=8CK|;fOjqH?2`?OKfTiS>6nuK6QHuF|X4)-L z`P=Hoq1jE7?ViUIj(M#-PyW%{pP3=38A<3c;Oh`9sr4F0g<}igE~3%Re(_$_S`r;~ zn#kC*BGdWU$pgRc-~6aFYCDsTeAsJ_{knDY&eTJj%?c;8{)UKp|4Iv{e+|6?pqqI8 z=2RHFd4wl2JB{~5%<&^3ilsfBa)Tk3=r;BwNdq%@a^2x>d{)gg2tuB;wRy59?|-J zvB{aIGPcxJ@*Im@`}YWor;70HiI)!j96`?i_cHx{#{jT z%EwpXTx*qqzXDGxjKy3kL?*&{4T3moXF76mctMN{F>nl<`(hFnhBgIw?;li=-d_E&ybcgeWKrW#Hl9 zwsm9*>4n29bqlUf^}@e8DcY!ejMLX?o_IPBOEdiTZ>YPr-BgbYd>L^yplZFxj54x7N$K>)Y;5($kOhv^KQ>f09`)UgAD%sx zeVL0mx7^=8<}cpXZoYkcB)n>&?Hb&iv+4anSg=kEierSFE_O2Ucl#kIhrL6JQBhNw zIg(6XQuF-&UU!`X_)=tN{1m8W&WdU}W#VJ3WnaiF{f~VV+h=uM@4aWR57f-W9wca; zYj6tdNs|!}BQ*AbueD9(}M#uWm?Jr3YeE&v*T*ED{y{$%6#DO>J&hH5={Cr;j2^3h`9%`8I4tbpQ z!cSQF9UY$GJl59xYTtGU`NQa#@gG3s2&r*nR3pb6++qZD-8($514QBL7ImZmfETV4 n1hWqSK<6*_=Kt%DcHDck8bb^26axe=T^9>eTazazJX8J&M?md6 literal 0 HcmV?d00001 diff --git a/mvp/client/src/routes/+page.svelte b/mvp/client/src/routes/+page.svelte index fd8fbe9..fb91695 100644 --- a/mvp/client/src/routes/+page.svelte +++ b/mvp/client/src/routes/+page.svelte @@ -26,17 +26,13 @@ }; const fetchExistingSession = async () => { - if (!gameSession) { - return; - } - - if (gameSession?.machine_stats && gameSession.machine_stats.health_percentage <= 0) { - gameOver = true; + if (!gameSession || gameOver) { return; } try { gameSession = await SessionsService.getSessionSessionGet(gameSession?.id); + checkForGameOver(); } catch (error) { console.error('Error fetching session:', error); } @@ -46,9 +42,10 @@ if (!gameSession || gameOver) { return; } + // TODO: migrate this polling strategy to a websocket connection // start fetching machine health every second while the day is advancing - const intervalId = setInterval(fetchExistingSession, 700); + const intervalId = setInterval(fetchExistingSession, 500); advanceButtonDisabled = true; try { @@ -61,15 +58,21 @@ advanceButtonDisabled = false; } }; + + const checkForGameOver = () => { + if (!gameSession) { + return; + } + + if (gameSession?.machine_stats && gameSession.machine_stats.health_percentage <= 0) { + gameOver = true; + } + };

The Predictive Maintenance Game

- {#if !gameSession} - - {/if} - {#if gameSession} - {/if} - {#if gameSession && !gameOver} -
-

Game Session Details

+ {#if gameOver} +

Game Over

{JSON.stringify(gameSession, null, 2)}
-
- - {/if} - - - - {#if gameOver} -

Game Over

-
{JSON.stringify(gameSession, null, 2)}
-

Machine health has reached 0%.

+

Machine health has reached 0%.

+ {:else} +
+

Game Session Details

+
{JSON.stringify(gameSession, null, 2)}
+
+ + {/if} + {:else} + {/if}
diff --git a/mvp/server/analysis.py b/mvp/server/analysis.py index 182dead..a146816 100644 --- a/mvp/server/analysis.py +++ b/mvp/server/analysis.py @@ -1,48 +1,24 @@ -from mvp.server.constants import TIMESTEPS_PER_MOVE -from mvp.server.math_utils import exponential_decay, linear_growth_with_reset +from mvp.server.constants import OIL_AGE_MAPPING_MAX, TEMPERATURE_MAPPING_MAX, \ + MECHANICAL_WEAR_MAPPING_MAX +from mvp.server.math_utils import map_value -def get_health_percentage(current_timestep: int, initial_value=100) -> int: - health_decay_speed = compute_decay_speed(current_timestep) - raw_val = round(exponential_decay(current_timestep, initial_value=initial_value, decay_speed=health_decay_speed)) - return min(100, max(0, raw_val)) - - -def compute_decay_speed(current_timestep: int) -> float: - # Made-up calculation involving operational parameters: temperature, oil age, mechanical wear - # - temperature grows linearly over the 8 hours of a shift (resets every 8 hours) - # - oil age grows monotonically, directly proportional to temperature and resets only after every maintenance routine - # - mechanical wear grows monotonically, directly proportional to oil age, for now it never resets (such that at some point, the machine will definitely break and game over) - - parameter_values = get_parameter_values(current_timestep) - +def compute_decay_speed(parameter_values: 'OperationalParameters') -> float: # TODO: calibrate these weights - computed = parameter_values["temperature"] * 0.01 + parameter_values["oil_age"] * 0.01 + parameter_values[ - "mechanical_wear"] * 0.01 - - # decay speed will always bet between 0.1 and 0.2 - return min(computed / 3, 0.3) + temperature_weight = 0.01 + oil_age_weight = 0.01 + mechanical_wear_weight = 0.01 + # Made-up calculation involving operational parameters: temperature, oil age, mechanical wear + computed = parameter_values.temperature * temperature_weight + \ + parameter_values.oil_age * oil_age_weight + \ + parameter_values.mechanical_wear * mechanical_wear_weight -def get_parameter_values(current_timestep: int) -> dict[str, float]: - return { - "temperature": get_machine_temperature(current_timestep), - "oil_age": get_oil_age(current_timestep), - "mechanical_wear": get_mechanical_wear(current_timestep) - } - - -def get_machine_temperature(current_timestep: int) -> float: - # return max(0, current_timestep - 1) % TIMESTEPS_PER_MOVE - return linear_growth_with_reset(initial_value=0, period=TIMESTEPS_PER_MOVE, time=current_timestep) - - -def get_oil_age(current_timestep: int) -> float: - return 0. - + mapping_max = TEMPERATURE_MAPPING_MAX * temperature_weight + \ + OIL_AGE_MAPPING_MAX * oil_age_weight + \ + MECHANICAL_WEAR_MAPPING_MAX * mechanical_wear_weight -def get_mechanical_wear(current_timestep: int) -> float: - return 0. + return map_value(computed, from_low=0, from_high=mapping_max, to_low=0, to_high=0.3) def default_rul_prediction_fn(current_timestep: int) -> int | None: diff --git a/mvp/server/api.py b/mvp/server/api.py index c0f6120..c1bc883 100644 --- a/mvp/server/api.py +++ b/mvp/server/api.py @@ -4,7 +4,7 @@ from fastapi.middleware.cors import CORSMiddleware from starlette.responses import RedirectResponse, JSONResponse -from mvp.server.data_models import GameSession, GameSessionDTO +from mvp.server.data_models.GameSession import GameSession, GameSessionDTO app = FastAPI() app.add_middleware( @@ -19,9 +19,6 @@ @app.on_event("shutdown") async def cleanup_sessions(): - for session in sessions.values(): - session.stop_incrementing() - sessions.clear() @@ -58,7 +55,7 @@ async def advance(session_id: str) -> GameSessionDTO | JSONResponse: session = sessions[session_id] - # TODO: do something with the returned list of MachineStats + # TODO: do something with the returned list of MachineStats. May be useful for prediction functionality. await session.advance_one_turn() return GameSessionDTO.from_session(session) diff --git a/mvp/server/constants.py b/mvp/server/constants.py index 0a3359e..65bc1a9 100644 --- a/mvp/server/constants.py +++ b/mvp/server/constants.py @@ -1,3 +1,7 @@ DEFAULT_SESSION_ID = 'test' GAME_TICK_INTERVAL = 0.5 TIMESTEPS_PER_MOVE = 8 # we conceptualize every player move as a full working day, or "8 hours" +TEMPERATURE_STARTING_POINT = 20 +OIL_AGE_MAPPING_MAX = 1000 +TEMPERATURE_MAPPING_MAX = 200 +MECHANICAL_WEAR_MAPPING_MAX = 1000 diff --git a/mvp/server/data_models.py b/mvp/server/data_models.py deleted file mode 100644 index 331de2a..0000000 --- a/mvp/server/data_models.py +++ /dev/null @@ -1,123 +0,0 @@ -import asyncio -from typing import Any, Callable - -from pydantic import BaseModel - -from mvp.server.analysis import get_health_percentage, default_rul_prediction_fn, get_parameter_values -from mvp.server.constants import TIMESTEPS_PER_MOVE - - -class OperationalParameters(BaseModel): - temperature: float - oil_age: float - mechanical_wear: float - - @staticmethod - def from_dict(json: dict[str, float]) -> 'OperationalParameters': - return OperationalParameters( - temperature=json.get("temperature", 0), - oil_age=json.get("oil_age", 0), - mechanical_wear=json.get("mechanical_wear", 0) - ) - - -class MachineStats(BaseModel): - predicted_rul: int | None = None - health_percentage: int - operational_parameters: OperationalParameters - - def is_broken(self) -> bool: - if self.health_percentage <= 0: - return True - - if self.predicted_rul is not None and self.predicted_rul <= 0: - return True - - return False - - @staticmethod - def from_dict(json: dict[str, Any]): - return MachineStats( - predicted_rul=json.get("predicted_rul", None), - health_percentage=json.get("health_percentage", 0), - operational_parameters=OperationalParameters.from_dict( - json.get("operational_parameters", {}) - ) - ) - - def __str__(self): - return (f"MachineStats(predicted_rul={self.predicted_rul}, health_percentage={self.health_percentage}), " - f"operational_parameters={self.operational_parameters})") - - -class GameSession(BaseModel): - id: str - current_step: int = 0 - machine_stats: MachineStats - - # TODO: Update this function in-game, to simulate a change in the model (an "upgrade" for the player) - rul_predictor: Callable[[int], int | None] = default_rul_prediction_fn - - @staticmethod - def new_game_session(id: str, current_step: int = 0): - return GameSession( - id=id, - current_step=0, - machine_stats=MachineStats( - predicted_rul=None, - health_percentage=get_health_percentage(current_step), - operational_parameters=OperationalParameters.from_dict(get_parameter_values(current_step)) - ) - ) - - async def advance_one_turn(self) -> list[MachineStats]: - collected_machine_stats_during_turn = [] - - for _ in range(TIMESTEPS_PER_MOVE): - # collect stats - collected_machine_stats_during_turn.append(self.machine_stats) - - # check if game over - if self.machine_stats.is_broken(): - print(f"GameSession '{self.id}' - machine failed at step {self.current_step} - {self.machine_stats}") - break - - self.current_step += 1 - self._update_machine_stats() - self._log() - - await asyncio.sleep(0.5) - - return collected_machine_stats_during_turn - - def _update_machine_stats(self): - self.machine_stats.health_percentage = get_health_percentage(self.current_step, - initial_value=self.machine_stats.health_percentage) - self.machine_stats.operational_parameters = get_parameter_values(self.current_step) - self.machine_stats.predicted_rul = self.rul_predictor(self.current_step) - - def _log(self, multiple=1): - if self.current_step % multiple == 0: - print(f"GameSession '{self.id}' - step: {self.current_step} - {self.machine_stats}") - - -class GameSessionDTO(BaseModel): - id: str - current_step: int - machine_stats: MachineStats | None = None - - @staticmethod - def from_session(session: 'GameSession'): - return GameSessionDTO( - id=session.id, - current_step=session.current_step, - machine_stats=session.machine_stats, - ) - - @staticmethod - def from_dict(json: dict[str, Any]): - return GameSessionDTO( - id=json.get("id", ""), - current_step=json.get("current_step", 0), - machine_stats=MachineStats.from_dict(json.get("machine_stats", {})) - ) diff --git a/mvp/server/data_models/GameSession.py b/mvp/server/data_models/GameSession.py new file mode 100644 index 0000000..b8d7951 --- /dev/null +++ b/mvp/server/data_models/GameSession.py @@ -0,0 +1,71 @@ +import asyncio +from typing import Any, Callable + +from pydantic import BaseModel + +from mvp.server.analysis import default_rul_prediction_fn +from mvp.server.constants import TIMESTEPS_PER_MOVE +from mvp.server.data_models.MachineStats import MachineStats + + +class GameSession(BaseModel): + id: str + current_step: int = 0 + machine_stats: MachineStats + + # TODO: Update this function in-game, to simulate a change in the model (an "upgrade" for the player) + rul_predictor: Callable[[int], int | None] = default_rul_prediction_fn + + @staticmethod + def new_game_session(id: str, current_step: int = 0): + return GameSession( + id=id, + current_step=0, + machine_stats=MachineStats.new_machine_stats(current_step) + ) + + async def advance_one_turn(self) -> list[MachineStats]: + collected_machine_stats_during_turn = [] + + for _ in range(TIMESTEPS_PER_MOVE): + # collect stats + collected_machine_stats_during_turn.append(self.machine_stats) + + # check if game over + if self.machine_stats.is_broken(): + print(f"GameSession '{self.id}' - machine failed at step {self.current_step} - {self.machine_stats}") + break + + self.current_step += 1 + self.machine_stats.update_stats_and_parameters(self.current_step, self.rul_predictor) + self._log() + + await asyncio.sleep(0.5) + + return collected_machine_stats_during_turn + + def _log(self, multiple=5): + if self.current_step % multiple == 0: + print(f"GameSession '{self.id}' - step: {self.current_step} - {self.machine_stats}") + + +class GameSessionDTO(BaseModel): + id: str + current_step: int + machine_stats: MachineStats | None = None + + @staticmethod + def from_session(session: 'GameSession'): + return GameSessionDTO( + id=session.id, + current_step=session.current_step, + machine_stats=session.machine_stats, + ) + + @staticmethod + def from_dict(json: dict[str, Any]): + return GameSessionDTO( + id=json.get("id", ""), + current_step=json.get("current_step", 0), + machine_stats=MachineStats.from_dict(json.get("machine_stats", {})) + ) diff --git a/mvp/server/data_models/MachineStats.py b/mvp/server/data_models/MachineStats.py new file mode 100644 index 0000000..34deddf --- /dev/null +++ b/mvp/server/data_models/MachineStats.py @@ -0,0 +1,122 @@ +import math +from typing import Any, Callable + +from pydantic import BaseModel + +from mvp.server.analysis import compute_decay_speed +from mvp.server.constants import OIL_AGE_MAPPING_MAX, TEMPERATURE_MAPPING_MAX, \ + MECHANICAL_WEAR_MAPPING_MAX, TIMESTEPS_PER_MOVE, TEMPERATURE_STARTING_POINT +from mvp.server.math_utils import map_value, linear_growth_with_reset, exponential_decay + + +class OperationalParameters(BaseModel): + temperature: float + oil_age: float + mechanical_wear: float + + def to_dict(self) -> dict[str, float]: + return { + "temperature": self.temperature, + "oil_age": self.oil_age, + "mechanical_wear": self.mechanical_wear + } + + @staticmethod + def from_dict(json: dict[str, float]) -> 'OperationalParameters': + return OperationalParameters( + temperature=json.get("temperature", 0), + oil_age=json.get("oil_age", 0), + mechanical_wear=json.get("mechanical_wear", 0) + ) + + +class MachineStats(BaseModel): + predicted_rul: int | None = None + health_percentage: int + operational_parameters: OperationalParameters + + @staticmethod + def new_machine_stats(current_step: int): + return MachineStats( + health_percentage=100, + operational_parameters=OperationalParameters( + temperature=TEMPERATURE_STARTING_POINT, + oil_age=0, + mechanical_wear=0 + ) + ) + + def is_broken(self) -> bool: + if self.health_percentage <= 0: + return True + + if self.predicted_rul is not None and self.predicted_rul <= 0: + return True + + return False + + def update_stats_and_parameters(self, timestep: int, rul_predictor: Callable[[int], int | None] = None): + self.operational_parameters = self.get_operational_parameters(timestep) + self.health_percentage = self.get_health_percentage(timestep) + self.predicted_rul = rul_predictor(timestep) + + def get_health_percentage(self, current_timestep: int) -> int: + health_decay_speed = compute_decay_speed(self.operational_parameters) + raw_value = round( + exponential_decay( + current_timestep, + initial_value=self.health_percentage, + decay_speed=health_decay_speed + ) + ) + # return round(map_value(raw_value, from_low=0, from_high=sys.float_info.max, to_low=0, to_high=100)) + return min(100, max(0, raw_value)) + + def get_operational_parameters(self, current_timestep: int) -> OperationalParameters: + temperature = self.get_machine_temperature(current_timestep) + oil_age = self.get_oil_age(current_timestep, temperature, initial_value=self.operational_parameters.oil_age) + return OperationalParameters( + temperature=temperature, + oil_age=oil_age, + mechanical_wear=self.get_mechanical_wear(current_timestep, oil_age) + ) + + def get_machine_temperature(self, current_timestep: int) -> float: + # temperature grows linearly over the 8 hours of a shift (resets every 8 hours) + raw_value = linear_growth_with_reset( + initial_value=0, + period=TIMESTEPS_PER_MOVE, + current_timestep=current_timestep + ) + return map_value( + raw_value, + from_low=0, + from_high=TIMESTEPS_PER_MOVE - 1, + to_low=TEMPERATURE_STARTING_POINT, + to_high=TEMPERATURE_MAPPING_MAX + ) + + def get_oil_age(self, current_timestep: int, machine_temperature: float, initial_value: float) -> float: + # oil age grows monotonically and resets only after every maintenance routine + raw_value = initial_value + (current_timestep * machine_temperature) + return map_value(raw_value, from_low=0, from_high=1e5, to_low=0, to_high=OIL_AGE_MAPPING_MAX) + + def get_mechanical_wear(self, current_timestep: int, oil_age: float) -> float: + # mechanical wear grows monotonically, directly proportional to oil ag. + # for now it never resets (such that at some point, the machine will definitely break and game over) + raw_value = math.exp(current_timestep) * oil_age / 1e6 + return map_value(raw_value, from_low=0, from_high=1e12, to_low=0, to_high=MECHANICAL_WEAR_MAPPING_MAX) + + @staticmethod + def from_dict(json: dict[str, Any]): + return MachineStats( + predicted_rul=json.get("predicted_rul", None), + health_percentage=json.get("health_percentage", 0), + operational_parameters=OperationalParameters.from_dict( + json.get("operational_parameters", {}) + ) + ) + + def __str__(self): + return (f"MachineStats(predicted_rul={self.predicted_rul}, health_percentage={self.health_percentage}, " + f"operational_parameters={self.operational_parameters})") diff --git a/mvp/server/data_models/__init__.py b/mvp/server/data_models/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/mvp/server/math_utils.py b/mvp/server/math_utils.py index b1900ed..6d4a506 100644 --- a/mvp/server/math_utils.py +++ b/mvp/server/math_utils.py @@ -1,13 +1,27 @@ import math -def linear_growth_with_reset(initial_value, period, time): - growth_rate = 1 - effective_time = time % period +def linear_growth_with_reset(initial_value: float, period: int, current_timestep: int, growth_rate=1) -> float: + effective_time = current_timestep % period current_value = initial_value + growth_rate * effective_time current_value %= (initial_value + period) return current_value -def exponential_decay(current_timestep: int, initial_value: int, decay_speed: float) -> float: +def exponential_decay(current_timestep: int, initial_value: float, decay_speed: float) -> float: return initial_value - math.exp(current_timestep * decay_speed) + + +def map_value(value: float, from_low: float, from_high: float, to_low: float, to_high: float) -> float: + from_range: float = from_high - from_low + to_range: float = to_high - to_low + + scaled_value: float = (value - from_low) / from_range + mapped_value: float = to_low + (scaled_value * to_range) + + if mapped_value < to_low: + return to_low + elif mapped_value > to_high: + return to_high + else: + return mapped_value diff --git a/mvp/server/tests/test_analysis.py b/mvp/server/tests/test_analysis.py deleted file mode 100644 index d8dc169..0000000 --- a/mvp/server/tests/test_analysis.py +++ /dev/null @@ -1,22 +0,0 @@ -import pytest - -from mvp.server.analysis import get_machine_temperature -from mvp.server.constants import TIMESTEPS_PER_MOVE - - -def test_temperature_grows_monotonically(): - # check that it grows monotonically until the last timestep of the move - assert all( - get_machine_temperature(i) <= get_machine_temperature(i + 1) - for i in range(0, TIMESTEPS_PER_MOVE - 1) - ) - - -def test_temperature_is_periodic(): - # check that it resets after the last timestep of the move - assert all( - pytest.approx( - get_machine_temperature(i), 10) == pytest.approx(get_machine_temperature(i + TIMESTEPS_PER_MOVE), - 10) - for i in range(0, 40) - ) diff --git a/mvp/server/tests/test_data_models.py b/mvp/server/tests/test_game_session.py similarity index 96% rename from mvp/server/tests/test_data_models.py rename to mvp/server/tests/test_game_session.py index b930c68..ee41990 100644 --- a/mvp/server/tests/test_data_models.py +++ b/mvp/server/tests/test_game_session.py @@ -1,7 +1,7 @@ import pytest from mvp.server.constants import TIMESTEPS_PER_MOVE -from mvp.server.data_models import GameSession +from mvp.server.data_models.GameSession import GameSession @pytest.fixture diff --git a/mvp/server/tests/test_machine_stats.py b/mvp/server/tests/test_machine_stats.py new file mode 100644 index 0000000..b5453ad --- /dev/null +++ b/mvp/server/tests/test_machine_stats.py @@ -0,0 +1,20 @@ +from mvp.server.constants import TIMESTEPS_PER_MOVE +from mvp.server.data_models.MachineStats import MachineStats + + +def test_temperature_grows_monotonically(): + machine_stats = MachineStats.new_machine_stats(0) + + for i in range(0, TIMESTEPS_PER_MOVE - 1): + current_temp = machine_stats.get_machine_temperature(i) + next_temp = machine_stats.get_machine_temperature(i + 1) + assert current_temp <= next_temp + + +def test_temperature_is_periodic(): + machine_stats = MachineStats.new_machine_stats(0) + + for i in range(0, 40): + current_temp = machine_stats.get_machine_temperature(i) + future_temp = machine_stats.get_machine_temperature(i + TIMESTEPS_PER_MOVE) + assert round(current_temp, 10) == round(future_temp, 10) From e92502c90538e452f8ae9196b2b98fc998a9181e Mon Sep 17 00:00:00 2001 From: linomp Date: Sat, 20 Jan 2024 17:30:16 +0100 Subject: [PATCH 7/7] fixed issue with operational parameters --- mvp/client/src/routes/+page.svelte | 1 + mvp/server/analysis.py | 4 +- mvp/server/api.py | 2 +- mvp/server/constants.py | 2 +- mvp/server/data_models/GameSession.py | 9 ++- mvp/server/data_models/MachineStats.py | 103 ++++++++++++++----------- mvp/server/tests/test_game_session.py | 8 +- mvp/server/tests/test_machine_stats.py | 14 ++-- 8 files changed, 77 insertions(+), 66 deletions(-) diff --git a/mvp/client/src/routes/+page.svelte b/mvp/client/src/routes/+page.svelte index fb91695..38aed82 100644 --- a/mvp/client/src/routes/+page.svelte +++ b/mvp/client/src/routes/+page.svelte @@ -53,6 +53,7 @@ } catch (error) { console.error('Error advancing day:', error); } finally { + await fetchExistingSession(); // stop fetching machine health until the player advances to next day again clearInterval(intervalId); advanceButtonDisabled = false; diff --git a/mvp/server/analysis.py b/mvp/server/analysis.py index a146816..743b1a0 100644 --- a/mvp/server/analysis.py +++ b/mvp/server/analysis.py @@ -5,8 +5,8 @@ def compute_decay_speed(parameter_values: 'OperationalParameters') -> float: # TODO: calibrate these weights - temperature_weight = 0.01 - oil_age_weight = 0.01 + temperature_weight = 0.001 + oil_age_weight = 0.001 mechanical_wear_weight = 0.01 # Made-up calculation involving operational parameters: temperature, oil age, mechanical wear diff --git a/mvp/server/api.py b/mvp/server/api.py index c1bc883..00b7ba4 100644 --- a/mvp/server/api.py +++ b/mvp/server/api.py @@ -32,7 +32,7 @@ async def create_session() -> GameSessionDTO: new_session_id = uuid.uuid4().hex if new_session_id not in sessions: - session = GameSession.new_game_session(id=new_session_id) + session = GameSession.new_game_session(_id=new_session_id) sessions[new_session_id] = session return GameSessionDTO.from_session(sessions[new_session_id]) diff --git a/mvp/server/constants.py b/mvp/server/constants.py index 65bc1a9..a70c840 100644 --- a/mvp/server/constants.py +++ b/mvp/server/constants.py @@ -2,6 +2,6 @@ GAME_TICK_INTERVAL = 0.5 TIMESTEPS_PER_MOVE = 8 # we conceptualize every player move as a full working day, or "8 hours" TEMPERATURE_STARTING_POINT = 20 -OIL_AGE_MAPPING_MAX = 1000 +OIL_AGE_MAPPING_MAX = 365 TEMPERATURE_MAPPING_MAX = 200 MECHANICAL_WEAR_MAPPING_MAX = 1000 diff --git a/mvp/server/data_models/GameSession.py b/mvp/server/data_models/GameSession.py index b8d7951..490b5d0 100644 --- a/mvp/server/data_models/GameSession.py +++ b/mvp/server/data_models/GameSession.py @@ -17,11 +17,11 @@ class GameSession(BaseModel): rul_predictor: Callable[[int], int | None] = default_rul_prediction_fn @staticmethod - def new_game_session(id: str, current_step: int = 0): + def new_game_session(_id: str): return GameSession( - id=id, + id=_id, current_step=0, - machine_stats=MachineStats.new_machine_stats(current_step) + machine_stats=MachineStats.new_machine_stats() ) async def advance_one_turn(self) -> list[MachineStats]: @@ -44,6 +44,9 @@ async def advance_one_turn(self) -> list[MachineStats]: return collected_machine_stats_during_turn + def do_maintenance(self): + self.machine_stats.simulate_maintenance() + def _log(self, multiple=5): if self.current_step % multiple == 0: print(f"GameSession '{self.id}' - step: {self.current_step} - {self.machine_stats}") diff --git a/mvp/server/data_models/MachineStats.py b/mvp/server/data_models/MachineStats.py index 34deddf..dc351c5 100644 --- a/mvp/server/data_models/MachineStats.py +++ b/mvp/server/data_models/MachineStats.py @@ -4,8 +4,8 @@ from pydantic import BaseModel from mvp.server.analysis import compute_decay_speed -from mvp.server.constants import OIL_AGE_MAPPING_MAX, TEMPERATURE_MAPPING_MAX, \ - MECHANICAL_WEAR_MAPPING_MAX, TIMESTEPS_PER_MOVE, TEMPERATURE_STARTING_POINT +from mvp.server.constants import TEMPERATURE_MAPPING_MAX, \ + TIMESTEPS_PER_MOVE, TEMPERATURE_STARTING_POINT, OIL_AGE_MAPPING_MAX, MECHANICAL_WEAR_MAPPING_MAX from mvp.server.math_utils import map_value, linear_growth_with_reset, exponential_decay @@ -14,6 +14,49 @@ class OperationalParameters(BaseModel): oil_age: float mechanical_wear: float + def update(self, current_timestep: int) -> None: + self.temperature = self.compute_machine_temperature(current_timestep) + self.oil_age = self.compute_oil_age(current_timestep) + self.mechanical_wear = self.compute_mechanical_wear(current_timestep) + + def compute_machine_temperature(self, current_timestep: int) -> float: + # temperature grows linearly over the 8 hours of a shift (resets every 8 hours) + raw_value = linear_growth_with_reset( + initial_value=0, + period=TIMESTEPS_PER_MOVE, + current_timestep=current_timestep + ) + return map_value( + raw_value, + from_low=0, + from_high=TIMESTEPS_PER_MOVE - 1, + to_low=TEMPERATURE_STARTING_POINT, + to_high=TEMPERATURE_MAPPING_MAX + ) + + def compute_oil_age(self, current_timestep: int) -> float: + # oil age grows monotonically and resets only after every maintenance routine + raw_value = self.oil_age + (current_timestep * self.temperature) + return map_value( + raw_value, + from_low=self.oil_age, + from_high=1e5, + to_low=self.oil_age, + to_high=OIL_AGE_MAPPING_MAX + ) + + def compute_mechanical_wear(self, current_timestep: int) -> float: + # mechanical wear grows monotonically, directly proportional to oil ag. + # for now it never resets (such that at some point, the machine will definitely break and game over) + raw_value = math.exp(current_timestep) * self.oil_age / 1e6 + return map_value( + raw_value, + from_low=0, + from_high=1e12, + to_low=self.mechanical_wear, + to_high=MECHANICAL_WEAR_MAPPING_MAX + ) + def to_dict(self) -> dict[str, float]: return { "temperature": self.temperature, @@ -36,7 +79,7 @@ class MachineStats(BaseModel): operational_parameters: OperationalParameters @staticmethod - def new_machine_stats(current_step: int): + def new_machine_stats(): return MachineStats( health_percentage=100, operational_parameters=OperationalParameters( @@ -47,16 +90,20 @@ def new_machine_stats(current_step: int): ) def is_broken(self) -> bool: - if self.health_percentage <= 0: - return True - - if self.predicted_rul is not None and self.predicted_rul <= 0: - return True + return self.health_percentage <= 0 - return False + def simulate_maintenance(self): + self.operational_parameters = OperationalParameters( + temperature=TEMPERATURE_STARTING_POINT, + oil_age=0, + mechanical_wear=self.operational_parameters.mechanical_wear / 2 + ) + # TODO: confirm if it makes sense to reset the health percentage; maybe should be kept as is, + # maintenance does not mean "new" machine, only slows down the decay + # self.health_percentage = 100 def update_stats_and_parameters(self, timestep: int, rul_predictor: Callable[[int], int | None] = None): - self.operational_parameters = self.get_operational_parameters(timestep) + self.operational_parameters.update(timestep) self.health_percentage = self.get_health_percentage(timestep) self.predicted_rul = rul_predictor(timestep) @@ -69,44 +116,8 @@ def get_health_percentage(self, current_timestep: int) -> int: decay_speed=health_decay_speed ) ) - # return round(map_value(raw_value, from_low=0, from_high=sys.float_info.max, to_low=0, to_high=100)) return min(100, max(0, raw_value)) - def get_operational_parameters(self, current_timestep: int) -> OperationalParameters: - temperature = self.get_machine_temperature(current_timestep) - oil_age = self.get_oil_age(current_timestep, temperature, initial_value=self.operational_parameters.oil_age) - return OperationalParameters( - temperature=temperature, - oil_age=oil_age, - mechanical_wear=self.get_mechanical_wear(current_timestep, oil_age) - ) - - def get_machine_temperature(self, current_timestep: int) -> float: - # temperature grows linearly over the 8 hours of a shift (resets every 8 hours) - raw_value = linear_growth_with_reset( - initial_value=0, - period=TIMESTEPS_PER_MOVE, - current_timestep=current_timestep - ) - return map_value( - raw_value, - from_low=0, - from_high=TIMESTEPS_PER_MOVE - 1, - to_low=TEMPERATURE_STARTING_POINT, - to_high=TEMPERATURE_MAPPING_MAX - ) - - def get_oil_age(self, current_timestep: int, machine_temperature: float, initial_value: float) -> float: - # oil age grows monotonically and resets only after every maintenance routine - raw_value = initial_value + (current_timestep * machine_temperature) - return map_value(raw_value, from_low=0, from_high=1e5, to_low=0, to_high=OIL_AGE_MAPPING_MAX) - - def get_mechanical_wear(self, current_timestep: int, oil_age: float) -> float: - # mechanical wear grows monotonically, directly proportional to oil ag. - # for now it never resets (such that at some point, the machine will definitely break and game over) - raw_value = math.exp(current_timestep) * oil_age / 1e6 - return map_value(raw_value, from_low=0, from_high=1e12, to_low=0, to_high=MECHANICAL_WEAR_MAPPING_MAX) - @staticmethod def from_dict(json: dict[str, Any]): return MachineStats( diff --git a/mvp/server/tests/test_game_session.py b/mvp/server/tests/test_game_session.py index ee41990..cb262b7 100644 --- a/mvp/server/tests/test_game_session.py +++ b/mvp/server/tests/test_game_session.py @@ -6,7 +6,7 @@ @pytest.fixture def game_session(): - return GameSession.new_game_session(id="test_session", current_step=0) + return GameSession.new_game_session(_id="test_session") def test_game_session_initialization(game_session): @@ -34,16 +34,12 @@ async def test_game_session_advance_one_turn(game_session): @pytest.mark.asyncio async def test_game_session_machine_breakdown(game_session): - # Testing the is_broken() method when health_percentage <= 0 game_session.machine_stats.health_percentage = 0 assert game_session.machine_stats.is_broken() is True - # Testing the is_broken() method when predicted_rul <= 0 - game_session.machine_stats.health_percentage = 50 - game_session.machine_stats.predicted_rul = 0 + game_session.machine_stats.health_percentage = -1 assert game_session.machine_stats.is_broken() is True - # Testing the is_broken() method when health_percentage and predicted_rul > 0 game_session.machine_stats.health_percentage = 50 game_session.machine_stats.predicted_rul = 10 assert game_session.machine_stats.is_broken() is False diff --git a/mvp/server/tests/test_machine_stats.py b/mvp/server/tests/test_machine_stats.py index b5453ad..7acf078 100644 --- a/mvp/server/tests/test_machine_stats.py +++ b/mvp/server/tests/test_machine_stats.py @@ -1,20 +1,20 @@ from mvp.server.constants import TIMESTEPS_PER_MOVE -from mvp.server.data_models.MachineStats import MachineStats +from mvp.server.data_models.MachineStats import OperationalParameters def test_temperature_grows_monotonically(): - machine_stats = MachineStats.new_machine_stats(0) + operational_parameters = OperationalParameters(temperature=0, oil_age=0, mechanical_wear=0) for i in range(0, TIMESTEPS_PER_MOVE - 1): - current_temp = machine_stats.get_machine_temperature(i) - next_temp = machine_stats.get_machine_temperature(i + 1) + current_temp = operational_parameters.compute_machine_temperature(i) + next_temp = operational_parameters.compute_machine_temperature(i + 1) assert current_temp <= next_temp def test_temperature_is_periodic(): - machine_stats = MachineStats.new_machine_stats(0) + operational_parameters = OperationalParameters(temperature=0, oil_age=0, mechanical_wear=0) for i in range(0, 40): - current_temp = machine_stats.get_machine_temperature(i) - future_temp = machine_stats.get_machine_temperature(i + TIMESTEPS_PER_MOVE) + current_temp = operational_parameters.compute_machine_temperature(i) + future_temp = operational_parameters.compute_machine_temperature(i + TIMESTEPS_PER_MOVE) assert round(current_temp, 10) == round(future_temp, 10)