Abhishek Thakur
add admin icon
c50a91b
import io
import json
from dataclasses import dataclass
from datetime import datetime
from huggingface_hub import HfApi, hf_hub_download
@dataclass
class CompetitionInfo:
competition_id: str
autotrain_token: str
def __post_init__(self):
config_fname = hf_hub_download(
repo_id=self.competition_id,
filename="conf.json",
use_auth_token=self.autotrain_token,
repo_type="dataset",
)
competition_desc = hf_hub_download(
repo_id=self.competition_id,
filename="COMPETITION_DESC.md",
use_auth_token=self.autotrain_token,
repo_type="dataset",
)
dataset_desc = hf_hub_download(
repo_id=self.competition_id,
filename="DATASET_DESC.md",
use_auth_token=self.autotrain_token,
repo_type="dataset",
)
self.config = self.load_config(config_fname)
self.competition_desc = self.load_md(competition_desc)
self.dataset_desc = self.load_md(dataset_desc)
try:
submission_desc = hf_hub_download(
repo_id=self.competition_id,
filename="SUBMISSION_DESC.md",
use_auth_token=self.autotrain_token,
repo_type="dataset",
)
self.submission_desc = self.load_md(submission_desc)
except Exception:
self.submission_desc = None
try:
rules_md = hf_hub_download(
repo_id=self.competition_id,
filename="RULES.md",
use_auth_token=self.autotrain_token,
repo_type="dataset",
)
self.rules_md = self.load_md(rules_md)
except Exception:
self.rules_md = None
if self.config["EVAL_METRIC"] == "custom":
if "SCORING_METRIC" not in self.config:
raise ValueError(
"For custom metrics, please provide a single SCORING_METRIC name in the competition config file: conf.json"
)
def load_md(self, md_path):
with open(md_path, "r", encoding="utf-8") as f:
md = f.read()
return md
def load_config(self, config_path):
with open(config_path, "r", encoding="utf-8") as f:
config = json.load(f)
return config
@property
def submission_limit(self):
return self.config["SUBMISSION_LIMIT"]
@property
def selection_limit(self):
return self.config["SELECTION_LIMIT"]
@property
def end_date(self):
e_d = self.config["END_DATE"]
return datetime.strptime(e_d, "%Y-%m-%d")
@property
def eval_higher_is_better(self):
hb = self.config["EVAL_HIGHER_IS_BETTER"]
return True if int(hb) == 1 else False
@property
def competition_description(self):
return self.competition_desc
@property
def submission_columns(self):
return self.config["SUBMISSION_COLUMNS"].split(",")
@property
def submission_columns_raw(self):
return self.config["SUBMISSION_COLUMNS"]
@property
def submission_description(self):
return self.submission_desc
@property
def dataset_description(self):
return self.dataset_desc
@property
def logo_url(self):
return self.config["LOGO"]
@property
def competition_type(self):
return self.config["COMPETITION_TYPE"].lower().strip()
@property
def metric(self):
return self.config["EVAL_METRIC"]
@property
def submission_id_col(self):
return self.config["SUBMISSION_ID_COLUMN"]
@property
def submission_cols(self):
cols = self.config["SUBMISSION_COLUMNS"].split(",")
cols = [c.strip() for c in cols]
return cols
@property
def submission_rows(self):
return self.config["SUBMISSION_ROWS"]
@property
def time_limit(self):
return self.config["TIME_LIMIT"]
@property
def hardware(self):
return self.config.get("HARDWARE", "cpu-basic")
@property
def dataset(self):
return self.config.get("DATASET", "")
@property
def submission_filenames(self):
return self.config.get("SUBMISSION_FILENAMES", ["submission.csv"])
@property
def scoring_metric(self):
if self.config["EVAL_METRIC"] == "custom":
if "SCORING_METRIC" not in self.config:
raise Exception("Please provide a single SCORING_METRIC in the competition config file: conf.json")
if self.config["SCORING_METRIC"] is None:
raise Exception("Please provide a single SCORING_METRIC in the competition config file: conf.json")
return self.config["SCORING_METRIC"]
return self.config["EVAL_METRIC"]
@property
def rules(self):
return self.rules_md
def _save_md(self, md, filename, api):
md = io.BytesIO(md.encode())
api.upload_file(
path_or_fileobj=md,
path_in_repo=filename,
repo_id=self.competition_id,
repo_type="dataset",
)
def update_competition_info(self, config, markdowns, token):
api = HfApi(token=token)
conf_json = json.dumps(config, indent=4)
conf_json_bytes = conf_json.encode("utf-8")
conf_json_buffer = io.BytesIO(conf_json_bytes)
api.upload_file(
path_or_fileobj=conf_json_buffer,
path_in_repo="conf.json",
repo_id=self.competition_id,
repo_type="dataset",
)
competition_desc = markdowns["competition_desc"]
dataset_desc = markdowns["dataset_desc"]
submission_desc = markdowns["submission_desc"]
rules_md = markdowns["rules"]
self._save_md(competition_desc, "COMPETITION_DESC.md", api)
self._save_md(dataset_desc, "DATASET_DESC.md", api)
self._save_md(submission_desc, "SUBMISSION_DESC.md", api)
self._save_md(rules_md, "RULES.md", api)