diff --git a/src/talks/2024-04-12-UIC.erb b/src/talks/2024-04-12-UIC.erb
index 9b8ea40b..df28bf8c 100644
--- a/src/talks/2024-04-12-UIC.erb
+++ b/src/talks/2024-04-12-UIC.erb
@@ -216,19 +216,235 @@ end
- Workflow-style execution
+ Overview: Workflow-Style Notebooks
- - Microkernel Notebooks
- Static Analysis
+ - Microkernel Notebooks
- Approximate Dependencies
- Inter-Kernel Interop [Work In Progress]
+
+
+ Obtaining Cell Dependencies
+
+
+ - What could the cell read/write? [Static]
+ - What will the cell read/write?
+ - What did the cell read/write? [Dynamic]
+
+
+
+
+
+ Dynamic Dependencies
+
+ <%=
+ notebook() do
+ nbcell("if z:\n y = x + 2", idx: 2)
+ end
+ %>
+
+
+
+ 0 LOAD_GLOBAL 0 (z)
+ 2 POP_JUMP_IF_FALSE 12
+ 4 LOAD_GLOBAL 1 (x)
+ 6 LOAD_CONST 1 (2)
+ 8 BINARY_ADD
+ 10 STORE_GLOBAL 2 (y)
+ 12 LOAD_CONST 0 (None)
+ 14 RETURN_VALUE
+
+
+
+
+
+
+ Dynamic Dependencies
+
+ <%=
+ notebook() do
+ nbcell("if z:\n y = x + 2", idx: 2)
+ end
+ %>
+
+
+
+ 0 LOAD_GLOBAL 0 (z)
+ 2 POP_JUMP_IF_FALSE 12
+
+
+
+
+ 12 LOAD_CONST 0 (None)
+ 14 RETURN_VALUE
+
+
+
+
+
+
+ Dynamic Dependencies
+
+ <%=
+ notebook() do
+ nbcell("if z:\n y = x + 2", idx: 2)
+ end
+ %>
+
+ Reads: $\{\;\textbf{z}\;\}$
+ Writes: $\{\;\;\}$
+
+
+
+
+ Static Dependencies
+
+ <%=
+ notebook() do
+ nbcell("if z:\n y = x + 2", idx: 2)
+ end
+ %>
+
+
+
+ 0 LOAD_GLOBAL 0 (z)
+ 2 POP_JUMP_IF_FALSE 12
+ 4 LOAD_GLOBAL 1 (x)
+ 6 LOAD_CONST 1 (2)
+ 8 BINARY_ADD
+ 10 STORE_GLOBAL 2 (y)
+ 12 LOAD_CONST 0 (None)
+ 14 RETURN_VALUE
+
+
+
+
+
+
+ Static Dependencies
+
+ <%=
+ notebook() do
+ nbcell("if z:\n y = x + 2", idx: 2)
+ end
+ %>
+
+
+
+ 0 LOAD_GLOBAL 0 (z) # <---- reads
+ 2 POP_JUMP_IF_FALSE 12
+ 4 LOAD_GLOBAL 1 (x) # <---- reads
+ 6 LOAD_CONST 1 (2)
+ 8 BINARY_ADD
+ 10 STORE_GLOBAL 2 (y) # ----> writes
+ 12 LOAD_CONST 0 (None)
+ 14 RETURN_VALUE
+
+
+
+
+
+
+ Static Dependencies
+
+ <%=
+ notebook() do
+ nbcell("if z:\n y = x + 2", idx: 2)
+ end
+ %>
+
+ Could Read: $\{\;\textbf{x},\;\textbf{z}\;\}$
+ Could Write: $\{\;\textbf{y}\;\}$
+
+
+
+
+
+ Static Dependencies
+
+ <%=
+ notebook() do
+ nbcell("my_data.filter( items )", idx: 2)
+ end
+ %>
+
+ Could Read: $\{\;\textbf{my_data},\;\textbf{items}\;\}$
+ Could Write: $\{\;\;\}$
+
+
+
+
+
+ Static Dependencies
+
+ <%=
+ notebook() do
+ nbcell("my_data.push( items )", idx: 2)
+ end
+ %>
+
+ Could Read: $\{\;\textbf{my_data},\;\textbf{items}\;\}$
+ Could Write: $\{\;\textbf{my_data}\;\}$
+
+
+
+
+
+ <%=
+ notebook() do
+ nbcell("my_data.filter( items )", idx: 2)
+ end
+ %>
+ vs
+ <%=
+ notebook() do
+ nbcell("my_data.push( items )", idx: 2)
+ end
+ %>
+
+
+
+
+
+
+
+ "Bolt-on, Compact, and Rapid Program Slicing for Notebooks" (Shenkar et. al.; VLDB 2023)
+
+
+
+
+
- If we have to have the ability to recover a state, does it have to be the same interpreter?
+ $$\{\;???\;\}$$
+ <%=
+ notebook() do
+ nbcell("if z:\n y = x + 2", idx: 2)
+ end
+ %>
+
+ We need to be able to recover the notebook from any state.
@@ -262,18 +478,6 @@ end
- 1-3 slides on spreadsheets
-
-
- How to figure out dependencies
-
- 1. Run the code (exact, after the fact)
- 2. Static analysis (imprecise, incomplete)
-
-
-
- Refer to Aditya's project w.r.t. static analysis
-
-
How to figure out dependencies
diff --git a/src/talks/graphics/2024-04-12/LibraryStaticAnalysisDSL.png b/src/talks/graphics/2024-04-12/LibraryStaticAnalysisDSL.png
new file mode 100644
index 00000000..a1c539ba
Binary files /dev/null and b/src/talks/graphics/2024-04-12/LibraryStaticAnalysisDSL.png differ