final talk version

master^2
Oliver Kennedy 2024-04-11 22:50:35 -05:00
parent bceeb4fd63
commit 3d01a15434
Signed by: okennedy
GPG Key ID: 3E5F9B3ABD3FDB60
6 changed files with 974 additions and 44 deletions

View File

@ -0,0 +1,45 @@
Open farmersmarket_2024-42231059.xlsx
Geotag: Lon - Y; Lat - X
Geoplot
- 1. too much data
- 2. oops, flipped
Alter geotag. See geoplot rerun
Still too much data. Have a .shp file, but vizier doesn't support an adaptor. Python:
-------------------
# Extract County Shapes
import shapefile
with shapefile.Reader("cb_2018_us_county_500k.zip") as sf:
#for field in sf.fields:
# print(field)
# Get object containing an empty dataset.
ds = vizierdb.new_dataset()
ds.insert_column("county")
ds.insert_column("zip")
ds.insert_column("geometry", "geometry")
for entry in sf.shapeRecords():
if entry.record[0] == '36': # 36 is NYS
row = [ entry.record[5], entry.record[4], entry.shape ]
#print(row)
ds.insert_row( row )
ds.save("nys_counties")
ds.show()
-------------------
Spatial join
-------------------
SELECT *
FROM nys_counties nys
JOIN wny_counties wny ON nys.county = wny.county
-------------------
Add below, and name: usda_farmers_markets
-------------------
JOIN usda_farmers_markets f ON ST_CONTAINS(nys.geometry, f.geometry)
-------------------
Watch updated chart

View File

