├── .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 | [![snapshot](snapshot.png)] as describe [here](https://dune.com/queries/201622/376266) 26 | and 27 | [![snapshot](snapshot2.png)] 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 | --------------------------------------------------------------------------------