Derived generators


In [1]:
import tohu
from tohu.v6.primitive_generators import *
from tohu.v6.derived_generators import *
from tohu.v6.generator_dispatch import *
from tohu.v6.utils import print_generated_sequence, make_dummy_tuples
from datetime import datetime
#tohu.v6.logging.logger.setLevel('DEBUG')

In [2]:
print(f'Tohu version: {tohu.__version__}')


Tohu version: v0.6.2+1.ge41fdf1.dirty

Apply


In [3]:
def add(x, y):
    return (100 * x) + y

In [4]:
g1 = Integer(10, 99).set_tohu_name('g1')
g2 = Integer(10, 99).set_tohu_name('g2')

In [5]:
h = Apply(add, g1, g2).set_tohu_name('h')

In [6]:
g1.reset(seed=11111)
g2.reset(seed=22222)
h.reset(seed=33333)
print_generated_sequence(g1, num=20)
print_generated_sequence(g2, num=20)
print_generated_sequence(h, num=20)


Generated sequence: 73, 81, 52, 50, 31, 56, 90, 12, 87, 51, 67, 46, 63, 78, 63, 87, 21, 64, 32, 87
Generated sequence: 18, 76, 74, 73, 66, 55, 80, 24, 80, 77, 63, 82, 46, 63, 92, 97, 49, 18, 69, 10
Generated sequence: 7318, 8176, 5274, 5073, 3166, 5655, 9080, 1224, 8780, 5177, 6763, 4682, 6346, 7863, 6392, 8797, 2149, 6418, 3269, 8710

GetAttribute


In [7]:
some_tuples = make_dummy_tuples(chars='abcdefghijklmnopqrstuvwxyz')
some_tuples[:5]


Out[7]:
[Quux(x='AA', y='aa'),
 Quux(x='BB', y='bb'),
 Quux(x='CC', y='cc'),
 Quux(x='DD', y='dd'),
 Quux(x='EE', y='ee')]

In [8]:
g = SelectOne(some_tuples)

In [9]:
print_generated_sequence(g, num=10, sep='\n', seed=12345)


Generated sequence:

Quux(x='KK', y='kk')
Quux(x='AA', y='aa')
Quux(x='VV', y='vv')
Quux(x='HH', y='hh')
Quux(x='JJ', y='jj')
Quux(x='FF', y='ff')
Quux(x='OO', y='oo')
Quux(x='EE', y='ee')
Quux(x='DD', y='dd')
Quux(x='LL', y='ll')

In [10]:
h1 = GetAttribute(g, 'x')
h2 = GetAttribute(g, 'y')

In [11]:
g.reset(seed=12345)
print_generated_sequence(g, num=10, sep='\n', seed=12345)
print_generated_sequence(h1, num=10)
print_generated_sequence(h2, num=10)


Generated sequence:

Quux(x='KK', y='kk')
Quux(x='AA', y='aa')
Quux(x='VV', y='vv')
Quux(x='HH', y='hh')
Quux(x='JJ', y='jj')
Quux(x='FF', y='ff')
Quux(x='OO', y='oo')
Quux(x='EE', y='ee')
Quux(x='DD', y='dd')
Quux(x='LL', y='ll')
Generated sequence: KK, AA, VV, HH, JJ, FF, OO, EE, DD, LL
Generated sequence: kk, aa, vv, hh, jj, ff, oo, ee, dd, ll

Lookup


In [12]:
mapping = {1: 'a', 2: 'b', 3: 'c', 4: 'd', 5: 'e', 6: 'f', 7: 'g', 8: 'h', 9: 'i'}

In [13]:
g = Integer(1, 6)
h = Lookup(g, mapping)

In [14]:
g.reset(seed=12345)
print_generated_sequence(g, num=20)
print_generated_sequence(h, num=20)


Generated sequence: 1, 5, 2, 6, 6, 2, 4, 4, 1, 4, 4, 5, 3, 1, 2, 3, 3, 1, 4, 6
Generated sequence: a, e, b, f, f, b, d, d, a, d, d, e, c, a, b, c, c, a, d, f

SelectOne


In [15]:
values = ['a', 'b', 'c', 'd', 'e', 'f', 'g']

In [16]:
g = SelectOne(values)

In [17]:
print_generated_sequence(g, num=20, seed=12345)


Generated sequence: c, a, f, c, c, b, d, b, a, d, d, b, d, c, g, a, g, c, d, b

By default, all values are chosen with equal probability. This can be changed by passing the argument p.


In [18]:
g = SelectOne(values, p=[0.05, 0.05, 0.05, 0.05, 0.7, 0.05, 0.05])

