Example #1
0
def lookup_attractors(bn: OpenBooleanNetwork):

    ts = dict()

    pt_input_configs = itertools.product(TRUTH_VALUES,
                                         repeat=len(bn.input_nodes))

    for i in pt_input_configs:

        for n, v in zip(bn.input_nodes, i):
            bn[n].state = v

        actual_state = bn.update()

        trajectory = []

        while binstate(actual_state) not in set(trajectory):

            trajectory.append(binstate(actual_state))

            for n, v in zip(bn.input_nodes, i):
                bn[n].state = v

            actual_state = bn.update()

        cutoff = trajectory.index(binstate(actual_state))

        # pprint(trajectory[cutoff:])

        ts.update({tuple(trajectory[cutoff:]): None})

    return [*ts.keys()]
Example #2
0
    def test_bn_update(self):
        bn = template_behaviour_generator(5, 2, 0.5, 0.0, 1, 0).new()

        bn_copy = BooleanNetwork.from_json(bn.to_json())

        matching_states = []

        for _ in range(10):

            s1 = binstate(bn.update())
            s2 = binstate(bn_copy.update())

            matching_states.append(s1 == s2)

        self.assertTrue(all(matching_states))
def test_state_attraction(bn, state, inputs, phi) -> (str, str):

    for j, node in enumerate(bn.nodes):
        node.state = state[j]

    attractors = get_attraction_basin(bn, phi=phi, bninput=inputs)

    # Only one attractor shall appear for each input in absence of noise
    return binstate(inputs), attractors[0][0] if len(attractors) == 1 else None
Example #4
0
    def __init__(self, selector: SelectiveBooleanNetwork,
                 behaviours: Dict[str, BNController],
                 bin_strategies: Dict[str, Callable[[dict, float], dict]],
                 bin_thresholds: Dict[str, float], noise_rho: float,
                 input_fixation_steps: int, sensing_interval: int):

        self.__selector = selector
        self.__behaviours = behaviours

        self.__bin_strategies = bin_strategies
        self.__bin_thresholds = bin_thresholds

        self.__attractors = self.__selector.atm.dattractors
        self.__curr_attr = None
        self.__atm = self.__selector.atm.dtableau

        self.__bmap = defaultdict(self.__default_behaviour_strategy,
                                  [(binstate(s), k)
                                   for k, attr in self.__attractors.items()
                                   for s in attr])

        print(self.__behaviours)

        self.__signal = -1  # True #

        for k in self.__selector.keys:
            self.__selector[k].state = random.choice([True, False
                                                      ])  # self.__signal #

        self.__sensing_interval = sensing_interval
        self.__noise_rho = noise_rho
        self.__input_fixation_steps = input_fixation_steps
        self.__next_sensing = 0
        self.__input_fixed_for = 0

        self.__light_data = []
Example #5
0
                for a1 in luts))

    tts = OrderedDict()

    for path in cpaths(GLOBALS.sim_data_path, recursive=1):
        # print(path)
        if path.is_file():
            sim_data = read_json(path)

            a = dict()
            l = -1

            for e in sim_data['data']:

                l = len(a)
                a.update({binstate(e['bnstate']): binstate(e['bnstate'])})

                if len(a) == l:
                    if binstate(e['bnstate']) not in tts:
                        tts[binstate(e['bnstate'])] = tuple(a.keys())
                    a.clear()
                    l = -1

    print('Test Trajectories:')
    pprint([*tts.values()])
    print(len(tts), end='\n\n')

    print(sum(
        any(set(a).intersection(set(tts[k])) for a in luts) for k in tts))

    pass
Example #6
0
    def __call__(self, morphology: EPuckMorphology, step: int, timestep: int):

        # BN update is faster than sensor sampling frequency
        sensed = False

        if self.__next_sensing == step:

            sensed = True

            self.__next_sensing += int(self.__sensing_interval / timestep)

            # Collect light data
            self.__light_data = dict(
                (k, l.read()) for k, l in morphology.light_sensors.items())

            # print(self.__light_data)

            # Collect Radio messages
            r = morphology.receivers[-1]

            if r.device.getQueueLength() > 0:

                pkt = int(r.device.getData(), 2)

                self.__input_fixed_for = 0
                self.__signal = pkt

                while r.device.getQueueLength() > 0:
                    r.device.nextPacket()

                print(f"Env. signal {pkt} received.")

        if self.__signal != -1:

            if self.__input_fixed_for < self.__input_fixation_steps:
                # print('F')
                for l in self.__selector.input_nodes:
                    self.__selector[l].state = self.__signal
                    # print(l, self.__selector[l].state)
                    self.__input_fixed_for += 1
            pass
        else:
            # Apply random noise
            # print('Noise')

            # Apply Binarization Strategies
            bin_light_data = self.__bin_strategies[DeviceName.LIGHT](
                self.__light_data, self.__bin_thresholds[DeviceName.LIGHT])

            noise_rho = sum(bin_light_data.values()) / len(bin_light_data)
            noise_rho = max(self.__noise_rho, noise_rho)

            k = random.randint(1, max(1, sum(bin_light_data.values())))

            nodes = random.choices(self.__selector.keys, k=k)

            for n in nodes:
                apply_noise = random.choices(TRUTH_VALUES,
                                             [noise_rho, 1.0 - noise_rho])[0]

                if apply_noise:
                    self.__selector[n].state = not self.__selector[n].state
            pass

        # Update network state
        bn_state = self.__selector.update()
        self.__curr_attr = self.__bmap[binstate(bn_state)]

        # print(self.__selector.attractors_input_map)
        # print(self.__curr_attr)

        cdata = self.__behaviours[self.__curr_attr](morphology, step, timestep,
                                                    sensed)

        cdata.noise = self.__signal == -1
        cdata.attr = self.__curr_attr
        cdata.input = self.__signal

        return cdata