# Исследование алгоритма разрешения зависимостей в ALT RPM ## Замысел и структура статьи Статья будет как решение одной формальной задачи. В ALT RPM пакет-потребитель задаёт множество требуемых символов $R$ (`Requires`), а пакет-поставщик - множество предоставляемых символов $P$ (`Provides`). Зависимость выполнима тогда и только тогда, когда $$ R \subseteq P. $$ Явное перечисление тысяч ELF-, Python- и файловых символов раздувает RPM-метаданные, поэтому множества представлены компактными set-строками. ## 1. Постановка задачи и данные ALT Linux Ввести обозначения для bpp(b), множеств, хэш функций(H), длин строк и т.д. Проверяемое программой условие имеет вид $$ H_b(R)\subseteq H_b(P). $$ Отмечаем вероятностную природу: из $R\subseteq P$ следует $H_b(R)\subseteq H_b(P)$, поэтому коллизия не создаёт ложного отказа. Обратное неверно: отсутствующий символ может совпасть по хешу с символом из $P$ и дать ложное принятие зависимости. (Представить данные ниже табличкой) Привести срез Sisyphus `x86_64 + noarch`: 47 367 пакетов, 14 761 `Provides`-отношение и 68 857 `Requires`-отношений. Для 68 198 реально сопоставимых пар медианы равны $p=480$, $r=13$, $p/r=28.1$; p75 - 1886, 37 и 80; p90 - 6219, 104 и 257. В 92.4% пар выполняется $p/r\ge 4$. Это к теме, почему рассматриваем разреженные множества. ## 2. Устройство существующей `set:`-строки Даём схему формата: ``` массив строк | (Jenkins OAAT) v массив хэшей | (qsort) v отсортированный массив хэшей | (вычисление разницы между элементами) v массив delta | (Rice-Golomb преобразование) v битовый массив | (base62 преобразование) v set-строка ``` Нужно отдельно разобрать заголовок, диапазоны `bpp` и `Mshift`, внешний префикс `set:` и роль Base62: строка должна оставаться допустимым токеном версии RPM. Полезна небольшая иллюстрация на 5-8 символах: исходные имена, хеши, отсортированный массив, дельты, биты кода и итоговая строка. Но. Это много альт-специфики, может настолько глубоко не стоит (хотя и не очень глубоко) ### 2.1. Хеширование и вероятность коллизий ! Всё ещё нет нормального анализа коллизий Текущий код использует 32-битный Jenkins OAAT и оставляет $b$ бит. Для модели равномерного независимого хеширования ожидаемое число столкнувшихся пар среди $n$ различных символов равно (будет мудрёная формула, теория) В статье формулы дополняем разными табличками по реальным данным из Sisyphus: распределения $p,r,b$, ожидаемые коллизии, реальные. (Другие хэши идут далее) ### 2.2. Кодирование Golomb-Rice Для отсортированных значений $0\le x_1<\dots