Giter Site home page Giter Site logo

Багрепорт about recompression HOT 41 OPEN

TonitaN avatar TonitaN commented on August 16, 2024
Багрепорт

from recompression.

Comments (41)

Postlog avatar Postlog commented on August 16, 2024 1

Вот и проблема обнаружилась, я на отдельные элементы ограничения не накладывал, обидно(

from recompression.

TonitaN avatar TonitaN commented on August 16, 2024

Случай

X≠bX and Y≠ε and X≠ε and Y≠bY
PairComp(a, b) -> a₁
XYcYX=a₁ca₁

Нужно усилить эвристику, чтобы учитывалось, что длина X и Y больше 0, раз они непусты, и в целых числах тогда уравнение на совокупные длины левой и правой части не решится.

from recompression.

Postlog avatar Postlog commented on August 16, 2024

Баг исправил, над усилением эвристики поработаю

from recompression.

TonitaN avatar TonitaN commented on August 16, 2024

Эвристику нужно доделать, иначе разбор взрывается в конце, когда строка уже очень короткая.

from recompression.

TonitaN avatar TonitaN commented on August 16, 2024
X=cX and (X≠Xa₁ or Y≠cY)
PairComp(a₁, c) -> a₂
Za₂XYa₂X=a₂a₁

Почему разбор этого узла продолжился? Должна была сработать эвристика по a2.

from recompression.

TonitaN avatar TonitaN commented on August 16, 2024

И по каждой константе делать свою модель не нужно, объедините их в одну с разными переменными для учета разных констант. Должно получиться быстрее (если нашлась неудача хотя бы по одной букве, то сразу будет unsat).

from recompression.

TonitaN avatar TonitaN commented on August 16, 2024

+нужно заменить полный перебор пустых-непустых значений на перебор по критерию, указанному в ТЗ и в отчете @affeeal

Этот полный перебор добавляет дополнительный этаж в башню экспонент.

from recompression.

Postlog avatar Postlog commented on August 16, 2024

@TonitaN скиньте пожалуйста сопоставление на котором что-то пошло не так

from recompression.

TonitaN avatar TonitaN commented on August 16, 2024

ZbXYbX=abcab

from recompression.

TonitaN avatar TonitaN commented on August 16, 2024

Проблема с моделями видна с первого же запуска to_smt2()

(set-info :status unknown)
(declare-fun |Zc₂| () Int)
(declare-fun |Za₁| () Int)
(declare-fun Zb () Int)
(assert
 (let ((?x100 (+ (+ Zb |Za₁|) |Zc₂|)))
 (>= ?x100 0)))
(assert
 (= 0 (+ 1 Zb)))
(assert
 (= 1 (+ 1 |Za₁|)))
(assert
 (let ((?x19 (+ 0 |Zc₂|)))
 (= 1 ?x19)))
(check-sat)

Здесь противоречие не определяется, а потому что нигде не сказано, что значения всех переменных должны быть больше либо равны нулю. Нужно вернуть эту рестрикцию + добавить рестрикции, проверяющие, что части уравнения не начинаются с разных констант и не кончаются разными константами.

from recompression.

Postlog avatar Postlog commented on August 16, 2024

Я правильно понял, что в модель нужно добавлять помимо Ya+Yb+... > 0 еще и ограничения по каждой отдельный переменной, т.е. Ya > 0, Yb > 0 итд?

from recompression.

TonitaN avatar TonitaN commented on August 16, 2024

Не >, а только >=, иначе будет та же проблема, которую вы обнаружили.

from recompression.

Postlog avatar Postlog commented on August 16, 2024

image

Но ведь в вашем примере >

from recompression.

TonitaN avatar TonitaN commented on August 16, 2024

> у суммы, а у каждого из элементов суммы именно >=
Т.к. y=ya+yb+yc

from recompression.

TonitaN avatar TonitaN commented on August 16, 2024

Чуть аккуратнее бы смотрели в z3, были бы аттестованы сегодня...
Теперь проявляйте чудеса убедительности с Захаровым и заодно доделывайте прочие фиксы.

from recompression.

Postlog avatar Postlog commented on August 16, 2024

На ветке empty_substs лежит реалзиация, в рамках которой пустые подстановки не полностью перебираются, а выбираются исходя из правил

from recompression.

TonitaN avatar TonitaN commented on August 16, 2024

Вполне закономерный фейл на XXYX=abcab. В принципе, должна дойти до ситуации, где только отрицательные условия и уравнение вида XXYX=c_1000 (одна буква справа), после чего применить эвристику насчёт переменной кратности 1. Но что-то пошло не так.

from recompression.

TonitaN avatar TonitaN commented on August 16, 2024

Следующий пример
ZbXYbX=abcab
зачем-то ветвится по вариантам сжатых пар. Сжатие одно, и в принципе здесь по эвристикам всего один вариант распределения значений на втором шаге.

from recompression.

TonitaN avatar TonitaN commented on August 16, 2024

Вот две эвристики Z!=Zc и Z!=Xc OR Y=a_4Y должны попасть в одно и то же состояние, т.к. каждая из них порождает лишнюю букву c_16. И если уж сжатие по паре ca_4, то оно по всем ветвям должно делаться, а по первой ветви делается обратное.

from recompression.

Postlog avatar Postlog commented on August 16, 2024

from recompression.

TonitaN avatar TonitaN commented on August 16, 2024

Не должно быть двух разных ограничений по разным ветвям, должна быть их конъюнкция.

from recompression.

TonitaN avatar TonitaN commented on August 16, 2024

И по первой ветви вообще другое сжатие.

from recompression.

TonitaN avatar TonitaN commented on August 16, 2024

XXYX=abcab считается очень долго по ветви empty_substs (по main намного быстрее). Хотя там всего 3 сжатия до буквы и почти все варианты, кроме отрицательного, должны отваливаться по эвристикам. И то, что по допветви такой огромный перебор, что я ни разу не смогла дождаться результата, означает, что там что-то пошло не так.

from recompression.

Postlog avatar Postlog commented on August 16, 2024

Не должно быть двух разных ограничений по разным ветвям, должна быть их конъюнкция.

Видимо я не до конца понял главу 6 "Извлечение пар в Pair
Comp" из тз Ильи. После построения прямых произведений, одинаковые подстановки нужно объединять в единую опцию (объединяя при этом рестрикции)?

Я разобрал данный пример:
IMG_0080

Получились отдельные опции:

  1. Y = Yc & Z != Zc
  2. Y = Yc & (X != Xc || Y != aY)

Необходимо все опции такого вида объединять между собой (отбрасывая противоречивые)?

from recompression.

Postlog avatar Postlog commented on August 16, 2024

И по первой ветви вообще другое сжатие.

А в чем тут проблема? Нам выгодно сжать как ac так и ca, поэтому рассматриваются оба сжатия

from recompression.

TonitaN avatar TonitaN commented on August 16, 2024

Необходимо все опции такого вида объединять между собой (отбрасывая противоречивые)?

Если смотреть пример в ТЗ, то там рассматривался похожий разбор случаев, за одним важным различием: там два случая были уже композициями подстановок. Т.е. на самом деле у вас должны были быть последовательно два разбора:
1-1. Z=Zc
1-2. Z!=Zc
2-1. Y=Yc
2-2. Y!=Yc
3-1. X=Xc & Y=aY
3-2. X!=Xc V Y!=aY
Все подстановки независимые, поэтому получаются произведения:
(1-1)(2-1)(3-1)
(1-1)(2-1)(3-2)
...
(1-2)(2-2)(3-2)

По-умному, следовало бы ограничить выбор подстановок, порождающих новую букву, сверху сразу же числом таких букв в константной части, чтобы не мучить z3. То есть тут выбирается строго одна из 1-1, 2-1, 3-1, и потом уже 3-1 отваливается по эвристике подсчёта других букв.

По-глупому, рассматривать вообще все комбинации.

from recompression.

TonitaN avatar TonitaN commented on August 16, 2024

И по первой ветви вообще другое сжатие.

А в чем тут проблема? Нам выгодно сжать как ac так и ca, поэтому рассматриваются оба сжатия

А в том, что сжатия делаются последовательно, одно за другим. Если сжимаете ac, то вы уже укорачиваете константную часть, и решение будет лишь в том случае, если после сжатия оно есть. Зачем же ещё и избыточно рассматривать другой путь решения, который даст ту же самую информацию?

from recompression.

Postlog avatar Postlog commented on August 16, 2024

Зачем же ещё и избыточно рассматривать другой путь решения, который даст ту же самую информацию?

Вот тут я совсем потерялся. Получается если нам на очередной итерации выгодно сжать несколько пар, то мы можем спокойно рассматривать лишь одну из них? Не может ли быть такого, что сжатие по другой паре даст другой ответ?

from recompression.

Postlog avatar Postlog commented on August 16, 2024

По-глупому, рассматривать вообще все комбинации

Значит нужно рассматривать все возможные комбинации не ПАР опций, а комбинации из n опций, где n = исходное число существенных элементарных и композиционных подстановок?

from recompression.

TonitaN avatar TonitaN commented on August 16, 2024

Зачем же ещё и избыточно рассматривать другой путь решения, который даст ту же самую информацию?

Вот тут я совсем потерялся. Получается если нам на очередной итерации выгодно сжать несколько пар, то мы можем спокойно рассматривать лишь одну из них? Не может ли быть такого, что сжатие по другой паре даст другой ответ?

Такого быть не может, потому что сжатия не теряют решения. Так что да, спокойно рассматриваем только одну пару для сжатия за один шаг.

from recompression.

TonitaN avatar TonitaN commented on August 16, 2024

По-глупому, рассматривать вообще все комбинации

Значит нужно рассматривать все возможные комбинации не ПАР опций, а комбинации из n опций, где n = исходное число существенных элементарных и композиционных подстановок?

Да, слово "прямое произведение" в ТЗ можно было действительно понять как "прямое произведение пар", однако подразумевается прямое произведение в n-ки, что, кстати, и сделано в реализации Ильи (если посмотрите, как вызывается прямое произведение опций - там цикл по произведению пар).

from recompression.

Postlog avatar Postlog commented on August 16, 2024

Вроде исправил...

from recompression.

TonitaN avatar TonitaN commented on August 16, 2024

Стало адекватнее. Но теперь расщепляет на слишком много случаев. Пример:

XYX = abcab
compress(a,b)->c
X=Xa & Y=bY (1-1)
X!=Xa v Y!=bY (1-2)
Y=Ya & X=Xb (2-1)
Y!=Ya v X!=Xb (2-2)

По факту остаётся с учётом эвристик префиксов-суффиксов только (1-2)*(2-2): (X!=Xa v Y!= bY) & (Y!=Ya v X!=Xb). И дальше он зачем-то преобразуется в ДНФ и превращается в 4 ветви только с конъюнкциями, а можно же было оставить всю указанную КНФ целиком, и разбора бы не было.

from recompression.

Postlog avatar Postlog commented on August 16, 2024

Такое поведение я заложил изначально исходя из утверждения что более одной дизъюнкции в рестрикциях быть не может. Получается может, и рестрикции вида (... v ...) & (... v ...) - норма?

from recompression.

Postlog avatar Postlog commented on August 16, 2024

Имеет ли в таком случае смысл их преобразовывать к виду (... & ...) v (... & ... ) v ... для более простой обработки рестрикций?

from recompression.

TonitaN avatar TonitaN commented on August 16, 2024

КНФ (а это именно она) ничем не хуже, чем ДНФ. Примерно одинаково просто обрабатываюьтся.

from recompression.

Postlog avatar Postlog commented on August 16, 2024

Есть ли еще какие-либо проблемы, которые мне стоит поправить?

from recompression.

TonitaN avatar TonitaN commented on August 16, 2024

Нужно сделать ключ запуска с эвристикой z3 и без неё, для более удобного сбора статистики.

from recompression.

TonitaN avatar TonitaN commented on August 16, 2024

В целом реализация ок даже с такой обработкой рестрикций.

from recompression.

Postlog avatar Postlog commented on August 16, 2024

Со вчерашнего вечера пытаюсь избавиться от преобразования КНФ в ДНФ и разбиения на ветви, но я код писал с сильным упором на то, что среди рестрикций может быть лишь одна дизъюнкция, поэтому задача оказалась не столь тривиальной и я скорее всего не успею сделать это до 17:30.

Добавил флаги для запуска, обновил ридми

from recompression.

TonitaN avatar TonitaN commented on August 16, 2024

Как уже писала, в принципе и так работает. Аккуратно проверьте последние изменения перед вливанием на максимуме тестов.

from recompression.

Related Issues (1)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.