?? rsesdynamicreducer.cpp
字號:
//-------------------------------------------------------------------
// Author........: Aleksander 豩rn
// Date..........: 960307
// Description...:
// Revisions.....:
//===================================================================
#include <stdafx.h> // Precompiled headers.
#include <copyright.h>
#include <kernel/rses/algorithms/rsesdynamicreducer.h>
#include <kernel/rses/algorithms/rsesexhaustivereducer.h>
#include <kernel/rses/algorithms/rsesjohnsonreducer.h>
#include <kernel/rses/algorithms/rsesgeneticreducer.h>
#include <kernel/rses/structures/rsesdecisiontable.h>
#include <kernel/rses/structures/rsesreducts.h>
#include <kernel/rses/library/trr_calc.h>
#include <kernel/rses/library/tdtable.h>
#include <kernel/rses/library/trr_mem.h>
#include <kernel/rses/library/err.h>
#include <kernel/algorithms/keyword.h>
#include <kernel/utilities/creator.h>
#include <common/objectmanager.h>
//-------------------------------------------------------------------
// RNG used by RSES for dynamic reduct sampling.
//===================================================================
extern int RANDOM(int);
//-------------------------------------------------------------------
// Methods for class RSESDynamicReducer.
//===================================================================
//-------------------------------------------------------------------
// Constructors/destructor.
//===================================================================
//-------------------------------------------------------------------
// Method........: Constructor
// Author........: Aleksander 豩rn
// Date..........:
// Description...:
// Comments......: Sets default parameters.
// Revisions.....:
//===================================================================
RSESDynamicReducer::RSESDynamicReducer() {
reducer_ = NULL;
seed_ = 54321;
no_levels_ = 5;
no_samples_ = 10;
lower_percentage_ = 50;
upper_percentage_ = 90;
include_whole_ = false;
}
//-------------------------------------------------------------------
// Method........: Destructor
// Author........: Aleksander 豩rn
// Description...:
// Comments......:
// Revisions.....:
//===================================================================
RSESDynamicReducer::~RSESDynamicReducer() {
}
//-------------------------------------------------------------------
// Methods inherited from Identifier.
//===================================================================
IMPLEMENTIDMETHODS(RSESDynamicReducer, RSESDYNAMICREDUCER, RSESReducer)
//-------------------------------------------------------------------
// Methods inherited from Algorithm.
//===================================================================
//-------------------------------------------------------------------
// Method........: GetParameters
// Author........: Aleksander 豩rn
// Date..........:
// Description...:
// Comments......:
// Revisions.....:
//===================================================================
String
RSESDynamicReducer::GetParameters() const {
String parameters;
// Seed.
parameters += Keyword::Seed();
parameters += Keyword::Assignment();
parameters += String::Format(GetSeed());
parameters += Keyword::Separator();
// Levels.
parameters += Keyword::Levels();
parameters += Keyword::Assignment();
parameters += String::Format(GetNoLevels());
parameters += Keyword::Separator();
// Samples.
parameters += Keyword::Samples();
parameters += Keyword::Assignment();
parameters += String::Format(GetNoSamples());
parameters += Keyword::Separator();
// Lower percentage.
parameters += Keyword::Assignment();
parameters += String::Format(GetLowerPercentage());
parameters += Keyword::Separator();
// Upper percentage.
parameters += Keyword::Percentage() + Keyword::Dot() + Keyword::Upper();
parameters += Keyword::Assignment();
parameters += String::Format(GetUpperPercentage());
parameters += Keyword::Separator();
// IncludeWhole.
parameters += Keyword::IncludeWhole();
parameters += Keyword::Assignment();
parameters += String::Format(IncludeWholeTable());
parameters += Keyword::Separator();
// Reducer.
parameters += Keyword::Reducer();
parameters += Keyword::Assignment();
if (GetReducer() == NULL) {
parameters += "NULL";
}
else {
parameters += IdHolder::GetClassname(GetReducer()->GetId());
parameters += Keyword::Separator();
parameters += GetReducer()->GetParameters();
}
return parameters;
}
//-------------------------------------------------------------------
// Method........: SetParameter
// Author........: Aleksander 豩rn
// Date..........:
// Description...:
// Comments......:
// Revisions.....:
//===================================================================
bool
RSESDynamicReducer::SetParameter(const String &keyword, const String &value) {
// Seed.
if (keyword == Keyword::Seed() && value.IsInteger())
return SetSeed(value.GetInteger());
// Levels.
if (keyword == Keyword::Levels() && value.IsInteger())
return SetNoLevels(value.GetInteger());
// Samples.
if (keyword == Keyword::Samples() && value.IsInteger())
return SetNoSamples(value.GetInteger());
// Upper percentage.
if ((keyword == Keyword::Percentage() + Keyword::Dot() + Keyword::Upper()) && value.IsInteger())
return SetUpperPercentage(value.GetInteger());
// Upper percentage (backwards compatibility).
if (keyword == Keyword::UPercentage() && value.IsInteger())
return SetUpperPercentage(value.GetInteger());
// Lower percentage.
if ((keyword == Keyword::Percentage() + Keyword::Dot() + Keyword::Lower()) && value.IsInteger())
return SetLowerPercentage(value.GetInteger());
// Lower percentage (backwards compatibility).
if (keyword == Keyword::LPercentage() && value.IsInteger())
return SetLowerPercentage(value.GetInteger());
// IncludeWhole.
if (keyword == Keyword::IncludeWhole() && value.IsBoolean())
return IncludeWholeTable(value.GetBoolean());
// Reducer.
if (keyword == Keyword::Reducer()) {
Handle<Algorithm> algorithm = ObjectManager::GetIdentifiedAlgorithm(IdHolder::GetId(value));
if (algorithm != NULL && !algorithm->IsA(RSESSTATICREDUCER)) {
Message::Error("Specified reducer is not a non-dynamic RSESReducer.");
return false;
}
return SetReducer(dynamic_cast(RSESStaticReducer *, algorithm.GetPointer()));
}
// Pass on to reducer?
if (GetReducer() != NULL) {
if (GetReducer()->SetParameter(keyword, value))
return true;
}
return RSESReducer::SetParameter(keyword, value);
}
//-------------------------------------------------------------------
// Method........: Apply
// Author........: Aleksander 豩rn
// Date..........:
// Description...:
// Comments......:
// Revisions.....:
//===================================================================
Structure *
RSESDynamicReducer::Apply(Structure &structure) const {
// Is the input structure of right type?
if (!IsApplicable(structure))
return NULL;
// Is a proper RSES reducer set?
if (GetReducer() == NULL) {
Message::Error("No reducer has been set.");
return NULL;
}
// Work-around bug in RSES library.
if (GetUpperPercentage() <= GetLowerPercentage()) {
Message::Error("The upper sampling percentage must be strictly higher than the lower sampling percentage.");
return NULL;
}
// Hack setting seed for RNG used by RSES library.
try {
RANDOM(1);
}
catch (Error &error) {
Message::RSESError("Error initializing the RSES library RNG.", error.GetMessage());
return NULL;
}
// Reinitialize the internal RNG used by the RSES library.
srand(GetSeed());
// Set dynamic parameters in embedded RSES library.
int no_levels = GetNoLevels();
int no_samples = GetNoSamples();
int no_obj_upper = GetUpperPercentage();
int no_obj_lower = GetLowerPercentage();
int include_whole_tab = (IncludeWholeTable()) ? 1 : 0;
try {
GetReducer()->algorithm_->SetCalcDynamicRedParam(no_levels, no_samples, no_obj_upper, no_obj_lower, include_whole_tab);
}
catch (Error &error) {
Message::RSESError("Error setting RSES dynamic parameters.", error.GetMessage());
return NULL;
}
// Ugly hack: Set dynamic flag in set RSESReducer.
GetReducer()->IsDynamicComponent(true);
// Compute reducts.
Handle<Structure> result = structure.Apply(*GetReducer());
// Ugly hack: Reset dynamic flag in set RSESReducer.
GetReducer()->IsDynamicComponent(false);
return result.Release();
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -