Skip to main content

Thinking Processes

This Python package helps you to draw diagrams used in the Thinking Processes from the Theory of Constraints. For more information, see https://en.wikipedia.org/wiki/Thinking_processes_(theory_of_constraints)

Prerequisites

  • Python 3.11+

  • Ensure Graphviz is installed and available in your PATH.

Installing

pip install thinking-processes

Current Reality Tree

In this example, we find root causes for undesired effects by drawing a Current Reality Tree:

from thinking_processes import CurrentRealityTree

crt = CurrentRealityTree()
        
engine_not_start = crt.add_node("Car's engine will not start")
engine_needs_fuel = crt.add_node('Engine needs fuel in order to run')
no_fuel_to_engine = crt.add_node('Fuel is not getting to the engine')
water_in_fuel_line = crt.add_node('There is water in the fuel line')
crt.add_causal_relation([engine_needs_fuel, no_fuel_to_engine], engine_not_start)
crt.add_causal_relation([water_in_fuel_line], no_fuel_to_engine)

air_conditioning_not_working = crt.add_node('Air conditioning is not working')
air_not_circulating = crt.add_node('Air is not able to circulate')
air_intake_full_of_water = crt.add_node('The air intake is full of water')
crt.add_causal_relation([air_not_circulating], air_conditioning_not_working)
crt.add_causal_relation([air_intake_full_of_water], air_not_circulating)

radio_distorted = crt.add_node('Radio sounds distorted')
speakers_obstructed = crt.add_node('The speakers are obstructed')
speakers_underwater = crt.add_node('The speakers are underwater')
crt.add_causal_relation([speakers_obstructed], radio_distorted)
crt.add_causal_relation([speakers_underwater], speakers_obstructed)

car_in_pool = crt.add_node('The car is in the swimming pool')
crt.add_causal_relation([car_in_pool], speakers_underwater)
crt.add_causal_relation([car_in_pool], air_intake_full_of_water)
crt.add_causal_relation([car_in_pool], water_in_fuel_line)

handbreak_faulty = crt.add_node('The handbreak is faulty')
handbreak_stops_car = crt.add_node('The handbreak stops the car from rolling into the swimming pool')
crt.add_causal_relation([handbreak_faulty, handbreak_stops_car], car_in_pool)

crt.plot(view=True, filepath='crt.png')

The resulting tree looks like this:

Current Reality Tree

To save some effort in typing, you can create the same diagram using a string representation of the tree:

from thinking_processes import CurrentRealityTree
crt = CurrentRealityTree.from_string("""
1: Car's engine will not start
2: Engine needs fuel in order to run
3: Fuel is not getting to the engine
4: There is water in the fuel line
5: Air conditioning is not working
6: Air is not able to circulate
7: The air intake is full of water
8: Radio sounds distorted
9: The speakers are obstructed
10: The speakers are underwater
11: The car is in the swimming pool
12: The handbreak is faulty
13: The handbreak stops the car\nfrom rolling into the swimming pool

2,3 -> 1
4 -> 3
6 => 5
7 -> 6
9 -> 8
10 -> 9
10 <= 11 
11 <- 12 13
11 -> 7
11 -> 4
""")

Evaporating Cloud (Conflict Resolution Diagram)

In this example, we resolve a conflict by identifying wrong assumptions behind the conflict:

from thinking_processes import EvaporatingCloud

ec = EvaporatingCloud(
    objective='Reduce cost per unit',
    need_a='Reduce setup cost per unit',
    need_b='Reduce carrying cost per unit',
    conflict_part_a='Run larger batches',
    conflict_part_b='Run smaller batches'
)

ec.add_assumption_on_the_conflict('small is the opposite of large', is_true=True)
ec.add_assumption_on_the_conflict('there is only one meaning to the word "batch"', is_true=False)
ec.add_assumption_on_need_a("setup cost is fixed and can't be reduced")
ec.add_assumption_on_need_a("the machine being set up is a bottleneck with no spare capacity")
ec.add_assumption_on_need_b("smaller batches reduce carrying cost")

ec.plot(view=True, filepath='ec.png')

The resulting diagram looks like this:

Evaporating Cloud

Prerequisite Tree

In this example, we identify and overcome obstacles to achieve a goal:

from thinking_processes import PrerequisiteTree
prt = PrerequisiteTree(objective='Repair the handbrake')
        
missing_knowledge = prt.add_obstacle('Cannot repair the handbrake')

learn = missing_knowledge.add_solution('Learn to repair the handbrake')
learn.add_obstacle('No time to learn')

let_repair = missing_knowledge.add_solution('Let someone else repair the handbrake')
no_money = let_repair.add_obstacle('No money to let repair the handbrake')
no_money.add_solution('Save money')

prt.plot(view=True, filepath='prt.png')

The resulting diagram looks like this:

Prerequisite Tree

Alternatively, you can create the same diagram using a string representation of the tree:

from thinking_processes import PrerequisiteTree
prt = PrerequisiteTree.from_string("""
Repair the handbreak
    Cannot repair the handbreak
        Learn to repair the handbreak
            No time to learn
        Let someone repair the handbreak
            No money
                Save money
""")

Development

These instructions will get you a copy of the project up and running on your local machine for development and testing purposes.

Running the tests

All tests in the "tests" directory are based on the unittest package.

Deployment

rm -R dist thinking_processes.egg-info
python -m build && twine upload --skip-existing --verbose dist/*

You should also create a tag for the current version

git tag -a [version] -m "describe what has changed"
git push --tags

Versioning

We use SemVer for versioning.

Authors

If you have any questions, feel free to ask one of our authors:

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

thinking_processes-1.8.1.tar.gz (53.5 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

thinking_processes-1.8.1-py3-none-any.whl (49.2 kB view details)

Uploaded Python 3

File details

Details for the file thinking_processes-1.8.1.tar.gz.

File metadata

  • Download URL: thinking_processes-1.8.1.tar.gz
  • Upload date:
  • Size: 53.5 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/7.0.0 CPython/3.14.2

File hashes

Hashes for thinking_processes-1.8.1.tar.gz
Algorithm Hash digest
SHA256 e1a47a2686bf009b9bfb2cf51415af4e3021adf6f36f0a66f81df2fc25dfecae
MD5 bfeafb1eba3c9e9c7513bc6072a51f1b
BLAKE2b-256 892b087fee2027e10a760384206de77a0732ee7e25b4ba5fcd70c8e3b7f5fd2a

See more details on using hashes here.

File details

Details for the file thinking_processes-1.8.1-py3-none-any.whl.

File metadata

File hashes

Hashes for thinking_processes-1.8.1-py3-none-any.whl
Algorithm Hash digest
SHA256 cad69dfab1da2c7d09e26e64ddb8b98bd187fdba5c41bbcb189d3b731d7ddb0a
MD5 72f4c2d5b27dd073f8ddab7ede7daee9
BLAKE2b-256 4fc4c60002daec1344354678f47a70267aa19ecf5ac7d2227027b458a430f631

See more details on using hashes here.

Release history Release notifications | RSS feed

This release

1.8.1 This release

2 files

1.7.0

2 files

1.6.1

2 files

1.6.0

2 files

1.5.1

2 files

1.5.0

2 files

1.4.1

2 files

1.4.0

2 files

1.3.1

2 files

1.2.1

2 files

1.2.0

2 files

1.1.0

2 files

1.0.1

2 files

1.0.0

2 files

0.0.3

2 files

0.0.2

2 files

0.0.1

2 files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page