Analiziran je CDCL-based SAT rešavač napisan u Python-u, koji rešava SAT problem koristeći CDCL (Conflict-Driven Clause Learning) algoritam.
- Originalni repozitorijum: https://github.com/thtran97/CDCL-based-SAT-Solver
- Grana:
main - Commit:
e61ba5d2d6c74760386c20d27f0c0f428aaafdc2
Rešavač je dodat kao git submodul u folderu CDCL-based-SAT-Solver.
Detaljan opis analize i rezultati svakog korišćenog alata nalaze se u fajlu ProjectAnalysisReport.md.
Projekt je urađen u okviru kursa Verifikacija softvera na Matematičkom fakultetu, Univerzitet u Beogradu.
Primer pokretanja programa iz korena repozitorijuma:
python3 CDCL-based-SAT-Solver/main.py -i putanja_do_ulaznog_fajla.cnfProgram prima .cnf fajl u DIMACS formatu kao ulaz. Primeri ulaznih fajlova nalaze se u folderu tests/integration.
pip install pytest
chmod +x integration_testing/run_integration_tests.sh
./integration_testing/run_integration_tests.shpip install pytest
chmod +x unit_testing/run_unit_tests.sh
./unit_testing/run_unit_tests.shpip install pytest-cov
chmod +x coverage/run_coverage.sh
./coverage/run_coverage.shpip install pylint
chmod +x pylint/run_pylint.sh
./pylint/run_pylint.shpip install radon
chmod +x radon/run_radon.sh
./radon/run_radon.shpip install pyprof2calltree
brew install qcachegrind # Mac
# sudo apt install kcachegrind # Linux
chmod +x profiling/run_profiling.sh
./profiling/run_profiling.shpip install pytest-benchmark
chmod +x benchmark_testing/run_benchmark.sh
./benchmark_testing/run_benchmark.shpip install black
chmod +x code_formatting/run_formatting.sh
./code_formatting/run_formatting.sh- Rešavač ispravno rešava SAT i UNSAT formule, što je potvrđeno integracionim i jediničnim testovima sa ukupnom pokrivenošću od 93%.
- Tokom jediničnog testiranja otkrivena je nepravilnost u klasi
Clause- prilikom preprocesiranja tautološke klauze veličina se postavlja na 0, ali je konstruktor naknadno prepisuje dužinom niza, čime se ispravka gubi. - Analizom pokrivenosti koda otkrivena je nedostižna grana
elif x > m2u metodiget_backtrack_levelklaseClause- program iterira nadsetkolekcijom u rastućem redosledu za cele brojeve, pa ta grana nikada ne može biti izvršena. - Glavna metoda
CDCL_Solver.solveima izuzetno visoku ciklomatsku složenost (ocena E, vrednost 35), što otežava testiranje i održavanje. - Profajliranje je pokazalo da
lazy_clause.bcpdominira vremenom izvršavanja - svako poboljšanje ove funkcije direktno bi ubrzalo ceo rešavač. - Benchmark testiranje je potvrdilo da
large_unsat(100 promenljivih, 160 klauza) traje značajno duže odlarge_sat(20 promenljivih, 91 klauza) - 107ms naspram 10ms. Ovo je posledica i razlike u veličini formule i same prirode UNSAT problema, gde rešavač mora da istraži ceo prostor pretrage pre nego što donese zaključak. - Pylint je otkrio nekorišćene importe (
numpy,random,Lazy_Clause) i brojne stilske greške koje su automatski ispravljene primenom alata Black. - Fajlovi
cnf_data_structure.pyidpll_solver.pyiz originalnog projekta nisu korišćeni i trebalo bi ih obrisati.
Staša Đorđević 1007/2025