⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 rsesdynamicreducer.cpp

📁 粗慥集成算法集合 ,并有详细的文档资料和测试数据处
💻 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
// Date..........:
// 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::Percentage() + Keyword::Dot() + Keyword::Lower();
	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 + -