я профилированный мои проблемы, которые в (псевдо-нелинейном) целом реального фрагмента с использованием профилировщиком дргиХ (статистика here включая граф вызовов) и пытаюсь выделить время, затрачиваемое на два класс:Как оценить время, затрачиваемое на решение SAT в z3 для SMT?
I) Часть решения SAT (в том числе [чисто] булево распространение и [чисто] логическое определение конфликтной ситуации, обратное смещение, любая другая пропозициональная манипуляция)
II) Часть решения теории (включая проверку согласованности теории, создание теоретических коллизионных предложений и теория распространения).
Действительно ли линии 3280-3346 в smt_context.cpp в пределах bounded_search()
составляют верхний уровень цикла DPLL (X)?
Я считаю, что проще всего подытожить время в функциях решателя SAT (поскольку их меньше) , а затем остальное можно рассматривать как время решателя теории. Я пытаюсь выяснить, какие функции я должен рассматривать как подпадающие под класс I выше? Являются ли они smt::context::decide()
, smt::context::bcp()
в пределах smt::context::propagate()
? Любые другие? smt::context: resolve_conflict()
, похоже, смешивается с вызовами теории решателя?
Правильно ли это, что smt::context::propagate()
является главным образом распространением теории (класс II), за исключением его функции bcp()
? Кроме того, smt::context::final_check()
, кажется, чисто в классе II.
Любые советы приветствуются. Благодарю.
Пояснение: 'smt :: conflict_resolution :: solve' - часть изучения лемм, о которой вы упомянули (в части SAT) и' smt :: context :: pop_scope_core() 'делает дорогостоящий откат в теории решателей , правильно? – user1779685
Да, это правильно. –