├── .gitignore
├── LICENSE
├── README.md
├── amm
├── README.md
└── amm_causal_loop.mmd
├── knowledge_base
├── GettingStartedCheatsheet.md
└── README.md
├── pm
└── sprints
│ ├── README.md
│ ├── sprint_0_0
│ ├── README.md
│ ├── project_0_0.ipynb
│ ├── qa_0_0.md
│ └── requirements.txt
│ ├── sprint_0_5
│ ├── README.md
│ ├── project_0_5.ipynb
│ ├── qa_0_5.md
│ ├── snapshot.png
│ └── snapshot2.png
│ ├── sprint_1_0
│ ├── README.md
│ ├── project_0_0.ipynb
│ ├── qa_0_0.md
│ └── requirements.txt
│ ├── sprint_1_5
│ ├── README.md
│ ├── project_0_0.ipynb
│ ├── qa_0_0.md
│ └── requirements.txt
│ ├── sprint_2_0
│ ├── README.md
│ ├── project_0_0.ipynb
│ ├── qa_0_0.md
│ └── requirements.txt
│ ├── sprint_2_5
│ ├── README.md
│ ├── project_0_0.ipynb
│ ├── qa_0_0.md
│ └── requirements.txt
│ ├── sprint_3_0
│ ├── README.md
│ ├── project_0_0.ipynb
│ ├── qa_0_0.md
│ └── requirements.txt
│ ├── sprint_3_5
│ └── README.md
│ └── sprint_4_0
│ └── README.md
├── projects
└── bonded_surface
│ ├── README.md
│ ├── bc.py
│ ├── bondmath.docx
│ ├── cadcad_fromdisk.ipynb
│ ├── cadcad_live.ipynb
│ └── model
│ ├── __init__.py
│ ├── __main__.py
│ ├── execution.py
│ ├── experiment.py
│ ├── params.py
│ ├── structure.py
│ └── types.py
├── qa_format.md
└── templates
├── README.md
├── cadcad_og
├── README.md
├── cadcad_fromdisk.ipynb
├── cadcad_live.ipynb
└── model
│ ├── __init__.py
│ ├── __main__.py
│ ├── execution.py
│ ├── experiment.py
│ ├── logic.py
│ ├── params.py
│ └── structure.py
├── cadcad_tools
└── mpp_example.ipynb
├── causal_loop_template.mmd
├── python
├── simple.ipynb
└── simple.py
└── requirements.txt
/.gitignore:
--------------------------------------------------------------------------------
1 | venv
2 | notes
3 | *.gz
4 | *.pyc
5 | __pycache__
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | MIT License
2 |
3 | Copyright (c) 2022 TokenEngineeringCommunity
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy
6 | of this software and associated documentation files (the "Software"), to deal
7 | in the Software without restriction, including without limitation the rights
8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 | copies of the Software, and to permit persons to whom the Software is
10 | furnished to do so, subject to the following conditions:
11 |
12 | The above copyright notice and this permission notice shall be included in all
13 | copies or substantial portions of the Software.
14 |
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21 | SOFTWARE.
22 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # Intro to Complex Systems w/ Tokens Study Group
2 |
3 | A peer to peer learning study group that meets weekly to explore Complex Systems Modeling w/ Tokens.
4 |
5 | ## Table of Contents
6 | - [About The Group](#about-the-group)
7 | - [When & Where](#when-where)
8 | - [Squad Goals](#squad-goals)
9 | - [How it Works](#how-it-works)
10 | - [Sprints](#sprints)
11 | - [Q&A](#q&a)
12 | - [Projects](#projects)
13 | - [Contributions](#contributions)
14 | - [Schedule](#schedule)
15 | - [Getting Started](#getting-started)
16 | - [Discord](https://discord.gg/BSrZUxUuXq)
17 |
18 | ### About the Group
19 |
20 | This study group is a peer to peer learning study group, that meets weekly to explore Complex Systems Modeling with Tokens. We use the free CC0 book [Intro to Complex Systems](https://milneopentextbooks.org/introduction-to-the-modeling-and-analysis-of-complex-systems/) to ground our exploration of topics.
21 |
22 | The prereqs are none just an open mind and a willingness to learn. Some python is super useful, we'll go over a few tips 'n' tricks in the beginning. The math will be fairly light, but can scale with knowledge level.
23 |
24 | ### When Where
25 | - Where: [Discord Voice Channel](https://discord.gg/BSrZUxUuXq)
26 | - When: Tuesdays 5pm-6pm UTC
27 | - Starts: August 9th 2022
28 |
29 |
30 | ### Squad Goals
31 |
32 | This project aims to help increase the knowledge of modeling complex systems that involve tokens. The goal is to learn and share what we've learned via contributions to wikis, toolsets, and code. Capturing our learning journey can be super valuable, the study group is to be collaborative.
33 |
34 | We target going from limited python to building a cadcad model for a staking system at the end of 8 weeks, while following the back drop of [Intro to Complex Systems](https://milneopentextbooks.org/introduction-to-the-modeling-and-analysis-of-complex-systems/).
35 |
36 | ### How it Works
37 |
38 | #### Sprints
39 | The study group format is that of two week [sprints](https://en.wikipedia.org/wiki/Scrum_sprint#Values). We choose this format to allow us to timebox and be a little bit focused in scope.
40 |
41 | The 1st week of the sprint consists of a reading discussion, a group exercise, and going through the Q&A that might have arisen throughout the week.
42 |
43 | The 2nd week of the sprint consists of an expert session about a similar topic discussed in the prior week and Q&A with the expert, and finally a feedback/group check in.
44 |
45 | The sprints will be listed [here](./schedule.md)
46 |
47 | #### Q&A
48 | To facilitate everyone's busy schedule and the adhoc nature of exploring. We introduce a Q&A sheet for every sprint , where people can anonymously post their questions. During the week the community will try and answer the questions that come up. They can be topic related or tangentially like I'm having an issue getting pyplot to show dimensions.
49 |
50 | We'll be using https://cryptpad.fr for our questions. [live example](https://cryptpad.fr/code/#/2/code/edit/3GIZwOk9TmJ8EXicyxS4TjCR/) . The Q&A [format](./qa_format.md)
51 |
52 | #### Contributions
53 | Contributions to this repo are always welcome. We want to make an effort to improve the ecosystem, so the second sprint, we'll spend some time doing housekeeping and make some contribs to this repo. Contributions don't need to be code, they can be definitions, filling out the wiki, asking questions, or providing feedback.
54 |
55 | **PRs**
56 |
57 | We use conventional [commits](https://www.conventionalcommits.org/en/v1.0.0/)
58 |
59 | **Issues**
60 |
61 | Issues are just as valuable as code contributions, so see something just create an issue and we'll try and patch it up, even if it's non code related.
62 |
63 | **Code**
64 |
65 | For code contributions, typically make a fork of this repo, then make a PR from that fork. If you get stuck just pop into the discord and we'll get it sorted!
66 |
67 | **Non Code Contributions**
68 |
69 | Create an issue for the thing that you'd like to add or change, and we'll discuss take it up!
70 |
71 | #### Feedback
72 |
73 | Every two weeks we'll be putting out a feedback survey about how the sprint went, the plan tenatively is to use https://pol.is and share these results.
74 | The goal is to figure out what's working or not and adjust. Let's be flexible and fluid as it's a peer 2 peer learning let's get the most out of it!
75 |
76 | ### Repo Organization
77 | ```
78 | ├── knowledge_base
79 | ├── pm
80 | │ └── sprints
81 | │ └── sprint_xx
82 | └── templates
83 | ├── cadcad
84 | └── python
85 | ```
86 | - *knowledge_base* is our tbd repository for collecting definitions and building out a wiki that's generally useful for other users
87 | - *pm* is our project management folder that will consists of sprints/ qa for that sprint, and any files needed/ worked on during that spring
88 | - *sprints* is the collection of our sprints
89 | - *sprints_xx* is the individual sprint data
90 | - *templates* are the individual that wqas easy gettting started templates for projects/exercises
91 | - *python* is a simple example template that allows you to do simulations with just globals and plain old python
92 | - *cadcad* is a simple example template that allows you to spin up cadcad with as little overhead as possible
93 |
94 | ### Schedule
95 |
96 | This section contains the summary information for each of the weeks, including topics and any readings (Guest). Just click the Sprint to find details for the Sprint.
97 |
98 | |Sprint| Topics | Readings|Date|
99 | --- | --- | ---| ---|
100 | |[Sprint 0.0] |Intros & Python Setup, Meet and Greet [Video](https://youtu.be/CoCMnMcxbvA)| [Getting Started Cheatsheet](./knowledge_base/GettingStartedCheatsheet.md) |08-09-22
101 | |[Sprint 0.5] |What is a Model, Building Models from Observation [Video](https://youtu.be/CoCMnMcxbvA)| Chapter 1,2 of [Sayama]| 08-16-22
102 | |[Sprint 1.0] |Ch 2 part 2. ~~ Expert Session~~ [Video](https://youtu.be/Xzhl0vYfWt4)| Ch. 2 of [Sayama] |08-23-22
103 | |[Sprint 1.5] |Phase Space + State Variables [Video](https://youtu.be/pXR_wxMZuq8)|Ch 3, 4.1 [Sayama], |08-30-22
104 | |[Sprint 2.0] |Phase Space part 2 + Staking Discussion [Video](https://www.youtube.com/watch?v=U-AshyiLTQ8) | Ch 3 [Sayama] |09-06-22
105 | |[Sprint 2.5] |State Variables [Video](https://youtu.be/6ikr8bAyNWc)|Ch 4.1-4.3 [Sayama]| 09-13-22|
106 | [Sprint 3.0] |Models to Equations [Video](https://youtu.be/eETubeELh78)| ch 4.3-4.5 [Sayama] |09-27-22
107 | |[Sprint 3.5] |Models to Equations pt 2 [Video](https://youtu.be/HqHT29613BE)| ch 4.5-4.7 [Sayama], [Casual Loop Diagram](https://online.visual-paradigm.com/knowledge/causal-loop-diagram/what-is-causal-loop-diagram)| 10-04-22
108 | |[Sprint 4.0] |Building a Model mechanics to reality Cadcad overview [Video](https://youtu.be/XFQXhCg-Uss)| [Stock & Flow Diagrams](https://thesystemsthinker.com/step-by-step-stocks-and-flows-improving-the-rigor-of-your-thinking/) ch. None|10-11-22
109 | |[Sprint 4.5] |Building a AMM model step by step [Video](https://youtu.be/dY9TjH3XSWk)| ch None|10-18-22
110 | |[Sprint 5.0] |Iterating on the AMM model [Video](https://youtu.be/sptrce3mrww) |ch None | 10-25-22
111 | |Sprint 5.5 |Iterating on the AMM model [Video](https://youtu.be/oM42UJt2ASA) | |11-01-22
112 | |Sprint 6.0 |Uniswap whitepaper v2 [Video](https://youtu.be/45Bo8m54VLY) |[V2 uniswap](https://uniswap.org/whitepaper.pdf) | 11-08-22
113 | |Sprint 6.5 |Uniswap whitepaper v2 cont [Video](https://youtu.be/9_7X4aoEal4) |[V2 uniswap](https://uniswap.org/whitepaper.pdf) | 11-15-22
114 | |Sprint 7.0 |Bondend Token Surface [Video](https://youtu.be/p-o2dNMhFn0)|[Bonded]| 12-06-22
115 | |Sprint 7.5 |Bondend Token Surface Pt. 2 [Video](https://youtu.be/ntPNaDyaukQ)|[Bonded]| 12-13-22
116 | ### Getting Started
117 | - Useful things install python 3.10
118 | - VSCode/VSCodium or some IDE that's easy to use with python
119 |
120 | #### Special Thanks
121 |
122 | Cadcad, Token Engineering Academy, QuietCatalyst, Ratio13, elbeth, Phacker and those that have just popped into the chat in the past.
123 |
124 | ### Let's Go!!!!
125 |
126 |
127 |
128 | [Sayama]: https://milneopentextbooks.org/introduction-to-the-modeling-and-analysis-of-complex-systems
129 | [Bonded]: https://ostable.org/bonded-stablecoins.pdf
130 | [Sprint 0.0]: ./pm/sprints/sprint_0_0/README.md
131 | [Sprint 0.5]: ./pm/sprints/sprint_0_5/README.md
132 | [Sprint 1.0]: ./pm/sprints/sprint_1_0/README.md
133 | [Sprint 1.5]: ./pm/sprints/sprint_1_5/README.md
134 | [Sprint 2.0]: ./pm/sprints/sprint_2_0/README.md
135 | [Sprint 2.5]: ./pm/sprints/sprint_2_5/README.md
136 | [Sprint 3.0]: ./pm/sprints/sprint_3_0/README.md
137 | [Sprint 3.5]: ./pm/sprints/sprint_3_5/README.md
138 | [Sprint 4.0]: ./pm/sprints/sprint_4_0/README.md
139 | [Sprint 4.5]: ./pm/sprints/sprint_4_0/README.md
140 |
--------------------------------------------------------------------------------
/amm/README.md:
--------------------------------------------------------------------------------
1 | # This is our AMM model that we're building live
2 | - amm_causal_loop.mmd - our relationship CLD diagram it uses the causal loop template to describe the CLD with mermaidjs so we can iterate in code and track changes
3 |
--------------------------------------------------------------------------------
/amm/amm_causal_loop.mmd:
--------------------------------------------------------------------------------
1 | %%{init: {'themeVariables': {}}}%%
2 | %% comments
3 | %% This diagram details the graph
4 |
5 | graph LR
6 | %% :::tr is the class definition that styles a node
7 | %% the format is nameOfNode[Node label]:::stylingclass
8 |
9 | %% node definition section
10 | traders[Traders]:::tr
11 | tradeA[Trade A]:::tr
12 | tradeB[Trade B]:::tr
13 | numA[Num tokens A]:::tr
14 | numB[Num tokens B]:::tr
15 | lProvider[Liquidity Provider]:::tr
16 | lFee[Liquidity Fee Reward]:::tr
17 | secondaryReward[Secondary Reward]:::tr
18 |
19 |
20 |
21 | %% --> defines the relationship arrow directionn
22 | %% |+ or -| definnes the type of correlation
23 | %% relationship definition section
24 | traders --> |+| tradeA
25 | traders --> |+| tradeB
26 | tradeA -->|-| numA
27 | tradeA -->|+| numB
28 | tradeB -->|-| numB
29 | tradeB -->|+| numA
30 | numA -->|+| traders
31 | numB -->|+| traders
32 | tradeA --> |+| lFee
33 | tradeB --> |+| lFee
34 | lFee --> |+| lProvider
35 | lProvider --> |+| numA
36 | lProvider --> |+| numB
37 | lProvider --> |-| lFee
38 | secondaryReward --> |-| lProvider
39 | secondaryReward --> |-| traders
40 |
41 |
42 | %% class def at the bottom adds a transparecy to the nodes
43 | classDef tr fill:#00000000, stroke:#00000000;
--------------------------------------------------------------------------------
/knowledge_base/GettingStartedCheatsheet.md:
--------------------------------------------------------------------------------
1 | ### GettingStarted Cheatsheet
2 |
3 | ### Installation
4 | We'll be using python
5 |
6 | Python 3.10.xx
7 |
8 | #### Installation
9 | https://www.python.org/downloads/release/python-3105/
10 |
11 | ### Creating environments
12 |
13 | #### venv
14 | Typically we'll create virtual environments for our projects using venv
15 | ```
16 | python3.10 -m venv venv
17 | source ~/venv/venv/activate
18 | ```
19 | This allows you to install things locally without interacting with the global space of the packages that you install
20 |
21 | #### requirements.txt
22 | It's useful to be able to just install a version of the packages used, we'll typically using requirements.txt to install necessary packages
23 | ```
24 | # Generate a requirements.txt via pip freeze
25 | pip freeze > requirements.txt
26 | ```
27 |
28 | ### Types
29 | Types are awesome, in the future [cadcad](https://cadcad.org), datascience aligned projects will use types, we'll try and use types as well
30 | so a good primer here is just the actual type systems documentation. Here's also a motivational [piece](https://hackernoon.com/type-annotation-in-python) thats good as well.
31 |
32 | ### Numpy
33 | We'll probably using [numpy](https://numpy.org/) in some way or form. Numpy is a python package that makes it easier to perform
34 | math operations on vectors/matricies/list of data.
35 |
36 | ### Matplotlib or Plotly
37 | Both are great options, modellers choice.
38 | The text uses an outdated version of [matplotlib](https://matplotlib.org/)
39 | Slightly slicker plotting production [plotly](https://github.com/plotly/plotly.py)
40 |
41 | ### Jupyter Notebook
42 | For this study group we have a great getting started [notebook](../templates/python/simple.ipynb)
43 | and also a way to start evolving our setup with [notebook](../templates/cadcad_tools/mpp_example.ipynb) cribbed from
44 | the [cadcad tools repo](https://github.com/cadCAD-org/cadCAD-tools).
45 |
46 | ### Token Engineering Tools
47 | Just a quick link to overview of token engineering toolinng.
48 | [Tools](https://github.com/TokenEngineeringCommunity/summary-of-tools)
49 |
50 | ### Useful Python Topics
51 | [List Comprehensios](https://www.learnpython.org/en/List_Comprehensions)
52 | [Lambda Functions](https://www.learnpython.org/en/Lambda_functions)
53 | [Type Annotations](https://docs.python.org/3/library/typing.html)
54 | [Data Class](https://realpython.com/python-data-classes/#basic-data-classes)
55 |
56 |
57 |
--------------------------------------------------------------------------------
/knowledge_base/README.md:
--------------------------------------------------------------------------------
1 | ## Knowledgebase
2 | ### Coming soon
3 | Here the plan is to start building a knowledge base of the things we've discussed in an indexable or searchable way.
4 | We could move content to a wiki or we could try and leverage gitbooks, to create searchable place to expand knowledge.
5 | This could also migrate to an org wide repo, where definitions terminology etc... can be aggregated in a maintable,
6 | discoverable way.
7 |
8 |
9 | ### GettingStartedCheatsheet.md
10 |
11 | This serves as a jumping off place for information about python, some tooling,
12 | and things people find/have found useful.
13 |
14 | [here](./GettingStartedCheatsheet.md)
15 |
16 |
17 |
18 |
--------------------------------------------------------------------------------
/pm/sprints/README.md:
--------------------------------------------------------------------------------
1 | ### Sprints Summary
2 | Here's a quick breakdown of the sprints and quick click directory.
3 | ```
4 | ├── sprint_x_x // x x just the number of the sprint x.x
5 | │ ├── README.md // Readme about what the topics of the sprint aree about
6 | │ ├── project_x_x.ipynb // Any sort of live coding would happen here
7 | │ ├── qa_x_x.md //the cryptpad for the sprint memorialized
8 | │ └── requirements.txt // any deps required for the notebook etc...
9 | ```
10 |
11 | ### Sprints table
12 | |Sprint| Topics| Readings|Date|
13 | --- | --- | ---| ---|
14 | |[Sprint 0.0] |Intros & Python Setup, Meet and Greet | [Getting Started Cheatsheet](../../knowledge_base/GettingStartedCheatsheet.md) |08-09-22
15 | |[Sprint 0.5] |What is a Model, Building Models from Observation| Chapter 1,2 of [Sayama]| 08-16-22
16 | |[Sprint 1.0] |Sprint 0.5 part 2| Continuation of Ch 2 |08-23-22
17 | |[Sprint 1.5] |Phase Space + State Variables|Ch 3, 4.1 [Sayama] |08-30-22
18 | |[Sprint 2.0] |Understanding Model Behavior w/ Expert TBD | TBA |09-06-22
19 | |[Sprint 2.5] |Model to Equations to Simulation| Ch 4.2-4.6 [Sayama] |09-13-22
20 | |[Sprint 3.0] |Model to Equations w/Expert| TBA|09-20-22
21 | |[Sprint 3.5] |Creating a Staking Model| Optional Ch 5.1, 5.6, 5.7 [Sayama]|09-27-22
22 | |[Sprint 4.0] |Staking Model w/ Expert| None|10-03-22
23 |
24 |
25 | [Sayama]: https://milneopentextbooks.org/introduction-to-the-modeling-and-analysis-of-complex-systems
26 | [Sprint 0.0]: ./sprint_0_0/README.md
27 | [Sprint 0.5]: ./sprint_0_5/README.md
28 | [Sprint 1.0]: ./sprint_1_0/README.md
29 | [Sprint 1.5]: ./sprint_1_5/README.md
30 | [Sprint 2.0]: ./sprint_2_0/README.md
31 | [Sprint 2.5]: ./sprint_2_5/README.md
32 | [Sprint 3.0]: ./sprint_3_0/README.md
33 | [Sprint 3.5]: ./sprint_3_5/README.md
34 | [Sprint 4.0]: ./sprint_4_0/README.md
--------------------------------------------------------------------------------
/pm/sprints/sprint_0_0/README.md:
--------------------------------------------------------------------------------
1 | ### Notes
2 | # Sprint 0.0
3 |
4 | ### Readings
5 | None This week
6 |
7 | ### Session Questions and answers
8 | [Q&A cryptpad](https://cryptpad.fr/code/#/2/code/edit/m+Z307+8cMrzRkEQHU0MBWtU/)
9 |
10 | ### Goals
11 | - Meet and Greet
12 | - What do you want to get out of the group?
13 | - Talk about we're going with the group and format
14 | - Intro to setting up python environment // Simple model for this
15 | - Intro to setting up cadcad // Simple model for this
16 |
17 | ### Topic Discussion Suggestions
18 | - What do we want to get out of the group?
19 | - Setup for python environment
20 | - Jupyter notebook intro
21 | - Cadcad intro installation
22 |
23 | ### Practice (Group Exercise)
24 | - Verifying our setups work
25 |
26 | ### Async Learning
27 | - Post a question in the cryptpad
28 |
29 |
30 | ### Next Week
31 | Next week we will be covering how to create models from observation. Jump ahead [here](../sprint_0_5/README.md)
32 |
33 |
34 |
35 |
--------------------------------------------------------------------------------
/pm/sprints/sprint_0_0/project_0_0.ipynb:
--------------------------------------------------------------------------------
1 | {
2 | "cells": [
3 | {
4 | "cell_type": "code",
5 | "execution_count": null,
6 | "metadata": {},
7 | "outputs": [],
8 | "source": []
9 | }
10 | ],
11 | "metadata": {
12 | "kernelspec": {
13 | "display_name": "Python 3.7.0 64-bit ('cx-env')",
14 | "language": "python",
15 | "name": "python3"
16 | },
17 | "language_info": {
18 | "name": "python",
19 | "version": "3.7.0"
20 | },
21 | "orig_nbformat": 4,
22 | "vscode": {
23 | "interpreter": {
24 | "hash": "c0c32d8c7acadb7de1d883aa6bcf1588befe44823271dcdb80a8921f92315224"
25 | }
26 | }
27 | },
28 | "nbformat": 4,
29 | "nbformat_minor": 2
30 | }
31 |
--------------------------------------------------------------------------------
/pm/sprints/sprint_0_0/qa_0_0.md:
--------------------------------------------------------------------------------
1 | # Questions And Answers for Sprint (Permanent Record)
2 | ## Summary
3 | These are questions that came up during the exploration of complex systems
4 |
5 | ## Format
6 | **Questions**
7 | - Answers
8 |
9 |
10 |
11 |
--------------------------------------------------------------------------------
/pm/sprints/sprint_0_0/requirements.txt:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/TokenEngineeringCommunity/cadCADStudyGroup/18c937752c3f05f563722252ffd7dc6b110f233d/pm/sprints/sprint_0_0/requirements.txt
--------------------------------------------------------------------------------
/pm/sprints/sprint_0_5/README.md:
--------------------------------------------------------------------------------
1 | ### Notes
2 | # Sprint 0.5
3 |
4 | ### Readings
5 | Chapter 1,2 [Sayama]
6 |
7 | ### Session Questions and answers
8 | [Q&A cryptpad](https://cryptpad.fr)
9 |
10 | ### Goals
11 | - Recap last week
12 | - Describe what is a model
13 | - What are the limits of a model
14 | - Create a model from observation
15 |
16 |
17 | ### Topic Discussion Suggestions
18 | - What do we want to get out of the group?
19 | - Setup for python environment
20 | - Jupyter notebook intro
21 | - Cadcad intro installation
22 |
23 | ### Practice (Group Exercise)
24 | Looking at the growth of the NFT market how would we go about creating a very simple model to describe this market.
25 | [] as describe [here](https://dune.com/queries/201622/376266)
26 | and
27 | [] as describe [here](https://dune.com/queries/419712/800264)
28 |
29 | Let's compare our models in terms of simplicity, validity and robustness.
30 |
31 |
32 | ### Async Learning (Bonus)
33 | - Looking at these [charts](https://dune.com/hildobby/Gas) . Do our models make sense in the long run. If you're curious,
34 | have a look at the actual process behind the gas price, did our model capture alot of the factors at play? What'd we miss?
35 |
36 |
37 | ### Next Week
38 | Next week we will be talking w/ expert about extracting information from observations. Jump ahead [here](../sprint_1_0/README.md)
39 |
40 |
41 |
42 | [Sayama]: https://milneopentextbooks.org/introduction-to-the-modeling-and-analysis-of-complex-systems
43 |
--------------------------------------------------------------------------------
/pm/sprints/sprint_0_5/project_0_5.ipynb:
--------------------------------------------------------------------------------
1 | {
2 | "cells": [
3 | {
4 | "cell_type": "code",
5 | "execution_count": null,
6 | "metadata": {},
7 | "outputs": [],
8 | "source": []
9 | }
10 | ],
11 | "metadata": {
12 | "kernelspec": {
13 | "display_name": "Python 3.7.0 64-bit ('cx-env')",
14 | "language": "python",
15 | "name": "python3"
16 | },
17 | "language_info": {
18 | "name": "python",
19 | "version": "3.7.0"
20 | },
21 | "orig_nbformat": 4,
22 | "vscode": {
23 | "interpreter": {
24 | "hash": "c0c32d8c7acadb7de1d883aa6bcf1588befe44823271dcdb80a8921f92315224"
25 | }
26 | }
27 | },
28 | "nbformat": 4,
29 | "nbformat_minor": 2
30 | }
31 |
--------------------------------------------------------------------------------
/pm/sprints/sprint_0_5/qa_0_5.md:
--------------------------------------------------------------------------------
1 | # Questions And Answers for Sprint (Permanent Record)
2 | ## Summary
3 | These are questions that came up during the exploration of complex systems
4 |
5 | ## Format
6 | **Questions**
7 | - Answers
8 |
9 |
10 |
11 |
--------------------------------------------------------------------------------
/pm/sprints/sprint_0_5/snapshot.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/TokenEngineeringCommunity/cadCADStudyGroup/18c937752c3f05f563722252ffd7dc6b110f233d/pm/sprints/sprint_0_5/snapshot.png
--------------------------------------------------------------------------------
/pm/sprints/sprint_0_5/snapshot2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/TokenEngineeringCommunity/cadCADStudyGroup/18c937752c3f05f563722252ffd7dc6b110f233d/pm/sprints/sprint_0_5/snapshot2.png
--------------------------------------------------------------------------------
/pm/sprints/sprint_1_0/README.md:
--------------------------------------------------------------------------------
1 | ### Notes
2 | # Sprint 1.0
3 |
4 | ### Readings
5 | Ch. 2 of Sayama
6 |
7 | ### Session Questions and answers
8 | https://cryptpad.fr/code/#/2/code/edit/uzqdh56RpYp8rU6k1Vxdh1tb/
9 |
10 | ### Goals
11 | - Recap Ch. 2
12 | - Continuation and completion of sprint 0.5
13 | - Housekeeping
14 |
15 |
16 | ### Topic Discussion Suggestions
17 | - Q&A w/ Expert
18 | - Housekeeping
19 |
20 | ### Housekeeping
21 | 1st session to make the ecosystem better. Let's clean up repo etc...
22 |
23 | ### Next Week
24 | Next week we will be covering how to look at phase space and define state variables. Jump ahead [here](../sprint_1_5/README.md)
25 |
26 |
27 |
28 |
--------------------------------------------------------------------------------
/pm/sprints/sprint_1_0/project_0_0.ipynb:
--------------------------------------------------------------------------------
1 | {
2 | "cells": [
3 | {
4 | "cell_type": "code",
5 | "execution_count": null,
6 | "metadata": {},
7 | "outputs": [],
8 | "source": []
9 | }
10 | ],
11 | "metadata": {
12 | "kernelspec": {
13 | "display_name": "Python 3.7.0 64-bit ('cx-env')",
14 | "language": "python",
15 | "name": "python3"
16 | },
17 | "language_info": {
18 | "name": "python",
19 | "version": "3.7.0"
20 | },
21 | "orig_nbformat": 4,
22 | "vscode": {
23 | "interpreter": {
24 | "hash": "c0c32d8c7acadb7de1d883aa6bcf1588befe44823271dcdb80a8921f92315224"
25 | }
26 | }
27 | },
28 | "nbformat": 4,
29 | "nbformat_minor": 2
30 | }
31 |
--------------------------------------------------------------------------------
/pm/sprints/sprint_1_0/qa_0_0.md:
--------------------------------------------------------------------------------
1 | # Questions And Answers for Sprint (Permanent Record)
2 | ## Summary
3 | These are questions that came up during the exploration of complex systems
4 |
5 | ## Format
6 | **Questions**
7 | - Answers
8 |
9 |
10 |
11 |
--------------------------------------------------------------------------------
/pm/sprints/sprint_1_0/requirements.txt:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/TokenEngineeringCommunity/cadCADStudyGroup/18c937752c3f05f563722252ffd7dc6b110f233d/pm/sprints/sprint_1_0/requirements.txt
--------------------------------------------------------------------------------
/pm/sprints/sprint_1_5/README.md:
--------------------------------------------------------------------------------
1 | ### Notes
2 | # Sprint 1.5
3 |
4 | ### Readings
5 | Chapter 3, 4.1 [Sayama]
6 |
7 | ### Session Questions and answers
8 | [Q&A cryptpad](https://cryptpad.fr)
9 |
10 | ### Goals
11 | - Recap on what we talked aobut last week
12 | - Understand what a state variable is
13 | - Understand what phase space is
14 |
15 |
16 | ### Topic Discussion Suggestions
17 | - Q&A
18 | - How do we use phase space to understand a system
19 | - How do we visualize phase space, and what should we plot
20 | - What is a state variable and how do they operate
21 |
22 | ### Practice (Group Exercise)
23 | Can we create a visualization of the phase space of a [bonding curve](https://blog.relevant.community/bonding-curves-in-depth-intuition-parametrization-d3905a681e0a)
24 |
25 | ### Async Learning
26 | How does the shape of our visualization change if there is a separate sell and buy curve?
27 |
28 |
29 | ### Next Week
30 | Next week we will be talking with an expert about interpeting model behavior. Jump ahead [here](../sprint_2_0/README.md)
31 |
32 |
33 |
34 | [Sayama]: https://milneopentextbooks.org/introduction-to-the-modeling-and-analysis-of-complex-systems
35 |
--------------------------------------------------------------------------------
/pm/sprints/sprint_1_5/project_0_0.ipynb:
--------------------------------------------------------------------------------
1 | {
2 | "cells": [
3 | {
4 | "cell_type": "code",
5 | "execution_count": null,
6 | "metadata": {},
7 | "outputs": [],
8 | "source": []
9 | }
10 | ],
11 | "metadata": {
12 | "kernelspec": {
13 | "display_name": "Python 3.7.0 64-bit ('cx-env')",
14 | "language": "python",
15 | "name": "python3"
16 | },
17 | "language_info": {
18 | "name": "python",
19 | "version": "3.7.0"
20 | },
21 | "orig_nbformat": 4,
22 | "vscode": {
23 | "interpreter": {
24 | "hash": "c0c32d8c7acadb7de1d883aa6bcf1588befe44823271dcdb80a8921f92315224"
25 | }
26 | }
27 | },
28 | "nbformat": 4,
29 | "nbformat_minor": 2
30 | }
31 |
--------------------------------------------------------------------------------
/pm/sprints/sprint_1_5/qa_0_0.md:
--------------------------------------------------------------------------------
1 | # Questions And Answers for Sprint (Permanent Record)
2 | ## Summary
3 | These are questions that came up during the exploration of complex systems
4 |
5 | ## Format
6 | **Questions**
7 | - Answers
8 |
9 |
10 |
11 |
--------------------------------------------------------------------------------
/pm/sprints/sprint_1_5/requirements.txt:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/TokenEngineeringCommunity/cadCADStudyGroup/18c937752c3f05f563722252ffd7dc6b110f233d/pm/sprints/sprint_1_5/requirements.txt
--------------------------------------------------------------------------------
/pm/sprints/sprint_2_0/README.md:
--------------------------------------------------------------------------------
1 | ### Notes
2 | # Sprint 2.0
3 |
4 | ### Readings
5 | TBA
6 |
7 | ### Session Questions and answers
8 | [Q&A cryptpad TBA](https://cryptpad.fr)
9 |
10 | ### Goals
11 | - Recap
12 | - Q&A
13 | - Expert insights
14 | - Housekeeping
15 |
16 |
17 | ### Topic Discussion Suggestions
18 | - Q&A w/ Expert
19 | - Expert insights
20 | - Housekeeping
21 |
22 | ### Housekeeping
23 | 2nd session to make the ecosystem better. Let's clean up repo etc...
24 |
25 | ### Next Week
26 | Next week we will be covering how to go from model to euqatio to simulation. Jump ahead [here](../sprint_2_5/README.md)
27 |
28 |
29 |
30 |
--------------------------------------------------------------------------------
/pm/sprints/sprint_2_0/project_0_0.ipynb:
--------------------------------------------------------------------------------
1 | {
2 | "cells": [
3 | {
4 | "cell_type": "code",
5 | "execution_count": null,
6 | "metadata": {},
7 | "outputs": [],
8 | "source": []
9 | }
10 | ],
11 | "metadata": {
12 | "kernelspec": {
13 | "display_name": "Python 3.7.0 64-bit ('cx-env')",
14 | "language": "python",
15 | "name": "python3"
16 | },
17 | "language_info": {
18 | "name": "python",
19 | "version": "3.7.0"
20 | },
21 | "orig_nbformat": 4,
22 | "vscode": {
23 | "interpreter": {
24 | "hash": "c0c32d8c7acadb7de1d883aa6bcf1588befe44823271dcdb80a8921f92315224"
25 | }
26 | }
27 | },
28 | "nbformat": 4,
29 | "nbformat_minor": 2
30 | }
31 |
--------------------------------------------------------------------------------
/pm/sprints/sprint_2_0/qa_0_0.md:
--------------------------------------------------------------------------------
1 | # Questions And Answers for Sprint (Permanent Record)
2 | ## Summary
3 | These are questions that came up during the exploration of complex systems
4 |
5 | ## Format
6 | **Questions**
7 | - Answers
8 |
9 |
10 |
11 |
--------------------------------------------------------------------------------
/pm/sprints/sprint_2_0/requirements.txt:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/TokenEngineeringCommunity/cadCADStudyGroup/18c937752c3f05f563722252ffd7dc6b110f233d/pm/sprints/sprint_2_0/requirements.txt
--------------------------------------------------------------------------------
/pm/sprints/sprint_2_5/README.md:
--------------------------------------------------------------------------------
1 | ### Notes
2 | # Sprint 2.5
3 |
4 | ### Readings
5 | Chapter 4.2 - 4.6 [Sayama] , [Loop Diagrams](https://online.visual-paradigm.com/knowledge/causal-loop-diagram/what-is-causal-loop-diagram/), [Stock and Flow Diagrams](https://thesystemsthinker.com/step-by-step-stocks-and-flows-improving-the-rigor-of-your-thinking/)
6 |
7 | ### Session Questions and answers
8 | [Q&A cryptpad](https://cryptpad.fr)
9 |
10 | ### Goals
11 | - Recap on what we talked aobut last week
12 | - Understand what how we get from model to equation to simulation
13 | - Q & A
14 | - Discuss what we want to try and model going forward
15 |
16 |
17 | ### Topic Discussion Suggestions
18 | - Q&A
19 | - How do we go from second order to first order equation
20 | - What are Causal Loop Diagrams
21 | - What is the simulation framework we should use
22 |
23 | ### Practice (Group Exercise)
24 | 2 for 1 token Model
25 |
26 | #### Description
27 | 2 DAOs decided to merge and create a new token, they set the exchange rate for the new token to be 2 OG tokens for 1 YG token. Can we create a model for this exchange, that can simulate tokens being exchanged at a constant rate over time, until all the tokens are off the market.
28 |
29 | Plot the amount of tokens exchanged over time until there are no more tokens to exchange.
30 |
31 | ### Async Learning
32 | Bonus: Can you imagine that there is a time limit $t_{100}$. The introduction of a timelimit changes the dynamics of the system. This change shifts the time rate from being constant to exponential.
33 |
34 | For example more exchanging happens at $t_{0}$ than at $t_{100}$ or vice versa.
35 |
36 | Can you model this new exchange rate ? Can you calculate how many tokens did not get exchanged by the time limit $t_{100}$.
37 |
38 |
39 | ### Next Week
40 | Next week we will be talking with an expert about going from diagram to equation. Jump ahead [here](../sprint_3_0/README.md)
41 |
42 |
43 |
44 | [Sayama]: https://milneopentextbooks.org/introduction-to-the-modeling-and-analysis-of-complex-systems
45 |
--------------------------------------------------------------------------------
/pm/sprints/sprint_2_5/project_0_0.ipynb:
--------------------------------------------------------------------------------
1 | {
2 | "cells": [
3 | {
4 | "cell_type": "code",
5 | "execution_count": null,
6 | "metadata": {},
7 | "outputs": [],
8 | "source": []
9 | }
10 | ],
11 | "metadata": {
12 | "kernelspec": {
13 | "display_name": "Python 3.7.0 64-bit ('cx-env')",
14 | "language": "python",
15 | "name": "python3"
16 | },
17 | "language_info": {
18 | "name": "python",
19 | "version": "3.7.0"
20 | },
21 | "orig_nbformat": 4,
22 | "vscode": {
23 | "interpreter": {
24 | "hash": "c0c32d8c7acadb7de1d883aa6bcf1588befe44823271dcdb80a8921f92315224"
25 | }
26 | }
27 | },
28 | "nbformat": 4,
29 | "nbformat_minor": 2
30 | }
31 |
--------------------------------------------------------------------------------
/pm/sprints/sprint_2_5/qa_0_0.md:
--------------------------------------------------------------------------------
1 | # Questions And Answers for Sprint (Permanent Record)
2 | ## Summary
3 | These are questions that came up during the exploration of complex systems
4 |
5 | ## Format
6 | **Questions**
7 | - Answers
8 |
9 |
10 |
11 |
--------------------------------------------------------------------------------
/pm/sprints/sprint_2_5/requirements.txt:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/TokenEngineeringCommunity/cadCADStudyGroup/18c937752c3f05f563722252ffd7dc6b110f233d/pm/sprints/sprint_2_5/requirements.txt
--------------------------------------------------------------------------------
/pm/sprints/sprint_3_0/README.md:
--------------------------------------------------------------------------------
1 | ### Notes
2 | # Sprint 3.0
3 |
4 | ### Readings
5 | TBA
6 |
7 | ### Session Questions and answers
8 | [Q&A cryptpad TBA](https://cryptpad.fr)
9 |
10 | ### Goals
11 | - Recap
12 | - Q&A
13 | - Expert insights
14 | - Housekeeping
15 |
16 |
17 | ### Topic Discussion Suggestions
18 | - Q&A w/ Expert
19 | - Expert insights
20 | - Housekeeping
21 |
22 | ### Housekeeping
23 | 3rd session to make the ecosystem better. Let's clean up repo etc...
24 |
25 | ### Next Week
26 | Next week we will be modeling a system. Jump ahead [here](../sprint_3_0/README.md)
27 |
28 |
29 |
30 |
--------------------------------------------------------------------------------
/pm/sprints/sprint_3_0/project_0_0.ipynb:
--------------------------------------------------------------------------------
1 | {
2 | "cells": [
3 | {
4 | "cell_type": "code",
5 | "execution_count": null,
6 | "metadata": {},
7 | "outputs": [],
8 | "source": []
9 | }
10 | ],
11 | "metadata": {
12 | "kernelspec": {
13 | "display_name": "Python 3.7.0 64-bit ('cx-env')",
14 | "language": "python",
15 | "name": "python3"
16 | },
17 | "language_info": {
18 | "name": "python",
19 | "version": "3.7.0"
20 | },
21 | "orig_nbformat": 4,
22 | "vscode": {
23 | "interpreter": {
24 | "hash": "c0c32d8c7acadb7de1d883aa6bcf1588befe44823271dcdb80a8921f92315224"
25 | }
26 | }
27 | },
28 | "nbformat": 4,
29 | "nbformat_minor": 2
30 | }
31 |
--------------------------------------------------------------------------------
/pm/sprints/sprint_3_0/qa_0_0.md:
--------------------------------------------------------------------------------
1 | # Questions And Answers for Sprint (Permanent Record)
2 | ## Summary
3 | These are questions that came up during the exploration of complex systems
4 |
5 | ## Format
6 | **Questions**
7 | - Answers
8 |
9 |
10 |
11 |
--------------------------------------------------------------------------------
/pm/sprints/sprint_3_0/requirements.txt:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/TokenEngineeringCommunity/cadCADStudyGroup/18c937752c3f05f563722252ffd7dc6b110f233d/pm/sprints/sprint_3_0/requirements.txt
--------------------------------------------------------------------------------
/pm/sprints/sprint_3_5/README.md:
--------------------------------------------------------------------------------
1 | TBD : Depends on what we want to achieve as a group for the final small scale system we build
--------------------------------------------------------------------------------
/pm/sprints/sprint_4_0/README.md:
--------------------------------------------------------------------------------
1 | TBD : Depends on what we want to achieve as a group for the final small scale system we build
--------------------------------------------------------------------------------
/projects/bonded_surface/README.md:
--------------------------------------------------------------------------------
1 | ### Bonded Surface Model
2 |
3 | ## Paper
4 | https://ostable.org/bonded-stablecoins.pdf
5 |
6 | ## Installation
7 | ```
8 | git clone https://github.com/TokenEngineeringCommunity/cadCADStudyGroup.git
9 | ```
--------------------------------------------------------------------------------
/projects/bonded_surface/bc.py:
--------------------------------------------------------------------------------
1 | import matplotlib as mpl
2 | import matplotlib.pyplot as plt
3 | import math
4 | import random
5 | import numpy as np
6 | import pandas as pd
7 | from typing import List
8 |
9 | ir: float #initial bootstrapped reserve
10 | mcv: float #mcap vol token
11 | mcs: float #mcap stable token
12 | r: float #reserve asset variable
13 | sv: float # supply of volatile token
14 | ss: float # supply of stable coin
15 | pv: float #price of volatile token
16 | ps: float #price of stable coin
17 | deltaR: float
18 | deltaSV: float
19 | deltaSS: float
20 | deltaPV: float
21 | deltaPS: float
22 | t: float #time state variable
23 | choice: str
24 | timesteps: List[float]
25 |
26 |
27 | def initialize():
28 | global ir, mcv, mcs, r, sv, ss, pv, ps, deltaR, deltaSV, deltaSS, deltaPV, deltaPS, t, timesteps
29 | global rresult, svresult, ssresult, pvresult, psresult, deltaRresult, deltaSVresult, deltaSSresult
30 | global deltaPVresult, deltaPSresult, choice, choiceresult
31 |
32 | ir = 1.0
33 | mcv = 2*ir
34 | mcs= 0.5*ir
35 | ss = mcs
36 | sv = (2*(ss**0.5))**(0.5)
37 | pv = (2*sv)*(ss**(0.5))
38 | ps = (0.5*(sv**2))/(ss**(0.5))
39 | r = (sv**2) * (ss**(0.5))
40 | deltaR = 0
41 | deltaSV = 0
42 | deltaSS = 0
43 | deltaPV = 0
44 | deltaPS = 0
45 | t = 0
46 | choice = 'mintboth'
47 | timesteps = [t]
48 | rresult = [r]
49 | svresult = [sv]
50 | ssresult = [ss]
51 | pvresult = [pv]
52 | psresult = [ps]
53 | deltaRresult = [deltaR]
54 | deltaSVresult = [deltaSV]
55 | deltaSSresult = [deltaSS]
56 | deltaPVresult = [deltaPV]
57 | deltaPSresult = [deltaPS]
58 | choiceresult = [choice]
59 |
60 |
61 | def observe():
62 | global r, sv, ss, pv, ps, t, rresult, svresult, ssresult, pvresult, psresult, deltaR, deltaSV, deltaSS, deltaPV, deltaPS
63 | global deltaRresult, deltaSVresult, deltaSSresult, deltaPVresult, deltaPSresult, timesteps, choice, choiceresult
64 |
65 | timesteps.append(t)
66 | rresult.append(r)
67 | svresult.append(sv)
68 | ssresult.append(ss)
69 | pvresult.append(pv)
70 | psresult.append(ps)
71 | deltaRresult.append(deltaR)
72 | deltaSVresult.append(deltaSV)
73 | deltaSSresult.append(deltaSS)
74 | deltaPVresult.append(deltaPV)
75 | deltaPSresult.append(deltaPS)
76 | choiceresult.append(choice)
77 |
78 |
79 |
80 | def update(randchoice):
81 | global r, sv, ss, pv, ps, t, deltaR, deltaSV, deltaSS, deltaPV, deltaPS, choice
82 |
83 | choice = randchoice
84 |
85 | if randchoice == 'mintboth':
86 | amount = random.uniform(0.1, r)
87 | newr = r + amount
88 | deltaR = newr - r
89 | r = newr
90 | mcx = 2*r
91 | mcy= 0.5*r
92 | newss = mcy
93 | newsv = (2*(newss**0.5))**(0.5)
94 | deltaSV = newsv - sv
95 | deltaSS = newss - ss
96 | sv = newsv
97 | ss = newss
98 | newpv = (2*sv)*(ss**(0.5))
99 | newps = (0.5*(sv**2))/(ss**(0.5))
100 | deltaPV = newpv - pv
101 | deltaPS = newps - ps
102 | pv = newpv
103 | ps = newps
104 | t = t + 1
105 |
106 |
107 | if randchoice == 'sellV':
108 | amount = random.uniform(0.05, sv)
109 | newsv = sv - amount
110 | deltaSV = newsv - sv
111 | ss = ss
112 | deltaSS = 0
113 | newr = (newsv**2) * (ss**(0.5))
114 | deltaR = newr - r
115 | r = newr
116 | newpv = (2*newsv)*(ss**(0.5))
117 | newps = (0.5*(newsv**2))/(ss**(0.5))
118 | deltaPV = newpv - pv
119 | deltaPS = newps - ps
120 | pv = newpv
121 | ps = newps
122 | sv = newsv
123 | t = t + 1
124 |
125 | if randchoice == 'mintV':
126 | amount = random.uniform(0.1, sv)
127 | newsv = sv + amount
128 | ss = ss
129 | deltaSV = newsv - sv
130 | deltaSS = 0
131 | newr = (newsv**2) * (ss**(0.5))
132 | deltaR = newr - r
133 | r = newr
134 | newpv = (2*newsv)*(ss**(0.5))
135 | newps = (0.5*(newsv**2))/(ss**(0.5))
136 | deltaPV = newpv - pv
137 | deltaPS = newps - ps
138 | pv = newpv
139 | ps = newps
140 | sv = newsv
141 | t = t + 1
142 |
143 | if randchoice == 'sellS':
144 | amount = random.uniform(0.1, ss)
145 | newss = ss - amount
146 | deltaSS = newss - ss
147 | sv = sv
148 | deltaSV = 0
149 | newr = (sv**2) * (newss**(0.5))
150 | deltaR = newr - r
151 | r = newr
152 | newpv = (2*sv)*(newss**(0.5))
153 | newps = (0.5*(sv**2))/(newss**(0.5))
154 | deltaPV = newpv - pv
155 | deltaPS = newps - ps
156 | pv = newpv
157 | ps = newps
158 | ss = newss
159 | t = t + 1
160 |
161 | if randchoice == 'mintS':
162 | amount = random.uniform(0.1, ss)
163 | newss = ss + amount
164 | sv = sv
165 | deltaSS = newss - ss
166 | deltaSV = 0
167 | newr = (sv**2) * (newss**(0.5))
168 | deltaR = newr - r
169 | r = newr
170 | newpv = (2*sv)*(newss**(0.5))
171 | newps = (0.5*(sv**2))/(newss**(0.5))
172 | deltaPV = newpv - pv
173 | deltaPS = newps - ps
174 | pv = newpv
175 | ps = newps
176 | ss = newss
177 | t = t + 1
178 |
179 |
180 |
181 |
182 | def runSim():
183 | initialize()
184 | while t < 30:
185 | choices = ['mintV', 'sellV', 'mintboth', 'mintS', 'sellS' ]
186 | randchoice = random.choice(choices)
187 | update(randchoice)
188 | observe()
189 |
190 | reserve = pd.DataFrame(rresult)
191 | vsupply = pd.DataFrame(svresult)
192 | ssupply = pd.DataFrame(ssresult)
193 | vprice = pd.DataFrame(pvresult)
194 | sprice = pd.DataFrame(psresult)
195 | rchange = pd.DataFrame(deltaRresult)
196 | vchange = pd.DataFrame(deltaSVresult)
197 | schange = pd.DataFrame(deltaSSresult)
198 | pvchange = pd.DataFrame(deltaPVresult)
199 | pschange = pd.DataFrame(deltaPSresult)
200 | newchoice = pd.DataFrame(choiceresult)
201 | mergeddf = pd.concat([reserve, vsupply, ssupply, vprice, sprice, rchange, vchange, schange, pvchange, pschange, newchoice], axis = 1)
202 | mergeddf.columns = ['reserve', 'vol token supply', 'stable coin supply', 'vol token price', 'stable coin price', 'change in reserve',
203 | 'change in vol token supply', 'change in stable coin supply', 'change in vol token price', 'change in stable coin price', 'type']
204 |
205 | mergeddf.to_csv('myfile.csv')
206 | return (mergeddf)
207 |
208 |
209 |
210 | def showGraphs():
211 | plt.plot(psresult, 'b-')
212 | #plt.plot(yresult, 'g--')
213 | #plt.plot(xresult, yresult)
214 | #plt.show()
215 |
216 |
217 |
--------------------------------------------------------------------------------
/projects/bonded_surface/bondmath.docx:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/TokenEngineeringCommunity/cadCADStudyGroup/18c937752c3f05f563722252ffd7dc6b110f233d/projects/bonded_surface/bondmath.docx
--------------------------------------------------------------------------------
/projects/bonded_surface/cadcad_fromdisk.ipynb:
--------------------------------------------------------------------------------
1 | {
2 | "cells": [
3 | {
4 | "cell_type": "code",
5 | "execution_count": 57,
6 | "metadata": {},
7 | "outputs": [
8 | {
9 | "data": {
10 | "application/vnd.plotly.v1+json": {
11 | "config": {
12 | "plotlyServerURL": "https://plot.ly"
13 | },
14 | "data": [
15 | {
16 | "hovertemplate": "timestep=%{x}
something=%{y}",
17 | "legendgroup": "",
18 | "line": {
19 | "color": "#636efa",
20 | "dash": "solid"
21 | },
22 | "marker": {
23 | "symbol": "circle"
24 | },
25 | "mode": "lines",
26 | "name": "",
27 | "orientation": "v",
28 | "showlegend": false,
29 | "type": "scatter",
30 | "x": [
31 | 0,
32 | 1,
33 | 2,
34 | 3,
35 | 4,
36 | 5,
37 | 6,
38 | 7,
39 | 8,
40 | 9,
41 | 10,
42 | 11,
43 | 12,
44 | 13,
45 | 14,
46 | 15,
47 | 16,
48 | 17,
49 | 18,
50 | 19,
51 | 20,
52 | 21,
53 | 22,
54 | 23,
55 | 24,
56 | 25,
57 | 26,
58 | 27,
59 | 28,
60 | 29,
61 | 30,
62 | 31,
63 | 32,
64 | 33,
65 | 34,
66 | 35,
67 | 36,
68 | 37,
69 | 38,
70 | 39,
71 | 40,
72 | 41,
73 | 42,
74 | 43,
75 | 44,
76 | 45,
77 | 46,
78 | 47,
79 | 48,
80 | 49,
81 | 50,
82 | 51,
83 | 52,
84 | 53,
85 | 54,
86 | 55,
87 | 56,
88 | 57,
89 | 58,
90 | 59,
91 | 60,
92 | 61,
93 | 62,
94 | 63,
95 | 64,
96 | 65,
97 | 66,
98 | 67,
99 | 68,
100 | 69,
101 | 70,
102 | 71,
103 | 72,
104 | 73,
105 | 74,
106 | 75,
107 | 76,
108 | 77,
109 | 78,
110 | 79,
111 | 80,
112 | 81,
113 | 82,
114 | 83,
115 | 84,
116 | 85,
117 | 86,
118 | 87,
119 | 88,
120 | 89,
121 | 90,
122 | 91,
123 | 92,
124 | 93,
125 | 94,
126 | 95,
127 | 96,
128 | 97,
129 | 98,
130 | 99,
131 | 100
132 | ],
133 | "xaxis": "x",
134 | "y": [
135 | 0,
136 | -1.281525976328849,
137 | -0.19186994400779536,
138 | -0.5003996942094778,
139 | -1.3728492755688495,
140 | 0.38562349377405897,
141 | -1.7939221599022444,
142 | -0.41409766368355105,
143 | -1.06024898097683,
144 | 0.3655055322243477,
145 | 0.5489969298743425,
146 | -0.09760246970286793,
147 | -2.0876775998846506,
148 | 0.5661268592310115,
149 | 0.6598826123419672,
150 | -3.2870653151851195,
151 | -0.8991131538172937,
152 | 0.06537412902839755,
153 | 0.603758107813152,
154 | -1.2150593759778647,
155 | -0.1220782601057612,
156 | 1.2549730569035786,
157 | 0.9191383464827501,
158 | 0.3040868649031299,
159 | 0.7143699659913623,
160 | 2.680765804761444,
161 | -0.04513946587887434,
162 | -0.7925030503116257,
163 | -1.6934148109887384,
164 | 0.11884197587187038,
165 | 0.9243791713480185,
166 | -0.43855036561300564,
167 | -1.3589951679318972,
168 | -0.34041397341878993,
169 | 1.0175266488523595,
170 | 0.09921314579015487,
171 | 0.4213721253684667,
172 | -1.1114273898814415,
173 | 1.6289345858747795,
174 | 0.595252268242531,
175 | 1.956415828092029,
176 | -0.9248658810357493,
177 | 0.7241030859571913,
178 | 2.44132155383484,
179 | 1.208171136973227,
180 | 1.3809177748816124,
181 | 0.9807107180070346,
182 | 0.32858073567951446,
183 | 0.8511363247042386,
184 | -0.9091611859937367,
185 | 0.07930018715622643,
186 | -1.172702280667136,
187 | 0.20859957021268474,
188 | -0.3079714678851848,
189 | 0.17872258832467608,
190 | 1.5288562348132144,
191 | 0.9204835167623985,
192 | -0.9360413300623627,
193 | 0.46652898098695506,
194 | 0.4369136179035,
195 | 0.4494642467298014,
196 | 1.6891134728161787,
197 | 0.8807089711245498,
198 | 0.2405849853333266,
199 | -0.2692722391540247,
200 | 0.7141403148443796,
201 | -0.708438574807384,
202 | 0.1947766691517193,
203 | -1.1019416161663085,
204 | 1.15638152875276,
205 | 0.3133831505577661,
206 | -1.9601147633877891,
207 | 0.6717748812095953,
208 | 1.0264317443436766,
209 | 0.24529633977787654,
210 | -1.4639450302752934,
211 | 0.4022368481716754,
212 | 1.446328453422057,
213 | -1.0447797357886914,
214 | -1.365682961822003,
215 | 0.032045503016646736,
216 | -0.7275828788097094,
217 | -0.7751986267579769,
218 | -0.29671117877151393,
219 | -2.016939120951739,
220 | 1.7171635082591281,
221 | -1.1503198261190755,
222 | 0.5288698531523238,
223 | 0.6662922460658215,
224 | 0.30441386191198294,
225 | -1.9574764618245928,
226 | 0.2721967348636761,
227 | 0.5612845139746474,
228 | 0.7013532263214873,
229 | -0.12880404438925755,
230 | 1.0227674750157478,
231 | 0.2452542822007089,
232 | 0.29018150253518155,
233 | 1.0224443145609523,
234 | -0.03480885690401747,
235 | 0.14122892808579385
236 | ],
237 | "yaxis": "y"
238 | }
239 | ],
240 | "layout": {
241 | "height": 800,
242 | "legend": {
243 | "tracegroupgap": 0
244 | },
245 | "margin": {
246 | "t": 60
247 | },
248 | "template": {
249 | "data": {
250 | "bar": [
251 | {
252 | "error_x": {
253 | "color": "#2a3f5f"
254 | },
255 | "error_y": {
256 | "color": "#2a3f5f"
257 | },
258 | "marker": {
259 | "line": {
260 | "color": "#E5ECF6",
261 | "width": 0.5
262 | },
263 | "pattern": {
264 | "fillmode": "overlay",
265 | "size": 10,
266 | "solidity": 0.2
267 | }
268 | },
269 | "type": "bar"
270 | }
271 | ],
272 | "barpolar": [
273 | {
274 | "marker": {
275 | "line": {
276 | "color": "#E5ECF6",
277 | "width": 0.5
278 | },
279 | "pattern": {
280 | "fillmode": "overlay",
281 | "size": 10,
282 | "solidity": 0.2
283 | }
284 | },
285 | "type": "barpolar"
286 | }
287 | ],
288 | "carpet": [
289 | {
290 | "aaxis": {
291 | "endlinecolor": "#2a3f5f",
292 | "gridcolor": "white",
293 | "linecolor": "white",
294 | "minorgridcolor": "white",
295 | "startlinecolor": "#2a3f5f"
296 | },
297 | "baxis": {
298 | "endlinecolor": "#2a3f5f",
299 | "gridcolor": "white",
300 | "linecolor": "white",
301 | "minorgridcolor": "white",
302 | "startlinecolor": "#2a3f5f"
303 | },
304 | "type": "carpet"
305 | }
306 | ],
307 | "choropleth": [
308 | {
309 | "colorbar": {
310 | "outlinewidth": 0,
311 | "ticks": ""
312 | },
313 | "type": "choropleth"
314 | }
315 | ],
316 | "contour": [
317 | {
318 | "colorbar": {
319 | "outlinewidth": 0,
320 | "ticks": ""
321 | },
322 | "colorscale": [
323 | [
324 | 0,
325 | "#0d0887"
326 | ],
327 | [
328 | 0.1111111111111111,
329 | "#46039f"
330 | ],
331 | [
332 | 0.2222222222222222,
333 | "#7201a8"
334 | ],
335 | [
336 | 0.3333333333333333,
337 | "#9c179e"
338 | ],
339 | [
340 | 0.4444444444444444,
341 | "#bd3786"
342 | ],
343 | [
344 | 0.5555555555555556,
345 | "#d8576b"
346 | ],
347 | [
348 | 0.6666666666666666,
349 | "#ed7953"
350 | ],
351 | [
352 | 0.7777777777777778,
353 | "#fb9f3a"
354 | ],
355 | [
356 | 0.8888888888888888,
357 | "#fdca26"
358 | ],
359 | [
360 | 1,
361 | "#f0f921"
362 | ]
363 | ],
364 | "type": "contour"
365 | }
366 | ],
367 | "contourcarpet": [
368 | {
369 | "colorbar": {
370 | "outlinewidth": 0,
371 | "ticks": ""
372 | },
373 | "type": "contourcarpet"
374 | }
375 | ],
376 | "heatmap": [
377 | {
378 | "colorbar": {
379 | "outlinewidth": 0,
380 | "ticks": ""
381 | },
382 | "colorscale": [
383 | [
384 | 0,
385 | "#0d0887"
386 | ],
387 | [
388 | 0.1111111111111111,
389 | "#46039f"
390 | ],
391 | [
392 | 0.2222222222222222,
393 | "#7201a8"
394 | ],
395 | [
396 | 0.3333333333333333,
397 | "#9c179e"
398 | ],
399 | [
400 | 0.4444444444444444,
401 | "#bd3786"
402 | ],
403 | [
404 | 0.5555555555555556,
405 | "#d8576b"
406 | ],
407 | [
408 | 0.6666666666666666,
409 | "#ed7953"
410 | ],
411 | [
412 | 0.7777777777777778,
413 | "#fb9f3a"
414 | ],
415 | [
416 | 0.8888888888888888,
417 | "#fdca26"
418 | ],
419 | [
420 | 1,
421 | "#f0f921"
422 | ]
423 | ],
424 | "type": "heatmap"
425 | }
426 | ],
427 | "heatmapgl": [
428 | {
429 | "colorbar": {
430 | "outlinewidth": 0,
431 | "ticks": ""
432 | },
433 | "colorscale": [
434 | [
435 | 0,
436 | "#0d0887"
437 | ],
438 | [
439 | 0.1111111111111111,
440 | "#46039f"
441 | ],
442 | [
443 | 0.2222222222222222,
444 | "#7201a8"
445 | ],
446 | [
447 | 0.3333333333333333,
448 | "#9c179e"
449 | ],
450 | [
451 | 0.4444444444444444,
452 | "#bd3786"
453 | ],
454 | [
455 | 0.5555555555555556,
456 | "#d8576b"
457 | ],
458 | [
459 | 0.6666666666666666,
460 | "#ed7953"
461 | ],
462 | [
463 | 0.7777777777777778,
464 | "#fb9f3a"
465 | ],
466 | [
467 | 0.8888888888888888,
468 | "#fdca26"
469 | ],
470 | [
471 | 1,
472 | "#f0f921"
473 | ]
474 | ],
475 | "type": "heatmapgl"
476 | }
477 | ],
478 | "histogram": [
479 | {
480 | "marker": {
481 | "pattern": {
482 | "fillmode": "overlay",
483 | "size": 10,
484 | "solidity": 0.2
485 | }
486 | },
487 | "type": "histogram"
488 | }
489 | ],
490 | "histogram2d": [
491 | {
492 | "colorbar": {
493 | "outlinewidth": 0,
494 | "ticks": ""
495 | },
496 | "colorscale": [
497 | [
498 | 0,
499 | "#0d0887"
500 | ],
501 | [
502 | 0.1111111111111111,
503 | "#46039f"
504 | ],
505 | [
506 | 0.2222222222222222,
507 | "#7201a8"
508 | ],
509 | [
510 | 0.3333333333333333,
511 | "#9c179e"
512 | ],
513 | [
514 | 0.4444444444444444,
515 | "#bd3786"
516 | ],
517 | [
518 | 0.5555555555555556,
519 | "#d8576b"
520 | ],
521 | [
522 | 0.6666666666666666,
523 | "#ed7953"
524 | ],
525 | [
526 | 0.7777777777777778,
527 | "#fb9f3a"
528 | ],
529 | [
530 | 0.8888888888888888,
531 | "#fdca26"
532 | ],
533 | [
534 | 1,
535 | "#f0f921"
536 | ]
537 | ],
538 | "type": "histogram2d"
539 | }
540 | ],
541 | "histogram2dcontour": [
542 | {
543 | "colorbar": {
544 | "outlinewidth": 0,
545 | "ticks": ""
546 | },
547 | "colorscale": [
548 | [
549 | 0,
550 | "#0d0887"
551 | ],
552 | [
553 | 0.1111111111111111,
554 | "#46039f"
555 | ],
556 | [
557 | 0.2222222222222222,
558 | "#7201a8"
559 | ],
560 | [
561 | 0.3333333333333333,
562 | "#9c179e"
563 | ],
564 | [
565 | 0.4444444444444444,
566 | "#bd3786"
567 | ],
568 | [
569 | 0.5555555555555556,
570 | "#d8576b"
571 | ],
572 | [
573 | 0.6666666666666666,
574 | "#ed7953"
575 | ],
576 | [
577 | 0.7777777777777778,
578 | "#fb9f3a"
579 | ],
580 | [
581 | 0.8888888888888888,
582 | "#fdca26"
583 | ],
584 | [
585 | 1,
586 | "#f0f921"
587 | ]
588 | ],
589 | "type": "histogram2dcontour"
590 | }
591 | ],
592 | "mesh3d": [
593 | {
594 | "colorbar": {
595 | "outlinewidth": 0,
596 | "ticks": ""
597 | },
598 | "type": "mesh3d"
599 | }
600 | ],
601 | "parcoords": [
602 | {
603 | "line": {
604 | "colorbar": {
605 | "outlinewidth": 0,
606 | "ticks": ""
607 | }
608 | },
609 | "type": "parcoords"
610 | }
611 | ],
612 | "pie": [
613 | {
614 | "automargin": true,
615 | "type": "pie"
616 | }
617 | ],
618 | "scatter": [
619 | {
620 | "fillpattern": {
621 | "fillmode": "overlay",
622 | "size": 10,
623 | "solidity": 0.2
624 | },
625 | "type": "scatter"
626 | }
627 | ],
628 | "scatter3d": [
629 | {
630 | "line": {
631 | "colorbar": {
632 | "outlinewidth": 0,
633 | "ticks": ""
634 | }
635 | },
636 | "marker": {
637 | "colorbar": {
638 | "outlinewidth": 0,
639 | "ticks": ""
640 | }
641 | },
642 | "type": "scatter3d"
643 | }
644 | ],
645 | "scattercarpet": [
646 | {
647 | "marker": {
648 | "colorbar": {
649 | "outlinewidth": 0,
650 | "ticks": ""
651 | }
652 | },
653 | "type": "scattercarpet"
654 | }
655 | ],
656 | "scattergeo": [
657 | {
658 | "marker": {
659 | "colorbar": {
660 | "outlinewidth": 0,
661 | "ticks": ""
662 | }
663 | },
664 | "type": "scattergeo"
665 | }
666 | ],
667 | "scattergl": [
668 | {
669 | "marker": {
670 | "colorbar": {
671 | "outlinewidth": 0,
672 | "ticks": ""
673 | }
674 | },
675 | "type": "scattergl"
676 | }
677 | ],
678 | "scattermapbox": [
679 | {
680 | "marker": {
681 | "colorbar": {
682 | "outlinewidth": 0,
683 | "ticks": ""
684 | }
685 | },
686 | "type": "scattermapbox"
687 | }
688 | ],
689 | "scatterpolar": [
690 | {
691 | "marker": {
692 | "colorbar": {
693 | "outlinewidth": 0,
694 | "ticks": ""
695 | }
696 | },
697 | "type": "scatterpolar"
698 | }
699 | ],
700 | "scatterpolargl": [
701 | {
702 | "marker": {
703 | "colorbar": {
704 | "outlinewidth": 0,
705 | "ticks": ""
706 | }
707 | },
708 | "type": "scatterpolargl"
709 | }
710 | ],
711 | "scatterternary": [
712 | {
713 | "marker": {
714 | "colorbar": {
715 | "outlinewidth": 0,
716 | "ticks": ""
717 | }
718 | },
719 | "type": "scatterternary"
720 | }
721 | ],
722 | "surface": [
723 | {
724 | "colorbar": {
725 | "outlinewidth": 0,
726 | "ticks": ""
727 | },
728 | "colorscale": [
729 | [
730 | 0,
731 | "#0d0887"
732 | ],
733 | [
734 | 0.1111111111111111,
735 | "#46039f"
736 | ],
737 | [
738 | 0.2222222222222222,
739 | "#7201a8"
740 | ],
741 | [
742 | 0.3333333333333333,
743 | "#9c179e"
744 | ],
745 | [
746 | 0.4444444444444444,
747 | "#bd3786"
748 | ],
749 | [
750 | 0.5555555555555556,
751 | "#d8576b"
752 | ],
753 | [
754 | 0.6666666666666666,
755 | "#ed7953"
756 | ],
757 | [
758 | 0.7777777777777778,
759 | "#fb9f3a"
760 | ],
761 | [
762 | 0.8888888888888888,
763 | "#fdca26"
764 | ],
765 | [
766 | 1,
767 | "#f0f921"
768 | ]
769 | ],
770 | "type": "surface"
771 | }
772 | ],
773 | "table": [
774 | {
775 | "cells": {
776 | "fill": {
777 | "color": "#EBF0F8"
778 | },
779 | "line": {
780 | "color": "white"
781 | }
782 | },
783 | "header": {
784 | "fill": {
785 | "color": "#C8D4E3"
786 | },
787 | "line": {
788 | "color": "white"
789 | }
790 | },
791 | "type": "table"
792 | }
793 | ]
794 | },
795 | "layout": {
796 | "annotationdefaults": {
797 | "arrowcolor": "#2a3f5f",
798 | "arrowhead": 0,
799 | "arrowwidth": 1
800 | },
801 | "autotypenumbers": "strict",
802 | "coloraxis": {
803 | "colorbar": {
804 | "outlinewidth": 0,
805 | "ticks": ""
806 | }
807 | },
808 | "colorscale": {
809 | "diverging": [
810 | [
811 | 0,
812 | "#8e0152"
813 | ],
814 | [
815 | 0.1,
816 | "#c51b7d"
817 | ],
818 | [
819 | 0.2,
820 | "#de77ae"
821 | ],
822 | [
823 | 0.3,
824 | "#f1b6da"
825 | ],
826 | [
827 | 0.4,
828 | "#fde0ef"
829 | ],
830 | [
831 | 0.5,
832 | "#f7f7f7"
833 | ],
834 | [
835 | 0.6,
836 | "#e6f5d0"
837 | ],
838 | [
839 | 0.7,
840 | "#b8e186"
841 | ],
842 | [
843 | 0.8,
844 | "#7fbc41"
845 | ],
846 | [
847 | 0.9,
848 | "#4d9221"
849 | ],
850 | [
851 | 1,
852 | "#276419"
853 | ]
854 | ],
855 | "sequential": [
856 | [
857 | 0,
858 | "#0d0887"
859 | ],
860 | [
861 | 0.1111111111111111,
862 | "#46039f"
863 | ],
864 | [
865 | 0.2222222222222222,
866 | "#7201a8"
867 | ],
868 | [
869 | 0.3333333333333333,
870 | "#9c179e"
871 | ],
872 | [
873 | 0.4444444444444444,
874 | "#bd3786"
875 | ],
876 | [
877 | 0.5555555555555556,
878 | "#d8576b"
879 | ],
880 | [
881 | 0.6666666666666666,
882 | "#ed7953"
883 | ],
884 | [
885 | 0.7777777777777778,
886 | "#fb9f3a"
887 | ],
888 | [
889 | 0.8888888888888888,
890 | "#fdca26"
891 | ],
892 | [
893 | 1,
894 | "#f0f921"
895 | ]
896 | ],
897 | "sequentialminus": [
898 | [
899 | 0,
900 | "#0d0887"
901 | ],
902 | [
903 | 0.1111111111111111,
904 | "#46039f"
905 | ],
906 | [
907 | 0.2222222222222222,
908 | "#7201a8"
909 | ],
910 | [
911 | 0.3333333333333333,
912 | "#9c179e"
913 | ],
914 | [
915 | 0.4444444444444444,
916 | "#bd3786"
917 | ],
918 | [
919 | 0.5555555555555556,
920 | "#d8576b"
921 | ],
922 | [
923 | 0.6666666666666666,
924 | "#ed7953"
925 | ],
926 | [
927 | 0.7777777777777778,
928 | "#fb9f3a"
929 | ],
930 | [
931 | 0.8888888888888888,
932 | "#fdca26"
933 | ],
934 | [
935 | 1,
936 | "#f0f921"
937 | ]
938 | ]
939 | },
940 | "colorway": [
941 | "#636efa",
942 | "#EF553B",
943 | "#00cc96",
944 | "#ab63fa",
945 | "#FFA15A",
946 | "#19d3f3",
947 | "#FF6692",
948 | "#B6E880",
949 | "#FF97FF",
950 | "#FECB52"
951 | ],
952 | "font": {
953 | "color": "#2a3f5f"
954 | },
955 | "geo": {
956 | "bgcolor": "white",
957 | "lakecolor": "white",
958 | "landcolor": "#E5ECF6",
959 | "showlakes": true,
960 | "showland": true,
961 | "subunitcolor": "white"
962 | },
963 | "hoverlabel": {
964 | "align": "left"
965 | },
966 | "hovermode": "closest",
967 | "mapbox": {
968 | "style": "light"
969 | },
970 | "paper_bgcolor": "white",
971 | "plot_bgcolor": "#E5ECF6",
972 | "polar": {
973 | "angularaxis": {
974 | "gridcolor": "white",
975 | "linecolor": "white",
976 | "ticks": ""
977 | },
978 | "bgcolor": "#E5ECF6",
979 | "radialaxis": {
980 | "gridcolor": "white",
981 | "linecolor": "white",
982 | "ticks": ""
983 | }
984 | },
985 | "scene": {
986 | "xaxis": {
987 | "backgroundcolor": "#E5ECF6",
988 | "gridcolor": "white",
989 | "gridwidth": 2,
990 | "linecolor": "white",
991 | "showbackground": true,
992 | "ticks": "",
993 | "zerolinecolor": "white"
994 | },
995 | "yaxis": {
996 | "backgroundcolor": "#E5ECF6",
997 | "gridcolor": "white",
998 | "gridwidth": 2,
999 | "linecolor": "white",
1000 | "showbackground": true,
1001 | "ticks": "",
1002 | "zerolinecolor": "white"
1003 | },
1004 | "zaxis": {
1005 | "backgroundcolor": "#E5ECF6",
1006 | "gridcolor": "white",
1007 | "gridwidth": 2,
1008 | "linecolor": "white",
1009 | "showbackground": true,
1010 | "ticks": "",
1011 | "zerolinecolor": "white"
1012 | }
1013 | },
1014 | "shapedefaults": {
1015 | "line": {
1016 | "color": "#2a3f5f"
1017 | }
1018 | },
1019 | "ternary": {
1020 | "aaxis": {
1021 | "gridcolor": "white",
1022 | "linecolor": "white",
1023 | "ticks": ""
1024 | },
1025 | "baxis": {
1026 | "gridcolor": "white",
1027 | "linecolor": "white",
1028 | "ticks": ""
1029 | },
1030 | "bgcolor": "#E5ECF6",
1031 | "caxis": {
1032 | "gridcolor": "white",
1033 | "linecolor": "white",
1034 | "ticks": ""
1035 | }
1036 | },
1037 | "title": {
1038 | "x": 0.05
1039 | },
1040 | "xaxis": {
1041 | "automargin": true,
1042 | "gridcolor": "white",
1043 | "linecolor": "white",
1044 | "ticks": "",
1045 | "title": {
1046 | "standoff": 15
1047 | },
1048 | "zerolinecolor": "white",
1049 | "zerolinewidth": 2
1050 | },
1051 | "yaxis": {
1052 | "automargin": true,
1053 | "gridcolor": "white",
1054 | "linecolor": "white",
1055 | "ticks": "",
1056 | "title": {
1057 | "standoff": 15
1058 | },
1059 | "zerolinecolor": "white",
1060 | "zerolinewidth": 2
1061 | }
1062 | }
1063 | },
1064 | "xaxis": {
1065 | "anchor": "y",
1066 | "domain": [
1067 | 0,
1068 | 1
1069 | ],
1070 | "title": {
1071 | "text": "timestep"
1072 | }
1073 | },
1074 | "yaxis": {
1075 | "anchor": "x",
1076 | "domain": [
1077 | 0,
1078 | 1
1079 | ],
1080 | "title": {
1081 | "text": "something"
1082 | }
1083 | }
1084 | }
1085 | }
1086 | },
1087 | "metadata": {},
1088 | "output_type": "display_data"
1089 | }
1090 | ],
1091 | "source": [
1092 | "import sys\n",
1093 | "import pandas as pd\n",
1094 | "import numpy as np\n",
1095 | "import os\n",
1096 | "import plotly.express as px\n",
1097 | "import matplotlib.pyplot as plt\n",
1098 | "\n",
1099 | "# Read latest results from our serialized run\n",
1100 | "file = sorted(f for f in os.listdir('data/simulations'))[-1]\n",
1101 | "data_path = f\"data/simulations/{file}\"\n",
1102 | "raw_df = pd.read_pickle(data_path, compression='gzip')\n",
1103 | "\n",
1104 | "# interpet our run\n",
1105 | "df = raw_df.set_index('timestep')\n",
1106 | "fig = px.line(raw_df,\n",
1107 | " x='timestep',\n",
1108 | " y='something',\n",
1109 | " height=800)\n",
1110 | "fig.show()"
1111 | ]
1112 | },
1113 | {
1114 | "cell_type": "code",
1115 | "execution_count": 56,
1116 | "metadata": {},
1117 | "outputs": [
1118 | {
1119 | "data": {
1120 | "text/plain": [
1121 | "[]"
1122 | ]
1123 | },
1124 | "execution_count": 56,
1125 | "metadata": {},
1126 | "output_type": "execute_result"
1127 | },
1128 | {
1129 | "data": {
1130 | "image/png": "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",
1131 | "text/plain": [
1132 | ""
1133 | ]
1134 | },
1135 | "metadata": {
1136 | "needs_background": "light"
1137 | },
1138 | "output_type": "display_data"
1139 | }
1140 | ],
1141 | "source": [
1142 | "\n",
1143 | "plt.plot(raw_df.set_index('timestep')['something'])"
1144 | ]
1145 | }
1146 | ],
1147 | "metadata": {
1148 | "kernelspec": {
1149 | "display_name": "Python 3.10.0 ('venv': venv)",
1150 | "language": "python",
1151 | "name": "python3"
1152 | },
1153 | "language_info": {
1154 | "name": "python",
1155 | "version": "3.10.0"
1156 | },
1157 | "orig_nbformat": 4,
1158 | "vscode": {
1159 | "interpreter": {
1160 | "hash": "84403094e7879e50c63390ec8c9b7307013f744daffbace070f7164257cc56ca"
1161 | }
1162 | }
1163 | },
1164 | "nbformat": 4,
1165 | "nbformat_minor": 2
1166 | }
1167 |
--------------------------------------------------------------------------------
/projects/bonded_surface/cadcad_live.ipynb:
--------------------------------------------------------------------------------
1 | {
2 | "cells": [
3 | {
4 | "cell_type": "code",
5 | "execution_count": 1,
6 | "metadata": {},
7 | "outputs": [
8 | {
9 | "ename": "ImportError",
10 | "evalue": "cannot import name 'append_configs' from 'cadCAD.configuration' (/Users/zcstarr/src/intro_complex_systems/cadCADStudyGroup/venv/lib/python3.10/site-packages/cadCAD/configuration/__init__.py)",
11 | "output_type": "error",
12 | "traceback": [
13 | "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
14 | "\u001b[0;31mImportError\u001b[0m Traceback (most recent call last)",
15 | "\u001b[1;32m/Users/zcstarr/src/intro_complex_systems/cadCADStudyGroup/projects/bonded_surface/cadcad_live.ipynb Cell 1\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 1\u001b[0m get_ipython()\u001b[39m.\u001b[39mrun_line_magic(\u001b[39m'\u001b[39m\u001b[39mload_ext\u001b[39m\u001b[39m'\u001b[39m, \u001b[39m'\u001b[39m\u001b[39mautoreload\u001b[39m\u001b[39m'\u001b[39m)\n\u001b[1;32m 2\u001b[0m get_ipython()\u001b[39m.\u001b[39mrun_line_magic(\u001b[39m'\u001b[39m\u001b[39mautoreload\u001b[39m\u001b[39m'\u001b[39m, \u001b[39m'\u001b[39m\u001b[39m2\u001b[39m\u001b[39m'\u001b[39m)\n\u001b[0;32m----> 3\u001b[0m \u001b[39mfrom\u001b[39;00m \u001b[39mmodel\u001b[39;00m\u001b[39m.\u001b[39;00m\u001b[39mexecution\u001b[39;00m \u001b[39mimport\u001b[39;00m execute_experiment\n\u001b[1;32m 4\u001b[0m \u001b[39mimport\u001b[39;00m \u001b[39mos\u001b[39;00m\n\u001b[1;32m 5\u001b[0m \u001b[39mimport\u001b[39;00m \u001b[39mplotly\u001b[39;00m\u001b[39m.\u001b[39;00m\u001b[39mexpress\u001b[39;00m \u001b[39mas\u001b[39;00m \u001b[39mpx\u001b[39;00m\n",
16 | "File \u001b[0;32m~/src/intro_complex_systems/cadCADStudyGroup/projects/bonded_surface/model/execution.py:3\u001b[0m, in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[39mfrom\u001b[39;00m \u001b[39mcadCAD\u001b[39;00m\u001b[39m.\u001b[39;00m\u001b[39mconfiguration\u001b[39;00m \u001b[39mimport\u001b[39;00m Configuration\n\u001b[1;32m 2\u001b[0m \u001b[39mfrom\u001b[39;00m \u001b[39mcadCAD\u001b[39;00m\u001b[39m.\u001b[39;00m\u001b[39mengine\u001b[39;00m \u001b[39mimport\u001b[39;00m ExecutionMode, ExecutionContext, Executor\n\u001b[0;32m----> 3\u001b[0m \u001b[39mfrom\u001b[39;00m \u001b[39mmodel\u001b[39;00m\u001b[39m.\u001b[39;00m\u001b[39mexperiment\u001b[39;00m \u001b[39mimport\u001b[39;00m exp\n\u001b[1;32m 4\u001b[0m \u001b[39mimport\u001b[39;00m \u001b[39mpandas\u001b[39;00m \u001b[39mas\u001b[39;00m \u001b[39mpd\u001b[39;00m\n\u001b[1;32m 7\u001b[0m \u001b[39mdef\u001b[39;00m \u001b[39mexecute_experiment\u001b[39m():\n",
17 | "File \u001b[0;32m~/src/intro_complex_systems/cadCADStudyGroup/projects/bonded_surface/model/experiment.py:3\u001b[0m, in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[39mfrom\u001b[39;00m \u001b[39mcadCAD\u001b[39;00m\u001b[39m.\u001b[39;00m\u001b[39mconfiguration\u001b[39;00m \u001b[39mimport\u001b[39;00m Experiment\n\u001b[1;32m 2\u001b[0m \u001b[39mfrom\u001b[39;00m \u001b[39mcadCAD\u001b[39;00m\u001b[39m.\u001b[39;00m\u001b[39mconfiguration\u001b[39;00m\u001b[39m.\u001b[39;00m\u001b[39mutils\u001b[39;00m \u001b[39mimport\u001b[39;00m config_sim\n\u001b[0;32m----> 3\u001b[0m \u001b[39mfrom\u001b[39;00m \u001b[39mmodel\u001b[39;00m\u001b[39m.\u001b[39;00m\u001b[39mparams\u001b[39;00m \u001b[39mimport\u001b[39;00m SIM_CONFIG, GENESIS_STATES\n\u001b[1;32m 4\u001b[0m \u001b[39mfrom\u001b[39;00m \u001b[39mprojects\u001b[39;00m\u001b[39m.\u001b[39;00m\u001b[39mbonded_surface\u001b[39;00m\u001b[39m.\u001b[39;00m\u001b[39mmodel\u001b[39;00m\u001b[39m.\u001b[39;00m\u001b[39mstructure\u001b[39;00m \u001b[39mimport\u001b[39;00m PARTIAL_STATE_UPDATE_BLOCKS\n\u001b[1;32m 6\u001b[0m \u001b[39mimport\u001b[39;00m \u001b[39mpandas\u001b[39;00m \u001b[39mas\u001b[39;00m \u001b[39mpd\u001b[39;00m\n",
18 | "File \u001b[0;32m~/src/intro_complex_systems/cadCADStudyGroup/projects/bonded_surface/model/params.py:1\u001b[0m, in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[0;32m----> 1\u001b[0m \u001b[39mfrom\u001b[39;00m \u001b[39mcadCAD\u001b[39;00m\u001b[39m.\u001b[39;00m\u001b[39mconfiguration\u001b[39;00m \u001b[39mimport\u001b[39;00m append_configs\n\u001b[1;32m 2\u001b[0m \u001b[39mfrom\u001b[39;00m \u001b[39mcadCAD\u001b[39;00m\u001b[39m.\u001b[39;00m\u001b[39mconfiguration\u001b[39;00m\u001b[39m.\u001b[39;00m\u001b[39mutils\u001b[39;00m \u001b[39mimport\u001b[39;00m proc_trigger, bound_norm_random, ep_time_step, config_sim\n\u001b[1;32m 3\u001b[0m \u001b[39mimport\u001b[39;00m \u001b[39mmodel\u001b[39;00m\u001b[39m.\u001b[39;00m\u001b[39mtypes\u001b[39;00m \u001b[39mas\u001b[39;00m \u001b[39mtypes\u001b[39;00m \n",
19 | "\u001b[0;31mImportError\u001b[0m: cannot import name 'append_configs' from 'cadCAD.configuration' (/Users/zcstarr/src/intro_complex_systems/cadCADStudyGroup/venv/lib/python3.10/site-packages/cadCAD/configuration/__init__.py)"
20 | ]
21 | }
22 | ],
23 | "source": [
24 | "%load_ext autoreload\n",
25 | "%autoreload 2\n",
26 | "from model.execution import execute_experiment\n",
27 | "import os\n",
28 | "import plotly.express as px\n",
29 | "import pandas as pd\n",
30 | "import numpy as np\n",
31 | "\n",
32 | "\n",
33 | "raw_df = execute_experiment()"
34 | ]
35 | },
36 | {
37 | "cell_type": "code",
38 | "execution_count": null,
39 | "metadata": {},
40 | "outputs": [],
41 | "source": [
42 | "\n",
43 | "# interpet our run\n",
44 | "df = raw_df.set_index('timestep')\n",
45 | "fig = px.line(raw_df,\n",
46 | " x='timestep',\n",
47 | " y='something',\n",
48 | " height=800)\n",
49 | "fig.show()"
50 | ]
51 | }
52 | ],
53 | "metadata": {
54 | "kernelspec": {
55 | "display_name": "Python 3.10.0 ('venv': venv)",
56 | "language": "python",
57 | "name": "python3"
58 | },
59 | "language_info": {
60 | "codemirror_mode": {
61 | "name": "ipython",
62 | "version": 3
63 | },
64 | "file_extension": ".py",
65 | "mimetype": "text/x-python",
66 | "name": "python",
67 | "nbconvert_exporter": "python",
68 | "pygments_lexer": "ipython3",
69 | "version": "3.10.0"
70 | },
71 | "orig_nbformat": 4,
72 | "vscode": {
73 | "interpreter": {
74 | "hash": "84403094e7879e50c63390ec8c9b7307013f744daffbace070f7164257cc56ca"
75 | }
76 | }
77 | },
78 | "nbformat": 4,
79 | "nbformat_minor": 2
80 | }
81 |
--------------------------------------------------------------------------------
/projects/bonded_surface/model/__init__.py:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/TokenEngineeringCommunity/cadCADStudyGroup/18c937752c3f05f563722252ffd7dc6b110f233d/projects/bonded_surface/model/__init__.py
--------------------------------------------------------------------------------
/projects/bonded_surface/model/__main__.py:
--------------------------------------------------------------------------------
1 | from datetime import datetime
2 | import click
3 | from model.execution import execute_experiment
4 |
5 |
6 |
7 | @click.command()
8 | def main() -> None:
9 | timestamp = datetime.now().strftime("%Y-%m-%d_%H-%M-%S")
10 | df = execute_experiment()
11 | df.to_pickle(
12 | f"data/simulations/single-run-{timestamp}.pkl.gz", compression="gzip")
13 |
14 | if __name__ == "__main__":
15 | main()
--------------------------------------------------------------------------------
/projects/bonded_surface/model/execution.py:
--------------------------------------------------------------------------------
1 | from cadCAD.configuration import Configuration
2 | from cadCAD.engine import ExecutionMode, ExecutionContext, Executor
3 | from model.experiment import exp
4 | import pandas as pd
5 |
6 |
7 | def execute_experiment():
8 | exec_mode = ExecutionMode()
9 | local_mode_ctx = ExecutionContext(context=exec_mode.local_mode)
10 |
11 | simulation = Executor(exec_context=local_mode_ctx,
12 | configs=exp.configs)
13 | raw_system_events, tensor_field, sessions = simulation.execute()
14 | return pd.DataFrame(raw_system_events)
15 |
16 |
--------------------------------------------------------------------------------
/projects/bonded_surface/model/experiment.py:
--------------------------------------------------------------------------------
1 | from cadCAD.configuration import Experiment
2 | from cadCAD.configuration.utils import config_sim
3 | from model.params import SIM_CONFIG, GENESIS_STATES
4 | from model.structure import PARTIAL_STATE_UPDATE_BLOCKS
5 |
6 | import pandas as pd
7 | import numpy as np
8 |
9 |
10 | exp = Experiment()
11 |
12 | sim_params = config_sim(SIM_CONFIG)
13 | exp.append_configs(
14 | sim_configs=sim_params,
15 | initial_state=GENESIS_STATES,
16 | partial_state_update_blocks= PARTIAL_STATE_UPDATE_BLOCKS
17 | )
--------------------------------------------------------------------------------
/projects/bonded_surface/model/params.py:
--------------------------------------------------------------------------------
1 | import model.types as types
2 | import numpy as np
3 | from decimal import Decimal
4 | from datetime import timedelta
5 |
6 | MONTE_CARLO_RUNS = 1
7 | DAYS_PER_TIMESTEP = 30
8 | SIMULATION_TIMESTEPS = 100
9 | DAYS_PER_TIMESTEP = 30
10 | YEAR = 365.25
11 | SIMULATION_TIME_IN_YEARS = 5
12 | INITIAL_DAYS = 0
13 |
14 | action_scenario = types.ActionScenario()
15 | growth_scenario = types.TraderGrowthScenario(growthType='flat')
16 |
17 | MODEL_SWEEP_PARAMS = types.ModelSweepParams(
18 | timestep_in_days=[DAYS_PER_TIMESTEP],
19 | initial_reserve= [0.05],
20 | action_scenario=[action_scenario],
21 | growth_scenario=[growth_scenario]
22 | )
23 |
24 |
25 | SYS_PARAMS = {
26 | 'parameter': [1]
27 | }
28 |
29 | GENESIS_STATES: types.ModelState = {
30 | 'days_passed': INITIAL_DAYS,
31 | 'mcs': 0.0,
32 | 'mcv': 0.0,
33 | 'ps': 0.0,
34 | 'pv': 0.0,
35 | 'r': 0.0,
36 | 'ss': 0.0,
37 | 'sv':0.0,
38 | 'active_traders': []
39 | }
40 |
41 |
42 | SIM_CONFIG= {
43 | 'N': MONTE_CARLO_RUNS,
44 | 'T': range(SIMULATION_TIMESTEPS),
45 | 'M': MODEL_SWEEP_PARAMS
46 | }
47 |
--------------------------------------------------------------------------------
/projects/bonded_surface/model/structure.py:
--------------------------------------------------------------------------------
1 |
2 | from typing import Tuple, TypeAlias
3 | import numpy as np
4 | import random
5 | import copy
6 | from model.types import ModelParams, ModelState
7 |
8 | #policies
9 | def p_evolve_time(params: ModelParams,
10 | _2,
11 | _3,
12 | _4):
13 | return {'delta_in_days': params['timestep_in_days']}
14 |
15 | def p_growth_policy(params: ModelParams,
16 | _2,
17 | _3,
18 | state: ModelState):
19 | rm_traders= []
20 | add_traders= []
21 | if(len(state['active_traders'])) < 0:
22 | add_traders = params['growth_scenario'].generateTraders()
23 | return {'rm_traders': rm_traders, 'add_traders': add_traders}
24 |
25 | #state updates
26 | def s_days_passed(_1,
27 | _2,
28 | _3,
29 | state: ModelState,
30 | signal):
31 | value = state['days_passed'] + signal['delta_in_days']
32 | return ('days_passed', value)
33 |
34 | def s_delta_days(_1,
35 | _2,
36 | _3,
37 | state: ModelState,
38 | signal):
39 | value = signal['delta_in_days']
40 | return ('delta_days', value)
41 |
42 |
43 | PARTIAL_STATE_UPDATE_BLOCKS = [
44 | {
45 | 'label': 'Time Tracking',
46 | 'policies': {
47 | 'evolve_time': p_evolve_time,
48 | },
49 | 'variables': {
50 | 'days_passed': s_days_passed,
51 | 'delta_days': s_delta_days,
52 | }
53 | },
54 | {
55 | 'label': 'Trader Population Management',
56 | 'policies': {
57 | 'growth_policy': p_growth_policy,
58 | },
59 | 'variables': {
60 | }
61 | }
62 | ]
--------------------------------------------------------------------------------
/projects/bonded_surface/model/types.py:
--------------------------------------------------------------------------------
1 | # Units
2 | from dataclasses import dataclass
3 | from enum import Enum
4 | import enum
5 | from random import randint
6 | import random
7 | from typing import Dict, Optional, TypeAlias, TypedDict, List, Tuple
8 | import numpy as np
9 |
10 | Days: TypeAlias = float
11 | Year: TypeAlias = float
12 | PerYear: TypeAlias = float
13 | choices = ['mintV', 'sellV', 'mintboth', 'mintS', 'sellS']
14 |
15 | # choices that we can make for taking action
16 | class Choices(Enum):
17 | mintV = 'mintV'
18 | sellV = 'sellV'
19 | mintboth = 'mintboth'
20 | mintS = 'mintS'
21 | sellS = 'sellS'
22 |
23 | @dataclass
24 | class ActionScenario():
25 | """
26 | The action scenario class is used to define the actions that the agent can take.
27 | It is also used to define the amount of action that the agent can take.
28 | """
29 | step: float = 0.1
30 |
31 | def get_action(self) -> Choices:
32 | return random.choice([ch for ch in Choices])
33 |
34 | def get_action_amount(self, stable_coin_supply: float) -> float:
35 | return np.random.uniform(self.step, stable_coin_supply)
36 |
37 | @dataclass
38 | class TraderAgent():
39 | id: int
40 | reserveAsset: float
41 | stableCoinSupply: float
42 | volatileTokenSupply: float
43 |
44 |
45 | @dataclass
46 | class TraderGrowthScenario():
47 | """
48 | The trader growth scenario class is used to define the growth of the trader population.
49 | """
50 | step: float = 0.1
51 | growthType: str = 'flat'
52 |
53 |
54 | def generateTraders(self) -> List[TraderAgent]:
55 | return [TraderAgent(id=1,reserveAsset=100,volatileTokenSupply=100,stableCoinSupply=100)]
56 |
57 | class ModelState (TypedDict):
58 | days_passed: Days
59 | mcv: float #mcap vol token
60 | mcs: float #mcap stable token
61 | r: float #reserve asset variable
62 | sv: float # supply of volatile token
63 | ss: float # supply of stable coin
64 | pv: float #price of volatile token
65 | ps: float #price of stable coin
66 | active_traders: List[TraderAgent]
67 |
68 |
69 |
70 | class ModelParams(TypedDict):
71 | timestep_in_days: Days
72 | ir: float #initial bootstrapped reserve
73 | action_scenario: ActionScenario
74 | growth_scenario: TraderGrowthScenario
75 |
76 | class ModelSweepParams(TypedDict):
77 | timestep_in_days: List[Days]
78 | initial_reserve: List[float]
79 | action_scenario: List[ActionScenario]
80 | growth_scenario: List[TraderGrowthScenario]
81 |
--------------------------------------------------------------------------------
/qa_format.md:
--------------------------------------------------------------------------------
1 | ## Sprint number
2 | ### 2022-MM-DD
3 | ### Rules
4 | Anyone can ask any question, don't delete existing questions,
5 |
6 | Anyone can answer a question, there are no stupid questions or answers
7 |
8 | Let's just try and help each other
9 |
10 | ### Questions
11 | **My question**
12 | - Answers go here
--------------------------------------------------------------------------------
/templates/README.md:
--------------------------------------------------------------------------------
1 | ## Simulation Example Templates
2 | This is just meant to be a starting point for projects that you might want to build with cadcad or cadcadTools or any of the simulations.
3 | There's a small range of options and this I think captures most of what you'll need.
4 |
5 | ### cadcad_og
6 | The current 0.4.28 implementation of cadcad. It is simply laid out in a way that is codusive to running multiple test, and helps seperate concerns
7 | This layout was inspired by this [repo](https://github.com/BlockScience/filecoin-baseline-incentives/tree/ac3874ba98c3fe9a5b11e5682072aa04f980c655)
8 |
9 | ```
10 | ├── cadcad_fromdisk.ipynb // top level notebook to read simulations from disk
11 | ├── cadcad_live.ipynb // top level notebook to read simulation after executing experimennt
12 | ├── data
13 | │ └── simulations // folder for the cached simulation results
14 | ├── model
15 | │ ├── __init__.py // init
16 | │ ├── __main__.py // main for commandline execution
17 | │ ├── execution.py // main for exposing a method to execute experiment
18 | │ ├── experiment.py // the experiment object
19 | │ ├── logic.py // logic for the state and policy updates
20 | │ ├── params.py // params parameters used for setting model state
21 | │ └── structure.py // The wiring together of the state update blocks
22 | └── requirements.txt
23 | ```
24 |
25 | ### cadcad_tools
26 | This is slightly can't be used for blockscience labs simulation, but is a smaller stop gap between the new cadcad-ri implementation and 0.4.28
27 |
28 | This is a single layout version of this that we'll be using for most things in the group until larger project,and we will mostly follow the format
29 | of the `cadcad_og`
30 |
31 |
32 | ### python
33 | This simulator is just what a simulator does at its core, even cadcad at it's base level. This is mostly to do something quick with 0 overhead.
34 | It's also to get a feel for what it takes to simulate something.
35 |
36 |
37 | ### requirements.txt
38 | For the group if you're missing a package, you can just refer to the requirements.txt and more than likely this should resolve it. It will include
39 | more than what you need but your dependency basis should be covered.
40 |
41 |
42 |
--------------------------------------------------------------------------------
/templates/cadcad_og/README.md:
--------------------------------------------------------------------------------
1 | ### Simple Cadcad template project using cadcad
2 | ### Summary
3 | Project just serves as a framework for layout cadcad projects in a way compatible with 0.4.28 of cadcad.
4 | It partitions the data in a way to allow for more portability of your data, and to back up your simulation runs.
5 | Extending this with pytest isn't a far leap.
6 |
7 | ### Installation
8 | ```
9 | # setup a local environment to build from
10 | python3.10 -m venv venv
11 | source activate venv/bin/activate
12 | # should be within the python environment now
13 | pip install -r requirements.txt
14 | # depending on your setup you may need to install ipykernel
15 | pip install ipykernel
16 | ```
17 |
18 |
--------------------------------------------------------------------------------
/templates/cadcad_og/cadcad_fromdisk.ipynb:
--------------------------------------------------------------------------------
1 | {
2 | "cells": [
3 | {
4 | "cell_type": "code",
5 | "execution_count": 57,
6 | "metadata": {},
7 | "outputs": [
8 | {
9 | "data": {
10 | "application/vnd.plotly.v1+json": {
11 | "config": {
12 | "plotlyServerURL": "https://plot.ly"
13 | },
14 | "data": [
15 | {
16 | "hovertemplate": "timestep=%{x} something=%{y}",
17 | "legendgroup": "",
18 | "line": {
19 | "color": "#636efa",
20 | "dash": "solid"
21 | },
22 | "marker": {
23 | "symbol": "circle"
24 | },
25 | "mode": "lines",
26 | "name": "",
27 | "orientation": "v",
28 | "showlegend": false,
29 | "type": "scatter",
30 | "x": [
31 | 0,
32 | 1,
33 | 2,
34 | 3,
35 | 4,
36 | 5,
37 | 6,
38 | 7,
39 | 8,
40 | 9,
41 | 10,
42 | 11,
43 | 12,
44 | 13,
45 | 14,
46 | 15,
47 | 16,
48 | 17,
49 | 18,
50 | 19,
51 | 20,
52 | 21,
53 | 22,
54 | 23,
55 | 24,
56 | 25,
57 | 26,
58 | 27,
59 | 28,
60 | 29,
61 | 30,
62 | 31,
63 | 32,
64 | 33,
65 | 34,
66 | 35,
67 | 36,
68 | 37,
69 | 38,
70 | 39,
71 | 40,
72 | 41,
73 | 42,
74 | 43,
75 | 44,
76 | 45,
77 | 46,
78 | 47,
79 | 48,
80 | 49,
81 | 50,
82 | 51,
83 | 52,
84 | 53,
85 | 54,
86 | 55,
87 | 56,
88 | 57,
89 | 58,
90 | 59,
91 | 60,
92 | 61,
93 | 62,
94 | 63,
95 | 64,
96 | 65,
97 | 66,
98 | 67,
99 | 68,
100 | 69,
101 | 70,
102 | 71,
103 | 72,
104 | 73,
105 | 74,
106 | 75,
107 | 76,
108 | 77,
109 | 78,
110 | 79,
111 | 80,
112 | 81,
113 | 82,
114 | 83,
115 | 84,
116 | 85,
117 | 86,
118 | 87,
119 | 88,
120 | 89,
121 | 90,
122 | 91,
123 | 92,
124 | 93,
125 | 94,
126 | 95,
127 | 96,
128 | 97,
129 | 98,
130 | 99,
131 | 100
132 | ],
133 | "xaxis": "x",
134 | "y": [
135 | 0,
136 | -1.281525976328849,
137 | -0.19186994400779536,
138 | -0.5003996942094778,
139 | -1.3728492755688495,
140 | 0.38562349377405897,
141 | -1.7939221599022444,
142 | -0.41409766368355105,
143 | -1.06024898097683,
144 | 0.3655055322243477,
145 | 0.5489969298743425,
146 | -0.09760246970286793,
147 | -2.0876775998846506,
148 | 0.5661268592310115,
149 | 0.6598826123419672,
150 | -3.2870653151851195,
151 | -0.8991131538172937,
152 | 0.06537412902839755,
153 | 0.603758107813152,
154 | -1.2150593759778647,
155 | -0.1220782601057612,
156 | 1.2549730569035786,
157 | 0.9191383464827501,
158 | 0.3040868649031299,
159 | 0.7143699659913623,
160 | 2.680765804761444,
161 | -0.04513946587887434,
162 | -0.7925030503116257,
163 | -1.6934148109887384,
164 | 0.11884197587187038,
165 | 0.9243791713480185,
166 | -0.43855036561300564,
167 | -1.3589951679318972,
168 | -0.34041397341878993,
169 | 1.0175266488523595,
170 | 0.09921314579015487,
171 | 0.4213721253684667,
172 | -1.1114273898814415,
173 | 1.6289345858747795,
174 | 0.595252268242531,
175 | 1.956415828092029,
176 | -0.9248658810357493,
177 | 0.7241030859571913,
178 | 2.44132155383484,
179 | 1.208171136973227,
180 | 1.3809177748816124,
181 | 0.9807107180070346,
182 | 0.32858073567951446,
183 | 0.8511363247042386,
184 | -0.9091611859937367,
185 | 0.07930018715622643,
186 | -1.172702280667136,
187 | 0.20859957021268474,
188 | -0.3079714678851848,
189 | 0.17872258832467608,
190 | 1.5288562348132144,
191 | 0.9204835167623985,
192 | -0.9360413300623627,
193 | 0.46652898098695506,
194 | 0.4369136179035,
195 | 0.4494642467298014,
196 | 1.6891134728161787,
197 | 0.8807089711245498,
198 | 0.2405849853333266,
199 | -0.2692722391540247,
200 | 0.7141403148443796,
201 | -0.708438574807384,
202 | 0.1947766691517193,
203 | -1.1019416161663085,
204 | 1.15638152875276,
205 | 0.3133831505577661,
206 | -1.9601147633877891,
207 | 0.6717748812095953,
208 | 1.0264317443436766,
209 | 0.24529633977787654,
210 | -1.4639450302752934,
211 | 0.4022368481716754,
212 | 1.446328453422057,
213 | -1.0447797357886914,
214 | -1.365682961822003,
215 | 0.032045503016646736,
216 | -0.7275828788097094,
217 | -0.7751986267579769,
218 | -0.29671117877151393,
219 | -2.016939120951739,
220 | 1.7171635082591281,
221 | -1.1503198261190755,
222 | 0.5288698531523238,
223 | 0.6662922460658215,
224 | 0.30441386191198294,
225 | -1.9574764618245928,
226 | 0.2721967348636761,
227 | 0.5612845139746474,
228 | 0.7013532263214873,
229 | -0.12880404438925755,
230 | 1.0227674750157478,
231 | 0.2452542822007089,
232 | 0.29018150253518155,
233 | 1.0224443145609523,
234 | -0.03480885690401747,
235 | 0.14122892808579385
236 | ],
237 | "yaxis": "y"
238 | }
239 | ],
240 | "layout": {
241 | "height": 800,
242 | "legend": {
243 | "tracegroupgap": 0
244 | },
245 | "margin": {
246 | "t": 60
247 | },
248 | "template": {
249 | "data": {
250 | "bar": [
251 | {
252 | "error_x": {
253 | "color": "#2a3f5f"
254 | },
255 | "error_y": {
256 | "color": "#2a3f5f"
257 | },
258 | "marker": {
259 | "line": {
260 | "color": "#E5ECF6",
261 | "width": 0.5
262 | },
263 | "pattern": {
264 | "fillmode": "overlay",
265 | "size": 10,
266 | "solidity": 0.2
267 | }
268 | },
269 | "type": "bar"
270 | }
271 | ],
272 | "barpolar": [
273 | {
274 | "marker": {
275 | "line": {
276 | "color": "#E5ECF6",
277 | "width": 0.5
278 | },
279 | "pattern": {
280 | "fillmode": "overlay",
281 | "size": 10,
282 | "solidity": 0.2
283 | }
284 | },
285 | "type": "barpolar"
286 | }
287 | ],
288 | "carpet": [
289 | {
290 | "aaxis": {
291 | "endlinecolor": "#2a3f5f",
292 | "gridcolor": "white",
293 | "linecolor": "white",
294 | "minorgridcolor": "white",
295 | "startlinecolor": "#2a3f5f"
296 | },
297 | "baxis": {
298 | "endlinecolor": "#2a3f5f",
299 | "gridcolor": "white",
300 | "linecolor": "white",
301 | "minorgridcolor": "white",
302 | "startlinecolor": "#2a3f5f"
303 | },
304 | "type": "carpet"
305 | }
306 | ],
307 | "choropleth": [
308 | {
309 | "colorbar": {
310 | "outlinewidth": 0,
311 | "ticks": ""
312 | },
313 | "type": "choropleth"
314 | }
315 | ],
316 | "contour": [
317 | {
318 | "colorbar": {
319 | "outlinewidth": 0,
320 | "ticks": ""
321 | },
322 | "colorscale": [
323 | [
324 | 0,
325 | "#0d0887"
326 | ],
327 | [
328 | 0.1111111111111111,
329 | "#46039f"
330 | ],
331 | [
332 | 0.2222222222222222,
333 | "#7201a8"
334 | ],
335 | [
336 | 0.3333333333333333,
337 | "#9c179e"
338 | ],
339 | [
340 | 0.4444444444444444,
341 | "#bd3786"
342 | ],
343 | [
344 | 0.5555555555555556,
345 | "#d8576b"
346 | ],
347 | [
348 | 0.6666666666666666,
349 | "#ed7953"
350 | ],
351 | [
352 | 0.7777777777777778,
353 | "#fb9f3a"
354 | ],
355 | [
356 | 0.8888888888888888,
357 | "#fdca26"
358 | ],
359 | [
360 | 1,
361 | "#f0f921"
362 | ]
363 | ],
364 | "type": "contour"
365 | }
366 | ],
367 | "contourcarpet": [
368 | {
369 | "colorbar": {
370 | "outlinewidth": 0,
371 | "ticks": ""
372 | },
373 | "type": "contourcarpet"
374 | }
375 | ],
376 | "heatmap": [
377 | {
378 | "colorbar": {
379 | "outlinewidth": 0,
380 | "ticks": ""
381 | },
382 | "colorscale": [
383 | [
384 | 0,
385 | "#0d0887"
386 | ],
387 | [
388 | 0.1111111111111111,
389 | "#46039f"
390 | ],
391 | [
392 | 0.2222222222222222,
393 | "#7201a8"
394 | ],
395 | [
396 | 0.3333333333333333,
397 | "#9c179e"
398 | ],
399 | [
400 | 0.4444444444444444,
401 | "#bd3786"
402 | ],
403 | [
404 | 0.5555555555555556,
405 | "#d8576b"
406 | ],
407 | [
408 | 0.6666666666666666,
409 | "#ed7953"
410 | ],
411 | [
412 | 0.7777777777777778,
413 | "#fb9f3a"
414 | ],
415 | [
416 | 0.8888888888888888,
417 | "#fdca26"
418 | ],
419 | [
420 | 1,
421 | "#f0f921"
422 | ]
423 | ],
424 | "type": "heatmap"
425 | }
426 | ],
427 | "heatmapgl": [
428 | {
429 | "colorbar": {
430 | "outlinewidth": 0,
431 | "ticks": ""
432 | },
433 | "colorscale": [
434 | [
435 | 0,
436 | "#0d0887"
437 | ],
438 | [
439 | 0.1111111111111111,
440 | "#46039f"
441 | ],
442 | [
443 | 0.2222222222222222,
444 | "#7201a8"
445 | ],
446 | [
447 | 0.3333333333333333,
448 | "#9c179e"
449 | ],
450 | [
451 | 0.4444444444444444,
452 | "#bd3786"
453 | ],
454 | [
455 | 0.5555555555555556,
456 | "#d8576b"
457 | ],
458 | [
459 | 0.6666666666666666,
460 | "#ed7953"
461 | ],
462 | [
463 | 0.7777777777777778,
464 | "#fb9f3a"
465 | ],
466 | [
467 | 0.8888888888888888,
468 | "#fdca26"
469 | ],
470 | [
471 | 1,
472 | "#f0f921"
473 | ]
474 | ],
475 | "type": "heatmapgl"
476 | }
477 | ],
478 | "histogram": [
479 | {
480 | "marker": {
481 | "pattern": {
482 | "fillmode": "overlay",
483 | "size": 10,
484 | "solidity": 0.2
485 | }
486 | },
487 | "type": "histogram"
488 | }
489 | ],
490 | "histogram2d": [
491 | {
492 | "colorbar": {
493 | "outlinewidth": 0,
494 | "ticks": ""
495 | },
496 | "colorscale": [
497 | [
498 | 0,
499 | "#0d0887"
500 | ],
501 | [
502 | 0.1111111111111111,
503 | "#46039f"
504 | ],
505 | [
506 | 0.2222222222222222,
507 | "#7201a8"
508 | ],
509 | [
510 | 0.3333333333333333,
511 | "#9c179e"
512 | ],
513 | [
514 | 0.4444444444444444,
515 | "#bd3786"
516 | ],
517 | [
518 | 0.5555555555555556,
519 | "#d8576b"
520 | ],
521 | [
522 | 0.6666666666666666,
523 | "#ed7953"
524 | ],
525 | [
526 | 0.7777777777777778,
527 | "#fb9f3a"
528 | ],
529 | [
530 | 0.8888888888888888,
531 | "#fdca26"
532 | ],
533 | [
534 | 1,
535 | "#f0f921"
536 | ]
537 | ],
538 | "type": "histogram2d"
539 | }
540 | ],
541 | "histogram2dcontour": [
542 | {
543 | "colorbar": {
544 | "outlinewidth": 0,
545 | "ticks": ""
546 | },
547 | "colorscale": [
548 | [
549 | 0,
550 | "#0d0887"
551 | ],
552 | [
553 | 0.1111111111111111,
554 | "#46039f"
555 | ],
556 | [
557 | 0.2222222222222222,
558 | "#7201a8"
559 | ],
560 | [
561 | 0.3333333333333333,
562 | "#9c179e"
563 | ],
564 | [
565 | 0.4444444444444444,
566 | "#bd3786"
567 | ],
568 | [
569 | 0.5555555555555556,
570 | "#d8576b"
571 | ],
572 | [
573 | 0.6666666666666666,
574 | "#ed7953"
575 | ],
576 | [
577 | 0.7777777777777778,
578 | "#fb9f3a"
579 | ],
580 | [
581 | 0.8888888888888888,
582 | "#fdca26"
583 | ],
584 | [
585 | 1,
586 | "#f0f921"
587 | ]
588 | ],
589 | "type": "histogram2dcontour"
590 | }
591 | ],
592 | "mesh3d": [
593 | {
594 | "colorbar": {
595 | "outlinewidth": 0,
596 | "ticks": ""
597 | },
598 | "type": "mesh3d"
599 | }
600 | ],
601 | "parcoords": [
602 | {
603 | "line": {
604 | "colorbar": {
605 | "outlinewidth": 0,
606 | "ticks": ""
607 | }
608 | },
609 | "type": "parcoords"
610 | }
611 | ],
612 | "pie": [
613 | {
614 | "automargin": true,
615 | "type": "pie"
616 | }
617 | ],
618 | "scatter": [
619 | {
620 | "fillpattern": {
621 | "fillmode": "overlay",
622 | "size": 10,
623 | "solidity": 0.2
624 | },
625 | "type": "scatter"
626 | }
627 | ],
628 | "scatter3d": [
629 | {
630 | "line": {
631 | "colorbar": {
632 | "outlinewidth": 0,
633 | "ticks": ""
634 | }
635 | },
636 | "marker": {
637 | "colorbar": {
638 | "outlinewidth": 0,
639 | "ticks": ""
640 | }
641 | },
642 | "type": "scatter3d"
643 | }
644 | ],
645 | "scattercarpet": [
646 | {
647 | "marker": {
648 | "colorbar": {
649 | "outlinewidth": 0,
650 | "ticks": ""
651 | }
652 | },
653 | "type": "scattercarpet"
654 | }
655 | ],
656 | "scattergeo": [
657 | {
658 | "marker": {
659 | "colorbar": {
660 | "outlinewidth": 0,
661 | "ticks": ""
662 | }
663 | },
664 | "type": "scattergeo"
665 | }
666 | ],
667 | "scattergl": [
668 | {
669 | "marker": {
670 | "colorbar": {
671 | "outlinewidth": 0,
672 | "ticks": ""
673 | }
674 | },
675 | "type": "scattergl"
676 | }
677 | ],
678 | "scattermapbox": [
679 | {
680 | "marker": {
681 | "colorbar": {
682 | "outlinewidth": 0,
683 | "ticks": ""
684 | }
685 | },
686 | "type": "scattermapbox"
687 | }
688 | ],
689 | "scatterpolar": [
690 | {
691 | "marker": {
692 | "colorbar": {
693 | "outlinewidth": 0,
694 | "ticks": ""
695 | }
696 | },
697 | "type": "scatterpolar"
698 | }
699 | ],
700 | "scatterpolargl": [
701 | {
702 | "marker": {
703 | "colorbar": {
704 | "outlinewidth": 0,
705 | "ticks": ""
706 | }
707 | },
708 | "type": "scatterpolargl"
709 | }
710 | ],
711 | "scatterternary": [
712 | {
713 | "marker": {
714 | "colorbar": {
715 | "outlinewidth": 0,
716 | "ticks": ""
717 | }
718 | },
719 | "type": "scatterternary"
720 | }
721 | ],
722 | "surface": [
723 | {
724 | "colorbar": {
725 | "outlinewidth": 0,
726 | "ticks": ""
727 | },
728 | "colorscale": [
729 | [
730 | 0,
731 | "#0d0887"
732 | ],
733 | [
734 | 0.1111111111111111,
735 | "#46039f"
736 | ],
737 | [
738 | 0.2222222222222222,
739 | "#7201a8"
740 | ],
741 | [
742 | 0.3333333333333333,
743 | "#9c179e"
744 | ],
745 | [
746 | 0.4444444444444444,
747 | "#bd3786"
748 | ],
749 | [
750 | 0.5555555555555556,
751 | "#d8576b"
752 | ],
753 | [
754 | 0.6666666666666666,
755 | "#ed7953"
756 | ],
757 | [
758 | 0.7777777777777778,
759 | "#fb9f3a"
760 | ],
761 | [
762 | 0.8888888888888888,
763 | "#fdca26"
764 | ],
765 | [
766 | 1,
767 | "#f0f921"
768 | ]
769 | ],
770 | "type": "surface"
771 | }
772 | ],
773 | "table": [
774 | {
775 | "cells": {
776 | "fill": {
777 | "color": "#EBF0F8"
778 | },
779 | "line": {
780 | "color": "white"
781 | }
782 | },
783 | "header": {
784 | "fill": {
785 | "color": "#C8D4E3"
786 | },
787 | "line": {
788 | "color": "white"
789 | }
790 | },
791 | "type": "table"
792 | }
793 | ]
794 | },
795 | "layout": {
796 | "annotationdefaults": {
797 | "arrowcolor": "#2a3f5f",
798 | "arrowhead": 0,
799 | "arrowwidth": 1
800 | },
801 | "autotypenumbers": "strict",
802 | "coloraxis": {
803 | "colorbar": {
804 | "outlinewidth": 0,
805 | "ticks": ""
806 | }
807 | },
808 | "colorscale": {
809 | "diverging": [
810 | [
811 | 0,
812 | "#8e0152"
813 | ],
814 | [
815 | 0.1,
816 | "#c51b7d"
817 | ],
818 | [
819 | 0.2,
820 | "#de77ae"
821 | ],
822 | [
823 | 0.3,
824 | "#f1b6da"
825 | ],
826 | [
827 | 0.4,
828 | "#fde0ef"
829 | ],
830 | [
831 | 0.5,
832 | "#f7f7f7"
833 | ],
834 | [
835 | 0.6,
836 | "#e6f5d0"
837 | ],
838 | [
839 | 0.7,
840 | "#b8e186"
841 | ],
842 | [
843 | 0.8,
844 | "#7fbc41"
845 | ],
846 | [
847 | 0.9,
848 | "#4d9221"
849 | ],
850 | [
851 | 1,
852 | "#276419"
853 | ]
854 | ],
855 | "sequential": [
856 | [
857 | 0,
858 | "#0d0887"
859 | ],
860 | [
861 | 0.1111111111111111,
862 | "#46039f"
863 | ],
864 | [
865 | 0.2222222222222222,
866 | "#7201a8"
867 | ],
868 | [
869 | 0.3333333333333333,
870 | "#9c179e"
871 | ],
872 | [
873 | 0.4444444444444444,
874 | "#bd3786"
875 | ],
876 | [
877 | 0.5555555555555556,
878 | "#d8576b"
879 | ],
880 | [
881 | 0.6666666666666666,
882 | "#ed7953"
883 | ],
884 | [
885 | 0.7777777777777778,
886 | "#fb9f3a"
887 | ],
888 | [
889 | 0.8888888888888888,
890 | "#fdca26"
891 | ],
892 | [
893 | 1,
894 | "#f0f921"
895 | ]
896 | ],
897 | "sequentialminus": [
898 | [
899 | 0,
900 | "#0d0887"
901 | ],
902 | [
903 | 0.1111111111111111,
904 | "#46039f"
905 | ],
906 | [
907 | 0.2222222222222222,
908 | "#7201a8"
909 | ],
910 | [
911 | 0.3333333333333333,
912 | "#9c179e"
913 | ],
914 | [
915 | 0.4444444444444444,
916 | "#bd3786"
917 | ],
918 | [
919 | 0.5555555555555556,
920 | "#d8576b"
921 | ],
922 | [
923 | 0.6666666666666666,
924 | "#ed7953"
925 | ],
926 | [
927 | 0.7777777777777778,
928 | "#fb9f3a"
929 | ],
930 | [
931 | 0.8888888888888888,
932 | "#fdca26"
933 | ],
934 | [
935 | 1,
936 | "#f0f921"
937 | ]
938 | ]
939 | },
940 | "colorway": [
941 | "#636efa",
942 | "#EF553B",
943 | "#00cc96",
944 | "#ab63fa",
945 | "#FFA15A",
946 | "#19d3f3",
947 | "#FF6692",
948 | "#B6E880",
949 | "#FF97FF",
950 | "#FECB52"
951 | ],
952 | "font": {
953 | "color": "#2a3f5f"
954 | },
955 | "geo": {
956 | "bgcolor": "white",
957 | "lakecolor": "white",
958 | "landcolor": "#E5ECF6",
959 | "showlakes": true,
960 | "showland": true,
961 | "subunitcolor": "white"
962 | },
963 | "hoverlabel": {
964 | "align": "left"
965 | },
966 | "hovermode": "closest",
967 | "mapbox": {
968 | "style": "light"
969 | },
970 | "paper_bgcolor": "white",
971 | "plot_bgcolor": "#E5ECF6",
972 | "polar": {
973 | "angularaxis": {
974 | "gridcolor": "white",
975 | "linecolor": "white",
976 | "ticks": ""
977 | },
978 | "bgcolor": "#E5ECF6",
979 | "radialaxis": {
980 | "gridcolor": "white",
981 | "linecolor": "white",
982 | "ticks": ""
983 | }
984 | },
985 | "scene": {
986 | "xaxis": {
987 | "backgroundcolor": "#E5ECF6",
988 | "gridcolor": "white",
989 | "gridwidth": 2,
990 | "linecolor": "white",
991 | "showbackground": true,
992 | "ticks": "",
993 | "zerolinecolor": "white"
994 | },
995 | "yaxis": {
996 | "backgroundcolor": "#E5ECF6",
997 | "gridcolor": "white",
998 | "gridwidth": 2,
999 | "linecolor": "white",
1000 | "showbackground": true,
1001 | "ticks": "",
1002 | "zerolinecolor": "white"
1003 | },
1004 | "zaxis": {
1005 | "backgroundcolor": "#E5ECF6",
1006 | "gridcolor": "white",
1007 | "gridwidth": 2,
1008 | "linecolor": "white",
1009 | "showbackground": true,
1010 | "ticks": "",
1011 | "zerolinecolor": "white"
1012 | }
1013 | },
1014 | "shapedefaults": {
1015 | "line": {
1016 | "color": "#2a3f5f"
1017 | }
1018 | },
1019 | "ternary": {
1020 | "aaxis": {
1021 | "gridcolor": "white",
1022 | "linecolor": "white",
1023 | "ticks": ""
1024 | },
1025 | "baxis": {
1026 | "gridcolor": "white",
1027 | "linecolor": "white",
1028 | "ticks": ""
1029 | },
1030 | "bgcolor": "#E5ECF6",
1031 | "caxis": {
1032 | "gridcolor": "white",
1033 | "linecolor": "white",
1034 | "ticks": ""
1035 | }
1036 | },
1037 | "title": {
1038 | "x": 0.05
1039 | },
1040 | "xaxis": {
1041 | "automargin": true,
1042 | "gridcolor": "white",
1043 | "linecolor": "white",
1044 | "ticks": "",
1045 | "title": {
1046 | "standoff": 15
1047 | },
1048 | "zerolinecolor": "white",
1049 | "zerolinewidth": 2
1050 | },
1051 | "yaxis": {
1052 | "automargin": true,
1053 | "gridcolor": "white",
1054 | "linecolor": "white",
1055 | "ticks": "",
1056 | "title": {
1057 | "standoff": 15
1058 | },
1059 | "zerolinecolor": "white",
1060 | "zerolinewidth": 2
1061 | }
1062 | }
1063 | },
1064 | "xaxis": {
1065 | "anchor": "y",
1066 | "domain": [
1067 | 0,
1068 | 1
1069 | ],
1070 | "title": {
1071 | "text": "timestep"
1072 | }
1073 | },
1074 | "yaxis": {
1075 | "anchor": "x",
1076 | "domain": [
1077 | 0,
1078 | 1
1079 | ],
1080 | "title": {
1081 | "text": "something"
1082 | }
1083 | }
1084 | }
1085 | }
1086 | },
1087 | "metadata": {},
1088 | "output_type": "display_data"
1089 | }
1090 | ],
1091 | "source": [
1092 | "import sys\n",
1093 | "import pandas as pd\n",
1094 | "import numpy as np\n",
1095 | "import os\n",
1096 | "import plotly.express as px\n",
1097 | "import matplotlib.pyplot as plt\n",
1098 | "\n",
1099 | "# Read latest results from our serialized run\n",
1100 | "file = sorted(f for f in os.listdir('data/simulations'))[-1]\n",
1101 | "data_path = f\"data/simulations/{file}\"\n",
1102 | "raw_df = pd.read_pickle(data_path, compression='gzip')\n",
1103 | "\n",
1104 | "# interpet our run\n",
1105 | "df = raw_df.set_index('timestep')\n",
1106 | "fig = px.line(raw_df,\n",
1107 | " x='timestep',\n",
1108 | " y='something',\n",
1109 | " height=800)\n",
1110 | "fig.show()"
1111 | ]
1112 | },
1113 | {
1114 | "cell_type": "code",
1115 | "execution_count": 56,
1116 | "metadata": {},
1117 | "outputs": [
1118 | {
1119 | "data": {
1120 | "text/plain": [
1121 | "[]"
1122 | ]
1123 | },
1124 | "execution_count": 56,
1125 | "metadata": {},
1126 | "output_type": "execute_result"
1127 | },
1128 | {
1129 | "data": {
1130 | "image/png": "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",
1131 | "text/plain": [
1132 | ""
1133 | ]
1134 | },
1135 | "metadata": {
1136 | "needs_background": "light"
1137 | },
1138 | "output_type": "display_data"
1139 | }
1140 | ],
1141 | "source": [
1142 | "\n",
1143 | "plt.plot(raw_df.set_index('timestep')['something'])"
1144 | ]
1145 | }
1146 | ],
1147 | "metadata": {
1148 | "kernelspec": {
1149 | "display_name": "Python 3.10.0 ('venv': venv)",
1150 | "language": "python",
1151 | "name": "python3"
1152 | },
1153 | "language_info": {
1154 | "name": "python",
1155 | "version": "3.10.0"
1156 | },
1157 | "orig_nbformat": 4,
1158 | "vscode": {
1159 | "interpreter": {
1160 | "hash": "84403094e7879e50c63390ec8c9b7307013f744daffbace070f7164257cc56ca"
1161 | }
1162 | }
1163 | },
1164 | "nbformat": 4,
1165 | "nbformat_minor": 2
1166 | }
1167 |
--------------------------------------------------------------------------------
/templates/cadcad_og/cadcad_live.ipynb:
--------------------------------------------------------------------------------
1 | {
2 | "cells": [
3 | {
4 | "cell_type": "code",
5 | "execution_count": 4,
6 | "metadata": {},
7 | "outputs": [
8 | {
9 | "name": "stdout",
10 | "output_type": "stream",
11 | "text": [
12 | "The autoreload extension is already loaded. To reload it, use:\n",
13 | " %reload_ext autoreload\n",
14 | "\n",
15 | " ___________ ____\n",
16 | " ________ __ ___/ / ____/ | / __ \\\n",
17 | " / ___/ __` / __ / / / /| | / / / /\n",
18 | "/ /__/ /_/ / /_/ / /___/ ___ |/ /_/ /\n",
19 | "\\___/\\__,_/\\__,_/\\____/_/ |_/_____/\n",
20 | "by cadCAD\n",
21 | "\n",
22 | "cadCAD Version: 0.4.28\n",
23 | "Execution Mode: local_proc\n",
24 | "Simulation Dimensions:\n",
25 | "Entire Simulation: (Models, Unique Timesteps, Params, Total Runs, Sub-States) = (1, 200, 1, 1, 1)\n",
26 | " Simulation 0: (Timesteps, Params, Runs, Sub-States) = (200, 1, 1, 1)\n",
27 | "Execution Method: local_simulations\n",
28 | "Execution Mode: single_threaded\n",
29 | "Total execution time: 0.01s\n"
30 | ]
31 | }
32 | ],
33 | "source": [
34 | "%load_ext autoreload\n",
35 | "%autoreload 2\n",
36 | "from model.execution import execute_experiment\n",
37 | "import os\n",
38 | "import plotly.express as px\n",
39 | "import matplotlib.pyplot as plt\n",
40 | "import pandas as pd\n",
41 | "import numpy as np\n",
42 | "\n",
43 | "\n",
44 | "raw_df = execute_experiment()"
45 | ]
46 | },
47 | {
48 | "cell_type": "code",
49 | "execution_count": 5,
50 | "metadata": {},
51 | "outputs": [
52 | {
53 | "ename": "IndexError",
54 | "evalue": "list index out of range",
55 | "output_type": "error",
56 | "traceback": [
57 | "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
58 | "\u001b[0;31mIndexError\u001b[0m Traceback (most recent call last)",
59 | "\u001b[1;32m/Users/zcstarr/src/intro_complex_systems/cadCADStudyGroup/templates/cadcad_og/cadcad_live.ipynb Cell 2\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0m file \u001b[39m=\u001b[39m \u001b[39msorted\u001b[39;49m(f \u001b[39mfor\u001b[39;49;00m f \u001b[39min\u001b[39;49;00m os\u001b[39m.\u001b[39;49mlistdir(\u001b[39m'\u001b[39;49m\u001b[39mdata/simulations\u001b[39;49m\u001b[39m'\u001b[39;49m))[\u001b[39m-\u001b[39;49m\u001b[39m1\u001b[39;49m]\n\u001b[1;32m 2\u001b[0m data_path \u001b[39m=\u001b[39m \u001b[39mf\u001b[39m\u001b[39m\"\u001b[39m\u001b[39mdata/simulations/\u001b[39m\u001b[39m{\u001b[39;00mfile\u001b[39m}\u001b[39;00m\u001b[39m\"\u001b[39m\n\u001b[1;32m 3\u001b[0m raw_df \u001b[39m=\u001b[39m pd\u001b[39m.\u001b[39mread_pickle(data_path, compression\u001b[39m=\u001b[39m\u001b[39m'\u001b[39m\u001b[39mgzip\u001b[39m\u001b[39m'\u001b[39m)\n",
60 | "\u001b[0;31mIndexError\u001b[0m: list index out of range"
61 | ]
62 | }
63 | ],
64 | "source": [
65 | "\n",
66 | "# interpet our run\n",
67 | "df = raw_df.set_index('timestep')\n",
68 | "fig = px.line(raw_df,\n",
69 | " x='timestep',\n",
70 | " y='something',\n",
71 | " height=800)\n",
72 | "fig.show()"
73 | ]
74 | }
75 | ],
76 | "metadata": {
77 | "kernelspec": {
78 | "display_name": "Python 3.10.0 ('venv': venv)",
79 | "language": "python",
80 | "name": "python3"
81 | },
82 | "language_info": {
83 | "codemirror_mode": {
84 | "name": "ipython",
85 | "version": 3
86 | },
87 | "file_extension": ".py",
88 | "mimetype": "text/x-python",
89 | "name": "python",
90 | "nbconvert_exporter": "python",
91 | "pygments_lexer": "ipython3",
92 | "version": "3.10.0"
93 | },
94 | "orig_nbformat": 4,
95 | "vscode": {
96 | "interpreter": {
97 | "hash": "84403094e7879e50c63390ec8c9b7307013f744daffbace070f7164257cc56ca"
98 | }
99 | }
100 | },
101 | "nbformat": 4,
102 | "nbformat_minor": 2
103 | }
104 |
--------------------------------------------------------------------------------
/templates/cadcad_og/model/__init__.py:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/TokenEngineeringCommunity/cadCADStudyGroup/18c937752c3f05f563722252ffd7dc6b110f233d/templates/cadcad_og/model/__init__.py
--------------------------------------------------------------------------------
/templates/cadcad_og/model/__main__.py:
--------------------------------------------------------------------------------
1 | from datetime import datetime
2 | import click
3 | from model.execution import execute_experiment
4 |
5 |
6 |
7 | @click.command()
8 | def main() -> None:
9 | timestamp = datetime.now().strftime("%Y-%m-%d_%H-%M-%S")
10 | df = execute_experiment()
11 | df.to_pickle(
12 | f"data/simulations/single-run-{timestamp}.pkl.gz", compression="gzip")
13 |
14 | if __name__ == "__main__":
15 | main()
--------------------------------------------------------------------------------
/templates/cadcad_og/model/execution.py:
--------------------------------------------------------------------------------
1 | from cadCAD.configuration import Configuration
2 | from cadCAD.engine import ExecutionMode, ExecutionContext, Executor
3 | from model.experiment import exp
4 | import pandas as pd
5 |
6 |
7 | def execute_experiment():
8 | exec_mode = ExecutionMode()
9 | local_mode_ctx = ExecutionContext(context=exec_mode.local_mode)
10 |
11 | simulation = Executor(exec_context=local_mode_ctx,
12 | configs=exp.configs)
13 | raw_system_events, tensor_field, sessions = simulation.execute()
14 | return pd.DataFrame(raw_system_events)
15 |
16 |
--------------------------------------------------------------------------------
/templates/cadcad_og/model/experiment.py:
--------------------------------------------------------------------------------
1 | from cadCAD.configuration import Experiment
2 | from cadCAD.configuration.utils import config_sim
3 | from model.params import SIM_CONFIG, GENESIS_STATES
4 | from model.structure import PARTIAL_STATE_UPDATE_BLOCKS
5 |
6 | import pandas as pd
7 | import numpy as np
8 |
9 | exp = Experiment()
10 |
11 | sim_params = config_sim(SIM_CONFIG)
12 | exp.append_configs(
13 | sim_configs=sim_params,
14 | initial_state=GENESIS_STATES,
15 | partial_state_update_blocks= PARTIAL_STATE_UPDATE_BLOCKS
16 | )
--------------------------------------------------------------------------------
/templates/cadcad_og/model/logic.py:
--------------------------------------------------------------------------------
1 | import numpy as np
2 |
3 | def s_something(params,
4 | substep,
5 | state_history,
6 | prev_state,
7 | policy_input):
8 | new_value = np.random.randn()
9 | return ('something', new_value)
--------------------------------------------------------------------------------
/templates/cadcad_og/model/params.py:
--------------------------------------------------------------------------------
1 | MONTE_CARLO_RUNS = 1
2 | SIMULATION_TIMESTEPS = 100
3 |
4 | SYS_PARAMS = {
5 | 'parameter': [1]
6 | }
7 |
8 | GENESIS_STATES = {
9 | 'something': 0
10 | }
11 |
12 |
13 | SIM_CONFIG= {
14 | 'N': MONTE_CARLO_RUNS,
15 | 'T': range(SIMULATION_TIMESTEPS),
16 | 'M': SYS_PARAMS
17 | }
--------------------------------------------------------------------------------
/templates/cadcad_og/model/structure.py:
--------------------------------------------------------------------------------
1 | from model import logic
2 |
3 | PARTIAL_STATE_UPDATE_BLOCKS = [
4 | {
5 | 'policies': {
6 |
7 | },
8 | 'variables': {
9 | 'something': logic.s_something
10 | }
11 | }
12 | ]
--------------------------------------------------------------------------------
/templates/causal_loop_template.mmd:
--------------------------------------------------------------------------------
1 |
2 | %%{init: {'themeVariables': {}}}%%
3 | %% comments
4 | %% This diagram details the graph
5 |
6 | graph LR
7 | %% :::tr is the class definition that styles a node
8 | %% the format is nameOfNode[Node label]:::stylingclass
9 |
10 | %% node definition section
11 | potentialAdopters[Potential adopters]:::tr
12 | adoptionRate[Adoption rate]:::tr
13 | adopters[Adopters]:::tr
14 |
15 |
16 | %% --> defines the relationship arrow directionn
17 | %% |+ or -| definnes the type of correlation
18 | %% relationship definition section
19 |
20 | potentialAdopters --> |+| adoptionRate
21 | adoptionRate --> |-| potentialAdopters
22 | adoptionRate --> |+| adopters
23 | adopters --> |+| adoptionRate
24 |
25 | %% class def at the bottom adds a transparecy to the nodes
26 | classDef tr fill:#00000000, stroke:#00000000;
--------------------------------------------------------------------------------
/templates/python/simple.ipynb:
--------------------------------------------------------------------------------
1 | {
2 | "cells": [
3 | {
4 | "cell_type": "markdown",
5 | "metadata": {},
6 | "source": [
7 | "```\n",
8 | " Simple Simulation without any additional software as referenced by \n",
9 | " with types and a few minor enhancements \n",
10 | " Introduction to the Modeling and Analysis of Complex Systems \n",
11 | " Sayama pg 41\n",
12 | " ```\n"
13 | ]
14 | },
15 | {
16 | "cell_type": "code",
17 | "execution_count": 1,
18 | "metadata": {},
19 | "outputs": [],
20 | "source": [
21 | "import matplotlib as mpl\n",
22 | "import matplotlib.pyplot as plt\n",
23 | "from typing import List\n",
24 | "x: float #x output state variable\n",
25 | "r: float #growth rate \n",
26 | "t: float #time state variable\n",
27 | "timesteps: List[float]\n"
28 | ]
29 | },
30 | {
31 | "cell_type": "code",
32 | "execution_count": 2,
33 | "metadata": {},
34 | "outputs": [],
35 | "source": [
36 | "\n",
37 | "def initialize():\n",
38 | " global x, result, t, timesteps, r\n",
39 | " x = .1 \n",
40 | " r = 1.1\n",
41 | " t = 0\n",
42 | " timesteps = [t]\n",
43 | " result = [x]\n",
44 | "\n",
45 | "def observe():\n",
46 | " global x, result, t, timesteps\n",
47 | " timesteps.append(t)\n",
48 | " result.append(x)\n",
49 | "\n",
50 | "def update():\n",
51 | " global x, result, t, r\n",
52 | " x = r * x\n",
53 | " t = t + 1 \n",
54 | "\n",
55 | "initialize()\n",
56 | "while t < 30:\n",
57 | " update()\n",
58 | " observe()\n"
59 | ]
60 | },
61 | {
62 | "cell_type": "code",
63 | "execution_count": 3,
64 | "metadata": {},
65 | "outputs": [
66 | {
67 | "data": {
68 | "text/plain": [
69 | "[]"
70 | ]
71 | },
72 | "execution_count": 3,
73 | "metadata": {},
74 | "output_type": "execute_result"
75 | },
76 | {
77 | "data": {
78 | "image/png": "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",
79 | "text/plain": [
80 | ""
81 | ]
82 | },
83 | "metadata": {
84 | "needs_background": "light"
85 | },
86 | "output_type": "display_data"
87 | }
88 | ],
89 | "source": [
90 | "plt.plot(timesteps, result)"
91 | ]
92 | }
93 | ],
94 | "metadata": {
95 | "kernelspec": {
96 | "display_name": "Python 3.10.0 ('venv': venv)",
97 | "language": "python",
98 | "name": "python3"
99 | },
100 | "language_info": {
101 | "codemirror_mode": {
102 | "name": "ipython",
103 | "version": 3
104 | },
105 | "file_extension": ".py",
106 | "mimetype": "text/x-python",
107 | "name": "python",
108 | "nbconvert_exporter": "python",
109 | "pygments_lexer": "ipython3",
110 | "version": "3.10.0"
111 | },
112 | "orig_nbformat": 4,
113 | "vscode": {
114 | "interpreter": {
115 | "hash": "84403094e7879e50c63390ec8c9b7307013f744daffbace070f7164257cc56ca"
116 | }
117 | }
118 | },
119 | "nbformat": 4,
120 | "nbformat_minor": 2
121 | }
122 |
--------------------------------------------------------------------------------
/templates/python/simple.py:
--------------------------------------------------------------------------------
1 | """
2 | Simple Simulation without any additional software as referenced by
3 | with types and a few minor enhancements
4 | Introduction to the Modeling and Analysis of Complex Systems
5 | Sayama pg 41
6 |
7 | """
8 | import matplotlib as mpl
9 | import matplotlib.pyplot as plt
10 | from typing import List
11 |
12 | x: float #x output state variable
13 | t: float #time state variable
14 | r: float = 1.1 #growth rate
15 | timesteps: List[float]
16 |
17 |
18 | def initialize():
19 | global x, result, t, timesteps
20 | x = .1
21 | t = 0
22 | timesteps = [t]
23 | result = [x]
24 |
25 | def observe():
26 | global x, result, t, timesteps
27 | timesteps.append(t)
28 | result.append(x)
29 |
30 | def update():
31 | global x, result, t, r
32 | x = r * x
33 | t = t + 1
34 |
35 | initialize()
36 | while t < 30:
37 | update()
38 | observe()
39 |
40 | plt.plot(timesteps, result)
--------------------------------------------------------------------------------
/templates/requirements.txt:
--------------------------------------------------------------------------------
1 | ansicolors==1.1.8
2 | ansiwrap==0.8.4
3 | appnope==0.1.3
4 | argon2-cffi==21.3.0
5 | argon2-cffi-bindings==21.2.0
6 | asttokens==2.0.5
7 | attrs==22.1.0
8 | backcall==0.2.0
9 | beautifulsoup4==4.11.1
10 | bleach==5.0.1
11 | cadCAD==0.4.28
12 | cadCAD-tools==0.0.1.5
13 | cffi==1.15.1
14 | chainmap==1.0.3
15 | click==8.1.3
16 | combomethod==1.0.12
17 | cycler==0.11.0
18 | debugpy==1.6.2
19 | decorator==5.1.1
20 | defusedxml==0.7.1
21 | dill==0.3.5.1
22 | entrypoints==0.4
23 | executing==0.9.1
24 | fastjsonschema==2.16.1
25 | fn==0.2.4
26 | fonttools==4.34.4
27 | funcy==1.17
28 | intspan==1.6.1
29 | ipykernel==6.15.1
30 | ipython==8.4.0
31 | ipython-genutils==0.2.0
32 | jedi==0.18.1
33 | Jinja2==3.1.2
34 | jsonschema==4.9.0
35 | jupyter-client==7.3.4
36 | jupyter-core==4.11.1
37 | jupyterlab-pygments==0.2.2
38 | kiwisolver==1.4.4
39 | MarkupSafe==2.1.1
40 | matplotlib==3.5.2
41 | matplotlib-inline==0.1.3
42 | mementos==1.3.1
43 | mistune==0.8.4
44 | multiprocess==0.70.13
45 | nbclient==0.6.6
46 | nbconvert==6.5.0
47 | nbformat==5.4.0
48 | nest-asyncio==1.5.5
49 | notebook==6.4.12
50 | nulltype==2.3.1
51 | numpy==1.23.1
52 | options==1.4.10
53 | packaging==21.3
54 | pandas==1.4.3
55 | pandocfilters==1.5.0
56 | parso==0.8.3
57 | pathos==0.2.9
58 | pexpect==4.8.0
59 | pickleshare==0.7.5
60 | Pillow==9.2.0
61 | plotly==5.9.0
62 | pox==0.3.1
63 | ppft==1.7.6.5
64 | prometheus-client==0.14.1
65 | prompt-toolkit==3.0.30
66 | psutil==5.9.1
67 | ptyprocess==0.7.0
68 | pure-eval==0.2.2
69 | pycparser==2.21
70 | Pygments==2.12.0
71 | pyparsing==3.0.9
72 | pyrsistent==0.18.1
73 | python-dateutil==2.8.2
74 | pytz==2022.1
75 | pyzmq==23.2.0
76 | say==1.6.6
77 | Send2Trash==1.8.0
78 | simplere==1.2.13
79 | six==1.12.0
80 | soupsieve==2.3.2.post1
81 | stack-data==0.3.0
82 | tenacity==8.0.1
83 | terminado==0.15.0
84 | textdata==2.4.1
85 | textwrap3==0.9.2
86 | tinycss2==1.1.1
87 | tornado==6.2
88 | tqdm==4.64.0
89 | traitlets==5.3.0
90 | wcwidth==0.2.5
91 | webencodings==0.5.1
92 |
--------------------------------------------------------------------------------
| |