Commit 882097a2 authored by Alexandre Duret-Lutz's avatar Alexandre Duret-Lutz

Remove modgray, it's not used.

* src/misc/modgray.cc, src/misc/modgray.hh: Delete.
* src/misc/Makefile.am: Adjust.
* wrap/python/tests/modgray.py: Delete.
* wrap/python/tests/Makefile.am: Adjust.
* wrap/python/spot.i: Remove binding.
parent f2078ac3
......@@ -45,7 +45,6 @@ misc_HEADERS = \
intvcmp2.hh \
ltstr.hh \
minato.hh \
modgray.hh \
memusage.hh \
mspool.hh \
optionmap.hh \
......@@ -64,7 +63,6 @@ libmisc_la_SOURCES = \
freelist.cc \
intvcomp.cc \
intvcmp2.cc \
modgray.cc \
memusage.cc \
minato.cc \
optionmap.cc \
......
// -*- coding: utf-8 -*-
// Copyright (C) 2012 Laboratoire de Recherche et Développement de
// l'Epita (LRDE).
// Copyright (C) 2004 Laboratoire d'Informatique de Paris 6 (LIP6),
// département Systèmes Répartis Coopératifs (SRC), Université Pierre
// et Marie Curie.
//
// 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
// 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 this program. If not, see <http://www.gnu.org/licenses/>.
#include "modgray.hh"
namespace spot
{
loopless_modular_mixed_radix_gray_code::
loopless_modular_mixed_radix_gray_code(int n)
: n_(n), done_(false), a_(0), f_(0), m_(0), s_(0), non_one_radixes_(0)
{
}
loopless_modular_mixed_radix_gray_code::
~loopless_modular_mixed_radix_gray_code()
{
delete[] a_;
delete[] f_;
delete[] m_;
delete[] s_;
delete[] non_one_radixes_;
}
void
loopless_modular_mixed_radix_gray_code::first()
{
if (!non_one_radixes_)
{
// This computation needs to be done only once, but we cannot
// do it in the constructor because it involves virtual
// functions.
// non_one_radixes_ needs to hold at most n_ integer, maybe less
// we do not know yet and do not care (saving these extra bytes
// would require two loops over a_last(j); this doesn't seem
// worth the hassle). We update n_ before allocating the other
// arrays.
non_one_radixes_ = new int[n_];
int k = 0;
for (int j = 0; j < n_; ++j)
{
a_first(j);
if (!a_last(j))
non_one_radixes_[k++] = j;
}
n_ = k;
a_ = new int[k];
f_ = new int[k + 1];
m_ = new int[k];
s_ = new int[k];
for (int j = 0; j < n_; ++j)
m_[j] = -1;
f_[n_] = n_;
}
// Reset everything except m_[j] (let's preserve discovered
// radixes between runs) and f_[n_] (never changes).
for (int j = 0; j < n_; ++j)
{
a_[j] = 0;
a_first(non_one_radixes_[j]);
s_[j] = m_[j];
f_[j] = j;
}
done_ = false;
}
// Update one item of the tuple and return its position.
int
loopless_modular_mixed_radix_gray_code::next()
{
int j = f_[0];
if (j == n_)
{
done_ = true;
return -1;
}
f_[0] = 0;
int real_j = non_one_radixes_[j];
if (a_[j] == m_[j])
{
a_[j] = 0;
a_first(real_j);
}
else
{
++a_[j];
a_next(real_j);
// Discover the radix on-the-fly.
if (m_[j] == -1 && a_last(real_j))
s_[j] = m_[j] = a_[j];
}
if (a_[j] == s_[j])
{
--s_[j];
if (s_[j] < 0)
s_[j] = m_[j];
f_[j] = f_[j + 1];
f_[j + 1] = j + 1;
}
return real_j;
}
} // spot
// Copyright (C) 2004 Laboratoire d'Informatique de Paris 6 (LIP6),
// département Systèmes Répartis Coopératifs (SRC), Université Pierre
// et Marie Curie.
//
// 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
// 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 this program. If not, see <http://www.gnu.org/licenses/>.
#ifndef SPOT_MISC_MODGRAY_HH
# define SPOT_MISC_MODGRAY_HH
namespace spot
{
/// \ingroup misc_tools
/// \brief Loopless modular mixed radix Gray code iteration.
///
/// This class is based on the loopless modular mixed radix gray
/// code algorithm described in exercise 77 of "The Art of Computer
/// Programming", Pre-Fascicle 2A (Draft of section 7.2.1.1:
/// generating all n-tuples) by Donald E. Knuth.
///
/// The idea is to enumerate the set of all n-tuples
/// (a<sub>0</sub>,a<sub>1</sub>,...,a<sub>n-1</sub>) where each
/// a<sub>j</sub> range over a distinct set (this is the <i>mixed
/// radix</i> part), so that only one a<sub>j</sub> changes between
/// two successive tuples of the iteration (that is the <i>Gray
/// code</i> part), and that this changes occurs always in the same
/// direction, cycling over the set a<sub>j</sub> must cover (i.e.,
/// <i>modular</i>). The algorithm is <i>loopless</i> in that
/// computing the next tuple done without any loop, i.e., in
/// constant time.
///
/// This class does not need to know the type of the a<sub>j</sub>,
/// it will handle them indirectly through three methods: a_first(),
/// a_next(), and a_last(). These methods need to be implemented
/// in a subclass for the particular type of a<sub>j</sub> at hand.
///
/// The class itself offers four functions to control the iteration
/// over the set of all the (a<sub>0</sub>,a<sub>1</sub>,...,
/// a<sub>n-1</sub>) tuples: first(), next(), last(), and done().
/// These functions are usually used as follows:
/// \code
/// for (g.first(); !g.done(); g.next())
/// use the tuple
/// \endcode
/// How to use the tuple of course depends on the way
/// it as been stored in the subclass.
///
/// Finally, let's mention two differences between this algorithm
/// and the one in Knuth's book. This version of the algorithm does
/// not need to know the radixes (i.e., the size of set of each
/// a<sub>j</sub>) beforehand: it will discover them on-the-fly when
/// a_last(j) first return true. It will also work with
/// a<sub>j</sub> that cannot be changed. (This is achieved by
/// reindexing the elements through \c non_one_radixes_, to consider
/// only the elements with a non-singleton range.)
class loopless_modular_mixed_radix_gray_code
{
public:
/// Constructor.
///
/// \param n The size of the tuples to enumerate.
loopless_modular_mixed_radix_gray_code(int n);
virtual ~loopless_modular_mixed_radix_gray_code();
/// \name iteration over an element in a tuple
///
/// The class does not know how to modify the elements of the
/// tuple (Knuth's a<sub>j</sub>s). These changes are therefore
/// abstracted using the a_first(), a_next(), and a_last()
/// abstract functions. These need to be implemented in
/// subclasses as appropriate.
///
/// @{
/// Reset a<sub>j</sub> to its initial value.
virtual void a_first(int j) = 0;
/// \brief Advance a<sub>j</sub> to its next value.
///
/// This will never be called if a_last(j) is true.
virtual void a_next(int j) = 0;
/// Whether a<sub>j</sub> is on its last value.
virtual bool a_last(int j) const = 0;
/// @}
/// \name iteration over all the tuples
/// @{
/// \brief Reset the iteration to the first tuple.
///
/// This must be called before calling any of next(), last(), or done().
void first();
/// \brief Whether this the last tuple.
///
/// At this point it is still OK to call next(), and then done() will
/// become true.
bool
last() const
{
return f_[0] == n_;
}
/// Whether all tuple have been explored.
bool
done() const
{
return done_;
}
/// \brief Update one item of the tuple and return its position.
///
/// next() should never be called if done() is true. If it is
/// called on the last tuple (i.e., last() is true), it will return
/// -1. Otherwise it will update one a<sub>j</sub> of the tuple
/// through one the a<sub>j</sub> handling functions, and return j.
int next();
/// @}
protected:
int n_;
bool done_;
int* a_;
int* f_;
int* m_;
int* s_;
int* non_one_radixes_;
};
} // spot
# endif // SPOT_MISC_MODGRAY_HH
......@@ -45,7 +45,6 @@ namespace std {
#include "misc/version.hh"
#include "misc/minato.hh"
#include "misc/modgray.hh"
#include "misc/optionmap.hh"
#include "misc/random.hh"
......@@ -161,9 +160,6 @@ using namespace spot;
%include "misc/optionmap.hh"
%include "misc/random.hh"
%feature("director") spot::loopless_modular_mixed_radix_gray_code;
%include "misc/modgray.hh"
%include "ltlast/formula.hh"
%include "ltlast/refformula.hh"
%include "ltlast/atomic_prop.hh"
......
## Copyright (C) 2010, 2012 Labortatoire de Recherche et Dveloppement de
## Copyright (C) 2010, 2012, 2013 Labortatoire de Recherche et Dveloppement de
## l'EPITA.
## Copyright (C) 2003, 2004, 2005 Laboratoire d'Informatique de Paris 6 (LIP6),
## dpartement Systmes Rpartis Coopratifs (SRC), Universit Pierre
......@@ -36,7 +36,6 @@ TESTS = \
ltlparse.py \
ltlsimple.py \
minato.py \
modgray.py \
optionmap.py \
parsetgba.py \
setxor.py
# -*- mode: python; coding: utf-8 -*-
# Copyright (C) 2010, 2012 Laboratoire de Recherche et Développement
# de l'Epita.
# Copyright (C) 2004 Laboratoire d'Informatique de Paris 6 (LIP6),
# département Systèmes Répartis Coopératifs (SRC), Université Pierre
# et Marie Curie.
#
# 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
# 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 this program. If not, see <http://www.gnu.org/licenses/>.
import spot
import sys
class test(spot.loopless_modular_mixed_radix_gray_code):
def __init__(self, lim):
spot.loopless_modular_mixed_radix_gray_code.__init__(self, len(lim))
self.msg = list(lim)
self.lim = list(lim)
def a_first(self, j):
self.msg[j] = 'a'
def a_next(self, j):
self.msg[j] = chr(1 + ord(self.msg[j]))
def a_last(self, j):
return self.msg[j] == self.lim[j]
def run(self):
self.first()
res = []
while not self.done():
m = "".join(self.msg)
res.append(m)
sys.stdout.write(m + "\n")
self.next()
return res
t = test("acbb")
expected = [ 'aaaa', 'abaa', 'acaa', 'acba',
'aaba', 'abba', 'abbb', 'acbb',
'aabb', 'aaab', 'abab', 'acab' ]
assert t.run() == expected
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