multi-stage build for metrics
This commit is contained in:
		
							parent
							
								
									975d6d9bd2
								
							
						
					
					
						commit
						82f9f40715
					
				
							
								
								
									
										5
									
								
								.vscode/settings.json
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										5
									
								
								.vscode/settings.json
									
									
									
									
										vendored
									
									
								
							| @ -1,5 +1,8 @@ | |||||||
| { | { | ||||||
|     "python.analysis.typeCheckingMode": "basic", |     "python.analysis.typeCheckingMode": "basic", | ||||||
|     "python.formatting.blackArgs": ["--line-length", "120"], |     "python.formatting.blackArgs": ["--line-length", "120"], | ||||||
|     "isort.args": ["--profile", "black"] |     "isort.args": ["--profile", "black"], | ||||||
|  |     "python.analysis.extraPaths": [ | ||||||
|  |         "xmetrics" | ||||||
|  |     ] | ||||||
| } | } | ||||||
|  | |||||||
| @ -1,6 +1,7 @@ | |||||||
| ```sh | ```sh | ||||||
| cd /code/ | cd /code/ | ||||||
| git clone --recurse-submodules https://gitea.parrrate.ru/PTV/radn-rs.git | git clone --recurse-submodules https://gitea.parrrate.ru/PTV/radn-rs.git | ||||||
|  | git clone --recurse-submodules https://gitea.parrrate.ru/PTV/exercises.git | ||||||
| ``` | ``` | ||||||
| ```sh | ```sh | ||||||
| clear && docker compose up -d --build metrics && docker cp radn-metrics:/code/metrics.png ./metrics/metrics.png | clear && docker compose up -d --build metrics && docker cp radn-metrics:/code/metrics.png ./metrics/metrics.png | ||||||
|  | |||||||
| @ -7,6 +7,7 @@ volumes: | |||||||
|   radn-rs: {} |   radn-rs: {} | ||||||
|   book-monads: {} |   book-monads: {} | ||||||
|   book-radn: {} |   book-radn: {} | ||||||
|  |   exercises: {} | ||||||
| 
 | 
 | ||||||
| services: | services: | ||||||
|   radn-rs-dev: |   radn-rs-dev: | ||||||
| @ -57,6 +58,21 @@ services: | |||||||
|       radn: {} |       radn: {} | ||||||
|     tty: true |     tty: true | ||||||
|     stop_signal: SIGKILL |     stop_signal: SIGKILL | ||||||
|  |   exercises: | ||||||
|  |     container_name: exercises | ||||||
|  |     build: | ||||||
|  |       context: radn-rs | ||||||
|  |       dockerfile: Dockerfile.Book.Exercises | ||||||
|  |     environment: | ||||||
|  |       MDBOOK_OUTPUT__HTML__GIT_REPOSITORY_URL: "https://gitea.parrrate.ru/PTV/exercises" | ||||||
|  |       MDBOOK_OUTPUT__HTML__EDIT_URL_TEMPLATE: "https://gitea.parrrate.ru/PTV/exercises/_edit/latest/{path}" | ||||||
|  |     volumes: | ||||||
|  |       - radn-rs:/code/:ro | ||||||
|  |       - exercises:/data/book/:rw | ||||||
|  |     networks: | ||||||
|  |       radn: {} | ||||||
|  |     tty: true | ||||||
|  |     stop_signal: SIGKILL | ||||||
|   nginx: |   nginx: | ||||||
|     container_name: radn-nginx |     container_name: radn-nginx | ||||||
|     build: |     build: | ||||||
|  | |||||||
| @ -17,10 +17,13 @@ RUN python3 /code/metrics.py | |||||||
| RUN git fetch && git checkout ce65688e47b07f14ef2861971f64296c2197e778 | RUN git fetch && git checkout ce65688e47b07f14ef2861971f64296c2197e778 | ||||||
| RUN python3 /code/metrics.py | RUN python3 /code/metrics.py | ||||||
| 
 | 
 | ||||||
| 
 |  | ||||||
