From 53ff2f8b053ce757f1e9bab4faf0d821cfdd4b84 Mon Sep 17 00:00:00 2001 From: Michael Clerx Date: Wed, 18 Mar 2026 21:32:37 +0000 Subject: [PATCH 1/2] Added simpler schematics (omitting parts that disappear in the simplifications but were good for derivations). --- tutorial/img/vc-level-3-post.png | Bin 0 -> 17219 bytes tutorial/img/vc-level-4-post.png | Bin 0 -> 13289 bytes tutorial/img/vc-level-5-post.png | Bin 0 -> 12854 bytes 3 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 tutorial/img/vc-level-3-post.png create mode 100644 tutorial/img/vc-level-4-post.png create mode 100644 tutorial/img/vc-level-5-post.png diff --git a/tutorial/img/vc-level-3-post.png b/tutorial/img/vc-level-3-post.png new file mode 100644 index 0000000000000000000000000000000000000000..4fdd584d2348e99f4ae602f006fb276124497973 GIT binary patch literal 17219 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

h3(9HM6(Iv0!FfKMejbu$KKkGP1GT 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 C7`#vb literal 0 HcmV?d00001 diff --git a/tutorial/img/vc-level-4-post.png b/tutorial/img/vc-level-4-post.png new file mode 100644 index 0000000000000000000000000000000000000000..2683680f925a796b54231a0fb0a49b5019293151 GIT binary patch literal 13289 zcmb`uWmJ^k7dAY!lsX_?{ss_1Qb9V@K^i26Zj_XvrC|`10SW1pk{nvPN2HMuB%~Xp zL%QC>f4%Qo@5krE!&<}SeV=phbN03OzOH?Tyi%1TC!r^SKp^A_@^B3Z1SbT%9=$~f z{(D!wW}6#FHs>FRFg{08Fg?#^q2v~#gAb9}?= z;B1w$EkO@~+=nQ@pJ{odZcTeP{&u;-?v0&$Z%=Ev{`&9`UYLK^NL9VgKAN{gNk8bs zp4+x6<;`^T#!KsI=P}t^<(XQx#jvllXALBrhYnX*HeDhe$h;0EJvp*RqSf7;*QGQ=gr)5c>6hzW2&eaD>5wn>p% zD06-L?n;G1GvZC%aaA9oMAc#C5x!)J1Z0{cNbKV|Tcx`liMo1jn(O%-FnieMHL(c6 zi40<_!Pg>yjyPg~RuczYCix_)BA^1s*g$pb-b6xtMlCQ{DtpMi3`_#Gn;|?I=lX8c z8K$0^mey?Ui$F(gB6|pl45Ec5${>If=@lW1J>1@Pp3^x#pkQ#c3gaZ+n0_55@PO<8 zeNv(TOPckKEouS2WCJaKM`)p3SH@;`^NauQtN;I-@2(vu%5Zudo{I?9&@Y&?0(Ae&o3OJWN}IyKKCzJS+e`T#UziXT>OGfqfzX{i=SvQH{*5;**?lRr|~FBq|@BTQ~~yl93$4TbKm?wnC~Z% z3ya6MgD9fTVQhgCbH)gxMNM7y2e1QFn#^$7v^OdRad<#6mFIa1r=@97I%lSc+SL{_8~b`0l@*mL%n)_LbjHyNc_HOz=FY%o}d1eDfM788*yvmYb%A;ljn$Zq7r;u z%)~Q9%Rlklp;se^7_qLn``g+h*Jn&I0(-9&S^*4bjXqG{drLUlkY21R@?pwjFng-T+!&k5Gu-q6Zrtq@V~J8Yf@C;7KgGOLS;y z$FnJa^J2EXm5s9+BLAcX?{V(qZ)|4K5olK&RkBG0i^pi^=dglGZiVb-@9F&6&}<%l zBHg9>y=I~!nkX?pB5i!Pia+$4nYuf<_wq200^d-_5B7^1>xn?<#JPBM(8k>3vX9=C*m3x7T84z?O|iVWX1s43eK*Ps z>yAlQ)HG(WP=?1nRY0RtUHV1C=!Lj)5Au|gTFHf{?)DZ~)e;2W;G2eVjtT{21cO-Y zVvP*@JLPq_9_KBQ>r4^#1Z9G7E14~))l57@KJM`ELy5wiBhjxi4*YAe*laXC|(5L&e5;3?UP+{fz}zoAKxJE|GcV~w;{}-<#JSfr}1D2WtO(u zM-vru5z(uKyg3ebxG}a`Tr*=nRqOOSUwx4ln#2k_HZb_G_lcd@Vu1rW?EG(QGJ#zw zK1h-3g~Y(QB7CA_rCpt)AFLSTiEJ&l>zevlBf+r_B2>m)#zW7#(N|7ZO_ag+Y zbdFXu#0xiNs`|F>?YFK^f{u>GMJ#$g#c_q1Xz(aN-fAG!N0br8Te(*nIDmr zvL{I#m)E~FC>O%VCWk~bO+!FoQx4&dqXwbF3ix$eD0>!~v`B#~dY7;DYf6zSS0cv; z*q&@o-;`lDe0GmE=ArNT(VM-6c5Mv*G8a`0Tm`DPT^)zLJ*P2;i@0pxnF~|MesM?g zH#pWX$2@wR@SjV_JnOQ#-fY(+N**;T<;$YNLSb*emz>s&B^(dtFqK>etxv26nvYh(XO;9-hIZ? z3cczn311>HC~b{>*~3AMKtSnk`H++0yo87wWqA;Z=pbrNneqzmF@Ne*N%Oz*{7BBA zy(EgjXqkaCsYeDYQZ05yt|r@+*j#Otwp_`DAG6(aR-O(8t;FuX1~ zAqXt<9GmG=N2)SIxc&)cNdf#efo+0wgXqP}ni;Q01~o_?XM+~0YFwrK;)UauYu^*= zt!%^6R!dcRRZc|otC1Y+(8EqC%N>Sd&RrTr6N!f+JdHrLe7ihXqF{Yx$oLUVyw!i8 ztLr{1D=V+lydo9YkGF4Tw_aF^Y<|-lKM+%?iTguKXm%%&tAZqf?YWj)_^g1I zHY|GHb0+=C=@n2 z_w?&LY9-~{9W`+14kD&R?n{&=pbZN!!R8x69F5(Bb-6*aD61w&CYI?C9!8qyYu3?x)RgqItbcJ-ih~tJKBPUF*UeCs^el~Jf{As!?;o4N4iy<;TB}Iv! zw&?Fff^w>?b>Yc3ZhIoJ*a_B}n@C~Z30n)EKYSN04}9nv)gtM<%P5DsuK3Jz*5aa}E*Bxd@&})nF!( zmYa{j*a}S?+w(Kv`$%NTs(Dk#LE|=T$OIwHqfqqVDTpNb7}aD!g*#$v8LhL5?e^ze zd=DRfUcjts9g0JfaDB2d;=Sy22cefjMG>Y|wkS&)-cu4wqS22TVbj#jir^{B=7~#SGKK_XgKP~r2jSGStEzdUx zoqH=BvqOoMUZiuFu6Ik~H+%kY`^QuJiPt%y&e3IT|G^v}7SD&RPIzd^nrX=h?e5)U zd=-i$U?f%!b^bfhK6Uo7N9?4tO3wA+6!YFnio;Ngzkk2j2Dhr{^1aa#quzEJlb<;W z#y$D!U**-*;|==Y=^SaxqI`QFLSQXXz(VkKdngqMiU=n0cSRr1L2~l@ zK;nz2OKt~7r_^}e)0lbg^wMzgqMjVz6=a^!^y7v0PlsSaVW)1PBehP8mG8DDaCB__ z==0YPHg>&bq%U@VJeFjEDuk|Tsy_vJ^uk}%5t_!>BY-tRh;qGzRID32 z31|%OuH#ew)JFhQFOa@ z@jWGns+OrTKkbE)EGC(_3K7O29FZ(!$IJ_RT9Os!qeKC7#-LLTdhAN6q30R$uwN6b z)ef_&;LnixM~71E%-P|_-^m)j%dn6pAOFl$Thh6P;%Gb;9|2Uzc%+UhC; z!>$LHipL;Mz<3_r3BtLz~twC>B0`olQj-jtwF@+M>%^D&TGB)m#Wn{;KEsmL15Z%E{|CMvI5RVn57C zTfMxsbap95bwD3qFkfFgmgT-PlR36Plo2yKAdIMnH{*mVQmEmSLVN@K@r3IyzfPBz zl%yYOkt7Yc{CKBjXZ+&y;Dy41nxFLQ^8tSj zM^(;Jo^S5MPX;8usw4|?{t8|I3-E6)@Q!M7nvy{C?d5p3Ruh^H9K^T2*c zbW|kj+J)segc9`~`K>Vt`^zlhojY-M1E%DV(}!}D*{OrhigDLZQAx?7Czf+*X=$+1 zMst0%SP4Wm-3m)`7Qd7Ks%*EuFjg8jd7T?+R;|yx>-hKY(heReedS?0f_bw=p$@n9 z7HNXjNXBYe-_8fW(=(6_qex<-hA^;hI^e#p>u&16`HEr(#DSnA@dDG>S9XaRi)kPJ z>Ytg{p{b<>;E=|He(|?cwNZbE^D4}K5K3MC8@|k)LA!P13>t#VUNWI*y5uuR$OW7h+IE>=4TC7p<=06~3hkzjS`YDR47!XeSl7ddvA1T9$TUB~ zxVs=!9dPNev^pAVOVRQtKOG`*@KEY7XZftO;E;z2v@3Q1y8}glyDI+P5?Tnnd}_Sl z{-$1?pd3sGVA^w#MQ7dPL`>l;tNac;y;4y|_&bj%mxgw=V>gicVbfSXEEUZ8OA0^V zq{@Bj`Xi+|c46VLJvC&L*Wr6P7GGDgJm!3x;oQcH{oZpwmM4~EJO#*5J(uHrj;GzBk>Ma}Swu>XD&EP74a*^c7CeCQER;Vtl{iUa%dLA#GzF97 z!wWYgHbY|wQSY#pV|YtGbLKT{3l`Ym?FsP!fA(Hd{Xexw=!mEZR`a-+m>=bx%nduo zUn8ZwOj6)gwj=qPdHsH?HE;iX)2LGNNOQ;j`^)h3ZH7sUpSBk|#v`5!o*isZ_V*>U zK=1vA?Q2WRW;U1sN;YlPUP(#mJh;&7IC7R}wYyqxCzqndcnjit_BXG$SWb~`HQnD& zqi<0wtto}%)1XU1^6Y@LYN=V>F*5Y(qCjLf+I;G8|wO4_}Mj}7-IEJIVEo!T`wx=5g z(gkfaR_Lr!p8-Uz+ifMKlk{@6)YqRF+_gQTI0-c1tWZ|e0_Dz&fZhOi#9_)esoH|O z&$pn&m#ymgM&{38ER%OYez^h?bD=XJllk0?U1T|Neav0Re#; zW_{B`G9sk(l{dUtzp4?+s#w+UTR;%_Y-nic7C!Em#ik6E$KAcX7HflF-rCw5e++#?4@rPmR6P=*T9a+60A;aM>;_j*^SLZu6 zqeXw3znJ(QQl+g@;Rk+4MDaS?msc3QJqVzIFO`%bAlEA&smLJu^%#soiT+!$-5~Vl ztC1vi)<nyO{LutKV{+y4 zcs2oSwoRH|w=tsx0hbkJ07xU(VE0PG;qf^+IYPwvxYCfF!u2AL4hzL)h723JlAT); z2G(r8Hf>KS_+)keerGv7J)QDg{c?i=T(A_B9m37LXl!E!lS*oc=(oV0BhM1k%^Qze zbCeRAM;kp4rozI)WS%{HrvLI~$3}omM!s813S|EBYXVO22PEmm+IEWqd`On9Q^m?P zX5+v5zG4`yufiPd<0GMr;J6IDv9j9Ht8;!6rRRIJ`6oFojag!^jndu7 zZ3Hn>VQ==ebNgCa#8c*xbK-yzbj|HE@d zair^xd(Hhgm-c;xK{RB-^39v#?(S|*>#-7}D@`>?s$u^*HR;RB*&UbF{tD-R`D886VM2w4f?pY9qCG~32ueWhIjWfn8aN3e^}4hCn^MxH!|~J!VvcG&)Nab@@hgn~`?7Dx5)hX6G0r+PfeITW06w zU8kd8w?BHxA*mR6)qvbCm;qC~E%9~RADcLIvRN^3kCuvzFj8lP&aYGRS05;K;&}`R z<-%wKFsio*13Tlhy*TOe*O_(f8z6v~)J1gG{m^OPyYG#9h7lXxx^8;JV^4VYGKtqF z-P)ewn&@I$(z+r}3c;JaeQ0>NFr-TZ`nL%4sMlF~ES&o{DV8#d z57mosBi@#N0XN3yCExjeA0}64Ozzurk*)lu+7Lmc>-^9kI>B6`IYKO8m>jF+mY0&2 zzkAia-RVy?Ve%@veTHJRrb#i5%gWg6Z%)#l{N382_Vtm%VNfT;egs~zXi=Lj;$BCX zH)uCRov3A9AGwN(fDN&|ou$IwLl{v8(<(0u_VHxBCeBKgeJIJ8&_fJ^DxQZ(4u49wbhlZ547Kls>dz~x;)_=Y&E5IIqFWyDyM`5BOa8w~zy)$GNU(h})ge6ma-m5ju zZN;8u$_4qhOMlLlr?e`EUclIk*vi3vAqNm~yQ5)3N)T!&`Yw>WF=D?0St~9>Gge_k z;$4`=dpAlO=A4I~VucCGE^$FU72#a%VL2Ua3?S62*eFq`6|VORq}D{D83o+8r*c4{ zsnfAL|AT#0)-p5;Gvz+(`+akBa|AeVlp-#B$c|NpqyJJ4G}njrj>H2PNA2sq#=^xP zLZ-ryZ8tj?|7E{49OZjaUL~18W$7>acbA1Y<-In-|6Y_IIMuNoU(3a}f17`vH0<6R zEGNOoeLGnl&Z(KZXZgmCn`vLpk>+8f0KF74V4?-{J$PNQ}FU43L=D4f|I~#b(3s0_I&k^AQ#rnEF;!+;r&$B%xKlPsGU|PeA zDjDNfjA57_U_iL}jh7Gn@OqX+@*MuM?z`h(Y%!LGU2kkWRyAnog*2FHr1Qo!8!UXP zm6`*O2=Cfu`X%MO|BmKLg&^d)UnDo;?7 z-l5yIgWuB5xK z-ZS@V8QXu|Y(c=0DvsP#9iZTbZQta=j~r7l5egotIOPz4(WC80iW(zAu%X{PZW9do zJ1dVJjB>3lYFM8|T5#1+sUP{%=6DG~-g2%c!u}91o$uBfeA?jD?MlMhMRlkFmn5q^ z9isR;g-Mx$Z3&~hqytt1EVP97b?_}ThR?B#bHB@cC#P&*N7c)vz|dV!N!%K0h61m9 znn;TgC+7MPfcW5YZ-RpxLP@g7s~dPqLwBNXt+CS`ycb%B zozFYJ1qcV2VUqJz?>_j>+w@Oky4pUa_IhIj;np-OfUtbJFu_KJFe0yn@P2YUkr+EQ zi@KAUg#V}9LXO!n3UgGBKQFCB@qkW}rP@-iwl{$0?JM&SMJ`0Zjql*YT*r-L}@&7ar z>e_J?qkuwNucsIIH4<-y{9B*oI+x9;Jkax6;&leX$osOboL_1C)I*R{lR#B zoyB3$gz71@vaut`aV@6rZ6rWS^KGr`;}`Y}iB}<011l= z6`Z!dq}K?Qj#xY;iU{;Sf*D5^F~~6v2ZZL7F_{yN80p*jS9YU>{K|O?NPbJKlT+g| zx(pxcoQYN@>UoU&&mSXJ8dlCO`KRF)_6M?QH3^fv>aN@&4RhxHO!`)5B;g{WGuF80 z0db8~yQGt$Q=ww)Wn?W?yCQ3E-)m1Zx&=k{z-j7#5)L3t;^i6)<)6T_MF;7+4kdP6 zg+CJ1^fv*)HNHmy*E9{2#u&*E(lv>U|K&It(2;YAqKwK5NZv#9AzZg6;y|+I0g7(B zD(hcal<&XKslc*qY-~uuD-K?ppRY#x{5t9RVA0E0@${!mN?C9v62Q|FFRiTPx@}J- znf>_qH%*dVujx12S1mP)Jy*)Xq3}(DaRNiDS(H+)>?djoP{BaH0V-PR`ocx(Y>hQZ z%+0o!VI~)J4^Z0P^a7k7tk#gQlMfuk<4V^jV-6~ecf5ml?{jc)j5qswmjcPeb!{*JNU%9?EG=>QeNG&KfF=c21#@*D)`@3@ zS2YzDD}BPG!&PY9Bxcm`F2`=HWXk{g@>4p&t>gsZ>Lp8F8}z95lXAxM41emim|Hjp-^Lnt%)!Q(vkb zhsJB2Sf5z_GzE0_em6%t<3XSBtf0<_-4t25pW2!*r8QvdJ%M0XJ?S2V7IbZ@p9!%T zXsD%#`Vp|aX>Wb|-TLqDjj6gPb#-->_LHMZYBiAr2MpfA*%1Z-*Yyr1ajoBpSd;-5 zzBW=wgQ{^_e0fuH&4CQX_mcuVIkZbtX6)zBpQbg)>BiAw15J?3?eFiOfL!AV2*J}x zQ2dGvA2havc7uT`Jesd32pd(`O;n&mCTOV8eBww=X8T0tb zlRNcW)srU&>DQYhK$}Ayy#JmdY}ShZk&JH015ld|pSqYZXLn5A^F9aEY&pJJs0HN( z-R#opYD_``y=0i|lE=Woj2&Qro?V{~_%{LxFh-sj7keN9N|es`1f-2F1ClgzyimH- zwZ!lcB7j@-`v(VqXIrE}_PLU15s?WNx=2qmK1r=70sY!D?N~dUUdUPMbcwPQQK&6o zq|@Z(28wGoP`_zIJ>}u5oX4i&Ax~~j^fH368x%&mRkl=Mr!1c=Mp})RnfV11cvC)~ zEOV=RQF4bcQ0|6`nE~oTmBZ@n^_6?_Q+qG$yY+&+ZE+4()6>nNYYI0tw#-V0#Kiwn2<)^BvPpq8RGJ~Ce3Ur<@ zB`csFC$Is<&Xj$SMx;%p@%Ss+^^+R9;Mq+=@ePoJ+;^jVgqPvhV6Pm&mv&$jb+`=_ z6Xg~}fKavSj9~itMLa={*)s?zfTKHQt%o?qF6^PBVB`K;PB7ViP=DDsqGQqrHuq1U z+A0Db&3ZVO+Abc{XO zo4k)#&Uadl#RX&Tzfrtlhf|izYcOdA7~%YNI;{M$oVJi(<^w)xL0Vkgp`WU1|G}7{ zOWzJi3sx?7f86<*A{=?X-N4tN{`IAQcTdk*hswD+bEJPPdP;}+m{$$xTvtP}C40BiJ zs&=@)siF$nQ;$n9QrgKP=5cXxLV#iWSOxIB2sjR$7FnYIk z<99-j9&H@_`}Z#%I{~x;Ww*lFI5#aM<=j(Y5)ocF8_gP1>ACFV*Ijpk>$L)oTNUu| zCr6VG1$q_Z3NDg!y3kWA(GOI{hr>i7Oc{WJK#DgZP zN7|{mnCaH$3?Z)0RSK0uT~+-$XZDthebQAR)inD~H@I8<9m-*J9eh?UHEJUz(enE9 zqB~?yW0dU|?@(|ZW(7|zVZK=u8`YkwNp-8kapu1_XjU$$C~Ym5q~s+TLegS?soU7& z{Vg4!@)!fguM(8Iho3DXL|3Lj4wMJvhvsguEz}HwJq}^cp%`AiNRi$-cunj^<$moc zkcs1Ih{);NnvQ3BD{Y3KxYR|>WNpi!C2H43RAS(f!uz`!$#(|$=zLyvwD&~6)B|$-{cV@w{B`aO z8?wB!=Wx~juC9|Z;7p>D-bX*h4u5L`RU?b0yHLN1>tJ<2jr6*V?&(`yZBVB)0sgiH zuToxSjlD_(F%Y>7*D+%WJM5Tun+T9W0jN@M@=`W&48$gscOW!i`@(a)#~aEu*1uWp zMvFpD=4&nc=)I0MyLoD+TEWt5FEs%hQE83PVS{Dz^M>y%9~x#k4LcV-+-|(lbAJ9* zZa!OobX)S@E5|Rln=kg2wBlOr1)&dj9S}^kd4u71dXm{jaSvIU?nZfG>iaLJZjUce zbBeabJ&qu%$4iIjmniDPoL>P{iT%XaT-yOKX_0EXTO+o0_9fsyJTLY-p8%!iU22NZ zzZmCRqMQJABY;~BXTBgx^VwIR7qpfEir}o-hZKU;#RuCKppAynd$aufe~NU!=qjVC z_?FQ1`C;A8$XO=P|*ASHlH_au$ajbUdzHiPnr2vEg<)$IfwAx!g zkg`4l-cmk`bL@ zbedWCP!*8lh@Nj&9HYDBU_;Wp&|Fl@)nVz|@v?yVAHkYHZOc_l_mde@XX(T3f2Y|w zuqWa0qp-Bu3+s9x^mW~t^*iU`(XX5fAYwLcLqpH2P5e&Zw739Nb<;vjwfX0-zbHAk z)9?nET6=Z2;W__-Mz`FY0BEWUQF6>?03!W@Eh(~#*h7K?KERwwcL7BW&wj8gQP##D z^;sBks0U5L`G@;49~0UoRAS4?zP=+dU^fih@Mlp`QSI~rAlB4aglz8#PrD9l!XC40 z;TCoQJ+PmrhHcqu>Ft~uV!D6k&Ort`EKR_ogX#L}xaIFm(|I#xq|});=uG*ZCHv`i zZ8v*@;kTVt9)oH}5XA8%2MmA;Els-R&K~-P*h4jE#gjRZ=#J&?+^i*)!nf_7+|)Qu zP@Fu5)s{`A&ckFnST>L(Si_h26XZjk%QkY<4X4*} zh22~X0TT+g29g_nEK>)>W`Vck{0@L5WC|eOYpe2#qqvb~dBg>);w1jlmPQ>?o2|La z;DDK2<2hJb2S=_Usvs|JiW*z41+qI9Fx0{p1KXPY9Y5K@ckL z<=Y|eS}rbpZd|{wx3?Fl?rU50N=o#@zh9@%{Kt$N009)~xL?AuEP?~w)zjG6SPmou ziFYTv^WQ;p LJqvV7nGLGn&Nu8dF9Ic!-0$*mEN#`(z-V$()34ny76AS^(|ZLR zVg(9J{r%0=Eo6qm+Holb^abdf@q+%vPpvfl{=R~mTX&GZr+_JdyN1_Aa1xb+ZDZ4| z5iP*S#aS6h9{@|0B;_lX?ssP62zEwuzhM!^r1md@*PzAkk_F&K48z&uyC4Uy!Je4% zpXffmPM`5R-;w|x`F&VTdb+o-4^Y6ooCtDj3f6+v2nEZM`O6mMCwX`pq3wie)_72K zYhJov4+scASpSIp^G$YKT;J2;{@p}EWumJstJIPg9lEAPXf2l~ol+YZ!*e3sfY&<( z$I?28lm?&Eecs*#K55UNi2{EiK!hbt^*j4(1G2_kK&QnEhJi-Ubea3up&X@CkieY) zsU{H=H;xA@eazl5t+_Jy`6t8mP9EO9^fA1r50u-9ru<#e z>`EGvoSTaevQkNYlT1$Ec?GTGPNI|*K}^pZAM0V!yV>Q=%RR_PIwhMYLrQ#lL;0Ym zHPKnKHG3B^FM!|8t@!>{-Qbs)$04v(c5+J4j!Z!r#W;3Qhz)-xss}H@ZB`%YB4s?; z1m;_q4`!Je8*BtfyqkU3Rx^?L7JjqBQS@_x+k~x?$!YjAjstwzX@%EnHqhvohz!Zk z4Pb0uFt)^B&?BKpB(k3W^{C1QKaex#Kn2Q%xK@>Y{m?N0leX#3{VPbw&_ws6w;_%M zVNmYY=0E25VbVB15QhXU z77CTS+5f?eP%*7uKH=pN3v}-hIOlJ-L@iO-A_0RfE69 zX?o(CY2A%FUQnz-Xh(&lf-Q>vYON!FsbK^X6QOj=_afrQNvY!ye*x&D#fL?wDU(NF z&f?HN2`$^q3N$UkLXt|q>coVgvp;oBBkLpWVUP9TS$uC(J@8OHwc2F@9dg>yCw+s@ zW6Ca>t?$D)Xp;A*Xl@F8vW~T$hTYx5|!0`{#r_E>^Ie)OfKMHr_x z7e@#Ssx-iZr!s}Kr~Bj3;Ulg?@Z}ZW;3P$mK<;CuKhf~Uf_3dVALwbYfk^}6v7j!4MObn!Bo)6gA49OcyCw5t?p_A@E(Xn5 z%w8mg(Hc>iH}u^Pr7(U6C|d5k&&njAZ`hF4?1hf(sRVyle3KA6JB%hfC#UHbpm!ue z9D0(g`la6P&$l-Xq$DI_1?v~El8qfN(JFkg!gY$8Yo$4Q#Fq`f0j-f~_J~3Xju64) zU?U1oWRj-EkrQ5WGR}t9p-#)9K!Fn6kLW@G)JusV8}KENU@qXv8WchpF^rF4COF?- zKc9mkE+4q2VO|!(!u_s6icCTo#jIYB?_Ywk^S#wgYhez9jRZ(yl3A*EJm-`UOzbcs zyiX`rMg5*Cws~|H@;+;8rZMI${?31N7Rm)7@)mO{b2M}Ob1axMuaF%J1#`YJ$)_3$ z3wEHHH~4dyK<-aCz)UVaCvW`!-IsE&J$ISEgO)N5bTEerr~}IN|KgiV>2AX3%l-JX S8{jq_h=QytyyUs*`~L^3(iF=8 literal 0 HcmV?d00001 diff --git a/tutorial/img/vc-level-5-post.png b/tutorial/img/vc-level-5-post.png new file mode 100644 index 0000000000000000000000000000000000000000..ac1d5fbfcedf4099bf01c6573d75c4f8e2793aed GIT binary patch literal 12854 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 Date: Wed, 18 Mar 2026 21:38:44 +0000 Subject: [PATCH 2/2] Added link to model tour in readme --- README.md | 4 +- tutorial/tour.ipynb | 355 ++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 358 insertions(+), 1 deletion(-) create mode 100644 tutorial/tour.ipynb diff --git a/README.md b/README.md index 393b887..c63bc78 100644 --- a/README.md +++ b/README.md @@ -27,9 +27,11 @@ Levels 0, 1, and 2 can recreate the _fast_ artefacts seen in patch clamp experim To fit experimental data, these fast artefacts are less important, and so **level 3 is good to match data from the fastest currents**. For slower currents, levels 4 or 5 can be used. +**For a quick overview of levels 5, 4, 3, and 0, see the [Model Tour](./tutorial/tour.ipynb).** + ## Tutorials -To understand these models, we provide [four tutorial notebooks](./tutorial/README.md). +To understand these models, we provide four [Tutorial Notebooks](./tutorial/README.md). The first derives a basic model of a patch clamp amplifier, and the second adds compensation and filtering, leading to the "Level 0" model. In the third notebook, this model is used to simulate the early stages of a (manual) patch-clamp experiment. diff --git a/tutorial/tour.ipynb b/tutorial/tour.ipynb new file mode 100644 index 0000000..6192c3e --- /dev/null +++ b/tutorial/tour.ipynb @@ -0,0 +1,355 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "cf0eda98", + "metadata": {}, + "source": [ + "# A quick tour of voltage-clamp models\n", + "\n", + "The voltage-clamp models are available in different levels of detail, ranging from the \"full\" model (level 0) to a greatly simplified one (level 5).\n", + "Here, we provide a quick tour of the most important models, and provide guidance for setting parameter values.\n", + "\n", + "_This notebook presents, but does not derive or explain the models. For that, please see the tutorial notebooks_." + ] + }, + { + "cell_type": "markdown", + "id": "c9f1d4b0-093e-40a3-aed5-765ecd37038b", + "metadata": {}, + "source": [ + "## Level 5 model\n", + "\n", + "This model calculates membrane potential $V_m$ from command potential $V_c$, and observed current $I_\\text{obs}$ from ionic current $I$.\n", + "\n", + "\n", + "\n", + "It includes:\n", + "\n", + "- A voltage offset $E^\\dagger_\\text{off}$, representing the remaining voltage error after zeroing\n", + "- A leak current $I_\\text{leak}$\n", + "- The effect of series resistance $R_s$ on the membrane potential\n", + "- Series resistance compensation, $\\alpha$, and prediction, $\\beta$, both specified as fractions between 0 and 1." + ] + }, + { + "cell_type": "markdown", + "id": "db45980e-56ec-4a79-b1f2-935834dcdb5c", + "metadata": {}, + "source": [ + "\\begin{align}\n", + "5.1. && C_m \\dot{V}_m = \\frac{V_c + E_\\text{off}^\\dagger - V_m}{(1 - \\beta) R_s} - \\frac{1 - \\alpha}{1 - \\beta}(I + I_\\text{leak})\n", + "\\end{align}\n", + "\n", + "\\begin{align}\n", + "5.2. && I_\\text{obs} = I + I_\\text{leak}\n", + "\\end{align}\n", + "\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "id": "6d59f32b-7b30-4c3e-b4a2-0484d787cf74", + "metadata": {}, + "source": [ + "| Variable | Units | Meaning |\n", + "|-----------------|-------|-----------------------------------------------------------|\n", + "| $V_m$ | mV | Membrane potential |\n", + "| $V_c$ | mV | The command potential, set by the voltage clamp protocol |\n", + "| $I$ | pA | The ionic current |\n", + "| $I_\\text{obs}$ | pA | The observed (measured/output) current |\n", + "| $I_\\text{leak}$ | pA | A leak current, e.g. $g_\\text{leak}(V_m - I_\\text{leak})$ |\n", + "\n", + "The variables $I$ and $I_\\text{leak}$ should be supplied by an ionic current model and leak model, respectively.\n", + "\n", + "| Parameter | Units | Meaning | Typical value |\n", + "|-----------|-----------|-----------------------------------------------------|-----------------|\n", + "| $C_m$ | pF | The cell capacitance, from the amplifier estimate | 25 pF |\n", + "| $R_s$ | G$\\Omega$ | The series resistance, from the amplifier estimate | 0.005 G$\\Omega$ |\n", + "| $\\alpha$ | - | Fraction of $R_s$ compensation, read from amplifier | 0.7 |\n", + "| $\\beta$ | - | Fraction of $R_s$ compensation, read from amplifier | 0.7 |\n", + "| $E^\\dagger_\\text{off}$ | mV | Remaining voltage offset after zeroing | 0 mV |\n", + "\n", + "In a simple simulation $E^\\dagger_\\text{off}$ is chosen by the user.\n", + "In inference settings, $E^\\dagger_\\text{off}$ may be a parameter inferred from the data." + ] + }, + { + "cell_type": "markdown", + "id": "1fd1aba6-145f-40e3-b757-fa509ffdf4e6", + "metadata": {}, + "source": [ + "## Level 4 model" + ] + }, + { + "cell_type": "markdown", + "id": "d987b0d8-8491-4ec4-96b7-93180d6292fd", + "metadata": {}, + "source": [ + "\n", + "\n", + "This level adds\n", + "\n", + "- A distinction between estimated and true membrane capacitance and series resistance\n", + "- A state-estimator used to approximate $V_e$ in the \"prediction\" pathway" + ] + }, + { + "cell_type": "markdown", + "id": "107f74b6-ed11-4fb2-b9bd-ec57f0940b91", + "metadata": {}, + "source": [ + "\\begin{align}\n", + "4.1. && C_m\\dot{V}_m = \\frac{V_c + E_\\text{off}^\\dagger - V_m - (\\alpha - \\beta) R_s^* C_m^* \\dot{V}_e}{R_s - \\alpha R_s^*} - I_\\text{leak} - I\n", + "\\end{align}\n", + "\n", + "\\begin{align}\n", + "4.2. && \\dot{V}_e &= \\frac{V_c - V_e}{(1 - \\beta) R_s^* C_m^*} \n", + "\\end{align}\n", + "\n", + "\\begin{align}\n", + "4.3. && I_\\text{obs} = I + I_\\text{leak} + C_m \\dot{V}_m - C_m^* \\dot{V}_e\n", + "\\end{align}" + ] + }, + { + "cell_type": "markdown", + "id": "bfa3cb04-e71e-442e-aee2-970c7ab3e975", + "metadata": {}, + "source": [ + "New or changed variables and parameters are\n", + "\n", + "| Variable | Units | Meaning |\n", + "|----------|-------|-------------------------------------------------------|\n", + "| $V_e$ | mV | An estimate of $V_m$ used in the \"prediction\" pathway |\n", + "\n", + "And\n", + "\n", + "| Parameter | Units | Meaning | Typical value |\n", + "|-----------|-----------|---------------------------------------------------------|-----------------|\n", + "| $C_m$ | pF | The true cell capacitance, unknown in real experiments | 25 pF |\n", + "| $C^*_m$ | pF | The estimated cell capacitance, read from amplifier | 25 pF |\n", + "| $R_s$ | G$\\Omega$ | The true series resistance, unknown in real experiments | 0.005 G$\\Omega$ |\n", + "| $R^*_s$ | G$\\Omega$ | The series resistance, read from amplifier | 0.005 G$\\Omega$ |\n", + "\n", + "For a straightforward simulation, $C_m$ and $R_s$ can be chosen by the user.\n", + "In an inference setting, $C_m$ and $R_s$ may be inferred from the data long with $E^\\dagger_\\text{off}$." + ] + }, + { + "cell_type": "markdown", + "id": "dceee631-de83-43c3-af45-7b18abb080a0", + "metadata": {}, + "source": [ + "## Level 3 model\n", + "\n", + "\n", + "\n", + "This level adds\n", + "\n", + "- An explicit measurement resistor $R_f$\n", + "- A first-order low-pass filter in the series resistance compensation pathway\n", + "- A first-order low-pass filter over the command potential (the \"stimulus filter\")\n", + "- A first-order low-pass filter over the output" + ] + }, + { + "cell_type": "markdown", + "id": "d00cfab5-45e6-4588-b0cd-5c1dae9a6401", + "metadata": {}, + "source": [ + "\\begin{align}\n", + "3.1. && C_m\\dot{V}_m = \\frac{V_r + E_\\text{off}^\\dagger - V_m}{R_s} - I_\\text{leak} - I\n", + "\\end{align}\n", + "\n", + "\\begin{align}\n", + "3.2. && V_r = V_s + \\alpha \\frac{R_s^*}{R_f} V_\\text{rc} + \\beta R_s^* C_m^* \\dot{V}_e\n", + " = \\alpha \\frac{R_s^*}{R_f} V_\\text{rc} + \\frac{V_s - \\beta V_e}{1 - \\beta}\n", + "\\end{align}\n", + "\n", + "\\begin{align}\n", + "3.3. && \\dot{V}_e &= \\frac{V_s - V_e}{(1 - \\beta)R_s^*C_m^*} \n", + "\\end{align}\n", + "\n", + "\\begin{align}\n", + "3.4 && I_1 &= \\frac{V_r + E_\\text{off}^\\dagger - V_m}{R_s} - C_m^* \\dot{V_e}\n", + "\\end{align}\n", + "\n", + "\\begin{align}\n", + "3.5 && \\tau_\\text{rc} \\dot{V}_\\text{rc} &= R_f I_1 - V_\\text{rc}\n", + "\\end{align}\n", + "\n", + "\\begin{align}\n", + "3.6. && \\tau_s \\dot{V_s} = V_c - V_s\n", + "\\end{align}\n", + "\n", + "\\begin{align}\n", + "3.7. && \\tau_o \\dot{I}_\\text{obs} = I_1 - I_\\text{obs}\n", + "\\end{align}" + ] + }, + { + "cell_type": "markdown", + "id": "c4845a2c-d7a9-4228-a456-28d2f297be46", + "metadata": {}, + "source": [ + "New variables and parameters are\n", + "\n", + "| Variable | Units | Meaning |\n", + "|----------|-------|-------------------------------------------------------------|\n", + "| $V_r$ | mV | The voltage on one side of the measurement electrode |\n", + "| $V_s$ | mV | The filtered command potential |\n", + "| $V_rc$ | mV | The filtered voltage used in series resistance compensation |\n", + "| $V_s$ | mV | The voltage on one side of the measurement electrode |\n", + "| $I_1$ | pA | The output current before filtering |\n", + "\n", + "And\n", + "\n", + "| Parameter | Unit | Meaning | Typical value |\n", + "|------------------|-----------|------------------------------------------------------------|---------------|\n", + "| $\\tau_\\text{RC}$ | ms | Time constant of filter in series resistance compenstation, read from amplifier|0.01 ms|\n", + "| $\\tau_s$ | ms | Time constant of stimlus filter, estimated from fits | 0.025 ms |\n", + "| $\\tau_o$ | ms | Time constant of 1st order approximation of output filter | 0.01 ms |\n", + "| $R_f$ | G$\\Omega$ | The measurement resistor, found in headstage documentation | 0.5 G$\\Omega$ |\n", + "\n", + "To estimate $\\tau_s$ in a real amplifier, you can record the filtered output voltage and fit to it.\n", + "The value above corresponds to the \"slow\" (default) setting on a HEKA EPC-10.\n", + "\n", + "To estimate $\\tau_o$, you can use $\\tau_o \\approx \\frac{1}{2 \\pi f}$, where $f$ is the filter's cut-off frequency in kHz.\n", + "\n", + "Note that exact values of $\\tau_s$ and $\\tau_o$ are seldom crucial." + ] + }, + { + "cell_type": "markdown", + "id": "f0982179-7da0-49d0-ae2f-a1ce724babe7", + "metadata": {}, + "source": [ + "## Level 0: The full model\n", + "\n", + "Next, we jump straight to the Level 0 model.\n", + "\n", + "\n", + "\n", + "This level adds\n", + "\n", + "- A pipette (conventional patch clamp) or parasitic (planar patch clamp) capacitance $C_p$, and its amplifier estimate $C^*p$\n", + "- A stray capacitance on the measurement resistor $\\tilde{C}_f$, and a finite op-amp speed with time constant $\\tau_a$\n", + "- A two-part output filter, where \"Filter 1\" affects series resistance compensation, while \"Filter 2\" does not.\n", + "- Arbitrary equations for the output filters and the stimulus filter (allowing e.g. Bessel formulations)" + ] + }, + { + "cell_type": "markdown", + "id": "175b67aa-e550-48f0-acea-c7656a812398", + "metadata": {}, + "source": [ + "\\begin{align}\n", + "0.1. && C_m\\dot{V}_m = \\frac{V_p + E_\\text{off}^\\dagger - V_m}{R_s} - I_\\text{leak} - I\n", + "\\end{align}\n", + "\n", + "\\begin{align}\n", + "0.2. && (C_p+\\tilde{C}_f)\\dot{V}_p = \\frac{V_o - V_p}{R_f} - \\frac{V_p + E_\\text{off}^\\dagger - V_m}{R_s} + \\tilde{C}_f\\dot{V}_o + C_m^* \\dot{V}_e + C_p^* \\dot{V}_r\n", + "\\end{align}\n", + "\n", + "\\begin{align}\n", + "0.3. && \\tau_a \\dot{V}_o = V_r - V_p\n", + "\\end{align}\n", + "\n", + "\\begin{align}\n", + "0.4. && V_r = V_s + \\alpha \\frac{R_s^*}{R_f} V_\\text{rc} + \\beta R_s^* C_m^* \\dot{V}_e\n", + " = \\alpha \\frac{R_s^*}{R_f} V_\\text{rc} + \\frac{V_s - \\beta V_e}{1 - \\beta}\n", + "\\end{align}\n", + "\n", + "\\begin{align}\n", + "0.5. && \\dot{V}_e &= \\frac{V_s - V_e}{(1 - \\beta)R_s^*C_m^*} \n", + "\\end{align}\n", + "\n", + "\\begin{align}\n", + "0.6. && \\tau_\\text{rc} \\dot{V}_\\text{rc} = V_1 - V_\\text{rc}\n", + "\\end{align}\n", + "\n", + "\\begin{align}\n", + "0.7. && \\dot{V_s} = f_s(V_c, V_s)\n", + "\\end{align}\n", + "\n", + "\\begin{align}\n", + "0.8. && \\dot{V}_1 = f_1(V_o - V_r, V_1)\n", + "\\end{align}\n", + "\n", + "\\begin{align}\n", + "0.9. && \\dot{V}_2 = f_2(V_1, V_2)\n", + "\\end{align}\n", + "\n", + "\\begin{align}\n", + "0.10. && I_\\text{obs} = V_2 / R_f\n", + "\\end{align}" + ] + }, + { + "cell_type": "markdown", + "id": "7cc410ae-a332-4fdd-9f04-459790d43ef2", + "metadata": {}, + "source": [ + "# TODO\n", + "\n", + "New variables and parameters are\n", + "\n", + "| Variable | Units | Meaning |\n", + "|----------|-------|-------------------------------------------------------------|\n", + "| $V_r$ | mV | The voltage on one side of the measurement electrode |\n", + "| $V_s$ | mV | The filtered command potential |\n", + "| $V_rc$ | mV | The filtered voltage used in series resistance compensation |\n", + "| $V_s$ | mV | The voltage on one side of the measurement electrode |\n", + "| $I_1$ | pA | The output current before filtering |\n", + "\n", + "And\n", + "\n", + "| Parameter | Unit | Meaning | Typical value |\n", + "|------------------|-----------|------------------------------------------------------------|---------------|\n", + "| $\\tau_\\text{RC}$ | ms | Time constant of filter in series resistance compenstation, read from amplifier|0.01 ms|\n", + "| $\\tau_s$ | ms | Time constant of stimlus filter, estimated from fits | 0.025 ms |\n", + "| $\\tau_o$ | ms | Time constant of 1st order approximation of output filter | 0.01 ms |\n", + "| $R_f$ | G$\\Omega$ | The measurement resistor, found in headstage documentation | 0.5 G$\\Omega$ |\n", + "\n", + "To estimate $\\tau_s$ in a real amplifier, you can record the filtered output voltage and fit to it.\n", + "The value above corresponds to the \"slow\" (default) setting on a HEKA EPC-10.\n", + "\n", + "To estimate $\\tau_o$, you can use $\\tau_o \\approx \\frac{1}{2 \\pi f}$, where $f$ is the filter's cut-off frequency in kHz.\n", + "\n", + "Note that exact values of $\\tau_s$ and $\\tau_o$ are seldom crucial." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "2332084c-5e5d-4dc1-aed9-fdc3019ffe8b", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.13.12" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +}