File size: 12,168 Bytes
46df5f0
 
 
fcffa22
 
 
 
 
 
 
 
 
 
46df5f0
 
 
 
 
 
 
 
 
 
 
 
 
 
 
fcffa22
 
 
46df5f0
 
 
fcffa22
 
46df5f0
 
fcffa22
 
 
 
 
 
 
46df5f0
fcffa22
 
 
 
 
46df5f0
 
fcffa22
 
46df5f0
fcffa22
46df5f0
fcffa22
 
 
 
 
 
 
 
 
 
 
 
 
 
 
46df5f0
 
 
 
fcffa22
46df5f0
 
 
 
 
 
 
 
 
fcffa22
46df5f0
 
 
 
 
 
fcffa22
46df5f0
 
 
 
 
 
 
 
fcffa22
 
 
46df5f0
fcffa22
46df5f0
fcffa22
 
 
46df5f0
fcffa22
 
 
 
 
46df5f0
 
 
 
 
 
fcffa22
46df5f0
fcffa22
 
 
46df5f0
fcffa22
46df5f0
fcffa22
 
 
46df5f0
fcffa22
 
 
 
46df5f0
 
 
 
 
 
 
 
fcffa22
 
 
46df5f0
fcffa22
46df5f0
fcffa22
 
 
46df5f0
 
 
fcffa22
46df5f0
 
 
fcffa22
46df5f0
 
 
 
 
 
 
fcffa22
 
46df5f0
fcffa22
 
 
46df5f0
fcffa22
46df5f0
fcffa22
 
 
 
46df5f0
 
 
 
 
 
 
 
fcffa22
46df5f0
fcffa22
 
 
46df5f0
fcffa22
46df5f0
 
fcffa22
 
 
46df5f0
 
 
 
 
 
 
 
fcffa22
46df5f0
fcffa22
 
 
 
 
 
46df5f0
fcffa22
 
 
 
46df5f0
 
 
 
 
 
 
 
 
 
 
 
fcffa22
 
46df5f0
fcffa22
 
 
 
46df5f0
fcffa22
 
46df5f0
fcffa22
 
 
 
 
46df5f0
 
 
 
 
 
 
 
fcffa22
 
46df5f0
fcffa22
 
 
 
46df5f0
fcffa22
 
 
46df5f0
fcffa22
 
 
 
 
46df5f0
 
 
 
 
 
 
 
fcffa22
 
 
46df5f0
fcffa22
 
46df5f0
 
fcffa22
 
46df5f0
 
fcffa22
 
 
 
46df5f0
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
"""
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{<style_package>} expected in preamble
    doc_class: str = ""            # \documentclass{<doc_class>} 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]