spot/lbtt/src/FormulaRandomizer.h

329 lines
13 KiB
C++

/*
* Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005
* Heikki Tauriainen <Heikki.Tauriainen@tkk.fi>
*
* This program 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 2
* of the License, or (at your option) any later version.
*
* This program 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, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
#ifndef FORMULARANDOMIZER_H
#define FORMULARANDOMIZER_H
#include <config.h>
#include <map>
#include <vector>
#include <utility>
#include "LbttAlloc.h"
#include "LtlFormula.h"
namespace Ltl
{
/******************************************************************************
*
* Class for generating random LTL formulae.
*
*****************************************************************************/
class FormulaRandomizer
{
public:
FormulaRandomizer(); /* Constructor. */
/* default copy constructor */
~FormulaRandomizer(); /* Destructor. */
/* default assignment operator */
void reset(); /* Resets the formula
* generation parameters.
*/
void useSymbol /* Inserts an atomic */
(const int symbol, const int priority); /* symbol (an atomic
* proposition or a
* Boolean constant)
* into the set of
* operands used for
* generating random
* formulae.
*/
void useShortOperator /* Inserts an element */
(const int symbol, const int priority); /* into the set of
* operators used for
* generating random
* formulae of size
* two.
*/
void useLongOperator /* Inserts an element */
(const int symbol, const int priority); /* into the set of
* operators used for
* generating random
* formulae of size
* greater than two.
*/
LtlFormula* generate(); /* Generates a random LTL
* formula.
*/
unsigned long int numberOfFormulas() const; /* Get the number of
* generated formulas since
* the last call to
* `reset'.
*/
const map<unsigned long int, unsigned long int>& /* Get the numbers of */
propositionStatistics() const; /* different atomic
* propositions
* generated since the
* last call to `reset'.
*/
const map<int, unsigned long int>& /* Get the numbers of */
symbolStatistics() const; /* different symbols
* generated since the
* last call to `reset'.
*/
unsigned long int number_of_available_variables; /* Size of the set of
* atomic propositions used
* for generating random
* LTL formulae.
*/
unsigned long int size; /* Minimum size of the
* generated formulae
* (number of nodes in the
* formula parse tree).
*/
unsigned long int max_size; /* Maximum size of the
* generated formulae.
*/
private:
LtlFormula* recGenerate /* Implementation of */
(unsigned long int target_size); /* the random formula
* generation algorithm.
*/
typedef pair<int, int> IntegerPair;
vector<IntegerPair> /* Operand symbols and */
propositional_symbol_priorities; /* their priorities in
* random formulae.
*/
vector<IntegerPair> short_formula_operators; /* Operators and their
* priorities in random
* formulae of size two.
*/
vector<IntegerPair> long_formula_operators; /* Operators and their
* priorities in random
* formulae of size greater
* than two.
*/
unsigned long int number_of_generated_formulas; /* Number of generated
* formulas since the
* last call to `reset'.
*/
map<unsigned long int, unsigned long int> /* Number of different */
proposition_statistics; /* atomic propositions
* generated since the
* last call to `reset'
*/
map<int, unsigned long int> symbol_statistics; /* Number of different
* formula symbols
* generated since the
* last call to `reset'.
*/
};
/******************************************************************************
*
* Inline function definitions for class FormulaRandomizer.
*
*****************************************************************************/
/* ========================================================================= */
inline FormulaRandomizer::FormulaRandomizer()
/* ----------------------------------------------------------------------------
*
* Description: Constructor for class FormulaRandomizer. Creates a new
* formula parameter information object and initializes the
* generation parameters with their default values.
*
* Arguments: None.
*
* Returns: Nothing.
*
* ------------------------------------------------------------------------- */
{
reset();
}
/* ========================================================================= */
inline FormulaRandomizer::~FormulaRandomizer()
/* ----------------------------------------------------------------------------
*
* Description: Destructor for class FormulaRandomizer.
*
* Arguments: None.
*
* Returns: Nothing.
*
* ------------------------------------------------------------------------- */
{
}
/* ========================================================================= */
inline void FormulaRandomizer::useSymbol(const int symbol, const int priority)
/* ----------------------------------------------------------------------------
*
* Description: Inserts an atomic symbol (an atomic proposition or a Boolean
* constant) into the set of symbols used for generating random
* LTL formulae. The symbol will then be chosen into a formula
* by the random formula generation algorithm with a given
* priority.
*
* Arguments: symbol -- A symbol type identifier (one of the LTL_
* constants defined in LtlFormula.h).
* priority -- Priority for the symbol.
*
* Returns: Nothing.
*
* ------------------------------------------------------------------------- */
{
if (priority > 0)
{
propositional_symbol_priorities.push_back(make_pair(symbol, priority));
propositional_symbol_priorities[0].second += priority;
}
}
/* ========================================================================= */
inline void FormulaRandomizer::useShortOperator
(const int symbol, const int priority)
/* ----------------------------------------------------------------------------
*
* Description: Inserts a symbol into the set of operators considered when
* generating random LTL formulae with two nodes in their parse
* tree. The symbol will then be chosen into a formula by the
* random formula generation algorithm with a given priority.
*
* Arguments: symbol -- A symbol type identifier (one of the LTL_
* constants defined in LtlFormula.h).
* priority -- Priority for the symbol.
*
* Returns: Nothing.
*
* ------------------------------------------------------------------------- */
{
if (priority > 0)
{
short_formula_operators.push_back(make_pair(symbol, priority));
short_formula_operators[0].second += priority;
}
}
/* ========================================================================= */
inline void FormulaRandomizer::useLongOperator
(const int symbol, const int priority)
/* ----------------------------------------------------------------------------
*
* Description: Inserts a symbol into the set of operators considered when
* generating random LTL formulae with two nodes in their parse
* tree. The symbol will then be chosen into a formula by the
* random formula generation algorithm with a given priority.
*
* Arguments: symbol -- A symbol type identifier (one of the LTL_
* constants defined in LtlFormula.h).
* priority -- Priority for the symbol.
*
* Returns: Nothing.
*
* ------------------------------------------------------------------------- */
{
if (priority > 0)
{
long_formula_operators.push_back(make_pair(symbol, priority));
long_formula_operators[0].second += priority;
}
}
/* ========================================================================= */
inline unsigned long int FormulaRandomizer::numberOfFormulas() const
/* ----------------------------------------------------------------------------
*
* Description: Tells the number of formulae generated since the last call to
* `reset'.
*
* Arguments: None.
*
* Returns: Number of formulae generated since the last call to `reset'.
*
* ------------------------------------------------------------------------- */
{
return number_of_generated_formulas;
}
/* ========================================================================= */
inline const map<unsigned long int, unsigned long int>&
FormulaRandomizer::propositionStatistics() const
/* ----------------------------------------------------------------------------
*
* Description: Tells the number of different atomic propositions generated
* since the last call to `reset'.
*
* Arguments: None.
*
* Returns: A reference to a constant mapping between proposition
* identifiers and their numbers.
*
* ------------------------------------------------------------------------- */
{
return proposition_statistics;
}
/* ========================================================================= */
inline const map<int, unsigned long int>&
FormulaRandomizer::symbolStatistics() const
/* ----------------------------------------------------------------------------
*
* Description: Tells the number of different formula symbols generated since
* the last call to `reset'.
*
* Arguments: None.
*
* Returns: A reference to a constant mapping between LTL formula symbols
* and their numbers.
*
* ------------------------------------------------------------------------- */
{
return symbol_statistics;
}
}
#endif /* !FORMULARANDOMIZER_H */