Newer
Older
#pragma once
#include <vector>
#include <string>
#include <limits>
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
#include "generator.h"
#include "strings.h"
using namespace pictcore;
const int UNDEFINED_ORDER = std::numeric_limits<int>::max();
//
//
//
class CModelValue
{
public:
CModelValue
(
wstrings& names,
unsigned int weight,
bool positive
) : _names ( names ),
_weight ( weight ),
_positive ( positive ),
_currentNameIndex( 0 ) {}
wstrings& GetAllNames() { return( _names ); }
std::wstring GetPrimaryName() { return( _names[ 0 ] ); }
// type of the value and any other attribute is currently decided based on the primary name
wstrings GetNamesForComparisons();
// round-robin through names
std::wstring GetNextName();
bool IsPositive() { return( _positive ); }
unsigned int GetWeight() { return( _weight ); }
private:
wstrings _names;
bool _positive;
unsigned int _weight;
wstrings::size_type _currentNameIndex;
};
//
//
//
class CModelParameter
{
public:
std::wstring Name;
std::vector< CModelValue > Values;
unsigned int Order; // default order assigned when parameter is defined
bool IsResultParameter; // special parameter for results
Parameter* GcdPointer;
CModelParameter() :
IsResultParameter(false),
Order(UNDEFINED_ORDER),
GcdPointer(nullptr){}
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
int GetValueOrdinal( IN std::wstring& name, IN bool caseSensitive );
bool ValueNamesUnique( IN bool CaseSensitive );
};
//
//
//
typedef std::vector< unsigned int > CParameters;
class CModelSubmodel
{
public:
int Order; // order at which a submodel should be combined
CParameters Parameters; // indexes to Parameters in CModelData
CModelSubmodel() : Order(UNDEFINED_ORDER) {}
};
//
//
//
typedef std::list< std::pair< std::wstring, std::wstring > > CModelRowSeed; // param_name, value_name
typedef std::vector< CModelRowSeed > CModelRowSeeds;
//
//
//
class CModelData
{
public:
int Order;
wchar_t ValuesDelim;
wchar_t NamesDelim;
wchar_t InvalidPrefix;
unsigned short RandSeed;
bool CaseSensitive;
bool Verbose; // prints out some additional info while generating
bool Statistics; // show the statistics only
pictcore::GenerationMode GenerationMode;
size_t MaxApproxTries; // for Approximate mode
std::wstring RowSeedsFile;
std::vector< CModelParameter > Parameters;
std::vector< CModelSubmodel > Submodels;
std::wstring ConstraintPredicates;
std::vector< CModelRowSeed > RowSeeds;
std::set< wchar_t > ProvidedArguments; // arguments defined by a user
// helpful to catch redefinitions
// ctor
CModelData() : Order(2),
ValuesDelim(L','),
NamesDelim(L'|'),
InvalidPrefix(L'~'),
RandSeed(0),
CaseSensitive(false),
Verbose(false),
Statistics(false),
RowSeedsFile(L""),
GenerationMode(GenerationMode::Regular),
MaxApproxTries(1000),
ConstraintPredicates(L""),
m_hasNegativeValues(false),
m_encoding(EncodingType::ANSI),
m_totalCombinations(0),
m_remainingCombinations(0) {}
bool ReadModel ( const std::wstring& filePath );
bool ReadRowSeedFile( const std::wstring& filePath );
size_t TotalParameterCount() { return(Parameters.size()); }
size_t ResultParameterCount();
std::vector< CModelParameter >::iterator FindParameterByName( const std::wstring& Name );
std::vector< CModelParameter >::iterator FindParameterByGcdPointer( Parameter* Pointer );
std::wstring GetConstraintText( unsigned int index );
bool HasNegativeValues() { return( m_hasNegativeValues ); }
EncodingType GetEncoding() { return( m_encoding ); }
void AddToTotalCombinationsCount ( size_t n ) { m_totalCombinations += n; }
void AddToRemainingCombinationsCount( size_t n ) { m_remainingCombinations += n; }
void RemoveNegativeValues();
bool ValidateParams();
bool ValidateRowSeeds();
void PrintModelContents( std::wstring title );
void PrintStatistics();
private:
bool m_hasNegativeValues;
EncodingType m_encoding; // io encoding determined based on input file
Jacek Czerwonka
a validé
size_t m_totalCombinations; // number of combinations PICT dealt with in this run
size_t m_remainingCombinations; // number of uncovered combinations (Preview and Approximate)
void readFile ( const std::wstring& filePath );
bool readModel ( const std::wstring& filePath );
bool readParameter ( std::wstring& line );
bool readParamSet ( std::wstring& line );
void getUnmatchedParameterNames( wstrings& paramsOfSubmodel, wstrings& unmatchedParams );
};