@ -304,7 +304,7 @@ end
nbcell("if z:\n y = x + 2", idx: 2)
end
%>
<p>If <tt>z == False</tt>:</p>
<p><b>Reads: </b> $\{\;\textbf{z}\;\}$</p>
<p><b>Writes: </b> $\{\;\;\}$</p>
@ -423,7 +423,6 @@ end
<img src="graphics/2024-04-12/LibraryStaticAnalysisDSL.png">
<attribution>"Bolt-on, Compact, and Rapid Program Slicing for Notebooks" (Shenkar et. al.; VLDB 2023)</attribution>
<attribution>(Similar ideas in Nodebook, etc...)</attribution>
</section>
@ -446,10 +445,6 @@ end
</ul>
</section>
<section>
<h3>Vizier Demo</h3>
</section>
<!------------------------- Microkernel Notebooks -------------------------->
<section>
<div class="fragment fade-out" data-fragment-index="3">
@ -467,12 +462,6 @@ end
<p class="fragment takeaway" data-fragment-index="2">We need to be able to recover the kernel to <i>any</i> state.</p>
</section>
<section>
<h2>Why have only one kernel?</h2>
<p class="fragment">🤷</p>
</section>
<section>
<%=
notebook() do
@ -489,8 +478,17 @@ end
</section>
<section>
<h3>When is parallelism allowed?</h3>
<h3 class="fragment">When is a cell runnable?</h3>
<h2>Why have only one kernel?</h2>
<p class="fragment">🤷</p>
</section>
<section>
<h3>Parallelism</h3>
<ul>
<li class="fragment">When is parallelism allowed?</li>
<li class="fragment">When is a cell runnable?</li>
</ul>
</section>
<section>
@ -522,14 +520,14 @@ end
<dd>Active if: $\forall (x \rightarrow \textbf{@i}) \in \texttt{DynamicReads} : \texttt{InState}[x] = \textbf{@i}$</dd>
<dd>$\texttt{OutState} = \texttt{InState} + \{\;x \rightarrow \textbf{@i}\;|\;\forall (x \rightarrow \textbf{@i}) \in \texttt{DynamicWrites}\;\}$</dd>
<dt>Stale</dt>
<dd>Active if: first run or $\exists (x \rightarrow \textbf{@i}) \in \texttt{DynamicReads} : \texttt{InState}[x] \neq \textbf{@i}$</dd>
<dd>$\texttt{OutState} = \texttt{InState} + \{\;x \rightarrow \textbf{???}\;|\;\forall x \in \texttt{StaticWrites}\;\}$</dd>
<dt>Runnable</dt>
<dd>Active if: $\forall x \in \texttt{StaticReads} : \texttt{InState}[x] \neq \textbf{???}$</dd>
<dd>$\texttt{OutState} = \texttt{InState} + \{\;x \rightarrow \textbf{???}\;|\;\forall x \in \texttt{StaticWrites}\;\}$</dd>
<dt>Stale</dt>
<dd>Active if: first run or $\exists (x \rightarrow \textbf{@i}) \in \texttt{DynamicReads} : \texttt{InState}[x] \neq \textbf{@i}$</dd>
<dd>$\texttt{OutState} = \texttt{InState} + \{\;x \rightarrow \textbf{???}\;|\;\forall x \in \texttt{StaticWrites}\;\}$</dd>
<dt>Unknown</dt>
<dd>Active otherwise.</dd>
<dd>$\texttt{OutState} = \texttt{InState} + \{\;x \rightarrow \textbf{???}\;|\;\forall x \in \texttt{StaticWrites}\;\}$</dd>
@ -537,19 +535,19 @@ end
</section>
<section>
<svg data-src="graphics/2024-04-12/MultiRunnerBlockDiagram.svg" height="300px"/>
<attribution>"The Right Tool for the Job: Data-Centric Workflows in Vizier" (Kennedy et. al.; IEEE DEB 2022)
</section>
<section>
<h3>Serial</h3>
<svg data-src="graphics/2024-04-12/gantt_serial.svg" height="200px"/>
<h3>Parallel</h3>
<svg data-src="graphics/2024-04-12/gantt_parallel.svg" height="200px"/>
<div style="display: inline-block;">
<h3>Serial</h3>
<svg data-src="graphics/2024-04-12/gantt_serial.svg" width="450px"/>
</div>
<div style="display: inline-block;">
<h3>Parallel</h3>
<svg data-src="graphics/2024-04-12/gantt_parallel.svg" width="450px"/>
</div>
<attribution>"Runtime Provenance Refinement for Notebooks" (Deo et. al.; TaPP 2022)</attribution>
</section>
<section>
<h3>Microkernel Notebooks</h3>
<img src="graphics/2022-06-20/MicrokernelCheckpoints.svg" height="400px">
<attribution>https://openclipart.com</attribution>
</section>
@ -580,6 +578,15 @@ end
<p class="fragment">🤷</p>
</section>
<section>
<h3>Vizier Demo</h3>
</section>
<section>
<svg data-src="graphics/2024-04-12/MultiRunnerBlockDiagram.svg" height="300px"/>
<attribution>"The Right Tool for the Job: Data-Centric Workflows in Vizier" (Kennedy et. al.; IEEE DEB 2022)
</section>
<section>
<h3>Repeatable Spreadsheet Dataframe Editing</h3>
<img src="graphics/2023-06-18/vizier-spreadsheet.png" height="300px">
@ -608,48 +615,156 @@ end
<section>
<img src="graphics/2024-04-12/14thWarrior-Cartoon-Elephant.svg" height="300px">
<p class="fragment takeaway">... but this requires migrating state.</p>
<p class="fragment takeaway">... but this requires migrating state.<span class="fragment">.. across languages.</span></p>
<attribution>https://openclipart.com</attribution>
</section>
<section>
<h3>State Management</h3>
<svg data-src="graphics/2024-04-12/Dependencies.svg" height="400px"/>
</section>
<section>
<h3>Approach 1: Pickle</h3>
<p style="font-size: 70%">Python's native serialization support.</p>
<dl style="font-size: 90%">
<div class="fragment" data-fragment-index="1">
<dt>The Good</dt>
<dd>Easy</dd>
</div>
<div class="fragment" data-fragment-index="2">
<dt>The Bad</dt>
<dd><span class="fragment highlight-grey" data-fragment-index="3">Not everything is serializable</span><span class="fragment" data-fragment-index="3" style="font-size: 50%; vertical-align: top;">†</span></dd>
<dd>Limited compatibility with ¬Python</dd>
<dd>Expensive for e.g., dataframes</dd>
</div>
</dl>
</section>
<section>
<h3>Approach 2: Json</h3>
<p style="font-size: 70%">Standard data interchange format.</p>
<dl style="font-size: 90%">
<div class="fragment" data-fragment-index="1">
<dt>The Good</dt>
<dd>Easy</dd>
<dd>Near universal platform compatibility</dd>
</div>
<div class="fragment" data-fragment-index="2">
<dt>The Bad</dt>
<dd>Even less state is supported</dd>
<dd>Even more expensive for e.g., dataframes</dd>
<dd>Limited support for nuanced types (e.g., dates)</dd>
</div>
</dl>
</section>
<section>
<h3>Approach 3: Arrow, Shapefile, Parquet, NPY</h3>
<p style="font-size: 70%">Specialized formats for specific datatypes.</p>
<dl style="font-size: 90%">
<div class="fragment" data-fragment-index="1">
<dt>The Good</dt>
<dd>High Performance</dd>
<dd>Precise, Well Typed</dd>
</div>
<div class="fragment" data-fragment-index="2">
<dt>The Bad</dt>
<dd>Only one type of state is supported</dd>
</div>
</dl>
</section>
<section>
<h3>Vizier (Now)</h3>
<p style="font-size: 70%">Vizier-level Typing.</p>
<ul>
<li>State needs to be <b>checkpointed</b> out of the process that created it.</li>
<li>State needs to be <b>restored</b> into the cell that is about to consume it.</li>
<li class="fragment" data-fragment-index="1"><b>Simple Data:</b> JSON</li>
<li class="fragment" data-fragment-index="2"><b>Typed Data:</b> Standard JSON Encoding</li>
<li class="fragment" data-fragment-index="3"><b>Special Data:</b> <span class="fragment highlight-blue" data-fragment-index="5">'Active' Data</span></li>
<li class="fragment" data-fragment-index="4"><b>Fallback:</b> Pickle</li>
</ul>
</section>
<section>
Naive approach: Pickle
<h3>Active Data</h3>
... but pickle doesn't allow interop
... but pickle doesn't always work (e.g., for 'File' objects)
<p style="font-size: 70%">Datasets, Functions/Classes, etc...</p>
<ul style="font-size: 80%">
<li class="fragment">One concept, Many physical representations (Arrow, Parquet, CSV).
<ul>
<li class="fragment">A cell interpreter may not support a representation.</li>
<li class="fragment">Generating a standard representation can be expensive.</li>
</ul>
</li>
<li class="fragment">State (e.g., Datasets) can get big.
<ul>
<li class="fragment">An interpreter may not want/need to load the entire state.</li>
<li class="fragment">Versioning all checkpoints becomes infeasible.</li>
</ul>
</li>
</ul>
</section>
<section>
Interop: Define standards
<h3>Desiderata</h3>
- Primitive Values (int, float, date, etc...)
- Collection Types (map, list, etc...)
- Libraries
- Function [Challenge: Chained Dependencies]
- Dataframe/Series [Challenge: These are BIG]
<div style="text-align: left; font-size: 80%;">
<p>An abstraction that...</p>
<ul>
<li>... represents the concept.</li>
<li>... allows on-demand conversion between representations.</li>
<li>... allows partial in-store interactions.</li>
<li>... allows incremental changes.</li>
</ul>
</div>
<p class="fragment takeaway">Vizier's artifact store provides a thin wrapper around standards compliant libraries (e.g., Apache Spark).</p>
</section>
<section>
<h3>"Active" Data</h3>
<svg data-src="graphics/2024-04-12/DataframeAbstraction.svg" height="400px"/>
</section>
<section>
<p>... but it's a lot of special case code.</p>
</section>
<section>
<h3>Generalizing Active Data</h3>
<p style="font-size: 60%">(future work)</p>
<ul>
<li class="fragment">What's the right abstraction?</li>
<li class="fragment">Efficient type coercion (without $N^2$)</li>
<li class="fragment">Microservice RPCs</li>
<li class="fragment">Caching Strategies</li>
</ul>
<p class="fragment takeaway">Questions?</p>
</section>
<!------------------------- Closing -------------------------->
<%#
<section>
<a href="https://vizierdb.info">
<img src="graphics/2022-06-20/vizier.svg" height="200px">
<p style="margin-top: -20px;">https://vizierdb.info</p>
</a>
<p style="font-size: 65%"><b>Mike Brachmann, Boris Glavic, Nachiket Deo</b>, Juliana Freire, Heiko Mueller, Sonia Castello, Munaf Arshad Qazi, William Spoth, Poonam Kumari, Soham Patel, and more...</p>
<p style="font-size: 65%">Mike Brachmann, Boris Glavic, Nachiket Deo, Juliana Freire, Heiko Mueller, Sonia Castello, Munaf Arshad Qazi, William Spoth, Poonam Kumari, Nicholas Brown, Soham Patel, Thomas Slowe, and more...</p>
<div style="width: 100%; text-align: right">
<span style="font-size: 40%; vertical-align: top;">Supported by:</span>
<img src="graphics/logos/nsf.png" height="50px">
<img src="graphics/logos/breadcrumb.png" height="50px">
</div>
</section>
%>

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 132 KiB

