--topo-order

This commit is contained in:
AF 2023-08-02 16:30:09 +00:00
parent a91ab94771
commit 33d8daee79
6 changed files with 46 additions and 26 deletions

View File

@ -2,6 +2,9 @@
"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"],
"search.exclude": {
"**/venv": true,
},
"python.analysis.extraPaths": [ "python.analysis.extraPaths": [
"xmetrics" "xmetrics"
] ]

8
pyrightconfig.json Normal file
View File

@ -0,0 +1,8 @@
{
"exclude": [
"**/node_modules",
"**/__pycache__",
"**/build/lib",
"**/venv"
]
}

View File

@ -5,8 +5,7 @@ FROM metrics-base as metrics-tmg
RUN git clone https://github.com/OnGoTeam/TMGmod.git repo RUN git clone https://github.com/OnGoTeam/TMGmod.git repo
WORKDIR /code/repo/ WORKDIR /code/repo/
RUN git fetch && git checkout 82db35f2db92572c98d84ef781f64f8d65d2f023 RUN git fetch && git checkout 82db35f2db92572c98d84ef781f64f8d65d2f023
ENV SRCDIR="build/src" ENV SRCPATTERN="./build/src/**/*.cs"
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 repo RUN git clone https://gitea.parrrate.ru/PTV/radn-rs.git repo
@ -37,17 +36,16 @@ FROM metrics-base as metrics-ocen
RUN git clone https://github.com/ocen-lang/ocen.git repo RUN git clone https://github.com/ocen-lang/ocen.git repo
WORKDIR /code/repo/ WORKDIR /code/repo/
RUN git fetch && git checkout 0b1a63d0e141fc3032f10c70b5cae117429e2dcb RUN git fetch && git checkout 0b1a63d0e141fc3032f10c70b5cae117429e2dcb
ENV SRCDIR="." ENV SRCPATTERN="./**/*.[oa][ec]"
ENV SRCPATTERN="*.[oa][ec]"
FROM metrics-base as metrics-aecor FROM metrics-base as metrics-aecor
RUN git clone https://github.com/mustafaquraish/aecor.git repo RUN git clone https://github.com/mustafaquraish/aecor.git repo
WORKDIR /code/repo/ WORKDIR /code/repo/
RUN git fetch && git checkout f81543a34ee363dcc00e8632fd7cfcd4a3478b23 RUN git fetch && git checkout f81543a34ee363dcc00e8632fd7cfcd4a3478b23
ENV SRCDIR="." ENV SRCDIR="."
ENV SRCPATTERN="*.[ach]*" ENV SRCPATTERN="./**/*.[ach]*"
FROM metrics-cargo as metrics-repo FROM metrics-rust as metrics-repo
FROM metrics-repo as metrics-commits FROM metrics-repo as metrics-commits
COPY common.py /code/common.py COPY common.py /code/common.py
@ -60,9 +58,8 @@ COPY metrics.py /code/metrics.py
COPY --from=metrics-commits /code/commits.dat commits.dat COPY --from=metrics-commits /code/commits.dat commits.dat
RUN python3 /code/metrics.py RUN python3 /code/metrics.py
FROM python:3.11 as metrics-process FROM metrics-base as metrics-process
RUN python3 -m pip install numpy RUN python3 -m pip install numpy
WORKDIR /code/
FROM metrics-process as metrics-data FROM metrics-process as metrics-data
COPY --from=metrics /code/metrics.dat metrics.dat COPY --from=metrics /code/metrics.dat metrics.dat
@ -90,13 +87,14 @@ FROM metrics-c as metrics-c-proportional
COPY c_proportional.py c_proportional.py COPY c_proportional.py c_proportional.py
RUN python3 c_proportional.py RUN python3 c_proportional.py
FROM metrics-process as metrics-x-linear FROM metrics-process as metrics-x
COPY --from=metrics-y /code/Y.dat Y.dat COPY --from=metrics-y /code/Y.dat Y.dat
FROM metrics-x as metrics-x-linear
COPY x_linear.py x_linear.py COPY x_linear.py x_linear.py
RUN python3 x_linear.py RUN python3 x_linear.py
FROM metrics-process as metrics-x-proportional FROM metrics-x as metrics-x-proportional
COPY --from=metrics-y /code/Y.dat Y.dat
COPY x_proportional.py x_proportional.py COPY x_proportional.py x_proportional.py
RUN python3 x_proportional.py RUN python3 x_proportional.py
@ -127,8 +125,7 @@ COPY --from=metrics-x-proportional /code/X.dat X.dat
COPY --from=metrics-c-proportional /code/C.dat C.dat COPY --from=metrics-c-proportional /code/C.dat C.dat
RUN python3 render_hist.py RUN python3 render_hist.py
FROM metrics-render FROM metrics-base
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-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-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-02y /code/metrics/out.png /code/metrics/metrics-02y.png

