OverviewFilesCommitsIssuesDocsReleasesPeers

opencog-ure / tests / ure / backwardchainer / ControlPolicyUTest.cxxtest

173 lines · cxxtest ref:
/*
 * ControlPolicyUTest.cxxtest
 *
 *  Created on: Sep 6, 2017
 *      Authors: Nil Geisweiller
 */

#include <opencog/ure/backwardchainer/ControlPolicy.h>
#include <opencog/ure/backwardchainer/BIT.h>
#include <opencog/guile/SchemeEval.h>
#include <opencog/atomspace/AtomSpace.h>
#include <opencog/util/mt19937ar.h>
#include <opencog/ure/URELogger.h>

#include <cxxtest/TestSuite.h>

using namespace std;
using namespace opencog;

#define cal _control_as->add_link
#define can _control_as->add_node
#define dal _dummy_as->add_link
#define dan _dummy_as->add_node

class ControlPolicyUTest: public CxxTest::TestSuite
{
private:
	AtomSpacePtr _control_as;
	SchemeEval _eval;
	ControlPolicy* _cp;

	AtomSpacePtr _dummy_as;
	UREConfig _dummy_ure_conf;
	Handle _dummy_target;

	void reset_bc();

public:
	ControlPolicyUTest();

	void setUp();
	void tearDown();

	void test_fetch_control_rules();
	void test_is_control_rule_active_1();
	void test_is_control_rule_active_2();
};

ControlPolicyUTest::ControlPolicyUTest() :
	_control_as(createAtomSpace()),
	_eval(_control_as),
	_dummy_as(createAtomSpace()),
	_dummy_ure_conf(*_dummy_as.get(), dan(CONCEPT_NODE, "dummy-rbs"))
{
	logger().set_level(Logger::DEBUG);
	logger().set_timestamp_flag(false);
	// logger().set_sync_flag(true);
	logger().set_print_to_stdout_flag(true);
	ure_logger().set_level(Logger::INFO);
	// ure_logger().set_timestamp_flag(false);
	// ure_logger().set_sync_flag(true);
	// ure_logger().set_print_to_stdout_flag(true);
	randGen().seed(0);

	string cur_ppp_dir = string(PROJECT_SOURCE_DIR),
		cur_pp_dir = cur_ppp_dir + "/tests",
		cur_p_dir = cur_pp_dir + "/ure",
		cur_dir = cur_p_dir + "/backwardchainer",
		scm_dir = cur_dir + "/scm";
	vector<string> load_paths = {cur_ppp_dir,
	                             cur_pp_dir,
	                             cur_p_dir,
	                             cur_dir,
	                             scm_dir};
	for (string& p : load_paths)
	{
		string eval_str = string("(add-to-load-path \"") + p + string("\")");
		_eval.eval(eval_str);
	}

	// Set dummy target
	_dummy_target = dan(CONCEPT_NODE, "dummy-target");
}

void ControlPolicyUTest::setUp()
{
}

void ControlPolicyUTest::tearDown()
{
	_control_as->clear();
	delete(_cp);
}

void ControlPolicyUTest::test_fetch_control_rules()
{
	logger().debug("BEGIN TEST: %s", __FUNCTION__);

	_eval.eval("(load-from-path \"control-rules.scm\")");
	_cp = new ControlPolicy(_dummy_ure_conf, BIT(), _dummy_target, _control_as.get());

	Handle rule_1_alias = _eval.eval_h("(DefinedSchemaNode \"rule-1\")");
	HandleSet control_1_rules = _cp->fetch_expansion_control_rules(rule_1_alias);
	logger().debug() << "control_1_rules = " << oc_to_string(control_1_rules);
	TS_ASSERT_EQUALS(control_1_rules.size(), 1);

	Handle rule_2_alias = _eval.eval_h("(DefinedSchemaNode \"rule-2\")");
	HandleSet control_2_rules = _cp->fetch_expansion_control_rules(rule_2_alias);
	logger().debug() << "control_2_rules = " << oc_to_string(control_2_rules);
	TS_ASSERT_EQUALS(control_2_rules.size(), 1);

	logger().debug("END TEST: %s", __FUNCTION__);
}

void ControlPolicyUTest::test_is_control_rule_active_1()
{
	logger().debug("BEGIN TEST: %s", __FUNCTION__);

	// Fetch context sensitive rule
	_eval.eval("(load-from-path \"control-rules.scm\")");
	_cp = new ControlPolicy(_dummy_ure_conf, BIT(), _dummy_target, _control_as.get());
	Handle rule_2_alias = _eval.eval_h("(DefinedSchemaNode \"rule-2\")");
	HandleSet control_2_rules = _cp->fetch_expansion_control_rules(rule_2_alias);
	Handle ctrl_rule = *control_2_rules.begin();

	Handle inference_tree = _eval.eval_h("(BindLink"
	                                     "  (AndLink)"
	                                     "  (InheritanceLink"
	                                     "    (ConceptNode \"a\")"
	                                     "    (ConceptNode \"p\")))");
	AndBIT andbit(inference_tree);

	Handle leaf = _eval.eval_h("(InheritanceLink"
	                           "  (ConceptNode \"a\")"
	                           "  (ConceptNode \"p\"))");
	BITNode bitnode(leaf);

	TS_ASSERT(_cp->is_control_rule_active(andbit, bitnode, ctrl_rule));

	logger().debug("END TEST: %s", __FUNCTION__);
}

void ControlPolicyUTest::test_is_control_rule_active_2()
{
	logger().debug("BEGIN TEST: %s", __FUNCTION__);

	// Fetch context sensitive rule
	_eval.eval("(load-from-path \"control-rules.scm\")");
	Handle target = dal(INHERITANCE_LINK,
	                    dan(CONCEPT_NODE, "q"),
	                    dan(CONCEPT_NODE, "u"));
	_cp = new ControlPolicy(_dummy_ure_conf, BIT(), target, _control_as.get());
	Handle rule_3_alias = _eval.eval_h("(DefinedSchemaNode \"rule-3\")");
	HandleSet control_3_rules = _cp->fetch_expansion_control_rules(rule_3_alias);
	Handle ctrl_rule = *control_3_rules.begin();

	Handle inference_tree = _eval.eval_h("(BindLink"
	                                     "  (AndLink)"
	                                     "  (InheritanceLink"
	                                     "    (ConceptNode \"q\")"
	                                     "    (ConceptNode \"u\")))");
	AndBIT andbit(inference_tree);

	Handle leaf = target;
	BITNode bitnode(leaf);

	// Check that the control rule is not active, since the actual
	// target doesn't match the pattern target in the control rule.
	TS_ASSERT(not _cp->is_control_rule_active(andbit, bitnode, ctrl_rule));

	logger().debug("END TEST: %s", __FUNCTION__);
}