Back to Challenges

Challenge rules

Version 2.1.0. These rules apply to all starter challenges. Each challenge page lists its own requirements and score.

How a design is judged

  1. You submit your lens as an Optiland file, written with save_optiland_file (see "How to submit"). You can also add a notebook that shows how you made the design. The judge uses only the lens file.
  2. The judge rebuilds the lens in Optiland and checks every requirement of the challenge.
  3. If the design passes all requirements, it is eligible and gets a score. A lower score is better.
  4. If the design fails a requirement, it gets no score. The result tells you which requirement failed and by how much. There is no penalty term: a design that fails is not ranked.

Optimize with any method or software you like. Only the final prescription counts.

Optical model

Mechanical rules

Not allowed

The judge rejects a lens file with any of these as Invalid prescription:

The judge ignores the fields, wavelengths, vignetting factors, ray aiming and other analysis settings in your file. It always uses the settings of the challenge.

Vignetting

Mechanical vignetting is not allowed. Every ray of the full pupil must pass all clear apertures, at every verification field and every wavelength. Natural illumination falloff at the edge of the field is allowed.

The judge traces 1,024 pupil rays, the chief ray and 256 rays on the pupil rim, at each verification field and each wavelength. The verification fields use finer steps than the scoring fields (see each challenge). One blocked, lost or totally internally reflected ray makes the design ineligible.

Definitions

D(θ)=ychief,d(θ)fdtan⁡θ−1D(\theta) = \frac{y_{\text{chief},d}(\theta)}{f_d \tan\theta} - 1

The limit applies to ∣D∣|D| at every verification field. Barrel and pincushion distortion count the same.

ci=13∑k∑jqj rikj,Ri=13∑k∑jqj ∥rikj−ci∥2c_i = \tfrac13 \sum_k \sum_j q_j\, r_{ikj}, \qquad R_i = \sqrt{\tfrac13 \sum_k \sum_j q_j \,\lVert r_{ikj} - c_i \rVert^2}

Lateral chromatic aberration (an image shift between the wavelengths) therefore makes the spot larger.

Result status

StatusMeaning
EligibleAll requirements pass. The design is ranked.
Invalid prescriptionThe file is not valid: format, glass name, crossing surfaces or stop position.
Constraint failedA requirement fails: EFL, f-number, element count, BFD, track, thickness, distortion, ...
Ray validation failedOne or more rays are blocked or lost (vignetting).
Needs numerical reviewThe design passes, but a numerical check did not converge. A maintainer looks at it.
Evaluator errorThe judge failed. This is our problem, not yours.

How to submit

In your notebook or script, save your final lens with Optiland:

from optiland.fileio import save_optiland_file
save_optiland_file(lens, "my_lens.json")

On the challenge page, click Submit Design and paste the content of my_lens.json (or select the file). A link to a notebook that shows how you made the design is optional.

Privacy. Only you can see your prescription and its full report while the challenge runs. After the deadline, all prescriptions and reports are public, so everybody can learn from them. Your score, notebook link and description show on the leaderboard.

The judge evaluates each prescription with the reference evaluator. Your submission list on the submit page shows the status and, if a requirement fails, the reasons. Only eligible results show on the leaderboard.

Check your design yourself

The evaluator is open source: github.com/optiland/challenges-eval. It is the same code that the judge uses.

git clone https://github.com/optiland/challenges-eval
cd challenges-eval
python -m pip install -r requirements.txt
python challenge_evaluator.py my_lens.json --challenge rms

Use rms, doublet or wide_angle. The report shows every requirement, its value and its limit. In the locked environment (below) your result is official and equal to the judge's result. In another environment, for example Colab, the evaluator still calculates every value but marks the result as unofficial.

Engine

Rules version 2.1.0, evaluator 2.1.0. Optiland commit 61f096bb, NumPy 2.5.4, SciPy 1.18.1, Python 3.12.

What changed from version 1

ChangeReason
No penalty term P. A design that fails a requirement is not ranked.In version 1, each participant wrote their own P, so scores were not comparable.
Equal field weights, written out.Version 1 used weights w_i but did not give their values.
Mechanical vignetting is not allowed.Clipping rays can make a spot smaller while it removes light. Version 1 did not say if this was allowed.
One sensor plane and one common centroid for all wavelengths.Version 1 did not say where the image plane is, or how to combine the wavelengths.
Exact wavelengths.Version 1 gave rounded values (0.486, 0.588, 0.656 µm).
Doublet: the score is the polychromatic RMS spot, with a hard limit on axial chromatic aberration.With the stop at the lens, the first-order lateral chromatic aberration of a thin doublet is zero, so the version 1 score did not measure achromatism. Axial chromatic aberration is the important error of a doublet.
Wide angle: distortion is a hard limit (2%), and the score is MTF only.The limit makes the trade-off clear: first low distortion, then the sharpest design wins.
One published evaluator with a fixed version.Everybody gets the same result for the same design.
You submit the Optiland file of your lens.One format for everybody, written by Optiland itself. No hand-written JSON.
Surfaces without an aperture get an automatic real-ray clear radius.You do not have to set apertures. Paraxial apertures are too small at wide field angles and would clip real rays.