Beispiel #1
0
    def __init__(self, epsilon=0.1):
        '''
        :param epsilon: fraction of time spent exploring (vs. exploiting the best performer)
        '''
        MultiArmedBanditBase.__init__(self)
        if not 0.0 < epsilon < 1.0:
            raise MultiArmedBanditError('epsilon must be between 0.0 and 1.0')

        self.e = epsilon
 def setUp(self):
     self.mab = MultiArmedBanditBase()
     self.keys = 'abcdefghijklmnopqrstuvwxyz'
     for arm in self.keys:
         self.mab.add(arm, arm)
class Test(unittest.TestCase):
    def setUp(self):
        self.mab = MultiArmedBanditBase()
        self.keys = 'abcdefghijklmnopqrstuvwxyz'
        for arm in self.keys:
            self.mab.add(arm, arm)

    def tearDown(self):
        pass

    def test_add(self):
        self.assertRaises(MultiArmedBanditError, self.mab.add)
        self.assertRaises(MultiArmedBanditError,
                          self.mab.add,
                          key=None,
                          obj='obj')
        self.assertRaises(MultiArmedBanditError,
                          self.mab.add,
                          key='key',
                          obj=None)

        self.assertEqual(len(self.keys), len(self.mab.things))
        self.assertEqual(len(self.keys), len(self.mab.arms))
        self.mab.add('foo', 'bar')
        self.assertEqual(len(self.keys) + 1, len(self.mab.things))
        self.assertEqual(len(self.keys) + 1, len(self.mab.arms))
        self.assertEqual(1.0, self.mab.arms['foo'].probability)

    def test_record_result(self):
        self.assertEqual(0, self.mab.successes)
        self.assertEqual(0, self.mab.trials)
        self.mab.record_result('a', 1, 10)
        self.assertEqual(1, self.mab.successes)
        self.assertEqual(10, self.mab.trials)
        self.mab.record_result('b', 11, 100)
        self.assertEqual(12, self.mab.successes)
        self.assertEqual(110, self.mab.trials)

        # make sure the arms are behaving as expected
        self.assertEqual(1, self.mab.arms['a'].successes)
        self.assertEqual(10, self.mab.arms['a'].trials)
        self.assertEqual(11, self.mab.arms['b'].successes)
        self.assertEqual(100, self.mab.arms['b'].trials)
        for x in 'cdefghijklmnopqrstuvwxyz':
            self.assertEqual(0, self.mab.arms[x].successes)
            self.assertEqual(0, self.mab.arms[x].trials)

    def test_trials(self):
        self.assertEqual(0, self.mab.trials)
        count = 0
        for arm in self.mab.arms.values():
            count += 1
            arm.update(trials=1)
            self.assertEqual(count, self.mab.trials)

    def test_successes(self):
        self.assertEqual(0, self.mab.successes)
        count = 0
        for arm in self.mab.arms.values():
            count += 1
            arm.update(successes=1)
            self.assertEqual(count, self.mab.successes)

    def test_total_p(self):
        total = sum(a.probability for a in self.mab.arms.values())
        self.assertEqual(total, self.mab._total_p)

        for a in self.mab.arms.itervalues():
            a.probability = a.probability * 0.5
        self.assertEqual(total * 0.5, self.mab._total_p)

    def test_next(self):
        arms = 'abcdefghijklmnopqrstuvwxyz'
        for arm in arms:
            self.mab.add(arm, arm)

        i = 1
        n = 1000
        limit = n * len(arms)
        from collections import defaultdict
        seen = defaultdict(int)
        for arm in self.mab:
            if i > limit:
                break
            seen[arm] += 1
            i += 1

        for arm in arms:
            # ensure we saw each arm n times
            self.assertEqual(n, seen[arm])
 def setUp(self):
     self.mab = MultiArmedBanditBase()
     self.keys = "abcdefghijklmnopqrstuvwxyz"
     for arm in self.keys:
         self.mab.add(arm, arm)