View File

@ -0,0 +1,229 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
width="174.83727mm"
height="60.998596mm"
viewBox="0 0 174.83727 60.998596"
version="1.1"
id="svg1"
sodipodi:docname="Dependencies-State.svg"
inkscape:version="1.3.2 (091e20ef0f, 2023-11-25)"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg">
<sodipodi:namedview
id="namedview1"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:showpageshadow="2"
inkscape:pageopacity="0.0"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#d1d1d1"
inkscape:document-units="mm"
inkscape:zoom="0.76129652"
inkscape:cx="327.07361"
inkscape:cy="177.98584"
inkscape:window-width="1120"
inkscape:window-height="651"
inkscape:window-x="26"
inkscape:window-y="23"
inkscape:window-maximized="0"
inkscape:current-layer="layer1" />
<defs
id="defs1">
<marker
style="overflow:visible"
id="Triangle3"
refX="0"
refY="0"
orient="auto-start-reverse"
inkscape:stockid="Triangle arrow"
markerWidth="1"
markerHeight="1"
viewBox="0 0 1 1"
inkscape:isstock="true"
inkscape:collect="always"
preserveAspectRatio="xMidYMid">
<path
transform="scale(0.5)"
style="fill:context-stroke;fill-rule:evenodd;stroke:context-stroke;stroke-width:1pt"
d="M 5.77,0 -2.88,5 V -5 Z"
id="path135" />
</marker>
<linearGradient
id="linearGradient4"
inkscape:collect="always">
<stop
style="stop-color:#ffffff;stop-opacity:1"
offset="0"
id="stop4" />
<stop
style="stop-color:#ffffff;stop-opacity:1"
offset="0.36767325"
id="stop6" />
<stop
style="stop-color:#b3b3b3;stop-opacity:0"
offset="1"
id="stop5" />
</linearGradient>
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient4"
id="linearGradient5"
x1="8.422595"
y1="74.255554"
x2="48.759907"
y2="74.394501"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(1,0,0,0.4234772,0,41.532591)" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient4"
id="linearGradient6"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(1,0,0,0.4234772,-186.98905,41.532591)"
x1="8.422595"
y1="74.255554"
x2="48.759907"
y2="74.394501" />
</defs>
<g
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(-6.0758843,-41.482174)">
<rect
style="fill:#b3b3b3;stroke:#333333;stroke-width:1;stroke-linecap:round;stroke-linejoin:bevel;stroke-dasharray:none"
id="rect1"
width="42.189392"
height="26.216751"
x="74.883568"
y="60.04607" />
<rect
style="fill:#b3b3b3;stroke:#333333;stroke-width:1;stroke-linecap:round;stroke-linejoin:bevel;stroke-dasharray:none"
id="rect2"
width="42.189392"
height="26.216751"
x="21.9669"
y="60.04607" />
<rect
style="fill:#b3b3b3;stroke:#333333;stroke-width:1;stroke-linecap:round;stroke-linejoin:bevel;stroke-dasharray:none"
id="rect3"
width="42.189392"
height="26.216751"
x="127.8002"
y="60.04607" />
<rect
style="fill:url(#linearGradient5);fill-opacity:1;stroke:none;stroke-width:0.650751;stroke-linecap:round;stroke-linejoin:bevel;stroke-dasharray:none"
id="rect4"
width="44.133179"
height="27.703424"
x="6.0758843"
y="59.434734" />
<rect
style="fill:url(#linearGradient6);fill-opacity:1;stroke:none;stroke-width:0.650751;stroke-linecap:round;stroke-linejoin:bevel;stroke-dasharray:none"
id="rect6"
width="44.133179"
height="27.703424"
x="-180.91315"
y="59.434734"
transform="scale(-1,1)" />
<path
style="fill:none;stroke:#000000;stroke-width:0.7;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#Triangle3)"
d="m 64.696622,73.154446 h 7.104642"
id="path6"
sodipodi:nodetypes="cc" />
<path
style="fill:none;stroke:#000000;stroke-width:0.7;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#Triangle3)"
d="m 117.6133,73.154446 h 7.10465"
id="path7"
sodipodi:nodetypes="cc" />
<g
id="g11"
transform="translate(41.511012,64.989937)"
class="fragment">
<circle
style="opacity:1;fill:#ffffff;stroke:#000000;stroke-width:0.7;stroke-linecap:round;stroke-linejoin:bevel;stroke-dasharray:none"
id="circle10"
cx="79.934235"
cy="33.449871"
r="3.690964" />
<text
xml:space="preserve"
style="font-size:6.35px;line-height:1.25;font-family:Ubuntu;-inkscape-font-specification:Ubuntu;text-align:center;letter-spacing:0px;text-anchor:middle;stroke-width:0.264583"
x="79.906754"
y="35.650146"
id="text11"><tspan
sodipodi:role="line"
id="tspan11"
style="text-align:center;text-anchor:middle;stroke-width:0.264583"
x="79.906754"
y="35.650146">1</tspan></text>
<text
xml:space="preserve"
style="font-size:6.35px;line-height:1.25;font-family:Ubuntu;-inkscape-font-specification:Ubuntu;letter-spacing:0px;stroke-width:0.264583"
x="74.513275"
y="35.563065"
id="text12"><tspan
sodipodi:role="line"
id="tspan12"
style="text-align:end;text-anchor:end;stroke-width:0.264583"
x="74.513275"
y="35.563065">State needs to be <tspan
style="font-weight:bold"
id="tspan2">checkpointed</tspan>.</tspan></text>
<path
style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Triangle3)"
d="M 79.977143,29.634024 V 9.5097307"
id="path13"
sodipodi:nodetypes="cc" />
</g>
<g
id="g13"
class="fragment">
<g
id="g9"
transform="translate(-11.405656,12.073267)">
<circle
style="opacity:1;fill:#ffffff;stroke:#000000;stroke-width:0.7;stroke-linecap:round;stroke-linejoin:bevel;stroke-dasharray:none"
id="path9"
cx="79.934235"
cy="33.449871"
r="3.690964" />
<text
xml:space="preserve"
style="font-size:6.35px;line-height:1.25;font-family:Ubuntu;-inkscape-font-specification:Ubuntu;text-align:center;letter-spacing:0px;text-anchor:middle;stroke-width:0.264583"
x="79.906754"
y="35.650146"
id="text9"><tspan
sodipodi:role="line"
id="tspan9"
style="text-align:center;text-anchor:middle;stroke-width:0.264583"
x="79.906754"
y="35.650146">2</tspan></text>
</g>
<text
xml:space="preserve"
style="font-size:6.35px;line-height:1.25;font-family:Ubuntu;-inkscape-font-specification:Ubuntu;letter-spacing:0px;stroke-width:0.264583"
x="75.052376"
y="47.658699"
id="text10"><tspan
sodipodi:role="line"
id="tspan10"
style="stroke-width:0.264583"
x="75.052376"
y="47.658699">State needs to be <tspan
style="font-weight:bold"
id="tspan1">restored</tspan>.</tspan></text>
<path
style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Triangle3)"
d="M 27.060473,-15.336639 V 6.9043202"
id="path12"
transform="translate(41.511011,64.989938)" />
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 8.0 KiB

