def _beta_setup(): with kb_context("test_predicate_node"): kb = KnowledgeBase() pn = get_beta_predicate_node(BOOPType,"B", "<", BOOPType,"B") # kb.add_subscriber(pn) ld = generate_link_data(pn, kb) idrecs = np.empty((100,),dtype=np.int64) for i in range(100): idrecs[i] = kb.declare(BOOP("?",i)) return (kb, pn, ld, np.arange(100), idrecs), {}
def test_retract_keyerror(): with kb_context("test_retract_keyerror"): #NRT version kb = KnowledgeBase() with pytest.raises(KeyError): retract_keyerror(kb) #Python version kb = KnowledgeBase() with pytest.raises(KeyError): retract_keyerror.py_func(kb)
def test_matching(): with kb_context("test_link"): BOOP, BOOPType = define_fact("BOOP", {"A": "string", "B": "number"}) l1, l2 = Var(BOOPType, "l1"), Var(BOOPType, "l2") r1, r2 = Var(BOOPType, "r1"), Var(BOOPType, "r2") c = (l1.B > 0) & (l1.B != 3) & (l1.B < 4) & (l2.B != 3) | \ (l1.B == 3) kb = KnowledgeBase() kb.declare(BOOP("0", 0)) kb.declare(BOOP("1", 1)) kb.declare(BOOP("2", 2)) kb.declare(BOOP("3", 3)) kb.declare(BOOP("4", 4)) cl = get_linked_conditions_instance(c, kb) conditions_get_matches(cl) print("----------") c = (l1.B <= 1) & (l1.B < l2.B) & (l2.B <= r1.B) cl = get_linked_conditions_instance(c, kb) conditions_get_matches(cl)
def test_predicate_node_sanity(): with kb_context("test_predicate_node_sanity"): BOOP, BOOPType = define_fact("BOOP",{"A": "string", "B" : "number"}) kb = KnowledgeBase() pn = get_alpha_predicate_node(BOOPType,"B", "<",9) pnc = cast(pn, BasePredicateNodeType) png = cast(pn, GenericAlphaPredicateNodeType) attrs_pn = np.array([struct_get_attr_offset(pnc,x[0]) for x in base_subscriber_fields+basepredicate_node_fields]) attrs_pnc = np.array([struct_get_attr_offset(pn, x[0]) for x in base_subscriber_fields+alpha_predicate_node_fields]) attrs_png = np.array([struct_get_attr_offset(png,x[0]) for x in base_subscriber_fields+alpha_predicate_node_fields]) assert np.array_equal(attrs_pn,attrs_pnc[:len(attrs_pn)]) assert np.array_equal(attrs_pn,attrs_png[:len(attrs_pn)]) assert np.array_equal(attrs_pnc,attrs_png) ld = generate_link_data(pnc, kb) assert len(filter_alpha(png, ld, np.arange(5)))==0 pn = get_beta_predicate_node(BOOPType,"B", "<", BOOPType,"B") pnc = cast(pn, BasePredicateNodeType) png = cast(pn, GenericBetaPredicateNodeType) ld = generate_link_data(pnc, kb) attrs_pn = np.array([struct_get_attr_offset(pnc,x[0]) for x in base_subscriber_fields+basepredicate_node_fields]) attrs_pnc = np.array([struct_get_attr_offset(pn, x[0]) for x in base_subscriber_fields+beta_predicate_node_fields]) attrs_png = np.array([struct_get_attr_offset(png,x[0]) for x in base_subscriber_fields+beta_predicate_node_fields]) assert np.array_equal(attrs_pn,attrs_pnc[:len(attrs_pn)]) assert np.array_equal(attrs_pn,attrs_png[:len(attrs_pn)]) assert np.array_equal(attrs_pnc,attrs_png) assert len(filter_beta(png, ld, np.arange(5), np.arange(5))) == 0
def _benchmark_setup(): with kb_context("test_predicate_node"): kb = KnowledgeBase() pn = get_alpha_predicate_node(BOOPType,"B", "<",50) ld = generate_link_data(pn,kb) # kb.add_subscriber(pn) return (kb, pn, ld), {}
def test_all_facts_of_type(): with kb_context("test_all_facts_of_type"): #NRT version kb = KnowledgeBase() declare_retract(kb) all_tf = all_of_type(kb) assert isinstance(all_tf[0], TextField) assert len(all_tf) == 90 all_tf = all_of_type.py_func(kb) assert isinstance(all_tf[0], TextField) assert len(all_tf) == 90
def test_protected_mutability(): print("RUNTIME1.") with kb_context("test_protected_mutability") as context: print("RUNTIME1.2") spec = {"A": "string", "B": "number"} BOOP, BOOPType = define_fact("BOOP", spec, context="test_protected_mutability") print("RUNTIME1.3") kb = KnowledgeBase(context="test_protected_mutability") print("RUNTIME1") b1 = BOOP("A", 0) b2 = BOOP("B", 0) print("RUNTIME1") @njit def edit_it(b): b.B += 1 print("RUNTIME2") edit_it(b1) edit_it(b2) # edit_it.py_func(b2) print("RUNTIME3") @njit def declare_it(kb, b, name): kb.declare(b, name) print("RUNTIME3.1", b1.fact_num) declare_it(kb, b1, "b1") print("RUNTIME3.2") declare_it.py_func(kb, b2, "b2") print("RUNTIMEz") with pytest.raises(AttributeError): print("RUNTIME_PY") edit_it.py_func(b1) with pytest.raises(AttributeError): print("RUNTIME_PY") edit_it.py_func(b2) with pytest.raises(AttributeError): print("RUNTIME_NB", b1.B) edit_it(b1) with pytest.raises(AttributeError): print("RUNTIME_NB", b1.B) edit_it(b1)
def test_declare_retract(): with kb_context("test_declare_retract"): #NRT version kb = KnowledgeBase() assert declare_retract(kb) == 10 assert declare_again(kb) == 0 #Python version kb = KnowledgeBase() assert declare_retract.py_func(kb) == 10 assert declare_again.py_func(kb) == 0 with pytest.raises(TypingError): bad_declare_type(kb) with pytest.raises(TypingError): bad_declare_type.py_func(kb) with pytest.raises(TypingError): bad_retract_type(kb) with pytest.raises(TypingError): bad_retract_type.py_func(kb)
def test_modify(): with kb_context("test_modify"): TextField, TextFieldType = define_fact("TextField", tf_spec) kb = KnowledgeBase() fact = TextField("A", "B", "C", "D", "E") modify_right(kb, fact, "nb") assert fact.to_right == "nb" modify_right.py_func(kb, fact, "py") assert fact.to_right == "py" with pytest.raises(TypingError): bad_modify_type(kb) with pytest.raises(TypingError): bad_modify_type.py_func(kb)
def test_link(): with kb_context() as context: print(context.fact_types) # BOOP, BOOPType = define_fact("BOOP",{"A": "string", "B" : "number"}) l1, l2 = Var(BOOPType, "l1"), Var(BOOPType, "l2") r1, r2 = Var(BOOPType, "r1"), Var(BOOPType, "r2") c = (l1.B < 1) & (l1.B > 7) & (l2.B < r1.B) & (r2.B < l1.B) |\ (l2.B < 1) & (l2.B > 7) & (l2.B < r1.B) & (r1.B < r2.B) |\ (l2.B < 1) & (l2.B > 7) & (l2.B < r1.B) & (l1.B < l2.B) kb = KnowledgeBase() cl = get_linked_conditions_instance(c, kb) assert get_pointer(cl) == get_pointer(c) cl = get_linked_conditions_instance(c, kb, copy=True) assert get_pointer(cl) != get_pointer(c)
def test_grow_change_queues(): with kb_context("test_grow_change_queues"): TextField, TextFieldType = define_fact("TextField", tf_spec) #NRT version kb = KnowledgeBase() dummy_subscriber = dummy_subscriber_ctor() kb.add_subscriber(dummy_subscriber) idrec = kb.declare(TextField("A", "B", "C", "D", "E")) # assert kb.kb_data.subscribers[0].grow_queue.data[0] == idrec gr_q = kb.kb_data.grow_queue assert gr_q.data[gr_q.head - 1] == idrec kb.retract(idrec) # assert kb.kb_data.subscribers[0].change_queue.data[0] == idrec ch_q = kb.kb_data.change_queue assert ch_q.data[ch_q.head - 1] == idrec
def test_alpha_predicate_node(): with kb_context("test_alpha_predicate_node"): BOOP, BOOPType = define_fact("BOOP",{"A": "string", "B" : "number"}) kb = KnowledgeBase() pn = get_alpha_predicate_node(BOOPType,"B", "<",9) ld = generate_link_data(pn, kb) # kb.add_subscriber(pn) x = BOOP("x",7) y = BOOP("y",11) z = BOOP("z",8) assert len(ld.truth_values) == 0 kb.declare(x) kb.declare(y) kb.declare(z) # njit_update(pn) inds = filter_alpha(pn, ld, np.arange(3)) assert np.array_equal(inds, [0,2]) assert all(ld.truth_values[:3,0] == [1,0,1]) kb.modify(x,"B", 100) kb.modify(y,"B", 3) kb.modify(z,"B", 88) #Checks doesn't change before update assert all(ld.truth_values[:3,0] == [1,0,1]) inds = filter_alpha(pn, ld, np.arange(3)) assert np.array_equal(inds, [1]) assert all(ld.truth_values[:3,0] == [0,1,0]) kb.retract(x) kb.retract(y) kb.retract(z) #Checks doesn't change before update assert all(ld.truth_values[:3,0] == [0,1,0]) inds = filter_alpha(pn, ld, np.arange(3)) print(inds) assert np.array_equal(inds, []) # print(ld.truth_values) #Checks that retracted facts show up as u1.nan = 0XFF assert all(ld.truth_values[:3,0] == [0xFF,0xFF,0xFF]) kb.declare(x) kb.declare(y) kb.declare(z) kb.modify(z,"A","Z") kb.modify(x,"B",0) kb.modify(y,"B",0) kb.modify(z,"B",0) inds = filter_alpha(pn, ld, np.arange(3)) assert np.array_equal(inds, [0,1,2]) assert all(ld.truth_values[:3,0] == [1,1,1])
def test_beta_predicate_node_2_typed(): with kb_context("test_beta_predicate_node_2_typed"): BOOP1, BOOP1Type = define_fact("BOOP1",{"A": "number", "B" : "string"}) BOOP2, BOOP2Type = define_fact("BOOP2",{"A": "string", "B" : "number"}) kb = KnowledgeBase() pn = get_beta_predicate_node(BOOP1Type,"A", "<", BOOP2Type,"B") ld = generate_link_data(pn, kb) # kb.add_subscriber(pn) x1,x2 = BOOP1(7,"x"), BOOP2("x",7.5) #<- slightly different y1,y2 = BOOP1(11,"y"), BOOP2("y",11) z1,z2 = BOOP1(8,"z"), BOOP2("z",8) assert len(ld.truth_values) == 0 kb.declare(x1); kb.declare(x2) kb.declare(y1); kb.declare(y2) kb.declare(z1); kb.declare(z2) inds = filter_beta(pn, ld, np.arange(3), np.arange(3)) # print(inds) # print(ld.truth_values) assert np.array_equal(inds, [[0,0],[0, 1], [0, 2], [2, 1]]) assert all(ld.truth_values[0,:3] == [1,1,1]) assert all(ld.truth_values[1,:3] == [0,0,0]) assert all(ld.truth_values[2,:3] == [0,1,0]) q1, q2 = BOOP1(-7,"q"), BOOP2("q",-7) r1, r2 = BOOP1(-11,"r"), BOOP2("r",-11) t1, t2 = BOOP1(-8,"t"), BOOP2("t",-8) kb.declare(q1); kb.declare(q2) kb.declare(r1); kb.declare(r2) kb.declare(t1); kb.declare(t2) inds = filter_beta(pn, ld, np.arange(6), np.arange(6)) # print(inds) # print(ld.truth_values[:6,:6]) assert np.array_equal(inds,[[0,0],[0,1],[0,2],[2,1],[3,0],[3,1], [3,2],[4,0],[4,1],[4,2],[4,3],[4,5],[5,0],[5,1],[5,2],[5,3]]) assert all(ld.truth_values[0,:6] == [1,1,1,0,0,0]) assert all(ld.truth_values[1,:6] == [0,0,0,0,0,0]) assert all(ld.truth_values[2,:6] == [0,1,0,0,0,0]) assert all(ld.truth_values[3,:6] == [1,1,1,0,0,0]) assert all(ld.truth_values[4,:6] == [1,1,1,1,0,1]) assert all(ld.truth_values[5,:6] == [1,1,1,1,0,0]) kb.modify(r1,"A", 0); kb.modify(r2,"B", 0) kb.modify(y1,"A", 0); kb.modify(y2,"B", 0) inds = filter_beta(pn, ld, np.arange(6), np.arange(6)) # print(ld.truth_values[:6,:6]) assert all(ld.truth_values[0,:6] == [1,0,1,0,0,0]) assert all(ld.truth_values[1,:6] == [1,0,1,0,0,0]) assert all(ld.truth_values[2,:6] == [0,0,0,0,0,0]) assert all(ld.truth_values[3,:6] == [1,1,1,0,1,0]) assert all(ld.truth_values[4,:6] == [1,0,1,0,0,0]) assert all(ld.truth_values[5,:6] == [1,1,1,1,1,0]) kb.retract(r1); kb.retract(r2) kb.retract(y1); kb.retract(y2) inds = filter_beta(pn, ld, np.arange(6), np.arange(6)) # print(ld.truth_values[:6,:6]) assert all(ld.truth_values[0,:6] == [1,0,1,0,0,0]) assert all(ld.truth_values[1,:6] == [0,0,0,0,0,0]) assert all(ld.truth_values[2,:6] == [0,0,0,0,0,0]) assert all(ld.truth_values[3,:6] == [1,0,1,0,0,0]) assert all(ld.truth_values[4,:6] == [0,0,0,0,0,0]) assert all(ld.truth_values[5,:6] == [1,0,1,1,0,0])
def test_beta_predicate_node_1_typed(): with kb_context("test_beta_predicate_node_1_typed"): BOOP, BOOPType = define_fact("BOOP",{"A": "string", "B" : "number"}) kb = KnowledgeBase() pn = get_beta_predicate_node(BOOPType,"B", "<", BOOPType,"B") # png = cast(pn, GenericBetaPredicateNodeType) ld = generate_link_data(pn, kb) # kb.add_subscriber(pn) x = BOOP("x",7) y = BOOP("y",11) z = BOOP("z",8) assert len(ld.truth_values) == 0 kb.declare(x) kb.declare(y) kb.declare(z) # njit_update(pn) inds = filter_beta(pn, ld, np.arange(3), np.arange(3)) # print("B") # print(inds) assert np.array_equal(inds, [[0, 1], [0, 2], [2, 1]]) # print(ld.truth_values) assert all(ld.truth_values[0,:3] == [0,1,1]) assert all(ld.truth_values[1,:3] == [0,0,0]) assert all(ld.truth_values[2,:3] == [0,1,0]) q = BOOP("q",-7) r = BOOP("r",-11) t = BOOP("t",-8) kb.declare(q) kb.declare(r) kb.declare(t) inds = filter_beta(pn, ld, np.arange(6), np.arange(6)) # print(inds) assert np.array_equal(inds,[[0,1],[0,2],[2,1],[3,0],[3,1], [3,2],[4,0],[4,1],[4,2],[4,3],[4,5],[5,0],[5,1],[5,2],[5,3]]) # njit_update(pn) # print(ld.truth_values[:6,:6]) assert all(ld.truth_values[0,:6] == [0,1,1,0,0,0]) assert all(ld.truth_values[1,:6] == [0,0,0,0,0,0]) assert all(ld.truth_values[2,:6] == [0,1,0,0,0,0]) assert all(ld.truth_values[3,:6] == [1,1,1,0,0,0]) assert all(ld.truth_values[4,:6] == [1,1,1,1,0,1]) assert all(ld.truth_values[5,:6] == [1,1,1,1,0,0]) kb.modify(r,"B", 0) kb.modify(y,"B", 0) inds = filter_beta(pn, ld, np.arange(6), np.arange(6)) # njit_update(pn) # print(ld.truth_values[:6,:6]) assert all(ld.truth_values[0,:6] == [0,0,1,0,0,0]) assert all(ld.truth_values[1,:6] == [1,0,1,0,0,0]) assert all(ld.truth_values[2,:6] == [0,0,0,0,0,0]) assert all(ld.truth_values[3,:6] == [1,1,1,0,1,0]) assert all(ld.truth_values[4,:6] == [1,0,1,0,0,0]) assert all(ld.truth_values[5,:6] == [1,1,1,1,1,0]) kb.retract(r) kb.retract(y) inds = filter_beta(pn, ld, np.arange(6), np.arange(6)) # njit_update(pn) # print(ld.truth_values[:6,:6]) assert all(ld.truth_values[0,:6] == [0,0,1,0,0,0]) assert all(ld.truth_values[1,:6] == [0,0,0,0,0,0]) assert all(ld.truth_values[2,:6] == [0,0,0,0,0,0]) assert all(ld.truth_values[3,:6] == [1,0,1,0,0,0]) assert all(ld.truth_values[4,:6] == [0,0,0,0,0,0]) assert all(ld.truth_values[5,:6] == [1,0,1,1,0,0])
def _benchmark_setup(): with kb_context("test_kb"): kb = KnowledgeBase() return (kb, ), {}
def test_declare_overloading(): with kb_context("test_declare_overloading"): kb = KnowledgeBase() idrec1 = declare_unnamed(kb) idrec2 = declare_unnamed.py_func(kb) assert idrec1 != idrec2