View File

@ -2,18 +2,22 @@ import pickle
from random import randrange from random import randrange
from subprocess import check_output from subprocess import check_output
from common import counter from common import set_
BITS = 2
BITS = 7
def mask(height: int) -> int: def mask(height: int) -> int:
return ((1 << height.bit_length()) - 1) >> BITS return ((1 << height.bit_length()) - 1) >> BITS
def valid(commit: str, height: int) -> bool: def valid(commit: str, height: int) -> bool:
expected = int.from_bytes(bytes.fromhex(commit), "little") expected = int.from_bytes(bytes.fromhex(commit), "little")
return mask(height) & (height ^ expected) == 0 return mask(height) & (height ^ expected) == 0
args = []
# args = []
args = ["--topo-order"]
original_commits = check_output(["git", "log", "--pretty=%H", *args], text=True).splitlines() original_commits = check_output(["git", "log", "--pretty=%H", *args], text=True).splitlines()
N = len(original_commits) N = len(original_commits)
total_changes: dict[str, tuple[int, int]] = {} total_changes: dict[str, tuple[int, int]] = {}
@ -28,11 +32,11 @@ for i, commit in enumerate(reversed(original_commits)):
chosen_parent = None chosen_parent = None
height = 1 + max((heights[parent] for parent in parents), default=0) height = 1 + max((heights[parent] for parent in parents), default=0)
nheight = 1 + min((nheights[parent] for parent in parents), default=0) nheight = 1 + min((nheights[parent] for parent in parents), default=0)
if valid(commit, height) or nheight > mask(height): if nheight > mask(height) or valid(commit, height):
included.add(commit) included.add(commit)
nheight = 0 nheight = 0
ctr = counter(commit, True) ctr = set_(commit)
changes = ctr.total(), 1 changes = len(ctr), 1
for parent in parents: for parent in parents:
if parent in included: if parent in included:
_parent = parent _parent = parent
@ -41,9 +45,9 @@ for i, commit in enumerate(reversed(original_commits)):
if _parent is None: if _parent is None:
continue continue
assert _parent in included assert _parent in included
pctr = counter(_parent, True) pctr = set_(_parent)
pcc, pch = total_changes[parent] pcc, pch = total_changes[parent]
maybe_changes = (pctr - ctr).total() + (ctr - pctr).total() + pcc, pch + 1 maybe_changes = len(pctr - ctr) + len(ctr - pctr) + pcc, pch + 1
if maybe_changes > changes: if maybe_changes > changes:
changes = maybe_changes changes = maybe_changes
chosen_parent = parent chosen_parent = parent

View File

@ -6,22 +6,30 @@ from subprocess import check_output
@lru_cache() @lru_cache()
def _counter(commit: str, unique: bool) -> Counter: def _counter(commit: str, unique: bool, to_counter: bool) -> Counter | set:
check_output(["git", "checkout", commit], text=True) check_output(["git", "checkout", commit], text=True)
if unique: if unique:
all_lines = set() all_lines = set()
else: else:
all_lines = Counter() all_lines = Counter()
for path in Path(os.getenv("SRCDIR", "src")).rglob(os.getenv("SRCPATTERN", "*.rs")): for path in Path.cwd().rglob(os.getenv("SRCPATTERN", "./src/**/*.rs")):
lines = path.read_bytes().splitlines() lines = path.read_bytes().splitlines()
lines = (line.strip() for line in lines) lines = (line.strip() for line in lines)
lines = (line for line in lines if line) lines = (line for line in lines if line)
all_lines.update(lines) all_lines.update(lines)
if isinstance(all_lines, set): if isinstance(all_lines, set) and to_counter:
return Counter(all_lines) return Counter(all_lines)
else: else:
return all_lines return all_lines
def set_(commit: str) -> set:
all_lines = _counter(commit, True, False)
assert isinstance(all_lines, set)
return all_lines
def counter(commit: str, unique: bool) -> Counter: def counter(commit: str, unique: bool) -> Counter:
return _counter(commit, unique) all_lines = _counter(commit, unique, True)
assert isinstance(all_lines, Counter)
return all_lines

View File

@ -13,7 +13,7 @@ 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(f"P={i / len(commits):6f}", flush=True)
print("running", commit, flush=True) print("running", commit, flush=True)
current_ctr = counter(commit, False) current_ctr = counter(commit, True)
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()))