# Collatz Conjecture
The Collatz Conjecture states that by iteratively applying a particular rule to successive numbers, beginning from any
number, the result will eventually be 1.
The following example illustrates the use of the Netomaton input function to terminate an evolution dynamically, based
on the value of the activities.
```python
import netomaton as ntm
network = ntm.topology.from_adjacency_matrix([[1]])
def activity_rule(ctx):
n = ctx.current_activity
if n % 2 == 0:
# number is even
return n / 2
else:
return 3*n + 1
def input(t, activities, n):
if activities[0] == 1:
return None
return 1
initial_conditions = [4103453]
trajectory = ntm.evolve(network=network, initial_conditions=initial_conditions,
activity_rule=activity_rule, input=input)
activities = ntm.get_activities_over_time_as_list(trajectory)
# convert the numbers to binary lists and left-pad with zeroes, so we can plot them
activities = ntm.binarize_for_plotting(activities)
ntm.plot_grid(activities)
```
The full source code for this example can be found [here](collatz_conjecture_demo.py).
The following example utilizes a fixed number of timesteps as a comparison against using the input function instead.
```python
import netomaton as ntm
network = ntm.topology.from_adjacency_matrix([[1]])
def activity_rule(ctx):
n = ctx.current_activity
if n % 2 == 0:
# number is even
return n / 2
else:
return 3 * n + 1
initial_conditions = [222]
trajectory = ntm.evolve(network=network, initial_conditions=initial_conditions,
activity_rule=activity_rule, timesteps=100)
activities = ntm.get_activities_over_time_as_list(trajectory)
# convert the numbers to binary lists and left-pad with zeroes, so we can plot them
activities = ntm.binarize_for_plotting(activities)
ntm.plot_grid(activities)
```
The full source code for this example can be found [here](collatz_conjecture_demo2.py).
> https://en.wikipedia.org/wiki/Collatz_conjecture