import%20marimo%0A%0A__generated_with%20%3D%20%220.18.4%22%0Aapp%20%3D%20marimo.App()%0A%0A%0A%40app.cell%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%20Week%201%20%E2%80%93%20Course%20Orientation%20and%20Tooling%0A%0A%20%20%20%20Goals%20for%20this%20lesson%3A%0A%0A%20%20%20%20-%20Understand%20the%20overall%20arc%20of%20the%20Winter%202026%20course.%0A%20%20%20%20-%20See%20the%20design%E2%80%93fab%E2%80%93test%20cycle%20and%20the%20role%20of%20the%20openEBL%202026-02%20run.%0A%20%20%20%20-%20Set%20up%20the%20local%20Python%20%2B%20marimo%20environment%20and%20verify%20marimo%20runs.%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%3Cstyle%3E%0A%20%20%20%20.pb-grid%20%7B%0A%20%20%20%20%20%20display%3A%20grid%3B%0A%20%20%20%20%20%20grid-template-columns%3A%20repeat(auto-fit%2C%20minmax(260px%2C%201fr))%3B%0A%20%20%20%20%20%20gap%3A%2012px%3B%0A%20%20%20%20%20%20margin%3A%2010px%200%2018px%3B%0A%20%20%20%20%7D%0A%20%20%20%20.pb-card%20%7B%0A%20%20%20%20%20%20border%3A%201px%20solid%20rgba(120%2C%20120%2C%20120%2C%200.35)%3B%0A%20%20%20%20%20%20border-radius%3A%2012px%3B%0A%20%20%20%20%20%20padding%3A%2012px%2014px%3B%0A%20%20%20%20%20%20background%3A%20rgba(120%2C%20120%2C%20120%2C%200.06)%3B%0A%20%20%20%20%7D%0A%20%20%20%20.pb-card%20h3%20%7B%0A%20%20%20%20%20%20margin%3A%200%200%206px%200%3B%0A%20%20%20%20%20%20font-size%3A%201.05rem%3B%0A%20%20%20%20%7D%0A%20%20%20%20.pb-card%20pre%20%7B%0A%20%20%20%20%20%20margin%3A%208px%200%200%3B%0A%20%20%20%20%20%20padding%3A%2010px%2012px%3B%0A%20%20%20%20%20%20border-radius%3A%2010px%3B%0A%20%20%20%20%20%20background%3A%20rgba(120%2C%20120%2C%20120%2C%200.10)%3B%0A%20%20%20%20%20%20overflow-x%3A%20auto%3B%0A%20%20%20%20%7D%0A%20%20%20%20.pb-muted%20%7B%20opacity%3A%200.85%3B%20%7D%0A%20%20%20%20.pb-callout%20%7B%0A%20%20%20%20%20%20border-left%3A%204px%20solid%20rgba(31%2C%20111%2C%20235%2C%200.9)%3B%0A%20%20%20%20%20%20background%3A%20rgba(31%2C%20111%2C%20235%2C%200.08)%3B%0A%20%20%20%20%20%20padding%3A%2010px%2012px%3B%0A%20%20%20%20%20%20border-radius%3A%2010px%3B%0A%20%20%20%20%20%20margin%3A%2012px%200%3B%0A%20%20%20%20%7D%0A%20%20%20%20%3C%2Fstyle%3E%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%3Ca%20id%3D%22toc%22%3E%3C%2Fa%3E%0A%20%20%20%20%3Cdiv%20class%3D%22pb-callout%22%3E%0A%20%20%20%20%3Cstrong%3EStart%20here%20(in%20class)%3A%3C%2Fstrong%3E%20open%20the%20notebook%20in%20marimo%20sandbox%20mode%2C%20then%20scroll%20using%20the%20Table%20of%20Contents.%0A%20%20%20%20%3Cdiv%20class%3D%22pb-muted%22%20style%3D%22margin-top%3A6px%3B%22%3E%0A%20%20%20%20Tip%3A%20run%20commands%20from%20the%20%3Ccode%3EPhotonics-Bootcamp%3C%2Fcode%3E%20repo%20root%20(the%20folder%20that%20contains%20%3Ccode%3Emarimo_course%2F%3C%2Fcode%3E).%0A%20%20%20%20%3C%2Fdiv%3E%0A%20%20%20%20%3C%2Fdiv%3E%0A%0A%20%20%20%20%3Cdiv%20class%3D%22pb-grid%22%3E%0A%20%20%20%20%20%20%3Cdiv%20class%3D%22pb-card%22%3E%0A%20%20%20%20%20%20%20%20%3Ch3%3EWeek%201%20(this%20notebook)%3C%2Fh3%3E%0A%20%20%20%20%20%20%20%20%3Cdiv%20class%3D%22pb-muted%22%3EOrientation%20%2B%20setup%20checklist%20%2B%20semester%20calendar.%3C%2Fdiv%3E%0A%20%20%20%20%20%20%20%20%3Cpre%3E%3Ccode%3Emarimo%20edit%20--sandbox%20marimo_course%2Flessons%2Fw01_orientation_tooling.py%3C%2Fcode%3E%3C%2Fpre%3E%0A%20%20%20%20%20%20%3C%2Fdiv%3E%0A%20%20%20%20%20%20%3Cdiv%20class%3D%22pb-card%22%3E%0A%20%20%20%20%20%20%20%20%3Ch3%3EPractice%20marimo%3C%2Fh3%3E%0A%20%20%20%20%20%20%20%20%3Cdiv%20class%3D%22pb-muted%22%3EA%20short%2C%20safe%20sandbox%20for%20UI%20%2B%20reactivity.%3C%2Fdiv%3E%0A%20%20%20%20%20%20%20%20%3Cpre%3E%3Ccode%3Emarimo%20edit%20--sandbox%20marimo_course%2Flessons%2Fpractice_marimo.py%3C%2Fcode%3E%3C%2Fpre%3E%0A%20%20%20%20%20%20%3C%2Fdiv%3E%0A%20%20%20%20%20%20%3Cdiv%20class%3D%22pb-card%22%3E%0A%20%20%20%20%20%20%20%20%3Ch3%3EWeek%202%20(MZI%20modelling)%3C%2Fh3%3E%0A%20%20%20%20%20%20%20%20%3Cdiv%20class%3D%22pb-muted%22%3EInteractive%20MZI%20transfer%20functions%20%2B%20Simphony.%3C%2Fdiv%3E%0A%20%20%20%20%20%20%20%20%3Cpre%3E%3Ccode%3Emarimo%20edit%20--sandbox%20marimo_course%2Flessons%2Fw02_mzi_modelling.py%3C%2Fcode%3E%3C%2Fpre%3E%0A%20%20%20%20%20%20%3C%2Fdiv%3E%0A%20%20%20%20%3C%2Fdiv%3E%0A%0A%20%20%20%20%23%23%20Table%20of%20contents%0A%20%20%20%20-%20%3Ca%20href%3D%22%23resources%22%3EKey%20resources%3C%2Fa%3E%0A%20%20%20%20-%20%3Ca%20href%3D%22%23calendar%22%3ESemester%20calendar%3C%2Fa%3E%0A%20%20%20%20-%20%3Ca%20href%3D%22%23setup%22%3ESetup%20checklist%3C%2Fa%3E%0A%20%20%20%20-%20%3Ca%20href%3D%22%23step-by-step%22%3EStep-by-step%20setup%3C%2Fa%3E%0A%20%20%20%20-%20%3Ca%20href%3D%22%23auto-check%22%3EQuick%20environment%20check%3C%2Fa%3E%0A%20%20%20%20-%20%3Ca%20href%3D%22%23commands%22%3ECommon%20commands%3C%2Fa%3E%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%3Ca%20id%3D%22resources%22%3E%3C%2Fa%3E%0A%20%20%20%20%23%23%20Key%20resources%0A%0A%20%20%20%20-%20Photonics-Bootcamp%20repository%20(this%20repo).%0A%20%20%20%20-%20SiEPIC%20openEBL%202026-02%3A%20https%3A%2F%2Fgithub.com%2FSiEPIC%2FopenEBL-2026-02%0A%20%20%20%20-%20BYU%20Academic%20Calendar%202026%3A%20https%3A%2F%2Facademiccalendar.byu.edu%2F%3Fy%3D2026%0A%20%20%20%20-%20Textbook%3A%20*Silicon%20Photonics%20Design*%20by%20Chrostowski%20and%20Hochberg.%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%3Ca%20id%3D%22calendar%22%3E%3C%2Fa%3E%0A%20%20%20%20%23%23%20Semester%20calendar%20(Winter%202026)%0A%0A%20%20%20%20Key%20milestones%20(from%20%60COURSE_PLAN.md%60)%3A%0A%0A%20%20%20%20-%20First%20class%3A%20**Wed%20Jan%207%2C%202026**%0A%20%20%20%20-%20openEBL%20submission%20deadline%3A%20**Sat%20Feb%2014%2C%202026**%0A%20%20%20%20-%20Last%20class%3A%20**Wed%20Apr%2015%2C%202026**%0A%0A%20%20%20%20Class%20cadence%3A%20**M%2FW%2FF**%20(Fridays%20are%20lab%2Fwork%20days).%20Calendar%20exceptions%3A%0A%20%20%20%20-%20No%20class%20**Mon%20Jan%2019**%20(MLK%20Day)%0A%20%20%20%20-%20No%20class%20**Mon%20Feb%2016**%20(Presidents%20Day)%0A%20%20%20%20-%20**Tue%20Feb%2017**%20follows%20Monday%20instruction%20(course%20can%20meet)%0A%20%20%20%20-%20No%20classes%20**Fri%20Mar%2020**%20(BYU%20calendar)%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20from%20datetime%20import%20date%2C%20timedelta%0A%20%20%20%20return%20date%2C%20timedelta%0A%0A%0A%40app.cell%0Adef%20_(date%2C%20timedelta)%3A%0A%20%20%20%20first_class%20%3D%20date(2026%2C%201%2C%207)%0A%20%20%20%20last_class%20%3D%20date(2026%2C%204%2C%2015)%0A%0A%20%20%20%20%23%20Regular%20meeting%20days%20(Mon%2FWed%2FFri)%20plus%20one%20special%20Tuesday%20meeting.%0A%20%20%20%20meeting_weekdays%20%3D%20%7B0%2C%202%2C%204%7D%20%20%23%20Mon%3D0%2C%20Wed%3D2%2C%20Fri%3D4%0A%20%20%20%20monday_instruction_tuesday%20%3D%20date(2026%2C%202%2C%2017)%0A%0A%20%20%20%20no_class_dates%20%3D%20%7B%0A%20%20%20%20%20%20%20%20date(2026%2C%201%2C%2019)%2C%20%20%23%20MLK%20Day%0A%20%20%20%20%20%20%20%20date(2026%2C%202%2C%2016)%2C%20%20%23%20Presidents%20Day%0A%20%20%20%20%20%20%20%20date(2026%2C%203%2C%2020)%2C%20%20%23%20BYU%20no-classes%20day%0A%20%20%20%20%7D%0A%0A%20%20%20%20week_topics%20%3D%20%7B%0A%20%20%20%20%20%20%20%201%3A%20%22Orientation%20and%20tooling%22%2C%0A%20%20%20%20%20%20%20%202%3A%20%22PDKs%20and%20basic%20MZI%20layout%22%2C%0A%20%20%20%20%20%20%20%203%3A%20%22Sizing%20and%20verifying%20the%20MZI%22%2C%0A%20%20%20%20%20%20%20%204%3A%20%22Routing%20and%20floorplanning%22%2C%0A%20%20%20%20%20%20%20%205%3A%20%22Submission%20workflow%20and%20CI%20checks%22%2C%0A%20%20%20%20%20%20%20%206%3A%20%22Submission%20buffer%20and%20bridge%20to%20theory%22%2C%0A%20%20%20%20%20%20%20%207%3A%20%22Waveguide%20fundamentals%22%2C%0A%20%20%20%20%20%20%20%208%3A%20%22Passive%20building%20blocks%20I%22%2C%0A%20%20%20%20%20%20%20%209%3A%20%22Passive%20building%20blocks%20II%3A%20rings%20and%20gratings%22%2C%0A%20%20%20%20%20%20%20%2010%3A%20%22Optical%20I%2FO%20and%20packaging%22%2C%0A%20%20%20%20%20%20%20%2011%3A%20%22Active%20devices%20overview%22%2C%0A%20%20%20%20%20%20%20%2012%3A%20%22Circuit%20modeling%20and%20design%20for%20test%22%2C%0A%20%20%20%20%20%20%20%2013%3A%20%22Measurement%20and%20parameter%20extraction%20I%22%2C%0A%20%20%20%20%20%20%20%2014%3A%20%22Measurement%20and%20parameter%20extraction%20II%22%2C%0A%20%20%20%20%20%20%20%2015%3A%20%22Wrap-up%20and%20reflection%22%2C%0A%20%20%20%20%7D%0A%0A%20%20%20%20%23%20Define%20%22Week%201%22%20as%20the%20week%20containing%20the%20first%20class%2C%20starting%20Monday.%0A%20%20%20%20week1_monday%20%3D%20first_class%20-%20timedelta(days%3Dfirst_class.weekday())%0A%0A%20%20%20%20rows%20%3D%20%5B%5D%0A%20%20%20%20d%20%3D%20week1_monday%0A%20%20%20%20while%20d%20%3C%3D%20last_class%3A%0A%20%20%20%20%20%20%20%20is_regular_meeting%20%3D%20d.weekday()%20in%20meeting_weekdays%0A%20%20%20%20%20%20%20%20is_special_meeting%20%3D%20d%20%3D%3D%20monday_instruction_tuesday%0A%20%20%20%20%20%20%20%20if%20is_regular_meeting%20or%20is_special_meeting%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20status%20%3D%20%22No%20class%22%20if%20d%20in%20no_class_dates%20else%20%22Meets%22%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20is_special_meeting%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20day_label%20%3D%20%22Tue%22%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20meeting_type%20%3D%20%22Lecture%20(Mon%20schedule)%22%0A%20%20%20%20%20%20%20%20%20%20%20%20else%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20day_label%20%3D%20%5B%22Mon%22%2C%20%22Tue%22%2C%20%22Wed%22%2C%20%22Thu%22%2C%20%22Fri%22%2C%20%22Sat%22%2C%20%22Sun%22%5D%5Bd.weekday()%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20meeting_type%20%3D%20%22Lab%22%20if%20d.weekday()%20%3D%3D%204%20else%20%22Lecture%22%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20week%20%3D%201%20%2B%20((d%20-%20week1_monday).days%20%2F%2F%207)%0A%20%20%20%20%20%20%20%20%20%20%20%20rows.append(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22week%22%3A%20week%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22date%22%3A%20d.isoformat()%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22day%22%3A%20day_label%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22type%22%3A%20meeting_type%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22status%22%3A%20status%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22week_topic%22%3A%20week_topics.get(week%2C%20%22%22)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20)%0A%20%20%20%20%20%20%20%20d%20%2B%3D%20timedelta(days%3D1)%0A%0A%20%20%20%20max_week%20%3D%20max(r%5B%22week%22%5D%20for%20r%20in%20rows)%0A%20%20%20%20return%20max_week%2C%20rows%0A%0A%0A%40app.cell%0Adef%20_(max_week%2C%20mo)%3A%0A%20%20%20%20week_selector%20%3D%20mo.ui.slider(start%3D1%2C%20stop%3Dmax_week%2C%20step%3D1%2C%20value%3D1%2C%20label%3D%22Week%22)%0A%20%20%20%20mo.vstack(%5Bmo.md(%22%23%23%23%20Calendar%20controls%22)%2C%20week_selector%5D)%0A%20%20%20%20return%20(week_selector%2C)%0A%0A%0A%40app.cell%0Adef%20_(mo%2C%20rows%2C%20week_selector)%3A%0A%20%20%20%20selected%20%3D%20%5Br%20for%20r%20in%20rows%20if%20r%5B%22week%22%5D%20%3D%3D%20week_selector.value%5D%0A%20%20%20%20topic%20%3D%20next((r%5B%22week_topic%22%5D%20for%20r%20in%20selected%20if%20r%5B%22week_topic%22%5D)%2C%20%22%22)%0A%0A%20%20%20%20blocks%20%3D%20%5B%0A%20%20%20%20%20%20%20%20mo.md(%22%23%23%23%20Weekly%20view%22)%2C%0A%20%20%20%20%20%20%20%20mo.ui.table(selected)%2C%0A%20%20%20%20%5D%0A%20%20%20%20if%20topic%3A%0A%20%20%20%20%20%20%20%20blocks.insert(1%2C%20mo.md(f%22Week%20%7Bweek_selector.value%7D%3A%20**%7Btopic%7D**%22))%0A%20%20%20%20blocks.extend(%5Bmo.md(%22%23%23%23%20Full%20list%20(sortable)%22)%2C%20mo.ui.table(rows)%5D)%0A%20%20%20%20blocks.append(mo.md(r%22%22%22%3Ca%20href%3D%22%23toc%22%3EBack%20to%20top%3C%2Fa%3E%22%22%22))%0A%20%20%20%20mo.vstack(blocks)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%3Ca%20id%3D%22setup%22%3E%3C%2Fa%3E%0A%20%20%20%20%23%23%20Environment%20checklist%20(to%20verify%20in%20class)%0A%0A%20%20%20%20-%20Python%203.11%2B%20installed.%0A%20%20%20%20-%20Virtual%20environment%20created%20in%20the%20course%20repo.%0A%20%20%20%20-%20%60marimo%60%20installed%20and%20%60marimo%20edit%60%20works.%0A%20%20%20%20-%20%60gdsfactory%5Bfull%5D%60%20installed%20and%20importable%20(e.g.%2C%20%60import%20gdsfactory%20as%20gf%60).%0A%20%20%20%20-%20%60simphony%60%20installed%20and%20importable.%0A%20%20%20%20-%20KLayout%20%2B%20SiEPIC-EBeam-PDK%20installed%20and%20able%20to%20open%20example%20layouts.%0A%0A%20%20%20%20In%20this%20lesson%2C%20we%20will%20walk%20through%20these%20steps%20and%20ensure%20everyone%20can%20run%20the%20course%20materials.%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%23%20Two%20ways%20to%20run%20this%20course%20(sandbox%20vs%20local%20venv)%0A%0A%20%20%20%20You%20have%20two%20supported%20workflows%3A%0A%0A%20%20%20%20%23%23%23%20Option%20A%20%E2%80%94%20marimo%20sandbox%20mode%20(recommended%20for%20most%20students)%0A%0A%20%20%20%20Run%20notebooks%20in%20an%20isolated%20%60uv%60%20environment%20using%20the%20notebook%E2%80%99s%20inline%20dependency%20metadata.%0A%0A%20%20%20%20-%20**How**%3A%20%60marimo%20edit%20--sandbox%20%3Cnotebook.py%3E%60%20or%20%60marimo%20run%20--sandbox%20%3Cnotebook.py%3E%60%0A%20%20%20%20-%20**Requirements**%3A%0A%20%20%20%20%20%20-%20%60uv%60%20installed%20(%60uv%20--version%60)%0A%20%20%20%20%20%20-%20Python%203.11%2B%0A%20%20%20%20-%20**Pros**%3A%0A%20%20%20%20%20%20-%20Reproducible%20per-notebook%20environments%0A%20%20%20%20%20%20-%20Minimal%20%E2%80%9Cglobal%E2%80%9D%20setup%3B%20avoids%20dependency%20conflicts%0A%20%20%20%20%20%20-%20Easy%20to%20reset%20by%20deleting%20the%20sandbox%20environment%20cache%0A%20%20%20%20-%20**Cons**%3A%0A%20%20%20%20%20%20-%20First%20run%20can%20be%20slower%20while%20dependencies%20install%0A%20%20%20%20%20%20-%20Environments%20are%20per-notebook%20(can%20duplicate%20installs)%0A%20%20%20%20%20%20-%20Some%20system-level%20tools%20(KLayout%2FPDKs)%20are%20still%20manual%0A%0A%20%20%20%20%23%23%23%20Option%20B%20%E2%80%94%20local%20virtual%20environment%20(recommended%20for%20power%20users)%0A%0A%20%20%20%20Create%20one%20course%20environment%20and%20run%20all%20notebooks%20inside%20it.%0A%0A%20%20%20%20-%20**Requirements**%3A%0A%20%20%20%20%20%20-%20Python%203.11%2B%20and%20%60pip%60%0A%20%20%20%20%20%20-%20Ability%20to%20create%20venvs%20(%60python%20-m%20venv%60)%0A%20%20%20%20%20%20-%20Install%20course%20packages%3A%20%60pip%20install%20-r%20marimo_course%2Frequirements.txt%60%0A%20%20%20%20-%20**Pros**%3A%0A%20%20%20%20%20%20-%20One%20environment%20for%20the%20whole%20course%20(faster%20day-to-day)%0A%20%20%20%20%20%20-%20Easier%20to%20integrate%20additional%20tools%20and%20packages%0A%20%20%20%20%20%20-%20Better%20if%20you%20want%20to%20tinker%20beyond%20the%20notebook%E2%80%99s%20pinned%20deps%0A%20%20%20%20-%20**Cons**%3A%0A%20%20%20%20%20%20-%20More%20setup%20up-front%0A%20%20%20%20%20%20-%20Possible%20version%20conflicts%20(especially%20with%20photonics%20tooling%20stacks)%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%3Ca%20id%3D%22step-by-step%22%3E%3C%2Fa%3E%0A%20%20%20%20%23%23%20Step-by-step%20setup%20(first%20time)%0A%0A%20%20%20%20Pick%20**Option%20A%20(sandbox)**%20or%20**Option%20B%20(local%20venv)**%20from%20above%2C%20then%20follow%20the%20steps%20for%20your%20OS.%0A%0A%20%20%20%20%23%23%23%20macOS%0A%0A%20%20%20%201.%20Install%20**Python%203.11%2B**%20from%20https%3A%2F%2Fwww.python.org%2Fdownloads%2F%0A%20%20%20%202.%20Install%20**uv**%20(required%20for%20sandbox%20mode)%3A%0A%20%20%20%20%20%20%20%60%60%60bash%0A%20%20%20%20%20%20%20curl%20-LsSf%20https%3A%2F%2Fastral.sh%2Fuv%2Finstall.sh%20%7C%20sh%0A%20%20%20%20%20%20%20%60%60%60%0A%20%20%20%203.%20Clone%20the%20course%20repo%20and%20enter%20it%3A%0A%20%20%20%20%20%20%20%60%60%60bash%0A%20%20%20%20%20%20%20git%20clone%20https%3A%2F%2Fgithub.com%2FBYUCamachoLab%2FPhotonics-Bootcamp.git%0A%20%20%20%20%20%20%20cd%20Photonics-Bootcamp%0A%20%20%20%20%20%20%20%60%60%60%0A%20%20%20%204.%20Run%20the%20Week%201%20notebook%20in%20sandbox%20mode%3A%0A%20%20%20%20%20%20%20%60%60%60bash%0A%20%20%20%20%20%20%20marimo%20edit%20--sandbox%20marimo_course%2Flessons%2Fw01_orientation_tooling.py%0A%20%20%20%20%20%20%20%60%60%60%0A%20%20%20%205.%20If%20you%20prefer%20a%20single%20course-wide%20environment%20(Option%20B)%3A%0A%20%20%20%20%20%20%20%60%60%60bash%0A%20%20%20%20%20%20%20python3%20-m%20venv%20.venv%0A%20%20%20%20%20%20%20source%20.venv%2Fbin%2Factivate%0A%20%20%20%20%20%20%20pip%20install%20-r%20marimo_course%2Frequirements.txt%0A%20%20%20%20%20%20%20marimo%20edit%20marimo_course%2Flessons%2Fw01_orientation_tooling.py%0A%20%20%20%20%20%20%20%60%60%60%0A%0A%20%20%20%20%23%23%23%20Linux%0A%0A%20%20%20%201.%20Install%20**Python%203.11%2B**%20and%20**pip**%20(package%20manager%20varies%20by%20distro).%0A%20%20%20%202.%20Install%20**uv**%3A%0A%20%20%20%20%20%20%20%60%60%60bash%0A%20%20%20%20%20%20%20curl%20-LsSf%20https%3A%2F%2Fastral.sh%2Fuv%2Finstall.sh%20%7C%20sh%0A%20%20%20%20%20%20%20%60%60%60%0A%20%20%20%203.%20Clone%20the%20course%20repo%20and%20enter%20it%3A%0A%20%20%20%20%20%20%20%60%60%60bash%0A%20%20%20%20%20%20%20git%20clone%20https%3A%2F%2Fgithub.com%2FBYUCamachoLab%2FPhotonics-Bootcamp.git%0A%20%20%20%20%20%20%20cd%20Photonics-Bootcamp%0A%20%20%20%20%20%20%20%60%60%60%0A%20%20%20%204.%20Run%20the%20Week%201%20notebook%20in%20sandbox%20mode%3A%0A%20%20%20%20%20%20%20%60%60%60bash%0A%20%20%20%20%20%20%20marimo%20edit%20--sandbox%20marimo_course%2Flessons%2Fw01_orientation_tooling.py%0A%20%20%20%20%20%20%20%60%60%60%0A%20%20%20%205.%20Option%20B%20(single%20venv)%3A%0A%20%20%20%20%20%20%20%60%60%60bash%0A%20%20%20%20%20%20%20python3%20-m%20venv%20.venv%0A%20%20%20%20%20%20%20source%20.venv%2Fbin%2Factivate%0A%20%20%20%20%20%20%20pip%20install%20-r%20marimo_course%2Frequirements.txt%0A%20%20%20%20%20%20%20marimo%20edit%20marimo_course%2Flessons%2Fw01_orientation_tooling.py%0A%20%20%20%20%20%20%20%60%60%60%0A%0A%20%20%20%20%23%23%23%20Windows%20(PowerShell)%0A%0A%20%20%20%201.%20Install%20**Python%203.11%2B**%20from%20https%3A%2F%2Fwww.python.org%2Fdownloads%2F%20and%20ensure%20%22Add%20Python%20to%20PATH%22%20is%20checked.%0A%20%20%20%202.%20Install%20**uv**%3A%0A%20%20%20%20%20%20%20%60%60%60powershell%0A%20%20%20%20%20%20%20irm%20https%3A%2F%2Fastral.sh%2Fuv%2Finstall.ps1%20%7C%20iex%0A%20%20%20%20%20%20%20%60%60%60%0A%20%20%20%203.%20Clone%20the%20course%20repo%20and%20enter%20it%3A%0A%20%20%20%20%20%20%20%60%60%60powershell%0A%20%20%20%20%20%20%20git%20clone%20https%3A%2F%2Fgithub.com%2FBYUCamachoLab%2FPhotonics-Bootcamp.git%0A%20%20%20%20%20%20%20cd%20Photonics-Bootcamp%0A%20%20%20%20%20%20%20%60%60%60%0A%20%20%20%204.%20Run%20the%20Week%201%20notebook%20in%20sandbox%20mode%3A%0A%20%20%20%20%20%20%20%60%60%60powershell%0A%20%20%20%20%20%20%20marimo%20edit%20--sandbox%20marimo_course%2Flessons%2Fw01_orientation_tooling.py%0A%20%20%20%20%20%20%20%60%60%60%0A%20%20%20%205.%20Option%20B%20(single%20venv)%3A%0A%20%20%20%20%20%20%20%60%60%60powershell%0A%20%20%20%20%20%20%20py%20-3%20-m%20venv%20.venv%0A%20%20%20%20%20%20%20.venv%5CScripts%5CActivate.ps1%0A%20%20%20%20%20%20%20pip%20install%20-r%20marimo_course%2Frequirements.txt%0A%20%20%20%20%20%20%20marimo%20edit%20marimo_course%2Flessons%2Fw01_orientation_tooling.py%0A%20%20%20%20%20%20%20%60%60%60%0A%0A%20%20%20%20%23%23%23%20If%20something%20fails%0A%0A%20%20%20%20-%20Run%20%60marimo%20check%20marimo_course%2Flessons%2Fw01_orientation_tooling.py%60%0A%20%20%20%20-%20Restart%20marimo%20and%20re-open%20the%20notebook%0A%20%20%20%20-%20Ask%20for%20help%20in%20class%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(mo)%3A%0A%20%20%20%20has_python%20%3D%20mo.ui.checkbox(label%3D%22Python%203.11%2B%20installed%22%2C%20value%3DFalse)%0A%20%20%20%20has_venv%20%3D%20mo.ui.checkbox(label%3D%22Virtual%20environment%20created%20%2B%20activated%22%2C%20value%3DFalse)%0A%20%20%20%20has_marimo%20%3D%20mo.ui.checkbox(label%3D%22marimo%20installed%3B%20%60marimo%20edit%60%20works%22%2C%20value%3DFalse)%0A%20%20%20%20has_gdsfactory%20%3D%20mo.ui.checkbox(label%3D%22gdsfactory%20import%20works%22%2C%20value%3DFalse)%0A%20%20%20%20has_simphony%20%3D%20mo.ui.checkbox(label%3D%22simphony%20import%20works%22%2C%20value%3DFalse)%0A%20%20%20%20has_klayout%20%3D%20mo.ui.checkbox(%0A%20%20%20%20%20%20%20%20label%3D%22KLayout%20%2B%20SiEPIC-EBeam-PDK%20installed%20(manual%20check)%22%2C%20value%3DFalse%0A%20%20%20%20)%0A%20%20%20%20return%20(%0A%20%20%20%20%20%20%20%20has_gdsfactory%2C%0A%20%20%20%20%20%20%20%20has_klayout%2C%0A%20%20%20%20%20%20%20%20has_marimo%2C%0A%20%20%20%20%20%20%20%20has_python%2C%0A%20%20%20%20%20%20%20%20has_simphony%2C%0A%20%20%20%20%20%20%20%20has_venv%2C%0A%20%20%20%20)%0A%0A%0A%40app.cell%0Adef%20_(%0A%20%20%20%20has_gdsfactory%2C%0A%20%20%20%20has_klayout%2C%0A%20%20%20%20has_marimo%2C%0A%20%20%20%20has_python%2C%0A%20%20%20%20has_simphony%2C%0A%20%20%20%20has_venv%2C%0A%20%20%20%20mo%2C%0A)%3A%0A%20%20%20%20mo.md(%22%23%23%20Setup%20progress%20(interactive)%22)%0A%0A%20%20%20%20checks%20%3D%20%5B%0A%20%20%20%20%20%20%20%20has_python%2C%0A%20%20%20%20%20%20%20%20has_venv%2C%0A%20%20%20%20%20%20%20%20has_marimo%2C%0A%20%20%20%20%20%20%20%20has_gdsfactory%2C%0A%20%20%20%20%20%20%20%20has_simphony%2C%0A%20%20%20%20%20%20%20%20has_klayout%2C%0A%20%20%20%20%5D%0A%20%20%20%20completed%20%3D%20sum(int(c.value)%20for%20c%20in%20checks)%0A%20%20%20%20progress%20%3D%20completed%20%2F%20len(checks)%20if%20checks%20else%200.0%0A%20%20%20%20progress_bar%20%3D%20(%0A%20%20%20%20%20%20%20%20%22%3Cdiv%20style%3D'margin%3A10px%200%206px%3B%20border%3A1px%20solid%20rgba(120%2C120%2C120%2C0.35)%3B%22%0A%20%20%20%20%20%20%20%20%22%20border-radius%3A999px%3B%20height%3A12px%3B%20overflow%3Ahidden%3B'%3E%22%0A%20%20%20%20%20%20%20%20f%22%3Cdiv%20style%3D'height%3A100%25%3B%20width%3A%7Bprogress*100%3A.1f%7D%25%3B%22%0A%20%20%20%20%20%20%20%20%22%20background%3A%20rgba(31%2C111%2C235%2C0.70)%3B'%3E%3C%2Fdiv%3E%22%0A%20%20%20%20%20%20%20%20%22%3C%2Fdiv%3E%22%0A%20%20%20%20)%0A%0A%20%20%20%20mo.vstack(%0A%20%20%20%20%20%20%20%20%5B%0A%20%20%20%20%20%20%20%20%20%20%20%20has_python%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20has_venv%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20has_marimo%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20has_gdsfactory%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20has_simphony%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20has_klayout%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20mo.md(f%22Progress%3A%20**%7Bcompleted%7D%2F%7Blen(checks)%7D**%20completed.%22)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20mo.md(progress_bar)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20mo.md(r%22%22%22%3Ca%20href%3D%22%23toc%22%3EBack%20to%20top%3C%2Fa%3E%22%22%22)%2C%0A%20%20%20%20%20%20%20%20%5D%0A%20%20%20%20)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(%22%22%22%0A%20%20%20%20%3Ca%20id%3D%22auto-check%22%3E%3C%2Fa%3E%0A%20%20%20%20%23%23%20Quick%20environment%20check%20(automatic)%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20import%20sys%0A%20%20%20%20from%20importlib%20import%20metadata%0A%20%20%20%20return%20metadata%2C%20sys%0A%0A%0A%40app.cell%0Adef%20_(metadata%2C%20mo%2C%20sys)%3A%0A%20%20%20%20def%20version_of(package%3A%20str)%20-%3E%20str%20%7C%20None%3A%0A%20%20%20%20%20%20%20%20try%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20return%20metadata.version(package)%0A%20%20%20%20%20%20%20%20except%20metadata.PackageNotFoundError%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20return%20None%0A%0A%20%20%20%20python_ok%20%3D%20(sys.version_info.major%2C%20sys.version_info.minor)%20%3E%3D%20(3%2C%2011)%0A%20%20%20%20python_status%20%3D%20%22OK%22%20if%20python_ok%20else%20%22NEEDS%203.11%2B%22%0A%0A%20%20%20%20import%20platform%0A%20%20%20%20import%20shutil%0A%0A%20%20%20%20uv_path%20%3D%20shutil.which(%22uv%22)%0A%20%20%20%20marimo_path%20%3D%20shutil.which(%22marimo%22)%0A%0A%20%20%20%20packages%20%3D%20%5B%0A%20%20%20%20%20%20%20%20(%22marimo%22%2C%20version_of(%22marimo%22))%2C%0A%20%20%20%20%20%20%20%20(%22pyzmq%22%2C%20version_of(%22pyzmq%22))%2C%0A%20%20%20%20%20%20%20%20%23%20These%20are%20used%20in%20later%20lessons%3B%20they%20may%20be%20missing%20in%20Week%201%20sandbox%20mode.%0A%20%20%20%20%20%20%20%20(%22gdsfactory%22%2C%20version_of(%22gdsfactory%22))%2C%0A%20%20%20%20%20%20%20%20(%22simphony%22%2C%20version_of(%22simphony%22))%2C%0A%20%20%20%20%20%20%20%20(%22altair%22%2C%20version_of(%22altair%22))%2C%0A%20%20%20%20%20%20%20%20(%22polars%22%2C%20version_of(%22polars%22))%2C%0A%20%20%20%20%20%20%20%20(%22numpy%22%2C%20version_of(%22numpy%22))%2C%0A%20%20%20%20%5D%0A%0A%20%20%20%20package_rows%20%3D%20%5B%5D%0A%20%20%20%20for%20name%2C%20version%20in%20packages%3A%0A%20%20%20%20%20%20%20%20package_rows.append(%0A%20%20%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22package%22%3A%20name%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22status%22%3A%20%22OK%22%20if%20version%20is%20not%20None%20else%20%22MISSING%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22version%22%3A%20version%20or%20%22%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20)%0A%0A%20%20%20%20header%20%3D%20mo.md(%0A%20%20%20%20%20%20%20%20%22Python%3A%20%22%0A%20%20%20%20%20%20%20%20%2B%20f%22%60%7Bsys.version.split()%5B0%5D%7D%60%22%0A%20%20%20%20%20%20%20%20%2B%20f%22%20(check%3A%20**%7Bpython_status%7D**)%5Cn%5Cn%22%0A%20%20%20%20%20%20%20%20%2B%20f%22Executable%3A%20%60%7Bsys.executable%7D%60%20%20%5Cn%22%0A%20%20%20%20%20%20%20%20%2B%20f%22Platform%3A%20%60%7Bplatform.system()%7D%20%7Bplatform.release()%7D%60%5Cn%5Cn%22%0A%20%20%20%20%20%20%20%20%2B%20f%22%60uv%60%20on%20PATH%3A%20**%7B'YES'%20if%20uv_path%20else%20'NO'%7D**%22%0A%20%20%20%20%20%20%20%20%2B%20(f%22%20(%60%7Buv_path%7D%60)%22%20if%20uv_path%20else%20%22%22)%0A%20%20%20%20%20%20%20%20%2B%20%22%20%20%5Cn%22%0A%20%20%20%20%20%20%20%20%2B%20f%22%60marimo%60%20on%20PATH%3A%20**%7B'YES'%20if%20marimo_path%20else%20'NO'%7D**%22%0A%20%20%20%20%20%20%20%20%2B%20(f%22%20(%60%7Bmarimo_path%7D%60)%22%20if%20marimo_path%20else%20%22%22)%0A%20%20%20%20%20%20%20%20%2B%20%22%5Cn%5Cn%22%0A%20%20%20%20%20%20%20%20%2B%20%22Installed%20packages%20(from%20Python%20environment%20running%20this%20notebook)%3A%22%0A%20%20%20%20)%0A%20%20%20%20table%20%3D%20mo.ui.table(package_rows)%0A%20%20%20%20mo.vstack(%0A%20%20%20%20%20%20%20%20%5B%0A%20%20%20%20%20%20%20%20%20%20%20%20header%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20table%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20mo.md(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20r%22%22%22%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cdiv%20class%3D%22pb-muted%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20Note%3A%20if%20you%20are%20running%20this%20notebook%20in%20%3Ccode%3E--sandbox%3C%2Fcode%3E%20mode%2C%20only%20the%20packages%20listed%20in%20this%20file%E2%80%99s%20inline%20metadata%20are%20expected.%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20Later%20notebooks%20include%20additional%20dependencies%20via%20their%20inline%20metadata%20(or%20via%20your%20course-wide%20venv).%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fdiv%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22%22%22%0A%20%20%20%20%20%20%20%20%20%20%20%20)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20mo.md(r%22%22%22%3Ca%20href%3D%22%23toc%22%3EBack%20to%20top%3C%2Fa%3E%22%22%22)%2C%0A%20%20%20%20%20%20%20%20%5D%0A%20%20%20%20)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(mo)%3A%0A%20%20%20%20platform_choice%20%3D%20mo.ui.radio(%0A%20%20%20%20%20%20%20%20options%3D%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%22macOS%20%2F%20Linux%22%3A%20%22unix%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22Windows%20(PowerShell)%22%3A%20%22win%22%2C%0A%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20value%3D%22macOS%20%2F%20Linux%22%2C%0A%20%20%20%20%20%20%20%20label%3D%22Platform%22%2C%0A%20%20%20%20)%0A%20%20%20%20mo.vstack(%5Bmo.md('%3Ca%20id%3D%22commands%22%3E%3C%2Fa%3E%5Cn%23%23%20Common%20commands')%2C%20platform_choice%5D)%0A%20%20%20%20return%20(platform_choice%2C)%0A%0A%0A%40app.cell%0Adef%20_(mo%2C%20platform_choice)%3A%0A%20%20%20%20if%20platform_choice.value%20%3D%3D%20%22win%22%3A%0A%20%20%20%20%20%20%20%20local%20%3D%20mo.md(%0A%20%20%20%20%20%20%20%20%20%20%20%20r%22%22%22%0A%20%20%20%20%20%20%20%20%20%20%20%20**Local%20venv%20(course-wide)%3A**%0A%20%20%20%20%20%20%20%20%20%20%20%20%60%60%60powershell%0A%20%20%20%20%20%20%20%20%20%20%20%20py%20-3%20-m%20venv%20.venv%0A%20%20%20%20%20%20%20%20%20%20%20%20.venv%5CScripts%5CActivate.ps1%0A%20%20%20%20%20%20%20%20%20%20%20%20pip%20install%20-r%20marimo_course%2Frequirements.txt%0A%20%20%20%20%20%20%20%20%20%20%20%20%60%60%60%0A%20%20%20%20%20%20%20%20%20%20%20%20%22%22%22%0A%20%20%20%20%20%20%20%20)%0A%20%20%20%20else%3A%0A%20%20%20%20%20%20%20%20local%20%3D%20mo.md(%0A%20%20%20%20%20%20%20%20%20%20%20%20r%22%22%22%0A%20%20%20%20%20%20%20%20%20%20%20%20**Local%20venv%20(course-wide)%3A**%0A%20%20%20%20%20%20%20%20%20%20%20%20%60%60%60bash%0A%20%20%20%20%20%20%20%20%20%20%20%20python3%20-m%20venv%20.venv%0A%20%20%20%20%20%20%20%20%20%20%20%20source%20.venv%2Fbin%2Factivate%0A%20%20%20%20%20%20%20%20%20%20%20%20pip%20install%20-r%20marimo_course%2Frequirements.txt%0A%20%20%20%20%20%20%20%20%20%20%20%20%60%60%60%0A%20%20%20%20%20%20%20%20%20%20%20%20%22%22%22%0A%20%20%20%20%20%20%20%20)%0A%0A%20%20%20%20sandbox%20%3D%20mo.md(%0A%20%20%20%20%20%20%20%20r%22%22%22%0A%20%20%20%20%20%20%20%20**Sandbox%20mode%20(per-notebook%2C%20recommended)%3A**%0A%20%20%20%20%20%20%20%20%60%60%60bash%0A%20%20%20%20%20%20%20%20marimo%20edit%20--sandbox%20marimo_course%2Flessons%2Fw01_orientation_tooling.py%0A%20%20%20%20%20%20%20%20%60%60%60%0A%20%20%20%20%20%20%20%20%22%22%22%0A%20%20%20%20)%0A%0A%20%20%20%20mo.vstack(%5Blocal%2C%20sandbox%2C%20mo.md(r%22%22%22%3Ca%20href%3D%22%23toc%22%3EBack%20to%20top%3C%2Fa%3E%22%22%22)%5D)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20import%20marimo%20as%20mo%0A%20%20%20%20return%20(mo%2C)%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20return%0A%0A%0Aif%20__name__%20%3D%3D%20%22__main__%22%3A%0A%20%20%20%20app.run()%0A
f77d675e2943af2f8c48dc21494d7314