/**
*
* Copyright (c) 2005-2021 by Pierre-Henri WUILLEMIN(_at_LIP6) & Christophe GONZALES(_at_AMU)
* info_at_agrum_dot_org
*
* This library is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This library 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 Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this library. If not, see .
*
*/
#include
#include
#include
#include
#include
#include
namespace gum_tests {
class AprioriSmoothingTestSuite: public CxxTest::TestSuite {
public:
void test1() {
// create the translator set
gum::LabelizedVariable var1("X1", "", 0);
var1.addLabel("0");
var1.addLabel("1");
var1.addLabel("2");
gum::LabelizedVariable var2("X2", "", 0);
var2.addLabel("0");
var2.addLabel("1");
var2.addLabel("2");
var2.addLabel("3");
gum::learning::DBTranslatorSet<> trans_set;
{
const std::vector< std::string > miss;
gum::learning::DBTranslator4LabelizedVariable<> translator1(var1, miss);
gum::learning::DBTranslator4LabelizedVariable<> translator2(var2, miss);
std::vector< std::string > names{"A", "B", "C", "D", "E", "F"};
for (std::size_t i = std::size_t(0); i < names.size(); ++i) {
// translator.setName ( name );
if (i % 2 == 0) {
trans_set.insertTranslator(translator1, i);
} else {
trans_set.insertTranslator(translator2, i);
}
}
}
gum::learning::DatabaseTable<> database(trans_set);
gum::learning::AprioriSmoothing<> apriori(database);
TS_ASSERT_EQUALS(apriori.weight(), 1.0)
apriori.setWeight(4.0);
TS_ASSERT_EQUALS(apriori.weight(), 4.0)
TS_ASSERT_EQUALS(apriori.getType(), "Smoothing")
TS_ASSERT(apriori.isOfType("Smoothing"))
TS_ASSERT(!apriori.isOfType("NoApriori"))
gum::NodeId node0 = 0;
gum::NodeId node1 = 1;
gum::NodeId node3 = 3;
gum::NodeId node4 = 4;
gum::NodeId node5 = 5;
std::vector< gum::NodeId > cond_empty;
std::vector< gum::NodeId > cond1{node3, node5, node4};
gum::learning::IdCondSet<> idset1(node0, cond_empty); // #3,#0
gum::learning::IdCondSet<> idset2(node0, node1, cond_empty,
true); // #12,#0
gum::learning::IdCondSet<> idset3(node1, node0, cond1, true,
true); // #576,#48
std::vector< double > vect(3, 1.0);
apriori.addAllApriori(idset1, vect);
for (const auto val: vect) {
TS_ASSERT_EQUALS(val, 5.0)
}
vect.clear();
apriori.addConditioningApriori(idset1, vect);
vect.clear();
vect.resize(12, 1.0);
apriori.addAllApriori(idset2, vect);
for (const auto val: vect) {
TS_ASSERT_EQUALS(val, 5.0)
}
vect.clear();
apriori.addConditioningApriori(idset2, vect);
vect.clear();
vect.resize(576, 1.0);
apriori.addAllApriori(idset3, vect);
for (const auto val: vect) {
TS_ASSERT_EQUALS(val, 5.0)
}
vect.clear();
vect.resize(48, 1.0);
apriori.addConditioningApriori(idset3, vect);
for (const auto val: vect) {
TS_ASSERT_EQUALS(val, 49.0)
}
gum::learning::AprioriSmoothing<> apriori2(apriori);
TS_ASSERT_EQUALS(apriori2.weight(), 4.0)
apriori2.setWeight(2.0);
TS_ASSERT_EQUALS(apriori2.weight(), 2.0)
TS_ASSERT_EQUALS(apriori2.getType(), "Smoothing")
TS_ASSERT(apriori2.isOfType("Smoothing"))
TS_ASSERT(!apriori2.isOfType("NoApriori"))
vect.clear();
vect.resize(3, 1.0);
apriori2.addAllApriori(idset1, vect);
for (const auto val: vect) {
TS_ASSERT_EQUALS(val, 3.0)
}
vect.clear();
apriori2.addConditioningApriori(idset1, vect);
vect.clear();
vect.resize(12, 1.0);
apriori2.addAllApriori(idset2, vect);
for (const auto val: vect) {
TS_ASSERT_EQUALS(val, 3.0)
}
vect.clear();
apriori2.addConditioningApriori(idset2, vect);
vect.clear();
vect.resize(576, 1.0);
apriori2.addAllApriori(idset3, vect);
for (const auto val: vect) {
TS_ASSERT_EQUALS(val, 3.0)
}
vect.clear();
vect.resize(48, 1.0);
apriori2.addConditioningApriori(idset3, vect);
for (const auto val: vect) {
TS_ASSERT_EQUALS(val, 25.0)
}
gum::learning::AprioriSmoothing<> apriori3(std::move(apriori2));
TS_ASSERT_EQUALS(apriori3.weight(), 2.0)
apriori3.setWeight(4.0);
TS_ASSERT_EQUALS(apriori3.weight(), 4.0)
TS_ASSERT_EQUALS(apriori3.getType(), "Smoothing")
TS_ASSERT(apriori3.isOfType("Smoothing"))
TS_ASSERT(!apriori3.isOfType("NoApriori"))
vect.clear();
vect.resize(3, 1.0);
apriori3.addAllApriori(idset1, vect);
for (const auto val: vect) {
TS_ASSERT_EQUALS(val, 5.0)
}
vect.clear();
apriori3.addConditioningApriori(idset1, vect);
vect.clear();
vect.resize(12, 1.0);
apriori3.addAllApriori(idset2, vect);
for (const auto val: vect) {
TS_ASSERT_EQUALS(val, 5.0)
}
vect.clear();
apriori3.addConditioningApriori(idset2, vect);
vect.clear();
vect.resize(576, 1.0);
apriori3.addAllApriori(idset3, vect);
for (const auto val: vect) {
TS_ASSERT_EQUALS(val, 5.0)
}
vect.clear();
vect.resize(48, 1.0);
apriori3.addConditioningApriori(idset3, vect);
for (const auto val: vect) {
TS_ASSERT_EQUALS(val, 49.0)
}
gum::learning::AprioriSmoothing<>* apriori4 = apriori.clone();
TS_ASSERT_EQUALS(apriori4->weight(), 4.0)
apriori4->setWeight(2.0);
TS_ASSERT_EQUALS(apriori4->weight(), 2.0)
TS_ASSERT_EQUALS(apriori4->getType(), "Smoothing")
TS_ASSERT(apriori4->isOfType("Smoothing"))
TS_ASSERT(!apriori4->isOfType("NoApriori"))
vect.clear();
vect.resize(3, 1.0);
apriori4->addAllApriori(idset1, vect);
for (const auto val: vect) {
TS_ASSERT_EQUALS(val, 3.0)
}
vect.clear();
apriori4->addConditioningApriori(idset1, vect);
vect.clear();
vect.resize(12, 1.0);
apriori4->addAllApriori(idset2, vect);
for (const auto val: vect) {
TS_ASSERT_EQUALS(val, 3.0)
}
vect.clear();
apriori4->addConditioningApriori(idset2, vect);
vect.clear();
vect.resize(576, 1.0);
apriori4->addAllApriori(idset3, vect);
for (const auto val: vect) {
TS_ASSERT_EQUALS(val, 3.0)
}
vect.clear();
vect.resize(48, 1.0);
apriori4->addConditioningApriori(idset3, vect);
for (const auto val: vect) {
TS_ASSERT_EQUALS(val, 25.0)
}
delete apriori4;
gum::learning::DatabaseTable<> database2;
gum::learning::AprioriSmoothing<> apriori5(database2);
apriori5 = apriori;
TS_ASSERT_EQUALS(apriori5.weight(), 4.0)
apriori5.setWeight(2.0);
TS_ASSERT_EQUALS(apriori5.weight(), 2.0)
TS_ASSERT_EQUALS(apriori5.getType(), "Smoothing")
TS_ASSERT(apriori5.isOfType("Smoothing"))
TS_ASSERT(!apriori5.isOfType("NoApriori"))
vect.clear();
vect.resize(3, 1.0);
apriori5.addAllApriori(idset1, vect);
for (const auto val: vect) {
TS_ASSERT_EQUALS(val, 3.0)
}
vect.clear();
apriori5.addConditioningApriori(idset1, vect);
vect.clear();
vect.resize(12, 1.0);
apriori5.addAllApriori(idset2, vect);
for (const auto val: vect) {
TS_ASSERT_EQUALS(val, 3.0)
}
vect.clear();
apriori5.addConditioningApriori(idset2, vect);
vect.clear();
vect.resize(576, 1.0);
apriori5.addAllApriori(idset3, vect);
for (const auto val: vect) {
TS_ASSERT_EQUALS(val, 3.0)
}
vect.clear();
vect.resize(48, 1.0);
apriori5.addConditioningApriori(idset3, vect);
for (const auto val: vect) {
TS_ASSERT_EQUALS(val, 25.0)
}
apriori5 = std::move(apriori);
TS_ASSERT_EQUALS(apriori5.weight(), 4.0)
apriori5.setWeight(1.0);
TS_ASSERT_EQUALS(apriori5.weight(), 1.0)
TS_ASSERT_EQUALS(apriori5.getType(), "Smoothing")
TS_ASSERT(apriori5.isOfType("Smoothing"))
TS_ASSERT(!apriori5.isOfType("NoApriori"))
vect.clear();
vect.resize(3, 1.0);
apriori5.addAllApriori(idset1, vect);
for (const auto val: vect) {
TS_ASSERT_EQUALS(val, 2.0)
}
vect.clear();
apriori5.addConditioningApriori(idset1, vect);
vect.clear();
vect.resize(12, 1.0);
apriori5.addAllApriori(idset2, vect);
for (const auto val: vect) {
TS_ASSERT_EQUALS(val, 2.0)
}
vect.clear();
apriori5.addConditioningApriori(idset2, vect);
vect.clear();
vect.resize(576, 1.0);
apriori5.addAllApriori(idset3, vect);
for (const auto val: vect) {
TS_ASSERT_EQUALS(val, 2.0)
}
vect.clear();
vect.resize(48, 1.0);
apriori5.addConditioningApriori(idset3, vect);
for (const auto val: vect) {
TS_ASSERT_EQUALS(val, 13.0)
}
}
void test2() {
// create the translator set
gum::LabelizedVariable var1("X1", "", 0);
var1.addLabel("0");
var1.addLabel("1");
var1.addLabel("2");
gum::LabelizedVariable var2("X2", "", 0);
var2.addLabel("0");
var2.addLabel("1");
var2.addLabel("2");
var2.addLabel("3");
gum::learning::DBTranslatorSet<> trans_set;
{
const std::vector< std::string > miss;
gum::learning::DBTranslator4LabelizedVariable<> translator1(var1, miss);
gum::learning::DBTranslator4LabelizedVariable<> translator2(var2, miss);
std::vector< std::string > names{"A", "B", "C", "D", "E", "F"};
for (std::size_t i = std::size_t(0); i < names.size(); ++i) {
// translator.setName ( name );
if (i % 2 == 0) {
trans_set.insertTranslator(translator1, i);
} else {
trans_set.insertTranslator(translator2, i);
}
}
}
gum::learning::DatabaseTable<> database(trans_set);
gum::NodeId node0 = 0;
gum::NodeId node1 = 1;
gum::NodeId node2 = 2;
gum::NodeId node3 = 3;
gum::NodeId node4 = 4;
gum::NodeId node5 = 5;
gum::Bijection< gum::NodeId, std::size_t > nodeId2columns;
nodeId2columns.insert(node0, std::size_t(1));
nodeId2columns.insert(node1, std::size_t(3));
nodeId2columns.insert(node2, std::size_t(0));
nodeId2columns.insert(node3, std::size_t(2));
nodeId2columns.insert(node4, std::size_t(4));
nodeId2columns.insert(node5, std::size_t(5));
gum::learning::AprioriSmoothing<> apriori(database, nodeId2columns);
TS_ASSERT_EQUALS(apriori.weight(), 1.0)
apriori.setWeight(4.0);
TS_ASSERT_EQUALS(apriori.weight(), 4.0)
TS_ASSERT_EQUALS(apriori.getType(), "Smoothing")
TS_ASSERT(apriori.isOfType("Smoothing"))
TS_ASSERT(!apriori.isOfType("NoApriori"))
std::vector< gum::NodeId > cond_empty;
std::vector< gum::NodeId > cond1{node3, node5, node4};
gum::learning::IdCondSet<> idset1(node0, cond_empty); // #4,#0
gum::learning::IdCondSet<> idset2(node0, node1, cond_empty,
true); // #16,#0
gum::learning::IdCondSet<> idset3(node1, node0, cond1, true,
true); // #576,#36
std::vector< double > vect(4, 1.0);
apriori.addAllApriori(idset1, vect);
for (const auto val: vect) {
TS_ASSERT_EQUALS(val, 5.0)
}
vect.clear();
apriori.addConditioningApriori(idset1, vect);
vect.clear();
vect.resize(16, 1.0);
apriori.addAllApriori(idset2, vect);
for (const auto val: vect) {
TS_ASSERT_EQUALS(val, 5.0)
}
vect.clear();
apriori.addConditioningApriori(idset2, vect);
vect.clear();
vect.resize(576, 1.0);
apriori.addAllApriori(idset3, vect);
for (const auto val: vect) {
TS_ASSERT_EQUALS(val, 5.0)
}
vect.clear();
vect.resize(36, 1.0);
apriori.addConditioningApriori(idset3, vect);
for (const auto val: vect) {
TS_ASSERT_EQUALS(val, 65.0)
}
gum::learning::AprioriSmoothing<> apriori2(apriori);
TS_ASSERT_EQUALS(apriori2.weight(), 4.0)
apriori2.setWeight(2.0);
TS_ASSERT_EQUALS(apriori2.weight(), 2.0)
TS_ASSERT_EQUALS(apriori2.getType(), "Smoothing")
TS_ASSERT(apriori2.isOfType("Smoothing"))
TS_ASSERT(!apriori2.isOfType("NoApriori"))
vect.clear();
vect.resize(4, 1.0);
apriori2.addAllApriori(idset1, vect);
for (const auto val: vect) {
TS_ASSERT_EQUALS(val, 3.0)
}
vect.clear();
apriori2.addConditioningApriori(idset1, vect);
vect.clear();
vect.resize(16, 1.0);
apriori2.addAllApriori(idset2, vect);
for (const auto val: vect) {
TS_ASSERT_EQUALS(val, 3.0)
}
vect.clear();
apriori2.addConditioningApriori(idset2, vect);
vect.clear();
vect.resize(576, 1.0);
apriori2.addAllApriori(idset3, vect);
for (const auto val: vect) {
TS_ASSERT_EQUALS(val, 3.0)
}
vect.clear();
vect.resize(36, 1.0);
apriori2.addConditioningApriori(idset3, vect);
for (const auto val: vect) {
TS_ASSERT_EQUALS(val, 33.0)
}
gum::learning::AprioriSmoothing<> apriori3(std::move(apriori2));
TS_ASSERT_EQUALS(apriori3.weight(), 2.0)
apriori3.setWeight(4.0);
TS_ASSERT_EQUALS(apriori3.weight(), 4.0)
TS_ASSERT_EQUALS(apriori3.getType(), "Smoothing")
TS_ASSERT(apriori3.isOfType("Smoothing"))
TS_ASSERT(!apriori3.isOfType("NoApriori"))
vect.clear();
vect.resize(4, 1.0);
apriori3.addAllApriori(idset1, vect);
for (const auto val: vect) {
TS_ASSERT_EQUALS(val, 5.0)
}
vect.clear();
apriori3.addConditioningApriori(idset1, vect);
vect.clear();
vect.resize(16, 1.0);
apriori3.addAllApriori(idset2, vect);
for (const auto val: vect) {
TS_ASSERT_EQUALS(val, 5.0)
}
vect.clear();
apriori3.addConditioningApriori(idset2, vect);
vect.clear();
vect.resize(576, 1.0);
apriori3.addAllApriori(idset3, vect);
for (const auto val: vect) {
TS_ASSERT_EQUALS(val, 5.0)
}
vect.clear();
vect.resize(36, 1.0);
apriori3.addConditioningApriori(idset3, vect);
for (const auto val: vect) {
TS_ASSERT_EQUALS(val, 65.0)
}
gum::learning::AprioriSmoothing<>* apriori4 = apriori.clone();
TS_ASSERT_EQUALS(apriori4->weight(), 4.0)
apriori4->setWeight(2.0);
TS_ASSERT_EQUALS(apriori4->weight(), 2.0)
TS_ASSERT_EQUALS(apriori4->getType(), "Smoothing")
TS_ASSERT(apriori4->isOfType("Smoothing"))
TS_ASSERT(!apriori4->isOfType("NoApriori"))
vect.clear();
vect.resize(4, 1.0);
apriori4->addAllApriori(idset1, vect);
for (const auto val: vect) {
TS_ASSERT_EQUALS(val, 3.0)
}
vect.clear();
apriori4->addConditioningApriori(idset1, vect);
vect.clear();
vect.resize(16, 1.0);
apriori4->addAllApriori(idset2, vect);
for (const auto val: vect) {
TS_ASSERT_EQUALS(val, 3.0)
}
vect.clear();
apriori4->addConditioningApriori(idset2, vect);
vect.clear();
vect.resize(576, 1.0);
apriori4->addAllApriori(idset3, vect);
for (const auto val: vect) {
TS_ASSERT_EQUALS(val, 3.0)
}
vect.clear();
vect.resize(36, 1.0);
apriori4->addConditioningApriori(idset3, vect);
for (const auto val: vect) {
TS_ASSERT_EQUALS(val, 33.0)
}
delete apriori4;
gum::learning::DatabaseTable<> database2;
gum::learning::AprioriSmoothing<> apriori5(database2);
apriori5 = apriori;
TS_ASSERT_EQUALS(apriori5.weight(), 4.0)
apriori5.setWeight(2.0);
TS_ASSERT_EQUALS(apriori5.weight(), 2.0)
TS_ASSERT_EQUALS(apriori5.getType(), "Smoothing")
TS_ASSERT(apriori5.isOfType("Smoothing"))
TS_ASSERT(!apriori5.isOfType("NoApriori"))
vect.clear();
vect.resize(4, 1.0);
apriori5.addAllApriori(idset1, vect);
for (const auto val: vect) {
TS_ASSERT_EQUALS(val, 3.0)
}
vect.clear();
apriori5.addConditioningApriori(idset1, vect);
vect.clear();
vect.resize(16, 1.0);
apriori5.addAllApriori(idset2, vect);
for (const auto val: vect) {
TS_ASSERT_EQUALS(val, 3.0)
}
vect.clear();
apriori5.addConditioningApriori(idset2, vect);
vect.clear();
vect.resize(576, 1.0);
apriori5.addAllApriori(idset3, vect);
for (const auto val: vect) {
TS_ASSERT_EQUALS(val, 3.0)
}
vect.clear();
vect.resize(36, 1.0);
apriori5.addConditioningApriori(idset3, vect);
for (const auto val: vect) {
TS_ASSERT_EQUALS(val, 33.0)
}
apriori5 = std::move(apriori);
TS_ASSERT_EQUALS(apriori5.weight(), 4.0)
apriori5.setWeight(1.0);
TS_ASSERT_EQUALS(apriori5.weight(), 1.0)
TS_ASSERT_EQUALS(apriori5.getType(), "Smoothing")
TS_ASSERT(apriori5.isOfType("Smoothing"))
TS_ASSERT(!apriori5.isOfType("NoApriori"))
vect.clear();
vect.resize(4, 1.0);
apriori5.addAllApriori(idset1, vect);
for (const auto val: vect) {
TS_ASSERT_EQUALS(val, 2.0)
}
vect.clear();
apriori5.addConditioningApriori(idset1, vect);
vect.clear();
vect.resize(16, 1.0);
apriori5.addAllApriori(idset2, vect);
for (const auto val: vect) {
TS_ASSERT_EQUALS(val, 2.0)
}
vect.clear();
apriori5.addConditioningApriori(idset2, vect);
vect.clear();
vect.resize(576, 1.0);
apriori5.addAllApriori(idset3, vect);
for (const auto val: vect) {
TS_ASSERT_EQUALS(val, 2.0)
}
vect.clear();
vect.resize(36, 1.0);
apriori5.addConditioningApriori(idset3, vect);
for (const auto val: vect) {
TS_ASSERT_EQUALS(val, 17.0)
}
}
};
} /* namespace gum_tests */