Space

A Space is used by a StateElement to associate the value to a domain. The interface for Space is explained in the API Reference.

Defining spaces

Spaces can be either Numeric or CatSet. Continuous spaces are only representable in the former, while discrete spaces can be represented in both objects. Specifically, CatSet is designed to hold categorical data, for which no ordering of values is possible. Defining a space is done via the Space interface. To define Numeric spaces, you have to specify lower and upper bounds, while for CatSet you have to specify an array which holds all possible values.

Note

Performance for CatSet may be poor for large sets.

Some shortcuts also exist to make defining Spaces less cumbersome. Below are a few ways of defining a Space

 1# Continuous space
 2cont_space = Space(
 3    low=-numpy.ones((2, 2)),
 4    high=numpy.ones((2, 2)),
 5)
 6# Shortcut
 7cont_space = box_space(numpy.ones((2, 2)))
 8
 9
10# Discrete set
11discr_set = Space(array=numpy.array([0, 1, 2, 3]))
12# Shortcut
13discr_set = integer_set(4)
14
15# # Other shortcuts
16# currently unavailable
17# space = lin_space(-5, 5, num=11, dtype=numpy.int16)
18# space = lin_space(-5, 5, num=22)
19space = integer_space(10, dtype=numpy.int16)
20space = box_space(low=-numpy.ones((2, 2)), high=numpy.ones((2, 2)))

Mechanisms

Space comes with several mechanisms:

  1. check whether a value is contained in a space,

  2. sample a value from a space,

  3. Perform the cartesian product of spaces.

Values in space

You can check if a value belongs to a space with Python’s in operator:

 1s = Space(array=numpy.array([1, 2, 3], dtype=numpy.int16))
 2assert 1 in s
 3assert [1] in s
 4assert [[1]] in s
 5assert numpy.array(1) in s
 6assert numpy.array([1]) in s
 7assert numpy.array([[1]]) in s
 8assert 4 not in s
 9assert -1 not in s
10

Essentially, CoopIHC delegates this operation to Numpy.

Sampling from spaces

You can sample values from spaces using the sample() method:

1s = Space(array=numpy.arange(1000), seed=123)
2q = Space(array=numpy.arange(1000), seed=123)
3r = Space(array=numpy.arange(1000), seed=12)
4_s, _q, _r = s.sample(), q.sample(), r.sample()
5assert _s in s
6assert _q in q
7assert _r in r
8assert _s == _q
9assert _s != _r

You can provide a given seed for each Space via its seed keyword argument, for repeatable random experiments.

Cartesian Product

You can compute the cartesian product of several spaces. For continuous spaces, a None value is used.

1s = Space(array=numpy.array([1, 2, 3], dtype=numpy.int16))
2q = Space(array=numpy.array([-3, -2, -1], dtype=numpy.int16))
3cp, shape = Space.cartesian_product(s, q)