From dce8c5037ce28736a795e30fadab428a6501f30d Mon Sep 17 00:00:00 2001 From: ccrock4t <15344554+ccrock4t@users.noreply.github.com> Date: Fri, 21 Jan 2022 23:23:21 -0500 Subject: [PATCH] Minor changes --- Config.json | 10 +- Documentation/Diagram.png | Bin 41406 -> 51742 bytes NALInferenceRules/HelperFunctions.py | 44 +++---- NARS.py | 22 ++-- NARSDataStructures/Buffers.py | 176 ++++++++++++++------------- TestCases/MNISTVisionTests.py | 10 +- 6 files changed, 136 insertions(+), 126 deletions(-) diff --git a/Config.json b/Config.json index fc4c0d0..9fd9bb2 100644 --- a/Config.json +++ b/Config.json @@ -1,8 +1,8 @@ { "k": 1, -"T": 0.65, -"FOCUSX": 1.0305365040669583, -"FOCUSY": 0.8437127611721296, +"T": 0.6, +"FOCUSX": 1.2305365040669583, +"FOCUSY": 1.0437127611721296, "PROJECTION_DECAY_DESIRE": 0.95, "PROJECTION_DECAY_EVENT": 0.95, @@ -16,8 +16,8 @@ "POSITIVE_THRESHOLD": 0.51, "NEGATIVE_THRESHOLD": 0.5, -"MEMORY_CONCEPT_CAPACITY": 210000, -"EVENT_BUFFER_CAPACITY": 10, +"MEMORY_CONCEPT_CAPACITY": 300000, +"EVENT_BUFFER_CAPACITY": 15, "GLOBAL_BUFFER_CAPACITY": 1000, "CONCEPT_LINK_CAPACITY": 100, "NUMBER_OF_ATTEMPTS_TO_SEARCH_FOR_SEMANTICALLY_RELATED_CONCEPT": 3, diff --git a/Documentation/Diagram.png b/Documentation/Diagram.png index 1c3e643b82de28451a2561aca6d7805f9637645b..452637b8d8d52e84f0f6b63a4648e9731dc68da4 100644 GIT binary patch literal 51742 zcmeFYc{r4B`#(;pR8%TbQc6^!%wiZz7-oza+iYfrC}W!$W(L=xy|2*A|IfR`c!mKJFLDeL!Nthk z0e%R9jn|)h!hJ(RIYInCx4}@`;oHGXpvefu0^dJZeSE_?-oDUP1QsmkuX%%8IDgGl zEOa*ZVG8+pGTqoMf@N!HjpqJ&3EzwN*GpW$WDQ_{USi}L;pT%5LSbEyFh0Ri2aXA_ zaWXP8!U`Eaj)4R_1T`?ih-;$*$JscAdT|&SmynPUa2Lr*96|6G*@*-$Bm^B!@CxM7 zP3RJDe?uc@Bd~s)kcn_Ja$>P;oDudUoH0UxF}9`gC_#31BnLx*8v#QKvUbCeB0`L~ z0%KAj)7RF7ObLhx6GwU0@x&p6B>^&5d|XQB95^!j1XW% zW=F7@gn%$A7!JXPJ7WWa$U(t$CkH=!y0?kg4e1yPz6o@a_)0i|7>pwo69)dqVcFtv zF%IF!l-L^C`J;@*M20s9e8Ht49Q-8AUA!Zi-@BikBb(Sc}RBO~yQ z1K$|j8;k@$@LWGCLty0OWEjLp5UdRY!8Ix))D6b>=5l!Kh(H0`kw+C{sWxQqARl8I zcp4iT;o@XZaP#58MAlrNKoeh%|#IH1!%Un8;=xW0wxz6DCP$Q^GGy2E{(=jGsA~y zjYaTu)P=(jl(e^GdM(2s30_efP@KM zD0Ej_J69Z$7EUp;b>IjjB!WNPni#!@SARkAv<%hG!*#E zhlfQtVF>~R-zJD{7$n4kp)kIo*5MI!6Eyhfg>m+BMVcU)7%&A^Fe*agXd(z?d58KE z2wZ}-8<~qDQpo`k!T>6VAAkT)_z1lOBzu^@5at>Hw+?1wP+=j&B8QP*;Bbe6U^&}jdWWx^SQ9^=PHqZsv02)RZZb)a^;{s?B zd$GU}Mkk|q{ybkSUqEn#MFbiP>;lNXWEZ?W-ZzL(;zF%yMo4?M$R16%=An)72p2=7H(p4F+u~h)eZsuLyp5eGOc$y@nnPuZAnD-) zV0<{V2WV#;k3yy(gClH63}-JKm+s<&_7~8|j&`p8oFJkrHNXUKO(anr&=_cMh=F(( zj1FVDII{_S=U^h5>|^8LYD@G&+xr@ZhLVkpeFQwAp_f0w$5G@D84`verU;S#JQxpV zVk8nsaG|bL+c1Da7;k?V3HO}0#0I!2*9G~5kyfqlWd3&aOC3Y zE@GT7j!ASv@_>HA4AESB8y1q_D8X|DLB<>uKxrJq8^Je1`i2L9`QRLV=tMUfl4Ktm zOt&Lr;l5N>pqrrt6~>DQM+*p&KxbD&GEHcLjR@dEc0z(Vc?+#YFq{)b;1w83_Hx6c zNk}4-ZNkQjg0OV4NPwZ+5JLU!s1#e^ns9DJrdOyfQA`ww{jA+^CawYO@URGHs-q9f z&d5k;NAvL&xlqC}0**CT%(7*($$Yp2kpsg66en`+_-sB0<`N;K*&v)@POj__3598g za&n|oD7H?p02^NfP2}c=2g^pXy@*149GVvr7|e2T3ovxUW8l6#7L4Ld#v58we6g-z z{?3LzEC$vu+!aYDTeHCh2_4uG&d=I46lQ_~z5~Z}@D})>z*o3nyD&VSDs~JC3Z`Q5 zMtE>H0^x%(M%xF2k1$(XFD}cA7654^jY>v21=ukOL1F=mB|?OVxq(4`jz$!_-?!iY%s!?ilSlcO`L3)+)zU&92pnlZRkv-(2RXt2uO;r4~&F2#yJOL zBCNR_4lXqR z03-Gff(fm|ydX#7A{4Q4UI=>%!4<&_76tPR`6f;wLN8Z8EX5b79JmF|g#29k@0egGaRsBMW`qoaqi6Cn3fd za-U)R2ony=OYCgqMsy6e_?5`iHr&2#hcrk~76nO!GGhw5M?J z&UB&J+lGt^Fywm~@=11Ngpt3kNa!zt6S;6cQH(Zbap=C-2s@gM2}±|C(VLKs1| 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 LQz=q9ck90ZXYnkI literal 41406 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 diff --git a/NALInferenceRules/HelperFunctions.py b/NALInferenceRules/HelperFunctions.py index 2f8dbf7..d792c49 100644 --- a/NALInferenceRules/HelperFunctions.py +++ b/NALInferenceRules/HelperFunctions.py @@ -161,28 +161,28 @@ def stamp_and_print_inference_rule(sentence, inference_rule, parent_sentences): for parent in parent_sentences: sentence.stamp.parent_premises.append(parent) - if isinstance(parent.statement, NALGrammar.Terms.SpatialTerm): - parent_strings.append("CENTER: " + str(parent.statement.center) + " | DIM:" - + str(parent.statement.dimensions) + " " + str(parent.value) - + " -- pooled? " + str(parent.statement.of_spatial_terms)) - elif isinstance(parent.statement, NALGrammar.Terms.CompoundTerm) and not isinstance(parent, NALGrammar.Sentences.Goal): - parent_strings.append("CENTER1: " + str(parent.statement.subterms[0].center) + " | DIM:" - + str(parent.statement.subterms[0].dimensions) - + " -- pooled? " + str(parent.statement.subterms[0].of_spatial_terms) - + " " + str(parent.value)) - - parent_strings.append("CENTER2: " + str(parent.statement.subterms[1].center) + " | DIM:" - + str(parent.statement.subterms[1].dimensions) + " " + str(parent.value) - + " -- pooled? " + str(parent.statement.subterms[1].of_spatial_terms)) - - else: - parent_strings.append("other " + str(parent.value)) - - - # if inference_rule is F_Deduction and isinstance(sentence, NALGrammar.Sentences.Judgment) and sentence.statement.is_first_order(): - # Global.Global.debug_print(sentence.stamp.derived_by - # + " derived " + sentence.get_formatted_string() - # + " by parents " + str(parent_strings)) + # if isinstance(parent.statement, NALGrammar.Terms.SpatialTerm): + # parent_strings.append("CENTER: " + str(parent.statement.center) + " | DIM:" + # + str(parent.statement.dimensions) + " " + str(parent.value) + # + " -- pooled? " + str(parent.statement.of_spatial_terms)) + # elif isinstance(parent.statement, NALGrammar.Terms.CompoundTerm) and not isinstance(parent, NALGrammar.Sentences.Goal): + # parent_strings.append("CENTER1: " + str(parent.statement.subterms[0].center) + " | DIM:" + # + str(parent.statement.subterms[0].dimensions) + # + " -- pooled? " + str(parent.statement.subterms[0].of_spatial_terms) + # + " " + str(parent.value)) + # + # parent_strings.append("CENTER2: " + str(parent.statement.subterms[1].center) + " | DIM:" + # + str(parent.statement.subterms[1].dimensions) + " " + str(parent.value) + # + " -- pooled? " + str(parent.statement.subterms[1].of_spatial_terms)) + # + # else: + # parent_strings.append("other " + str(parent.value)) + + + if inference_rule is F_Deduction and isinstance(sentence, NALGrammar.Sentences.Judgment) and sentence.statement.is_first_order(): + Global.Global.debug_print(sentence.stamp.derived_by + + " derived " + sentence.get_formatted_string() + + " by parents " + str(parent_strings)) def premise_result_type(j1,j2): """ diff --git a/NARS.py b/NARS.py index fe3abe0..8c809bf 100644 --- a/NARS.py +++ b/NARS.py @@ -68,8 +68,8 @@ def __init__(self): Global.Global.NARS = self # global vars are part of NARS Global.Global.ARRAY_NEGATIVE_ELEMENT = NALGrammar.Terms.from_string('(--,(arrayEl-->negative))') - Global.Global.ARRAY_NEGATIVE_SENTENCE = NALGrammar.Sentences.Judgment(statement=Global.Global.ARRAY_NEGATIVE_ELEMENT.subterms[0], - value=NALGrammar.Values.TruthValue(frequency=0.0)) + Global.Global.ARRAY_NEGATIVE_SENTENCE = NALGrammar.Sentences.Judgment(statement=Global.Global.ARRAY_NEGATIVE_ELEMENT, + value=NALGrammar.Values.TruthValue(frequency=1.0)) def startup_and_run(self): @@ -120,16 +120,14 @@ def do_working_cycle(self): # OBSERVE #self.Observe() # todo begin spatial take vvv - radii = [1] - vision_sentences = [] - for radius in radii: - vision_sentences += self.vision_buffer.take(pool=False,radius=radius) - vision_sentences += self.vision_buffer.take(pool=True,radius=radius) - # single array - for vision_sentence in vision_sentences: - if vision_sentence is not None: - self.global_buffer.PUT_NEW(NARSDataStructures.Other.Task(vision_sentence)) + vision_sentence = self.vision_buffer.take(pooled=False) + if vision_sentence is not None: + self.global_buffer.PUT_NEW(NARSDataStructures.Other.Task(vision_sentence)) + + vision_sentence = self.vision_buffer.take(pooled=True) + if vision_sentence is not None: + self.global_buffer.PUT_NEW(NARSDataStructures.Other.Task(vision_sentence)) # todo end spatial take ^^ @@ -399,7 +397,7 @@ def process_judgment_task(self, task: NARSDataStructures.Other.Task): # only put non-derived atomic events in temporal module for now Global.Global.NARS.temporal_module.PUT_NEW(task) - if isinstance(task.sentence.statement, NALGrammar.Terms.SpatialTerm): return + if task.sentence.stamp.derived_by is None: return if isinstance(j.statement, NALGrammar.Terms.CompoundTerm)\ and j.statement.connector == NALSyntax.TermConnector.Negation: diff --git a/NARSDataStructures/Buffers.py b/NARSDataStructures/Buffers.py index 76f1502..4f263a8 100644 --- a/NARSDataStructures/Buffers.py +++ b/NARSDataStructures/Buffers.py @@ -87,19 +87,20 @@ def __init__(self, dimensions): self.dimensions = dimensions self.array = np.full(shape=dimensions, fill_value=NALGrammar.Sentences.TruthValue(0.0,0.9)) - self.pooled_array = None - self.components_bag = Bag(item_type=tuple, + self.components_bag = Bag(item_type=object, capacity=1000, granularity=100) - self.pooled_components_bag = Bag(item_type=tuple, + + self.pooled_array = np.full(shape=dimensions, + fill_value=NALGrammar.Sentences.TruthValue(0.0,0.9)) + self.pooled_components_bag = Bag(item_type=object, capacity=1000, granularity=100) + self.last_taken_img_array = None + self.last_sentence = None # initialize with uniform probabilility - for indices, truth_value in np.ndenumerate(self.array): - item = self.components_bag.PUT_NEW(indices) - self.components_bag.change_priority(item.key, 0.5) def blank_image(self): self.set_image(np.empty(shape=self.array.shape)) @@ -112,102 +113,105 @@ def set_image(self, img): # "ERROR: Data dimensions are incompatible with Spatial Buffer dimensions " \ # + str(event_array.shape) + " and " + str(self.dimensions) - self.array = self.create_pooled_sensation_array(original_event_array, stride=2) + self.array = self.create_pooled_sensation_array(original_event_array, stride=1) self.components_bag.clear() - self.pooled_components_bag.clear() - # maximum = 0 - # for indices, sentence in np.ndenumerate(self.array): - # e = NALInferenceRules.TruthValueFunctions.Expectation(sentence.value.frequency, sentence.value.confidence) - # maximum = max(maximum, 2 * abs(e - 0.5)) + maximum = 0 + for indices, sentence in np.ndenumerate(self.array): + if sentence.value.frequency > Config.POSITIVE_THRESHOLD \ + and not (isinstance(sentence.statement, + NALGrammar.Terms.CompoundTerm) and sentence.statement.connector == NALSyntax.TermConnector.Negation): + maximum = max(maximum, sentence.value.frequency * sentence.value.confidence) for indices, sentence in np.ndenumerate(self.array): - #e = NALInferenceRules.TruthValueFunctions.Expectation(sentence.value.frequency,sentence.value.confidence) - priority = sentence.value.frequency #2 * abs(e - 0.5) / maximum # normalized priority - self.components_bag.PUT_NEW(indices) - self.components_bag.change_priority(Item.get_key_from_object(indices), priority) + if sentence.value.frequency > Config.POSITIVE_THRESHOLD \ + and not (isinstance(sentence.statement,NALGrammar.Terms.CompoundTerm) and sentence.statement.connector == NALSyntax.TermConnector.Negation): + priority = sentence.value.frequency * sentence.value.confidence / maximum + object = indices + self.components_bag.PUT_NEW(object) + self.components_bag.change_priority(Item.get_key_from_object(object), priority) - # now the pooled array - self.pooled_array = self.create_pooled_sensation_array(original_event_array, stride=1) - self.pooled_array = self.create_pooled_sensation_array(self.pooled_array, stride=2) - # maximum = 0 - # for indices, sentence in np.ndenumerate(self.pooled_array): - # e = NALInferenceRules.TruthValueFunctions.Expectation(sentence.value.frequency, sentence.value.confidence) - # maximum = max(maximum, 2 * abs(e - 0.5)) + + # pooled + self.pooled_array = self.create_pooled_sensation_array(original_event_array, stride=2) + #self.pooled_array = self.create_pooled_sensation_array(self.pooled_array , stride=2) + self.pooled_components_bag.clear() + + maximum = 0 + for indices, sentence in np.ndenumerate(self.pooled_array): + if sentence.value.frequency > Config.POSITIVE_THRESHOLD \ + and not (isinstance(sentence.statement, + NALGrammar.Terms.CompoundTerm) and sentence.statement.connector == NALSyntax.TermConnector.Negation): + maximum = max(maximum, sentence.value.frequency * sentence.value.confidence) for indices, sentence in np.ndenumerate(self.pooled_array): - #e = NALInferenceRules.TruthValueFunctions.Expectation(sentence.value.frequency,sentence.value.confidence) - priority = sentence.value.frequency #2 * abs(e - 0.5) / maximum # normalized priority - self.pooled_components_bag.PUT_NEW(indices) - self.pooled_components_bag.change_priority(Item.get_key_from_object(indices), priority) - - # maximum = 0 - # for indices, sentence in np.ndenumerate(self.array): - # - # - # for indices, sentence in np.ndenumerate(self.array): - # - # self.components_bag.PUT_NEW(indices) - # self.components_bag.change_priority(Item.get_key_from_object(indices), priority) - - def take(self, pool, radius): + if sentence.value.frequency > Config.POSITIVE_THRESHOLD \ + and not (isinstance(sentence.statement, + NALGrammar.Terms.CompoundTerm) and sentence.statement.connector == NALSyntax.TermConnector.Negation): + priority = sentence.value.frequency * sentence.value.confidence / maximum + object = indices + self.pooled_components_bag.PUT_NEW(object) + self.pooled_components_bag.change_priority(Item.get_key_from_object(object), priority) + + def take(self, pooled): """ Probabilistically select a spatial subset of the buffer. :return: an Array Judgment of the selected subset. """ - - if pool: + if pooled: bag = self.pooled_components_bag + array = self.pooled_array else: bag = self.components_bag - + array = self.array # probabilistically peek the 2 vertices of the box + # selection 1: small fixed windows + indices = bag.peek() + if indices is None: return None + + y, x = indices.object + radius = 1#random.randint(1,2) + min_x, min_y = max(x - radius, 0), max(y - radius, 0) + max_x, max_y = min(x + radius, array.shape[1] - 1), min(y + radius, + array.shape[0] - 1) + + extracted = array[min_y:max_y+1, min_x:max_x+1] + sentence_subset= [] + for idx,sentence in np.ndenumerate(extracted): + if not (isinstance(sentence.statement, NALGrammar.Terms.CompoundTerm) + and sentence.statement.connector == NALSyntax.TermConnector.Negation): + sentence_subset.append(sentence) + + total_truth = None + statement_subset = [] + for sentence in sentence_subset: + if total_truth is None: + total_truth = sentence.value + else: + total_truth = NALInferenceRules.TruthValueFunctions.F_Intersection(sentence.value.frequency, + sentence.value.confidence, + total_truth.frequency, + total_truth.confidence) + statement_subset.append(sentence.statement) - # selection 1: small fixed windows - item = bag.peek() - radius = radius#random.randint(1,3) - element_idx_y, element_idx_x = item.object - - min_x, min_y = max(element_idx_x - radius, 0), max(element_idx_y - radius, 0) - max_x, max_y = min(element_idx_x + radius, self.array.shape[1]-1), min(element_idx_y + radius, self.array.shape[0]-1) - - - # selection 2: bounding box from random features - # item1 = bag.peek() - # item2 = item1 - # while item2 is item1: - # item2 = bag.peek() - # - # element1_idx_y, element1_idx_x = item1.object - # element2_idx_y, element2_idx_x = item2.object - # - # min_x, min_y = min(element1_idx_x, element2_idx_x), min(element1_idx_y, element2_idx_y) - # max_x, max_y = max(element1_idx_x, element2_idx_x), max(element1_idx_y, element2_idx_y) - - # extract subset of elements inside the bounding box (inclusive) - if pool: - event_subset = self.pooled_array[min_y:max_y + 1, min_x:max_x + 1] - else: - event_subset = self.array[min_y:max_y+1, min_x:max_x+1] - judgment = self.create_spatial_conjunction(event_subset) + # create conjunction of features + statement = NALGrammar.Terms.CompoundTerm(subterms=statement_subset, + term_connector=NALSyntax.TermConnector.Conjunction) - judgments = [judgment] + event_sentence = NALGrammar.Sentences.Judgment(statement=statement, + value=total_truth, + occurrence_time=Global.Global.get_current_cycle_number()) - center = ((min_y, min_x), (max_y, max_x)) - for j in judgments: - if j is not None: - j.statement.center = center - if not pool: - last_taken_img_array = np.zeros(shape=self.img.shape) - last_taken_img_array[min_y*2:(max_y+1)*2, 2*min_x:2*(max_x+1)] = self.img[min_y*2:(max_y+1)*2, 2*min_x:2*(max_x+1)] - self.last_taken_img_array = last_taken_img_array # store for visualization + # last_taken_img_array = np.zeros(shape=self.img.shape) + # last_taken_img_array[min_y+1:(max_y+1)+1, min_x+1:(max_x+1)+1] = self.img[min_y+1:(max_y+1)+1, min_x+1:(max_x+1)+1] + # self.last_taken_img_array = last_taken_img_array # store for visualization - return judgments + return event_sentence def create_spatial_conjunction(self, subset): """ @@ -486,7 +490,10 @@ def process_sentence(derived_sentence): event_task_A = temporal_chain[i].object event_A = event_task_A.sentence - if not (isinstance(event_A.statement, NALGrammar.Terms.CompoundTerm) and NALSyntax.TermConnector.is_conjunction(event_A.statement.connector)): continue + if not (isinstance(event_A.statement, NALGrammar.Terms.CompoundTerm) + and NALSyntax.TermConnector.is_conjunction(event_A.statement.connector) + and isinstance(event_A.statement.subterms[0], NALGrammar.Terms.CompoundTerm) + and NALSyntax.TermConnector.is_conjunction(event_A.statement.subterms[0].connector)): continue derived_sentences = NARSInferenceEngine.do_temporal_inference_two_premise(event_A, event_B) @@ -499,7 +506,7 @@ def temporal_chaining_2_conjunction(self): Perform temporal chaining produce all possible forward implication statements using temporal induction and intersection - A =/> B + A && B for the latest statement in the chain """ @@ -510,7 +517,9 @@ def temporal_chaining_2_conjunction(self): event_task_B = self.get_most_recent_event_task().object event_B = event_task_B.sentence - if not isinstance(event_B.statement, NALGrammar.Terms.SpatialTerm): return + if not (isinstance(event_B.statement, NALGrammar.Terms.CompoundTerm) + and NALSyntax.TermConnector.is_conjunction(event_B.statement.connector) + and (isinstance(event_B.statement.subterms[0], NALGrammar.Terms.SpatialTerm) or isinstance(event_B.statement.subterms[0], NALGrammar.Terms.StatementTerm))): return def process_sentence(derived_sentence): if derived_sentence is not None: @@ -523,7 +532,10 @@ def process_sentence(derived_sentence): event_task_A = temporal_chain[i].object event_A = event_task_A.sentence - if not isinstance(event_A.statement, NALGrammar.Terms.SpatialTerm): continue + if not (isinstance(event_A.statement, NALGrammar.Terms.CompoundTerm) + and NALSyntax.TermConnector.is_conjunction(event_A.statement.connector) + and (isinstance(event_A.statement.subterms[0], NALGrammar.Terms.SpatialTerm) or isinstance( + event_A.statement.subterms[0], NALGrammar.Terms.StatementTerm))): return derived_sentences = NARSInferenceEngine.do_temporal_inference_two_premise(event_A, event_B) diff --git a/TestCases/MNISTVisionTests.py b/TestCases/MNISTVisionTests.py index ceace2e..d814ae4 100644 --- a/TestCases/MNISTVisionTests.py +++ b/TestCases/MNISTVisionTests.py @@ -216,11 +216,11 @@ def binary_classification(): def digit_classification(): restart_NARS() - length = 400 - training_cycles = 125 + length = 500 + training_cycles = 200 x_train, y_train, x_test, y_test = load_dataset(length=length, bit=False, - percent_of_train_img=0.75) + percent_of_train_img=0.8) """ Training Phase @@ -719,7 +719,7 @@ def run_trials(q, current_best_score): q.put(avg_score) def test_main(): - time.sleep(10) + time.sleep(1) learn_best_params() #supervised_learning_binary_one_example() @@ -739,7 +739,7 @@ def test_main(): if __name__ == "__main__": global_gui = MNISTVisionTestGUI() - global_gui.gui_disabled = False + global_gui.gui_disabled = True if global_gui.gui_disabled: global_gui.start() else: