[HN Gopher] Modern SAT solvers: fast, neat and underused (2018)
       ___________________________________________________________________
        
       Modern SAT solvers: fast, neat and underused (2018)
        
       Author : weird_user
       Score  : 108 points
       Date   : 2023-05-26 17:50 UTC (5 hours ago)
        
 (HTM) web link (codingnest.com)
 (TXT) w3m dump (codingnest.com)
        
       | api wrote:
       | Does't Rust use a SAT solver for aspects of its type system?
        
       | tgamblin wrote:
       | Love this article and the push to build awareness of what modern
       | SAT solvers can do.
       | 
       | It's worth mentioning that there are higher level abstractions
       | that are _far_ more accessible than SAT. If I were teaching a
       | course on this, I would start with either Answer Set Programming
       | (ASP) or Satisfiability Modulo Theories (SMT). The most widely
       | used solvers for those are clingo [0] and Z3 [1]:
       | 
       | With ASP, you write in a much clearer Prolog-like syntax that
       | does not require nearly as much encoding effort as your typical
       | SAT problem. Z3 is similar -- you can code up problems in a
       | simple Python API, or write them in the smtlib language.
       | 
       | Both of these make it easy to add various types of optimization,
       | constraints, etc. to your problem, and they're much better as
       | modeling languages than straight SAT. Underneath, they have
       | solvers that leverage all the modern CDCL tricks.
       | 
       | We wrote up a paper [2] on how to formulate a modern dependency
       | solver in ASP; it's helped tremendously for adding new types of
       | features like options, variants, and complex compiler/arch
       | dependencies to Spack [3]. You could not get good solutions to
       | some of these problems without a capable and expressive solver.
       | 
       | [0] https://github.com/potassco/clingo
       | 
       | [1] https://github.com/Z3Prover/z3
       | 
       | [2] https://arxiv.org/abs/2210.08404,
       | https://dl.acm.org/doi/abs/10.5555/3571885.3571931
       | 
       | [3] https://github.com/spack/spack
        
         | BorisTheBrave wrote:
         | Do you have a recommendation for how to get into ASP? I've read
         | the clingo docs, but it has never clicked.
        
       | comfypotato wrote:
       | But what do you mean "fast"? If your problem ends up on the steep
       | side of the exponential curve, it's going to take a while to
       | solve.
       | 
       | I had a lot of fun making my own CDCL solver in Rust, and I've
       | really enjoyed messing with Z3 for some theoretical computer
       | science. On all of my explorations, there was a very tangible
       | problem size beyond which the solve time was unusable.
       | 
       | In the case of Z3 with most real world problems, the typical
       | problem size is beyond this limit.
        
         | xavxav wrote:
         | Z3 is actually not a particularly good SAT solver, you really
         | want to use a dedicated tool for pure SAT problems. On the
         | other hand if your problem is in a richer class like QBF or SMT
         | then z3 shines and often you can use encoding tricks to scale
         | problems significantly
        
       | hackandthink wrote:
       | Compiling Scala without a SAT solver is probably too difficult.
       | 
       | The CNF Converter is a gem.
       | 
       | https://github.com/scala/scala/blob/v2.13.5/src/compiler/sca...
        
       | wenc wrote:
       | Conda uses a SAT solver. It is still very slow on degenerate
       | cases and I'm not sure if work to replace it with Microsoft's SAT
       | solver has started.
       | 
       | https://www.anaconda.com/blog/understanding-and-improving-co...
        
       | jjoonathan wrote:
       | I seem to recall that a poorly scaling sat solver in conda-forge
       | broke so badly in 2020 that it shifted the tectonic plates
       | underneath the entire academic python ecosystem away from conda
       | and towards pip.                   Solving Environment | / - | \
        
         | notatallshaw wrote:
         | Also there had been a growing trend for most popular packages
         | to offer precompiled wheels on PyPI instead of just sdist
         | releases.
         | 
         | This meant that people who had moved to Conda because they
         | couldn't get Pip to install important packages into their
         | environment took another look and found that actually they
         | could get things installed using Pip now.
         | 
         | At the same time Pip also got a resolver allowing you to have
         | install time confidence you're not installing conflicting
         | package, and recently (Pip 23.1+) the resolver's backtracking
         | got pretty good.
         | 
         | That said Conda mostly solved this (and once mamba is the
         | default resolver engine things will be really fast), Pip is not
         | ever going to be a package manager, and Poetry still isn't an
         | environment manager, and most other Python package/installer
         | alternatives to Conda won't do things like install your
         | Jupyterlab's nodejs dependency.
         | 
         | After many years I now almost exclusively use Pip to install
         | into an environment, but still nothing beats Conda for
         | bootstraping the non-Python-package requirement's (such as
         | Python itself) nor for getting things working when you are in a
         | weird environment that you can't install OS dev libraries into.
        
         | rowanG077 wrote:
         | Great! Conda honestly can't die fast enough.
        
           | Macuyiko wrote:
           | Curious to hear about your preferred alternative. Poetry?
        
             | fock wrote:
             | spack
        
             | rowanG077 wrote:
             | Poetry, pip, nix or sending out butterflies to bend cosmic
             | rays to write bits into memory. It really doesn't matter as
             | long as it's not the hellscape that is conda.
        
         | teruakohatu wrote:
         | Conda is still unbearably slow. Mamba is a vastly better mostly
         | drop-in replacement.
        
           | ubj wrote:
           | Second this. Not only is it faster, but the error messages in
           | Mamba are much more helpful and sane.
        
         | taeric wrote:
         | That was always a bit of a red herring, from my understanding.
         | Yes, if you poorly model something into an ad hoc SAT solver,
         | expect slowness.
         | 
         | Which is a bit of the general idea of these being underused. If
         | you can get your problem into a SAT form or three, than feed it
         | to a state of the art solver, it can work amazingly well. But,
         | you will be spending a lot of time moving to and from the SAT
         | formulation.
        
           | theLiminator wrote:
           | Do you know of any python dependency managers that do this?
        
             | taeric wrote:
             | I don't. That said, I think the problems are typically
             | small enough that you don't gain much by hunting for a good
             | SAT formulation? Python doesn't do anything that any other
             | dependency manager does. (Does it?)
        
               | nemetroid wrote:
               | DNF uses a SAT solver. It's even listed first among the
               | motivations for creating DNF:
               | 
               | > DNF is a fork of Yum 3.4 that uses libsolv via hawkey
               | for a backend. The main goals of the project are:
               | 
               | > * using a SAT solver for dependency resolving
               | 
               | > ...
               | 
               | https://fedoraproject.org/wiki/Features/DNF
        
             | beecafe wrote:
             | https://github.com/mamba-org/mamba
        
         | klodolph wrote:
         | From this and Dart, I think one of the lessons here is that SAT
         | solvers are the wrong technique for solving dependencies. SAT
         | solvers find "better" solutions by some metric, but humans
         | using package managers want something which is both simpler and
         | faster.
        
           | nyrikki wrote:
           | As an example:
           | 
           | Schaefer's dichotomy theorem shows that, when possible, just
           | make sure to use Horn clauses when possible.
           | 
           | Takes a bit of thinking but is superior to huristics or SAT
           | solvers if you can refactor to allow for it.
        
             | xavxav wrote:
             | Wait, this is very relevant to some work I've been doing
             | recently, how do you conclude that Horn clauses should be
             | preferred from Schaefer's theorem?
        
               | Karrot_Kream wrote:
               | Take a look at https://en.wikipedia.org/wiki/Boolean_sati
               | sfiability_problem... (based on Schaefer's "The
               | complexity of satisfiability problems"). Horn clause
               | satisfiability problems (HORN SAT) fall in P-c.
        
               | thomasahle wrote:
               | Isn't it just that Horn clauses are easy to understand,
               | and they are guaranteed to be fast.
        
             | weavermarquez wrote:
             | Not sure if related, to Schaefer's theorem, but I dove into
             | Answer Set Programming [1] recently, which follows this
             | approach, enabling the use of fast-ish SMT solvers, which
             | are a _generalization_ of SAT solvers! Boolean
             | /Propositional Logic is to Predicate Logic as SAT is to
             | SMT. There's a very nice course about it from the
             | developers of Potassco, one of the best open source Answer
             | Set Programming framework [2].
             | 
             | The syntax looks like Prolog, but predicate negations are a
             | first class citizen, avoids infinite loops.
             | 
             | Prolog's approach is like a depth first search through a
             | search tree -- ASP is like a nondeterministic turing
             | machine, exploring all branches simultaneously from the
             | bottom up.
             | 
             | [1] https://en.wikipedia.org/wiki/Answer_set_programming
             | 
             | [2] https://www.youtube.com/playlist?list=PL7DBaibuDD9O4I05
             | DiQfi...
        
       | c0balt wrote:
       | Just wanted to shoutout Armin Biere, one of the top contributors
       | in this field: https://github.com/arminbiere
       | 
       | He has a few open source SAT solvers and tooling that provide
       | good and proven examples on modern SAT solver techniques.
        
       | joko42 wrote:
       | There was a time when people thought SAT and formal logic is the
       | way to building AI. Now you don't hear anything about it. I
       | wonder what happened?
        
         | jasonwatkinspdx wrote:
         | The "AI Winter" was largely caused by people realizing building
         | better logic, chess, or similar analytical engines proves to be
         | a poor model for human like intelligence. The current
         | renaissance is due to Machine Learning / Deep Learning based
         | essentially on statistical models.
         | 
         | In the specific context of language there was a famous debate
         | between Chompsky and Norvig that touches on these themes:
         | http://norvig.com/chomsky.html
         | 
         | I believe events of recent years have not been kind to
         | Chompsky's side of this debate. I'm less bullish on large
         | language models turning into AGI than many people here, but I
         | think if we do develop AGI it's a certainty it will be a based
         | on probabilistic models, not logically consistent formalisms
         | alone.
        
         | yarg wrote:
         | It requires large amounts of formalised and human defined
         | domain specific knowledge, for every domain that you work with.
         | 
         | The overheads are huge, and it's very bad at dealing with fuzzy
         | situations.
        
         | [deleted]
        
       | justicz wrote:
       | I really love the clarity + practicality of this article. Super
       | well-written.
        
       | CalChris wrote:
       | > ... modern SAT solvers are fast, neat and criminally underused
       | by the industry.
       | 
       | Modern SAT solvers are fast, neat and criminally _undertaught_ by
       | the universities. Seriously, why isn 't this taught at the
       | undergraduate level in CS70 [1] discrete math type courses or
       | CS170 [2] analysis of algorithms type courses?
       | 
       | [1] https://www2.eecs.berkeley.edu/Courses/CS70/
       | 
       | [2] https://www2.eecs.berkeley.edu/Courses/CS170/
        
         | tanx16 wrote:
         | This is... not true. CS170 specifically teaches about reducing
         | NP problems to SAT (you can find this in the Algorithms
         | textbook linked in the class syllabus). I recall solving one of
         | the projects by using MiniSat after converting a problem to
         | 3-SAT. FWIW, the textbook is excellent and the course was very
         | useful.
        
           | dataflow wrote:
           | To clarify, you're specifically talking about reductions _to_
           | SAT, not _from_ SAT, right?
           | 
           | Note the former is used as a solution technique for feeding
           | into SAT solvers, where the latter's goal is basically the
           | exact opposite (to show NP-hardness and hence algorithmic
           | intractability). Formal methods courses do the former, but
           | algorithms courses usually use SAT for the latter.
        
           | [deleted]
        
           | tgamblin wrote:
           | I definitely recall doing reductions to SAT in Algorithms
           | courses. I think that is a common part of most curricula.
           | 
           | I don't recall being taught any practical _uses_ of SAT. It
           | was introduced only in the context of Cook 's theorem, as the
           | problem you needed to reduce other problems to in order to
           | show NP-completeness.
           | 
           | I think most people now learn SAT in that theoretical
           | context, not as a tool to solve problems.
        
             | dataflow wrote:
             | > I definitely recall doing reductions to SAT in Algorithms
             | courses.
             | 
             | > It was introduced only in the context of Cook's theorem,
             | as the problem you needed to reduce other problems to in
             | order to show NP-completeness.
             | 
             | Are you referring to reductions _from_ SAT, or _to_ SAT?
             | You seem to be mentioning both?
        
           | [deleted]
        
         | PartiallyTyped wrote:
         | Both my Alma Maters had courses that used these extensively,
         | and also planners like (Pl|Tr|L)ingeling. We also covered
         | reducability and SAT in multiple courses in both.
         | 
         | These should also be taught in an advanced PL course, e.g
         | liquid, dependent etc types.
        
         | [deleted]
        
         | lower wrote:
         | I used to teach formal methods at university, including a
         | course with a lot of SAT examples. We tried to make it as
         | practical as possible, with many examples and exercises in Java
         | (where you just generate your formulas and call a solve
         | method). Thing is, most students seemed to hate it
         | passionately, just like with reductions to SAT in complexity
         | theory.
        
           | _0ffh wrote:
           | I wrote a bespoke backtracking solver for a specific class of
           | problems. Would love to use Z3 or something, but frankly, I
           | wouldn't know how to systematically translate problem
           | instances to solver constraints. It's essentially a kind of
           | very complex job-shop scheduling problem with lots of dynamic
           | inter-dependencies. Many of the problems are hard to even
           | solve without dead-locking, while we also naturally strive to
           | minimize overall processing time. Where would I find
           | ressources to help me get a grip on my specific problem [1]?
           | Could I reasonably hope that Z3 or another general solver
           | might be faster than a moderately well designed bespoke
           | solver in a compiled language?
           | 
           | [1] Some of the constraints: Input goods must be transformed
           | through a complex series of assembly/machining/processing
           | lines to output goods; each line transforms one or two inputs
           | into an (intermediary or end-) product; an assembly line
           | produces it's product in a fixed number of time units and
           | cannot be stopped or delayed; finished intermediary products
           | arrive at the end of an assembly line, which must be cleared
           | by then; there are a limited number of temporary storage
           | spaces where intermediary products can be moved to/from in a
           | fixed number of time units; some assembly lines must wait for
           | two intermediary products to be completed to start a job
           | combining them into another intermediary or end product; end
           | products must then be moved to their destinations.
        
             | travisjungroth wrote:
             | The pdf linked on this site is the biggest collection of
             | SMT examples I know of: https://sat-smt.codes/
             | 
             | I'm no SMT expert, but the way I've done it is to make some
             | representation in Python Z3, and then write some function
             | or class that generates those. I was solving MLB
             | eliminations (more complex than it sounds) and I think I
             | used arrays of ints for number of wins. So I'd pull MLB
             | data, turn that into schedule objects which turned
             | themselves into z3 constraints.
        
           | layer8 wrote:
           | What example use-cases did you use? Just curious.
        
       | fsckboy wrote:
       | SAT? I had to look it up, so...
       | 
       | Boolean satisfiability problem
       | 
       | https://en.wikipedia.org/wiki/Boolean_satisfiability_problem
       | 
       | "In logic and computer science, the Boolean satisfiability
       | problem (sometimes called propositional satisfiability problem
       | and abbreviated SATISFIABILITY, SAT or B-SAT) is the problem of
       | determining if there exists an interpretation that satisfies a
       | given Boolean formula. In other words, it asks whether the
       | variables of a given Boolean formula can be consistently replaced
       | by the values TRUE or FALSE in such a way that the formula
       | evaluates to TRUE."
        
         | hackernewds wrote:
         | Ah I thought initially that these were solving SAT questions.
         | Easy to make mistake, or perhaps just me.
        
           | balls187 wrote:
           | No, I also had no idea about this type of problem and
           | immediately thought this article was about the placement
           | tests administered in the US.
        
       | yarg wrote:
       | Has there been any effort to formalise the subset of NP that
       | lends itself to SAT resolution (is there something between x^n
       | and n^x)?
       | 
       | For example, what are the defining characteristics of a graphs
       | for which the travelling salesman problem is resolvable without
       | resorting to brute force?
        
       | abecedarius wrote:
       | FWIW, here's a little console-mode puzzle game of SAT problems,
       | if you want to solve some manually. The "board" is not exactly
       | like the example table in the post, since that one was for Sudoku
       | in particular. This grid represents variables as rows and clauses
       | as columns.
       | 
       | https://github.com/darius/sturm/blob/master/satgame.py (Python 2)
        
       ___________________________________________________________________
       (page generated 2023-05-26 23:00 UTC)