Beispiel #1
0
    def __init__(self, size, reward_style="simple"):
        FrameTable.__init__(self, size)

        self.algorithms = []
        # self.algorithms.append(Randomly(size))
        self.algorithms.append(LRU(size))
        self.algorithms.append(FIFO(size))
        self.algorithms.append(NFU(size))
        self.algorithms.append(MRU(size))
        self.curalgo = 0

        self.agent = SarsaApprox(size, len(self.algorithms))

        self.reward_style = reward_style
        if not reward_style == "simple":
            self.framefault = {}

        self.miss_reward_step = -1
        self.hit_reward_step = 1

        self.ah_files = []
        self.ah_counts = [0, 0, 0, 0]
        for i in range(0, len(self.algorithms)):
            self.ah_files.append(open("actions_history_" + str(i), "w"))
Beispiel #2
0
class Master(FrameTable):
    def __init__(self, size, reward_style="simple"):
        FrameTable.__init__(self, size)

        self.algorithms = []
        # self.algorithms.append(Randomly(size))
        self.algorithms.append(LRU(size))
        self.algorithms.append(FIFO(size))
        self.algorithms.append(NFU(size))
        self.algorithms.append(MRU(size))
        self.curalgo = 0

        self.agent = SarsaApprox(size, len(self.algorithms))

        self.reward_style = reward_style
        if not reward_style == "simple":
            self.framefault = {}

        self.miss_reward_step = -1
        self.hit_reward_step = 1

        self.ah_files = []
        self.ah_counts = [0, 0, 0, 0]
        for i in range(0, len(self.algorithms)):
            self.ah_files.append(open("actions_history_" + str(i), "w"))

    def get_miss_reward(self):
        if self.reward_style == "simple":
            return self.miss_reward_step
        elif self.reward_style == "num_unique_frames":
            return -1 * len(self.framefault)

    def get_hit_reward(self):
        return self.hit_reward_step

    def access(self, page):
        # Attempt to access a given page
        # print 'page', page
        state = FrameTable.current_state
        # print 'getting action for current state'
        action = self.agent.act(state)
        self.ah_counts[action] += 1
        for a in range(0, len(self.algorithms)):
            self.ah_files[a].write(str(self.ah_counts[a]) + "\n")

        if not action == self.curalgo:
            self.curalgo = action

        if not FrameTable.access(self, page):
            # page fault
            reward = self.get_miss_reward()
        else:
            # hit
            reward = self.get_hit_reward()

        new_state = FrameTable.current_state
        new_action = self.agent.act(new_state)
        self.agent.update_q(state, action, reward, new_state, new_action)

        if not FrameTable.time % 100:
            self.agent.save_model()

    def hit(self, p):
        for algo in self.algorithms:
            algo.hit(p)

    def insert_data(self, frame):
        for algo in self.algorithms:
            algo.insert_data(frame)

    def eject(self):
        fid = self.algorithms[self.curalgo].eject()
        if self.reward_style == "num_unique_frames":
            if fid in self.framefault:
                self.framefault[fid] += 1
            else:
                self.framefault[fid] = 1
        return fid

    def print_faults(self):
        FrameTable.print_faults(self)
        print self.ah_counts
        for i in range(0, len(self.algorithms)):
            self.ah_files[i].close()