Skip to content

YesselmanLab/chem438

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

2 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

CHEM 438 — Redesign Starter System

A small, runnable prototype of the highest-leverage changes from the teaching review. It's not a rewrite of the course; it's a seed you can grow. Everything here works today — run the demo and see.

python demo/demo_end_to_end.py      # see the whole idea in 5 seconds
python -m pytest -q                  # 9 green tests

The one idea

Give every student personalized data behind a course-specific API, grade it instantly, and ask questions that require reasoning — not recall.

That single move fixes the two biggest problems the review found at once:

Problem from the review How this system answers it
~18 of 19 homeworks are one-shot solvable by ChatGPT Data is per-student (can't copy) and the rules live only in chem438 (the LLM guesses them wrong)
Homework is drill, not reasoning Lessons follow Predict → Run → Investigate → Modify → Make, plus debug and interpret problems
5-week feedback blackout me.checkpoint(...) returns instant ✓/✗ in the notebook
"hw asks for things we didn't cover" The rules the student needs are in help(chem438.synthlab), one cell away
Science stays decorative Every lesson ends with an interpretation question a human grades

What's in the box

chem438/                 the custom library — the core AI-resistance lever
  roster.py              enroll(nuid) -> a stable, personal seed
  synthlab.py            each student's unique compound batch + course-only rules
  check.py               in-notebook autograder (instant feedback)
  practice.py            unlimited self-checking practice problems (the "drill more")
  lessons.py             the task checklist  →  chem438.instructions("lesson_01")
  _keys.py               instructor answer key (recomputes, so no reward-hacking)
assignments/
  lesson_01_basics.md       the true first lesson — variables/arithmetic/types/strings
  lesson_03_loops.md        a few weeks in — loops + the custom-library AI-resistance
  make_assignment.py        stamps each student's id into their own .ipynb (--lesson)
demo/demo_lesson_01.py   a full walkthrough of the first assignment as a student sees it
demo/demo_end_to_end.py  proves: deterministic, per-student, catches cheating
instructor/
  grade_submissions.py     batch-grade a folder of notebooks → gradebook CSV + prose
  INSTRUCTOR_GUIDE.md      how students know what to do, how to grade, orals, hide keys
tests/test_smoke.py      15 tests
ROADMAP.md               ← what to try first, and in what order

Running it on Google Colab (the module question)

chem438 is a real pip-installable package (see pyproject.toml), so a student on Colab needs one line at the top of the notebook — no files to upload:

!pip install -q "chem438 @ git+https://github.com/YesselmanLab/chem438.git"

Then import chem438 works exactly as below. Three ways to host it, easiest first:

  1. Public GitHub repo → the git+https://… install above. Simplest; but the source (including _keys.py) is readable, so use it only for the pilot or split the keys out (see INSTRUCTOR_GUIDE.md).
  2. PyPI (pip install chem438) → cleanest for students; public source.
  3. Private repo / prebuilt wheel on Drive → keeps _keys.py out of reach; the recommended path once you care about hiding answers.

make_assignment.py already puts the install line as the first cell of every generated notebook — edit the INSTALL_URL at the top of that file once to point at wherever you host it. Because the package has zero dependencies, the install is a couple of seconds and never fights Colab's pandas/numpy/rdkit.

Try it as a student would

# (Colab: run the !pip install cell first)
import chem438
me = chem438.enroll("your-nuid")     # same id all semester

# --- Lesson 01, the basics ---
w = me.warmup()                      # your personal numbers
sum_ab = w.a + w.b
# ...define product, remainder, power, label_x3, mass_label...
me.checkpoint("lesson_01", globals())   # instant feedback on YOUR numbers

# --- Lesson 03, a few weeks later ---
batch = me.pull_batch()              # your 24 compounds
help(chem438.synthlab)               # the rules an AI doesn't know
# ...define n_compounds, heavy_codes, ...
me.checkpoint("lesson_03", globals())

Deliberate scope choices (so you can push back)

  • Pure standard library. No numpy/pandas/rdkit dependency in chem438, so it installs instantly and runs in Colab. Students still use pandas — they build a DataFrame from batch.to_records(). The library is the data source, not a replacement for the real tools.
  • One theme, all semester (SynthLab compounds). Continuity means the same personalized objects carry from loops → dicts → pandas → plotting → rdkit. If you'd rather have per-unit themes (spectra, sequences, structures), that's a one-file change — see the ROADMAP decision points.
  • Two lessons built out, not twenty. Lesson 01 (day-one basics) and Lesson 03 (loops) are the worked examples — they show the pattern at the two ends of the difficulty range. The point is to react to concrete things before scaling.

Read ROADMAP.md for the sequenced plan and the four decisions I need your read on.

About

Personalized, AI-resistant coursework toolkit for CHEM 438 (Python + comp-chem). Pip-installable, runs on Google Colab.

Resources

Stars

Watchers

Forks

Releases

Packages

Contributors

Languages