""" Conference template definitions. Each template captures conference-specific submission requirements that we can mechanically verify from the LaTeX source. Things that genuinely require a compiled PDF (page count, font embedding, image bleed) are documented in ``extra_rules`` so the report still surfaces them as reminders to the author. The dataclass keeps every legacy field present (``name``, ``short_name``, ``page_limit_review/camera``, ``double_blind``, ``mandatory_sections``, ``optional_sections``, ``style_package``, ``checkers``, ``extra_rules``) so older callers in ``src/ui/template_selector.py`` and the report generator keep working unchanged. """ from dataclasses import dataclass, field from typing import List, Dict, Optional from enum import Enum class ConferenceField(Enum): """Research field categories.""" NLP = "Natural Language Processing" CV = "Computer Vision" ML = "Machine Learning" @dataclass class ConferenceTemplate: """Conference-specific submission requirements with verifiable per-venue rules.""" # === Identity === name: str short_name: str field: ConferenceField # === Page budget === page_limit_review: int page_limit_camera: int references_excluded: bool = True # references don't count toward limit appendix_excluded: bool = True limitations_excluded: bool = False # ACL family puts Limitations outside the budget ethics_excluded: bool = False # ACL family / ICLR exclude ethics min_main_pages: int = 0 # ICLR strictly requires >=6 # === Anonymity (double-blind) === double_blind: bool = True forbid_identifying_urls: bool = False # strict CVPR/ICCV/ECCV anonymization forbid_acks_in_review: bool = False # acknowledgments must be omitted in review arxiv_allowed: bool = True # most modern venues permit arXiv preprints # === Captions === caption_table_above: bool = True caption_figure_below: bool = True # === Required content === mandatory_sections: List[str] = field(default_factory=list) mandatory_camera_sections: List[str] = field(default_factory=list) optional_sections: List[str] = field(default_factory=list) # === Template / typesetting === style_package: str = "" # \usepackage{} expected in preamble doc_class: str = "" # \documentclass{} expected (e.g. 'llncs') paper_size: str = "" # 'letter' | 'a4' | '' (skip) single_column: bool = False font_size_pt: int = 0 # 0 = skip # === Per-venue special deliverables === requires_paper_checklist: bool = False # NeurIPS desk-rejects without it requires_reproducibility_statement: bool = False # ICLR / NeurIPS encourage requires_lay_summary_camera: bool = False # ICML camera-ready requires_type1_fonts: bool = False # ICML # === Backwards-compat fields === checkers: List[str] = field(default_factory=lambda: [ 'caption', 'reference', 'ai_artifacts', 'formatting', 'anonymization' ]) extra_rules: Dict[str, str] = field(default_factory=dict) def to_dict(self) -> dict: return { 'name': self.name, 'short_name': self.short_name, 'field': self.field.value, 'page_limit_review': self.page_limit_review, 'page_limit_camera': self.page_limit_camera, 'double_blind': self.double_blind, 'mandatory_sections': self.mandatory_sections, 'mandatory_camera_sections': self.mandatory_camera_sections, 'optional_sections': self.optional_sections, 'checkers': self.checkers, } # ============================================================================ # NLP Conferences (ACL, EMNLP, NAACL) — share the *ACL style files # ============================================================================ ACL_TEMPLATE = ConferenceTemplate( name="ACL 2025", short_name="acl", field=ConferenceField.NLP, page_limit_review=8, page_limit_camera=9, references_excluded=True, limitations_excluded=True, ethics_excluded=True, double_blind=True, arxiv_allowed=True, mandatory_sections=["Limitations"], optional_sections=["Ethical Considerations", "Ethics Statement"], style_package="acl", paper_size="a4", extra_rules={ "format": "Two-column, A4 paper, 11pt", "limitations_content": "Discussion only — no new methods/figures/results inside Limitations", "appendix": "Allowed after references", "responsible_nlp_checklist": "ARR Responsible NLP Research checklist (separate, not inline)", }, ) EMNLP_TEMPLATE = ConferenceTemplate( name="EMNLP 2024", short_name="emnlp", field=ConferenceField.NLP, page_limit_review=8, # long paper review page_limit_camera=9, references_excluded=True, limitations_excluded=True, ethics_excluded=True, double_blind=True, arxiv_allowed=True, mandatory_sections=["Limitations"], optional_sections=["Ethical Considerations", "Ethics Statement"], style_package="acl", # *ACL share the same acl.sty paper_size="a4", extra_rules={ "short_paper": "4 pages for short papers (5 camera-ready), excluding refs/limitations/ethics", "submission_route": "Submitted via ACL Rolling Review (ARR)", "limitations_content": "Discussion only — no new methods/figures/results inside Limitations", }, ) NAACL_TEMPLATE = ConferenceTemplate( name="NAACL 2025", short_name="naacl", field=ConferenceField.NLP, page_limit_review=8, page_limit_camera=9, references_excluded=True, limitations_excluded=True, ethics_excluded=True, double_blind=True, arxiv_allowed=True, mandatory_sections=["Limitations"], optional_sections=["Ethical Considerations", "Ethics Statement"], style_package="acl", paper_size="a4", extra_rules={ "review_system": "ACL Rolling Review (ARR)", "format": "Two-column, A4 paper", }, ) # ============================================================================ # Computer Vision Conferences (CVPR, ICCV, ECCV) — strict double-blind # ============================================================================ CVPR_TEMPLATE = ConferenceTemplate( name="CVPR 2025", short_name="cvpr", field=ConferenceField.CV, page_limit_review=8, page_limit_camera=8, # No extra page for camera-ready references_excluded=True, double_blind=True, forbid_identifying_urls=True, forbid_acks_in_review=True, arxiv_allowed=True, style_package="cvpr", paper_size="letter", extra_rules={ "supplementary": "Separate PDF allowed; reviewers not obligated to view", "rebuttal": "1 page max; no external links; no new contributions", "anonymous_code": "Use Anonymous GitHub (https://anonymous.4open.science) for code links", }, ) ICCV_TEMPLATE = ConferenceTemplate( name="ICCV 2025", short_name="iccv", field=ConferenceField.CV, page_limit_review=8, page_limit_camera=8, references_excluded=True, double_blind=True, forbid_identifying_urls=True, forbid_acks_in_review=True, arxiv_allowed=True, style_package="iccv", paper_size="letter", extra_rules={ "format": "Two-column, 10pt Times font", "supplementary": "Optional PDF; same deadline as main paper", "anonymous_code": "Use Anonymous GitHub for code links during review", }, ) ECCV_TEMPLATE = ConferenceTemplate( name="ECCV 2024", short_name="eccv", field=ConferenceField.CV, page_limit_review=14, page_limit_camera=14, references_excluded=True, double_blind=True, forbid_identifying_urls=True, forbid_acks_in_review=True, arxiv_allowed=True, style_package="", # uses LNCS style file, not a usepackage doc_class="llncs", paper_size="a4", extra_rules={ "format": "Springer LNCS format — use llncs.cls", "headings": "Capitalize first letter of headings except articles/prepositions/conjunctions", "fonts": "Use the LNCS default font; do NOT switch to Times", }, ) # ============================================================================ # Machine Learning Conferences (NeurIPS, ICML, ICLR) # ============================================================================ NEURIPS_TEMPLATE = ConferenceTemplate( name="NeurIPS 2025", short_name="neurips", field=ConferenceField.ML, page_limit_review=9, page_limit_camera=10, references_excluded=True, appendix_excluded=True, double_blind=True, arxiv_allowed=True, requires_paper_checklist=True, requires_reproducibility_statement=True, optional_sections=["Broader Impact", "Broader Impacts"], style_package="neurips_2025", paper_size="letter", single_column=True, extra_rules={ "checklist": "MANDATORY — papers without the NeurIPS Paper Checklist are desk rejected", "checklist_position": "After references and supplementary material; outside page limit", "appendix": "Technical appendix follows checklist; no page limit", "single_pdf": "Single PDF: main content + references + checklist + appendix", }, ) ICML_TEMPLATE = ConferenceTemplate( name="ICML 2025", short_name="icml", field=ConferenceField.ML, page_limit_review=8, page_limit_camera=9, references_excluded=True, appendix_excluded=True, double_blind=True, arxiv_allowed=True, mandatory_camera_sections=["Impact Statement"], requires_lay_summary_camera=True, requires_type1_fonts=True, style_package="icml2025", paper_size="letter", single_column=True, font_size_pt=10, extra_rules={ "fonts": "Type-1 fonts only; embed all fonts in the PDF", "lay_summary": "Plain-language summary required at camera-ready submission (OpenReview)", "impact_statement": "Required (broader impact + ethics) at camera-ready, before References", "compile_with": "Use pdflatex for best results", }, ) ICLR_TEMPLATE = ConferenceTemplate( name="ICLR 2025", short_name="iclr", field=ConferenceField.ML, page_limit_review=10, page_limit_camera=10, references_excluded=True, ethics_excluded=True, min_main_pages=6, double_blind=True, arxiv_allowed=True, requires_reproducibility_statement=True, optional_sections=["Ethics Statement", "Reproducibility Statement"], style_package="iclr2025_conference", paper_size="letter", single_column=True, extra_rules={ "format": "10pt Times New Roman, 11pt vertical spacing", "submission": "OpenReview only", "page_limit": "Strictly 6–10 pages of main text; 11th main-text page = desk reject", "reproducibility_statement": "Encouraged at end of main text, before references; <=1 page; doesn't count toward limit", }, ) # ============================================================================ # Template Registry # ============================================================================ TEMPLATE_REGISTRY: Dict[str, ConferenceTemplate] = { # NLP 'acl': ACL_TEMPLATE, 'emnlp': EMNLP_TEMPLATE, 'naacl': NAACL_TEMPLATE, # CV 'cvpr': CVPR_TEMPLATE, 'iccv': ICCV_TEMPLATE, 'eccv': ECCV_TEMPLATE, # ML 'neurips': NEURIPS_TEMPLATE, 'icml': ICML_TEMPLATE, 'iclr': ICLR_TEMPLATE, } def get_template(name: str) -> Optional[ConferenceTemplate]: """Get a conference template by short name.""" return TEMPLATE_REGISTRY.get(name.lower()) def get_all_templates() -> Dict[str, ConferenceTemplate]: """Get all available templates.""" return TEMPLATE_REGISTRY.copy() def get_templates_by_field(field: ConferenceField) -> List[ConferenceTemplate]: """Get templates filtered by research field.""" return [t for t in TEMPLATE_REGISTRY.values() if t.field == field]