| RUN git fetch && git checkout 7f1d72898ddd9ab40bf91e553f70a023a64fe647 | RUN git fetch && git checkout 7f1d72898ddd9ab40bf91e553f70a023a64fe647 | ||||||
| RUN python3 /code/metrics.py | RUN python3 /code/metrics.py | ||||||
| 
 | 
 | ||||||
|  | 
 | ||||||
|  | RUN git fetch && git checkout 1a8d70957b7d0f3f08f1c0f11ff04ebc007a6b48 | ||||||
|  | RUN python3 /code/metrics.py | ||||||
|  | 
 | ||||||
| FROM python:3.11 | FROM python:3.11 | ||||||
| RUN python3 -m pip install matplotlib | RUN python3 -m pip install matplotlib | ||||||
| WORKDIR /code/ | WORKDIR /code/ | ||||||
|  | |||||||
| @ -56,6 +56,22 @@ server { | |||||||
|     } |     } | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | server { | ||||||
|  |     listen       80; | ||||||
|  |     listen  [::]:80; | ||||||
|  |     server_name  exercises.parrrate.ru; | ||||||
|  | 
 | ||||||
|  |     location / { | ||||||
|  |         proxy_pass http://exercises/; | ||||||
|  | 
 | ||||||
|  |         proxy_http_version 1.1; | ||||||
|  |         proxy_set_header Upgrade $http_upgrade; | ||||||
|  |         proxy_set_header Connection $connection_upgrade; | ||||||
|  | 
 | ||||||
|  |         proxy_buffering off; | ||||||
|  |     } | ||||||
|  | } | ||||||
|  | 
 | ||||||