In [19]:
print_generated_sequence(g, num=20, seed=12345)


Generated sequence: e, a, e, e, e, d, e, d, c, e, e, d, e, e, g, b, g, e, e, c

SelectMultiple


In [20]:
values = ['a', 'b', 'c', 'd', 'e', 'f', 'g']

In [21]:
n_vals = Integer(1, 5)
g = SelectMultiple(values, n_vals)

In [22]:
n_vals.reset(seed=11111)
g.reset(seed=99999)

print_generated_sequence(g, num=10, sep='\n')


Generated sequence:

['a', 'c', 'e', 'b']
['c', 'd', 'b', 'g', 'e']
['f', 'e', 'g']
['e', 'b', 'a']
['f', 'c']
['e', 'd', 'g']
['c']
['g', 'c', 'e', 'b', 'f']
['f', 'b', 'c']
['e', 'b', 'c', 'a']

 Integer


In [23]:
aa = Constant(10)
bb = Integer(100, 200)

In [24]:
g = Integer(low=aa, high=bb)

In [25]:
aa.reset(seed=11111)
bb.reset(seed=22222)
print_generated_sequence(g, num=20, seed=99999)


Generated sequence: 30, 58, 151, 105, 154, 49, 145, 94, 125, 76, 149, 83, 97, 179, 137, 177, 98, 127, 68, 137

Cumsum


In [26]:
aa = Incremental(start=100, step=4)

In [27]:
print_generated_sequence(aa, num=20, seed=11111)


Generated sequence: 100, 104, 108, 112, 116, 120, 124, 128, 132, 136, 140, 144, 148, 152, 156, 160, 164, 168, 172, 176

In [28]:
g = Cumsum(aa, start_with_zero=True)

In [29]:
g.reset_input_generators(seed=None)
g.reset()
print_generated_sequence(g, num=20)


Generated sequence: 0, 100, 204, 312, 424, 540, 660, 784, 912, 1044, 1180, 1320, 1464, 1612, 1764, 1920, 2080, 2244, 2412, 2584

In [30]:
g = Cumsum(aa, start_with_zero=False)

In [31]:
g.reset_input_generators(seed=None)
g.reset()
print_generated_sequence(g, num=20)


Generated sequence: 100, 204, 312, 424, 540, 660, 784, 912, 1044, 1180, 1320, 1464, 1612, 1764, 1920, 2080, 2244, 2412, 2584, 2760

Timestamp


In [32]:
g_start = Constant(datetime(2018, 1, 1, 11, 22, 33))
g_end = Timestamp(start="2018-02-10", end="2018-02-20")

In [33]:
g = Timestamp(start=g_start, end=g_end)

In [34]:
print(type(next(g)))


<class 'datetime.datetime'>

In [35]:
g_start.reset(seed=11111)
g_end.reset(seed=22222)

print_generated_sequence(g, num=10, sep='\n', seed=99999)


Generated sequence:

2018-02-10 06:27:49
2018-01-17 04:20:49
2018-01-10 18:12:26
2018-01-28 05:37:05
2018-01-19 13:41:01
2018-02-11 02:01:12
2018-02-13 20:01:56
2018-02-15 04:57:24
2018-02-05 10:48:11
2018-01-28 20:28:35

In [36]:
g = Timestamp(start=g_start, end=g_end).strftime("%-d %b %Y, %H:%M (%a)")

In [37]:
type(next(g))


Out[37]:
str

In [38]:
g_start.reset(seed=11111)
g_end.reset(seed=22222)

print_generated_sequence(g, num=10, sep='\n', seed=99999)


Generated sequence:

10 Feb 2018, 06:27 (Sat)
17 Jan 2018, 04:20 (Wed)
10 Jan 2018, 18:12 (Wed)
28 Jan 2018, 05:37 (Sun)
19 Jan 2018, 13:41 (Fri)
11 Feb 2018, 02:01 (Sun)
13 Feb 2018, 20:01 (Tue)
15 Feb 2018, 04:57 (Thu)
5 Feb 2018, 10:48 (Mon)
28 Jan 2018, 20:28 (Sun)

Tee


In [39]:
aa = Integer(100, 200)
bb = Integer(300, 400)
cc = Integer(low=aa, high=bb)
nn = Integer(1, 3)

In [40]:
g = Tee(cc, num=nn)

In [41]:
g.reset_input_generators(seed=11111)
print_generated_sequence(g, num=10, seed=99999, sep='\n')


Generated sequence:

(175, 168, 193)
(171, 364, 368)
(261, 170)
(152,)
(259, 315)
(127, 182)
(257, 254, 305)
(312,)
(218,)
(273, 221)

In [ ]: