def is_met(self, response, global_variables, local_variables, event_counter): variables_both = Variables.join(global_variables, local_variables) if self.condition is None: ismet = True elif self.condition_is_behavior: ismet = (self.condition == response) else: ismet, err = ParseUtil.evaluate(self.condition, variables_both, event_counter, ParseUtil.PHASE_LINE) if err: raise ParseException(self.lineno, err) if type(ismet) is not bool: raise ParseException(self.lineno, f"Condition '{self.condition}' is not a boolean expression.") if ismet: label = self._goto_if_met(variables_both) if label is None: # In "ROW1(0.1),ROW2(0.3)", goto_if_met returns None with prob. 0.6 ismet = False else: label = None return ismet, label
def _perform_action(self, lineno, action): """ Sets a variable (x:3) or count_reset(event). """ omit_learn = False # No action to perform if len(action) == 0: pass # Setting a variable elif action.count(':') == 1 or action.count('=') == 1: if action.count('=') == 1: sep = '=' else: sep = ':' var_name, value_str = ParseUtil.split1_strip(action, sep=sep) variables_join = Variables.join(self.global_variables, self.local_variables) value, err = ParseUtil.evaluate(value_str, variables_join) if err: raise ParseException(lineno, err) err = self.local_variables.set(var_name, value, self.parameters) if err: raise ParseException(lineno, err) # count_reset elif action.startswith("count_reset(") and action.endswith(")"): event = action[12:-1] self.event_counter.reset_count(event) # omit_learn elif action == "@omit_learn": omit_learn = True else: raise ParseException(lineno, "Internal error.") # Should have been caught during Pase.parse() return omit_learn
def next_stimulus(self, response, ignore_response_increment=False, preceeding_help_lines=None, omit_learn=None): # if not self.is_parsed: # raise Exception("Internal error: Cannot call Phase.next_stimulus" + # " before Phase.parse().") if preceeding_help_lines is None: preceeding_help_lines = list() if not ignore_response_increment: # if not self.is_first_line: if response is not None: self.event_counter.increment_count(response) self.event_counter.increment_count_line(response) self.event_counter.set_last_response(response) if self.first_stimulus_presented: variables_both = Variables.join(self.global_variables, self.local_variables) if self.stop_condition.is_met(variables_both, self.event_counter): return None, None, preceeding_help_lines, None if self.is_first_line: # assert(response is None) rowlbl = self.first_label self.is_first_line = False omit_learn = True # Since response is None, there is no learning (updating of v-values) to do else: rowlbl, omit_learn = self.curr_lineobj.next_line(response, self.global_variables, self.local_variables, self.event_counter) self.prev_linelabel = self.curr_lineobj.label self._make_current_line(rowlbl) stimulus = self.phase_lines[rowlbl].stimulus if stimulus is not None: for element, intensity in stimulus.items(): if type(intensity) is str: # element[var] where var is a (local) variable variables_both = Variables.join(self.global_variables, self.local_variables) stimulus[element], err = ParseUtil.evaluate(intensity, variables=variables_both) if err: raise ParseException(self.phase_lines[rowlbl].lineno, err) if rowlbl != self.prev_linelabel: self.event_counter.reset_count_line() self.event_counter.line_label = rowlbl self.event_counter.increment_count(rowlbl) self.event_counter.increment_count_line(rowlbl) if stimulus is None: # Help line action = self.phase_lines[rowlbl].action lineno = self.phase_lines[rowlbl].lineno self._perform_action(lineno, action) preceeding_help_lines.append(rowlbl) next_stimulus_out = self.next_stimulus(response, ignore_response_increment=True, preceeding_help_lines=preceeding_help_lines, omit_learn=omit_learn) stimulus, rowlbl, preceeding_help_lines, omit_learn_help = next_stimulus_out omit_learn = (omit_learn or omit_learn_help) else: for stimulus_element in stimulus: self.event_counter.increment_count(stimulus_element) self.event_counter.increment_count_line(stimulus_element) self.first_stimulus_presented = True return stimulus, rowlbl, preceeding_help_lines, omit_learn