|
|
| """μμ¦ λ±λ‘λΆ.
|
|
|
| μμ¦λ§λ€ λμ λ¬Όμ§κ΅°Β·κ²μ΄νΈΒ·λ°°μ μ΄ λ€λ₯΄λ€. ν νλ‘μΈμ€κ° λͺ¨λ μμ¦μ μλΉνλ―λ‘
|
| μ€μ μ **νκ²½λ³μκ° μλλΌ μΈμ**λ‘ νλ₯Έλ€ - νκ²½λ³μλ‘ λλ©΄ μμ¦ νλμ μ€μ μ΄
|
| λ€λ₯Έ μμ¦ μμ²μ μμ΄ λ€μ΄κ°λ€.
|
| """
|
|
|
| SEASONS = [
|
| {
|
| "number": 1,
|
| "name": "Open Materials Challenge",
|
| "topic": "Solid-State Battery Electrolyte",
|
| "topic_ko": "μ κ³ μ²΄ λ°°ν°λ¦¬ μ ν΄μ§",
|
| "mobile_ion": "Li",
|
| "opens": "2026-08-21",
|
| "closes": "2026-11-30",
|
| "prize": 0,
|
| "open": True,
|
| "prefix": "",
|
| "anchors": "anchor_scores.json",
|
|
|
|
|
| "gate": {
|
| "gap_min": 1.0,
|
| "hull_max": 0.10,
|
| "ea_max": 1.0,
|
| "max_atoms": 60,
|
| "require_elements": ("Li",),
|
| },
|
|
|
| "weights": {
|
| "oxidation": 40,
|
| "li_stability": 35,
|
| "novelty": 25,
|
| },
|
| },
|
| ]
|
|
|
| BY_NUMBER = {s["number"]: s for s in SEASONS}
|
| DEFAULT = SEASONS[-1]
|
|
|
|
|
| _PRIVATE = ("prefix", "anchors", "gate")
|
|
|
|
|
| def get(n=None):
|
| if n in (None, ""):
|
| return DEFAULT
|
| try:
|
| return BY_NUMBER.get(int(n), DEFAULT)
|
| except (TypeError, ValueError):
|
| return DEFAULT
|
|
|
|
|
| def gate(s):
|
| return dict(s.get("gate") or {})
|
|
|
|
|
| def path(s, name):
|
| return (s.get("prefix") or "") + name
|
|
|
|
|
| def public(s):
|
| out = {k: v for k, v in s.items() if k not in _PRIVATE}
|
| g = s.get("gate") or {}
|
|
|
| out["limits"] = {"max_atoms": g.get("max_atoms"),
|
| "hull_max": g.get("hull_max"),
|
| "gap_min": g.get("gap_min")}
|
| return out
|
|
|
|
|
| def all_public():
|
| return [public(s) for s in SEASONS]
|
|
|