;;; GNU Guix --- Functional package management for GNU ;;; Copyright © 2022, 2023 Liliana Marie Prikler <liliana.prikler@gmail.com> ;;; Copyright © 2023 Simon Tournier <zimon.toutoune@gmail.com> ;;; Copyright © 2023 David Elsing <david.elsing@posteo.net> ;;; Copyright © 2024 Ricardo Wurmus <rekado@elephly.net> ;;; ;;; This file is part of GNU Guix. ;;; ;;; GNU Guix is free software; you can redistribute it and/or modify it ;;; under the terms of the GNU General Public License as published by ;;; the Free Software Foundation; either version 3 of the License, or (at ;;; your option) any later version. ;;; ;;; GNU Guix is distributed in the hope that it will be useful, but ;;; WITHOUT ANY WARRANTY; without even the implied warranty of ;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ;;; GNU General Public License for more details. ;;; ;;; You should have received a copy of the GNU General Public License ;;; along with GNU Guix. If not, see <http://www.gnu.org/licenses/>. (define-module (gnu packages potassco) #:use-module ((guix licenses) #:prefix license:) #:use-module (gnu packages) #:use-module (guix gexp) #:use-module (guix packages) #:use-module (guix download) #:use-module (guix git-download) #:use-module (guix gexp) #:use-module (guix utils) #:use-module (guix build-system cmake) #:use-module (guix build-system emacs) #:use-module (guix build-system python) #:use-module (guix build-system pyproject) #:use-module (gnu packages check) #:use-module (gnu packages cpp) #:use-module (gnu packages graphviz) #:use-module (gnu packages libffi) #:use-module (gnu packages pkg-config) #:use-module (gnu packages python) #:use-module (gnu packages python-build) #:use-module (gnu packages python-web) #:use-module (gnu packages python-xyz) #:use-module (gnu packages sphinx)) (define-public libpotassco ;; No public release, update together with clasp (let ((revision "1") (commit "2f9fb7ca2c202f1b47643aa414054f2f4f9c1821")) (package (name "libpotassco") (version (git-version "0.0" revision commit)) (source (origin (method git-fetch) (uri (git-reference (url "https://github.com/potassco/libpotassco") (commit commit))) (file-name (git-file-name name version)) (modules '((guix build utils))) (snippet #~(begin (delete-file "tests/catch.hpp") (substitute* (find-files "tests" "\\.cpp") (("\"catch.hpp\"") "<catch/catch.hpp>")))) (sha256 (base32 "1c32f9gqclf7qx07lpx8wd720vfhkjqhzc6nyy8mjmgwpmb3iyyn")))) (arguments `(#:configure-flags '("-DLIB_POTASSCO_BUILD_TESTS=on" "-DLIB_POTASSCO_INSTALL_LIB=on" "-DBUILD_SHARED_LIBS=on") #:phases (modify-phases %standard-phases (add-after 'unpack 'patch-cmake (lambda _ (substitute* "CMakeLists.txt" ;; clasp expects lowercase potassco and include directory is ;; lowercase as well, so let's use that (("\"cmake/Potassco\"") "\"cmake/potassco\"") (("PotasscoConfig\\.cmake") "potassco-config.cmake") (("PotasscoConfigVersion\\.cmake") "potassco-config-version.cmake")) (rename-file "cmake/PotasscoConfig.cmake.in" "cmake/potassco-config.cmake.in")))))) (build-system cmake-build-system) (native-inputs (list catch2-1)) (home-page "https://potassco.org/") (synopsis "Utility library for Potassco's projects") (description "@code{libpotassco} is a utility library providing functions and datatypes for @itemize @item parsing, writing, and converting logic programs in aspif and smodels format, @item passing information between a grounder and a solver, @item and defining and parsing command-line options and for creating command-line applications. @end itemize Furthermore, it comes with the tool @command{lpconvert} that converts either between aspif and smodels format or to a human-readable text format.") (license license:expat)))) (define-public clasp (package (name "clasp") (version "3.3.9") (source (origin (method git-fetch) (uri (git-reference (url "https://github.com/potassco/clasp") (commit (string-append "v" version)))) (file-name (git-file-name name version)) (sha256 (base32 "163ps9zq7xppqy9hj5qnw6z5lcjnm4xf5fwjsavpia5ynm3hngcw")))) (build-system cmake-build-system) (arguments `(#:configure-flags '("-DCLASP_BUILD_TESTS=on" "-DCLASP_INSTALL_LIB=on" "-DCLASP_USE_LOCAL_LIB_POTASSCO=off" "-DBUILD_SHARED_LIBS=on") #:phases (modify-phases %standard-phases (add-after 'unpack 'patch-cmake (lambda _ (substitute* "CMakeLists.txt" ;; Use lowercase to be consistent with libpotassco (("\"cmake/Clasp\"") "\"cmake/clasp\"") (("ClaspConfig\\.cmake") "clasp-config.cmake") (("ClaspConfigVersion\\.cmake") "clasp-config-version.cmake")) (substitute* "cmake/ClaspConfig.cmake.in" (("find_package\\(Potassco") "find_package(potassco")) (rename-file "cmake/ClaspConfig.cmake.in" "cmake/clasp-config.cmake.in")))))) (inputs (list libpotassco)) (home-page "https://potassco.org/") (synopsis "Answer set solver") (description "clasp is an answer set solver for (extended) normal and disjunctive logic programs. The primary algorithm of clasp relies on conflict-driven nogood learning, a technique that proved very successful for satisfiability checking (SAT).") (license license:expat))) (define-public clingo (package (name "clingo") (version "5.6.2") (source (origin (method git-fetch) (uri (git-reference (url "https://github.com/potassco/clingo") (commit (string-append "v" version)))) (file-name (git-file-name name version)) (modules '((guix build utils))) (snippet #~(begin (delete-file-recursively "clasp") (delete-file-recursively "third_party"))) (sha256 (base32 "19s59ndcm2yj0kxlikfxnx2bmp6b7n31wq1zvwc7hyk37rqarwys")))) (build-system cmake-build-system) (arguments (list #:configure-flags #~`("-DCLINGO_BUILD_TESTS=on" "-DCLINGO_INSTALL_LIB=on" "-DCLINGO_BUILD_STATIC=off" "-DCLINGO_BUILD_SHARED=on" "-DCLINGO_USE_LOCAL_CLASP=off" "-DCLINGO_USE_LOCAL_CATCH=off") #:phases #~(modify-phases %standard-phases (add-after 'unpack 'patch-cmake (lambda _ (substitute* "CMakeLists.txt" (("add_subdirectory\\(clasp\\)") "find_package(clasp REQUIRED)") (("add_subdirectory\\(third_party\\)") (string-append "find_package(tsl-hopscotch-map)\n" "find_package(tl-optional)\n" "find_package(mpark_variant)\n" "find_package(tsl-sparse-map)\n" "find_package(tsl-ordered-map)\n" "find_package(Catch2 3 REQUIRED)"))) (substitute* "libclingo/CMakeLists.txt" (("\"cmake/Clingo\"") "\"cmake/clingo\"") (("ClingoConfig\\.cmake") "clingo-config.cmake") (("ClingoConfigVersion\\.cmake") "clingo-config-version.cmake")) (substitute* "libgringo/CMakeLists.txt" (("mpark::variant") "mpark_variant")) (substitute* "cmake/ClingoConfig.cmake.in" (("find_package\\(Clasp") "find_package(clasp")) (rename-file "cmake/ClingoConfig.cmake.in" "cmake/clingo-config.cmake.in"))) (add-after 'unpack 'skip-failing-tests (lambda _ (with-directory-excursion "libclingo/tests" (substitute* "CMakeLists.txt" (("COMMAND test_clingo" all) (string-append all " -f " "\"${CMAKE_CURRENT_SOURCE_DIR}/good.txt\""))) (call-with-output-file "good.txt" (lambda (port) (for-each (lambda (test) (format port "~s~%" test)) '("parse-ast-v2" "add-ast-v2" "build-ast-v2" "unpool-ast-v2" "parse_term" "propagator" "propgator-sequence-mining" "symbol" "visitor")))))))))) (inputs (list catch2-3 clasp libpotassco)) (native-inputs (list mpark-variant pkg-config tl-optional tsl-hopscotch-map tsl-ordered-map tsl-sparse-map)) (home-page "https://potassco.org/") (synopsis "Grounder and solver for logic programs") (description "Clingo computes answer sets for a given logic program.") (license license:expat))) (define-public clingo-dl (package (name "clingo-dl") (version "1.4.0") (source (origin (method git-fetch) (uri (git-reference (url "https://github.com/potassco/clingo-dl") (commit (string-append "v" version)))) (file-name (git-file-name name version)) (sha256 (base32 "0dncwj63vdm6958vb7355d5j9mdr7hm037j4z82yz6l77jg3sipw")))) (build-system cmake-build-system) (arguments (list #:tests? #f ; no tests #:configure-flags #~`("-DPYCLINGODL_ENABLE=off"))) (inputs (list clingo)) (home-page "https://github.com/potassco/clingo-dl") (synopsis "Solver for answer set programs modulo difference constraints") (description "Clingo-DL is an extension to Clingo that models constraints over difference logic.") (license license:expat))) (define-public plasp (package (name "plasp") (version "3.1.1") (source (origin (method git-fetch) (uri (git-reference (url "https://github.com/potassco/plasp") (commit (string-append "v" version)))) (file-name (git-file-name name version)) (sha256 (base32 "123v1bjzh7yjwgcc5k55rkfz0lfl8ish5p3z8x3pn8k1svd50xal")) (patches (search-patches "plasp-fix-normalization.patch" "plasp-include-iostream.patch")))) (build-system cmake-build-system) (arguments (list #:tests? #f ; No ‘test’ target #:phases #~(modify-phases %standard-phases (replace 'install (lambda* (#:key outputs #:allow-other-keys) (copy-recursively "bin" (string-append (assoc-ref outputs "out") "/bin"))))))) (inputs (list cxxopts mapbox-variant)) (home-page "https://potassco.org/") (synopsis "ASP planning tools for PDDL") (description "@command{plasp} is a tool collection for planning in answer set programming. It supports a subset of PDDL 3.1 and SAS 3.") (license license:expat))) (define-public emacs-pasp-mode (let ((commit "59385eb0e8ebcfc8c11dd811fb145d4b0fa3cc92") (revision "1")) (package (name "emacs-pasp-mode") (version (git-version "0.1.0" revision commit)) (source (origin (method git-fetch) (uri (git-reference (url "https://github.com/santifa/pasp-mode") (commit commit))) (file-name (git-file-name name version)) (patches (search-patches "emacs-pasp-mode-quote-file-names.patch")) (sha256 (base32 "1ar4vws3izzmir7m870mccci620ns3c5j26dcmwaxavhgw45wcmf")))) (build-system emacs-build-system) (arguments (list #:phases #~(modify-phases %standard-phases (add-after 'unpack 'defconst-version (lambda _ (emacs-batch-edit-file "pasp-mode.el" '(progn (search-forward-regexp "(defcustom pasp-mode-version") (forward-sexp) (kill-sexp) (backward-sexp) (beginning-of-line) (kill-sexp) (insert (format "(defconst emacs-pasp-version \"%s\" %s)" #$version (cadr kill-ring))) (basic-save-buffer))))) (add-after 'unpack 'hardcode-clingo (lambda* (#:key inputs #:allow-other-keys) (emacs-substitute-variables "pasp-mode.el" ("pasp-clingo-path" (search-input-file inputs "/bin/clingo")))))))) (inputs (list clingo)) (home-page "https://github.com/santifa/pasp-mode") (synopsis "Major mode for editing answer set programs") (description "This package provides a major mode for editing answer set programs, in particular ones that can be solved by @command{clingo}.") (license license:gpl3+)))) (define-public python-clingo (package (inherit clingo) (name "python-clingo") (version (package-version clingo)) ; for #$version in arguments (arguments (substitute-keyword-arguments (package-arguments clingo) ((#:configure-flags flags #~'()) #~(cons* "-DCLINGO_BUILD_WITH_PYTHON=pip" "-DCLINGO_USE_LIB=yes" #$flags)) ((#:imported-modules _ '()) `(,@%cmake-build-system-modules (guix build python-build-system))) ((#:modules _ '()) '((guix build cmake-build-system) ((guix build python-build-system) #:prefix python:) (guix build utils))) ((#:phases phases #~%standard-phases) #~(modify-phases #$phases (add-after 'unpack 'fix-failing-tests (lambda _ (substitute* "libpyclingo/clingo/tests/test_conf.py" (("ctl\\.solve\\(on_statistics=on_statistics\\)" all) (string-append all "; self.skipTest(\"You shall not fail.\")"))))) (add-after 'install 'install-distinfo (lambda* (#:key inputs outputs #:allow-other-keys) (with-directory-excursion (python:site-packages inputs outputs) (let ((dir (string-append "clingo-" #$version ".dist-info"))) (mkdir-p dir) (call-with-output-file (string-append dir "/METADATA") (lambda (port) (format port "Metadata-Version: 1.1~%") (format port "Name: clingo~%") (format port "Version: ~a~%" #$version))))))))))) (inputs (list clingo python-wrapper)) (propagated-inputs (list python-cffi)) (native-inputs (modify-inputs (package-native-inputs clingo) (prepend python-scikit-build))) (synopsis "Python bindings for clingo") (description "This package provides Python bindings to the clingo package, making it so that you can write @acronym{ASPs, Answer Set Programs} through Python code."))) (define-public python-clorm (package (name "python-clorm") (version "1.4.1") (source (origin (method git-fetch) (uri (git-reference (url "https://github.com/potassco/clorm") (commit (string-append "v" version)))) (file-name (git-file-name name version)) (sha256 (base32 "0jx99y71mrgdicn1da5dwz5nzgvvpabrikff783sg4shbv2cf0b5")))) (build-system pyproject-build-system) (arguments (list #:phases #~(modify-phases %standard-phases (add-before 'check 'fix-breaking-tests (lambda _ ;; noclingo tests rely on this being set (setenv "CLORM_NOCLINGO" "1") (delete-file "tests/test_mypy_query.py") (substitute* "tests/test_clingo.py" (("self\\.assertTrue\\(os_called\\)" all) (string-append "# " all)))))))) (propagated-inputs (list python-clingo)) (native-inputs (list python-typing-extensions)) (home-page "https://potassco.org") (synopsis "Object relational mapping to clingo") (description "@acronym{Clorm, Clingo ORM} provides an @acronym{ORM, Object Relational Mapping} interface to the @acronym{ASP, answer set programming} solver clingo. Its goal is to make integration of clingo into Python programs easier.") (license license:expat))) (define-public python-telingo (package (name "python-telingo") (version "2.1.1") (source (origin (method git-fetch) (uri (git-reference (url "https://github.com/potassco/telingo") (commit (string-append "v" version)))) (file-name (git-file-name name version)) (patches (search-patches "python-telingo-fix-comparison.patch")) (sha256 (base32 "0g3khxfdzc2hc7dkiyyqhb399h6h21m5wkp6wy8w71n0m32fiy53")))) (build-system pyproject-build-system) (propagated-inputs (list python-clingo)) (home-page "https://potassco.org/") (synopsis "Solve dynamic temporal logic programs") (description "This package provides a system to solve dynamic temporal logic programs based on clingo.") (license license:expat))) (define-public python-clingraph (package (name "python-clingraph") (version "1.1.2") (source (origin (method git-fetch) (uri (git-reference (url "https://github.com/potassco/clingraph") (commit (string-append "v" version)))) (file-name (git-file-name name version)) (sha256 (base32 "16q54rkwr84byzy27795rl9z08kcyxsg7lfk017yr8p5axh9a9rr")))) (build-system pyproject-build-system) (inputs (list dot2tex graphviz)) (propagated-inputs (list python-clingo python-clorm python-graphviz python-imageio python-jinja2 python-jsonschema python-networkx)) (native-inputs (list dot2tex graphviz python-pylint python-pytest)) (home-page "https://github.com/potassco/clingraph") (synopsis "Visualizer for graphs defined as logic programs") (description "This package provides a clingo-based visualizer for graphs defined as logic programs.") (license license:expat))) (define-public python-clinguin (package (name "python-clinguin") (version "1.0.0-beta") (source (origin (method git-fetch) (uri (git-reference (url "https://github.com/potassco/clinguin") (commit (string-append "v" version)))) (file-name (git-file-name name version)) (sha256 (base32 "032fnzxv6wl01sdq7n2k0ikajpmkg8ihjh5mck1mwjvmis8z16d4")) (modules '((guix build utils))) (snippet #~(begin (substitute* "setup.cfg" ;; Fun fact of the day ;; some typo squatter hosted ;; a package named tk (("tk") "") (("typing") "typing;python_version<\"3.5\"")))))) (build-system pyproject-build-system) (propagated-inputs (list python-clingo python-clorm python-clingraph python-fastapi python-httpx python-nbconvert python-nbformat python-nbsphinx python-networkx python-pillow python-pydantic `(,python "tk") python-sphinx-rtd-theme python-traitlets python-uvicorn)) (home-page "https://github.com/potassco/clingraph") (synopsis "Clingo-based interactive UI") (description "Clinguin is a graphical user interface toolkit for clingo, which allows user interfaces to be specified entirely as a logic program.") (license license:expat)))