ETH Grade Optimizer
894f4e4a — Ben Fiedler 1 year, 9 months ago
Fix buggy interaction of NoGuess and --no-guess
d5e7fd3c — Ben Fiedler 1 year, 9 months ago
766fd8c4 — Ben Fiedler 1 year, 9 months ago
Add 'NoGuess' category



You can also use your local clone with git send-email.


ETH Computer Science Master GPA optimizer

#How to use

  1. Install ghc
  2. Fill in your grade file
  3. Run runhaskell ETHGrades.hs < your-grade-file

In normal operation, the program tries to optimize your grade as much as possible, so it tries as many (valid) allocations as possible, possibly exceeding the allocations specified in your input file. To disable this behaviour, use the --no-guess flag.

See input.example for the file format.

#It's too slow!

The runhaskell command only interprets the code, which may be slow if you have a lot of allocations. To disable brute forcing all possibilities for a selected course, use the "NoGuess" category. If you want to disable guessing globally, use the --no-guess flag. Alternatively, compile the program using ghc -O3 and try again.

If you still have performance issues feel free to write me a mail.


  • The program will never try to drop Interfocus courses (because that unneccessarily blows up the number of combinations to search). If you have taken more than two Interfocus Courses you can manually add None as category after the ones it should try to drop.
  • The program only computes an optimal allocation. If there is more than one optimal allocation, an arbitrary one is chosen.
  • Courses allocated in category None can either be allocated as "Freie Wahlfächer" or dropped entirely and only appear on the so-called "Beiblatt". It doesn't make a difference grade wise, so this program cannot distinguish between equivalent configurations. It is up to you to figure this part out :)


ETH's 2009 Master's study regulations are a bit weird, as you have to optimize your grades yourself. This isn't hard or complex, but it's tedious, so here's a program that does the necessary bruteforcing for you.

There are seven relevant categories that courses can fall under.

  • FocusCore: Focus Core Courses
  • FocusElective: Focus Elective Courses
  • Seminar: Seminar
  • CompSciElective: Computer Science Elective Courses
  • Interfocus: Interfocus Courses
  • SiP: Science in Perspective Courses
    • do not count towards the final GPA
  • None: "Freie Wahlfächer" (MSc courses which are part of any ETH Master) or courses with no category
    • depending on the total number of credits in the above categories you may have to allocate some courses in "Freie Wahlfächer" or no category at all
    • do not count towards the final GPA

Any FocusCore can also be a FocusElective or a CompSciElective, and any FocusElective can also be a CompSciElective. Any of these can be put in "Freie Wahlfächer" (§33.3c), where they do not count towards the final GPA.

There are some constraints on how much courses must be part of each of the categories, see (§33) or the code for details.

The final GPA is calculated as follows (§36.3):

  • Average of
    • 3 * average of
      • Focus Core
      • Focus Elective
      • Seminar
    • average of
      • Interfocus Courses
    • average of
      • Computer Science Elective Courses
    • 2 * MSc Thesis grade (not included in this program)