| server { | server { | ||||||
|     listen       80; |     listen       80; | ||||||
|     listen  [::]:80; |     listen  [::]:80; | ||||||
|  | |||||||
| @ -5,7 +5,6 @@ RUN rustup component add rustfmt | |||||||
| RUN rustup component add clippy | RUN rustup component add clippy | ||||||
| RUN cargo install mdbook | RUN cargo install mdbook | ||||||
| RUN cargo install rust-code-analysis-cli | RUN cargo install rust-code-analysis-cli | ||||||
| RUN apt-get update | RUN apt-get update && install -y cloc | ||||||
| RUN apt-get install -y cloc |  | ||||||
| 
 | 
 | ||||||
| WORKDIR /code/ | WORKDIR /code/ | ||||||
|  | |||||||
							
								
								
									
										7
									
								
								radn-rs/Dockerfile.Book.Exercises
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										7
									
								
								radn-rs/Dockerfile.Book.Exercises
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,7 @@ | |||||||
|  | FROM rust:1.69 | ||||||
|  | 
 | ||||||
|  | RUN cargo install mdbook | ||||||
|  | 
 | ||||||
|  | WORKDIR /code/exercises/ | ||||||
|  | 
 | ||||||
|  | CMD [ "mdbook", "serve", "--dest-dir", "/data/book/", "--port", "80", "--hostname", "0.0.0.0" ] | ||||||
| @ -11,7 +11,7 @@ ENV SRCPATTERN="*.cs" | |||||||
| FROM metrics-base as metrics-radn | FROM metrics-base as metrics-radn | ||||||
| RUN git clone https://gitea.parrrate.ru/PTV/radn-rs.git | RUN git clone https://gitea.parrrate.ru/PTV/radn-rs.git | ||||||
| WORKDIR /code/radn-rs/ | WORKDIR /code/radn-rs/ | ||||||
| RUN git fetch && git checkout 7f1d72898ddd9ab40bf91e553f70a023a64fe647 | RUN git fetch && git checkout 1a8d70957b7d0f3f08f1c0f11ff04ebc007a6b48 | ||||||
| 
 | 
 | ||||||
| FROM metrics-base as metrics-mdbook | FROM metrics-base as metrics-mdbook | ||||||
| RUN git clone https://github.com/rust-lang/mdBook.git | RUN git clone https://github.com/rust-lang/mdBook.git | ||||||
| @ -47,15 +47,89 @@ RUN git fetch && git checkout f81543a34ee363dcc00e8632fd7cfcd4a3478b23 | |||||||
| ENV SRCDIR="." | ENV SRCDIR="." | ||||||
| ENV SRCPATTERN="*.[ach]*" | ENV SRCPATTERN="*.[ach]*" | ||||||
| 
 | 
 | ||||||
| FROM metrics-radn as metrics | FROM metrics-radn as metrics-repo | ||||||
|  | 
 | ||||||
|  | FROM metrics-repo as metrics-commits | ||||||
|  | COPY common.py /code/common.py | ||||||
|  | COPY commits.py /code/commits.py | ||||||
|  | RUN python3 /code/commits.py | ||||||
|  | 
 | ||||||
|  | FROM metrics-repo as metrics | ||||||
|  | COPY common.py /code/common.py | ||||||
| COPY metrics.py /code/metrics.py | COPY metrics.py /code/metrics.py | ||||||
|  | COPY --from=metrics-commits /code/commits.dat commits.dat | ||||||
| RUN python3 /code/metrics.py | RUN python3 /code/metrics.py | ||||||
| 
 | 
 | ||||||
| FROM python:3.11 | FROM python:3.11 as metrics-process | ||||||
| RUN python3 -m pip install matplotlib | RUN python3 -m pip install numpy | ||||||
| RUN python3 -m pip install scipy |  | ||||||
| WORKDIR /code/ | WORKDIR /code/ | ||||||
| COPY --from=metrics /code/metrics.json metrics.json | 
 | ||||||
|  | FROM metrics-process as metrics-data | ||||||
|  | COPY --from=metrics /code/metrics.dat metrics.dat | ||||||
|  | 
 | ||||||
|  | FROM metrics-process as metrics-plot | ||||||
|  | RUN python3 -m pip install matplotlib | ||||||
|  | 
 | ||||||
|  | FROM metrics-data as metrics-entries | ||||||
|  | COPY entries.py entries.py | ||||||
|  | RUN python3 entries.py | ||||||
|  | 
 | ||||||
|  | FROM metrics-data as metrics-y | ||||||
|  | COPY cors.py cors.py | ||||||
|  | RUN python3 cors.py | ||||||
|  | 
 | ||||||
|  | FROM metrics-plot as metrics-c | ||||||
|  | COPY --from=metrics-y /code/Y.dat Y.dat | ||||||
|  | COPY k2c.py k2c.py | ||||||
|  | 
 | ||||||
|  | FROM metrics-c as metrics-c-linear | ||||||
|  | COPY c_linear.py c_linear.py | ||||||
|  | RUN python3 c_linear.py | ||||||
|  | 
 | ||||||
|  | FROM metrics-c as metrics-c-proportional | ||||||
|  | COPY c_proportional.py c_proportional.py | ||||||
|  | RUN python3 c_proportional.py | ||||||
|  | 
 | ||||||
|  | FROM metrics-process as metrics-x-linear | ||||||
|  | COPY --from=metrics-y /code/Y.dat Y.dat | ||||||
|  | COPY x_linear.py x_linear.py | ||||||
|  | RUN python3 x_linear.py | ||||||
|  | 
 | ||||||
|  | FROM metrics-process as metrics-x-proportional | ||||||
|  | COPY --from=metrics-y /code/Y.dat Y.dat | ||||||
|  | COPY x_proportional.py x_proportional.py | ||||||
|  | RUN python3 x_proportional.py | ||||||
|  | 
 | ||||||
|  | FROM metrics-plot as metrics-render | ||||||
| RUN mkdir /code/metrics/ | RUN mkdir /code/metrics/ | ||||||
| COPY render.py render.py | 
 | ||||||
| RUN python3 render.py | FROM metrics-render as metrics-render-ploc | ||||||
|  | COPY --from=metrics-entries /code/entries.dat entries.dat | ||||||
|  | COPY render_ploc.py render_ploc.py | ||||||
|  | RUN python3 render_ploc.py | ||||||
|  | 
 | ||||||
|  | FROM metrics-render as metrics-render-hist | ||||||
|  | COPY --from=metrics-y /code/Y.dat Y.dat | ||||||
|  | COPY render_hist.py render_hist.py | ||||||
|  | 
 | ||||||
|  | FROM metrics-render-hist as metrics-render-01x | ||||||
|  | COPY --from=metrics-x-linear /code/X.dat X.dat | ||||||
|  | COPY --from=metrics-c-linear /code/C.dat C.dat | ||||||
|  | RUN python3 render_hist.py | ||||||
|  | 
 | ||||||
|  | FROM metrics-render-hist as metrics-render-02y | ||||||
|  | COPY --from=metrics-x-linear /code/X.dat X.dat | ||||||
|  | COPY --from=metrics-c-proportional /code/C.dat C.dat | ||||||
|  | RUN python3 render_hist.py | ||||||
|  | 
 | ||||||
|  | FROM metrics-render-hist as metrics-render-03xy | ||||||
|  | COPY --from=metrics-x-proportional /code/X.dat X.dat | ||||||
|  | COPY --from=metrics-c-proportional /code/C.dat C.dat | ||||||
|  | RUN python3 render_hist.py | ||||||
|  | 
 | ||||||
|  | FROM metrics-render | ||||||
|  | COPY --from=metrics-y /code/Y.dat Y.dat | ||||||
|  | COPY --from=metrics-render-ploc /code/metrics/out.png /code/metrics/metrics.png | ||||||
|  | COPY --from=metrics-render-01x /code/metrics/out.png /code/metrics/metrics-01x.png | ||||||
|  | COPY --from=metrics-render-02y /code/metrics/out.png /code/metrics/metrics-02y.png | ||||||
|  | COPY --from=metrics-render-03xy /code/metrics/out.png /code/metrics/metrics-03xy.png | ||||||
|  | |||||||
							
								
								
									
										11
									
								
								xmetrics/c_linear.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										11
									
								
								xmetrics/c_linear.py
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,11 @@ | |||||||
|  | import pickle | ||||||
|  | 
 | ||||||
|  | import numpy as np | ||||||
|  | from k2c import k2c | ||||||
|  | 
 | ||||||
|  | with open("Y.dat", "rb") as file: | ||||||
|  |     Y = pickle.load(file) | ||||||
|  | M = Y.shape[0] | ||||||
|  | K = np.arange(M) / M | ||||||
|  | with open("C.dat", "wb") as file: | ||||||
|  |     pickle.dump(k2c(K), file) | ||||||
							
								
								
									
										13
									
								
								xmetrics/c_proportional.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										13
									
								
								xmetrics/c_proportional.py
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,13 @@ | |||||||
|  | import pickle | ||||||
|  | 
 | ||||||
|  | import numpy as np | ||||||
|  | from k2c import k2c | ||||||
|  | 
 | ||||||
|  | with open("Y.dat", "rb") as file: | ||||||
|  |     Y = pickle.load(file) | ||||||
|  | M = Y.shape[0] | ||||||
|  | W = Y.max(axis=1) | ||||||
|  | I = W.cumsum() | ||||||
|  | K = (I - W / 2) / I.max() | ||||||
|  | with open("C.dat", "wb") as file: | ||||||
|  |     pickle.dump(k2c(K), file) | ||||||
							
								
								
									
										41
									
								
								xmetrics/commits.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										41
									
								
								xmetrics/commits.py
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,41 @@ | |||||||
|  | import pickle | ||||||
|  | from subprocess import check_output | ||||||
|  | 
 | ||||||
|  | from common import counter | ||||||
|  | 
 | ||||||
|  | args = [] | ||||||
|  | # args = ["--topo-order"] | ||||||
|  | original_commits = check_output(["git", "log", "--pretty=%H", *args], text=True).splitlines() | ||||||
|  | N = len(original_commits) | ||||||
|  | filtered_commits = set(original_commits[:: N // min(N, 4096)]) | ||||||
|  | total_changes: dict[str, int] = {} | ||||||
|  | chosen_parents: dict[str, str | None] = {} | ||||||
|  | for i, commit in enumerate(reversed(original_commits)): | ||||||
|  |     print(f"P={i / N:6f}", flush=True) | ||||||
|  |     parents = check_output(["git", "log", "--pretty=%P", "-n", "1", commit], text=True).split() | ||||||
|  |     chosen_parent = None | ||||||
|  |     if commit in filtered_commits: | ||||||
|  |         ctr = counter(commit, True) | ||||||
|  |         changes = ctr.total() | ||||||
|  |         for parent in parents: | ||||||
|  |             pctr = counter(parent, True) | ||||||
|  |             maybe_changes = (pctr - ctr).total() + (ctr - pctr).total() + total_changes[parent] | ||||||
|  |             if maybe_changes > changes: | ||||||
|  |                 changes = maybe_changes | ||||||
|  |                 chosen_parent = parent | ||||||
|  |     else: | ||||||
|  |         changes = 0 | ||||||
|  |         for parent in parents: | ||||||
|  |             maybe_changes = total_changes[parent] | ||||||
|  |             if maybe_changes > changes: | ||||||
|  |                 changes = maybe_changes | ||||||
|  |                 chosen_parent = parent | ||||||
|  |     total_changes[commit] = changes | ||||||
|  |     chosen_parents[commit] = chosen_parent | ||||||
|  | commit = original_commits[0] | ||||||
|  | commits = [] | ||||||
|  | while commit is not None: | ||||||
|  |     commits.append(commit) | ||||||
|  |     commit = chosen_parents[commit] | ||||||
|  | with open("/code/commits.dat", "wb") as file: | ||||||
|  |     pickle.dump(commits, file) | ||||||
							
								
								
									
										23
									
								
								xmetrics/common.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										23
									
								
								xmetrics/common.py
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,23 @@ | |||||||
|  | import os | ||||||
|  | from collections import Counter | ||||||
|  | from functools import lru_cache | ||||||
|  | from pathlib import Path | ||||||
|  | from subprocess import check_output | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | @lru_cache() | ||||||
|  | def _counter(commit: str, unique: bool) -> Counter: | ||||||
|  |     check_output(["git", "checkout", commit], text=True) | ||||||
|  |     ctr = Counter() | ||||||
|  |     for path in Path(os.getenv("SRCDIR", "src")).rglob(os.getenv("SRCPATTERN", "*.rs")): | ||||||
|  |         lines = path.read_bytes().splitlines() | ||||||
|  |         lines = (line.strip() for line in lines) | ||||||
|  |         lines = (line for line in lines if line) | ||||||
|  |         if unique: | ||||||
|  |             lines = set(lines) | ||||||
|  |         ctr.update(lines) | ||||||
|  |     return ctr | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | def counter(commit: str, unique: bool) -> Counter: | ||||||
|  |     return _counter(commit, unique) | ||||||
							
								
								
									
										10
									
								
								xmetrics/cors.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										10
									
								
								xmetrics/cors.py
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,10 @@ | |||||||
|  | import pickle | ||||||
|  | 
 | ||||||
|  | import numpy as np | ||||||
|  | 
 | ||||||
|  | with open("metrics.dat", "rb") as file: | ||||||
|  |     metrics = pickle.load(file) | ||||||
|  | cors = metrics["cors"] | ||||||
|  | Y = np.array(cors) | ||||||
|  | with open("Y.dat", "wb") as file: | ||||||
|  |     pickle.dump(Y, file) | ||||||
							
								
								
									
										9
									
								
								xmetrics/entries.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										9
									
								
								xmetrics/entries.py
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,9 @@ | |||||||
|  | import pickle | ||||||
|  | 
 | ||||||
|  | import numpy as np | ||||||
|  | 
 | ||||||
|  | with open("metrics.dat", "rb") as file: | ||||||
|  |     metrics = pickle.load(file) | ||||||
|  | entries = metrics["entries"] | ||||||
|  | with open("entries.dat", "wb") as file: | ||||||
|  |     pickle.dump(np.array(entries).transpose(), file) | ||||||
							
								
								
									
										6
									
								
								xmetrics/k2c.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										6
									
								
								xmetrics/k2c.py
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,6 @@ | |||||||
|  | import numpy as np | ||||||
|  | from matplotlib.colors import hsv_to_rgb | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | def k2c(K: np.ndarray): | ||||||
|  |     return hsv_to_rgb(np.array([3.0 * K % 1, 0.4 + K * 0, 0.6 + 0.15 * K]).transpose()) | ||||||
| @ -1,28 +1,19 @@ | |||||||
| import json | import pickle | ||||||
| import os |  | ||||||
| from collections import Counter | from collections import Counter | ||||||
| from pathlib import Path |  | ||||||
| from subprocess import check_output |  | ||||||
| 
 | 
 | ||||||
| args = [] | from common import counter | ||||||
| # args = ["--topo-order"] | 
 | ||||||
| commits = check_output(["git", "log", "--pretty=%H", *args], text=True).splitlines() | with open("commits.dat", "rb") as file: | ||||||
| commits = commits[::len(commits) // min(len(commits), 4096)] |     commits: list[str] = pickle.load(file) | ||||||
| entries = [] | entries = [] | ||||||
| last_ctr = Counter() | last_ctr = Counter() | ||||||
| last_cor = [] | last_cor = [] | ||||||
| cors = [] | cors = [] | ||||||
| C = min(len(commits), 720) | C = min(len(commits), 720) | ||||||
| for i, commit in enumerate(reversed(commits)): | for i, commit in enumerate(reversed(commits)): | ||||||
|  |     print(f"P={i/len(commits):6f}", flush=True) | ||||||
|     print("running", commit, flush=True) |     print("running", commit, flush=True) | ||||||
|     check_output(["git", "checkout", commit], text=True) |     current_ctr = counter(commit, True) | ||||||
|     current_ctr = Counter() |  | ||||||
|     for path in Path(os.getenv("SRCDIR", "src")).rglob(os.getenv("SRCPATTERN", "*.rs")): |  | ||||||
|         lines = path.read_bytes().splitlines() |  | ||||||
|         lines = (line.strip() for line in lines) |  | ||||||
|         lines = (line for line in lines if line) |  | ||||||
|         lines = set(lines) |  | ||||||
|         current_ctr.update(lines) |  | ||||||
|     added = current_ctr - last_ctr |     added = current_ctr - last_ctr | ||||||
|     deleted = last_ctr - current_ctr |     deleted = last_ctr - current_ctr | ||||||
|     entries.append((i, current_ctr.total(), added.total(), deleted.total())) |     entries.append((i, current_ctr.total(), added.total(), deleted.total())) | ||||||
| @ -44,5 +35,5 @@ for i, commit in enumerate(reversed(commits)): | |||||||
|         cor.append(cor_ctr[j]) |         cor.append(cor_ctr[j]) | ||||||
|     last_ctr = current_ctr |     last_ctr = current_ctr | ||||||
|     last_cor = current_cor |     last_cor = current_cor | ||||||
| with open("/code/metrics.json", "w") as file: | with open("/code/metrics.dat", "wb") as file: | ||||||
|     json.dump({"entries": entries, "cors": cors}, file) |     pickle.dump({"entries": entries, "cors": cors}, file) | ||||||
|  | |||||||
| @ -1,126 +0,0 @@ | |||||||
| import json |  | ||||||
| from functools import cache |  | ||||||
| 
 |  | ||||||
| import matplotlib.pyplot as plt |  | ||||||
| import numpy as np |  | ||||||
| from matplotlib.colors import hsv_to_rgb |  | ||||||
| 
 |  | ||||||
| plt.rcParams["figure.figsize"] = [18, 9] |  | ||||||
| plt.style.use("dark_background") |  | ||||||
| plt.subplots_adjust(left=0.05, right=0.99, top=0.95, bottom=0.05) |  | ||||||
| plt.margins(x=0.025) |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| with open("metrics.json", "r") as file: |  | ||||||
|     metrics = json.load(file) |  | ||||||
|     entries = metrics["entries"] |  | ||||||
|     cors = metrics["cors"] |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| def render_ploc(): |  | ||||||
|     X, Y, Ya, Yd = np.array(entries).transpose() |  | ||||||
|     plt.clf() |  | ||||||
|     plt.plot(X, Y, linewidth=1.0) |  | ||||||
|     plt.fill_between( |  | ||||||
|         X, |  | ||||||
|         Y - Ya, |  | ||||||
|         Y, |  | ||||||
|         alpha=0.5, |  | ||||||
|         color="green", |  | ||||||
|         linewidth=0.0, |  | ||||||
|     ) |  | ||||||
|     plt.fill_between( |  | ||||||
|         X, |  | ||||||
|         Y, |  | ||||||
|         Y + Yd, |  | ||||||
|         alpha=0.5, |  | ||||||
|         color="red", |  | ||||||
|         linewidth=0.0, |  | ||||||
|     ) |  | ||||||
|     plt.ylim(bottom=0) |  | ||||||
|     plt.savefig("/code/metrics/metrics.png") |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| @cache |  | ||||||
| def get_m(): |  | ||||||
|     return len(cors) |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| @cache |  | ||||||
| def get_n(): |  | ||||||
|     return len(cors[0]) |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| @cache |  | ||||||
| def get_y(): |  | ||||||
|     return np.array(cors) |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| @cache |  | ||||||
| def _get_x(px: bool): |  | ||||||
|     if px: |  | ||||||
|         return abs(np.diff(get_y(), axis=1, prepend=0)).sum(axis=0).cumsum() |  | ||||||
|     else: |  | ||||||
|         return np.arange(get_n()) |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| def get_x(*, px: bool): |  | ||||||
|     return _get_x(px) |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| @cache |  | ||||||
| def get_w(): |  | ||||||
|     return get_y().max(axis=1) |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| @cache |  | ||||||
| def _get_z(pc: bool): |  | ||||||
|     M = get_m() |  | ||||||
|     if pc: |  | ||||||
|         W = get_w() |  | ||||||
|         I = W.cumsum() |  | ||||||
|         assert I.shape == (M,) |  | ||||||
|         return (I - W / 2) / I.max() * M |  | ||||||
|     else: |  | ||||||
|         return np.arange(M) |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| def get_z(*, pc: bool): |  | ||||||
|     return _get_z(pc) |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| @cache |  | ||||||
| def _get_c(pc: bool): |  | ||||||
|     M = get_m() |  | ||||||
|     Z = get_z(pc=pc) |  | ||||||
|     W = get_w() |  | ||||||
|     return hsv_to_rgb(np.array([3.0 * Z / M % 1, 0.4 + Z * 0, 0.6 + 0.15 * (Z / M)]).transpose()) |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| def get_c(*, pc: bool): |  | ||||||
|     return _get_c(pc) |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| def render_cors(*, px, pc): |  | ||||||
|     M = get_m() |  | ||||||
|     N = get_n() |  | ||||||
|     Y = get_y() |  | ||||||
|     X = get_x(px=px) |  | ||||||
|     assert Y.shape == (M, N) |  | ||||||
|     plt.clf() |  | ||||||
|     C = get_c(pc=pc) |  | ||||||
|     plt.stackplot( |  | ||||||
|         X, |  | ||||||
|         Y, |  | ||||||
|         colors=C, |  | ||||||
|         aa=False, |  | ||||||
|         linewidth=0.0, |  | ||||||
|     ) |  | ||||||
|     plt.savefig(f"/code/metrics/metrics-px{int(px)}-pc{int(pc)}.png") |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| render_ploc() |  | ||||||
| render_cors(px=False, pc=False) |  | ||||||
| render_cors(px=False, pc=True) |  | ||||||
| render_cors(px=True, pc=False) |  | ||||||
| render_cors(px=True, pc=True) |  | ||||||
							
								
								
									
										23
									
								
								xmetrics/render_hist.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										23
									
								
								xmetrics/render_hist.py
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,23 @@ | |||||||
|  | import pickle | ||||||
|  | 
 | ||||||
|  | import matplotlib.pyplot as plt | ||||||
|  | 
 | ||||||
|  | plt.rcParams["figure.figsize"] = [18, 9] | ||||||
|  | plt.style.use("dark_background") | ||||||
|  | plt.subplots_adjust(left=0.05, right=0.99, top=0.95, bottom=0.05) | ||||||
|  | plt.margins(x=0.025) | ||||||
|  | 
 | ||||||
|  | with open("Y.dat", "rb") as file: | ||||||
|  |     Y = pickle.load(file) | ||||||
|  | with open("X.dat", "rb") as file: | ||||||
|  |     X = pickle.load(file) | ||||||
|  | with open("C.dat", "rb") as file: | ||||||
|  |     C = pickle.load(file) | ||||||
|  | plt.stackplot( | ||||||
|  |     X, | ||||||
|  |     Y, | ||||||
|  |     colors=C, | ||||||
|  |     aa=False, | ||||||
|  |     linewidth=0.0, | ||||||
|  | ) | ||||||
|  | plt.savefig(f"/code/metrics/out.png") | ||||||
							
								
								
									
										31
									
								
								xmetrics/render_ploc.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										31
									
								
								xmetrics/render_ploc.py
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,31 @@ | |||||||
|  | import pickle | ||||||
|  | 
 | ||||||
|  | import matplotlib.pyplot as plt | ||||||
|  | 
 | ||||||
|  | plt.rcParams["figure.figsize"] = [18, 9] | ||||||
|  | plt.style.use("dark_background") | ||||||
|  | plt.subplots_adjust(left=0.05, right=0.99, top=0.95, bottom=0.05) | ||||||
|  | plt.margins(x=0.025) | ||||||
|  | 
 | ||||||
|  | with open("entries.dat", "rb") as file: | ||||||
|  |     entries_t = pickle.load(file) | ||||||
|  | X, Y, Ya, Yd = entries_t | ||||||
|  | plt.plot(X, Y, linewidth=1.0) | ||||||
|  | plt.fill_between( | ||||||
|  |     X, | ||||||
|  |     Y - Ya, | ||||||
|  |     Y, | ||||||
|  |     alpha=0.5, | ||||||
|  |     color="green", | ||||||
|  |     linewidth=0.0, | ||||||
|  | ) | ||||||
|  | plt.fill_between( | ||||||
|  |     X, | ||||||
|  |     Y, | ||||||
|  |     Y + Yd, | ||||||
|  |     alpha=0.5, | ||||||
|  |     color="red", | ||||||
|  |     linewidth=0.0, | ||||||
|  | ) | ||||||
|  | plt.ylim(bottom=0) | ||||||
|  | plt.savefig("/code/metrics/out.png") | ||||||
							
								
								
									
										10
									
								
								xmetrics/x_linear.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										10
									
								
								xmetrics/x_linear.py
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,10 @@ | |||||||
|  | import pickle | ||||||
|  | 
 | ||||||
|  | import numpy as np | ||||||
|  | 
 | ||||||
|  | with open("Y.dat", "rb") as file: | ||||||
|  |     Y = pickle.load(file) | ||||||
|  | N = Y.shape[1] | ||||||
|  | X = np.arange(N) | ||||||
|  | with open("X.dat", "wb") as file: | ||||||
|  |     pickle.dump(X, file) | ||||||
							
								
								
									
										10
									
								
								xmetrics/x_proportional.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										10
									
								
								xmetrics/x_proportional.py
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,10 @@ | |||||||
|  | import pickle | ||||||
|  | 
 | ||||||
|  | import numpy as np | ||||||
|  | 
 | ||||||
|  | with open("Y.dat", "rb") as file: | ||||||
|  |     Y = pickle.load(file) | ||||||
|  | N = Y.shape[1] | ||||||
|  | X = abs(np.diff(Y, axis=1, prepend=0)).sum(axis=0).cumsum() | ||||||
|  | with open("X.dat", "wb") as file: | ||||||
|  |     pickle.dump(X, file) | ||||||
		Loading…
	
		Reference in New Issue
	
	Block a user