class Test(unittest.TestCase):
    def setUp(self):
        self.mab = MultiArmedBanditBase()
        self.keys = "abcdefghijklmnopqrstuvwxyz"
        for arm in self.keys:
            self.mab.add(arm, arm)

    def tearDown(self):
        pass

    def test_add(self):
        self.assertRaises(MultiArmedBanditError, self.mab.add)
        self.assertRaises(MultiArmedBanditError, self.mab.add, key=None, obj="obj")
        self.assertRaises(MultiArmedBanditError, self.mab.add, key="key", obj=None)

        self.assertEqual(len(self.keys), len(self.mab.things))
        self.assertEqual(len(self.keys), len(self.mab.arms))
        self.mab.add("foo", "bar")
        self.assertEqual(len(self.keys) + 1, len(self.mab.things))
        self.assertEqual(len(self.keys) + 1, len(self.mab.arms))
        self.assertEqual(1.0, self.mab.arms["foo"].probability)

    def test_record_result(self):
        self.assertEqual(0, self.mab.successes)
        self.assertEqual(0, self.mab.trials)
        self.mab.record_result("a", 1, 10)
        self.assertEqual(1, self.mab.successes)
        self.assertEqual(10, self.mab.trials)
        self.mab.record_result("b", 11, 100)
        self.assertEqual(12, self.mab.successes)
        self.assertEqual(110, self.mab.trials)

        # make sure the arms are behaving as expected
        self.assertEqual(1, self.mab.arms["a"].successes)
        self.assertEqual(10, self.mab.arms["a"].trials)
        self.assertEqual(11, self.mab.arms["b"].successes)
        self.assertEqual(100, self.mab.arms["b"].trials)
        for x in "cdefghijklmnopqrstuvwxyz":
            self.assertEqual(0, self.mab.arms[x].successes)
            self.assertEqual(0, self.mab.arms[x].trials)

    def test_trials(self):
        self.assertEqual(0, self.mab.trials)
        count = 0
        for arm in self.mab.arms.values():
            count += 1
            arm.update(trials=1)
            self.assertEqual(count, self.mab.trials)

    def test_successes(self):
        self.assertEqual(0, self.mab.successes)
        count = 0
        for arm in self.mab.arms.values():
            count += 1
            arm.update(successes=1)
            self.assertEqual(count, self.mab.successes)

    def test_total_p(self):
        total = sum(a.probability for a in self.mab.arms.values())
        self.assertEqual(total, self.mab._total_p)

        for a in self.mab.arms.itervalues():
            a.probability = a.probability * 0.5
        self.assertEqual(total * 0.5, self.mab._total_p)

    def test_next(self):
        arms = "abcdefghijklmnopqrstuvwxyz"
        for arm in arms:
            self.mab.add(arm, arm)

        i = 1
        n = 1000
        limit = n * len(arms)
        from collections import defaultdict

        seen = defaultdict(int)
        for arm in self.mab:
            if i > limit:
                break
            seen[arm] += 1
            i += 1

        for arm in arms:
            # ensure we saw each arm n times
            self.assertEqual(n, seen[arm])
class Test(unittest.TestCase):

    def setUp(self):
        self.mab = MultiArmedBanditBase()
        self.keys = u'abcdefghijklmnopqrstuvwxyz'
        for arm in self.keys:
            self.mab.add_item(arm, arm)

    def tearDown(self):
        pass

    def test_add(self):
        self.assertRaises(MultiArmedBanditError, self.mab.add_item)
        self.assertRaises(
            MultiArmedBanditError, self.mab.add_item, key=None, obj='obj')
        self.assertRaises(
            MultiArmedBanditError, self.mab.add_item, key='key', obj=None)

        self.assertEqual(len(self.keys), len(self.mab.things))
        self.assertEqual(len(self.keys), len(self.mab.arms))
        self.mab.add_item('foo', 'bar')
        self.assertEqual(len(self.keys) + 1, len(self.mab.things))
        self.assertEqual(len(self.keys) + 1, len(self.mab.arms))
        foo_arm = self.mab.arms['foo']
        self.assertEqual(0, foo_arm.trials)
        self.assertEqual(0, foo_arm.successes)
        self.assertEqual(1.0, self.mab.arms['foo'].probability)

        # check if we have some successes already
        for arm in self.mab.arms.itervalues():
            arm.update(successes=1, trials=5)

        self.mab.add_item(key='newarm', obj='this_string')
        newarm = self.mab.arms['newarm']
        self.assertEqual(1, newarm.successes)
        self.assertEqual(5, newarm.trials)
        # probability is always = 1 in default mabbase
        self.assertEqual(1.0, newarm.probability)

    def test_record_result(self):
        self.assertEqual(0, self.mab.successes)
        self.assertEqual(0, self.mab.trials)
        self.mab.record_result('a', 1, 10)
        self.assertEqual(1, self.mab.successes)
        self.assertEqual(10, self.mab.trials)
        self.mab.record_result('b', 11, 100)
        self.assertEqual(12, self.mab.successes)
        self.assertEqual(110, self.mab.trials)

        # make sure the arms are behaving as expected
        self.assertEqual(1, self.mab.arms['a'].successes)
        self.assertEqual(10, self.mab.arms['a'].trials)
        self.assertEqual(11, self.mab.arms['b'].successes)
        self.assertEqual(100, self.mab.arms['b'].trials)
        for x in 'cdefghijklmnopqrstuvwxyz':
            self.assertEqual(0, self.mab.arms[x].successes)
            self.assertEqual(0, self.mab.arms[x].trials)

    def test_trials(self):
        self.assertEqual(0, self.mab.trials)
        count = 0
        for arm in self.mab.arms.values():
            count += 1
            arm.update(trials=1)
            self.assertEqual(count, self.mab.trials)

    def test_successes(self):
        self.assertEqual(0, self.mab.successes)
        count = 0
        for arm in self.mab.arms.values():
            count += 1
            arm.update(successes=1)
            self.assertEqual(count, self.mab.successes)

    def test_total_p(self):
        total = sum(a.probability for a in self.mab.arms.values())
        self.assertEqual(total, self.mab._total_p)

        for a in self.mab.arms.itervalues():
            a.probability = a.probability * 0.5
        self.assertEqual(total * 0.5, self.mab._total_p)

    def test_next(self):
        # empty set raises StopIteration
        self.assertRaises(StopIteration, self.mab.next)

    def test_arms_as_dict(self):
        d = self.mab.arms_as_dict()

        self.assertTrue(isinstance(d, dict))

        for k, arm in self.mab.arms.iteritems():
            self.assertTrue(isinstance(d[k], dict))
            for attrname in ['successes', 'probability', 'trials']:
                self.assertTrue(attrname in d[k])
                self.assertEqual(d[k][attrname], getattr(arm, attrname))
