Skip to content

timClicks/choices

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

14 Commits
 
 
 
 
 
 
 
 
 
 

Repository files navigation

choices is designed to make it easy to make it easy to
make things happen in a probabilistic manner. Its main
API is the Choice class.

When called, a Choice object will return one of its keys
according to the proability it has been assigned.

Here's an example:

    >>> mood = Choice({'happy': 0.3, 'neutral': 0.6, 'sad': 0.1})
    >>> mood()
    'happy'
    >>> mood()
    'neutral'
    >>> mood()
    'neutral'

Creating a Choice object
========================

There are three main ways for creating a Choice object:

- a dict of keys and probabilities
- a list of (key, probability) pairs
- a list of (key, sample_count) pairs

Each of those options is explained below.

A dict of keys and probabilities
--------------------------------

Perhaps the simplest way to create a Choice is to
provide the keys and associated probability wrapped
up as a dict:

    >>> mood = Choice({'happy': 0.3, 'neutral': 0.6, 'sad': 0.1})
    >>> mood()
    'happy'
    >>> mood()
    'neutral'

A list of (key, probability) pairs
----------------------------------

As well as a dict assigning a probability to each key, you can
send in a list of (key,value) pairs as lists or tuples. This
allows for lots of flexibility, including non-hashable
types to be used. This means that you can provide objects such
as functions to be used as keys.

Let's say we wanted to create an NPC for a game and wanted
some scripted responses. Why not encode moods as functions
and then pass them togetheer as a Choice.

    >>> def grumpy(news):
    ... return ':/'
    >>> def happy(news):
    ... return ':)'
    >>> react = Choice([(grumpy, 0.7), (happy, 0.3)])
    >>> reaction = react()
    >>> reaction("We're getting married!")
    ':/'

A list of (key, sample_count) pairs
-----------------------------------

You are not restricted to adding p to 1. If you only have samples,
and wish to calculate a probablilty distribution, you can provide
those too:

    >>> birds_spotted = {'geese': 0, 'ducks': 12, 'sparrows': 4, 'other': 39}
    >>> birds = Choice(birds_spotted)
    >>> birds.distribution
    [('geese', 0.0), ('sparrows', 0.07272727272727272), ('ducks', 0.21818181818181817), ('other', 0.7090909090909091)]


Usage
=====

Making decisions
----------------

To return a new value, simply call the Choice object.

    >>> where_to_go = Choice({"Paris": 0.4, "London": 0.4, "Copenhagen": 0.1, "Barcelona": 0.1 })
    >>> where_to_go()
    'Copenhagen'

Finding probabilities
---------------------

You can retrieve the distribution of how those values are applied
by accessing the distribution attribute:

    >>> mood.distribution
    [('happy', 0.3), ('neutral', 0.6), ('sad', 0.1)]
    >>> where_to_go.distribution
    [('Paris': 0.4), ('London', 0.4), ('Copenhagen', 0.1), ('Barcelona', 0.1)]

Retrieving the probability of a particular key is supported:

    >>> birds['geese']
    0.0

About

for making random decisions

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages