Commit 1a08eca8 authored by Maximilien Colange's avatar Maximilien Colange
Browse files

Add a new, parameterized, version of the Couvreur emptiness check.

This version has optimization for explicit twa, and also for weak and
terminal (depending on whether an accepting run is requested) automata.

* spot/twaalgos/couvreurnew.hh, spot/twaalgos/,
  spot/twaalgos/ New files for the new algorithm.
* spot/twaalgos/, tests/core/
  Register new algorithm.
parent f0416b3f
......@@ -4,6 +4,13 @@ New in spot (Not yet released)
* A twa is required to have at least one state, the initial state.
* The Couvreur emptiness check has been rewritten to use the explicit
interface when possible, to avoid overkill memory allocations.
The new version has further optimizations for weak and terminal
automata. Overall, this new version is roughly 4x faster on explicit
automata than the former one. The old version has been kept for
* If the system has an installed libltdl library, use it instead of
......@@ -55,6 +55,7 @@ twaalgos_HEADERS = \
magic.hh \
mask.hh \
minimize.hh \
couvreurnew.hh \
neverclaim.hh \
postproc.hh \
powerset.hh \
......@@ -109,6 +110,7 @@ libtwaalgos_la_SOURCES = \ \ \ \ \
ndfs_result.hxx \ \ \
This diff is collapsed.
// -*- coding: utf-8 -*-
// Copyright (C) 2016 Laboratoire de Recherche et Developpement de l'EPITA.
// This file is part of Spot, a model checking library.
// Spot 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.
// Spot is distributed in the hope that it will be useful, but WITHOUT
// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
// License for more details.
// You should have received a copy of the GNU General Public License
// along with this program. If not, see <>.
#pragma once
#include <spot/twaalgos/emptiness.hh>
namespace spot
/// \brief A rewritten version of the Couvreur emptiness check.
/// It is optimized to run on explicit automata (avoiding the memory
/// allocations of the virtual, abstract interface.
/// It also has specializations for weak and terminal automata.
get_couvreur99_new(const const_twa_ptr& a, option_map o);
/// \brief Same as above, but always uses the abstract interface.
/// This function is provided to test the efficiency of specializing our
/// algorithms for explicit automata. It uses the same optimizations for
/// weak and terminal automata as the one above.
get_couvreur99_new_abstract(const const_twa_ptr& a, option_map o);
/// \brief A shortcut to run the optimized emptiness check directly.
/// This is the same as get_couvreur99_new(a, {})->check().
couvreur99_new_check(const const_twa_ptr& a);
......@@ -24,6 +24,7 @@
#include <memory>
#include <spot/twaalgos/emptiness.hh>
#include <spot/twaalgos/bfssteps.hh>
#include <spot/twaalgos/couvreurnew.hh>
#include <spot/twaalgos/gtec/gtec.hh>
#include <spot/twaalgos/gv04.hh>
#include <spot/twaalgos/magic.hh>
......@@ -129,6 +130,8 @@ namespace spot
ec_algo ec_algos[] =
{ "Cou99", couvreur99, 0, -1U },
{ "Cou99new", get_couvreur99_new, 0, -1U },
{ "Cou99abs", get_couvreur99_new_abstract, 0, -1U },
{ "CVWY90", magic_search, 0, 1 },
{ "GV04", explicit_gv04_check, 0, 1 },
{ "SE05", se05, 0, 1 },
......@@ -65,6 +65,8 @@ const char* default_algos[] = {
"Cou99(poprem shy !group)",
"Cou99(poprem shy group)",
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment