blob: b8d23c0f30ebaf398ec5f1d50e9f1c7cb053d173 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2016 CEA LIST.
*
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Created on: 15 janv. 2015
*
* Contributors:
* Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
* - Initial API and implementation
******************************************************************************/
#include "AvmCoverageHeuristicProperty.h"
#include <fml/workflow/Query.h>
#include <fml/workflow/WObject.h>
namespace sep
{
/**
*
* strHeuristicWeight
*/
std::string IHeuristicContextWeight::strHeuristicWeight(avm_uint8_t aWeight)
{
switch( aWeight )
{
case WEIGHT_SELECTED_ACHIEVABLE : return( "SELECTED_ACHIEVABLE" );
case WEIGHT_CERTAINLY_ACHIEVABLE : return( "CERTAINLY_ACHIEVABLE" );
case WEIGHT_STRONGLY_ACHIEVABLE : return( "STRONGLY_ACHIEVABLE" );
case WEIGHT_WEAKLY_ACHIEVABLE : return( "WEAKLY_ACHIEVABLE" );
case WEIGHT_NON_PRIORITY : return( "NON_PRIORITY" );
case WEIGHT_UNKNOWN_ACHIEVABLE : return( "UNKNOWN_ACHIEVABLE" );
case WEIGHT_NON_ACHIEVABLE : return( "UNACHIEVABLE" );
default: return( to_string( static_cast< int >(aWeight) ) );
}
}
/**
* SETTER
* mHeuristicClass
*/
IHeuristicClass::ENUM_HEURISTIC_CLASS
IHeuristicClass::incrHeuristicClass(ENUM_HEURISTIC_CLASS anHeuristicClass)
{
switch( anHeuristicClass )
{
case HEURISTIC_BASIC_CLASS:
{
return( HEURISTIC_NAIVE_CLASS );
}
case HEURISTIC_NAIVE_CLASS:
{
return( HEURISTIC_SMART_CLASS );
}
case HEURISTIC_SMART_CLASS:
{
return( HEURISTIC_AGRESSIVE_CLASS );
}
case HEURISTIC_AGRESSIVE_CLASS:
{
return( HEURISTIC_NOTHING_ELSE_CLASS );
}
case HEURISTIC_NOTHING_ELSE_CLASS:
default:
{
return( HEURISTIC_NOTHING_ELSE_CLASS );
}
}
}
std::string IHeuristicClass::strHeuristicClass(
ENUM_HEURISTIC_CLASS anHeuristicClass)
{
switch( anHeuristicClass )
{
case HEURISTIC_BASIC_CLASS:
{
return( "HEURISTIC_BASIC_CLASS" );
}
case HEURISTIC_NAIVE_CLASS:
{
return( "HEURISTIC_NAIVE_CLASS" );
}
case HEURISTIC_SMART_CLASS:
{
return( "HEURISTIC_SMART_CLASS" );
}
case HEURISTIC_AGRESSIVE_CLASS:
{
return( "HEURISTIC_AGRESSIVE_CLASS" );
}
case HEURISTIC_NOTHING_ELSE_CLASS:
{
return( "HEURISTIC_NOTHING_ELSE_CLASS" );
}
default:
{
return( "UNKNOWN< HEURISTIC_CLASS >" );
}
}
}
IHeuristicClass::ENUM_HEURISTIC_CLASS
IHeuristicClass::toHeuristicClass(const std::string & strHeuristicClass)
{
std::string aHeuristicClass = strHeuristicClass;
StringTools::tolower(aHeuristicClass);
if( aHeuristicClass == "basic" )
{
return( HEURISTIC_BASIC_CLASS );
}
else if( aHeuristicClass == "naive" )
{
return( HEURISTIC_NAIVE_CLASS );
}
else if( aHeuristicClass == "smart" )
{
return( HEURISTIC_SMART_CLASS );
}
else if( aHeuristicClass == "agressive" )
{
return( HEURISTIC_AGRESSIVE_CLASS );
}
return( HEURISTIC_BASIC_CLASS );
}
////////////////////////////////////////////////////////////////////////////////
// CONFIGURE API
////////////////////////////////////////////////////////////////////////////////
/*******************************************************************************
prototype process::processID as &avm::processor.PROCESSOR_TYPE_ID is
section HEURISTIC
// Active l'utilisation d'heuristique
@heuristic = true;
// choix de l'heuristique de départ
// basic | naive | smart | agressive
@heuristic#start = 'basic';
// Nombre d'essais d'heuristiques
@heuristic#trials = 7;
// Critère de satisfaction du succès des heuristiques
// taux de couverte / nombre d'élément restant...
@objective#rate = 95;
@objective#rest = 5;
// Limitation de la taille des chemins/traces couvrants recherchés
@directive#trace#heuristic = 'smart';
@directive#trace#count#limit = 8;
@directive#trace#size#limit = 8;
// Choix des contextes avec des transitions
// [ fortement | faiblement | autre ] tirables
// Limitations temporaire de la profondeur d'exploration
@coverage#height = 7;
// nombre de fois que la limite doit être atteint avant de l'augmenter
@coverage#height#reached#limit = 42;
@hit#strongly#random = false;
@hit#strongly#count = 1;
@hit#weakly#random = false;
@hit#weakly#count = 1;
@hit#other#random = false;
@hit#other#count = 1;
@scope = 'DETAILS'; // 'INSTANCE' | 'FORM' | 'DETAILS'
endsection HEURISTIC
endprototype
*******************************************************************************/
bool AvmCoverageHeuristicProperty::configure(WObject * wfParameterObject)
{
long intAttribute = 0;
WObject * thePROPERTY = Query::getRegexWSequence(
wfParameterObject, OR_WID2("property", "PROPERTY"));
if( thePROPERTY != WObject::_NULL_ )
{
mScope = Specifier::toDesignKind(
Query::getWPropertyString(thePROPERTY, "scope", "MODEL") );
mHeuristicEnabled = Query::getWPropertyBoolean(
thePROPERTY, "heuristic", true);
}
WObject * theHEURISTIC = Query::getRegexWSequence(wfParameterObject,
OR_WID2("heuristic", "HEURISTIC"), thePROPERTY);
if( theHEURISTIC != WObject::_NULL_ )
{
Specifier::DESIGN_KIND aScope = Specifier::toDesignKind(
Query::getWPropertyString(theHEURISTIC, "scope", "UNDEFINED") );
if( aScope != Specifier::DESIGN_UNDEFINED_KIND )
{
mScope = aScope;
}
// Heuristic enabling
mHeuristicEnabled = Query::getWPropertyBoolean(
theHEURISTIC, "heuristic", mHeuristicEnabled);
// Heuristic start class : basic | naive | smart | agressive
std::string strHeuristic = Query::getRegexWPropertyString(
theHEURISTIC, CONS_WID2("heuristic", "start"), "basic");
mHeuristicClass = toHeuristicClass(strHeuristic);
// Trials limit
mHeuristicTrialsLimit = Query::getRegexWPropertySizeT(
theHEURISTIC, CONS_WID2("heuristic", "trials"),
AVM_NUMERIC_MAX_SIZE_T, AVM_NUMERIC_MAX_SIZE_T);
mHeuristicTrialsCount = 0;
// Objective & Goal
intAttribute = Query::getRegexWPropertyInt(
theHEURISTIC, CONS_WID2("objective", "rate"), 100);
mCoverageRateGoal = ( (intAttribute > 0) &&
(intAttribute <= 100) ) ? intAttribute : 100;
mCoverageRestGoal = Query::getRegexWPropertySizeT(
theHEURISTIC, CONS_WID2("objective", "rest"), 0, 0);
// Directive Heuristic
strHeuristic = Query::getRegexWPropertyString(theHEURISTIC,
CONS_WID3("directive", "trace", "heuristic"), "smart");
mDirectiveTraceHeuristicClass = toHeuristicClass(strHeuristic);
mDirectiveTraceCountLimit = Query::getRegexWPropertyPosSizeT(
theHEURISTIC,
CONS_WID4("directive", "trace", "count", "limit"),
AVM_NUMERIC_MAX_SIZE_T, AVM_NUMERIC_MAX_SIZE_T);
mDirectiveTraceSizeLimit = Query::getRegexWPropertyPosSizeT(
theHEURISTIC,
CONS_WID4("directive", "trace", "size", "limit"),
AVM_NUMERIC_MAX_SIZE_T, AVM_NUMERIC_MAX_SIZE_T);
mCoverageHeight = mCoverageHeightPeriod =
Query::getRegexWPropertySizeT(theHEURISTIC,
CONS_WID2("lookahead", "depth") "|"
CONS_WID2("coverage", "height"), 0);
mCoverageHeightReachedLimit = Query::getRegexWPropertySizeT(
theHEURISTIC, CONS_WID2("lookahead", "width") "|"
CONS_WID4("coverage", "height", "reached", "limit"), 0);
// Options pour les transitions fortement tirables
mHitStronglyRandomFlag = Query::getRegexWPropertyBoolean(
theHEURISTIC, CONS_WID3("hit", "strongly", "random"), false);
mHitStronglyCount = Query::getRegexWPropertyPosSizeT(
theHEURISTIC, CONS_WID3("hit", "strongly", "count"), 1);
// Options pour les transitions faiblement tirables
mHitWeaklyRandomFlag = Query::getRegexWPropertyBoolean(
theHEURISTIC, CONS_WID3("hit", "weakly", "random"), false);
mHitWeaklyCount = Query::getRegexWPropertyPosSizeT(
theHEURISTIC, CONS_WID3("hit", "weakly", "count"), 1);
// Options pour les autres transitions tirables ?
mHitOtherRandomFlag = Query::getRegexWPropertyBoolean(
theHEURISTIC, CONS_WID3("hit", "other", "random"), false);
mHitOtherCount = Query::getRegexWPropertyPosSizeT(
theHEURISTIC, CONS_WID3("hit", "other", "count"), 1);
}
return( true );
}
} /* namespace sep */