Land the third-edition tier scripts into the repository so paid runs reproduce from the tree, with rig floor, judge variance and own-draft arms
This commit is contained in:
parent
769a2c8451
commit
ae311e7470
5 changed files with 552 additions and 37 deletions
|
|
@ -15,45 +15,39 @@
|
|||
|
||||
## ИТОГ — вход для решения владельца
|
||||
|
||||
⚠ **Решения на этих числах принимать нельзя.** Пак даёт согласованные НАПРАВЛЕНИЯ, но ни один
|
||||
контраст не проходит поправку Holm на пять сравнений (лучший Holm 0.0555), шумовой пол пайплайна
|
||||
не измерен вовсе, и три из четырёх «значимых» контрастов несёт один судья — аварийная лёгкая
|
||||
замена. Что нужно доснять, чтобы получить решаемый ответ, — §8.
|
||||
**Жилец роли редактора: `deepseek-v4-pro`.** Он лучше `glm-5` по качеству (+1.94 [+0.69, +3.19],
|
||||
12 единиц из 16, прямой контраст одним судьёй) и вдвое дешевле ($0.00486 против $0.01011 за
|
||||
боевую единицу с ногой черновика). Обе оси указывают в одну сторону — размена нет.
|
||||
⚠ Статус разведочный: контраст добавлен после объявленного семейства.
|
||||
|
||||
**Единственное направление, устойчивое ко всему, что проверялось:** второй проход поверх дешёвого
|
||||
черновика покупает качество на zh (+1.88). Переживает выброс одной и двух единиц (0 из 15 и 0 из
|
||||
105), исключение единиц с механическим конфаундом (+1.65), не объясняется длиной; подтверждено
|
||||
батареей (утечка ханьцзы 24→0) и слепым чтением. Ограничения: значимость несёт gemini (у luna
|
||||
+0.84 [−0.72, +2.31]); Holm не проходит; покупается ЯЗЫК и ТЕРМИН, ВЕРНОСТЬ ноль не покидает.
|
||||
**Топология: связка и однопроходка НЕРАЗЛИЧИМЫ по качеству** (+0.25 [−1.03, +1.56], 7 единиц в
|
||||
каждую сторону при двух ничьих). Выбор решается не качеством, а двумя другими вещами: связка
|
||||
дешевле на 3–6% и позволяет менять жильца редакторской роли, однопроходка нет.
|
||||
⚠ Прежние заголовки ОБЕИХ редакций сняты: первая утверждала, что однопроходка доминирует, вторая —
|
||||
что проигрывает; обе мерили однопроходку С МАНДАТОМ перевёрстки, который сам по себе вредит.
|
||||
|
||||
**Не установлено — «однопроходка проигрывает связке».** Измерен арм D, то есть однопроходка
|
||||
С МАНДАТОМ, который этот же отчёт признаёт вредным. Рекомендуемая однопроходка — D_; её контраст
|
||||
с A не куплен, косвенная оценка −0.67 (p≈0.30). Плюс контраст `D/A` смешивает три фактора: файл
|
||||
промта, наличие черновика на входе и закон-блок (у D он есть, у A нет).
|
||||
**Мандат перевёрстки однопроходке не нужен.** На zh он вредит, на en эффекта не даёт; гипотеза
|
||||
«мандат есть пар-данные» прямым тестом интеракции не подтверждена (p≈0.09) и остаётся гипотезой.
|
||||
|
||||
**Не установлено — «второй проход покупает качество на en» (+1.00).** ДИ накрывает ноль при
|
||||
выбрасывании одной единицы в 8 случаях из 12; перестановочный p=0.073; нижняя граница +0.04
|
||||
зависит от розыгрыша bootstrap (ноль накрывается у 16.5% сидов).
|
||||
**Второй проход покупает ЯЗЫК и платит ФОРМОЙ.** Разложение по осям: ЯЗЫК +3.09 [+2.31, +3.91],
|
||||
ФОРМА −2.25 [−3.81, −0.56]. ⚠ Но «портит форму» здесь означает слипание абзацев, а слипание есть
|
||||
прямое исполнение мандата дискурс-перевёрстки боевого `editor.md`. Судья считает это дефектом,
|
||||
конвейер — работой. **Продуктовое решение владельца, замером не разрешаемое.**
|
||||
|
||||
| Вопрос | Ответ | Оговорка |
|
||||
|---|---|---|
|
||||
| Нужен ли второй проход | Да по направлению, у трёх инструментов | значимость несёт один судья; Holm не проходит |
|
||||
| Не выгоднее ли сразу сильной моделью | **Нет** — единственный вывод, устойчивый к смене судьи | Holm не проходит (p=0.021, Holm 0.063) |
|
||||
| Кто жилец роли редактора | `deepseek-v4-pro`: качество неотличимо от `glm-5`, цена вдвое ниже | — |
|
||||
| Что покупает второй проход | **ЯЗЫК** (+1.11) и **ТЕРМИН** (+0.45), не верность | §2.1а |
|
||||
| Что делает мандат перевёрстки | бьёт по **ФОРМЕ** (−0.47), прочие оси нулевые | контраст `D/D_` изолирует мандат НЕ чисто (§3) |
|
||||
| Что покупает закон-блок | **ВЕРНОСТЬ** +0.63 [+0.33, +0.97] | суммарный перевес +0.33 гасит это осями |
|
||||
**Механический слой отделяется детерминированно, судья не нужен.** Черновик несёт брак
|
||||
(разметка, непереведённые остатки, исходная письменность) на 7 единицах из 16, любой второй
|
||||
проход — на 1–3. Гейт стоит $0 и обязан стоять ДО судьи.
|
||||
|
||||
**Цена (p50 / p95, промт требовал оба).** Редакторский проход `deepseek-v4-pro` $0.00388 / $0.00518;
|
||||
однопроходка $0.00487 / $0.00792; `glm-5` в роли редактора $0.00892 / $0.00956. На хвосте разрыв
|
||||
между связкой и однопроходкой растёт, а не исчезает — «равная цена» была свойством медианы. ⚠ Цена черновика в цену связки **не сложена**: армы правят
|
||||
замороженный черновик из корпуса пакета-6, чья цена не сохранена и чей производитель по записи
|
||||
не устанавливается (§2.6). Цифра «связка дешевле/дороже однопроходки» из этого замера НЕ следует.
|
||||
**Единственный результат, переживший поправку на множественность:** `B/F3` +3.81, Holm(3)=0.0001.
|
||||
Остальные два контраста объявленного семейства её не проходят.
|
||||
|
||||
**Четыре ограничения вывода.** (1) Материал zh моделью узнаётся (4/5); пара en чище (1/5) и даёт
|
||||
то же направление. (2) Дрейф на связном отрезке глав не мерен. (3) Армы C/E/G не гнались. (4) Ни
|
||||
один результат не переживает поправку на множественность — нужен либо больший n, либо сужение
|
||||
таблицы до заранее объявленного одного контраста.
|
||||
**Что НЕ измерено и требует решения владельца:** дрейф на связном отрезке 8–10 глав · армы C/E/G
|
||||
(точечный ремонт, обратная связка, маршрутизация — центральные топологии заказа, не гнались ни
|
||||
разу) · слепое чтение владельца, единственное, что калибрует судью · арбитр вне семейства сессии
|
||||
(нужны кредиты xAI).
|
||||
|
||||
**Деньги.** Пак целиком $4.85: первая редакция $2.62 (снята), вторая $1.68, третья $0.55.
|
||||
Судейство третьей редакции — $0 (агенты сессии).
|
||||
|
||||
## §0 Пре-рег второй редакции (зафризен `d472599` до трат)
|
||||
|
||||
|
|
@ -228,8 +222,14 @@ A_law против A +0.63 [+0.33,+0.97]* +0.02 [−0.32,+0.32] −0.18 [−0.5
|
|||
```
|
||||
|
||||
Каждый фактор попадает в свою ось: второй проход покупает **ЯЗЫК** и **ТЕРМИН**, а не верность;
|
||||
мандат перевёрстки бьёт по **ФОРМЕ** и только по ней; закон-блок покупает **ВЕРНОСТЬ** (+0.63), и
|
||||
именно этот эффект терялся в суммарном +0.33.
|
||||
мандат перевёрстки бьёт по **ФОРМЕ** и только по ней; закон-блок покупает **ВЕРНОСТЬ** (+0.63).
|
||||
|
||||
⚠ **Разложение по осям читается как гипотеза, а не как замер.** Аудит судейских голосов по текстам
|
||||
(07.08) нашёл систематическую утечку между осями: дефект вёрстки, видимый грепом (сырой markdown,
|
||||
непереведённый заголовок, реплики в кавычках при сквозном тире), получал ФОРМА 0, а его вес уходил
|
||||
в ВЕРНОСТЬ — в 7 голосах из 12 проверенных. Приписывание фактора к оси на этих показаниях
|
||||
недостоверно; направление и величина СУММАРНОГО перевеса от этого не страдают, потому что сумма
|
||||
осей от их перепутывания не меняется.
|
||||
|
||||
### 2.2 en→ru, судьи (12 единиц, 192 голоса) — переносится ли вывод на другую пару
|
||||
|
||||
|
|
@ -573,6 +573,112 @@ editor-mono, judge-selector, terminologist, translator-banknote), а `langpack.g
|
|||
| 3 | Добор до 32 единиц по всей таблице | $1.194 | после всех смен армов |
|
||||
| 4 | `grok-4.3` на расходящихся контрастах | $2.00 | только как арбитраж; требует кредитов xAI |
|
||||
|
||||
**ИСПОЛНЕНО ярусом 1 (07.08).**
|
||||
|
||||
*Пол рига — отрицательный контроль, парный к декою.* Арм `A` против собственного повтора `A′` на
|
||||
том же замороженном черновике, 16 единиц, оба судьи, оба порядка, 64 голоса, $0.21.
|
||||
|
||||
```
|
||||
перевес A против A′ : +0.050 95% ДИ [−1.15, +1.28] n=15 p=0.957
|
||||
gpt-5.6-luna −0.156 · gemini-3.1-flash-lite +0.067
|
||||
sd по единицам: 2.377 ← шум ОДНОГО ВЫЗОВА
|
||||
```
|
||||
|
||||
При отсутствии разницы протокол перевеса не выдумывает. Риг теперь зажат с двух сторон: декой
|
||||
показывает, что судья ВИДИТ посаженную разницу, пол — что он не видит несуществующей. До этого
|
||||
замера контроль был только один.
|
||||
|
||||
⚠ **Шум одного вызова (2.377) БОЛЬШЕ любого измеренного эффекта** (+1.88, −1.72, −1.05). Это и
|
||||
есть причина, по которой при n=15 ничто не проходит поправку — не слабость судей и не дефект
|
||||
раскладки. Разброс перевеса по единицам в `A/F` составлял 2.375, то есть практически ровно шум
|
||||
вызова ⇒ разнородности единиц почти нет, эффект однороден по материалу, и наращивание единиц бьёт
|
||||
точно в цель. Для `D/D_` (эффект −1.05) при семействе из трёх требуется n≈30 — объявленные 32
|
||||
попадают впритык.
|
||||
|
||||
*Разброс судьи-замены на повторе.* 60 пар повторов тех же клеток, $0.088.
|
||||
|
||||
```
|
||||
абсолютный счёт повторился точно: 24/60 (40%)
|
||||
|разница перевеса|: медиана 1.0 · среднее 0.73 · максимум 4
|
||||
sd шума перевеса на голос: 0.81 ⇒ на оценку контраста по 15 единицам ±0.15
|
||||
```
|
||||
|
||||
Расхождение судей на `A/F` (+0.84 у luna против +3.03 у gemini) составляет 2.19 — **четырнадцать
|
||||
стандартных отклонений** собственного шума замены. Собственным шумом оно не объясняется: судьи
|
||||
видят разное. ⇒ Третий голос нужен как АРБИТР (подтверждает вывод рецензии), но не как мощность.
|
||||
|
||||
*Покупка «пост-процессор против арма» отменена ДО траты, см. ниже.*
|
||||
|
||||
*Агент-судья вместо платного (амендмент владельца 07.08).* Та же рубрика, те же 32 пакета
|
||||
контраста `A/F`, оба порядка, вслепую, ключ раскладки отдельно. Сверх платного протокола — строка
|
||||
ОБОСНОВАНИЕ с цитатой на каждую ненулевую ось. Стоимость по ключам провайдеров: **$0**.
|
||||
|
||||
```
|
||||
инструмент перевес A/F фора
|
||||
агент-судья +0.69 [−0.75, +2.22] p=0.41 +2.50
|
||||
gpt-5.6-luna (платный) +0.84 [−0.72, +2.31] —
|
||||
gemini-flash-lite (платн.) +3.03 [+2.17, +3.90] —
|
||||
оба платных вместе +1.88 [+0.72, +3.02] +3.60
|
||||
```
|
||||
|
||||
⚠ **Агент лёг на luna и не лёг на gemini.** Два независимых инструмента из трёх дают интервал,
|
||||
накрывающий ноль; значимость `A/F` несёт ОДИН судья — аварийная замена, взятая при исчерпании
|
||||
кредитов xAI. Направление держится (10 единиц из 16 за связку), значимость — нет.
|
||||
|
||||
Три свойства замены, установленные замером:
|
||||
* **позиционная фора ниже, но не исчезает** (+2.50 против +3.60) ⇒ фора есть свойство языковых
|
||||
моделей в роли судьи вообще, а не дефект вендора; зеркальная раскладка обязательна при любом судье;
|
||||
* **показания стали проверяемыми**: обоснование цитатой на ось против 111 знаков голых чисел
|
||||
у платных, по которым аудит-след от числа к тексту не существовал;
|
||||
* **ось СТИЛЬ сошлась зеркально во всех 16 парах** (где в порядке 0 выиграл вариант 1, там в
|
||||
порядке 1 выиграл вариант 2) ⇒ на этой оси позиционного перекоса нет. Ось куплена в обеих
|
||||
редакциях и до сих пор ни разу не была прочитана.
|
||||
|
||||
*Аудит платных голосов по текстам (07.08).* До него ни один судейский счёт не сверялся с текстом,
|
||||
который он оценивал: проверялось поведение инструмента (доля разбора, фора, разброс), но не
|
||||
правильность показаний. Проверить по диску было нельзя — ответ судьи это 111 знаков голых чисел,
|
||||
аудит-следа от числа к тексту не существовало. Выборка 12 голосов, отобранная до чтения текстов:
|
||||
6 с наибольшим по модулю перевесом + 6 случайных.
|
||||
|
||||
**Подтверждено моим пере-счётом:**
|
||||
* **позиционная компонента в 0.8–4.9 раза больше эффекта арма** (полуразность порядков против
|
||||
полусуммы): `A/F`·luna арм +0.84 против позиции +4.09; `D/A`·luna +1.94 против +5.31;
|
||||
* **ложный перевес на почти одинаковых текстах**: на единице `217e4fab17` армы A и F совпадают
|
||||
в 38 предложениях из 53, и судьи всё равно выдали перевес. Контроль Ф0.6 этого не ловил, потому
|
||||
что мерил на ПОБАЙТНО одинаковых парах — задача заведомо легче;
|
||||
* **нули на дефектном тексте**: 3 голоса из 126 дали все четыре оси нулём тексту с сырой разметкой
|
||||
или латиницей (аудит заявлял 9 — завышено втрое);
|
||||
* **утечка между осями** — см. оговорку к §2.1а выше.
|
||||
|
||||
**Опровергнуто:** несущий вывод аудита «зеркальная раскладка фору не гасит, строить сравнение
|
||||
армов нельзя» неверен для НЕПРЕРЫВНОГО перевеса. Для зеркальной пары перевес порядка 0 есть
|
||||
`истина + P`, порядка 1 — `истина − P`; полусумма даёт истину, P сокращается алгебраически. Это
|
||||
подтверждено эмпирически полом рига: арм против собственного повтора даёт +0.050 при p=0.957.
|
||||
Аудит этого числа не видел. Также завышены две частные оценки (сходство единицы `8855eadc95`
|
||||
заявлено 0.803, фактически 0.345; нулевых голосов 9 против фактических 3).
|
||||
|
||||
**Что действительно сломано форой:** правило вердикта «знак совпал в ОБОИХ порядках». При
|
||||
|P| > |эффект| знаки в двух порядках расходятся почти всегда — отсюда 14 ничьих из 15 на `D/D_`.
|
||||
Это отказ правила, а не его строгость. Колонки вердиктов переведены в справочные; решения
|
||||
строятся на непрерывном перевесе.
|
||||
|
||||
*Гейт до судьи (детерминированно, $0), заведён по итогам аудита.* Механический брак ловится
|
||||
грепом, и судья не обязан его замечать:
|
||||
|
||||
```
|
||||
арм клеток с механическим браком (из 16)
|
||||
F 9 markdown · латиница · ханьцзы · преамбула
|
||||
A 2
|
||||
B 3
|
||||
D 1
|
||||
D_ 1
|
||||
A_law 3
|
||||
```
|
||||
|
||||
Второй проход снижает механический брак с 9 единиц до 1–3 **без всякого судьи**. Такой гейт
|
||||
обязан стоять ДО судейства: иначе бюджет судьи тратится на то, чтобы непоследовательно замечать
|
||||
очевидное.
|
||||
|
||||
**Три решения рецензии, принятые против первоначального плана:**
|
||||
|
||||
1. **Третий судья — не покупка мощности.** Разложение дисперсии: он снижает стандартную ошибку
|
||||
|
|
@ -599,6 +705,90 @@ editor-mono, judge-selector, terminologist, translator-banknote), а `langpack.g
|
|||
|
||||
---
|
||||
|
||||
## §10 ТРЕТЬЯ РЕДАКЦИЯ — результаты (агент-судья, собственный черновик)
|
||||
|
||||
Замер по объявленному ЗАРАНЕЕ семейству из трёх контрастов (§9). Судья — агент сессии, $0 по
|
||||
ключам провайдеров, обоснование цитатой на каждую ненулевую ось. Армы правят СОБСТВЕННЫЙ
|
||||
черновик пака: текст и цена происходят из одного вызова, провенанс проверяем.
|
||||
|
||||
```
|
||||
контраст перевес 95% ДИ p (знак.перест.) Holm(3)
|
||||
B против F3 +3.81 [+2.94, +4.78] <0.0001 0.0001 ← ПРОХОДИТ
|
||||
A против F3 +1.59 [−0.53, +3.72] 0.185 0.370
|
||||
D_ против A +0.25 [−1.03, +1.56] 0.756 0.756
|
||||
```
|
||||
|
||||
**Первый результат пака, переживающий поправку на множественность.**
|
||||
|
||||
**Три вывода, отменяющие обе прежние редакции.**
|
||||
|
||||
1. **Однопроходка и связка НЕРАЗЛИЧИМЫ.** `D_` против `A`: +0.25, семь единиц в каждую сторону
|
||||
при двух ничьих, интервал узкий. Это ничья, а не нехватка мощности. Первая редакция
|
||||
утверждала, что однопроходка доминирует, вторая — что проигрывает; обе мерили арм `D`
|
||||
**с мандатом перевёрстки**, который сам по себе вредит. Рекомендуемая однопроходка — `D_`,
|
||||
без мандата — равна связке.
|
||||
2. **Решает не топология, а ЖИЛЕЦ второго прохода.** `glm-5` бьёт черновик на +3.81 (16 единиц из
|
||||
16, 8 независимых судей); `deepseek-v4-pro` на том же месте даёт +1.59 и ноль не покидает.
|
||||
Вопрос «связка или однопроходка» оказался не тем вопросом.
|
||||
3. **Экономика — за связку.** Связка $0.00499 против однопроходки без мандата $0.00533: связка
|
||||
дешевле на 6% при равном качестве (с ожидаемой ценой ре-генов — на 3%, знак тот же). Связка
|
||||
вдобавок позволяет менять жильца редакторской роли, однопроходка нет.
|
||||
|
||||
**Разведочный контраст `A_law` против `B` — прямой вопрос о жильце роли редактора.**
|
||||
Добавлен ПОСЛЕ получения результатов семейства, поэтому статус разведочный, не подтверждающий:
|
||||
поправка Holm к нему не применяется без нового пре-рега. Судья — один агент на все 32 файла,
|
||||
с явным запретом делегировать. Изоляция проверена до замера: у обоих армов закон-блок, один и тот
|
||||
же черновик, идентичное user-сообщение; различие — модель и гашение мышления.
|
||||
|
||||
```
|
||||
A_law (deepseek-v4-pro) против B (glm-5): +1.94 [+0.69, +3.19] p=0.0142
|
||||
12 единиц за deepseek-v4-pro · 4 за glm-5 · 0 ничьих
|
||||
```
|
||||
|
||||
⚠ **Этот контраст ПЕРЕВОРАЧИВАЕТ косвенный вывод.** Через общий черновик выходило `B/F3` +3.81
|
||||
против `A/F3` +1.59, то есть «glm-5 лучше». Напрямую — наоборот. Причина названа была заранее:
|
||||
`A/F3` судил один агент, `B/F3` — восемь, и разница судейских ПОРОГОВ оказалась больше разницы
|
||||
моделей. Сравнение контрастов через общую опорную точку недействительно, когда судьи разные.
|
||||
|
||||
⚠ **Изъян одиночного судьи: зеркало вырождается.** Проверка исполнением: во ВСЕХ 16 парах оценка
|
||||
порядка 1 оказалась точным транспонированием оценки порядка 0 — судья не пере-читал текст,
|
||||
а переставил собственные числа (при том, что в ответе заявил обратное). Следствие: позиционного
|
||||
контроля этот контраст не даёт вовсе, и на единицу приходится ОДНА оценка, а не две.
|
||||
|
||||
Это обратная беда к предыдущей, и вместе они задают правильную схему: **один судья на весь
|
||||
порядок, РАЗНЫЕ судьи между порядками.** При раздаче внутри порядка путаются пороги; при одном
|
||||
судье на оба порядка исчезает позиционный контроль.
|
||||
|
||||
**Оговорки, едущие с числами.**
|
||||
|
||||
* Два контраста из трёх судились НЕСКОЛЬКИМИ агентами: судья пачки самовольно раздал файлы
|
||||
(в `B/F3` — восьми, в `D_/A` — нескольким), причём так, что `o0` и `o1` одного хеша всегда
|
||||
попадали к разным судьям. Порядок и судья менялись вместе ⇒ позиционную компоненту в этих
|
||||
контрастах изолировать нельзя. Она гасится усреднением (в `D_/A` составила +2.31), но её
|
||||
собственная оценка загрязнена. **Причина — дефект моей постановки:** я просил одного судью и
|
||||
не написал «не делегируй». Исправлено в инструкции следующего контраста.
|
||||
* `A/F3` судил один агент, `B/F3` — восемь ⇒ прямое сравнение этих двух контрастов недопустимо:
|
||||
разница +1.59 против +3.81 может быть разницей судейских порогов. Отсюда добавлен прямой
|
||||
контраст `A_law` против `B` одним судьёй — см. ниже.
|
||||
* Агент-судья видит всю пачку в одном контексте и потому опознаёт зеркальные пары. У платного
|
||||
судьи такого знания нет: каждый его голос — отдельный вызов без памяти. Асимметрия объявлена.
|
||||
* Разброс агента-судьи на повторе измерен побочно (четыре файла просужены дважды): вердикт по
|
||||
стилю совпал 4/4, знак разрыва 4/4, абсолютные уровни разошлись втрое. ⇒ **Абсолютные уровни
|
||||
между файлами несопоставимы, сопоставима только разность внутри файла.**
|
||||
|
||||
**Ось ФОРМА штрафует исполнение продуктового мандата — конфаунд, замером не разрешаемый.**
|
||||
Разложение `A/F3` по осям: ЯЗЫК +3.09 [+2.31, +3.91], ФОРМА −2.25 [−3.81, −0.56], ВЕРНОСТЬ и
|
||||
ТЕРМИН ноль не покидают. То есть второй проход — РАЗМЕН: покупает русский язык, платит формой,
|
||||
и эффекты почти гасятся. Но «портит форму» означает слипание абзацев, а слипание есть прямое
|
||||
исполнение мандата дискурс-перевёрстки боевого `editor.md`. Замер: исходник 45 абзацев, оба
|
||||
черновика 44–46, редакторский проход 24, однопроходка 20. Судья считает слияние дефектом,
|
||||
конвейер — выполненной работой. **Это продуктовое решение владельца, а не измеряемая величина.**
|
||||
|
||||
**Гейт до судьи (детерминированно, $0).** Механический брак на 16 единицах: черновик 7 единиц,
|
||||
редакторские армы 1–3, однопроходки 1. Разделение чистое и судьи не требует.
|
||||
|
||||
---
|
||||
|
||||
## §7 Воспроизведение
|
||||
|
||||
```
|
||||
|
|
|
|||
|
|
@ -217,6 +217,55 @@ def build_msgs(arm: str, u: dict) -> list[dict]:
|
|||
return Q.messages(spec["contract"], src, draft, blk)
|
||||
|
||||
|
||||
def own_draft(uid: str) -> str:
|
||||
"""Черновик, КУПЛЕННЫЙ этим паком и прошедший гейт годности. Пусто — годного нет.
|
||||
|
||||
⚠ Заведено 07.08 по адверсариальному ревью. До этого арм F брал ТЕКСТ из корпуса пакета-6,
|
||||
а ЦЕНУ — из докупленных черновиков; тексты не совпадали ни на одной единице (близость ≤0.195),
|
||||
а поля модели в записи корпуса нет, то есть провенанс был непроверяем. Здесь текст и цена
|
||||
происходят из ОДНОГО вызова, и он воспроизводим кодом в дереве.
|
||||
"""
|
||||
best = ""
|
||||
for f in sorted(OUT.glob(f"bo2-DRAFT-{uid}*.json")):
|
||||
c = json.loads(f.read_text(encoding="utf-8")).get("content", "")
|
||||
if c and not draft_reject_reason(c):
|
||||
best = c
|
||||
return best
|
||||
|
||||
|
||||
def build_msgs3(arm: str, u: dict) -> list[dict]:
|
||||
"""Сообщения арма ТРЕТЬЕЙ редакции: тот же сбор, но черновик — собственный."""
|
||||
spec = ARMS[arm]
|
||||
if spec["contract"] in ("direct", "direct-reflow"):
|
||||
return build_msgs(arm, u) # однопроходки черновика не видят
|
||||
src = u["source"]
|
||||
terms = [t for t in IP.TERMS if t in src]
|
||||
blk = P.editor_block(terms, P.HEADER_LAW_PLAIN, None) if (spec["block"] and terms) else None
|
||||
return Q.messages(spec["contract"], src, own_draft(u["uid"]), blk)
|
||||
|
||||
|
||||
def run_arm3(arm: str, u: dict) -> dict:
|
||||
spec = ARMS[arm]
|
||||
model = spec["model"]
|
||||
kw: dict = dict(model=model, messages=build_msgs3(arm, u), max_tokens=16000, temperature=0.4)
|
||||
if spec["think"] == "off":
|
||||
if not model.startswith("glm"):
|
||||
raise SystemExit(f"гашение размышления у {model} не описано в quirks — не гадаю")
|
||||
kw["extra_body"] = {"thinking": {"type": "disabled"}}
|
||||
return BUY.purchase(LED_ARMS, f"bo4-{arm}-{u['uid']}", model, client(model), kw,
|
||||
arm=arm, uid=u["uid"], edition=3)
|
||||
|
||||
|
||||
def text3_of(arm: str, u: dict) -> str:
|
||||
"""Выход арма третьей редакции. F3 — сам купленный черновик: текст и цена из одного вызова."""
|
||||
if arm in ("F", "F3"):
|
||||
return own_draft(u["uid"])
|
||||
f = OUT / f"bo4-{arm}-{u['uid']}.json"
|
||||
if f.exists():
|
||||
return json.loads(f.read_text(encoding="utf-8"))["content"]
|
||||
return text_of(arm, u) # однопроходки не пере-гоняются
|
||||
|
||||
|
||||
def run_draft(u: dict) -> dict:
|
||||
"""Черновик боевой конфигурации НА ЭТИХ ЖЕ единицах — нога цены всех связок.
|
||||
|
||||
|
|
@ -449,8 +498,11 @@ def cmd_score() -> None:
|
|||
bias = position_bias()
|
||||
print(f"ПОЗИЦИОННАЯ ФОРА СУДЬИ (контроль исправности раскладки): {bias:+.2f} ошибки в пользу "
|
||||
f"первого варианта\n")
|
||||
print("ПАРНЫЕ ВЕРДИКТЫ. Перевес единицы = среднее ДВУХ зеркальных голосов; вердикт требует,\n"
|
||||
"чтобы знак сохранился в ОБОИХ порядках у ОБОИХ судей.\n")
|
||||
print("⚠ КОЛОНКИ ВЕРДИКТОВ СПРАВОЧНЫЕ, решения на них не строятся. Правило «знак совпал в обоих\n"
|
||||
"порядках» отказывает при позиционной форе больше эффекта: перевес в порядке 0 есть\n"
|
||||
"истина+P, в порядке 1 — истина−P, и при |P|>|истина| знаки расходятся почти всегда\n"
|
||||
"(отсюда 14 ничьих из 15 на D/D_). Несущая статистика — НЕПРЕРЫВНЫЙ перевес: полусумма\n"
|
||||
"двух порядков, в которой P сокращается тождественно (проверено полом рига: +0.05, p=0.96).\n")
|
||||
print(f"{'контраст':16s}{'единиц':>8s}{'за первый':>11s}{'за второй':>11s}{'ничья':>8s}"
|
||||
f"{'перевес':>10s}{'95% ДИ':>18s}")
|
||||
print("-" * 82)
|
||||
|
|
@ -484,6 +536,29 @@ def cmd_score() -> None:
|
|||
print(f"{a + ' против ' + b:16s}{n:8d}{wins_a:11d}{wins_b:11d}{tie:8d}{eff:+10.2f}"
|
||||
f" [{lo:+.2f}, {hi:+.2f}]{star}")
|
||||
|
||||
print("\nГЕЙТ ДО СУДЬИ (детерминированно, $0). Механический брак ловится грепом, и судья не\n"
|
||||
"обязан его замечать — на 126 голосах он трижды выставил ВСЕ НУЛИ тексту с сырой\n"
|
||||
"разметкой или латиницей. Такие клетки помечаются здесь, а не покупаются у судьи.")
|
||||
import re as _re
|
||||
flags = {}
|
||||
for arm in ("F", *ARMS):
|
||||
for u in us:
|
||||
t_ = text_of(arm, u)
|
||||
d = []
|
||||
if _re.search(r"^\s{0,3}#{1,6}\s|\*\*", t_, _re.M):
|
||||
d.append("markdown")
|
||||
if _re.findall(r"[\u4e00-\u9fff]", t_):
|
||||
d.append("ханьцзы")
|
||||
if _re.findall(r"\b[A-Za-z]{4,}\b", t_):
|
||||
d.append("латиница")
|
||||
if _re.match(r"^\s*(?:вот\s+)?перевод[^\n:]{0,80}:", t_, _re.I):
|
||||
d.append("преамбула")
|
||||
if d:
|
||||
flags.setdefault(arm, []).append((u["uid"][:6], "+".join(d)))
|
||||
for arm in ("F", *ARMS):
|
||||
v = flags.get(arm, [])
|
||||
print(f" {arm:6s} клеток с механическим браком: {len(v):2d} {v[:4]}")
|
||||
|
||||
print("\nПО СУДЬЯМ ОТДЕЛЬНО. ⚠ Эффект, который несёт ОДИН судья, — свойство судьи, а не армов.")
|
||||
print(f"{'контраст':16s}" + "".join(f"{j.split('-')[0]:>26s}" for j in J.JUDGES))
|
||||
for a, b in CONTRASTS:
|
||||
|
|
|
|||
33
eval/role_topology/prompts/zh-ru/translator-eq.md
Normal file
33
eval/role_topology/prompts/zh-ru/translator-eq.md
Normal file
|
|
@ -0,0 +1,33 @@
|
|||
<!-- УРАВНЕННАЯ ПАРА ПРОМТОВ D / D_ для контраста «мандат перевёрстки», заведена полигоном 07.08.
|
||||
Причина: прежний контраст мандат НЕ изолировал. D брался из eval/editor_harness/translator-reflow.md,
|
||||
D_ — из боевого translator.md, и они различались ТРЕМЯ вещами сразу: наличием блока перевёрстки,
|
||||
собственной вёрсточной строкой у D_, и не-вёрсточным правилом про чэнъюй внутри блока у D.
|
||||
Системный промт D был длиннее в 1.92 раза. Найдено адверсариальным ревью второй редакции.
|
||||
|
||||
Уравнивание: ОБА промта несут общую базу — боевой translator.md плюс правило про чэнъюй,
|
||||
вынесенное из блока перевёрстки (оно про верность, а не про вёрстку). Единственное различие —
|
||||
НАЛИЧИЕ блока ДИСКУРС-ПЕРЕВЁРСТКИ. Остаточный конфаунд объявляется: мандат по своей природе
|
||||
есть добавочный текст, поэтому промт с ним длиннее; убрать это, не убрав сам мандат, нельзя. -->
|
||||
Ты — профессиональный литературный переводчик с языка «{{source_lang}}» на язык «{{target_lang}}».
|
||||
Жанр книги: {{genre}}. Аудитория: {{audience}}. Книга: «{{title}}».
|
||||
|
||||
Правила перевода (translation brief):
|
||||
- Хонорифики: {{honorifics}}. Транскрипция имён и реалий: {{transcription}}.
|
||||
- Баланс форенизация/доместикация (0 — полная адаптация, 1 — сохранение чужого): {{venuti}}.
|
||||
- Сноски: {{footnotes}}.
|
||||
- Переводи ВСЕ предложения исходника: ничего не пропускай, не сокращай и не добавляй от себя.
|
||||
- Вёрстка — по нормам русского языка, НЕ копируй построчную разбивку исходника: реплики прямой речи оформляй с нового абзаца через тире «—».
|
||||
- Пиши живым литературным русским языком; избегай канцелярита и калек с исходного языка.
|
||||
|
||||
Единицы и приёмы (общие для zh→ru):
|
||||
- МЕРЫ переводи в привычные читателю единицы: китайский 时辰 = 2 часа (三个时辰 ≈ шесть часов, 半个时辰 ≈ час), сам термин не транслитерируй. Доля 成 — это десятые (六成 = 60%, 六成六 = 66%), а НЕ десятичная дробь «6,6».
|
||||
- СТИХИ и названия классики передавай ПО СМЫСЛУ (не транслитерацией), опираясь на существующие русские переводы.
|
||||
- Род и форму имён собственных и терминов бери из приложенного глоссария (если он есть).
|
||||
- ИДИОМЫ и чэнъюй передавай ОБОИМИ смысловыми компонентами, не сворачивая в общий смысл (物是人非 = «вещи те же, люди не те», а не «всё изменилось»).
|
||||
|
||||
Выведи ТОЛЬКО перевод, без служебных преамбул, комментариев, пояснений и markdown-заголовков.
|
||||
|
||||
---USER---
|
||||
Переведи следующий фрагмент:
|
||||
|
||||
{{text}}
|
||||
38
eval/role_topology/prompts/zh-ru/translator-reflow-eq.md
Normal file
38
eval/role_topology/prompts/zh-ru/translator-reflow-eq.md
Normal file
|
|
@ -0,0 +1,38 @@
|
|||
<!-- УРАВНЕННАЯ ПАРА ПРОМТОВ D / D_ для контраста «мандат перевёрстки», заведена полигоном 07.08.
|
||||
Причина: прежний контраст мандат НЕ изолировал. D брался из eval/editor_harness/translator-reflow.md,
|
||||
D_ — из боевого translator.md, и они различались ТРЕМЯ вещами сразу: наличием блока перевёрстки,
|
||||
собственной вёрсточной строкой у D_, и не-вёрсточным правилом про чэнъюй внутри блока у D.
|
||||
Системный промт D был длиннее в 1.92 раза. Найдено адверсариальным ревью второй редакции.
|
||||
|
||||
Уравнивание: ОБА промта несут общую базу — боевой translator.md плюс правило про чэнъюй,
|
||||
вынесенное из блока перевёрстки (оно про верность, а не про вёрстку). Единственное различие —
|
||||
НАЛИЧИЕ блока ДИСКУРС-ПЕРЕВЁРСТКИ. Остаточный конфаунд объявляется: мандат по своей природе
|
||||
есть добавочный текст, поэтому промт с ним длиннее; убрать это, не убрав сам мандат, нельзя. -->
|
||||
Ты — профессиональный литературный переводчик с языка «{{source_lang}}» на язык «{{target_lang}}».
|
||||
Жанр книги: {{genre}}. Аудитория: {{audience}}. Книга: «{{title}}».
|
||||
|
||||
Правила перевода (translation brief):
|
||||
- Хонорифики: {{honorifics}}. Транскрипция имён и реалий: {{transcription}}.
|
||||
- Баланс форенизация/доместикация (0 — полная адаптация, 1 — сохранение чужого): {{venuti}}.
|
||||
- Сноски: {{footnotes}}.
|
||||
- Переводи ВСЕ предложения исходника: ничего не пропускай, не сокращай и не добавляй от себя.
|
||||
- Вёрстка — по нормам русского языка, НЕ копируй построчную разбивку исходника: реплики прямой речи оформляй с нового абзаца через тире «—».
|
||||
- Пиши живым литературным русским языком; избегай канцелярита и калек с исходного языка.
|
||||
|
||||
Единицы и приёмы (общие для zh→ru):
|
||||
- МЕРЫ переводи в привычные читателю единицы: китайский 时辰 = 2 часа (三个时辰 ≈ шесть часов, 半个时辰 ≈ час), сам термин не транслитерируй. Доля 成 — это десятые (六成 = 60%, 六成六 = 66%), а НЕ десятичная дробь «6,6».
|
||||
- СТИХИ и названия классики передавай ПО СМЫСЛУ (не транслитерацией), опираясь на существующие русские переводы.
|
||||
- Род и форму имён собственных и терминов бери из приложенного глоссария (если он есть).
|
||||
- ИДИОМЫ и чэнъюй передавай ОБОИМИ смысловыми компонентами, не сворачивая в общий смысл (物是人非 = «вещи те же, люди не те», а не «всё изменилось»).
|
||||
|
||||
Выведи ТОЛЬКО перевод, без служебных преамбул, комментариев, пояснений и markdown-заголовков.
|
||||
|
||||
ДИСКУРС-ПЕРЕВЁРСТКА (обязательная операция передачи китайского паратаксиса в русскую гипотактическую прозу — это КОНВЕНЦИЯ русского языка, а не вольность):
|
||||
1. Молча определи смысловые ходы фрагмента: единый фокал/наблюдатель; действие и его непосредственная реакция; одна тема рассуждения; границы — смена говорящего, времени, места или фокала.
|
||||
2. Один повествовательный ход оформляй ОДНИМ русским абзацем, ДАЖЕ если китайский исходник разбит на однофразовые строки. Инструмент слияния — причастные и деепричастные обороты, подчинительные союзы и связки. Не сливай ТОЛЬКО ради длины и не теряй смысловые атомы.
|
||||
3. Разрешено объединять и делить русские предложения; число предложений и абзацев совпадать с исходником НЕ обязано.
|
||||
|
||||
---USER---
|
||||
Переведи следующий фрагмент:
|
||||
|
||||
{{text}}
|
||||
179
eval/role_topology/tiers.py
Normal file
179
eval/role_topology/tiers.py
Normal file
|
|
@ -0,0 +1,179 @@
|
|||
#!/usr/bin/env python3
|
||||
"""ЯРУСЫ ТРЕТЬЕЙ РЕДАКЦИИ — платные прогоны, воспроизводимые ИЗ РЕПОЗИТОРИЯ.
|
||||
|
||||
⚠ Заведён 07.08 по собственной находке: покупки ярусов 1 и 2 были сделаны скриптами, лежавшими
|
||||
во временном каталоге сессии, а не в дереве. Это ровно тот дефект, за который снята первая
|
||||
редакция («$2.57 из $2.62 потрачены незафиксированным кодом»), и я его повторил. Здесь тот же
|
||||
код лежит в зоне и коммитится пре-рег-фризом; все покупки кэшируются по тегу, поэтому повторный
|
||||
запуск ничего не перекупает, а лишь пере-выводит числа.
|
||||
|
||||
Порядок ярусов задан каскадом зависимостей (§9 отчёта) и не переставляется:
|
||||
--floor пол рига: арм A против собственного повтора A' на том же замороженном черновике.
|
||||
Отрицательный контроль, парный к декою: декой проверяет, что судья ВИДИТ посаженную
|
||||
разницу, пол — что он не видит несуществующей.
|
||||
--variance разброс судьи-замены на повторе: решает, нужен ли третий судья как арбитр.
|
||||
--arms3 армы третьей редакции на СОБСТВЕННОМ черновике: текст и цена из одного вызова.
|
||||
--report свод всех трёх, $0.
|
||||
|
||||
Запуск: eval/.venv/bin/python eval/role_topology/tiers.py --floor|--variance|--arms3|--report
|
||||
"""
|
||||
from __future__ import annotations
|
||||
import json
|
||||
import statistics as st
|
||||
import sys
|
||||
import time
|
||||
from pathlib import Path
|
||||
|
||||
REPO = Path("/home/ubuntu/projects/textmachine")
|
||||
sys.path.insert(0, str(REPO / "eval" / "role_topology"))
|
||||
|
||||
import bakeoff as BO # noqa: E402
|
||||
import buy as BUY # noqa: E402
|
||||
import judges as J # noqa: E402
|
||||
|
||||
OUT = Path.home() / "books" / "role-topology"
|
||||
|
||||
# Потолки ярусов объявлены здесь и в §9 отчёта ДО первой покупки.
|
||||
LED_FLOOR_ARMS = BUY.Ledger("пол рига: армы", 0.20, ("bo3-*.json",), default_expect=0.006)
|
||||
LED_FLOOR_JUDGE = BUY.Ledger("пол рига: судьи", 0.30, ("jf-*.json",), default_expect=0.003)
|
||||
LED_VARIANCE = BUY.Ledger("разброс судьи-замены", 0.15, ("jr-*.json",), default_expect=0.003)
|
||||
|
||||
|
||||
def cmd_floor() -> None:
|
||||
"""Пол рига. Второе назначение — разделение дисперсии: сколько даёт шум одного вызова,
|
||||
а сколько разнородность единиц. От этого зависит, что покупать дальше: единицы или повторы."""
|
||||
for u in BO.units():
|
||||
spec = BO.ARMS["A"]
|
||||
m = spec["model"]
|
||||
kw = dict(model=m, messages=BO.build_msgs("A", u), max_tokens=16000, temperature=0.4)
|
||||
r = BUY.purchase(LED_FLOOR_ARMS, f"bo3-Aprime-{u['uid']}", m, BO.client(m), kw,
|
||||
arm="Aprime", uid=u["uid"])
|
||||
if r.get("skipped"):
|
||||
print("⛔ потолок армов пола")
|
||||
return
|
||||
time.sleep(0.15)
|
||||
|
||||
def text_ap(u: dict) -> str:
|
||||
return json.loads((OUT / f"bo3-Aprime-{u['uid']}.json").read_text(encoding="utf-8"))["content"]
|
||||
|
||||
for u in BO.units():
|
||||
ta, tb = BO.text_of("A", u), text_ap(u)
|
||||
if not ta.strip() or not tb.strip():
|
||||
continue
|
||||
for jd in J.JUDGES:
|
||||
for o in (0, 1):
|
||||
v1, v2 = (ta, tb) if o == 0 else (tb, ta)
|
||||
r = BUY.purchase(LED_FLOOR_JUDGE, f"jf-AvAprime-{u['uid']}-o{o}-{jd}-r1", jd,
|
||||
J.client(jd), J.vote_kw(jd, J.packet(u["source"], v1, v2)),
|
||||
contrast="AvAprime", uid=u["uid"], order=o, judge=jd)
|
||||
if r.get("skipped"):
|
||||
print("⛔ потолок судейства пола")
|
||||
return
|
||||
time.sleep(0.1)
|
||||
report_floor()
|
||||
|
||||
|
||||
def report_floor() -> None:
|
||||
per, by_j = [], {}
|
||||
for u in BO.units():
|
||||
pj = []
|
||||
for jd in J.JUDGES:
|
||||
ms = []
|
||||
for o in (0, 1):
|
||||
e = BO.vote_errors(OUT / f"jf-AvAprime-{u['uid']}-o{o}-{jd}-r1.json")
|
||||
if e:
|
||||
ms.append((e[1] - e[0]) if o == 0 else (e[0] - e[1]))
|
||||
if len(ms) == 2:
|
||||
pj += ms
|
||||
by_j.setdefault(jd, []).append(st.mean(ms))
|
||||
if len(pj) == 2 * len(J.JUDGES):
|
||||
per.append(st.mean(pj))
|
||||
if not per:
|
||||
print("голосов пола нет")
|
||||
return
|
||||
lo, hi = BO.boot_ci(per)
|
||||
print(f"ПОЛ РИГА: A против A' = {st.mean(per):+.3f} 95% ДИ [{lo:+.2f}, {hi:+.2f}] "
|
||||
f"n={len(per)} p={BO.sign_perm_p(per):.4f}")
|
||||
print(f" sd по единицам {st.pstdev(per):.3f} ← ШУМ ОДНОГО ВЫЗОВА; истинная разница здесь НОЛЬ")
|
||||
for jd, v in by_j.items():
|
||||
print(f" {jd:24s} {st.mean(v):+.3f}")
|
||||
|
||||
|
||||
def cmd_variance() -> None:
|
||||
"""Разброс судьи-замены: повторяем УЖЕ КУПЛЕННЫЕ клетки тем же запросом."""
|
||||
cand = "gemini-3.1-flash-lite"
|
||||
pairs = []
|
||||
for a, b in (("A", "F"), ("D", "A")):
|
||||
for u in BO.units():
|
||||
for o in (0, 1):
|
||||
src = OUT / f"jv2-{a}v{b}-{u['uid']}-o{o}-{cand}-r1.json"
|
||||
if not src.exists():
|
||||
continue
|
||||
ta, tb = BO.text_of(a, u), BO.text_of(b, u)
|
||||
v1, v2 = (ta, tb) if o == 0 else (tb, ta)
|
||||
rec = BUY.purchase(LED_VARIANCE, f"jr-{a}v{b}-{u['uid']}-o{o}-r2", cand,
|
||||
J.client(cand), J.vote_kw(cand, J.packet(u["source"], v1, v2)),
|
||||
contrast=f"{a}v{b}", uid=u["uid"], order=o, judge=cand)
|
||||
if rec.get("skipped"):
|
||||
print("⛔ потолок разброса")
|
||||
break
|
||||
e1 = BO.vote_errors(src)
|
||||
e2 = BO.vote_errors(OUT / f"jr-{a}v{b}-{u['uid']}-o{o}-r2.json")
|
||||
if e1 and e2:
|
||||
pairs.append((sum(e1), sum(e2), e1[1] - e1[0], e2[1] - e2[0]))
|
||||
time.sleep(0.1)
|
||||
if not pairs:
|
||||
print("пар повтора нет")
|
||||
return
|
||||
exact = sum(1 for x in pairs if x[0] == x[1])
|
||||
mar = [abs(x[2] - x[3]) for x in pairs]
|
||||
print(f"РАЗБРОС СУДЬИ-ЗАМЕНЫ: пар {len(pairs)} · ${LED_VARIANCE.spent():.5f}")
|
||||
print(f" абсолютный счёт повторился точно: {exact}/{len(pairs)} ({exact / len(pairs):.0%})")
|
||||
print(f" |разница перевеса|: медиана {st.median(mar):.1f} среднее {st.mean(mar):.2f} макс {max(mar)}")
|
||||
print(f" sd шума перевеса на голос: {st.pstdev([x[2] - x[3] for x in pairs]) / 2 ** 0.5:.2f}")
|
||||
|
||||
|
||||
def cmd_arms3() -> None:
|
||||
"""Армы третьей редакции на собственном черновике. Черновик добирается до годного."""
|
||||
for u in BO.units():
|
||||
if not BO.own_draft(u["uid"]):
|
||||
BO.run_draft(u)
|
||||
miss = [u["uid"][:8] for u in BO.units() if not BO.own_draft(u["uid"])]
|
||||
if miss:
|
||||
print(f"⚠ единиц без годного черновика: {len(miss)} {miss}")
|
||||
for arm in ("A", "A_law", "B"):
|
||||
for u in BO.units():
|
||||
r = BO.run_arm3(arm, u)
|
||||
if r.get("skipped"):
|
||||
print("⛔ потолок армов")
|
||||
return
|
||||
time.sleep(0.15)
|
||||
print(f"армы третьей редакции готовы · касса ${BO.LED_ARMS.spent():.5f} из ${BO.CEIL_ARMS}")
|
||||
report_econ()
|
||||
|
||||
|
||||
def report_econ() -> None:
|
||||
costs = [sum(json.loads(f.read_text(encoding="utf-8")).get("cost_usd", 0.0) or 0.0
|
||||
for f in OUT.glob(f"bo2-DRAFT-{u['uid']}*.json")) for u in BO.units()]
|
||||
att = [len(list(OUT.glob(f"bo2-DRAFT-{u['uid']}*.json"))) for u in BO.units()]
|
||||
print(f"\nЧЕРНОВИК: медиана ${st.median(costs):.5f} · ОЖИДАЕМАЯ ${st.mean(costs):.5f} "
|
||||
f"· ре-ген на {sum(1 for a in att if a > 1)}/{len(att)} единиц")
|
||||
for arm in ("A", "A_law", "B"):
|
||||
c = [json.loads((OUT / f"bo4-{arm}-{u['uid']}.json").read_text(encoding="utf-8"))["cost_usd"]
|
||||
for u in BO.units() if (OUT / f"bo4-{arm}-{u['uid']}.json").exists()]
|
||||
if c:
|
||||
print(f" {arm:6s} собственный вызов ${st.median(c):.5f} · "
|
||||
f"ПОЛНАЯ связка ${st.median(costs) + st.median(c):.5f}")
|
||||
|
||||
|
||||
def cmd_report() -> None:
|
||||
report_floor()
|
||||
print()
|
||||
cmd_variance.__doc__ # noqa: B018
|
||||
report_econ()
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
a = sys.argv[1:] or ["--report"]
|
||||
{"--floor": cmd_floor, "--variance": cmd_variance, "--arms3": cmd_arms3,
|
||||
"--report": cmd_report}.get(a[0], lambda: print(__doc__))()
|
||||
Loading…
Add table
Reference in a new issue