View File

@ -0,0 +1,261 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
width="183.93697mm"
height="118.02839mm"
viewBox="0 0 183.93697 118.02839"
version="1.1"
id="svg1"
inkscape:version="1.3.2 (091e20ef0f, 2023-11-25)"
sodipodi:docname="NotebookExtensions.svg"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg">
<sodipodi:namedview
id="namedview1"
pagecolor="#ffffff"
bordercolor="#000000"
borderopacity="0.25"
inkscape:showpageshadow="2"
inkscape:pageopacity="0.0"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#d1d1d1"
inkscape:document-units="mm"
inkscape:zoom="0.40273357"
inkscape:cx="307.89586"
inkscape:cy="331.48465"
inkscape:window-width="1120"
inkscape:window-height="651"
inkscape:window-x="26"
inkscape:window-y="23"
inkscape:window-maximized="0"
inkscape:current-layer="g9" />
<defs
id="defs1">
<marker
style="overflow:visible"
id="Triangle"
refX="0"
refY="0"
orient="auto-start-reverse"
inkscape:stockid="Triangle arrow"
markerWidth="1"
markerHeight="1"
viewBox="0 0 1 1"
inkscape:isstock="true"
inkscape:collect="always"
preserveAspectRatio="xMidYMid">
<path
transform="scale(0.5)"
style="fill:context-stroke;fill-rule:evenodd;stroke:context-stroke;stroke-width:1pt"
d="M 5.77,0 -2.88,5 V -5 Z"
id="path135" />
</marker>
<marker
style="overflow:visible"
id="Triangle-1"
refX="0"
refY="0"
orient="auto-start-reverse"
inkscape:stockid="Triangle arrow"
markerWidth="1"
markerHeight="1"
viewBox="0 0 1 1"
inkscape:isstock="true"
inkscape:collect="always"
preserveAspectRatio="xMidYMid">
<path
transform="scale(0.5)"
style="fill:context-stroke;fill-rule:evenodd;stroke:context-stroke;stroke-width:1pt"
d="M 5.77,0 -2.88,5 V -5 Z"
id="path135-2" />
</marker>
<marker
style="overflow:visible"
id="Triangle-6"
refX="0"
refY="0"
orient="auto-start-reverse"
inkscape:stockid="Triangle arrow"
markerWidth="1"
markerHeight="1"
viewBox="0 0 1 1"
inkscape:isstock="true"
inkscape:collect="always"
preserveAspectRatio="xMidYMid">
<path
transform="scale(0.5)"
style="fill:context-stroke;fill-rule:evenodd;stroke:context-stroke;stroke-width:1pt"
d="M 5.77,0 -2.88,5 V -5 Z"
id="path135-26" />
</marker>
</defs>
<g
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(-4.2232184,-32.921722)">
<rect
style="fill:#b3b3b3;stroke:#333333;stroke-width:1;stroke-linecap:round;stroke-linejoin:bevel;stroke-dasharray:none"
id="rect1"
width="42.189392"
height="26.216751"
x="46.134819"
y="41.674355" />
<rect
style="fill:#b3b3b3;stroke:#333333;stroke-width:1;stroke-linecap:round;stroke-linejoin:bevel;stroke-dasharray:none"
id="rect2"
width="42.189392"
height="26.216751"
x="46.134819"
y="78.716019" />
<path
style="fill:none;stroke:#000000;stroke-width:0.7;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#Triangle)"
d="m 67.229515,68.360195 v 7.104637"
id="path6"
sodipodi:nodetypes="cc" />
<g
id="g10"
class="fragment">
<rect
style="fill:#b3b3b3;stroke:#333333;stroke-width:1;stroke-linecap:round;stroke-linejoin:bevel;stroke-dasharray:none"
id="rect3"
width="42.189392"
height="26.216751"
x="46.134819"
y="115.75767" />
<g
id="g13"
transform="translate(-52.325262,113.08537)">
<g
id="g9-0"
transform="translate(4.469344,-35.551734)">
<circle
style="opacity:1;fill:#ffffff;stroke:#000000;stroke-width:0.7;stroke-linecap:round;stroke-linejoin:bevel;stroke-dasharray:none"
id="path9-9"
cx="79.934235"
cy="33.449871"
r="3.690964" />
<text
xml:space="preserve"
style="font-size:6.35px;line-height:1.25;font-family:Ubuntu;-inkscape-font-specification:Ubuntu;text-align:center;letter-spacing:0px;text-anchor:middle;stroke-width:0.264583"
x="79.906754"
y="35.650146"
id="text9"><tspan
sodipodi:role="line"
id="tspan9"
style="text-align:center;text-anchor:middle;stroke-width:0.264583"
x="79.906754"
y="35.650146">1</tspan></text>
</g>
<text
xml:space="preserve"
style="font-size:6.35px;line-height:1.25;font-family:Ubuntu;-inkscape-font-specification:Ubuntu;letter-spacing:0px;stroke-width:0.264583"
x="56.00238"
y="0.033697922"
id="text10"><tspan
sodipodi:role="line"
id="tspan10"
style="stroke-width:0.264583"
x="56.00238"
y="0.033697922">Explore</tspan></text>
<path
style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Triangle-1)"
d="M 87.571736,0.03230374 102.8876,11.893201"
id="path12"
sodipodi:nodetypes="cc" />
</g>
<path
style="fill:none;stroke:#000000;stroke-width:0.7;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#Triangle)"
d="m 67.229515,105.40187 v 7.10464"
id="path4"
sodipodi:nodetypes="cc" />
</g>
<g
id="g9"
class="fragment">
<rect
style="fill:#b3b3b3;stroke:#333333;stroke-width:1;stroke-linecap:round;stroke-linejoin:bevel;stroke-dasharray:none"
id="rect4"
width="42.189392"
height="26.216751"
x="109.6348"
y="41.674355" />
<rect
style="fill:#6c5353;stroke:#333333;stroke-width:1;stroke-linecap:round;stroke-linejoin:bevel;stroke-dasharray:none"
id="rect5"
width="42.189392"
height="26.216751"
x="109.6348"
y="78.716019" />
<rect
style="fill:#b3b3b3;stroke:#333333;stroke-width:1;stroke-linecap:round;stroke-linejoin:bevel;stroke-dasharray:none"
id="rect6"
width="42.189392"
height="26.216751"
x="109.6348"
y="115.75767" />
<path
style="fill:none;stroke:#000000;stroke-width:0.7;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#Triangle)"
d="m 130.72953,68.360195 v 7.104637"
id="path7"
sodipodi:nodetypes="cc" />
<path
style="fill:none;stroke:#000000;stroke-width:0.7;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#Triangle)"
d="m 130.72953,105.40187 v 7.10464"
id="path8"
sodipodi:nodetypes="cc" />
<rect
style="fill:none;stroke:#550000;stroke-width:3;stroke-linejoin:bevel"
id="rect8"
width="54.404568"
height="115.02839"
x="40.169895"
y="34.421722" />
<path
style="fill:none;stroke:#000000;stroke-width:0.7;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#Triangle)"
d="M 88.363491,91.676226 H 106.78837"
id="path9"
sodipodi:nodetypes="cc" />
<g
id="g11"
transform="translate(136.66141,95.831963)">
<circle
style="opacity:1;fill:#ffffff;stroke:#000000;stroke-width:0.7;stroke-linecap:round;stroke-linejoin:bevel;stroke-dasharray:none"
id="circle10"
cx="27.017569"
cy="17.574873"
r="3.690964" />
<text
xml:space="preserve"
style="font-size:6.35px;line-height:1.25;font-family:Ubuntu;-inkscape-font-specification:Ubuntu;text-align:center;letter-spacing:0px;text-anchor:middle;stroke-width:0.264583"
x="26.990088"
y="19.775148"
id="text11"><tspan
sodipodi:role="line"
id="tspan11"
style="text-align:center;text-anchor:middle;stroke-width:0.264583"
x="26.990088"
y="19.775148">2</tspan></text>
<text
xml:space="preserve"
style="font-size:6.35px;line-height:1.25;font-family:Ubuntu;-inkscape-font-specification:Ubuntu;letter-spacing:0px;stroke-width:0.264583"
x="33.12188"
y="19.688066"
id="text12"><tspan
sodipodi:role="line"
id="tspan12"
style="stroke-width:0.264583"
x="33.12188"
y="19.688066">Revise</tspan></text>
<path
style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Triangle-6)"
d="M 23.923653,15.181444 6.6687291,1.9874655"
id="path13"
sodipodi:nodetypes="cc" />
</g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 9.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.6 KiB