示例#1
0
    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
示例#2
0
    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
示例#3
0
    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