class Test(unittest.TestCase):
    def setUp(self):
        self.mab = MultiArmedBanditBase()
        self.keys = u'abcdefghijklmnopqrstuvwxyz'
        for arm in self.keys:
            self.mab.add_item(arm, arm)

    def tearDown(self):
        pass

    def test_add(self):
        self.assertRaises(MultiArmedBanditError, self.mab.add_item)
        self.assertRaises(MultiArmedBanditError,
                          self.mab.add_item,
                          key=None,
                          obj='obj')
        self.assertRaises(MultiArmedBanditError,
                          self.mab.add_item,
                          key='key',
                          obj=None)

        self.assertEqual(len(self.keys), len(self.mab.things))
        self.assertEqual(len(self.keys), len(self.mab.arms))
        self.mab.add_item('foo', 'bar')
        self.assertEqual(len(self.keys) + 1, len(self.mab.things))
        self.assertEqual(len(self.keys) + 1, len(self.mab.arms))
        foo_arm = self.mab.arms['foo']
        self.assertEqual(0, foo_arm.trials)
        self.assertEqual(0, foo_arm.successes)
        self.assertEqual(1.0, self.mab.arms['foo'].probability)

        # check if we have some successes already
        for arm in self.mab.arms.itervalues():
            arm.update(successes=1, trials=5)

        self.mab.add_item(key='newarm', obj='this_string')
        newarm = self.mab.arms['newarm']
        self.assertEqual(1, newarm.successes)
        self.assertEqual(5, newarm.trials)
        # probability is always = 1 in default mabbase
        self.assertEqual(1.0, newarm.probability)

    def test_record_result(self):
        self.assertEqual(0, self.mab.successes)
        self.assertEqual(0, self.mab.trials)
        self.mab.record_result('a', 1, 10)
        self.assertEqual(1, self.mab.successes)
        self.assertEqual(10, self.mab.trials)
        self.mab.record_result('b', 11, 100)
        self.assertEqual(12, self.mab.successes)
        self.assertEqual(110, self.mab.trials)

        # make sure the arms are behaving as expected
        self.assertEqual(1, self.mab.arms['a'].successes)
        self.assertEqual(10, self.mab.arms['a'].trials)
        self.assertEqual(11, self.mab.arms['b'].successes)
        self.assertEqual(100, self.mab.arms['b'].trials)
        for x in 'cdefghijklmnopqrstuvwxyz':
            self.assertEqual(0, self.mab.arms[x].successes)
            self.assertEqual(0, self.mab.arms[x].trials)

    def test_trials(self):
        self.assertEqual(0, self.mab.trials)
        count = 0
        for arm in self.mab.arms.values():
            count += 1
            arm.update(trials=1)
            self.assertEqual(count, self.mab.trials)

    def test_successes(self):
        self.assertEqual(0, self.mab.successes)
        count = 0
        for arm in self.mab.arms.values():
            count += 1
            arm.update(successes=1)
            self.assertEqual(count, self.mab.successes)

    def test_total_p(self):
        total = sum(a.probability for a in self.mab.arms.values())
        self.assertEqual(total, self.mab._total_p)

        for a in self.mab.arms.itervalues():
            a.probability = a.probability * 0.5
        self.assertEqual(total * 0.5, self.mab._total_p)

    def test_next(self):
        # empty set raises StopIteration
        self.assertRaises(StopIteration, self.mab.next)

    def test_arms_as_dict(self):
        d = self.mab.arms_as_dict()

        self.assertTrue(isinstance(d, dict))

        for k, arm in self.mab.arms.iteritems():
            self.assertTrue(isinstance(d[k], dict))
            for attrname in ['successes', 'probability', 'trials']:
                self.assertTrue(attrname in d[k])
                self.assertEqual(d[k][attrname], getattr(arm, attrname))