From abf1efe66afb58eaa5dca697f25e29e884cd1a21 Mon Sep 17 00:00:00 2001 From: Gabriel Spadon Date: Wed, 1 Jul 2026 12:08:25 -0300 Subject: [PATCH 01/54] docs: add CiteForge project CLAUDE.md --- CLAUDE.md | 74 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 74 insertions(+) create mode 100644 CLAUDE.md diff --git a/CLAUDE.md b/CLAUDE.md new file mode 100644 index 00000000..c73f7604 --- /dev/null +++ b/CLAUDE.md @@ -0,0 +1,74 @@ +# CLAUDE.md + +Project overview and data sources: @README.md + +## Build & Run + +```bash +pip install -e . # Install (editable) +pip install -e .[dev] # Install with dev tools +python3 main.py # Run pipeline (default: data/input.csv) +python3 main.py data/custom.csv # Custom input +python3 main.py --force # Force re-enrichment (ignore cache completeness) +``` + +## Quality Gates + +All three must pass before merge: + +```bash +ruff check src/ tests/ main.py # Lint +mypy src/ main.py # Type check (strict, ignore_missing_imports) +pytest tests/ -v --tb=short # Tests (384 tests, Python 3.10-3.13) +``` + +Single test: `pytest tests/test_merge.py::test_function_name -v --tb=short` + +Ruff config: line-length 120, rules E/F/W/I/N/UP/B/C4/SIM/RUF/S (see pyproject.toml for ignores). + +## Architecture + +`main.py` is the monolithic orchestrator (~3,200 LOC). Each article passes through Phase 1 (DOI validation) → Phase 2 (multi-API enrichment) → Phase 2.5 (SerpAPI publication string fallback) → Phase 3 (late DOI inference) → Phase 4 (trust-based merge + save). Post-run: flush CSV → reconcile phantoms → remove orphans → year-window cleanup → build a2i2 → rebuild baseline.json. + +Trust hierarchy in `src/merge_utils.py:merge_with_policy()` merges fields from 13 ranked sources with special override rules for DOI (published > preprint), journal (never downgrade to preprint), title (prefer longer), pages (reject invalid), and booktitle (upgrade generic series to conference name). + +## Three-Way Fix Pattern (CRITICAL) + +**Fixes for entry types, titles, and booktitles MUST be applied in three places or oscillation occurs between consecutive runs:** + +1. `_fixup_bib_entry()` — initial fixup on load +2. Existing-file fixup in `process_article()` — before enrichment +3. Phase 4 post-merge — after trust-based merge + +Consolidated helpers `_fix_title_text()` and `_apply_booktitle_fixups()` are called from all three. When adding a new text or type fix, grep for these functions and add the fix to all call sites. + +The following fixes are also applied in all 3 locations: +- Abbreviated venue expansion (`ABBREVIATED_VENUE_MAP`) +- Venue case correction (`VENUE_CASE_CORRECTIONS`) +- Publisher-duplicate-container stripping (publisher == journal/booktitle → remove publisher) +- `JOURNALS_NAMED_PROCEEDINGS` guard (conference-keyword suffix check before reclassifying) +- `ACM_JOURNAL_PROCEEDINGS` guard (PACM journals excluded from conference-as-journal reclassification) + +## Key Conventions + +- **Config-driven**: All thresholds, API endpoints, trust order, rate limits, compound word dictionaries live in `src/config.py`. Never hardcode these values elsewhere. +- **Determinism**: Pipeline produces byte-identical output across consecutive cache-hit runs. Use `sorted()` for all directory/file iterations. No randomization in output-affecting code. +- **DOI normalization**: Always use `_norm_doi()` from `src/id_utils.py`. Always pair DOI matches with `title_similarity >= 0.55` check. +- **Preprint detection**: Uses `PREPRINT_SERVERS`, `PREPRINT_DOI_PREFIXES`, and `PREPRINT_ONLY_PUBLISHERS`. Check all three for completeness. +- **Container fields**: `@article` → `journal`, `@inproceedings`/`@incollection` → `booktitle`, `@misc` → `howpublished`. See `get_container_field()`. +- **Repository guard**: `REPOSITORY_AS_JOURNAL` (Zenodo, OSTI, Figshare, etc.) prevents @misc→@inproceedings oscillation. +- **Thesis detection**: @article with "university"/"institut" in journal → @phdthesis. +- **Book-chapter DOI**: `.ch\d+` in DOI → Wiley book chapter → reclassify @article → @incollection. +- **Content comparison guard**: Post-run fixup compares serialized output to existing file before writing, preventing phantom writes from serializer normalization. +- **Cache defensive copy**: `ResponseCache.get()` returns `dict(...)` copy to prevent mutation. +- **Orphan safety**: Never blindly delete orphan .bib files — verify as duplicates via `title_similarity >= 0.95`. +- **CSV paths**: Relative to CWD (must run from project root). +- **Fused compounds**: Never use `---` (em-dash) or accented characters in `FUSED_COMPOUND_WORDS` or `ABBREVIATED_VENUE_MAP` — serializer strips them. + +## Testing Patterns + +- Tests in `tests/` mirror `src/` modules (e.g., `test_merge.py` tests `merge_utils.py`) +- `tests/conftest.py` + `tests/fixtures.py` provide shared fixtures +- Integration tests requiring API keys auto-skip when keys unavailable +- Use `monkeypatch` for HTTP mocking; never make real API calls in unit tests +- Do NOT create automated audit modules. Fix issues via pipeline code or direct .bib edits. From 3d66c303a553008b831c89d8e31e53d660735a78 Mon Sep 17 00:00:00 2001 From: Gabriel Spadon Date: Wed, 1 Jul 2026 12:27:00 -0300 Subject: [PATCH 02/54] docs(audit): add Phase 1 invariant catalog (219 invariants, refusal floor) --- audit/01-invariant-catalog.md | 874 ++++++++++++++++++++++++++++++++++ 1 file changed, 874 insertions(+) create mode 100644 audit/01-invariant-catalog.md diff --git a/audit/01-invariant-catalog.md b/audit/01-invariant-catalog.md new file mode 100644 index 00000000..1d00c177 --- /dev/null +++ b/audit/01-invariant-catalog.md @@ -0,0 +1,874 @@ +# CiteForge INVARIANT CATALOG — Phase 1 Deliverable (Refusal Floor) + +This catalog is the authoritative behavioral contract for the CiteForge refactor campaign. Every entry below is a property the DESIGN and IMPLEMENT phases must preserve. Load-bearing invariants are ranked first within each group; violating one is a hard stop. Cross-subsystem duplicates have been consolidated into a single canonical entry with all evidence `file:line` references merged (noted as *consolidates:*). + +Severity legend: **LB** = load-bearing (byte-output or data-integrity impact) · **IMP** = important · **MIN** = minor. + +Overarching goal (the reason most of this exists): **running the tool twice on already-processed output must produce byte-identical BibTeX.** See `pipeline-double-run-fixpoint` (Determinism) and the DETERMINISM-CRITICAL SURFACES section. + +--- + +## 1. Determinism + +#### `pipeline-double-run-fixpoint` — LB +A second run over already-processed output must be byte-identical (global idempotency). This is the umbrella property the three-way fix + ASCII-clean tables + stable serialization all exist to guarantee. +- Evidence: helpers `main.py:235-254`; three-site application; serializer `src/bibtex_utils.py:302-390`; existing-file path gated by `SKIP_SCHOLAR_FOR_EXISTING_FILES` `src/config.py:61`. +- Verify: golden double-run integration test; run N and N+1 outputs byte-identical over a representative corpus. + +#### `determinism-author-sort-key` — LB +Author records are sorted by the exact composite key `(-existing_paper_count, name.lower(), scholar_id or dblp or "")` before processing — stable, tie-broken, input-order-independent. +- Evidence: `main.py:2947-2949`. +- Verify: unit test on the sort lambda with equal counts / out-of-order names+ids; golden test asserting identical order across two calls. + +#### `determinism-article-ordering` — LB +Merged publications are ordered by `sort_articles_by_year_current_first`: `(current-year-first group, -year, normalized_title, first_author_sortkey)` — a total, content-derived order independent of API return order. `max_pubs` truncation and first-writer-wins filenames depend on it. +- Evidence: `src/clients/scholar.py:169-178`. +- Verify: sort a shuffled fixture; assert output equals documented ordering and is invariant to input permutation. + +#### `determinism-phase2-source-order` — LB — ⚠ CORRECTS PRIOR DIGEST +Phase 2 queries sources in the fixed order **Scholar → S2 → Crossref → OpenReview → arXiv → OpenAlex → PubMed → EuropePMC**, appending each match to `enr_list` in that order. (The prior-study digest wrongly claimed Scholar→S2→Crossref→OpenAlex→PubMed→EuropePMC→arXiv→OpenReview. The evidence order below is authoritative.) +- Evidence: `main.py:1543,1572,1601,1621,1640,1660,1687,1706`. +- Verify: golden-master `.bib` with all sources mocked to distinct filler-only fields; assert the `SEARCH_START` log sequence equals `[S2,Crossref,OpenReview,arXiv,OpenAlex,PubMed,EuropePMC]`. + +#### `determinism-enr-list-order` — LB *(consolidates: determinism-enr-list-accumulation, enricher-iteration-order-deterministic)* +`enr_list` is a single list accumulated across P1→P2→P2.5→P3, never reset/sorted/deduped mid-pipeline; `merge_with_policy` iterates it in insertion order and, with strict-less-than trust, the earlier of equal-rank sources wins. The merged dict is therefore a deterministic function of `(primary, ordered enrichers)`. +- Evidence: `main.py:1486` (init once), append sites `src/doi_utils.py:196,199`, `main.py:703,1552`; consumed `main.py:2026`; iteration `src/merge_utils.py:277-445` (strict `<` at :432). +- Verify: assert `enr_list` identity stable and length only grows P1→P4; shuffling equal-rank enrichers must not change merged output. + +#### `determinism-doi-candidate-order` — LB *(consolidates: determinism-doi-candidate-sort-published-first, correctness-doi-candidate-published-first-nohttp, determinism-doi-candidate-set-dedup)* +Phase-3 DOI candidates are set-deduped on normalized DOI, then **stable partition-sorted published-first** (`key = 1 if is_secondary_doi else 0`), validated in order, breaking on first success. DOI inference from URLs/eprints is **HTTP-free** (cache-only), keeping P3 deterministic and independent of network timing. +- Evidence: `main.py:1945` (set-dedup), `:1949` (partition sort), `:1994-1996` (first-match break), `:1901-1943` (cache-only inference); `src/id_utils.py:44-46`. +- Verify: `[preprint, published]` → published validated first; assert no live `http_get_text` when a cached/URL-inferred DOI is available; run twice under differing `PYTHONHASHSEED`, assert identical `.bib`. + +#### `determinism-reconcile-rewrite-only-when-phantoms` — LB +`reconcile_summary_csv` rewrites the CSV (and refreshes `_SUMMARY_KNOWN_PATHS`) **only when `removed>0`**; when all files exist it returns 0 without rewriting. +- Evidence: `src/io_utils.py:415-439`. +- Verify: `test_no_phantoms_no_rewrite` (mtime unchanged, removed==0); `test_phantom_entries_removed` (removed==1, phantom gone). + +#### `determinism-orphan-abspath-resolution` — LB +`collect_orphan_files` and `_load_csv_titles` resolve CSV `file_path` via `os.path.abspath` before comparison/grouping, and `collect_orphan_files` returns a **sorted** list; orphans = on-disk `.bib` whose abspath ∉ abspath'd CSV set. +- Evidence: `src/io_utils.py:371-399` (`return sorted(orphans)` at :399); `main.py:2870`. +- Verify: `test_orphan_detected` / `test_no_orphans`; assert returned list is sorted. + +#### `determinism-a2i2-complete-rebuild` — LB +`build_a2i2_folder` wipes every regular file in `out_dir/a2i2` before copying survivors, so the folder is a pure function of current inputs (no stale accumulation). +- Evidence: `src/io_utils.py:587-593` (wipe), `:595-615` (copy). +- Verify: `test_complete_rebuild`, `test_deterministic_output`. + +#### `determinism-sorted-bib-scan` — LB *(consolidates: determinism-sorted-bib-iteration, determinism-sorted-file-scan)* +Every scan of an author dir's `.bib` files iterates in `sorted(filename)` order (baseline scan, `save_entry_to_file` duplicate scan, post-run fixup), and the duplicate scan breaks on first match — so the chosen duplicate is deterministically the sorted-first match, not FS/inode-order-dependent. +- Evidence: `main.py:817`, `src/merge_utils.py:953`, `main.py:3164,3168`; first-match breaks `merge_utils.py:1000,1011,1044,1058,1083,1099,1124,1136,1148,1168,1190`. +- Verify: two runs on a dir with 2+ matching duplicates → identical output filenames/bytes; seed `a.bib`/`z.bib` both matching → duplicate is `a.bib`. + +#### `determinism-new-author-first-stable` — IMP +After count-sorting, records are re-ordered by `(_has_output(r), original_index)` (stable sort) so authors without an existing output dir run first, ties preserving count-sort index. +- Evidence: `main.py:2971-2977`. +- Verify: mix authors with/without output dirs; assert no-output precede has-output and count-sort order preserved within each group. + +#### `determinism-title-similarity-pure` — IMP +`title_similarity`/`normalize_title` stay pure/deterministic: normalize (unescape, strip LaTeX/accents, lowercase, punct→space, collapse) then rapidfuzz ratio/100, returning exactly `1.0` on normalized equality. Every title-based branch boundary (0.55/0.6/0.95) depends on this. +- Evidence: `src/text_utils.py:130-155`, `:381-393`. +- Verify: `title_similarity('Deep Learning.','deep learning')==1.0`; snapshot `normalize_title` over a fixture set. + +#### `determinism-pattern-iteration-order` — IMP +Fix patterns are built from ordered containers (dict/tuple/list) and applied in insertion order (`_FUSED_DICT_PATTERNS`, `_COMPOUND_SUFFIX_PATTERNS`, `_ACRONYM_CASE_PATTERNS`, `_BOOKTITLE_FIXUPS`); none may become a set/frozenset. +- Evidence: `main.py:123-130,147-150,188-232`; sources `config.py:379-808`. +- Verify: run same input under two `PYTHONHASHSEED` values → identical output; assert sources are dict/tuple/list. + +#### `determinism-url-namespace-first-prefix-match` — IMP +`_classify_url` returns the namespace of the FIRST prefix (insertion order) whose substring is in the URL, else `'other'`; drives call-count tracking and rate-limiter selection. +- Evidence: `src/http_utils.py:121-143`. +- Verify: parametrized map of known hosts→namespace, unknown→`'other'`. + +#### `determinism-a2i2-pick-richer-tiebreak` — IMP +Merged duplicates: more non-empty fields wins; on tie, keep lexicographically smaller source filepath (`a if a[1] <= b[1] else b`). +- Evidence: `src/io_utils.py:535-545`. +- Verify: two equal-field duplicates in different author dirs always resolve to lower-path file across runs. + +#### `determinism-a2i2-write-order-collision` — IMP +Survivors written iterating `sorted(kept, key=basename)`; filename collisions resolved by appending `_2,_3,...` (counter starts at 2). +- Evidence: `src/io_utils.py:598-606`. +- Verify: `test_deterministic_output` + same-basename-different-dir fixture asserting stable `_2`. + +#### `determinism-flush-rewrite-only-on-updates` — IMP +`flush_summary_csv` rewrites only if `_SUMMARY_UPDATES` non-empty; else returns immediately (append-only file untouched). Clears `_SUMMARY_UPDATES` after rewrite. +- Evidence: `src/io_utils.py:334-356`. +- Verify: flush with empty updates → mtime unchanged; with one update → exactly that row rewritten, updates cleared. + +#### `determinism-cache-defensive-copy` — IMP +`get()` returns `dict(data)` (fresh shallow copy) on every hit (positive and negative), so callers cannot mutate cached state. +- Evidence: `src/cache.py:141,145`. +- Verify: mutate returned dict, re-`get()`, assert second result unaffected. + +#### `determinism-utc-year-functions` — MIN +Pipeline year computations (`get_current_year`, `get_min_year`, `CONTRIBUTION_WINDOW_YEARS`) use UTC (timezone-independent window); cache expiry deliberately uses AST (UTC-4) separately. +- Evidence: `src/clients/helpers.py:139-141`; `src/config.py:46-52`; cache AST `src/cache.py:21`. +- Verify: freeze-time near Dec31/Jan1 in two timezones; assert identical UTC-based values. + +--- + +## 2. Anti-oscillation / Three-way-fix + +#### `ao-three-way-fixup-parity` — LB *(consolidates: anti-oscillation-three-way-fixup-parity, fixup-idempotence-convergence, threeway-text-booktitle-all-3-sites, fix-title-text-substep-order-shared)* +The title/venue/type correction ruleset (core reclassifications + `_fix_title_text` + `_apply_booktitle_fixups`) must be applied **identically at all three fix sites** — (A) load-time `_fixup_bib_entry`, (B) existing-file baseline fixup, (C) Phase-4 post-merge — and each must be **convergent** (`f(f(x))==f(x)`) so any entry reaches the same fixed point regardless of path. `_fix_title_text` sub-steps run in the fixed order fused-compounds → colon-space → hyphen-space → space-hyphen → acronym-case, via one shared helper (no per-site reimplementation). +- Evidence: contract `main.py:160-161`; site A `main.py:314-492,432,440`; site B `main.py:865-1309,1205,1213`; site C `main.py:2028-2401,2279,2290`; `_fixup_bib_entry` `src/merge_utils.py:314-565`; helpers `main.py:235-254`; regression `tests/test_regression.py:2825-2867`. +- Verify: idempotency test (second run byte-identical, zero rewrites); cross-path test feeding one malformed entry through each fixup → identical results; grep-assert exactly 3 call sites each for `_fix_title_text`/`_apply_booktitle_fixups`. + +#### `ao-phase4-superset` — LB — ⚠ CORRECTS PRIOR DIGEST +Sites A/B/C are intentionally **not** byte-identical: all apply the shared CORE reclassification set, but Phase 4 (C) is a **superset** adding patent→misc, unpublished→misc, url-fragment-booktitle→misc, article-preprint-DOI handling, AND the **only** misc→inproceedings UPGRADE. (Prior digest wrongly claimed C omits the article/inproceedings reclassifications.) A refactor consolidating sites must preserve C's extras and must NOT add the misc-upgrade to A/B. +- Evidence: C-exclusive `main.py:2134-2144,2146-2151,2153-2162,2238-2259,2382-2401`; shared core C `main.py:2072-2236` mirroring A `main.py:324-421` and B `main.py:1028-1193`. +- Verify: reclassification-parity test per site; assert misc→inproceedings upgrade appears only in the Phase-4 path. + +#### `ao-is-proc-series-guard-frontiers` — LB +The inproceedings→article reclassification (JOURNAL_ONLY_PREFIXES) must be gated by `not is_proc_series` at all three sites, because `'frontiers in artificial intelligence and applications'` is in PROCEEDINGS_SERIES_AS_JOURNAL **and** matches prefix `'frontiers in '` — without the guard the type flips every run. +- Evidence: `main.py:393-394,1162-1163,2175-2176`; tables `config.py:218-226,361-368`. +- Verify: Frontiers-in-AI entry through `_fixup_bib_entry` twice → stable `@inproceedings`. + +#### `ao-is-pacm-guard` — LB +The article→inproceedings reclassification (`mu._is_conference_journal`) must be gated by `not is_pacm` (ACM_JOURNAL_PROCEEDINGS) at all three sites, because `_is_conference_journal` returns True for "Proceedings of the ACM on ..." yet PACM venues are genuine journals — else PACM type oscillates. +- Evidence: guard `main.py:417-418,1031-1032,2077-2078`; reverse rule `main.py:333-338,2098-2106`; `src/merge_utils.py:133-151`; table `config.py:230-241`. +- Verify: ACM_JOURNAL_PROCEEDINGS entry stays `@article` across two passes. + +#### `ao-disjoint-reclassification-tables` — LB +Reclassification tables must remain disjoint under startswith/eq matching so no venue string is matched by two rules that reclassify it in opposite directions (article↔inproceedings). Adding a bridging prefix reintroduces oscillation. +- Evidence: `config.py:167-241,361-368`; matching `main.py:325-421`. +- Verify: table-consistency test — no forward-table string is a startswith-prefix/equal of any reverse-table string (and vice versa); guarded pair still relies on `not is_proc_series`. + +#### `ao-ascii-clean-table-values` — LB +Every VALUE in a fix/correction table must already be the exact ASCII form `_normalize_to_ascii` produces (unidecode'd accents, straight quotes, `-`/`--`, `\&`), i.e. a fixpoint of `_normalize_to_ascii`. Otherwise the fix writes value X, the serializer rewrites to X', and the next run re-fixes → byte diff every run. +- Evidence: serializer `src/bibtex_utils.py:302-328,384`; pre-escaped examples `config.py:254,182-183`. +- Verify: for every table value `v`, assert `v == _normalize_to_ascii(v)`. + +#### `ao-candidate-doi-disk-dedup` — LB *(consolidates: anti-oscillation-candidate-doi-disk-dedup, anti-oscillation-candidate-doi-net, anti-oscillation-two-layer-nets)* +Before final write, all DOIs seen across P2 candidates (matched **and** rejected, via `seen_dois`), P2.5 injections, P3 discovery, and the merged entry's own DOI/eprint are checked against DOIs on disk in OTHER files. On a genuine match (title_similarity ≥ `SIM_PREPRINT_TITLE_THRESHOLD`=0.55) the new file is removed and write skipped; a below-threshold match instead calls `_revert_misattributed_doi` and continues. This is the **outer** of two independent dedup nets (the other being the in-`save_entry_to_file` file scan); both must remain. +- Evidence: `main.py:1490,1531-1588,2531-2588`; file-scan net `src/merge_utils.py:980-1190`; candidate collection `main.py:657-699,1745,1752,1947,2536-2540`. +- Verify: seed published `.bib` with DOI X; process an article whose candidate set includes X under a preprint title → no new file; a duplicate detectable only by title-sim (no shared DOI) is caught by the file-scan net; misattributed low-sim DOI → reverted, entry still written. + +#### `ao-skip-write-existing-better` — LB *(consolidates: anti-oscillation-skip-write-existing-better, prewrite-more-complete-guard, trust-order-prewrite-no-downgrade)* +`save_entry_to_file` keeps the existing file when it is the better version: existing published beats incoming preprint; existing-with-DOI beats incoming-without; same-class keeps existing only if it has ≥3 more populated fields; and a pre-write guard refuses to overwrite when existing has more non-empty fields, a published DOI vs incoming preprint DOI, or a specific booktitle vs generic-series — **unless** a preprint→published upgrade. +- Evidence: `src/merge_utils.py:1201-1305,1386-1416,1405-1422,1433-1451`. +- Verify: (a) existing published DOI + incoming preprint → skip; (b) existing 8 fields vs incoming 4, no upgrade → no write; (c) preprint→published upgrade with fewer fields → still writes; (d) specific vs generic booktitle → keep existing. + +#### `ao-doi-published-beats-preprint-xor` — LB +For the `doi` field, a published DOI always replaces a preprint DOI and a preprint DOI never replaces a published DOI, independent of trust rank (XOR override runs before the generic trust gate). Enforced in merge and in save. +- Evidence: `src/merge_utils.py:298-316,1230-1243,1415-1416`. +- Verify: current published DOI + incoming higher-trust preprint DOI → keep published; re-merge is a fixed point. + +#### `ao-journal-never-downgrade-to-preprint` — LB +The `journal` field is never replaced by a preprint-server value when the current journal is a real venue (tested against PREPRINT_SERVERS substrings). +- Evidence: `src/merge_utils.py:342-355`; `src/config.py:133-140`. +- Verify: `journal='Nature'` + incoming `journal='arXiv'` → kept Nature. + +#### `ao-title-keep-longer-trust-diff` — LB *(consolidates: title-keep-longer-unless-trust-diff-threshold, title-length-keep-trust-override)* +A shorter incoming title (stripped length `< TITLE_LENGTH_KEEP_RATIO=0.7 × current`) is rejected unless the incoming source is ≥ `TRUST_DIFF_OVERRIDE_THRESHOLD=3` ranks more trusted. Both constants config-sourced. +- Evidence: `src/merge_utils.py:386-405`; `src/config.py:826,829`. +- Verify: 60-char s2 title + 20-char crossref title (diff<3) → keep long; from csl (diff≥3) → allow short. + +#### `ao-eprint-removed-on-published-doi` — LB +When a non-preprint DOI coexists with an arXiv eprint, the eprint/archiveprefix/primaryclass are removed, preprint URLs rewritten to `https://doi.org/`, phantom `arXiv` journals stripped, journal backfilled from the best-ranked matching enricher (else `@article`→`@misc`). +- Evidence: `src/merge_utils.py:653-735`. +- Verify: `test_merge_doi_arxiv_handling`; OSTI-style published DOI with no journal → `@misc`. + +#### `ao-p1-stash-and-pop` — LB +When the P1 baseline DOI fails validation it is stashed in `unvalidated_doi` AND popped from `bf`, so P3 can retry it while it never leaks into merged output. +- Evidence: `main.py:1512-1514`; consumed `main.py:1839`. +- Verify: baseline DOI failing CSL/BibTeX → `bf` has no `doi` after P1; `unvalidated_doi` appears among P3 candidates. + +#### `ao-p3-gate` — LB +Phase 3 runs iff `(not doi_validated) OR is_secondary(baseline_doi)` — a validated preprint/data DOI still triggers P3 to attempt a published upgrade. +- Evidence: `main.py:1812-1814`. +- Verify: validated published → P3 skipped; validated arXiv/secondary → P3 runs; no validated DOI → runs. + +#### `ao-p3-flag-gated-extraction` — LB +Phase 3 extracts DOIs/URLs from an API source only when that source's flag is set (candidate matched baseline); baseline eprint/url always allowed. +- Evidence: `main.py:1862-1877,1885-1899,1846-1849,1881-1883`. +- Verify: non-matching candidate (flag False) → its DOI/URL never enters candidate sets. + +#### `ao-eprint-doi-injection-restored` — LB +When validating an inferred arXiv-eprint DOI, it is temporarily injected into `bf` only if `bf` had no DOI and the candidate is an eprint DOI, and is always popped back out after validation. +- Evidence: `main.py:1974-1988`. +- Verify: `bf['doi']` absent after a failed eprint-DOI validation attempt. + +#### `ao-replace-keep-directional` — LB *(consolidates: dedup-replace-keep-decision-directional, trust-order-replacement-tree)* +On a confirmed duplicate: published beats preprint (keep existing published / replace existing preprint); DOI-vs-no-DOI keeps the one with the DOI; same-class both-DOI keeps incoming UNLESS existing has ≥ `new_field_count+3` non-empty fields; year-change uses the new filename; else reuse existing key. The `+3` margin and directionality are exact. +- Evidence: `src/merge_utils.py:1203-1294,1228-1292`. +- Verify: table-driven over `(existing_preprint,new_preprint,existing_doi,new_doi,field_counts)` asserting `KEEP_EXISTING|REPLACE|USE_NEW_NAME|REUSE_KEY` and whether `os.remove` fired; `existing==new+2` vs `new+3` flips the decision. + +#### `ao-postrun-fixup-write-suppression` — LB +Post-run fixup rewrites a `.bib` only when `_fixup_bib_entry` reports a change AND the re-serialized content differs from the original; identical re-serialization is not written. +- Evidence: `main.py:3176-3180`. +- Verify: run post-run fixup twice over a canonical corpus; second pass writes 0 files, bytes/mtime stable. + +#### `ao-429-503-excluded-from-urllib3-forcelist` — LB +The urllib3 `Retry.status_forcelist` must EXCLUDE 429 and 503, which are handled ONLY by the manual retry loop — never double-backed-off by the adapter. (`respect_retry_after_header=False` is the paired guard; see `correctness-urllib3-retry-after-disabled`.) +- Evidence: `src/http_utils.py:163-175` (exclusion :169), manual handling `:357-360`. +- Verify: `assert 429 not in _RETRY_STRATEGY.status_forcelist and 503 not in ...`. + +#### `ao-preprint-pair-composite-decircularized` — IMP *(consolidates: dedup-preprint-pair-bonus-subtraction, preprint-pair-composite-decircularized, anti-oscillation-preprint-debias)* +In the different-DOI preprint/published XOR branch, the composite dedup score has the 0.10 preprint-pair bonus subtracted (`effective = score - 0.10`) before comparison to `SIM_DEDUP_COMPOSITE_THRESHOLD`=0.60, because the XOR precondition already consumed that evidence (no double-counting). +- Evidence: `src/merge_utils.py:1027-1044`; `src/config.py:811`. +- Verify: XOR pair with raw composite 0.65 / effective 0.55 must NOT match at 0.60. + +#### `ao-booktitle-generic-vs-specific-directional` — IMP +A generic series booktitle is upgraded to a specific one; a specific booktitle is never replaced by a GENERIC_SERIES_NAMES value, independent of trust. +- Evidence: `src/merge_utils.py:408-427,1421-1422`; `src/config.py:346-358`. +- Verify: specific booktitle vs `'Lecture Notes in Computer Science'` → kept specific; reverse → upgraded. + +#### `ao-fused-compounds-three-pass-order` — IMP +`_fix_fused_compounds` applies exactly three passes: dictionary → suffix → dictionary (the third catches entries newly exposed by the suffix pass). +- Evidence: `main.py:287-311`. +- Verify: `'Doubleedgeassisted'`→`'Double-Edge-Assisted'`; second call is a no-op. + +#### `ao-deferred-baseline-no-doi` — IMP +A freshly created baseline with no DOI is not written eagerly (`path=None`); it is persisted only after Phase 4 via `save_entry_to_file`, avoiding transient files that get renamed each run. +- Evidence: `main.py:1452-1461`. +- Verify: article with no DOI + successful enrichment → exactly one file (post-P4), no intermediate stub. + +#### `ao-baseline-duplicate-shortcircuit` — IMP +When the baseline save detects the article already on disk under a different name, enrichment is skipped entirely and the function returns 1 after recording the summary. +- Evidence: `main.py:1469-1484`. +- Verify: baseline save reports duplicate → enrichment phases not entered, return 1. + +--- + +## 3. Trust-ordering + +#### `to-canonical-order-strict-rank` — LB *(consolidates: trust-order-canonical-list, trust-order-strict-rank-replace, trust-ordering-single-source, trust-rank-from-list-position, trust-order-precedence)* +`TRUST_ORDER` (13 elements: `csl > doi_bibtex > datacite > pubmed > europepmc > crossref > openalex > s2 > orcid > openreview > arxiv > scholar_page > scholar_min`) is the single source-precedence authority for both `@type` selection and generic field replacement. Trust rank = list index; a populated field is replaced ONLY when the incoming rank is **strictly less** (`new_rank < cur_rank`). Equal/less-trusted never overwrite. +- Evidence: `src/config.py:66-80`; `src/merge_utils.py:241,255-266,429-445`. +- Verify: assert `TRUST_ORDER` equals frozen list; property test that the earlier-in-TRUST_ORDER source wins a contested field; equal-rank second enricher does NOT overwrite. + +#### `to-unknown-source-rank-99` — LB *(consolidates: unknown-source-rank-99, trust-ordering-label-keys-match)* +Any source label not in `TRUST_ORDER` defaults to rank 99 (least trusted); it can only fill empty fields. Every `enr_list` label must be a real `TRUST_ORDER` key (a typo silently drops a source to 99 with no error). +- Evidence: `src/merge_utils.py:261,397,430-431,713`; labels `main.py:1552,1586,1614,1633,1652,1673,1700,1719`, `src/doi_utils.py:196,199`. +- Verify: enricher `source='bogus'` cannot overwrite a crossref field; assert set(labels) ⊆ set(TRUST_ORDER). + +#### `to-doi-source-gate` — LB *(consolidates: trust-doi-source-gate, doi-trust-gate-registration-agencies-only)* +A surviving merged DOI is retained only if some enricher from `{csl, doi_bibtex, datacite, pubmed, europepmc, crossref}` carries a DOI whose normalized form equals it; otherwise it is stripped. (Gate skipped when `has_doi_conflict` is True.) A primary/merged DOI conflict keeps the primary unless it is a preprint→published upgrade. +- Evidence: `src/merge_utils.py:457-502`. +- Verify: DOI from s2/arxiv only → dropped; same DOI also on crossref → kept; primary published vs merged preprint → primary kept. + +#### `to-empty-fill-bypasses-trust` — LB +The first `value_ok` value for an empty field is accepted unconditionally (sets `field_sources`) with no trust comparison; trust gating applies only when overwriting an already-populated field. +- Evidence: `src/merge_utils.py:288-295`. +- Verify: a field present only in the lowest-trust enricher still lands in merged output. + +#### `to-type-upgrade-valid-set-rank` — LB +Entry type upgrades from an enricher only if the enricher type ∈ `{article,inproceedings,incollection,book}` AND (its rank strictly better than `best_type_src`, OR equal rank with a differing type). `best_type_src` starts at `scholar_min`. +- Evidence: `src/merge_utils.py:243,254,260-271`. +- Verify: `test_merge_with_policy` (crossref inproceedings beats s2 article); a `misc`-typed high-trust enricher does not set `etype=misc`. + +#### `to-field-override-rules` — LB (umbrella) +Field-specific overrides that run **before/around** the generic trust gate, all preserved: DOI published-over-preprint (`ao-doi-published-beats-preprint-xor`); journal never→preprint (`ao-journal-never-downgrade`); title keep-longer/trust-diff (`ao-title-keep-longer-trust-diff`); booktitle generic↔specific (`ao-booktitle-generic-vs-specific`); pages leading-digit/no-dot/≤`PAGES_MAX_DIGITS` (`co-pages-validation`); author prefer-fewer-initials-then-longer (`co-author-prefer-fewer-initials`). Dropping any special-case lets a strictly-trusted source overwrite with worse data and re-triggers enrichment churn. +- Evidence: `src/merge_utils.py:298-427`; thresholds `src/config.py:826,829,340`. +- Verify: parametrized tests per field (see individual entries). + +#### `co-author-prefer-fewer-initials` — IMP (trust-adjacent) +At equal author-list length, incoming is rejected if it has MORE initials-only tokens (`^[A-Z]\.$`); at equal initials, rejected if its total name text is shorter. Runs before the trust gate. +- Evidence: `src/merge_utils.py:358-383,60`. +- Verify: current `'Samuel Smith'` + higher-trust `'S. Smith'` (same count) → keep full name. + +--- + +## 4. Dedup + +#### `dd-branch-order-first-match` — LB *(consolidates: dedup-branch-order-first-match-wins, dedup-scan-branch-order-first-break, dedup-branch-order-cascade)* +`save_entry_to_file`'s duplicate scan evaluates rules in fixed precedence and **breaks on first match**: DOI-exact → DOI-version base (`.vN`) → different-DOI preprint/published XOR (distinct-arXiv-eprint exclusion; title ≥0.55; composite−0.10 ≥0.60) → external-id+title → key+title/prefix → key+author-overlap (≥0.8, sim≥0.55) → key+preprint-pair → high-title-sim ≥0.95 → truncated+authors → strong-author (sim≥0.6, overlap≥0.9) → preprint-relaxed. Reordering changes which existing file is deemed the duplicate. +- Evidence: `src/merge_utils.py:980-1190`; `src/config.py:130,205,811`. +- Verify: table-driven, one crafted pair per branch asserting the emitted `FILE_MATCH` tag equals the earliest-firing branch; an ordering test where two branches could fire asserts higher-priority wins. + +#### `dd-composite-weights` — LB +`compute_dedup_score` is the additive 6-signal sum with exact weights: title 0.40, author-overlap 0.25, year 0.10(exact)/0.05(±1), venue 0.15, external_ids 0.15, preprint-XOR 0.10 (max 1.15). +- Evidence: `src/text_utils.py:511-546`. +- Verify: parametrized exact-score test (identical title+year+venue → 0.65); assert max attainable == 1.15. + +#### `dd-all-candidate-dois-includes-unmatched` — LB +`all_candidate_dois` collects normalized DOIs from ALL P2 candidates (matched and rejected via `seen_dois`), plus P2.5 injections, P3 discovery, and the merged entry's own DOI/eprint — for save-time on-disk dedup. Narrowing to matched-only reopens preprint/published oscillation. +- Evidence: `main.py:1490,694-699,1745,1752,1947,2536-2540`; passed as `seen_dois` at `main.py:1588,1616,1635,1655,1674,1702,1721,1773,1800`. +- Verify: a source returns a non-matching candidate carrying DOI X → X ∈ `all_candidate_dois` after P2. + +#### `dd-title-similarity-guard` — LB +A candidate DOI matching an existing on-disk file's DOI suppresses the write only when the two titles are similar (≥ `SIM_PREPRINT_TITLE_THRESHOLD`=0.55); below threshold the match is rejected as misattributed and the DOI reverted. Prevents a false API DOI from deleting an unrelated file. +- Evidence: `main.py:2564-2574`; `src/config.py:205`. +- Verify: existing DOI == candidate DOI, dissimilar titles → write proceeds + `_revert_misattributed_doi`; similar → write skipped, file removed. + +#### `dd-self-match-exclusion` — LB *(consolidates: dedup-self-match-exclusion, prefer-path-excluded-from-dup-scan)* +The entry's own `prefer_path`/`prefer_doi` is excluded from every duplicate scan: `prefer_basename` skipped in the file-scan loop, `prefer_doi` removed from `check_dois`, self path skipped by abspath compare — so an entry never dedups against / deletes itself. +- Evidence: `src/merge_utils.py:978-982`; `main.py:2542-2543,2549-2550`. +- Verify: enrich an in-place file whose DOI is also in `all_candidate_dois` → file updated, not skipped/removed; a real cross-file duplicate in a different file is still detected. + +#### `dd-strict-match-gate` — LB *(consolidates: correctness-strict-match-gate, dedup-strict-match-fastpath-order)* +Every enrichment entry (Scholar page, each API candidate, CSL, BibTeX) is admitted only after `bibtex_entries_match_strict` passes against the baseline. Its fast-path order/gates: exact-DOI True; same-class different-DOI False; XOR preprint/published falls through; exact arXiv eprint True / different eprint False; external_ids+title≥0.35 True; title≥0.95 requires author-overlap and no year divergence; truncated requires overlap+year; below 0.35 False; composite only when (preprint_pair | external_ids | high_author_match with ≥2 authors each). +- Evidence: gate impl `src/bibtex_utils.py:553-612,567-686`; call sites `main.py:701,1551`, `src/doi_utils.py:44,82`. +- Verify: a candidate differing in title/DOI/arXiv is rejected; parametrized tests per path (`DOI_EXACT`, `ARXIV_EXACT`, same-class-different-DOI→False, XOR→composite). + +#### `dd-orphan-delete-only-confirmed-dup` — LB +An orphan `.bib` (on disk, absent from CSV) is deleted ONLY when its parsed title has similarity ≥ `SIM_MERGE_DUPLICATE_THRESHOLD`=0.95 to a CSV-tracked title in the SAME author directory; empty title or no tracked match → kept (warning logged, never deleted). +- Evidence: `main.py:3093-3109,3091-3096`; `_load_csv_titles` grouping `main.py:2870-2877`. +- Verify: orphan matching a tracked same-dir title → removed; unique/empty-title orphan → retained; orphan in author A must not be deleted based on author B's title. + +#### `dd-a2i2-doi-before-title` — LB +a2i2 dedup runs DOI-based dedup (Pass 1, `doi_bases_match` fuzzy) across ALL entries first, then title-similarity dedup (Pass 2, ≥0.95) only for entries not already DOI-matched (`if idx in seen`). +- Evidence: `src/io_utils.py:547-585`. +- Verify: `test_dedup_by_title` + DOI-dup fixture; assert count==1. + +#### `dd-doi-version-equivalence` — IMP +`doi_bases_match` treats DOIs differing only by trailing `.vN` as the same work; this branch fires before the different-DOI XOR logic. +- Evidence: `src/id_utils.py:50-58`; consumed `src/merge_utils.py:1003`. +- Verify: `.v1`/`.v2` of same preprint → match; mismatched bases → no match. + +#### `dd-distinct-arxiv-different-papers` — IMP +Two entries with distinct non-empty arXiv eprint IDs are different papers — short-circuits preprint/published matching in file-scan and key-preprint branches and returns False in strict match. +- Evidence: `src/merge_utils.py:1020-1023,1107-1110`; `src/bibtex_utils.py:597-602`. +- Verify: eprints `2401.00001` vs `2401.00002`, similar titles, XOR DOI → not a duplicate. + +#### `dd-merge-union-primary-first` — IMP +`merge_publication_lists` dedups Scholar (primary) and DBLP (secondary) independently, then appends only non-duplicate secondary items to the primary-first list using `SIM_MERGE_DUPLICATE_THRESHOLD` — Scholar takes precedence, union size/order deterministic. +- Evidence: `src/clients/scholar.py:234-265,188-192`. +- Verify: Scholar+DBLP sharing one paper → single merged entry retaining the Scholar record; primary items precede appended secondary. + +#### `dd-orphan-title-scoped-to-author-dir` — IMP +Orphan duplicate comparison uses only titles tracked under that orphan's own author directory (`os.path.dirname(orphan)`), never the global set. +- Evidence: `main.py:3091-3096`; grouping `main.py:2870-2877`. +- Verify: two authors with same title; orphan under A not deleted based on B's tracked title. + +#### `dd-skip-write-return-cleanup` — IMP +On `skip_write`, return `(duplicate_path, False)` and, if `prefer_path` differs from the duplicate, remove the pre-enrichment baseline file (no stub left behind). +- Evidence: `src/merge_utils.py:1298-1305`. +- Verify: file count stays 1, path reused, `was_written` False. + +#### `dd-prefer-path-cleanup-blocked-when-richer` — IMP *(consolidates: prefer-path-cleanup-blocked-when-richer, data-loss-prefer-path-guard)* +When relocating an entry, the old `prefer_path` file is NOT deleted if it has more non-empty fields than the new entry, or equal fields plus a DOI; then return `(prefer_path, False)`, keeping the enriched original. +- Evidence: `src/merge_utils.py:1433-1455`. +- Verify: `prefer_path` 7 fields incl DOI, new 5 → kept, `os.remove` not called, `was_written` False. + +--- + +## 5. Cache + +#### `ca-monthly-boundary-expiry` — LB *(consolidates: cache-monthly-boundary-expiry, cache-monthly-expiry-boundary)* +Any cache entry (positive or safe-negative) whose timestamp precedes the 1st-of-current-month AST (UTC-4) boundary is stale → MISS, forcing a fresh request. The boundary is computed once at `ResponseCache` construction (see defect `ca-month-boundary-frozen`). +- Evidence: `src/cache.py:24-32,121-126`; AST `src/cache.py:21`. +- Verify: entry timestamped before the 1st → `get()` None; after → served. + +#### `ca-get-branch-order` — LB +`get()` evaluates in fixed order: (1) `CACHE_ENABLED` gate, (2) file-exists, (3) JSON-load (corrupt→MISS), (4) monthly-boundary staleness, (5) negative handling — unconfirmed (`not _safe`)→MISS/force-retry, safe→`_safe_negative_expired` check, else NEG_HIT, (6) positive→POS_HIT. +- Evidence: `src/cache.py:99-145`. +- Verify: table-driven over fresh/stale/unconfirmed-neg/safe-neg-live/safe-neg-expired/positive. + +#### `ca-negative-three-tier` — LB *(consolidates: cache-negative-three-tier-confirmation, cache-negative-three-tier, anti-oscillation-three-run-negative-confirmation)* +Negative entries are three-tier: transient errors never cached; unconfirmed negatives (`_confirmations < CACHE_NEGATIVE_CONFIRM_RUNS`=3) stored but NOT served (force retry); only after 3 consecutive empties is a "safe" negative served, expiring at the earlier of next Monday or 1st-of-next-month (AST). `put_negative` increments confirmations (capped then +1) and sets `_safe` at ≥3. This is the core anti-flap contract. +- Evidence: `src/cache.py:41-47,128-141,184-223`; `_safe_negative_expired` `:70-97`; `CACHE_NEGATIVE_CONFIRM_RUNS` `config.py:126`. +- Verify: `put_negative` 1–2× → `get()` None (retry); 3rd → served until Monday/month boundary. + +#### `ca-safe-negative-expiry` — LB +`_safe_negative_expired` expires a safe negative at the EARLIER of next-Monday-00:00-AST or 1st-of-next-month-00:00-AST, computed from the entry's own creation timestamp (Monday-created → `+7` days, `days_to_monday = (7-weekday)%7 or 7`). +- Evidence: `src/cache.py:70-97,134-138`. +- Verify: parametrized over creation weekdays asserting `expiry == min(next_monday, next_first)`. + +#### `ca-atomic-write` — LB *(consolidates: cache-atomic-write-tmp-replace-warn-noraise, concurrency-atomic-cache-write)* +`_write_entry` writes via `tempfile.mkstemp` + `os.replace` (atomic); on failure the tmp file is removed and `OSError` is caught/logged at WARN without raising — readers never see a partial JSON, and cache-write failures never propagate. +- Evidence: `src/cache.py:159-182`. +- Verify: simulate `os.replace` failure → no tmp files remain, no exception, target never partial. + +#### `ca-positive-freshness-not-ttl` — LB *(consolidates: cache-positive-freshness-not-ttl, cache-ttl_days-written-not-read-vestigial)* +Positive freshness is governed **solely** by the monthly boundary — `get()` does NOT enforce per-entry `ttl_days`. `ttl_days` is written by `put`/`_write_entry` and accepted as an arg but **never read by `get()`** (vestigial). A refactor that "restores" ttl_days honoring silently overrides the monthly-refresh model for every namespace. +- Evidence: `src/cache.py:99-145,147,165`; callers `src/clients/utility_apis.py:160,275`; DOI-from-HTML ttl `main.py:1933,1936`. +- Verify: store a positive entry with `ttl_days=1` timestamped after the month boundary → still served; entry before boundary → MISS regardless of ttl. + +#### `ca-confirmation-rmw-under-lock` — LB +`put_negative` does read-existing / increment / write-back of `_confirmations` entirely under the per-namespace lock; the count is monotonic and saturates (`min(existing,N)+1`). +- Evidence: `src/cache.py:195-223`; `_lock_for` `:56-58`. +- Verify: concurrent `put_negative` on one key → final count increased by number of calls (bounded by cap). + +#### `ca-doi-html-negative-on-read` — IMP +Phase-3 DOI-from-HTML scraping caches both HTTP failures and empty scrapes as `{'doi':''}` (ttl_days=60) and, on read, treats an empty cached doi as a negative hit (continue to next URL) — no repeat HTTP within the window. +- Evidence: `main.py:1919-1936`. +- Verify: first run scrapes empty + caches; second run reads cache, no HTTP, moves to next URL. + +#### `ca-counters-exactly-one-per-get` — IMP +Every terminating path of `get()` increments exactly one of `_CACHE_POS_HITS`/`_CACHE_NEG_HITS`/`_CACHE_MISSES` under `_CACHE_COUNTER_LOCK`. +- Evidence: `src/cache.py:100-145`; lock `:19`. +- Verify: exercise each branch once; assert exactly one counter moves per call and totals reconcile. + +#### `ca-disabled-is-total-noop` — IMP +When `CACHE_ENABLED` is False, `get()` returns None (no counter change) and `put`/`put_negative` return immediately without touching disk. +- Evidence: `src/cache.py:101,148,192`; `config.py:127`. +- Verify: disabled → `get` None, no files written. + +#### `ca-month-boundary-frozen` — IMP — ⚠ LATENT DEFECT +`self._month_boundary` is computed once in `__init__`, and `response_cache` is a module-level singleton created at import — the staleness boundary is frozen for the process lifetime and does not advance across a month rollover. Current behavior tests observe; see CONFLICTS. +- Evidence: `src/cache.py:54,257,24-32`. +- Verify: instantiate cache, monkeypatch clock to next month, assert `_month_boundary` unchanged unless a new `ResponseCache` is built. + +--- + +## 6. Concurrency + +#### `co-shared-state-locks` — LB *(consolidates: concurrency-shared-state-locks, csv-mutations-under-lock, cache-per-namespace-lock-and-sha256-path, concurrency-per-namespace-lock)* +All shared mutable state is lock-guarded: per-namespace cache file locks (`_lock_for` under `_meta_lock`, held for every get/put/put_negative/invalidate), a global cache-counter lock, and the summary-CSV in-memory index/updates (`_CSV_LOCK`) and API counters. Cache entry paths are `cache_dir/namespace/.json`. +- Evidence: `src/cache.py:19,52-68,103-108,155-157`; `src/io_utils.py:40,281-283,303-304,316,334,415`. +- Verify: thread-stress `put_negative` + `append_summary_to_csv` from many threads on one key → no corruption, correct final counts; assert path == `.../sha256hex.json`. + +#### `co-single-writer-per-author-dir` — LB *(consolidates: single-writer-per-author-dir-no-lock, concurrency-single-writer-per-author-dir)* +`save_entry_to_file` performs unlocked read-modify-write (`listdir`+read+`os.remove`+`open('w')`) on the author dir; dedup/anti-oscillation correctness assumes **at most one writer per author dir** — parallelism is across authors (`ThreadPoolExecutor`, `MAX_WORKERS`), one `process_record` per Record. Any refactor parallelizing within an author MUST add per-dir locking. +- Evidence: `src/merge_utils.py:949-1504` (no lock); `main.py:2998-3018`; `src/config.py:833,854`. +- Verify: assert records map to unique `format_author_dirname` per submitted future; document the precondition; stress test two concurrent saves on one dir is expected-flaky (records the assumption). + +#### `co-sleeps-outside-global-semaphore` — LB +All `time.sleep()` (backoff and Retry-After waits) occur OUTSIDE the `with _GLOBAL_SEMAPHORE:` block; the semaphore is held only for the actual request send/receive. +- Evidence: `src/http_utils.py:338-369` (semaphore :338-363, sleeps :366-369). +- Verify: instrument acquire/release around a forced 429; assert semaphore released before sleep. + +#### `co-global-semaphore-bounds-inflight` — IMP +A single module-level `threading.Semaphore(GLOBAL_CONCURRENCY_LIMIT=16)` gates every in-flight HTTP request across all threads; each attempt acquires one permit for the send. (Default 16 > `MAX_WORKERS` 12, so it rarely binds but must still bound when `CITEFORGE_CONCURRENCY` is lowered.) +- Evidence: `src/http_utils.py:177,338`; `src/config.py:854`. +- Verify: `CITEFORGE_CONCURRENCY=2`, 8 threads → max concurrent in-flight ≤ 2. + +#### `co-threadpool-worker-cap` — IMP +Author processing runs on `ThreadPoolExecutor(max_workers=MAX_WORKERS)` (default 12, `CITEFORGE_MAX_WORKERS` override); the env var is the single knob. +- Evidence: `src/config.py:833`; `main.py:2998,3001-3018`. +- Verify: executor constructed with `MAX_WORKERS`; `CITEFORGE_MAX_WORKERS=1` smoke run completes identically. + +#### `co-thread-local-logging` — IMP +Each worker rebinds the logger to a per-author `author.log` via `logger.set_log_file` at `process_record` start and closes it in `finally`; the main thread logs to `output/run.log`. +- Evidence: `main.py:2707-2709,2847-2849,2898`. +- Verify: two `process_record` calls on separate threads → each author's lines only in its own log. + +#### `co-result-timeouts` — IMP +Result collection uses `future.result(timeout=30)` per author and `as_completed(..., timeout=author_timeout*len(records))` with `author_timeout=1800`; timeouts are caught/logged (per-author + pipeline-level listing pending authors) rather than crashing. +- Evidence: `main.py:2996,3023,3026,3033-3052`. +- Verify: a future sleeping >30s → TimeoutError branch logs, processing continues; overall timeout == 1800×len. + +#### `co-rate-limit-token-once-per-call` — IMP +`limiter.acquire()` is called exactly once per `_http_request`, before the retry loop — retries consume no additional tokens. +- Evidence: `src/http_utils.py:327-329,334`. +- Verify: force 3 manual retries → `acquire` called once. + +#### `co-token-bucket-semantics` — IMP +`TokenBucketRateLimiter` refills using `time.monotonic()` (`elapsed*rate` capped at burst), deducts 1.0 per acquire, and when starved sleeps `wait=(1-tokens)/rate` + jitter up to 30% (`uniform(0, wait*0.3)`), all under a per-limiter lock. +- Evidence: `src/http_utils.py:183-211`. +- Verify: observed throughput ≈ rate with burst headroom; assert `time.monotonic` used. + +#### `co-rate-limiter-registry-singleton` — IMP +`_get_rate_limiter` returns None when the namespace is absent from `RATE_LIMITS` (no throttling), else lazily creates exactly one limiter per namespace via double-checked locking. +- Evidence: `src/http_utils.py:214-233`; `src/config.py:836-850`. +- Verify: `_get_rate_limiter('other') is None`; `_get_rate_limiter('arxiv') is _get_rate_limiter('arxiv')`. + +#### `co-thread-excepthook-visibility` — MIN +A custom `threading.excepthook` logs any uncaught worker-thread exception (name + type/value) before delegating to the original hook. +- Evidence: `main.py:2982-2992`. +- Verify: force an uncaught worker exception → ERROR log naming thread+exception; original hook still runs. + +#### `co-session-per-thread-rotation` — MIN +`_get_session` returns a thread-local `requests.Session` with `_RETRY_STRATEGY`, rotated (closed+recreated) after `SESSION_ROTATION_THRESHOLD=50` requests; the counter increments once per attempt (retries count toward rotation). +- Evidence: `src/http_utils.py:245-260,340-341`; `src/config.py:857`. +- Verify: 51 requests on one thread → exactly one rotation. + +--- + +## 7. Error-handling + +#### `eh-per-unit-isolation` — LB *(consolidates: error-handling-per-unit-isolation, error-handling-per-source-isolation)* +Failures are isolated at each granularity: per-article exceptions (`FULL_OPERATION_ERRORS`) caught inside the article loop; per-source API exceptions (`ALL_API_ERRORS`) caught around every P2/P2.5 enrichment call — one article or one source failing never aborts the author or the run. +- Evidence: article loop `main.py:2840-2841`; per-source `main.py:1567-1568,1598-1599,1618-1619,1637-1638,1657-1658,1685-1686,1704-1705,1723-1724,1775-1779,1802-1806`. +- Verify: one API client raises → enrichment proceeds with remaining sources; one article raises → subsequent articles still process. + +#### `eh-error-tuple-membership-frozen` — LB +Exception-group tuple membership is a frozen contract downstream catches depend on: `NETWORK_ERRORS = HTTP_ERRORS + TIMEOUT_ERRORS + (RuntimeError,)` **excludes** ValueError; `ALL_API_ERRORS = NETWORK_ERRORS + DECODE_ERRORS` **excludes** ValueError; `ALL_FETCH_ERRORS = NETWORK_ERRORS + DECODE_ERRORS + PARSE_ERRORS` **includes** ValueError (via `PARSE_ERRORS=(ValueError,TypeError,KeyError)`); `DECODE_ERRORS=(UnicodeDecodeError,UnicodeError)`. +- Evidence: `src/exceptions.py:31-49`. +- Verify: assert `ValueError not in ALL_API_ERRORS and ValueError not in NETWORK_ERRORS and ValueError in ALL_FETCH_ERRORS`. + +#### `eh-handle-api-errors-scope` — LB +`@handle_api_errors` wraps a call in `try/except ALL_API_ERRORS`, logs DEBUG, returns `default_return`; it does NOT catch ValueError/parse errors — JSON-decode failures propagate through decorated functions. +- Evidence: `src/http_utils.py:263-278`. +- Verify: decorated fn raising ValueError propagates; raising `RequestException` → `default_return`. + +#### `eh-decode-json-valueerror-with-url` — LB — ⚠ DEFECT-ADJACENT +`_decode_json_bytes` raises a plain `ValueError` (not NETWORK/DECODE) on malformed JSON, with the message embedding the **full request URL** (`{url!r}`) + 256-byte preview. This type (uncaught by `ALL_API_ERRORS`) and the URL-carrying payload are the active key-leak vector for URL-embedded secrets. +- Evidence: `src/http_utils.py:388-399`. +- Verify: on bad bytes, `isinstance(raised, ValueError)` and `url in str(raised)`. + +#### `eh-gemini-key-leak` — LB — ⚠ DEFECT +The Gemini URL embeds the secret as `?key={api_key}`; a malformed-JSON `ValueError` carries that full URL, and the Gemini caller catches `(*ALL_API_ERRORS, ValueError)` and logs it at WARN — exposing the API key in warning logs. The invariant to enforce is **redaction of URL secrets before logging**. +- Evidence: `src/clients/utility_apis.py:45,88-90`; leak source `src/http_utils.py:399`. +- Verify: assert `'key='` not in captured WARN record when Gemini returns invalid JSON. + +#### `eh-bibyear-fallback-lower-bound-guard` — LB +The BibTeX-year fallback removes a file only when `0 < bib_year < window_min`; `bib_year == 0` (missing/unparseable, `extract_year_from_any(fallback=0)`) never triggers deletion. +- Evidence: `main.py:3142-3151`. +- Verify: unparseable-year file retained; year=2000 (= SIM_MERGE_DUPLICATE_THRESHOLD`. + +#### `cd-min-year-max-pubs` — IMP *(consolidates: config-driven-min-year-and-max-pubs, min-year-config-driven-env)* +`MIN_YEAR` = `CITEFORGE_MIN_YEAR` (default 2020) with a rolling-window fallback when unset (`get_min_year`); `MAX_PUBLICATIONS_PER_AUTHOR` = `PUBLICATIONS_PER_YEAR × CONTRIBUTION_WINDOW_YEARS`. Both env/derived, never fixed literals; the year-window cleanup and a2i2 filter must use `get_min_year()`. +- Evidence: `src/config.py:32-43,52-58`; consumed `main.py:2717,2731,3117`, `src/io_utils.py:494`. +- Verify: `CITEFORGE_MIN_YEAR=2015` → `get_min_year()==2015` and `MAX_PUBLICATIONS_PER_AUTHOR` scales, both cleanup and a2i2 honor it; unset → rolling fallback. + +#### `cd-inline-magic-numbers-preserved` — IMP +Several load-bearing inline literals in the dedup cascade are intentional and must be preserved (not naively routed through one shared constant): key+author-overlap gate (`overlap≥0.8 AND key_title_sim≥0.55`), strong-author gate (`sim≥0.6, ≥2 authors each, overlap≥0.9`), prefix-stub `len>20`, `high_author_match` (`overlap≥0.9, title≥0.6, ≥2 authors`), and the `+3` field-advantage margin. +- Evidence: `src/merge_utils.py:1072-1073,1090,1151-1156,1250`; `src/bibtex_utils.py:666-671`. +- Verify: golden boundary tests — `overlap=0.79 vs 0.80` flips `KEY_AUTHOR_OVERLAP`; `existing==new+2 vs new+3` flips `KEEP_EXISTING` vs `REPLACE`. + +#### `cd-urllib3-retry-params` — IMP +The urllib3 `Retry` is built from config: `total=HTTP_MAX_RETRIES(2)`, `backoff_factor=HTTP_BACKOFF_INITIAL(0.25)`, `backoff_max=HTTP_BACKOFF_MAX(16.0)`, forcelist derived from `HTTP_RETRY_STATUS_CODES`. +- Evidence: `src/http_utils.py:163-175`; `src/config.py:107-110`. +- Verify: assert `_RETRY_STRATEGY.total==HTTP_MAX_RETRIES and backoff_factor==HTTP_BACKOFF_INITIAL`. + +#### `cd-sim-threshold-fp-tolerance` — MIN +Candidate-acceptance similarity comparisons apply `SIM_THRESHOLD_TOLERANCE=0.01` as FP slack (e.g. `SIM_EXACT_PICK_THRESHOLD - tolerance`). +- Evidence: `src/config.py:823,90`; consumed `src/api_generics.py:320`. +- Verify: score == threshold−epsilon → acceptance stable. + +--- + +## 10. Correctness + +#### `co-return-code-contract` — LB *(consolidates: api-contract-return-counts, api-contract-return-code)* +`process_article` returns 1 exactly when a file is written/kept and 0 for every skip/failure/dedup/guard path; `process_record` sums these into the per-author count; `main()` aggregates into `total_saved`. The 1/0 int-sum contract is load-bearing for reporting. +- Evidence: `main.py:734-737,762,778,1356,1484,2485,2500,2522,2529,2586,2607,2829-2846,3027`. +- Verify: assert `process_article` returns int ∈ {0,1} across skip and write paths; `process_record` returns the sum. + +#### `co-save-return-tuple` — LB +`save_entry_to_file` returns `(path, was_written)`: `was_written` False on SKIP_WRITE, prefer-path-more-complete block, and unresolved filename collision. Callers rely on `path2 != path` (rename) and `was_written` for accounting. +- Evidence: `src/merge_utils.py:934,1305,1382,1451,1504`; consumed `main.py:1463-1470,2609-2614`. +- Verify: each exit returns `(path, bool)`; SKIP_WRITE → False; fresh write → True. + +#### `co-value-ok-gate-every-field` — LB +`value_ok(v) = (v is not None) and (not has_placeholder(v))` gates EVERY field on both sides: a placeholder/None incoming value is skipped; a placeholder/None current value is treated as empty (overwritable regardless of trust). +- Evidence: `src/merge_utils.py:251-252,285-295`. +- Verify: enricher `'n/a'` skipped; placeholder current value replaced by a lower-trust real value. + +#### `co-doi-normalize-or-drop` — LB +Merged `doi` is normalized via `_norm_doi`; empty result → removed, else replaced with the normalized form before any downstream DOI logic. +- Evidence: `src/merge_utils.py:447-455`. +- Verify: `test_doi_normalization`; `merged['doi'] == _norm_doi` form. + +#### `co-doi-conflict-primary-wins` — LB +If the primary had a DOI and the merged DOI differs, the primary DOI is restored and `has_doi_conflict` set — UNLESS a preprint→published upgrade (published kept, no conflict). `has_doi_conflict` also controls whether the trust gate runs. +- Evidence: `src/merge_utils.py:457-477`. +- Verify: primary `10.x/A`, merged `10.y/B` (both published) → restored to A; primary preprint, merged published → published kept. + +#### `co-container-enforcement-by-type` — LB +Exactly one venue container per final type (`get_container_field`): article keeps `journal` (booktitle/howpublished popped); inproceedings/incollection keep `booktitle` (journal migrated/popped); all others keep `howpublished`. Last structural step before serialization. +- Evidence: `src/merge_utils.py:879-913`; `src/bibtex_build.py:27-37`. +- Verify: per-type — `@article` has journal + no booktitle/howpublished; `@inproceedings` has booktitle + no journal. + +#### `co-type-revalidate-authoritative` — LB +`determine_entry_type` over `{journal,booktitle,howpublished,publisher,pages}` may reclassify to inproceedings/incollection, but an `@article` from an authoritative source (`best_type_src ∈ {csl, doi_bibtex}`) is preserved unless its DOI is secondary; `@book` never downgraded by venue content; `@misc` upgraded via venue hints. +- Evidence: `src/merge_utils.py:821-858`; `src/bibtex_build.py:176-230`. +- Verify: csl `@article` with conference-like journal stays `@article`; `@misc` with only journal → article. + +#### `co-year-window-enforced-everywhere` — LB *(consolidates: correctness-year-window-enforced-everywhere, correctness-year-window-guard, a2i2-window-filter-inclusive-both-ends, filename-year-takes-precedence-over-bibyear)* +The `min_year` window is enforced at every checkpoint so no out-of-window `.bib` survives a completed run: at fetch (`scholar_windowed`/DBLP), at baseline load (out-of-window existing file removed), at final save (`0 < final_year < min_year` → rejected+removed, return 0), and in the post-run sweep. The sweep tries the **filename year first** (`_FILENAME_YEAR_RE` on `/{fname}`, always `continue`s when matched); only non-matching filenames fall through to the BibTeX-year fallback (guarded `0 < bib_year < window_min`). The a2i2 filter uses `min_year ≤ year ≤ current_year` (inclusive both ends), skipping unparseable years. +- Evidence: `main.py:2776,1438-1449,2596-2607,3116-3158,3128-3153`; `_FILENAME_YEAR_RE` `main.py:144`; `src/io_utils.py:523-530`; `get_min_year` `src/config.py:38-43`. +- Verify: `Alice2024-X.bib` with bib-year 2000 KEPT (filename wins); non-filename-year file with year 2000 (8); `'13905-13917'` accepted; `'007-012'`→`'7-12'`. + +#### `co-process-validated-doi-append-contract` — LB +`process_validated_doi` appends `('csl',entry)+flags['doi_csl']` and `('doi_bibtex',entry)+flags['doi_bibtex']` **only for matched (non-None) entries**, and returns True iff at least one format matched. CSL is fetched first; BibTeX only if CSL did not match. +- Evidence: `src/doi_utils.py:195-209,46-48,84-89,157-165`. +- Verify: CSL matches → only `('csl',...)` appended, `flags['doi_csl']` True, `fetch_bibtex_via_doi` not called, returns True. + +#### `co-gate-block-on-csv-existence` — LB +The entire post-run reconciliation block (flush, reconcile, orphan removal, year-window cleanup, post-run fixup, a2i2 build, baseline.json, badges.json) executes ONLY when `summary_csv_path` is truthy AND `os.path.exists(summary_csv_path)`; otherwise none of it runs. +- Evidence: `main.py:3070`. +- Verify: non-existent CSV → `out_dir/a2i2`, `baseline.json`, `badges.json` NOT created, no side effects. + +#### `co-reconciliation-step-ordering` — LB *(consolidates: reconciliation-step-ordering, correctness-postrun-cleanup-ordering)* +Post-run steps run in fixed order: flush CSV → reconcile phantoms → collect orphans → per-orphan duplicate-gated delete → year-window `.bib` removal → post-run `_fixup_bib_entry` over ALL `.bib` → build a2i2 → baseline.json → badges.json. Later steps depend on earlier (collect_orphan_files requires reconcile first; a2i2 copies from already-cleaned+fixed dirs; the a2i2 dir is excluded from per-author sweeps). +- Evidence: `main.py:3071,3074,3079,3099,3116-3117,3160-3182,3190,3197-3208,3210-3225,3121,3166`; `src/io_utils.py:366-368`. +- Verify: integration test over a seeded dir (phantom row + orphan + out-of-window file) → final state matches ordered pipeline; a2i2 files equal post-fixup author-dir bytes; only confirmed-duplicate orphans removed; baseline totals match final `.bib` count. + +#### `co-conference-journal-word-boundary` — LB *(consolidates: conference-journal-detection-word-boundary, journals-named-proceedings-word-boundary)* +`_is_conference_journal` reclassifies `@article`→`@inproceedings` when the journal looks like proceedings (contains 'proceedings'/'tagungsband', starts 'conference on', contains '@', or in `CONFERENCE_AS_JOURNAL`) but EXCLUDES real journals via **word-boundary** match against `JOURNALS_NAMED_PROCEEDINGS` (PNAS, PVLDB, Proc. IEEE, Royal Society) — prefix followed by end/space/comma/period/semicolon/colon, NOT bare substring (so "proceedings of the ieee/cvf winter conference" ≠ journal "proceedings of the ieee"). +- Evidence: `src/merge_utils.py:117-151,757-765`; `src/config.py:167-171,209-214`. +- Verify: `'Proceedings of the National Academy of Sciences'` stays `@article`; `'Proceedings of the 2024 Conference on X'` → `@inproceedings`; `'Proceedings of the IEEE/CVF Winter Conference ...'` → True (conference) while `'Proceedings of the IEEE'` → False. + +#### `co-doi-validation-csl-first` — IMP +DOI validation fetches CSL-JSON first and only fetches BibTeX when CSL did not match. +- Evidence: `src/doi_utils.py:157-165,148`. +- Verify: mock CSL match → `fetch_bibtex_via_doi` not called, only `('csl',...)` appended. + +#### `co-summary-csv-cwd-relative-paths` — IMP *(consolidates: correctness-summary-csv-cwd-relative-paths, reconcile-uses-raw-relative-path-cwd)* +Summary CSV `file_path` entries are stored CWD-relative via `os.path.relpath`; `reconcile_summary_csv` checks `os.path.exists(fp)` on the RAW relative path, so it is correct only when CWD == project root (same CWD as when rows were written). `is_known_summary_path` dedup and phantom cleanup operate on these relative paths; `collect_orphan_files`/`_load_csv_titles` DO `os.path.abspath`. +- Evidence: `main.py:2617,1349-1355,1477-1483,3070-3114,2870-2871`; `src/io_utils.py:412-423`; contrast abspath `src/io_utils.py:376`, `main.py:2870`. +- Verify: append rows from CWD A, reconcile from CWD A → stable; `is_known_summary_path` matches on the relative form; document the CWD precondition. + +#### `co-pnas-suffix-conference-guard` — IMP *(consolidates: pnas-pvldb-suffix-conference-guard, jnp-suffix-conference-guard)* +In the inproceedings→article reclassification for `JOURNALS_NAMED_PROCEEDINGS`, conversion is skipped when the booktitle suffix after the matched journal name contains 'conference', 'workshop', or 'symposium'. Present and identical at all three fix sites. +- Evidence: `main.py:342-350,1113-1124,2110-2121`. +- Verify: `test_jnp_suffix_guard_ieee_conference_stays_inproceedings`, `test_jnp_suffix_guard_pnas_becomes_article`; bare 'Proceedings of the VLDB Endowment' → article, '... Workshop on X' → stays inproceedings. + +#### `co-filesystem-is-state` — IMP +When `SKIP_SCHOLAR_FOR_EXISTING_FILES` is True, an existing `.bib` whose title matches (sim ≥ `SIM_MERGE_DUPLICATE_THRESHOLD`) is loaded as the enrichment baseline and the Scholar-page fetch is skipped; scheduling (`count_existing_papers`/`_has_output`) and the summary CSV also read disk state. +- Evidence: `src/config.py:61`; `main.py:815-858,1538-1539,2852-2860,2971-2973`. +- Verify: seed a matching `.bib` → used as baseline, no Scholar citation fetch; `count_existing_papers` reflects the file. + +#### `co-force-enrich-flag` — IMP +`FORCE_ENRICH` is derived once from `'--force' in sys.argv` and gates the "entry already complete → skip enrichment" shortcut; when set, complete entries are re-enriched. +- Evidence: `main.py:117,1312`. +- Verify: complete on-disk entry, `FORCE_ENRICH` False → skips (returns 1, no API calls); True → runs enrichment. + +#### `co-phase25-gating` — IMP +Phase 2.5 executes only when `enr_list` is empty after Phase 2; its Tier-1 OpenAlex sub-search runs only if still empty after Crossref; it injects arXiv-id/DOI fragments to enable Phase 3 discovery. +- Evidence: `main.py:1728,1740-1745,1748-1752,1755,1782`. +- Verify: with a P2 match, P2.5 skipped; with no match + arXiv-bearing pub string → `bf['eprint']` set, arXiv DOI added to `all_candidate_dois`. + +#### `co-title-is-venue-and-book-skip` — IMP +Entries whose title equals the journal or booktitle (corrupted Scholar data), and entries typed `@book` (proceedings volumes/edited books), are skipped and their file removed (return 0). +- Evidence: `main.py:2471-2485,2487-2500`. +- Verify: title==journal entry and `@book` entry each return 0 and remove any created file. + +#### `co-misc-upgrade-preprint-repo-guard` — IMP +The Phase-4 misc→inproceedings upgrade is blocked when `howpublished` names a preprint server (`PREPRINT_SERVERS` + inline list) or a repository (`REPOSITORY_AS_JOURNAL`); only genuine venue howpublished values upgrade. +- Evidence: `main.py:2385-2401`; `src/config.py:133,175-187`. +- Verify: `howpublished='arXiv'` stays `@misc`; `'NeurIPS Workshop on X'` → `@inproceedings`. + +#### `co-dagstuhl-doi-resolution` — IMP *(consolidates: dagstuhl-doi-resolution, dagstuhl-lipics-doi-regex)* +A DOI matching `^10.4230/(lipics|oasics)..[.]$` (anchored, case-insensitive) forces `@inproceedings`, sets booktitle from `ABBREVIATED_VENUE_MAP[conf]` (else old journal), drops journal+howpublished. +- Evidence: `src/merge_utils.py:52-55,767-803,774`; `src/config.py:289-337,346-358`. +- Verify: `'10.4230/LIPIcs.ESA.2023.5'` → inproceedings, booktitle 'European Symposium on Algorithms', no journal; reject near-miss prefixes. + +#### `co-venue-abbrev-expansion` — IMP +For journal/booktitle/howpublished, a value equal (case-insensitive) to an `ABBREVIATED_VENUE_MAP` key is expanded; a match in the journal field is moved to booktitle (journal popped), since all mapped venues are conferences. +- Evidence: `src/merge_utils.py:809-819`. +- Verify: `journal='SPIRE'` → booktitle 'String Processing and Information Retrieval', journal absent. + +#### `co-three-casing-engines` — IMP +Title, venue, and author casing are three distinct engines that must remain separate: title ALL-CAPS via `_fix_allcaps_title` (gated at >60% uppercase), venue via `VENUE_CASE_CORRECTIONS` exact-match dict (Phase 4), author via `_fix_author_casing`. +- Evidence: `src/text_utils.py:173-200,203-227`; `config.py:251-256`, `main.py:2301-2309`; `src/merge_utils.py:166-204`. +- Verify: `_fix_allcaps_title` leaves normal mixed-case unchanged and only fires >60% caps; author/venue paths untouched by title logic. + +#### `co-cross-file-key-collision-disambiguation` — IMP +Before writing, if another `.bib` in the dir holds the same citekey on a genuinely different paper (different normalized DOI), the new key gets a distinguishing suffix (first significant title word not already in the key, else `'B'`); same-paper key collisions are left intact. +- Evidence: `src/merge_utils.py:1457-1489`. +- Verify: two different-DOI papers colliding on `'Smith2024'` → second becomes `'Smith2024'` deterministically; same-DOI collision keeps key. + +#### `co-doi-revert-restores-validated` — IMP +`_revert_misattributed_doi` only acts when `merged_fields['doi']==bad_doi`, replacing it with the P1-validated `doi_early` (when `doi_validated`) or else removing doi AND url; never leaves a mis-attributed candidate DOI in place. +- Evidence: `main.py:634-655`. +- Verify: bad_doi + validated fallback → doi replaced with normalized doi_early, url popped; no fallback → doi and url removed. + +#### `co-year-and-fixup-skip-a2i2-dir` — IMP +Year-window cleanup and post-run fixup skip the `a2i2` entry (and non-directories), so the joint folder is never cleaned/fixed in place; a2i2 is fully rebuilt afterward. +- Evidence: `main.py:3121,3166,3190`. +- Verify: a stale file under `out_dir/a2i2` untouched by year-window/fixup passes (only `build_a2i2_folder` wipes it). + +--- + +## CONTRADICTIONS / CONFLICTS — Defect Seams + +These are the seams where fixing a known defect risks violating an invariant. Each lists the defect, the invariant(s) in tension, and the safe resolution. + +### C1 — Compounding retry (429/503 double-backoff) +- **Defect**: request amplification risk if 429/503 are handled at both urllib3 and manual layers; POST retried non-idempotently. +- **Invariants in tension**: `ao-429-503-excluded-from-urllib3-forcelist`, `correctness-urllib3-retry-after-disabled` (Correctness/§10 via `eh-manual-retry-loop`), `correctness-retry-after-capped-at-backoff-max`, `co-sleeps-outside-global-semaphore`, `eh-defect-post-retried-non-idempotent`. +- **Seam**: A refactor "unifying" retry logic must NOT re-add 429/503 to `status_forcelist`, must keep `respect_retry_after_header=False`, must keep the `min(rate_wait, HTTP_BACKOFF_MAX)` cap, and must keep every `time.sleep` outside the semaphore. Any consolidation that moves sleeps inside the semaphore reintroduces slot-starvation (`co-sleeps-outside-global-semaphore`). Deciding to stop retrying POST is a behavior change (`eh-defect-post-retried-non-idempotent`) that must be conscious. + +### C2 — Uncaught ValueError from `_decode_json_bytes` + Gemini API-key log leak +- **Defect**: malformed JSON raises a bare `ValueError` carrying the full URL; DataCite/ORCID let it escape; the Gemini caller catches and WARN-logs it, leaking `?key=`. +- **Invariants in tension**: `eh-error-tuple-membership-frozen`, `eh-handle-api-errors-scope`, `eh-decode-json-valueerror-with-url`, `eh-gemini-key-leak`, `eh-datacite-orcid-valueerror-escapes`. +- **Seam / DIRECT CONFLICT**: The "obvious" fix — add `ValueError` to `ALL_API_ERRORS`/`NETWORK_ERRORS` — **violates `eh-error-tuple-membership-frozen`** and silently swallows genuine decode failures across all decorated clients (changing DataCite/ORCID/Gemini result semantics to `default_return`/negative-cache). The correct fix is to **redact the URL in the `ValueError` message at `src/http_utils.py:399`** (and/or strip `key=`/tokens before logging), leaving tuple membership and propagation behavior unchanged. This resolves the key leak (`eh-gemini-key-leak`) without touching the frozen tuples. + +### C3 — `ttl_days` vestigial vs monthly-boundary freshness +- **Defect**: `ttl_days` is written to every cache entry and accepted as an arg but never read by `get()`. +- **Invariants in tension**: `ca-positive-freshness-not-ttl`, `ca-monthly-boundary-expiry`, `ca-negative-three-tier`. +- **Seam / DIRECT CONFLICT**: "Restoring" ttl_days honoring in `get()` **violates `ca-positive-freshness-not-ttl`** and silently changes effective lifetimes for every namespace (DOI 90d, search 60d, gemini 365d), altering hit rates and API volume. Safe options: leave as-is (documented vestigial) OR remove the write path — but NOT wire it into expiry without an explicit, tested semantics change. + +### C4 — Frozen `_month_boundary` at singleton init +- **Defect**: `_month_boundary` is computed once at import and never advances; a process spanning a month rollover keeps serving last-month entries as fresh. +- **Invariants in tension**: `ca-month-boundary-frozen` (documents current behavior), `ca-monthly-boundary-expiry` (assumes an active boundary). +- **Seam**: Fixing this (recompute per `get()`) changes month-refresh timing and will break any test that observes the frozen value (`test_month_boundary_frozen`). Because CiteForge runs are short-lived batch processes, the practical impact is low; if fixed, update `ca-month-boundary-frozen`'s verification and confirm the once-per-month refresh contract (`ca-monthly-boundary-expiry`) still holds mid-run. Do not "fix" by further hard-freezing (e.g. caching across process restarts). + +### C5 — Phase-4 type-reclassification asymmetry (parity vs superset) +- **Defect / prior-digest error**: the prior study claimed Phase 4 (site C) OMITS the article/inproceedings reclassifications; reader 6 found C is a SUPERSET (it contains the core set PLUS post-enrichment-only rules). +- **Invariants in tension**: `ao-three-way-fixup-parity` (all three sites must apply the CORE rules identically) vs `ao-phase4-superset` (C legitimately has MORE rules, including the only misc→inproceedings upgrade). +- **Seam / RESOLUTION**: These are reconcilable but easy to break. The **core reclassification + text + booktitle rules must be byte-identical across A/B/C**; C's extras (patent→misc, unpublished→misc, url-booktitle→misc, article-preprint-DOI, misc→inproceedings upgrade) must remain **C-only**. A naive consolidation that makes all three sites identical will either drop C's extras or push the misc→inproceedings upgrade into A/B (where `howpublished` is still transient/pre-enrichment), promoting entries incorrectly. Any refactor here must run the reclassification-parity test AND assert the upgrade appears only in the Phase-4 path. + +### C6 — OpenReview lock-free read (unguarded concurrency surface) +- **Defect**: an OpenReview client read is reported to bypass the lock discipline. +- **Invariants in tension**: `co-shared-state-locks` (all shared mutable state lock-guarded), `co-rate-limiter-registry-singleton` (double-checked locking), `co-single-writer-per-author-dir` (partitioning, not locking, protects author dirs). +- **Seam / GAP**: The 7 invariant sets contain **no OpenReview-specific invariant**, so this is an unguarded surface — the general lock discipline (`co-shared-state-locks`) is the only governing contract. OpenReview is also a Phase-2 source (`determinism-phase2-source-order` places it 4th: Scholar→S2→Crossref→**OpenReview**→...). Fixing the lock-free read must NOT (a) alter the per-namespace single-instance lock semantics of the cache, nor (b) change OpenReview's position in the Phase-2 order (which would violate `determinism-phase2-source-order` and shift `enr_list` fill). Add a targeted concurrency test for the OpenReview path as part of the fix. + +### C7 — Dead `scholarly_scholar.py` (safe-delete candidate) +- **Defect**: `scholarly_scholar.py` is reported dead code. +- **Invariants in tension**: none directly — no invariant references it. Adjacent live contracts: `eh-scholar-retry-then-dblp-only`, `determinism-article-ordering` (`src/clients/scholar.py:169-178`), `determinism-phase2-source-order` (Scholar first). +- **Seam**: Removal is safe **only if** no import path reaches it. Before deleting, grep for imports/references and confirm the live Scholar path (`src/clients/scholar.py`) is untouched. This is a code-hygiene change with no invariant impact once import-freeness is verified — but verify, do not assume. + +### C8 — Author-dir concurrency: locks vs partitioning (design fragility, not a live bug) +- **Tension**: `co-shared-state-locks` guards cache/CSV with explicit locks, while `co-single-writer-per-author-dir` explicitly relies on **no lock** and the ThreadPool partitioning (one worker per author). These are not contradictory today, but the asymmetry is a latent hazard. +- **Seam**: Any refactor that parallelizes within an author, or that maps two records to the same `format_author_dirname`, breaks the unstated single-writer precondition and produces TOCTOU races (duplicate/lost/deleted `.bib`). If such parallelism is introduced, a per-author-dir lock MUST be added. + +### C9 — Documented cross-reader factual disagreement: Phase-2 source order +- Reader 2 (`determinism-phase2-source-order`) **explicitly corrects** the prior-study digest's claimed order. The authoritative order is **Scholar→S2→Crossref→OpenReview→arXiv→OpenAlex→PubMed→EuropePMC** (evidence `main.py:1543,1572,1601,1621,1640,1660,1687,1706`). Any design doc or test still asserting the old order (Scholar→S2→Crossref→OpenAlex→PubMed→EuropePMC→arXiv→OpenReview) is wrong and must be updated. + +--- + +## DETERMINISM-CRITICAL SURFACES — Byte-Identity Contract + +A refactor must keep the following code paths byte-for-byte stable. The master verification for all of them is a **two-run diff**: run the pipeline twice over a frozen fixture corpus from a stable CWD (project root), then `diff -r` / `git diff --exit-code` the `output/` tree — it must be empty. Supplement with `PYTHONHASHSEED` variation and freeze-time where noted. + +| # | Surface | Files / lines | Governing invariants | Extra verification | +|---|---------|---------------|----------------------|--------------------| +| 1 | **BibTeX serialization** (field order, ASCII normalization, `\&` escaping excl. url/doi, trailing comma/brace/newline) | `src/bibtex_utils.py:302-394` | `of-bibtex-field-order-stable`, `of-ascii-escape-normalization`, `of-final-comma-brace-formatting`, `ao-ascii-clean-table-values` | Golden string test on a fixed entry with scrambled key order | +| 2 | **Three fixup sites + shared helpers** (must reach one fixed point) | A `main.py:314-492`; B `main.py:865-1309`; C `main.py:2028-2401`; helpers `main.py:235-254`; `_fixup_bib_entry` `src/merge_utils.py:314-565` | `ao-three-way-fixup-parity`, `ao-phase4-superset`, `ao-is-proc-series-guard-frontiers`, `ao-is-pacm-guard`, `co-pnas-suffix-conference-guard`, `co-conference-journal-word-boundary` | Feed one malformed entry through each site → identical; grep exactly 3 call sites each | +| 3 | **Fix-table iteration order** (dict/tuple/list, hash-seed independent) | `main.py:123-232`; sources `config.py:379-808` | `determinism-pattern-iteration-order`, `ao-fused-compounds-three-pass-order`, `of-booktitle-fixups-ordered-idempotent` | Run under two `PYTHONHASHSEED` values → identical output | +| 4 | **Publication ordering & union** | `src/clients/scholar.py:169-178,188-192,234-265` | `determinism-article-ordering`, `dd-merge-union-primary-first` | Shuffle-invariance test | +| 5 | **Author scheduling sort** | `main.py:2947-2949,2971-2977` | `determinism-author-sort-key`, `determinism-new-author-first-stable` | Golden order across two calls | +| 6 | **`sorted()` .bib directory scans** | `main.py:817,3164,3168`; `src/merge_utils.py:953` | `determinism-sorted-bib-scan`, `dd-branch-order-first-match` | Seed `a.bib`/`z.bib` both matching → `a.bib` chosen | +| 7 | **DOI candidate ordering** (set-dedup + stable published-first partition, cache-only inference) | `main.py:1945-1949,1901-1943,1994-1996` | `determinism-doi-candidate-order` | Two runs under differing `PYTHONHASHSEED` → identical `.bib`; assert no live HTTP | +| 8 | **Dedup scoring & normalization** | `src/text_utils.py:511-546,130-155,381-393` | `dd-composite-weights`, `determinism-title-similarity-pure` | Exact-score parametrized tests; `title_similarity` snapshot | +| 9 | **Merge iteration** (insertion-order enr_list, strict-`<` trust) | `src/merge_utils.py:277-445` | `determinism-enr-list-order`, `to-canonical-order-strict-rank` | Shuffle equal-rank enrichers → unchanged output | +| 10 | **Phase-2 source query order** | `main.py:1543-1723` | `determinism-phase2-source-order` (⚠ see C9) | Assert `SEARCH_START` log sequence | +| 11 | **a2i2 build** (wipe+rebuild, DOI-then-title dedup, richer/lower-path tiebreak, sorted write order + `_2` collision, byte-copy) | `src/io_utils.py:466-615` | `determinism-a2i2-complete-rebuild`, `dd-a2i2-doi-before-title`, `determinism-a2i2-pick-richer-tiebreak`, `determinism-a2i2-write-order-collision`, `of-a2i2-byte-fidelity-copy` | `test_complete_rebuild`, `test_deterministic_output` | +| 12 | **Post-run reconciliation block** (fixed step order, rewrite-only-on-change, relative-path reconcile) | `main.py:3070-3227`; `src/io_utils.py:334-439` | `co-gate-block-on-csv-existence`, `co-reconciliation-step-ordering`, `determinism-reconcile-rewrite-only-when-phantoms`, `determinism-flush-rewrite-only-on-updates`, `determinism-orphan-abspath-resolution`, `co-summary-csv-cwd-relative-paths` | Run reconcile from project-root CWD; assert no spurious rewrites | +| 13 | **Year-window enforcement** (filename-year-first, bib-year lower-bound guard, inclusive a2i2 filter) | `main.py:2596-2607,3116-3158`; `src/io_utils.py:523-530` | `co-year-window-enforced-everywhere`, `eh-bibyear-fallback-lower-bound-guard` | `Alice2024-X.bib` w/ bib-year 2000 kept; freeze-time near year boundary | + +**Non-determinism landmines to reject in review:** any `set`/`frozenset` feeding a fix-pattern loop or an output-affecting order (#3, #7); any raw `os.listdir` over a `.bib` dir without `sorted()` (#6); numeric filename counters (`-2.bib`) instead of title-word extension (`of-filename-no-numeric-counters`); `dict`/insertion-order reliance in `bibtex_from_dict` field emission (#1); any inlined threshold literal that forks from `config.py` (`cd-thresholds-centralized`); running from a non-root CWD (#12, breaks `co-summary-csv-cwd-relative-paths`). From 53a1ef115fda26479569d6e6583b16e6fe6ad7cf Mon Sep 17 00:00:00 2001 From: Gabriel Spadon Date: Wed, 1 Jul 2026 12:51:43 -0300 Subject: [PATCH 03/54] docs(audit): add Phase 2 decomposition design (16-step gated migration) --- audit/02-design.md | 289 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 289 insertions(+) create mode 100644 audit/02-design.md diff --git a/audit/02-design.md b/audit/02-design.md new file mode 100644 index 00000000..d37bfed1 --- /dev/null +++ b/audit/02-design.md @@ -0,0 +1,289 @@ +I have everything I need. Both load-bearing disputes are now verified against source: + +- **C5 superset membership**: `article_patent->misc` lives at **both** Site B (main.py:1053-1057, `EXISTING_FIXUP`) **and** Site C (main.py:2134-2143, `TYPE_CORRECT`); `article_unpublished->misc` likewise at Site B (1041-1045) **and** Site C (2146-2149). The catalog's `ao-phase4-superset` claim that these are "C-only" is **factually wrong** — they are `{B,C}`. Only `misc_workshop->inproceedings` (2382-2397) is genuinely C-exclusive. This confirms the judges' correction and disqualifies Proposal 1's two-bucket model. +- **C7 dead-code**: `scholarly_scholar.py` has **zero** importers; `tests/test_scholarly_scholar.py` imports the **live** clients (`src.clients.scholar`, `serpapi_scholar`, `serply_scholar`), so the test must be **kept**. Proposal 3's plan to delete it is wrong. + +Producing the final design document. + +--- + +# CiteForge Refactor — Phase 2 Final Decomposition Design + +*Deliverable of the DESIGN SYNTHESIZER. Input contract: `audit/01-invariant-catalog.md`. Output contract: this document is the authoritative plan the IMPLEMENT phase consumes, one worktree-isolated task per migration step.* + +--- + +## 1. Winning decomposition and why + +**Winner: Proposal 2 — "Minimal-risk, move-only, byte-identity-preserved at every commit; C5 single-sourced via per-site ordered recipes, deferred to a gated final step."** It is the unanimous choice of all three judge lenses (invariant-hawk 8.44, pragmatic-shipper 76/100, architecture-purist 8.61 — the top score in every scorecard). The reason is that the campaign's prime directive is second-run byte-identity, and the one seam that can silently destroy it — C5, the three-way-fix — has a domain shape that only Proposal 2 models correctly: I verified against source that the three fix sites run the CORE reclassification chain in **three different orders** and with **non-nested, per-rule membership** (Site B already contains `patent->misc` and `unpublished->misc`, which Proposal 1 wrongly fences as C-only and would therefore delete from B). Proposal 2's answer — single-source each rule **body** once, but give each site an explicit **ordered recipe** listing its own rules in that site's literal current order — is byte-identical **by construction** and does not depend on the rules commuting, whereas Proposal 1 and Proposal 3 both impose one shared order on all three sites and stake byte-identity on an (un-proven) commutation assumption. Every step before C5 is a whole-symbol relocation behind a re-export shim, so each commit is independently green under ruff+mypy+pytest and byte-identical under a two-run diff, and the single behavior-touching change lands last behind four gates. Its only real weakness is cohesion (it leaves `merge_utils.py` monolithic); we close that gap by grafting Proposal 1's cohesive-engine split as an explicitly-sequenced **Wave 2** that runs only after byte-identity is locked. + +--- + +## 2. Grafts from the runner-up proposals (with attribution) + +The final design is Proposal 2's move-only spine and per-site-recipe C5 model, hardened with the following explicit grafts: + +| # | Grafted idea | Source | Why it is adopted | +|---|--------------|--------|-------------------| +| G1 | **`src/venue.py` shared low layer** for `_is_conference_journal`, `_matches_journal_named_proceedings`, `infer_howpublished_from_doi`, `_normalize_howpublished` (Dagstuhl/LIPIcs). | Proposal 3 (determinism-safety lens) — *"the sharpest coupling insight in any proposal."* | `fixup` rules call `_is_conference_journal`, which lives in `merge_utils` today. Without extracting it to a shared low module, `fixup` would import `merge` and create a cycle. This is the single most valuable graft and must land **before** any fixup rule references it. | +| G2 | **`src/fsscan.py` as the only sorted-`.bib`-scan API** (`iter_author_bibs`, `iter_output_dirs`) plus a grep-lint that fails CI on any raw `os.listdir` over a `.bib` dir. | Proposal 3 | Turns `determinism-sorted-bib-scan` (surface #6) from a convention reviewers must remember into a structural CI failure. | +| G3 | **`patterns.py` container-type assertion test** (every fix table is `list`/`tuple`/`dict`, never `set`/`frozenset`) + **`ao-ascii-clean-table-values` fixpoint test** (every table value equals its own `_normalize_to_ascii(value)`) + **golden `PREFERRED_FIELD_ORDER` serializer test**. | Proposal 3 | Makes surfaces #1 and #3 structural rather than tested-by-luck. The ascii-fixpoint test co-lands with the pattern move so a non-fixpoint value cannot cause an every-run byte diff. | +| G4 | **Per-rule `sites: frozenset[Site]` membership tag** on each `FixupRule`, plus an **AST/grep test** asserting the `misc->inproceedings` upgrade symbol is referenced only in the Phase-4 recipe. | Proposal 3 (membership model) composed with Proposal 2 (per-site ordered recipes). | Membership becomes testable and self-documenting; combined with P2's ordered recipes this yields byte-safety **and** a structural anti-flatten guarantee with **no reorder bet**. | +| G5 | **Explicit boundary doc**: `all_candidate_dois` is a dedup-only `set`; its **order comes solely from the published-first partition sort**. | Proposal 3 | Kills the "no sets anywhere" over-correction while proving surface #7. | +| G6 | **`PipelineContext` dataclass** threading `enr_list`, `all_candidate_dois`, `flags`, `doi_validated`, `unvalidated_doi` through the split phase modules. | Proposal 1 (cohesion-first lens) | The clean structural guarantee for `determinism-enr-list-order` once `process_article` is genuinely split (Wave 2). Used only when the phase split happens. | +| G7 | **Full cohesive engine layout** (`merge/policy`, `dedup/{scan,decide,score,candidate_doi}`, `save/write`) as a sequenced **Wave 2** after byte-identity is locked, plus the **golden Phase-4 fixture matrix** (preprint article / PACM / patent / thesis DOI / bare stub) as the C5 parity oracle. | Proposal 1 | Closes Proposal 2's cohesion gap without risking the byte-identity floor during the risky C5 change. | + +**Two catalog corrections adopted (verified in source, mandatory for IMPLEMENT):** +- **CC1** — `ao-three-way-fixup-parity` and Determinism-Surface #2 cite `_fixup_bib_entry` at `src/merge_utils.py:314-565`. It is actually at **`main.py:314-565`** (tests import it from `main`). Treat `main.py` as authoritative. +- **CC2** — `ao-phase4-superset` lists `patent->misc` and `unpublished->misc` as "C-only." **Source disproves this:** both are at Site B (main.py:1041-1057) **and** Site C (main.py:2134-2149). The genuinely C-exclusive rules are `inproceedings_url_booktitle->misc` (2153-2162), `inproceedings_no_booktitle->misc` (2038-2046), `article-preprint-DOI` handling (2238-2259), and the **sole** `misc_workshop->inproceedings` upgrade (2382-2401). C5 membership is a **per-rule frozenset**, not a nested subset. + +--- + +## 3. Definitive target package layout (END STATE) + +Dependency direction is strictly downward and acyclic: `pipeline → {fixup, merge, dedup, save, bibtex} → {venue, fsscan, config, http_utils, cache, io_utils, exceptions, log_utils, clients}`. No back-edges. `main.py` ends as a thin entrypoint; re-export shims at old paths keep every `from main import …` / `from src.merge_utils import …` test green until the final cleanup step. + +``` +src/ + config.py UNCHANGED — single home of all thresholds/tables (cd-thresholds-centralized) + exceptions.py UNCHANGED — frozen error tuples (eh-error-tuple-membership-frozen) + models.py UNCHANGED + log_utils.py UNCHANGED + bibtex_build.py UNCHANGED — determine_entry_type, get_container_field (co-container-enforcement-by-type) + publication_parser.py / api_generics.py / doi_utils.py / id_utils.py UNCHANGED + text_utils.py title_similarity/normalize_title stay pure; compute_dedup_score → dedup/score.py (Wave 2) + http_utils.py KEPT — C1/C2 land in place (retry loop, _decode_json_bytes redaction, semaphore) + cache.py KEPT — C3/C4 land in place (ResponseCache monthly-boundary + ttl_days decision) + io_utils.py KEPT — CSV index/flush + a2i2/orphan/reconcile helpers (consumed by pipeline/reconcile.py) + bibtex_utils.py KEPT — serializer; PREFERRED_FIELD_ORDER promoted to named tuple + golden test + + venue.py NEW (Wave 1, G1) — shared LOW layer imported by BOTH fixup and merge + fsscan.py NEW (Wave 1, G2) — the ONLY sorted-.bib-scan API + grep-lint + + fixup/ NEW (Wave 1) — SINGLE SOURCE OF TRUTH for the three-way fix (seam C5) + patterns.py + text.py + rules.py + engine.py + + pipeline/ NEW (Wave 1: article/record/schedule/reconcile ; Wave 2: context + phase split) + article.py + record.py + schedule.py + reconcile.py + context.py (Wave 2, G6) + baseline.py / phase2_enrich.py / phase3_discovery.py / phase4_save.py (Wave 2, G7) + + merge/ NEW (Wave 2, G7) + policy.py + dedup/ NEW (Wave 2, G7) + scan.py / decide.py / score.py / candidate_doi.py + save/ NEW (Wave 2, G7) + write.py + + clients/ UNCHANGED except: C6 OpenReview lock (search_apis.py); scholarly_scholar.py DELETED (Wave 1) +main.py thin entrypoint (cli/setup/dispatch) + transitional re-export shims +``` + +### Per-module responsibility, moved-from, invariants protected + +| Module | Responsibility | Moved from (file:line) | Invariants protected | +|--------|----------------|------------------------|----------------------| +| **`src/venue.py`** (NEW) | Venue-classification predicates shared by fixup and merge; extracting them breaks the latent `fixup→merge` cycle. | `merge_utils.py:108-165` (`_is_conference_journal`, `_matches_journal_named_proceedings`, `infer_howpublished_from_doi`, `_normalize_howpublished`, Dagstuhl/LIPIcs regex :52-55,767-803) | `co-conference-journal-word-boundary`, `ao-is-pacm-guard`, `co-pnas-suffix-conference-guard`, `co-dagstuhl-doi-resolution` | +| **`src/fsscan.py`** (NEW) | Single sorted-scan API: `iter_author_bibs(dir)->sorted[str]`, `iter_output_dirs(out)->sorted[str]`. Every `.bib`-dir listing routes through it. | Replaces raw `os.listdir` at `main.py:817,2545,2858,3119,3123,3164,3168,3199,3202`; `merge_utils.py:953,1462`; `io_utils.py:383,391,510,590` | `determinism-sorted-bib-scan` (#6), `determinism-orphan-abspath-resolution`, `determinism-a2i2-write-order-collision` | +| **`src/fixup/patterns.py`** (NEW) | Every pre-compiled fix regex and repeated literal, as `list`/`tuple`/`dict` only. | `main.py:119-232` (`_FUSED_DICT_PATTERNS`, `_COMPOUND_SUFFIX_PATTERNS`, `_ACRONYM_CASE_PATTERNS`, `_BOOKTITLE_FIXUPS`, `_VERBOSE_BOOKTITLE_RE`, `_US_PATENT_RE`, garbage/venue regexes); vocab imported from `config.py:361-808` | `determinism-pattern-iteration-order` (#3), `ao-fused-compounds-three-pass-order`, `of-booktitle-fixups-ordered-idempotent`, `ao-ascii-clean-table-values`, `cd-thresholds-centralized` | +| **`src/fixup/text.py`** (NEW) | The already-single-source title/booktitle text transforms (3 call sites each today) + garbage/corruption predicates. | `main.py:235-311` (`_apply_booktitle_fixups`, `_fix_title_text`, `_is_garbage_title`, `_is_corrupted_title`, `_fix_fused_compounds`) | `ao-three-way-fixup-parity` (text/booktitle half — surface #2), `ao-fused-compounds-three-pass-order` | +| **`src/fixup/rules.py`** (NEW) | The `Site` enum, `FixupRule` dataclass, one function per correction step (**body single-sourced**), and each rule's `sites: frozenset[Site]` membership. | Rule bodies distilled from Site A `main.py:314-565`, Site B `main.py:865-1309`, Site C `main.py:2028-2401` | `ao-three-way-fixup-parity`, `ao-phase4-superset`, `ao-is-proc-series-guard-frontiers`, `ao-is-pacm-guard`, `ao-disjoint-reclassification-tables`, `co-misc-upgrade-preprint-repo-guard` | +| **`src/fixup/engine.py`** (NEW) | `SITE_A_RECIPE`/`SITE_B_RECIPE`/`SITE_C_RECIPE` (ordered tuples reproducing each site's **literal current order**) and `run_fixup(entry, recipe)->bool`. | The orchestration currently inline at each of A/B/C | `of-phase4-type-correction-order`, `ao-postrun-fixup-write-suppression`, `pipeline-double-run-fixpoint` | +| **`src/pipeline/article.py`** | The 5-phase per-article orchestrator; Sites B & C become `run_fixup(...)` calls; returns the 1/0 contract. | `main.py:721-2687` incl. helpers `_read_doi_from_file`(624-633), `_revert_misattributed_doi`(634-655), `_try_multiple_candidates`(657-720), `_entry_is_complete`(568-623) | `determinism-phase2-source-order` (#10, C9), `determinism-enr-list-order`, `determinism-doi-candidate-order` (#7), `ao-candidate-doi-disk-dedup`, `co-return-code-contract`, `co-year-window-enforced-everywhere` (save leg) | +| **`src/pipeline/record.py`** | Per-author worker: thread-local logging, Scholar-retry-then-DBLP, article loop, per-unit isolation. | `main.py:2688-2851` (`process_record`) | `co-thread-local-logging`, `eh-scholar-retry-then-dblp-only`, `eh-per-unit-isolation`, `co-single-writer-per-author-dir` (precondition doc — C8) | +| **`src/pipeline/schedule.py`** | Author scheduling: composite sort key, new-author-first stable re-order, CSV title index, ThreadPool fan-out, excepthook, result timeouts. | `main.py:2852-2884` (`count_existing_papers`, `_load_csv_titles`), sort blocks `2947-2949`/`2971-2977`, pool `2998-3018` | `determinism-author-sort-key` (#5), `determinism-new-author-first-stable`, `co-single-writer-per-author-dir` (C8), `co-threadpool-worker-cap`, `co-result-timeouts` | +| **`src/pipeline/reconcile.py`** | The whole post-run block as ONE fixed-order function, gated on CSV existence. | `main.py:3070-3227`; calls `io_utils.py:334-439,466-615` helpers | `co-gate-block-on-csv-existence`, `co-reconciliation-step-ordering` (#12), `determinism-reconcile-rewrite-only-when-phantoms`, `co-year-window-enforced-everywhere` (#13), `of-a2i2-byte-fidelity-copy`, `co-year-and-fixup-skip-a2i2-dir`, `co-summary-csv-cwd-relative-paths` | +| **`src/pipeline/context.py`** (Wave 2, G6) | `PipelineContext` dataclass carrying the enrichment accumulator across split phases. | `enr_list` init `main.py:1486`; `all_candidate_dois` `1490`; flags/`doi_validated`/`unvalidated_doi` locals in `process_article` | `determinism-enr-list-order`, `dd-all-candidate-dois-includes-unmatched`, `ao-p1-stash-and-pop` | +| **`src/merge/policy.py`** (Wave 2) | The trust engine: insertion-order iteration, strict-`<` replacement, DOI-source gate, field-override rules. | `merge_utils.py:230-925` (`merge_with_policy` + author/DOI helpers 166-229) | `to-canonical-order-strict-rank`, `determinism-enr-list-order` (#9), `to-doi-source-gate`, `to-field-override-rules`, `ao-doi-published-beats-preprint-xor`, `of-internal-fields-stripped` | +| **`src/dedup/scan.py`** / **`decide.py`** / **`score.py`** / **`candidate_doi.py`** (Wave 2) | The in-save duplicate cascade (first-match break), the directional replace/keep tree + pre-write guard + prefer-path cleanup, the additive 6-signal scorer, and the outer save-time candidate-DOI net. | `merge_utils.py:978-1200` (scan), `1201-1305`+`1386-1455` (decide/guard), `text_utils.py:511-546` (score), `main.py:634-655,657-720,2531-2588` (candidate_doi) | `dd-branch-order-first-match`, `ao-replace-keep-directional`, `ao-skip-write-existing-better`, `dd-composite-weights`, `ao-candidate-doi-disk-dedup`, `dd-self-match-exclusion`, `dd-title-similarity-guard`, `cd-inline-magic-numbers-preserved` | +| **`src/save/write.py`** (Wave 2) | `save_entry_to_file` orchestration: container enforcement, citekey fallback, word-extension collision loop, cross-file key disambiguation, unlocked per-dir RMW; returns `(path, was_written)`. | `merge_utils.py:927-978,1307-1382,1457-1504` | `co-single-writer-per-author-dir` (C8), `of-filename-no-numeric-counters`, `of-citekey-fallback-chain`, `co-cross-file-key-collision-disambiguation`, `co-save-return-tuple` | +| **`src/bibtex_utils.py`** (kept) | BibTeX serialization; `PREFERRED_FIELD_ORDER` promoted to a named module-level tuple. | in place `bibtex_utils.py:302-394` | `of-bibtex-field-order-stable` (#1), `of-ascii-escape-normalization`, `of-final-comma-brace-formatting`, `ao-ascii-clean-table-values` | +| **`src/http_utils.py`** (kept) | Retry/backoff/concurrency + JSON decode; C1 + C2 land here. | in place `http_utils.py:163-175,300-372,388-399` | `ao-429-503-excluded-from-urllib3-forcelist`, `co-sleeps-outside-global-semaphore`, `eh-error-tuple-membership-frozen`, `eh-gemini-key-leak` | +| **`src/cache.py`** (kept) | Monthly-boundary freshness + three-tier negatives; C3 + C4 land here. | in place `cache.py:24-32,99-145,147-223` | `ca-positive-freshness-not-ttl`, `ca-monthly-boundary-expiry`, `ca-month-boundary-frozen`, `ca-get-branch-order` | + +--- + +## 4. Single-source-of-truth fixup design (seam C5) + +### Problem shape (verified in source, not the catalog) + +The CORE reclassification chain is textually triplicated at Site A (`main.py:314-565`), Site B (`main.py:865-1309`), Site C (`main.py:2028-2401`), and: + +1. The three sites run the CORE rules in **three different orders** (A ends with conference-journal reclassification; B and C run it first). +2. Membership is **per-rule, not nested**: `article_patent->misc` and `article_unpublished->misc` are in `{B, C}` (main.py:1041-1057 / 2134-2149); `misc_workshop->inproceedings` is in `{C}` only (2382-2397); `inproceedings_repository->misc` / `inproceedings_preprint->misc` are in `{A, B, C}` (360/374, 1139/1150, 2216/2164). +3. Byte-identity today is preserved by each site's own order plus rule commutation (`ao-disjoint-reclassification-tables`) — **not** by a shared order. +4. `_fix_title_text` and `_apply_booktitle_fixups` are **already** single-source (exactly 3 call sites each): `main.py:432/1205/2279` and `440/1213/2290`. Only the reclassification chain is triplicated. + +Therefore: single-source each rule **body**, but preserve each site's **order and membership** exactly. Do **not** collapse to one shared master order (that would stake byte-identity on a commutation bet neither Proposal 3 nor Proposal 1 can prove). + +### Concrete API (`src/fixup/rules.py` + `src/fixup/engine.py`) + +```python +# src/fixup/rules.py +from dataclasses import dataclass +from enum import Enum, auto +from collections.abc import Callable + +class Site(Enum): + A_LOAD = auto() # load-time _fixup_bib_entry (also the post-run sweep) + B_EXISTING = auto() # existing-file baseline fixup + C_PHASE4 = auto() # Phase-4 post-merge fixup + +@dataclass(frozen=True) +class FixupRule: + name: str + apply: Callable[[dict], bool] # mutates entry in place; returns True iff it changed anything + sites: frozenset[Site] # MEMBERSHIP (for tests/self-doc); does NOT govern order + +# --- one function per correction step; each body defined EXACTLY ONCE --- +# CORE (sites = {A, B, C}); guards read tables from config / predicates from venue.py: +def _rule_procedia_to_inproceedings(e: dict) -> bool: ... +def _rule_pacm_to_article(e: dict) -> bool: ... # not-is_pacm guard (ao-is-pacm-guard) +def _rule_jnp_to_article(e: dict) -> bool: ... # PNAS/PVLDB suffix guard (co-pnas-suffix-conference-guard) +def _rule_journal_only_prefix_to_article(e: dict) -> bool: ... # not-is_proc_series guard (ao-is-proc-series-guard-frontiers) +def _rule_inst_repo_to_phdthesis(e: dict) -> bool: ... +def _rule_conference_journal_to_inproceedings(e: dict) -> bool: ... # uses venue._is_conference_journal +def _rule_inproceedings_repository_to_misc(e: dict) -> bool: ... +def _rule_inproceedings_preprint_to_misc(e: dict) -> bool: ... +# ... remaining CORE rules ... + +# {B, C} — CORRECTED membership (catalog CC2): +def _rule_article_patent_to_misc(e: dict) -> bool: ... +def _rule_article_unpublished_to_misc(e: dict) -> bool: ... + +# {C} only — the genuine Phase-4 superset: +def _rule_inproceedings_no_booktitle_to_misc(e: dict) -> bool: ... +def _rule_inproceedings_url_booktitle_to_misc(e: dict) -> bool: ... +def _rule_article_preprint_doi_handle(e: dict) -> bool: ... +def _rule_misc_to_inproceedings_upgrade(e: dict) -> bool: ... # SOLE upgrade; preprint/repo guard (co-misc-upgrade-preprint-repo-guard) +``` + +```python +# src/fixup/engine.py +from .rules import FixupRule, Site, _rule_procedia_to_inproceedings, ... # explicit imports + +# Each recipe reproduces THAT SITE'S literal current order and membership. +SITE_A_RECIPE: tuple[FixupRule, ...] = ( # A order: ends with conference-journal + R_procedia, R_pacm_to_article, R_jnp_to_article, ..., R_inst_repo_to_phdthesis, + R_inproceedings_repository_to_misc, R_inproceedings_preprint_to_misc, ..., + R_conference_journal_to_inproceedings, # LAST at A +) +SITE_B_RECIPE: tuple[FixupRule, ...] = ( # B order: conference-journal first; INCLUDES patent/unpublished + B text extras + R_conference_journal_to_inproceedings, ..., R_article_patent_to_misc, R_article_unpublished_to_misc, ..., +) +SITE_C_RECIPE: tuple[FixupRule, ...] = ( # C order (Phase-4): superset, upgrade LAST + R_inproceedings_no_booktitle_to_misc, R_conference_journal_to_inproceedings, ..., + R_article_patent_to_misc, R_article_unpublished_to_misc, R_inproceedings_url_booktitle_to_misc, + R_article_preprint_doi_handle, ..., R_misc_to_inproceedings_upgrade, # SOLE C-only upgrade, LAST +) + +def run_fixup(entry: dict, recipe: tuple[FixupRule, ...]) -> bool: + changed = False + for rule in recipe: + changed |= rule.apply(entry) + return changed +``` + +Call-site collapse: +- Site A body → `run_fixup(e, SITE_A_RECIPE)`; the post-run sweep (`main.py:3176`) also uses `SITE_A_RECIPE`. +- Site B body → `run_fixup(baseline, SITE_B_RECIPE)` + the existing write-if-changed wrapper. +- Site C body → `run_fixup(merged, SITE_C_RECIPE)`. + +### Why this satisfies C5 + +- **Parity is structural, not copy-paste**: a CORE rule is one callable object referenced by all three recipes — it cannot drift, and its guards (`not is_pacm`, `not is_proc_series`, PNAS suffix, word-boundary) exist once. +- **Superset preserved, never flattened**: `_rule_misc_to_inproceedings_upgrade` is physically absent from `SITE_A_RECIPE`/`SITE_B_RECIPE`; `sites == {C_PHASE4}`. The `{B,C}` rules appear in both B and C recipes — the CC2 correction is honored. +- **Byte-identity does not depend on commutation**: each recipe is the site's literal order, so output equals today's bytes even if two rules would fire in opposite directions under a different order. Proposal 2's stated fallback ("if the differential test finds a non-commuting pair, keep each site's order") is already the design — no redesign needed. + +### Guard tests (all must pass to land C5) +1. **Membership**: `assert Site.A_LOAD not in R_misc_to_inproceedings_upgrade.sites and Site.B_EXISTING not in it`; `assert R_article_patent_to_misc.sites == {Site.B_EXISTING, Site.C_PHASE4}`; every rule in `SITE_X_RECIPE` has `Site.X in rule.sites`. +2. **AST/grep (G4)**: `_rule_misc_to_inproceedings_upgrade` symbol is referenced only in `engine.py`'s `SITE_C_RECIPE`. +3. **Differential OLD-vs-NEW**: run the pre-refactor inline A/B/C blocks vs the new recipes over a large synthetic entry matrix; assert per-site equality. This is the strongest single C5 gate — it surfaces any non-commuting pair. +4. **Golden Phase-4 fixture matrix (G7)**: preprint article / PACM / patent / thesis DOI / bare stub → exact emitted `@type` and field placement (`of-phase4-type-correction-order`). +5. **Idempotence**: `run_fixup(deepcopy(e), R); run_fixup(e, R)` yields zero further change (`pipeline-double-run-fixpoint`). +6. **Two-run byte diff** over the frozen corpus, under two `PYTHONHASHSEED` values. + +> Note on logging: per-rule debug tags differ across sites (`EXISTING_FIXUP|…` vs `TYPE_CORRECT|…`). No test asserts these and `run.log` is never byte-compared (only `output/*.bib` is the contract). Rules may drop per-rule logging or accept an optional `tag` argument threaded by `run_fixup`; either is byte-neutral. State the chosen option in the C5 commit message. + +--- + +## 5. Ordered, individually-green migration sequence + +Each step is **one worktree-isolated IMPLEMENT task**. The gate after **every** step is identical and non-negotiable: + +> **GATE** = `ruff check src/ tests/ main.py` **and** `mypy src/ main.py` **and** full `pytest` **and** the **two-run byte-identity check**: run the pipeline twice over the frozen fixture corpus from **project-root CWD**, then `git diff --exit-code output/` must be empty. For steps touching surfaces #3/#7 or C5, repeat under a second `PYTHONHASHSEED`. For year-window steps, add freeze-time near the year boundary. + +Re-export shims at old paths (`import X as X` / `__all__` to satisfy ruff F401) keep all existing imports resolving until Step 15. + +**Wave 0 — oracle** + +- **Step 0 — Baseline oracle.** Capture a frozen cache-hit fixture corpus; record the canonical two-run `git diff --exit-code output/` as empty and `ruff`/`mypy`/`pytest` green. This is the regression oracle every later step diffs against. *Proof: the snapshot itself.* + +**Wave 1 — move-only spine + structural guards + C5 (byte-identical by construction, C5 last)** + +- **Step 1 — C7 dead-code.** Delete `src/clients/scholarly_scholar.py`. **Keep** `tests/test_scholarly_scholar.py` (verified: it imports the live `scholar`/`serpapi_scholar`/`serply_scholar`, not the dead module). Re-run the zero-import grep at delete time. *Proof: grep shows zero importers; full pytest green.* → GATE. +- **Step 2 — `src/venue.py` (G1).** Move `merge_utils.py:108-165` + Dagstuhl/LIPIcs (52-55,767-803) verbatim; re-export from `merge_utils`. *Proof: existing venue/merge tests + `co-conference-journal-word-boundary`, `co-dagstuhl-doi-resolution` tests.* → GATE. +- **Step 3 — `src/fsscan.py` (G2).** Add `iter_author_bibs`/`iter_output_dirs`; route each raw `os.listdir` site through it **one at a time**; add the grep-lint (CI fails on raw `os.listdir` over a `.bib` dir). *Proof: `determinism-sorted-bib-scan` test after each site; `a.bib`/`z.bib` both-matching → `a.bib` chosen.* → GATE. +- **Step 4 — `fixup/patterns.py` + `fixup/text.py` (G3).** Move `main.py:119-311` verbatim; re-export `_fix_title_text`, `_apply_booktitle_fixups`, `_is_garbage_title`, `_is_corrupted_title` from `main`. Add the **container-type assertion test** and the **`ao-ascii-clean-table-values` fixpoint test**. *Proof: pattern-type test + fixpoint test + `from main import _is_garbage_title` resolves.* → GATE. +- **Step 5 — Serializer lock-in (G3).** Promote `PREFERRED_FIELD_ORDER` to a named module tuple in `bibtex_utils.py`; add the **golden scrambled-key serializer string test**. No relocation. *Proof: golden string test; `of-bibtex-field-order-stable`.* → GATE. +- **Step 6 — Extract Site A.** Move `_fixup_bib_entry` (`main.py:314-565`) into `fixup/` as the seed of `rules.py`+`engine.py`, wired as `SITE_A_RECIPE` with per-rule `sites` tags (CORE = `{A,B,C}`). Re-export `_fixup_bib_entry` from `main` (post-run sweep at 3176 + tests still import it). Site A drives the post-run sweep, giving highest test coverage at lowest risk. *Proof: idempotence + `ao-postrun-fixup-write-suppression` tests.* → GATE. +- **Step 7 — `pipeline/schedule.py`.** Move `count_existing_papers`, `_load_csv_titles`, and extract `schedule_authors()` from the sort blocks (`2947-2949`/`2971-2977`). *Proof: `determinism-author-sort-key` + new-author-first golden order.* → GATE. +- **Step 8 — `pipeline/article.py`.** Whole-function relocation of `process_article` (`main.py:721-2687`) + its helpers (568-720). Sites B & C ride along **inline, unchanged** (they become recipes in Step 12). Largest move; **zero logic edits**. *Proof: `SEARCH_START` Phase-2-order test (C9), `co-return-code-contract`, two-run diff.* → GATE. +- **Step 9 — `pipeline/record.py`.** Move `process_record` (`main.py:2688-2851`). *Proof: `co-thread-local-logging`, `eh-scholar-retry-then-dblp-only`.* → GATE. +- **Step 10 — `pipeline/reconcile.py`.** Extract the inline post-run block (`main.py:3070-3227`) into `run_post_run_reconciliation(...)`; `main()` calls it from project-root CWD. *Proof: reconciliation integration test (phantom + orphan + out-of-window seed) run from project root; `co-reconciliation-step-ordering`, `co-summary-csv-cwd-relative-paths`.* → GATE. +- **Step 11 — Structural invariant lock.** Add tests: rule-membership map, "no `set`/`frozenset` feeds an ordered/output loop," and the `all_candidate_dois` dedup-only boundary doc + assertion (G5). *Proof: the tests themselves; landmine grep-lint green.* → GATE. +- **Step 12 — C5 (LAST, highest risk, four gates).** Extract the CORE + `{B,C}` + `{C}` rule bodies into `fixup/rules.py`; build `SITE_B_RECIPE` and `SITE_C_RECIPE` in each site's **literal current order** with corrected membership; rewrite Site B (`865-1309`) and Site C (`2028-2401`) as `run_fixup(...)` calls. **Gate = the four C5 guard tests (§4) + differential OLD-vs-NEW matrix + golden Phase-4 fixture + two-run diff under two `PYTHONHASHSEED`.** *This is the only behavior-touching step in Wave 1.* → GATE. + +**Wave 2 — cohesive engine split (G7) + defect fixes (byte-neutral; each step reversible)** + +- **Step 13 — Split `merge_utils.py`.** In sub-steps, each behind GATE: (a) `merge/policy.py` ← `230-925`; (b) `dedup/score.py` ← `text_utils.py:511-546`; (c) `dedup/scan.py` ← `978-1200`; (d) `dedup/decide.py` ← `1201-1305,1386-1455`; (e) `dedup/candidate_doi.py` ← `main.py:634-720,2531-2588`; (f) `save/write.py` ← `927-978,1307-1382,1457-1504`. Re-export from `merge_utils` shim. *Proof: `dd-*`, `to-*`, `ao-*`, `of-filename-*` table-driven tests after each sub-extraction.* → GATE. +- **Step 14 — `pipeline/context.py` + phase split (G6).** Introduce `PipelineContext`; extract `baseline.py`/`phase2_enrich.py`/`phase3_discovery.py`/`phase4_save.py` from `article.py` one at a time, each replacing a slice of `process_article` with a ctx-threaded call, two-run-green after **each** phase. `enr_list` created once, only appended-to. *Proof: `determinism-enr-list-order` shuffle-equal-rank test; two-run after each phase.* → GATE. +- **Step 15 — Defect fixes + shim removal.** Land C1/C2/C3/C4/C6 in their cohesive homes (§6), each with its seam-guard test and two-run diff; then remove the transitional re-export shims. **Final** `ruff` + `mypy` + full `pytest` + two-run byte-identity. → GATE. + +--- + +## 6. Defect-fix placement (each mapped to a step, with seam guard) + +| Defect | Lands in step | Home module:line | Seam guard (MUST hold) | +|--------|---------------|------------------|------------------------| +| **C7 — dead code** | Step 1 | delete `src/clients/scholarly_scholar.py` | Re-grep zero importers at delete time; **keep** `tests/test_scholarly_scholar.py` (it exercises the live clients). | +| **C5 — three-way-fix parity vs superset** | Step 12 | `src/fixup/` (rules.py + engine.py) | CORE bodies single-sourced; per-site ordered recipes preserve order+membership; `misc->inproceedings` upgrade `sites=={C}`; `{B,C}` for patent/unpublished (CC2). Differential + golden + membership + two-run gates. | +| **C2 — ValueError/URL key-leak** | Step 15 | `src/http_utils.py:399` (`_decode_json_bytes`) | Add `_redact_url()` to strip `key=`/tokens **before** the URL enters the `ValueError` message. Do **NOT** add `ValueError` to `NETWORK_ERRORS`/`ALL_API_ERRORS` (`eh-error-tuple-membership-frozen`). Test: `'key='` absent from the WARN record; `ValueError` still raised/propagated. | +| **C1 — retry double-backoff** | Step 15 | `src/http_utils.py:163-175,300-372` (`_http_request`, `_RETRY_STRATEGY`) | Any consolidation keeps 429/503 **out** of `status_forcelist`, `respect_retry_after_header=False`, the `min(rate_wait, HTTP_BACKOFF_MAX)` cap, and every `time.sleep` **outside** `_GLOBAL_SEMAPHORE`. Stopping POST retries is a conscious behavior change (`eh-defect-post-retried-non-idempotent`) — no-op unless explicitly chosen. | +| **C4 — frozen `_month_boundary`** | Step 15 (optional) | `src/cache.py:123` | Optionally recompute `_month_boundary()` per `get()`; update `test_month_boundary_frozen`. Low impact (short batch). Do **not** hard-freeze across restarts. | +| **C3 — vestigial `ttl_days`** | Step 15 (decision) | `src/cache.py` | Leave documented-vestigial **or** remove the write path (`put`/`_write_entry`). **Never** read it in `get()` (`ca-positive-freshness-not-ttl`). | +| **C6 — OpenReview lock-free read** | Step 15 | `src/clients/search_apis.py:~433-490` | Add lock-guarded read at the client only; do **not** change OpenReview's Phase-2 ordinal (4th, encoded in the article/phase-2 source sequence per C9) nor the per-namespace cache lock semantics. Add a targeted concurrency test. | +| **C8 — author-dir single writer** | Steps 7 & 9 (structural, no code fix) | `pipeline/schedule.py`, `pipeline/record.py`, `save/write.py` | Assert one Record → one unique `format_author_dirname` per future; keep the lock-free RMW; add **no** intra-author parallelism. A per-dir lock is added **only if** within-author parallelism is ever introduced. | + +--- + +## 7. Risks, rollback, and determinism landmines + +### Top risks and mitigations +1. **C5 order/membership drift (highest).** A wrong `sites` tag or recipe order silently mis-promotes entries (or, worst case, pushes the `misc->inproceedings` upgrade into A/B where `howpublished` is pre-enrichment — `co-misc-upgrade-preprint-repo-guard`). *Mitigation:* per-site literal-order recipes (no reorder bet); the differential OLD-vs-NEW matrix; the "upgrade only in C" AST test; the golden Phase-4 fixture; two-run under two `PYTHONHASHSEED`. C5 lands last, alone. +2. **Catalog mis-facts (CC1, CC2).** Building C5 from the catalog's "patent/unpublished are C-only" text would drop those rules from Site B and break `pipeline-double-run-fixpoint` for baseline patent/unpublished entries on the complete-entry-skip-enrichment path (where Site B is the *only* fixup). *Mitigation:* membership derived from the source grep in §Verification above; the membership test encodes `{B,C}`. +3. **`enr_list` threading (Wave 2).** Splitting `process_article` risks resetting/reordering the accumulator. *Mitigation:* `PipelineContext` created once, append-only; two-run diff after each phase. +4. **Import cycles.** `fixup` uses `_is_conference_journal`; without `venue.py` (Step 2, before Step 12) it would import `merge`. *Mitigation:* Step 2 precedes all fixup work; an import-graph test asserts no back-edges. +5. **Re-export/F401 churn.** ~30 modules of import updates. *Mitigation:* `import as`/`__all__` shims at every old path until Step 15; a per-step checklist item. +6. **CWD-relative reconcile (`co-summary-csv-cwd-relative-paths`).** Moving the post-run block must keep raw-relpath `os.path.exists` checks and run from project root. *Mitigation:* Step 10 integration test runs from project-root CWD. +7. **Toolchain mismatch.** This repo mandates **pip + mypy + ruff + pytest** (NOT uv/pyrefly). *Mitigation:* the GATE names the exact toolchain; a mismatched toolchain would produce a false green. +8. **Large single relocation (Step 8, ~1970 lines).** Risk is import wiring, not logic. *Mitigation:* pure whole-function move, zero body edits, two-run diff. + +### Rollback +Every step is a single worktree-isolated commit that is byte-green in isolation (Wave 1 steps are relocations; Wave 2 steps are behind shims). **Rollback = revert that one commit**; the re-export shims mean reverting a later step never orphans an earlier one. The Step-0 oracle is the fixed comparison point for any bisection. If a GATE fails, the step does not merge — there is no partial-state to unwind. + +### Determinism landmines reviewers MUST reject +- Any `set`/`frozenset` feeding a **fix-pattern loop** or an **output-affecting order** (surfaces #3, #7). *The lone legitimate set is `all_candidate_dois` — dedup-only; its order comes solely from the published-first partition sort (G5).* +- Any raw `os.listdir` over a `.bib` dir **without `sorted()`** (surface #6) — now a CI grep-lint failure via `fsscan.py`. +- **Numeric filename counters** (`-2.bib`) instead of title-word extension (`of-filename-no-numeric-counters`). +- Reliance on **`dict` insertion order** in `bibtex_from_dict` field emission (surface #1) — field order comes from the named `PREFERRED_FIELD_ORDER` tuple. +- Any **inlined threshold literal** that forks from `config.py` (`cd-thresholds-centralized`); reclassification/fix-table **values that are not `_normalize_to_ascii` fixpoints** (`ao-ascii-clean-table-values`). +- **Collapsing the three fix sites to one shared order** or making all three byte-identical — this either flattens C's superset or pushes the `misc->inproceedings` upgrade into A/B (`ao-phase4-superset`). Recipes must stay per-site. +- Running the pipeline (or reconcile) from a **non-root CWD** (surface #12, breaks `co-summary-csv-cwd-relative-paths`). +- Re-adding **429/503 to `status_forcelist`**, moving any `time.sleep` **inside** `_GLOBAL_SEMAPHORE`, or adding `ValueError` to the **frozen error tuples** (C1/C2 seams). From 36629ff7d42a8de0b75e561436da8b1bb95b9be3 Mon Sep 17 00:00:00 2001 From: Gabriel Spadon Date: Wed, 1 Jul 2026 13:02:24 -0300 Subject: [PATCH 04/54] test(cache): make negative-cache expiry tests date-deterministic The two safe-negative expiry tests backdated timestamps via max(time.time()-8d, _month_boundary+1), which self-defeats during the first week of a month (today): the clamp raised the timestamp too recent for a Monday to have elapsed. Freeze the cache wall clock to a fixed mid-month instant so both tests are date-independent. Pre-existing failure, unrelated to the refactor; required for a green Step-0 oracle. --- tests/test_cache.py | 34 +++++++++++++++++++++++++++------- 1 file changed, 27 insertions(+), 7 deletions(-) diff --git a/tests/test_cache.py b/tests/test_cache.py index be607aac..a06119a5 100644 --- a/tests/test_cache.py +++ b/tests/test_cache.py @@ -2,13 +2,27 @@ import json import time -from datetime import datetime +from datetime import datetime, tzinfo from pathlib import Path from unittest.mock import patch +import pytest + from src.cache import _AST, ResponseCache, get_cache_hit_counts, reset_cache_hit_counts +def _freeze_cache_clock(monkeypatch: pytest.MonkeyPatch, when: datetime) -> None: + """Freeze src.cache's wall clock to a fixed instant so expiry tests are date-independent.""" + import src.cache as cache_mod + + class _FrozenDatetime(datetime): + @classmethod + def now(cls, tz: tzinfo | None = None) -> datetime: # type: ignore[override] + return when.astimezone(tz) if tz is not None else when + + monkeypatch.setattr(cache_mod, "datetime", _FrozenDatetime) + + def test_put_and_get(tmp_path: Path) -> None: """Test basic cache put and get operations.""" cache = ResponseCache(cache_dir=str(tmp_path)) @@ -113,8 +127,10 @@ def test_corrupted_cache_file(tmp_path: Path) -> None: assert cache.get("test_ns", "key1") is None -def test_negative_cache_ttl_expires(tmp_path: Path) -> None: +def test_negative_cache_ttl_expires(tmp_path: Path, monkeypatch: pytest.MonkeyPatch) -> None: """Test that safe negative cache entries expire after their Monday/month TTL.""" + # Freeze the wall clock so expiry does not depend on the real calendar date. + _freeze_cache_clock(monkeypatch, datetime(2026, 6, 17, 12, 0, tzinfo=_AST)) cache = ResponseCache(cache_dir=str(tmp_path)) # Build a safe negative (3 confirmations) for _ in range(3): @@ -126,10 +142,10 @@ def test_negative_cache_ttl_expires(tmp_path: Path) -> None: assert result["_negative"] is True assert result["_safe"] is True - # Backdate by 8 days — guarantees a Monday boundary has passed + # Backdate to after the (frozen) month boundary with a Monday since elapsed. path = Path(cache._entry_path("test_ns", "key1")) entry = json.loads(path.read_text(encoding="utf-8")) - entry["timestamp"] = max(time.time() - 8 * 86400, cache._month_boundary + 1) + entry["timestamp"] = datetime(2026, 6, 2, tzinfo=_AST).timestamp() path.write_text(json.dumps(entry), encoding="utf-8") # Now it should be expired (either monthly or Monday boundary) @@ -275,18 +291,22 @@ def test_positive_overwrites_negative(tmp_path: Path) -> None: assert result == {"title": "Real Paper"} -def test_safe_negative_monday_expiry(tmp_path: Path) -> None: +def test_safe_negative_monday_expiry(tmp_path: Path, monkeypatch: pytest.MonkeyPatch) -> None: """Test that a safe negative expires after the next Monday boundary.""" + # Freeze the wall clock to a fixed Wednesday mid-month so the Monday-boundary + # math is date-independent (the real calendar must not decide the outcome). + _freeze_cache_clock(monkeypatch, datetime(2026, 6, 17, 12, 0, tzinfo=_AST)) cache = ResponseCache(cache_dir=str(tmp_path)) ns, key = "test_ns", "neg_key" for _ in range(3): cache.put_negative(ns, key) - # Backdate by 8 days — guarantees a Monday has passed + # Backdate to after the (frozen) month boundary with a Monday since elapsed, + # isolating the Monday branch (timestamp stays above the month boundary). path = Path(cache._entry_path(ns, key)) entry = json.loads(path.read_text(encoding="utf-8")) - entry["timestamp"] = max(time.time() - 8 * 86400, cache._month_boundary + 1) + entry["timestamp"] = datetime(2026, 6, 2, tzinfo=_AST).timestamp() path.write_text(json.dumps(entry), encoding="utf-8") assert cache.get(ns, key) is None From 3cf22a241b793aef1c0d856d623f1a83a7c58c80 Mon Sep 17 00:00:00 2001 From: Gabriel Spadon Date: Wed, 1 Jul 2026 13:05:47 -0300 Subject: [PATCH 05/54] refactor: remove dead scholarly_scholar.py client (C7) Zero importers (verified repo-wide at delete time); the 'scholarly' package is not a dependency so the module's top-level import would fail if ever loaded. tests/test_scholarly_scholar.py exercises the live scholar/serpapi/serply clients and is retained. Migration Step 1. --- src/clients/scholarly_scholar.py | 199 ------------------------------- 1 file changed, 199 deletions(-) delete mode 100644 src/clients/scholarly_scholar.py diff --git a/src/clients/scholarly_scholar.py b/src/clients/scholarly_scholar.py deleted file mode 100644 index 15e829e5..00000000 --- a/src/clients/scholarly_scholar.py +++ /dev/null @@ -1,199 +0,0 @@ -"""Google Scholar access via the ``scholarly`` library with ScraperAPI proxy. - -All public functions accept an ``api_key`` argument (ScraperAPI key) and return -data structures compatible with the rest of the CiteForge pipeline. - -Thread safety -------------- -``scholarly`` is **not** thread-safe. A module-level ``_scholarly_lock`` -serializes every call. This is acceptable because Scholar is rate-limited -anyway and parallel Scholar calls increase CAPTCHA risk. -""" - -from __future__ import annotations - -import logging -import threading -from typing import Any - -from scholarly import scholarly - -_log = logging.getLogger("CiteForge.scholarly") - -_scholarly_lock = threading.Lock() -_initialized = False - -# Cache the raw publications list returned by ``scholarly.fill(author, -# sections=["publications"])``. Keyed by ``author_id``, this avoids -# re-fetching the full author profile on every ``scholarly_fetch_citation`` -# call — turning O(N) profile fetches into O(1) per author. -_author_pubs_cache: dict[str, list[dict[str, Any]]] = {} - - -def _ensure_initialized(api_key: str) -> None: - """Lazily configure ``scholarly`` with a ScraperAPI proxy on first use. - - Must be called while holding ``_scholarly_lock``. If initialization - fails, ``_initialized`` remains ``False`` so the next call retries. - The exception propagates to the caller. - """ - global _initialized - if _initialized: - return - from scholarly import ProxyGenerator - - pg = ProxyGenerator() - pg.ScraperAPI(api_key) - scholarly.use_proxy(pg) - scholarly.set_retries(3) - _initialized = True - _log.info("scholarly initialized with ScraperAPI proxy") - - -def _fetch_author_pubs( - api_key: str, - author_id: str, - num: int = 100, -) -> list[dict[str, Any]]: - """Fetch and cache the publications list for *author_id*. - - Must be called while holding ``_scholarly_lock``. Returns the cached - list on subsequent calls for the same author. - """ - cached = _author_pubs_cache.get(author_id) - if cached is not None: - return cached - - _ensure_initialized(api_key) - try: - author = scholarly.search_author_id( - author_id, sortby="year", publication_limit=num, - ) - author = scholarly.fill(author, sections=["publications"]) - except Exception as exc: - _log.warning("scholarly author fetch failed for %s: %s", author_id, exc) - return [] - - pubs: list[dict[str, Any]] = author.get("publications") or [] - _author_pubs_cache[author_id] = pubs - return pubs - - -def scholarly_fetch_author_publications( - api_key: str, - author_id: str, - num: int = 100, - start: int = 0, -) -> dict[str, Any]: - """Fetch publications for *author_id* via ``scholarly``. - - Returns a dict matching the CiteForge ``fetch_author_publications()`` - format:: - - {"articles": [...], "search_metadata": {"status": "Success", "source": "scholarly"}} - """ - if not api_key: - return {} - - with _scholarly_lock: - publications = _fetch_author_pubs(api_key, author_id, num=num) - - articles: list[dict[str, Any]] = [] - - for pub in publications[start:]: - bib: dict[str, Any] = pub.get("bib") or {} - title = bib.get("title", "") - if not title: - continue - - author_pub_id: str = pub.get("author_pub_id") or "" - citation_id = author_pub_id.split(":")[-1] - - year_raw = str(bib.get("pub_year", "")) - year_int: int | str = int(year_raw) if year_raw.isdigit() else "" - - article: dict[str, Any] = { - "title": title, - "authors": bib.get("author", ""), - "year": year_int, - "citation_id": citation_id, - "result_id": citation_id, - "source": "scholar", - } - - venue = bib.get("venue") or bib.get("citation", "") - if venue: - article["publication_info"] = {"summary": venue} - article["publication"] = venue - - articles.append(article) - - return { - "articles": articles, - "search_metadata": {"status": "Success", "source": "scholarly"}, - } - - -def scholarly_fetch_citation( - api_key: str, - author_id: str, - citation_id: str, -) -> dict[str, str] | None: - """Fetch detailed citation metadata for a single publication. - - Uses the cached author publications list to locate the target entry, - then calls ``scholarly.fill(pub)`` to fetch full details. Returns a - dict with field names matching the CiteForge Scholar citation format, - or ``None`` on failure. - """ - if not api_key or not author_id or not citation_id: - return None - - target_pub_id = f"{author_id}:{citation_id}" - - with _scholarly_lock: - publications = _fetch_author_pubs(api_key, author_id) - - pub: dict[str, Any] | None = next( - (p for p in publications - if p.get("author_pub_id") == target_pub_id), - None, - ) - - if pub is None: - _log.debug("Publication %s not found in author profile", target_pub_id) - return None - - try: - pub = scholarly.fill(pub) - except Exception as exc: - _log.warning("scholarly fill failed for %s: %s", target_pub_id, exc) - return None - - bib: dict[str, Any] = pub.get("bib") or {} - fields: dict[str, str] = {} - - if bib.get("title"): - fields["title"] = str(bib["title"]) - - author_val = bib.get("author") - if author_val: - if isinstance(author_val, list): - fields["authors"] = " and ".join(str(a) for a in author_val) - else: - fields["authors"] = str(author_val) - - if bib.get("pub_year"): - fields["publication date"] = str(bib["pub_year"]) - - for key in ("journal", "volume", "pages", "publisher"): - if bib.get(key): - fields[key] = str(bib[key]) - - if bib.get("abstract"): - fields["description"] = str(bib["abstract"]) - - if bib.get("venue"): - fields.setdefault("journal", str(bib["venue"])) - - return fields or None From 323b4bc3c55e4556578288acbc58f4875dea610e Mon Sep 17 00:00:00 2001 From: Gabriel Spadon Date: Wed, 1 Jul 2026 13:19:05 -0300 Subject: [PATCH 06/54] refactor: extract venue classification into src/venue.py (Step 2) Move _is_conference_journal, _matches_journal_named_proceedings, infer_howpublished_from_doi, _normalize_howpublished, _DAGSTUHL_DOI_RE and the howpublished constant tables verbatim from merge_utils.py into a new leaf module src/venue.py (imports only config; no merge_utils cycle). merge_utils re-exports them so all callers resolve unchanged. Byte-neutral. --- src/merge_utils.py | 111 ++++----------------------------------------- src/venue.py | 106 +++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 115 insertions(+), 102 deletions(-) create mode 100644 src/venue.py diff --git a/src/merge_utils.py b/src/merge_utils.py index c9880da2..f7f0e1f3 100644 --- a/src/merge_utils.py +++ b/src/merge_utils.py @@ -10,11 +10,9 @@ from .bibtex_utils import bibtex_from_dict, parse_bibtex_to_dict, short_filename_for_entry from .config import ( ABBREVIATED_VENUE_MAP, - CONFERENCE_AS_JOURNAL, DEDUP_INTERNAL_FIELDS, GENERIC_SERIES_NAMES, JOURNAL_ONLY_PREFIXES, - JOURNALS_NAMED_PROCEEDINGS, PAGES_MAX_DIGITS, PREPRINT_DOI_PREFIXES, PREPRINT_ONLY_PUBLISHERS, @@ -48,10 +46,15 @@ title_is_truncated_match, title_similarity, ) - -_DAGSTUHL_DOI_RE = re.compile( - r"^10\.4230/(lipics|oasics)\.([a-z0-9]+)\.(\d+)(?:\.\d+)?$", - re.IGNORECASE, +from .venue import ( # noqa: F401 + _DAGSTUHL_DOI_RE, + _DOI_PREFIX_TO_HOWPUB, + _HOWPUB_CANONICAL, + _OSF_PREPRINTS, + _is_conference_journal, + _matches_journal_named_proceedings, + _normalize_howpublished, + infer_howpublished_from_doi, ) _AUTHOR_DIGIT_SUFFIX_RE = re.compile(r"\s+\d{1,4}\s*$") @@ -64,102 +67,6 @@ "ssrn.com": "SSRN Electronic Journal", } -# Canonical casing for howpublished preprint server names. -# Used by merge_with_policy, save_entry_to_file fixup, and Phase 4 post-merge. -_OSF_PREPRINTS = "OSF Preprints" - -_HOWPUB_CANONICAL: dict[str, str] = { - "arxiv": "arXiv", - "biorxiv": "bioRxiv", - "medrxiv": "medRxiv", - "chemrxiv": "ChemRxiv", - "techrxiv": "TechRxiv", - "research square": "Research Square", - "ssrn": "SSRN", - "osf preprints": _OSF_PREPRINTS, - "preprints.org": "Preprints.org", - "openrxiv": "openRxiv", -} - -# Map preprint DOI prefixes → canonical howpublished value. -# Used to backfill howpublished on @misc entries with preprint DOIs. -_DOI_PREFIX_TO_HOWPUB: tuple[tuple[str, str], ...] = ( - ("10.48550/arxiv", "arXiv"), - ("10.1101/", "bioRxiv"), - ("10.21203/rs.", "Research Square"), - ("10.31234/osf.io", _OSF_PREPRINTS), - ("10.31219/osf.io", _OSF_PREPRINTS), - ("10.26434/chemrxiv", "ChemRxiv"), - ("10.20944/preprints", "Preprints.org"), - ("10.2139/ssrn", "SSRN"), - ("10.64898/", "openRxiv"), - ("10.36227/techrxiv", "TechRxiv"), - ("10.33774/", "Preprint"), - ("10.5194/egusphere", "EGU"), - ("10.2172/", "OSTI"), - ("10.31220/agrirxiv", "agriRxiv"), - ("10.32388/", "Qeios"), - ("10.48448/", "Underline Science"), - ("10.32920/", "Institutional Repository"), - ("10.5281/zenodo", "Zenodo"), -) - - -def infer_howpublished_from_doi(doi: str) -> str | None: - """Return canonical howpublished for a preprint DOI, or None.""" - dl = doi.lower() - for prefix, name in _DOI_PREFIX_TO_HOWPUB: - if dl.startswith(prefix): - return name - return None - - -def _matches_journal_named_proceedings(text_lower: str) -> bool: - """Word-boundary match against JOURNALS_NAMED_PROCEEDINGS. - - Avoids false positives like "proceedings of the ieee/cvf winter - conference" matching "proceedings of the ieee" (the journal). - """ - for jnp in JOURNALS_NAMED_PROCEEDINGS: - idx = text_lower.find(jnp) - if idx == -1: - continue - end = idx + len(jnp) - if end >= len(text_lower) or text_lower[end] in (" ", ",", ".", ";", ":"): - return True - return False - - -def _is_conference_journal(journal: str) -> bool: - """Check if a journal name is actually a conference proceedings venue. - - Detects "Proceedings of ...", "Conference on ...", "Tagungsband" (German - proceedings), "@" patterns (e.g. IberLEF@SEPLN), and entries in - CONFERENCE_AS_JOURNAL. Excludes journals whose names happen to contain - "Proceedings" (e.g. PNAS, PVLDB, Proc. IEEE). - """ - lower = journal.lower() - # Exclude real journals that happen to contain "Proceedings" - if _matches_journal_named_proceedings(lower): - return False - return ( - "proceedings" in lower - or "tagungsband" in lower - or lower.startswith("conference on") - or "@" in journal - or lower in CONFERENCE_AS_JOURNAL - ) - - -def _normalize_howpublished(fields: dict[str, Any]) -> None: - """Normalize howpublished casing for known preprint servers in-place.""" - hp = (fields.get("howpublished") or "").strip() - if hp: - hp_key = hp.lower().split("(")[0].strip() - if hp_key in _HOWPUB_CANONICAL: - fields["howpublished"] = _HOWPUB_CANONICAL[hp_key] - - _AUTHOR_SEPARATOR = " and " diff --git a/src/venue.py b/src/venue.py new file mode 100644 index 00000000..e0fc6747 --- /dev/null +++ b/src/venue.py @@ -0,0 +1,106 @@ +from __future__ import annotations + +import re +from typing import Any + +from .config import CONFERENCE_AS_JOURNAL, JOURNALS_NAMED_PROCEEDINGS + +_DAGSTUHL_DOI_RE = re.compile( + r"^10\.4230/(lipics|oasics)\.([a-z0-9]+)\.(\d+)(?:\.\d+)?$", + re.IGNORECASE, +) + +# Canonical casing for howpublished preprint server names. +# Used by merge_with_policy, save_entry_to_file fixup, and Phase 4 post-merge. +_OSF_PREPRINTS = "OSF Preprints" + +_HOWPUB_CANONICAL: dict[str, str] = { + "arxiv": "arXiv", + "biorxiv": "bioRxiv", + "medrxiv": "medRxiv", + "chemrxiv": "ChemRxiv", + "techrxiv": "TechRxiv", + "research square": "Research Square", + "ssrn": "SSRN", + "osf preprints": _OSF_PREPRINTS, + "preprints.org": "Preprints.org", + "openrxiv": "openRxiv", +} + +# Map preprint DOI prefixes → canonical howpublished value. +# Used to backfill howpublished on @misc entries with preprint DOIs. +_DOI_PREFIX_TO_HOWPUB: tuple[tuple[str, str], ...] = ( + ("10.48550/arxiv", "arXiv"), + ("10.1101/", "bioRxiv"), + ("10.21203/rs.", "Research Square"), + ("10.31234/osf.io", _OSF_PREPRINTS), + ("10.31219/osf.io", _OSF_PREPRINTS), + ("10.26434/chemrxiv", "ChemRxiv"), + ("10.20944/preprints", "Preprints.org"), + ("10.2139/ssrn", "SSRN"), + ("10.64898/", "openRxiv"), + ("10.36227/techrxiv", "TechRxiv"), + ("10.33774/", "Preprint"), + ("10.5194/egusphere", "EGU"), + ("10.2172/", "OSTI"), + ("10.31220/agrirxiv", "agriRxiv"), + ("10.32388/", "Qeios"), + ("10.48448/", "Underline Science"), + ("10.32920/", "Institutional Repository"), + ("10.5281/zenodo", "Zenodo"), +) + + +def infer_howpublished_from_doi(doi: str) -> str | None: + """Return canonical howpublished for a preprint DOI, or None.""" + dl = doi.lower() + for prefix, name in _DOI_PREFIX_TO_HOWPUB: + if dl.startswith(prefix): + return name + return None + + +def _matches_journal_named_proceedings(text_lower: str) -> bool: + """Word-boundary match against JOURNALS_NAMED_PROCEEDINGS. + + Avoids false positives like "proceedings of the ieee/cvf winter + conference" matching "proceedings of the ieee" (the journal). + """ + for jnp in JOURNALS_NAMED_PROCEEDINGS: + idx = text_lower.find(jnp) + if idx == -1: + continue + end = idx + len(jnp) + if end >= len(text_lower) or text_lower[end] in (" ", ",", ".", ";", ":"): + return True + return False + + +def _is_conference_journal(journal: str) -> bool: + """Check if a journal name is actually a conference proceedings venue. + + Detects "Proceedings of ...", "Conference on ...", "Tagungsband" (German + proceedings), "@" patterns (e.g. IberLEF@SEPLN), and entries in + CONFERENCE_AS_JOURNAL. Excludes journals whose names happen to contain + "Proceedings" (e.g. PNAS, PVLDB, Proc. IEEE). + """ + lower = journal.lower() + # Exclude real journals that happen to contain "Proceedings" + if _matches_journal_named_proceedings(lower): + return False + return ( + "proceedings" in lower + or "tagungsband" in lower + or lower.startswith("conference on") + or "@" in journal + or lower in CONFERENCE_AS_JOURNAL + ) + + +def _normalize_howpublished(fields: dict[str, Any]) -> None: + """Normalize howpublished casing for known preprint servers in-place.""" + hp = (fields.get("howpublished") or "").strip() + if hp: + hp_key = hp.lower().split("(")[0].strip() + if hp_key in _HOWPUB_CANONICAL: + fields["howpublished"] = _HOWPUB_CANONICAL[hp_key] From a36e679486d820fb1d3cd2c9c9e718cf0c3aea64 Mon Sep 17 00:00:00 2001 From: Gabriel Spadon Date: Wed, 1 Jul 2026 13:28:46 -0300 Subject: [PATCH 07/54] fix: redact API keys from logs and exception text (C2) Gemini (?key=) and SerpAPI (&api_key=) pass credentials as query params; those URLs leaked into WARN logs via exception text and via the ValueError raised by _decode_json_bytes -- and output/run.log is committed to a public branch. Add a config-driven _scrub_secrets() (REDACT_QUERY_PARAM_NAMES) and apply it at _decode_json_bytes and the Gemini/SerpAPI log sites. Error tuples untouched (seam C2: do not add ValueError to the frozen tuples). --- src/clients/serpapi_scholar.py | 34 +-- src/clients/utility_apis.py | 82 ++++--- src/config.py | 403 +++++++++++++++++++-------------- src/http_utils.py | 67 ++++-- tests/test_http_utils.py | 46 ++++ 5 files changed, 395 insertions(+), 237 deletions(-) create mode 100644 tests/test_http_utils.py diff --git a/src/clients/serpapi_scholar.py b/src/clients/serpapi_scholar.py index ef0c583a..870406db 100644 --- a/src/clients/serpapi_scholar.py +++ b/src/clients/serpapi_scholar.py @@ -36,7 +36,7 @@ from urllib.parse import urlencode from ..config import HTTP_TIMEOUT_DEFAULT, SERPAPI_BASE -from ..http_utils import http_fetch_bytes +from ..http_utils import _scrub_secrets, http_fetch_bytes _log = logging.getLogger("CiteForge.serpapi") @@ -47,8 +47,9 @@ _PAGE_SIZE = 100 -def _serpapi_get(api_key: str, author_id: str, start: int = 0, num: int = _PAGE_SIZE, - sort: str = "pubdate") -> dict[str, Any]: +def _serpapi_get( + api_key: str, author_id: str, start: int = 0, num: int = _PAGE_SIZE, sort: str = "pubdate" +) -> dict[str, Any]: """Execute a GET request against the SerpAPI Scholar Author endpoint. Args: @@ -61,14 +62,16 @@ def _serpapi_get(api_key: str, author_id: str, start: int = 0, num: int = _PAGE_ Returns: Parsed JSON response dict, or empty dict on failure. """ - params = urlencode({ - "engine": "google_scholar_author", - "author_id": author_id, - "start": start, - "num": num, - "sort": sort, - "api_key": api_key, - }) + params = urlencode( + { + "engine": "google_scholar_author", + "author_id": author_id, + "start": start, + "num": num, + "sort": sort, + "api_key": api_key, + } + ) url = f"{SERPAPI_BASE}?{params}" headers = {"Accept": "application/json"} @@ -81,7 +84,7 @@ def _serpapi_get(api_key: str, author_id: str, start: int = 0, num: int = _PAGE_ return {} return data except Exception as exc: - _log.warning("SerpAPI request failed for %s: %s", author_id, exc) + _log.warning("SerpAPI request failed for %s: %s", author_id, _scrub_secrets(str(exc))) return {} @@ -183,14 +186,15 @@ def serpapi_fetch_author_publications( # Year-bounded stop: if ALL articles with valid years on this page # are below min_year, we've passed the contribution window. if year_bounded and len(articles) > page_start: - page_years = [a["year"] for a in articles[page_start:] - if isinstance(a["year"], int) and a["year"] > 0] + page_years = [a["year"] for a in articles[page_start:] if isinstance(a["year"], int) and a["year"] > 0] if page_years: max_year = max(page_years) if max_year < min_year: _log.debug( "Year-bounded stop for %s: page max year %d < min_year %d", - author_id, max_year, min_year, + author_id, + max_year, + min_year, ) break diff --git a/src/clients/utility_apis.py b/src/clients/utility_apis.py index b75b0461..682ad638 100644 --- a/src/clients/utility_apis.py +++ b/src/clients/utility_apis.py @@ -9,7 +9,7 @@ from ..cache import response_cache from ..config import CACHE_TTL_DOI_DAYS, CACHE_TTL_SEARCH_DAYS, DATACITE_BASE, GEMINI_BASE, ORCID_BASE from ..exceptions import ALL_API_ERRORS, NETWORK_ERRORS -from ..http_utils import handle_api_errors, http_get_json, http_post_json +from ..http_utils import _scrub_secrets, handle_api_errors, http_get_json, http_post_json from ..id_utils import _norm_doi from ..log_utils import LogCategory, LogSource, logger from ..text_utils import extract_year_from_any, normalize_title @@ -17,14 +17,14 @@ # ============ Gemini ============ -def gemini_generate_short_title( - full_title: str, api_key: str, max_words: int | None = None -) -> str | None: + +def gemini_generate_short_title(full_title: str, api_key: str, max_words: int | None = None) -> str | None: """ Call the Gemini API to generate a short CamelCase title for a publication, suitable for BibTeX keys and filenames. """ from ..config import BIBTEX_KEY_MAX_WORDS + if max_words is None: max_words = BIBTEX_KEY_MAX_WORDS @@ -33,7 +33,7 @@ def gemini_generate_short_title( prompt = ( f"Create a smart, concise CamelCase title (1 to {max_words} words) " - f"for this publication: \"{full_title}\". " + f'for this publication: "{full_title}". ' "Extract the most important keywords. " "Skip stop words (a, an, the, for, of, and, to, in, with, from, by, at). " f"Use exactly {max_words} words or fewer if shorter captures the essence better. " @@ -44,17 +44,13 @@ def gemini_generate_short_title( url = f"{GEMINI_BASE}?key={api_key}" payload = { - "contents": [{ - "parts": [{ - "text": prompt - }] - }], + "contents": [{"parts": [{"text": prompt}]}], "generationConfig": { "maxOutputTokens": 50, "temperature": 0.3, "topP": 0.8, "topK": 20, - } + }, } import requests as _requests @@ -71,23 +67,32 @@ def gemini_generate_short_title( break # success except _requests.exceptions.HTTPError as e: if e.response is not None and e.response.status_code == 429 and attempt < max_retries: - wait = (2 ** attempt) + random.uniform(0, 1) + wait = (2**attempt) + random.uniform(0, 1) logger.debug( f"GEMINI_429 | attempt={attempt} | backoff={wait:.1f}s", category=LogCategory.CITEKEY, ) logger.info( f"Gemini 429 (attempt {attempt}/{max_retries}), retrying in {wait:.1f}s", - category=LogCategory.DEBUG, source=LogSource.SYSTEM, + category=LogCategory.DEBUG, + source=LogSource.SYSTEM, ) time.sleep(wait) continue logger.debug(f"GEMINI_FAIL | error={type(e).__name__}", category=LogCategory.CITEKEY) - logger.warn(f"API call failed: {e}", category=LogCategory.ERROR, source=LogSource.SYSTEM) + logger.warn( + f"API call failed: {_scrub_secrets(str(e))}", + category=LogCategory.ERROR, + source=LogSource.SYSTEM, + ) return None except (*ALL_API_ERRORS, ValueError) as e: logger.debug(f"GEMINI_FAIL | error={type(e).__name__}", category=LogCategory.CITEKEY) - logger.warn(f"API call failed: {e}", category=LogCategory.ERROR, source=LogSource.SYSTEM) + logger.warn( + f"API call failed: {_scrub_secrets(str(e))}", + category=LogCategory.ERROR, + source=LogSource.SYSTEM, + ) return None if data is None: @@ -121,13 +126,15 @@ def gemini_generate_short_title( ) logger.info( f"Generated title: {short_title}", - category=LogCategory.DEBUG, source=LogSource.SYSTEM, + category=LogCategory.DEBUG, + source=LogSource.SYSTEM, ) return short_title # ============ DataCite ============ + @handle_api_errors(default_return=None) def datacite_search_doi(doi: str) -> dict[str, Any] | None: """Look up a DOI in DataCite to get dataset or software metadata.""" @@ -183,8 +190,7 @@ def build_bibtex_from_datacite(record: dict[str, Any], keyhint: str) -> str | No return None authors: list[str] = [ - name for creator in attributes.get("creators") or [] - if (name := safe_get_field(creator, "name")) + name for creator in attributes.get("creators") or [] if (name := safe_get_field(creator, "name")) ] year = extract_year_from_any(attributes.get("publicationYear"), fallback=0) or 0 @@ -200,10 +206,12 @@ def build_bibtex_from_datacite(record: dict[str, Any], keyhint: str) -> str | No extra_fields: dict[str, str] = {} note_parts = [ - part for part in [ + part + for part in [ f"Type: {resource_type_general}" if resource_type_general else "", f"Version: {attributes['version']}" if attributes.get("version") else "", - ] if part + ] + if part ] if note_parts: extra_fields["note"] = ", ".join(note_parts) @@ -211,13 +219,21 @@ def build_bibtex_from_datacite(record: dict[str, Any], keyhint: str) -> str | No extra_fields["howpublished"] = venue return build_bibtex_entry( - entry_type=entry_type, title=title, authors=authors, year=year, - keyhint=keyhint, venue="", doi=doi, url=url, extra_fields=extra_fields, + entry_type=entry_type, + title=title, + authors=authors, + year=year, + keyhint=keyhint, + venue="", + doi=doi, + url=url, + extra_fields=extra_fields, ) # ============ ORCID ============ + @handle_api_errors(default_return=[]) def orcid_fetch_works(orcid_id: str) -> list[dict[str, Any]]: """Fetch a list of works for an ORCID author.""" @@ -244,7 +260,7 @@ def orcid_fetch_works(orcid_id: str) -> list[dict[str, Any]]: return [] works = [] - for work_group in (data.get("group") or []): + for work_group in data.get("group") or []: work_summary = work_group.get("work-summary") or [] if not work_summary: continue @@ -259,13 +275,15 @@ def orcid_fetch_works(orcid_id: str) -> list[dict[str, Any]]: year = pub_date.get("year") or {} year_val = year.get("value") if isinstance(year, dict) else None - works.append({ - "title": title, - "year": year_val, - "type": work.get("type"), - "external-ids": work.get("external-ids") or {}, - "url": work.get("url") or {}, - }) + works.append( + { + "title": title, + "year": year_val, + "type": work.get("type"), + "external-ids": work.get("external-ids") or {}, + "url": work.get("url") or {}, + } + ) logger.debug( f"orcid | WORKS | id={orcid_id} | count={len(works)}", @@ -296,6 +314,7 @@ def orcid_search_work_by_title(orcid_id: str, title: str, _author_name: str | No return dict(work) from ..bibtex_build import create_scoring_function + # NOTE: ORCID work-summary responses do not include contributor lists, # so we skip author matching (author_name=None) to avoid rejecting all # candidates when cand_authors is always empty. @@ -310,8 +329,7 @@ def orcid_search_work_by_title(orcid_id: str, title: str, _author_name: str | No result = _best_item_by_score(works, score_fn) logger.debug( - f"orcid | TITLE_MATCH | title={title[:50]} | exact=False" - f" | result={'found' if result else 'none'}", + f"orcid | TITLE_MATCH | title={title[:50]} | exact=False | result={'found' if result else 'none'}", category=LogCategory.SCORE, ) return result diff --git a/src/config.py b/src/config.py index d4c14880..c1b6477d 100644 --- a/src/config.py +++ b/src/config.py @@ -40,11 +40,13 @@ def get_min_year() -> int: if MIN_YEAR is not None: return MIN_YEAR from datetime import datetime, timezone + return datetime.now(timezone.utc).year - (_CONTRIBUTION_WINDOW_FALLBACK - 1) def _current_year() -> int: from datetime import datetime, timezone + return datetime.now(timezone.utc).year @@ -64,17 +66,17 @@ def _current_year() -> int: # Sources earlier in the list are more reliable than those later. # This ordering reflects data quality, completeness, and standardization. TRUST_ORDER = [ - "csl", # DOI → CSL-JSON (highest trust, structured metadata) - "doi_bibtex", # DOI → BibTeX (direct from DOI resolver) - "datacite", # DataCite DOIs (datasets/software, structured) - "pubmed", # PubMed/NIH (biomedical, highly curated) - "europepmc", # Europe PMC (biomedical + broader coverage) - "crossref", # Crossref API (broad academic coverage) - "openalex", # OpenAlex (open metadata) - "s2", # Semantic Scholar (ML-enhanced metadata) - "orcid", # ORCID works (author-verified) - "openreview", # OpenReview (peer review platforms) - "arxiv", # arXiv (preprints, self-reported) + "csl", # DOI → CSL-JSON (highest trust, structured metadata) + "doi_bibtex", # DOI → BibTeX (direct from DOI resolver) + "datacite", # DataCite DOIs (datasets/software, structured) + "pubmed", # PubMed/NIH (biomedical, highly curated) + "europepmc", # Europe PMC (biomedical + broader coverage) + "crossref", # Crossref API (broad academic coverage) + "openalex", # OpenAlex (open metadata) + "s2", # Semantic Scholar (ML-enhanced metadata) + "orcid", # ORCID works (author-verified) + "openreview", # OpenReview (peer review platforms) + "arxiv", # arXiv (preprints, self-reported) "scholar_page", # Scholar article page (web-scraped) "scholar_min", # Scholar baseline (lowest trust, minimal data) ] @@ -83,21 +85,21 @@ def _current_year() -> int: SIM_TITLE_WEIGHT = 0.7 SIM_AUTHOR_BONUS = 0.2 SIM_YEAR_BONUS = 0.2 -SIM_YEAR_MATCH_WINDOW = 1.0 # max year difference that counts as a match +SIM_YEAR_MATCH_WINDOW = 1.0 # max year difference that counts as a match # Similarity thresholds -SIM_TITLE_SIM_MIN = 0.8 # min title sim to consider a candidate -SIM_EXACT_PICK_THRESHOLD = 0.9 # auto-accept single strong candidate -SIM_BEST_ITEM_THRESHOLD = 0.8 # min score for best-of-N selection -SIM_SCHOLAR_FUZZY_ACCEPT = 0.9 # min sim for noisy Scholar data +SIM_TITLE_SIM_MIN = 0.8 # min title sim to consider a candidate +SIM_EXACT_PICK_THRESHOLD = 0.9 # auto-accept single strong candidate +SIM_BEST_ITEM_THRESHOLD = 0.8 # min score for best-of-N selection +SIM_SCHOLAR_FUZZY_ACCEPT = 0.9 # min sim for noisy Scholar data SIM_MERGE_DUPLICATE_THRESHOLD = 0.95 # threshold for merge-level dedup # DOI regex pattern -_DOI_REGEX = r'\b(10\.\d{4,9}/[-._;()/:A-Za-z0-9]+)\b' +_DOI_REGEX = r"\b(10\.\d{4,9}/[-._;()/:A-Za-z0-9]+)\b" # arXiv DOI patterns -ARXIV_DOI_CHECK_PATTERN = r'10\.48550/arxiv' -ARXIV_DOI_EXTRACT_PATTERN = r'(?i)10\.48550/arxiv\.([0-9]{4}\.[0-9]{4,5})' +ARXIV_DOI_CHECK_PATTERN = r"10\.48550/arxiv" +ARXIV_DOI_EXTRACT_PATTERN = r"(?i)10\.48550/arxiv\.([0-9]{4}\.[0-9]{4,5})" # HTTP timeouts (seconds) HTTP_TIMEOUT_FAST = 5.0 @@ -109,6 +111,18 @@ def _current_year() -> int: HTTP_MAX_RETRIES = 2 HTTP_RETRY_STATUS_CODES = (408, 429, 500, 502, 503, 504) +# Query-string parameter names whose values must be redacted before any URL or +# exception text is logged, preventing API-key leakage into committed run logs. +# Longest/most-specific names first so alternation prefers them. +REDACT_QUERY_PARAM_NAMES: tuple[str, ...] = ( + "access_token", + "api_key", + "apikey", + "api-key", + "token", + "key", +) + # BibTeX generation BIBTEX_KEY_MAX_WORDS = 4 BIBTEX_FILENAME_MAX_LENGTH = 60 @@ -130,75 +144,99 @@ def _current_year() -> int: SIM_FILE_DUPLICATE_THRESHOLD = 0.95 # Preprint detection -PREPRINT_SERVERS = frozenset({ - 'arxiv', 'biorxiv', 'medrxiv', 'chemrxiv', 'research square', - 'ssrn', 'social science research network', - 'preprints', 'psyarxiv', 'socarxiv', 'edarxiv', - 'arxiv e-prints', 'e-prints', 'authorea', 'techrxiv', - 'preprints.org', 'preprint server', - 'zenodo', 'agrirxiv', 'qeios', -}) +PREPRINT_SERVERS = frozenset( + { + "arxiv", + "biorxiv", + "medrxiv", + "chemrxiv", + "research square", + "ssrn", + "social science research network", + "preprints", + "psyarxiv", + "socarxiv", + "edarxiv", + "arxiv e-prints", + "e-prints", + "authorea", + "techrxiv", + "preprints.org", + "preprint server", + "zenodo", + "agrirxiv", + "qeios", + } +) PREPRINT_DOI_PREFIXES = ( - '10.48550/arxiv', # arXiv - '10.21203/rs.', # Research Square - '10.31234/osf.io', # PsyArXiv / SocArXiv / EdArXiv (OSF Preprints) - '10.31219/osf.io', # OSF Preprints (generic OSF DOI prefix) - '10.1101/', # bioRxiv / medRxiv (all manuscript IDs) - '10.26434/chemrxiv', # ChemRxiv - '10.20944/preprints', # Preprints.org - '10.2139/ssrn', # SSRN - '10.64898/', # openRxiv - '10.36227/techrxiv', # TechRxiv (IEEE preprints) - '10.33774/', # Cambridge UP preprints (Authoria/MIIR) + "10.48550/arxiv", # arXiv + "10.21203/rs.", # Research Square + "10.31234/osf.io", # PsyArXiv / SocArXiv / EdArXiv (OSF Preprints) + "10.31219/osf.io", # OSF Preprints (generic OSF DOI prefix) + "10.1101/", # bioRxiv / medRxiv (all manuscript IDs) + "10.26434/chemrxiv", # ChemRxiv + "10.20944/preprints", # Preprints.org + "10.2139/ssrn", # SSRN + "10.64898/", # openRxiv + "10.36227/techrxiv", # TechRxiv (IEEE preprints) + "10.33774/", # Cambridge UP preprints (Authoria/MIIR) ) # Publishers exclusively associated with preprint servers. # Used to strip leaked preprint publishers from published journal entries. -PREPRINT_ONLY_PUBLISHERS = frozenset({ - 'openrxiv', - 'cold spring harbor laboratory', # bioRxiv / medRxiv - 'research square', - 'authorea, inc.', - 'techrxiv', -}) +PREPRINT_ONLY_PUBLISHERS = frozenset( + { + "openrxiv", + "cold spring harbor laboratory", # bioRxiv / medRxiv + "research square", + "authorea, inc.", + "techrxiv", + } +) # Journal names that are actually conferences (Crossref registers them as journals). # Used by merge_utils to reclassify @article→@inproceedings. -CONFERENCE_AS_JOURNAL: frozenset[str] = frozenset({ - "software engineering", # German SE conference (Fachtagung Softwaretechnik) - "ijcnlp-aacl", # Int'l Joint Conf on NLP / Asia-Pacific ACL - "canada human-computer communications society", # Graphics Interface publisher -}) +CONFERENCE_AS_JOURNAL: frozenset[str] = frozenset( + { + "software engineering", # German SE conference (Fachtagung Softwaretechnik) + "ijcnlp-aacl", # Int'l Joint Conf on NLP / Asia-Pacific ACL + "canada human-computer communications society", # Graphics Interface publisher + } +) # Strings in journal/booktitle that indicate repositories/portals, not real venues. # @article/@inproceedings with these → @misc. -REPOSITORY_AS_JOURNAL: frozenset[str] = frozenset({ - "tu/e research portal", - "escholarship", - "california digital library", - "eyls", - "dspace", - "zenodo", - "cern european organization", - "figshare", - "underline science", - "research portal", - "osti", -}) +REPOSITORY_AS_JOURNAL: frozenset[str] = frozenset( + { + "tu/e research portal", + "escholarship", + "california digital library", + "eyls", + "dspace", + "zenodo", + "cern european organization", + "figshare", + "underline science", + "research portal", + "osti", + } +) # Institutional repositories → entries should be @phdthesis (if thesis) or @misc -INSTITUTIONAL_REPOSITORIES: frozenset[str] = frozenset({ - "deep blue", - "uwspace", - "prism", - "mspace", - "tspace", -}) +INSTITUTIONAL_REPOSITORIES: frozenset[str] = frozenset( + { + "deep blue", + "uwspace", + "prism", + "mspace", + "tspace", + } +) # Data repository DOI prefixes (deprioritized in DOI selection) DATA_DOI_PREFIXES = ( - '10.6084/m9.figshare', # Figshare (data/supplementary) - '10.5281/zenodo', # Zenodo (data/software) + "10.6084/m9.figshare", # Figshare (data/supplementary) + "10.5281/zenodo", # Zenodo (data/software) ) # Relaxed title similarity for preprint/published pairs @@ -206,39 +244,45 @@ def _current_year() -> int: # Journals whose names contain "Proceedings" but are NOT conference proceedings. # These override _is_conference_journal() to stay as @article. -JOURNALS_NAMED_PROCEEDINGS: frozenset[str] = frozenset({ - "proceedings of the national academy of sciences", - "proceedings of the vldb endowment", - "proceedings of the ieee", - "proceedings of the royal society", -}) +JOURNALS_NAMED_PROCEEDINGS: frozenset[str] = frozenset( + { + "proceedings of the national academy of sciences", + "proceedings of the vldb endowment", + "proceedings of the ieee", + "proceedings of the royal society", + } +) # Procedia/IFAC series: published as journal volumes but are conference proceedings. # @article with these as journal → @inproceedings (journal → booktitle). -PROCEEDINGS_SERIES_AS_JOURNAL: frozenset[str] = frozenset({ - "procedia cirp", - "procedia computer science", - "procedia manufacturing", - "procedia engineering", - "ifac-papersonline", - "ifac papersonline", - "frontiers in artificial intelligence and applications", -}) +PROCEEDINGS_SERIES_AS_JOURNAL: frozenset[str] = frozenset( + { + "procedia cirp", + "procedia computer science", + "procedia manufacturing", + "procedia engineering", + "ifac-papersonline", + "ifac papersonline", + "frontiers in artificial intelligence and applications", + } +) # ACM PACM journals: named "Proceedings of the ACM" but are real journals. # @inproceedings with these as booktitle → @article (booktitle → journal). -ACM_JOURNAL_PROCEEDINGS: frozenset[str] = frozenset({ - "proceedings of the acm on human-computer interaction", - "proceedings of the acm on networking", - "proceedings of the acm on software engineering", - "proceedings of the acm on programming languages", - "proceedings of the acm on interactive, mobile, wearable and ubiquitous technologies", - "proceedings of the acm on management of data", - "pacm on human-computer interaction", - "pacm on networking", - "pacm on software engineering", - "pacm hci", -}) +ACM_JOURNAL_PROCEEDINGS: frozenset[str] = frozenset( + { + "proceedings of the acm on human-computer interaction", + "proceedings of the acm on networking", + "proceedings of the acm on software engineering", + "proceedings of the acm on programming languages", + "proceedings of the acm on interactive, mobile, wearable and ubiquitous technologies", + "proceedings of the acm on management of data", + "pacm on human-computer interaction", + "pacm on networking", + "pacm on software engineering", + "pacm hci", + } +) # Publisher corrections: {journal_lower_substring: correct_publisher} PUBLISHER_CORRECTIONS: dict[str, str] = { @@ -265,17 +309,25 @@ def _current_year() -> int: } # Conference venues that lack standard keywords (proceedings, conference, etc.) -KNOWN_CONFERENCE_VENUES = frozenset({ - "neural information processing systems", - "advances in neural information processing systems", - "graphics interface", -}) +KNOWN_CONFERENCE_VENUES = frozenset( + { + "neural information processing systems", + "advances in neural information processing systems", + "graphics interface", + } +) # Keywords in venue strings that indicate conference proceedings (shared by # bibtex_build.determine_entry_type and publication_parser pattern matching). CONFERENCE_KEYWORDS: tuple[str, ...] = ( - "proceedings", "conference", "symposium", "workshop", - "meeting", "summit", "congress", "colloquium", + "proceedings", + "conference", + "symposium", + "workshop", + "meeting", + "summit", + "congress", + "colloquium", "chapter of the association", # NAACL, EACL, AACL, etc. "findings of", # ACL/EMNLP workshop findings "lecture notes in computer science", # LNCS is a conference proceedings series @@ -325,7 +377,6 @@ def _current_year() -> int: "aimc": "AI Music Creativity Conference", "wnut": "Workshop on Noisy User-generated Text", "nlp4musa": "NLP for Music and Audio Workshop", - "collas": "Conference on Lifelong Learning Agents", "ahfe international": "Applied Human Factors and Ergonomics International", "bcss@persuasive": "Behavior Change Support Systems Workshop", @@ -343,19 +394,21 @@ def _current_year() -> int: MIN_TITLE_WORDS = 2 # Generic series names replaced with actual conference name during merge -GENERIC_SERIES_NAMES = frozenset({ - "lecture notes in computer science", - "lecture notes in artificial intelligence", - "lecture notes in business information processing", - "lecture notes in networks and systems", - "communications in computer and information science", - "advances in intelligent systems and computing", - "studies in health technology and informatics", - "leibniz international proceedings in informatics", - "lipics: leibniz international proceedings in informatics", - "dagstuhl seminar proceedings", - "oasics: open access series in informatics", -}) +GENERIC_SERIES_NAMES = frozenset( + { + "lecture notes in computer science", + "lecture notes in artificial intelligence", + "lecture notes in business information processing", + "lecture notes in networks and systems", + "communications in computer and information science", + "advances in intelligent systems and computing", + "studies in health technology and informatics", + "leibniz international proceedings in informatics", + "lipics: leibniz international proceedings in informatics", + "dagstuhl seminar proceedings", + "oasics: open access series in informatics", + } +) # Booktitle prefixes that indicate a journal, not a conference (e.g., Frontiers) JOURNAL_ONLY_PREFIXES = ( @@ -368,7 +421,7 @@ def _current_year() -> int: ) # Author name suffixes to strip when extracting last names -AUTHOR_NAME_SUFFIXES = frozenset({'jr', 'sr', 'ii', 'iii', 'iv', 'v'}) +AUTHOR_NAME_SUFFIXES = frozenset({"jr", "sr", "ii", "iii", "iv", "v"}) # Fused compound words: hyphens stripped by Google Scholar. # Maps lowercased fused form → correctly hyphenated replacement. @@ -377,13 +430,43 @@ def _current_year() -> int: # The suffix approach matches words like "Knowledgedriven" → "Knowledge-Driven" # when the prefix has ≥3 characters starting with an uppercase letter. COMPOUND_SUFFIXES: tuple[str, ...] = ( - "based", "driven", "aware", "oriented", "informed", "powered", "defined", - "assisted", "enriched", "preserved", "focused", "engaged", "organized", - "grained", "specific", "dependent", "efficient", "adaptive", "cooperative", - "free", "level", "dimensional", "sensitive", "agnostic", - "centric", "intensive", "delivered", - "enhanced", "enhancing", "induced", "enabled", "augmented", "conditioned", - "embedded", "preserving", "centered", "aided", + "based", + "driven", + "aware", + "oriented", + "informed", + "powered", + "defined", + "assisted", + "enriched", + "preserved", + "focused", + "engaged", + "organized", + "grained", + "specific", + "dependent", + "efficient", + "adaptive", + "cooperative", + "free", + "level", + "dimensional", + "sensitive", + "agnostic", + "centric", + "intensive", + "delivered", + "enhanced", + "enhancing", + "induced", + "enabled", + "augmented", + "conditioned", + "embedded", + "preserving", + "centered", + "aided", ) # Dictionary of fused compound words for cases NOT caught by suffix-based detection: @@ -671,7 +754,6 @@ def _current_year() -> int: "digitaltwinenabled": "Digital-Twin-Enabled", "spaceairmarine": "Space-Air-Marine", "aerialmarine": "Aerial-Marine", - "state-of-theart": "State-of-the-Art", "out-ofview": "Out-of-View", "out-ofdomain": "Out-of-Domain", @@ -684,7 +766,6 @@ def _current_year() -> int: "modelintheloop": "Model-in-the-Loop", "learntorecommend": "Learn-to-Recommend", "delaytrajectoryaccuracy": "Delay-Trajectory-Accuracy", - "iotenabled": "IoT-Enabled", "aienabled": "AI-Enabled", "aiassisted": "AI-Assisted", @@ -699,7 +780,6 @@ def _current_year() -> int: "krakenlike": "KRAKEN-Like", "smemfinding": "SMEM-Finding", "enigmaataxia": "ENIGMA-Ataxia", - "whitebox": "White-Box", "communityacquired": "Community-Acquired", "allcause": "All-Cause", @@ -715,7 +795,6 @@ def _current_year() -> int: "metaaugmentation": "Meta-Augmentation", "metadimensionality": "Meta-Dimensionality", "minimumlength": "Minimum-Length", - "burrowswheeler": "Burrows-Wheeler", "populationscale": "Population-Scale", "visionlanguage": "Vision-Language", @@ -732,11 +811,9 @@ def _current_year() -> int: "scalesecond": "Scale-Second", "zerotargetassumption": "Zero-Target-Assumption", "multipsych": "MULTI-PSYCH", - "model-in-theloop": "Model-in-the-Loop", "learn-torecommend": "Learn-to-Recommend", "diffuse-anddenoise": "Diffuse-and-Denoise", - "sdiot": "SD-IoT", "gaoptimized": "GA-Optimized", "gptwritingprompts": "GPT-WritingPrompts", @@ -746,15 +823,11 @@ def _current_year() -> int: "tsdetector": "TS-Detector", "oodprobe": "OOD-Probe", "veremiextension": "VeReMi-Extension", - "emotionsemantic": "Emotion-Semantic", "resumejob": "Resume-Job", - "eventdata": "Event Data", - "postprocessing": "Post-Processing", "wellbeing": "Well-Being", - "climatesmart": "Climate-Smart", "convergencerate": "Convergence-Rate", "earlywarning": "Early-Warning", @@ -782,42 +855,38 @@ def _current_year() -> int: "treechild": "Tree-Child", "variancegated": "Variance-Gated", "weightloss": "Weight-Loss", - "wolffacial": "Wolf Facial", "eulertour": "Euler-Tour", "glyphfield": "Glyph-Field", - "recognitionthe": "recognition: The", "methanethe": "Methane: The", "frequencylow": "Frequency/Low", "spacetime": "Space-Time", "elearning": "E-Learning", "eprescription": "e-Prescription", - "runlength": "Run-Length", "incontext": "In-Context", - "sexdifferentiated": "Sex-Differentiated", "sizefractionated": "Size-Fractionated", "frontohippocampal": "Fronto-Hippocampal", "tradeoff": "Trade-Off", - "nbody": "N-Body", - "ofthe": "of the", } # Multi-signal dedup thresholds -SIM_DEDUP_COMPOSITE_THRESHOLD = 0.60 # composite score to treat as same paper -SIM_DEDUP_MULTI_SIGNAL_MIN = 0.35 # floor below which no signals trigger a match +SIM_DEDUP_COMPOSITE_THRESHOLD = 0.60 # composite score to treat as same paper +SIM_DEDUP_MULTI_SIGNAL_MIN = 0.35 # floor below which no signals trigger a match # Internal BibTeX fields for dedup, stripped before final output -DEDUP_INTERNAL_FIELDS = frozenset({ - "x_scholar_cluster_id", - "x_scholar_citation_id", - "x_s2_paper_id", - "x_openalex_id", -}) +DEDUP_INTERNAL_FIELDS = frozenset( + { + "x_scholar_cluster_id", + "x_scholar_citation_id", + "x_s2_paper_id", + "x_openalex_id", + } +) # Scoring tolerance for floating-point precision SIM_THRESHOLD_TOLERANCE = 0.01 @@ -834,19 +903,19 @@ def _current_year() -> int: # Per-API rate limits: (tokens_per_second, burst_size) RATE_LIMITS: dict[str, tuple[float, int]] = { - "arxiv": (0.33, 1), # arXiv asks for <=3 req/s; we use ~1 per 3s - "pubmed": (0.33, 1), # NCBI rate limit (no API key): 3 req/s - "europepmc": (0.5, 2), # Europe PMC is lenient - "crossref": (1.0, 3), # Crossref polite pool (with mailto) is generous - "openalex": (1.0, 3), # OpenAlex is generous - "s2": (1.0, 3), # S2 with API key - "doi": (1.0, 2), # DOI resolver - "gemini": (0.5, 2), # Gemini rate limit (burst=2 for retry headroom) - "orcid": (1.0, 2), # ORCID public API - "datacite": (1.0, 2), # DataCite API - "dblp": (1.0, 2), # DBLP search/person API - "serply": (1.0, 2), # Serply REST API (conservative: 1 req/s, burst 2) - "serpapi": (1.0, 2), # SerpAPI (conservative: 1 req/s, burst 2) + "arxiv": (0.33, 1), # arXiv asks for <=3 req/s; we use ~1 per 3s + "pubmed": (0.33, 1), # NCBI rate limit (no API key): 3 req/s + "europepmc": (0.5, 2), # Europe PMC is lenient + "crossref": (1.0, 3), # Crossref polite pool (with mailto) is generous + "openalex": (1.0, 3), # OpenAlex is generous + "s2": (1.0, 3), # S2 with API key + "doi": (1.0, 2), # DOI resolver + "gemini": (0.5, 2), # Gemini rate limit (burst=2 for retry headroom) + "orcid": (1.0, 2), # ORCID public API + "datacite": (1.0, 2), # DataCite API + "dblp": (1.0, 2), # DBLP search/person API + "serply": (1.0, 2), # Serply REST API (conservative: 1 req/s, burst 2) + "serpapi": (1.0, 2), # SerpAPI (conservative: 1 req/s, burst 2) } # Global concurrency: max simultaneous in-flight API requests @@ -864,5 +933,5 @@ def _current_year() -> int: OPENREVIEW_SESSION_TTL_SECS = 3600 # SerpAPI publication string parsing thresholds -PUB_PARSE_TIER1_MIN_CONFIDENCE = 0.5 # Minimum confidence for venue-based API search -PUB_PARSE_TIER2_MIN_CONFIDENCE = 0.7 # Minimum confidence for direct field population +PUB_PARSE_TIER1_MIN_CONFIDENCE = 0.5 # Minimum confidence for venue-based API search +PUB_PARSE_TIER2_MIN_CONFIDENCE = 0.7 # Minimum confidence for direct field population diff --git a/src/http_utils.py b/src/http_utils.py index ca4fdbae..ffe7dd7a 100644 --- a/src/http_utils.py +++ b/src/http_utils.py @@ -3,6 +3,7 @@ import json import logging import random +import re import socket import threading import time @@ -24,21 +25,36 @@ HTTP_RETRY_STATUS_CODES, HTTP_TIMEOUT_FAST, RATE_LIMITS, + REDACT_QUERY_PARAM_NAMES, SESSION_ROTATION_THRESHOLD, ) from .exceptions import ALL_API_ERRORS, DECODE_ERRORS, NUMERIC_ERRORS -T = TypeVar('T') +T = TypeVar("T") # Safety net: cap all socket operations at 60s to prevent indefinite hangs # from DNS resolution, SSL handshake, or connection pool waits socket.setdefaulttimeout(60.0) # Standard HTTP headers for API requests -DEFAULT_JSON_HEADERS = { - "User-Agent": "Mozilla/5.0 (CiteForge Client)", - "Accept": "application/json" -} +DEFAULT_JSON_HEADERS = {"User-Agent": "Mozilla/5.0 (CiteForge Client)", "Accept": "application/json"} + +# Redact secret query-string values (API keys/tokens) before any URL or +# exception text reaches a log record or exception message. Built from the +# config-defined parameter names so the policy stays centralized. +_SECRET_QS_RE = re.compile( + r"(?i)([?&](?:" + "|".join(re.escape(n) for n in REDACT_QUERY_PARAM_NAMES) + r")=)[^&#\s'\"\\)]+" +) + + +def _scrub_secrets(text: str) -> str: + """Return *text* with secret query-string values replaced by ``REDACTED``. + + Applied to URLs and exception strings before logging so credentials passed + as query parameters (e.g. ``?key=...``, ``&api_key=...``) never reach the + committed run logs. + """ + return _SECRET_QS_RE.sub(r"\1REDACTED", text) def _generate_user_agent_pool() -> list[str]: @@ -58,8 +74,7 @@ def _generate_user_agent_pool() -> list[str]: ] agents: list[str] = [ - f"Mozilla/5.0 ({platform}) AppleWebKit/537.36 " - f"(KHTML, like Gecko) Chrome/{cv} Safari/537.36" + f"Mozilla/5.0 ({platform}) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/{cv} Safari/537.36" for platform in chrome_platforms for cv in chrome_versions ] @@ -115,6 +130,7 @@ def _randomize_headers(headers: dict[str, str]) -> dict[str, str]: h["Accept-Language"] = random.choice(_ACCEPT_LANGUAGE_POOL) return h + _API_CALL_COUNTS: dict[str, int] = {} _CALL_COUNT_LOCK = threading.Lock() @@ -264,17 +280,18 @@ def handle_api_errors(default_return: Any = None) -> Callable[[Callable[..., T]] """ Decorator to handle API errors consistently across all API client functions, returning a default value on error. """ + def decorator(func: Callable[..., T]) -> Callable[..., T]: @wraps(func) def wrapper(*args: Any, **kwargs: Any) -> Any: try: return func(*args, **kwargs) except ALL_API_ERRORS as e: - logging.getLogger("CiteForge.http").debug( - "API error in %s: %s", func.__qualname__, e - ) + logging.getLogger("CiteForge.http").debug("API error in %s: %s", func.__qualname__, e) return default_return + return wrapper + return decorator @@ -301,11 +318,11 @@ def _parse_retry_after(ra: str | None) -> float: def _http_request( - method: str, - url: str, - headers: dict[str, str], - timeout: float, - json_payload: dict[str, Any] | None = None, + method: str, + url: str, + headers: dict[str, str], + timeout: float, + json_payload: dict[str, Any] | None = None, ) -> bytes: """Execute an HTTP request with the full CiteForge infrastructure. @@ -342,12 +359,15 @@ def _http_request( if method == "POST": resp = session.post( - url, json=json_payload, headers=headers, + url, + json=json_payload, + headers=headers, timeout=(connect_timeout, timeout), ) else: resp = session.get( - url, headers=headers, + url, + headers=headers, timeout=(connect_timeout, timeout), ) except requests.exceptions.RequestException: @@ -356,7 +376,7 @@ def _http_request( else: if resp.status_code in (429, 503) and attempt < _MAX_RATE_LIMIT_RETRIES - 1: retry_after = _parse_retry_after(resp.headers.get("Retry-After")) - rate_wait = retry_after if retry_after > 0 else (2 ** attempt) + random.uniform(0, 1) + rate_wait = retry_after if retry_after > 0 else (2**attempt) + random.uniform(0, 1) rate_limited = True else: resp.raise_for_status() @@ -366,16 +386,16 @@ def _http_request( if rate_limited: time.sleep(min(rate_wait, HTTP_BACKOFF_MAX)) else: - time.sleep((2 ** attempt) + random.uniform(0, 1)) + time.sleep((2**attempt) + random.uniform(0, 1)) # Unreachable -- the loop always returns or raises -- but satisfies mypy. raise requests.exceptions.RequestException(f"Failed to {method} {url}") def http_fetch_bytes( - url: str, - headers: dict[str, str], - timeout: float, + url: str, + headers: dict[str, str], + timeout: float, ) -> bytes: """Perform an HTTP GET and return the raw response body. @@ -396,7 +416,8 @@ def _decode_json_bytes(raw: bytes, url: str) -> dict[str, Any]: except json.JSONDecodeError as ex: # include a preview for debugging preview = raw[:256].decode("utf-8", errors="replace") - raise ValueError(f"Invalid JSON from {url!r}: {ex.msg} at pos {ex.pos}; preview={preview!r}") from ex + safe_url = _scrub_secrets(url) + raise ValueError(f"Invalid JSON from {safe_url!r}: {ex.msg} at pos {ex.pos}; preview={preview!r}") from ex def http_get_json(url: str, timeout: float = HTTP_TIMEOUT_FAST) -> dict[str, Any]: diff --git a/tests/test_http_utils.py b/tests/test_http_utils.py new file mode 100644 index 00000000..77fa7de6 --- /dev/null +++ b/tests/test_http_utils.py @@ -0,0 +1,46 @@ +from __future__ import annotations + +import pytest + +from src.http_utils import _decode_json_bytes, _scrub_secrets + + +class TestSecretRedaction: + """API keys/tokens passed as query params must never reach logs or exception text (defect C2). + + Gemini uses ``?key=`` and SerpAPI uses ``&api_key=``; those URLs previously + leaked into WARN logs (committed to a public branch) via exception messages. + """ + + @pytest.mark.parametrize( + ("raw", "secret"), + [ + ("https://generativelanguage.googleapis.com/v1beta?key=AIzaSECRET", "AIzaSECRET"), + ("https://serpapi.com/search?engine=google_scholar_author&api_key=abc123SECRET", "abc123SECRET"), + ("429 Client Error for url: https://x/y?token=tok_SECRET&q=1", "tok_SECRET"), + ("https://x?apikey=SECRET", "SECRET"), + ("https://x?access_token=SECRET", "SECRET"), + ], + ) + def test_scrub_removes_secret(self, raw: str, secret: str) -> None: + scrubbed = _scrub_secrets(raw) + assert secret not in scrubbed + assert "REDACTED" in scrubbed + + def test_scrub_preserves_nonsecret_params(self) -> None: + url = "https://api.crossref.org/works?query=deep+learning&rows=5&mailto=a@b.com" + assert _scrub_secrets(url) == url + + def test_scrub_redacts_value_not_param_name_and_keeps_siblings(self) -> None: + assert _scrub_secrets("https://x?api_key=SECRET&keep=1") == "https://x?api_key=REDACTED&keep=1" + + def test_decode_json_error_redacts_url_but_still_raises(self) -> None: + url = "https://generativelanguage.googleapis.com/v1beta?key=AIzaSECRETKEY" + with pytest.raises(ValueError) as excinfo: + _decode_json_bytes(b"not json", url) + message = str(excinfo.value) + assert "AIzaSECRETKEY" not in message + assert "REDACTED" in message + + def test_decode_json_valid_passthrough(self) -> None: + assert _decode_json_bytes(b'{"a": 1}', "https://x?key=S") == {"a": 1} From b7777b451e0a507e073d1268bcedf79e13f46ba9 Mon Sep 17 00:00:00 2001 From: Gabriel Spadon Date: Wed, 1 Jul 2026 13:32:20 -0300 Subject: [PATCH 08/54] fix: contain decode ValueError in datacite/orcid fetch A malformed 200-response body makes _decode_json_bytes raise ValueError, which the inner NETWORK_ERRORS catch and the ALL_API_ERRORS decorator both miss (neither includes ValueError), crashing the run. Broaden the inner catch to ALL_FETCH_ERRORS (adds DECODE+PARSE) at datacite_search_doi and orcid_fetch_works. Frozen error tuples unchanged (seam C2). --- src/clients/utility_apis.py | 6 +- tests/test_regression.py | 489 +++++++++++++++++++++++------------- 2 files changed, 323 insertions(+), 172 deletions(-) diff --git a/src/clients/utility_apis.py b/src/clients/utility_apis.py index 682ad638..49a1f752 100644 --- a/src/clients/utility_apis.py +++ b/src/clients/utility_apis.py @@ -8,7 +8,7 @@ from ..cache import response_cache from ..config import CACHE_TTL_DOI_DAYS, CACHE_TTL_SEARCH_DAYS, DATACITE_BASE, GEMINI_BASE, ORCID_BASE -from ..exceptions import ALL_API_ERRORS, NETWORK_ERRORS +from ..exceptions import ALL_API_ERRORS, ALL_FETCH_ERRORS from ..http_utils import _scrub_secrets, handle_api_errors, http_get_json, http_post_json from ..id_utils import _norm_doi from ..log_utils import LogCategory, LogSource, logger @@ -159,7 +159,7 @@ def datacite_search_doi(doi: str) -> dict[str, Any] | None: try: data = http_get_json(url, timeout=15.0) - except NETWORK_ERRORS: + except ALL_FETCH_ERRORS: return None result = data.get("data") @@ -256,7 +256,7 @@ def orcid_fetch_works(orcid_id: str) -> list[dict[str, Any]]: try: data = http_get_json(url, timeout=15.0) - except NETWORK_ERRORS: + except ALL_FETCH_ERRORS: return [] works = [] diff --git a/tests/test_regression.py b/tests/test_regression.py index 65d32755..0f92604c 100644 --- a/tests/test_regression.py +++ b/tests/test_regression.py @@ -49,6 +49,7 @@ class TestBibtexParserInnerQuotes: """Test that parse_bibtex_to_dict handles quotes inside braces and outer quotes.""" + def test_quotes_inside_braces(self) -> None: """Quotes within braces should be preserved as literal characters.""" bibtex = '@article{key1,\n title = {AI "systems" review},\n year = {2024}\n}\n' @@ -65,7 +66,7 @@ def test_simple_outer_quotes(self) -> None: def test_nested_braces_preserved(self) -> None: """Nested braces inside a field value should be handled correctly.""" - bibtex = '@article{key3,\n title = {An {LSTM} Approach},\n year = {2024}\n}\n' + bibtex = "@article{key3,\n title = {An {LSTM} Approach},\n year = {2024}\n}\n" result = bt.parse_bibtex_to_dict(bibtex) assert result is not None assert "LSTM" in result["fields"]["title"] @@ -73,6 +74,7 @@ def test_nested_braces_preserved(self) -> None: class TestTildeInUrls: """Test that bibtex_from_dict preserves tildes in URLs but converts standalone tildes.""" + def test_tilde_in_url_preserved(self) -> None: """A tilde in a URL (preceded by /) should be kept as-is.""" entry: dict[str, Any] = { @@ -105,6 +107,7 @@ def test_standalone_tilde_converted(self) -> None: class TestNormalizeTitleWithLatex: """Test that normalize_title handles various LaTeX constructs.""" + def test_frac_becomes_fraction(self) -> None: r"""\\frac{1}{2} should normalize to contain '1/2'.""" result = text_utils.normalize_title(r"\frac{1}{2}") @@ -129,6 +132,7 @@ class TestSanitizeTitleRepeatedSubtitle: _sanitize_title is a nested function inside bibtex_from_dict, so we test it indirectly by round-tripping through bibtex_from_dict. """ + def test_short_repeated_segment_kept(self) -> None: """A short repeated subtitle segment (e.g., 'B') should NOT be truncated.""" entry: dict[str, Any] = { @@ -157,13 +161,12 @@ def test_long_repeated_segment_truncated(self) -> None: output = bt.bibtex_from_dict(entry) title_val = extract_bibtex_field(output, "title") assert title_val is not None - assert title_val.count(long_sub) == 1, ( - f"Long repeated segment should be de-duplicated, got: {title_val}" - ) + assert title_val.count(long_sub) == 1, f"Long repeated segment should be de-duplicated, got: {title_val}" class TestSearchApiGenericMultipleCache: """Test that search_api_generic_multiple uses cache for repeated queries.""" + def test_cache_hit_skips_http(self) -> None: """Second call with same args should return cached results without HTTP.""" config = APISearchConfig( @@ -198,9 +201,9 @@ def test_cache_hit_skips_http(self) -> None: assert mock_http.call_count == 1 mock_cache.get.return_value = { - "results": [{"title": "Machine Learning Fundamentals", - "authors": [{"name": "John Smith"}], - "year": 2024}], + "results": [ + {"title": "Machine Learning Fundamentals", "authors": [{"name": "John Smith"}], "year": 2024} + ], } result2 = search_api_generic_multiple( title="Machine Learning Fundamentals", @@ -214,6 +217,7 @@ def test_cache_hit_skips_http(self) -> None: class TestDoiValidationSkipsBibtexWhenCslMatches: """Test that validate_doi_candidate does not fetch BibTeX when CSL matches.""" + @patch("src.doi_utils.search_apis.fetch_bibtex_via_doi") @patch("src.doi_utils.search_apis.fetch_csl_via_doi") @patch("src.doi_utils.search_apis.bibtex_from_csl") @@ -257,6 +261,7 @@ def test_csl_match_skips_bibtex( class TestDeduplicatePublicationList: """Test _deduplicate_publication_list from src/clients/scholar.py.""" + def test_empty_list(self) -> None: """Empty input should return empty output.""" result = _deduplicate_publication_list([]) @@ -290,6 +295,7 @@ def test_different_titles_both_kept(self) -> None: class TestIsSecondaryDoi: """Fix 1: is_secondary_doi classifies preprint and data DOIs.""" + def test_arxiv_doi(self) -> None: assert id_utils.is_secondary_doi("10.48550/arxiv.2401.12345") @@ -321,7 +327,8 @@ def _merge_pages(pages: str) -> dict[str, Any]: "fields": {"title": "Test", "author": "Author", "year": "2023"}, } return merge_utils.merge_with_policy( - entry, [("crossref", {"fields": {"pages": pages}})], + entry, + [("crossref", {"fields": {"pages": pages}})], ) def test_sage_article_id_rejected(self) -> None: @@ -356,13 +363,15 @@ def _article(**extra_fields: str) -> dict[str, Any]: def test_amp_decoded_in_journal(self) -> None: merged = merge_utils.merge_with_policy( - self._article(journal="Computers & Education"), [], + self._article(journal="Computers & Education"), + [], ) assert merged["fields"]["journal"] == "Computers & Education" def test_lt_gt_decoded_in_title(self) -> None: merged = merge_utils.merge_with_policy( - self._article(title="A <b>Bold</b> Approach"), [], + self._article(title="A <b>Bold</b> Approach"), + [], ) assert "<" not in merged["fields"]["title"] assert ">" not in merged["fields"]["title"] @@ -370,6 +379,7 @@ def test_lt_gt_decoded_in_title(self) -> None: class TestTrimTitleArtifacts: """Fix 4: 'Check for updates' prefix stripped from titles.""" + def test_check_for_updates_stripped(self) -> None: result = text_utils.trim_title_default("Check for updates Real Title Here") assert result == "Real Title Here" @@ -390,6 +400,7 @@ def test_check_inside_title_unchanged(self) -> None: class TestMinTitleWords: """Fix 6: Single-word titles rejected as Scholar artifacts.""" + def test_single_word_below_minimum(self) -> None: """A single-word title has fewer words than MIN_TITLE_WORDS threshold.""" title = "Games" @@ -417,6 +428,7 @@ def test_normal_title_well_above_minimum(self) -> None: class TestArxivJournalConsistency: """Fix 7: Pure arXiv papers have journal removed (arXiv is a preprint server, not a journal).""" + def test_arxiv_eprint_no_journal_stays_empty(self) -> None: """An arXiv paper with eprint but no journal should NOT get a journal field.""" fields: dict[str, Any] = { @@ -460,6 +472,7 @@ def test_arxiv_journal_variant_removed(self) -> None: class TestStrongAuthorDedupGate: """Fix 8: Strong author overlap allows composite dedup scoring.""" + def test_same_authors_moderate_title_sim_matches(self) -> None: """Real Alhasani2025 duplicate: same authors, truncated title variant → should match.""" _title_a = ( @@ -491,14 +504,10 @@ def test_same_authors_moderate_title_sim_matches(self) -> None: }, } # Verify preconditions: high author overlap, moderate title sim - overlap = author_overlap_ratio( - entry_a["fields"]["author"], entry_b["fields"]["author"] - ) + overlap = author_overlap_ratio(entry_a["fields"]["author"], entry_b["fields"]["author"]) assert overlap >= 0.9, f"Expected high author overlap, got {overlap}" - sim = text_utils.title_similarity( - entry_a["fields"]["title"], entry_b["fields"]["title"] - ) + sim = text_utils.title_similarity(entry_a["fields"]["title"], entry_b["fields"]["title"]) assert 0.6 <= sim < 0.95, f"Expected moderate title sim (0.6-0.95), got {sim}" # Fix 8: the strict matcher should detect this as a duplicate @@ -531,6 +540,7 @@ def test_different_authors_not_matched(self) -> None: class TestGenericSeriesNameMerge: """Fix 5: LNCS and other generic series names should be replaced by specific conference names.""" + def test_lncs_replaced_by_conference_name(self) -> None: """When CSL provides LNCS and enricher provides real conference name, prefer conference.""" entry = { @@ -615,14 +625,17 @@ def test_incollection_with_generic_series_becomes_inproceedings(self) -> None: }, } enrichers = [ - ("crossref", { - "type": "incollection", - "fields": { - "booktitle": "Studies in Health Technology and Informatics", - "publisher": "IOS Press", - "doi": "10.3233/shti220385", + ( + "crossref", + { + "type": "incollection", + "fields": { + "booktitle": "Studies in Health Technology and Informatics", + "publisher": "IOS Press", + "doi": "10.3233/shti220385", + }, }, - }), + ), ] merged = merge_utils.merge_with_policy(entry, enrichers) assert merged["type"] == "inproceedings" @@ -654,14 +667,17 @@ def test_book_type_from_enricher_survives_venue_override(self) -> None: }, } enrichers = [ - ("csl", { - "type": "book", - "fields": { - "booktitle": "Lecture Notes in Computer Science", - "publisher": "Springer", - "doi": "10.1007/978-3-031-09342-5", + ( + "csl", + { + "type": "book", + "fields": { + "booktitle": "Lecture Notes in Computer Science", + "publisher": "Springer", + "doi": "10.1007/978-3-031-09342-5", + }, }, - }), + ), ] merged = merge_utils.merge_with_policy(entry, enrichers) assert merged["type"] == "book" @@ -669,6 +685,7 @@ def test_book_type_from_enricher_survives_venue_override(self) -> None: class TestSameSourceTypeOverride: """Merge must prefer the later type when CSL appears twice (arXiv DOI then published DOI).""" + def test_csl_inproceedings_overrides_csl_article(self) -> None: """Second CSL enricher (published DOI) should override first (arXiv DOI) type.""" entry = { @@ -682,30 +699,39 @@ def test_csl_inproceedings_overrides_csl_article(self) -> None: }, } enrichers = [ - ("csl", { - "type": "article", - "fields": { - "title": "BPMN to Smart Contract by Business Analyst", - "doi": "10.48550/ARXIV.2505.22612", - "url": "https://arxiv.org/abs/2505.22612", + ( + "csl", + { + "type": "article", + "fields": { + "title": "BPMN to Smart Contract by Business Analyst", + "doi": "10.48550/ARXIV.2505.22612", + "url": "https://arxiv.org/abs/2505.22612", + }, }, - }), - ("s2", { - "type": "inproceedings", - "fields": { - "booktitle": "International Computer Science Conference", - "doi": "10.1109/icsc65596.2025.11140498", + ), + ( + "s2", + { + "type": "inproceedings", + "fields": { + "booktitle": "International Computer Science Conference", + "doi": "10.1109/icsc65596.2025.11140498", + }, }, - }), - ("csl", { - "type": "inproceedings", - "fields": { - "booktitle": "2025 5th Intelligent Cybersecurity Conference (ICSC)", - "publisher": "IEEE", - "pages": "122-129", - "doi": "10.1109/icsc65596.2025.11140498", + ), + ( + "csl", + { + "type": "inproceedings", + "fields": { + "booktitle": "2025 5th Intelligent Cybersecurity Conference (ICSC)", + "publisher": "IEEE", + "pages": "122-129", + "doi": "10.1109/icsc65596.2025.11140498", + }, }, - }), + ), ] merged = merge_utils.merge_with_policy(entry, enrichers) assert merged["type"] == "inproceedings", ( @@ -728,14 +754,20 @@ def test_same_source_same_type_no_flip(self) -> None: }, } enrichers = [ - ("crossref", { - "type": "article", - "fields": {"journal": "Some Journal"}, - }), - ("crossref", { - "type": "article", - "fields": {"volume": "42"}, - }), + ( + "crossref", + { + "type": "article", + "fields": {"journal": "Some Journal"}, + }, + ), + ( + "crossref", + { + "type": "article", + "fields": {"volume": "42"}, + }, + ), ] merged = merge_utils.merge_with_policy(entry, enrichers) assert merged["type"] == "article" @@ -743,6 +775,7 @@ def test_same_source_same_type_no_flip(self) -> None: class TestAuthorNameMatches: """Tests for author_name_matches used to filter wrong-author entries.""" + def test_full_name_match(self) -> None: """Full name match: 'Raza Abidi' matches 'Syed Sibte Raza Abidi'.""" assert author_name_matches("Raza Abidi", "Author One and Syed Sibte Raza Abidi") @@ -773,6 +806,7 @@ def test_middle_initial_no_false_positive(self) -> None: class TestTitleLengthWhitespaceNormalization: """Title comparison normalizes whitespace so OCR artifacts don't get false length advantage.""" + def test_broken_title_replaced_by_correct(self) -> None: """'Un met' (Scholar artifact) should be replaced by 'Unmet' from a higher-trust source.""" entry = { @@ -785,11 +819,14 @@ def test_broken_title_replaced_by_correct(self) -> None: }, } enrichers = [ - ("crossref", { - "fields": { - "title": "A Topological Data Analysis of Unmet Health Care Needs Among Injured Patients", + ( + "crossref", + { + "fields": { + "title": "A Topological Data Analysis of Unmet Health Care Needs Among Injured Patients", + }, }, - }), + ), ] merged = merge_utils.merge_with_policy(entry, enrichers) assert "Un met" not in merged["fields"]["title"] @@ -816,6 +853,7 @@ def test_single_page_leading_zero(self) -> None: class TestFrontiersJournalDetection: """Frontiers in * booktitles should be moved to journal field.""" + def test_frontiers_booktitle_becomes_journal(self) -> None: entry: dict[str, Any] = { "type": "inproceedings", @@ -846,6 +884,7 @@ def test_non_frontiers_booktitle_unchanged(self) -> None: class TestHtmlEntityInSerializer: """HTML entities like & should be decoded in bibtex_from_dict output.""" + def test_amp_decoded_in_booktitle(self) -> None: entry = { "type": "inproceedings", @@ -881,6 +920,7 @@ def test_unknown_url_dropped(self) -> None: class TestTokenBucketRateLimiter: """Tests for the TokenBucketRateLimiter in http_utils.""" + def test_acquire_respects_rate(self) -> None: """Acquire should block when tokens are exhausted.""" limiter = TokenBucketRateLimiter(rate=100.0, burst=1) @@ -912,6 +952,7 @@ def test_unknown_namespace_returns_none(self) -> None: class TestDotNotationFieldExtraction: """Tests for _resolve_dotted in api_generics.py.""" + def test_simple_field(self) -> None: assert _resolve_dotted({"title": "My Paper"}, "title") == "My Paper" @@ -944,6 +985,7 @@ def test_str_variant_list(self) -> None: class TestDOINormalizationInDedup: """Tests that DOI comparisons in save_entry_to_file use normalization.""" + def test_doi_url_vs_bare_match(self, tmp_path: Any) -> None: """DOIs with and without URL prefix should match as duplicates.""" entry1 = { @@ -981,6 +1023,7 @@ def test_doi_url_vs_bare_match(self, tmp_path: Any) -> None: class TestHttpPostJson: """Tests for http_post_json going through the full HTTP infrastructure.""" + @patch("src.http_utils._http_request") def test_post_calls_http_request_with_post_method(self, mock_request: MagicMock) -> None: """http_post_json should delegate to _http_request with method='POST'.""" @@ -1033,6 +1076,7 @@ def _make_openreview_mock(cookie: str) -> MagicMock: class TestOpenReviewSessionExpiry: """Tests for OpenReview session TTL-based expiry.""" + def test_expired_session_triggers_relogin(self) -> None: """After TTL expires, openreview_login should re-authenticate.""" import src.clients.search_apis as sa @@ -1084,6 +1128,7 @@ def test_valid_session_reused(self) -> None: class TestBaselineThresholdConsistency: """Baseline file matching should use >= (not >) for threshold comparison.""" + def test_at_threshold_loads_existing_file(self) -> None: """Titles with similarity exactly at SIM_MERGE_DUPLICATE_THRESHOLD should match.""" title = "Exact Same Title For Testing" @@ -1101,6 +1146,7 @@ def test_slightly_below_threshold_does_not_match(self) -> None: class TestOrcidUsesHttpGetJson: """ORCID should go through http_get_json (shared HTTP infrastructure).""" + @patch("src.clients.utility_apis.http_get_json") def test_orcid_calls_http_get_json(self, mock_get: MagicMock) -> None: """orcid_fetch_works should use http_get_json, not urllib.""" @@ -1115,16 +1161,11 @@ def test_orcid_calls_http_get_json(self, mock_get: MagicMock) -> None: class TestGeminiUsesHttpPostJson: """Gemini should go through http_post_json (shared HTTP infrastructure).""" + @patch("src.clients.utility_apis.http_post_json") def test_gemini_calls_http_post_json(self, mock_post: MagicMock) -> None: """gemini_generate_short_title should use http_post_json, not urllib.""" - mock_post.return_value = { - "candidates": [{ - "content": { - "parts": [{"text": "MachineLearning"}] - } - }] - } + mock_post.return_value = {"candidates": [{"content": {"parts": [{"text": "MachineLearning"}]}}]} result = gemini_generate_short_title("Machine Learning Paper", "fake-key") assert result == "MachineLearning" mock_post.assert_called_once() @@ -1141,6 +1182,7 @@ def test_gemini_handles_value_error(self, mock_post: MagicMock) -> None: class TestHttpRequestPostDispatch: """Verify _http_request dispatches to the correct session method.""" + @staticmethod def _make_mock_session(method: str) -> MagicMock: """Build a mock session whose *method* returns a successful response.""" @@ -1178,6 +1220,7 @@ def test_get_calls_session_get(self) -> None: class TestRateLimiterEntries: """ORCID and DataCite should have rate limiter entries in config.""" + def test_orcid_rate_limiter_exists(self) -> None: """_get_rate_limiter should return a limiter for 'orcid' namespace.""" limiter = _get_rate_limiter("orcid") @@ -1220,6 +1263,7 @@ def test_session_valid_just_before_ttl(self) -> None: class TestAbbreviatedVenueExpansion: """Abbreviated venue names should be expanded to full conference names.""" + def test_determine_entry_type_recognizes_abbreviated_venue(self) -> None: """SPIRE in journal field should be detected as inproceedings.""" result = determine_entry_type({"journal": "SPIRE"}) @@ -1305,6 +1349,7 @@ def test_non_abbreviated_venue_unchanged(self) -> None: class TestBiorxivDoiPrefix: """L3: bioRxiv DOIs with any 10.1101/ prefix should be classified as preprint.""" + def test_biorxiv_old_numeric_doi(self) -> None: """Pre-2020 bioRxiv DOI (no date prefix) should be secondary.""" assert id_utils.is_secondary_doi("10.1101/123456") @@ -1324,6 +1369,7 @@ def test_non_biorxiv_doi(self) -> None: class TestDoiUrlDecoding: """L15: _norm_doi should URL-decode percent-encoded characters.""" + def test_percent_encoded_slash(self) -> None: """DOI with %2F should normalize to match plain slash version.""" d1 = id_utils.normalize_doi("10.1000/xyz%2Fabc") @@ -1338,6 +1384,7 @@ def test_double_encoded(self) -> None: class TestNobleParticleMatching: """B8/L8: Noble particles (van, von, de, etc.) should produce consistent signatures.""" + def test_van_der_waals_first_last(self) -> None: """'Johan van der Waals' in First Last format.""" sig = text_utils.name_signature("Johan van der Waals") @@ -1389,6 +1436,7 @@ def test_hyphenated_surname_comma_format(self) -> None: class TestEllipsisPlaceholder: """L5: Only short strings with ellipsis should be treated as placeholder.""" + def test_short_ellipsis_is_placeholder(self) -> None: """Short string with ellipsis should be a placeholder.""" assert text_utils.has_placeholder("Loading...") is True @@ -1396,8 +1444,7 @@ def test_short_ellipsis_is_placeholder(self) -> None: def test_long_title_with_ellipsis_not_placeholder(self) -> None: """A long legitimate title with '...' should NOT be a placeholder.""" long_title = ( - "A Comprehensive Survey of Machine Learning Methods..." - " and Their Applications to Real-World Problems" + "A Comprehensive Survey of Machine Learning Methods... and Their Applications to Real-World Problems" ) assert text_utils.has_placeholder(long_title) is False @@ -1408,6 +1455,7 @@ def test_unicode_ellipsis_short(self) -> None: class TestCJKTitleNormalization: """L7: CJK-only titles should not normalize to empty string.""" + def test_cjk_title_not_empty(self) -> None: """Chinese characters should not produce empty normalized title.""" result = text_utils.normalize_title("机器学习方法") @@ -1428,6 +1476,7 @@ def test_mixed_cjk_ascii(self) -> None: class TestHtmlEntityInNormalizeTitle: """D7: HTML entities should be decoded before title normalization.""" + def test_amp_decoded(self) -> None: """& should become & in normalized title.""" result = text_utils.normalize_title("Computers & Education") @@ -1448,6 +1497,7 @@ def test_numeric_entity(self) -> None: class TestAuthorOverlapWithInitials: """L9: author_overlap_ratio should distinguish authors with same last name but different initials.""" + def test_same_last_different_initials_distinguished(self) -> None: """'J. Smith' and 'K. Smith' should not be merged when both have initials.""" ratio = text_utils.author_overlap_ratio( @@ -1476,6 +1526,7 @@ def test_no_initials_falls_back(self) -> None: class TestVenueSimilarityPreprint: """L14: venue_similarity should correctly detect preprint servers even with hyphens.""" + def test_biorxiv_vs_journal(self) -> None: """bioRxiv vs a journal should give 0.5 (preprint/published pair).""" sim = text_utils.venue_similarity( @@ -1495,6 +1546,7 @@ def test_arxiv_eprints_vs_conference(self) -> None: class TestBothPreprintDoiDedup: """B6: Two entries with different preprint DOIs should NOT match.""" + def test_different_arxiv_dois_not_matched(self) -> None: """Two different arXiv preprints should not be considered duplicates.""" entry_a: dict[str, Any] = { @@ -1525,6 +1577,7 @@ def test_different_arxiv_dois_not_matched(self) -> None: class TestYearGapWidened: """L6: Year gap > 3 should reject, <= 3 should allow preprint→published.""" + def test_3_year_gap_allowed(self) -> None: """A 3-year gap (preprint in 2021, published in 2024) should allow matching.""" entry_a: dict[str, Any] = { @@ -1582,6 +1635,7 @@ def test_5_year_gap_rejected(self) -> None: class TestDoiConflictPreserveUpgrade: """B1: DOI merge should not revert a preprint→published upgrade.""" + def test_preprint_doi_upgraded_to_published(self) -> None: """When primary has arXiv DOI and enricher has published DOI, keep published.""" entry = { @@ -1604,6 +1658,7 @@ def test_preprint_doi_upgraded_to_published(self) -> None: class TestPhantomArxivJournal: """B2: 'arXiv e-prints' journal should be cleared when published DOI exists.""" + def test_arxiv_journal_cleared_with_published_doi(self) -> None: """When eprint removed due to published DOI, phantom journal should also go.""" entry = { @@ -1620,10 +1675,15 @@ def test_arxiv_journal_cleared_with_published_doi(self) -> None: } # The published DOI must come from a trusted enricher to survive merge enrichers = [ - ("csl", {"fields": { - "doi": "10.1145/1234567", - "journal": "ACM Computing Surveys", - }}), + ( + "csl", + { + "fields": { + "doi": "10.1145/1234567", + "journal": "ACM Computing Surveys", + } + }, + ), ] merged = merge_utils.merge_with_policy(entry, enrichers) # After B2: eprint removed because published DOI exists, @@ -1649,18 +1709,33 @@ def test_journal_backfilled_after_phantom_removal(self) -> None: # published DOI provide real journal which can't beat rank 0 during merge. # Backfill should recover the real journal after phantom removal. enrichers = [ - ("csl", {"fields": { - "doi": "10.48550/arxiv.2401.12345", - "journal": "arXiv", - }}), - ("s2", {"fields": { - "doi": "10.3390/s22166063", - "journal": "Sensors", - }}), - ("crossref", {"fields": { - "doi": "10.3390/s22166063", - "journal": "Sensors", - }}), + ( + "csl", + { + "fields": { + "doi": "10.48550/arxiv.2401.12345", + "journal": "arXiv", + } + }, + ), + ( + "s2", + { + "fields": { + "doi": "10.3390/s22166063", + "journal": "Sensors", + } + }, + ), + ( + "crossref", + { + "fields": { + "doi": "10.3390/s22166063", + "journal": "Sensors", + } + }, + ), ] merged = merge_utils.merge_with_policy(entry, enrichers) assert merged["fields"].get("journal") == "Sensors" @@ -1668,6 +1743,7 @@ def test_journal_backfilled_after_phantom_removal(self) -> None: class TestIncollectionPromotionRestricted: """B4: incollection→inproceedings should only fire for GENERIC_SERIES_NAMES.""" + def test_generic_series_promotes(self) -> None: """incollection with LNCS booktitle should become inproceedings.""" entry = { @@ -1701,6 +1777,7 @@ def test_real_book_chapter_stays(self) -> None: class TestCslArticleTypePreserved: """L16: CSL/doi_bibtex article type should not be overridden to inproceedings.""" + def test_proceedings_journal_becomes_inproceedings(self) -> None: """Proceedings-named venues should become @inproceedings, not @article.""" entry = { @@ -1713,12 +1790,15 @@ def test_proceedings_journal_becomes_inproceedings(self) -> None: }, } enrichers = [ - ("csl", { - "type": "article", - "fields": { - "journal": "Proceedings of the VLDB Endowment", + ( + "csl", + { + "type": "article", + "fields": { + "journal": "Proceedings of the VLDB Endowment", + }, }, - }), + ), ] merged = merge_utils.merge_with_policy(entry, enrichers) # PVLDB is a journal despite "Proceedings" in its name — stays @article @@ -1738,12 +1818,15 @@ def test_proceedings_on_also_becomes_inproceedings(self) -> None: }, } enrichers = [ - ("csl", { - "type": "article", - "fields": { - "journal": "Proceedings on Privacy Enhancing Technologies", + ( + "csl", + { + "type": "article", + "fields": { + "journal": "Proceedings on Privacy Enhancing Technologies", + }, }, - }), + ), ] merged = merge_utils.merge_with_policy(entry, enrichers) assert merged["type"] == "inproceedings" @@ -1753,6 +1836,7 @@ def test_proceedings_on_also_becomes_inproceedings(self) -> None: class TestPreprintServersNoFalsePositives: """L19: Journals with 'preprint' substring should not be misclassified.""" + def test_preprint_not_in_servers(self) -> None: """The generic word 'preprint' should not be in PREPRINT_SERVERS.""" assert "preprint" not in PREPRINT_SERVERS @@ -1771,6 +1855,7 @@ def test_preprints_dot_org_present(self) -> None: class TestMergeDuplicateThresholdRaised: """L1: SIM_MERGE_DUPLICATE_THRESHOLD should be 0.95 (was 0.9).""" + def test_threshold_value(self) -> None: assert SIM_MERGE_DUPLICATE_THRESHOLD == 0.95 @@ -1797,12 +1882,8 @@ def test_marginal_title_not_merged(self) -> None: }, } # Verify the titles have low similarity (below 0.6 to avoid strong-author gate) - sim = text_utils.title_similarity( - entry_a["fields"]["title"], entry_b["fields"]["title"] - ) - assert sim < 0.6, ( - f"Title similarity {sim:.3f} should be well below threshold to test rejection" - ) + sim = text_utils.title_similarity(entry_a["fields"]["title"], entry_b["fields"]["title"]) + assert sim < 0.6, f"Title similarity {sim:.3f} should be well below threshold to test rejection" # The strict matcher should NOT consider these as duplicates result = bt.bibtex_entries_match_strict(entry_a, entry_b) assert result is False, "Distinct papers with low title similarity should not be matched" @@ -1810,6 +1891,7 @@ def test_marginal_title_not_merged(self) -> None: class TestSemaphoreReleasedDuring429: """B9: Global semaphore should be released before sleeping on 429.""" + def test_429_sleep_outside_semaphore(self) -> None: """Verify the semaphore is not held during 429 retry sleep.""" _THREAD_LOCAL.session_request_count = 0 @@ -1835,6 +1917,7 @@ def test_429_sleep_outside_semaphore(self) -> None: class TestTokenBucketJitter: """L17: TokenBucketRateLimiter.acquire() should include jitter in sleep.""" + def test_jitter_import_and_usage(self) -> None: """Verify that random.uniform is called during acquire when sleep is needed.""" import src.http_utils as hu @@ -1868,6 +1951,7 @@ def capture_sleep(duration: float) -> None: class TestEmptyNameSkipped: """L12: Records with empty Name but valid IDs should be skipped.""" + def test_empty_name_with_scholar_id_skipped(self, tmp_path: Any) -> None: """Record with Scholar ID but no Name should be skipped.""" csv_content = "Name,Scholar Link,DBLP Link\n,https://scholar.google.com/citations?user=abc123,\nJohn Smith,https://scholar.google.com/citations?user=xyz789,\n" @@ -1882,6 +1966,7 @@ def test_empty_name_with_scholar_id_skipped(self, tmp_path: Any) -> None: class TestCslEventNameFallback: """B10: bibtex_from_csl should use event-name when container is a generic series.""" + def test_lncs_with_event_name(self) -> None: """When CSL container is LNCS and event-name exists, use event name.""" csl = { @@ -1921,6 +2006,7 @@ def test_non_generic_container_kept(self) -> None: class TestDagstuhlLipicsResolution: """Fix 8: Dagstuhl LIPIcs/OASIcs DOIs resolve conference name from DOI pattern.""" + @staticmethod def _csl_enricher(doi: str) -> list[tuple[str, dict[str, Any]]]: """Build a minimal CSL enricher that confirms the DOI.""" @@ -2005,6 +2091,7 @@ def test_non_dagstuhl_doi_unchanged(self) -> None: class TestGenericBootitleUpgradeDuringEnforce: """Fix 8b: container_enforce upgrades generic booktitle from journal before dropping it.""" + def test_lncs_booktitle_upgraded_from_journal(self) -> None: """When booktitle is LNCS and journal has specific name, journal wins.""" primary: dict = { @@ -2047,6 +2134,7 @@ def test_specific_booktitle_not_overwritten_by_journal(self) -> None: class TestCslPreprintVenueOverride: """CSL classifies arXiv preprints as @article; venue detection should override when the DOI is a secondary/preprint DOI and the venue is a conference.""" + def test_arxiv_article_with_conference_journal_becomes_inproceedings(self) -> None: """arXiv DOI + conference name in journal -> @inproceedings with booktitle.""" entry: dict[str, Any] = { @@ -2059,19 +2147,25 @@ def test_arxiv_article_with_conference_journal_becomes_inproceedings(self) -> No }, } enrichers: list[tuple[str, dict[str, Any]]] = [ - ("csl", { - "type": "article", - "fields": { - "doi": "10.48550/arxiv.2504.10703", - "title": "Trie-Measure Revisited", + ( + "csl", + { + "type": "article", + "fields": { + "doi": "10.48550/arxiv.2504.10703", + "title": "Trie-Measure Revisited", + }, }, - }), - ("s2", { - "type": "article", - "fields": { - "journal": "Annual Symposium on Combinatorial Pattern Matching", + ), + ( + "s2", + { + "type": "article", + "fields": { + "journal": "Annual Symposium on Combinatorial Pattern Matching", + }, }, - }), + ), ] merged = merge_utils.merge_with_policy(entry, enrichers) assert merged["type"] == "inproceedings" @@ -2090,13 +2184,16 @@ def test_published_doi_pvldb_stays_article(self) -> None: }, } enrichers: list[tuple[str, dict[str, Any]]] = [ - ("csl", { - "type": "article", - "fields": { - "doi": "10.1145/1234567.1234568", - "journal": "Proceedings of the VLDB Endowment", + ( + "csl", + { + "type": "article", + "fields": { + "doi": "10.1145/1234567.1234568", + "journal": "Proceedings of the VLDB Endowment", + }, }, - }), + ), ] merged = merge_utils.merge_with_policy(entry, enrichers) assert merged["type"] == "article" @@ -2114,18 +2211,24 @@ def test_arxiv_article_with_real_journal_stays_article(self) -> None: }, } enrichers: list[tuple[str, dict[str, Any]]] = [ - ("csl", { - "type": "article", - "fields": { - "doi": "10.48550/arxiv.2401.12345", + ( + "csl", + { + "type": "article", + "fields": { + "doi": "10.48550/arxiv.2401.12345", + }, }, - }), - ("s2", { - "type": "article", - "fields": { - "journal": "Nature Machine Intelligence", + ), + ( + "s2", + { + "type": "article", + "fields": { + "journal": "Nature Machine Intelligence", + }, }, - }), + ), ] merged = merge_utils.merge_with_policy(entry, enrichers) assert merged["type"] == "article" @@ -2133,6 +2236,7 @@ def test_arxiv_article_with_real_journal_stays_article(self) -> None: class TestEnrichedFileProtection: """Prevent unenriched stub from overwriting enriched file during FILE_CLEANUP.""" + def test_stub_does_not_overwrite_enriched(self, tmp_path: Any) -> None: """When prefer_path points to enriched file (more fields + DOI) and new entry is bare stub, FILE_CLEANUP should be blocked.""" @@ -2164,7 +2268,10 @@ def test_stub_does_not_overwrite_enriched(self, tmp_path: Any) -> None: }, } result_path, was_written = merge_utils.save_entry_to_file( - author_dir, "ID", stub_entry, prefer_path=prefer_path, + author_dir, + "ID", + stub_entry, + prefer_path=prefer_path, ) assert os.path.exists(prefer_path), "Enriched file should not be deleted" assert not was_written, "Stub should not have been written" @@ -2200,7 +2307,10 @@ def test_enriched_replaces_stub_normally(self, tmp_path: Any) -> None: }, } _, was_written = merge_utils.save_entry_to_file( - author_dir, "ID", enriched_entry, prefer_path=prefer_path, + author_dir, + "ID", + enriched_entry, + prefer_path=prefer_path, ) assert was_written, "Enriched entry should have been written" assert not os.path.exists(prefer_path), "Stub at prefer_path should be removed" @@ -2208,6 +2318,7 @@ def test_enriched_replaces_stub_normally(self, tmp_path: Any) -> None: class TestPreprintPublisherCleanup: """Preprint-only publishers should be stripped from published journal entries.""" + def test_openrxiv_stripped_from_published_journal(self) -> None: baseline: dict[str, Any] = { "type": "article", @@ -2223,8 +2334,9 @@ def test_openrxiv_stripped_from_published_journal(self) -> None: } result = merge_utils.merge_with_policy(baseline, []) fields = result.get("fields", {}) - assert "publisher" not in fields or fields.get("publisher", "").lower() != "openrxiv", \ + assert "publisher" not in fields or fields.get("publisher", "").lower() != "openrxiv", ( "openRxiv should be stripped from a published journal entry" + ) def test_preprint_publisher_kept_for_preprint_journal(self) -> None: baseline: dict[str, Any] = { @@ -2241,15 +2353,18 @@ def test_preprint_publisher_kept_for_preprint_journal(self) -> None: } result = merge_utils.merge_with_policy(baseline, []) fields = result.get("fields", {}) - assert fields.get("publisher") == "Cold Spring Harbor Laboratory", \ + assert fields.get("publisher") == "Cold Spring Harbor Laboratory", ( "Preprint publisher should be kept when journal is a preprint server" + ) class TestPreprintJournalDowngrade: """@article with a preprint server as journal should become @misc.""" + def test_biorxiv_journal_downgrades_to_misc(self) -> None: - assert any(ps == "biorxiv" for ps in PREPRINT_SERVERS), \ + assert any(ps == "biorxiv" for ps in PREPRINT_SERVERS), ( "biorxiv must be in PREPRINT_SERVERS for this test to be valid" + ) def test_preprint_server_journal_detected(self) -> None: """Verify PREPRINT_SERVERS contains the servers needed for journal detection.""" @@ -2259,6 +2374,7 @@ def test_preprint_server_journal_detected(self) -> None: class TestDagstuhlFestschriftDoi: """Festschrift DOIs (10.4230/oasics.name.N) should resolve to @inproceedings.""" + def test_festschrift_doi_becomes_inproceedings(self) -> None: doi = "10.4230/oasics.grossi.10" baseline: dict[str, Any] = { @@ -2277,8 +2393,9 @@ def test_festschrift_doi_becomes_inproceedings(self) -> None: "fields": {"doi": doi, "title": "Faster Run-Length BWT Construction"}, } result = merge_utils.merge_with_policy(baseline, [("csl", csl_enricher)]) - assert result["type"] == "inproceedings", \ + assert result["type"] == "inproceedings", ( f"OASIcs Festschrift DOI should produce @inproceedings, got {result['type']}" + ) fields = result.get("fields", {}) assert fields.get("booktitle"), "Should have booktitle for inproceedings" assert not fields.get("journal"), "journal should be migrated to booktitle" @@ -2308,6 +2425,7 @@ def test_known_dagstuhl_conf_still_resolves(self) -> None: class TestAuthorDigitSanitization: """Author digit suffixes should be stripped during merge.""" + def test_trailing_digits_stripped(self) -> None: baseline: dict[str, Any] = { "type": "misc", @@ -2346,6 +2464,7 @@ def test_clean_authors_unchanged(self) -> None: class TestVenuelessTypeDowngrade: """Entries missing required venue fields should be downgraded to @misc.""" + def test_article_no_journal_with_published_doi_becomes_misc(self) -> None: """@article without journal should be @misc even with a published DOI.""" baseline: dict[str, Any] = { @@ -2364,8 +2483,7 @@ def test_article_no_journal_with_published_doi_becomes_misc(self) -> None: assert not fields.get("journal"), "No journal from any enricher" if result["type"] == "article" and not fields.get("journal"): result["type"] = "misc" - assert result["type"] == "misc", \ - "@article without journal must be @misc regardless of DOI" + assert result["type"] == "misc", "@article without journal must be @misc regardless of DOI" def test_inproceedings_no_booktitle_becomes_misc(self) -> None: """@inproceedings without booktitle should be @misc.""" @@ -2383,8 +2501,7 @@ def test_inproceedings_no_booktitle_becomes_misc(self) -> None: assert not fields.get("booktitle"), "No booktitle from any enricher" if result["type"] == "inproceedings" and not fields.get("booktitle"): result["type"] = "misc" - assert result["type"] == "misc", \ - "@inproceedings without booktitle must be @misc" + assert result["type"] == "misc", "@inproceedings without booktitle must be @misc" def test_article_with_journal_stays_article(self) -> None: """@article WITH journal stays @article (no false downgrade).""" @@ -2410,6 +2527,7 @@ def test_article_with_journal_stays_article(self) -> None: class TestArticlePreprintDoiDowngrade: """@article with preprint DOI should be downgraded to @misc.""" + def test_article_with_arxiv_doi_becomes_misc(self) -> None: """@article with arXiv DOI and journal-like venue -> @misc.""" baseline: dict[str, Any] = { @@ -2436,12 +2554,11 @@ def test_article_with_arxiv_doi_becomes_misc(self) -> None: result["type"] = "misc" if fields.get("journal"): fields["howpublished"] = fields.pop("journal") - assert result["type"] == "misc", \ - "@article with arXiv DOI must be @misc" - assert fields.get("howpublished") == "Neural Computing and Applications", \ + assert result["type"] == "misc", "@article with arXiv DOI must be @misc" + assert fields.get("howpublished") == "Neural Computing and Applications", ( "Venue should be preserved in howpublished" - assert "journal" not in fields, \ - "journal field should be removed" + ) + assert "journal" not in fields, "journal field should be removed" def test_conference_acronym_with_arxiv_doi_becomes_inproceedings(self) -> None: """Conference acronym in ABBREVIATED_VENUE_MAP with arXiv DOI -> @inproceedings.""" @@ -2465,12 +2582,11 @@ def test_conference_acronym_with_arxiv_doi_becomes_inproceedings(self) -> None: result = merge_utils.merge_with_policy(baseline, [("csl", csl)]) fields = result.get("fields", {}) # CoLLAs is in ABBREVIATED_VENUE_MAP: merge expands to full conference name - assert result["type"] == "inproceedings", \ - "Conference acronym in venue map should become @inproceedings" - assert fields.get("booktitle") == "Conference on Lifelong Learning Agents", \ + assert result["type"] == "inproceedings", "Conference acronym in venue map should become @inproceedings" + assert fields.get("booktitle") == "Conference on Lifelong Learning Agents", ( "CoLLAs should be expanded to full conference name" - assert "journal" not in fields, \ - "journal field should be moved to booktitle" + ) + assert "journal" not in fields, "journal field should be moved to booktitle" def test_article_with_published_doi_stays_article(self) -> None: """@article with published DOI stays @article (no false downgrade).""" @@ -2494,8 +2610,7 @@ def test_article_with_published_doi_stays_article(self) -> None: doi = (fields.get("doi") or "").strip() if result["type"] == "article" and doi and id_utils.is_secondary_doi(doi): result["type"] = "misc" - assert result["type"] == "article", \ - "@article with published DOI should stay @article" + assert result["type"] == "article", "@article with published DOI should stay @article" assert fields.get("journal") == "Nature" def test_article_with_biorxiv_doi_becomes_misc(self) -> None: @@ -2524,6 +2639,7 @@ def test_article_with_biorxiv_doi_becomes_misc(self) -> None: class TestReconcileSummaryCSV: """reconcile_summary_csv removes phantom entries for deleted files.""" + def test_phantom_entries_removed(self, tmp_path: Any) -> None: """Rows pointing to non-existent files are stripped from the CSV.""" import csv as _csv @@ -2577,6 +2693,7 @@ def test_no_phantoms_no_rewrite(self, tmp_path: Any) -> None: class TestCollectOrphanFiles: """collect_orphan_files finds .bib files not referenced in the CSV.""" + def test_orphan_detected(self, tmp_path: Any) -> None: """A .bib file with no CSV entry is reported as an orphan.""" import csv as _csv @@ -2630,6 +2747,7 @@ def test_no_orphans(self, tmp_path: Any) -> None: class TestIsKnownSummaryPath: """is_known_summary_path checks the in-memory set from init_summary_csv.""" + def test_known_path_after_preserve(self, tmp_path: Any) -> None: """Paths loaded from an existing CSV are recognized as known.""" import csv as _csv @@ -2667,6 +2785,7 @@ class TestGarbageTitleDetection: @staticmethod def _is_garbage(title: str) -> bool: from main import _is_garbage_title + return _is_garbage_title(title) def test_email_address(self) -> None: @@ -2699,14 +2818,13 @@ class TestStaleFileValidation: def test_garbage_title_detected(self) -> None: from main import _is_garbage_title - title = ( - "Dalhousie University, Halifax, NS B3H 4R2, Canada " - "{travis. gagie, michael. stdenis}@ dal. ca" - ) + + title = "Dalhousie University, Halifax, NS B3H 4R2, Canada {travis. gagie, michael. stdenis}@ dal. ca" assert _is_garbage_title(title) def test_corrupted_title_detected(self) -> None: from main import _is_corrupted_title + assert _is_corrupted_title("Li2 () Wang3 () Chen1 ()") @@ -2716,12 +2834,12 @@ class TestProceedingsVolumeDetection: @staticmethod def _is_garbage(title: str) -> bool: from main import _is_garbage_title + return _is_garbage_title(title) def test_proceedings_volume_year_prefix(self) -> None: title = ( - "Proceedings of the 2023 Conference on Empirical Methods " - "in Natural Language Processing: Tutorial Abstracts" + "Proceedings of the 2023 Conference on Empirical Methods in Natural Language Processing: Tutorial Abstracts" ) assert self._is_garbage(title) @@ -2737,6 +2855,7 @@ def test_workshop_paper_not_caught(self) -> None: class TestHowpublishedCasingNormalization: """howpublished field casing should be normalized to canonical form.""" + def test_biorxiv_casing(self) -> None: entry = { "type": "misc", @@ -2776,6 +2895,7 @@ def test_regular_howpublished_unchanged(self) -> None: class TestArxivEprintsJournalStripping: """arXiv e-prints journal should be stripped and entry downgraded to @misc.""" + def test_arxiv_eprints_stripped_from_article(self) -> None: """@article with journal='arXiv e-prints' should become @misc after merge.""" entry = { @@ -2800,9 +2920,7 @@ def test_exact_match(self) -> None: assert merge_utils._matches_journal_named_proceedings("proceedings of the ieee") def test_match_with_comma_suffix(self) -> None: - assert merge_utils._matches_journal_named_proceedings( - "proceedings of the ieee, vol. 100" - ) + assert merge_utils._matches_journal_named_proceedings("proceedings of the ieee, vol. 100") def test_no_match_slash_suffix(self) -> None: """IEEE/CVF conference must NOT match the IEEE journal.""" @@ -2817,9 +2935,7 @@ def test_conference_journal_detects_ieee_cvf(self) -> None: ) def test_pnas_still_excluded(self) -> None: - assert not merge_utils._is_conference_journal( - "Proceedings of the National Academy of Sciences" - ) + assert not merge_utils._is_conference_journal("Proceedings of the National Academy of Sciences") class TestThreeWayFixConsistency: @@ -3040,24 +3156,29 @@ class TestStripEllipsis: def test_no_ellipsis(self) -> None: from src.publication_parser import _strip_ellipsis + assert _strip_ellipsis("Normal Text") == "Normal Text" def test_trailing_dots(self) -> None: from src.publication_parser import _strip_ellipsis + assert _strip_ellipsis("Workshop on Bridging Language...") == "Workshop on Bridging Language" def test_trailing_dots_with_preposition(self) -> None: from src.publication_parser import _strip_ellipsis + result = _strip_ellipsis("CHI Conference on Human Factors in ...") assert result == "CHI Conference on Human Factors" assert not result.endswith(" in") def test_unicode_ellipsis(self) -> None: from src.publication_parser import _strip_ellipsis + assert _strip_ellipsis("Some Text\u2026") == "Some Text" def test_parser_strips_ellipsis_from_venue(self) -> None: from src.publication_parser import parse_publication_string + result = parse_publication_string( "Extended Abstracts of the 2019 CHI Conference on Human Factors in Computing ..., 2019" ) @@ -3129,10 +3250,13 @@ def test_keep_longer_name_forms(self) -> None: }, } enrichers = [ - ("semantic_scholar", { - "type": "misc", - "fields": {"author": "Gabrielle Ecanow and Catherine Wong and Sam Acquaviva"}, - }), + ( + "semantic_scholar", + { + "type": "misc", + "fields": {"author": "Gabrielle Ecanow and Catherine Wong and Sam Acquaviva"}, + }, + ), ] result = merge_utils.merge_with_policy(primary, enrichers) assert "Samuel Acquaviva" in result["fields"]["author"] @@ -3148,3 +3272,30 @@ def test_keep_middle_initials(self) -> None: ] result = merge_utils.merge_with_policy(primary, enrichers) assert "Anielle S. L. Andrade" in result["fields"]["author"] + + +class TestDecodeValueErrorContainment: + """A malformed-JSON ValueError from _decode_json_bytes must not escape. + + The inner catch used NETWORK_ERRORS and the @handle_api_errors decorator + uses ALL_API_ERRORS; neither includes ValueError, so a bad 200-response + body crashed the run. Fix broadens the inner catch to ALL_FETCH_ERRORS. + """ + + def test_datacite_swallows_valueerror(self) -> None: + from src.clients import utility_apis + + with ( + patch.object(utility_apis.response_cache, "get", return_value=None), + patch.object(utility_apis, "http_get_json", side_effect=ValueError("Invalid JSON from 'https://x'")), + ): + assert utility_apis.datacite_search_doi("10.5281/zenodo.123") is None + + def test_orcid_swallows_valueerror(self) -> None: + from src.clients import utility_apis + + with ( + patch.object(utility_apis.response_cache, "get", return_value=None), + patch.object(utility_apis, "http_get_json", side_effect=ValueError("Invalid JSON")), + ): + assert utility_apis.orcid_fetch_works("0000-0001-2345-6789") == [] From bb339ffe95d25b22b5913cc10c9090387482d974 Mon Sep 17 00:00:00 2001 From: Gabriel Spadon Date: Wed, 1 Jul 2026 13:36:21 -0300 Subject: [PATCH 09/54] fix: bound HTTP retry amplification and stop POST auto-retry (C1) A persistent 5xx made urllib3 raise RetryError after its own 2 retries, which the manual loop's broad RequestException catch re-drove up to 3x, compounding to ~9 requests per failure. Catch RetryError distinctly and propagate instead of re-driving. Also drop POST from urllib3 allowed_methods so non-idempotent request bodies are never silently re-sent. 429/503 stays single-layer (excluded from forcelist, handled by the manual loop); sleeps remain outside the global semaphore, backoff cap unchanged (seam C1). --- src/http_utils.py | 10 +++++++- tests/test_http_utils.py | 52 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 61 insertions(+), 1 deletion(-) diff --git a/src/http_utils.py b/src/http_utils.py index ffe7dd7a..5606738c 100644 --- a/src/http_utils.py +++ b/src/http_utils.py @@ -183,7 +183,10 @@ def reset_api_call_counts() -> None: # Exclude 429/503 from urllib3 status_forcelist to avoid double-backoff # with our manual Retry-After handling in _http_request status_forcelist=tuple(c for c in HTTP_RETRY_STATUS_CODES if c not in (429, 503)), - allowed_methods=["GET", "POST"], + # Only auto-retry idempotent GET. POST is intentionally excluded so urllib3 + # never silently re-sends a non-idempotent request body (C1). POSTs still + # get manual 429/503 handling in _http_request. + allowed_methods=["GET"], # Disable urllib3's own Retry-After handling so it doesn't sleep for # minutes when a server sends a long Retry-After header. CiteForge's # _http_request already handles Retry-After with a capped backoff. @@ -370,6 +373,11 @@ def _http_request( headers=headers, timeout=(connect_timeout, timeout), ) + except requests.exceptions.RetryError: + # urllib3 already exhausted its own retries for a forced status + # (persistent 500/502/504). Do not re-drive it through the manual + # loop, which would compound to ~9 requests for one failure (C1). + raise except requests.exceptions.RequestException: if attempt == _MAX_RATE_LIMIT_RETRIES - 1: raise diff --git a/tests/test_http_utils.py b/tests/test_http_utils.py index 77fa7de6..55cc8150 100644 --- a/tests/test_http_utils.py +++ b/tests/test_http_utils.py @@ -1,7 +1,9 @@ from __future__ import annotations import pytest +import requests +from src import http_utils from src.http_utils import _decode_json_bytes, _scrub_secrets @@ -44,3 +46,53 @@ def test_decode_json_error_redacts_url_but_still_raises(self) -> None: def test_decode_json_valid_passthrough(self) -> None: assert _decode_json_bytes(b'{"a": 1}', "https://x?key=S") == {"a": 1} + + +class TestRetryBounding: + """Persistent 5xx must not compound urllib3 x manual retries into ~9 requests, + and non-idempotent POST must not be auto-retried by urllib3 (defect C1). + 429/503 stays single-layer (excluded from urllib3, handled by the manual loop). + """ + + def test_post_excluded_from_urllib3_retry(self) -> None: + assert "POST" not in http_utils._RETRY_STRATEGY.allowed_methods + assert "GET" in http_utils._RETRY_STRATEGY.allowed_methods + + def test_retry_error_not_redriven(self, monkeypatch: pytest.MonkeyPatch) -> None: + calls = {"n": 0} + + class _Sess: + def get(self, *args: object, **kwargs: object) -> object: + calls["n"] += 1 + raise requests.exceptions.RetryError("urllib3 exhausted 500s") + + monkeypatch.setattr(http_utils, "_get_session", lambda: _Sess()) + http_utils._THREAD_LOCAL.session_request_count = 0 + with pytest.raises(requests.exceptions.RetryError): + http_utils._http_request("GET", "https://example.com/x", {"Accept": "*/*"}, 1.0) + # One session.get call, not 3 manual iterations (which were 3 urllib3 each = 9). + assert calls["n"] == 1 + + def test_429_still_retried_by_manual_loop(self, monkeypatch: pytest.MonkeyPatch) -> None: + attempts = {"n": 0} + + class _Resp: + def __init__(self, status: int) -> None: + self.status_code = status + self.headers: dict[str, str] = {} + self.content = b"ok" + + def raise_for_status(self) -> None: + return None + + class _Sess: + def get(self, *args: object, **kwargs: object) -> _Resp: + attempts["n"] += 1 + return _Resp(429 if attempts["n"] < 3 else 200) + + monkeypatch.setattr(http_utils, "_get_session", lambda: _Sess()) + monkeypatch.setattr(http_utils.time, "sleep", lambda *_a: None) + http_utils._THREAD_LOCAL.session_request_count = 0 + out = http_utils._http_request("GET", "https://example.com/x", {"Accept": "*/*"}, 1.0) + assert out == b"ok" + assert attempts["n"] == 3 From dbcbc317ab2c2e7b13f9ba606b90bd5616b5634d Mon Sep 17 00:00:00 2001 From: Gabriel Spadon Date: Wed, 1 Jul 2026 13:42:07 -0300 Subject: [PATCH 10/54] fix: recompute month boundary and drop vestigial ttl_days (C3, C4) C4: _month_boundary was frozen at ResponseCache construction, so a long-lived process spanning a month rollover kept serving last month's entries as fresh. Make it a property recomputed per access. Byte-neutral for short batch runs (same month); correct across a rollover. C3: ttl_days was written into every cache entry but never read by get() (positive-entry freshness is governed by the monthly boundary). Stop storing it. The put() parameter is retained for caller intent and logging. --- src/cache.py | 43 +++++++++++++++++++++++++++++++++++-------- tests/test_cache.py | 22 ++++++++++++++++++++++ 2 files changed, 57 insertions(+), 8 deletions(-) diff --git a/src/cache.py b/src/cache.py index 5677564a..0c02eb3f 100644 --- a/src/cache.py +++ b/src/cache.py @@ -51,7 +51,14 @@ def __init__(self, cache_dir: str = CACHE_DIR) -> None: self._cache_dir = cache_dir self._locks: dict[str, threading.Lock] = {} self._meta_lock = threading.Lock() - self._month_boundary = _month_boundary() + + @property + def _month_boundary(self) -> float: + """Timestamp of the 1st of the CURRENT month (AST), recomputed on every + access. A long-lived process that spans a month rollover then starts + serving fresh data at the boundary instead of a value frozen at + construction (C4).""" + return _month_boundary() def _lock_for(self, namespace: str) -> threading.Lock: with self._meta_lock: @@ -81,18 +88,30 @@ def _safe_negative_expired(entry_ts: float) -> bool: # Created on Monday → 7 days (expires next Monday, not same day). days_to_monday = (7 - created.weekday()) % 7 or 7 next_monday = (created + timedelta(days=days_to_monday)).replace( - hour=0, minute=0, second=0, microsecond=0, + hour=0, + minute=0, + second=0, + microsecond=0, ) # 1st of the next month after creation if created.month == 12: next_first = created.replace( - year=created.year + 1, month=1, day=1, - hour=0, minute=0, second=0, microsecond=0, + year=created.year + 1, + month=1, + day=1, + hour=0, + minute=0, + second=0, + microsecond=0, ) else: next_first = created.replace( - month=created.month + 1, day=1, - hour=0, minute=0, second=0, microsecond=0, + month=created.month + 1, + day=1, + hour=0, + minute=0, + second=0, + microsecond=0, ) return now >= min(next_monday, next_first) @@ -157,12 +176,20 @@ def put(self, namespace: str, key: str, value: dict[str, Any], ttl_days: int = 3 self._write_entry(namespace, key, value, ttl_days) def _write_entry( - self, namespace: str, key: str, value: dict[str, Any], ttl_days: int, + self, + namespace: str, + key: str, + value: dict[str, Any], + ttl_days: int, ) -> None: """Atomic file write — must be called under the namespace lock.""" ns_dir = self._ns_dir(namespace) os.makedirs(ns_dir, exist_ok=True) - entry = {"timestamp": time.time(), "ttl_days": ttl_days, "data": value} + # ttl_days is accepted for caller intent (and logged in put()), but is + # intentionally NOT stored or read back: positive-entry freshness is + # governed solely by the monthly boundary in get(), never a rolling + # per-entry TTL (C3). + entry = {"timestamp": time.time(), "data": value} path = self._entry_path(namespace, key) try: fd, tmp_path = tempfile.mkstemp(dir=ns_dir, suffix=".tmp") diff --git a/tests/test_cache.py b/tests/test_cache.py index a06119a5..40438b73 100644 --- a/tests/test_cache.py +++ b/tests/test_cache.py @@ -418,3 +418,25 @@ def test_safe_negative_expired_december() -> None: mock_dt.fromtimestamp = datetime.fromtimestamp mock_dt.now.return_value = datetime(2027, 1, 1, 0, 0, 0, tzinfo=_AST) assert ResponseCache._safe_negative_expired(created_ts) + + +def test_ttl_days_not_stored(tmp_path: Path) -> None: + """ttl_days must not be written into cache entries (C3: written-but-never-read).""" + cache = ResponseCache(cache_dir=str(tmp_path)) + cache.put("ns", "k", {"v": 1}, ttl_days=99) + entry = json.loads(Path(cache._entry_path("ns", "k")).read_text(encoding="utf-8")) + assert "ttl_days" not in entry + assert entry["data"] == {"v": 1} + # The positive entry is still served (freshness = monthly boundary, not ttl). + assert cache.get("ns", "k") == {"v": 1} + + +def test_month_boundary_recomputed_not_frozen(tmp_path: Path, monkeypatch: pytest.MonkeyPatch) -> None: + """_month_boundary must recompute per access, not freeze at construction (C4).""" + cache = ResponseCache(cache_dir=str(tmp_path)) + _freeze_cache_clock(monkeypatch, datetime(2026, 3, 15, tzinfo=_AST)) + march_boundary = cache._month_boundary + _freeze_cache_clock(monkeypatch, datetime(2026, 4, 15, tzinfo=_AST)) + april_boundary = cache._month_boundary + assert april_boundary > march_boundary + assert april_boundary == datetime(2026, 4, 1, tzinfo=_AST).timestamp() From e2fc4da44256870a59ecef871724d69a5d2e00c1 Mon Sep 17 00:00:00 2001 From: Gabriel Spadon Date: Wed, 1 Jul 2026 13:45:25 -0300 Subject: [PATCH 11/54] fix: guard OpenReview session read under its lock (C6) The lock-free fast path read _OPENREVIEW_SESSION and _CREATED_AT in two separate global reads and could return a session a concurrent re-login had just cleared to None (or judge expiry from a torn pointer/timestamp pair). Move the reuse check inside _OPENREVIEW_SESSION_LOCK so both globals are read atomically together. OpenReview's Phase-2 position and the cache lock semantics are unchanged (seam C6). --- src/clients/search_apis.py | 170 ++++++++++++++++++++++++++----------- tests/test_regression.py | 42 +++++++++ 2 files changed, 164 insertions(+), 48 deletions(-) diff --git a/src/clients/search_apis.py b/src/clients/search_apis.py index b35b721d..75f8338e 100644 --- a/src/clients/search_apis.py +++ b/src/clients/search_apis.py @@ -66,6 +66,7 @@ # ============ Semantic Scholar ============ + def s2_search_paper(title: str, author_name: str | None, api_key: str | None) -> dict[str, Any] | None: """Search Semantic Scholar for a paper matching the given title and optional author.""" if not api_key or not title: @@ -75,6 +76,7 @@ def s2_search_paper(title: str, author_name: str | None, api_key: str | None) -> query_parts.append(author_name) from ..api_configs import S2_SEARCH_CONFIG from ..api_generics import search_api_generic + config = copy.copy(S2_SEARCH_CONFIG) config.additional_params = {**config.additional_params, config.query_param_name: " ".join(query_parts)} return search_api_generic(title, author_name, config, api_key=api_key) @@ -84,11 +86,15 @@ def build_bibtex_from_s2(paper: dict[str, Any], keyhint: str) -> str | None: """Convert a Semantic Scholar paper record into a BibTeX entry.""" from ..api_configs import S2_FIELD_MAPPING from ..api_generics import build_bibtex_from_response + return build_bibtex_from_response(paper, keyhint, S2_FIELD_MAPPING) def s2_search_papers_multiple( - title: str, author_name: str | None, api_key: str | None, max_results: int = 5, + title: str, + author_name: str | None, + api_key: str | None, + max_results: int = 5, ) -> list[dict[str, Any]]: """Search Semantic Scholar for multiple paper candidates.""" if not api_key or not title: @@ -105,6 +111,7 @@ def s2_search_papers_multiple( if author_name: query_parts.append(author_name) from ..api_configs import S2_SEARCH_CONFIG + config = copy.copy(S2_SEARCH_CONFIG) config.additional_params = {**config.additional_params, "limit": min(max_results * 2, 20)} params = {config.query_param_name: " ".join(query_parts), **config.additional_params} @@ -124,12 +131,14 @@ def s2_search_papers_multiple( # ============ Crossref ============ + def crossref_search(title: str, author_name: str | None) -> dict[str, Any] | None: """Look up a publication in Crossref by title and optional author.""" if not title: return None from ..api_configs import CROSSREF_SEARCH_CONFIG from ..api_generics import search_api_generic + config = copy.copy(CROSSREF_SEARCH_CONFIG) additional_params = dict(config.additional_params) if author_name: @@ -148,6 +157,7 @@ def build_bibtex_from_crossref(item: dict[str, Any], keyhint: str) -> str | None """Build a BibTeX entry from a Crossref record.""" from ..api_configs import CROSSREF_FIELD_MAPPING from ..api_generics import build_bibtex_from_response + return build_bibtex_from_response(item, keyhint, CROSSREF_FIELD_MAPPING) @@ -157,6 +167,7 @@ def crossref_search_multiple(title: str, author_name: str | None, max_results: i return [] from ..api_configs import CROSSREF_SEARCH_CONFIG from ..api_generics import search_api_generic_multiple + config = copy.copy(CROSSREF_SEARCH_CONFIG) additional_params = dict(config.additional_params) if author_name: @@ -173,6 +184,7 @@ def crossref_search_multiple(title: str, author_name: str | None, max_results: i # ============ DOI / CSL ============ + @handle_api_errors(default_return=None) def fetch_csl_via_doi(doi: str, timeout: float = 20.0) -> dict[str, Any] | None: """Resolve a DOI using content negotiation and return the associated CSL-JSON metadata.""" @@ -230,13 +242,10 @@ def bibtex_from_csl(csl: dict[str, Any], keyhint: str) -> str: """Translate a CSL-JSON citation description into a BibTeX entry.""" from ..bibtex_build import build_bibtex_entry, determine_entry_type from ..text_utils import extract_authors_from_any, extract_year_from_any, safe_get_field + title = safe_get_field(csl, "title") or "" subtitle_raw = csl.get("subtitle") - subtitle = ( - (subtitle_raw[0] if subtitle_raw else "") - if isinstance(subtitle_raw, list) - else (subtitle_raw or "") - ) + subtitle = (subtitle_raw[0] if subtitle_raw else "") if isinstance(subtitle_raw, list) else (subtitle_raw or "") if subtitle: title = f"{title}: {subtitle}" if title else subtitle authors = extract_authors_from_any(csl, field_names=["author"]) @@ -275,11 +284,17 @@ def bibtex_from_csl(csl: dict[str, Any], keyhint: str) -> str: category=LogCategory.SCORE, ) return build_bibtex_entry( - entry_type=entry_type, title=title, authors=authors, year=year, keyhint=keyhint, - venue=container or None, doi=doi or None, url=url or None, + entry_type=entry_type, + title=title, + authors=authors, + year=year, + keyhint=keyhint, + venue=container or None, + doi=doi or None, + url=url or None, extra_fields={ - k: v for k, v in - {"volume": volume, "number": number, "pages": pages, "publisher": publisher}.items() + k: v + for k, v in {"volume": volume, "number": number, "pages": pages, "publisher": publisher}.items() if v is not None }, ) @@ -287,8 +302,12 @@ def bibtex_from_csl(csl: dict[str, Any], keyhint: str) -> str: # ============ arXiv ============ + def arxiv_search( - title: str, author_name: str | None, year_hint: int | None, max_results: int = 10, + title: str, + author_name: str | None, + year_hint: int | None, + max_results: int = 10, ) -> list[dict[str, Any]]: """Search arXiv for papers matching the given title and optional author.""" if not title: @@ -306,8 +325,11 @@ def arxiv_search( q_parts.append(f'au:"{author_name}"') search_query = "+AND+".join(q_parts) params = { - "search_query": search_query, "start": 0, "max_results": max_results, - "sortBy": "relevance", "sortOrder": "descending", + "search_query": search_query, + "start": 0, + "max_results": max_results, + "sortBy": "relevance", + "sortOrder": "descending", } url = build_url(ARXIV_BASE, params) try: @@ -362,20 +384,30 @@ def find_child(el: ElementTree.Element, local: str) -> ElementTree.Element | Non if doi_val and pc: break arxiv_id = find_arxiv_in_text(link_abs or entry_id) or "" - entries.append({ - "title": title_val, "authors": authors_list, "year": year, - "abs_url": link_abs, "doi": doi_val, "primary_class": pc, "arxiv_id": arxiv_id, - }) + entries.append( + { + "title": title_val, + "authors": authors_list, + "year": year, + "abs_url": link_abs, + "doi": doi_val, + "primary_class": pc, + "arxiv_id": arxiv_id, + } + ) if not entries: response_cache.put_negative("arxiv", cache_key) return [] from ..bibtex_build import create_scoring_function + score_fn = create_scoring_function( - title=title, author_name=author_name, year_hint=year_hint, + title=title, + author_name=author_name, + year_hint=year_hint, title_getter=lambda ent: ent.get("title", ""), authors_getter=lambda ent: ent.get("authors", []), year_getter=lambda ent: ent.get("year"), - author_match_fn=authors_overlap + author_match_fn=authors_overlap, ) entries.sort(key=score_fn, reverse=True) response_cache.put("arxiv", cache_key, {"entries": entries}, ttl_days=CACHE_TTL_SEARCH_DAYS) @@ -390,6 +422,7 @@ def build_bibtex_from_arxiv(entry: dict[str, Any], keyhint: str) -> str | None: """Turn a parsed arXiv search result into a BibTeX entry.""" from ..api_configs import ARXIV_FIELD_MAPPING from ..api_generics import build_bibtex_from_response + return build_bibtex_from_response(entry, keyhint, ARXIV_FIELD_MAPPING) @@ -442,13 +475,14 @@ def openreview_login(creds: tuple[str, ...] | None) -> dict[str, str] | None: global _OPENREVIEW_SESSION, _OPENREVIEW_SESSION_CREATED_AT if not creds: return None + def _reuse_session() -> bool: return _OPENREVIEW_SESSION is not None and not _openreview_session_expired() - # Fast path: return cached session if not expired - if _reuse_session(): - logger.debug("openreview | SESSION | reused=True", category=LogCategory.CACHE) - return _OPENREVIEW_SESSION + # All reads of the shared session globals happen under the lock so the + # session pointer and its created-at timestamp are read atomically together. + # The previous lock-free fast path could observe a torn state, or return a + # session that a concurrent re-login had just cleared to None (C6). with _OPENREVIEW_SESSION_LOCK: # Double-check after acquiring lock (may have been refreshed by another thread) if _reuse_session(): @@ -521,7 +555,9 @@ def _extend(req_url: str) -> None: def _or_is_exact_match( - cand: dict[str, Any], target_norm: str, author_name: str | None, + cand: dict[str, Any], + target_norm: str, + author_name: str | None, ) -> bool: """Check if an OpenReview note is an exact title match with compatible authors.""" if normalize_title(_or_note_title(cand)) != target_norm: @@ -533,7 +569,9 @@ def _or_is_exact_match( def openreview_search_paper( - title: str, author_name: str | None, creds: tuple[str, ...] | None, + title: str, + author_name: str | None, + creds: tuple[str, ...] | None, ) -> dict[str, Any] | None: """Query OpenReview for notes matching the requested paper.""" if not title: @@ -562,8 +600,11 @@ def openreview_search_paper( from ..bibtex_build import create_scoring_function score_fn = create_scoring_function( - title=title, author_name=author_name, year_hint=None, - title_getter=_or_note_title, authors_getter=_or_note_authors, + title=title, + author_name=author_name, + year_hint=None, + title_getter=_or_note_title, + authors_getter=_or_note_authors, year_getter=_or_note_year, ) best = _best_item_by_score(candidates, score_fn, threshold=SIM_EXACT_PICK_THRESHOLD) @@ -579,11 +620,15 @@ def build_bibtex_from_openreview(note: dict[str, Any], keyhint: str) -> str | No """Build a BibTeX entry from an OpenReview note.""" from ..api_configs import OPENREVIEW_FIELD_MAPPING from ..api_generics import build_bibtex_from_response + return build_bibtex_from_response(note, keyhint, OPENREVIEW_FIELD_MAPPING) def openreview_search_papers_multiple( - title: str, author_name: str | None, creds: tuple[str, ...] | None, max_results: int = 5, + title: str, + author_name: str | None, + creds: tuple[str, ...] | None, + max_results: int = 5, ) -> list[dict[str, Any]]: """Query OpenReview for multiple candidate notes.""" if not title: @@ -610,8 +655,11 @@ def openreview_search_papers_multiple( from ..bibtex_build import create_scoring_function score_fn = create_scoring_function( - title=title, author_name=author_name, year_hint=None, - title_getter=_or_note_title, authors_getter=_or_note_authors, + title=title, + author_name=author_name, + year_hint=None, + title_getter=_or_note_title, + authors_getter=_or_note_authors, year_getter=_or_note_year, ) scored = [] @@ -634,6 +682,7 @@ def openreview_search_papers_multiple( # ============ DBLP ============ + def dblp_extract_pid(val: str | None) -> str | None: """Extract a DBLP person identifier from a hint value.""" s = str(val).strip() if val else "" @@ -747,8 +796,11 @@ def dblp_fetch_publications(pid: str) -> list[dict[str, Any]]: abs_or_url = ee or dburl venue = _xml_text(child.find("journal")) or _xml_text(child.find("booktitle")) art: dict[str, Any] = { - "title": title, "authors": authors_list, "year": year, - "publication": venue, "link": abs_or_url, + "title": title, + "authors": authors_list, + "year": year, + "publication": venue, + "link": abs_or_url, "snippet": ", ".join([v for v in [venue, str(year) if year else "", doi or ""] if v]), "source": "dblp", } @@ -781,10 +833,12 @@ def dblp_fetch_for_author(name: str, dblp_hint: str | None, min_year: int | None # ============ OpenAlex ============ + def openalex_search_paper(title: str, author_name: str | None) -> dict[str, Any] | None: """Search OpenAlex for a publication by title and optional author.""" from ..api_configs import OPENALEX_SEARCH_CONFIG from ..api_generics import search_api_generic + return search_api_generic(title, author_name, OPENALEX_SEARCH_CONFIG) @@ -792,6 +846,7 @@ def build_bibtex_from_openalex(work: dict[str, Any], keyhint: str) -> str | None """Build a BibTeX entry from an OpenAlex work record.""" from ..api_configs import OPENALEX_FIELD_MAPPING from ..api_generics import build_bibtex_from_response + return build_bibtex_from_response(work, keyhint, OPENALEX_FIELD_MAPPING) @@ -801,11 +856,13 @@ def openalex_search_multiple(title: str, author_name: str | None, max_results: i return [] from ..api_configs import OPENALEX_SEARCH_CONFIG from ..api_generics import search_api_generic_multiple + return search_api_generic_multiple(title, author_name, OPENALEX_SEARCH_CONFIG, None, max_results) # ============ PubMed ============ + @handle_api_errors(default_return=None) def pubmed_search_paper(title: str, author_name: str | None) -> dict[str, Any] | None: """Search PubMed for a publication by title and optional author.""" @@ -861,8 +918,11 @@ def pubmed_search_paper(title: str, author_name: str | None) -> dict[str, Any] | ) return result from ..bibtex_build import create_scoring_function + score_fn = create_scoring_function( - title=title, author_name=author_name, year_hint=None, + title=title, + author_name=author_name, + year_hint=None, title_getter=lambda a: a.get("title") or "", authors_getter=lambda a: [auth.get("name") or "" for auth in (a.get("authors") or []) if auth.get("name")], year_getter=lambda a: extract_year_from_any(a.get("pubdate"), fallback=None), @@ -881,6 +941,7 @@ def build_bibtex_from_pubmed(article: dict[str, Any], keyhint: str) -> str | Non """Build a BibTeX entry from a PubMed article record.""" from ..bibtex_build import build_bibtex_entry, determine_entry_type from ..text_utils import extract_author_names, safe_get_field + title = safe_get_field(article, "title") if not title: return None @@ -905,8 +966,15 @@ def build_bibtex_from_pubmed(article: dict[str, Any], keyhint: str) -> str | Non if pmid: extra_fields["note"] = f"PMID: {pmid}" return build_bibtex_entry( - entry_type=entry_type, title=title, authors=authors, year=year, - keyhint=keyhint, venue=venue, doi=doi, url=url, extra_fields=extra_fields, + entry_type=entry_type, + title=title, + authors=authors, + year=year, + keyhint=keyhint, + venue=venue, + doi=doi, + url=url, + extra_fields=extra_fields, ) @@ -957,13 +1025,15 @@ def pubmed_search_papers_multiple(title: str, author_name: str | None, max_resul # ============ Europe PMC ============ + def europepmc_search_paper(title: str, author_name: str | None) -> dict[str, Any] | None: """Search Europe PMC for a publication by title and optional author.""" if not title: return None from ..api_configs import EUROPEPMC_SEARCH_CONFIG from ..api_generics import search_api_generic - safe_title = title.replace('"', '') + + safe_title = title.replace('"', "") query = f'TITLE:"{safe_title}"' if author_name: query += f' AND AUTH:"{author_name}"' @@ -976,6 +1046,7 @@ def build_bibtex_from_europepmc(article: dict[str, Any], keyhint: str) -> str | """Build a BibTeX entry from a Europe PMC article record.""" from ..bibtex_build import build_bibtex_entry, determine_entry_type from ..text_utils import extract_author_names, safe_get_field + title = safe_get_field(article, "title") if not title: return None @@ -983,7 +1054,8 @@ def build_bibtex_from_europepmc(article: dict[str, Any], keyhint: str) -> str | year = extract_year_from_any(article.get("pubYear"), fallback=0) or 0 venue = safe_get_field(article, "journalTitle") or safe_get_field(article, "bookTitle") entry_type = determine_entry_type( - article, type_field="pubType", + article, + type_field="pubType", venue_hints={"journalTitle": "article", "bookTitle": "inproceedings"}, ) doi = safe_get_field(article, "doi") @@ -1010,8 +1082,15 @@ def build_bibtex_from_europepmc(article: dict[str, Any], keyhint: str) -> str | note_parts.append(f"PMCID: {pmcid}") extra_fields["note"] = ", ".join(note_parts) return build_bibtex_entry( - entry_type=entry_type, title=title, authors=authors, year=year, - keyhint=keyhint, venue=venue, doi=doi, url=url, extra_fields=extra_fields, + entry_type=entry_type, + title=title, + authors=authors, + year=year, + keyhint=keyhint, + venue=venue, + doi=doi, + url=url, + extra_fields=extra_fields, ) @@ -1028,7 +1107,8 @@ def europepmc_search_papers_multiple(title: str, author_name: str | None, max_re logger.debug(f"europepmc_multi | HIT | key={cache_key[:60]}", category=LogCategory.CACHE) return list(cached.get("results", [])) from ..api_configs import EUROPEPMC_SEARCH_CONFIG - safe_title = title.replace('"', '') + + safe_title = title.replace('"', "") query = f'TITLE:"{safe_title}"' if author_name: query += f' AND AUTH:"{author_name}"' @@ -1070,9 +1150,7 @@ def crossref_search_by_venue( from ..api_generics import _build_scoring_function cache_key = ( - f"venue|{normalize_title(title)}" - f"|{(author_name or '').strip().lower()}" - f"|{container_title.lower().strip()}" + f"venue|{normalize_title(title)}|{(author_name or '').strip().lower()}|{container_title.lower().strip()}" ) cached = response_cache.get("crossref_venue", cache_key) if cached is not None: @@ -1144,11 +1222,7 @@ def openalex_search_by_venue( from ..api_configs import OPENALEX_SEARCH_CONFIG from ..api_generics import _build_scoring_function - cache_key = ( - f"venue|{normalize_title(title)}" - f"|{(author_name or '').strip().lower()}" - f"|{venue_name.lower().strip()}" - ) + cache_key = f"venue|{normalize_title(title)}|{(author_name or '').strip().lower()}|{venue_name.lower().strip()}" cached = response_cache.get("openalex_venue", cache_key) if cached is not None: if cached.get("_negative"): diff --git a/tests/test_regression.py b/tests/test_regression.py index 0f92604c..7c028fd7 100644 --- a/tests/test_regression.py +++ b/tests/test_regression.py @@ -3299,3 +3299,45 @@ def test_orcid_swallows_valueerror(self) -> None: patch.object(utility_apis, "http_get_json", side_effect=ValueError("Invalid JSON")), ): assert utility_apis.orcid_fetch_works("0000-0001-2345-6789") == [] + + +class TestOpenReviewSessionThreadSafety: + """Concurrent openreview_login calls must reuse a valid cached session + atomically: never re-login and never return a torn/None value (C6).""" + + def test_concurrent_reuse_no_relogin(self) -> None: + import threading + + from src.clients import search_apis as sa + + prev_session = sa._OPENREVIEW_SESSION + prev_created = sa._OPENREVIEW_SESSION_CREATED_AT + relogins = {"n": 0} + + def _fake_get_session() -> Any: + relogins["n"] += 1 + raise AssertionError("must not re-login while a valid session is cached") + + results: list[Any] = [] + results_lock = threading.Lock() + + def _worker() -> None: + r = sa.openreview_login(("user", "pass")) + with results_lock: + results.append(r) + + try: + sa._OPENREVIEW_SESSION = {"Cookie": "sess=abc"} + sa._OPENREVIEW_SESSION_CREATED_AT = time.monotonic() + with patch.object(sa, "_get_session", _fake_get_session): + threads = [threading.Thread(target=_worker) for _ in range(8)] + for t in threads: + t.start() + for t in threads: + t.join() + assert relogins["n"] == 0 + assert len(results) == 8 + assert all(r == {"Cookie": "sess=abc"} for r in results) + finally: + sa._OPENREVIEW_SESSION = prev_session + sa._OPENREVIEW_SESSION_CREATED_AT = prev_created From 031c078f37a1699e2161295e97e0e07d3b74494f Mon Sep 17 00:00:00 2001 From: Gabriel Spadon Date: Wed, 1 Jul 2026 13:59:19 -0300 Subject: [PATCH 12/54] refactor: centralize .bib/output dir scans in src/fsscan.py (Step 3) Add iter_author_bibs()/iter_output_dirs() (sorted) and route the 8 author .bib and output-subdir scan sites through them, making determinism (sorted scan, surface #6) structural instead of duplicated. Byte-neutral: each site was already sorted or order-insensitive. --- main.py | 18 ++++++++---------- src/fsscan.py | 30 ++++++++++++++++++++++++++++++ src/merge_utils.py | 7 +++---- tests/test_fsscan.py | 24 ++++++++++++++++++++++++ 4 files changed, 65 insertions(+), 14 deletions(-) create mode 100644 src/fsscan.py create mode 100644 tests/test_fsscan.py diff --git a/main.py b/main.py index fb97c59f..e2458cf2 100644 --- a/main.py +++ b/main.py @@ -85,6 +85,7 @@ FULL_OPERATION_ERRORS, PARSE_ERRORS, ) +from src.fsscan import iter_author_bibs, iter_output_dirs from src.http_utils import get_api_call_counts, http_get_text, reset_api_call_counts from src.io_utils import ( append_summary_to_csv, @@ -814,7 +815,7 @@ def process_article( # If found, load it and use as baseline - enrichment process will update/fix fields if SKIP_SCHOLAR_FOR_EXISTING_FILES and os.path.exists(author_dir): # Sort filenames for deterministic iteration order - bib_files = sorted(f for f in os.listdir(author_dir) if f.endswith('.bib')) + bib_files = iter_author_bibs(author_dir) logger.debug( f"EXISTING_FILE_SCAN | dir={author_dir} | files_checked={len(bib_files)}", category=LogCategory.AUDIT, @@ -2542,9 +2543,7 @@ def _add_doi(source: str, doi: str | None) -> None: prefer_doi = _read_doi_from_file(path) if path and os.path.isfile(path) else "" check_dois = all_candidate_dois - {prefer_doi} if prefer_doi else all_candidate_dois if check_dois: - for existing_bib in os.listdir(author_dir): - if not existing_bib.endswith(".bib"): - continue + for existing_bib in iter_author_bibs(author_dir): epath = os.path.join(author_dir, existing_bib) if path and os.path.abspath(epath) == os.path.abspath(path): continue # skip self @@ -2855,7 +2854,7 @@ def count_existing_papers(rec: Record, out_dir: str) -> int: author_dirname = format_author_dirname(rec.name, effective_id) author_dir = os.path.join(out_dir, author_dirname) try: - return sum(1 for f in os.listdir(author_dir) if f.endswith('.bib')) + return len(iter_author_bibs(author_dir)) except OSError: return 0 @@ -3161,9 +3160,9 @@ def _thread_excepthook(args: Any) -> None: # This catches orphans (files not processed during enrichment) and any # entries where Phase 4 corrections were undone by Tier 2 filling. postrun_fixed = 0 - for pr_entry_name in sorted(os.listdir(out_dir)): + for pr_entry_name in iter_output_dirs(out_dir): pr_dir = os.path.join(out_dir, pr_entry_name) - if not os.path.isdir(pr_dir) or pr_entry_name == "a2i2": + if pr_entry_name == "a2i2": continue for pr_fname in sorted(os.listdir(pr_dir)): if not pr_fname.endswith(".bib"): @@ -3196,10 +3195,9 @@ def _thread_excepthook(args: Any) -> None: # Write per-author baseline counts baseline: dict[str, int] = {} - for entry in sorted(os.listdir(out_dir)): + for entry in iter_output_dirs(out_dir): d = os.path.join(out_dir, entry) - if os.path.isdir(d): - baseline[entry] = sum(1 for f in os.listdir(d) if f.endswith(".bib")) + baseline[entry] = len(iter_author_bibs(d)) baseline_path = os.path.join(out_dir, "baseline.json") try: with open(baseline_path, "w", encoding="utf-8") as bf: diff --git a/src/fsscan.py b/src/fsscan.py new file mode 100644 index 00000000..11f49907 --- /dev/null +++ b/src/fsscan.py @@ -0,0 +1,30 @@ +"""Centralized, deterministic directory scans. + +Single source of truth for the two directory-scan shapes the pipeline relies +on. Both return sorted results so that determinism (byte-identical output on +cache-hit runs) is structural rather than duplicated at every call site. + +Leaf module: depends only on the standard library. +""" + +from __future__ import annotations + +import os + + +def iter_author_bibs(author_dir: str) -> list[str]: + """Return the ``.bib`` filenames in ``author_dir``, sorted. + + Filenames only (not full paths). ``OSError`` from :func:`os.listdir` is not + swallowed here; callers keep whatever error handling they already had. + """ + return sorted(f for f in os.listdir(author_dir) if f.endswith(".bib")) + + +def iter_output_dirs(out_dir: str) -> list[str]: + """Return the immediate subdirectory names of ``out_dir``, sorted. + + Directory entry names only (not full paths); plain files are excluded. + ``OSError`` from :func:`os.listdir` is not swallowed here. + """ + return sorted(e for e in os.listdir(out_dir) if os.path.isdir(os.path.join(out_dir, e))) diff --git a/src/merge_utils.py b/src/merge_utils.py index f7f0e1f3..19504fdf 100644 --- a/src/merge_utils.py +++ b/src/merge_utils.py @@ -25,6 +25,7 @@ TRUST_DIFF_OVERRIDE_THRESHOLD, TRUST_ORDER, ) +from .fsscan import iter_author_bibs from .id_utils import ( _norm_doi, allowlisted_url, @@ -857,7 +858,7 @@ def save_entry_to_file( author_dir = os.path.join(out_dir, author_dirname) os.makedirs(author_dir, exist_ok=True) - all_files = sorted(f for f in os.listdir(author_dir) if f.endswith(".bib")) + all_files = iter_author_bibs(author_dir) collision_files = set(all_files) - {os.path.basename(prefer_path)} if prefer_path else set(all_files) filename = short_filename_for_entry( @@ -1366,9 +1367,7 @@ def _replace_existing() -> None: # a distinguishing suffix to the key to avoid LaTeX collisions. new_key = (entry.get("key") or "").strip() if should_write and new_key: - for other_file in os.listdir(author_dir): - if not other_file.endswith(".bib"): - continue + for other_file in iter_author_bibs(author_dir): other_path = os.path.join(author_dir, other_file) if os.path.abspath(other_path) == os.path.abspath(path): continue diff --git a/tests/test_fsscan.py b/tests/test_fsscan.py new file mode 100644 index 00000000..7f004423 --- /dev/null +++ b/tests/test_fsscan.py @@ -0,0 +1,24 @@ +"""Tests for src.fsscan: deterministic directory-scan helpers.""" + +from __future__ import annotations + +import pathlib + +from src.fsscan import iter_author_bibs, iter_output_dirs + + +def test_iter_author_bibs_returns_sorted_bib_names_only(tmp_path: pathlib.Path) -> None: + (tmp_path / "z.bib").write_text("", encoding="utf-8") + (tmp_path / "a.bib").write_text("", encoding="utf-8") + (tmp_path / "note.txt").write_text("", encoding="utf-8") + + assert iter_author_bibs(str(tmp_path)) == ["a.bib", "z.bib"] + + +def test_iter_output_dirs_returns_sorted_subdir_names_excluding_files(tmp_path: pathlib.Path) -> None: + (tmp_path / "zeta").mkdir() + (tmp_path / "alpha").mkdir() + (tmp_path / "loose.bib").write_text("", encoding="utf-8") + (tmp_path / "baseline.json").write_text("{}", encoding="utf-8") + + assert iter_output_dirs(str(tmp_path)) == ["alpha", "zeta"] From b3421a3c7c1144edd2e5a374f8ade25b72f8d927 Mon Sep 17 00:00:00 2001 From: Gabriel Spadon Date: Wed, 1 Jul 2026 14:02:08 -0300 Subject: [PATCH 13/54] style: apply ruff format across src, main.py, and tests The host runs ruff format on save, so files touched during the audit were reflowed piecemeal, leaving formatting inconsistent. Apply ruff format uniformly so the whole tree is format-clean and future diffs stay minimal. No behavior change (formatting only); ruff check + mypy + pytest all green. --- main.py | 653 +++++++++++++++++-------------- src/api_configs.py | 103 ++--- src/api_generics.py | 63 ++- src/bibtex_build.py | 67 ++-- src/bibtex_utils.py | 200 ++++++---- src/clients/helpers.py | 26 +- src/clients/scholar.py | 51 ++- src/clients/serply_scholar.py | 2 +- src/doi_utils.py | 59 ++- src/id_utils.py | 73 ++-- src/io_utils.py | 23 +- src/log_utils.py | 21 +- src/models.py | 1 + src/publication_parser.py | 23 +- src/text_utils.py | 192 +++++---- tests/fixtures.py | 4 +- tests/test_apis.py | 15 +- tests/test_config.py | 6 +- tests/test_core.py | 179 ++++----- tests/test_data.py | 66 +++- tests/test_integration.py | 182 +++++---- tests/test_io_csv.py | 218 +++++++---- tests/test_pipeline.py | 144 ++++--- tests/test_publication_parser.py | 12 +- tests/test_scholarly_scholar.py | 40 +- 25 files changed, 1340 insertions(+), 1083 deletions(-) diff --git a/main.py b/main.py index e2458cf2..10baa95b 100644 --- a/main.py +++ b/main.py @@ -117,65 +117,62 @@ FORCE_ENRICH = "--force" in sys.argv[1:] -_BRACKET_J_RE = re.compile(r'\s*\[J\]\s*$') -_ARXIV_ABS_RE = re.compile(r'arxiv\.org/abs/(\d{4}\.\d{4,5})', re.IGNORECASE) +_BRACKET_J_RE = re.compile(r"\s*\[J\]\s*$") +_ARXIV_ABS_RE = re.compile(r"arxiv\.org/abs/(\d{4}\.\d{4,5})", re.IGNORECASE) # Pre-compiled patterns for _fix_fused_compounds (avoids ~800 re.compile() calls per invocation) _FUSED_DICT_PATTERNS: list[tuple[re.Pattern[str], str]] = [ - (re.compile(r'\b' + re.escape(fused) + r'\b', re.IGNORECASE), repl) - for fused, repl in FUSED_COMPOUND_WORDS.items() + (re.compile(r"\b" + re.escape(fused) + r"\b", re.IGNORECASE), repl) for fused, repl in FUSED_COMPOUND_WORDS.items() ] _COMPOUND_SUFFIX_PATTERNS: list[re.Pattern[str]] = [ - re.compile(r'\b([A-Z][a-z]{2,})(' + re.escape(suffix) + r')\b') - for suffix in COMPOUND_SUFFIXES + re.compile(r"\b([A-Z][a-z]{2,})(" + re.escape(suffix) + r")\b") for suffix in COMPOUND_SUFFIXES ] # Pre-compiled patterns for garbage title detection -_GARBAGE_EMAIL_RE = re.compile(r'[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}') -_GARBAGE_POSTAL_RE = re.compile(r'\b[A-Z]\d[A-Z]\s*\d[A-Z]\d\b') -_GARBAGE_DEPT_RE = re.compile(r'^\s*(Department|Faculty|School|Institute)\s+of\b', re.IGNORECASE) -_GARBAGE_PHONE_RE = re.compile(r'\+?\d{1,4}[\.\-]\d{2,4}[\.\-]\d{2,}') -_GARBAGE_VOLUME_RE = re.compile(r'\bComplete\s+Volume\b', re.IGNORECASE) -_GARBAGE_SERIES_VOL_RE = re.compile(r'^(OASIcs|LIPIcs|LNI|LNCS|Dagstuhl)\b.*\bVolume\s+\d+\b', re.IGNORECASE) -_GARBAGE_FESTSCHRIFT_RE = re.compile(r'\bFestschrift\b', re.IGNORECASE) -_GARBAGE_FESTSCHRIFT_META_RE = re.compile(r',\s+[A-Z][a-z]+,\s+[A-Z][a-z]+\b.*\d{4}') -_GARBAGE_PROCEEDINGS_RE = re.compile(r'^Proceedings\s+of\s+(the\s+)?\d{4}\s+', re.IGNORECASE) -_GARBAGE_CORRECTION_RE = re.compile(r'^Correction(s)?\s+(to|of)\s*:', re.IGNORECASE) -_GARBAGE_EASYCHAIR_RE = re.compile(r'\bEasyChair\s+Preprint\b', re.IGNORECASE) -_FILENAME_YEAR_RE = re.compile(r'/[A-Za-z]+(\d{4})-') +_GARBAGE_EMAIL_RE = re.compile(r"[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}") +_GARBAGE_POSTAL_RE = re.compile(r"\b[A-Z]\d[A-Z]\s*\d[A-Z]\d\b") +_GARBAGE_DEPT_RE = re.compile(r"^\s*(Department|Faculty|School|Institute)\s+of\b", re.IGNORECASE) +_GARBAGE_PHONE_RE = re.compile(r"\+?\d{1,4}[\.\-]\d{2,4}[\.\-]\d{2,}") +_GARBAGE_VOLUME_RE = re.compile(r"\bComplete\s+Volume\b", re.IGNORECASE) +_GARBAGE_SERIES_VOL_RE = re.compile(r"^(OASIcs|LIPIcs|LNI|LNCS|Dagstuhl)\b.*\bVolume\s+\d+\b", re.IGNORECASE) +_GARBAGE_FESTSCHRIFT_RE = re.compile(r"\bFestschrift\b", re.IGNORECASE) +_GARBAGE_FESTSCHRIFT_META_RE = re.compile(r",\s+[A-Z][a-z]+,\s+[A-Z][a-z]+\b.*\d{4}") +_GARBAGE_PROCEEDINGS_RE = re.compile(r"^Proceedings\s+of\s+(the\s+)?\d{4}\s+", re.IGNORECASE) +_GARBAGE_CORRECTION_RE = re.compile(r"^Correction(s)?\s+(to|of)\s*:", re.IGNORECASE) +_GARBAGE_EASYCHAIR_RE = re.compile(r"\bEasyChair\s+Preprint\b", re.IGNORECASE) +_FILENAME_YEAR_RE = re.compile(r"/[A-Za-z]+(\d{4})-") # Pre-compiled patterns for acronym case corrections in titles _ACRONYM_CASE_PATTERNS: list[tuple[re.Pattern[str], str]] = [ - (re.compile(r'\b' + re.escape(wrong) + r'\b'), correct) - for wrong, correct in ACRONYM_CASE_CORRECTIONS.items() + (re.compile(r"\b" + re.escape(wrong) + r"\b"), correct) for wrong, correct in ACRONYM_CASE_CORRECTIONS.items() ] # Pre-compiled pattern for verbose LNCS/Springer booktitle metadata # Strips conference location, dates, and "Proceedings" suffix appended by Crossref _VERBOSE_BOOKTITLE_RE = re.compile( - r'\d+(st|nd|rd|th)\s+(International|Annual|European|Asian|Australasian)\s+' - r'(Conference|Workshop|Symposium)\b.*,\s*Proceedings\s*$', + r"\d+(st|nd|rd|th)\s+(International|Annual|European|Asian|Australasian)\s+" + r"(Conference|Workshop|Symposium)\b.*,\s*Proceedings\s*$", re.IGNORECASE, ) # Pre-compiled patterns for three-way title/venue fixups (used in _fixup_bib_entry, # existing-file fixup, and Phase 4 post-merge — each pattern appears 3 times) -_COLON_SPACE_RE = re.compile(r'(\S):([A-Z])') -_HYPHEN_SPACE_RE = re.compile(r'(\w)- (?!and |or |to )') -_SPACE_HYPHEN_RE = re.compile(r'(\w) -(\w)') -_TRAILING_DASH_RE = re.compile(r'[\s][-\u2013]\s*$') -_SUBTITLE_WRAPPER_RE = re.compile(r':\s*-([^-]+)-\s*$') -_SPIRE_STRIP_RE = re.compile(r'\s*:\s*SPIRE\b.*$') -_OSF_DOI_RE = re.compile(r'^10\.31(219|234)/') -_DOI_VERSION_RE = re.compile(r'_v\d+$') -_LIPICS_PAGES_STRIP_RE = re.compile(r',\s*\d+:\s*\d+-\d+:\s*\d+\s*$') -_LIPICS_PAGES_EXTRACT_RE = re.compile(r',\s*(\d+:\s*\d+-\d+:\s*\d+)\s*$') -_PREPRINT_MARKER_RE = re.compile(r'\s*\[preprint\]\s*$', re.IGNORECASE) -_GECCO_RE = re.compile(r'\bgenetic and evolutionary computation conference\b', re.IGNORECASE) -_URL_IN_VENUE_RE = re.compile(r'https?://') -_URL_IN_VENUE_STRIP_RE = re.compile(r',?\s*https?://\S+') -_US_PATENT_RE = re.compile(r'(?i)^US\s+Patent') -_BOOK_CHAPTER_DOI_RE = re.compile(r'\.ch\d+$') +_COLON_SPACE_RE = re.compile(r"(\S):([A-Z])") +_HYPHEN_SPACE_RE = re.compile(r"(\w)- (?!and |or |to )") +_SPACE_HYPHEN_RE = re.compile(r"(\w) -(\w)") +_TRAILING_DASH_RE = re.compile(r"[\s][-\u2013]\s*$") +_SUBTITLE_WRAPPER_RE = re.compile(r":\s*-([^-]+)-\s*$") +_SPIRE_STRIP_RE = re.compile(r"\s*:\s*SPIRE\b.*$") +_OSF_DOI_RE = re.compile(r"^10\.31(219|234)/") +_DOI_VERSION_RE = re.compile(r"_v\d+$") +_LIPICS_PAGES_STRIP_RE = re.compile(r",\s*\d+:\s*\d+-\d+:\s*\d+\s*$") +_LIPICS_PAGES_EXTRACT_RE = re.compile(r",\s*(\d+:\s*\d+-\d+:\s*\d+)\s*$") +_PREPRINT_MARKER_RE = re.compile(r"\s*\[preprint\]\s*$", re.IGNORECASE) +_GECCO_RE = re.compile(r"\bgenetic and evolutionary computation conference\b", re.IGNORECASE) +_URL_IN_VENUE_RE = re.compile(r"https?://") +_URL_IN_VENUE_STRIP_RE = re.compile(r",?\s*https?://\S+") +_US_PATENT_RE = re.compile(r"(?i)^US\s+Patent") +_BOOK_CHAPTER_DOI_RE = re.compile(r"\.ch\d+$") # Repeated string literals used in the three-way fix pattern _GECCO_LOWER = "genetic and evolutionary computation conference" @@ -188,55 +185,55 @@ # Pre-compiled booktitle cleanup patterns (venue abbreviations, typos, spacing) _BOOKTITLE_FIXUPS: list[tuple[re.Pattern[str], str]] = [ # "on on " → "on " (duplicate preposition from ACM metadata) - (re.compile(r'\bon on\b'), 'on'), + (re.compile(r"\bon on\b"), "on"), # "of the YYYY on ACM" → "of the YYYY ACM" (Crossref 2024 ACM metadata gap) - (re.compile(r'of the (\d{4}) on (ACM|IEEE)\b'), r'of the \1 \2'), + (re.compile(r"of the (\d{4}) on (ACM|IEEE)\b"), r"of the \1 \2"), # "Nations of the Americas Chapter" → "North American Chapter" (NAACL 2025 Crossref error) - (re.compile(r'Nations of the Americas Chapter'), 'North American Chapter'), + (re.compile(r"Nations of the Americas Chapter"), "North American Chapter"), # "Health(SeGAH)" → "Health (SeGAH)" (missing space before acronym) - (re.compile(r'Health\(SeGAH\)'), 'Health (SeGAH)'), + (re.compile(r"Health\(SeGAH\)"), "Health (SeGAH)"), # "Intl Conf" → "International Conference" - (re.compile(r'\bIntl Conf\b'), 'International Conference'), + (re.compile(r"\bIntl Conf\b"), "International Conference"), # "Int'l" → "International" - (re.compile(r"\bInt'l\b"), 'International'), + (re.compile(r"\bInt'l\b"), "International"), # "NeuriPS" → "NeurIPS" (venue typo from API sources) - (re.compile(r'\bNeuriPS\b'), 'NeurIPS'), + (re.compile(r"\bNeuriPS\b"), "NeurIPS"), # CHCCS publisher name used as venue → Graphics Interface conference - (re.compile(r'^Canada Human-Computer Communications Society$'), 'Graphics Interface'), + (re.compile(r"^Canada Human-Computer Communications Society$"), "Graphics Interface"), # "Conference On" → "Conference on" (lowercase preposition; must run before truncation completions) - (re.compile(r'\bConference On\b'), 'Conference on'), + (re.compile(r"\bConference On\b"), "Conference on"), # "YYYY ACM on Conference" → "YYYY ACM Conference" (Crossref spurious "on") - (re.compile(r'(\d{4}) ACM on ([A-Z])'), r'\1 ACM \2'), + (re.compile(r"(\d{4}) ACM on ([A-Z])"), r"\1 ACM \2"), # "of the YYYY on Innovation" → "of the YYYY ACM Conference on Innovation" (ITiCSE gap) - (re.compile(r'of the (\d{4}) on Innovation'), r'of the \1 ACM Conference on Innovation'), + (re.compile(r"of the (\d{4}) on Innovation"), r"of the \1 ACM Conference on Innovation"), # "ITiCSE'NN: Proceedings..." prefix → strip non-standard prefix - (re.compile(r"ITiCSE'\d{2}:\s*"), ''), + (re.compile(r"ITiCSE'\d{2}:\s*"), ""), # "SEET-Software" → "SEET - Software" (missing spaces around dash) - (re.compile(r'^SEET-Software'), 'SEET - Software'), + (re.compile(r"^SEET-Software"), "SEET - Software"), # Truncated SerpAPI booktitles — complete known conference name suffixes - (re.compile(r'Conference on Innovation$'), 'Conference on Innovation and Technology in Computer Science Education'), - (re.compile(r'Applications of Computer$'), 'Applications of Computer Vision'), - (re.compile(r'Analyzing and Interpreting$'), 'Analyzing and Interpreting Neural Networks for NLP'), - (re.compile(r'Conference on Persuasive$'), 'Conference on Persuasive Technology'), + (re.compile(r"Conference on Innovation$"), "Conference on Innovation and Technology in Computer Science Education"), + (re.compile(r"Applications of Computer$"), "Applications of Computer Vision"), + (re.compile(r"Analyzing and Interpreting$"), "Analyzing and Interpreting Neural Networks for NLP"), + (re.compile(r"Conference on Persuasive$"), "Conference on Persuasive Technology"), # FAccT: "Fairness Accountability and Transparency" → commas - (re.compile(r'Fairness Accountability and Transparency'), 'Fairness, Accountability, and Transparency'), + (re.compile(r"Fairness Accountability and Transparency"), "Fairness, Accountability, and Transparency"), # "Conference Information" → "Conference on Information" (missing "on") - (re.compile(r'Conference Information Visualisation'), 'Conference on Information Visualisation'), + (re.compile(r"Conference Information Visualisation"), "Conference on Information Visualisation"), # "YYYY the Nth" → "YYYY The Nth" (capitalize after year) - (re.compile(r'(\d{4}) the (\d)'), r'\1 The \2'), + (re.compile(r"(\d{4}) the (\d)"), r"\1 The \2"), # "Conference: (VTC" → "Conference (VTC" (stray colon before acronym) - (re.compile(r'Conference: \('), 'Conference ('), + (re.compile(r"Conference: \("), "Conference ("), # "Persuasive Technology PERSUASIVE YYYY" → strip redundant acronym - (re.compile(r'(Persuasive Technology(?:\s+Adjunct)?),?\s+PERSUASIVE(?:\s+\d{4})?$'), r'\1'), + (re.compile(r"(Persuasive Technology(?:\s+Adjunct)?),?\s+PERSUASIVE(?:\s+\d{4})?$"), r"\1"), # Truncated "\& International..." suffix → strip - (re.compile(r'\s*\\?&\s*International$'), ''), + (re.compile(r"\s*\\?&\s*International$"), ""), ] def _apply_booktitle_fixups(bt: str) -> str: """Strip verbose conference metadata and apply pre-compiled booktitle cleanup patterns.""" if _VERBOSE_BOOKTITLE_RE.search(bt): - stripped = _VERBOSE_BOOKTITLE_RE.sub('', bt).rstrip(' ,') + stripped = _VERBOSE_BOOKTITLE_RE.sub("", bt).rstrip(" ,") if stripped: bt = stripped for pat, repl in _BOOKTITLE_FIXUPS: @@ -247,9 +244,9 @@ def _apply_booktitle_fixups(bt: str) -> str: def _fix_title_text(title: str) -> str: """Fix fused compounds, colon-space, hyphen-space, and acronym case.""" result = _fix_fused_compounds(title) - result = _COLON_SPACE_RE.sub(r'\1: \2', result) - result = _HYPHEN_SPACE_RE.sub(r'\1-', result) - result = _SPACE_HYPHEN_RE.sub(r'\1-\2', result) + result = _COLON_SPACE_RE.sub(r"\1: \2", result) + result = _HYPHEN_SPACE_RE.sub(r"\1-", result) + result = _SPACE_HYPHEN_RE.sub(r"\1-\2", result) for acr_pat, acr_repl in _ACRONYM_CASE_PATTERNS: result = acr_pat.sub(acr_repl, result) return result @@ -282,7 +279,7 @@ def _is_corrupted_title(title: str) -> bool: Matches patterns like "Li2 ()" -- author name + numeric affiliation + empty parens. """ - return len(re.findall(r'\b[A-Z][a-z]+\d+\s*\(\)', title)) >= 2 + return len(re.findall(r"\b[A-Z][a-z]+\d+\s*\(\)", title)) >= 2 def _fix_fused_compounds(title: str) -> str: @@ -305,7 +302,7 @@ def _fix_fused_compounds(title: str) -> str: # Pass 2: Suffix-based detection for remaining fused compounds. # Matches title-cased words: [A-Z][a-z]{2,} prefix + known compound suffix. for sfx_pat in _COMPOUND_SUFFIX_PATTERNS: - result = sfx_pat.sub(lambda m: m.group(1) + '-' + m.group(2).capitalize(), result) + result = sfx_pat.sub(lambda m: m.group(1) + "-" + m.group(2).capitalize(), result) # Pass 3: Dictionary again (suffix pass may expose new \b boundaries) for pattern, replacement in _FUSED_DICT_PATTERNS: result = pattern.sub(replacement, result) @@ -344,7 +341,7 @@ def _fixup_bib_entry(entry: dict[str, Any]) -> bool: bt_lower = fields["booktitle"].strip().lower() jnp_match = next((j for j in JOURNALS_NAMED_PROCEEDINGS if bt_lower.startswith(j)), None) if jnp_match: - suffix = bt_lower[len(jnp_match):].lstrip(" /,") + suffix = bt_lower[len(jnp_match) :].lstrip(" /,") if not any(kw in suffix for kw in ("conference", "workshop", "symposium")): fields["journal"] = fields.pop("booktitle") entry["type"] = "article" @@ -359,22 +356,31 @@ def _fixup_bib_entry(entry: dict[str, Any]) -> bool: changed = True # Downgrade @inproceedings with repository as booktitle → @misc - if (entry.get("type") == "inproceedings" and fields.get("booktitle") - and any(rj in fields["booktitle"].lower() for rj in REPOSITORY_AS_JOURNAL)): + if ( + entry.get("type") == "inproceedings" + and fields.get("booktitle") + and any(rj in fields["booktitle"].lower() for rj in REPOSITORY_AS_JOURNAL) + ): entry["type"] = "misc" fields.pop("booktitle", None) changed = True # Downgrade @article with repository as journal → @misc - if (entry.get("type") == "article" and fields.get("journal") - and any(rj in fields["journal"].lower() for rj in REPOSITORY_AS_JOURNAL)): + if ( + entry.get("type") == "article" + and fields.get("journal") + and any(rj in fields["journal"].lower() for rj in REPOSITORY_AS_JOURNAL) + ): entry["type"] = "misc" fields.pop("journal", None) changed = True # Downgrade @inproceedings with "Preprint" as booktitle → @misc - if (entry.get("type") == "inproceedings" and fields.get("booktitle") - and fields["booktitle"].strip().lower() == "preprint"): + if ( + entry.get("type") == "inproceedings" + and fields.get("booktitle") + and fields["booktitle"].strip().lower() == "preprint" + ): entry["type"] = "misc" fields.pop("booktitle", None) changed = True @@ -398,14 +404,17 @@ def _fixup_bib_entry(entry: dict[str, Any]) -> bool: changed = True # Reclassify @inproceedings with "Handbook" in booktitle → @incollection - if (entry.get("type") == "inproceedings" and fields.get("booktitle") - and "handbook" in fields["booktitle"].lower()): + if entry.get("type") == "inproceedings" and fields.get("booktitle") and "handbook" in fields["booktitle"].lower(): entry["type"] = "incollection" changed = True # Reclassify @article with book-chapter DOI pattern → @incollection - if (entry.get("type") == "article" and fields.get("journal") and fields.get("doi") - and _BOOK_CHAPTER_DOI_RE.search(fields["doi"].strip())): + if ( + entry.get("type") == "article" + and fields.get("journal") + and fields.get("doi") + and _BOOK_CHAPTER_DOI_RE.search(fields["doi"].strip()) + ): fields["booktitle"] = fields.pop("journal") entry["type"] = "incollection" changed = True @@ -424,7 +433,7 @@ def _fixup_bib_entry(entry: dict[str, Any]) -> bool: # Strip [preprint] marker from title title = fields.get("title", "") if isinstance(title, str) and _PREPRINT_MARKER_RE.search(title): - fields["title"] = _PREPRINT_MARKER_RE.sub('', title).strip() + fields["title"] = _PREPRINT_MARKER_RE.sub("", title).strip() changed = True # Fix fused compounds, colon-space, hyphen-space, and acronym case @@ -447,7 +456,7 @@ def _fixup_bib_entry(entry: dict[str, Any]) -> bool: for url_field in ("booktitle", "journal"): url_val = (fields.get(url_field) or "").strip() if url_val and _URL_IN_VENUE_RE.search(url_val): - url_cleaned = _URL_IN_VENUE_STRIP_RE.sub('', url_val).strip().rstrip(',') + url_cleaned = _URL_IN_VENUE_STRIP_RE.sub("", url_val).strip().rstrip(",") if url_cleaned and url_cleaned != url_val: fields[url_field] = url_cleaned changed = True @@ -496,13 +505,13 @@ def _fixup_bib_entry(entry: dict[str, Any]) -> bool: for _td_field in ("booktitle", "title"): _td_val = (fields.get(_td_field) or "").strip() if _td_val and _TRAILING_DASH_RE.search(_td_val): - fields[_td_field] = _TRAILING_DASH_RE.sub('', _td_val) + fields[_td_field] = _TRAILING_DASH_RE.sub("", _td_val) changed = True # Strip ": -...-" subtitle wrapper artifact from title title = fields.get("title", "") if isinstance(title, str) and ": -" in title: - cleaned = _SUBTITLE_WRAPPER_RE.sub(r': \1', title) + cleaned = _SUBTITLE_WRAPPER_RE.sub(r": \1", title) if cleaned != title: fields["title"] = cleaned changed = True @@ -510,7 +519,7 @@ def _fixup_bib_entry(entry: dict[str, Any]) -> bool: # Strip SPIRE-style proceedings garbage suffix from booktitle bt_spire = (fields.get("booktitle") or "").strip() if bt_spire: - bt_cleaned = _SPIRE_STRIP_RE.sub('', bt_spire) + bt_cleaned = _SPIRE_STRIP_RE.sub("", bt_spire) if bt_cleaned != bt_spire: fields["booktitle"] = bt_cleaned changed = True @@ -518,7 +527,7 @@ def _fixup_bib_entry(entry: dict[str, Any]) -> bool: # Strip _v[N] version suffix from OSF/PsyArXiv DOIs doi_val = (fields.get("doi") or "").strip() if doi_val and _OSF_DOI_RE.match(doi_val): - doi_stripped = _DOI_VERSION_RE.sub('', doi_val) + doi_stripped = _DOI_VERSION_RE.sub("", doi_val) if doi_stripped != doi_val: fields["doi"] = doi_stripped changed = True @@ -529,7 +538,7 @@ def _fixup_bib_entry(entry: dict[str, Any]) -> bool: # Remove pages field that contains no digits (location strings, not page numbers) pg = (fields.get("pages") or "").strip() - if pg and not re.search(r'\d', pg): + if pg and not re.search(r"\d", pg): del fields["pages"] changed = True @@ -542,13 +551,13 @@ def _fixup_bib_entry(entry: dict[str, Any]) -> bool: # Strip page numbers embedded in booktitle (e.g., ", 17: 1-17: 18" from LIPIcs) bt_pages = (fields.get("booktitle") or "").strip() if bt_pages: - bt_clean = _LIPICS_PAGES_STRIP_RE.sub('', bt_pages) + bt_clean = _LIPICS_PAGES_STRIP_RE.sub("", bt_pages) if bt_clean != bt_pages: fields["booktitle"] = bt_clean if not fields.get("pages"): pages_match = _LIPICS_PAGES_EXTRACT_RE.search(bt_pages) if pages_match: - fields["pages"] = pages_match.group(1).replace(' ', '') + fields["pages"] = pages_match.group(1).replace(" ", "") changed = True # Strip duplicate "Proceedings of the" wrapper from booktitle @@ -578,19 +587,13 @@ def _entry_is_complete(entry: dict[str, Any]) -> bool: author = fields.get("author") or "" year = fields.get("year") or "" doi = fields.get("doi") - has_venue = any( - fields.get(v) and not has_placeholder(str(fields.get(v))) - for v in ("journal", "booktitle") - ) + has_venue = any(fields.get(v) and not has_placeholder(str(fields.get(v))) for v in ("journal", "booktitle")) # Determine completeness: check essential fields, venue, DOI, and preprint status doi_is_preprint = False journal_is_preprint = False - has_essentials = all( - fields.get(k) and not has_placeholder(str(fields.get(k))) - for k in ("title", "author", "year") - ) + has_essentials = all(fields.get(k) and not has_placeholder(str(fields.get(k))) for k in ("title", "author", "year")) has_doi = bool(doi) and not has_placeholder(str(doi)) if has_essentials and has_venue and has_doi: @@ -606,8 +609,11 @@ def _entry_is_complete(entry: dict[str, Any]) -> bool: venue_is_generic = bt_val in GENERIC_SERIES_NAMES and not fields.get("journal") result = ( - has_essentials and has_venue and has_doi - and not doi_is_preprint and not journal_is_preprint + has_essentials + and has_venue + and has_doi + and not doi_is_preprint + and not journal_is_preprint and not venue_is_generic ) @@ -648,9 +654,7 @@ def _revert_misattributed_doi( merged_fields.pop("doi", None) merged_fields.pop("url", None) logger.debug( - f"DOI_REVERT | removed={bad_doi}" - f" | restored={fallback or 'none'}" - f" | reason=misattributed_candidate", + f"DOI_REVERT | removed={bad_doi} | restored={fallback or 'none'} | reason=misattributed_candidate", category=LogCategory.DEDUP, ) @@ -693,9 +697,7 @@ def _try_multiple_candidates( # Collect DOI from every parsed candidate for dedup if seen_dois is not None: - cand_doi = idu.normalize_doi( - (candidate_dict.get("fields") or {}).get("doi", "") - ) + cand_doi = idu.normalize_doi((candidate_dict.get("fields") or {}).get("doi", "")) if cand_doi: seen_dois.add(cand_doi) @@ -705,7 +707,8 @@ def _try_multiple_candidates( flags[flag_key] = True logger.success( "Match validated and added to enrichment", - category=LogCategory.MATCH, source=source_name, + category=LogCategory.MATCH, + source=source_name, ) return True, candidate @@ -742,7 +745,8 @@ def process_article( # Determine IDs; Scholar may provide multiple identifiers citation_id = art.get("citation_id") or art.get("result_id") cluster_id = art.get("cluster_id") or ( - art.get("result_id") if citation_id and art.get("result_id") != citation_id else None) + art.get("result_id") if citation_id and art.get("result_id") != citation_id else None + ) result_id = citation_id or re.sub(r"\W+", "_", title or "untitled") flags = { "scholar_bib": False, @@ -823,15 +827,15 @@ def process_article( for filename in bib_files: file_path = os.path.join(author_dir, filename) try: - with open(file_path, encoding='utf-8') as f: + with open(file_path, encoding="utf-8") as f: existing_bib = f.read() existing_entry = bt.parse_bibtex_to_dict(existing_bib) # Check if this file matches our article by comparing title if existing_entry: - existing_title = existing_entry.get('fields', {}).get('title', '') + existing_title = existing_entry.get("fields", {}).get("title", "") if isinstance(existing_title, list): - existing_title = existing_title[0] if existing_title else '' + existing_title = existing_title[0] if existing_title else "" # Purge stale files whose titles now fail validation if _is_garbage_title(existing_title) or _is_corrupted_title(existing_title): @@ -849,7 +853,8 @@ def process_article( existing_file_loaded = True logger.info( f"Using existing BibTeX as baseline: {filename}", - category=LogCategory.ARTICLE, source=LogSource.SYSTEM + category=LogCategory.ARTICLE, + source=LogSource.SYSTEM, ) is_complete = _entry_is_complete(existing_entry) logger.debug( @@ -889,10 +894,10 @@ def process_article( # Strip email addresses from author field _bl_author = _bl_fields.get("author", "") - if isinstance(_bl_author, str) and re.search(r'\S+@\S+\.\S+', _bl_author): - _bl_author_clean = re.sub(r'\s*\S+@\S+\.\S+', '', _bl_author).strip() - _bl_author_clean = re.sub(r'\s*and\s*$', '', _bl_author_clean).strip() - _bl_author_clean = re.sub(r'^\s*and\s*', '', _bl_author_clean).strip() + if isinstance(_bl_author, str) and re.search(r"\S+@\S+\.\S+", _bl_author): + _bl_author_clean = re.sub(r"\s*\S+@\S+\.\S+", "", _bl_author).strip() + _bl_author_clean = re.sub(r"\s*and\s*$", "", _bl_author_clean).strip() + _bl_author_clean = re.sub(r"^\s*and\s*", "", _bl_author_clean).strip() if _bl_author_clean: logger.debug( f"EXISTING_FIXUP | email_stripped_from_author | old={_bl_author[:60]}", @@ -904,7 +909,7 @@ def process_article( # Strip [J] bracket artifacts from title _bl_title = _bl_fields.get("title", "") if isinstance(_bl_title, str) and _BRACKET_J_RE.search(_bl_title): - _bl_fields["title"] = _BRACKET_J_RE.sub('', _bl_title).strip() + _bl_fields["title"] = _BRACKET_J_RE.sub("", _bl_title).strip() logger.debug( f"EXISTING_FIXUP | bracket_artifact_stripped | title={_bl_title[:60]}", category=LogCategory.CLEANUP, @@ -958,13 +963,13 @@ def process_article( # Strip trailing dash/en-dash from title (truncation artifact) _bl_title_td = (_bl_fields.get("title") or "").strip() if _bl_title_td and _TRAILING_DASH_RE.search(_bl_title_td): - _bl_fields["title"] = _TRAILING_DASH_RE.sub('', _bl_title_td) + _bl_fields["title"] = _TRAILING_DASH_RE.sub("", _bl_title_td) _fixup_written = True # Strip ": -...-" subtitle wrapper artifact from title _bl_title_sw = (_bl_fields.get("title") or "").strip() if isinstance(_bl_title_sw, str) and ": -" in _bl_title_sw: - _cleaned_sw = _SUBTITLE_WRAPPER_RE.sub(r': \1', _bl_title_sw) + _cleaned_sw = _SUBTITLE_WRAPPER_RE.sub(r": \1", _bl_title_sw) if _cleaned_sw != _bl_title_sw: _bl_fields["title"] = _cleaned_sw _fixup_written = True @@ -972,7 +977,7 @@ def process_article( # Strip SPIRE-style proceedings garbage suffix from booktitle _ex_bt_spire = (_bl_fields.get("booktitle") or "").strip() if _ex_bt_spire: - _ex_bt_cleaned = _SPIRE_STRIP_RE.sub('', _ex_bt_spire) + _ex_bt_cleaned = _SPIRE_STRIP_RE.sub("", _ex_bt_spire) if _ex_bt_cleaned != _ex_bt_spire: _bl_fields["booktitle"] = _ex_bt_cleaned _fixup_written = True @@ -980,7 +985,7 @@ def process_article( # Strip _v[N] version suffix from OSF/PsyArXiv DOIs _ex_doi_val = (_bl_fields.get("doi") or "").strip() if _ex_doi_val and _OSF_DOI_RE.match(_ex_doi_val): - _ex_doi_stripped = _DOI_VERSION_RE.sub('', _ex_doi_val) + _ex_doi_stripped = _DOI_VERSION_RE.sub("", _ex_doi_val) if _ex_doi_stripped != _ex_doi_val: _bl_fields["doi"] = _ex_doi_stripped _fixup_written = True @@ -997,13 +1002,13 @@ def process_article( # Strip page numbers embedded in booktitle (LIPIcs style) _ex_bt_pg = (_bl_fields.get("booktitle") or "").strip() if _ex_bt_pg: - _ex_bt_pg_clean = _LIPICS_PAGES_STRIP_RE.sub('', _ex_bt_pg) + _ex_bt_pg_clean = _LIPICS_PAGES_STRIP_RE.sub("", _ex_bt_pg) if _ex_bt_pg_clean != _ex_bt_pg: _bl_fields["booktitle"] = _ex_bt_pg_clean if not _bl_fields.get("pages"): _pg_m = _LIPICS_PAGES_EXTRACT_RE.search(_ex_bt_pg) if _pg_m: - _bl_fields["pages"] = _pg_m.group(1).replace(' ', '') + _bl_fields["pages"] = _pg_m.group(1).replace(" ", "") _fixup_written = True # Strip duplicate "Proceedings of the" wrapper @@ -1040,8 +1045,11 @@ def process_article( _fixup_written = True # Reclassify @article with "Unpublished" journal → @misc - if (baseline_entry.get("type") == "article" and _bl_fields.get("journal") - and _bl_fields["journal"].strip().lower() == "unpublished"): + if ( + baseline_entry.get("type") == "article" + and _bl_fields.get("journal") + and _bl_fields["journal"].strip().lower() == "unpublished" + ): logger.debug( "EXISTING_FIXUP | article_unpublished->misc", category=LogCategory.CLEANUP, @@ -1052,8 +1060,11 @@ def process_article( _fixup_written = True # Reclassify @article with patent number as journal → @misc - if (baseline_entry.get("type") == "article" and _bl_fields.get("journal") - and _US_PATENT_RE.match(_bl_fields["journal"].strip())): + if ( + baseline_entry.get("type") == "article" + and _bl_fields.get("journal") + and _US_PATENT_RE.match(_bl_fields["journal"].strip()) + ): logger.debug( f"EXISTING_FIXUP | article_patent->misc | journal={_bl_fields['journal'][:60]}", category=LogCategory.CLEANUP, @@ -1063,8 +1074,11 @@ def process_article( _fixup_written = True # Downgrade @article with repository/portal as journal → @misc - if (baseline_entry.get("type") == "article" and _bl_fields.get("journal") - and any(rj in _bl_fields["journal"].lower() for rj in REPOSITORY_AS_JOURNAL)): + if ( + baseline_entry.get("type") == "article" + and _bl_fields.get("journal") + and any(rj in _bl_fields["journal"].lower() for rj in REPOSITORY_AS_JOURNAL) + ): logger.debug( f"EXISTING_FIXUP | article_repository->misc | journal={_bl_fields['journal'][:60]}", category=LogCategory.CLEANUP, @@ -1115,7 +1129,7 @@ def process_article( _jnp_bt = _bl_fields["booktitle"].strip().lower() _jnp_match = next((j for j in JOURNALS_NAMED_PROCEEDINGS if _jnp_bt.startswith(j)), None) if _jnp_match: - _jnp_suffix = _jnp_bt[len(_jnp_match):].lstrip(" /,") + _jnp_suffix = _jnp_bt[len(_jnp_match) :].lstrip(" /,") if not any(kw in _jnp_suffix for kw in ("conference", "workshop", "symposium")): logger.debug( f"EXISTING_FIXUP | inproceedings_journal_proceedings->article | booktitle={_jnp_bt[:60]}", @@ -1138,8 +1152,11 @@ def process_article( _fixup_written = True # Downgrade @inproceedings with repository as booktitle → @misc - if (baseline_entry.get("type") == "inproceedings" and _bl_fields.get("booktitle") - and any(rj in _bl_fields["booktitle"].lower() for rj in REPOSITORY_AS_JOURNAL)): + if ( + baseline_entry.get("type") == "inproceedings" + and _bl_fields.get("booktitle") + and any(rj in _bl_fields["booktitle"].lower() for rj in REPOSITORY_AS_JOURNAL) + ): logger.debug( f"EXISTING_FIXUP | inproceedings_repository->misc | booktitle={_bl_fields['booktitle'][:60]}", category=LogCategory.CLEANUP, @@ -1149,8 +1166,11 @@ def process_article( _fixup_written = True # Downgrade @inproceedings with "Preprint" as booktitle → @misc - if (baseline_entry.get("type") == "inproceedings" and _bl_fields.get("booktitle") - and _bl_fields["booktitle"].strip().lower() == "preprint"): + if ( + baseline_entry.get("type") == "inproceedings" + and _bl_fields.get("booktitle") + and _bl_fields["booktitle"].strip().lower() == "preprint" + ): logger.debug("EXISTING_FIXUP | inproceedings_preprint->misc", category=LogCategory.CLEANUP) baseline_entry["type"] = "misc" _bl_fields.pop("booktitle", None) @@ -1172,11 +1192,13 @@ def process_article( _fixup_written = True # Reclassify @inproceedings with "Handbook" in booktitle → @incollection - if (baseline_entry.get("type") == "inproceedings" and _bl_fields.get("booktitle") - and "handbook" in _bl_fields["booktitle"].lower()): + if ( + baseline_entry.get("type") == "inproceedings" + and _bl_fields.get("booktitle") + and "handbook" in _bl_fields["booktitle"].lower() + ): logger.debug( - f"EXISTING_FIXUP | inproceedings_handbook->incollection | " - f"booktitle={_bl_fields['booktitle'][:60]}", + f"EXISTING_FIXUP | inproceedings_handbook->incollection | booktitle={_bl_fields['booktitle'][:60]}", category=LogCategory.CLEANUP, ) baseline_entry["type"] = "incollection" @@ -1184,8 +1206,12 @@ def process_article( # Reclassify @article with book-chapter DOI pattern → @incollection _bl_doi_ch = (_bl_fields.get("doi") or "").strip() - if (baseline_entry.get("type") == "article" and _bl_fields.get("journal") - and _bl_doi_ch and _BOOK_CHAPTER_DOI_RE.search(_bl_doi_ch)): + if ( + baseline_entry.get("type") == "article" + and _bl_fields.get("journal") + and _bl_doi_ch + and _BOOK_CHAPTER_DOI_RE.search(_bl_doi_ch) + ): logger.debug( f"EXISTING_FIXUP | article_book_chapter->incollection | doi={_bl_doi_ch}", category=LogCategory.CLEANUP, @@ -1197,7 +1223,7 @@ def process_article( # Strip [preprint] marker from title _bl_title_pp = _bl_fields.get("title", "") if isinstance(_bl_title_pp, str) and _PREPRINT_MARKER_RE.search(_bl_title_pp): - _bl_fields["title"] = _PREPRINT_MARKER_RE.sub('', _bl_title_pp).strip() + _bl_fields["title"] = _PREPRINT_MARKER_RE.sub("", _bl_title_pp).strip() _fixup_written = True # Fix fused compounds, colon-space, hyphen-space, and acronym case @@ -1220,7 +1246,7 @@ def process_article( for _url_field in ("booktitle", "journal"): _url_val = (_bl_fields.get(_url_field) or "").strip() if _url_val and _URL_IN_VENUE_RE.search(_url_val): - _url_cleaned = _URL_IN_VENUE_STRIP_RE.sub('', _url_val).strip().rstrip(',') + _url_cleaned = _URL_IN_VENUE_STRIP_RE.sub("", _url_val).strip().rstrip(",") if _url_cleaned and _url_cleaned != _url_val: _bl_fields[_url_field] = _url_cleaned _fixup_written = True @@ -1240,8 +1266,9 @@ def process_article( if _bl_title_venue: _bl_journal_venue = (_bl_fields.get("journal") or "").strip().lower() _bl_booktitle_venue = (_bl_fields.get("booktitle") or "").strip().lower() - if (_bl_journal_venue and _bl_title_venue == _bl_journal_venue) or \ - (_bl_booktitle_venue and _bl_title_venue == _bl_booktitle_venue): + if (_bl_journal_venue and _bl_title_venue == _bl_journal_venue) or ( + _bl_booktitle_venue and _bl_title_venue == _bl_booktitle_venue + ): logger.debug( f"EXISTING_FIXUP | title_is_venue | title={_bl_title_venue[:60]} | deleting", category=LogCategory.CLEANUP, @@ -1251,11 +1278,13 @@ def process_article( return 0 # Remove preprint DOI from @article that has a real journal+volume/pages - if (baseline_entry.get("type") == "article" - and _bl_fields.get("journal") - and _bl_fields.get("doi") - and idu.is_secondary_doi(_bl_fields["doi"]) - and (_bl_fields.get("volume") or _bl_fields.get("pages"))): + if ( + baseline_entry.get("type") == "article" + and _bl_fields.get("journal") + and _bl_fields.get("doi") + and idu.is_secondary_doi(_bl_fields["doi"]) + and (_bl_fields.get("volume") or _bl_fields.get("pages")) + ): logger.debug( f"EXISTING_FIXUP | remove_preprint_doi_from_article" f" | doi={_bl_fields['doi']} | journal={_bl_fields['journal'][:40]}", @@ -1272,7 +1301,7 @@ def process_article( if _inferred_hp: _bl_fields["howpublished"] = _inferred_hp _fixup_written = True - elif ((_bl_fields.get("archiveprefix") or "").lower() == "arxiv"): + elif (_bl_fields.get("archiveprefix") or "").lower() == "arxiv": _bl_fields["howpublished"] = "arXiv" _fixup_written = True @@ -1315,14 +1344,9 @@ def process_article( bl_fields = baseline_entry.get("fields") or {} bl_pub = (bl_fields.get("publisher") or "").lower().strip() bl_jnl = (bl_fields.get("journal") or "").lower() - if ( - bl_pub in PREPRINT_ONLY_PUBLISHERS - and bl_jnl - and not any(ps in bl_jnl for ps in PREPRINT_SERVERS) - ): + if bl_pub in PREPRINT_ONLY_PUBLISHERS and bl_jnl and not any(ps in bl_jnl for ps in PREPRINT_SERVERS): logger.debug( - f"EXISTING_FIXUP | publisher_stripped={bl_fields['publisher']} " - f"| journal={bl_fields.get('journal')}", + f"EXISTING_FIXUP | publisher_stripped={bl_fields['publisher']} | journal={bl_fields.get('journal')}", category=LogCategory.CLEANUP, ) bl_fields.pop("publisher", None) @@ -1365,11 +1389,7 @@ def process_article( if baseline_entry is None: # Parse failed - should be rare since we generated the BibTeX logger.error("Failed to parse Scholar BibTeX; using minimal fallback structure", category=LogCategory.ERROR) - baseline_entry = { - "type": "misc", - "key": result_id or "entry", - "fields": {"title": title} if title else {} - } + baseline_entry = {"type": "misc", "key": result_id or "entry", "fields": {"title": title} if title else {}} _bl_source = "scholar_minimal" else: _bl_source = "existing_file" @@ -1390,10 +1410,8 @@ def process_article( ax_from_snip = idu.find_arxiv_in_text(snippet) # Collect all link URLs from the article metadata - link_texts: list[str] = [ - str(art[k]) for k in ("link", "link_to_pdf") if art.get(k) - ] - for r in (art.get("resources") or []): + link_texts: list[str] = [str(art[k]) for k in ("link", "link_to_pdf") if art.get(k)] + for r in art.get("resources") or []: if isinstance(r, dict): for lk in ("link", "file_link", "url"): if r.get(lk): @@ -1427,9 +1445,7 @@ def process_article( pass baseline_entry["fields"] = bf ck = ( - bt.build_standard_citekey(baseline_entry, gemini_api_key=gemini_api_key) - or baseline_entry.get("key") - or "Entry" + bt.build_standard_citekey(baseline_entry, gemini_api_key=gemini_api_key) or baseline_entry.get("key") or "Entry" ) baseline_entry["key"] = ck @@ -1437,9 +1453,7 @@ def process_article( if existing_file_loaded: # Remove existing files outside the contribution window if min_year > 0 and existing_file_path: - ex_year = extract_year_from_any( - (baseline_entry or {}).get("fields", {}).get("year"), fallback=0 - ) or 0 + ex_year = extract_year_from_any((baseline_entry or {}).get("fields", {}).get("year"), fallback=0) or 0 if 0 < ex_year < min_year: logger.info( f"Removing out-of-window existing file (year={ex_year} < {min_year}): " @@ -1458,12 +1472,16 @@ def process_article( path = None logger.info( "Baseline deferred (no DOI; will write after enrichment)", - category=LogCategory.SKIP, source=LogSource.SYSTEM, + category=LogCategory.SKIP, + source=LogSource.SYSTEM, ) else: path, was_written = mu.save_entry_to_file( - out_dir, effective_id, baseline_entry, - gemini_api_key=gemini_api_key, author_name=rec.name, + out_dir, + effective_id, + baseline_entry, + gemini_api_key=gemini_api_key, + author_name=rec.name, ) if was_written: logger.success(f"Saved baseline: {path}", category=LogCategory.SAVE, source=LogSource.SYSTEM) @@ -1473,7 +1491,8 @@ def process_article( # Skip enrichment entirely to avoid churn. logger.info( f"Baseline duplicate detected; skipping enrichment: {path}", - category=LogCategory.SKIP, source=LogSource.SYSTEM, + category=LogCategory.SKIP, + source=LogSource.SYSTEM, ) if summary_csv_path and path: try: @@ -1505,9 +1524,7 @@ def process_article( doi_early = idu.normalize_doi(bf.get("doi")) if doi_early: logger.info(f"Validating DOI: {doi_early}", category=LogCategory.SEARCH, source=LogSource.DOI) - doi_matched = process_validated_doi( - doi_early, baseline_entry, result_id, enr_list, flags - ) + doi_matched = process_validated_doi(doi_early, baseline_entry, result_id, enr_list, flags) # If DOI failed validation, stash it for Phase 3 and remove from baseline if not doi_matched: @@ -1515,14 +1532,14 @@ def process_article( bf.pop("doi", None) logger.warn( "DOI validation failed, removed from baseline (will retry in Phase 3)", - category=LogCategory.ARTICLE, source=LogSource.DOI, + category=LogCategory.ARTICLE, + source=LogSource.DOI, ) else: doi_validated = True logger.success("DOI validated successfully", category=LogCategory.MATCH, source=LogSource.DOI) logger.debug( - f"PHASE1_RESULT | doi={doi_early} | validated={doi_validated} " - f"| stashed={unvalidated_doi is not None}", + f"PHASE1_RESULT | doi={doi_early} | validated={doi_validated} | stashed={unvalidated_doi is not None}", category=LogCategory.AUDIT, ) except PARSE_ERRORS: @@ -1554,12 +1571,14 @@ def process_article( flags["scholar_page"] = True logger.success( "Match validated and added to enrichment", - category=LogCategory.MATCH, source=LogSource.SCHOLAR, + category=LogCategory.MATCH, + source=LogSource.SCHOLAR, ) else: logger.info( "Citation did not match baseline", - category=LogCategory.SKIP, source=LogSource.SCHOLAR, + category=LogCategory.SKIP, + source=LogSource.SCHOLAR, ) else: logger.info("No BibTeX generated", category=LogCategory.SKIP, source=LogSource.SCHOLAR) @@ -1586,7 +1605,7 @@ def process_article( flags, "s2", max_candidates=5, - seen_dois=all_candidate_dois + seen_dois=all_candidate_dois, ) if s2_paper: s2_id = s2_paper.get("paperId") @@ -1756,7 +1775,8 @@ def process_article( if parsed_pub.venue_type in ("journal", "conference"): try: cr_venue_items = crossref_search_by_venue( - title, rec.name, + title, + rec.name, container_title=parsed_pub.venue_name, max_results=5, ) @@ -1776,14 +1796,16 @@ def process_article( except ALL_API_ERRORS as e: logger.warn( f"Venue-based Crossref error: {e}", - category=LogCategory.ERROR, source=LogSource.CROSSREF, + category=LogCategory.ERROR, + source=LogSource.CROSSREF, ) # Tier 1: venue-based OpenAlex search (only if Crossref missed) if not enr_list and parsed_pub.venue_type in ("journal", "conference"): try: oa_venue_items = openalex_search_by_venue( - title, rec.name, + title, + rec.name, venue_name=parsed_pub.venue_name, max_results=5, ) @@ -1803,7 +1825,8 @@ def process_article( except ALL_API_ERRORS as e: logger.warn( f"Venue-based OpenAlex error: {e}", - category=LogCategory.ERROR, source=LogSource.OPENALEX, + category=LogCategory.ERROR, + source=LogSource.OPENALEX, ) # ===== PHASE 3: Late DOI Discovery ===== @@ -1821,7 +1844,8 @@ def process_article( if run_phase3: logger.info( "Extracting DOI candidates from enrichment sources", - category=LogCategory.SEARCH, source=LogSource.DOI, + category=LogCategory.SEARCH, + source=LogSource.DOI, ) try: doi_candidates: list[str] = [] @@ -1831,8 +1855,7 @@ def _add_doi(source: str, doi: str | None) -> None: if doi: doi_candidates.append(str(doi)) logger.debug( - f"DOI_CANDIDATE | source={source} | doi={doi} " - f"| is_secondary={idu.is_secondary_doi(str(doi))}", + f"DOI_CANDIDATE | source={source} | doi={doi} | is_secondary={idu.is_secondary_doi(str(doi))}", category=LogCategory.AUDIT, ) @@ -1915,6 +1938,7 @@ def _add_doi(source: str, doi: str | None) -> None: # Fall back to cached HTML scraping only if no DOI found yet if not doi_candidates: from src.cache import response_cache as _doi_cache + for u in filter(None, url_candidates): _u_str = str(u) _cached_doi = _doi_cache.get("doi_from_html", _u_str) @@ -1958,7 +1982,8 @@ def _add_doi(source: str, doi: str | None) -> None: if doi_candidates: logger.info( f"Found {len(doi_candidates)} DOI candidate(s): {', '.join(doi_candidates)}", - category=LogCategory.SEARCH, source=LogSource.DOI, + category=LogCategory.SEARCH, + source=LogSource.DOI, ) doi_matched = False @@ -1966,7 +1991,8 @@ def _add_doi(source: str, doi: str | None) -> None: for doi_idx, doi_candidate in enumerate(doi_candidates, 1): logger.info( f"Validating DOI candidate: {doi_candidate}", - category=LogCategory.SEARCH, source=LogSource.DOI, + category=LogCategory.SEARCH, + source=LogSource.DOI, ) # When a DOI was inferred from an enricher's arXiv eprint, # temporarily inject it into the baseline so DOI_EXACT match @@ -1981,9 +2007,7 @@ def _add_doi(source: str, doi: str | None) -> None: ) if _is_eprint_doi and not _bl_doi_before: bf["doi"] = doi_candidate - candidate_matched = process_validated_doi( - doi_candidate, baseline_entry, result_id, enr_list, flags - ) + candidate_matched = process_validated_doi(doi_candidate, baseline_entry, result_id, enr_list, flags) # Restore baseline DOI to avoid polluting later logic if _is_eprint_doi and not _bl_doi_before: bf.pop("doi", None) @@ -2002,7 +2026,8 @@ def _add_doi(source: str, doi: str | None) -> None: if not doi_matched: logger.warn( f"None of {len(doi_candidates)} DOI candidate(s) validated against baseline", - category=LogCategory.SKIP, source=LogSource.DOI, + category=LogCategory.SKIP, + source=LogSource.DOI, ) else: logger.info("No DOI discovered; skipped", category=LogCategory.SKIP, source=LogSource.DOI) @@ -2011,7 +2036,8 @@ def _add_doi(source: str, doi: str | None) -> None: else: logger.info( "DOI already validated early; skipping late DOI negotiation", - category=LogCategory.SKIP, source=LogSource.DOI, + category=LogCategory.SKIP, + source=LogSource.DOI, ) # ===== PHASE 4: Merge & Save ===== @@ -2060,7 +2086,7 @@ def _add_doi(source: str, doi: str | None) -> None: # Strip trailing ellipsis from truncated venue/title fields for _ell_field_p4 in ("journal", "booktitle", "title"): - _ell_val_p4 = (merged_fields.get(_ell_field_p4) or "") + _ell_val_p4 = merged_fields.get(_ell_field_p4) or "" if _ell_val_p4.rstrip().endswith(("...", "\u2026")): _ell_clean_p4 = _strip_ellipsis(_ell_val_p4) if _ell_clean_p4 != _ell_val_p4: @@ -2112,7 +2138,7 @@ def _add_doi(source: str, doi: str | None) -> None: _jnp_bt_lower = merged_fields["booktitle"].strip().lower() _jnp_match_p4 = next((j for j in JOURNALS_NAMED_PROCEEDINGS if _jnp_bt_lower.startswith(j)), None) if _jnp_match_p4: - _jnp_suffix_p4 = _jnp_bt_lower[len(_jnp_match_p4):].lstrip(" /,") + _jnp_suffix_p4 = _jnp_bt_lower[len(_jnp_match_p4) :].lstrip(" /,") if not any(kw in _jnp_suffix_p4 for kw in ("conference", "workshop", "symposium")): logger.debug( f"TYPE_CORRECT | inproceedings_journal_proceedings->article | booktitle={_jnp_bt_lower[:60]}", @@ -2145,8 +2171,11 @@ def _add_doi(source: str, doi: str | None) -> None: merged_fields.pop("journal", None) # Reclassify @article with "Unpublished" journal → @misc - if (merged.get("type") == "article" and merged_fields.get("journal") - and merged_fields["journal"].strip().lower() == "unpublished"): + if ( + merged.get("type") == "article" + and merged_fields.get("journal") + and merged_fields["journal"].strip().lower() == "unpublished" + ): logger.debug("TYPE_CORRECT | article_unpublished->misc", category=LogCategory.AUDIT) merged["type"] = "misc" merged_fields.pop("journal", None) @@ -2154,7 +2183,7 @@ def _add_doi(source: str, doi: str | None) -> None: # Strip URL fragments from booktitle (e.g., "proceedings.mlr.press") if merged.get("type") == "inproceedings" and merged_fields.get("booktitle"): _bt_val = merged_fields["booktitle"].strip() - if re.match(r'^https?://|^[\w.-]+\.(com|org|net|io|press)\b', _bt_val, re.IGNORECASE): + if re.match(r"^https?://|^[\w.-]+\.(com|org|net|io|press)\b", _bt_val, re.IGNORECASE): logger.debug( f"TYPE_CORRECT | inproceedings_url_booktitle->misc | booktitle={_bt_val[:60]}", category=LogCategory.AUDIT, @@ -2163,8 +2192,11 @@ def _add_doi(source: str, doi: str | None) -> None: merged_fields.pop("booktitle", None) # Downgrade @inproceedings with "Preprint" as booktitle → @misc - if (merged.get("type") == "inproceedings" and merged_fields.get("booktitle") - and merged_fields["booktitle"].strip().lower() == "preprint"): + if ( + merged.get("type") == "inproceedings" + and merged_fields.get("booktitle") + and merged_fields["booktitle"].strip().lower() == "preprint" + ): logger.debug("TYPE_CORRECT | inproceedings_preprint->misc", category=LogCategory.AUDIT) merged["type"] = "misc" merged_fields.pop("booktitle", None) @@ -2184,19 +2216,25 @@ def _add_doi(source: str, doi: str | None) -> None: merged_fields["journal"] = merged_fields.pop("booktitle") # Reclassify @inproceedings with "Handbook" in booktitle → @incollection - if (merged.get("type") == "inproceedings" and merged_fields.get("booktitle") - and "handbook" in merged_fields["booktitle"].lower()): + if ( + merged.get("type") == "inproceedings" + and merged_fields.get("booktitle") + and "handbook" in merged_fields["booktitle"].lower() + ): logger.debug( - f"TYPE_CORRECT | inproceedings_handbook->incollection | " - f"booktitle={merged_fields['booktitle'][:60]}", + f"TYPE_CORRECT | inproceedings_handbook->incollection | booktitle={merged_fields['booktitle'][:60]}", category=LogCategory.AUDIT, ) merged["type"] = "incollection" # Reclassify @article with book-chapter DOI pattern → @incollection _p4_doi_ch = (merged_fields.get("doi") or "").strip() - if (merged.get("type") == "article" and merged_fields.get("journal") - and _p4_doi_ch and _BOOK_CHAPTER_DOI_RE.search(_p4_doi_ch)): + if ( + merged.get("type") == "article" + and merged_fields.get("journal") + and _p4_doi_ch + and _BOOK_CHAPTER_DOI_RE.search(_p4_doi_ch) + ): logger.debug( f"TYPE_CORRECT | article_book_chapter->incollection | doi={_p4_doi_ch}", category=LogCategory.AUDIT, @@ -2205,8 +2243,11 @@ def _add_doi(source: str, doi: str | None) -> None: merged["type"] = "incollection" # Downgrade @article with repository/portal as journal → @misc - if (merged.get("type") == "article" and merged_fields.get("journal") - and any(rj in merged_fields["journal"].lower() for rj in REPOSITORY_AS_JOURNAL)): + if ( + merged.get("type") == "article" + and merged_fields.get("journal") + and any(rj in merged_fields["journal"].lower() for rj in REPOSITORY_AS_JOURNAL) + ): logger.debug( f"TYPE_CORRECT | article_repository->misc | journal={merged_fields['journal'][:60]}", category=LogCategory.AUDIT, @@ -2215,8 +2256,11 @@ def _add_doi(source: str, doi: str | None) -> None: merged_fields.pop("journal", None) # Downgrade @inproceedings with repository as booktitle → @misc - if (merged.get("type") == "inproceedings" and merged_fields.get("booktitle") - and any(rj in merged_fields["booktitle"].lower() for rj in REPOSITORY_AS_JOURNAL)): + if ( + merged.get("type") == "inproceedings" + and merged_fields.get("booktitle") + and any(rj in merged_fields["booktitle"].lower() for rj in REPOSITORY_AS_JOURNAL) + ): logger.debug( f"TYPE_CORRECT | inproceedings_repository->misc | booktitle={merged_fields['booktitle'][:60]}", category=LogCategory.AUDIT, @@ -2244,8 +2288,7 @@ def _add_doi(source: str, doi: str | None) -> None: # If article has real journal+volume/pages, keep as article but strip preprint DOI if venue and (merged_fields.get("volume") or merged_fields.get("pages")): logger.debug( - f"TYPE_CORRECT | remove_preprint_doi_from_article" - f" | doi={_merged_doi} | journal={venue[:40]}", + f"TYPE_CORRECT | remove_preprint_doi_from_article | doi={_merged_doi} | journal={venue[:40]}", category=LogCategory.AUDIT, ) merged_fields.pop("doi", None) @@ -2273,15 +2316,15 @@ def _add_doi(source: str, doi: str | None) -> None: if isinstance(_p4_title, str) and _p4_title: _p4_fixed = trim_title_default(_p4_title) # Strip [J] bracket artifact (citation format leak from Scholar) - _p4_fixed = _BRACKET_J_RE.sub('', _p4_fixed).strip() + _p4_fixed = _BRACKET_J_RE.sub("", _p4_fixed).strip() # Strip [preprint] marker from title text - _p4_fixed = _PREPRINT_MARKER_RE.sub('', _p4_fixed).strip() + _p4_fixed = _PREPRINT_MARKER_RE.sub("", _p4_fixed).strip() # Fix fused compounds, colon-space, hyphen-space, and acronym case _p4_fixed = _fix_title_text(_p4_fixed) # Strip trailing dash/en-dash (truncation artifact) - _p4_fixed = _TRAILING_DASH_RE.sub('', _p4_fixed) + _p4_fixed = _TRAILING_DASH_RE.sub("", _p4_fixed) # Strip ": -...-" subtitle wrapper artifact - _p4_fixed = _SUBTITLE_WRAPPER_RE.sub(r': \1', _p4_fixed) + _p4_fixed = _SUBTITLE_WRAPPER_RE.sub(r": \1", _p4_fixed) if _p4_fixed != _p4_title: merged_fields["title"] = _p4_fixed @@ -2318,14 +2361,14 @@ def _add_doi(source: str, doi: str | None) -> None: # Strip SPIRE-style proceedings garbage suffix from booktitle _p4_bt_spire = (merged_fields.get("booktitle") or "").strip() if _p4_bt_spire: - _p4_bt_cleaned = _SPIRE_STRIP_RE.sub('', _p4_bt_spire) + _p4_bt_cleaned = _SPIRE_STRIP_RE.sub("", _p4_bt_spire) if _p4_bt_cleaned != _p4_bt_spire: merged_fields["booktitle"] = _p4_bt_cleaned # Strip _v[N] version suffix from OSF/PsyArXiv DOIs _p4_doi_val = (merged_fields.get("doi") or "").strip() if _p4_doi_val and _OSF_DOI_RE.match(_p4_doi_val): - _p4_doi_stripped = _DOI_VERSION_RE.sub('', _p4_doi_val) + _p4_doi_stripped = _DOI_VERSION_RE.sub("", _p4_doi_val) if _p4_doi_stripped != _p4_doi_val: merged_fields["doi"] = _p4_doi_stripped _p4_url_val = (merged_fields.get("url") or "").strip() @@ -2340,13 +2383,13 @@ def _add_doi(source: str, doi: str | None) -> None: # Strip page numbers embedded in booktitle (LIPIcs style) _p4_bt_pg = (merged_fields.get("booktitle") or "").strip() if _p4_bt_pg: - _p4_bt_pg_clean = _LIPICS_PAGES_STRIP_RE.sub('', _p4_bt_pg) + _p4_bt_pg_clean = _LIPICS_PAGES_STRIP_RE.sub("", _p4_bt_pg) if _p4_bt_pg_clean != _p4_bt_pg: merged_fields["booktitle"] = _p4_bt_pg_clean if not merged_fields.get("pages"): _p4_pg_m = _LIPICS_PAGES_EXTRACT_RE.search(_p4_bt_pg) if _p4_pg_m: - merged_fields["pages"] = _p4_pg_m.group(1).replace(' ', '') + merged_fields["pages"] = _p4_pg_m.group(1).replace(" ", "") # Strip duplicate "Proceedings of the" wrapper _p4_bt_dup = (merged_fields.get("booktitle") or "").strip() @@ -2357,7 +2400,7 @@ def _add_doi(source: str, doi: str | None) -> None: for _url_field in ("booktitle", "journal"): _url_val = (merged_fields.get(_url_field) or "").strip() if _url_val and _URL_IN_VENUE_RE.search(_url_val): - _url_cleaned = _URL_IN_VENUE_STRIP_RE.sub('', _url_val).strip().rstrip(',') + _url_cleaned = _URL_IN_VENUE_STRIP_RE.sub("", _url_val).strip().rstrip(",") if _url_cleaned and _url_cleaned != _url_val: merged_fields[_url_field] = _url_cleaned @@ -2387,10 +2430,21 @@ def _add_doi(source: str, doi: str | None) -> None: _hp_val = (merged_fields.get("howpublished") or "").strip() _hp_lower = _hp_val.lower() _is_preprint_hp = any(ps == _hp_lower or ps in _hp_lower for ps in PREPRINT_SERVERS) or _hp_lower in ( - "arxiv", "biorxiv", "medrxiv", "chemrxiv", "techrxiv", - "ssrn", "ssrn electronic journal", "research square", - "preprints.org", "authorea", "osf preprints", "openrxiv", - "psyarxiv", "socarxiv", "edarxiv", + "arxiv", + "biorxiv", + "medrxiv", + "chemrxiv", + "techrxiv", + "ssrn", + "ssrn electronic journal", + "research square", + "preprints.org", + "authorea", + "osf preprints", + "openrxiv", + "psyarxiv", + "socarxiv", + "edarxiv", ) _is_repository_hp = any(rj in _hp_lower for rj in REPOSITORY_AS_JOURNAL) if not _is_preprint_hp and not _is_repository_hp and _hp_val: @@ -2427,8 +2481,7 @@ def _add_doi(source: str, doi: str | None) -> None: merged_fields["note"] = "Venue from SerpAPI publication string (unverified)" tier2_applied = True logger.info( - f"TIER2 | journal={parsed_pub.venue_name} " - f"| vol={parsed_pub.volume} | pages={parsed_pub.pages}", + f"TIER2 | journal={parsed_pub.venue_name} | vol={parsed_pub.volume} | pages={parsed_pub.pages}", category=LogCategory.AUDIT, ) elif parsed_pub.venue_type == "conference": @@ -2475,8 +2528,9 @@ def _add_doi(source: str, doi: str | None) -> None: if _p4_title_lower: _p4_journal_lower = (merged_fields.get("journal") or "").strip().lower() _p4_booktitle_lower = (merged_fields.get("booktitle") or "").strip().lower() - if (_p4_journal_lower and _p4_title_lower == _p4_journal_lower) or \ - (_p4_booktitle_lower and _p4_title_lower == _p4_booktitle_lower): + if (_p4_journal_lower and _p4_title_lower == _p4_journal_lower) or ( + _p4_booktitle_lower and _p4_title_lower == _p4_booktitle_lower + ): logger.debug( f"TITLE_IS_VENUE | title={_p4_title_lower[:60]} | skipping entry", category=LogCategory.AUDIT, @@ -2494,7 +2548,8 @@ def _add_doi(source: str, doi: str | None) -> None: ) logger.warn( "Entry is a book/proceedings volume, not an individual paper; skipping", - category=LogCategory.SKIP, source=LogSource.SYSTEM, + category=LogCategory.SKIP, + source=LogSource.SYSTEM, ) if has_file and path: os.remove(path) @@ -2505,8 +2560,7 @@ def _add_doi(source: str, doi: str | None) -> None: merged_authors = merged_fields.get("author", "") author_found = not merged_authors or author_name_matches(rec.name, merged_authors) logger.debug( - f"AUTHOR_FILTER | target={rec.name} | paper_authors={str(merged_authors)[:80]} " - f"| found={author_found}", + f"AUTHOR_FILTER | target={rec.name} | paper_authors={str(merged_authors)[:80]} | found={author_found}", category=LogCategory.AUDIT, ) if merged_authors and not author_found: @@ -2518,12 +2572,14 @@ def _add_doi(source: str, doi: str | None) -> None: logger.warn( f"Enrichment corrupted author field ('{str(merged_authors)[:60]}'); " f"keeping original file: {os.path.basename(path)}", - category=LogCategory.SKIP, source=LogSource.SYSTEM, + category=LogCategory.SKIP, + source=LogSource.SYSTEM, ) return 0 logger.warn( f"Target author '{rec.name}' not found in paper authors; skipping", - category=LogCategory.SKIP, source=LogSource.SYSTEM, + category=LogCategory.SKIP, + source=LogSource.SYSTEM, ) if path and os.path.isfile(path): os.remove(path) @@ -2572,8 +2628,7 @@ def _add_doi(source: str, doi: str | None) -> None: _revert_misattributed_doi(merged_fields, edoi, doi_validated, doi_early) continue logger.debug( - f"CANDIDATE_DOI_DEDUP | doi={edoi} | existing={existing_bib} " - f"| skipping_write=True", + f"CANDIDATE_DOI_DEDUP | doi={edoi} | existing={existing_bib} | skipping_write=True", category=LogCategory.DEDUP, ) if path and os.path.isfile(path): @@ -2586,11 +2641,7 @@ def _add_doi(source: str, doi: str | None) -> None: except (OSError, UnicodeDecodeError): continue - merged["key"] = ( - bt.build_standard_citekey(merged, gemini_api_key=gemini_api_key) - or merged.get("key") - or "Entry" - ) + merged["key"] = bt.build_standard_citekey(merged, gemini_api_key=gemini_api_key) or merged.get("key") or "Entry" # Year-window guard: reject files whose enriched year falls outside the window if min_year > 0: @@ -2605,8 +2656,9 @@ def _add_doi(source: str, doi: str | None) -> None: os.remove(path) return 0 - path2, was_written = mu.save_entry_to_file(out_dir, effective_id, merged, prefer_path=path, - gemini_api_key=gemini_api_key, author_name=rec.name) + path2, was_written = mu.save_entry_to_file( + out_dir, effective_id, merged, prefer_path=path, gemini_api_key=gemini_api_key, author_name=rec.name + ) if path2 != path: logger.success(f"Enriched and renamed: {path2}", category=LogCategory.SAVE, source=LogSource.SYSTEM) else: @@ -2637,7 +2689,9 @@ def _add_doi(source: str, doi: str | None) -> None: doi_methods = [m for m, k in [("CSL", "doi_csl"), ("BibTeX", "doi_bibtex")] if flags.get(k)] if doi_methods: logger.success( - f"DOI: {' + '.join(doi_methods)}", category=LogCategory.SAVE, source=LogSource.DOI, + f"DOI: {' + '.join(doi_methods)}", + category=LogCategory.SAVE, + source=LogSource.DOI, ) # Count and log enrichment sources @@ -2662,7 +2716,8 @@ def _add_doi(source: str, doi: str | None) -> None: logger.info( f"Coverage: {enriched_count}/{total_sources} sources", - category=LogCategory.SAVE, source=LogSource.SYSTEM, + category=LogCategory.SAVE, + source=LogSource.SYSTEM, ) if matched_sources: @@ -2671,12 +2726,7 @@ def _add_doi(source: str, doi: str | None) -> None: logger.info(f"Not matched: {', '.join(unmatched)}", category=LogCategory.SKIP, source=LogSource.SYSTEM) if summary_csv_path and was_written: - append_summary_to_csv( - summary_csv_path, - rel, - total_true, - flags - ) + append_summary_to_csv(summary_csv_path, rel, total_true, flags) except (*PARSE_ERRORS, OSError, RuntimeError) as e: logger.error(f"Merge error: {e}", category=LogCategory.ERROR, source=LogSource.SYSTEM) return 0 @@ -2710,7 +2760,8 @@ def process_record( try: logger.step( f"Author: {rec.name} (Scholar={rec.scholar_id or 'N/A'}, DBLP={rec.dblp or 'N/A'})", - category=LogCategory.AUTHOR, source=LogSource.SYSTEM, + category=LogCategory.AUTHOR, + source=LogSource.SYSTEM, ) min_year = get_min_year() @@ -2726,29 +2777,33 @@ def process_record( data = {} for attempt in range(1, max_fetch_retries + 1): data = fetch_author_publications( - serpapi_key, rec.scholar_id, rec.name, - num=MAX_PUBLICATIONS_PER_AUTHOR, min_year=min_year, + serpapi_key, + rec.scholar_id, + rec.name, + num=MAX_PUBLICATIONS_PER_AUTHOR, + min_year=min_year, ) if data.get("articles"): break # Got articles -- valid response if attempt < max_fetch_retries: logger.warn( f"Scholar API returned empty (attempt {attempt}/{max_fetch_retries}), retrying...", - category=LogCategory.FETCH, source=LogSource.SCHOLAR, + category=LogCategory.FETCH, + source=LogSource.SCHOLAR, ) time.sleep(2.0 * attempt) if not data.get("articles"): logger.warn( f"Scholar API failed after {max_fetch_retries} attempts; continuing with DBLP only", - category=LogCategory.ERROR, source=LogSource.SCHOLAR, + category=LogCategory.ERROR, + source=LogSource.SCHOLAR, ) else: status = (data.get("search_metadata") or {}).get("status", "") if status.lower() == "error": raise RuntimeError( - f"CiteForge error for author {rec.scholar_id}: " - f"{data.get('error') or 'Unknown error'}" + f"CiteForge error for author {rec.scholar_id}: {data.get('error') or 'Unknown error'}" ) scholar_articles = data.get("articles", []) @@ -2769,7 +2824,8 @@ def process_record( pass logger.info( f"{len(scholar_articles)} article(s) fetched", - category=LogCategory.FETCH, source=LogSource.SCHOLAR, + category=LogCategory.FETCH, + source=LogSource.SCHOLAR, ) scholar_windowed = [a for a in scholar_articles if (get_article_year(a) or 0) >= min_year] @@ -2778,10 +2834,9 @@ def process_record( category=LogCategory.AUDIT, ) logger.info( - f"{len(scholar_windowed)}/{len(scholar_articles)} within " - f"year window (>= {min_year})", + f"{len(scholar_windowed)}/{len(scholar_articles)} within year window (>= {min_year})", category=LogCategory.FETCH, - source=LogSource.SCHOLAR + source=LogSource.SCHOLAR, ) else: logger.info("Skipped (no ID)", category=LogCategory.SKIP, source=LogSource.SCHOLAR) @@ -2792,7 +2847,8 @@ def process_record( dblp_items = dblp_fetch_for_author(rec.name, rec.dblp, min_year) logger.info( f"{len(dblp_items)} item(s) fetched within window", - category=LogCategory.FETCH, source=LogSource.DBLP, + category=LogCategory.FETCH, + source=LogSource.DBLP, ) except FULL_OPERATION_ERRORS as e: logger.warn(f"Fetch failed: {e}", category=LogCategory.ERROR, source=LogSource.DBLP) @@ -2814,7 +2870,7 @@ def process_record( logger.info( f"Union: Scholar={len(scholar_windowed)}, DBLP={len(dblp_items)} " f"→ {len(merged_list)} unique publications (threshold={SIM_MERGE_DUPLICATE_THRESHOLD})", - category=LogCategory.PLAN + category=LogCategory.PLAN, ) articles_sorted = sort_articles_by_year_current_first(merged_list) @@ -2822,7 +2878,7 @@ def process_record( logger.info( f"Plan: process {total_entries}/{len(articles_sorted)} item(s) " f"(limit={'all' if max_pubs is None else max_pubs})", - category=LogCategory.PLAN + category=LogCategory.PLAN, ) saved = 0 @@ -2831,9 +2887,16 @@ def process_record( break try: saved += process_article( - rec, art, serply_key, out_dir, s2_api_key, or_creds, - idx=idx + 1, total=total_entries, - gemini_api_key=gemini_api_key, summary_csv_path=summary_csv_path, + rec, + art, + serply_key, + out_dir, + s2_api_key, + or_creds, + idx=idx + 1, + total=total_entries, + gemini_api_key=gemini_api_key, + summary_csv_path=summary_csv_path, min_year=min_year, ) except FULL_OPERATION_ERRORS as e: @@ -2971,9 +3034,7 @@ def _has_output(r: Record) -> bool: eid = r.scholar_id or r.dblp or "" return os.path.isdir(os.path.join(out_dir, format_author_dirname(r.name, eid))) - records_sorted = [ - r for _, r in sorted(enumerate(records), key=lambda ir: (_has_output(ir[1]), ir[0])) - ] + records_sorted = [r for _, r in sorted(enumerate(records), key=lambda ir: (_has_output(ir[1]), ir[0]))] logger.step(f"Starting parallel execution with {MAX_WORKERS} workers", category=LogCategory.PLAN) @@ -2982,8 +3043,7 @@ def _has_output(r: Record) -> bool: def _thread_excepthook(args: Any) -> None: logger.error( - f"Thread '{args.thread.name if args.thread else '?'}' died: " - f"{args.exc_type.__name__}: {args.exc_value}", + f"Thread '{args.thread.name if args.thread else '?'}' died: {args.exc_type.__name__}: {args.exc_value}", category=LogCategory.ERROR, ) _orig_excepthook(args) @@ -3012,7 +3072,7 @@ def _thread_excepthook(args: Any) -> None: or_creds=or_creds, delay=REQUEST_DELAY_MIN, gemini_api_key=gemini_api_key, - summary_csv_path=summary_csv_path + summary_csv_path=summary_csv_path, ) future_to_author[future] = rec @@ -3038,15 +3098,13 @@ def _thread_excepthook(args: Any) -> None: except Exception as e: processed += 1 logger.error( - f"[{processed}/{len(records)}] Error processing {rec.name} " - f"({rec.scholar_id or rec.dblp}): {e}", + f"[{processed}/{len(records)}] Error processing {rec.name} ({rec.scholar_id or rec.dblp}): {e}", category=LogCategory.ERROR, ) except TimeoutError: remaining = [r.name for f, r in future_to_author.items() if not f.done()] logger.error( - f"Pipeline timed out with {len(remaining)} author(s) still pending: " - + ", ".join(remaining[:5]), + f"Pipeline timed out with {len(remaining)} author(s) still pending: " + ", ".join(remaining[:5]), category=LogCategory.ERROR, ) @@ -3089,10 +3147,11 @@ def _thread_excepthook(args: Any) -> None: author_dir_path = os.path.dirname(orphan) tracked_titles = csv_titles.get(author_dir_path, []) - is_dup = any( - title_similarity(orphan_title, t) >= SIM_MERGE_DUPLICATE_THRESHOLD - for t in tracked_titles - ) if orphan_title else False + is_dup = ( + any(title_similarity(orphan_title, t) >= SIM_MERGE_DUPLICATE_THRESHOLD for t in tracked_titles) + if orphan_title + else False + ) if is_dup: os.remove(orphan) @@ -3138,9 +3197,7 @@ def _thread_excepthook(args: Any) -> None: try: with open(fpath, encoding="utf-8") as bf: parsed = bt.parse_bibtex_to_dict(bf.read()) - bib_year = extract_year_from_any( - (parsed or {}).get("fields", {}).get("year"), fallback=0 - ) or 0 + bib_year = extract_year_from_any((parsed or {}).get("fields", {}).get("year"), fallback=0) or 0 if 0 < bib_year < window_min: logger.debug( f"YEAR_WINDOW | removing {fname} (bib_year={bib_year} < {window_min})", @@ -3211,14 +3268,18 @@ def _thread_excepthook(args: Any) -> None: with open(badges_path, "w", encoding="utf-8") as bf: total = cache_counts["positive"] + cache_counts["negative"] + cache_counts["miss"] hit_rate = ((cache_counts["positive"] + cache_counts["negative"]) / total * 100) if total else 0 - json.dump({ - "last_updated": time.strftime("%Y-%m"), - "cache_positive_hits": cache_counts["positive"], - "cache_negative_hits": cache_counts["negative"], - "cache_misses": cache_counts["miss"], - "total_queries": total, - "hit_rate": round(hit_rate, 1), - }, bf, indent=2) + json.dump( + { + "last_updated": time.strftime("%Y-%m"), + "cache_positive_hits": cache_counts["positive"], + "cache_negative_hits": cache_counts["negative"], + "cache_misses": cache_counts["miss"], + "total_queries": total, + "hit_rate": round(hit_rate, 1), + }, + bf, + indent=2, + ) except OSError: pass diff --git a/src/api_configs.py b/src/api_configs.py index 6e688b78..ca1df033 100644 --- a/src/api_configs.py +++ b/src/api_configs.py @@ -35,6 +35,7 @@ def _extract_europepmc_year(article: dict[str, Any]) -> int: year_str = article.get("pubYear") or "" return int(year_str) if year_str.isdigit() else 0 + S2_SEARCH_CONFIG = APISearchConfig( api_name="semantic_scholar", base_url=f"{S2_BASE}/paper/search", @@ -45,8 +46,8 @@ def _extract_europepmc_year(article: dict[str, Any]) -> int: requires_api_key=True, additional_params={ "limit": 15, - "fields": "paperId,title,year,venue,publicationTypes,authors,url,journal,externalIds,publicationDate" - } + "fields": "paperId,title,year,venue,publicationTypes,authors,url,journal,externalIds,publicationDate", + }, ) CROSSREF_SEARCH_CONFIG = APISearchConfig( @@ -58,14 +59,12 @@ def _extract_europepmc_year(article: dict[str, Any]) -> int: author_field="author", additional_params={ "rows": 20, - "select": ("title,author,issued,container-title,type,URL,DOI," - "published-print,published-online,publisher,volume,issue,page") + "select": ( + "title,author,issued,container-title,type,URL,DOI," + "published-print,published-online,publisher,volume,issue,page" + ), }, - title_getter=lambda c: ( - (c.get("title") or [""])[0] - if isinstance(c.get("title"), list) and c.get("title") - else "" - ), + title_getter=lambda c: (c.get("title") or [""])[0] if isinstance(c.get("title"), list) and c.get("title") else "", year_getter=_extract_csl_year, ) @@ -76,15 +75,12 @@ def _extract_europepmc_year(article: dict[str, Any]) -> int: result_path=["results"], title_field="title", author_field="authorships", - additional_params={ - "per-page": 20, - "mailto": os.getenv("CROSSREF_MAILTO", "") - }, + additional_params={"per-page": 20, "mailto": os.getenv("CROSSREF_MAILTO", "")}, authors_getter=lambda w: [ authorship.get("author", {}).get("display_name", "") for authorship in w.get("authorships") or [] if authorship.get("author", {}).get("display_name") - ] + ], ) PUBMED_SEARCH_CONFIG = APISearchConfig( @@ -94,11 +90,7 @@ def _extract_europepmc_year(article: dict[str, Any]) -> int: result_path=["esearchresult", "idlist"], # Returns PMIDs, need second request title_field="title", author_field="authors", - additional_params={ - "db": "pubmed", - "retmax": 10, - "retmode": "json" - } + additional_params={"db": "pubmed", "retmax": 10, "retmode": "json"}, ) EUROPEPMC_SEARCH_CONFIG = APISearchConfig( @@ -108,10 +100,7 @@ def _extract_europepmc_year(article: dict[str, Any]) -> int: result_path=["resultList", "result"], title_field="title", author_field="authorString", - additional_params={ - "format": "json", - "pageSize": 20 - } + additional_params={"format": "json", "pageSize": 20}, ) @@ -127,10 +116,8 @@ def _extract_europepmc_year(article: dict[str, Any]) -> int: author_name_key="name", entry_type_list_field="publicationTypes", custom_author_extractor=lambda paper: [ - a.get("name", "").strip() - for a in paper.get("authors") or [] - if a.get("name", "").strip() - ] + a.get("name", "").strip() for a in paper.get("authors") or [] if a.get("name", "").strip() + ], ) CROSSREF_FIELD_MAPPING = APIFieldMapping( @@ -144,17 +131,16 @@ def _extract_europepmc_year(article: dict[str, Any]) -> int: author_given_key="given", author_family_key="family", entry_type_field="type", - extra_field_mappings={ - "volume": "volume", - "issue": "number", - "page": "pages", - "publisher": "publisher" - }, - custom_author_extractor=lambda item: [ - f"{author.get('given', '').strip()} {author.get('family', '').strip()}".strip() - for author in item.get("author") or [] - if f"{author.get('given', '').strip()} {author.get('family', '').strip()}".strip() - ] if item.get("author") else [], + extra_field_mappings={"volume": "volume", "issue": "number", "page": "pages", "publisher": "publisher"}, + custom_author_extractor=lambda item: ( + [ + f"{author.get('given', '').strip()} {author.get('family', '').strip()}".strip() + for author in item.get("author") or [] + if f"{author.get('given', '').strip()} {author.get('family', '').strip()}".strip() + ] + if item.get("author") + else [] + ), custom_year_extractor=_extract_crossref_year, ) @@ -174,7 +160,7 @@ def _extract_europepmc_year(article: dict[str, Any]) -> int: for authorship in work.get("authorships") or [] if authorship.get("author", {}).get("display_name", "").strip() ], - custom_year_extractor=lambda work: work.get("publication_year") or 0 + custom_year_extractor=lambda work: work.get("publication_year") or 0, ) PUBMED_FIELD_MAPPING = APIFieldMapping( @@ -187,17 +173,11 @@ def _extract_europepmc_year(article: dict[str, Any]) -> int: url_fields=["uid", "pmid"], # Will build URL from PMID author_name_key="name", venue_hints={"fulljournalname": "article", "source": "article"}, - extra_field_mappings={ - "volume": "volume", - "issue": "number", - "pages": "pages" - }, + extra_field_mappings={"volume": "volume", "issue": "number", "pages": "pages"}, custom_author_extractor=lambda article: [ - author.get("name", "").strip() - for author in article.get("authors") or [] - if author.get("name", "").strip() + author.get("name", "").strip() for author in article.get("authors") or [] if author.get("name", "").strip() ], - custom_year_extractor=lambda article: extract_year_from_any(article.get("pubdate"), fallback=0) or 0 + custom_year_extractor=lambda article: extract_year_from_any(article.get("pubdate"), fallback=0) or 0, ) EUROPEPMC_FIELD_MAPPING = APIFieldMapping( @@ -210,15 +190,9 @@ def _extract_europepmc_year(article: dict[str, Any]) -> int: url_fields=["pmcid", "pmid"], # Will build URL from PMCID/PMID entry_type_field="pubType", venue_hints={"journalTitle": "article", "bookTitle": "inproceedings"}, - extra_field_mappings={ - "journalVolume": "volume", - "issue": "number", - "pageInfo": "pages" - }, + extra_field_mappings={"journalVolume": "volume", "issue": "number", "pageInfo": "pages"}, custom_author_extractor=lambda article: [ - name.strip() - for name in (article.get("authorString") or "").split(",") - if name.strip() + name.strip() for name in (article.get("authorString") or "").split(",") if name.strip() ], custom_year_extractor=_extract_europepmc_year, ) @@ -232,9 +206,7 @@ def _extract_europepmc_year(article: dict[str, Any]) -> int: doi_fields=["doi", "abs_url"], url_fields=["abs_url"], arxiv_fields=["arxiv_id", "abs_url"], - extra_field_mappings={ - "primary_class": "primaryclass" - } + extra_field_mappings={"primary_class": "primaryclass"}, ) OPENREVIEW_FIELD_MAPPING = APIFieldMapping( @@ -247,11 +219,14 @@ def _extract_europepmc_year(article: dict[str, Any]) -> int: url_fields=["content.pdf", "content.link", "content.homepage"], custom_author_extractor=lambda note: [ str(a).strip() - for a in ((note.get("content") or {}).get("authors") or - (note.get("content") or {}).get("authorids") or - note.get("authors") or []) + for a in ( + (note.get("content") or {}).get("authors") + or (note.get("content") or {}).get("authorids") + or note.get("authors") + or [] + ) if str(a).strip() - ] + ], ) DATACITE_FIELD_MAPPING = APIFieldMapping( @@ -266,5 +241,5 @@ def _extract_europepmc_year(article: dict[str, Any]) -> int: creator.get("name", "").strip() for creator in (record.get("attributes") or {}).get("creators") or [] if creator.get("name", "").strip() - ] + ], ) diff --git a/src/api_generics.py b/src/api_generics.py index 9d027005..401abe8e 100644 --- a/src/api_generics.py +++ b/src/api_generics.py @@ -71,6 +71,7 @@ class APISearchConfig: Configuration for API-specific search behavior including endpoint details, query parameters, and custom field extractors. """ + api_name: str base_url: str @@ -100,6 +101,7 @@ class APIFieldMapping: Configuration for API-specific field mappings when building BibTeX entries, translating diverse field names and structures to a unified BibTeX format. """ + api_name: str # Core field mappings (list of possible field names, first match wins) @@ -145,18 +147,13 @@ def _build_scoring_function( """ from .bibtex_build import create_scoring_function - title_getter: Callable[[dict[str, Any]], str] = ( - config.title_getter - or (lambda c: safe_get_field(c, config.title_field) or "") + title_getter: Callable[[dict[str, Any]], str] = config.title_getter or ( + lambda c: safe_get_field(c, config.title_field) or "" ) - authors_getter: Callable[[dict[str, Any]], Any] = ( - config.authors_getter - or (lambda c: c.get(config.author_field) or []) - ) - year_getter: Callable[[dict[str, Any]], int | None] = ( - config.year_getter - or (lambda c: c.get("year")) + authors_getter: Callable[[dict[str, Any]], Any] = config.authors_getter or ( + lambda c: c.get(config.author_field) or [] ) + year_getter: Callable[[dict[str, Any]], int | None] = config.year_getter or (lambda c: c.get("year")) return create_scoring_function( title=title, @@ -169,10 +166,7 @@ def _build_scoring_function( def search_api_generic( - title: str, - author_name: str | None, - config: APISearchConfig, - api_key: str | None = None + title: str, author_name: str | None, config: APISearchConfig, api_key: str | None = None ) -> dict[str, Any] | None: """ Search for academic publications across different API providers using a unified @@ -226,10 +220,7 @@ def search_api_generic( norm_match = normalize_title(item_title) == target_norm if norm_match and author_name: item_authors = get_authors(item) - author_ok = ( - author_name_matches(author_name, item_authors) - or author_in_text(author_name, item_authors) - ) + author_ok = author_name_matches(author_name, item_authors) or author_in_text(author_name, item_authors) else: author_ok = True logger.debug( @@ -269,11 +260,7 @@ def search_api_generic( def search_api_generic_multiple( - title: str, - author_name: str | None, - config: APISearchConfig, - api_key: str | None = None, - max_results: int = 5 + title: str, author_name: str | None, config: APISearchConfig, api_key: str | None = None, max_results: int = 5 ) -> list[dict[str, Any]]: """ Search for academic publications and return multiple candidates sorted by relevance. @@ -348,7 +335,10 @@ def search_api_generic_multiple( def _first_resolved_str( - obj: dict[str, Any], field_names: list[str], *, check_placeholder: bool = False, + obj: dict[str, Any], + field_names: list[str], + *, + check_placeholder: bool = False, ) -> str | None: """Return the first non-empty string resolved from a list of dotted field paths.""" for name in field_names: @@ -374,7 +364,8 @@ def _first_resolved_with_transform( def _extract_venue( - response: dict[str, Any], mapping: APIFieldMapping, + response: dict[str, Any], + mapping: APIFieldMapping, ) -> str | None: """Extract the best venue string from an API response, filtering generic series names.""" venue: str | None = None @@ -384,8 +375,11 @@ def _extract_venue( # Prefer the non-generic element over generic series names like LNCS if isinstance(raw_venue, list) and len(raw_venue) > 1: non_generic = next( - (str(c).strip() for c in raw_venue - if str(c).strip() and str(c).strip().lower() not in GENERIC_SERIES_NAMES), + ( + str(c).strip() + for c in raw_venue + if str(c).strip() and str(c).strip().lower() not in GENERIC_SERIES_NAMES + ), None, ) venue = non_generic or _resolve_dotted_str(response, field_name) @@ -406,8 +400,7 @@ def _extract_venue( event_name = (event.get("name") or "").strip() if event_name: logger.debug( - f"{mapping.api_name} | EVENT_NAME | generic_series={venue[:40]}" - f" | event={event_name[:40]}", + f"{mapping.api_name} | EVENT_NAME | generic_series={venue[:40]} | event={event_name[:40]}", category=LogCategory.SCORE, ) venue = event_name @@ -415,11 +408,7 @@ def _extract_venue( return venue -def build_bibtex_from_response( - response: dict[str, Any], - keyhint: str, - mapping: APIFieldMapping -) -> str | None: +def build_bibtex_from_response(response: dict[str, Any], keyhint: str, mapping: APIFieldMapping) -> str | None: """ Build a BibTeX entry from an API response using configured field mappings to handle diverse field naming conventions and data structures across different academic APIs. @@ -441,7 +430,7 @@ def build_bibtex_from_response( author_data, name_key=mapping.author_name_key or "name", given_key=mapping.author_given_key, - family_key=mapping.author_family_key + family_key=mapping.author_family_key, ) if not authors or has_placeholder(", ".join(authors)): @@ -456,7 +445,7 @@ def build_bibtex_from_response( response, type_field=mapping.entry_type_field, publication_types_field=mapping.entry_type_list_field, - venue_hints=mapping.venue_hints + venue_hints=mapping.venue_hints, ) venue = _extract_venue(response, mapping) @@ -487,5 +476,5 @@ def build_bibtex_from_response( doi=doi, url=url, arxiv_id=arxiv_id, - extra_fields=extra_fields + extra_fields=extra_fields, ) diff --git a/src/bibtex_build.py b/src/bibtex_build.py index 692c9c6b..bf34981d 100644 --- a/src/bibtex_build.py +++ b/src/bibtex_build.py @@ -18,7 +18,12 @@ _BOOK_TYPES = {"book", "edited-book", "monograph", "reference-book"} _BOOK_SERIES_KEYWORDS = ( - "lecture notes", "series", "handbook", "advances in", "studies in", "chapter", + "lecture notes", + "series", + "handbook", + "advances in", + "studies in", + "chapter", ) _BOOK_PUBLISHER_KEYWORDS = ("springer", "elsevier", "wiley", "crc press", "cambridge", "oxford") @@ -46,16 +51,16 @@ def format_author_field(authors: list[str]) -> str | None: def build_bibtex_entry( - entry_type: str, - title: str, - authors: list[str], - year: int, - keyhint: str, - venue: str | None = None, - doi: str | None = None, - url: str | None = None, - arxiv_id: str | None = None, - extra_fields: dict[str, str] | None = None + entry_type: str, + title: str, + authors: list[str], + year: int, + keyhint: str, + venue: str | None = None, + doi: str | None = None, + url: str | None = None, + arxiv_id: str | None = None, + extra_fields: dict[str, str] | None = None, ) -> str: """ Build a complete BibTeX entry from the main publication details and optional @@ -89,22 +94,18 @@ def build_bibtex_entry( if extra_fields: fields.update(extra_fields) - entry = { - "type": entry_type, - "key": key, - "fields": {k: v for k, v in fields.items() if v} - } + entry = {"type": entry_type, "key": key, "fields": {k: v for k, v in fields.items() if v}} return bibtex_from_dict(entry) def create_scoring_function( - title: str, - author_name: str | None, - year_hint: int | None, - title_getter: Callable[[Any], str], - authors_getter: Callable[[Any], Any], - year_getter: Callable[[Any], int | None] | None = None, - author_match_fn: Callable[[str, Any], bool] | None = None + title: str, + author_name: str | None, + year_hint: int | None, + title_getter: Callable[[Any], str], + authors_getter: Callable[[Any], Any], + year_getter: Callable[[Any], int | None] | None = None, + author_match_fn: Callable[[str, Any], bool] | None = None, ) -> Callable[[Any], float]: """ Create a scoring function that ranks search results against a target title, @@ -174,10 +175,10 @@ def _is_conference_venue(venue: str) -> bool: def determine_entry_type( - obj: Any, - type_field: str = "type", - publication_types_field: str | None = None, - venue_hints: dict[str, str] | None = None + obj: Any, + type_field: str = "type", + publication_types_field: str | None = None, + venue_hints: dict[str, str] | None = None, ) -> str: """ Guess whether a publication should be treated as a journal article, @@ -208,13 +209,17 @@ def determine_entry_type( # Book chapter heuristic: howpublished + publisher + pages without journal/booktitle if ( - obj.get("howpublished") and obj.get("publisher") and obj.get("pages") - and not obj.get("journal") and not obj.get("booktitle") + obj.get("howpublished") + and obj.get("publisher") + and obj.get("pages") + and not obj.get("journal") + and not obj.get("booktitle") ): hp_lower = str(obj["howpublished"]).lower() pub_lower = str(obj["publisher"]).lower() - if (any(kw in hp_lower for kw in _BOOK_SERIES_KEYWORDS) - or any(kw in pub_lower for kw in _BOOK_PUBLISHER_KEYWORDS)): + if any(kw in hp_lower for kw in _BOOK_SERIES_KEYWORDS) or any( + kw in pub_lower for kw in _BOOK_PUBLISHER_KEYWORDS + ): return "incollection" for venue_field in ("journal", "container-title", "venue", "booktitle"): diff --git a/src/bibtex_utils.py b/src/bibtex_utils.py index 919705e7..54d70929 100644 --- a/src/bibtex_utils.py +++ b/src/bibtex_utils.py @@ -30,10 +30,27 @@ title_similarity, ) -_TITLE_STOP_WORDS: frozenset[str] = frozenset({ - "a", "an", "the", "on", "for", "of", "and", "to", "in", - "with", "using", "via", "from", "by", "at", "into", "through", -}) +_TITLE_STOP_WORDS: frozenset[str] = frozenset( + { + "a", + "an", + "the", + "on", + "for", + "of", + "and", + "to", + "in", + "with", + "using", + "via", + "from", + "by", + "at", + "into", + "through", + } +) def make_bibkey(title: str, authors: list[str], year: int, fallback: str = "entry") -> str: @@ -86,19 +103,19 @@ def _extract_balanced_braces(text: str, start: int) -> str | None: position, keeping track of nested braces so inner blocks are preserved correctly. """ - if start >= len(text) or text[start] != '{': + if start >= len(text) or text[start] != "{": return None depth = 0 result: list[str] = [] for ch in text[start:]: - if ch == '{': + if ch == "{": depth += 1 if depth > 1: # Don't include the outermost braces result.append(ch) - elif ch == '}': + elif ch == "}": depth -= 1 if depth == 0: - return ''.join(result) + return "".join(result) result.append(ch) else: result.append(ch) @@ -111,9 +128,9 @@ def _assign_field_value(fields: dict[str, str], field_name: str, full_value: str brace-wrapped, quoted, or plain text. Keeps logic in one place to avoid duplication. """ - if full_value.startswith('{'): + if full_value.startswith("{"): val = _extract_balanced_braces(full_value, 0) - fields[field_name] = val.strip() if val is not None else full_value.strip().strip('{}') + fields[field_name] = val.strip() if val is not None else full_value.strip().strip("{}") elif full_value.startswith('"'): m2 = re.match(r'^"([^"]*)"', full_value) fields[field_name] = m2.group(1).strip() if m2 else full_value.strip() @@ -133,13 +150,9 @@ def parse_bibtex_to_dict(bibtex: str) -> dict[str, Any] | None: return None fields: dict[str, str] = {} - single_line_pattern = re.search( - r'@\s*[a-zA-Z]+\s*\{\s*[^,\s]+\s*,\s*(.+)\s*\}\s*$', - bibtex, - re.DOTALL - ) + single_line_pattern = re.search(r"@\s*[a-zA-Z]+\s*\{\s*[^,\s]+\s*,\s*(.+)\s*\}\s*$", bibtex, re.DOTALL) - if single_line_pattern and '\n' not in bibtex.strip(): + if single_line_pattern and "\n" not in bibtex.strip(): fields_text = single_line_pattern.group(1).strip() brace_depth = 0 @@ -148,13 +161,13 @@ def parse_bibtex_to_dict(bibtex: str) -> dict[str, Any] | None: field_parts = [] for i, char in enumerate(fields_text): - if char == '{' and not in_quote: + if char == "{" and not in_quote: brace_depth += 1 - elif char == '}' and not in_quote: + elif char == "}" and not in_quote: brace_depth -= 1 elif char == '"' and brace_depth == 0: in_quote = not in_quote - elif char == ',' and brace_depth == 0 and not in_quote: + elif char == "," and brace_depth == 0 and not in_quote: field_parts.append(fields_text[field_start:i].strip()) field_start = i + 1 @@ -165,7 +178,7 @@ def parse_bibtex_to_dict(bibtex: str) -> dict[str, Any] | None: # Now parse each field for part in field_parts: - m = re.match(r'^\s*([a-zA-Z][a-zA-Z0-9_\-]*)\s*=\s*(.*)$', part) + m = re.match(r"^\s*([a-zA-Z][a-zA-Z0-9_\-]*)\s*=\s*(.*)$", part) if m: field_name = m.group(1).lower() field_value = m.group(2).strip() @@ -177,19 +190,19 @@ def parse_bibtex_to_dict(bibtex: str) -> dict[str, Any] | None: current_field = None accumulator: list[str] = [] - for line in bibtex.split('\n'): - m = re.match(r'^\s*([a-zA-Z][a-zA-Z0-9_\-]*)\s*=\s*(.*)$', line) + for line in bibtex.split("\n"): + m = re.match(r"^\s*([a-zA-Z][a-zA-Z0-9_\-]*)\s*=\s*(.*)$", line) if m: if current_field and accumulator: - full_value = ' '.join(accumulator) + full_value = " ".join(accumulator) _assign_field_value(fields, current_field, full_value) current_field = m.group(1).lower() rest = m.group(2).strip() accumulator = [rest] - if rest.startswith('{'): + if rest.startswith("{"): val = _extract_balanced_braces(rest, 0) if val is not None: fields[current_field] = val.strip() @@ -205,8 +218,8 @@ def parse_bibtex_to_dict(bibtex: str) -> dict[str, Any] | None: stripped = line.strip() if stripped: accumulator.append(stripped) - full_value = ' '.join(accumulator) - if full_value.startswith('{'): + full_value = " ".join(accumulator) + if full_value.startswith("{"): val = _extract_balanced_braces(full_value, 0) if val is not None: fields[current_field] = val.strip() @@ -214,7 +227,7 @@ def parse_bibtex_to_dict(bibtex: str) -> dict[str, Any] | None: accumulator = [] if current_field and accumulator: - full_value = ' '.join(accumulator) + full_value = " ".join(accumulator) _assign_field_value(fields, current_field, full_value) return {"type": head["type"].lower(), "key": head["key"], "fields": fields} @@ -235,8 +248,19 @@ def _strip_latex_formatting(val: str) -> str: (\&, \%, \$, \#, \_, \{, \}), tildes, and dashes (-- / ---). """ formatting_commands = [ - 'textit', 'textbf', 'emph', 'textsc', 'texttt', 'textrm', 'textsf', - 'underline', 'uppercase', 'lowercase', 'mbox', 'hbox', 'text' + "textit", + "textbf", + "emph", + "textsc", + "texttt", + "textrm", + "textsf", + "underline", + "uppercase", + "lowercase", + "mbox", + "hbox", + "text", ] prev_val = None @@ -244,7 +268,7 @@ def _strip_latex_formatting(val: str) -> str: prev_val = val for cmd in formatting_commands: # Match \command{...} with balanced braces - pattern = r'\\' + cmd + r'\s*\{' + pattern = r"\\" + cmd + r"\s*\{" while True: match = re.search(pattern, val) if not match: @@ -254,48 +278,48 @@ def _strip_latex_formatting(val: str) -> str: depth = 0 end = start for i in range(start, len(val)): - if val[i] == '{': + if val[i] == "{": depth += 1 - elif val[i] == '}': + elif val[i] == "}": depth -= 1 if depth == 0: end = i break if depth == 0: # Extract content and replace - content = val[start + 1:end] - val = val[:match.start()] + content + val[end + 1:] + content = val[start + 1 : end] + val = val[: match.start()] + content + val[end + 1 :] else: # Unbalanced braces, skip this match break - old_style_commands = ['it', 'bf', 'em', 'sc', 'tt', 'rm', 'sf', 'sl'] + old_style_commands = ["it", "bf", "em", "sc", "tt", "rm", "sf", "sl"] for cmd in old_style_commands: # Match {\xx content} or {\xx{content}} - pattern = r'\{\\' + cmd + r'\s+([^}]+)\}' - val = re.sub(pattern, r'\1', val) + pattern = r"\{\\" + cmd + r"\s+([^}]+)\}" + val = re.sub(pattern, r"\1", val) # Also handle {\xx{content}} - pattern2 = r'\{\\' + cmd + r'\s*\{([^}]+)\}\}' - val = re.sub(pattern2, r'\1', val) + pattern2 = r"\{\\" + cmd + r"\s*\{([^}]+)\}\}" + val = re.sub(pattern2, r"\1", val) special_chars = { - r'\&': '&', - r'\%': '%', - r'\$': '$', - r'\#': '#', - r'\_': '_', - r'\{': '{', - r'\}': '}', + r"\&": "&", + r"\%": "%", + r"\$": "$", + r"\#": "#", + r"\_": "_", + r"\{": "{", + r"\}": "}", } for latex_char, plain_char in special_chars.items(): val = val.replace(latex_char, plain_char) - val = re.sub(r'(? str: val = strip_accents(val) replacements = { - '\u2019': "'", # Right single quotation mark → apostrophe - '\u2018': "'", # Left single quotation mark → apostrophe - '\u201C': '"', # Left double quotation mark → quote - '\u201D': '"', # Right double quotation mark → quote - '\u2013': '-', # En dash → hyphen - '\u2014': '--', # Em dash → double hyphen - '\u2026': '...', # Horizontal ellipsis → three dots - '\u00A0': ' ', # Non-breaking space → regular space + "\u2019": "'", # Right single quotation mark → apostrophe + "\u2018": "'", # Left single quotation mark → apostrophe + "\u201c": '"', # Left double quotation mark → quote + "\u201d": '"', # Right double quotation mark → quote + "\u2013": "-", # En dash → hyphen + "\u2014": "--", # Em dash → double hyphen + "\u2026": "...", # Horizontal ellipsis → three dots + "\u00a0": " ", # Non-breaking space → regular space } for unicode_char, ascii_char in replacements.items(): val = val.replace(unicode_char, ascii_char) @@ -335,15 +359,15 @@ def _sanitize_title(title_val: str | None) -> str | None: trailing_period = False # Remove duplicated suffix after colon - if ':' in t: - parts = t.split(':') + if ":" in t: + parts = t.split(":") if len(parts) >= 3: # Has at least 2 colons # Check if last two parts are the same (after stripping whitespace) last_part = parts[-1].strip() second_last_part = parts[-2].strip() if last_part and last_part == second_last_part and len(last_part) > 15: # Remove the duplicated last part - t = ':'.join(parts[:-1]).strip() + t = ":".join(parts[:-1]).strip() dup_suffix_removed = True # trim trailing periods unless it's an ellipsis @@ -354,14 +378,13 @@ def _sanitize_title(title_val: str | None) -> str | None: category=LogCategory.SERIAL, ) return t - if t.endswith('.'): + if t.endswith("."): trailing_period = True t = t[:-1].rstrip() if dup_suffix_removed or trailing_period: logger.debug( - f"title_sanitize | dup_suffix_removed={dup_suffix_removed}" - f" | trailing_period={trailing_period}", + f"title_sanitize | dup_suffix_removed={dup_suffix_removed} | trailing_period={trailing_period}", category=LogCategory.SERIAL, ) return t @@ -370,10 +393,21 @@ def _sanitize_title(title_val: str | None) -> str | None: key = entry.get("key") or "entry" fields: dict[str, str] = entry.get("fields") or {} preferred = [ - "title", "author", "year", - "journal", "booktitle", "howpublished", "publisher", - "volume", "number", "pages", - "doi", "url", "eprint", "archiveprefix", "primaryclass" + "title", + "author", + "year", + "journal", + "booktitle", + "howpublished", + "publisher", + "volume", + "number", + "pages", + "doi", + "url", + "eprint", + "archiveprefix", + "primaryclass", ] lines = [f"@{etype}{{{key},"] preferred_set = set(preferred) @@ -388,17 +422,13 @@ def _sanitize_title(title_val: str | None) -> str | None: if k not in ("url", "doi") and "&" in val and r"\&" not in val: val = val.replace("&", r"\&") lines.append(f" {k} = {{{val}}},") - if len(lines) > 1 and lines[-1].endswith(','): + if len(lines) > 1 and lines[-1].endswith(","): lines[-1] = lines[-1][:-1] lines.append("}") return "\n".join(lines) + "\n" -def _short_title_for_key( - title: str, - max_words: int = BIBTEX_KEY_MAX_WORDS, - gemini_api_key: str | None = None -) -> str: +def _short_title_for_key(title: str, max_words: int = BIBTEX_KEY_MAX_WORDS, gemini_api_key: str | None = None) -> str: """ Pick a few informative words from a title, skipping common stop words, and join them into a compact phrase that works well in keys or filenames. @@ -414,7 +444,7 @@ def _short_title_for_key( so we bypass the cache and use the algorithmic approach to get more title words. """ normalized_title = normalize_title(title) - use_cache = (max_words == BIBTEX_KEY_MAX_WORDS) + use_cache = max_words == BIBTEX_KEY_MAX_WORDS if gemini_api_key and use_cache: cached = response_cache.get("gemini", normalized_title) @@ -432,7 +462,8 @@ def _short_title_for_key( if gemini_result: logger.debug(f"gemini_api_success | short={gemini_result}", category=LogCategory.CITEKEY) response_cache.put( - "gemini", normalized_title, + "gemini", + normalized_title, {"short_title": gemini_result}, ttl_days=CACHE_TTL_GEMINI_DAYS, ) @@ -469,7 +500,7 @@ def _first_author_lastname(authors_field: str | None) -> str | None: last = first.split(",")[0].strip() else: toks = first.split() - while len(toks) > 1 and toks[-1].rstrip('.').lower() in AUTHOR_NAME_SUFFIXES: + while len(toks) > 1 and toks[-1].rstrip(".").lower() in AUTHOR_NAME_SUFFIXES: toks.pop() last = toks[-1] if toks else first last = re.sub(r"[^a-zA-Z0-9]", "", strip_accents(last)).lower() @@ -499,8 +530,9 @@ def build_standard_citekey(entry: dict[str, Any], gemini_api_key: str | None = N return f"{last_cap}{y}:{short}" -def short_filename_for_entry(entry: dict[str, Any], gemini_api_key: str | None = None, - existing_files: set[str] | None = None, max_words: int = 2) -> str: +def short_filename_for_entry( + entry: dict[str, Any], gemini_api_key: str | None = None, existing_files: set[str] | None = None, max_words: int = 2 +) -> str: """ Construct a concise .bib filename from the first author's name, the year, and a shortened title so that exported files are easy to identify. @@ -586,8 +618,7 @@ def bibtex_entries_match_strict(entry_a: dict[str, Any], entry_b: dict[str, Any] preprint_doi = a_doi if a_is_preprint else b_doi published_doi = b_doi if a_is_preprint else a_doi logger.debug( - f"ENTRY_FALLTHROUGH | PREPRINT_PUBLISHED_PAIR" - f" | preprint={preprint_doi} published={published_doi}", + f"ENTRY_FALLTHROUGH | PREPRINT_PUBLISHED_PAIR | preprint={preprint_doi} published={published_doi}", category=LogCategory.DEDUP, ) @@ -663,12 +694,7 @@ def bibtex_entries_match_strict(entry_a: dict[str, Any], entry_b: dict[str, Any] a_authors = parse_authors_any(af.get("author", "")) b_authors = parse_authors_any(bf.get("author", "")) author_overlap = author_overlap_ratio(af.get("author", ""), bf.get("author", "")) - high_author_match = ( - author_overlap >= 0.9 - and title_sim >= 0.6 - and len(a_authors) >= 2 - and len(b_authors) >= 2 - ) + high_author_match = author_overlap >= 0.9 and title_sim >= 0.6 and len(a_authors) >= 2 and len(b_authors) >= 2 preprint_pair = a_preprint != b_preprint ext_ids = external_ids_match(af, bf) diff --git a/src/clients/helpers.py b/src/clients/helpers.py index 75d8ad25..b297788d 100644 --- a/src/clients/helpers.py +++ b/src/clients/helpers.py @@ -22,14 +22,14 @@ def _score_candidate_generic( - target_title: str, - target_author: str | None, - target_year: int | None, - cand_title: str, - cand_authors: Any, - cand_year: int | None, - title_sim: Callable[[str, str], float], - author_match: Callable[[str, Any], bool], + target_title: str, + target_author: str | None, + target_year: int | None, + cand_title: str, + cand_authors: Any, + cand_year: int | None, + title_sim: Callable[[str, str], float], + author_match: Callable[[str, Any], bool], ) -> float: tsim = title_sim(target_title, cand_title) s = SIM_TITLE_WEIGHT * tsim @@ -59,9 +59,9 @@ def _score_candidate_generic( def _best_item_by_score( - items: list[Any], - score_fn: Callable[[Any], float], - threshold: float = SIM_BEST_ITEM_THRESHOLD, + items: list[Any], + score_fn: Callable[[Any], float], + threshold: float = SIM_BEST_ITEM_THRESHOLD, ) -> Any | None: """Pick the highest-scoring item that meets the threshold.""" best = None @@ -94,8 +94,7 @@ def extract_authors_from_article(art: dict[str, Any]) -> list[str] | None: names = extract_author_names(authors, name_key="name") filtered_names = [ - n for n in names - if n and n.strip().lower() not in ("...", "\u2026") and "et al" not in n.strip().lower() + n for n in names if n and n.strip().lower() not in ("...", "\u2026") and "et al" not in n.strip().lower() ] return filtered_names or None @@ -138,4 +137,5 @@ def _sanitize_dblp_author(name: str) -> str: def get_current_year() -> int: from datetime import datetime, timezone + return datetime.now(timezone.utc).year diff --git a/src/clients/scholar.py b/src/clients/scholar.py index 35e3052f..7e909a6a 100644 --- a/src/clients/scholar.py +++ b/src/clients/scholar.py @@ -65,16 +65,18 @@ def _cache_covers_window(cached: dict[str, Any], min_year: int) -> bool: articles = cached.get("articles") or [] if not articles: return False - years = [a.get("year") for a in articles - if isinstance(a.get("year"), int) and a["year"] > 0] + years = [a.get("year") for a in articles if isinstance(a.get("year"), int) and a["year"] > 0] if not years or min(years) <= min_year: return True return len(articles) % 100 != 0 def fetch_author_publications( - api_key: str, author_id: str, _author_name: str, - num: int = 100, min_year: int = 0, + api_key: str, + author_id: str, + _author_name: str, + num: int = 100, + min_year: int = 0, ) -> dict[str, Any]: """Fetch publications for an author from Google Scholar via SerpAPI. @@ -95,7 +97,8 @@ def fetch_author_publications( if min_year > 0 and not _cache_covers_window(cached, min_year): _log.info( "Cache for %s does not cover min_year=%d; re-fetching", - author_id, min_year, + author_id, + min_year, ) response_cache.invalidate("serpapi_publications", cache_key) else: @@ -109,7 +112,9 @@ def fetch_author_publications( def fetch_scholar_citation( - api_key: str, title: str, author_name: str, + api_key: str, + title: str, + author_name: str, ) -> dict[str, str] | None: """Fetch citation details for an article from Google Scholar via Serply.""" if not title: @@ -156,13 +161,20 @@ def build_bibtex_from_scholar_fields(fields: dict[str, str], keyhint: str) -> st url = safe_get_field(fields, "url") extra_fields = { - k: v for k, v in - {"volume": volume, "number": number, "pages": pages, "publisher": publisher}.items() + k: v + for k, v in {"volume": volume, "number": number, "pages": pages, "publisher": publisher}.items() if v is not None } return build_bibtex_entry( - entry_type=entry_type, title=title, authors=authors, year=year, keyhint=keyhint, - venue=venue, doi=doi, url=url, extra_fields=extra_fields, + entry_type=entry_type, + title=title, + authors=authors, + year=year, + keyhint=keyhint, + venue=venue, + doi=doi, + url=url, + extra_fields=extra_fields, ) @@ -179,7 +191,8 @@ def key_func(a: dict[str, Any]) -> tuple[int, int, str, str]: def _deduplicate_publication_list( - pubs: list[dict[str, Any]], _target_author: str | None = None, + pubs: list[dict[str, Any]], + _target_author: str | None = None, ) -> list[dict[str, Any]]: """Remove internal duplicates from a single publication list.""" if not pubs: @@ -231,8 +244,9 @@ def sort_key(pub: dict[str, Any]) -> tuple[int, str, str]: return deduplicated -def merge_publication_lists(primary: list[dict[str, Any]], secondary: list[dict[str, Any]], - target_author: str | None) -> list[dict[str, Any]]: +def merge_publication_lists( + primary: list[dict[str, Any]], secondary: list[dict[str, Any]], target_author: str | None +) -> list[dict[str, Any]]: """Merge two publication lists into one unified list with complete deduplication.""" primary_deduped = _deduplicate_publication_list(primary, target_author) secondary_deduped = _deduplicate_publication_list(secondary, target_author) @@ -250,9 +264,14 @@ def merge_publication_lists(primary: list[dict[str, Any]], secondary: list[dict[ if tsim < SIM_TITLE_SIM_MIN: continue score = _score_candidate_generic( - target_title=p.get("title") or "", target_author=target_author, target_year=p.get("year"), - cand_title=s_title, cand_authors=s_authors, cand_year=s_year, - title_sim=title_similarity, author_match=authors_overlap, + target_title=p.get("title") or "", + target_author=target_author, + target_year=p.get("year"), + cand_title=s_title, + cand_authors=s_authors, + cand_year=s_year, + title_sim=title_similarity, + author_match=authors_overlap, ) if score >= SIM_MERGE_DUPLICATE_THRESHOLD: is_duplicate = True diff --git a/src/clients/serply_scholar.py b/src/clients/serply_scholar.py index 0354c363..ef24b7f0 100644 --- a/src/clients/serply_scholar.py +++ b/src/clients/serply_scholar.py @@ -125,7 +125,7 @@ def _parse_description(description: str) -> tuple[str, str]: # Extract journal/venue: everything before the year in the middle part journal = "" if year_match: - journal = middle[:year_match.start()].rstrip(", ") + journal = middle[: year_match.start()].rstrip(", ") elif middle: journal = middle.strip() diff --git a/src/doi_utils.py b/src/doi_utils.py index bbffe336..37fe95ef 100644 --- a/src/doi_utils.py +++ b/src/doi_utils.py @@ -10,11 +10,7 @@ from .text_utils import normalize_title, title_similarity -def _validate_csl( - doi: str, - baseline_entry: dict[str, Any], - result_id: str -) -> tuple[bool, dict[str, Any] | None, Any]: +def _validate_csl(doi: str, baseline_entry: dict[str, Any], result_id: str) -> tuple[bool, dict[str, Any] | None, Any]: """ Helper to validate DOI using CSL-JSON format. """ @@ -28,7 +24,8 @@ def _validate_csl( csl_bib = search_apis.bibtex_from_csl(csl, keyhint=result_id) logger.debug( f"CSL_CONVERT | bibtex_ok={csl_bib is not None}", - category=LogCategory.DOI_VAL, source=LogSource.DOI, + category=LogCategory.DOI_VAL, + source=LogSource.DOI, ) if not csl_bib: return False, None, None @@ -36,7 +33,8 @@ def _validate_csl( csl_entry = bt.parse_bibtex_to_dict(csl_bib) logger.debug( f"CSL_PARSE | entry_ok={csl_entry is not None}", - category=LogCategory.DOI_VAL, source=LogSource.DOI, + category=LogCategory.DOI_VAL, + source=LogSource.DOI, ) if csl_entry is None: return False, None, None @@ -50,17 +48,15 @@ def _validate_csl( except ALL_API_ERRORS as e: logger.debug( f"CSL_ERROR | doi={doi} | error={type(e).__name__}: {e}", - category=LogCategory.DOI_VAL, source=LogSource.DOI, + category=LogCategory.DOI_VAL, + source=LogSource.DOI, ) logger.warn(f"{doi}: CSL fetch failed: {e}", category=LogCategory.ERROR, source=LogSource.DOI) return False, None, None -def _validate_bibtex( - doi: str, - baseline_entry: dict[str, Any] -) -> tuple[bool, dict[str, Any] | None, Any]: +def _validate_bibtex(doi: str, baseline_entry: dict[str, Any]) -> tuple[bool, dict[str, Any] | None, Any]: """ Helper to validate DOI using BibTeX format. """ @@ -74,7 +70,8 @@ def _validate_bibtex( bibtex_entry = bt.parse_bibtex_to_dict(doi_bib) logger.debug( f"BIBTEX_PARSE | entry_ok={bibtex_entry is not None}", - category=LogCategory.DOI_VAL, source=LogSource.DOI, + category=LogCategory.DOI_VAL, + source=LogSource.DOI, ) if bibtex_entry is None: return False, None, None @@ -84,33 +81,30 @@ def _validate_bibtex( if strict_match: logger.success( f"{doi}: BibTeX format validated and added", - category=LogCategory.MATCH, source=LogSource.DOI, + category=LogCategory.MATCH, + source=LogSource.DOI, ) return True, bibtex_entry, doi_bib except ALL_API_ERRORS as e: logger.debug( f"BIBTEX_ERROR | doi={doi} | error={type(e).__name__}: {e}", - category=LogCategory.DOI_VAL, source=LogSource.DOI, + category=LogCategory.DOI_VAL, + source=LogSource.DOI, ) logger.warn(f"{doi}: BibTeX fetch failed: {e}", category=LogCategory.ERROR, source=LogSource.DOI) return False, None, None -def _log_rejection_details( - doi: str, - baseline_entry: dict[str, Any], - result_id: str, - csl: Any, - doi_bib: Any -) -> None: +def _log_rejection_details(doi: str, baseline_entry: dict[str, Any], result_id: str, csl: Any, doi_bib: Any) -> None: """ Log details about why validation failed, checking title similarity. """ logger.warn( f"{doi} rejected: neither CSL nor BibTeX metadata matches baseline", - category=LogCategory.SKIP, source=LogSource.DOI, + category=LogCategory.SKIP, + source=LogSource.DOI, ) baseline_title = normalize_title(baseline_entry.get("fields", {}).get("title")) @@ -141,14 +135,13 @@ def _title_sim_from_bibtex(raw_bibtex: str | None) -> float: f" | csl_title_sim={csl_title_sim:.2f}" f" | bibtex_title_sim={bibtex_title_sim:.2f}" f" | baseline_title={baseline_title[:50] if baseline_title else 'none'}", - category=LogCategory.DOI_VAL, source=LogSource.DOI, + category=LogCategory.DOI_VAL, + source=LogSource.DOI, ) def validate_doi_candidate( - doi: str, - baseline_entry: dict[str, Any], - result_id: str + doi: str, baseline_entry: dict[str, Any], result_id: str ) -> tuple[bool, bool, dict[str, Any] | None, dict[str, Any] | None]: """ Validate a DOI by fetching metadata in multiple formats and checking baseline match, @@ -168,7 +161,8 @@ def validate_doi_candidate( f"VALIDATE | doi={doi} | csl_tried=True | csl_matched={csl_matched}" f" | bibtex_tried={not csl_matched} | bibtex_matched={bibtex_matched}" f" | overall={doi_matched}", - category=LogCategory.DOI_VAL, source=LogSource.DOI, + category=LogCategory.DOI_VAL, + source=LogSource.DOI, ) if not doi_matched: @@ -182,15 +176,13 @@ def process_validated_doi( baseline_entry: dict[str, Any], result_id: str, enr_list: list[tuple[str, dict[str, Any]]], - flags: dict[str, bool] + flags: dict[str, bool], ) -> bool: """ Validate a DOI and update enrichment tracking structures, returning True if DOI validated successfully in at least one format. """ - csl_matched, bibtex_matched, csl_entry, bibtex_entry = validate_doi_candidate( - doi, baseline_entry, result_id - ) + csl_matched, bibtex_matched, csl_entry, bibtex_entry = validate_doi_candidate(doi, baseline_entry, result_id) if csl_entry: enr_list.append(("csl", csl_entry)) @@ -203,7 +195,8 @@ def process_validated_doi( formats = [name for name, ok in [("CSL", csl_matched), ("BibTeX", bibtex_matched)] if ok] logger.success( f"{doi} validated successfully ({', '.join(formats)})", - category=LogCategory.MATCH, source=LogSource.DOI, + category=LogCategory.MATCH, + source=LogSource.DOI, ) return csl_matched or bibtex_matched diff --git a/src/id_utils.py b/src/id_utils.py index d5282152..564c8665 100644 --- a/src/id_utils.py +++ b/src/id_utils.py @@ -53,8 +53,8 @@ def doi_bases_match(doi_a: str, doi_b: str) -> bool: Handles Preprints.org ``10.20944/preprints202304.0409.v1`` → ``.v2`` and similar version-suffixed DOIs. """ - a = re.sub(r'\.v\d+$', '', doi_a.lower().strip()) - b = re.sub(r'\.v\d+$', '', doi_b.lower().strip()) + a = re.sub(r"\.v\d+$", "", doi_a.lower().strip()) + b = re.sub(r"\.v\d+$", "", doi_b.lower().strip()) return bool(a) and a == b @@ -66,8 +66,8 @@ def _norm_arxiv_id(s: str | None) -> str | None: if not s: return None t = str(s).strip() - t = re.sub(r'(?i)^arxiv:\s*', '', t) - t = re.sub(r'v\d+$', '', t) + t = re.sub(r"(?i)^arxiv:\s*", "", t) + t = re.sub(r"v\d+$", "", t) return t.strip() or None @@ -93,7 +93,8 @@ def find_doi_in_html(html: str) -> str | None: if d and re.search(_DOI_REGEX, d, flags=re.IGNORECASE): logger.debug( f"DOI_HTML_SEARCH | meta_match=True | doi={d}", - category=LogCategory.AUDIT, source=LogSource.DOI, + category=LogCategory.AUDIT, + source=LogSource.DOI, ) return d m = re.search(_DOI_REGEX, html, flags=re.IGNORECASE) @@ -101,7 +102,8 @@ def find_doi_in_html(html: str) -> str | None: if fulltext_result: logger.debug( f"DOI_HTML_SEARCH | fulltext_match=True | doi={fulltext_result}", - category=LogCategory.AUDIT, source=LogSource.DOI, + category=LogCategory.AUDIT, + source=LogSource.DOI, ) return fulltext_result @@ -127,8 +129,8 @@ def find_arxiv_in_text(text: str) -> str | None: # Ordered patterns: prefix, URL, DOI _patterns: list[tuple[str, str, int]] = [ - (r'(?i)arxiv[:/\s]*(\d{4}\.\d{4,5})(?:v\d+)?', "prefix", 1), - (r'(?i)arxiv\.org/(abs|pdf)/(\d{4}\.\d{4,5})', "url", 2), + (r"(?i)arxiv[:/\s]*(\d{4}\.\d{4,5})(?:v\d+)?", "prefix", 1), + (r"(?i)arxiv\.org/(abs|pdf)/(\d{4}\.\d{4,5})", "url", 2), (ARXIV_DOI_EXTRACT_PATTERN, "doi", 1), ] for pattern, label, group in _patterns: @@ -137,7 +139,8 @@ def find_arxiv_in_text(text: str) -> str | None: result = _norm_arxiv_id(m.group(group)) logger.debug( f"TEXT_SEARCH | matched={label} | found={result or 'none'}", - category=LogCategory.ARXIV, source=LogSource.ARXIV, + category=LogCategory.ARXIV, + source=LogSource.ARXIV, ) return result @@ -155,27 +158,30 @@ def allowlisted_url(url: str | None) -> str | None: return None u = url.strip() - doi_match = re.search(r'^https?://(dx\.)?doi\.org/(\S+)$', u, flags=re.IGNORECASE) + doi_match = re.search(r"^https?://(dx\.)?doi\.org/(\S+)$", u, flags=re.IGNORECASE) if doi_match: result = f"https://doi.org/{doi_match.group(2)}" logger.debug( f"URL_ALLOWLIST | url={url[:60]} | type=doi | normalized={result}", - category=LogCategory.AUDIT, source=LogSource.DOI, + category=LogCategory.AUDIT, + source=LogSource.DOI, ) return result - arxiv_match = re.search(r'^https?://arxiv\.org/(abs|pdf)/(\S+)$', u, flags=re.IGNORECASE) + arxiv_match = re.search(r"^https?://arxiv\.org/(abs|pdf)/(\S+)$", u, flags=re.IGNORECASE) if arxiv_match: result = f"https://arxiv.org/{arxiv_match.group(1)}/{arxiv_match.group(2)}" logger.debug( f"URL_ALLOWLIST | url={url[:60]} | type=arxiv | normalized={result}", - category=LogCategory.AUDIT, source=LogSource.ARXIV, + category=LogCategory.AUDIT, + source=LogSource.ARXIV, ) return result logger.debug( f"URL_ALLOWLIST | url={url[:60]} | type=rejected | normalized=none", - category=LogCategory.AUDIT, source=LogSource.DOI, + category=LogCategory.AUDIT, + source=LogSource.DOI, ) return None @@ -192,11 +198,11 @@ def extract_arxiv_eprint(entry: dict[str, Any]) -> str | None: return _norm_arxiv_id(fields.get("eprint")) # Extract from arXiv DOI (10.48550/arxiv.XXXX.YYYYY) doi = (fields.get("doi") or "").strip().lower() - doi_m = re.search(r'10\.48550/arxiv\.(\d{4}\.\d{4,5})', doi) + doi_m = re.search(r"10\.48550/arxiv\.(\d{4}\.\d{4,5})", doi) if doi_m: return _norm_arxiv_id(doi_m.group(1)) j = fields.get("journal") or fields.get("howpublished") or "" - m = re.search(r'(?i)arxiv:\s*(\d{4}\.\d{4,5})(v\d+)?', j) + m = re.search(r"(?i)arxiv:\s*(\d{4}\.\d{4,5})(v\d+)?", j) if m: return _norm_arxiv_id(m.group(1)) return None @@ -210,9 +216,9 @@ def external_ids_match(fields_a: dict[str, Any], fields_b: dict[str, Any]) -> bo if a_val and b_val: match = a_val == b_val logger.debug( - f"EXTERNAL_ID_CHECK | field={field}" - f" | a={a_val[:30]} | b={b_val[:30]} | match={match}", - category=LogCategory.DEDUP, source=LogSource.DOI, + f"EXTERNAL_ID_CHECK | field={field} | a={a_val[:30]} | b={b_val[:30]} | match={match}", + category=LogCategory.DEDUP, + source=LogSource.DOI, ) if match: return True @@ -249,28 +255,29 @@ def normalize_arxiv_metadata(fields: dict[str, Any]) -> dict[str, Any]: # Always check and remove pages if it contains arXiv ID (not valid page numbers) pages = fields.get("pages", "") if pages: - m = re.search(r'(?i)arxiv:\s*(\d{4}\.\d{4,5})', pages) + m = re.search(r"(?i)arxiv:\s*(\d{4}\.\d{4,5})", pages) if m: if not arxiv_id: arxiv_id = _norm_arxiv_id(m.group(1)) # remove arXiv ID from pages - it doesn't belong there logger.debug( f"PAGES_REMOVE | val={pages} | reason=contains_arxiv_id", - category=LogCategory.ARXIV, source=LogSource.ARXIV, + category=LogCategory.ARXIV, + source=LogSource.ARXIV, ) fields.pop("pages", None) # 4. check journal field for arXiv patterns journal = fields.get("journal", "") if not arxiv_id and journal: - m = re.search(r'(?i)arxiv:\s*(\d{4}\.\d{4,5})', journal) + m = re.search(r"(?i)arxiv:\s*(\d{4}\.\d{4,5})", journal) if m: arxiv_id = _norm_arxiv_id(m.group(1)) # 5. check URL for arXiv link url = fields.get("url", "") if not arxiv_id and url: - m = re.search(r'(?i)arxiv\.org/(abs|pdf)/(\d{4}\.\d{4,5})', url) + m = re.search(r"(?i)arxiv\.org/(abs|pdf)/(\d{4}\.\d{4,5})", url) if m: arxiv_id = _norm_arxiv_id(m.group(2)) @@ -281,14 +288,15 @@ def normalize_arxiv_metadata(fields: dict[str, Any]) -> dict[str, Any]: f" | journal={bool(fields.get('journal'))}" f" | url={bool(fields.get('url'))}" f" | id={arxiv_id or 'none'}", - category=LogCategory.ARXIV, source=LogSource.ARXIV, + category=LogCategory.ARXIV, + source=LogSource.ARXIV, ) if arxiv_id: logger.debug( - f"SET_EPRINT | id={arxiv_id} | archiveprefix=arXiv" - f" | primaryclass={primary_class or 'none'}", - category=LogCategory.ARXIV, source=LogSource.ARXIV, + f"SET_EPRINT | id={arxiv_id} | archiveprefix=arXiv | primaryclass={primary_class or 'none'}", + category=LogCategory.ARXIV, + source=LogSource.ARXIV, ) fields["eprint"] = arxiv_id fields["archiveprefix"] = "arXiv" @@ -300,7 +308,8 @@ def normalize_arxiv_metadata(fields: dict[str, Any]) -> dict[str, Any]: if publisher_val.lower() in _ARXIV_PUBLISHER_NAMES: logger.debug( f"PUBLISHER_REMOVE | val={publisher_val}", - category=LogCategory.ARXIV, source=LogSource.ARXIV, + category=LogCategory.ARXIV, + source=LogSource.ARXIV, ) fields.pop("publisher", None) @@ -309,12 +318,13 @@ def normalize_arxiv_metadata(fields: dict[str, Any]) -> dict[str, Any]: is_arxiv_journal = ( journal_lower in _ARXIV_PUBLISHER_NAMES or "arxiv preprint" in journal_lower - or bool(re.search(r'arxiv:\s*\d{4}\.\d{4,5}', journal_lower)) + or bool(re.search(r"arxiv:\s*\d{4}\.\d{4,5}", journal_lower)) ) if is_arxiv_journal: logger.debug( f"JOURNAL_REMOVE | old={journal} | reason=arxiv_is_preprint", - category=LogCategory.ARXIV, source=LogSource.ARXIV, + category=LogCategory.ARXIV, + source=LogSource.ARXIV, ) fields.pop("journal", None) @@ -323,7 +333,8 @@ def normalize_arxiv_metadata(fields: dict[str, Any]) -> dict[str, Any]: arxiv_url = f"https://arxiv.org/abs/{arxiv_id}" logger.debug( f"URL_SET | url={arxiv_url}", - category=LogCategory.ARXIV, source=LogSource.ARXIV, + category=LogCategory.ARXIV, + source=LogSource.ARXIV, ) fields["url"] = arxiv_url else: diff --git a/src/io_utils.py b/src/io_utils.py index b5bf35b5..01060079 100644 --- a/src/io_utils.py +++ b/src/io_utils.py @@ -64,10 +64,7 @@ def _candidate_paths(primary: str, legacy: str | None = None) -> list[str]: def _read_key_file( - path: str, - legacy: str | None = None, - required: bool = True, - expected_lines: int = 1 + path: str, legacy: str | None = None, required: bool = True, expected_lines: int = 1 ) -> list[str] | None: """ Generic key file reader that handles common patterns for loading API keys and @@ -84,9 +81,7 @@ def _read_key_file( last_err = ValueError(f"{os.path.basename(p)} is empty") continue if len(lines) < expected_lines: - last_err = ValueError( - f"{os.path.basename(p)} has {len(lines)} line(s), expected {expected_lines}" - ) + last_err = ValueError(f"{os.path.basename(p)} has {len(lines)} line(s), expected {expected_lines}") continue return lines except FileNotFoundError as e: @@ -179,7 +174,8 @@ def read_records(path: str = DEFAULT_INPUT) -> list[Record]: if not name and (scholar_id or dblp_id): logging.getLogger("CiteForge.io").warning( "Skipping record with empty Name but ID(s): %s/%s", - scholar_id, dblp_id, + scholar_id, + dblp_id, ) continue @@ -380,8 +376,7 @@ def collect_orphan_files(csv_path: str, output_dir: str) -> list[str]: orphans: list[str] = [] try: subdirs = [ - os.path.join(output_dir, d) for d in os.listdir(output_dir) - if os.path.isdir(os.path.join(output_dir, d)) + os.path.join(output_dir, d) for d in os.listdir(output_dir) if os.path.isdir(os.path.join(output_dir, d)) ] except OSError: return [] @@ -484,9 +479,7 @@ def build_a2i2_folder( # --- Step 2: build name -> Record lookup -------------------------------- name_to_rec: dict[str, Record] = { - normalize_person_name(rec.name): rec - for rec in records - if normalize_person_name(rec.name) + normalize_person_name(rec.name): rec for rec in records if normalize_person_name(rec.name) } # --- Step 3: collect .bib files from member directories ----------------- @@ -554,9 +547,7 @@ def _pick_richer( if not doi: continue - matched_key = doi if doi in doi_to_idx else next( - (d for d in doi_to_idx if doi_bases_match(doi, d)), None - ) + matched_key = doi if doi in doi_to_idx else next((d for d in doi_to_idx if doi_bases_match(doi, d)), None) if matched_key is not None: ki = doi_to_idx[matched_key] diff --git a/src/log_utils.py b/src/log_utils.py index 8656c099..6733fb33 100644 --- a/src/log_utils.py +++ b/src/log_utils.py @@ -17,6 +17,7 @@ class LogSource: """Data-source constants for log naming and coloring.""" + SCHOLAR = "Scholar" DBLP = "DBLP" S2 = "Semantic Scholar" @@ -32,6 +33,7 @@ class LogSource: class LogCategory: """Constants for log categories to replace indentation with semantic tagging.""" + AUTHOR = "AUTHOR" ARTICLE = "ARTICLE" FETCH = "FETCH" @@ -118,10 +120,17 @@ class ColoredFormatter(logging.Formatter): LogCategory.PLAN: MAGENTA, **dict.fromkeys( [ - LogCategory.AUDIT, LogCategory.MERGE, LogCategory.CLEANUP, - LogCategory.DEDUP, LogCategory.CACHE, LogCategory.SCORE, - LogCategory.DOI_VAL, LogCategory.ARXIV, LogCategory.PARSE, - LogCategory.SERIAL, LogCategory.CITEKEY, + LogCategory.AUDIT, + LogCategory.MERGE, + LogCategory.CLEANUP, + LogCategory.DEDUP, + LogCategory.CACHE, + LogCategory.SCORE, + LogCategory.DOI_VAL, + LogCategory.ARXIV, + LogCategory.PARSE, + LogCategory.SERIAL, + LogCategory.CITEKEY, ], DARK_GRAY, ), @@ -144,9 +153,7 @@ def format(self, record: logging.LogRecord) -> str: if self.use_color: if record.levelname in self.LEVEL_COLORS: - record.levelname = ( - f"{self.LEVEL_COLORS[record.levelname]}{record.levelname}{self.RESET}" - ) + record.levelname = f"{self.LEVEL_COLORS[record.levelname]}{record.levelname}{self.RESET}" parts: list[str] = [] if source: diff --git a/src/models.py b/src/models.py index 96046ca8..7c77997f 100644 --- a/src/models.py +++ b/src/models.py @@ -10,6 +10,7 @@ class Record: major academic platforms. This allows the rest of the pipeline to look up publications and metadata in a consistent way. """ + name: str scholar_id: str = "" # Google Scholar author ID (optional) dblp: str = "" # DBLP person ID (optional) diff --git a/src/publication_parser.py b/src/publication_parser.py index b5fcfe7b..56c484ac 100644 --- a/src/publication_parser.py +++ b/src/publication_parser.py @@ -19,9 +19,7 @@ PREPRINT_SERVERS, ) -_CONFERENCE_AS_JOURNAL_LOWER: frozenset[str] = frozenset( - c.lower() for c in CONFERENCE_AS_JOURNAL -) +_CONFERENCE_AS_JOURNAL_LOWER: frozenset[str] = frozenset(c.lower() for c in CONFERENCE_AS_JOURNAL) # --------------------------------------------------------------------------- # Pre-compiled regexes (applied in cascade order) @@ -36,9 +34,7 @@ # Pattern 2: Journal vol, pages, year (no issue) # e.g. "IEEE Access 14, 9506-9531, 2026" -_JOURNAL_VOL_PAGES_RE = re.compile( - r"^(.+?)\s+(\d+)\s*,\s*(\w[\w\s,\u2013-]*?)\s*,\s*(\d{4})\s*$" -) +_JOURNAL_VOL_PAGES_RE = re.compile(r"^(.+?)\s+(\d+)\s*,\s*(\w[\w\s,\u2013-]*?)\s*,\s*(\d{4})\s*$") # Pattern 3: arXiv preprint # e.g. "arXiv preprint arXiv:2407.18753, 2024" @@ -56,15 +52,11 @@ # Pattern 5: US Patent # e.g. "US Patent 10,901,713, 2021" or "US Patent App. 16/234,567, 2019" -_PATENT_RE = re.compile( - r"^US\s+Patent(?:\s+App\.?)?\s+([\d,/]+)\s*,\s*(\d{4})\s*$", re.IGNORECASE -) +_PATENT_RE = re.compile(r"^US\s+Patent(?:\s+App\.?)?\s+([\d,/]+)\s*,\s*(\d{4})\s*$", re.IGNORECASE) # Pattern 6/7: Venue with pages, year (conference or generic) # e.g. "Proceedings of the 2020 GECCO conference, 1-8, 2020" -_VENUE_PAGES_YEAR_RE = re.compile( - r"^(.+?)\s*,\s*(\w[\w\s,\u2013-]*?)\s*,\s*(\d{4})\s*$" -) +_VENUE_PAGES_YEAR_RE = re.compile(r"^(.+?)\s*,\s*(\w[\w\s,\u2013-]*?)\s*,\s*(\d{4})\s*$") # Pattern 8: Venue, year (no pages, no volume) # e.g. "Sage, 2021" @@ -75,12 +67,13 @@ # Data class # --------------------------------------------------------------------------- + @dataclass(frozen=True) class ParsedPublication: """Structured fields extracted from a SerpAPI publication string.""" venue_name: str = "" - venue_type: str = "unknown" # journal | conference | preprint | patent | publisher | unknown + venue_type: str = "unknown" # journal | conference | preprint | patent | publisher | unknown volume: str = "" issue: str = "" pages: str = "" @@ -95,6 +88,7 @@ class ParsedPublication: # Venue-type classifier # --------------------------------------------------------------------------- + def _classify_venue_type(venue: str) -> str: """Classify a venue name as journal, conference, preprint, or unknown.""" low = venue.lower().strip() @@ -123,7 +117,7 @@ def _strip_ellipsis(text: str) -> str: t = text.rstrip() for suffix in ("...", "\u2026"): if t.endswith(suffix): - t = t[:-len(suffix)].rstrip() + t = t[: -len(suffix)].rstrip() t = _TRAILING_PREPOSITIONS.sub("", t) return t.rstrip(" ,;:") return text @@ -139,6 +133,7 @@ def _is_page_like(token: str) -> bool: # Main parser # --------------------------------------------------------------------------- + def parse_publication_string(pub: str | None) -> ParsedPublication | None: """Parse a SerpAPI ``publication`` string into structured metadata. diff --git a/src/text_utils.py b/src/text_utils.py index 0c2b329f..482103e6 100644 --- a/src/text_utils.py +++ b/src/text_utils.py @@ -19,7 +19,7 @@ from .id_utils import external_ids_match _ET_AL = "et al." -_ABBREVIATED_AUTHOR_PATTERN = re.compile(r'^[A-Z]\.?[ \t]*[A-Z]?\.?[ \t]*[A-Z]?\.?[ \t]+[A-Z][a-z]+', re.IGNORECASE) +_ABBREVIATED_AUTHOR_PATTERN = re.compile(r"^[A-Z]\.?[ \t]*[A-Z]?\.?[ \t]*[A-Z]?\.?[ \t]+[A-Z][a-z]+", re.IGNORECASE) __all__ = [ "author_in_text", @@ -40,7 +40,6 @@ "is_truncated", "is_valid_value", "name_signature", - "normalize_person_name", "normalize_title", "parse_authors_any", @@ -138,10 +137,10 @@ def normalize_title(t: str | None) -> str: t_str = str(t) t_str = html_module.unescape(t_str) - t_str = re.sub(r'\$([^$]*)\$', r'\1', t_str) - t_str = re.sub(r'\\frac\{([^}]*)\}\{([^}]*)\}', r'\1/\2', t_str) - t_str = re.sub(r'\\[a-zA-Z]+\{([^}]*)}', r'\1', t_str) - t_str = re.sub(r'\\[a-zA-Z]+', '', t_str) + t_str = re.sub(r"\$([^$]*)\$", r"\1", t_str) + t_str = re.sub(r"\\frac\{([^}]*)\}\{([^}]*)\}", r"\1/\2", t_str) + t_str = re.sub(r"\\[a-zA-Z]+\{([^}]*)}", r"\1", t_str) + t_str = re.sub(r"\\[a-zA-Z]+", "", t_str) t2 = strip_accents(t_str).lower() t2 = re.sub(r"[,.;:!?\n\t\r'\"\-\(\)\[\]\{\}~]", " ", t2) result = " ".join(t2.split()) @@ -156,18 +155,56 @@ def normalize_title(t: str | None) -> str: _ARTIFACT_PREFIXES = ("Check for updates ", "Check for Updates ") -_DANGLING_ENDINGS = frozenset({ - "a", "an", "the", "of", "in", "on", "at", "to", "for", "from", - "with", "by", "and", "or", "but", "via", "using", "based", -}) +_DANGLING_ENDINGS = frozenset( + { + "a", + "an", + "the", + "of", + "in", + "on", + "at", + "to", + "for", + "from", + "with", + "by", + "and", + "or", + "but", + "via", + "using", + "based", + } +) _TRUNCATION_MARKERS = ("...", "\u2026", "et al", _ET_AL, "[truncated]", "[...]") # Words that should stay uppercase when converting ALL-CAPS titles to title case -_ACRONYMS = frozenset({ - "a", "an", "and", "as", "at", "but", "by", "for", "if", "in", - "nor", "of", "on", "or", "so", "the", "to", "up", "vs", "yet", -}) +_ACRONYMS = frozenset( + { + "a", + "an", + "and", + "as", + "at", + "but", + "by", + "for", + "if", + "in", + "nor", + "of", + "on", + "or", + "so", + "the", + "to", + "up", + "vs", + "yet", + } +) def _fix_allcaps_title(s: str) -> str: @@ -212,14 +249,14 @@ def trim_title_default(t: str | None) -> str: return "" for prefix in _ARTIFACT_PREFIXES: if s.startswith(prefix): - s = s[len(prefix):] + s = s[len(prefix) :] break if s.endswith("…") or s.endswith("..."): return _fix_allcaps_title(s) - s = s.rstrip('*').rstrip() + s = s.rstrip("*").rstrip() i = len(s) - 1 dots = 0 - while i >= 0 and s[i] == '.': + while i >= 0 and s[i] == ".": dots += 1 i -= 1 if dots and dots < 3: @@ -258,10 +295,28 @@ def normalize_person_name(n: Any | None) -> str: return " ".join(n2.split()) -_NOBLE_PARTICLES = frozenset({ - "van", "von", "de", "del", "der", "den", "di", "la", "le", "al", - "el", "bin", "ibn", "da", "dos", "das", "du", "lo", -}) +_NOBLE_PARTICLES = frozenset( + { + "van", + "von", + "de", + "del", + "der", + "den", + "di", + "la", + "le", + "al", + "el", + "bin", + "ibn", + "da", + "dos", + "das", + "du", + "lo", + } +) _INITIALS_EXCLUSIONS = frozenset({"jr", "sr", "ii", "iii", "iv", "md", "phd"}) @@ -270,10 +325,7 @@ def normalize_person_name(n: Any | None) -> str: def _is_initials_token(token: str) -> bool: """Check if a token is uppercase initials (1-4 chars, not a suffix/title).""" clean = token.replace(".", "").strip() - return (1 <= len(clean) <= 4 - and clean.isalpha() - and clean.isupper() - and clean.lower() not in _INITIALS_EXCLUSIONS) + return 1 <= len(clean) <= 4 and clean.isalpha() and clean.isupper() and clean.lower() not in _INITIALS_EXCLUSIONS _RE_NON_ALNUM = r"[^a-z0-9]" @@ -307,8 +359,7 @@ def name_signature(n: Any | None) -> dict[str, Any] | None: # Detect PubMed/Europe PMC "Lastname INITIALS" format (e.g. "Alanko JN") # by checking if the last token in the original text is all uppercase raw_tokens = to_text(n).strip().split() - if (len(tokens) == 2 and len(raw_tokens) == 2 - and _is_initials_token(raw_tokens[-1])): + if len(tokens) == 2 and len(raw_tokens) == 2 and _is_initials_token(raw_tokens[-1]): last_norm = re.sub(_RE_NON_ALNUM, "", tokens[0]) initials = re.sub(r"[^a-z]", "", tokens[1]) return {"last": last_norm, "initials": initials} @@ -355,7 +406,7 @@ def format_author_dirname(author_name: str | None, author_id: str) -> str: """ last_name = extract_last_name(author_name) - sanitized_id = re.sub(r'[/\\:*?"<>|]+', '-', author_id) + sanitized_id = re.sub(r'[/\\:*?"<>|]+', "-", author_id) if not sanitized_id: if last_name and last_name != "Unknown": @@ -480,12 +531,8 @@ def author_overlap_ratio(authors_a: str | None, authors_b: str | None) -> float: def venue_similarity(fields_a: dict[str, Any], fields_b: dict[str, Any]) -> float: """Compute similarity between venues, with a 0.5 bonus for preprint/published pairs.""" - a_venue = ( - fields_a.get("journal") or fields_a.get("booktitle") or fields_a.get("howpublished") or "" - ).strip() - b_venue = ( - fields_b.get("journal") or fields_b.get("booktitle") or fields_b.get("howpublished") or "" - ).strip() + a_venue = (fields_a.get("journal") or fields_a.get("booktitle") or fields_a.get("howpublished") or "").strip() + b_venue = (fields_b.get("journal") or fields_b.get("booktitle") or fields_b.get("howpublished") or "").strip() if not a_venue or not b_venue: return 0.0 a_norm = normalize_title(a_venue) @@ -513,9 +560,7 @@ def compute_dedup_score(fields_a: dict[str, Any], fields_b: dict[str, Any]) -> f score = 0.0 # Signal 1: Title similarity (weight 0.40) - title_sim = title_similarity( - str(fields_a.get("title") or ""), str(fields_b.get("title") or "") - ) + title_sim = title_similarity(str(fields_a.get("title") or ""), str(fields_b.get("title") or "")) score += 0.40 * title_sim # Signal 2: Author overlap ratio (weight 0.25) @@ -609,11 +654,7 @@ def author_in_text(target_author: str | None, text: Any) -> bool: return re.search(rf"\b{re.escape(last_tok)}\b", txt) is not None -def extract_year_from_any( - obj: Any, - field_names: list[str] | None = None, - fallback: int | None = None -) -> int | None: +def extract_year_from_any(obj: Any, field_names: list[str] | None = None, fallback: int | None = None) -> int | None: """ Try to recover a four-digit publication year from many possible formats, including integers, free text, date dictionaries, Crossref-style date parts, @@ -648,8 +689,10 @@ def extract_year_from_any( if isinstance(issued, dict): parts = issued.get("date-parts") if ( - isinstance(parts, list) and parts - and isinstance(parts[0], list) and parts[0] + isinstance(parts, list) + and parts + and isinstance(parts[0], list) + and parts[0] and isinstance(parts[0][0], int) ): year = parts[0][0] @@ -661,6 +704,7 @@ def extract_year_from_any( if isinstance(ms, (int, float)): try: from datetime import datetime, timezone + year = datetime.fromtimestamp(float(ms) / 1000.0, timezone.utc).year if VALID_YEAR_MIN <= year <= VALID_YEAR_MAX: return year @@ -674,12 +718,12 @@ def extract_year_from_any( def extract_authors_from_any( - obj: Any, - field_names: list[str] | None = None, - sanitize_dblp: bool = False, - name_key: str = "name", - given_key: str | None = None, - family_key: str | None = None + obj: Any, + field_names: list[str] | None = None, + sanitize_dblp: bool = False, + name_key: str = "name", + given_key: str | None = None, + family_key: str | None = None, ) -> list[str]: """ Extract a list of author names from flexible metadata structures such as lists, @@ -693,6 +737,7 @@ def extract_authors_from_any( # Lazy import to avoid circular dependency; cached after first call if sanitize_dblp: from .clients.helpers import _sanitize_dblp_author + _sanitize: Any = _sanitize_dblp_author else: _sanitize = None @@ -704,8 +749,12 @@ def extract_authors_from_any( val = obj.get(fname) if val is not None: authors = extract_authors_from_any( - val, field_names=None, sanitize_dblp=sanitize_dblp, - name_key=name_key, given_key=given_key, family_key=family_key + val, + field_names=None, + sanitize_dblp=sanitize_dblp, + name_key=name_key, + given_key=given_key, + family_key=family_key, ) if authors: return authors @@ -777,12 +826,8 @@ def extract_authors_from_any( parts = [p.strip() for p in obj_str.split(",")] if obj_str.count(",") > 1: authors = [p for p in parts if p] - elif ( - len(parts) == 2 - and ( - all(_ABBREVIATED_AUTHOR_PATTERN.match(p) for p in parts) - or all(" " in p.strip() for p in parts) - ) + elif len(parts) == 2 and ( + all(_ABBREVIATED_AUTHOR_PATTERN.match(p) for p in parts) or all(" " in p.strip() for p in parts) ): authors = parts else: @@ -799,11 +844,7 @@ def extract_authors_from_any( return authors -def extract_valid_title( - obj: Any, - field_names: list[str] | None = None, - check_placeholder: bool = True -) -> str | None: +def extract_valid_title(obj: Any, field_names: list[str] | None = None, check_placeholder: bool = True) -> str | None: """ Pull a title from an object using common field names, discard placeholder-like values, and return a trimmed version or None when no usable title is available. @@ -853,18 +894,12 @@ def is_valid_value(val: Any, check_placeholder: bool = True) -> bool: return True -def filter_valid_fields( - fields: dict[str, Any], - check_placeholder: bool = True -) -> dict[str, Any]: +def filter_valid_fields(fields: dict[str, Any], check_placeholder: bool = True) -> dict[str, Any]: """ Remove keys whose values are empty, None, or placeholder-like so the remaining dictionary contains only useful metadata fields. """ - return { - k: v for k, v in fields.items() - if is_valid_value(v, check_placeholder=check_placeholder) - } + return {k: v for k, v in fields.items() if is_valid_value(v, check_placeholder=check_placeholder)} def is_truncated(text: str | None) -> bool: @@ -906,7 +941,7 @@ def safe_get_field( default: str = "", strip: bool = True, required: bool = False, - check_placeholder: bool = False + check_placeholder: bool = False, ) -> str | None: """ Safely extract and validate a string field from a dictionary, handling None values, @@ -952,19 +987,10 @@ def safe_get_nested(obj: Any, *keys: str, default: Any = None) -> Any: def extract_author_names( - authors_field: Any, - *, - name_key: str = "name", - given_key: str | None = None, - family_key: str | None = None + authors_field: Any, *, name_key: str = "name", given_key: str | None = None, family_key: str | None = None ) -> list[str]: """ Extract author names from various formats including list of dicts, list of strings, comma-separated strings, and single dict or string. """ - return extract_authors_from_any( - authors_field, - name_key=name_key, - given_key=given_key, - family_key=family_key - ) + return extract_authors_from_any(authors_field, name_key=name_key, given_key=given_key, family_key=family_key) diff --git a/tests/fixtures.py b/tests/fixtures.py index e9c40817..4d25d030 100644 --- a/tests/fixtures.py +++ b/tests/fixtures.py @@ -15,9 +15,7 @@ def _load_keys_once() -> dict[str, Any]: "serply": io_utils.read_serply_api_key(API_CONFIGS["serply"]["key_file"]), "semantic": io_utils.read_semantic_api_key(API_CONFIGS["semantic_scholar"]["key_file"]), "openreview": io_utils.read_openreview_credentials(API_CONFIGS["openreview"]["key_file"]), - "gemini": io_utils.read_gemini_api_key( - API_CONFIGS.get("gemini", {}).get("key_file", "keys/Gemini.key") - ), + "gemini": io_utils.read_gemini_api_key(API_CONFIGS.get("gemini", {}).get("key_file", "keys/Gemini.key")), } diff --git a/tests/test_apis.py b/tests/test_apis.py index 92b3eb36..e898a390 100644 --- a/tests/test_apis.py +++ b/tests/test_apis.py @@ -84,7 +84,8 @@ def test_openalex_search() -> None: if not work: with contextlib.suppress(Exception): work = http_get_json( - f"https://api.openalex.org/works/{paper['openalex_id']}", timeout=15, + f"https://api.openalex.org/works/{paper['openalex_id']}", + timeout=15, ) work = work or OPENALEX_CANNED_WORK @@ -106,9 +107,7 @@ def test_all_multiple_candidate_functions_exist() -> None: "europepmc_search_papers_multiple", "openreview_search_papers_multiple", ): - assert callable(getattr(search_apis, func_name, None)), ( - f"Function {func_name} not found or not callable" - ) + assert callable(getattr(search_apis, func_name, None)), f"Function {func_name} not found or not callable" def test_crossref_multiple_candidates() -> None: @@ -152,7 +151,9 @@ def test_multiple_candidate_empty_inputs() -> None: assert isinstance(candidates, list), "None author: did not return list" candidates = search_apis.crossref_search_multiple( - "Attention Is All You Need", "Ashish Vaswani", max_results=0, + "Attention Is All You Need", + "Ashish Vaswani", + max_results=0, ) assert not candidates, f"max_results=0: expected empty list, got {len(candidates)} items" @@ -176,9 +177,7 @@ def test_api_field_mappings() -> None: def test_doi_validation_functions() -> None: """DOI validation utilities are present and callable.""" for func_name in ("validate_doi_candidate", "process_validated_doi"): - assert callable(getattr(doi_utils, func_name, None)), ( - f"{func_name} not found or not callable" - ) + assert callable(getattr(doi_utils, func_name, None)), f"{func_name} not found or not callable" def test_bibtex_building_from_openalex_canned() -> None: diff --git a/tests/test_config.py b/tests/test_config.py index 83181c6d..4dfb6693 100644 --- a/tests/test_config.py +++ b/tests/test_config.py @@ -32,9 +32,7 @@ def test_publications_per_year_reasonable() -> None: def test_contribution_window_reasonable() -> None: """Test that CONTRIBUTION_WINDOW_YEARS is a reasonable value.""" assert CONTRIBUTION_WINDOW_YEARS >= 1, "CONTRIBUTION_WINDOW_YEARS must be at least 1" - assert CONTRIBUTION_WINDOW_YEARS <= 20, ( - f"CONTRIBUTION_WINDOW_YEARS is very long ({CONTRIBUTION_WINDOW_YEARS})." - ) + assert CONTRIBUTION_WINDOW_YEARS <= 20, f"CONTRIBUTION_WINDOW_YEARS is very long ({CONTRIBUTION_WINDOW_YEARS})." def test_max_publications_positive() -> None: @@ -65,6 +63,7 @@ def test_min_year_valid() -> None: def test_get_min_year_fixed(monkeypatch: object) -> None: """Test that get_min_year returns the fixed MIN_YEAR when set.""" import pytest + mp = pytest.MonkeyPatch() mp.setattr(config, "MIN_YEAR", 2020) assert get_min_year() == 2020 @@ -74,6 +73,7 @@ def test_get_min_year_fixed(monkeypatch: object) -> None: def test_get_min_year_rolling(monkeypatch: object) -> None: """Test that get_min_year falls back to rolling window when MIN_YEAR is None.""" import pytest + mp = pytest.MonkeyPatch() mp.setattr(config, "MIN_YEAR", None) expected = datetime.now(timezone.utc).year - (_CONTRIBUTION_WINDOW_FALLBACK - 1) diff --git a/tests/test_core.py b/tests/test_core.py index e952abc2..8300e3f4 100644 --- a/tests/test_core.py +++ b/tests/test_core.py @@ -166,21 +166,27 @@ def test_arxiv_extraction() -> None: def test_bibtex_parsing() -> None: """Test BibTeX parsing.""" valid_cases = [ - (dedent(""" + ( + dedent(""" @inproceedings{Vaswani2017, title = {Attention Is All You Need}, author = {Ashish Vaswani}, year = {2017} } - """).strip(), {'type': 'inproceedings', 'key': 'Vaswani2017'}), - (dedent(""" + """).strip(), + {"type": "inproceedings", "key": "Vaswani2017"}, + ), + ( + dedent(""" @article{He2016, title = {Deep Residual Learning for Image Recognition}, author = {Kaiming He and Xiangyu Zhang}, year = {2016}, journal = {CVPR} } - """).strip(), {'type': 'article', 'key': 'He2016'}), + """).strip(), + {"type": "article", "key": "He2016"}, + ), ] for bibtex_str, expected_keys in valid_cases: @@ -203,19 +209,20 @@ def test_bibtex_building() -> None: 2017, keyhint="Vaswani2017", ) - assert bibtex and '@' in bibtex, "No valid BibTeX returned" + assert bibtex and "@" in bibtex, "No valid BibTeX returned" # Verify roundtrip parsed = bt.parse_bibtex_to_dict(bibtex) - assert parsed and 'title' in parsed.get('fields', {}), "Parsing built BibTeX failed" + assert parsed and "title" in parsed.get("fields", {}), "Parsing built BibTeX failed" # Dict to BibTeX entry = { - 'type': 'article', 'key': 'Vaswani2017', - 'fields': {'title': 'Attention Is All You Need', 'author': 'Ashish Vaswani', 'year': '2017'} + "type": "article", + "key": "Vaswani2017", + "fields": {"title": "Attention Is All You Need", "author": "Ashish Vaswani", "year": "2017"}, } bibtex2 = bt.bibtex_from_dict(entry) - assert bibtex2 and '@article' in bibtex2, "Invalid BibTeX from dict" + assert bibtex2 and "@article" in bibtex2, "Invalid BibTeX from dict" def test_bibtex_latex_stripping() -> None: @@ -231,7 +238,6 @@ def test_bibtex_latex_stripping() -> None: (r"\textsf{Sans Serif} Font", "Sans Serif Font"), (r"\underline{Underlined} Word", "Underlined Word"), (r"\mbox{No Break}", "No Break"), - # Old-style LaTeX formatting (r"{\it Italic} text here", "Italic text here"), (r"{\bf Bold} text here", "Bold text here"), @@ -240,11 +246,9 @@ def test_bibtex_latex_stripping() -> None: (r"{\tt Typewriter} font", "Typewriter font"), (r"{\rm Roman} font", "Roman font"), (r"{\sf Sans} font", "Sans font"), - # Nested formatting commands (r"\textbf{\textit{Nested}} formatting", "Nested formatting"), (r"\emph{\textbf{Double}} nested", "Double nested"), - # Special escaped characters (r"Research \& Development", r"Research \& Development"), (r"50\% Improvement", "50% Improvement"), @@ -252,24 +256,19 @@ def test_bibtex_latex_stripping() -> None: (r"Item \#1", "Item #1"), (r"Under\_score", "Under_score"), (r"Curly \{brace\}", "Curly {brace}"), - # Dashes ("Long---dash", "Long-dash"), ("Medium--dash", "Medium-dash"), ("En---and em--dashes together", "En-and em-dashes together"), - # Tilde (non-breaking space) # Note: trailing period is stripped by _sanitize_title for titles ("Smith~et~al.", "Smith et al"), - # Combined cases (r"\textit{Deep Learning}---A \textbf{Survey}", "Deep Learning-A Survey"), (r"The \emph{Art} of \textbf{Programming}: 50\% Complete", "The Art of Programming: 50% Complete"), - # Edge cases - no LaTeX (should pass through unchanged) ("Plain text title", "Plain text title"), ("Title with: colon and punctuation!", "Title with: colon and punctuation!"), - # Multiple spaces should be collapsed (r"\textit{Word} multiple spaces", "Word multiple spaces"), ] @@ -298,31 +297,24 @@ def test_bibtex_unicode_normalization() -> None: ("François Dubois", "Francois Dubois"), ("Jørgen Ødegård", "Jorgen Odegard"), ("Łukasz Kowalski", "Lukasz Kowalski"), - # Nordic characters ("Søren Kierkegaard", "Soren Kierkegaard"), ("Bjørn Borg", "Bjorn Borg"), ("Ærodynamics", "AErodynamics"), - # Unicode quotation marks - ("It\u2019s a \u201Ctest\u201D", "It's a \"test\""), + ("It\u2019s a \u201ctest\u201d", 'It\'s a "test"'), ("\u2018Single\u2019 quotes", "'Single' quotes"), - ("\u201CDouble\u201D quotes", "\"Double\" quotes"), - + ("\u201cDouble\u201d quotes", '"Double" quotes'), # Unicode dashes ("En\u2013dash", "En-dash"), ("Em—dash", "Em--dash"), - # Ellipsis ("Trailing…", "Trailing..."), - # Non-breaking space - ("Non\u00A0breaking", "Non breaking"), - + ("Non\u00a0breaking", "Non breaking"), # Year abbreviation fix ("Class of '21", "Class of'21"), ("Back in '99", "Back in'99"), - # Combined Unicode and special chars ("José's café—open 24/7", "Jose's cafe--open 24/7"), ] @@ -346,19 +338,14 @@ def test_bibtex_latex_and_unicode_combined() -> None: # LaTeX + accents (r"\textit{Café} Culture", "Cafe Culture"), (r"The \emph{naïve} approach", "The naive approach"), - # LaTeX + Unicode quotes - ("\\textbf{\u201CImportant\u201D} finding", "\"Important\" finding"), - + ("\\textbf{\u201cImportant\u201d} finding", '"Important" finding'), # LaTeX + dashes + accents (r"\emph{José}—A \textbf{Survey}", "Jose--A Survey"), - # Special chars + accents (r"50\% of café visitors", "50% of cafe visitors"), - # Full complex case - ("\\textit{François}'s \\textbf{café}—50\\% \u201Cdiscount\u201D", - "Francois's cafe--50% \"discount\""), + ("\\textit{François}'s \\textbf{café}—50\\% \u201cdiscount\u201d", 'Francois\'s cafe--50% "discount"'), ] for input_title, expected_title in test_cases: @@ -394,9 +381,7 @@ def test_bibtex_matching() -> None: parsed_bib1 = bt.parse_bibtex_to_dict(bib1) parsed_bib2 = bt.parse_bibtex_to_dict(bib2) assert parsed_bib1 is not None and parsed_bib2 is not None - assert bt.bibtex_entries_match_strict(parsed_bib1, parsed_bib2), ( - "Exact entries should match" - ) + assert bt.bibtex_entries_match_strict(parsed_bib1, parsed_bib2), "Exact entries should match" # With normalization bib3 = dedent(""" @@ -408,9 +393,7 @@ def test_bibtex_matching() -> None: """).strip() parsed_bib3 = bt.parse_bibtex_to_dict(bib3) assert parsed_bib3 is not None - assert bt.bibtex_entries_match_strict(parsed_bib1, parsed_bib3), ( - "Case/punctuation differences should match" - ) + assert bt.bibtex_entries_match_strict(parsed_bib1, parsed_bib3), "Case/punctuation differences should match" # Abbreviated authors bib4 = dedent(""" @@ -430,9 +413,7 @@ def test_bibtex_matching() -> None: parsed_bib4 = bt.parse_bibtex_to_dict(bib4) parsed_bib5 = bt.parse_bibtex_to_dict(bib5) assert parsed_bib4 is not None and parsed_bib5 is not None - assert bt.bibtex_entries_match_strict(parsed_bib4, parsed_bib5), ( - "Abbreviated authors should match" - ) + assert bt.bibtex_entries_match_strict(parsed_bib4, parsed_bib5), "Abbreviated authors should match" # Should NOT match bib6 = dedent(""" @@ -452,9 +433,7 @@ def test_bibtex_matching() -> None: parsed_bib6 = bt.parse_bibtex_to_dict(bib6) parsed_bib7 = bt.parse_bibtex_to_dict(bib7) assert parsed_bib6 is not None and parsed_bib7 is not None - assert not bt.bibtex_entries_match_strict(parsed_bib6, parsed_bib7), ( - "Different titles should NOT match" - ) + assert not bt.bibtex_entries_match_strict(parsed_bib6, parsed_bib7), "Different titles should NOT match" def test_bibtex_extra_fields() -> None: @@ -479,14 +458,12 @@ def test_bibtex_extra_fields() -> None: parsed_minimal = bt.parse_bibtex_to_dict(minimal) parsed_enriched = bt.parse_bibtex_to_dict(enriched) assert parsed_minimal is not None and parsed_enriched is not None - assert bt.bibtex_entries_match_strict(parsed_minimal, parsed_enriched), ( - "Extra fields should not prevent matching" - ) + assert bt.bibtex_entries_match_strict(parsed_minimal, parsed_enriched), "Extra fields should not prevent matching" def test_config() -> None: """Test configuration constants.""" - for const in ('CONTRIBUTION_WINDOW_YEARS', 'SIM_EXACT_PICK_THRESHOLD'): + for const in ("CONTRIBUTION_WINDOW_YEARS", "SIM_EXACT_PICK_THRESHOLD"): assert getattr(config, const, None) is not None, f"Missing constant: {const}" @@ -555,34 +532,36 @@ def test_merge_with_policy() -> None: primary = { "type": "misc", "key": "Vaswani2017", - "fields": { - "title": "Attention Is All You Need", - "author": "Ashish Vaswani", - "year": "2017" - } + "fields": {"title": "Attention Is All You Need", "author": "Ashish Vaswani", "year": "2017"}, } # Enrichers with different trust levels enrichers = [ - ("crossref", { - "type": "inproceedings", - "fields": { - "title": "Attention Is All You Need", - "author": "Ashish Vaswani", - "year": "2017", - "booktitle": "NeurIPS", - "doi": "10.5555/3295222.3295349" - } - }), - ("s2", { - "type": "article", - "fields": { - "title": "Attention Is All You Need", - "author": "Ashish Vaswani", - "year": "2017", - "volume": "30" - } - }), + ( + "crossref", + { + "type": "inproceedings", + "fields": { + "title": "Attention Is All You Need", + "author": "Ashish Vaswani", + "year": "2017", + "booktitle": "NeurIPS", + "doi": "10.5555/3295222.3295349", + }, + }, + ), + ( + "s2", + { + "type": "article", + "fields": { + "title": "Attention Is All You Need", + "author": "Ashish Vaswani", + "year": "2017", + "volume": "30", + }, + }, + ), ] merged = merge_utils.merge_with_policy(primary, enrichers) @@ -609,18 +588,12 @@ def test_merge_doi_arxiv_handling() -> None: "year": "2017", "eprint": "1706.03762", "archiveprefix": "arXiv", - } + }, } # Add DOI from trusted source enrichers = [ - ("crossref", { - "type": "inproceedings", - "fields": { - "doi": "10.5555/3295222.3295349", - "booktitle": "NeurIPS" - } - }), + ("crossref", {"type": "inproceedings", "fields": {"doi": "10.5555/3295222.3295349", "booktitle": "NeurIPS"}}), ] merged = merge_utils.merge_with_policy(primary, enrichers) @@ -639,45 +612,33 @@ def test_save_entry_to_file(tmp_path: Path) -> None: entry = { "type": "inproceedings", "key": "Vaswani2017", - "fields": { - "title": "Attention Is All You Need", - "author": "Ashish Vaswani", - "year": "2017" - } + "fields": {"title": "Attention Is All You Need", "author": "Ashish Vaswani", "year": "2017"}, } tmpdir_str = str(tmp_path) # Save first time - path1, written1 = merge_utils.save_entry_to_file( - tmpdir_str, "Scholar123", entry, - author_name="Ashish Vaswani" - ) + path1, written1 = merge_utils.save_entry_to_file(tmpdir_str, "Scholar123", entry, author_name="Ashish Vaswani") assert os.path.exists(path1), f"File not created: {path1}" assert written1, "First save should report was_written=True" # Save same entry again (should reuse same file) path2, _ = merge_utils.save_entry_to_file( - tmpdir_str, "Scholar123", entry, - prefer_path=path1, - author_name="Ashish Vaswani" + tmpdir_str, "Scholar123", entry, prefer_path=path1, author_name="Ashish Vaswani" ) assert path1 == path2, f"Should reuse same path: {path1} vs {path2}" # Modify entry and save (should create new file or update) entry["fields"]["booktitle"] = "NeurIPS" - path3, _ = merge_utils.save_entry_to_file( - tmpdir_str, "Scholar123", entry, - author_name="Ashish Vaswani" - ) + path3, _ = merge_utils.save_entry_to_file(tmpdir_str, "Scholar123", entry, author_name="Ashish Vaswani") assert os.path.exists(path3), f"Modified entry file not created: {path3}" def test_exception_definitions() -> None: """Test that exception tuples are properly defined.""" - for name in ('HTTP_ERRORS', 'NETWORK_ERRORS', 'ALL_API_ERRORS', 'FILE_IO_ERRORS'): + for name in ("HTTP_ERRORS", "NETWORK_ERRORS", "ALL_API_ERRORS", "FILE_IO_ERRORS"): assert isinstance(getattr(exceptions, name, None), tuple), f"{name} missing or not a tuple" @@ -723,7 +684,7 @@ def test_no_duplicate_titles_per_author() -> None: pass # intentionally skip unparseable .bib files for i, e1 in enumerate(entries): - for e2 in entries[i + 1:]: + for e2 in entries[i + 1 :]: t1 = e1.get("fields", {}).get("title", "") t2 = e2.get("fields", {}).get("title", "") if not t1 or not t2: @@ -738,14 +699,16 @@ def test_no_duplicate_titles_per_author() -> None: if d1 and d2 and d1 != d2: continue - duplicates.append({ - "author": author_dir.name, - "file1": e1["_filename"], - "file2": e2["_filename"], - "similarity": sim, - "title1": t1[:60], - "title2": t2[:60], - }) + duplicates.append( + { + "author": author_dir.name, + "file1": e1["_filename"], + "file2": e2["_filename"], + "similarity": sim, + "title1": t1[:60], + "title2": t2[:60], + } + ) if duplicates: msg_lines = ["Found duplicate entries that should be deduplicated:"] diff --git a/tests/test_data.py b/tests/test_data.py index 8cdb2036..56c23c92 100644 --- a/tests/test_data.py +++ b/tests/test_data.py @@ -5,8 +5,16 @@ { "name": "attention_is_all_you_need", "title": "Attention Is All You Need", - "authors": ["Ashish Vaswani", "Noam Shazeer", "Niki Parmar", "Jakob Uszkoreit", - "Llion Jones", "Aidan N. Gomez", "Lukasz Kaiser", "Illia Polosukhin"], + "authors": [ + "Ashish Vaswani", + "Noam Shazeer", + "Niki Parmar", + "Jakob Uszkoreit", + "Llion Jones", + "Aidan N. Gomez", + "Lukasz Kaiser", + "Illia Polosukhin", + ], "first_author": "Vaswani", "year": 2017, "venue": "NeurIPS", @@ -70,8 +78,14 @@ { "name": "crispr_cas9", "title": "A programmable dual-RNA-guided DNA endonuclease in adaptive bacterial immunity", - "authors": ["Martin Jinek", "Krzysztof Chylinski", "Ines Fonfara", "Michael Hauer", - "Jennifer A. Doudna", "Emmanuelle Charpentier"], + "authors": [ + "Martin Jinek", + "Krzysztof Chylinski", + "Ines Fonfara", + "Michael Hauer", + "Jennifer A. Doudna", + "Emmanuelle Charpentier", + ], "first_author": "Jinek", "year": 2012, "venue": "Science", @@ -108,14 +122,42 @@ { "name": "alphafold", "title": "Highly accurate protein structure prediction with AlphaFold", - "authors": ["John Jumper", "Richard Evans", "Alexander Pritzel", "Tim Green", "Michael Figurnov", - "Olaf Ronneberger", "Kathryn Tunyasuvunakool", "Russ Bates", "Augustin Žídek", - "Anna Potapenko", "Alex Bridgland", "Clemens Meyer", "Simon A. A. Kohl", - "Andrew J. Ballard", "Andrew Cowie", "Bernardino Romera-Paredes", "Stanislav Nikolov", - "Rishub Jain", "Jonas Adler", "Trevor Back", "Stig Petersen", "David Reiman", - "Ellen Clancy", "Michal Zielinski", "Martin Steinegger", "Michalina Pacholska", - "Tamish Berghammer", "Sebastian Bodenstein", "David Silver", "Oriol Vinyals", - "Andrew W. Senior", "Koray Kavukcuoglu", "Pushmeet Kohli", "Demis Hassabis"], + "authors": [ + "John Jumper", + "Richard Evans", + "Alexander Pritzel", + "Tim Green", + "Michael Figurnov", + "Olaf Ronneberger", + "Kathryn Tunyasuvunakool", + "Russ Bates", + "Augustin Žídek", + "Anna Potapenko", + "Alex Bridgland", + "Clemens Meyer", + "Simon A. A. Kohl", + "Andrew J. Ballard", + "Andrew Cowie", + "Bernardino Romera-Paredes", + "Stanislav Nikolov", + "Rishub Jain", + "Jonas Adler", + "Trevor Back", + "Stig Petersen", + "David Reiman", + "Ellen Clancy", + "Michal Zielinski", + "Martin Steinegger", + "Michalina Pacholska", + "Tamish Berghammer", + "Sebastian Bodenstein", + "David Silver", + "Oriol Vinyals", + "Andrew W. Senior", + "Koray Kavukcuoglu", + "Pushmeet Kohli", + "Demis Hassabis", + ], "first_author": "Jumper", "year": 2021, "venue": "Nature", diff --git a/tests/test_integration.py b/tests/test_integration.py index bd959123..0e800386 100644 --- a/tests/test_integration.py +++ b/tests/test_integration.py @@ -27,22 +27,22 @@ def test_fetch_and_merge(api_keys: dict[str, Any]) -> None: Validate end-to-end publication fetching from Scholar and DBLP followed by deduplication. """ - if not api_keys.get('serply'): + if not api_keys.get("serply"): pytest.skip("Serply key not available") rec = Record( - name=TEST_AUTHOR['name'], - scholar_id=TEST_AUTHOR['scholar_id'], - dblp=TEST_AUTHOR['dblp'], + name=TEST_AUTHOR["name"], + scholar_id=TEST_AUTHOR["scholar_id"], + dblp=TEST_AUTHOR["dblp"], ) scholar_data = scholar.fetch_author_publications( - api_keys['serply'], + api_keys["serply"], rec.scholar_id, rec.name, ) - scholar_pubs = scholar_data.get('articles', []) + scholar_pubs = scholar_data.get("articles", []) if not scholar_pubs: pytest.skip("Scholar returned no results (key expired or rate-limited)") @@ -101,31 +101,47 @@ def _try_enrichment_sources( ) -> list[tuple[str, dict[str, Any]]]: """Run all enrichment sources against a paper and return matched entries.""" enrichers: list[tuple[str, dict[str, Any]]] = [] - first_author = paper['first_author'] - title = paper['title'] + first_author = paper["first_author"] + title = paper["title"] + + if api_keys.get("semantic"): + _try_enrich( + "s2", + lambda: _fetch_and_build( + lambda: search_apis.s2_search_paper(title, first_author, api_keys["semantic"]), + search_apis.build_bibtex_from_s2, + first_author, + ), + baseline_entry, + enrichers, + ) - if api_keys.get('semantic'): - _try_enrich('s2', lambda: _fetch_and_build( - lambda: search_apis.s2_search_paper(title, first_author, api_keys['semantic']), - search_apis.build_bibtex_from_s2, first_author, - ), baseline_entry, enrichers) + _try_enrich( + "crossref", + lambda: _fetch_and_build( + lambda: search_apis.crossref_search(title, first_author), + search_apis.build_bibtex_from_crossref, + first_author, + ), + baseline_entry, + enrichers, + ) - _try_enrich('crossref', lambda: _fetch_and_build( - lambda: search_apis.crossref_search(title, first_author), - search_apis.build_bibtex_from_crossref, first_author, - ), baseline_entry, enrichers) + if paper["arxiv_id"]: - if paper['arxiv_id']: def fetch_arxiv() -> str | None: - entries = search_apis.arxiv_search(title, first_author, paper['year']) + entries = search_apis.arxiv_search(title, first_author, paper["year"]) return search_apis.build_bibtex_from_arxiv(entries[0], first_author) if entries else None - _try_enrich('arxiv', fetch_arxiv, baseline_entry, enrichers) - if paper['doi']: + _try_enrich("arxiv", fetch_arxiv, baseline_entry, enrichers) + + if paper["doi"]: + def fetch_csl() -> str | None: - csl = search_apis.fetch_csl_via_doi(paper['doi']) + csl = search_apis.fetch_csl_via_doi(paper["doi"]) return search_apis.bibtex_from_csl(csl, first_author) if csl else None - _try_enrich('csl', fetch_csl, baseline_entry, enrichers) + + _try_enrich("csl", fetch_csl, baseline_entry, enrichers) return enrichers @@ -134,7 +150,7 @@ def test_full_enrichment_pipeline(api_keys: dict[str, Any]) -> None: """ Execute the complete enrichment workflow for a known paper. """ - if not api_keys.get('serply'): + if not api_keys.get("serply"): pytest.skip("Serply key not available") paper = KNOWN_PAPERS[0] @@ -156,11 +172,11 @@ def test_full_enrichment_pipeline(api_keys: dict[str, Any]) -> None: merged_entry = merge_utils.merge_with_policy(baseline_entry, enrichers) - missing_fields = [f for f in REQUIRED_FIELDS if f not in merged_entry['fields']] + missing_fields = [f for f in REQUIRED_FIELDS if f not in merged_entry["fields"]] assert not missing_fields, f"Missing required fields after merge: {missing_fields}" final_bib = bibtex_utils.bibtex_from_dict(merged_entry) - assert '@' in final_bib, "Final BibTeX rendering failed" + assert "@" in final_bib, "Final BibTeX rendering failed" def test_file_output(tmp_path: Path) -> None: @@ -171,27 +187,27 @@ def test_file_output(tmp_path: Path) -> None: paper = KNOWN_PAPERS[0] entry: dict[str, Any] = { - 'type': 'inproceedings', - 'key': 'Vaswani2017:Attention', - 'fields': { - 'title': paper['title'], - 'author': ' and '.join(paper['authors']), - 'year': str(paper['year']), - 'booktitle': 'NeurIPS', - 'doi': paper['doi'], + "type": "inproceedings", + "key": "Vaswani2017:Attention", + "fields": { + "title": paper["title"], + "author": " and ".join(paper["authors"]), + "year": str(paper["year"]), + "booktitle": "NeurIPS", + "doi": paper["doi"], }, } saved_path, _ = merge_utils.save_entry_to_file( out_dir, - TEST_AUTHOR['scholar_id'], + TEST_AUTHOR["scholar_id"], entry, None, ) assert saved_path is not None, "save_entry_to_file returned no path" assert os.path.exists(saved_path), f"File was not created at {saved_path}" - assert '@inproceedings' in Path(saved_path).read_text(encoding='utf-8'), "File content invalid" + assert "@inproceedings" in Path(saved_path).read_text(encoding="utf-8"), "File content invalid" def test_csv_summary_integration(tmp_path: Path) -> None: @@ -200,41 +216,60 @@ def test_csv_summary_integration(tmp_path: Path) -> None: """ from src.io_utils import append_summary_to_csv, init_summary_csv - csv_path = tmp_path / 'summary.csv' + csv_path = tmp_path / "summary.csv" csv_path_str = str(csv_path) init_summary_csv(csv_path_str) assert csv_path.exists(), "CSV was not created" test_entries = [ - ("output/Vaswani/Attention.bib", 5, { - 'scholar_bib': True, 's2': True, 'crossref': True, - 'doi_csl': True, 'openalex': True, - }), - ("output/He/ResNet.bib", 2, { - 'arxiv': True, 'doi_bibtex': True, - }), + ( + "output/Vaswani/Attention.bib", + 5, + { + "scholar_bib": True, + "s2": True, + "crossref": True, + "doi_csl": True, + "openalex": True, + }, + ), + ( + "output/He/ResNet.bib", + 2, + { + "arxiv": True, + "doi_bibtex": True, + }, + ), ("output/Devlin/BERT.bib", 0, {}), ] _flag_keys = [ - 'scholar_bib', 'scholar_page', 's2', 'crossref', 'openreview', - 'arxiv', 'openalex', 'pubmed', 'europepmc', 'doi_csl', 'doi_bibtex', + "scholar_bib", + "scholar_page", + "s2", + "crossref", + "openreview", + "arxiv", + "openalex", + "pubmed", + "europepmc", + "doi_csl", + "doi_bibtex", ] for file_path, trust_hits, partial_flags in test_entries: flags = {k: partial_flags.get(k, False) for k in _flag_keys} append_summary_to_csv(csv_path_str, file_path, trust_hits, flags) - with open(csv_path_str, encoding='utf-8') as f: + with open(csv_path_str, encoding="utf-8") as f: rows = list(csv.DictReader(f)) assert len(rows) == len(test_entries), f"Expected {len(test_entries)} rows, got {len(rows)}" for i, (_, expected_hits, _) in enumerate(test_entries): - actual = int(rows[i]['trust_hits']) - assert actual == expected_hits, ( - f"Row {i}: expected trust_hits={expected_hits}, got {actual}" - ) + actual = int(rows[i]["trust_hits"]) + assert actual == expected_hits, f"Row {i}: expected trust_hits={expected_hits}, got {actual}" def test_complex_paper_enrichment(api_keys: dict[str, Any]) -> None: @@ -242,37 +277,40 @@ def test_complex_paper_enrichment(api_keys: dict[str, Any]) -> None: Test enrichment pipeline with a complex paper (AlphaFold) that has many authors and complex metadata. """ - if not api_keys.get('serply'): + if not api_keys.get("serply"): pytest.skip("Serply key not available") - paper = next(p for p in KNOWN_PAPERS if p['name'] == 'alphafold') + paper = next(p for p in KNOWN_PAPERS if p["name"] == "alphafold") baseline_entry: dict[str, Any] = { - 'type': 'article', - 'key': 'Jumper2021', - 'fields': { - 'title': paper['title'], - 'author': ' and '.join(paper['authors']), - 'year': str(paper['year']), - 'journal': paper['venue'], + "type": "article", + "key": "Jumper2021", + "fields": { + "title": paper["title"], + "author": " and ".join(paper["authors"]), + "year": str(paper["year"]), + "journal": paper["venue"], }, } enrichers: list[tuple[str, dict[str, Any]]] = [ - ('crossref', { - 'type': 'article', - 'fields': { - 'title': paper['title'], - 'author': ' and '.join(paper['authors']), - 'year': str(paper['year']), - 'doi': paper['doi'], - 'journal': 'Nature', + ( + "crossref", + { + "type": "article", + "fields": { + "title": paper["title"], + "author": " and ".join(paper["authors"]), + "year": str(paper["year"]), + "doi": paper["doi"], + "journal": "Nature", + }, }, - }), + ), ] merged = merge_utils.merge_with_policy(baseline_entry, enrichers) - assert merged['fields']['title'] == paper['title'] - assert 'Jumper' in merged['fields']['author'] - assert 'Hassabis' in merged['fields']['author'] + assert merged["fields"]["title"] == paper["title"] + assert "Jumper" in merged["fields"]["author"] + assert "Hassabis" in merged["fields"]["author"] diff --git a/tests/test_io_csv.py b/tests/test_io_csv.py index 34a8d0d7..72d95720 100644 --- a/tests/test_io_csv.py +++ b/tests/test_io_csv.py @@ -8,8 +8,17 @@ from src.models import Record _SOURCE_FLAG_KEYS = [ - 'scholar_bib', 'scholar_page', 's2', 'crossref', 'openreview', - 'arxiv', 'openalex', 'pubmed', 'europepmc', 'doi_csl', 'doi_bibtex', + "scholar_bib", + "scholar_page", + "s2", + "crossref", + "openreview", + "arxiv", + "openalex", + "pubmed", + "europepmc", + "doi_csl", + "doi_bibtex", ] @@ -49,23 +58,21 @@ def test_read_records_from_csv(tmp_path: Path) -> None: def test_csv_initialization(tmp_path: Path) -> None: """Verify CSV summary initialization creates a file with the correct header.""" - csv_path = tmp_path / 'summary.csv' + csv_path = tmp_path / "summary.csv" csv_path_str = str(csv_path) io_utils.init_summary_csv(csv_path_str) assert csv_path.exists(), "CSV file was not created" - with open(csv_path, encoding='utf-8') as f: + with open(csv_path, encoding="utf-8") as f: header = next(csv.reader(f)) - assert header == ['file_path', 'trust_hits', *_SOURCE_FLAG_KEYS], ( - f"Header mismatch: got {len(header)} columns" - ) + assert header == ["file_path", "trust_hits", *_SOURCE_FLAG_KEYS], f"Header mismatch: got {len(header)} columns" def test_csv_append_single_entry(tmp_path: Path) -> None: """Confirm that a single appended entry encodes path, trust hits, and flags correctly.""" - csv_path = tmp_path / 'summary.csv' + csv_path = tmp_path / "summary.csv" csv_path_str = str(csv_path) io_utils.init_summary_csv(csv_path_str) @@ -73,59 +80,61 @@ def test_csv_append_single_entry(tmp_path: Path) -> None: file_path = "output/Author/Paper2024.bib" trust_hits = 5 flags = _make_flags( - scholar_bib=True, s2=True, crossref=True, openalex=True, doi_csl=True, + scholar_bib=True, + s2=True, + crossref=True, + openalex=True, + doi_csl=True, ) io_utils.append_summary_to_csv(csv_path_str, file_path, trust_hits, flags) - with open(csv_path, encoding='utf-8') as f: + with open(csv_path, encoding="utf-8") as f: lines = f.readlines() assert len(lines) == 2, f"Expected 2 lines, got {len(lines)}" - data_row = lines[1].strip().split(',') + data_row = lines[1].strip().split(",") assert data_row[0] == file_path, "File path mismatch" - assert data_row[1] == str(trust_hits), ( - f"Trust hits mismatch: expected {trust_hits}, got {data_row[1]}" - ) - assert data_row[2] == '1', "scholar_bib should be 1" - assert data_row[3] == '0', "scholar_page should be 0" + assert data_row[1] == str(trust_hits), f"Trust hits mismatch: expected {trust_hits}, got {data_row[1]}" + assert data_row[2] == "1", "scholar_bib should be 1" + assert data_row[3] == "0", "scholar_page should be 0" def test_csv_append_multiple_entries(tmp_path: Path) -> None: """Verify that multiple entries can be appended sequentially.""" - csv_path = tmp_path / 'summary.csv' + csv_path = tmp_path / "summary.csv" csv_path_str = str(csv_path) io_utils.init_summary_csv(csv_path_str) test_entries = [ ( - "output/Author1/Paper2024.bib", 5, - {'s2': True, 'crossref': True, 'doi_csl': True, - 'openalex': True, 'scholar_bib': True}, + "output/Author1/Paper2024.bib", + 5, + {"s2": True, "crossref": True, "doi_csl": True, "openalex": True, "scholar_bib": True}, ), ("output/Author2/Paper2023.bib", 0, {}), - ("output/Author3/Paper2025.bib", 3, {'arxiv': True, 'doi_bibtex': True, 'pubmed': True}), + ("output/Author3/Paper2025.bib", 3, {"arxiv": True, "doi_bibtex": True, "pubmed": True}), ] for file_path, trust_hits, partial_flags in test_entries: flags = _make_flags(**partial_flags) io_utils.append_summary_to_csv(csv_path_str, file_path, trust_hits, flags) - with open(csv_path, encoding='utf-8') as f: + with open(csv_path, encoding="utf-8") as f: rows = list(csv.DictReader(f)) assert len(rows) == len(test_entries), f"Expected {len(test_entries)} rows, got {len(rows)}" for i, (expected_path, expected_hits, _) in enumerate(test_entries): - assert rows[i]['file_path'] == expected_path, f"Row {i}: file path mismatch" - assert int(rows[i]['trust_hits']) == expected_hits, f"Row {i}: trust hits mismatch" + assert rows[i]["file_path"] == expected_path, f"Row {i}: file path mismatch" + assert int(rows[i]["trust_hits"]) == expected_hits, f"Row {i}: trust hits mismatch" def test_csv_edge_cases(tmp_path: Path) -> None: """Edge cases: very long file paths and special characters.""" - csv_path = tmp_path / 'summary.csv' + csv_path = tmp_path / "summary.csv" csv_path_str = str(csv_path) io_utils.init_summary_csv(csv_path_str) @@ -138,17 +147,17 @@ def test_csv_edge_cases(tmp_path: Path) -> None: special_path = "output/Author (ID123)/Paper-2024_v2.bib" io_utils.append_summary_to_csv(csv_path_str, special_path, 2, flags) - with open(csv_path, encoding='utf-8') as f: + with open(csv_path, encoding="utf-8") as f: rows = list(csv.DictReader(f)) assert len(rows) == 2, f"Expected 2 rows, got {len(rows)}" - assert rows[0]['file_path'] == long_path, "Long path not preserved correctly" - assert rows[1]['file_path'] == special_path, "Special characters not preserved correctly" + assert rows[0]["file_path"] == long_path, "Long path not preserved correctly" + assert rows[1]["file_path"] == special_path, "Special characters not preserved correctly" def test_csv_directory_creation(tmp_path: Path) -> None: """Confirm that init_summary_csv automatically creates parent directories.""" - csv_path = tmp_path / 'deep' / 'nested' / 'path' / 'summary.csv' + csv_path = tmp_path / "deep" / "nested" / "path" / "summary.csv" csv_path_str = str(csv_path) io_utils.init_summary_csv(csv_path_str) @@ -188,21 +197,24 @@ class TestBuildA2i2Folder: """Tests for the automated a2i2 build step.""" def test_missing_csv_returns_zero(self, tmp_path: Path) -> None: - result = io_utils.build_a2i2_folder( - str(tmp_path / "nonexistent.csv"), [], str(tmp_path / "output") - ) + result = io_utils.build_a2i2_folder(str(tmp_path / "nonexistent.csv"), [], str(tmp_path / "output")) assert result == 0 def test_basic_collection(self, tmp_path: Path) -> None: out = tmp_path / "output" author_dir = out / "Smith (A1)" author_dir.mkdir(parents=True) - _write_bib(author_dir / "Alice2024-TestPaper.bib", "article", "Alice2024:TestPaper", { - "title": "A Test Paper on Neural Networks", - "author": "Alice Smith", - "year": "2024", - "journal": "Nature", - }) + _write_bib( + author_dir / "Alice2024-TestPaper.bib", + "article", + "Alice2024:TestPaper", + { + "title": "A Test Paper on Neural Networks", + "author": "Alice Smith", + "year": "2024", + "journal": "Nature", + }, + ) csv_path = tmp_path / "a2i2.csv" _make_a2i2_csv(csv_path, ["Alice Smith"]) @@ -216,12 +228,28 @@ def test_year_filtering(self, tmp_path: Path) -> None: out = tmp_path / "output" author_dir = out / "Jones (B1)" author_dir.mkdir(parents=True) - _write_bib(author_dir / "Bob2024-Recent.bib", "article", "Bob2024:Recent", { - "title": "Recent Work", "author": "Bob Jones", "year": "2024", "journal": "Science", - }) - _write_bib(author_dir / "Bob2005-Old.bib", "article", "Bob2005:Old", { - "title": "Old Work", "author": "Bob Jones", "year": "2005", "journal": "Science", - }) + _write_bib( + author_dir / "Bob2024-Recent.bib", + "article", + "Bob2024:Recent", + { + "title": "Recent Work", + "author": "Bob Jones", + "year": "2024", + "journal": "Science", + }, + ) + _write_bib( + author_dir / "Bob2005-Old.bib", + "article", + "Bob2005:Old", + { + "title": "Old Work", + "author": "Bob Jones", + "year": "2005", + "journal": "Science", + }, + ) csv_path = tmp_path / "a2i2.csv" _make_a2i2_csv(csv_path, ["Bob Jones"]) @@ -240,14 +268,29 @@ def test_dedup_by_doi(self, tmp_path: Path) -> None: dir_b.mkdir(parents=True) # Alice has 3 fields, Bob has 4 — Bob's version is richer - _write_bib(dir_a / "Smith2024-SharedPaper.bib", "article", "Smith2024:SharedPaper", { - "title": "A Shared Paper", "author": "Alice Smith and Bob Jones", - "year": "2024", "doi": "10.1234/shared", - }) - _write_bib(dir_b / "Smith2024-SharedPaper.bib", "article", "Smith2024:SharedPaper", { - "title": "A Shared Paper", "author": "Alice Smith and Bob Jones", - "year": "2024", "doi": "10.1234/shared", "journal": "Nature", - }) + _write_bib( + dir_a / "Smith2024-SharedPaper.bib", + "article", + "Smith2024:SharedPaper", + { + "title": "A Shared Paper", + "author": "Alice Smith and Bob Jones", + "year": "2024", + "doi": "10.1234/shared", + }, + ) + _write_bib( + dir_b / "Smith2024-SharedPaper.bib", + "article", + "Smith2024:SharedPaper", + { + "title": "A Shared Paper", + "author": "Alice Smith and Bob Jones", + "year": "2024", + "doi": "10.1234/shared", + "journal": "Nature", + }, + ) csv_path = tmp_path / "a2i2.csv" _make_a2i2_csv(csv_path, ["Alice Smith", "Bob Jones"]) @@ -268,14 +311,27 @@ def test_dedup_by_title(self, tmp_path: Path) -> None: dir_b.mkdir(parents=True) # Same title, no DOI — should dedup by title similarity - _write_bib(dir_a / "Smith2024-NeuralNet.bib", "article", "Smith2024:NeuralNet", { - "title": "Deep Neural Networks for Image Classification", - "author": "Alice Smith", "year": "2024", - }) - _write_bib(dir_b / "Smith2024-NeuralNet.bib", "article", "Smith2024:NeuralNet", { - "title": "Deep Neural Networks for Image Classification", - "author": "Alice Smith and Bob Jones", "year": "2024", "journal": "CVPR", - }) + _write_bib( + dir_a / "Smith2024-NeuralNet.bib", + "article", + "Smith2024:NeuralNet", + { + "title": "Deep Neural Networks for Image Classification", + "author": "Alice Smith", + "year": "2024", + }, + ) + _write_bib( + dir_b / "Smith2024-NeuralNet.bib", + "article", + "Smith2024:NeuralNet", + { + "title": "Deep Neural Networks for Image Classification", + "author": "Alice Smith and Bob Jones", + "year": "2024", + "journal": "CVPR", + }, + ) csv_path = tmp_path / "a2i2.csv" _make_a2i2_csv(csv_path, ["Alice Smith", "Bob Jones"]) @@ -293,9 +349,17 @@ def test_complete_rebuild(self, tmp_path: Path) -> None: author_dir = out / "Smith (A1)" author_dir.mkdir(parents=True) - _write_bib(author_dir / "Alice2024-Fresh.bib", "article", "Alice2024:Fresh", { - "title": "Fresh Paper", "author": "Alice Smith", "year": "2024", "journal": "Nature", - }) + _write_bib( + author_dir / "Alice2024-Fresh.bib", + "article", + "Alice2024:Fresh", + { + "title": "Fresh Paper", + "author": "Alice Smith", + "year": "2024", + "journal": "Nature", + }, + ) csv_path = tmp_path / "a2i2.csv" _make_a2i2_csv(csv_path, ["Alice Smith"]) @@ -313,12 +377,28 @@ def test_deterministic_output(self, tmp_path: Path) -> None: dir_a.mkdir(parents=True) dir_b.mkdir(parents=True) - _write_bib(dir_a / "Alice2024-Paper.bib", "article", "Alice2024:Paper", { - "title": "Alice Paper", "author": "Alice Smith", "year": "2024", "journal": "Nature", - }) - _write_bib(dir_b / "Bob2024-Paper.bib", "article", "Bob2024:Paper", { - "title": "Bob Paper", "author": "Bob Jones", "year": "2024", "journal": "Science", - }) + _write_bib( + dir_a / "Alice2024-Paper.bib", + "article", + "Alice2024:Paper", + { + "title": "Alice Paper", + "author": "Alice Smith", + "year": "2024", + "journal": "Nature", + }, + ) + _write_bib( + dir_b / "Bob2024-Paper.bib", + "article", + "Bob2024:Paper", + { + "title": "Bob Paper", + "author": "Bob Jones", + "year": "2024", + "journal": "Science", + }, + ) csv_path = tmp_path / "a2i2.csv" _make_a2i2_csv(csv_path, ["Alice Smith", "Bob Jones"]) diff --git a/tests/test_pipeline.py b/tests/test_pipeline.py index 17741475..6fd17618 100644 --- a/tests/test_pipeline.py +++ b/tests/test_pipeline.py @@ -12,29 +12,29 @@ # Shared baseline entries reused across DOI validation tests _BASELINE_FULL: dict[str, Any] = { - 'type': 'inproceedings', - 'key': 'Vaswani2017', - 'fields': { - 'title': 'Attention Is All You Need', - 'author': 'Ashish Vaswani and Noam Shazeer and Niki Parmar', - 'year': '2017', + "type": "inproceedings", + "key": "Vaswani2017", + "fields": { + "title": "Attention Is All You Need", + "author": "Ashish Vaswani and Noam Shazeer and Niki Parmar", + "year": "2017", }, } _BASELINE_MINIMAL: dict[str, Any] = { - 'type': 'inproceedings', - 'key': 'Vaswani2017', - 'fields': { - 'title': 'Attention Is All You Need', - 'author': 'Ashish Vaswani', - 'year': '2017', + "type": "inproceedings", + "key": "Vaswani2017", + "fields": { + "title": "Attention Is All You Need", + "author": "Ashish Vaswani", + "year": "2017", }, } _MATCHING_CSL: dict[str, Any] = { - 'title': 'Attention Is All You Need', - 'author': [{'given': 'Ashish', 'family': 'Vaswani'}], - 'issued': {'date-parts': [[2017]]}, + "title": "Attention Is All You Need", + "author": [{"given": "Ashish", "family": "Vaswani"}], + "issued": {"date-parts": [[2017]]}, } _MATCHING_BIBTEX = dedent("""\ @@ -45,9 +45,9 @@ }""") _WRONG_CSL_BERT: dict[str, Any] = { - 'title': 'BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding', - 'author': [{'given': 'Jacob', 'family': 'Devlin'}], - 'issued': {'date-parts': [[2019]]}, + "title": "BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding", + "author": [{"given": "Jacob", "family": "Devlin"}], + "issued": {"date-parts": [[2019]]}, } _WRONG_BIBTEX_BERT = dedent("""\ @@ -70,16 +70,12 @@ def _patch_doi_resolvers( bibtex_side_effect: Any = None, ) -> contextlib.ExitStack: """Patch DOI resolver functions with the given return values or side effects.""" - csl_kwargs: dict[str, Any] = ( - {"side_effect": csl_side_effect} if csl_side_effect else {"return_value": csl} - ) - bib_kwargs: dict[str, Any] = ( - {"side_effect": bibtex_side_effect} if bibtex_side_effect else {"return_value": bibtex} - ) + csl_kwargs: dict[str, Any] = {"side_effect": csl_side_effect} if csl_side_effect else {"return_value": csl} + bib_kwargs: dict[str, Any] = {"side_effect": bibtex_side_effect} if bibtex_side_effect else {"return_value": bibtex} stack = contextlib.ExitStack() - stack.enter_context(patch.object(search_apis, 'fetch_csl_via_doi', **csl_kwargs)) - stack.enter_context(patch.object(search_apis, 'fetch_bibtex_via_doi', **bib_kwargs)) - stack.enter_context(patch.object(search_apis, 'bibtex_from_csl', return_value=bibtex_from_csl)) + stack.enter_context(patch.object(search_apis, "fetch_csl_via_doi", **csl_kwargs)) + stack.enter_context(patch.object(search_apis, "fetch_bibtex_via_doi", **bib_kwargs)) + stack.enter_context(patch.object(search_apis, "bibtex_from_csl", return_value=bibtex_from_csl)) return stack @@ -89,20 +85,24 @@ def test_validate_doi_candidate_both_formats_match() -> None: from the DOI resolver match the baseline publication. """ mock_csl = { - 'type': 'paper-conference', - 'title': 'Attention Is All You Need', - 'author': [ - {'given': 'Ashish', 'family': 'Vaswani'}, - {'given': 'Noam', 'family': 'Shazeer'}, + "type": "paper-conference", + "title": "Attention Is All You Need", + "author": [ + {"given": "Ashish", "family": "Vaswani"}, + {"given": "Noam", "family": "Shazeer"}, ], - 'issued': {'date-parts': [[2017]]}, + "issued": {"date-parts": [[2017]]}, } with _patch_doi_resolvers( - csl=mock_csl, bibtex=_MATCHING_BIBTEX, bibtex_from_csl=_MATCHING_BIBTEX, + csl=mock_csl, + bibtex=_MATCHING_BIBTEX, + bibtex_from_csl=_MATCHING_BIBTEX, ): csl_matched, bibtex_matched, csl_entry, bibtex_entry = validate_doi_candidate( - doi=_ARXIV_DOI, baseline_entry=_BASELINE_FULL, result_id="test", + doi=_ARXIV_DOI, + baseline_entry=_BASELINE_FULL, + result_id="test", ) # CSL matched, so BibTeX fetch is skipped (Phase 3a optimization) @@ -118,12 +118,12 @@ def test_validate_doi_candidate_csl_only_matches() -> None: (Phase 3a optimization) even if BibTeX would resolve to a wrong paper. """ baseline_entry: dict[str, Any] = { - 'type': 'inproceedings', - 'key': 'Vaswani2017', - 'fields': { - 'title': 'Attention Is All You Need', - 'author': 'Ashish Vaswani and Noam Shazeer', - 'year': '2017', + "type": "inproceedings", + "key": "Vaswani2017", + "fields": { + "title": "Attention Is All You Need", + "author": "Ashish Vaswani and Noam Shazeer", + "year": "2017", }, } @@ -135,10 +135,14 @@ def test_validate_doi_candidate_csl_only_matches() -> None: }""") with _patch_doi_resolvers( - csl=_MATCHING_CSL, bibtex=mock_bibtex_wrong, bibtex_from_csl=_MATCHING_BIBTEX, + csl=_MATCHING_CSL, + bibtex=mock_bibtex_wrong, + bibtex_from_csl=_MATCHING_BIBTEX, ): csl_matched, bibtex_matched, csl_entry, bibtex_entry = validate_doi_candidate( - doi=_ARXIV_DOI, baseline_entry=baseline_entry, result_id="test", + doi=_ARXIV_DOI, + baseline_entry=baseline_entry, + result_id="test", ) assert csl_matched, "CSL should match" @@ -152,10 +156,14 @@ def test_validate_doi_candidate_neither_matches() -> None: Test complete rejection when a DOI resolves to metadata for a different paper. """ with _patch_doi_resolvers( - csl=_WRONG_CSL_BERT, bibtex=_WRONG_BIBTEX_BERT, bibtex_from_csl=_WRONG_BIBTEX_BERT, + csl=_WRONG_CSL_BERT, + bibtex=_WRONG_BIBTEX_BERT, + bibtex_from_csl=_WRONG_BIBTEX_BERT, ): csl_matched, bibtex_matched, csl_entry, bibtex_entry = validate_doi_candidate( - doi=_BERT_DOI, baseline_entry=_BASELINE_MINIMAL, result_id="test", + doi=_BERT_DOI, + baseline_entry=_BASELINE_MINIMAL, + result_id="test", ) assert not csl_matched, "CSL should be rejected" @@ -171,12 +179,18 @@ def test_validate_doi_candidate_network_errors() -> None: with _patch_doi_resolvers( csl_side_effect=urllib.error.URLError("Network error"), bibtex_side_effect=urllib.error.HTTPError( - url='test', code=500, msg='Server Error', hdrs=Message(), fp=None, + url="test", + code=500, + msg="Server Error", + hdrs=Message(), + fp=None, ), bibtex_from_csl=None, ): csl_matched, bibtex_matched, csl_entry, bibtex_entry = validate_doi_candidate( - doi=_ARXIV_DOI, baseline_entry=_BASELINE_MINIMAL, result_id="test", + doi=_ARXIV_DOI, + baseline_entry=_BASELINE_MINIMAL, + result_id="test", ) assert not csl_matched, "CSL should not match on network error" @@ -191,9 +205,9 @@ def test_validate_doi_candidate_bibtex_fallback_when_csl_fails() -> None: exercising the Phase 3a short-circuit logic in reverse. """ mock_csl_wrong: dict[str, Any] = { - 'title': 'A Completely Different Paper Title', - 'author': [{'given': 'John', 'family': 'Doe'}], - 'issued': {'date-parts': [[2020]]}, + "title": "A Completely Different Paper Title", + "author": [{"given": "John", "family": "Doe"}], + "issued": {"date-parts": [[2020]]}, } mock_bibtex_from_csl_wrong = dedent("""\ @@ -204,10 +218,14 @@ def test_validate_doi_candidate_bibtex_fallback_when_csl_fails() -> None: }""") with _patch_doi_resolvers( - csl=mock_csl_wrong, bibtex=_MATCHING_BIBTEX, bibtex_from_csl=mock_bibtex_from_csl_wrong, + csl=mock_csl_wrong, + bibtex=_MATCHING_BIBTEX, + bibtex_from_csl=mock_bibtex_from_csl_wrong, ): csl_matched, bibtex_matched, csl_entry, bibtex_entry = validate_doi_candidate( - doi=_ARXIV_DOI, baseline_entry=_BASELINE_MINIMAL, result_id="test", + doi=_ARXIV_DOI, + baseline_entry=_BASELINE_MINIMAL, + result_id="test", ) assert not csl_matched, "CSL should not match (wrong paper)" @@ -225,11 +243,16 @@ def test_process_validated_doi_success() -> None: flags = {"doi_csl": False, "doi_bibtex": False} with _patch_doi_resolvers( - csl=_MATCHING_CSL, bibtex=_MATCHING_BIBTEX, bibtex_from_csl=_MATCHING_BIBTEX, + csl=_MATCHING_CSL, + bibtex=_MATCHING_BIBTEX, + bibtex_from_csl=_MATCHING_BIBTEX, ): doi_matched = process_validated_doi( - doi=_ARXIV_DOI, baseline_entry=_BASELINE_MINIMAL, - result_id="test", enr_list=enr_list, flags=flags, + doi=_ARXIV_DOI, + baseline_entry=_BASELINE_MINIMAL, + result_id="test", + enr_list=enr_list, + flags=flags, ) assert doi_matched, "Should return True" @@ -258,11 +281,16 @@ def test_process_validated_doi_failure() -> None: flags = {"doi_csl": False, "doi_bibtex": False} with _patch_doi_resolvers( - csl=_WRONG_CSL_BERT, bibtex=mock_bibtex_wrong, bibtex_from_csl=mock_bibtex_wrong, + csl=_WRONG_CSL_BERT, + bibtex=mock_bibtex_wrong, + bibtex_from_csl=mock_bibtex_wrong, ): doi_matched = process_validated_doi( - doi=_BERT_DOI, baseline_entry=_BASELINE_MINIMAL, - result_id="test", enr_list=enr_list, flags=flags, + doi=_BERT_DOI, + baseline_entry=_BASELINE_MINIMAL, + result_id="test", + enr_list=enr_list, + flags=flags, ) assert not doi_matched, "Should return False" diff --git a/tests/test_publication_parser.py b/tests/test_publication_parser.py index 3be86562..a38aa857 100644 --- a/tests/test_publication_parser.py +++ b/tests/test_publication_parser.py @@ -69,18 +69,14 @@ def test_conference_with_pages(self) -> None: assert r.confidence >= 0.7 def test_workshop_no_pages(self) -> None: - r = parse_publication_string( - "NeurIPS 2022 Workshop: Tackling Climate Change with ML, 2022" - ) + r = parse_publication_string("NeurIPS 2022 Workshop: Tackling Climate Change with ML, 2022") assert r is not None assert r.venue_type == "conference" assert r.year == 2022 assert r.confidence >= 0.6 def test_symposium(self) -> None: - r = parse_publication_string( - "2007 IEEE International Parallel and Distributed Processing Symposium, 1-8, 2007" - ) + r = parse_publication_string("2007 IEEE International Parallel and Distributed Processing Symposium, 1-8, 2007") assert r is not None assert r.venue_type == "conference" assert r.pages == "1-8" @@ -168,9 +164,7 @@ def test_frozen_dataclass(self) -> None: def test_book_chapter_pages(self) -> None: """Book chapter with page range is parsed with moderate confidence.""" - r = parse_publication_string( - "Handbook of Evolutionary Machine Learning, 205-243, 2023" - ) + r = parse_publication_string("Handbook of Evolutionary Machine Learning, 205-243, 2023") assert r is not None assert r.pages == "205-243" assert r.year == 2023 diff --git a/tests/test_scholarly_scholar.py b/tests/test_scholarly_scholar.py index dec7d138..6f10d746 100644 --- a/tests/test_scholarly_scholar.py +++ b/tests/test_scholarly_scholar.py @@ -137,7 +137,7 @@ def test_basic_conversion(self, mock_http: MagicMock) -> None: def test_pagination_multi_page(self, mock_http: MagicMock) -> None: """Multiple pages should be fetched when serpapi_pagination.next is present.""" page1_articles = [_make_serpapi_article(title=f"Paper {i}") for i in range(3)] - page2_articles = [_make_serpapi_article(title=f"Paper {i+3}") for i in range(2)] + page2_articles = [_make_serpapi_article(title=f"Paper {i + 3}") for i in range(2)] page1 = _make_serpapi_response(page1_articles, has_next=True) page2 = _make_serpapi_response(page2_articles, has_next=False) @@ -352,7 +352,11 @@ def test_year_bounded_disabled_when_not_pubdate(self, mock_http: MagicMock) -> N ) mock_http.return_value = _json_bytes(page1) result = serpapi_fetch_author_publications( - "key", "aid", num=1000, min_year=2019, sort="citedby", + "key", + "aid", + num=1000, + min_year=2019, + sort="citedby", ) assert len(result["articles"]) == 1 @@ -551,7 +555,9 @@ class TestFacadeCacheBehavior: @patch("src.clients.scholar.response_cache") @patch("src.clients.scholar.serpapi_fetch_author_publications") def test_publications_cache_hit( - self, mock_serpapi: MagicMock, mock_cache: MagicMock, + self, + mock_serpapi: MagicMock, + mock_cache: MagicMock, ) -> None: """Cached publications should be returned without calling SerpAPI.""" cached_data = {"articles": [{"title": "Cached"}], "search_metadata": {"status": "Success"}} @@ -565,7 +571,9 @@ def test_publications_cache_hit( @patch("src.clients.scholar.response_cache") @patch("src.clients.scholar.serpapi_fetch_author_publications") def test_publications_cache_miss( - self, mock_serpapi: MagicMock, mock_cache: MagicMock, + self, + mock_serpapi: MagicMock, + mock_cache: MagicMock, ) -> None: """Cache miss should call SerpAPI with author_id and store the result.""" mock_cache.get.return_value = None @@ -585,7 +593,9 @@ def test_publications_cache_miss( @patch("src.clients.scholar.response_cache") @patch("src.clients.scholar.serpapi_fetch_author_publications") def test_publications_cache_miss_empty_result( - self, mock_serpapi: MagicMock, mock_cache: MagicMock, + self, + mock_serpapi: MagicMock, + mock_cache: MagicMock, ) -> None: """When SerpAPI returns no articles, result must not be cached.""" mock_cache.get.return_value = None @@ -602,7 +612,9 @@ def test_publications_cache_miss_empty_result( @patch("src.clients.scholar.response_cache") @patch("src.clients.scholar.serply_fetch_citation") def test_citation_cache_hit( - self, mock_serply: MagicMock, mock_cache: MagicMock, + self, + mock_serply: MagicMock, + mock_cache: MagicMock, ) -> None: """Cached citation should be returned without calling Serply.""" mock_cache.get.return_value = {"title": "Cached Paper"} @@ -630,7 +642,9 @@ def test_citation_cache_miss(self, mock_serply: MagicMock, mock_cache: MagicMock @patch("src.clients.scholar.response_cache") @patch("src.clients.scholar.serply_fetch_citation") def test_citation_negative_not_cached( - self, mock_serply: MagicMock, mock_cache: MagicMock, + self, + mock_serply: MagicMock, + mock_cache: MagicMock, ) -> None: """When Serply returns None, no negative is cached (Serply conflates errors and empty).""" mock_cache.get.return_value = None @@ -648,7 +662,9 @@ def test_citation_empty_title(self) -> None: @patch("src.clients.scholar.response_cache") @patch("src.clients.scholar.serpapi_fetch_author_publications") def test_stale_cache_invalidated( - self, mock_serpapi: MagicMock, mock_cache: MagicMock, + self, + mock_serpapi: MagicMock, + mock_cache: MagicMock, ) -> None: """Cache with count-truncated results should be invalidated and re-fetched.""" stale_data = { @@ -667,7 +683,9 @@ def test_stale_cache_invalidated( @patch("src.clients.scholar.response_cache") @patch("src.clients.scholar.serpapi_fetch_author_publications") def test_complete_cache_not_invalidated( - self, mock_serpapi: MagicMock, mock_cache: MagicMock, + self, + mock_serpapi: MagicMock, + mock_cache: MagicMock, ) -> None: """Cache covering the full window should not be invalidated.""" complete_data = { @@ -697,6 +715,4 @@ def test_no_module_level_state(self, module_path: str, forbidden_attr: str) -> N import importlib mod = importlib.import_module(module_path) - assert not hasattr(mod, forbidden_attr), ( - f"{module_path} should not have '{forbidden_attr}'" - ) + assert not hasattr(mod, forbidden_attr), f"{module_path} should not have '{forbidden_attr}'" From 49cc89ce9b544814d01dc24b8eca936cdf461c55 Mon Sep 17 00:00:00 2001 From: Gabriel Spadon Date: Wed, 1 Jul 2026 14:17:01 -0300 Subject: [PATCH 14/54] refactor: extract fix-pattern tables and text helpers to src/fixup/ (Step 4) Move the precompiled fix-pattern tables/regexes and the shared title/booktitle text transforms (_fix_title_text, _apply_booktitle_fixups, _fix_fused_compounds, _is_garbage_title, _is_corrupted_title) verbatim from main.py into src/fixup/patterns.py + text.py (leaf modules, import only config + re). main.py re-exports them so the three fixup call sites and tests resolve unchanged. Byte-neutral; prerequisite for the C5 rule-body consolidation. --- main.py | 172 ++---------------------------------------- src/fixup/__init__.py | 1 + src/fixup/patterns.py | 97 ++++++++++++++++++++++++ src/fixup/text.py | 110 +++++++++++++++++++++++++++ 4 files changed, 215 insertions(+), 165 deletions(-) create mode 100644 src/fixup/__init__.py create mode 100644 src/fixup/patterns.py create mode 100644 src/fixup/text.py diff --git a/main.py b/main.py index 10baa95b..ca434bc1 100644 --- a/main.py +++ b/main.py @@ -46,15 +46,12 @@ from src.config import ( ABBREVIATED_VENUE_MAP, ACM_JOURNAL_PROCEEDINGS, - ACRONYM_CASE_CORRECTIONS, - COMPOUND_SUFFIXES, DEFAULT_A2I2_INPUT, DEFAULT_INPUT, DEFAULT_OUT_DIR, DEFAULT_S2_KEY_FILE, DEFAULT_SERPAPI_KEY_FILE, DEFAULT_SERPLY_KEY_FILE, - FUSED_COMPOUND_WORDS, GENERIC_SERIES_NAMES, INSTITUTIONAL_REPOSITORIES, JOURNAL_ONLY_PREFIXES, @@ -85,6 +82,13 @@ FULL_OPERATION_ERRORS, PARSE_ERRORS, ) +from src.fixup.text import ( + _apply_booktitle_fixups, + _fix_fused_compounds, # noqa: F401 + _fix_title_text, + _is_corrupted_title, + _is_garbage_title, +) from src.fsscan import iter_author_bibs, iter_output_dirs from src.http_utils import get_api_call_counts, http_get_text, reset_api_call_counts from src.io_utils import ( @@ -120,46 +124,10 @@ _BRACKET_J_RE = re.compile(r"\s*\[J\]\s*$") _ARXIV_ABS_RE = re.compile(r"arxiv\.org/abs/(\d{4}\.\d{4,5})", re.IGNORECASE) -# Pre-compiled patterns for _fix_fused_compounds (avoids ~800 re.compile() calls per invocation) -_FUSED_DICT_PATTERNS: list[tuple[re.Pattern[str], str]] = [ - (re.compile(r"\b" + re.escape(fused) + r"\b", re.IGNORECASE), repl) for fused, repl in FUSED_COMPOUND_WORDS.items() -] -_COMPOUND_SUFFIX_PATTERNS: list[re.Pattern[str]] = [ - re.compile(r"\b([A-Z][a-z]{2,})(" + re.escape(suffix) + r")\b") for suffix in COMPOUND_SUFFIXES -] - -# Pre-compiled patterns for garbage title detection -_GARBAGE_EMAIL_RE = re.compile(r"[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}") -_GARBAGE_POSTAL_RE = re.compile(r"\b[A-Z]\d[A-Z]\s*\d[A-Z]\d\b") -_GARBAGE_DEPT_RE = re.compile(r"^\s*(Department|Faculty|School|Institute)\s+of\b", re.IGNORECASE) -_GARBAGE_PHONE_RE = re.compile(r"\+?\d{1,4}[\.\-]\d{2,4}[\.\-]\d{2,}") -_GARBAGE_VOLUME_RE = re.compile(r"\bComplete\s+Volume\b", re.IGNORECASE) -_GARBAGE_SERIES_VOL_RE = re.compile(r"^(OASIcs|LIPIcs|LNI|LNCS|Dagstuhl)\b.*\bVolume\s+\d+\b", re.IGNORECASE) -_GARBAGE_FESTSCHRIFT_RE = re.compile(r"\bFestschrift\b", re.IGNORECASE) -_GARBAGE_FESTSCHRIFT_META_RE = re.compile(r",\s+[A-Z][a-z]+,\s+[A-Z][a-z]+\b.*\d{4}") -_GARBAGE_PROCEEDINGS_RE = re.compile(r"^Proceedings\s+of\s+(the\s+)?\d{4}\s+", re.IGNORECASE) -_GARBAGE_CORRECTION_RE = re.compile(r"^Correction(s)?\s+(to|of)\s*:", re.IGNORECASE) -_GARBAGE_EASYCHAIR_RE = re.compile(r"\bEasyChair\s+Preprint\b", re.IGNORECASE) _FILENAME_YEAR_RE = re.compile(r"/[A-Za-z]+(\d{4})-") -# Pre-compiled patterns for acronym case corrections in titles -_ACRONYM_CASE_PATTERNS: list[tuple[re.Pattern[str], str]] = [ - (re.compile(r"\b" + re.escape(wrong) + r"\b"), correct) for wrong, correct in ACRONYM_CASE_CORRECTIONS.items() -] - -# Pre-compiled pattern for verbose LNCS/Springer booktitle metadata -# Strips conference location, dates, and "Proceedings" suffix appended by Crossref -_VERBOSE_BOOKTITLE_RE = re.compile( - r"\d+(st|nd|rd|th)\s+(International|Annual|European|Asian|Australasian)\s+" - r"(Conference|Workshop|Symposium)\b.*,\s*Proceedings\s*$", - re.IGNORECASE, -) - # Pre-compiled patterns for three-way title/venue fixups (used in _fixup_bib_entry, # existing-file fixup, and Phase 4 post-merge — each pattern appears 3 times) -_COLON_SPACE_RE = re.compile(r"(\S):([A-Z])") -_HYPHEN_SPACE_RE = re.compile(r"(\w)- (?!and |or |to )") -_SPACE_HYPHEN_RE = re.compile(r"(\w) -(\w)") _TRAILING_DASH_RE = re.compile(r"[\s][-\u2013]\s*$") _SUBTITLE_WRAPPER_RE = re.compile(r":\s*-([^-]+)-\s*$") _SPIRE_STRIP_RE = re.compile(r"\s*:\s*SPIRE\b.*$") @@ -182,132 +150,6 @@ _PROC_EXT_ABSTRACTS = "Proceedings of the Extended Abstracts" _PROC_OF_THE = "Proceedings of the " -# Pre-compiled booktitle cleanup patterns (venue abbreviations, typos, spacing) -_BOOKTITLE_FIXUPS: list[tuple[re.Pattern[str], str]] = [ - # "on on " → "on " (duplicate preposition from ACM metadata) - (re.compile(r"\bon on\b"), "on"), - # "of the YYYY on ACM" → "of the YYYY ACM" (Crossref 2024 ACM metadata gap) - (re.compile(r"of the (\d{4}) on (ACM|IEEE)\b"), r"of the \1 \2"), - # "Nations of the Americas Chapter" → "North American Chapter" (NAACL 2025 Crossref error) - (re.compile(r"Nations of the Americas Chapter"), "North American Chapter"), - # "Health(SeGAH)" → "Health (SeGAH)" (missing space before acronym) - (re.compile(r"Health\(SeGAH\)"), "Health (SeGAH)"), - # "Intl Conf" → "International Conference" - (re.compile(r"\bIntl Conf\b"), "International Conference"), - # "Int'l" → "International" - (re.compile(r"\bInt'l\b"), "International"), - # "NeuriPS" → "NeurIPS" (venue typo from API sources) - (re.compile(r"\bNeuriPS\b"), "NeurIPS"), - # CHCCS publisher name used as venue → Graphics Interface conference - (re.compile(r"^Canada Human-Computer Communications Society$"), "Graphics Interface"), - # "Conference On" → "Conference on" (lowercase preposition; must run before truncation completions) - (re.compile(r"\bConference On\b"), "Conference on"), - # "YYYY ACM on Conference" → "YYYY ACM Conference" (Crossref spurious "on") - (re.compile(r"(\d{4}) ACM on ([A-Z])"), r"\1 ACM \2"), - # "of the YYYY on Innovation" → "of the YYYY ACM Conference on Innovation" (ITiCSE gap) - (re.compile(r"of the (\d{4}) on Innovation"), r"of the \1 ACM Conference on Innovation"), - # "ITiCSE'NN: Proceedings..." prefix → strip non-standard prefix - (re.compile(r"ITiCSE'\d{2}:\s*"), ""), - # "SEET-Software" → "SEET - Software" (missing spaces around dash) - (re.compile(r"^SEET-Software"), "SEET - Software"), - # Truncated SerpAPI booktitles — complete known conference name suffixes - (re.compile(r"Conference on Innovation$"), "Conference on Innovation and Technology in Computer Science Education"), - (re.compile(r"Applications of Computer$"), "Applications of Computer Vision"), - (re.compile(r"Analyzing and Interpreting$"), "Analyzing and Interpreting Neural Networks for NLP"), - (re.compile(r"Conference on Persuasive$"), "Conference on Persuasive Technology"), - # FAccT: "Fairness Accountability and Transparency" → commas - (re.compile(r"Fairness Accountability and Transparency"), "Fairness, Accountability, and Transparency"), - # "Conference Information" → "Conference on Information" (missing "on") - (re.compile(r"Conference Information Visualisation"), "Conference on Information Visualisation"), - # "YYYY the Nth" → "YYYY The Nth" (capitalize after year) - (re.compile(r"(\d{4}) the (\d)"), r"\1 The \2"), - # "Conference: (VTC" → "Conference (VTC" (stray colon before acronym) - (re.compile(r"Conference: \("), "Conference ("), - # "Persuasive Technology PERSUASIVE YYYY" → strip redundant acronym - (re.compile(r"(Persuasive Technology(?:\s+Adjunct)?),?\s+PERSUASIVE(?:\s+\d{4})?$"), r"\1"), - # Truncated "\& International..." suffix → strip - (re.compile(r"\s*\\?&\s*International$"), ""), -] - - -def _apply_booktitle_fixups(bt: str) -> str: - """Strip verbose conference metadata and apply pre-compiled booktitle cleanup patterns.""" - if _VERBOSE_BOOKTITLE_RE.search(bt): - stripped = _VERBOSE_BOOKTITLE_RE.sub("", bt).rstrip(" ,") - if stripped: - bt = stripped - for pat, repl in _BOOKTITLE_FIXUPS: - bt = pat.sub(repl, bt) - return bt - - -def _fix_title_text(title: str) -> str: - """Fix fused compounds, colon-space, hyphen-space, and acronym case.""" - result = _fix_fused_compounds(title) - result = _COLON_SPACE_RE.sub(r"\1: \2", result) - result = _HYPHEN_SPACE_RE.sub(r"\1-", result) - result = _SPACE_HYPHEN_RE.sub(r"\1-\2", result) - for acr_pat, acr_repl in _ACRONYM_CASE_PATTERNS: - result = acr_pat.sub(acr_repl, result) - return result - - -def _is_garbage_title(title: str) -> bool: - """Detect non-bibliographic titles from Scholar/DBLP artifacts. - - Catches institutional addresses, contact info, and other metadata - that occasionally appear as "paper titles" in Scholar results. - """ - if not title: - return False - return bool( - _GARBAGE_EMAIL_RE.search(title) - or _GARBAGE_POSTAL_RE.search(title) - or _GARBAGE_DEPT_RE.search(title) - or _GARBAGE_PHONE_RE.search(title) - or _GARBAGE_VOLUME_RE.search(title) - or _GARBAGE_SERIES_VOL_RE.search(title) - or (_GARBAGE_FESTSCHRIFT_RE.search(title) and _GARBAGE_FESTSCHRIFT_META_RE.search(title)) - or _GARBAGE_PROCEEDINGS_RE.match(title) - or _GARBAGE_CORRECTION_RE.match(title) - or _GARBAGE_EASYCHAIR_RE.search(title) - ) - - -def _is_corrupted_title(title: str) -> bool: - """Detect DBLP-corrupted titles containing author names instead of real titles. - - Matches patterns like "Li2 ()" -- author name + numeric affiliation + empty parens. - """ - return len(re.findall(r"\b[A-Z][a-z]+\d+\s*\(\)", title)) >= 2 - - -def _fix_fused_compounds(title: str) -> str: - """Fix fused compound words in titles (hyphens stripped by Google Scholar). - - Three-pass approach: - 1. Dictionary lookup for special cases (acronyms, irregular patterns). - 2. Suffix-based detection for common compound adjective suffixes - (e.g. "Knowledgedriven" → "Knowledge-Driven"). - 3. Dictionary lookup again — catches entries newly exposed by the suffix - pass (e.g. "Doubleedgeassisted" → suffix splits to "Doubleedge-Assisted" - → dict converts "Doubleedge" to "Double-Edge"). - """ - if not title: - return title - result = title - # Pass 1: Dictionary-based fixes (highest priority, handles acronyms & irregulars) - for pattern, replacement in _FUSED_DICT_PATTERNS: - result = pattern.sub(replacement, result) - # Pass 2: Suffix-based detection for remaining fused compounds. - # Matches title-cased words: [A-Z][a-z]{2,} prefix + known compound suffix. - for sfx_pat in _COMPOUND_SUFFIX_PATTERNS: - result = sfx_pat.sub(lambda m: m.group(1) + "-" + m.group(2).capitalize(), result) - # Pass 3: Dictionary again (suffix pass may expose new \b boundaries) - for pattern, replacement in _FUSED_DICT_PATTERNS: - result = pattern.sub(replacement, result) - return result - def _fixup_bib_entry(entry: dict[str, Any]) -> bool: """Apply entry type and field corrections to a parsed BibTeX entry. diff --git a/src/fixup/__init__.py b/src/fixup/__init__.py new file mode 100644 index 00000000..7b61f3ad --- /dev/null +++ b/src/fixup/__init__.py @@ -0,0 +1 @@ +"""Fix-pattern tables and shared text-transform helpers extracted from main.py.""" diff --git a/src/fixup/patterns.py b/src/fixup/patterns.py new file mode 100644 index 00000000..8e8e6ff7 --- /dev/null +++ b/src/fixup/patterns.py @@ -0,0 +1,97 @@ +"""Pre-compiled fix-pattern tables and regexes for title and booktitle fixes. + +Relocated verbatim from main.py. Depends only on stdlib re and src.config, and is +imported by src.fixup.text. No dependency on main (no import cycle). +""" + +from __future__ import annotations + +import re + +from src.config import ACRONYM_CASE_CORRECTIONS, COMPOUND_SUFFIXES, FUSED_COMPOUND_WORDS + +# Pre-compiled patterns for _fix_fused_compounds (avoids ~800 re.compile() calls per invocation) +_FUSED_DICT_PATTERNS: list[tuple[re.Pattern[str], str]] = [ + (re.compile(r"\b" + re.escape(fused) + r"\b", re.IGNORECASE), repl) for fused, repl in FUSED_COMPOUND_WORDS.items() +] +_COMPOUND_SUFFIX_PATTERNS: list[re.Pattern[str]] = [ + re.compile(r"\b([A-Z][a-z]{2,})(" + re.escape(suffix) + r")\b") for suffix in COMPOUND_SUFFIXES +] + +# Pre-compiled patterns for garbage title detection +_GARBAGE_EMAIL_RE = re.compile(r"[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}") +_GARBAGE_POSTAL_RE = re.compile(r"\b[A-Z]\d[A-Z]\s*\d[A-Z]\d\b") +_GARBAGE_DEPT_RE = re.compile(r"^\s*(Department|Faculty|School|Institute)\s+of\b", re.IGNORECASE) +_GARBAGE_PHONE_RE = re.compile(r"\+?\d{1,4}[\.\-]\d{2,4}[\.\-]\d{2,}") +_GARBAGE_VOLUME_RE = re.compile(r"\bComplete\s+Volume\b", re.IGNORECASE) +_GARBAGE_SERIES_VOL_RE = re.compile(r"^(OASIcs|LIPIcs|LNI|LNCS|Dagstuhl)\b.*\bVolume\s+\d+\b", re.IGNORECASE) +_GARBAGE_FESTSCHRIFT_RE = re.compile(r"\bFestschrift\b", re.IGNORECASE) +_GARBAGE_FESTSCHRIFT_META_RE = re.compile(r",\s+[A-Z][a-z]+,\s+[A-Z][a-z]+\b.*\d{4}") +_GARBAGE_PROCEEDINGS_RE = re.compile(r"^Proceedings\s+of\s+(the\s+)?\d{4}\s+", re.IGNORECASE) +_GARBAGE_CORRECTION_RE = re.compile(r"^Correction(s)?\s+(to|of)\s*:", re.IGNORECASE) +_GARBAGE_EASYCHAIR_RE = re.compile(r"\bEasyChair\s+Preprint\b", re.IGNORECASE) + +# Pre-compiled patterns for acronym case corrections in titles +_ACRONYM_CASE_PATTERNS: list[tuple[re.Pattern[str], str]] = [ + (re.compile(r"\b" + re.escape(wrong) + r"\b"), correct) for wrong, correct in ACRONYM_CASE_CORRECTIONS.items() +] + +# Pre-compiled pattern for verbose LNCS/Springer booktitle metadata +# Strips conference location, dates, and "Proceedings" suffix appended by Crossref +_VERBOSE_BOOKTITLE_RE = re.compile( + r"\d+(st|nd|rd|th)\s+(International|Annual|European|Asian|Australasian)\s+" + r"(Conference|Workshop|Symposium)\b.*,\s*Proceedings\s*$", + re.IGNORECASE, +) + +# Pre-compiled title spacing and case patterns shared by _fix_title_text +_COLON_SPACE_RE = re.compile(r"(\S):([A-Z])") +_HYPHEN_SPACE_RE = re.compile(r"(\w)- (?!and |or |to )") +_SPACE_HYPHEN_RE = re.compile(r"(\w) -(\w)") + +# Pre-compiled booktitle cleanup patterns (venue abbreviations, typos, spacing) +_BOOKTITLE_FIXUPS: list[tuple[re.Pattern[str], str]] = [ + # "on on " → "on " (duplicate preposition from ACM metadata) + (re.compile(r"\bon on\b"), "on"), + # "of the YYYY on ACM" → "of the YYYY ACM" (Crossref 2024 ACM metadata gap) + (re.compile(r"of the (\d{4}) on (ACM|IEEE)\b"), r"of the \1 \2"), + # "Nations of the Americas Chapter" → "North American Chapter" (NAACL 2025 Crossref error) + (re.compile(r"Nations of the Americas Chapter"), "North American Chapter"), + # "Health(SeGAH)" → "Health (SeGAH)" (missing space before acronym) + (re.compile(r"Health\(SeGAH\)"), "Health (SeGAH)"), + # "Intl Conf" → "International Conference" + (re.compile(r"\bIntl Conf\b"), "International Conference"), + # "Int'l" → "International" + (re.compile(r"\bInt'l\b"), "International"), + # "NeuriPS" → "NeurIPS" (venue typo from API sources) + (re.compile(r"\bNeuriPS\b"), "NeurIPS"), + # CHCCS publisher name used as venue → Graphics Interface conference + (re.compile(r"^Canada Human-Computer Communications Society$"), "Graphics Interface"), + # "Conference On" → "Conference on" (lowercase preposition; must run before truncation completions) + (re.compile(r"\bConference On\b"), "Conference on"), + # "YYYY ACM on Conference" → "YYYY ACM Conference" (Crossref spurious "on") + (re.compile(r"(\d{4}) ACM on ([A-Z])"), r"\1 ACM \2"), + # "of the YYYY on Innovation" → "of the YYYY ACM Conference on Innovation" (ITiCSE gap) + (re.compile(r"of the (\d{4}) on Innovation"), r"of the \1 ACM Conference on Innovation"), + # "ITiCSE'NN: Proceedings..." prefix → strip non-standard prefix + (re.compile(r"ITiCSE'\d{2}:\s*"), ""), + # "SEET-Software" → "SEET - Software" (missing spaces around dash) + (re.compile(r"^SEET-Software"), "SEET - Software"), + # Truncated SerpAPI booktitles — complete known conference name suffixes + (re.compile(r"Conference on Innovation$"), "Conference on Innovation and Technology in Computer Science Education"), + (re.compile(r"Applications of Computer$"), "Applications of Computer Vision"), + (re.compile(r"Analyzing and Interpreting$"), "Analyzing and Interpreting Neural Networks for NLP"), + (re.compile(r"Conference on Persuasive$"), "Conference on Persuasive Technology"), + # FAccT: "Fairness Accountability and Transparency" → commas + (re.compile(r"Fairness Accountability and Transparency"), "Fairness, Accountability, and Transparency"), + # "Conference Information" → "Conference on Information" (missing "on") + (re.compile(r"Conference Information Visualisation"), "Conference on Information Visualisation"), + # "YYYY the Nth" → "YYYY The Nth" (capitalize after year) + (re.compile(r"(\d{4}) the (\d)"), r"\1 The \2"), + # "Conference: (VTC" → "Conference (VTC" (stray colon before acronym) + (re.compile(r"Conference: \("), "Conference ("), + # "Persuasive Technology PERSUASIVE YYYY" → strip redundant acronym + (re.compile(r"(Persuasive Technology(?:\s+Adjunct)?),?\s+PERSUASIVE(?:\s+\d{4})?$"), r"\1"), + # Truncated "\& International..." suffix → strip + (re.compile(r"\s*\\?&\s*International$"), ""), +] diff --git a/src/fixup/text.py b/src/fixup/text.py new file mode 100644 index 00000000..af68c242 --- /dev/null +++ b/src/fixup/text.py @@ -0,0 +1,110 @@ +"""Shared title and booktitle text-transform helpers. + +Relocated verbatim from main.py. Pure functions over the pre-compiled patterns in +src.fixup.patterns. No dependency on main (no import cycle). +""" + +from __future__ import annotations + +import re + +from src.fixup.patterns import ( + _ACRONYM_CASE_PATTERNS, + _BOOKTITLE_FIXUPS, + _COLON_SPACE_RE, + _COMPOUND_SUFFIX_PATTERNS, + _FUSED_DICT_PATTERNS, + _GARBAGE_CORRECTION_RE, + _GARBAGE_DEPT_RE, + _GARBAGE_EASYCHAIR_RE, + _GARBAGE_EMAIL_RE, + _GARBAGE_FESTSCHRIFT_META_RE, + _GARBAGE_FESTSCHRIFT_RE, + _GARBAGE_PHONE_RE, + _GARBAGE_POSTAL_RE, + _GARBAGE_PROCEEDINGS_RE, + _GARBAGE_SERIES_VOL_RE, + _GARBAGE_VOLUME_RE, + _HYPHEN_SPACE_RE, + _SPACE_HYPHEN_RE, + _VERBOSE_BOOKTITLE_RE, +) + + +def _apply_booktitle_fixups(bt: str) -> str: + """Strip verbose conference metadata and apply pre-compiled booktitle cleanup patterns.""" + if _VERBOSE_BOOKTITLE_RE.search(bt): + stripped = _VERBOSE_BOOKTITLE_RE.sub("", bt).rstrip(" ,") + if stripped: + bt = stripped + for pat, repl in _BOOKTITLE_FIXUPS: + bt = pat.sub(repl, bt) + return bt + + +def _fix_title_text(title: str) -> str: + """Fix fused compounds, colon-space, hyphen-space, and acronym case.""" + result = _fix_fused_compounds(title) + result = _COLON_SPACE_RE.sub(r"\1: \2", result) + result = _HYPHEN_SPACE_RE.sub(r"\1-", result) + result = _SPACE_HYPHEN_RE.sub(r"\1-\2", result) + for acr_pat, acr_repl in _ACRONYM_CASE_PATTERNS: + result = acr_pat.sub(acr_repl, result) + return result + + +def _is_garbage_title(title: str) -> bool: + """Detect non-bibliographic titles from Scholar/DBLP artifacts. + + Catches institutional addresses, contact info, and other metadata + that occasionally appear as "paper titles" in Scholar results. + """ + if not title: + return False + return bool( + _GARBAGE_EMAIL_RE.search(title) + or _GARBAGE_POSTAL_RE.search(title) + or _GARBAGE_DEPT_RE.search(title) + or _GARBAGE_PHONE_RE.search(title) + or _GARBAGE_VOLUME_RE.search(title) + or _GARBAGE_SERIES_VOL_RE.search(title) + or (_GARBAGE_FESTSCHRIFT_RE.search(title) and _GARBAGE_FESTSCHRIFT_META_RE.search(title)) + or _GARBAGE_PROCEEDINGS_RE.match(title) + or _GARBAGE_CORRECTION_RE.match(title) + or _GARBAGE_EASYCHAIR_RE.search(title) + ) + + +def _is_corrupted_title(title: str) -> bool: + """Detect DBLP-corrupted titles containing author names instead of real titles. + + Matches patterns like "Li2 ()" -- author name + numeric affiliation + empty parens. + """ + return len(re.findall(r"\b[A-Z][a-z]+\d+\s*\(\)", title)) >= 2 + + +def _fix_fused_compounds(title: str) -> str: + """Fix fused compound words in titles (hyphens stripped by Google Scholar). + + Three-pass approach: + 1. Dictionary lookup for special cases (acronyms, irregular patterns). + 2. Suffix-based detection for common compound adjective suffixes + (e.g. "Knowledgedriven" → "Knowledge-Driven"). + 3. Dictionary lookup again — catches entries newly exposed by the suffix + pass (e.g. "Doubleedgeassisted" → suffix splits to "Doubleedge-Assisted" + → dict converts "Doubleedge" to "Double-Edge"). + """ + if not title: + return title + result = title + # Pass 1: Dictionary-based fixes (highest priority, handles acronyms & irregulars) + for pattern, replacement in _FUSED_DICT_PATTERNS: + result = pattern.sub(replacement, result) + # Pass 2: Suffix-based detection for remaining fused compounds. + # Matches title-cased words: [A-Z][a-z]{2,} prefix + known compound suffix. + for sfx_pat in _COMPOUND_SUFFIX_PATTERNS: + result = sfx_pat.sub(lambda m: m.group(1) + "-" + m.group(2).capitalize(), result) + # Pass 3: Dictionary again (suffix pass may expose new \b boundaries) + for pattern, replacement in _FUSED_DICT_PATTERNS: + result = pattern.sub(replacement, result) + return result From 81f493a57440c26377b29d9a4ecd0c0fab62569a Mon Sep 17 00:00:00 2001 From: Gabriel Spadon Date: Wed, 1 Jul 2026 14:45:07 -0300 Subject: [PATCH 15/54] docs(audit): add Codex-vetted BibEntry domain-model design --- audit/03-bibentry-design.md | 168 ++++++++++++++++++++++++++++++++++++ 1 file changed, 168 insertions(+) create mode 100644 audit/03-bibentry-design.md diff --git a/audit/03-bibentry-design.md b/audit/03-bibentry-design.md new file mode 100644 index 00000000..f055f2da --- /dev/null +++ b/audit/03-bibentry-design.md @@ -0,0 +1,168 @@ +# BibEntry domain-model design (supersedes fixup Steps 4/6/C5) + +## Problem +Bibliographic entries are untyped dicts `{type,key,fields}` canonicalized (type +reclassification + title/venue normalization) at THREE open-coded sites: A = +`_fixup_bib_entry` (orphan/terminal sweep, main.py:154), B = existing-file +pre-enrichment (main.py:713-1181), C = Phase-4 post-merge (main.py:1895-2298). +This triplication is the "fixup patch" smell; the fix is to make canonicalization +intrinsic to a `BibEntry` type so a non-canonical entry is not produced. + +## Crux finding (reader A) +One idempotent `canonicalize()` reproduces A/B/C EXCEPT for one irreducible input: +a single boolean `terminal` ("enrichment exhausted"). It gates exactly 3 rules +that fire on a field's ABSENCE: +- R17 article & no journal -> misc +- R18 inproceedings & no booktitle -> misc +- R19 article & preprint-DOI & no vol/pages -> misc (downgrade branch) +Pre-merge these must be LEFT ALONE (enrichment may still fill the field); +post-merge they downgrade. Every other rule (R1-R16, R20 misc->inproceedings, +R21, all text N*) is DATA-driven and folds into a fixpoint. The "C-only" +misc->inproceedings (R20) is data-driven: its precondition (a conference +howpublished) is manufactured by earlier rules in the same pass, not externally. + +Ordering: the union needs ONE canonical order because (a) "zenodo" is in BOTH +REPOSITORY_AS_JOURNAL and PREPRINT_SERVERS so R16 (keep value as howpublished) +and R12 (drop journal) do NOT commute -> canonical order R16-before-R12 (B/C +already do this); (b) the title chain N18/N19/N1/N2/N9/N10 is order-sensitive. + +Today A/B/C are NOT mutually byte-identical: A is a strict subset (lacks +N18/N19/R14/R15/R16); B has a DESTRUCTIVE branch (N22 title==venue -> delete +file, main.py:1106) and pipeline-only rewrites (email-from-author). So: +- canonicalize() is PURE (entry -> entry); side effects (file delete, I/O) stay + in the pipeline, not the model. This is part of the coherence win. +- The model adopts the UNION of the pure normalization rules + the terminal flag. + +## Blast radius (reader B) +Pervasive shared-mutable-dict: ~84 field reads + dozens of in-place type/fields +mutations in main.py, ~40 in merge_utils, `_fixup_bib_entry` 40+ in-place writes +returning a change-flag. A big-bang immutable value object breaks the +alias-and-mutate contract at hundreds of sites. => Adopt BibEntry INCREMENTALLY. + +## Parse/serialize boundary (reader C) +parse_bibtex_to_dict is near-lossless (lowercases type + field keys, strips, +unwraps braces, preserves insertion order). bibtex_from_dict is lossy/normalizing +(PREFERRED_FIELD_ORDER then sorted extras; _normalize_to_ascii; _sanitize_title; +&-escape excl url/doi; 2-space indent; trailing-comma strip; single trailing \n). +Invariant to preserve: serialize(parse(serialize(x))) == serialize(x). +`to_bibtex()` must OWN the full serialization contract (move PREFERRED_FIELD_ORDER ++ the 3 nested helpers onto/behind it). + +## Design +`src/entry.py` (new) — `class BibEntry`: +- data: `entry_type: str` (lowercased), `key: str` (case preserved), + `fields: dict[str,str]` (ordered, lowercased keys). Dedup ids + (x_scholar_cluster_id/...) modeled as transient, non-serialized. +- boundaries (single construct/serialize points): + - `from_bibtex(text) -> BibEntry | None` (wraps parse_bibtex_to_dict) + - `from_raw(type,key,fields,*,arxiv=...) -> BibEntry` (wraps build_bibtex_entry + assembly + get_container_field placement) + - `to_bibtex() -> str` (owns the serialization contract) +- ONE normalization: `canonicalize(*, terminal: bool) -> bool` (in-place, returns + changed) OR returns a new BibEntry. Applies the union of type + text rules in + the single canonical order; `terminal` gates R17/R18/R19-misc. +- rules live as an ordered registry of small pure predicate+action functions with + metadata (needs_terminal), in `src/entry_rules.py` (rehomes src/fixup/*). This + is the SINGLE SOURCE OF TRUTH; the 3 sites disappear. + +Call-site collapse: +- Site B (pre-merge): `entry.canonicalize(terminal=False)` +- Site C (post-merge): `entry.canonicalize(terminal=True)` +- Site A (orphan/terminal sweep): `entry.canonicalize(terminal=True)` +- B's destructive N22 (title==venue file delete) + email-from-author stay in the + pipeline as explicit steps around canonicalize (they are I/O, not normalization). + +## Byte-identity strategy +Differential test is the gate: for a large synthetic entry matrix AND the golden +output/ corpus, assert `canonicalize(terminal)` reproduces the CURRENT per-site +output (run the pre-refactor A/B/C blocks vs the new model). Plus the two-run +byte-identity check (run pipeline twice, git diff --exit-code output/). Resolve +the zenodo R16 canonicalize(terminal=True). Gate incl. differential + two-run. +5. Route Site B -> canonicalize(terminal=False) (keep its pipeline-only I/O steps + separate). Gate. +6. Route Site A (orphan sweep) -> canonicalize(terminal=True). Gate. +7. Delete the 3 open-coded blocks + src/fixup/ (absorbed). Gate. +8. (Later, optional) migrate field-access sites to typed accessors; not required + for the coherence win. + +## Why this satisfies the critique +- Canonicalization is intrinsic to the type (produced canonical via from_*/ + canonicalize), not "applied" as a patch in 3 places. +- The 3 sites collapse to one method + one honest boolean; the differences that + remain are explicit and justified (terminal), not hidden duplication. +- Pure normalization is separated from pipeline I/O. +- Single construct + single serialize boundary. +- Incremental + differential-gated => byte-identity preserved and provable. + +--- + +# REVISION (Codex-vetted) — supersedes the sections above where they conflict + +The original design was NOT byte-safe. Corrections (each verified against source): + +## 1. Five stages, not three (ordered enum, not a bool) +Complete entries (~96% cache-hit) run Site B, then quick-fixups (main.py:1185-1212), +then `return 1` and NEVER reach Site C. Plus tier2 (main.py:2300) and the N22 delete +(main.py:2367); merge_with_policy also normalizes author/pages/volume. So: +`CanonicalStage` enum, ordered: LOAD_REPAIR, COMPLETE_SKIP_FINALIZE, POST_MERGE, +POST_TIER2_VALIDATE, POSTRUN_ORPHAN_REPAIR. Each rule carries the set of stages it +runs at. `canonicalize(entry, stage)`. + +## 2. Preserve each stage's EXACT current rule set first; NO union routing +Do NOT route B or A to the union. Complete entries persist B's output straight to +the on-disk baseline, so any C-only rule added to B (url_booktitle->misc :2026, +misc_workshop->inproceedings :2271) changes committed bytes immediately. Site A's +narrow subset is load-bearing (cleanup for tier2-bypassed venues + undone Phase-4 +corrections). Step 1 makes each site call canonicalize(stage=X) reproducing its +CURRENT rules byte-for-byte; unify differences later ONLY rule-by-rule under a +per-corpus differential diff gate. + +## 3. Declarative side-effects +canonicalize is pure but returns CanonicalResult(entry, actions) where actions are +declarative (DeleteFile, SkipEntry). The pipeline executes them at the correct +stage (N22 delete depends on canonicalized title/venue; runs after tier2 in C but +before the complete-skip in B). A global "canonicalize then side-effects" pass +cannot express that ordering; declarative actions can. + +## 4. Determinism fixes (fold into the registry build) +- Replace `next(x for x in FROZENSET ... startswith)` first-match (main.py:184 etc.) + with ordered tuples matched by (priority, longest-prefix). frozenset-first-match + is PYTHONHASHSEED-dependent. +- zenodo in BOTH REPOSITORY_AS_JOURNAL and PREPRINT_SERVERS => R16-before-R12 is a + SEMANTIC canonical order. +- Two-run gate: compare serialized `.bib` bytes under PYTHONHASHSEED=1,2,3, gated + PER STAGE on the actual control flow (complete-path vs incomplete-path). Do NOT + use blanket `git diff output/` — summary.csv row order is concurrently + nondeterministic (orthogonal issue) and would mask real .bib regressions. + +## 5. Migration byte-safety +- Steps 1-2 (introduce BibEntry; bibtex_from_dict delegates to to_bibtex) MUST keep + to_bibtex emitting the transient x_* dedup fields exactly as today. Defer + transient/non-serialized modeling to a later separately-gated step (the strip + lives only at merge_utils.py:412; B writes serialize without merge). +- Non-byte-neutral steps (gate hard, corpus diff): B->union, A->union, + trailing-canonicalize-after-tier2, moving x_* strip into the serializer. +- Assert the completeness invariant that makes B safe (main.py:432): complete => + has_venue AND non-preprint-DOI => the absence-trio (R17/R18/R19-misc) cannot fire. +- Dead code: the complete-skip article-preprint-doi->misc at main.py:1199-1212 is + unreachable (_entry_is_complete requires non-preprint DOI; block requires + is_secondary_doi). Mark dead in the registry; do not port as live. + +## Honest scope note +The "3 sites disappear" was oversold. Reality: 5 stages become EXPLICIT, +single-sourced stage members of one registry (a large improvement over 3 +copy-pasted blocks), with side-effects declarative and one pure canonicalize core. +Unifying the per-stage rule differences into a true single rule set is a SEPARATE, +rule-by-rule, corpus-gated effort that may reveal some differences are load-bearing. From 3223bfb22ce7be2530d88cfa67c8a816cf1e719f Mon Sep 17 00:00:00 2001 From: Gabriel Spadon Date: Wed, 1 Jul 2026 14:51:03 -0300 Subject: [PATCH 16/54] refactor: name the BibTeX field-order constant PREFERRED_FIELD_ORDER Promote the inline emission-order list in bibtex_from_dict to a module tuple so the byte-identity field-order contract has a named, referenceable constant. Byte-neutral. --- src/bibtex_utils.py | 41 ++++++++++++++++++++++++----------------- 1 file changed, 24 insertions(+), 17 deletions(-) diff --git a/src/bibtex_utils.py b/src/bibtex_utils.py index 54d70929..9c06dc19 100644 --- a/src/bibtex_utils.py +++ b/src/bibtex_utils.py @@ -233,6 +233,29 @@ def parse_bibtex_to_dict(bibtex: str) -> dict[str, Any] | None: return {"type": head["type"].lower(), "key": head["key"], "fields": fields} +# Canonical BibTeX field emission order. Fields not listed are appended in +# sorted() order afterwards. This ordering is part of the byte-identity output +# contract (of-bibtex-field-order-stable); do not reorder without updating the +# golden serializer test. +PREFERRED_FIELD_ORDER: tuple[str, ...] = ( + "title", + "author", + "year", + "journal", + "booktitle", + "howpublished", + "publisher", + "volume", + "number", + "pages", + "doi", + "url", + "eprint", + "archiveprefix", + "primaryclass", +) + + def bibtex_from_dict(entry: dict[str, Any]) -> str: """ Format a dictionary-based BibTeX entry back into text, listing common @@ -392,23 +415,7 @@ def _sanitize_title(title_val: str | None) -> str | None: etype = (entry.get("type") or "misc").lower() key = entry.get("key") or "entry" fields: dict[str, str] = entry.get("fields") or {} - preferred = [ - "title", - "author", - "year", - "journal", - "booktitle", - "howpublished", - "publisher", - "volume", - "number", - "pages", - "doi", - "url", - "eprint", - "archiveprefix", - "primaryclass", - ] + preferred = list(PREFERRED_FIELD_ORDER) lines = [f"@{etype}{{{key},"] preferred_set = set(preferred) ordered_keys = list(preferred) + sorted(k for k in fields if k not in preferred_set) From 008e2d297d9c6f3b243000bf5ad6918d7033304c Mon Sep 17 00:00:00 2001 From: Gabriel Spadon Date: Wed, 1 Jul 2026 14:51:03 -0300 Subject: [PATCH 17/54] feat: add BibEntry domain type wrapping parse/serialize (byte-neutral) Introduce src/entry.py::BibEntry as a thin typed wrapper over parse_bibtex_to_dict / bibtex_from_dict (from_bibtex/from_dict/to_dict/ to_bibtex). No pipeline call sites touched; serialization contract stays in bibtex_utils for a later step. Foundation for the domain-model migration that makes canonicalization intrinsic. 21 tests (byte-identity + round-trip fixpoint + defensive-copy). --- src/entry.py | 83 +++++++++++++++++++++++ tests/test_entry.py | 158 ++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 241 insertions(+) create mode 100644 src/entry.py create mode 100644 tests/test_entry.py diff --git a/src/entry.py b/src/entry.py new file mode 100644 index 00000000..c2e094e7 --- /dev/null +++ b/src/entry.py @@ -0,0 +1,83 @@ +from __future__ import annotations + +from dataclasses import dataclass +from typing import Any + +from .bibtex_utils import bibtex_from_dict, parse_bibtex_to_dict + + +@dataclass +class BibEntry: + """Typed wrapper over the dict shape used throughout the pipeline. + + This is a thin, byte-neutral facade over the existing + ``parse_bibtex_to_dict`` / ``bibtex_from_dict`` functions in + :mod:`src.bibtex_utils`. It introduces a domain type without changing any + parse or serialize behaviour; call sites are migrated onto it in later + steps. + + Invariants mirror ``parse_bibtex_to_dict`` semantics: + + - ``entry_type`` is stored lowercased (``"@Article"`` -> ``"article"``). + - ``fields`` keys are stored lowercased; field *values* are kept verbatim. + - ``key`` is stored case-preserved. + + Normalization happens in ``__post_init__`` so direct construction, + :meth:`from_dict`, and :meth:`from_bibtex` all yield the same invariants. + """ + + entry_type: str + key: str + fields: dict[str, str] + + def __post_init__(self) -> None: + # Normalize to match parse_bibtex_to_dict semantics. Rebuilding the + # fields mapping also yields a defensive copy of the caller's dict. + self.entry_type = (self.entry_type or "misc").lower() + self.key = self.key or "entry" + self.fields = {str(k).lower(): v for k, v in (self.fields or {}).items()} + + @classmethod + def from_bibtex(cls, text: str) -> BibEntry | None: + """Parse a BibTeX string into a ``BibEntry``. + + Delegates to ``parse_bibtex_to_dict``; returns ``None`` when the input + has no parseable entry header. The resulting entry is exactly + equivalent to the parsed dict (see :meth:`to_dict`). + """ + parsed = parse_bibtex_to_dict(text) + if parsed is None: + return None + return cls(entry_type=parsed["type"], key=parsed["key"], fields=parsed["fields"]) + + @classmethod + def from_dict(cls, entry: dict[str, Any]) -> BibEntry: + """Wrap an existing ``{"type", "key", "fields"}`` dict. + + Missing pieces default to ``type="misc"``, ``key="entry"``, + ``fields={}``. The ``fields`` mapping is defensively copied so later + mutation of the source dict does not leak into the entry. + """ + raw_fields = entry.get("fields") or {} + fields = {str(k): str(v) for k, v in dict(raw_fields).items()} + return cls( + entry_type=entry.get("type") or "misc", + key=entry.get("key") or "entry", + fields=fields, + ) + + def to_dict(self) -> dict[str, str | dict[str, str]]: + """Return the ``{"type", "key", "fields"}`` dict the pipeline expects. + + ``fields`` is a fresh copy, so mutating the returned mapping does not + affect this entry. + """ + return {"type": self.entry_type, "key": self.key, "fields": dict(self.fields)} + + def to_bibtex(self) -> str: + """Serialize back to BibTeX text via ``bibtex_from_dict``. + + Delegates for now; owning the serialization contract on this method is + a later migration step. + """ + return bibtex_from_dict(self.to_dict()) diff --git a/tests/test_entry.py b/tests/test_entry.py new file mode 100644 index 00000000..ef57b0cc --- /dev/null +++ b/tests/test_entry.py @@ -0,0 +1,158 @@ +from __future__ import annotations + +import pytest + +from src.bibtex_utils import bibtex_from_dict, parse_bibtex_to_dict +from src.entry import BibEntry + +# Representative BibTeX entries exercising the parse/serialize surface: +# an @article with doi/url, an @inproceedings with booktitle, an @misc, an +# entry carrying a non-preferred (unordered) field, and one with accented / +# LaTeX-formatted text to drive the ASCII normalization path. +ARTICLE_DOI_URL = """@article{Smith2020:Example, + title = {A Study of Something Interesting}, + author = {Smith, John and Doe, Jane}, + year = {2020}, + journal = {Journal of Examples}, + volume = {12}, + number = {3}, + pages = {100--120}, + doi = {10.1234/example.2020}, + url = {https://doi.org/10.1234/example.2020} +} +""" + +INPROCEEDINGS_BOOKTITLE = """@inproceedings{Doe2019:Conf, + title = {Fast Algorithms for Hard Problems}, + author = {Doe, Jane}, + year = {2019}, + booktitle = {Proceedings of the International Conference on Examples}, + pages = {1--10} +} +""" + +MISC_ENTRY = """@misc{Anon2021:Data, + title = {A Dataset of Things}, + author = {Anonymous}, + year = {2021}, + howpublished = {Online repository} +} +""" + +EXTRA_FIELD = """@article{Lee2022:Extra, + title = {On Extra Fields}, + author = {Lee, Kim}, + year = {2022}, + journal = {Extra Journal}, + keywords = {sorting, ordering}, + abstract = {We test non-preferred fields.} +} +""" + +ACCENTED_LATEX = """@article{Cafe2018:Accents, + title = {\\'{E}tude sur le caf\\'{e}: \\textit{une analyse} d\\'{e}taill\\'{e}e}, + author = {Mu\\~{n}oz, Jos\\'{e}}, + year = {2018}, + journal = {Revista Espa\\~{n}ola} +} +""" + +ALL_ENTRIES = [ + ARTICLE_DOI_URL, + INPROCEEDINGS_BOOKTITLE, + MISC_ENTRY, + EXTRA_FIELD, + ACCENTED_LATEX, +] + + +@pytest.mark.parametrize("text", ALL_ENTRIES) +def test_from_bibtex_to_bibtex_matches_reference(text: str) -> None: + """to_bibtex() must be byte-identical to the direct dict serialization.""" + parsed = parse_bibtex_to_dict(text) + assert parsed is not None + reference = bibtex_from_dict(parsed) + + entry = BibEntry.from_bibtex(text) + assert entry is not None + assert entry.to_bibtex() == reference + + +@pytest.mark.parametrize("text", ALL_ENTRIES) +def test_from_bibtex_to_dict_equals_parsed(text: str) -> None: + """to_dict() must reproduce the exact shape parse_bibtex_to_dict returns.""" + parsed = parse_bibtex_to_dict(text) + assert parsed is not None + + entry = BibEntry.from_bibtex(text) + assert entry is not None + assert entry.to_dict() == parsed + + +@pytest.mark.parametrize("text", ALL_ENTRIES) +def test_roundtrip_fixpoint(text: str) -> None: + """Re-parsing a serialized entry is an idempotent fixpoint. + + to_bibtex(from_bibtex(to_bibtex(from_bibtex(text)))) == + to_bibtex(from_bibtex(text)). + """ + + def _roundtrip(t: str) -> str: + entry = BibEntry.from_bibtex(t) + assert entry is not None + return entry.to_bibtex() + + once = _roundtrip(text) + twice = _roundtrip(once) + assert twice == once + + +def test_from_bibtex_returns_none_on_invalid() -> None: + assert BibEntry.from_bibtex("this is not a bibtex entry") is None + + +def test_from_dict_preserves_type_key_fields() -> None: + entry = BibEntry.from_dict({"type": "article", "key": "Smith2020", "fields": {"title": "Hello", "year": "2020"}}) + assert entry.entry_type == "article" + assert entry.key == "Smith2020" + assert entry.fields == {"title": "Hello", "year": "2020"} + assert entry.to_dict() == { + "type": "article", + "key": "Smith2020", + "fields": {"title": "Hello", "year": "2020"}, + } + + +def test_from_dict_defaults() -> None: + entry = BibEntry.from_dict({}) + assert entry.entry_type == "misc" + assert entry.key == "entry" + assert entry.fields == {} + + +def test_from_dict_lowercases_type_and_field_keys() -> None: + entry = BibEntry.from_dict( + {"type": "InProceedings", "key": "MixedCaseKey", "fields": {"Title": "T", "BookTitle": "B"}} + ) + # entry_type lowercased, field keys lowercased, key case-preserved. + assert entry.entry_type == "inproceedings" + assert entry.key == "MixedCaseKey" + assert entry.fields == {"title": "T", "booktitle": "B"} + + +def test_from_dict_defensive_copies_source_fields() -> None: + source = {"type": "misc", "key": "K", "fields": {"title": "Original"}} + entry = BibEntry.from_dict(source) + # Mutating the source dict's fields must not leak into the entry. + source["fields"]["title"] = "Changed" + assert entry.fields["title"] == "Original" + + +def test_to_dict_returns_defensive_copy() -> None: + entry = BibEntry.from_dict({"type": "misc", "key": "K", "fields": {"title": "Original"}}) + out = entry.to_dict() + fields_out = out["fields"] + assert isinstance(fields_out, dict) + fields_out["title"] = "Mutated" + # Mutating the returned dict must not change the entry. + assert entry.fields["title"] == "Original" From 712d07ec4f1edb5b45ee12cecd6b21a542c543db Mon Sep 17 00:00:00 2001 From: Gabriel Spadon Date: Wed, 1 Jul 2026 15:07:26 -0300 Subject: [PATCH 18/54] refactor: extract Site A canonicalization into src/canonicalize.py Move _fixup_bib_entry (the post-run orphan-repair canonicalization) and its 18 module-local regexes verbatim from main.py into a new src/canonicalize.py, and define the CanonicalStage enum (LOAD_REPAIR, COMPLETE_SKIP_FINALIZE, POST_MERGE, POST_TIER2_VALIDATE, POSTRUN_ORPHAN_REPAIR). main.py re-exports them so the orphan-pass caller and tests resolve unchanged. Byte-neutral; first stage of the BibEntry canonicalization model. --- main.py | 310 +++---------------------------------------- src/canonicalize.py | 317 ++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 339 insertions(+), 288 deletions(-) create mode 100644 src/canonicalize.py diff --git a/main.py b/main.py index ca434bc1..46ba6fde 100644 --- a/main.py +++ b/main.py @@ -16,6 +16,27 @@ from src import id_utils as idu from src import merge_utils as mu from src.cache import get_cache_hit_counts +from src.canonicalize import ( + _BOOK_CHAPTER_DOI_RE, + _DOI_VERSION_RE, + _GECCO_LOWER, + _GECCO_PROPER, + _GECCO_RE, + _LIPICS_PAGES_EXTRACT_RE, + _LIPICS_PAGES_STRIP_RE, + _OSF_DOI_RE, + _PREPRINT_MARKER_RE, + _PROC_EXT_ABSTRACTS, + _PROC_OF_THE, + _SPIRE_STRIP_RE, + _SUBTITLE_WRAPPER_RE, + _TRAILING_DASH_RE, + _URL_IN_VENUE_RE, + _URL_IN_VENUE_STRIP_RE, + _ZENTRUM_FUER, + _ZENTRUM_FUR, + _fixup_bib_entry, +) from src.clients.helpers import extract_authors_from_article, get_article_year, strip_html_tags from src.clients.scholar import ( build_bibtex_from_scholar_fields, @@ -126,295 +147,8 @@ _FILENAME_YEAR_RE = re.compile(r"/[A-Za-z]+(\d{4})-") -# Pre-compiled patterns for three-way title/venue fixups (used in _fixup_bib_entry, -# existing-file fixup, and Phase 4 post-merge — each pattern appears 3 times) -_TRAILING_DASH_RE = re.compile(r"[\s][-\u2013]\s*$") -_SUBTITLE_WRAPPER_RE = re.compile(r":\s*-([^-]+)-\s*$") -_SPIRE_STRIP_RE = re.compile(r"\s*:\s*SPIRE\b.*$") -_OSF_DOI_RE = re.compile(r"^10\.31(219|234)/") -_DOI_VERSION_RE = re.compile(r"_v\d+$") -_LIPICS_PAGES_STRIP_RE = re.compile(r",\s*\d+:\s*\d+-\d+:\s*\d+\s*$") -_LIPICS_PAGES_EXTRACT_RE = re.compile(r",\s*(\d+:\s*\d+-\d+:\s*\d+)\s*$") -_PREPRINT_MARKER_RE = re.compile(r"\s*\[preprint\]\s*$", re.IGNORECASE) -_GECCO_RE = re.compile(r"\bgenetic and evolutionary computation conference\b", re.IGNORECASE) -_URL_IN_VENUE_RE = re.compile(r"https?://") -_URL_IN_VENUE_STRIP_RE = re.compile(r",?\s*https?://\S+") +# US Patent detection (used in existing-file fixup and Phase 4 post-merge) _US_PATENT_RE = re.compile(r"(?i)^US\s+Patent") -_BOOK_CHAPTER_DOI_RE = re.compile(r"\.ch\d+$") - -# Repeated string literals used in the three-way fix pattern -_GECCO_LOWER = "genetic and evolutionary computation conference" -_GECCO_PROPER = "Genetic and Evolutionary Computation Conference" -_ZENTRUM_FUR = "Zentrum fur Informatik" -_ZENTRUM_FUER = 'Zentrum f{\\"u}r Informatik' -_PROC_EXT_ABSTRACTS = "Proceedings of the Extended Abstracts" -_PROC_OF_THE = "Proceedings of the " - - -def _fixup_bib_entry(entry: dict[str, Any]) -> bool: - """Apply entry type and field corrections to a parsed BibTeX entry. - - Returns True if any changes were made. - Used by both the per-article fixup and the post-run orphan fixup. - """ - fields = entry.get("fields") or {} - changed = False - etype = entry.get("type", "") - - # Reclassify @article with Procedia/IFAC series → @inproceedings - if etype == "article" and fields.get("journal"): - jnl_lower = fields["journal"].strip().lower() - if any(jnl_lower.startswith(ps) for ps in PROCEEDINGS_SERIES_AS_JOURNAL): - fields["booktitle"] = fields.pop("journal") - entry["type"] = "inproceedings" - changed = True - - # Reclassify @inproceedings with PACM journal → @article - if entry.get("type") == "inproceedings" and fields.get("booktitle"): - bt_lower = fields["booktitle"].strip().lower() - if any(bt_lower.startswith(pj) or bt_lower == pj for pj in ACM_JOURNAL_PROCEEDINGS): - fields["journal"] = fields.pop("booktitle") - entry["type"] = "article" - changed = True - - # Reclassify @inproceedings with PNAS/PVLDB journal → @article - # Guard: skip if the booktitle extends the journal name with conference keywords - if entry.get("type") == "inproceedings" and fields.get("booktitle"): - bt_lower = fields["booktitle"].strip().lower() - jnp_match = next((j for j in JOURNALS_NAMED_PROCEEDINGS if bt_lower.startswith(j)), None) - if jnp_match: - suffix = bt_lower[len(jnp_match) :].lstrip(" /,") - if not any(kw in suffix for kw in ("conference", "workshop", "symposium")): - fields["journal"] = fields.pop("booktitle") - entry["type"] = "article" - changed = True - - # Reclassify @inproceedings with institutional repository → @phdthesis - if entry.get("type") == "inproceedings" and fields.get("booktitle"): - bt_lower = fields["booktitle"].strip().lower() - if any(ir in bt_lower for ir in INSTITUTIONAL_REPOSITORIES): - fields["school"] = fields.pop("booktitle") - entry["type"] = "phdthesis" - changed = True - - # Downgrade @inproceedings with repository as booktitle → @misc - if ( - entry.get("type") == "inproceedings" - and fields.get("booktitle") - and any(rj in fields["booktitle"].lower() for rj in REPOSITORY_AS_JOURNAL) - ): - entry["type"] = "misc" - fields.pop("booktitle", None) - changed = True - - # Downgrade @article with repository as journal → @misc - if ( - entry.get("type") == "article" - and fields.get("journal") - and any(rj in fields["journal"].lower() for rj in REPOSITORY_AS_JOURNAL) - ): - entry["type"] = "misc" - fields.pop("journal", None) - changed = True - - # Downgrade @inproceedings with "Preprint" as booktitle → @misc - if ( - entry.get("type") == "inproceedings" - and fields.get("booktitle") - and fields["booktitle"].strip().lower() == "preprint" - ): - entry["type"] = "misc" - fields.pop("booktitle", None) - changed = True - - # Reclassify @article with university name as journal → @phdthesis - if entry.get("type") == "article" and fields.get("journal"): - _jnl_lower = fields["journal"].strip().lower() - if "university" in _jnl_lower or "institut" in _jnl_lower: - fields["school"] = fields.pop("journal") - entry["type"] = "phdthesis" - changed = True - - # Reclassify @inproceedings with journal name as booktitle → @article - # (but NOT for PROCEEDINGS_SERIES_AS_JOURNAL which are genuinely proceedings) - if entry.get("type") == "inproceedings" and fields.get("booktitle"): - bt_lower = fields["booktitle"].strip().lower() - is_proc_series = any(bt_lower.startswith(ps) for ps in PROCEEDINGS_SERIES_AS_JOURNAL) - if not is_proc_series and any(bt_lower.startswith(jp) for jp in JOURNAL_ONLY_PREFIXES): - fields["journal"] = fields.pop("booktitle") - entry["type"] = "article" - changed = True - - # Reclassify @inproceedings with "Handbook" in booktitle → @incollection - if entry.get("type") == "inproceedings" and fields.get("booktitle") and "handbook" in fields["booktitle"].lower(): - entry["type"] = "incollection" - changed = True - - # Reclassify @article with book-chapter DOI pattern → @incollection - if ( - entry.get("type") == "article" - and fields.get("journal") - and fields.get("doi") - and _BOOK_CHAPTER_DOI_RE.search(fields["doi"].strip()) - ): - fields["booktitle"] = fields.pop("journal") - entry["type"] = "incollection" - changed = True - - # Reclassify @article with conference proceedings in journal → @inproceedings - # (but NOT for ACM PACM journals which are legitimately named "Proceedings of...") - if entry.get("type") == "article" and fields.get("journal"): - jnl = fields["journal"].strip() - jnl_lower = jnl.lower() - is_pacm = any(jnl_lower.startswith(pj) or jnl_lower == pj for pj in ACM_JOURNAL_PROCEEDINGS) - if mu._is_conference_journal(jnl) and not fields.get("booktitle") and not is_pacm: - fields["booktitle"] = fields.pop("journal") - entry["type"] = "inproceedings" - changed = True - - # Strip [preprint] marker from title - title = fields.get("title", "") - if isinstance(title, str) and _PREPRINT_MARKER_RE.search(title): - fields["title"] = _PREPRINT_MARKER_RE.sub("", title).strip() - changed = True - - # Fix fused compounds, colon-space, hyphen-space, and acronym case - title = fields.get("title", "") - if isinstance(title, str) and title: - fixed_title = _fix_title_text(title) - if fixed_title != title: - fields["title"] = fixed_title - changed = True - - # Apply booktitle cleanup patterns (verbose metadata strip, abbreviations, typos, spacing) - bt_fix = (fields.get("booktitle") or "").strip() - if bt_fix: - bt_fixed = _apply_booktitle_fixups(bt_fix) - if bt_fixed != bt_fix: - fields["booktitle"] = bt_fixed - changed = True - - # Strip URLs embedded in booktitle/journal - for url_field in ("booktitle", "journal"): - url_val = (fields.get(url_field) or "").strip() - if url_val and _URL_IN_VENUE_RE.search(url_val): - url_cleaned = _URL_IN_VENUE_STRIP_RE.sub("", url_val).strip().rstrip(",") - if url_cleaned and url_cleaned != url_val: - fields[url_field] = url_cleaned - changed = True - - # Apply publisher corrections - pub_journal = (fields.get("journal") or "").lower() - if pub_journal: - for jnl_key, correct_pub in PUBLISHER_CORRECTIONS.items(): - if jnl_key in pub_journal: - cur_pub = fields.get("publisher", "") - if cur_pub and cur_pub != correct_pub: - fields["publisher"] = correct_pub - changed = True - - # Strip publisher when it duplicates the journal/booktitle name - pub = (fields.get("publisher") or "").strip() - container = (fields.get("journal") or fields.get("booktitle") or "").strip() - if pub and container and pub.lower() == container.lower(): - del fields["publisher"] - changed = True - - # Expand abbreviated venue names in booktitle (e.g., "NIME 2021" → full name) - bt = (fields.get("booktitle") or "").strip() - if bt and bt.lower() in ABBREVIATED_VENUE_MAP: - _expanded_bt = ABBREVIATED_VENUE_MAP[bt.lower()] - if _expanded_bt != bt: - fields["booktitle"] = _expanded_bt - changed = True - - # Correct ALL-CAPS venue names to proper case - for _vcf in ("journal", "booktitle"): - _vc_val = (fields.get(_vcf) or "").strip() - if _vc_val and _vc_val in VENUE_CASE_CORRECTIONS: - _corrected_vc = VENUE_CASE_CORRECTIONS[_vc_val] - if _corrected_vc != _vc_val: - fields[_vcf] = _corrected_vc - changed = True - # Fix lowercase _GECCO_LOWER in GECCO booktitles - elif _vc_val and _GECCO_LOWER in _vc_val.lower(): - _vc_fixed = _GECCO_RE.sub(_GECCO_PROPER, _vc_val) - if _vc_fixed != _vc_val: - fields[_vcf] = _vc_fixed - changed = True - - # Strip trailing " -" or en-dash from booktitle/title (truncation artifact) - for _td_field in ("booktitle", "title"): - _td_val = (fields.get(_td_field) or "").strip() - if _td_val and _TRAILING_DASH_RE.search(_td_val): - fields[_td_field] = _TRAILING_DASH_RE.sub("", _td_val) - changed = True - - # Strip ": -...-" subtitle wrapper artifact from title - title = fields.get("title", "") - if isinstance(title, str) and ": -" in title: - cleaned = _SUBTITLE_WRAPPER_RE.sub(r": \1", title) - if cleaned != title: - fields["title"] = cleaned - changed = True - - # Strip SPIRE-style proceedings garbage suffix from booktitle - bt_spire = (fields.get("booktitle") or "").strip() - if bt_spire: - bt_cleaned = _SPIRE_STRIP_RE.sub("", bt_spire) - if bt_cleaned != bt_spire: - fields["booktitle"] = bt_cleaned - changed = True - - # Strip _v[N] version suffix from OSF/PsyArXiv DOIs - doi_val = (fields.get("doi") or "").strip() - if doi_val and _OSF_DOI_RE.match(doi_val): - doi_stripped = _DOI_VERSION_RE.sub("", doi_val) - if doi_stripped != doi_val: - fields["doi"] = doi_stripped - changed = True - # Also fix the URL if it contains the versioned DOI - url_val = (fields.get("url") or "").strip() - if url_val and doi_val in url_val: - fields["url"] = url_val.replace(doi_val, doi_stripped) - - # Remove pages field that contains no digits (location strings, not page numbers) - pg = (fields.get("pages") or "").strip() - if pg and not re.search(r"\d", pg): - del fields["pages"] - changed = True - - # Fix Schloss Dagstuhl missing umlaut ("fur" → "f{\"u}r") - pub = (fields.get("publisher") or "").strip() - if _ZENTRUM_FUR in pub: - fields["publisher"] = pub.replace(_ZENTRUM_FUR, _ZENTRUM_FUER) - changed = True - - # Strip page numbers embedded in booktitle (e.g., ", 17: 1-17: 18" from LIPIcs) - bt_pages = (fields.get("booktitle") or "").strip() - if bt_pages: - bt_clean = _LIPICS_PAGES_STRIP_RE.sub("", bt_pages) - if bt_clean != bt_pages: - fields["booktitle"] = bt_clean - if not fields.get("pages"): - pages_match = _LIPICS_PAGES_EXTRACT_RE.search(bt_pages) - if pages_match: - fields["pages"] = pages_match.group(1).replace(" ", "") - changed = True - - # Strip duplicate "Proceedings of the" wrapper from booktitle - bt_dup = (fields.get("booktitle") or "").strip() - if bt_dup.startswith(_PROC_EXT_ABSTRACTS): - fields["booktitle"] = bt_dup.removeprefix(_PROC_OF_THE) - changed = True - - # Add URL from DOI when missing - doi = (fields.get("doi") or "").strip() - if doi and not fields.get("url"): - fields["url"] = f"https://doi.org/{doi}" - changed = True - - return changed def _entry_is_complete(entry: dict[str, Any]) -> bool: diff --git a/src/canonicalize.py b/src/canonicalize.py new file mode 100644 index 00000000..ee785e92 --- /dev/null +++ b/src/canonicalize.py @@ -0,0 +1,317 @@ +from __future__ import annotations + +import re +from enum import Enum +from typing import Any + +from src import merge_utils as mu +from src.config import ( + ABBREVIATED_VENUE_MAP, + ACM_JOURNAL_PROCEEDINGS, + INSTITUTIONAL_REPOSITORIES, + JOURNAL_ONLY_PREFIXES, + JOURNALS_NAMED_PROCEEDINGS, + PROCEEDINGS_SERIES_AS_JOURNAL, + PUBLISHER_CORRECTIONS, + REPOSITORY_AS_JOURNAL, + VENUE_CASE_CORRECTIONS, +) +from src.fixup.text import _apply_booktitle_fixups, _fix_title_text + + +class CanonicalStage(Enum): + LOAD_REPAIR = "load_repair" + COMPLETE_SKIP_FINALIZE = "complete_skip_finalize" + POST_MERGE = "post_merge" + POST_TIER2_VALIDATE = "post_tier2_validate" + POSTRUN_ORPHAN_REPAIR = "postrun_orphan_repair" + + +# Pre-compiled patterns for three-way title/venue fixups (used in _fixup_bib_entry, +# existing-file fixup, and Phase 4 post-merge — each pattern appears 3 times) +_TRAILING_DASH_RE = re.compile(r"[\s][-\u2013]\s*$") +_SUBTITLE_WRAPPER_RE = re.compile(r":\s*-([^-]+)-\s*$") +_SPIRE_STRIP_RE = re.compile(r"\s*:\s*SPIRE\b.*$") +_OSF_DOI_RE = re.compile(r"^10\.31(219|234)/") +_DOI_VERSION_RE = re.compile(r"_v\d+$") +_LIPICS_PAGES_STRIP_RE = re.compile(r",\s*\d+:\s*\d+-\d+:\s*\d+\s*$") +_LIPICS_PAGES_EXTRACT_RE = re.compile(r",\s*(\d+:\s*\d+-\d+:\s*\d+)\s*$") +_PREPRINT_MARKER_RE = re.compile(r"\s*\[preprint\]\s*$", re.IGNORECASE) +_GECCO_RE = re.compile(r"\bgenetic and evolutionary computation conference\b", re.IGNORECASE) +_URL_IN_VENUE_RE = re.compile(r"https?://") +_URL_IN_VENUE_STRIP_RE = re.compile(r",?\s*https?://\S+") +_BOOK_CHAPTER_DOI_RE = re.compile(r"\.ch\d+$") + +# Repeated string literals used in the three-way fix pattern +_GECCO_LOWER = "genetic and evolutionary computation conference" +_GECCO_PROPER = "Genetic and Evolutionary Computation Conference" +_ZENTRUM_FUR = "Zentrum fur Informatik" +_ZENTRUM_FUER = 'Zentrum f{\\"u}r Informatik' +_PROC_EXT_ABSTRACTS = "Proceedings of the Extended Abstracts" +_PROC_OF_THE = "Proceedings of the " + + +def _fixup_bib_entry(entry: dict[str, Any]) -> bool: + """Apply entry type and field corrections to a parsed BibTeX entry. + + Returns True if any changes were made. + Used by both the per-article fixup and the post-run orphan fixup. + """ + fields = entry.get("fields") or {} + changed = False + etype = entry.get("type", "") + + # Reclassify @article with Procedia/IFAC series → @inproceedings + if etype == "article" and fields.get("journal"): + jnl_lower = fields["journal"].strip().lower() + if any(jnl_lower.startswith(ps) for ps in PROCEEDINGS_SERIES_AS_JOURNAL): + fields["booktitle"] = fields.pop("journal") + entry["type"] = "inproceedings" + changed = True + + # Reclassify @inproceedings with PACM journal → @article + if entry.get("type") == "inproceedings" and fields.get("booktitle"): + bt_lower = fields["booktitle"].strip().lower() + if any(bt_lower.startswith(pj) or bt_lower == pj for pj in ACM_JOURNAL_PROCEEDINGS): + fields["journal"] = fields.pop("booktitle") + entry["type"] = "article" + changed = True + + # Reclassify @inproceedings with PNAS/PVLDB journal → @article + # Guard: skip if the booktitle extends the journal name with conference keywords + if entry.get("type") == "inproceedings" and fields.get("booktitle"): + bt_lower = fields["booktitle"].strip().lower() + jnp_match = next((j for j in JOURNALS_NAMED_PROCEEDINGS if bt_lower.startswith(j)), None) + if jnp_match: + suffix = bt_lower[len(jnp_match) :].lstrip(" /,") + if not any(kw in suffix for kw in ("conference", "workshop", "symposium")): + fields["journal"] = fields.pop("booktitle") + entry["type"] = "article" + changed = True + + # Reclassify @inproceedings with institutional repository → @phdthesis + if entry.get("type") == "inproceedings" and fields.get("booktitle"): + bt_lower = fields["booktitle"].strip().lower() + if any(ir in bt_lower for ir in INSTITUTIONAL_REPOSITORIES): + fields["school"] = fields.pop("booktitle") + entry["type"] = "phdthesis" + changed = True + + # Downgrade @inproceedings with repository as booktitle → @misc + if ( + entry.get("type") == "inproceedings" + and fields.get("booktitle") + and any(rj in fields["booktitle"].lower() for rj in REPOSITORY_AS_JOURNAL) + ): + entry["type"] = "misc" + fields.pop("booktitle", None) + changed = True + + # Downgrade @article with repository as journal → @misc + if ( + entry.get("type") == "article" + and fields.get("journal") + and any(rj in fields["journal"].lower() for rj in REPOSITORY_AS_JOURNAL) + ): + entry["type"] = "misc" + fields.pop("journal", None) + changed = True + + # Downgrade @inproceedings with "Preprint" as booktitle → @misc + if ( + entry.get("type") == "inproceedings" + and fields.get("booktitle") + and fields["booktitle"].strip().lower() == "preprint" + ): + entry["type"] = "misc" + fields.pop("booktitle", None) + changed = True + + # Reclassify @article with university name as journal → @phdthesis + if entry.get("type") == "article" and fields.get("journal"): + _jnl_lower = fields["journal"].strip().lower() + if "university" in _jnl_lower or "institut" in _jnl_lower: + fields["school"] = fields.pop("journal") + entry["type"] = "phdthesis" + changed = True + + # Reclassify @inproceedings with journal name as booktitle → @article + # (but NOT for PROCEEDINGS_SERIES_AS_JOURNAL which are genuinely proceedings) + if entry.get("type") == "inproceedings" and fields.get("booktitle"): + bt_lower = fields["booktitle"].strip().lower() + is_proc_series = any(bt_lower.startswith(ps) for ps in PROCEEDINGS_SERIES_AS_JOURNAL) + if not is_proc_series and any(bt_lower.startswith(jp) for jp in JOURNAL_ONLY_PREFIXES): + fields["journal"] = fields.pop("booktitle") + entry["type"] = "article" + changed = True + + # Reclassify @inproceedings with "Handbook" in booktitle → @incollection + if entry.get("type") == "inproceedings" and fields.get("booktitle") and "handbook" in fields["booktitle"].lower(): + entry["type"] = "incollection" + changed = True + + # Reclassify @article with book-chapter DOI pattern → @incollection + if ( + entry.get("type") == "article" + and fields.get("journal") + and fields.get("doi") + and _BOOK_CHAPTER_DOI_RE.search(fields["doi"].strip()) + ): + fields["booktitle"] = fields.pop("journal") + entry["type"] = "incollection" + changed = True + + # Reclassify @article with conference proceedings in journal → @inproceedings + # (but NOT for ACM PACM journals which are legitimately named "Proceedings of...") + if entry.get("type") == "article" and fields.get("journal"): + jnl = fields["journal"].strip() + jnl_lower = jnl.lower() + is_pacm = any(jnl_lower.startswith(pj) or jnl_lower == pj for pj in ACM_JOURNAL_PROCEEDINGS) + if mu._is_conference_journal(jnl) and not fields.get("booktitle") and not is_pacm: + fields["booktitle"] = fields.pop("journal") + entry["type"] = "inproceedings" + changed = True + + # Strip [preprint] marker from title + title = fields.get("title", "") + if isinstance(title, str) and _PREPRINT_MARKER_RE.search(title): + fields["title"] = _PREPRINT_MARKER_RE.sub("", title).strip() + changed = True + + # Fix fused compounds, colon-space, hyphen-space, and acronym case + title = fields.get("title", "") + if isinstance(title, str) and title: + fixed_title = _fix_title_text(title) + if fixed_title != title: + fields["title"] = fixed_title + changed = True + + # Apply booktitle cleanup patterns (verbose metadata strip, abbreviations, typos, spacing) + bt_fix = (fields.get("booktitle") or "").strip() + if bt_fix: + bt_fixed = _apply_booktitle_fixups(bt_fix) + if bt_fixed != bt_fix: + fields["booktitle"] = bt_fixed + changed = True + + # Strip URLs embedded in booktitle/journal + for url_field in ("booktitle", "journal"): + url_val = (fields.get(url_field) or "").strip() + if url_val and _URL_IN_VENUE_RE.search(url_val): + url_cleaned = _URL_IN_VENUE_STRIP_RE.sub("", url_val).strip().rstrip(",") + if url_cleaned and url_cleaned != url_val: + fields[url_field] = url_cleaned + changed = True + + # Apply publisher corrections + pub_journal = (fields.get("journal") or "").lower() + if pub_journal: + for jnl_key, correct_pub in PUBLISHER_CORRECTIONS.items(): + if jnl_key in pub_journal: + cur_pub = fields.get("publisher", "") + if cur_pub and cur_pub != correct_pub: + fields["publisher"] = correct_pub + changed = True + + # Strip publisher when it duplicates the journal/booktitle name + pub = (fields.get("publisher") or "").strip() + container = (fields.get("journal") or fields.get("booktitle") or "").strip() + if pub and container and pub.lower() == container.lower(): + del fields["publisher"] + changed = True + + # Expand abbreviated venue names in booktitle (e.g., "NIME 2021" → full name) + bt = (fields.get("booktitle") or "").strip() + if bt and bt.lower() in ABBREVIATED_VENUE_MAP: + _expanded_bt = ABBREVIATED_VENUE_MAP[bt.lower()] + if _expanded_bt != bt: + fields["booktitle"] = _expanded_bt + changed = True + + # Correct ALL-CAPS venue names to proper case + for _vcf in ("journal", "booktitle"): + _vc_val = (fields.get(_vcf) or "").strip() + if _vc_val and _vc_val in VENUE_CASE_CORRECTIONS: + _corrected_vc = VENUE_CASE_CORRECTIONS[_vc_val] + if _corrected_vc != _vc_val: + fields[_vcf] = _corrected_vc + changed = True + # Fix lowercase _GECCO_LOWER in GECCO booktitles + elif _vc_val and _GECCO_LOWER in _vc_val.lower(): + _vc_fixed = _GECCO_RE.sub(_GECCO_PROPER, _vc_val) + if _vc_fixed != _vc_val: + fields[_vcf] = _vc_fixed + changed = True + + # Strip trailing " -" or en-dash from booktitle/title (truncation artifact) + for _td_field in ("booktitle", "title"): + _td_val = (fields.get(_td_field) or "").strip() + if _td_val and _TRAILING_DASH_RE.search(_td_val): + fields[_td_field] = _TRAILING_DASH_RE.sub("", _td_val) + changed = True + + # Strip ": -...-" subtitle wrapper artifact from title + title = fields.get("title", "") + if isinstance(title, str) and ": -" in title: + cleaned = _SUBTITLE_WRAPPER_RE.sub(r": \1", title) + if cleaned != title: + fields["title"] = cleaned + changed = True + + # Strip SPIRE-style proceedings garbage suffix from booktitle + bt_spire = (fields.get("booktitle") or "").strip() + if bt_spire: + bt_cleaned = _SPIRE_STRIP_RE.sub("", bt_spire) + if bt_cleaned != bt_spire: + fields["booktitle"] = bt_cleaned + changed = True + + # Strip _v[N] version suffix from OSF/PsyArXiv DOIs + doi_val = (fields.get("doi") or "").strip() + if doi_val and _OSF_DOI_RE.match(doi_val): + doi_stripped = _DOI_VERSION_RE.sub("", doi_val) + if doi_stripped != doi_val: + fields["doi"] = doi_stripped + changed = True + # Also fix the URL if it contains the versioned DOI + url_val = (fields.get("url") or "").strip() + if url_val and doi_val in url_val: + fields["url"] = url_val.replace(doi_val, doi_stripped) + + # Remove pages field that contains no digits (location strings, not page numbers) + pg = (fields.get("pages") or "").strip() + if pg and not re.search(r"\d", pg): + del fields["pages"] + changed = True + + # Fix Schloss Dagstuhl missing umlaut ("fur" → "f{\"u}r") + pub = (fields.get("publisher") or "").strip() + if _ZENTRUM_FUR in pub: + fields["publisher"] = pub.replace(_ZENTRUM_FUR, _ZENTRUM_FUER) + changed = True + + # Strip page numbers embedded in booktitle (e.g., ", 17: 1-17: 18" from LIPIcs) + bt_pages = (fields.get("booktitle") or "").strip() + if bt_pages: + bt_clean = _LIPICS_PAGES_STRIP_RE.sub("", bt_pages) + if bt_clean != bt_pages: + fields["booktitle"] = bt_clean + if not fields.get("pages"): + pages_match = _LIPICS_PAGES_EXTRACT_RE.search(bt_pages) + if pages_match: + fields["pages"] = pages_match.group(1).replace(" ", "") + changed = True + + # Strip duplicate "Proceedings of the" wrapper from booktitle + bt_dup = (fields.get("booktitle") or "").strip() + if bt_dup.startswith(_PROC_EXT_ABSTRACTS): + fields["booktitle"] = bt_dup.removeprefix(_PROC_OF_THE) + changed = True + + # Add URL from DOI when missing + doi = (fields.get("doi") or "").strip() + if doi and not fields.get("url"): + fields["url"] = f"https://doi.org/{doi}" + changed = True + + return changed From 744f90e1a1c166a08397dab5c8226ddfe39f8c0b Mon Sep 17 00:00:00 2001 From: Gabriel Spadon Date: Wed, 1 Jul 2026 15:32:52 -0300 Subject: [PATCH 19/54] refactor: fold Site C post-merge fixup into canonicalize(POST_MERGE) Replace the ~400-line inline Phase-4 canonicalization block in main.py with a single canonicalize(merged, stage=POST_MERGE). Rules are now small shared _rule_* helpers referenced by ordered per-stage tuples (POST_MERGE and POSTRUN_ORPHAN_REPAIR share the same helper objects; no copy-paste), so the three-site duplication is dissolving into one single-sourced registry. _fixup_bib_entry is a thin wrapper. Byte-equivalent: full tests/test_regression.py (235) green + a corpus idempotency test over all 3565 .bib (strict data fixpoint). zenodo R16-before-R12 order preserved. --- main.py | 414 +------------------------ src/canonicalize.py | 614 ++++++++++++++++++++++++++++++------- tests/test_canonicalize.py | 149 +++++++++ 3 files changed, 662 insertions(+), 515 deletions(-) create mode 100644 tests/test_canonicalize.py diff --git a/main.py b/main.py index 46ba6fde..6b65f118 100644 --- a/main.py +++ b/main.py @@ -18,6 +18,7 @@ from src.cache import get_cache_hit_counts from src.canonicalize import ( _BOOK_CHAPTER_DOI_RE, + _BRACKET_J_RE, _DOI_VERSION_RE, _GECCO_LOWER, _GECCO_PROPER, @@ -33,9 +34,12 @@ _TRAILING_DASH_RE, _URL_IN_VENUE_RE, _URL_IN_VENUE_STRIP_RE, + _US_PATENT_RE, _ZENTRUM_FUER, _ZENTRUM_FUR, + CanonicalStage, _fixup_bib_entry, + canonicalize, ) from src.clients.helpers import extract_authors_from_article, get_article_year, strip_html_tags from src.clients.scholar import ( @@ -142,14 +146,10 @@ FORCE_ENRICH = "--force" in sys.argv[1:] -_BRACKET_J_RE = re.compile(r"\s*\[J\]\s*$") _ARXIV_ABS_RE = re.compile(r"arxiv\.org/abs/(\d{4}\.\d{4,5})", re.IGNORECASE) _FILENAME_YEAR_RE = re.compile(r"/[A-Za-z]+(\d{4})-") -# US Patent detection (used in existing-file fixup and Phase 4 post-merge) -_US_PATENT_RE = re.compile(r"(?i)^US\s+Patent") - def _entry_is_complete(entry: dict[str, Any]) -> bool: """Check if a BibTeX entry has all essential fields filled with non-placeholder values. @@ -1627,409 +1627,13 @@ def _add_doi(source: str, doi: str | None) -> None: logger.info("Applying trust policy and merging enrichments", category=LogCategory.SAVE, source=LogSource.SYSTEM) try: merged = mu.merge_with_policy(baseline_entry, enr_list) - - # Downgrade @article to @misc when journal is missing (by Phase 4 all - # enrichment is done, so a missing journal means no source could provide one) merged_fields = merged.get("fields") or {} - if merged.get("type") == "article" and not merged_fields.get("journal"): - logger.debug( - "TYPE_CORRECT | article_no_journal->misc", - category=LogCategory.AUDIT, - ) - merged["type"] = "misc" - - # Downgrade @inproceedings without booktitle -> @misc (same rationale: - # by Phase 4 enrichment is complete; @inproceedings without booktitle - # is invalid BibTeX) - if merged.get("type") == "inproceedings" and not merged_fields.get("booktitle"): - logger.debug( - "TYPE_CORRECT | inproceedings_no_booktitle->misc", - category=LogCategory.AUDIT, - ) - merged["type"] = "misc" - - # Downgrade @article with preprint server as journal -> @misc - # Use substring match to catch suffixed forms like "arXiv (Cornell University)" - if merged.get("type") == "article": - j_lower = (merged_fields.get("journal") or "").lower().strip() - if j_lower and any(ps == j_lower or ps in j_lower for ps in PREPRINT_SERVERS): - logger.debug( - f"TYPE_CORRECT | article_preprint_journal->misc | journal={j_lower}", - category=LogCategory.AUDIT, - ) - merged["type"] = "misc" - merged_fields["howpublished"] = merged_fields.pop("journal") - - # Strip trailing ellipsis from truncated venue/title fields - for _ell_field_p4 in ("journal", "booktitle", "title"): - _ell_val_p4 = merged_fields.get(_ell_field_p4) or "" - if _ell_val_p4.rstrip().endswith(("...", "\u2026")): - _ell_clean_p4 = _strip_ellipsis(_ell_val_p4) - if _ell_clean_p4 != _ell_val_p4: - logger.debug( - f"TYPE_CORRECT | ellipsis_stripped | {_ell_field_p4}={_ell_val_p4[:60]}", - category=LogCategory.AUDIT, - ) - merged_fields[_ell_field_p4] = _ell_clean_p4 - - # Reclassify @article with conference proceedings as journal -> @inproceedings - # (but NOT for ACM PACM journals which are legitimately named "Proceedings of...") - if merged.get("type") == "article" and merged_fields.get("journal"): - _p4_jnl = merged_fields["journal"].strip() - _p4_jnl_lower = _p4_jnl.lower() - _is_pacm_p4 = any(_p4_jnl_lower.startswith(pj) or _p4_jnl_lower == pj for pj in ACM_JOURNAL_PROCEEDINGS) - if mu._is_conference_journal(_p4_jnl) and not merged_fields.get("booktitle") and not _is_pacm_p4: - logger.debug( - f"TYPE_CORRECT | article_conference_journal->inproceedings | journal={_p4_jnl[:60]}", - category=LogCategory.AUDIT, - ) - merged["type"] = "inproceedings" - merged_fields["booktitle"] = merged_fields.pop("journal") - - # Reclassify @article with Procedia/IFAC series journal → @inproceedings - if merged.get("type") == "article" and merged_fields.get("journal"): - _proc_jnl_lower = merged_fields["journal"].strip().lower() - if any(_proc_jnl_lower.startswith(ps) for ps in PROCEEDINGS_SERIES_AS_JOURNAL): - logger.debug( - f"TYPE_CORRECT | article_procedia->inproceedings | journal={merged_fields['journal'][:60]}", - category=LogCategory.AUDIT, - ) - merged["type"] = "inproceedings" - merged_fields["booktitle"] = merged_fields.pop("journal") - - # Reclassify @inproceedings with PACM journal as booktitle → @article - if merged.get("type") == "inproceedings" and merged_fields.get("booktitle"): - _pacm_bt_lower = merged_fields["booktitle"].strip().lower() - if any(_pacm_bt_lower.startswith(pj) or _pacm_bt_lower == pj for pj in ACM_JOURNAL_PROCEEDINGS): - logger.debug( - f"TYPE_CORRECT | inproceedings_pacm->article | booktitle={merged_fields['booktitle'][:60]}", - category=LogCategory.AUDIT, - ) - merged["type"] = "article" - merged_fields["journal"] = merged_fields.pop("booktitle") - - # Reclassify @inproceedings with PNAS/PVLDB journal as booktitle → @article - # Guard: skip if the booktitle extends the journal name with conference keywords - if merged.get("type") == "inproceedings" and merged_fields.get("booktitle"): - _jnp_bt_lower = merged_fields["booktitle"].strip().lower() - _jnp_match_p4 = next((j for j in JOURNALS_NAMED_PROCEEDINGS if _jnp_bt_lower.startswith(j)), None) - if _jnp_match_p4: - _jnp_suffix_p4 = _jnp_bt_lower[len(_jnp_match_p4) :].lstrip(" /,") - if not any(kw in _jnp_suffix_p4 for kw in ("conference", "workshop", "symposium")): - logger.debug( - f"TYPE_CORRECT | inproceedings_journal_proceedings->article | booktitle={_jnp_bt_lower[:60]}", - category=LogCategory.AUDIT, - ) - merged["type"] = "article" - merged_fields["journal"] = merged_fields.pop("booktitle") - - # Reclassify @inproceedings with institutional repository → @phdthesis - if merged.get("type") == "inproceedings" and merged_fields.get("booktitle"): - _inst_bt_lower = merged_fields["booktitle"].strip().lower() - if any(ir in _inst_bt_lower for ir in INSTITUTIONAL_REPOSITORIES): - logger.debug( - f"TYPE_CORRECT | inproceedings_repository->phdthesis | booktitle={merged_fields['booktitle'][:60]}", - category=LogCategory.AUDIT, - ) - merged["type"] = "phdthesis" - merged_fields["school"] = merged_fields.pop("booktitle") - - # Reclassify @article with patent number as journal → @misc - if merged.get("type") == "article" and merged_fields.get("journal"): - _patent_jnl = merged_fields["journal"].strip() - if _US_PATENT_RE.match(_patent_jnl): - logger.debug( - f"TYPE_CORRECT | article_patent->misc | journal={_patent_jnl[:60]}", - category=LogCategory.AUDIT, - ) - merged["type"] = "misc" - merged_fields["note"] = _patent_jnl - merged_fields.pop("journal", None) - - # Reclassify @article with "Unpublished" journal → @misc - if ( - merged.get("type") == "article" - and merged_fields.get("journal") - and merged_fields["journal"].strip().lower() == "unpublished" - ): - logger.debug("TYPE_CORRECT | article_unpublished->misc", category=LogCategory.AUDIT) - merged["type"] = "misc" - merged_fields.pop("journal", None) - - # Strip URL fragments from booktitle (e.g., "proceedings.mlr.press") - if merged.get("type") == "inproceedings" and merged_fields.get("booktitle"): - _bt_val = merged_fields["booktitle"].strip() - if re.match(r"^https?://|^[\w.-]+\.(com|org|net|io|press)\b", _bt_val, re.IGNORECASE): - logger.debug( - f"TYPE_CORRECT | inproceedings_url_booktitle->misc | booktitle={_bt_val[:60]}", - category=LogCategory.AUDIT, - ) - merged["type"] = "misc" - merged_fields.pop("booktitle", None) - - # Downgrade @inproceedings with "Preprint" as booktitle → @misc - if ( - merged.get("type") == "inproceedings" - and merged_fields.get("booktitle") - and merged_fields["booktitle"].strip().lower() == "preprint" - ): - logger.debug("TYPE_CORRECT | inproceedings_preprint->misc", category=LogCategory.AUDIT) - merged["type"] = "misc" - merged_fields.pop("booktitle", None) - - # Reclassify @inproceedings with journal name as booktitle → @article - # (but NOT for PROCEEDINGS_SERIES_AS_JOURNAL which are genuinely proceedings) - if merged.get("type") == "inproceedings" and merged_fields.get("booktitle"): - _jp_bt_lower = merged_fields["booktitle"].strip().lower() - _is_proc_series = any(_jp_bt_lower.startswith(ps) for ps in PROCEEDINGS_SERIES_AS_JOURNAL) - if not _is_proc_series and any(_jp_bt_lower.startswith(jp) for jp in JOURNAL_ONLY_PREFIXES): - logger.debug( - f"TYPE_CORRECT | inproceedings_journal_booktitle->article | " - f"booktitle={merged_fields['booktitle'][:60]}", - category=LogCategory.AUDIT, - ) - merged["type"] = "article" - merged_fields["journal"] = merged_fields.pop("booktitle") - - # Reclassify @inproceedings with "Handbook" in booktitle → @incollection - if ( - merged.get("type") == "inproceedings" - and merged_fields.get("booktitle") - and "handbook" in merged_fields["booktitle"].lower() - ): - logger.debug( - f"TYPE_CORRECT | inproceedings_handbook->incollection | booktitle={merged_fields['booktitle'][:60]}", - category=LogCategory.AUDIT, - ) - merged["type"] = "incollection" - - # Reclassify @article with book-chapter DOI pattern → @incollection - _p4_doi_ch = (merged_fields.get("doi") or "").strip() - if ( - merged.get("type") == "article" - and merged_fields.get("journal") - and _p4_doi_ch - and _BOOK_CHAPTER_DOI_RE.search(_p4_doi_ch) - ): - logger.debug( - f"TYPE_CORRECT | article_book_chapter->incollection | doi={_p4_doi_ch}", - category=LogCategory.AUDIT, - ) - merged_fields["booktitle"] = merged_fields.pop("journal") - merged["type"] = "incollection" - # Downgrade @article with repository/portal as journal → @misc - if ( - merged.get("type") == "article" - and merged_fields.get("journal") - and any(rj in merged_fields["journal"].lower() for rj in REPOSITORY_AS_JOURNAL) - ): - logger.debug( - f"TYPE_CORRECT | article_repository->misc | journal={merged_fields['journal'][:60]}", - category=LogCategory.AUDIT, - ) - merged["type"] = "misc" - merged_fields.pop("journal", None) - - # Downgrade @inproceedings with repository as booktitle → @misc - if ( - merged.get("type") == "inproceedings" - and merged_fields.get("booktitle") - and any(rj in merged_fields["booktitle"].lower() for rj in REPOSITORY_AS_JOURNAL) - ): - logger.debug( - f"TYPE_CORRECT | inproceedings_repository->misc | booktitle={merged_fields['booktitle'][:60]}", - category=LogCategory.AUDIT, - ) - merged["type"] = "misc" - merged_fields.pop("booktitle", None) - - # Reclassify @article with university name as journal → @phdthesis - # (Crossref sometimes returns thesis DOIs with the university as journal) - if merged.get("type") == "article" and merged_fields.get("journal"): - _jnl_lower = merged_fields["journal"].lower() - if "university" in _jnl_lower or "institut" in _jnl_lower: - logger.debug( - f"TYPE_CORRECT | article_thesis->phdthesis | journal={merged_fields['journal'][:60]}", - category=LogCategory.AUDIT, - ) - merged["type"] = "phdthesis" - merged_fields["school"] = merged_fields.pop("journal") - - # Handle @article with preprint DOI - if merged.get("type") == "article": - _merged_doi = (merged_fields.get("doi") or "").strip() - if _merged_doi and idu.is_secondary_doi(_merged_doi): - venue = merged_fields.get("journal", "") - # If article has real journal+volume/pages, keep as article but strip preprint DOI - if venue and (merged_fields.get("volume") or merged_fields.get("pages")): - logger.debug( - f"TYPE_CORRECT | remove_preprint_doi_from_article | doi={_merged_doi} | journal={venue[:40]}", - category=LogCategory.AUDIT, - ) - merged_fields.pop("doi", None) - merged_fields.pop("url", None) - else: - logger.debug( - f"TYPE_CORRECT | article_preprint_doi->misc | doi={_merged_doi} | venue={venue}", - category=LogCategory.AUDIT, - ) - merged["type"] = "misc" - if venue: - merged_fields["howpublished"] = merged_fields.pop("journal") - - # Backfill howpublished for @misc entries with preprint DOI or arXiv eprint - if merged.get("type") == "misc" and not merged_fields.get("howpublished"): - _misc_doi = (merged_fields.get("doi") or "").strip() - _inferred_hp = mu.infer_howpublished_from_doi(_misc_doi) if _misc_doi else None - if _inferred_hp: - merged_fields["howpublished"] = _inferred_hp - elif (merged_fields.get("archiveprefix") or "").lower() == "arxiv": - merged_fields["howpublished"] = "arXiv" - - # Fix ALL-CAPS titles and strip [J]/[preprint] artifacts from enrichment sources - _p4_title = merged_fields.get("title", "") - if isinstance(_p4_title, str) and _p4_title: - _p4_fixed = trim_title_default(_p4_title) - # Strip [J] bracket artifact (citation format leak from Scholar) - _p4_fixed = _BRACKET_J_RE.sub("", _p4_fixed).strip() - # Strip [preprint] marker from title text - _p4_fixed = _PREPRINT_MARKER_RE.sub("", _p4_fixed).strip() - # Fix fused compounds, colon-space, hyphen-space, and acronym case - _p4_fixed = _fix_title_text(_p4_fixed) - # Strip trailing dash/en-dash (truncation artifact) - _p4_fixed = _TRAILING_DASH_RE.sub("", _p4_fixed) - # Strip ": -...-" subtitle wrapper artifact - _p4_fixed = _SUBTITLE_WRAPPER_RE.sub(r": \1", _p4_fixed) - if _p4_fixed != _p4_title: - merged_fields["title"] = _p4_fixed - - # Apply booktitle cleanup patterns (verbose metadata strip, abbreviations, typos, spacing) - _p4_bt_fix = (merged_fields.get("booktitle") or "").strip() - if _p4_bt_fix: - _p4_bt_fixed = _apply_booktitle_fixups(_p4_bt_fix) - if _p4_bt_fixed != _p4_bt_fix: - merged_fields["booktitle"] = _p4_bt_fixed - - # Expand abbreviated venue names in booktitle - _p4_bt_abbr = (merged_fields.get("booktitle") or "").strip() - if _p4_bt_abbr and _p4_bt_abbr.lower() in ABBREVIATED_VENUE_MAP: - _p4_expanded = ABBREVIATED_VENUE_MAP[_p4_bt_abbr.lower()] - if _p4_expanded != _p4_bt_abbr: - merged_fields["booktitle"] = _p4_expanded - - # Correct ALL-CAPS venue names to proper case - for _p4_vcf in ("journal", "booktitle"): - _p4_vc_val = (merged_fields.get(_p4_vcf) or "").strip() - if _p4_vc_val and _p4_vc_val in VENUE_CASE_CORRECTIONS: - merged_fields[_p4_vcf] = VENUE_CASE_CORRECTIONS[_p4_vc_val] - elif _p4_vc_val and _GECCO_LOWER in _p4_vc_val.lower(): - _p4_vc_fixed = _GECCO_RE.sub(_GECCO_PROPER, _p4_vc_val) - if _p4_vc_fixed != _p4_vc_val: - merged_fields[_p4_vcf] = _p4_vc_fixed - - # Strip publisher when it duplicates the journal/booktitle name - _p4_pub = (merged_fields.get("publisher") or "").strip() - _p4_container = (merged_fields.get("journal") or merged_fields.get("booktitle") or "").strip() - if _p4_pub and _p4_container and _p4_pub.lower() == _p4_container.lower(): - del merged_fields["publisher"] - - # Strip SPIRE-style proceedings garbage suffix from booktitle - _p4_bt_spire = (merged_fields.get("booktitle") or "").strip() - if _p4_bt_spire: - _p4_bt_cleaned = _SPIRE_STRIP_RE.sub("", _p4_bt_spire) - if _p4_bt_cleaned != _p4_bt_spire: - merged_fields["booktitle"] = _p4_bt_cleaned - - # Strip _v[N] version suffix from OSF/PsyArXiv DOIs - _p4_doi_val = (merged_fields.get("doi") or "").strip() - if _p4_doi_val and _OSF_DOI_RE.match(_p4_doi_val): - _p4_doi_stripped = _DOI_VERSION_RE.sub("", _p4_doi_val) - if _p4_doi_stripped != _p4_doi_val: - merged_fields["doi"] = _p4_doi_stripped - _p4_url_val = (merged_fields.get("url") or "").strip() - if _p4_url_val and _p4_doi_val in _p4_url_val: - merged_fields["url"] = _p4_url_val.replace(_p4_doi_val, _p4_doi_stripped) - - # Fix Schloss Dagstuhl missing umlaut - _p4_pub = (merged_fields.get("publisher") or "").strip() - if _ZENTRUM_FUR in _p4_pub: - merged_fields["publisher"] = _p4_pub.replace(_ZENTRUM_FUR, _ZENTRUM_FUER) - - # Strip page numbers embedded in booktitle (LIPIcs style) - _p4_bt_pg = (merged_fields.get("booktitle") or "").strip() - if _p4_bt_pg: - _p4_bt_pg_clean = _LIPICS_PAGES_STRIP_RE.sub("", _p4_bt_pg) - if _p4_bt_pg_clean != _p4_bt_pg: - merged_fields["booktitle"] = _p4_bt_pg_clean - if not merged_fields.get("pages"): - _p4_pg_m = _LIPICS_PAGES_EXTRACT_RE.search(_p4_bt_pg) - if _p4_pg_m: - merged_fields["pages"] = _p4_pg_m.group(1).replace(" ", "") - - # Strip duplicate "Proceedings of the" wrapper - _p4_bt_dup = (merged_fields.get("booktitle") or "").strip() - if _p4_bt_dup.startswith(_PROC_EXT_ABSTRACTS): - merged_fields["booktitle"] = _p4_bt_dup.removeprefix(_PROC_OF_THE) - - # Strip URLs embedded in booktitle/journal (keep text before URL) - for _url_field in ("booktitle", "journal"): - _url_val = (merged_fields.get(_url_field) or "").strip() - if _url_val and _URL_IN_VENUE_RE.search(_url_val): - _url_cleaned = _URL_IN_VENUE_STRIP_RE.sub("", _url_val).strip().rstrip(",") - if _url_cleaned and _url_cleaned != _url_val: - merged_fields[_url_field] = _url_cleaned - - # Apply publisher corrections (e.g. SAGE → Mary Ann Liebert for JCB) - _pub_journal = (merged_fields.get("journal") or "").lower() - if _pub_journal: - for _pub_jnl_key, _pub_correct in PUBLISHER_CORRECTIONS.items(): - if _pub_jnl_key in _pub_journal: - _cur_pub = merged_fields.get("publisher", "") - if _cur_pub and _cur_pub != _pub_correct: - merged_fields["publisher"] = _pub_correct - - # Fix author casing + capital "And" separators from API sources - _p4_auth = merged_fields.get("author", "") - if isinstance(_p4_auth, str) and _p4_auth: - _p4_auth_fixed, _ = mu._fix_author_casing(_p4_auth) - if _p4_auth_fixed != _p4_auth: - merged_fields["author"] = _p4_auth_fixed - - # Normalize howpublished casing after all journal→howpublished moves - mu._normalize_howpublished(merged_fields) - - # Upgrade @misc with conference/workshop howpublished → @inproceedings - # When howpublished is a venue name (not a preprint server), the entry - # is a conference/workshop paper that should be @inproceedings. - if merged.get("type") == "misc" and merged_fields.get("howpublished"): - _hp_val = (merged_fields.get("howpublished") or "").strip() - _hp_lower = _hp_val.lower() - _is_preprint_hp = any(ps == _hp_lower or ps in _hp_lower for ps in PREPRINT_SERVERS) or _hp_lower in ( - "arxiv", - "biorxiv", - "medrxiv", - "chemrxiv", - "techrxiv", - "ssrn", - "ssrn electronic journal", - "research square", - "preprints.org", - "authorea", - "osf preprints", - "openrxiv", - "psyarxiv", - "socarxiv", - "edarxiv", - ) - _is_repository_hp = any(rj in _hp_lower for rj in REPOSITORY_AS_JOURNAL) - if not _is_preprint_hp and not _is_repository_hp and _hp_val: - logger.debug( - f"TYPE_CORRECT | misc_workshop->inproceedings | howpublished={_hp_val}", - category=LogCategory.AUDIT, - ) - merged["type"] = "inproceedings" - merged_fields["booktitle"] = merged_fields.pop("howpublished") + # Phase-4 post-merge canonicalization: entry-type reclassification and + # text/venue normalization, single-sourced in src/canonicalize.py. + # POST_MERGE is the terminal stage; absence rules (article/inproceedings + # missing venue, preprint-DOI downgrade) fire here after enrichment. + canonicalize(merged, stage=CanonicalStage.POST_MERGE) # Annotate bare stubs: no enrichers, no DOI, no venue is_bare_stub = ( diff --git a/src/canonicalize.py b/src/canonicalize.py index ee785e92..b3c3619c 100644 --- a/src/canonicalize.py +++ b/src/canonicalize.py @@ -4,6 +4,7 @@ from enum import Enum from typing import Any +from src import id_utils as idu from src import merge_utils as mu from src.config import ( ABBREVIATED_VENUE_MAP, @@ -11,12 +12,15 @@ INSTITUTIONAL_REPOSITORIES, JOURNAL_ONLY_PREFIXES, JOURNALS_NAMED_PROCEEDINGS, + PREPRINT_SERVERS, PROCEEDINGS_SERIES_AS_JOURNAL, PUBLISHER_CORRECTIONS, REPOSITORY_AS_JOURNAL, VENUE_CASE_CORRECTIONS, ) from src.fixup.text import _apply_booktitle_fixups, _fix_title_text +from src.publication_parser import _strip_ellipsis +from src.text_utils import trim_title_default class CanonicalStage(Enum): @@ -27,8 +31,10 @@ class CanonicalStage(Enum): POSTRUN_ORPHAN_REPAIR = "postrun_orphan_repair" -# Pre-compiled patterns for three-way title/venue fixups (used in _fixup_bib_entry, -# existing-file fixup, and Phase 4 post-merge — each pattern appears 3 times) +# Pre-compiled patterns for the multi-site title/venue fixups. These rule bodies +# are single-sourced as helper functions below and dispatched per CanonicalStage +# by canonicalize(); _fixup_bib_entry (Site A / orphan repair) and the Phase-4 +# post-merge block (Site C) share the SAME helper bodies. _TRAILING_DASH_RE = re.compile(r"[\s][-\u2013]\s*$") _SUBTITLE_WRAPPER_RE = re.compile(r":\s*-([^-]+)-\s*$") _SPIRE_STRIP_RE = re.compile(r"\s*:\s*SPIRE\b.*$") @@ -41,8 +47,11 @@ class CanonicalStage(Enum): _URL_IN_VENUE_RE = re.compile(r"https?://") _URL_IN_VENUE_STRIP_RE = re.compile(r",?\s*https?://\S+") _BOOK_CHAPTER_DOI_RE = re.compile(r"\.ch\d+$") +_US_PATENT_RE = re.compile(r"(?i)^US\s+Patent") +_BRACKET_J_RE = re.compile(r"\s*\[J\]\s*$") +_URL_BOOKTITLE_RE = re.compile(r"^https?://|^[\w.-]+\.(com|org|net|io|press)\b", re.IGNORECASE) -# Repeated string literals used in the three-way fix pattern +# Repeated string literals used in the shared fixups _GECCO_LOWER = "genetic and evolutionary computation conference" _GECCO_PROPER = "Genetic and Evolutionary Computation Conference" _ZENTRUM_FUR = "Zentrum fur Informatik" @@ -50,35 +59,56 @@ class CanonicalStage(Enum): _PROC_EXT_ABSTRACTS = "Proceedings of the Extended Abstracts" _PROC_OF_THE = "Proceedings of the " +# Preprint howpublished names checked by the misc->inproceedings upgrade (R20). +_R20_PREPRINT_HOWPUBLISHED = ( + "arxiv", + "biorxiv", + "medrxiv", + "chemrxiv", + "techrxiv", + "ssrn", + "ssrn electronic journal", + "research square", + "preprints.org", + "authorea", + "osf preprints", + "openrxiv", + "psyarxiv", + "socarxiv", + "edarxiv", +) -def _fixup_bib_entry(entry: dict[str, Any]) -> bool: - """Apply entry type and field corrections to a parsed BibTeX entry. - - Returns True if any changes were made. - Used by both the per-article fixup and the post-run orphan fixup. - """ - fields = entry.get("fields") or {} - changed = False - etype = entry.get("type", "") - # Reclassify @article with Procedia/IFAC series → @inproceedings - if etype == "article" and fields.get("journal"): +# --------------------------------------------------------------------------- +# Shared reclassification rules (used by BOTH Site A and Site C) +# --------------------------------------------------------------------------- +def _rule_procedia_to_inproceedings(entry: dict[str, Any], fields: dict[str, Any]) -> bool: + """@article with a Procedia/IFAC proceedings-series journal -> @inproceedings.""" + if entry.get("type") == "article" and fields.get("journal"): jnl_lower = fields["journal"].strip().lower() if any(jnl_lower.startswith(ps) for ps in PROCEEDINGS_SERIES_AS_JOURNAL): fields["booktitle"] = fields.pop("journal") entry["type"] = "inproceedings" - changed = True + return True + return False + - # Reclassify @inproceedings with PACM journal → @article +def _rule_pacm_booktitle_to_article(entry: dict[str, Any], fields: dict[str, Any]) -> bool: + """@inproceedings with a PACM journal as booktitle -> @article.""" if entry.get("type") == "inproceedings" and fields.get("booktitle"): bt_lower = fields["booktitle"].strip().lower() if any(bt_lower.startswith(pj) or bt_lower == pj for pj in ACM_JOURNAL_PROCEEDINGS): fields["journal"] = fields.pop("booktitle") entry["type"] = "article" - changed = True + return True + return False + + +def _rule_named_proceedings_to_article(entry: dict[str, Any], fields: dict[str, Any]) -> bool: + """@inproceedings with a PNAS/PVLDB-style journal as booktitle -> @article. - # Reclassify @inproceedings with PNAS/PVLDB journal → @article - # Guard: skip if the booktitle extends the journal name with conference keywords + Guard: skip when the booktitle extends the journal name with conference keywords. + """ if entry.get("type") == "inproceedings" and fields.get("booktitle"): bt_lower = fields["booktitle"].strip().lower() jnp_match = next((j for j in JOURNALS_NAMED_PROCEEDINGS if bt_lower.startswith(j)), None) @@ -87,17 +117,23 @@ def _fixup_bib_entry(entry: dict[str, Any]) -> bool: if not any(kw in suffix for kw in ("conference", "workshop", "symposium")): fields["journal"] = fields.pop("booktitle") entry["type"] = "article" - changed = True + return True + return False - # Reclassify @inproceedings with institutional repository → @phdthesis + +def _rule_institutional_repo_to_phdthesis(entry: dict[str, Any], fields: dict[str, Any]) -> bool: + """@inproceedings with an institutional repository as booktitle -> @phdthesis.""" if entry.get("type") == "inproceedings" and fields.get("booktitle"): bt_lower = fields["booktitle"].strip().lower() if any(ir in bt_lower for ir in INSTITUTIONAL_REPOSITORIES): fields["school"] = fields.pop("booktitle") entry["type"] = "phdthesis" - changed = True + return True + return False - # Downgrade @inproceedings with repository as booktitle → @misc + +def _rule_repo_booktitle_to_misc(entry: dict[str, Any], fields: dict[str, Any]) -> bool: + """@inproceedings with a repository/portal as booktitle -> @misc.""" if ( entry.get("type") == "inproceedings" and fields.get("booktitle") @@ -105,9 +141,12 @@ def _fixup_bib_entry(entry: dict[str, Any]) -> bool: ): entry["type"] = "misc" fields.pop("booktitle", None) - changed = True + return True + return False + - # Downgrade @article with repository as journal → @misc +def _rule_repo_journal_to_misc(entry: dict[str, Any], fields: dict[str, Any]) -> bool: + """@article with a repository/portal as journal -> @misc.""" if ( entry.get("type") == "article" and fields.get("journal") @@ -115,9 +154,12 @@ def _fixup_bib_entry(entry: dict[str, Any]) -> bool: ): entry["type"] = "misc" fields.pop("journal", None) - changed = True + return True + return False - # Downgrade @inproceedings with "Preprint" as booktitle → @misc + +def _rule_preprint_booktitle_to_misc(entry: dict[str, Any], fields: dict[str, Any]) -> bool: + """@inproceedings with "Preprint" as booktitle -> @misc.""" if ( entry.get("type") == "inproceedings" and fields.get("booktitle") @@ -125,32 +167,46 @@ def _fixup_bib_entry(entry: dict[str, Any]) -> bool: ): entry["type"] = "misc" fields.pop("booktitle", None) - changed = True + return True + return False + - # Reclassify @article with university name as journal → @phdthesis +def _rule_university_to_phdthesis(entry: dict[str, Any], fields: dict[str, Any]) -> bool: + """@article with a university/institute name as journal -> @phdthesis.""" if entry.get("type") == "article" and fields.get("journal"): - _jnl_lower = fields["journal"].strip().lower() - if "university" in _jnl_lower or "institut" in _jnl_lower: + jnl_lower = fields["journal"].strip().lower() + if "university" in jnl_lower or "institut" in jnl_lower: fields["school"] = fields.pop("journal") entry["type"] = "phdthesis" - changed = True + return True + return False + - # Reclassify @inproceedings with journal name as booktitle → @article - # (but NOT for PROCEEDINGS_SERIES_AS_JOURNAL which are genuinely proceedings) +def _rule_journal_prefix_to_article(entry: dict[str, Any], fields: dict[str, Any]) -> bool: + """@inproceedings with a journal name as booktitle -> @article. + + But NOT for PROCEEDINGS_SERIES_AS_JOURNAL which are genuinely proceedings. + """ if entry.get("type") == "inproceedings" and fields.get("booktitle"): bt_lower = fields["booktitle"].strip().lower() is_proc_series = any(bt_lower.startswith(ps) for ps in PROCEEDINGS_SERIES_AS_JOURNAL) if not is_proc_series and any(bt_lower.startswith(jp) for jp in JOURNAL_ONLY_PREFIXES): fields["journal"] = fields.pop("booktitle") entry["type"] = "article" - changed = True + return True + return False + - # Reclassify @inproceedings with "Handbook" in booktitle → @incollection +def _rule_handbook_to_incollection(entry: dict[str, Any], fields: dict[str, Any]) -> bool: + """@inproceedings with "Handbook" in booktitle -> @incollection.""" if entry.get("type") == "inproceedings" and fields.get("booktitle") and "handbook" in fields["booktitle"].lower(): entry["type"] = "incollection" - changed = True + return True + return False - # Reclassify @article with book-chapter DOI pattern → @incollection + +def _rule_book_chapter_doi_to_incollection(entry: dict[str, Any], fields: dict[str, Any]) -> bool: + """@article with a book-chapter DOI pattern (.chNN) -> @incollection.""" if ( entry.get("type") == "article" and fields.get("journal") @@ -159,10 +215,15 @@ def _fixup_bib_entry(entry: dict[str, Any]) -> bool: ): fields["booktitle"] = fields.pop("journal") entry["type"] = "incollection" - changed = True + return True + return False + + +def _rule_conference_journal_to_inproceedings(entry: dict[str, Any], fields: dict[str, Any]) -> bool: + """@article with conference proceedings in journal -> @inproceedings. - # Reclassify @article with conference proceedings in journal → @inproceedings - # (but NOT for ACM PACM journals which are legitimately named "Proceedings of...") + But NOT for ACM PACM journals which are legitimately named "Proceedings of...". + """ if entry.get("type") == "article" and fields.get("journal"): jnl = fields["journal"].strip() jnl_lower = jnl.lower() @@ -170,31 +231,27 @@ def _fixup_bib_entry(entry: dict[str, Any]) -> bool: if mu._is_conference_journal(jnl) and not fields.get("booktitle") and not is_pacm: fields["booktitle"] = fields.pop("journal") entry["type"] = "inproceedings" - changed = True - - # Strip [preprint] marker from title - title = fields.get("title", "") - if isinstance(title, str) and _PREPRINT_MARKER_RE.search(title): - fields["title"] = _PREPRINT_MARKER_RE.sub("", title).strip() - changed = True + return True + return False - # Fix fused compounds, colon-space, hyphen-space, and acronym case - title = fields.get("title", "") - if isinstance(title, str) and title: - fixed_title = _fix_title_text(title) - if fixed_title != title: - fields["title"] = fixed_title - changed = True - # Apply booktitle cleanup patterns (verbose metadata strip, abbreviations, typos, spacing) +# --------------------------------------------------------------------------- +# Shared text / venue normalization rules (used by BOTH Site A and Site C) +# --------------------------------------------------------------------------- +def _rule_booktitle_fixups(entry: dict[str, Any], fields: dict[str, Any]) -> bool: + """Apply booktitle cleanup patterns (verbose metadata strip, typos, spacing).""" bt_fix = (fields.get("booktitle") or "").strip() if bt_fix: bt_fixed = _apply_booktitle_fixups(bt_fix) if bt_fixed != bt_fix: fields["booktitle"] = bt_fixed - changed = True + return True + return False + - # Strip URLs embedded in booktitle/journal +def _rule_strip_urls_in_venue(entry: dict[str, Any], fields: dict[str, Any]) -> bool: + """Strip URLs embedded in booktitle/journal (keep text before URL).""" + changed = False for url_field in ("booktitle", "journal"): url_val = (fields.get(url_field) or "").strip() if url_val and _URL_IN_VENUE_RE.search(url_val): @@ -202,8 +259,12 @@ def _fixup_bib_entry(entry: dict[str, Any]) -> bool: if url_cleaned and url_cleaned != url_val: fields[url_field] = url_cleaned changed = True + return changed - # Apply publisher corrections + +def _rule_publisher_corrections(entry: dict[str, Any], fields: dict[str, Any]) -> bool: + """Apply publisher corrections keyed on journal substring.""" + changed = False pub_journal = (fields.get("journal") or "").lower() if pub_journal: for jnl_key, correct_pub in PUBLISHER_CORRECTIONS.items(): @@ -212,85 +273,84 @@ def _fixup_bib_entry(entry: dict[str, Any]) -> bool: if cur_pub and cur_pub != correct_pub: fields["publisher"] = correct_pub changed = True + return changed - # Strip publisher when it duplicates the journal/booktitle name + +def _rule_strip_publisher_duplicate(entry: dict[str, Any], fields: dict[str, Any]) -> bool: + """Strip publisher when it duplicates the journal/booktitle name.""" pub = (fields.get("publisher") or "").strip() container = (fields.get("journal") or fields.get("booktitle") or "").strip() if pub and container and pub.lower() == container.lower(): del fields["publisher"] - changed = True + return True + return False + - # Expand abbreviated venue names in booktitle (e.g., "NIME 2021" → full name) +def _rule_expand_abbreviated_venue(entry: dict[str, Any], fields: dict[str, Any]) -> bool: + """Expand abbreviated venue names in booktitle (e.g., "NIME 2021" -> full name).""" bt = (fields.get("booktitle") or "").strip() if bt and bt.lower() in ABBREVIATED_VENUE_MAP: - _expanded_bt = ABBREVIATED_VENUE_MAP[bt.lower()] - if _expanded_bt != bt: - fields["booktitle"] = _expanded_bt - changed = True + expanded_bt = ABBREVIATED_VENUE_MAP[bt.lower()] + if expanded_bt != bt: + fields["booktitle"] = expanded_bt + return True + return False + - # Correct ALL-CAPS venue names to proper case - for _vcf in ("journal", "booktitle"): - _vc_val = (fields.get(_vcf) or "").strip() - if _vc_val and _vc_val in VENUE_CASE_CORRECTIONS: - _corrected_vc = VENUE_CASE_CORRECTIONS[_vc_val] - if _corrected_vc != _vc_val: - fields[_vcf] = _corrected_vc +def _rule_venue_case_corrections(entry: dict[str, Any], fields: dict[str, Any]) -> bool: + """Correct ALL-CAPS venue names to proper case; fix lowercase GECCO venue.""" + changed = False + for vcf in ("journal", "booktitle"): + vc_val = (fields.get(vcf) or "").strip() + if vc_val and vc_val in VENUE_CASE_CORRECTIONS: + corrected_vc = VENUE_CASE_CORRECTIONS[vc_val] + if corrected_vc != vc_val: + fields[vcf] = corrected_vc changed = True - # Fix lowercase _GECCO_LOWER in GECCO booktitles - elif _vc_val and _GECCO_LOWER in _vc_val.lower(): - _vc_fixed = _GECCO_RE.sub(_GECCO_PROPER, _vc_val) - if _vc_fixed != _vc_val: - fields[_vcf] = _vc_fixed + elif vc_val and _GECCO_LOWER in vc_val.lower(): + vc_fixed = _GECCO_RE.sub(_GECCO_PROPER, vc_val) + if vc_fixed != vc_val: + fields[vcf] = vc_fixed changed = True + return changed - # Strip trailing " -" or en-dash from booktitle/title (truncation artifact) - for _td_field in ("booktitle", "title"): - _td_val = (fields.get(_td_field) or "").strip() - if _td_val and _TRAILING_DASH_RE.search(_td_val): - fields[_td_field] = _TRAILING_DASH_RE.sub("", _td_val) - changed = True - - # Strip ": -...-" subtitle wrapper artifact from title - title = fields.get("title", "") - if isinstance(title, str) and ": -" in title: - cleaned = _SUBTITLE_WRAPPER_RE.sub(r": \1", title) - if cleaned != title: - fields["title"] = cleaned - changed = True - # Strip SPIRE-style proceedings garbage suffix from booktitle +def _rule_strip_spire_suffix(entry: dict[str, Any], fields: dict[str, Any]) -> bool: + """Strip SPIRE-style proceedings garbage suffix from booktitle.""" bt_spire = (fields.get("booktitle") or "").strip() if bt_spire: bt_cleaned = _SPIRE_STRIP_RE.sub("", bt_spire) if bt_cleaned != bt_spire: fields["booktitle"] = bt_cleaned - changed = True + return True + return False - # Strip _v[N] version suffix from OSF/PsyArXiv DOIs + +def _rule_strip_osf_doi_version(entry: dict[str, Any], fields: dict[str, Any]) -> bool: + """Strip _v[N] version suffix from OSF/PsyArXiv DOIs (and matching URL).""" doi_val = (fields.get("doi") or "").strip() if doi_val and _OSF_DOI_RE.match(doi_val): doi_stripped = _DOI_VERSION_RE.sub("", doi_val) if doi_stripped != doi_val: fields["doi"] = doi_stripped - changed = True - # Also fix the URL if it contains the versioned DOI url_val = (fields.get("url") or "").strip() if url_val and doi_val in url_val: fields["url"] = url_val.replace(doi_val, doi_stripped) + return True + return False - # Remove pages field that contains no digits (location strings, not page numbers) - pg = (fields.get("pages") or "").strip() - if pg and not re.search(r"\d", pg): - del fields["pages"] - changed = True - # Fix Schloss Dagstuhl missing umlaut ("fur" → "f{\"u}r") +def _rule_fix_zentrum_umlaut(entry: dict[str, Any], fields: dict[str, Any]) -> bool: + """Fix Schloss Dagstuhl missing umlaut ("fur" -> "f{\\"u}r").""" pub = (fields.get("publisher") or "").strip() if _ZENTRUM_FUR in pub: fields["publisher"] = pub.replace(_ZENTRUM_FUR, _ZENTRUM_FUER) - changed = True + return True + return False - # Strip page numbers embedded in booktitle (e.g., ", 17: 1-17: 18" from LIPIcs) + +def _rule_strip_lipics_pages(entry: dict[str, Any], fields: dict[str, Any]) -> bool: + """Strip page numbers embedded in booktitle (LIPIcs style) and backfill pages.""" bt_pages = (fields.get("booktitle") or "").strip() if bt_pages: bt_clean = _LIPICS_PAGES_STRIP_RE.sub("", bt_pages) @@ -300,18 +360,352 @@ def _fixup_bib_entry(entry: dict[str, Any]) -> bool: pages_match = _LIPICS_PAGES_EXTRACT_RE.search(bt_pages) if pages_match: fields["pages"] = pages_match.group(1).replace(" ", "") - changed = True + return True + return False - # Strip duplicate "Proceedings of the" wrapper from booktitle + +def _rule_strip_proceedings_wrapper(entry: dict[str, Any], fields: dict[str, Any]) -> bool: + """Strip duplicate "Proceedings of the" wrapper from booktitle.""" bt_dup = (fields.get("booktitle") or "").strip() if bt_dup.startswith(_PROC_EXT_ABSTRACTS): fields["booktitle"] = bt_dup.removeprefix(_PROC_OF_THE) - changed = True + return True + return False + - # Add URL from DOI when missing +# --------------------------------------------------------------------------- +# Site-A-only rules (orphan/terminal sweep) +# --------------------------------------------------------------------------- +def _rule_strip_preprint_marker_title(entry: dict[str, Any], fields: dict[str, Any]) -> bool: + """Strip a trailing [preprint] marker from the title.""" + title = fields.get("title", "") + if isinstance(title, str) and _PREPRINT_MARKER_RE.search(title): + fields["title"] = _PREPRINT_MARKER_RE.sub("", title).strip() + return True + return False + + +def _rule_fix_title_text(entry: dict[str, Any], fields: dict[str, Any]) -> bool: + """Fix fused compounds, colon-space, hyphen-space, and acronym case in the title.""" + title = fields.get("title", "") + if isinstance(title, str) and title: + fixed_title = _fix_title_text(title) + if fixed_title != title: + fields["title"] = fixed_title + return True + return False + + +def _rule_strip_trailing_dash_venue_title(entry: dict[str, Any], fields: dict[str, Any]) -> bool: + """Strip trailing " -"/en-dash truncation artifact from booktitle and title.""" + changed = False + for td_field in ("booktitle", "title"): + td_val = (fields.get(td_field) or "").strip() + if td_val and _TRAILING_DASH_RE.search(td_val): + fields[td_field] = _TRAILING_DASH_RE.sub("", td_val) + changed = True + return changed + + +def _rule_strip_subtitle_wrapper_title(entry: dict[str, Any], fields: dict[str, Any]) -> bool: + """Strip ": -...-" subtitle wrapper artifact from the title.""" + title = fields.get("title", "") + if isinstance(title, str) and ": -" in title: + cleaned = _SUBTITLE_WRAPPER_RE.sub(r": \1", title) + if cleaned != title: + fields["title"] = cleaned + return True + return False + + +def _rule_remove_nondigit_pages(entry: dict[str, Any], fields: dict[str, Any]) -> bool: + """Remove a pages field that contains no digits (location strings, not pages).""" + pg = (fields.get("pages") or "").strip() + if pg and not re.search(r"\d", pg): + del fields["pages"] + return True + return False + + +def _rule_add_url_from_doi(entry: dict[str, Any], fields: dict[str, Any]) -> bool: + """Add a URL derived from the DOI when the URL is missing.""" doi = (fields.get("doi") or "").strip() if doi and not fields.get("url"): fields["url"] = f"https://doi.org/{doi}" - changed = True + return True + return False + + +# --------------------------------------------------------------------------- +# Site-C-only rules (Phase-4 post-merge; POST_MERGE is terminal) +# --------------------------------------------------------------------------- +def _rule_article_no_journal_to_misc(entry: dict[str, Any], fields: dict[str, Any]) -> bool: + """Terminal: @article with no journal (enrichment exhausted) -> @misc.""" + if entry.get("type") == "article" and not fields.get("journal"): + entry["type"] = "misc" + return True + return False + + +def _rule_inproceedings_no_booktitle_to_misc(entry: dict[str, Any], fields: dict[str, Any]) -> bool: + """Terminal: @inproceedings without booktitle -> @misc (invalid BibTeX otherwise).""" + if entry.get("type") == "inproceedings" and not fields.get("booktitle"): + entry["type"] = "misc" + return True + return False + + +def _rule_preprint_journal_to_misc(entry: dict[str, Any], fields: dict[str, Any]) -> bool: + """@article with a preprint server as journal -> @misc (journal -> howpublished).""" + if entry.get("type") == "article": + j_lower = (fields.get("journal") or "").lower().strip() + if j_lower and any(ps == j_lower or ps in j_lower for ps in PREPRINT_SERVERS): + entry["type"] = "misc" + fields["howpublished"] = fields.pop("journal") + return True + return False + +def _rule_strip_ellipsis_venues(entry: dict[str, Any], fields: dict[str, Any]) -> bool: + """Strip trailing ellipsis from truncated journal/booktitle/title fields.""" + changed = False + for ell_field in ("journal", "booktitle", "title"): + ell_val = fields.get(ell_field) or "" + if ell_val.rstrip().endswith(("...", "\u2026")): + ell_clean = _strip_ellipsis(ell_val) + if ell_clean != ell_val: + fields[ell_field] = ell_clean + changed = True return changed + + +def _rule_patent_to_misc(entry: dict[str, Any], fields: dict[str, Any]) -> bool: + """@article with a US patent number as journal -> @misc (journal -> note).""" + if entry.get("type") == "article" and fields.get("journal"): + patent_jnl = fields["journal"].strip() + if _US_PATENT_RE.match(patent_jnl): + entry["type"] = "misc" + fields["note"] = patent_jnl + fields.pop("journal", None) + return True + return False + + +def _rule_unpublished_to_misc(entry: dict[str, Any], fields: dict[str, Any]) -> bool: + """@article with "Unpublished" journal -> @misc.""" + if entry.get("type") == "article" and fields.get("journal") and fields["journal"].strip().lower() == "unpublished": + entry["type"] = "misc" + fields.pop("journal", None) + return True + return False + + +def _rule_url_booktitle_to_misc(entry: dict[str, Any], fields: dict[str, Any]) -> bool: + """@inproceedings with a URL fragment as booktitle -> @misc.""" + if entry.get("type") == "inproceedings" and fields.get("booktitle"): + bt_val = fields["booktitle"].strip() + if _URL_BOOKTITLE_RE.match(bt_val): + entry["type"] = "misc" + fields.pop("booktitle", None) + return True + return False + + +def _rule_article_preprint_doi(entry: dict[str, Any], fields: dict[str, Any]) -> bool: + """@article with a preprint (secondary) DOI. + + If it has a real journal + volume/pages, keep as @article but strip the + preprint DOI/URL. Otherwise downgrade to @misc (journal -> howpublished). + """ + if entry.get("type") == "article": + merged_doi = (fields.get("doi") or "").strip() + if merged_doi and idu.is_secondary_doi(merged_doi): + venue = fields.get("journal", "") + if venue and (fields.get("volume") or fields.get("pages")): + fields.pop("doi", None) + fields.pop("url", None) + else: + entry["type"] = "misc" + if venue: + fields["howpublished"] = fields.pop("journal") + return True + return False + + +def _rule_backfill_howpublished(entry: dict[str, Any], fields: dict[str, Any]) -> bool: + """Backfill howpublished for @misc entries with a preprint DOI or arXiv eprint.""" + if entry.get("type") == "misc" and not fields.get("howpublished"): + misc_doi = (fields.get("doi") or "").strip() + inferred_hp = mu.infer_howpublished_from_doi(misc_doi) if misc_doi else None + if inferred_hp: + fields["howpublished"] = inferred_hp + return True + if (fields.get("archiveprefix") or "").lower() == "arxiv": + fields["howpublished"] = "arXiv" + return True + return False + + +def _rule_normalize_title_chain(entry: dict[str, Any], fields: dict[str, Any]) -> bool: + """Post-merge title normalization chain (ALL-CAPS, [J]/[preprint], fused, dashes).""" + title = fields.get("title", "") + if isinstance(title, str) and title: + fixed = trim_title_default(title) + fixed = _BRACKET_J_RE.sub("", fixed).strip() + fixed = _PREPRINT_MARKER_RE.sub("", fixed).strip() + fixed = _fix_title_text(fixed) + fixed = _TRAILING_DASH_RE.sub("", fixed) + fixed = _SUBTITLE_WRAPPER_RE.sub(r": \1", fixed) + if fixed != title: + fields["title"] = fixed + return True + return False + + +def _rule_fix_author_casing(entry: dict[str, Any], fields: dict[str, Any]) -> bool: + """Fix author casing + capital "And" separators from API sources.""" + auth = fields.get("author", "") + if isinstance(auth, str) and auth: + auth_fixed, _ = mu._fix_author_casing(auth) + if auth_fixed != auth: + fields["author"] = auth_fixed + return True + return False + + +def _rule_normalize_howpublished(entry: dict[str, Any], fields: dict[str, Any]) -> bool: + """Normalize howpublished casing after all journal->howpublished moves.""" + before = fields.get("howpublished") + mu._normalize_howpublished(fields) + return fields.get("howpublished") != before + + +def _rule_howpublished_to_inproceedings(entry: dict[str, Any], fields: dict[str, Any]) -> bool: + """Upgrade @misc with a conference/workshop howpublished -> @inproceedings. + + When howpublished is a venue name (not a preprint server or repository), + the entry is a conference/workshop paper that should be @inproceedings. + """ + if entry.get("type") == "misc" and fields.get("howpublished"): + hp_val = (fields.get("howpublished") or "").strip() + hp_lower = hp_val.lower() + is_preprint_hp = ( + any(ps == hp_lower or ps in hp_lower for ps in PREPRINT_SERVERS) or hp_lower in _R20_PREPRINT_HOWPUBLISHED + ) + is_repository_hp = any(rj in hp_lower for rj in REPOSITORY_AS_JOURNAL) + if not is_preprint_hp and not is_repository_hp and hp_val: + entry["type"] = "inproceedings" + fields["booktitle"] = fields.pop("howpublished") + return True + return False + + +# --------------------------------------------------------------------------- +# Per-stage ordered rule sequences +# --------------------------------------------------------------------------- +# Site A (orphan/terminal sweep). Reproduces _fixup_bib_entry's exact rule order. +_POSTRUN_ORPHAN_REPAIR_RULES = ( + _rule_procedia_to_inproceedings, + _rule_pacm_booktitle_to_article, + _rule_named_proceedings_to_article, + _rule_institutional_repo_to_phdthesis, + _rule_repo_booktitle_to_misc, + _rule_repo_journal_to_misc, + _rule_preprint_booktitle_to_misc, + _rule_university_to_phdthesis, + _rule_journal_prefix_to_article, + _rule_handbook_to_incollection, + _rule_book_chapter_doi_to_incollection, + _rule_conference_journal_to_inproceedings, + _rule_strip_preprint_marker_title, + _rule_fix_title_text, + _rule_booktitle_fixups, + _rule_strip_urls_in_venue, + _rule_publisher_corrections, + _rule_strip_publisher_duplicate, + _rule_expand_abbreviated_venue, + _rule_venue_case_corrections, + _rule_strip_trailing_dash_venue_title, + _rule_strip_subtitle_wrapper_title, + _rule_strip_spire_suffix, + _rule_strip_osf_doi_version, + _rule_remove_nondigit_pages, + _rule_fix_zentrum_umlaut, + _rule_strip_lipics_pages, + _rule_strip_proceedings_wrapper, + _rule_add_url_from_doi, +) + +# Site C (Phase-4 post-merge). Reproduces the inline post-merge block's exact order. +_POST_MERGE_RULES = ( + _rule_article_no_journal_to_misc, + _rule_inproceedings_no_booktitle_to_misc, + _rule_preprint_journal_to_misc, + _rule_strip_ellipsis_venues, + _rule_conference_journal_to_inproceedings, + _rule_procedia_to_inproceedings, + _rule_pacm_booktitle_to_article, + _rule_named_proceedings_to_article, + _rule_institutional_repo_to_phdthesis, + _rule_patent_to_misc, + _rule_unpublished_to_misc, + _rule_url_booktitle_to_misc, + _rule_preprint_booktitle_to_misc, + _rule_journal_prefix_to_article, + _rule_handbook_to_incollection, + _rule_book_chapter_doi_to_incollection, + _rule_repo_journal_to_misc, + _rule_repo_booktitle_to_misc, + _rule_university_to_phdthesis, + _rule_article_preprint_doi, + _rule_backfill_howpublished, + _rule_normalize_title_chain, + _rule_booktitle_fixups, + _rule_expand_abbreviated_venue, + _rule_venue_case_corrections, + _rule_strip_publisher_duplicate, + _rule_strip_spire_suffix, + _rule_strip_osf_doi_version, + _rule_fix_zentrum_umlaut, + _rule_strip_lipics_pages, + _rule_strip_proceedings_wrapper, + _rule_strip_urls_in_venue, + _rule_publisher_corrections, + _rule_fix_author_casing, + _rule_normalize_howpublished, + _rule_howpublished_to_inproceedings, +) + +_STAGE_RULES = { + CanonicalStage.POST_MERGE: _POST_MERGE_RULES, + CanonicalStage.POSTRUN_ORPHAN_REPAIR: _POSTRUN_ORPHAN_REPAIR_RULES, +} + + +def canonicalize(entry: dict[str, Any], *, stage: CanonicalStage) -> bool: + """Apply the entry-type reclassification + text normalization rules for a stage. + + Mutates ``entry`` in place and returns True if any rule changed something. + The per-stage rule set and order are single-sourced in ``_STAGE_RULES``; the + shared rule bodies live as ``_rule_*`` helpers so Site A (orphan repair) and + Site C (Phase-4 post-merge) share identical logic without copy-paste. + """ + rules = _STAGE_RULES.get(stage) + if rules is None: + raise NotImplementedError(f"canonicalize() does not yet implement stage {stage!r}") + fields = entry.get("fields") or {} + changed = False + for rule in rules: + if rule(entry, fields): + changed = True + return changed + + +def _fixup_bib_entry(entry: dict[str, Any]) -> bool: + """Apply entry type and field corrections to a parsed BibTeX entry. + + Returns True if any changes were made. Used by both the per-article fixup + and the post-run orphan fixup. Thin wrapper over the single-sourced + ``canonicalize`` dispatch at the POSTRUN_ORPHAN_REPAIR stage. + """ + return canonicalize(entry, stage=CanonicalStage.POSTRUN_ORPHAN_REPAIR) diff --git a/tests/test_canonicalize.py b/tests/test_canonicalize.py new file mode 100644 index 00000000..298f4cdf --- /dev/null +++ b/tests/test_canonicalize.py @@ -0,0 +1,149 @@ +"""Tests for the stage-parameterized canonicalize() dispatch. + +Covers per-rule behavior at CanonicalStage.POST_MERGE (Site C) and proves the +POST_MERGE rule set is a data fixpoint on the committed corpus (no oscillation). +""" + +from __future__ import annotations + +import copy +import glob +from typing import Any + +import pytest + +from src.bibtex_utils import parse_bibtex_to_dict +from src.canonicalize import ( + CanonicalStage, + _rule_article_preprint_doi, + canonicalize, +) + + +def _article(**fields: str) -> dict[str, Any]: + """Build a minimal @article entry with the given extra fields.""" + etype = fields.pop("type", "article") + base = {"title": "A Study of Neural Networks", "author": "Doe, Jane", "year": "2021"} + base.update(fields) + return {"type": etype, "key": "k1", "fields": base} + + +def _canon(entry: dict[str, Any]) -> dict[str, Any]: + """Run POST_MERGE canonicalize on a copy and return the mutated copy.""" + e = copy.deepcopy(entry) + canonicalize(e, stage=CanonicalStage.POST_MERGE) + return e + + +# --------------------------------------------------------------------------- +# Per-rule tests at POST_MERGE +# --------------------------------------------------------------------------- +def test_r11_conference_journal_to_inproceedings() -> None: + """R11: @article with a conference-proceedings journal -> @inproceedings.""" + result = _canon(_article(journal="Proceedings of the International Conference on Machine Learning")) + assert result["type"] == "inproceedings" + assert result["fields"]["booktitle"] == "Proceedings of the International Conference on Machine Learning" + assert "journal" not in result["fields"] + # Second POST_MERGE pass is a fixpoint (no further change). + assert canonicalize(copy.deepcopy(result), stage=CanonicalStage.POST_MERGE) is False + + +def test_r14_patent_to_misc() -> None: + """R14: @article with a US patent number as journal -> @misc (journal -> note).""" + result = _canon(_article(journal="US Patent 10,123,456")) + assert result["type"] == "misc" + assert result["fields"]["note"] == "US Patent 10,123,456" + assert "journal" not in result["fields"] + assert canonicalize(copy.deepcopy(result), stage=CanonicalStage.POST_MERGE) is False + + +def test_r15_unpublished_to_misc() -> None: + """R15: @article with "Unpublished" journal -> @misc.""" + result = _canon(_article(journal="Unpublished")) + assert result["type"] == "misc" + assert "journal" not in result["fields"] + assert canonicalize(copy.deepcopy(result), stage=CanonicalStage.POST_MERGE) is False + + +def test_r16_preprint_journal_to_misc() -> None: + """R16: @article with a preprint server as journal -> @misc (journal -> howpublished).""" + result = _canon(_article(journal="arXiv")) + assert result["type"] == "misc" + assert result["fields"]["howpublished"] == "arXiv" + assert "journal" not in result["fields"] + assert canonicalize(copy.deepcopy(result), stage=CanonicalStage.POST_MERGE) is False + + +def test_r19_misc_downgrade_branch() -> None: + """R19 (misc branch): @article with a preprint DOI and no volume/pages -> @misc. + + Exercised via the rule helper directly: at full POST_MERGE the manufactured + howpublished is a plain venue name that R20 subsequently upgrades, so the + misc-downgrade branch is asserted in isolation here. + """ + entry = _article(journal="Journal of Foo", doi="10.48550/arXiv.2101.00001") + fields = entry["fields"] + changed = _rule_article_preprint_doi(entry, fields) + assert changed is True + assert entry["type"] == "misc" + assert fields["howpublished"] == "Journal of Foo" + assert "journal" not in fields + # misc branch keeps the DOI (only the keep-article branch strips it) + assert fields["doi"] == "10.48550/arXiv.2101.00001" + + +def test_r19_keep_article_strips_preprint_doi() -> None: + """R19 (keep branch): real journal + volume/pages keeps @article, strips preprint DOI/URL.""" + entry = _article( + journal="Real Journal", + doi="10.48550/arXiv.2101.00002", + volume="12", + pages="1-10", + url="https://arxiv.org/abs/2101.00002", + ) + fields = entry["fields"] + changed = _rule_article_preprint_doi(entry, fields) + assert changed is True + assert entry["type"] == "article" + assert fields["journal"] == "Real Journal" + assert "doi" not in fields + assert "url" not in fields + + +def test_r20_misc_howpublished_to_inproceedings() -> None: + """R20: @misc with a conference/workshop howpublished -> @inproceedings.""" + result = _canon(_article(type="misc", howpublished="International Conference on Learning Representations")) + assert result["type"] == "inproceedings" + assert result["fields"]["booktitle"] == "International Conference on Learning Representations" + assert "howpublished" not in result["fields"] + assert canonicalize(copy.deepcopy(result), stage=CanonicalStage.POST_MERGE) is False + + +# --------------------------------------------------------------------------- +# Corpus idempotency: POST_MERGE is a data fixpoint (proves no oscillation) +# --------------------------------------------------------------------------- +def test_post_merge_is_fixpoint_on_corpus() -> None: + """Applying POST_MERGE twice yields identical type + fields for every committed + output/**/*.bib (proves no run-to-run oscillation). + + Note: on a small number of already-@misc preprint-DOI entries the boolean + ``changed`` return can report True on a repeat pass due to benign intra-pass + misc<->inproceedings churn, while the serialized data reaches a strict + fixpoint. Byte-identity of the output depends on the data fixpoint, which is + what this asserts. + """ + files = sorted(glob.glob("output/**/*.bib", recursive=True)) + if not files: + pytest.skip("no committed output corpus present") + non_fixpoint: list[str] = [] + for bib_path in files: + with open(bib_path, encoding="utf-8") as fh: + entry = parse_bibtex_to_dict(fh.read()) + if entry is None: + continue + canonicalize(entry, stage=CanonicalStage.POST_MERGE) + snapshot = copy.deepcopy(entry) + canonicalize(entry, stage=CanonicalStage.POST_MERGE) + if entry["type"] != snapshot["type"] or entry["fields"] != snapshot["fields"]: + non_fixpoint.append(bib_path) + assert not non_fixpoint, f"POST_MERGE not a data fixpoint for: {non_fixpoint[:10]}" From 30bf1d1819e9641e42a45d4794a4113abffde1cb Mon Sep 17 00:00:00 2001 From: Gabriel Spadon Date: Wed, 1 Jul 2026 15:54:12 -0300 Subject: [PATCH 20/54] refactor: fold Site B pre-enrichment fixup into canonicalize(LOAD_REPAIR) Replace the ~470-line inline existing-file fixup block with canonicalize(fields, stage=LOAD_REPAIR), preserving Site B's EXACT rule subset and order (C-only rules R13/R19-misc/R20 stay absent -- asserted). N22 title==venue delete + email/&-escape write-gating stay in main.py as pipeline I/O; N22 moved after the single canonicalize call (byte-safe: the rules following it touch only doi/url/howpublished/author). 30 shared _rule_* helpers reused, 8 B-specific added (incl. an author-casing variant gating on the changed flag to avoid whitespace byte-divergence). Byte-equivalent: tests/test_regression.py 235/235 green + LOAD_REPAIR corpus data-fixpoint. All three fixup sites now single-sourced in canonicalize(). --- main.py | 481 +------------------------------------ src/canonicalize.py | 150 ++++++++++++ tests/test_canonicalize.py | 133 ++++++++++ 3 files changed, 289 insertions(+), 475 deletions(-) diff --git a/main.py b/main.py index 6b65f118..035c2bb4 100644 --- a/main.py +++ b/main.py @@ -17,26 +17,6 @@ from src import merge_utils as mu from src.cache import get_cache_hit_counts from src.canonicalize import ( - _BOOK_CHAPTER_DOI_RE, - _BRACKET_J_RE, - _DOI_VERSION_RE, - _GECCO_LOWER, - _GECCO_PROPER, - _GECCO_RE, - _LIPICS_PAGES_EXTRACT_RE, - _LIPICS_PAGES_STRIP_RE, - _OSF_DOI_RE, - _PREPRINT_MARKER_RE, - _PROC_EXT_ABSTRACTS, - _PROC_OF_THE, - _SPIRE_STRIP_RE, - _SUBTITLE_WRAPPER_RE, - _TRAILING_DASH_RE, - _URL_IN_VENUE_RE, - _URL_IN_VENUE_STRIP_RE, - _US_PATENT_RE, - _ZENTRUM_FUER, - _ZENTRUM_FUR, CanonicalStage, _fixup_bib_entry, canonicalize, @@ -69,8 +49,6 @@ s2_search_papers_multiple, ) from src.config import ( - ABBREVIATED_VENUE_MAP, - ACM_JOURNAL_PROCEEDINGS, DEFAULT_A2I2_INPUT, DEFAULT_INPUT, DEFAULT_OUT_DIR, @@ -78,25 +56,18 @@ DEFAULT_SERPAPI_KEY_FILE, DEFAULT_SERPLY_KEY_FILE, GENERIC_SERIES_NAMES, - INSTITUTIONAL_REPOSITORIES, - JOURNAL_ONLY_PREFIXES, - JOURNALS_NAMED_PROCEEDINGS, MAX_PUBLICATIONS_PER_AUTHOR, MAX_WORKERS, MIN_TITLE_WORDS, PREPRINT_ONLY_PUBLISHERS, PREPRINT_SERVERS, - PROCEEDINGS_SERIES_AS_JOURNAL, PUB_PARSE_TIER1_MIN_CONFIDENCE, PUB_PARSE_TIER2_MIN_CONFIDENCE, - PUBLISHER_CORRECTIONS, - REPOSITORY_AS_JOURNAL, REQUEST_DELAY_MAX, REQUEST_DELAY_MIN, SIM_MERGE_DUPLICATE_THRESHOLD, SIM_PREPRINT_TITLE_THRESHOLD, SKIP_SCHOLAR_FOR_EXISTING_FILES, - VENUE_CASE_CORRECTIONS, get_min_year, ) from src.doi_utils import process_validated_doi @@ -108,9 +79,7 @@ PARSE_ERRORS, ) from src.fixup.text import ( - _apply_booktitle_fixups, _fix_fused_compounds, # noqa: F401 - _fix_title_text, _is_corrupted_title, _is_garbage_title, ) @@ -134,7 +103,7 @@ ) from src.log_utils import LogCategory, LogSource, logger from src.models import Record -from src.publication_parser import _strip_ellipsis, parse_publication_string +from src.publication_parser import parse_publication_string from src.text_utils import ( author_name_matches, extract_year_from_any, @@ -441,401 +410,13 @@ def process_article( except (OSError, ValueError, TypeError): continue - # Fixup stale entries loaded from disk: strip preprint journals and - # downgrade @article→@misc so cached files from older pipeline runs - # are corrected even when FILE_SKIP_WRITE blocks the new version. + # Fixup stale entries loaded from disk before enrichment: the pure entry + # field/type rewrites are single-sourced in src/canonicalize.py at the + # LOAD_REPAIR stage. The destructive title==venue delete (N22) and the + # bare-& rewrite trigger stay here in the pipeline. if existing_file_loaded and baseline_entry is not None: + _fixup_written = canonicalize(baseline_entry, stage=CanonicalStage.LOAD_REPAIR) _bl_fields = baseline_entry.get("fields") or {} - _bl_jnl = (_bl_fields.get("journal") or "").strip().lower() - _bl_type = baseline_entry.get("type", "") - _fixup_written = False - - # Strip preprint server names from journal field - # Use substring match to catch suffixed forms like "arXiv (Cornell University)" - if _bl_jnl and any(ps == _bl_jnl or ps in _bl_jnl for ps in PREPRINT_SERVERS): - logger.debug( - f"EXISTING_FIXUP | preprint_journal_stripped | journal={_bl_fields.get('journal')}", - category=LogCategory.CLEANUP, - ) - if _bl_type == "article": - _bl_fields["howpublished"] = _bl_fields.pop("journal") - baseline_entry["type"] = "misc" - logger.debug( - "EXISTING_FIXUP | article_preprint_journal->misc", - category=LogCategory.CLEANUP, - ) - else: - _bl_fields.pop("journal", None) - _fixup_written = True - - # Strip email addresses from author field - _bl_author = _bl_fields.get("author", "") - if isinstance(_bl_author, str) and re.search(r"\S+@\S+\.\S+", _bl_author): - _bl_author_clean = re.sub(r"\s*\S+@\S+\.\S+", "", _bl_author).strip() - _bl_author_clean = re.sub(r"\s*and\s*$", "", _bl_author_clean).strip() - _bl_author_clean = re.sub(r"^\s*and\s*", "", _bl_author_clean).strip() - if _bl_author_clean: - logger.debug( - f"EXISTING_FIXUP | email_stripped_from_author | old={_bl_author[:60]}", - category=LogCategory.CLEANUP, - ) - _bl_fields["author"] = _bl_author_clean - _fixup_written = True - - # Strip [J] bracket artifacts from title - _bl_title = _bl_fields.get("title", "") - if isinstance(_bl_title, str) and _BRACKET_J_RE.search(_bl_title): - _bl_fields["title"] = _BRACKET_J_RE.sub("", _bl_title).strip() - logger.debug( - f"EXISTING_FIXUP | bracket_artifact_stripped | title={_bl_title[:60]}", - category=LogCategory.CLEANUP, - ) - _fixup_written = True - - # Strip trailing ellipsis from truncated venue/title fields - for _ell_field in ("journal", "booktitle", "title"): - _ell_val = _bl_fields.get(_ell_field, "") - if isinstance(_ell_val, str) and _ell_val.rstrip().endswith(("...", "\u2026")): - _ell_clean = _strip_ellipsis(_ell_val) - if _ell_clean != _ell_val: - logger.debug( - f"EXISTING_FIXUP | ellipsis_stripped | {_ell_field}={_ell_val[:60]}", - category=LogCategory.CLEANUP, - ) - _bl_fields[_ell_field] = _ell_clean - _fixup_written = True - - # Expand abbreviated venue names in booktitle - _ex_bt_abbr = (_bl_fields.get("booktitle") or "").strip() - if _ex_bt_abbr and _ex_bt_abbr.lower() in ABBREVIATED_VENUE_MAP: - _ex_expanded = ABBREVIATED_VENUE_MAP[_ex_bt_abbr.lower()] - if _ex_expanded != _ex_bt_abbr: - _bl_fields["booktitle"] = _ex_expanded - _fixup_written = True - - # Correct ALL-CAPS venue names to proper case - for _ex_vcf in ("journal", "booktitle"): - _ex_vc_val = (_bl_fields.get(_ex_vcf) or "").strip() - if _ex_vc_val and _ex_vc_val in VENUE_CASE_CORRECTIONS: - logger.debug( - f"EXISTING_FIXUP | venue_case_corrected | {_ex_vcf}={_ex_vc_val}", - category=LogCategory.CLEANUP, - ) - _bl_fields[_ex_vcf] = VENUE_CASE_CORRECTIONS[_ex_vc_val] - _fixup_written = True - elif _ex_vc_val and _GECCO_LOWER in _ex_vc_val.lower(): - _ex_vc_fixed = _GECCO_RE.sub(_GECCO_PROPER, _ex_vc_val) - if _ex_vc_fixed != _ex_vc_val: - _bl_fields[_ex_vcf] = _ex_vc_fixed - _fixup_written = True - - # Strip publisher when it duplicates the journal/booktitle name - _ex_pub = (_bl_fields.get("publisher") or "").strip() - _ex_container = (_bl_fields.get("journal") or _bl_fields.get("booktitle") or "").strip() - if _ex_pub and _ex_container and _ex_pub.lower() == _ex_container.lower(): - del _bl_fields["publisher"] - _fixup_written = True - - # Strip trailing dash/en-dash from title (truncation artifact) - _bl_title_td = (_bl_fields.get("title") or "").strip() - if _bl_title_td and _TRAILING_DASH_RE.search(_bl_title_td): - _bl_fields["title"] = _TRAILING_DASH_RE.sub("", _bl_title_td) - _fixup_written = True - - # Strip ": -...-" subtitle wrapper artifact from title - _bl_title_sw = (_bl_fields.get("title") or "").strip() - if isinstance(_bl_title_sw, str) and ": -" in _bl_title_sw: - _cleaned_sw = _SUBTITLE_WRAPPER_RE.sub(r": \1", _bl_title_sw) - if _cleaned_sw != _bl_title_sw: - _bl_fields["title"] = _cleaned_sw - _fixup_written = True - - # Strip SPIRE-style proceedings garbage suffix from booktitle - _ex_bt_spire = (_bl_fields.get("booktitle") or "").strip() - if _ex_bt_spire: - _ex_bt_cleaned = _SPIRE_STRIP_RE.sub("", _ex_bt_spire) - if _ex_bt_cleaned != _ex_bt_spire: - _bl_fields["booktitle"] = _ex_bt_cleaned - _fixup_written = True - - # Strip _v[N] version suffix from OSF/PsyArXiv DOIs - _ex_doi_val = (_bl_fields.get("doi") or "").strip() - if _ex_doi_val and _OSF_DOI_RE.match(_ex_doi_val): - _ex_doi_stripped = _DOI_VERSION_RE.sub("", _ex_doi_val) - if _ex_doi_stripped != _ex_doi_val: - _bl_fields["doi"] = _ex_doi_stripped - _fixup_written = True - _ex_url_val = (_bl_fields.get("url") or "").strip() - if _ex_url_val and _ex_doi_val in _ex_url_val: - _bl_fields["url"] = _ex_url_val.replace(_ex_doi_val, _ex_doi_stripped) - - # Fix Schloss Dagstuhl missing umlaut - _ex_pub = (_bl_fields.get("publisher") or "").strip() - if _ZENTRUM_FUR in _ex_pub: - _bl_fields["publisher"] = _ex_pub.replace(_ZENTRUM_FUR, _ZENTRUM_FUER) - _fixup_written = True - - # Strip page numbers embedded in booktitle (LIPIcs style) - _ex_bt_pg = (_bl_fields.get("booktitle") or "").strip() - if _ex_bt_pg: - _ex_bt_pg_clean = _LIPICS_PAGES_STRIP_RE.sub("", _ex_bt_pg) - if _ex_bt_pg_clean != _ex_bt_pg: - _bl_fields["booktitle"] = _ex_bt_pg_clean - if not _bl_fields.get("pages"): - _pg_m = _LIPICS_PAGES_EXTRACT_RE.search(_ex_bt_pg) - if _pg_m: - _bl_fields["pages"] = _pg_m.group(1).replace(" ", "") - _fixup_written = True - - # Strip duplicate "Proceedings of the" wrapper - _ex_bt_dup = (_bl_fields.get("booktitle") or "").strip() - if _ex_bt_dup.startswith(_PROC_EXT_ABSTRACTS): - _bl_fields["booktitle"] = _ex_bt_dup.removeprefix(_PROC_OF_THE) - _fixup_written = True - - # Fix ALL-CAPS titles - _bl_title2 = _bl_fields.get("title", "") - if isinstance(_bl_title2, str) and _bl_title2: - _fixed_title = trim_title_default(_bl_title2) - if _fixed_title != _bl_title2: - logger.debug( - f"EXISTING_FIXUP | title_normalized | old={_bl_title2[:60]}", - category=LogCategory.CLEANUP, - ) - _bl_fields["title"] = _fixed_title - _fixup_written = True - - # Fix conference proceedings misclassified as @article with journal - # (but NOT for ACM PACM journals which are legitimately named "Proceedings of...") - if baseline_entry.get("type") == "article" and _bl_fields.get("journal"): - _conf_jnl = _bl_fields["journal"].strip() - _conf_jnl_lower = _conf_jnl.lower() - _is_pacm = any(_conf_jnl_lower.startswith(pj) or _conf_jnl_lower == pj for pj in ACM_JOURNAL_PROCEEDINGS) - if mu._is_conference_journal(_conf_jnl) and not _bl_fields.get("booktitle") and not _is_pacm: - logger.debug( - f"EXISTING_FIXUP | conference_as_journal | journal={_conf_jnl[:60]}", - category=LogCategory.CLEANUP, - ) - _bl_fields["booktitle"] = _bl_fields.pop("journal") - baseline_entry["type"] = "inproceedings" - _fixup_written = True - - # Reclassify @article with "Unpublished" journal → @misc - if ( - baseline_entry.get("type") == "article" - and _bl_fields.get("journal") - and _bl_fields["journal"].strip().lower() == "unpublished" - ): - logger.debug( - "EXISTING_FIXUP | article_unpublished->misc", - category=LogCategory.CLEANUP, - ) - _bl_fields.pop("journal", None) - _bl_fields.pop("publisher", None) - baseline_entry["type"] = "misc" - _fixup_written = True - - # Reclassify @article with patent number as journal → @misc - if ( - baseline_entry.get("type") == "article" - and _bl_fields.get("journal") - and _US_PATENT_RE.match(_bl_fields["journal"].strip()) - ): - logger.debug( - f"EXISTING_FIXUP | article_patent->misc | journal={_bl_fields['journal'][:60]}", - category=LogCategory.CLEANUP, - ) - _bl_fields["note"] = _bl_fields.pop("journal") - baseline_entry["type"] = "misc" - _fixup_written = True - - # Downgrade @article with repository/portal as journal → @misc - if ( - baseline_entry.get("type") == "article" - and _bl_fields.get("journal") - and any(rj in _bl_fields["journal"].lower() for rj in REPOSITORY_AS_JOURNAL) - ): - logger.debug( - f"EXISTING_FIXUP | article_repository->misc | journal={_bl_fields['journal'][:60]}", - category=LogCategory.CLEANUP, - ) - baseline_entry["type"] = "misc" - _bl_fields.pop("journal", None) - _fixup_written = True - - # Reclassify @article with university name as journal → @phdthesis - if baseline_entry.get("type") == "article" and _bl_fields.get("journal"): - _jnl_lower = _bl_fields["journal"].lower() - if "university" in _jnl_lower or "institut" in _jnl_lower: - logger.debug( - f"EXISTING_FIXUP | article_thesis->phdthesis | journal={_bl_fields['journal'][:60]}", - category=LogCategory.CLEANUP, - ) - _bl_fields["school"] = _bl_fields.pop("journal") - baseline_entry["type"] = "phdthesis" - _fixup_written = True - - # Reclassify @article with Procedia/IFAC series → @inproceedings - if baseline_entry.get("type") == "article" and _bl_fields.get("journal"): - _proc_jnl = _bl_fields["journal"].strip().lower() - if any(_proc_jnl.startswith(ps) for ps in PROCEEDINGS_SERIES_AS_JOURNAL): - logger.debug( - f"EXISTING_FIXUP | article_procedia->inproceedings | journal={_bl_fields['journal'][:60]}", - category=LogCategory.CLEANUP, - ) - _bl_fields["booktitle"] = _bl_fields.pop("journal") - baseline_entry["type"] = "inproceedings" - _fixup_written = True - - # Reclassify @inproceedings with PACM journal → @article - if baseline_entry.get("type") == "inproceedings" and _bl_fields.get("booktitle"): - _pacm_bt = _bl_fields["booktitle"].strip().lower() - if any(_pacm_bt.startswith(pj) or _pacm_bt == pj for pj in ACM_JOURNAL_PROCEEDINGS): - logger.debug( - f"EXISTING_FIXUP | inproceedings_pacm->article | booktitle={_bl_fields['booktitle'][:60]}", - category=LogCategory.CLEANUP, - ) - _bl_fields["journal"] = _bl_fields.pop("booktitle") - baseline_entry["type"] = "article" - _fixup_written = True - - # Reclassify @inproceedings with PNAS/PVLDB journal → @article - # Guard: skip if the booktitle extends the journal name with conference keywords - if baseline_entry.get("type") == "inproceedings" and _bl_fields.get("booktitle"): - _jnp_bt = _bl_fields["booktitle"].strip().lower() - _jnp_match = next((j for j in JOURNALS_NAMED_PROCEEDINGS if _jnp_bt.startswith(j)), None) - if _jnp_match: - _jnp_suffix = _jnp_bt[len(_jnp_match) :].lstrip(" /,") - if not any(kw in _jnp_suffix for kw in ("conference", "workshop", "symposium")): - logger.debug( - f"EXISTING_FIXUP | inproceedings_journal_proceedings->article | booktitle={_jnp_bt[:60]}", - category=LogCategory.CLEANUP, - ) - _bl_fields["journal"] = _bl_fields.pop("booktitle") - baseline_entry["type"] = "article" - _fixup_written = True - - # Reclassify @inproceedings with institutional repository → @phdthesis - if baseline_entry.get("type") == "inproceedings" and _bl_fields.get("booktitle"): - _inst_bt = _bl_fields["booktitle"].strip().lower() - if any(ir in _inst_bt for ir in INSTITUTIONAL_REPOSITORIES): - logger.debug( - f"EXISTING_FIXUP | inproceedings_repository->phdthesis | booktitle={_bl_fields['booktitle'][:60]}", - category=LogCategory.CLEANUP, - ) - _bl_fields["school"] = _bl_fields.pop("booktitle") - baseline_entry["type"] = "phdthesis" - _fixup_written = True - - # Downgrade @inproceedings with repository as booktitle → @misc - if ( - baseline_entry.get("type") == "inproceedings" - and _bl_fields.get("booktitle") - and any(rj in _bl_fields["booktitle"].lower() for rj in REPOSITORY_AS_JOURNAL) - ): - logger.debug( - f"EXISTING_FIXUP | inproceedings_repository->misc | booktitle={_bl_fields['booktitle'][:60]}", - category=LogCategory.CLEANUP, - ) - baseline_entry["type"] = "misc" - _bl_fields.pop("booktitle", None) - _fixup_written = True - - # Downgrade @inproceedings with "Preprint" as booktitle → @misc - if ( - baseline_entry.get("type") == "inproceedings" - and _bl_fields.get("booktitle") - and _bl_fields["booktitle"].strip().lower() == "preprint" - ): - logger.debug("EXISTING_FIXUP | inproceedings_preprint->misc", category=LogCategory.CLEANUP) - baseline_entry["type"] = "misc" - _bl_fields.pop("booktitle", None) - _fixup_written = True - - # Reclassify @inproceedings with journal name as booktitle → @article - # (but NOT for PROCEEDINGS_SERIES_AS_JOURNAL which are genuinely proceedings) - if baseline_entry.get("type") == "inproceedings" and _bl_fields.get("booktitle"): - _jp_bt_lower = _bl_fields["booktitle"].strip().lower() - _is_proc_series = any(_jp_bt_lower.startswith(ps) for ps in PROCEEDINGS_SERIES_AS_JOURNAL) - if not _is_proc_series and any(_jp_bt_lower.startswith(jp) for jp in JOURNAL_ONLY_PREFIXES): - logger.debug( - f"EXISTING_FIXUP | inproceedings_journal_booktitle->article | " - f"booktitle={_bl_fields['booktitle'][:60]}", - category=LogCategory.CLEANUP, - ) - _bl_fields["journal"] = _bl_fields.pop("booktitle") - baseline_entry["type"] = "article" - _fixup_written = True - - # Reclassify @inproceedings with "Handbook" in booktitle → @incollection - if ( - baseline_entry.get("type") == "inproceedings" - and _bl_fields.get("booktitle") - and "handbook" in _bl_fields["booktitle"].lower() - ): - logger.debug( - f"EXISTING_FIXUP | inproceedings_handbook->incollection | booktitle={_bl_fields['booktitle'][:60]}", - category=LogCategory.CLEANUP, - ) - baseline_entry["type"] = "incollection" - _fixup_written = True - - # Reclassify @article with book-chapter DOI pattern → @incollection - _bl_doi_ch = (_bl_fields.get("doi") or "").strip() - if ( - baseline_entry.get("type") == "article" - and _bl_fields.get("journal") - and _bl_doi_ch - and _BOOK_CHAPTER_DOI_RE.search(_bl_doi_ch) - ): - logger.debug( - f"EXISTING_FIXUP | article_book_chapter->incollection | doi={_bl_doi_ch}", - category=LogCategory.CLEANUP, - ) - _bl_fields["booktitle"] = _bl_fields.pop("journal") - baseline_entry["type"] = "incollection" - _fixup_written = True - - # Strip [preprint] marker from title - _bl_title_pp = _bl_fields.get("title", "") - if isinstance(_bl_title_pp, str) and _PREPRINT_MARKER_RE.search(_bl_title_pp): - _bl_fields["title"] = _PREPRINT_MARKER_RE.sub("", _bl_title_pp).strip() - _fixup_written = True - - # Fix fused compounds, colon-space, hyphen-space, and acronym case - _bl_title_fused = _bl_fields.get("title", "") - if isinstance(_bl_title_fused, str) and _bl_title_fused: - _bl_title_fixed = _fix_title_text(_bl_title_fused) - if _bl_title_fixed != _bl_title_fused: - _bl_fields["title"] = _bl_title_fixed - _fixup_written = True - - # Apply booktitle cleanup patterns (verbose metadata strip, abbreviations, typos, spacing) - _ex_bt_fix = (_bl_fields.get("booktitle") or "").strip() - if _ex_bt_fix: - _ex_bt_fixed = _apply_booktitle_fixups(_ex_bt_fix) - if _ex_bt_fixed != _ex_bt_fix: - _bl_fields["booktitle"] = _ex_bt_fixed - _fixup_written = True - - # Strip URLs embedded in booktitle/journal - for _url_field in ("booktitle", "journal"): - _url_val = (_bl_fields.get(_url_field) or "").strip() - if _url_val and _URL_IN_VENUE_RE.search(_url_val): - _url_cleaned = _URL_IN_VENUE_STRIP_RE.sub("", _url_val).strip().rstrip(",") - if _url_cleaned and _url_cleaned != _url_val: - _bl_fields[_url_field] = _url_cleaned - _fixup_written = True - - # Apply publisher corrections - _pub_journal_bl = (_bl_fields.get("journal") or "").lower() - if _pub_journal_bl: - for _pub_jnl_key, _pub_correct in PUBLISHER_CORRECTIONS.items(): - if _pub_jnl_key in _pub_journal_bl: - _cur_pub_bl = _bl_fields.get("publisher", "") - if _cur_pub_bl and _cur_pub_bl != _pub_correct: - _bl_fields["publisher"] = _pub_correct - _fixup_written = True # Delete entries where title equals journal or booktitle (corrupted Scholar data) _bl_title_venue = (_bl_fields.get("title") or "").strip().lower() @@ -853,56 +434,6 @@ def process_article( os.remove(existing_file_path) return 0 - # Remove preprint DOI from @article that has a real journal+volume/pages - if ( - baseline_entry.get("type") == "article" - and _bl_fields.get("journal") - and _bl_fields.get("doi") - and idu.is_secondary_doi(_bl_fields["doi"]) - and (_bl_fields.get("volume") or _bl_fields.get("pages")) - ): - logger.debug( - f"EXISTING_FIXUP | remove_preprint_doi_from_article" - f" | doi={_bl_fields['doi']} | journal={_bl_fields['journal'][:40]}", - category=LogCategory.CLEANUP, - ) - _bl_fields.pop("doi", None) - _bl_fields.pop("url", None) - _fixup_written = True - - # Backfill howpublished for @misc with preprint DOI or arXiv eprint - if baseline_entry.get("type") == "misc" and not _bl_fields.get("howpublished"): - _bl_doi_hp = (_bl_fields.get("doi") or "").strip() - _inferred_hp = mu.infer_howpublished_from_doi(_bl_doi_hp) if _bl_doi_hp else None - if _inferred_hp: - _bl_fields["howpublished"] = _inferred_hp - _fixup_written = True - elif (_bl_fields.get("archiveprefix") or "").lower() == "arxiv": - _bl_fields["howpublished"] = "arXiv" - _fixup_written = True - - # Fix author casing (lowercase, ALL-CAPS, capital "And" separators) - _bl_auth2 = _bl_fields.get("author", "") - if isinstance(_bl_auth2, str) and _bl_auth2: - _auth2_fixed, _auth2_changed = mu._fix_author_casing(_bl_auth2) - if _auth2_changed: - _bl_fields["author"] = _auth2_fixed - logger.debug( - f"EXISTING_FIXUP | author_casing_fixed | old={_bl_auth2[:60]}", - category=LogCategory.CLEANUP, - ) - _fixup_written = True - - # Normalize howpublished casing - _bl_hp_before = (_bl_fields.get("howpublished") or "").strip() - mu._normalize_howpublished(_bl_fields) - if _bl_fields.get("howpublished", "") != _bl_hp_before and _bl_hp_before: - logger.debug( - f"EXISTING_FIXUP | howpublished_casing | {_bl_hp_before}->{_bl_fields['howpublished']}", - category=LogCategory.CLEANUP, - ) - _fixup_written = True - # Escape bare & in field values (bibtex_from_dict handles this on write, # but we need to trigger a rewrite for files that were never re-serialized) for _fk, _fv in _bl_fields.items(): diff --git a/src/canonicalize.py b/src/canonicalize.py index b3c3619c..45fd7c16 100644 --- a/src/canonicalize.py +++ b/src/canonicalize.py @@ -50,6 +50,11 @@ class CanonicalStage(Enum): _US_PATENT_RE = re.compile(r"(?i)^US\s+Patent") _BRACKET_J_RE = re.compile(r"\s*\[J\]\s*$") _URL_BOOKTITLE_RE = re.compile(r"^https?://|^[\w.-]+\.(com|org|net|io|press)\b", re.IGNORECASE) +# Site-B (load-repair) email-in-author strip patterns. +_EMAIL_SEARCH_RE = re.compile(r"\S+@\S+\.\S+") +_EMAIL_STRIP_RE = re.compile(r"\s*\S+@\S+\.\S+") +_AUTHOR_AND_TRAIL_RE = re.compile(r"\s*and\s*$") +_AUTHOR_AND_LEAD_RE = re.compile(r"^\s*and\s*") # Repeated string literals used in the shared fixups _GECCO_LOWER = "genetic and evolutionary computation conference" @@ -436,6 +441,102 @@ def _rule_add_url_from_doi(entry: dict[str, Any], fields: dict[str, Any]) -> boo return False +# --------------------------------------------------------------------------- +# Site-B-only rules (load repair; existing-file fixup before enrichment) +# --------------------------------------------------------------------------- +def _rule_strip_preprint_journal_load(entry: dict[str, Any], fields: dict[str, Any]) -> bool: + """Strip a preprint-server journal: @article -> @misc (journal -> howpublished); + any other type simply drops the journal.""" + jnl = (fields.get("journal") or "").strip().lower() + if jnl and any(ps == jnl or ps in jnl for ps in PREPRINT_SERVERS): + if entry.get("type") == "article": + fields["howpublished"] = fields.pop("journal") + entry["type"] = "misc" + else: + fields.pop("journal", None) + return True + return False + + +def _rule_strip_email_from_author(entry: dict[str, Any], fields: dict[str, Any]) -> bool: + """Strip email addresses (and dangling "and" separators) from the author field.""" + author = fields.get("author", "") + if isinstance(author, str) and _EMAIL_SEARCH_RE.search(author): + cleaned = _EMAIL_STRIP_RE.sub("", author).strip() + cleaned = _AUTHOR_AND_TRAIL_RE.sub("", cleaned).strip() + cleaned = _AUTHOR_AND_LEAD_RE.sub("", cleaned).strip() + if cleaned: + fields["author"] = cleaned + return True + return False + + +def _rule_strip_bracket_j_title(entry: dict[str, Any], fields: dict[str, Any]) -> bool: + """Strip a trailing "[J]" bracket artifact from the title.""" + title = fields.get("title", "") + if isinstance(title, str) and _BRACKET_J_RE.search(title): + fields["title"] = _BRACKET_J_RE.sub("", title).strip() + return True + return False + + +def _rule_strip_trailing_dash_title(entry: dict[str, Any], fields: dict[str, Any]) -> bool: + """Strip a trailing " -"/en-dash truncation artifact from the title only.""" + title = (fields.get("title") or "").strip() + if title and _TRAILING_DASH_RE.search(title): + fields["title"] = _TRAILING_DASH_RE.sub("", title) + return True + return False + + +def _rule_trim_caps_title(entry: dict[str, Any], fields: dict[str, Any]) -> bool: + """Normalize ALL-CAPS / truncated titles via the default title trimmer.""" + title = fields.get("title", "") + if isinstance(title, str) and title: + fixed = trim_title_default(title) + if fixed != title: + fields["title"] = fixed + return True + return False + + +def _rule_unpublished_to_misc_load(entry: dict[str, Any], fields: dict[str, Any]) -> bool: + """@article with "Unpublished" journal -> @misc (drops journal AND publisher).""" + if entry.get("type") == "article" and fields.get("journal") and fields["journal"].strip().lower() == "unpublished": + fields.pop("journal", None) + fields.pop("publisher", None) + entry["type"] = "misc" + return True + return False + + +def _rule_strip_secondary_doi_from_article_load(entry: dict[str, Any], fields: dict[str, Any]) -> bool: + """Strip a preprint (secondary) DOI/URL from an @article that already has a + real journal plus volume/pages (keeps the entry as @article).""" + if ( + entry.get("type") == "article" + and fields.get("journal") + and fields.get("doi") + and idu.is_secondary_doi(fields["doi"]) + and (fields.get("volume") or fields.get("pages")) + ): + fields.pop("doi", None) + fields.pop("url", None) + return True + return False + + +def _rule_fix_author_casing_load(entry: dict[str, Any], fields: dict[str, Any]) -> bool: + """Fix author casing, gating on the modification flag from _fix_author_casing.""" + auth = fields.get("author", "") + if isinstance(auth, str) and auth: + auth_fixed, auth_changed = mu._fix_author_casing(auth) + if auth_changed: + fields["author"] = auth_fixed + return True + return False + + # --------------------------------------------------------------------------- # Site-C-only rules (Phase-4 post-merge; POST_MERGE is terminal) # --------------------------------------------------------------------------- @@ -676,7 +777,56 @@ def _rule_howpublished_to_inproceedings(entry: dict[str, Any], fields: dict[str, _rule_howpublished_to_inproceedings, ) +# Site B (existing-file load repair, before enrichment). Reproduces the inline +# process_article() fixup block's exact rule subset and order. NOTE: this is Site +# B's current subset, NOT the union with Site C: complete entries run Site B and +# return before ever reaching Site C, so C-only terminal rules (e.g. R13 +# url-booktitle->misc, R20 misc->inproceedings, article-no-journal->misc) are +# deliberately ABSENT here. The destructive title==venue delete (N22) and the +# bare-& rewrite trigger stay in main.py around the canonicalize() call. +_LOAD_REPAIR_RULES = ( + _rule_strip_preprint_journal_load, + _rule_strip_email_from_author, + _rule_strip_bracket_j_title, + _rule_strip_ellipsis_venues, + _rule_expand_abbreviated_venue, + _rule_venue_case_corrections, + _rule_strip_publisher_duplicate, + _rule_strip_trailing_dash_title, + _rule_strip_subtitle_wrapper_title, + _rule_strip_spire_suffix, + _rule_strip_osf_doi_version, + _rule_fix_zentrum_umlaut, + _rule_strip_lipics_pages, + _rule_strip_proceedings_wrapper, + _rule_trim_caps_title, + _rule_conference_journal_to_inproceedings, + _rule_unpublished_to_misc_load, + _rule_patent_to_misc, + _rule_repo_journal_to_misc, + _rule_university_to_phdthesis, + _rule_procedia_to_inproceedings, + _rule_pacm_booktitle_to_article, + _rule_named_proceedings_to_article, + _rule_institutional_repo_to_phdthesis, + _rule_repo_booktitle_to_misc, + _rule_preprint_booktitle_to_misc, + _rule_journal_prefix_to_article, + _rule_handbook_to_incollection, + _rule_book_chapter_doi_to_incollection, + _rule_strip_preprint_marker_title, + _rule_fix_title_text, + _rule_booktitle_fixups, + _rule_strip_urls_in_venue, + _rule_publisher_corrections, + _rule_strip_secondary_doi_from_article_load, + _rule_backfill_howpublished, + _rule_fix_author_casing_load, + _rule_normalize_howpublished, +) + _STAGE_RULES = { + CanonicalStage.LOAD_REPAIR: _LOAD_REPAIR_RULES, CanonicalStage.POST_MERGE: _POST_MERGE_RULES, CanonicalStage.POSTRUN_ORPHAN_REPAIR: _POSTRUN_ORPHAN_REPAIR_RULES, } diff --git a/tests/test_canonicalize.py b/tests/test_canonicalize.py index 298f4cdf..c1188495 100644 --- a/tests/test_canonicalize.py +++ b/tests/test_canonicalize.py @@ -20,6 +20,13 @@ ) +def _load_repair(entry: dict[str, Any]) -> dict[str, Any]: + """Run LOAD_REPAIR canonicalize on a copy and return the mutated copy.""" + e = copy.deepcopy(entry) + canonicalize(e, stage=CanonicalStage.LOAD_REPAIR) + return e + + def _article(**fields: str) -> dict[str, Any]: """Build a minimal @article entry with the given extra fields.""" etype = fields.pop("type", "article") @@ -147,3 +154,129 @@ def test_post_merge_is_fixpoint_on_corpus() -> None: if entry["type"] != snapshot["type"] or entry["fields"] != snapshot["fields"]: non_fixpoint.append(bib_path) assert not non_fixpoint, f"POST_MERGE not a data fixpoint for: {non_fixpoint[:10]}" + + +# --------------------------------------------------------------------------- +# Per-rule tests at LOAD_REPAIR (Site B) + proof C-only rules are ABSENT +# --------------------------------------------------------------------------- +def test_load_repair_unpublished_to_misc_drops_publisher() -> None: + """LOAD_REPAIR "Unpublished" journal -> @misc, dropping BOTH journal and publisher. + + This diverges from POST_MERGE (which keeps publisher), so it must be its own rule. + """ + result = _load_repair(_article(journal="Unpublished", publisher="Some Press")) + assert result["type"] == "misc" + assert "journal" not in result["fields"] + assert "publisher" not in result["fields"] + + +def test_load_repair_patent_to_misc() -> None: + """LOAD_REPAIR @article with a US patent number as journal -> @misc (journal -> note).""" + result = _load_repair(_article(journal="US Patent 10,123,456")) + assert result["type"] == "misc" + assert result["fields"]["note"] == "US Patent 10,123,456" + assert "journal" not in result["fields"] + + +def test_load_repair_strips_email_from_author() -> None: + """LOAD_REPAIR strips an email address (and a dangling separator) from the author field.""" + result = _load_repair(_article(author="Jane Doe jane@x.org and John Roe")) + assert result["fields"]["author"] == "Jane Doe and John Roe" + + +def test_load_repair_strips_bracket_j_title() -> None: + """LOAD_REPAIR strips a trailing "[J]" bracket artifact from the title.""" + result = _load_repair(_article(title="A Study of Neural Networks [J]")) + assert result["fields"]["title"] == "A Study of Neural Networks" + + +def test_load_repair_strip_secondary_doi_keeps_article() -> None: + """LOAD_REPAIR strips the preprint DOI/URL when journal + volume/pages exist, + keeping the entry as @article (mirrors POST_MERGE R19 keep-branch).""" + result = _load_repair( + _article( + journal="Real Journal", + doi="10.48550/arXiv.2101.00002", + volume="12", + pages="1-10", + url="https://arxiv.org/abs/2101.00002", + ) + ) + assert result["type"] == "article" + assert result["fields"]["journal"] == "Real Journal" + assert "doi" not in result["fields"] + assert "url" not in result["fields"] + + +def test_load_repair_secondary_doi_misc_branch_absent() -> None: + """C-only R19 misc-downgrade is ABSENT at LOAD_REPAIR: an @article with a + preprint DOI but no volume/pages is left unchanged (still @article, DOI kept). + + POST_MERGE would downgrade this to @misc; LOAD_REPAIR must not. + """ + entry = _article(journal="Journal of Foo", doi="10.48550/arXiv.2101.00001") + result = _load_repair(entry) + assert result["type"] == "article" + assert result["fields"]["journal"] == "Journal of Foo" + assert result["fields"]["doi"] == "10.48550/arXiv.2101.00001" + # Contrast: POST_MERGE moves it out of @article (downgrade then R20 upgrade), + # so LOAD_REPAIR's keep-as-article behavior is genuinely distinct. + post = _canon(entry) + assert post["type"] != "article" + assert "journal" not in post["fields"] + + +def test_load_repair_r20_misc_howpublished_absent() -> None: + """C-only R20 (misc howpublished -> @inproceedings) is ABSENT at LOAD_REPAIR: + a @misc with a conference howpublished stays @misc (POST_MERGE would upgrade it).""" + entry = _article(type="misc", howpublished="International Conference on Learning Representations") + result = _load_repair(entry) + assert result["type"] == "misc" + assert result["fields"]["howpublished"] == "International Conference on Learning Representations" + assert "booktitle" not in result["fields"] + # Contrast: POST_MERGE upgrades the same entry to @inproceedings. + assert _canon(entry)["type"] == "inproceedings" + + +def test_load_repair_r13_url_booktitle_absent() -> None: + """C-only R13 (url-fragment booktitle -> @misc) is ABSENT at LOAD_REPAIR: + an @inproceedings with a URL booktitle stays @inproceedings (POST_MERGE -> @misc).""" + entry = _article(type="inproceedings", booktitle="https://foo.example/paper") + result = _load_repair(entry) + assert result["type"] == "inproceedings" + assert "booktitle" in result["fields"] + # Contrast: POST_MERGE downgrades the same entry to @misc. + assert _canon(entry)["type"] == "misc" + + +def test_load_repair_article_no_journal_stays_article() -> None: + """C-only terminal (article-with-no-journal -> @misc) is ABSENT at LOAD_REPAIR: + a bare @article without a journal is left as @article (POST_MERGE -> @misc).""" + entry = _article() # title/author/year only, no journal + result = _load_repair(entry) + assert result["type"] == "article" + # Contrast: POST_MERGE downgrades a journal-less @article to @misc. + assert _canon(entry)["type"] == "misc" + + +# --------------------------------------------------------------------------- +# Corpus idempotency: LOAD_REPAIR is a data fixpoint (second pass = no change) +# --------------------------------------------------------------------------- +def test_load_repair_is_fixpoint_on_corpus() -> None: + """Applying LOAD_REPAIR twice yields identical type + fields for every committed + output/**/*.bib (a second pass is a strict data fixpoint).""" + files = sorted(glob.glob("output/**/*.bib", recursive=True)) + if not files: + pytest.skip("no committed output corpus present") + non_fixpoint: list[str] = [] + for bib_path in files: + with open(bib_path, encoding="utf-8") as fh: + entry = parse_bibtex_to_dict(fh.read()) + if entry is None: + continue + canonicalize(entry, stage=CanonicalStage.LOAD_REPAIR) + snapshot = copy.deepcopy(entry) + canonicalize(entry, stage=CanonicalStage.LOAD_REPAIR) + if entry["type"] != snapshot["type"] or entry["fields"] != snapshot["fields"]: + non_fixpoint.append(bib_path) + assert not non_fixpoint, f"LOAD_REPAIR not a data fixpoint for: {non_fixpoint[:10]}" From fa4daaed4f2cf4cf49496d7f0d0e68aea6abc798 Mon Sep 17 00:00:00 2001 From: Gabriel Spadon Date: Wed, 1 Jul 2026 16:05:39 -0300 Subject: [PATCH 21/54] refactor: fold complete-skip finalize into canonicalize(COMPLETE_SKIP_FINALIZE) Single-source the last live complete-entry quick-fixup (strip leaked preprint-only publisher when journal is a genuine venue) as a canonicalize rule. Delete the unreachable @article+secondary-doi->@misc quick-fixup (the _entry_is_complete gate makes its guard provably always false). Tier2 path applies no canonicalization rules (pure field-fill plus validation) and stays inline. --- main.py | 31 ++++++---------- src/canonicalize.py | 28 +++++++++++++++ tests/test_canonicalize.py | 72 ++++++++++++++++++++++++++++++++++++-- 3 files changed, 108 insertions(+), 23 deletions(-) diff --git a/main.py b/main.py index 035c2bb4..149414a7 100644 --- a/main.py +++ b/main.py @@ -59,7 +59,6 @@ MAX_PUBLICATIONS_PER_AUTHOR, MAX_WORKERS, MIN_TITLE_WORDS, - PREPRINT_ONLY_PUBLISHERS, PREPRINT_SERVERS, PUB_PARSE_TIER1_MIN_CONFIDENCE, PUB_PARSE_TIER2_MIN_CONFIDENCE, @@ -447,34 +446,24 @@ def process_article( # Skip enrichment entirely if entry is already complete (unless --force) if not FORCE_ENRICH and existing_file_loaded and baseline_entry is not None and _entry_is_complete(baseline_entry): - # Quick fixup: strip preprint-only publishers from complete entries + # Quick fixup: strip preprint-only publishers from complete entries. + # Single-sourced in canonicalize() at the COMPLETE_SKIP_FINALIZE stage; the + # debug log and write-gating stay here so the skip-path I/O is unchanged. bl_fields = baseline_entry.get("fields") or {} - bl_pub = (bl_fields.get("publisher") or "").lower().strip() - bl_jnl = (bl_fields.get("journal") or "").lower() - if bl_pub in PREPRINT_ONLY_PUBLISHERS and bl_jnl and not any(ps in bl_jnl for ps in PREPRINT_SERVERS): + _pub_before = bl_fields.get("publisher") + if canonicalize(baseline_entry, stage=CanonicalStage.COMPLETE_SKIP_FINALIZE): logger.debug( - f"EXISTING_FIXUP | publisher_stripped={bl_fields['publisher']} | journal={bl_fields.get('journal')}", + f"EXISTING_FIXUP | publisher_stripped={_pub_before} | journal={bl_fields.get('journal')}", category=LogCategory.CLEANUP, ) - bl_fields.pop("publisher", None) if existing_file_path: bib_str = bt.bibtex_from_dict(baseline_entry) safe_write_file(existing_file_path, bib_str) - # Quick fixup: downgrade @article with preprint DOI -> @misc - bl_doi = (bl_fields.get("doi") or "").strip() - if baseline_entry.get("type") == "article" and bl_doi and idu.is_secondary_doi(bl_doi): - venue = bl_fields.get("journal", "") - logger.debug( - f"EXISTING_FIXUP | article_preprint_doi->misc | doi={bl_doi} | venue={venue}", - category=LogCategory.CLEANUP, - ) - baseline_entry["type"] = "misc" - if venue: - bl_fields["howpublished"] = bl_fields.pop("journal") - if existing_file_path: - bib_str = bt.bibtex_from_dict(baseline_entry) - safe_write_file(existing_file_path, bib_str) + # NOTE: the former "@article with a preprint DOI -> @misc" quick-fixup was + # removed here as unreachable dead code: _entry_is_complete() (the guard + # above) only returns True for a NON-preprint DOI, so is_secondary_doi() on + # the same field can never be True on this skip-enrichment path. logger.info("Entry already complete; skipping enrichment", category=LogCategory.SKIP, source=LogSource.SYSTEM) if summary_csv_path and existing_file_path: diff --git a/src/canonicalize.py b/src/canonicalize.py index 45fd7c16..f4ed79ec 100644 --- a/src/canonicalize.py +++ b/src/canonicalize.py @@ -12,6 +12,7 @@ INSTITUTIONAL_REPOSITORIES, JOURNAL_ONLY_PREFIXES, JOURNALS_NAMED_PROCEEDINGS, + PREPRINT_ONLY_PUBLISHERS, PREPRINT_SERVERS, PROCEEDINGS_SERIES_AS_JOURNAL, PUBLISHER_CORRECTIONS, @@ -701,6 +702,25 @@ def _rule_howpublished_to_inproceedings(entry: dict[str, Any], fields: dict[str, return False +# --------------------------------------------------------------------------- +# COMPLETE_SKIP_FINALIZE-only rules (complete entries that skip enrichment) +# --------------------------------------------------------------------------- +def _rule_strip_preprint_only_publisher(entry: dict[str, Any], fields: dict[str, Any]) -> bool: + """Strip a preprint-only publisher leaked onto a complete, real-venue entry. + + Fires only when the publisher is a preprint-exclusive imprint AND the journal + is a genuine (non-preprint-server) venue. Distinct from + ``_rule_strip_publisher_duplicate`` (publisher == container) and from the + preprint-server *journal* rules (which move the journal, not the publisher). + """ + pub = (fields.get("publisher") or "").lower().strip() + jnl = (fields.get("journal") or "").lower() + if pub in PREPRINT_ONLY_PUBLISHERS and jnl and not any(ps in jnl for ps in PREPRINT_SERVERS): + fields.pop("publisher", None) + return True + return False + + # --------------------------------------------------------------------------- # Per-stage ordered rule sequences # --------------------------------------------------------------------------- @@ -825,8 +845,16 @@ def _rule_howpublished_to_inproceedings(entry: dict[str, Any], fields: dict[str, _rule_normalize_howpublished, ) +# COMPLETE_SKIP_FINALIZE (complete entry, enrichment skipped). Folds the single +# live "quick fixup" that ran just before the skip-path write: strip a leaked +# preprint-only publisher. The former "@article + preprint DOI -> @misc" +# quick-fixup that sat alongside it was DEAD CODE (unreachable: _entry_is_complete +# only admits NON-preprint DOIs) and is intentionally NOT reproduced here. +_COMPLETE_SKIP_FINALIZE_RULES = (_rule_strip_preprint_only_publisher,) + _STAGE_RULES = { CanonicalStage.LOAD_REPAIR: _LOAD_REPAIR_RULES, + CanonicalStage.COMPLETE_SKIP_FINALIZE: _COMPLETE_SKIP_FINALIZE_RULES, CanonicalStage.POST_MERGE: _POST_MERGE_RULES, CanonicalStage.POSTRUN_ORPHAN_REPAIR: _POSTRUN_ORPHAN_REPAIR_RULES, } diff --git a/tests/test_canonicalize.py b/tests/test_canonicalize.py index c1188495..9e7150b2 100644 --- a/tests/test_canonicalize.py +++ b/tests/test_canonicalize.py @@ -1,7 +1,8 @@ """Tests for the stage-parameterized canonicalize() dispatch. -Covers per-rule behavior at CanonicalStage.POST_MERGE (Site C) and proves the -POST_MERGE rule set is a data fixpoint on the committed corpus (no oscillation). +Covers per-rule behavior at CanonicalStage.POST_MERGE (Site C), LOAD_REPAIR +(Site B), and COMPLETE_SKIP_FINALIZE (complete-entry skip path), and proves each +rule set is a data fixpoint on the committed corpus (no oscillation). """ from __future__ import annotations @@ -42,6 +43,13 @@ def _canon(entry: dict[str, Any]) -> dict[str, Any]: return e +def _complete_finalize(entry: dict[str, Any]) -> dict[str, Any]: + """Run COMPLETE_SKIP_FINALIZE canonicalize on a copy and return the mutated copy.""" + e = copy.deepcopy(entry) + canonicalize(e, stage=CanonicalStage.COMPLETE_SKIP_FINALIZE) + return e + + # --------------------------------------------------------------------------- # Per-rule tests at POST_MERGE # --------------------------------------------------------------------------- @@ -280,3 +288,63 @@ def test_load_repair_is_fixpoint_on_corpus() -> None: if entry["type"] != snapshot["type"] or entry["fields"] != snapshot["fields"]: non_fixpoint.append(bib_path) assert not non_fixpoint, f"LOAD_REPAIR not a data fixpoint for: {non_fixpoint[:10]}" + + +# --------------------------------------------------------------------------- +# Per-rule tests at COMPLETE_SKIP_FINALIZE (complete entry, enrichment skipped) +# --------------------------------------------------------------------------- +def test_complete_finalize_strips_preprint_only_publisher() -> None: + """The single live rule: strip a preprint-only publisher off a real-venue entry.""" + result = _complete_finalize(_article(journal="Real Journal", publisher="Cold Spring Harbor Laboratory")) + assert "publisher" not in result["fields"] + assert result["fields"]["journal"] == "Real Journal" + + +def test_complete_finalize_keeps_publisher_when_journal_is_preprint() -> None: + """Guard: do NOT strip when the journal is itself a preprint server.""" + result = _complete_finalize(_article(journal="arXiv", publisher="Cold Spring Harbor Laboratory")) + assert result["fields"]["publisher"] == "Cold Spring Harbor Laboratory" + + +def test_complete_finalize_keeps_normal_publisher() -> None: + """A publisher that is not preprint-exclusive is left untouched.""" + result = _complete_finalize(_article(journal="Real Journal", publisher="Springer")) + assert result["fields"]["publisher"] == "Springer" + + +def test_complete_finalize_dead_preprint_doi_rule_removed() -> None: + """The removed dead rule (@article + secondary DOI -> @misc) is gone. + + _entry_is_complete() only admits NON-preprint DOIs, so that quick-fixup could + never fire on this path. Prove its removal is inert: a complete-shaped entry + carrying a preprint DOI (and no preprint-only publisher) passes through + COMPLETE_SKIP_FINALIZE completely unchanged (no @misc downgrade, DOI kept, + no howpublished manufactured). + """ + entry = _article(journal="Real Journal", doi="10.48550/arXiv.2101.00003") + assert canonicalize(copy.deepcopy(entry), stage=CanonicalStage.COMPLETE_SKIP_FINALIZE) is False + result = _complete_finalize(entry) + assert result["type"] == "article" + assert result["fields"]["doi"] == "10.48550/arXiv.2101.00003" + assert result["fields"]["journal"] == "Real Journal" + assert "howpublished" not in result["fields"] + + +def test_complete_finalize_is_fixpoint_on_corpus() -> None: + """Applying COMPLETE_SKIP_FINALIZE twice yields identical type + fields for every + committed output/**/*.bib (a second pass is a strict data fixpoint).""" + files = sorted(glob.glob("output/**/*.bib", recursive=True)) + if not files: + pytest.skip("no committed output corpus present") + non_fixpoint: list[str] = [] + for bib_path in files: + with open(bib_path, encoding="utf-8") as fh: + entry = parse_bibtex_to_dict(fh.read()) + if entry is None: + continue + canonicalize(entry, stage=CanonicalStage.COMPLETE_SKIP_FINALIZE) + snapshot = copy.deepcopy(entry) + canonicalize(entry, stage=CanonicalStage.COMPLETE_SKIP_FINALIZE) + if entry["type"] != snapshot["type"] or entry["fields"] != snapshot["fields"]: + non_fixpoint.append(bib_path) + assert not non_fixpoint, f"COMPLETE_SKIP_FINALIZE not a data fixpoint for: {non_fixpoint[:10]}" From 86b114ab2b6f582716ccc3905e977abbd4439f37 Mon Sep 17 00:00:00 2001 From: Gabriel Spadon Date: Wed, 1 Jul 2026 16:10:14 -0300 Subject: [PATCH 22/54] refactor: replace src/fixup patch-package with src/textnorm layer Flatten the two-file src/fixup package (patterns + text, empty __init__) into a single src/textnorm module: a coherent title/booktitle text-normalization layer the canonicalization engine builds on, rather than a bolt-on 'fixup' package. Byte-neutral relocation (same compiled patterns, same functions); pattern dictionaries still sourced from src.config. --- main.py | 10 +-- src/canonicalize.py | 2 +- src/fixup/__init__.py | 1 - src/fixup/text.py | 110 ------------------------- src/{fixup/patterns.py => textnorm.py} | 93 ++++++++++++++++++++- 5 files changed, 96 insertions(+), 120 deletions(-) delete mode 100644 src/fixup/__init__.py delete mode 100644 src/fixup/text.py rename src/{fixup/patterns.py => textnorm.py} (58%) diff --git a/main.py b/main.py index 149414a7..c8b7b85c 100644 --- a/main.py +++ b/main.py @@ -77,11 +77,6 @@ FULL_OPERATION_ERRORS, PARSE_ERRORS, ) -from src.fixup.text import ( - _fix_fused_compounds, # noqa: F401 - _is_corrupted_title, - _is_garbage_title, -) from src.fsscan import iter_author_bibs, iter_output_dirs from src.http_utils import get_api_call_counts, http_get_text, reset_api_call_counts from src.io_utils import ( @@ -111,6 +106,11 @@ title_similarity, trim_title_default, ) +from src.textnorm import ( + _fix_fused_compounds, # noqa: F401 + _is_corrupted_title, + _is_garbage_title, +) FORCE_ENRICH = "--force" in sys.argv[1:] diff --git a/src/canonicalize.py b/src/canonicalize.py index f4ed79ec..720601d2 100644 --- a/src/canonicalize.py +++ b/src/canonicalize.py @@ -19,9 +19,9 @@ REPOSITORY_AS_JOURNAL, VENUE_CASE_CORRECTIONS, ) -from src.fixup.text import _apply_booktitle_fixups, _fix_title_text from src.publication_parser import _strip_ellipsis from src.text_utils import trim_title_default +from src.textnorm import _apply_booktitle_fixups, _fix_title_text class CanonicalStage(Enum): diff --git a/src/fixup/__init__.py b/src/fixup/__init__.py deleted file mode 100644 index 7b61f3ad..00000000 --- a/src/fixup/__init__.py +++ /dev/null @@ -1 +0,0 @@ -"""Fix-pattern tables and shared text-transform helpers extracted from main.py.""" diff --git a/src/fixup/text.py b/src/fixup/text.py deleted file mode 100644 index af68c242..00000000 --- a/src/fixup/text.py +++ /dev/null @@ -1,110 +0,0 @@ -"""Shared title and booktitle text-transform helpers. - -Relocated verbatim from main.py. Pure functions over the pre-compiled patterns in -src.fixup.patterns. No dependency on main (no import cycle). -""" - -from __future__ import annotations - -import re - -from src.fixup.patterns import ( - _ACRONYM_CASE_PATTERNS, - _BOOKTITLE_FIXUPS, - _COLON_SPACE_RE, - _COMPOUND_SUFFIX_PATTERNS, - _FUSED_DICT_PATTERNS, - _GARBAGE_CORRECTION_RE, - _GARBAGE_DEPT_RE, - _GARBAGE_EASYCHAIR_RE, - _GARBAGE_EMAIL_RE, - _GARBAGE_FESTSCHRIFT_META_RE, - _GARBAGE_FESTSCHRIFT_RE, - _GARBAGE_PHONE_RE, - _GARBAGE_POSTAL_RE, - _GARBAGE_PROCEEDINGS_RE, - _GARBAGE_SERIES_VOL_RE, - _GARBAGE_VOLUME_RE, - _HYPHEN_SPACE_RE, - _SPACE_HYPHEN_RE, - _VERBOSE_BOOKTITLE_RE, -) - - -def _apply_booktitle_fixups(bt: str) -> str: - """Strip verbose conference metadata and apply pre-compiled booktitle cleanup patterns.""" - if _VERBOSE_BOOKTITLE_RE.search(bt): - stripped = _VERBOSE_BOOKTITLE_RE.sub("", bt).rstrip(" ,") - if stripped: - bt = stripped - for pat, repl in _BOOKTITLE_FIXUPS: - bt = pat.sub(repl, bt) - return bt - - -def _fix_title_text(title: str) -> str: - """Fix fused compounds, colon-space, hyphen-space, and acronym case.""" - result = _fix_fused_compounds(title) - result = _COLON_SPACE_RE.sub(r"\1: \2", result) - result = _HYPHEN_SPACE_RE.sub(r"\1-", result) - result = _SPACE_HYPHEN_RE.sub(r"\1-\2", result) - for acr_pat, acr_repl in _ACRONYM_CASE_PATTERNS: - result = acr_pat.sub(acr_repl, result) - return result - - -def _is_garbage_title(title: str) -> bool: - """Detect non-bibliographic titles from Scholar/DBLP artifacts. - - Catches institutional addresses, contact info, and other metadata - that occasionally appear as "paper titles" in Scholar results. - """ - if not title: - return False - return bool( - _GARBAGE_EMAIL_RE.search(title) - or _GARBAGE_POSTAL_RE.search(title) - or _GARBAGE_DEPT_RE.search(title) - or _GARBAGE_PHONE_RE.search(title) - or _GARBAGE_VOLUME_RE.search(title) - or _GARBAGE_SERIES_VOL_RE.search(title) - or (_GARBAGE_FESTSCHRIFT_RE.search(title) and _GARBAGE_FESTSCHRIFT_META_RE.search(title)) - or _GARBAGE_PROCEEDINGS_RE.match(title) - or _GARBAGE_CORRECTION_RE.match(title) - or _GARBAGE_EASYCHAIR_RE.search(title) - ) - - -def _is_corrupted_title(title: str) -> bool: - """Detect DBLP-corrupted titles containing author names instead of real titles. - - Matches patterns like "Li2 ()" -- author name + numeric affiliation + empty parens. - """ - return len(re.findall(r"\b[A-Z][a-z]+\d+\s*\(\)", title)) >= 2 - - -def _fix_fused_compounds(title: str) -> str: - """Fix fused compound words in titles (hyphens stripped by Google Scholar). - - Three-pass approach: - 1. Dictionary lookup for special cases (acronyms, irregular patterns). - 2. Suffix-based detection for common compound adjective suffixes - (e.g. "Knowledgedriven" → "Knowledge-Driven"). - 3. Dictionary lookup again — catches entries newly exposed by the suffix - pass (e.g. "Doubleedgeassisted" → suffix splits to "Doubleedge-Assisted" - → dict converts "Doubleedge" to "Double-Edge"). - """ - if not title: - return title - result = title - # Pass 1: Dictionary-based fixes (highest priority, handles acronyms & irregulars) - for pattern, replacement in _FUSED_DICT_PATTERNS: - result = pattern.sub(replacement, result) - # Pass 2: Suffix-based detection for remaining fused compounds. - # Matches title-cased words: [A-Z][a-z]{2,} prefix + known compound suffix. - for sfx_pat in _COMPOUND_SUFFIX_PATTERNS: - result = sfx_pat.sub(lambda m: m.group(1) + "-" + m.group(2).capitalize(), result) - # Pass 3: Dictionary again (suffix pass may expose new \b boundaries) - for pattern, replacement in _FUSED_DICT_PATTERNS: - result = pattern.sub(replacement, result) - return result diff --git a/src/fixup/patterns.py b/src/textnorm.py similarity index 58% rename from src/fixup/patterns.py rename to src/textnorm.py index 8e8e6ff7..a020d6f4 100644 --- a/src/fixup/patterns.py +++ b/src/textnorm.py @@ -1,7 +1,15 @@ -"""Pre-compiled fix-pattern tables and regexes for title and booktitle fixes. +"""Title and booktitle text-normalization primitives. -Relocated verbatim from main.py. Depends only on stdlib re and src.config, and is -imported by src.fixup.text. No dependency on main (no import cycle). +Pure functions over pre-compiled regex tables that repair recurrent metadata +defects in scholarly titles and booktitles: fused compound words (hyphens +stripped by Google Scholar), acronym casing, verbose conference metadata, +non-bibliographic "garbage" titles, and DBLP author-name corruption. + +Depends only on stdlib ``re`` and ``src.config`` (no dependency on ``main`` or +the pipeline), so the canonicalization layer and the orchestrator can both build +on it without an import cycle. Pattern data (compound-word and acronym-case +dictionaries) is sourced from ``src.config`` per the config-driven convention; +this module owns only the compiled matching logic. """ from __future__ import annotations @@ -95,3 +103,82 @@ # Truncated "\& International..." suffix → strip (re.compile(r"\s*\\?&\s*International$"), ""), ] + + +def _apply_booktitle_fixups(bt: str) -> str: + """Strip verbose conference metadata and apply pre-compiled booktitle cleanup patterns.""" + if _VERBOSE_BOOKTITLE_RE.search(bt): + stripped = _VERBOSE_BOOKTITLE_RE.sub("", bt).rstrip(" ,") + if stripped: + bt = stripped + for pat, repl in _BOOKTITLE_FIXUPS: + bt = pat.sub(repl, bt) + return bt + + +def _fix_title_text(title: str) -> str: + """Fix fused compounds, colon-space, hyphen-space, and acronym case.""" + result = _fix_fused_compounds(title) + result = _COLON_SPACE_RE.sub(r"\1: \2", result) + result = _HYPHEN_SPACE_RE.sub(r"\1-", result) + result = _SPACE_HYPHEN_RE.sub(r"\1-\2", result) + for acr_pat, acr_repl in _ACRONYM_CASE_PATTERNS: + result = acr_pat.sub(acr_repl, result) + return result + + +def _is_garbage_title(title: str) -> bool: + """Detect non-bibliographic titles from Scholar/DBLP artifacts. + + Catches institutional addresses, contact info, and other metadata + that occasionally appear as "paper titles" in Scholar results. + """ + if not title: + return False + return bool( + _GARBAGE_EMAIL_RE.search(title) + or _GARBAGE_POSTAL_RE.search(title) + or _GARBAGE_DEPT_RE.search(title) + or _GARBAGE_PHONE_RE.search(title) + or _GARBAGE_VOLUME_RE.search(title) + or _GARBAGE_SERIES_VOL_RE.search(title) + or (_GARBAGE_FESTSCHRIFT_RE.search(title) and _GARBAGE_FESTSCHRIFT_META_RE.search(title)) + or _GARBAGE_PROCEEDINGS_RE.match(title) + or _GARBAGE_CORRECTION_RE.match(title) + or _GARBAGE_EASYCHAIR_RE.search(title) + ) + + +def _is_corrupted_title(title: str) -> bool: + """Detect DBLP-corrupted titles containing author names instead of real titles. + + Matches patterns like "Li2 ()" -- author name + numeric affiliation + empty parens. + """ + return len(re.findall(r"\b[A-Z][a-z]+\d+\s*\(\)", title)) >= 2 + + +def _fix_fused_compounds(title: str) -> str: + """Fix fused compound words in titles (hyphens stripped by Google Scholar). + + Three-pass approach: + 1. Dictionary lookup for special cases (acronyms, irregular patterns). + 2. Suffix-based detection for common compound adjective suffixes + (e.g. "Knowledgedriven" → "Knowledge-Driven"). + 3. Dictionary lookup again — catches entries newly exposed by the suffix + pass (e.g. "Doubleedgeassisted" → suffix splits to "Doubleedge-Assisted" + → dict converts "Doubleedge" to "Double-Edge"). + """ + if not title: + return title + result = title + # Pass 1: Dictionary-based fixes (highest priority, handles acronyms & irregulars) + for pattern, replacement in _FUSED_DICT_PATTERNS: + result = pattern.sub(replacement, result) + # Pass 2: Suffix-based detection for remaining fused compounds. + # Matches title-cased words: [A-Z][a-z]{2,} prefix + known compound suffix. + for sfx_pat in _COMPOUND_SUFFIX_PATTERNS: + result = sfx_pat.sub(lambda m: m.group(1) + "-" + m.group(2).capitalize(), result) + # Pass 3: Dictionary again (suffix pass may expose new \b boundaries) + for pattern, replacement in _FUSED_DICT_PATTERNS: + result = pattern.sub(replacement, result) + return result From 43def58a3b70db52eaafec972f3f219cc0a9793b Mon Sep 17 00:00:00 2001 From: Gabriel Spadon Date: Wed, 1 Jul 2026 16:21:59 -0300 Subject: [PATCH 23/54] refactor: remove orphaned BibEntry domain type canonicalize() already delivers the end-to-end coherence BibEntry was added to provide; the dict {type,key,fields} is the single representation every consumer (merge, canonicalize, dedup, serialize) speaks. BibEntry had no production caller and its tests proved it a no-behavior facade, so it was dead scaffolding and a second normalization source. Remove it. --- src/entry.py | 83 ----------------------- tests/test_entry.py | 158 -------------------------------------------- 2 files changed, 241 deletions(-) delete mode 100644 src/entry.py delete mode 100644 tests/test_entry.py diff --git a/src/entry.py b/src/entry.py deleted file mode 100644 index c2e094e7..00000000 --- a/src/entry.py +++ /dev/null @@ -1,83 +0,0 @@ -from __future__ import annotations - -from dataclasses import dataclass -from typing import Any - -from .bibtex_utils import bibtex_from_dict, parse_bibtex_to_dict - - -@dataclass -class BibEntry: - """Typed wrapper over the dict shape used throughout the pipeline. - - This is a thin, byte-neutral facade over the existing - ``parse_bibtex_to_dict`` / ``bibtex_from_dict`` functions in - :mod:`src.bibtex_utils`. It introduces a domain type without changing any - parse or serialize behaviour; call sites are migrated onto it in later - steps. - - Invariants mirror ``parse_bibtex_to_dict`` semantics: - - - ``entry_type`` is stored lowercased (``"@Article"`` -> ``"article"``). - - ``fields`` keys are stored lowercased; field *values* are kept verbatim. - - ``key`` is stored case-preserved. - - Normalization happens in ``__post_init__`` so direct construction, - :meth:`from_dict`, and :meth:`from_bibtex` all yield the same invariants. - """ - - entry_type: str - key: str - fields: dict[str, str] - - def __post_init__(self) -> None: - # Normalize to match parse_bibtex_to_dict semantics. Rebuilding the - # fields mapping also yields a defensive copy of the caller's dict. - self.entry_type = (self.entry_type or "misc").lower() - self.key = self.key or "entry" - self.fields = {str(k).lower(): v for k, v in (self.fields or {}).items()} - - @classmethod - def from_bibtex(cls, text: str) -> BibEntry | None: - """Parse a BibTeX string into a ``BibEntry``. - - Delegates to ``parse_bibtex_to_dict``; returns ``None`` when the input - has no parseable entry header. The resulting entry is exactly - equivalent to the parsed dict (see :meth:`to_dict`). - """ - parsed = parse_bibtex_to_dict(text) - if parsed is None: - return None - return cls(entry_type=parsed["type"], key=parsed["key"], fields=parsed["fields"]) - - @classmethod - def from_dict(cls, entry: dict[str, Any]) -> BibEntry: - """Wrap an existing ``{"type", "key", "fields"}`` dict. - - Missing pieces default to ``type="misc"``, ``key="entry"``, - ``fields={}``. The ``fields`` mapping is defensively copied so later - mutation of the source dict does not leak into the entry. - """ - raw_fields = entry.get("fields") or {} - fields = {str(k): str(v) for k, v in dict(raw_fields).items()} - return cls( - entry_type=entry.get("type") or "misc", - key=entry.get("key") or "entry", - fields=fields, - ) - - def to_dict(self) -> dict[str, str | dict[str, str]]: - """Return the ``{"type", "key", "fields"}`` dict the pipeline expects. - - ``fields`` is a fresh copy, so mutating the returned mapping does not - affect this entry. - """ - return {"type": self.entry_type, "key": self.key, "fields": dict(self.fields)} - - def to_bibtex(self) -> str: - """Serialize back to BibTeX text via ``bibtex_from_dict``. - - Delegates for now; owning the serialization contract on this method is - a later migration step. - """ - return bibtex_from_dict(self.to_dict()) diff --git a/tests/test_entry.py b/tests/test_entry.py deleted file mode 100644 index ef57b0cc..00000000 --- a/tests/test_entry.py +++ /dev/null @@ -1,158 +0,0 @@ -from __future__ import annotations - -import pytest - -from src.bibtex_utils import bibtex_from_dict, parse_bibtex_to_dict -from src.entry import BibEntry - -# Representative BibTeX entries exercising the parse/serialize surface: -# an @article with doi/url, an @inproceedings with booktitle, an @misc, an -# entry carrying a non-preferred (unordered) field, and one with accented / -# LaTeX-formatted text to drive the ASCII normalization path. -ARTICLE_DOI_URL = """@article{Smith2020:Example, - title = {A Study of Something Interesting}, - author = {Smith, John and Doe, Jane}, - year = {2020}, - journal = {Journal of Examples}, - volume = {12}, - number = {3}, - pages = {100--120}, - doi = {10.1234/example.2020}, - url = {https://doi.org/10.1234/example.2020} -} -""" - -INPROCEEDINGS_BOOKTITLE = """@inproceedings{Doe2019:Conf, - title = {Fast Algorithms for Hard Problems}, - author = {Doe, Jane}, - year = {2019}, - booktitle = {Proceedings of the International Conference on Examples}, - pages = {1--10} -} -""" - -MISC_ENTRY = """@misc{Anon2021:Data, - title = {A Dataset of Things}, - author = {Anonymous}, - year = {2021}, - howpublished = {Online repository} -} -""" - -EXTRA_FIELD = """@article{Lee2022:Extra, - title = {On Extra Fields}, - author = {Lee, Kim}, - year = {2022}, - journal = {Extra Journal}, - keywords = {sorting, ordering}, - abstract = {We test non-preferred fields.} -} -""" - -ACCENTED_LATEX = """@article{Cafe2018:Accents, - title = {\\'{E}tude sur le caf\\'{e}: \\textit{une analyse} d\\'{e}taill\\'{e}e}, - author = {Mu\\~{n}oz, Jos\\'{e}}, - year = {2018}, - journal = {Revista Espa\\~{n}ola} -} -""" - -ALL_ENTRIES = [ - ARTICLE_DOI_URL, - INPROCEEDINGS_BOOKTITLE, - MISC_ENTRY, - EXTRA_FIELD, - ACCENTED_LATEX, -] - - -@pytest.mark.parametrize("text", ALL_ENTRIES) -def test_from_bibtex_to_bibtex_matches_reference(text: str) -> None: - """to_bibtex() must be byte-identical to the direct dict serialization.""" - parsed = parse_bibtex_to_dict(text) - assert parsed is not None - reference = bibtex_from_dict(parsed) - - entry = BibEntry.from_bibtex(text) - assert entry is not None - assert entry.to_bibtex() == reference - - -@pytest.mark.parametrize("text", ALL_ENTRIES) -def test_from_bibtex_to_dict_equals_parsed(text: str) -> None: - """to_dict() must reproduce the exact shape parse_bibtex_to_dict returns.""" - parsed = parse_bibtex_to_dict(text) - assert parsed is not None - - entry = BibEntry.from_bibtex(text) - assert entry is not None - assert entry.to_dict() == parsed - - -@pytest.mark.parametrize("text", ALL_ENTRIES) -def test_roundtrip_fixpoint(text: str) -> None: - """Re-parsing a serialized entry is an idempotent fixpoint. - - to_bibtex(from_bibtex(to_bibtex(from_bibtex(text)))) == - to_bibtex(from_bibtex(text)). - """ - - def _roundtrip(t: str) -> str: - entry = BibEntry.from_bibtex(t) - assert entry is not None - return entry.to_bibtex() - - once = _roundtrip(text) - twice = _roundtrip(once) - assert twice == once - - -def test_from_bibtex_returns_none_on_invalid() -> None: - assert BibEntry.from_bibtex("this is not a bibtex entry") is None - - -def test_from_dict_preserves_type_key_fields() -> None: - entry = BibEntry.from_dict({"type": "article", "key": "Smith2020", "fields": {"title": "Hello", "year": "2020"}}) - assert entry.entry_type == "article" - assert entry.key == "Smith2020" - assert entry.fields == {"title": "Hello", "year": "2020"} - assert entry.to_dict() == { - "type": "article", - "key": "Smith2020", - "fields": {"title": "Hello", "year": "2020"}, - } - - -def test_from_dict_defaults() -> None: - entry = BibEntry.from_dict({}) - assert entry.entry_type == "misc" - assert entry.key == "entry" - assert entry.fields == {} - - -def test_from_dict_lowercases_type_and_field_keys() -> None: - entry = BibEntry.from_dict( - {"type": "InProceedings", "key": "MixedCaseKey", "fields": {"Title": "T", "BookTitle": "B"}} - ) - # entry_type lowercased, field keys lowercased, key case-preserved. - assert entry.entry_type == "inproceedings" - assert entry.key == "MixedCaseKey" - assert entry.fields == {"title": "T", "booktitle": "B"} - - -def test_from_dict_defensive_copies_source_fields() -> None: - source = {"type": "misc", "key": "K", "fields": {"title": "Original"}} - entry = BibEntry.from_dict(source) - # Mutating the source dict's fields must not leak into the entry. - source["fields"]["title"] = "Changed" - assert entry.fields["title"] == "Original" - - -def test_to_dict_returns_defensive_copy() -> None: - entry = BibEntry.from_dict({"type": "misc", "key": "K", "fields": {"title": "Original"}}) - out = entry.to_dict() - fields_out = out["fields"] - assert isinstance(fields_out, dict) - fields_out["title"] = "Mutated" - # Mutating the returned dict must not change the entry. - assert entry.fields["title"] == "Original" From 151517e8b0d6f8e6c60d7dd2b710ed2c9994f126 Mon Sep 17 00:00:00 2001 From: Gabriel Spadon Date: Wed, 1 Jul 2026 16:32:35 -0300 Subject: [PATCH 24/54] refactor: drop dead POST_TIER2_VALIDATE canonicalize stage The tier2 path applies no canonicalization rules (pure field-fill plus validation) and is never routed through canonicalize(); the enum member only tripped the NotImplementedError guard. Remove it so every CanonicalStage maps to a wired rule tuple. --- src/canonicalize.py | 1 - 1 file changed, 1 deletion(-) diff --git a/src/canonicalize.py b/src/canonicalize.py index 720601d2..a9e855fc 100644 --- a/src/canonicalize.py +++ b/src/canonicalize.py @@ -28,7 +28,6 @@ class CanonicalStage(Enum): LOAD_REPAIR = "load_repair" COMPLETE_SKIP_FINALIZE = "complete_skip_finalize" POST_MERGE = "post_merge" - POST_TIER2_VALIDATE = "post_tier2_validate" POSTRUN_ORPHAN_REPAIR = "postrun_orphan_repair" From 733dae31d74fb32ae599ff62051a14aa192ad5c4 Mon Sep 17 00:00:00 2001 From: Gabriel Spadon Date: Wed, 1 Jul 2026 16:54:57 -0300 Subject: [PATCH 25/54] fix: contain malformed-200 API bodies as typed DecodeError A non-JSON 200 body (HTML gateway page) made _decode_json_bytes raise a bare ValueError that ALL_API_ERRORS did not catch, so the generic search path backing S2/Crossref/OpenAlex dropped the whole article instead of skipping one source. Introduce DecodeError(ValueError) in DECODE_ERRORS so every 'except ALL_API_ERRORS' client degrades gracefully; unrelated ValueErrors still propagate. Also scrub secrets in the _http_request fallback exception, the handle_api_errors debug log, and the decode preview so a new secret-bearing URL cannot leak (completes C2/C2b). --- src/exceptions.py | 13 +++++++++- src/http_utils.py | 15 ++++++----- tests/test_regression.py | 55 +++++++++++++++++++++++++++++++++------- 3 files changed, 67 insertions(+), 16 deletions(-) diff --git a/src/exceptions.py b/src/exceptions.py index 2ede8376..90de2eb1 100644 --- a/src/exceptions.py +++ b/src/exceptions.py @@ -25,6 +25,7 @@ "PARSE_ERRORS", "TIMEOUT_ERRORS", "XML_PARSE_ERRORS", + "DecodeError", ] # HTTP/URL request failures @@ -36,8 +37,18 @@ # network: HTTP + timeout + runtime NETWORK_ERRORS = HTTP_ERRORS + TIMEOUT_ERRORS + (RuntimeError,) + +class DecodeError(ValueError): + """Raised when an API returns an undecodable/non-JSON body (e.g. an HTML + gateway page under a 200). A ValueError subclass so existing + ``except ValueError`` sites keep catching it, while membership in + DECODE_ERRORS (hence ALL_API_ERRORS) lets every API client degrade + gracefully to a skipped source instead of dropping the whole article. + Unrelated ValueErrors are deliberately NOT caught by ALL_API_ERRORS.""" + + # text encoding/decoding -DECODE_ERRORS = (UnicodeDecodeError, UnicodeError) +DECODE_ERRORS = (UnicodeDecodeError, UnicodeError, DecodeError) # structured data parsing PARSE_ERRORS = (ValueError, TypeError, KeyError) diff --git a/src/http_utils.py b/src/http_utils.py index 5606738c..44b79fb1 100644 --- a/src/http_utils.py +++ b/src/http_utils.py @@ -28,7 +28,7 @@ REDACT_QUERY_PARAM_NAMES, SESSION_ROTATION_THRESHOLD, ) -from .exceptions import ALL_API_ERRORS, DECODE_ERRORS, NUMERIC_ERRORS +from .exceptions import ALL_API_ERRORS, DECODE_ERRORS, NUMERIC_ERRORS, DecodeError T = TypeVar("T") @@ -290,7 +290,9 @@ def wrapper(*args: Any, **kwargs: Any) -> Any: try: return func(*args, **kwargs) except ALL_API_ERRORS as e: - logging.getLogger("CiteForge.http").debug("API error in %s: %s", func.__qualname__, e) + logging.getLogger("CiteForge.http").debug( + "API error in %s: %s", func.__qualname__, _scrub_secrets(str(e)) + ) return default_return return wrapper @@ -397,7 +399,7 @@ def _http_request( time.sleep((2**attempt) + random.uniform(0, 1)) # Unreachable -- the loop always returns or raises -- but satisfies mypy. - raise requests.exceptions.RequestException(f"Failed to {method} {url}") + raise requests.exceptions.RequestException(f"Failed to {method} {_scrub_secrets(url)}") def http_fetch_bytes( @@ -422,10 +424,11 @@ def _decode_json_bytes(raw: bytes, url: str) -> dict[str, Any]: result: dict[str, Any] = json.loads(raw.decode("utf-8")) return result except json.JSONDecodeError as ex: - # include a preview for debugging - preview = raw[:256].decode("utf-8", errors="replace") + # include a preview for debugging (scrub the preview too — an upstream + # error body may echo request params carrying a key) + preview = _scrub_secrets(raw[:256].decode("utf-8", errors="replace")) safe_url = _scrub_secrets(url) - raise ValueError(f"Invalid JSON from {safe_url!r}: {ex.msg} at pos {ex.pos}; preview={preview!r}") from ex + raise DecodeError(f"Invalid JSON from {safe_url!r}: {ex.msg} at pos {ex.pos}; preview={preview!r}") from ex def http_get_json(url: str, timeout: float = HTTP_TIMEOUT_FAST) -> dict[str, Any]: diff --git a/tests/test_regression.py b/tests/test_regression.py index 7c028fd7..088e6ac4 100644 --- a/tests/test_regression.py +++ b/tests/test_regression.py @@ -12,6 +12,8 @@ from typing import Any from unittest.mock import MagicMock, patch +import pytest + from src import bibtex_utils as bt from src import id_utils, merge_utils, text_utils from src.api_generics import ( @@ -3275,28 +3277,63 @@ def test_keep_middle_initials(self) -> None: class TestDecodeValueErrorContainment: - """A malformed-JSON ValueError from _decode_json_bytes must not escape. - - The inner catch used NETWORK_ERRORS and the @handle_api_errors decorator - uses ALL_API_ERRORS; neither includes ValueError, so a bad 200-response - body crashed the run. Fix broadens the inner catch to ALL_FETCH_ERRORS. + """A malformed-200 body (HTML gateway page) must not crash the run. + + _decode_json_bytes raises DecodeError (a ValueError subclass) on a non-JSON + body. Root-cause fix: DecodeError is a member of DECODE_ERRORS (hence + ALL_API_ERRORS), so every ``except ALL_API_ERRORS`` API client -- including + the generic search path backing S2/Crossref/OpenAlex -- degrades to a + skipped source instead of dropping the whole article. Unrelated ValueErrors + are deliberately NOT swallowed by ALL_API_ERRORS. """ - def test_datacite_swallows_valueerror(self) -> None: + def test_decode_error_is_caught_by_all_api_errors(self) -> None: + from src.exceptions import ALL_API_ERRORS, DecodeError + + # The invariant that makes all ~11 `except ALL_API_ERRORS` sites graceful. + assert issubclass(DecodeError, ValueError) + assert issubclass(DecodeError, ALL_API_ERRORS) + # A bare/unrelated ValueError must still propagate (no masking). + assert not issubclass(ValueError, ALL_API_ERRORS) + + def test_decode_json_bytes_raises_decode_error(self) -> None: + from src.exceptions import DecodeError + from src.http_utils import _decode_json_bytes + + with pytest.raises(DecodeError): + _decode_json_bytes(b"not json", "https://api.openalex.org/works?q=x") + + def test_generic_search_swallows_decode_error(self) -> None: + # The primary enrichment path (OpenAlex/Crossref/S2) must return None, + # not propagate, when an upstream serves an HTML 200 body. + from src import api_generics + from src.api_configs import OPENALEX_SEARCH_CONFIG + from src.exceptions import DecodeError + + with ( + patch.object(api_generics.response_cache, "get", return_value=None), + patch.object(api_generics.response_cache, "put"), + patch.object(api_generics, "http_get_json", side_effect=DecodeError("Invalid JSON from 'https://x'")), + ): + assert api_generics.search_api_generic("A Title", "Author", OPENALEX_SEARCH_CONFIG) is None + + def test_datacite_swallows_decode_error(self) -> None: from src.clients import utility_apis + from src.exceptions import DecodeError with ( patch.object(utility_apis.response_cache, "get", return_value=None), - patch.object(utility_apis, "http_get_json", side_effect=ValueError("Invalid JSON from 'https://x'")), + patch.object(utility_apis, "http_get_json", side_effect=DecodeError("Invalid JSON from 'https://x'")), ): assert utility_apis.datacite_search_doi("10.5281/zenodo.123") is None - def test_orcid_swallows_valueerror(self) -> None: + def test_orcid_swallows_decode_error(self) -> None: from src.clients import utility_apis + from src.exceptions import DecodeError with ( patch.object(utility_apis.response_cache, "get", return_value=None), - patch.object(utility_apis, "http_get_json", side_effect=ValueError("Invalid JSON")), + patch.object(utility_apis, "http_get_json", side_effect=DecodeError("Invalid JSON")), ): assert utility_apis.orcid_fetch_works("0000-0001-2345-6789") == [] From a61ea6b58e697db4c94c2cd27da372901f914eab Mon Sep 17 00:00:00 2001 From: Gabriel Spadon Date: Wed, 1 Jul 2026 16:54:57 -0300 Subject: [PATCH 26/54] refactor: drop dead _fix_fused_compounds import from main --- main.py | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/main.py b/main.py index c8b7b85c..ea61dc52 100644 --- a/main.py +++ b/main.py @@ -106,11 +106,7 @@ title_similarity, trim_title_default, ) -from src.textnorm import ( - _fix_fused_compounds, # noqa: F401 - _is_corrupted_title, - _is_garbage_title, -) +from src.textnorm import _is_corrupted_title, _is_garbage_title FORCE_ENRICH = "--force" in sys.argv[1:] From 2a2daaf477cd85a5e63a0435dc51a9ee8a6a5d94 Mon Sep 17 00:00:00 2001 From: Gabriel Spadon Date: Wed, 1 Jul 2026 17:05:17 -0300 Subject: [PATCH 27/54] fix: never fabricate @inproceedings from a DOI-inferred preprint label infer_howpublished_from_doi returns labels like EGU, Preprint, and Institutional Repository that are not conference venues. R20's misc-> inproceedings upgrade lacked them in its guard, so a backfilled preprint howpublished was rewritten into a fabricated booktitle. Gate R20 against any infer_howpublished_from_doi output, and add the inverse downgrade so an already-fabricated @inproceedings self-heals to @misc. A real venue carrying a preprint-prefix DOI (booktitle != the bare label) is preserved. Regenerate the two affected corpus entries to their corrected fixpoint. --- .../Reynolds2025-IntellectualProperty.bib | 4 +- .../Oishi2021-NeuralNetworks.bib | 1 + output/a2i2/Oishi2021-NeuralNetworks.bib | 1 + src/canonicalize.py | 32 +++++++++++- tests/test_regression.py | 50 +++++++++++++++++++ 5 files changed, 85 insertions(+), 3 deletions(-) diff --git a/output/Rosborough (kG4oQmsAAAAJ)/Reynolds2025-IntellectualProperty.bib b/output/Rosborough (kG4oQmsAAAAJ)/Reynolds2025-IntellectualProperty.bib index c1a4c5a2..9eaacfbf 100644 --- a/output/Rosborough (kG4oQmsAAAAJ)/Reynolds2025-IntellectualProperty.bib +++ b/output/Rosborough (kG4oQmsAAAAJ)/Reynolds2025-IntellectualProperty.bib @@ -1,8 +1,8 @@ -@inproceedings{Reynolds2025:IPFuturesGlobal, +@misc{Reynolds2025:IPFuturesGlobal, title = {Intellectual Property Futures: Exploring the Global Landscape of IP Law and Policy}, author = {Graham J. Reynolds and Alexandra Mogyoros and Teshager W Dagne and Faith Majekolagbe and Mauro Barelli and Enrico Bonadio and Cheryl Dine and Peter K Yu and Myra J Tawfik and Sara Bannerman and Cody Rei-Anderson and Bassem Awad and Mistrale Goudreau and Gregory R Hagen and Anmol Patel and Richard Overstall and Johnny Mack and Anthony D Rosborough and Naama Daniel and Luciano Poa and Andrea Cabello and Andelka M. Phillips and David J. Watson and Lisa Macklem}, year = {2025}, - booktitle = {Institutional Repository}, + howpublished = {Institutional Repository}, publisher = {Ryerson University Library and Archives}, doi = {10.32920/30695723}, url = {https://doi.org/10.32920/30695723} diff --git a/output/Spadon (bfdGsGUAAAAJ)/Oishi2021-NeuralNetworks.bib b/output/Spadon (bfdGsGUAAAAJ)/Oishi2021-NeuralNetworks.bib index 1d035c0c..065e1712 100644 --- a/output/Spadon (bfdGsGUAAAAJ)/Oishi2021-NeuralNetworks.bib +++ b/output/Spadon (bfdGsGUAAAAJ)/Oishi2021-NeuralNetworks.bib @@ -2,6 +2,7 @@ @misc{Oishi2021:NeuralSeismicInversion title = {Neural Networks for Seismic Data Inversion}, author = {Cassio M. Oishi and Fabio Vinicius Goes Amaral and Hugo Leonardo Franca and William Hideki Nakata and Diego Alecsander De Aguiar and Gilmar Francisco De Oliveira Santos and Debora De Oliveira Medeiros and Gabriel Spadon and Jose Fernando Rodrigues Jr and Jose Mario Martinez and Lucio Tunes Santos and Djalma Manoel Soares Filho}, year = {2021}, + howpublished = {Preprint}, publisher = {Cambridge University Press (CUP)}, doi = {10.33774/miir-2021-6pz3v}, url = {https://doi.org/10.33774/miir-2021-6pz3v} diff --git a/output/a2i2/Oishi2021-NeuralNetworks.bib b/output/a2i2/Oishi2021-NeuralNetworks.bib index 1d035c0c..065e1712 100644 --- a/output/a2i2/Oishi2021-NeuralNetworks.bib +++ b/output/a2i2/Oishi2021-NeuralNetworks.bib @@ -2,6 +2,7 @@ @misc{Oishi2021:NeuralSeismicInversion title = {Neural Networks for Seismic Data Inversion}, author = {Cassio M. Oishi and Fabio Vinicius Goes Amaral and Hugo Leonardo Franca and William Hideki Nakata and Diego Alecsander De Aguiar and Gilmar Francisco De Oliveira Santos and Debora De Oliveira Medeiros and Gabriel Spadon and Jose Fernando Rodrigues Jr and Jose Mario Martinez and Lucio Tunes Santos and Djalma Manoel Soares Filho}, year = {2021}, + howpublished = {Preprint}, publisher = {Cambridge University Press (CUP)}, doi = {10.33774/miir-2021-6pz3v}, url = {https://doi.org/10.33774/miir-2021-6pz3v} diff --git a/src/canonicalize.py b/src/canonicalize.py index a9e855fc..02a01e74 100644 --- a/src/canonicalize.py +++ b/src/canonicalize.py @@ -176,6 +176,25 @@ def _rule_preprint_booktitle_to_misc(entry: dict[str, Any], fields: dict[str, An return False +def _rule_doi_backfilled_booktitle_to_misc(entry: dict[str, Any], fields: dict[str, Any]) -> bool: + """@inproceedings whose booktitle is a DOI-inferred preprint/repository label + -> @misc (booktitle -> howpublished). + + Inverse of _rule_howpublished_to_inproceedings' DOI-backfill guard: corrects + entries mis-upgraded into a fabricated conference (e.g. booktitle "EGU" for + 10.5194/egusphere, "Institutional Repository" for 10.32920) before that guard + existed. Once downgraded, the gated upgrade leaves them @misc. + """ + if entry.get("type") == "inproceedings" and fields.get("booktitle"): + doi = (fields.get("doi") or "").strip() + inferred = mu.infer_howpublished_from_doi(doi) if doi else None + if inferred is not None and fields["booktitle"].strip().lower() == inferred.lower(): + entry["type"] = "misc" + fields["howpublished"] = fields.pop("booktitle") + return True + return False + + def _rule_university_to_phdthesis(entry: dict[str, Any], fields: dict[str, Any]) -> bool: """@article with a university/institute name as journal -> @phdthesis.""" if entry.get("type") == "article" and fields.get("journal"): @@ -686,6 +705,11 @@ def _rule_howpublished_to_inproceedings(entry: dict[str, Any], fields: dict[str, When howpublished is a venue name (not a preprint server or repository), the entry is a conference/workshop paper that should be @inproceedings. + A howpublished that was backfilled from the DOI (i.e. equals + infer_howpublished_from_doi) is a preprint/repository label, never a + conference venue -- e.g. "EGU" (10.5194/egusphere), "Preprint" (Cambridge + Open Engage), "Institutional Repository" (10.32920) -- so it must NOT be + upgraded into a fabricated @inproceedings. """ if entry.get("type") == "misc" and fields.get("howpublished"): hp_val = (fields.get("howpublished") or "").strip() @@ -694,7 +718,10 @@ def _rule_howpublished_to_inproceedings(entry: dict[str, Any], fields: dict[str, any(ps == hp_lower or ps in hp_lower for ps in PREPRINT_SERVERS) or hp_lower in _R20_PREPRINT_HOWPUBLISHED ) is_repository_hp = any(rj in hp_lower for rj in REPOSITORY_AS_JOURNAL) - if not is_preprint_hp and not is_repository_hp and hp_val: + doi = (fields.get("doi") or "").strip() + inferred = mu.infer_howpublished_from_doi(doi) if doi else None + is_doi_backfilled = inferred is not None and hp_lower == inferred.lower() + if not is_preprint_hp and not is_repository_hp and not is_doi_backfilled and hp_val: entry["type"] = "inproceedings" fields["booktitle"] = fields.pop("howpublished") return True @@ -732,6 +759,7 @@ def _rule_strip_preprint_only_publisher(entry: dict[str, Any], fields: dict[str, _rule_repo_booktitle_to_misc, _rule_repo_journal_to_misc, _rule_preprint_booktitle_to_misc, + _rule_doi_backfilled_booktitle_to_misc, _rule_university_to_phdthesis, _rule_journal_prefix_to_article, _rule_handbook_to_incollection, @@ -771,6 +799,7 @@ def _rule_strip_preprint_only_publisher(entry: dict[str, Any], fields: dict[str, _rule_unpublished_to_misc, _rule_url_booktitle_to_misc, _rule_preprint_booktitle_to_misc, + _rule_doi_backfilled_booktitle_to_misc, _rule_journal_prefix_to_article, _rule_handbook_to_incollection, _rule_book_chapter_doi_to_incollection, @@ -830,6 +859,7 @@ def _rule_strip_preprint_only_publisher(entry: dict[str, Any], fields: dict[str, _rule_institutional_repo_to_phdthesis, _rule_repo_booktitle_to_misc, _rule_preprint_booktitle_to_misc, + _rule_doi_backfilled_booktitle_to_misc, _rule_journal_prefix_to_article, _rule_handbook_to_incollection, _rule_book_chapter_doi_to_incollection, diff --git a/tests/test_regression.py b/tests/test_regression.py index 088e6ac4..59b59cda 100644 --- a/tests/test_regression.py +++ b/tests/test_regression.py @@ -3378,3 +3378,53 @@ def _worker() -> None: finally: sa._OPENREVIEW_SESSION = prev_session sa._OPENREVIEW_SESSION_CREATED_AT = prev_created + + +class TestDoiBackfilledPreprintNotFabricatedConference: + """A DOI-inferred preprint/repository label must never become a fabricated + @inproceedings venue (I1). infer_howpublished_from_doi returns labels like + "EGU", "Preprint", "Institutional Repository" that are not conference names; + R20 must not upgrade them, and any already-upgraded entry must self-heal. + A REAL venue that merely carries a preprint-prefix DOI stays @inproceedings. + """ + + def test_backfilled_label_not_upgraded_to_inproceedings(self) -> None: + from src.canonicalize import CanonicalStage, canonicalize + + # @misc whose howpublished is the bare DOI-inferred label -> stays @misc. + entry = { + "type": "misc", + "key": "X2024:Y", + "fields": {"title": "T", "howpublished": "EGU", "doi": "10.5194/egusphere-2024-1"}, + } + canonicalize(entry, stage=CanonicalStage.POST_MERGE) + assert entry["type"] == "misc" + assert "booktitle" not in entry["fields"] + assert entry["fields"].get("howpublished") == "EGU" + + def test_bare_infer_label_booktitle_downgraded_to_misc(self) -> None: + from src.canonicalize import CanonicalStage, canonicalize + + # Already-fabricated @inproceedings with the bare label as booktitle -> @misc. + entry = { + "type": "inproceedings", + "key": "R2025:IP", + "fields": {"title": "T", "booktitle": "Institutional Repository", "doi": "10.32920/30695723"}, + } + canonicalize(entry, stage=CanonicalStage.POST_MERGE) + assert entry["type"] == "misc" + assert "booktitle" not in entry["fields"] + assert entry["fields"].get("howpublished") == "Institutional Repository" + + def test_real_conference_with_preprint_doi_preserved(self) -> None: + from src.canonicalize import CanonicalStage, canonicalize + + # A genuine venue name that happens to carry an egusphere DOI stays @inproceedings. + entry = { + "type": "inproceedings", + "key": "C2022:Beirut", + "fields": {"title": "T", "booktitle": "EGU General Assembly", "doi": "10.5194/egusphere-egu22-7164"}, + } + canonicalize(entry, stage=CanonicalStage.POST_MERGE) + assert entry["type"] == "inproceedings" + assert entry["fields"].get("booktitle") == "EGU General Assembly" From becfeac6d4db8cb88475572a99fa55111d1025cc Mon Sep 17 00:00:00 2001 From: Gabriel Spadon Date: Wed, 1 Jul 2026 17:07:30 -0300 Subject: [PATCH 28/54] chore: remove audit working notes, leaving only the improvements --- audit/01-invariant-catalog.md | 874 ---------------------------------- audit/02-design.md | 289 ----------- audit/03-bibentry-design.md | 168 ------- 3 files changed, 1331 deletions(-) delete mode 100644 audit/01-invariant-catalog.md delete mode 100644 audit/02-design.md delete mode 100644 audit/03-bibentry-design.md diff --git a/audit/01-invariant-catalog.md b/audit/01-invariant-catalog.md deleted file mode 100644 index 1d00c177..00000000 --- a/audit/01-invariant-catalog.md +++ /dev/null @@ -1,874 +0,0 @@ -# CiteForge INVARIANT CATALOG — Phase 1 Deliverable (Refusal Floor) - -This catalog is the authoritative behavioral contract for the CiteForge refactor campaign. Every entry below is a property the DESIGN and IMPLEMENT phases must preserve. Load-bearing invariants are ranked first within each group; violating one is a hard stop. Cross-subsystem duplicates have been consolidated into a single canonical entry with all evidence `file:line` references merged (noted as *consolidates:*). - -Severity legend: **LB** = load-bearing (byte-output or data-integrity impact) · **IMP** = important · **MIN** = minor. - -Overarching goal (the reason most of this exists): **running the tool twice on already-processed output must produce byte-identical BibTeX.** See `pipeline-double-run-fixpoint` (Determinism) and the DETERMINISM-CRITICAL SURFACES section. - ---- - -## 1. Determinism - -#### `pipeline-double-run-fixpoint` — LB -A second run over already-processed output must be byte-identical (global idempotency). This is the umbrella property the three-way fix + ASCII-clean tables + stable serialization all exist to guarantee. -- Evidence: helpers `main.py:235-254`; three-site application; serializer `src/bibtex_utils.py:302-390`; existing-file path gated by `SKIP_SCHOLAR_FOR_EXISTING_FILES` `src/config.py:61`. -- Verify: golden double-run integration test; run N and N+1 outputs byte-identical over a representative corpus. - -#### `determinism-author-sort-key` — LB -Author records are sorted by the exact composite key `(-existing_paper_count, name.lower(), scholar_id or dblp or "")` before processing — stable, tie-broken, input-order-independent. -- Evidence: `main.py:2947-2949`. -- Verify: unit test on the sort lambda with equal counts / out-of-order names+ids; golden test asserting identical order across two calls. - -#### `determinism-article-ordering` — LB -Merged publications are ordered by `sort_articles_by_year_current_first`: `(current-year-first group, -year, normalized_title, first_author_sortkey)` — a total, content-derived order independent of API return order. `max_pubs` truncation and first-writer-wins filenames depend on it. -- Evidence: `src/clients/scholar.py:169-178`. -- Verify: sort a shuffled fixture; assert output equals documented ordering and is invariant to input permutation. - -#### `determinism-phase2-source-order` — LB — ⚠ CORRECTS PRIOR DIGEST -Phase 2 queries sources in the fixed order **Scholar → S2 → Crossref → OpenReview → arXiv → OpenAlex → PubMed → EuropePMC**, appending each match to `enr_list` in that order. (The prior-study digest wrongly claimed Scholar→S2→Crossref→OpenAlex→PubMed→EuropePMC→arXiv→OpenReview. The evidence order below is authoritative.) -- Evidence: `main.py:1543,1572,1601,1621,1640,1660,1687,1706`. -- Verify: golden-master `.bib` with all sources mocked to distinct filler-only fields; assert the `SEARCH_START` log sequence equals `[S2,Crossref,OpenReview,arXiv,OpenAlex,PubMed,EuropePMC]`. - -#### `determinism-enr-list-order` — LB *(consolidates: determinism-enr-list-accumulation, enricher-iteration-order-deterministic)* -`enr_list` is a single list accumulated across P1→P2→P2.5→P3, never reset/sorted/deduped mid-pipeline; `merge_with_policy` iterates it in insertion order and, with strict-less-than trust, the earlier of equal-rank sources wins. The merged dict is therefore a deterministic function of `(primary, ordered enrichers)`. -- Evidence: `main.py:1486` (init once), append sites `src/doi_utils.py:196,199`, `main.py:703,1552`; consumed `main.py:2026`; iteration `src/merge_utils.py:277-445` (strict `<` at :432). -- Verify: assert `enr_list` identity stable and length only grows P1→P4; shuffling equal-rank enrichers must not change merged output. - -#### `determinism-doi-candidate-order` — LB *(consolidates: determinism-doi-candidate-sort-published-first, correctness-doi-candidate-published-first-nohttp, determinism-doi-candidate-set-dedup)* -Phase-3 DOI candidates are set-deduped on normalized DOI, then **stable partition-sorted published-first** (`key = 1 if is_secondary_doi else 0`), validated in order, breaking on first success. DOI inference from URLs/eprints is **HTTP-free** (cache-only), keeping P3 deterministic and independent of network timing. -- Evidence: `main.py:1945` (set-dedup), `:1949` (partition sort), `:1994-1996` (first-match break), `:1901-1943` (cache-only inference); `src/id_utils.py:44-46`. -- Verify: `[preprint, published]` → published validated first; assert no live `http_get_text` when a cached/URL-inferred DOI is available; run twice under differing `PYTHONHASHSEED`, assert identical `.bib`. - -#### `determinism-reconcile-rewrite-only-when-phantoms` — LB -`reconcile_summary_csv` rewrites the CSV (and refreshes `_SUMMARY_KNOWN_PATHS`) **only when `removed>0`**; when all files exist it returns 0 without rewriting. -- Evidence: `src/io_utils.py:415-439`. -- Verify: `test_no_phantoms_no_rewrite` (mtime unchanged, removed==0); `test_phantom_entries_removed` (removed==1, phantom gone). - -#### `determinism-orphan-abspath-resolution` — LB -`collect_orphan_files` and `_load_csv_titles` resolve CSV `file_path` via `os.path.abspath` before comparison/grouping, and `collect_orphan_files` returns a **sorted** list; orphans = on-disk `.bib` whose abspath ∉ abspath'd CSV set. -- Evidence: `src/io_utils.py:371-399` (`return sorted(orphans)` at :399); `main.py:2870`. -- Verify: `test_orphan_detected` / `test_no_orphans`; assert returned list is sorted. - -#### `determinism-a2i2-complete-rebuild` — LB -`build_a2i2_folder` wipes every regular file in `out_dir/a2i2` before copying survivors, so the folder is a pure function of current inputs (no stale accumulation). -- Evidence: `src/io_utils.py:587-593` (wipe), `:595-615` (copy). -- Verify: `test_complete_rebuild`, `test_deterministic_output`. - -#### `determinism-sorted-bib-scan` — LB *(consolidates: determinism-sorted-bib-iteration, determinism-sorted-file-scan)* -Every scan of an author dir's `.bib` files iterates in `sorted(filename)` order (baseline scan, `save_entry_to_file` duplicate scan, post-run fixup), and the duplicate scan breaks on first match — so the chosen duplicate is deterministically the sorted-first match, not FS/inode-order-dependent. -- Evidence: `main.py:817`, `src/merge_utils.py:953`, `main.py:3164,3168`; first-match breaks `merge_utils.py:1000,1011,1044,1058,1083,1099,1124,1136,1148,1168,1190`. -- Verify: two runs on a dir with 2+ matching duplicates → identical output filenames/bytes; seed `a.bib`/`z.bib` both matching → duplicate is `a.bib`. - -#### `determinism-new-author-first-stable` — IMP -After count-sorting, records are re-ordered by `(_has_output(r), original_index)` (stable sort) so authors without an existing output dir run first, ties preserving count-sort index. -- Evidence: `main.py:2971-2977`. -- Verify: mix authors with/without output dirs; assert no-output precede has-output and count-sort order preserved within each group. - -#### `determinism-title-similarity-pure` — IMP -`title_similarity`/`normalize_title` stay pure/deterministic: normalize (unescape, strip LaTeX/accents, lowercase, punct→space, collapse) then rapidfuzz ratio/100, returning exactly `1.0` on normalized equality. Every title-based branch boundary (0.55/0.6/0.95) depends on this. -- Evidence: `src/text_utils.py:130-155`, `:381-393`. -- Verify: `title_similarity('Deep Learning.','deep learning')==1.0`; snapshot `normalize_title` over a fixture set. - -#### `determinism-pattern-iteration-order` — IMP -Fix patterns are built from ordered containers (dict/tuple/list) and applied in insertion order (`_FUSED_DICT_PATTERNS`, `_COMPOUND_SUFFIX_PATTERNS`, `_ACRONYM_CASE_PATTERNS`, `_BOOKTITLE_FIXUPS`); none may become a set/frozenset. -- Evidence: `main.py:123-130,147-150,188-232`; sources `config.py:379-808`. -- Verify: run same input under two `PYTHONHASHSEED` values → identical output; assert sources are dict/tuple/list. - -#### `determinism-url-namespace-first-prefix-match` — IMP -`_classify_url` returns the namespace of the FIRST prefix (insertion order) whose substring is in the URL, else `'other'`; drives call-count tracking and rate-limiter selection. -- Evidence: `src/http_utils.py:121-143`. -- Verify: parametrized map of known hosts→namespace, unknown→`'other'`. - -#### `determinism-a2i2-pick-richer-tiebreak` — IMP -Merged duplicates: more non-empty fields wins; on tie, keep lexicographically smaller source filepath (`a if a[1] <= b[1] else b`). -- Evidence: `src/io_utils.py:535-545`. -- Verify: two equal-field duplicates in different author dirs always resolve to lower-path file across runs. - -#### `determinism-a2i2-write-order-collision` — IMP -Survivors written iterating `sorted(kept, key=basename)`; filename collisions resolved by appending `_2,_3,...` (counter starts at 2). -- Evidence: `src/io_utils.py:598-606`. -- Verify: `test_deterministic_output` + same-basename-different-dir fixture asserting stable `_2`. - -#### `determinism-flush-rewrite-only-on-updates` — IMP -`flush_summary_csv` rewrites only if `_SUMMARY_UPDATES` non-empty; else returns immediately (append-only file untouched). Clears `_SUMMARY_UPDATES` after rewrite. -- Evidence: `src/io_utils.py:334-356`. -- Verify: flush with empty updates → mtime unchanged; with one update → exactly that row rewritten, updates cleared. - -#### `determinism-cache-defensive-copy` — IMP -`get()` returns `dict(data)` (fresh shallow copy) on every hit (positive and negative), so callers cannot mutate cached state. -- Evidence: `src/cache.py:141,145`. -- Verify: mutate returned dict, re-`get()`, assert second result unaffected. - -#### `determinism-utc-year-functions` — MIN -Pipeline year computations (`get_current_year`, `get_min_year`, `CONTRIBUTION_WINDOW_YEARS`) use UTC (timezone-independent window); cache expiry deliberately uses AST (UTC-4) separately. -- Evidence: `src/clients/helpers.py:139-141`; `src/config.py:46-52`; cache AST `src/cache.py:21`. -- Verify: freeze-time near Dec31/Jan1 in two timezones; assert identical UTC-based values. - ---- - -## 2. Anti-oscillation / Three-way-fix - -#### `ao-three-way-fixup-parity` — LB *(consolidates: anti-oscillation-three-way-fixup-parity, fixup-idempotence-convergence, threeway-text-booktitle-all-3-sites, fix-title-text-substep-order-shared)* -The title/venue/type correction ruleset (core reclassifications + `_fix_title_text` + `_apply_booktitle_fixups`) must be applied **identically at all three fix sites** — (A) load-time `_fixup_bib_entry`, (B) existing-file baseline fixup, (C) Phase-4 post-merge — and each must be **convergent** (`f(f(x))==f(x)`) so any entry reaches the same fixed point regardless of path. `_fix_title_text` sub-steps run in the fixed order fused-compounds → colon-space → hyphen-space → space-hyphen → acronym-case, via one shared helper (no per-site reimplementation). -- Evidence: contract `main.py:160-161`; site A `main.py:314-492,432,440`; site B `main.py:865-1309,1205,1213`; site C `main.py:2028-2401,2279,2290`; `_fixup_bib_entry` `src/merge_utils.py:314-565`; helpers `main.py:235-254`; regression `tests/test_regression.py:2825-2867`. -- Verify: idempotency test (second run byte-identical, zero rewrites); cross-path test feeding one malformed entry through each fixup → identical results; grep-assert exactly 3 call sites each for `_fix_title_text`/`_apply_booktitle_fixups`. - -#### `ao-phase4-superset` — LB — ⚠ CORRECTS PRIOR DIGEST -Sites A/B/C are intentionally **not** byte-identical: all apply the shared CORE reclassification set, but Phase 4 (C) is a **superset** adding patent→misc, unpublished→misc, url-fragment-booktitle→misc, article-preprint-DOI handling, AND the **only** misc→inproceedings UPGRADE. (Prior digest wrongly claimed C omits the article/inproceedings reclassifications.) A refactor consolidating sites must preserve C's extras and must NOT add the misc-upgrade to A/B. -- Evidence: C-exclusive `main.py:2134-2144,2146-2151,2153-2162,2238-2259,2382-2401`; shared core C `main.py:2072-2236` mirroring A `main.py:324-421` and B `main.py:1028-1193`. -- Verify: reclassification-parity test per site; assert misc→inproceedings upgrade appears only in the Phase-4 path. - -#### `ao-is-proc-series-guard-frontiers` — LB -The inproceedings→article reclassification (JOURNAL_ONLY_PREFIXES) must be gated by `not is_proc_series` at all three sites, because `'frontiers in artificial intelligence and applications'` is in PROCEEDINGS_SERIES_AS_JOURNAL **and** matches prefix `'frontiers in '` — without the guard the type flips every run. -- Evidence: `main.py:393-394,1162-1163,2175-2176`; tables `config.py:218-226,361-368`. -- Verify: Frontiers-in-AI entry through `_fixup_bib_entry` twice → stable `@inproceedings`. - -#### `ao-is-pacm-guard` — LB -The article→inproceedings reclassification (`mu._is_conference_journal`) must be gated by `not is_pacm` (ACM_JOURNAL_PROCEEDINGS) at all three sites, because `_is_conference_journal` returns True for "Proceedings of the ACM on ..." yet PACM venues are genuine journals — else PACM type oscillates. -- Evidence: guard `main.py:417-418,1031-1032,2077-2078`; reverse rule `main.py:333-338,2098-2106`; `src/merge_utils.py:133-151`; table `config.py:230-241`. -- Verify: ACM_JOURNAL_PROCEEDINGS entry stays `@article` across two passes. - -#### `ao-disjoint-reclassification-tables` — LB -Reclassification tables must remain disjoint under startswith/eq matching so no venue string is matched by two rules that reclassify it in opposite directions (article↔inproceedings). Adding a bridging prefix reintroduces oscillation. -- Evidence: `config.py:167-241,361-368`; matching `main.py:325-421`. -- Verify: table-consistency test — no forward-table string is a startswith-prefix/equal of any reverse-table string (and vice versa); guarded pair still relies on `not is_proc_series`. - -#### `ao-ascii-clean-table-values` — LB -Every VALUE in a fix/correction table must already be the exact ASCII form `_normalize_to_ascii` produces (unidecode'd accents, straight quotes, `-`/`--`, `\&`), i.e. a fixpoint of `_normalize_to_ascii`. Otherwise the fix writes value X, the serializer rewrites to X', and the next run re-fixes → byte diff every run. -- Evidence: serializer `src/bibtex_utils.py:302-328,384`; pre-escaped examples `config.py:254,182-183`. -- Verify: for every table value `v`, assert `v == _normalize_to_ascii(v)`. - -#### `ao-candidate-doi-disk-dedup` — LB *(consolidates: anti-oscillation-candidate-doi-disk-dedup, anti-oscillation-candidate-doi-net, anti-oscillation-two-layer-nets)* -Before final write, all DOIs seen across P2 candidates (matched **and** rejected, via `seen_dois`), P2.5 injections, P3 discovery, and the merged entry's own DOI/eprint are checked against DOIs on disk in OTHER files. On a genuine match (title_similarity ≥ `SIM_PREPRINT_TITLE_THRESHOLD`=0.55) the new file is removed and write skipped; a below-threshold match instead calls `_revert_misattributed_doi` and continues. This is the **outer** of two independent dedup nets (the other being the in-`save_entry_to_file` file scan); both must remain. -- Evidence: `main.py:1490,1531-1588,2531-2588`; file-scan net `src/merge_utils.py:980-1190`; candidate collection `main.py:657-699,1745,1752,1947,2536-2540`. -- Verify: seed published `.bib` with DOI X; process an article whose candidate set includes X under a preprint title → no new file; a duplicate detectable only by title-sim (no shared DOI) is caught by the file-scan net; misattributed low-sim DOI → reverted, entry still written. - -#### `ao-skip-write-existing-better` — LB *(consolidates: anti-oscillation-skip-write-existing-better, prewrite-more-complete-guard, trust-order-prewrite-no-downgrade)* -`save_entry_to_file` keeps the existing file when it is the better version: existing published beats incoming preprint; existing-with-DOI beats incoming-without; same-class keeps existing only if it has ≥3 more populated fields; and a pre-write guard refuses to overwrite when existing has more non-empty fields, a published DOI vs incoming preprint DOI, or a specific booktitle vs generic-series — **unless** a preprint→published upgrade. -- Evidence: `src/merge_utils.py:1201-1305,1386-1416,1405-1422,1433-1451`. -- Verify: (a) existing published DOI + incoming preprint → skip; (b) existing 8 fields vs incoming 4, no upgrade → no write; (c) preprint→published upgrade with fewer fields → still writes; (d) specific vs generic booktitle → keep existing. - -#### `ao-doi-published-beats-preprint-xor` — LB -For the `doi` field, a published DOI always replaces a preprint DOI and a preprint DOI never replaces a published DOI, independent of trust rank (XOR override runs before the generic trust gate). Enforced in merge and in save. -- Evidence: `src/merge_utils.py:298-316,1230-1243,1415-1416`. -- Verify: current published DOI + incoming higher-trust preprint DOI → keep published; re-merge is a fixed point. - -#### `ao-journal-never-downgrade-to-preprint` — LB -The `journal` field is never replaced by a preprint-server value when the current journal is a real venue (tested against PREPRINT_SERVERS substrings). -- Evidence: `src/merge_utils.py:342-355`; `src/config.py:133-140`. -- Verify: `journal='Nature'` + incoming `journal='arXiv'` → kept Nature. - -#### `ao-title-keep-longer-trust-diff` — LB *(consolidates: title-keep-longer-unless-trust-diff-threshold, title-length-keep-trust-override)* -A shorter incoming title (stripped length `< TITLE_LENGTH_KEEP_RATIO=0.7 × current`) is rejected unless the incoming source is ≥ `TRUST_DIFF_OVERRIDE_THRESHOLD=3` ranks more trusted. Both constants config-sourced. -- Evidence: `src/merge_utils.py:386-405`; `src/config.py:826,829`. -- Verify: 60-char s2 title + 20-char crossref title (diff<3) → keep long; from csl (diff≥3) → allow short. - -#### `ao-eprint-removed-on-published-doi` — LB -When a non-preprint DOI coexists with an arXiv eprint, the eprint/archiveprefix/primaryclass are removed, preprint URLs rewritten to `https://doi.org/`, phantom `arXiv` journals stripped, journal backfilled from the best-ranked matching enricher (else `@article`→`@misc`). -- Evidence: `src/merge_utils.py:653-735`. -- Verify: `test_merge_doi_arxiv_handling`; OSTI-style published DOI with no journal → `@misc`. - -#### `ao-p1-stash-and-pop` — LB -When the P1 baseline DOI fails validation it is stashed in `unvalidated_doi` AND popped from `bf`, so P3 can retry it while it never leaks into merged output. -- Evidence: `main.py:1512-1514`; consumed `main.py:1839`. -- Verify: baseline DOI failing CSL/BibTeX → `bf` has no `doi` after P1; `unvalidated_doi` appears among P3 candidates. - -#### `ao-p3-gate` — LB -Phase 3 runs iff `(not doi_validated) OR is_secondary(baseline_doi)` — a validated preprint/data DOI still triggers P3 to attempt a published upgrade. -- Evidence: `main.py:1812-1814`. -- Verify: validated published → P3 skipped; validated arXiv/secondary → P3 runs; no validated DOI → runs. - -#### `ao-p3-flag-gated-extraction` — LB -Phase 3 extracts DOIs/URLs from an API source only when that source's flag is set (candidate matched baseline); baseline eprint/url always allowed. -- Evidence: `main.py:1862-1877,1885-1899,1846-1849,1881-1883`. -- Verify: non-matching candidate (flag False) → its DOI/URL never enters candidate sets. - -#### `ao-eprint-doi-injection-restored` — LB -When validating an inferred arXiv-eprint DOI, it is temporarily injected into `bf` only if `bf` had no DOI and the candidate is an eprint DOI, and is always popped back out after validation. -- Evidence: `main.py:1974-1988`. -- Verify: `bf['doi']` absent after a failed eprint-DOI validation attempt. - -#### `ao-replace-keep-directional` — LB *(consolidates: dedup-replace-keep-decision-directional, trust-order-replacement-tree)* -On a confirmed duplicate: published beats preprint (keep existing published / replace existing preprint); DOI-vs-no-DOI keeps the one with the DOI; same-class both-DOI keeps incoming UNLESS existing has ≥ `new_field_count+3` non-empty fields; year-change uses the new filename; else reuse existing key. The `+3` margin and directionality are exact. -- Evidence: `src/merge_utils.py:1203-1294,1228-1292`. -- Verify: table-driven over `(existing_preprint,new_preprint,existing_doi,new_doi,field_counts)` asserting `KEEP_EXISTING|REPLACE|USE_NEW_NAME|REUSE_KEY` and whether `os.remove` fired; `existing==new+2` vs `new+3` flips the decision. - -#### `ao-postrun-fixup-write-suppression` — LB -Post-run fixup rewrites a `.bib` only when `_fixup_bib_entry` reports a change AND the re-serialized content differs from the original; identical re-serialization is not written. -- Evidence: `main.py:3176-3180`. -- Verify: run post-run fixup twice over a canonical corpus; second pass writes 0 files, bytes/mtime stable. - -#### `ao-429-503-excluded-from-urllib3-forcelist` — LB -The urllib3 `Retry.status_forcelist` must EXCLUDE 429 and 503, which are handled ONLY by the manual retry loop — never double-backed-off by the adapter. (`respect_retry_after_header=False` is the paired guard; see `correctness-urllib3-retry-after-disabled`.) -- Evidence: `src/http_utils.py:163-175` (exclusion :169), manual handling `:357-360`. -- Verify: `assert 429 not in _RETRY_STRATEGY.status_forcelist and 503 not in ...`. - -#### `ao-preprint-pair-composite-decircularized` — IMP *(consolidates: dedup-preprint-pair-bonus-subtraction, preprint-pair-composite-decircularized, anti-oscillation-preprint-debias)* -In the different-DOI preprint/published XOR branch, the composite dedup score has the 0.10 preprint-pair bonus subtracted (`effective = score - 0.10`) before comparison to `SIM_DEDUP_COMPOSITE_THRESHOLD`=0.60, because the XOR precondition already consumed that evidence (no double-counting). -- Evidence: `src/merge_utils.py:1027-1044`; `src/config.py:811`. -- Verify: XOR pair with raw composite 0.65 / effective 0.55 must NOT match at 0.60. - -#### `ao-booktitle-generic-vs-specific-directional` — IMP -A generic series booktitle is upgraded to a specific one; a specific booktitle is never replaced by a GENERIC_SERIES_NAMES value, independent of trust. -- Evidence: `src/merge_utils.py:408-427,1421-1422`; `src/config.py:346-358`. -- Verify: specific booktitle vs `'Lecture Notes in Computer Science'` → kept specific; reverse → upgraded. - -#### `ao-fused-compounds-three-pass-order` — IMP -`_fix_fused_compounds` applies exactly three passes: dictionary → suffix → dictionary (the third catches entries newly exposed by the suffix pass). -- Evidence: `main.py:287-311`. -- Verify: `'Doubleedgeassisted'`→`'Double-Edge-Assisted'`; second call is a no-op. - -#### `ao-deferred-baseline-no-doi` — IMP -A freshly created baseline with no DOI is not written eagerly (`path=None`); it is persisted only after Phase 4 via `save_entry_to_file`, avoiding transient files that get renamed each run. -- Evidence: `main.py:1452-1461`. -- Verify: article with no DOI + successful enrichment → exactly one file (post-P4), no intermediate stub. - -#### `ao-baseline-duplicate-shortcircuit` — IMP -When the baseline save detects the article already on disk under a different name, enrichment is skipped entirely and the function returns 1 after recording the summary. -- Evidence: `main.py:1469-1484`. -- Verify: baseline save reports duplicate → enrichment phases not entered, return 1. - ---- - -## 3. Trust-ordering - -#### `to-canonical-order-strict-rank` — LB *(consolidates: trust-order-canonical-list, trust-order-strict-rank-replace, trust-ordering-single-source, trust-rank-from-list-position, trust-order-precedence)* -`TRUST_ORDER` (13 elements: `csl > doi_bibtex > datacite > pubmed > europepmc > crossref > openalex > s2 > orcid > openreview > arxiv > scholar_page > scholar_min`) is the single source-precedence authority for both `@type` selection and generic field replacement. Trust rank = list index; a populated field is replaced ONLY when the incoming rank is **strictly less** (`new_rank < cur_rank`). Equal/less-trusted never overwrite. -- Evidence: `src/config.py:66-80`; `src/merge_utils.py:241,255-266,429-445`. -- Verify: assert `TRUST_ORDER` equals frozen list; property test that the earlier-in-TRUST_ORDER source wins a contested field; equal-rank second enricher does NOT overwrite. - -#### `to-unknown-source-rank-99` — LB *(consolidates: unknown-source-rank-99, trust-ordering-label-keys-match)* -Any source label not in `TRUST_ORDER` defaults to rank 99 (least trusted); it can only fill empty fields. Every `enr_list` label must be a real `TRUST_ORDER` key (a typo silently drops a source to 99 with no error). -- Evidence: `src/merge_utils.py:261,397,430-431,713`; labels `main.py:1552,1586,1614,1633,1652,1673,1700,1719`, `src/doi_utils.py:196,199`. -- Verify: enricher `source='bogus'` cannot overwrite a crossref field; assert set(labels) ⊆ set(TRUST_ORDER). - -#### `to-doi-source-gate` — LB *(consolidates: trust-doi-source-gate, doi-trust-gate-registration-agencies-only)* -A surviving merged DOI is retained only if some enricher from `{csl, doi_bibtex, datacite, pubmed, europepmc, crossref}` carries a DOI whose normalized form equals it; otherwise it is stripped. (Gate skipped when `has_doi_conflict` is True.) A primary/merged DOI conflict keeps the primary unless it is a preprint→published upgrade. -- Evidence: `src/merge_utils.py:457-502`. -- Verify: DOI from s2/arxiv only → dropped; same DOI also on crossref → kept; primary published vs merged preprint → primary kept. - -#### `to-empty-fill-bypasses-trust` — LB -The first `value_ok` value for an empty field is accepted unconditionally (sets `field_sources`) with no trust comparison; trust gating applies only when overwriting an already-populated field. -- Evidence: `src/merge_utils.py:288-295`. -- Verify: a field present only in the lowest-trust enricher still lands in merged output. - -#### `to-type-upgrade-valid-set-rank` — LB -Entry type upgrades from an enricher only if the enricher type ∈ `{article,inproceedings,incollection,book}` AND (its rank strictly better than `best_type_src`, OR equal rank with a differing type). `best_type_src` starts at `scholar_min`. -- Evidence: `src/merge_utils.py:243,254,260-271`. -- Verify: `test_merge_with_policy` (crossref inproceedings beats s2 article); a `misc`-typed high-trust enricher does not set `etype=misc`. - -#### `to-field-override-rules` — LB (umbrella) -Field-specific overrides that run **before/around** the generic trust gate, all preserved: DOI published-over-preprint (`ao-doi-published-beats-preprint-xor`); journal never→preprint (`ao-journal-never-downgrade`); title keep-longer/trust-diff (`ao-title-keep-longer-trust-diff`); booktitle generic↔specific (`ao-booktitle-generic-vs-specific`); pages leading-digit/no-dot/≤`PAGES_MAX_DIGITS` (`co-pages-validation`); author prefer-fewer-initials-then-longer (`co-author-prefer-fewer-initials`). Dropping any special-case lets a strictly-trusted source overwrite with worse data and re-triggers enrichment churn. -- Evidence: `src/merge_utils.py:298-427`; thresholds `src/config.py:826,829,340`. -- Verify: parametrized tests per field (see individual entries). - -#### `co-author-prefer-fewer-initials` — IMP (trust-adjacent) -At equal author-list length, incoming is rejected if it has MORE initials-only tokens (`^[A-Z]\.$`); at equal initials, rejected if its total name text is shorter. Runs before the trust gate. -- Evidence: `src/merge_utils.py:358-383,60`. -- Verify: current `'Samuel Smith'` + higher-trust `'S. Smith'` (same count) → keep full name. - ---- - -## 4. Dedup - -#### `dd-branch-order-first-match` — LB *(consolidates: dedup-branch-order-first-match-wins, dedup-scan-branch-order-first-break, dedup-branch-order-cascade)* -`save_entry_to_file`'s duplicate scan evaluates rules in fixed precedence and **breaks on first match**: DOI-exact → DOI-version base (`.vN`) → different-DOI preprint/published XOR (distinct-arXiv-eprint exclusion; title ≥0.55; composite−0.10 ≥0.60) → external-id+title → key+title/prefix → key+author-overlap (≥0.8, sim≥0.55) → key+preprint-pair → high-title-sim ≥0.95 → truncated+authors → strong-author (sim≥0.6, overlap≥0.9) → preprint-relaxed. Reordering changes which existing file is deemed the duplicate. -- Evidence: `src/merge_utils.py:980-1190`; `src/config.py:130,205,811`. -- Verify: table-driven, one crafted pair per branch asserting the emitted `FILE_MATCH` tag equals the earliest-firing branch; an ordering test where two branches could fire asserts higher-priority wins. - -#### `dd-composite-weights` — LB -`compute_dedup_score` is the additive 6-signal sum with exact weights: title 0.40, author-overlap 0.25, year 0.10(exact)/0.05(±1), venue 0.15, external_ids 0.15, preprint-XOR 0.10 (max 1.15). -- Evidence: `src/text_utils.py:511-546`. -- Verify: parametrized exact-score test (identical title+year+venue → 0.65); assert max attainable == 1.15. - -#### `dd-all-candidate-dois-includes-unmatched` — LB -`all_candidate_dois` collects normalized DOIs from ALL P2 candidates (matched and rejected via `seen_dois`), plus P2.5 injections, P3 discovery, and the merged entry's own DOI/eprint — for save-time on-disk dedup. Narrowing to matched-only reopens preprint/published oscillation. -- Evidence: `main.py:1490,694-699,1745,1752,1947,2536-2540`; passed as `seen_dois` at `main.py:1588,1616,1635,1655,1674,1702,1721,1773,1800`. -- Verify: a source returns a non-matching candidate carrying DOI X → X ∈ `all_candidate_dois` after P2. - -#### `dd-title-similarity-guard` — LB -A candidate DOI matching an existing on-disk file's DOI suppresses the write only when the two titles are similar (≥ `SIM_PREPRINT_TITLE_THRESHOLD`=0.55); below threshold the match is rejected as misattributed and the DOI reverted. Prevents a false API DOI from deleting an unrelated file. -- Evidence: `main.py:2564-2574`; `src/config.py:205`. -- Verify: existing DOI == candidate DOI, dissimilar titles → write proceeds + `_revert_misattributed_doi`; similar → write skipped, file removed. - -#### `dd-self-match-exclusion` — LB *(consolidates: dedup-self-match-exclusion, prefer-path-excluded-from-dup-scan)* -The entry's own `prefer_path`/`prefer_doi` is excluded from every duplicate scan: `prefer_basename` skipped in the file-scan loop, `prefer_doi` removed from `check_dois`, self path skipped by abspath compare — so an entry never dedups against / deletes itself. -- Evidence: `src/merge_utils.py:978-982`; `main.py:2542-2543,2549-2550`. -- Verify: enrich an in-place file whose DOI is also in `all_candidate_dois` → file updated, not skipped/removed; a real cross-file duplicate in a different file is still detected. - -#### `dd-strict-match-gate` — LB *(consolidates: correctness-strict-match-gate, dedup-strict-match-fastpath-order)* -Every enrichment entry (Scholar page, each API candidate, CSL, BibTeX) is admitted only after `bibtex_entries_match_strict` passes against the baseline. Its fast-path order/gates: exact-DOI True; same-class different-DOI False; XOR preprint/published falls through; exact arXiv eprint True / different eprint False; external_ids+title≥0.35 True; title≥0.95 requires author-overlap and no year divergence; truncated requires overlap+year; below 0.35 False; composite only when (preprint_pair | external_ids | high_author_match with ≥2 authors each). -- Evidence: gate impl `src/bibtex_utils.py:553-612,567-686`; call sites `main.py:701,1551`, `src/doi_utils.py:44,82`. -- Verify: a candidate differing in title/DOI/arXiv is rejected; parametrized tests per path (`DOI_EXACT`, `ARXIV_EXACT`, same-class-different-DOI→False, XOR→composite). - -#### `dd-orphan-delete-only-confirmed-dup` — LB -An orphan `.bib` (on disk, absent from CSV) is deleted ONLY when its parsed title has similarity ≥ `SIM_MERGE_DUPLICATE_THRESHOLD`=0.95 to a CSV-tracked title in the SAME author directory; empty title or no tracked match → kept (warning logged, never deleted). -- Evidence: `main.py:3093-3109,3091-3096`; `_load_csv_titles` grouping `main.py:2870-2877`. -- Verify: orphan matching a tracked same-dir title → removed; unique/empty-title orphan → retained; orphan in author A must not be deleted based on author B's title. - -#### `dd-a2i2-doi-before-title` — LB -a2i2 dedup runs DOI-based dedup (Pass 1, `doi_bases_match` fuzzy) across ALL entries first, then title-similarity dedup (Pass 2, ≥0.95) only for entries not already DOI-matched (`if idx in seen`). -- Evidence: `src/io_utils.py:547-585`. -- Verify: `test_dedup_by_title` + DOI-dup fixture; assert count==1. - -#### `dd-doi-version-equivalence` — IMP -`doi_bases_match` treats DOIs differing only by trailing `.vN` as the same work; this branch fires before the different-DOI XOR logic. -- Evidence: `src/id_utils.py:50-58`; consumed `src/merge_utils.py:1003`. -- Verify: `.v1`/`.v2` of same preprint → match; mismatched bases → no match. - -#### `dd-distinct-arxiv-different-papers` — IMP -Two entries with distinct non-empty arXiv eprint IDs are different papers — short-circuits preprint/published matching in file-scan and key-preprint branches and returns False in strict match. -- Evidence: `src/merge_utils.py:1020-1023,1107-1110`; `src/bibtex_utils.py:597-602`. -- Verify: eprints `2401.00001` vs `2401.00002`, similar titles, XOR DOI → not a duplicate. - -#### `dd-merge-union-primary-first` — IMP -`merge_publication_lists` dedups Scholar (primary) and DBLP (secondary) independently, then appends only non-duplicate secondary items to the primary-first list using `SIM_MERGE_DUPLICATE_THRESHOLD` — Scholar takes precedence, union size/order deterministic. -- Evidence: `src/clients/scholar.py:234-265,188-192`. -- Verify: Scholar+DBLP sharing one paper → single merged entry retaining the Scholar record; primary items precede appended secondary. - -#### `dd-orphan-title-scoped-to-author-dir` — IMP -Orphan duplicate comparison uses only titles tracked under that orphan's own author directory (`os.path.dirname(orphan)`), never the global set. -- Evidence: `main.py:3091-3096`; grouping `main.py:2870-2877`. -- Verify: two authors with same title; orphan under A not deleted based on B's tracked title. - -#### `dd-skip-write-return-cleanup` — IMP -On `skip_write`, return `(duplicate_path, False)` and, if `prefer_path` differs from the duplicate, remove the pre-enrichment baseline file (no stub left behind). -- Evidence: `src/merge_utils.py:1298-1305`. -- Verify: file count stays 1, path reused, `was_written` False. - -#### `dd-prefer-path-cleanup-blocked-when-richer` — IMP *(consolidates: prefer-path-cleanup-blocked-when-richer, data-loss-prefer-path-guard)* -When relocating an entry, the old `prefer_path` file is NOT deleted if it has more non-empty fields than the new entry, or equal fields plus a DOI; then return `(prefer_path, False)`, keeping the enriched original. -- Evidence: `src/merge_utils.py:1433-1455`. -- Verify: `prefer_path` 7 fields incl DOI, new 5 → kept, `os.remove` not called, `was_written` False. - ---- - -## 5. Cache - -#### `ca-monthly-boundary-expiry` — LB *(consolidates: cache-monthly-boundary-expiry, cache-monthly-expiry-boundary)* -Any cache entry (positive or safe-negative) whose timestamp precedes the 1st-of-current-month AST (UTC-4) boundary is stale → MISS, forcing a fresh request. The boundary is computed once at `ResponseCache` construction (see defect `ca-month-boundary-frozen`). -- Evidence: `src/cache.py:24-32,121-126`; AST `src/cache.py:21`. -- Verify: entry timestamped before the 1st → `get()` None; after → served. - -#### `ca-get-branch-order` — LB -`get()` evaluates in fixed order: (1) `CACHE_ENABLED` gate, (2) file-exists, (3) JSON-load (corrupt→MISS), (4) monthly-boundary staleness, (5) negative handling — unconfirmed (`not _safe`)→MISS/force-retry, safe→`_safe_negative_expired` check, else NEG_HIT, (6) positive→POS_HIT. -- Evidence: `src/cache.py:99-145`. -- Verify: table-driven over fresh/stale/unconfirmed-neg/safe-neg-live/safe-neg-expired/positive. - -#### `ca-negative-three-tier` — LB *(consolidates: cache-negative-three-tier-confirmation, cache-negative-three-tier, anti-oscillation-three-run-negative-confirmation)* -Negative entries are three-tier: transient errors never cached; unconfirmed negatives (`_confirmations < CACHE_NEGATIVE_CONFIRM_RUNS`=3) stored but NOT served (force retry); only after 3 consecutive empties is a "safe" negative served, expiring at the earlier of next Monday or 1st-of-next-month (AST). `put_negative` increments confirmations (capped then +1) and sets `_safe` at ≥3. This is the core anti-flap contract. -- Evidence: `src/cache.py:41-47,128-141,184-223`; `_safe_negative_expired` `:70-97`; `CACHE_NEGATIVE_CONFIRM_RUNS` `config.py:126`. -- Verify: `put_negative` 1–2× → `get()` None (retry); 3rd → served until Monday/month boundary. - -#### `ca-safe-negative-expiry` — LB -`_safe_negative_expired` expires a safe negative at the EARLIER of next-Monday-00:00-AST or 1st-of-next-month-00:00-AST, computed from the entry's own creation timestamp (Monday-created → `+7` days, `days_to_monday = (7-weekday)%7 or 7`). -- Evidence: `src/cache.py:70-97,134-138`. -- Verify: parametrized over creation weekdays asserting `expiry == min(next_monday, next_first)`. - -#### `ca-atomic-write` — LB *(consolidates: cache-atomic-write-tmp-replace-warn-noraise, concurrency-atomic-cache-write)* -`_write_entry` writes via `tempfile.mkstemp` + `os.replace` (atomic); on failure the tmp file is removed and `OSError` is caught/logged at WARN without raising — readers never see a partial JSON, and cache-write failures never propagate. -- Evidence: `src/cache.py:159-182`. -- Verify: simulate `os.replace` failure → no tmp files remain, no exception, target never partial. - -#### `ca-positive-freshness-not-ttl` — LB *(consolidates: cache-positive-freshness-not-ttl, cache-ttl_days-written-not-read-vestigial)* -Positive freshness is governed **solely** by the monthly boundary — `get()` does NOT enforce per-entry `ttl_days`. `ttl_days` is written by `put`/`_write_entry` and accepted as an arg but **never read by `get()`** (vestigial). A refactor that "restores" ttl_days honoring silently overrides the monthly-refresh model for every namespace. -- Evidence: `src/cache.py:99-145,147,165`; callers `src/clients/utility_apis.py:160,275`; DOI-from-HTML ttl `main.py:1933,1936`. -- Verify: store a positive entry with `ttl_days=1` timestamped after the month boundary → still served; entry before boundary → MISS regardless of ttl. - -#### `ca-confirmation-rmw-under-lock` — LB -`put_negative` does read-existing / increment / write-back of `_confirmations` entirely under the per-namespace lock; the count is monotonic and saturates (`min(existing,N)+1`). -- Evidence: `src/cache.py:195-223`; `_lock_for` `:56-58`. -- Verify: concurrent `put_negative` on one key → final count increased by number of calls (bounded by cap). - -#### `ca-doi-html-negative-on-read` — IMP -Phase-3 DOI-from-HTML scraping caches both HTTP failures and empty scrapes as `{'doi':''}` (ttl_days=60) and, on read, treats an empty cached doi as a negative hit (continue to next URL) — no repeat HTTP within the window. -- Evidence: `main.py:1919-1936`. -- Verify: first run scrapes empty + caches; second run reads cache, no HTTP, moves to next URL. - -#### `ca-counters-exactly-one-per-get` — IMP -Every terminating path of `get()` increments exactly one of `_CACHE_POS_HITS`/`_CACHE_NEG_HITS`/`_CACHE_MISSES` under `_CACHE_COUNTER_LOCK`. -- Evidence: `src/cache.py:100-145`; lock `:19`. -- Verify: exercise each branch once; assert exactly one counter moves per call and totals reconcile. - -#### `ca-disabled-is-total-noop` — IMP -When `CACHE_ENABLED` is False, `get()` returns None (no counter change) and `put`/`put_negative` return immediately without touching disk. -- Evidence: `src/cache.py:101,148,192`; `config.py:127`. -- Verify: disabled → `get` None, no files written. - -#### `ca-month-boundary-frozen` — IMP — ⚠ LATENT DEFECT -`self._month_boundary` is computed once in `__init__`, and `response_cache` is a module-level singleton created at import — the staleness boundary is frozen for the process lifetime and does not advance across a month rollover. Current behavior tests observe; see CONFLICTS. -- Evidence: `src/cache.py:54,257,24-32`. -- Verify: instantiate cache, monkeypatch clock to next month, assert `_month_boundary` unchanged unless a new `ResponseCache` is built. - ---- - -## 6. Concurrency - -#### `co-shared-state-locks` — LB *(consolidates: concurrency-shared-state-locks, csv-mutations-under-lock, cache-per-namespace-lock-and-sha256-path, concurrency-per-namespace-lock)* -All shared mutable state is lock-guarded: per-namespace cache file locks (`_lock_for` under `_meta_lock`, held for every get/put/put_negative/invalidate), a global cache-counter lock, and the summary-CSV in-memory index/updates (`_CSV_LOCK`) and API counters. Cache entry paths are `cache_dir/namespace/.json`. -- Evidence: `src/cache.py:19,52-68,103-108,155-157`; `src/io_utils.py:40,281-283,303-304,316,334,415`. -- Verify: thread-stress `put_negative` + `append_summary_to_csv` from many threads on one key → no corruption, correct final counts; assert path == `.../sha256hex.json`. - -#### `co-single-writer-per-author-dir` — LB *(consolidates: single-writer-per-author-dir-no-lock, concurrency-single-writer-per-author-dir)* -`save_entry_to_file` performs unlocked read-modify-write (`listdir`+read+`os.remove`+`open('w')`) on the author dir; dedup/anti-oscillation correctness assumes **at most one writer per author dir** — parallelism is across authors (`ThreadPoolExecutor`, `MAX_WORKERS`), one `process_record` per Record. Any refactor parallelizing within an author MUST add per-dir locking. -- Evidence: `src/merge_utils.py:949-1504` (no lock); `main.py:2998-3018`; `src/config.py:833,854`. -- Verify: assert records map to unique `format_author_dirname` per submitted future; document the precondition; stress test two concurrent saves on one dir is expected-flaky (records the assumption). - -#### `co-sleeps-outside-global-semaphore` — LB -All `time.sleep()` (backoff and Retry-After waits) occur OUTSIDE the `with _GLOBAL_SEMAPHORE:` block; the semaphore is held only for the actual request send/receive. -- Evidence: `src/http_utils.py:338-369` (semaphore :338-363, sleeps :366-369). -- Verify: instrument acquire/release around a forced 429; assert semaphore released before sleep. - -#### `co-global-semaphore-bounds-inflight` — IMP -A single module-level `threading.Semaphore(GLOBAL_CONCURRENCY_LIMIT=16)` gates every in-flight HTTP request across all threads; each attempt acquires one permit for the send. (Default 16 > `MAX_WORKERS` 12, so it rarely binds but must still bound when `CITEFORGE_CONCURRENCY` is lowered.) -- Evidence: `src/http_utils.py:177,338`; `src/config.py:854`. -- Verify: `CITEFORGE_CONCURRENCY=2`, 8 threads → max concurrent in-flight ≤ 2. - -#### `co-threadpool-worker-cap` — IMP -Author processing runs on `ThreadPoolExecutor(max_workers=MAX_WORKERS)` (default 12, `CITEFORGE_MAX_WORKERS` override); the env var is the single knob. -- Evidence: `src/config.py:833`; `main.py:2998,3001-3018`. -- Verify: executor constructed with `MAX_WORKERS`; `CITEFORGE_MAX_WORKERS=1` smoke run completes identically. - -#### `co-thread-local-logging` — IMP -Each worker rebinds the logger to a per-author `author.log` via `logger.set_log_file` at `process_record` start and closes it in `finally`; the main thread logs to `output/run.log`. -- Evidence: `main.py:2707-2709,2847-2849,2898`. -- Verify: two `process_record` calls on separate threads → each author's lines only in its own log. - -#### `co-result-timeouts` — IMP -Result collection uses `future.result(timeout=30)` per author and `as_completed(..., timeout=author_timeout*len(records))` with `author_timeout=1800`; timeouts are caught/logged (per-author + pipeline-level listing pending authors) rather than crashing. -- Evidence: `main.py:2996,3023,3026,3033-3052`. -- Verify: a future sleeping >30s → TimeoutError branch logs, processing continues; overall timeout == 1800×len. - -#### `co-rate-limit-token-once-per-call` — IMP -`limiter.acquire()` is called exactly once per `_http_request`, before the retry loop — retries consume no additional tokens. -- Evidence: `src/http_utils.py:327-329,334`. -- Verify: force 3 manual retries → `acquire` called once. - -#### `co-token-bucket-semantics` — IMP -`TokenBucketRateLimiter` refills using `time.monotonic()` (`elapsed*rate` capped at burst), deducts 1.0 per acquire, and when starved sleeps `wait=(1-tokens)/rate` + jitter up to 30% (`uniform(0, wait*0.3)`), all under a per-limiter lock. -- Evidence: `src/http_utils.py:183-211`. -- Verify: observed throughput ≈ rate with burst headroom; assert `time.monotonic` used. - -#### `co-rate-limiter-registry-singleton` — IMP -`_get_rate_limiter` returns None when the namespace is absent from `RATE_LIMITS` (no throttling), else lazily creates exactly one limiter per namespace via double-checked locking. -- Evidence: `src/http_utils.py:214-233`; `src/config.py:836-850`. -- Verify: `_get_rate_limiter('other') is None`; `_get_rate_limiter('arxiv') is _get_rate_limiter('arxiv')`. - -#### `co-thread-excepthook-visibility` — MIN -A custom `threading.excepthook` logs any uncaught worker-thread exception (name + type/value) before delegating to the original hook. -- Evidence: `main.py:2982-2992`. -- Verify: force an uncaught worker exception → ERROR log naming thread+exception; original hook still runs. - -#### `co-session-per-thread-rotation` — MIN -`_get_session` returns a thread-local `requests.Session` with `_RETRY_STRATEGY`, rotated (closed+recreated) after `SESSION_ROTATION_THRESHOLD=50` requests; the counter increments once per attempt (retries count toward rotation). -- Evidence: `src/http_utils.py:245-260,340-341`; `src/config.py:857`. -- Verify: 51 requests on one thread → exactly one rotation. - ---- - -## 7. Error-handling - -#### `eh-per-unit-isolation` — LB *(consolidates: error-handling-per-unit-isolation, error-handling-per-source-isolation)* -Failures are isolated at each granularity: per-article exceptions (`FULL_OPERATION_ERRORS`) caught inside the article loop; per-source API exceptions (`ALL_API_ERRORS`) caught around every P2/P2.5 enrichment call — one article or one source failing never aborts the author or the run. -- Evidence: article loop `main.py:2840-2841`; per-source `main.py:1567-1568,1598-1599,1618-1619,1637-1638,1657-1658,1685-1686,1704-1705,1723-1724,1775-1779,1802-1806`. -- Verify: one API client raises → enrichment proceeds with remaining sources; one article raises → subsequent articles still process. - -#### `eh-error-tuple-membership-frozen` — LB -Exception-group tuple membership is a frozen contract downstream catches depend on: `NETWORK_ERRORS = HTTP_ERRORS + TIMEOUT_ERRORS + (RuntimeError,)` **excludes** ValueError; `ALL_API_ERRORS = NETWORK_ERRORS + DECODE_ERRORS` **excludes** ValueError; `ALL_FETCH_ERRORS = NETWORK_ERRORS + DECODE_ERRORS + PARSE_ERRORS` **includes** ValueError (via `PARSE_ERRORS=(ValueError,TypeError,KeyError)`); `DECODE_ERRORS=(UnicodeDecodeError,UnicodeError)`. -- Evidence: `src/exceptions.py:31-49`. -- Verify: assert `ValueError not in ALL_API_ERRORS and ValueError not in NETWORK_ERRORS and ValueError in ALL_FETCH_ERRORS`. - -#### `eh-handle-api-errors-scope` — LB -`@handle_api_errors` wraps a call in `try/except ALL_API_ERRORS`, logs DEBUG, returns `default_return`; it does NOT catch ValueError/parse errors — JSON-decode failures propagate through decorated functions. -- Evidence: `src/http_utils.py:263-278`. -- Verify: decorated fn raising ValueError propagates; raising `RequestException` → `default_return`. - -#### `eh-decode-json-valueerror-with-url` — LB — ⚠ DEFECT-ADJACENT -`_decode_json_bytes` raises a plain `ValueError` (not NETWORK/DECODE) on malformed JSON, with the message embedding the **full request URL** (`{url!r}`) + 256-byte preview. This type (uncaught by `ALL_API_ERRORS`) and the URL-carrying payload are the active key-leak vector for URL-embedded secrets. -- Evidence: `src/http_utils.py:388-399`. -- Verify: on bad bytes, `isinstance(raised, ValueError)` and `url in str(raised)`. - -#### `eh-gemini-key-leak` — LB — ⚠ DEFECT -The Gemini URL embeds the secret as `?key={api_key}`; a malformed-JSON `ValueError` carries that full URL, and the Gemini caller catches `(*ALL_API_ERRORS, ValueError)` and logs it at WARN — exposing the API key in warning logs. The invariant to enforce is **redaction of URL secrets before logging**. -- Evidence: `src/clients/utility_apis.py:45,88-90`; leak source `src/http_utils.py:399`. -- Verify: assert `'key='` not in captured WARN record when Gemini returns invalid JSON. - -#### `eh-bibyear-fallback-lower-bound-guard` — LB -The BibTeX-year fallback removes a file only when `0 < bib_year < window_min`; `bib_year == 0` (missing/unparseable, `extract_year_from_any(fallback=0)`) never triggers deletion. -- Evidence: `main.py:3142-3151`. -- Verify: unparseable-year file retained; year=2000 (= SIM_MERGE_DUPLICATE_THRESHOLD`. - -#### `cd-min-year-max-pubs` — IMP *(consolidates: config-driven-min-year-and-max-pubs, min-year-config-driven-env)* -`MIN_YEAR` = `CITEFORGE_MIN_YEAR` (default 2020) with a rolling-window fallback when unset (`get_min_year`); `MAX_PUBLICATIONS_PER_AUTHOR` = `PUBLICATIONS_PER_YEAR × CONTRIBUTION_WINDOW_YEARS`. Both env/derived, never fixed literals; the year-window cleanup and a2i2 filter must use `get_min_year()`. -- Evidence: `src/config.py:32-43,52-58`; consumed `main.py:2717,2731,3117`, `src/io_utils.py:494`. -- Verify: `CITEFORGE_MIN_YEAR=2015` → `get_min_year()==2015` and `MAX_PUBLICATIONS_PER_AUTHOR` scales, both cleanup and a2i2 honor it; unset → rolling fallback. - -#### `cd-inline-magic-numbers-preserved` — IMP -Several load-bearing inline literals in the dedup cascade are intentional and must be preserved (not naively routed through one shared constant): key+author-overlap gate (`overlap≥0.8 AND key_title_sim≥0.55`), strong-author gate (`sim≥0.6, ≥2 authors each, overlap≥0.9`), prefix-stub `len>20`, `high_author_match` (`overlap≥0.9, title≥0.6, ≥2 authors`), and the `+3` field-advantage margin. -- Evidence: `src/merge_utils.py:1072-1073,1090,1151-1156,1250`; `src/bibtex_utils.py:666-671`. -- Verify: golden boundary tests — `overlap=0.79 vs 0.80` flips `KEY_AUTHOR_OVERLAP`; `existing==new+2 vs new+3` flips `KEEP_EXISTING` vs `REPLACE`. - -#### `cd-urllib3-retry-params` — IMP -The urllib3 `Retry` is built from config: `total=HTTP_MAX_RETRIES(2)`, `backoff_factor=HTTP_BACKOFF_INITIAL(0.25)`, `backoff_max=HTTP_BACKOFF_MAX(16.0)`, forcelist derived from `HTTP_RETRY_STATUS_CODES`. -- Evidence: `src/http_utils.py:163-175`; `src/config.py:107-110`. -- Verify: assert `_RETRY_STRATEGY.total==HTTP_MAX_RETRIES and backoff_factor==HTTP_BACKOFF_INITIAL`. - -#### `cd-sim-threshold-fp-tolerance` — MIN -Candidate-acceptance similarity comparisons apply `SIM_THRESHOLD_TOLERANCE=0.01` as FP slack (e.g. `SIM_EXACT_PICK_THRESHOLD - tolerance`). -- Evidence: `src/config.py:823,90`; consumed `src/api_generics.py:320`. -- Verify: score == threshold−epsilon → acceptance stable. - ---- - -## 10. Correctness - -#### `co-return-code-contract` — LB *(consolidates: api-contract-return-counts, api-contract-return-code)* -`process_article` returns 1 exactly when a file is written/kept and 0 for every skip/failure/dedup/guard path; `process_record` sums these into the per-author count; `main()` aggregates into `total_saved`. The 1/0 int-sum contract is load-bearing for reporting. -- Evidence: `main.py:734-737,762,778,1356,1484,2485,2500,2522,2529,2586,2607,2829-2846,3027`. -- Verify: assert `process_article` returns int ∈ {0,1} across skip and write paths; `process_record` returns the sum. - -#### `co-save-return-tuple` — LB -`save_entry_to_file` returns `(path, was_written)`: `was_written` False on SKIP_WRITE, prefer-path-more-complete block, and unresolved filename collision. Callers rely on `path2 != path` (rename) and `was_written` for accounting. -- Evidence: `src/merge_utils.py:934,1305,1382,1451,1504`; consumed `main.py:1463-1470,2609-2614`. -- Verify: each exit returns `(path, bool)`; SKIP_WRITE → False; fresh write → True. - -#### `co-value-ok-gate-every-field` — LB -`value_ok(v) = (v is not None) and (not has_placeholder(v))` gates EVERY field on both sides: a placeholder/None incoming value is skipped; a placeholder/None current value is treated as empty (overwritable regardless of trust). -- Evidence: `src/merge_utils.py:251-252,285-295`. -- Verify: enricher `'n/a'` skipped; placeholder current value replaced by a lower-trust real value. - -#### `co-doi-normalize-or-drop` — LB -Merged `doi` is normalized via `_norm_doi`; empty result → removed, else replaced with the normalized form before any downstream DOI logic. -- Evidence: `src/merge_utils.py:447-455`. -- Verify: `test_doi_normalization`; `merged['doi'] == _norm_doi` form. - -#### `co-doi-conflict-primary-wins` — LB -If the primary had a DOI and the merged DOI differs, the primary DOI is restored and `has_doi_conflict` set — UNLESS a preprint→published upgrade (published kept, no conflict). `has_doi_conflict` also controls whether the trust gate runs. -- Evidence: `src/merge_utils.py:457-477`. -- Verify: primary `10.x/A`, merged `10.y/B` (both published) → restored to A; primary preprint, merged published → published kept. - -#### `co-container-enforcement-by-type` — LB -Exactly one venue container per final type (`get_container_field`): article keeps `journal` (booktitle/howpublished popped); inproceedings/incollection keep `booktitle` (journal migrated/popped); all others keep `howpublished`. Last structural step before serialization. -- Evidence: `src/merge_utils.py:879-913`; `src/bibtex_build.py:27-37`. -- Verify: per-type — `@article` has journal + no booktitle/howpublished; `@inproceedings` has booktitle + no journal. - -#### `co-type-revalidate-authoritative` — LB -`determine_entry_type` over `{journal,booktitle,howpublished,publisher,pages}` may reclassify to inproceedings/incollection, but an `@article` from an authoritative source (`best_type_src ∈ {csl, doi_bibtex}`) is preserved unless its DOI is secondary; `@book` never downgraded by venue content; `@misc` upgraded via venue hints. -- Evidence: `src/merge_utils.py:821-858`; `src/bibtex_build.py:176-230`. -- Verify: csl `@article` with conference-like journal stays `@article`; `@misc` with only journal → article. - -#### `co-year-window-enforced-everywhere` — LB *(consolidates: correctness-year-window-enforced-everywhere, correctness-year-window-guard, a2i2-window-filter-inclusive-both-ends, filename-year-takes-precedence-over-bibyear)* -The `min_year` window is enforced at every checkpoint so no out-of-window `.bib` survives a completed run: at fetch (`scholar_windowed`/DBLP), at baseline load (out-of-window existing file removed), at final save (`0 < final_year < min_year` → rejected+removed, return 0), and in the post-run sweep. The sweep tries the **filename year first** (`_FILENAME_YEAR_RE` on `/{fname}`, always `continue`s when matched); only non-matching filenames fall through to the BibTeX-year fallback (guarded `0 < bib_year < window_min`). The a2i2 filter uses `min_year ≤ year ≤ current_year` (inclusive both ends), skipping unparseable years. -- Evidence: `main.py:2776,1438-1449,2596-2607,3116-3158,3128-3153`; `_FILENAME_YEAR_RE` `main.py:144`; `src/io_utils.py:523-530`; `get_min_year` `src/config.py:38-43`. -- Verify: `Alice2024-X.bib` with bib-year 2000 KEPT (filename wins); non-filename-year file with year 2000 (8); `'13905-13917'` accepted; `'007-012'`→`'7-12'`. - -#### `co-process-validated-doi-append-contract` — LB -`process_validated_doi` appends `('csl',entry)+flags['doi_csl']` and `('doi_bibtex',entry)+flags['doi_bibtex']` **only for matched (non-None) entries**, and returns True iff at least one format matched. CSL is fetched first; BibTeX only if CSL did not match. -- Evidence: `src/doi_utils.py:195-209,46-48,84-89,157-165`. -- Verify: CSL matches → only `('csl',...)` appended, `flags['doi_csl']` True, `fetch_bibtex_via_doi` not called, returns True. - -#### `co-gate-block-on-csv-existence` — LB -The entire post-run reconciliation block (flush, reconcile, orphan removal, year-window cleanup, post-run fixup, a2i2 build, baseline.json, badges.json) executes ONLY when `summary_csv_path` is truthy AND `os.path.exists(summary_csv_path)`; otherwise none of it runs. -- Evidence: `main.py:3070`. -- Verify: non-existent CSV → `out_dir/a2i2`, `baseline.json`, `badges.json` NOT created, no side effects. - -#### `co-reconciliation-step-ordering` — LB *(consolidates: reconciliation-step-ordering, correctness-postrun-cleanup-ordering)* -Post-run steps run in fixed order: flush CSV → reconcile phantoms → collect orphans → per-orphan duplicate-gated delete → year-window `.bib` removal → post-run `_fixup_bib_entry` over ALL `.bib` → build a2i2 → baseline.json → badges.json. Later steps depend on earlier (collect_orphan_files requires reconcile first; a2i2 copies from already-cleaned+fixed dirs; the a2i2 dir is excluded from per-author sweeps). -- Evidence: `main.py:3071,3074,3079,3099,3116-3117,3160-3182,3190,3197-3208,3210-3225,3121,3166`; `src/io_utils.py:366-368`. -- Verify: integration test over a seeded dir (phantom row + orphan + out-of-window file) → final state matches ordered pipeline; a2i2 files equal post-fixup author-dir bytes; only confirmed-duplicate orphans removed; baseline totals match final `.bib` count. - -#### `co-conference-journal-word-boundary` — LB *(consolidates: conference-journal-detection-word-boundary, journals-named-proceedings-word-boundary)* -`_is_conference_journal` reclassifies `@article`→`@inproceedings` when the journal looks like proceedings (contains 'proceedings'/'tagungsband', starts 'conference on', contains '@', or in `CONFERENCE_AS_JOURNAL`) but EXCLUDES real journals via **word-boundary** match against `JOURNALS_NAMED_PROCEEDINGS` (PNAS, PVLDB, Proc. IEEE, Royal Society) — prefix followed by end/space/comma/period/semicolon/colon, NOT bare substring (so "proceedings of the ieee/cvf winter conference" ≠ journal "proceedings of the ieee"). -- Evidence: `src/merge_utils.py:117-151,757-765`; `src/config.py:167-171,209-214`. -- Verify: `'Proceedings of the National Academy of Sciences'` stays `@article`; `'Proceedings of the 2024 Conference on X'` → `@inproceedings`; `'Proceedings of the IEEE/CVF Winter Conference ...'` → True (conference) while `'Proceedings of the IEEE'` → False. - -#### `co-doi-validation-csl-first` — IMP -DOI validation fetches CSL-JSON first and only fetches BibTeX when CSL did not match. -- Evidence: `src/doi_utils.py:157-165,148`. -- Verify: mock CSL match → `fetch_bibtex_via_doi` not called, only `('csl',...)` appended. - -#### `co-summary-csv-cwd-relative-paths` — IMP *(consolidates: correctness-summary-csv-cwd-relative-paths, reconcile-uses-raw-relative-path-cwd)* -Summary CSV `file_path` entries are stored CWD-relative via `os.path.relpath`; `reconcile_summary_csv` checks `os.path.exists(fp)` on the RAW relative path, so it is correct only when CWD == project root (same CWD as when rows were written). `is_known_summary_path` dedup and phantom cleanup operate on these relative paths; `collect_orphan_files`/`_load_csv_titles` DO `os.path.abspath`. -- Evidence: `main.py:2617,1349-1355,1477-1483,3070-3114,2870-2871`; `src/io_utils.py:412-423`; contrast abspath `src/io_utils.py:376`, `main.py:2870`. -- Verify: append rows from CWD A, reconcile from CWD A → stable; `is_known_summary_path` matches on the relative form; document the CWD precondition. - -#### `co-pnas-suffix-conference-guard` — IMP *(consolidates: pnas-pvldb-suffix-conference-guard, jnp-suffix-conference-guard)* -In the inproceedings→article reclassification for `JOURNALS_NAMED_PROCEEDINGS`, conversion is skipped when the booktitle suffix after the matched journal name contains 'conference', 'workshop', or 'symposium'. Present and identical at all three fix sites. -- Evidence: `main.py:342-350,1113-1124,2110-2121`. -- Verify: `test_jnp_suffix_guard_ieee_conference_stays_inproceedings`, `test_jnp_suffix_guard_pnas_becomes_article`; bare 'Proceedings of the VLDB Endowment' → article, '... Workshop on X' → stays inproceedings. - -#### `co-filesystem-is-state` — IMP -When `SKIP_SCHOLAR_FOR_EXISTING_FILES` is True, an existing `.bib` whose title matches (sim ≥ `SIM_MERGE_DUPLICATE_THRESHOLD`) is loaded as the enrichment baseline and the Scholar-page fetch is skipped; scheduling (`count_existing_papers`/`_has_output`) and the summary CSV also read disk state. -- Evidence: `src/config.py:61`; `main.py:815-858,1538-1539,2852-2860,2971-2973`. -- Verify: seed a matching `.bib` → used as baseline, no Scholar citation fetch; `count_existing_papers` reflects the file. - -#### `co-force-enrich-flag` — IMP -`FORCE_ENRICH` is derived once from `'--force' in sys.argv` and gates the "entry already complete → skip enrichment" shortcut; when set, complete entries are re-enriched. -- Evidence: `main.py:117,1312`. -- Verify: complete on-disk entry, `FORCE_ENRICH` False → skips (returns 1, no API calls); True → runs enrichment. - -#### `co-phase25-gating` — IMP -Phase 2.5 executes only when `enr_list` is empty after Phase 2; its Tier-1 OpenAlex sub-search runs only if still empty after Crossref; it injects arXiv-id/DOI fragments to enable Phase 3 discovery. -- Evidence: `main.py:1728,1740-1745,1748-1752,1755,1782`. -- Verify: with a P2 match, P2.5 skipped; with no match + arXiv-bearing pub string → `bf['eprint']` set, arXiv DOI added to `all_candidate_dois`. - -#### `co-title-is-venue-and-book-skip` — IMP -Entries whose title equals the journal or booktitle (corrupted Scholar data), and entries typed `@book` (proceedings volumes/edited books), are skipped and their file removed (return 0). -- Evidence: `main.py:2471-2485,2487-2500`. -- Verify: title==journal entry and `@book` entry each return 0 and remove any created file. - -#### `co-misc-upgrade-preprint-repo-guard` — IMP -The Phase-4 misc→inproceedings upgrade is blocked when `howpublished` names a preprint server (`PREPRINT_SERVERS` + inline list) or a repository (`REPOSITORY_AS_JOURNAL`); only genuine venue howpublished values upgrade. -- Evidence: `main.py:2385-2401`; `src/config.py:133,175-187`. -- Verify: `howpublished='arXiv'` stays `@misc`; `'NeurIPS Workshop on X'` → `@inproceedings`. - -#### `co-dagstuhl-doi-resolution` — IMP *(consolidates: dagstuhl-doi-resolution, dagstuhl-lipics-doi-regex)* -A DOI matching `^10.4230/(lipics|oasics)..[.]$` (anchored, case-insensitive) forces `@inproceedings`, sets booktitle from `ABBREVIATED_VENUE_MAP[conf]` (else old journal), drops journal+howpublished. -- Evidence: `src/merge_utils.py:52-55,767-803,774`; `src/config.py:289-337,346-358`. -- Verify: `'10.4230/LIPIcs.ESA.2023.5'` → inproceedings, booktitle 'European Symposium on Algorithms', no journal; reject near-miss prefixes. - -#### `co-venue-abbrev-expansion` — IMP -For journal/booktitle/howpublished, a value equal (case-insensitive) to an `ABBREVIATED_VENUE_MAP` key is expanded; a match in the journal field is moved to booktitle (journal popped), since all mapped venues are conferences. -- Evidence: `src/merge_utils.py:809-819`. -- Verify: `journal='SPIRE'` → booktitle 'String Processing and Information Retrieval', journal absent. - -#### `co-three-casing-engines` — IMP -Title, venue, and author casing are three distinct engines that must remain separate: title ALL-CAPS via `_fix_allcaps_title` (gated at >60% uppercase), venue via `VENUE_CASE_CORRECTIONS` exact-match dict (Phase 4), author via `_fix_author_casing`. -- Evidence: `src/text_utils.py:173-200,203-227`; `config.py:251-256`, `main.py:2301-2309`; `src/merge_utils.py:166-204`. -- Verify: `_fix_allcaps_title` leaves normal mixed-case unchanged and only fires >60% caps; author/venue paths untouched by title logic. - -#### `co-cross-file-key-collision-disambiguation` — IMP -Before writing, if another `.bib` in the dir holds the same citekey on a genuinely different paper (different normalized DOI), the new key gets a distinguishing suffix (first significant title word not already in the key, else `'B'`); same-paper key collisions are left intact. -- Evidence: `src/merge_utils.py:1457-1489`. -- Verify: two different-DOI papers colliding on `'Smith2024'` → second becomes `'Smith2024'` deterministically; same-DOI collision keeps key. - -#### `co-doi-revert-restores-validated` — IMP -`_revert_misattributed_doi` only acts when `merged_fields['doi']==bad_doi`, replacing it with the P1-validated `doi_early` (when `doi_validated`) or else removing doi AND url; never leaves a mis-attributed candidate DOI in place. -- Evidence: `main.py:634-655`. -- Verify: bad_doi + validated fallback → doi replaced with normalized doi_early, url popped; no fallback → doi and url removed. - -#### `co-year-and-fixup-skip-a2i2-dir` — IMP -Year-window cleanup and post-run fixup skip the `a2i2` entry (and non-directories), so the joint folder is never cleaned/fixed in place; a2i2 is fully rebuilt afterward. -- Evidence: `main.py:3121,3166,3190`. -- Verify: a stale file under `out_dir/a2i2` untouched by year-window/fixup passes (only `build_a2i2_folder` wipes it). - ---- - -## CONTRADICTIONS / CONFLICTS — Defect Seams - -These are the seams where fixing a known defect risks violating an invariant. Each lists the defect, the invariant(s) in tension, and the safe resolution. - -### C1 — Compounding retry (429/503 double-backoff) -- **Defect**: request amplification risk if 429/503 are handled at both urllib3 and manual layers; POST retried non-idempotently. -- **Invariants in tension**: `ao-429-503-excluded-from-urllib3-forcelist`, `correctness-urllib3-retry-after-disabled` (Correctness/§10 via `eh-manual-retry-loop`), `correctness-retry-after-capped-at-backoff-max`, `co-sleeps-outside-global-semaphore`, `eh-defect-post-retried-non-idempotent`. -- **Seam**: A refactor "unifying" retry logic must NOT re-add 429/503 to `status_forcelist`, must keep `respect_retry_after_header=False`, must keep the `min(rate_wait, HTTP_BACKOFF_MAX)` cap, and must keep every `time.sleep` outside the semaphore. Any consolidation that moves sleeps inside the semaphore reintroduces slot-starvation (`co-sleeps-outside-global-semaphore`). Deciding to stop retrying POST is a behavior change (`eh-defect-post-retried-non-idempotent`) that must be conscious. - -### C2 — Uncaught ValueError from `_decode_json_bytes` + Gemini API-key log leak -- **Defect**: malformed JSON raises a bare `ValueError` carrying the full URL; DataCite/ORCID let it escape; the Gemini caller catches and WARN-logs it, leaking `?key=`. -- **Invariants in tension**: `eh-error-tuple-membership-frozen`, `eh-handle-api-errors-scope`, `eh-decode-json-valueerror-with-url`, `eh-gemini-key-leak`, `eh-datacite-orcid-valueerror-escapes`. -- **Seam / DIRECT CONFLICT**: The "obvious" fix — add `ValueError` to `ALL_API_ERRORS`/`NETWORK_ERRORS` — **violates `eh-error-tuple-membership-frozen`** and silently swallows genuine decode failures across all decorated clients (changing DataCite/ORCID/Gemini result semantics to `default_return`/negative-cache). The correct fix is to **redact the URL in the `ValueError` message at `src/http_utils.py:399`** (and/or strip `key=`/tokens before logging), leaving tuple membership and propagation behavior unchanged. This resolves the key leak (`eh-gemini-key-leak`) without touching the frozen tuples. - -### C3 — `ttl_days` vestigial vs monthly-boundary freshness -- **Defect**: `ttl_days` is written to every cache entry and accepted as an arg but never read by `get()`. -- **Invariants in tension**: `ca-positive-freshness-not-ttl`, `ca-monthly-boundary-expiry`, `ca-negative-three-tier`. -- **Seam / DIRECT CONFLICT**: "Restoring" ttl_days honoring in `get()` **violates `ca-positive-freshness-not-ttl`** and silently changes effective lifetimes for every namespace (DOI 90d, search 60d, gemini 365d), altering hit rates and API volume. Safe options: leave as-is (documented vestigial) OR remove the write path — but NOT wire it into expiry without an explicit, tested semantics change. - -### C4 — Frozen `_month_boundary` at singleton init -- **Defect**: `_month_boundary` is computed once at import and never advances; a process spanning a month rollover keeps serving last-month entries as fresh. -- **Invariants in tension**: `ca-month-boundary-frozen` (documents current behavior), `ca-monthly-boundary-expiry` (assumes an active boundary). -- **Seam**: Fixing this (recompute per `get()`) changes month-refresh timing and will break any test that observes the frozen value (`test_month_boundary_frozen`). Because CiteForge runs are short-lived batch processes, the practical impact is low; if fixed, update `ca-month-boundary-frozen`'s verification and confirm the once-per-month refresh contract (`ca-monthly-boundary-expiry`) still holds mid-run. Do not "fix" by further hard-freezing (e.g. caching across process restarts). - -### C5 — Phase-4 type-reclassification asymmetry (parity vs superset) -- **Defect / prior-digest error**: the prior study claimed Phase 4 (site C) OMITS the article/inproceedings reclassifications; reader 6 found C is a SUPERSET (it contains the core set PLUS post-enrichment-only rules). -- **Invariants in tension**: `ao-three-way-fixup-parity` (all three sites must apply the CORE rules identically) vs `ao-phase4-superset` (C legitimately has MORE rules, including the only misc→inproceedings upgrade). -- **Seam / RESOLUTION**: These are reconcilable but easy to break. The **core reclassification + text + booktitle rules must be byte-identical across A/B/C**; C's extras (patent→misc, unpublished→misc, url-booktitle→misc, article-preprint-DOI, misc→inproceedings upgrade) must remain **C-only**. A naive consolidation that makes all three sites identical will either drop C's extras or push the misc→inproceedings upgrade into A/B (where `howpublished` is still transient/pre-enrichment), promoting entries incorrectly. Any refactor here must run the reclassification-parity test AND assert the upgrade appears only in the Phase-4 path. - -### C6 — OpenReview lock-free read (unguarded concurrency surface) -- **Defect**: an OpenReview client read is reported to bypass the lock discipline. -- **Invariants in tension**: `co-shared-state-locks` (all shared mutable state lock-guarded), `co-rate-limiter-registry-singleton` (double-checked locking), `co-single-writer-per-author-dir` (partitioning, not locking, protects author dirs). -- **Seam / GAP**: The 7 invariant sets contain **no OpenReview-specific invariant**, so this is an unguarded surface — the general lock discipline (`co-shared-state-locks`) is the only governing contract. OpenReview is also a Phase-2 source (`determinism-phase2-source-order` places it 4th: Scholar→S2→Crossref→**OpenReview**→...). Fixing the lock-free read must NOT (a) alter the per-namespace single-instance lock semantics of the cache, nor (b) change OpenReview's position in the Phase-2 order (which would violate `determinism-phase2-source-order` and shift `enr_list` fill). Add a targeted concurrency test for the OpenReview path as part of the fix. - -### C7 — Dead `scholarly_scholar.py` (safe-delete candidate) -- **Defect**: `scholarly_scholar.py` is reported dead code. -- **Invariants in tension**: none directly — no invariant references it. Adjacent live contracts: `eh-scholar-retry-then-dblp-only`, `determinism-article-ordering` (`src/clients/scholar.py:169-178`), `determinism-phase2-source-order` (Scholar first). -- **Seam**: Removal is safe **only if** no import path reaches it. Before deleting, grep for imports/references and confirm the live Scholar path (`src/clients/scholar.py`) is untouched. This is a code-hygiene change with no invariant impact once import-freeness is verified — but verify, do not assume. - -### C8 — Author-dir concurrency: locks vs partitioning (design fragility, not a live bug) -- **Tension**: `co-shared-state-locks` guards cache/CSV with explicit locks, while `co-single-writer-per-author-dir` explicitly relies on **no lock** and the ThreadPool partitioning (one worker per author). These are not contradictory today, but the asymmetry is a latent hazard. -- **Seam**: Any refactor that parallelizes within an author, or that maps two records to the same `format_author_dirname`, breaks the unstated single-writer precondition and produces TOCTOU races (duplicate/lost/deleted `.bib`). If such parallelism is introduced, a per-author-dir lock MUST be added. - -### C9 — Documented cross-reader factual disagreement: Phase-2 source order -- Reader 2 (`determinism-phase2-source-order`) **explicitly corrects** the prior-study digest's claimed order. The authoritative order is **Scholar→S2→Crossref→OpenReview→arXiv→OpenAlex→PubMed→EuropePMC** (evidence `main.py:1543,1572,1601,1621,1640,1660,1687,1706`). Any design doc or test still asserting the old order (Scholar→S2→Crossref→OpenAlex→PubMed→EuropePMC→arXiv→OpenReview) is wrong and must be updated. - ---- - -## DETERMINISM-CRITICAL SURFACES — Byte-Identity Contract - -A refactor must keep the following code paths byte-for-byte stable. The master verification for all of them is a **two-run diff**: run the pipeline twice over a frozen fixture corpus from a stable CWD (project root), then `diff -r` / `git diff --exit-code` the `output/` tree — it must be empty. Supplement with `PYTHONHASHSEED` variation and freeze-time where noted. - -| # | Surface | Files / lines | Governing invariants | Extra verification | -|---|---------|---------------|----------------------|--------------------| -| 1 | **BibTeX serialization** (field order, ASCII normalization, `\&` escaping excl. url/doi, trailing comma/brace/newline) | `src/bibtex_utils.py:302-394` | `of-bibtex-field-order-stable`, `of-ascii-escape-normalization`, `of-final-comma-brace-formatting`, `ao-ascii-clean-table-values` | Golden string test on a fixed entry with scrambled key order | -| 2 | **Three fixup sites + shared helpers** (must reach one fixed point) | A `main.py:314-492`; B `main.py:865-1309`; C `main.py:2028-2401`; helpers `main.py:235-254`; `_fixup_bib_entry` `src/merge_utils.py:314-565` | `ao-three-way-fixup-parity`, `ao-phase4-superset`, `ao-is-proc-series-guard-frontiers`, `ao-is-pacm-guard`, `co-pnas-suffix-conference-guard`, `co-conference-journal-word-boundary` | Feed one malformed entry through each site → identical; grep exactly 3 call sites each | -| 3 | **Fix-table iteration order** (dict/tuple/list, hash-seed independent) | `main.py:123-232`; sources `config.py:379-808` | `determinism-pattern-iteration-order`, `ao-fused-compounds-three-pass-order`, `of-booktitle-fixups-ordered-idempotent` | Run under two `PYTHONHASHSEED` values → identical output | -| 4 | **Publication ordering & union** | `src/clients/scholar.py:169-178,188-192,234-265` | `determinism-article-ordering`, `dd-merge-union-primary-first` | Shuffle-invariance test | -| 5 | **Author scheduling sort** | `main.py:2947-2949,2971-2977` | `determinism-author-sort-key`, `determinism-new-author-first-stable` | Golden order across two calls | -| 6 | **`sorted()` .bib directory scans** | `main.py:817,3164,3168`; `src/merge_utils.py:953` | `determinism-sorted-bib-scan`, `dd-branch-order-first-match` | Seed `a.bib`/`z.bib` both matching → `a.bib` chosen | -| 7 | **DOI candidate ordering** (set-dedup + stable published-first partition, cache-only inference) | `main.py:1945-1949,1901-1943,1994-1996` | `determinism-doi-candidate-order` | Two runs under differing `PYTHONHASHSEED` → identical `.bib`; assert no live HTTP | -| 8 | **Dedup scoring & normalization** | `src/text_utils.py:511-546,130-155,381-393` | `dd-composite-weights`, `determinism-title-similarity-pure` | Exact-score parametrized tests; `title_similarity` snapshot | -| 9 | **Merge iteration** (insertion-order enr_list, strict-`<` trust) | `src/merge_utils.py:277-445` | `determinism-enr-list-order`, `to-canonical-order-strict-rank` | Shuffle equal-rank enrichers → unchanged output | -| 10 | **Phase-2 source query order** | `main.py:1543-1723` | `determinism-phase2-source-order` (⚠ see C9) | Assert `SEARCH_START` log sequence | -| 11 | **a2i2 build** (wipe+rebuild, DOI-then-title dedup, richer/lower-path tiebreak, sorted write order + `_2` collision, byte-copy) | `src/io_utils.py:466-615` | `determinism-a2i2-complete-rebuild`, `dd-a2i2-doi-before-title`, `determinism-a2i2-pick-richer-tiebreak`, `determinism-a2i2-write-order-collision`, `of-a2i2-byte-fidelity-copy` | `test_complete_rebuild`, `test_deterministic_output` | -| 12 | **Post-run reconciliation block** (fixed step order, rewrite-only-on-change, relative-path reconcile) | `main.py:3070-3227`; `src/io_utils.py:334-439` | `co-gate-block-on-csv-existence`, `co-reconciliation-step-ordering`, `determinism-reconcile-rewrite-only-when-phantoms`, `determinism-flush-rewrite-only-on-updates`, `determinism-orphan-abspath-resolution`, `co-summary-csv-cwd-relative-paths` | Run reconcile from project-root CWD; assert no spurious rewrites | -| 13 | **Year-window enforcement** (filename-year-first, bib-year lower-bound guard, inclusive a2i2 filter) | `main.py:2596-2607,3116-3158`; `src/io_utils.py:523-530` | `co-year-window-enforced-everywhere`, `eh-bibyear-fallback-lower-bound-guard` | `Alice2024-X.bib` w/ bib-year 2000 kept; freeze-time near year boundary | - -**Non-determinism landmines to reject in review:** any `set`/`frozenset` feeding a fix-pattern loop or an output-affecting order (#3, #7); any raw `os.listdir` over a `.bib` dir without `sorted()` (#6); numeric filename counters (`-2.bib`) instead of title-word extension (`of-filename-no-numeric-counters`); `dict`/insertion-order reliance in `bibtex_from_dict` field emission (#1); any inlined threshold literal that forks from `config.py` (`cd-thresholds-centralized`); running from a non-root CWD (#12, breaks `co-summary-csv-cwd-relative-paths`). diff --git a/audit/02-design.md b/audit/02-design.md deleted file mode 100644 index d37bfed1..00000000 --- a/audit/02-design.md +++ /dev/null @@ -1,289 +0,0 @@ -I have everything I need. Both load-bearing disputes are now verified against source: - -- **C5 superset membership**: `article_patent->misc` lives at **both** Site B (main.py:1053-1057, `EXISTING_FIXUP`) **and** Site C (main.py:2134-2143, `TYPE_CORRECT`); `article_unpublished->misc` likewise at Site B (1041-1045) **and** Site C (2146-2149). The catalog's `ao-phase4-superset` claim that these are "C-only" is **factually wrong** — they are `{B,C}`. Only `misc_workshop->inproceedings` (2382-2397) is genuinely C-exclusive. This confirms the judges' correction and disqualifies Proposal 1's two-bucket model. -- **C7 dead-code**: `scholarly_scholar.py` has **zero** importers; `tests/test_scholarly_scholar.py` imports the **live** clients (`src.clients.scholar`, `serpapi_scholar`, `serply_scholar`), so the test must be **kept**. Proposal 3's plan to delete it is wrong. - -Producing the final design document. - ---- - -# CiteForge Refactor — Phase 2 Final Decomposition Design - -*Deliverable of the DESIGN SYNTHESIZER. Input contract: `audit/01-invariant-catalog.md`. Output contract: this document is the authoritative plan the IMPLEMENT phase consumes, one worktree-isolated task per migration step.* - ---- - -## 1. Winning decomposition and why - -**Winner: Proposal 2 — "Minimal-risk, move-only, byte-identity-preserved at every commit; C5 single-sourced via per-site ordered recipes, deferred to a gated final step."** It is the unanimous choice of all three judge lenses (invariant-hawk 8.44, pragmatic-shipper 76/100, architecture-purist 8.61 — the top score in every scorecard). The reason is that the campaign's prime directive is second-run byte-identity, and the one seam that can silently destroy it — C5, the three-way-fix — has a domain shape that only Proposal 2 models correctly: I verified against source that the three fix sites run the CORE reclassification chain in **three different orders** and with **non-nested, per-rule membership** (Site B already contains `patent->misc` and `unpublished->misc`, which Proposal 1 wrongly fences as C-only and would therefore delete from B). Proposal 2's answer — single-source each rule **body** once, but give each site an explicit **ordered recipe** listing its own rules in that site's literal current order — is byte-identical **by construction** and does not depend on the rules commuting, whereas Proposal 1 and Proposal 3 both impose one shared order on all three sites and stake byte-identity on an (un-proven) commutation assumption. Every step before C5 is a whole-symbol relocation behind a re-export shim, so each commit is independently green under ruff+mypy+pytest and byte-identical under a two-run diff, and the single behavior-touching change lands last behind four gates. Its only real weakness is cohesion (it leaves `merge_utils.py` monolithic); we close that gap by grafting Proposal 1's cohesive-engine split as an explicitly-sequenced **Wave 2** that runs only after byte-identity is locked. - ---- - -## 2. Grafts from the runner-up proposals (with attribution) - -The final design is Proposal 2's move-only spine and per-site-recipe C5 model, hardened with the following explicit grafts: - -| # | Grafted idea | Source | Why it is adopted | -|---|--------------|--------|-------------------| -| G1 | **`src/venue.py` shared low layer** for `_is_conference_journal`, `_matches_journal_named_proceedings`, `infer_howpublished_from_doi`, `_normalize_howpublished` (Dagstuhl/LIPIcs). | Proposal 3 (determinism-safety lens) — *"the sharpest coupling insight in any proposal."* | `fixup` rules call `_is_conference_journal`, which lives in `merge_utils` today. Without extracting it to a shared low module, `fixup` would import `merge` and create a cycle. This is the single most valuable graft and must land **before** any fixup rule references it. | -| G2 | **`src/fsscan.py` as the only sorted-`.bib`-scan API** (`iter_author_bibs`, `iter_output_dirs`) plus a grep-lint that fails CI on any raw `os.listdir` over a `.bib` dir. | Proposal 3 | Turns `determinism-sorted-bib-scan` (surface #6) from a convention reviewers must remember into a structural CI failure. | -| G3 | **`patterns.py` container-type assertion test** (every fix table is `list`/`tuple`/`dict`, never `set`/`frozenset`) + **`ao-ascii-clean-table-values` fixpoint test** (every table value equals its own `_normalize_to_ascii(value)`) + **golden `PREFERRED_FIELD_ORDER` serializer test**. | Proposal 3 | Makes surfaces #1 and #3 structural rather than tested-by-luck. The ascii-fixpoint test co-lands with the pattern move so a non-fixpoint value cannot cause an every-run byte diff. | -| G4 | **Per-rule `sites: frozenset[Site]` membership tag** on each `FixupRule`, plus an **AST/grep test** asserting the `misc->inproceedings` upgrade symbol is referenced only in the Phase-4 recipe. | Proposal 3 (membership model) composed with Proposal 2 (per-site ordered recipes). | Membership becomes testable and self-documenting; combined with P2's ordered recipes this yields byte-safety **and** a structural anti-flatten guarantee with **no reorder bet**. | -| G5 | **Explicit boundary doc**: `all_candidate_dois` is a dedup-only `set`; its **order comes solely from the published-first partition sort**. | Proposal 3 | Kills the "no sets anywhere" over-correction while proving surface #7. | -| G6 | **`PipelineContext` dataclass** threading `enr_list`, `all_candidate_dois`, `flags`, `doi_validated`, `unvalidated_doi` through the split phase modules. | Proposal 1 (cohesion-first lens) | The clean structural guarantee for `determinism-enr-list-order` once `process_article` is genuinely split (Wave 2). Used only when the phase split happens. | -| G7 | **Full cohesive engine layout** (`merge/policy`, `dedup/{scan,decide,score,candidate_doi}`, `save/write`) as a sequenced **Wave 2** after byte-identity is locked, plus the **golden Phase-4 fixture matrix** (preprint article / PACM / patent / thesis DOI / bare stub) as the C5 parity oracle. | Proposal 1 | Closes Proposal 2's cohesion gap without risking the byte-identity floor during the risky C5 change. | - -**Two catalog corrections adopted (verified in source, mandatory for IMPLEMENT):** -- **CC1** — `ao-three-way-fixup-parity` and Determinism-Surface #2 cite `_fixup_bib_entry` at `src/merge_utils.py:314-565`. It is actually at **`main.py:314-565`** (tests import it from `main`). Treat `main.py` as authoritative. -- **CC2** — `ao-phase4-superset` lists `patent->misc` and `unpublished->misc` as "C-only." **Source disproves this:** both are at Site B (main.py:1041-1057) **and** Site C (main.py:2134-2149). The genuinely C-exclusive rules are `inproceedings_url_booktitle->misc` (2153-2162), `inproceedings_no_booktitle->misc` (2038-2046), `article-preprint-DOI` handling (2238-2259), and the **sole** `misc_workshop->inproceedings` upgrade (2382-2401). C5 membership is a **per-rule frozenset**, not a nested subset. - ---- - -## 3. Definitive target package layout (END STATE) - -Dependency direction is strictly downward and acyclic: `pipeline → {fixup, merge, dedup, save, bibtex} → {venue, fsscan, config, http_utils, cache, io_utils, exceptions, log_utils, clients}`. No back-edges. `main.py` ends as a thin entrypoint; re-export shims at old paths keep every `from main import …` / `from src.merge_utils import …` test green until the final cleanup step. - -``` -src/ - config.py UNCHANGED — single home of all thresholds/tables (cd-thresholds-centralized) - exceptions.py UNCHANGED — frozen error tuples (eh-error-tuple-membership-frozen) - models.py UNCHANGED - log_utils.py UNCHANGED - bibtex_build.py UNCHANGED — determine_entry_type, get_container_field (co-container-enforcement-by-type) - publication_parser.py / api_generics.py / doi_utils.py / id_utils.py UNCHANGED - text_utils.py title_similarity/normalize_title stay pure; compute_dedup_score → dedup/score.py (Wave 2) - http_utils.py KEPT — C1/C2 land in place (retry loop, _decode_json_bytes redaction, semaphore) - cache.py KEPT — C3/C4 land in place (ResponseCache monthly-boundary + ttl_days decision) - io_utils.py KEPT — CSV index/flush + a2i2/orphan/reconcile helpers (consumed by pipeline/reconcile.py) - bibtex_utils.py KEPT — serializer; PREFERRED_FIELD_ORDER promoted to named tuple + golden test - - venue.py NEW (Wave 1, G1) — shared LOW layer imported by BOTH fixup and merge - fsscan.py NEW (Wave 1, G2) — the ONLY sorted-.bib-scan API + grep-lint - - fixup/ NEW (Wave 1) — SINGLE SOURCE OF TRUTH for the three-way fix (seam C5) - patterns.py - text.py - rules.py - engine.py - - pipeline/ NEW (Wave 1: article/record/schedule/reconcile ; Wave 2: context + phase split) - article.py - record.py - schedule.py - reconcile.py - context.py (Wave 2, G6) - baseline.py / phase2_enrich.py / phase3_discovery.py / phase4_save.py (Wave 2, G7) - - merge/ NEW (Wave 2, G7) - policy.py - dedup/ NEW (Wave 2, G7) - scan.py / decide.py / score.py / candidate_doi.py - save/ NEW (Wave 2, G7) - write.py - - clients/ UNCHANGED except: C6 OpenReview lock (search_apis.py); scholarly_scholar.py DELETED (Wave 1) -main.py thin entrypoint (cli/setup/dispatch) + transitional re-export shims -``` - -### Per-module responsibility, moved-from, invariants protected - -| Module | Responsibility | Moved from (file:line) | Invariants protected | -|--------|----------------|------------------------|----------------------| -| **`src/venue.py`** (NEW) | Venue-classification predicates shared by fixup and merge; extracting them breaks the latent `fixup→merge` cycle. | `merge_utils.py:108-165` (`_is_conference_journal`, `_matches_journal_named_proceedings`, `infer_howpublished_from_doi`, `_normalize_howpublished`, Dagstuhl/LIPIcs regex :52-55,767-803) | `co-conference-journal-word-boundary`, `ao-is-pacm-guard`, `co-pnas-suffix-conference-guard`, `co-dagstuhl-doi-resolution` | -| **`src/fsscan.py`** (NEW) | Single sorted-scan API: `iter_author_bibs(dir)->sorted[str]`, `iter_output_dirs(out)->sorted[str]`. Every `.bib`-dir listing routes through it. | Replaces raw `os.listdir` at `main.py:817,2545,2858,3119,3123,3164,3168,3199,3202`; `merge_utils.py:953,1462`; `io_utils.py:383,391,510,590` | `determinism-sorted-bib-scan` (#6), `determinism-orphan-abspath-resolution`, `determinism-a2i2-write-order-collision` | -| **`src/fixup/patterns.py`** (NEW) | Every pre-compiled fix regex and repeated literal, as `list`/`tuple`/`dict` only. | `main.py:119-232` (`_FUSED_DICT_PATTERNS`, `_COMPOUND_SUFFIX_PATTERNS`, `_ACRONYM_CASE_PATTERNS`, `_BOOKTITLE_FIXUPS`, `_VERBOSE_BOOKTITLE_RE`, `_US_PATENT_RE`, garbage/venue regexes); vocab imported from `config.py:361-808` | `determinism-pattern-iteration-order` (#3), `ao-fused-compounds-three-pass-order`, `of-booktitle-fixups-ordered-idempotent`, `ao-ascii-clean-table-values`, `cd-thresholds-centralized` | -| **`src/fixup/text.py`** (NEW) | The already-single-source title/booktitle text transforms (3 call sites each today) + garbage/corruption predicates. | `main.py:235-311` (`_apply_booktitle_fixups`, `_fix_title_text`, `_is_garbage_title`, `_is_corrupted_title`, `_fix_fused_compounds`) | `ao-three-way-fixup-parity` (text/booktitle half — surface #2), `ao-fused-compounds-three-pass-order` | -| **`src/fixup/rules.py`** (NEW) | The `Site` enum, `FixupRule` dataclass, one function per correction step (**body single-sourced**), and each rule's `sites: frozenset[Site]` membership. | Rule bodies distilled from Site A `main.py:314-565`, Site B `main.py:865-1309`, Site C `main.py:2028-2401` | `ao-three-way-fixup-parity`, `ao-phase4-superset`, `ao-is-proc-series-guard-frontiers`, `ao-is-pacm-guard`, `ao-disjoint-reclassification-tables`, `co-misc-upgrade-preprint-repo-guard` | -| **`src/fixup/engine.py`** (NEW) | `SITE_A_RECIPE`/`SITE_B_RECIPE`/`SITE_C_RECIPE` (ordered tuples reproducing each site's **literal current order**) and `run_fixup(entry, recipe)->bool`. | The orchestration currently inline at each of A/B/C | `of-phase4-type-correction-order`, `ao-postrun-fixup-write-suppression`, `pipeline-double-run-fixpoint` | -| **`src/pipeline/article.py`** | The 5-phase per-article orchestrator; Sites B & C become `run_fixup(...)` calls; returns the 1/0 contract. | `main.py:721-2687` incl. helpers `_read_doi_from_file`(624-633), `_revert_misattributed_doi`(634-655), `_try_multiple_candidates`(657-720), `_entry_is_complete`(568-623) | `determinism-phase2-source-order` (#10, C9), `determinism-enr-list-order`, `determinism-doi-candidate-order` (#7), `ao-candidate-doi-disk-dedup`, `co-return-code-contract`, `co-year-window-enforced-everywhere` (save leg) | -| **`src/pipeline/record.py`** | Per-author worker: thread-local logging, Scholar-retry-then-DBLP, article loop, per-unit isolation. | `main.py:2688-2851` (`process_record`) | `co-thread-local-logging`, `eh-scholar-retry-then-dblp-only`, `eh-per-unit-isolation`, `co-single-writer-per-author-dir` (precondition doc — C8) | -| **`src/pipeline/schedule.py`** | Author scheduling: composite sort key, new-author-first stable re-order, CSV title index, ThreadPool fan-out, excepthook, result timeouts. | `main.py:2852-2884` (`count_existing_papers`, `_load_csv_titles`), sort blocks `2947-2949`/`2971-2977`, pool `2998-3018` | `determinism-author-sort-key` (#5), `determinism-new-author-first-stable`, `co-single-writer-per-author-dir` (C8), `co-threadpool-worker-cap`, `co-result-timeouts` | -| **`src/pipeline/reconcile.py`** | The whole post-run block as ONE fixed-order function, gated on CSV existence. | `main.py:3070-3227`; calls `io_utils.py:334-439,466-615` helpers | `co-gate-block-on-csv-existence`, `co-reconciliation-step-ordering` (#12), `determinism-reconcile-rewrite-only-when-phantoms`, `co-year-window-enforced-everywhere` (#13), `of-a2i2-byte-fidelity-copy`, `co-year-and-fixup-skip-a2i2-dir`, `co-summary-csv-cwd-relative-paths` | -| **`src/pipeline/context.py`** (Wave 2, G6) | `PipelineContext` dataclass carrying the enrichment accumulator across split phases. | `enr_list` init `main.py:1486`; `all_candidate_dois` `1490`; flags/`doi_validated`/`unvalidated_doi` locals in `process_article` | `determinism-enr-list-order`, `dd-all-candidate-dois-includes-unmatched`, `ao-p1-stash-and-pop` | -| **`src/merge/policy.py`** (Wave 2) | The trust engine: insertion-order iteration, strict-`<` replacement, DOI-source gate, field-override rules. | `merge_utils.py:230-925` (`merge_with_policy` + author/DOI helpers 166-229) | `to-canonical-order-strict-rank`, `determinism-enr-list-order` (#9), `to-doi-source-gate`, `to-field-override-rules`, `ao-doi-published-beats-preprint-xor`, `of-internal-fields-stripped` | -| **`src/dedup/scan.py`** / **`decide.py`** / **`score.py`** / **`candidate_doi.py`** (Wave 2) | The in-save duplicate cascade (first-match break), the directional replace/keep tree + pre-write guard + prefer-path cleanup, the additive 6-signal scorer, and the outer save-time candidate-DOI net. | `merge_utils.py:978-1200` (scan), `1201-1305`+`1386-1455` (decide/guard), `text_utils.py:511-546` (score), `main.py:634-655,657-720,2531-2588` (candidate_doi) | `dd-branch-order-first-match`, `ao-replace-keep-directional`, `ao-skip-write-existing-better`, `dd-composite-weights`, `ao-candidate-doi-disk-dedup`, `dd-self-match-exclusion`, `dd-title-similarity-guard`, `cd-inline-magic-numbers-preserved` | -| **`src/save/write.py`** (Wave 2) | `save_entry_to_file` orchestration: container enforcement, citekey fallback, word-extension collision loop, cross-file key disambiguation, unlocked per-dir RMW; returns `(path, was_written)`. | `merge_utils.py:927-978,1307-1382,1457-1504` | `co-single-writer-per-author-dir` (C8), `of-filename-no-numeric-counters`, `of-citekey-fallback-chain`, `co-cross-file-key-collision-disambiguation`, `co-save-return-tuple` | -| **`src/bibtex_utils.py`** (kept) | BibTeX serialization; `PREFERRED_FIELD_ORDER` promoted to a named module-level tuple. | in place `bibtex_utils.py:302-394` | `of-bibtex-field-order-stable` (#1), `of-ascii-escape-normalization`, `of-final-comma-brace-formatting`, `ao-ascii-clean-table-values` | -| **`src/http_utils.py`** (kept) | Retry/backoff/concurrency + JSON decode; C1 + C2 land here. | in place `http_utils.py:163-175,300-372,388-399` | `ao-429-503-excluded-from-urllib3-forcelist`, `co-sleeps-outside-global-semaphore`, `eh-error-tuple-membership-frozen`, `eh-gemini-key-leak` | -| **`src/cache.py`** (kept) | Monthly-boundary freshness + three-tier negatives; C3 + C4 land here. | in place `cache.py:24-32,99-145,147-223` | `ca-positive-freshness-not-ttl`, `ca-monthly-boundary-expiry`, `ca-month-boundary-frozen`, `ca-get-branch-order` | - ---- - -## 4. Single-source-of-truth fixup design (seam C5) - -### Problem shape (verified in source, not the catalog) - -The CORE reclassification chain is textually triplicated at Site A (`main.py:314-565`), Site B (`main.py:865-1309`), Site C (`main.py:2028-2401`), and: - -1. The three sites run the CORE rules in **three different orders** (A ends with conference-journal reclassification; B and C run it first). -2. Membership is **per-rule, not nested**: `article_patent->misc` and `article_unpublished->misc` are in `{B, C}` (main.py:1041-1057 / 2134-2149); `misc_workshop->inproceedings` is in `{C}` only (2382-2397); `inproceedings_repository->misc` / `inproceedings_preprint->misc` are in `{A, B, C}` (360/374, 1139/1150, 2216/2164). -3. Byte-identity today is preserved by each site's own order plus rule commutation (`ao-disjoint-reclassification-tables`) — **not** by a shared order. -4. `_fix_title_text` and `_apply_booktitle_fixups` are **already** single-source (exactly 3 call sites each): `main.py:432/1205/2279` and `440/1213/2290`. Only the reclassification chain is triplicated. - -Therefore: single-source each rule **body**, but preserve each site's **order and membership** exactly. Do **not** collapse to one shared master order (that would stake byte-identity on a commutation bet neither Proposal 3 nor Proposal 1 can prove). - -### Concrete API (`src/fixup/rules.py` + `src/fixup/engine.py`) - -```python -# src/fixup/rules.py -from dataclasses import dataclass -from enum import Enum, auto -from collections.abc import Callable - -class Site(Enum): - A_LOAD = auto() # load-time _fixup_bib_entry (also the post-run sweep) - B_EXISTING = auto() # existing-file baseline fixup - C_PHASE4 = auto() # Phase-4 post-merge fixup - -@dataclass(frozen=True) -class FixupRule: - name: str - apply: Callable[[dict], bool] # mutates entry in place; returns True iff it changed anything - sites: frozenset[Site] # MEMBERSHIP (for tests/self-doc); does NOT govern order - -# --- one function per correction step; each body defined EXACTLY ONCE --- -# CORE (sites = {A, B, C}); guards read tables from config / predicates from venue.py: -def _rule_procedia_to_inproceedings(e: dict) -> bool: ... -def _rule_pacm_to_article(e: dict) -> bool: ... # not-is_pacm guard (ao-is-pacm-guard) -def _rule_jnp_to_article(e: dict) -> bool: ... # PNAS/PVLDB suffix guard (co-pnas-suffix-conference-guard) -def _rule_journal_only_prefix_to_article(e: dict) -> bool: ... # not-is_proc_series guard (ao-is-proc-series-guard-frontiers) -def _rule_inst_repo_to_phdthesis(e: dict) -> bool: ... -def _rule_conference_journal_to_inproceedings(e: dict) -> bool: ... # uses venue._is_conference_journal -def _rule_inproceedings_repository_to_misc(e: dict) -> bool: ... -def _rule_inproceedings_preprint_to_misc(e: dict) -> bool: ... -# ... remaining CORE rules ... - -# {B, C} — CORRECTED membership (catalog CC2): -def _rule_article_patent_to_misc(e: dict) -> bool: ... -def _rule_article_unpublished_to_misc(e: dict) -> bool: ... - -# {C} only — the genuine Phase-4 superset: -def _rule_inproceedings_no_booktitle_to_misc(e: dict) -> bool: ... -def _rule_inproceedings_url_booktitle_to_misc(e: dict) -> bool: ... -def _rule_article_preprint_doi_handle(e: dict) -> bool: ... -def _rule_misc_to_inproceedings_upgrade(e: dict) -> bool: ... # SOLE upgrade; preprint/repo guard (co-misc-upgrade-preprint-repo-guard) -``` - -```python -# src/fixup/engine.py -from .rules import FixupRule, Site, _rule_procedia_to_inproceedings, ... # explicit imports - -# Each recipe reproduces THAT SITE'S literal current order and membership. -SITE_A_RECIPE: tuple[FixupRule, ...] = ( # A order: ends with conference-journal - R_procedia, R_pacm_to_article, R_jnp_to_article, ..., R_inst_repo_to_phdthesis, - R_inproceedings_repository_to_misc, R_inproceedings_preprint_to_misc, ..., - R_conference_journal_to_inproceedings, # LAST at A -) -SITE_B_RECIPE: tuple[FixupRule, ...] = ( # B order: conference-journal first; INCLUDES patent/unpublished + B text extras - R_conference_journal_to_inproceedings, ..., R_article_patent_to_misc, R_article_unpublished_to_misc, ..., -) -SITE_C_RECIPE: tuple[FixupRule, ...] = ( # C order (Phase-4): superset, upgrade LAST - R_inproceedings_no_booktitle_to_misc, R_conference_journal_to_inproceedings, ..., - R_article_patent_to_misc, R_article_unpublished_to_misc, R_inproceedings_url_booktitle_to_misc, - R_article_preprint_doi_handle, ..., R_misc_to_inproceedings_upgrade, # SOLE C-only upgrade, LAST -) - -def run_fixup(entry: dict, recipe: tuple[FixupRule, ...]) -> bool: - changed = False - for rule in recipe: - changed |= rule.apply(entry) - return changed -``` - -Call-site collapse: -- Site A body → `run_fixup(e, SITE_A_RECIPE)`; the post-run sweep (`main.py:3176`) also uses `SITE_A_RECIPE`. -- Site B body → `run_fixup(baseline, SITE_B_RECIPE)` + the existing write-if-changed wrapper. -- Site C body → `run_fixup(merged, SITE_C_RECIPE)`. - -### Why this satisfies C5 - -- **Parity is structural, not copy-paste**: a CORE rule is one callable object referenced by all three recipes — it cannot drift, and its guards (`not is_pacm`, `not is_proc_series`, PNAS suffix, word-boundary) exist once. -- **Superset preserved, never flattened**: `_rule_misc_to_inproceedings_upgrade` is physically absent from `SITE_A_RECIPE`/`SITE_B_RECIPE`; `sites == {C_PHASE4}`. The `{B,C}` rules appear in both B and C recipes — the CC2 correction is honored. -- **Byte-identity does not depend on commutation**: each recipe is the site's literal order, so output equals today's bytes even if two rules would fire in opposite directions under a different order. Proposal 2's stated fallback ("if the differential test finds a non-commuting pair, keep each site's order") is already the design — no redesign needed. - -### Guard tests (all must pass to land C5) -1. **Membership**: `assert Site.A_LOAD not in R_misc_to_inproceedings_upgrade.sites and Site.B_EXISTING not in it`; `assert R_article_patent_to_misc.sites == {Site.B_EXISTING, Site.C_PHASE4}`; every rule in `SITE_X_RECIPE` has `Site.X in rule.sites`. -2. **AST/grep (G4)**: `_rule_misc_to_inproceedings_upgrade` symbol is referenced only in `engine.py`'s `SITE_C_RECIPE`. -3. **Differential OLD-vs-NEW**: run the pre-refactor inline A/B/C blocks vs the new recipes over a large synthetic entry matrix; assert per-site equality. This is the strongest single C5 gate — it surfaces any non-commuting pair. -4. **Golden Phase-4 fixture matrix (G7)**: preprint article / PACM / patent / thesis DOI / bare stub → exact emitted `@type` and field placement (`of-phase4-type-correction-order`). -5. **Idempotence**: `run_fixup(deepcopy(e), R); run_fixup(e, R)` yields zero further change (`pipeline-double-run-fixpoint`). -6. **Two-run byte diff** over the frozen corpus, under two `PYTHONHASHSEED` values. - -> Note on logging: per-rule debug tags differ across sites (`EXISTING_FIXUP|…` vs `TYPE_CORRECT|…`). No test asserts these and `run.log` is never byte-compared (only `output/*.bib` is the contract). Rules may drop per-rule logging or accept an optional `tag` argument threaded by `run_fixup`; either is byte-neutral. State the chosen option in the C5 commit message. - ---- - -## 5. Ordered, individually-green migration sequence - -Each step is **one worktree-isolated IMPLEMENT task**. The gate after **every** step is identical and non-negotiable: - -> **GATE** = `ruff check src/ tests/ main.py` **and** `mypy src/ main.py` **and** full `pytest` **and** the **two-run byte-identity check**: run the pipeline twice over the frozen fixture corpus from **project-root CWD**, then `git diff --exit-code output/` must be empty. For steps touching surfaces #3/#7 or C5, repeat under a second `PYTHONHASHSEED`. For year-window steps, add freeze-time near the year boundary. - -Re-export shims at old paths (`import X as X` / `__all__` to satisfy ruff F401) keep all existing imports resolving until Step 15. - -**Wave 0 — oracle** - -- **Step 0 — Baseline oracle.** Capture a frozen cache-hit fixture corpus; record the canonical two-run `git diff --exit-code output/` as empty and `ruff`/`mypy`/`pytest` green. This is the regression oracle every later step diffs against. *Proof: the snapshot itself.* - -**Wave 1 — move-only spine + structural guards + C5 (byte-identical by construction, C5 last)** - -- **Step 1 — C7 dead-code.** Delete `src/clients/scholarly_scholar.py`. **Keep** `tests/test_scholarly_scholar.py` (verified: it imports the live `scholar`/`serpapi_scholar`/`serply_scholar`, not the dead module). Re-run the zero-import grep at delete time. *Proof: grep shows zero importers; full pytest green.* → GATE. -- **Step 2 — `src/venue.py` (G1).** Move `merge_utils.py:108-165` + Dagstuhl/LIPIcs (52-55,767-803) verbatim; re-export from `merge_utils`. *Proof: existing venue/merge tests + `co-conference-journal-word-boundary`, `co-dagstuhl-doi-resolution` tests.* → GATE. -- **Step 3 — `src/fsscan.py` (G2).** Add `iter_author_bibs`/`iter_output_dirs`; route each raw `os.listdir` site through it **one at a time**; add the grep-lint (CI fails on raw `os.listdir` over a `.bib` dir). *Proof: `determinism-sorted-bib-scan` test after each site; `a.bib`/`z.bib` both-matching → `a.bib` chosen.* → GATE. -- **Step 4 — `fixup/patterns.py` + `fixup/text.py` (G3).** Move `main.py:119-311` verbatim; re-export `_fix_title_text`, `_apply_booktitle_fixups`, `_is_garbage_title`, `_is_corrupted_title` from `main`. Add the **container-type assertion test** and the **`ao-ascii-clean-table-values` fixpoint test**. *Proof: pattern-type test + fixpoint test + `from main import _is_garbage_title` resolves.* → GATE. -- **Step 5 — Serializer lock-in (G3).** Promote `PREFERRED_FIELD_ORDER` to a named module tuple in `bibtex_utils.py`; add the **golden scrambled-key serializer string test**. No relocation. *Proof: golden string test; `of-bibtex-field-order-stable`.* → GATE. -- **Step 6 — Extract Site A.** Move `_fixup_bib_entry` (`main.py:314-565`) into `fixup/` as the seed of `rules.py`+`engine.py`, wired as `SITE_A_RECIPE` with per-rule `sites` tags (CORE = `{A,B,C}`). Re-export `_fixup_bib_entry` from `main` (post-run sweep at 3176 + tests still import it). Site A drives the post-run sweep, giving highest test coverage at lowest risk. *Proof: idempotence + `ao-postrun-fixup-write-suppression` tests.* → GATE. -- **Step 7 — `pipeline/schedule.py`.** Move `count_existing_papers`, `_load_csv_titles`, and extract `schedule_authors()` from the sort blocks (`2947-2949`/`2971-2977`). *Proof: `determinism-author-sort-key` + new-author-first golden order.* → GATE. -- **Step 8 — `pipeline/article.py`.** Whole-function relocation of `process_article` (`main.py:721-2687`) + its helpers (568-720). Sites B & C ride along **inline, unchanged** (they become recipes in Step 12). Largest move; **zero logic edits**. *Proof: `SEARCH_START` Phase-2-order test (C9), `co-return-code-contract`, two-run diff.* → GATE. -- **Step 9 — `pipeline/record.py`.** Move `process_record` (`main.py:2688-2851`). *Proof: `co-thread-local-logging`, `eh-scholar-retry-then-dblp-only`.* → GATE. -- **Step 10 — `pipeline/reconcile.py`.** Extract the inline post-run block (`main.py:3070-3227`) into `run_post_run_reconciliation(...)`; `main()` calls it from project-root CWD. *Proof: reconciliation integration test (phantom + orphan + out-of-window seed) run from project root; `co-reconciliation-step-ordering`, `co-summary-csv-cwd-relative-paths`.* → GATE. -- **Step 11 — Structural invariant lock.** Add tests: rule-membership map, "no `set`/`frozenset` feeds an ordered/output loop," and the `all_candidate_dois` dedup-only boundary doc + assertion (G5). *Proof: the tests themselves; landmine grep-lint green.* → GATE. -- **Step 12 — C5 (LAST, highest risk, four gates).** Extract the CORE + `{B,C}` + `{C}` rule bodies into `fixup/rules.py`; build `SITE_B_RECIPE` and `SITE_C_RECIPE` in each site's **literal current order** with corrected membership; rewrite Site B (`865-1309`) and Site C (`2028-2401`) as `run_fixup(...)` calls. **Gate = the four C5 guard tests (§4) + differential OLD-vs-NEW matrix + golden Phase-4 fixture + two-run diff under two `PYTHONHASHSEED`.** *This is the only behavior-touching step in Wave 1.* → GATE. - -**Wave 2 — cohesive engine split (G7) + defect fixes (byte-neutral; each step reversible)** - -- **Step 13 — Split `merge_utils.py`.** In sub-steps, each behind GATE: (a) `merge/policy.py` ← `230-925`; (b) `dedup/score.py` ← `text_utils.py:511-546`; (c) `dedup/scan.py` ← `978-1200`; (d) `dedup/decide.py` ← `1201-1305,1386-1455`; (e) `dedup/candidate_doi.py` ← `main.py:634-720,2531-2588`; (f) `save/write.py` ← `927-978,1307-1382,1457-1504`. Re-export from `merge_utils` shim. *Proof: `dd-*`, `to-*`, `ao-*`, `of-filename-*` table-driven tests after each sub-extraction.* → GATE. -- **Step 14 — `pipeline/context.py` + phase split (G6).** Introduce `PipelineContext`; extract `baseline.py`/`phase2_enrich.py`/`phase3_discovery.py`/`phase4_save.py` from `article.py` one at a time, each replacing a slice of `process_article` with a ctx-threaded call, two-run-green after **each** phase. `enr_list` created once, only appended-to. *Proof: `determinism-enr-list-order` shuffle-equal-rank test; two-run after each phase.* → GATE. -- **Step 15 — Defect fixes + shim removal.** Land C1/C2/C3/C4/C6 in their cohesive homes (§6), each with its seam-guard test and two-run diff; then remove the transitional re-export shims. **Final** `ruff` + `mypy` + full `pytest` + two-run byte-identity. → GATE. - ---- - -## 6. Defect-fix placement (each mapped to a step, with seam guard) - -| Defect | Lands in step | Home module:line | Seam guard (MUST hold) | -|--------|---------------|------------------|------------------------| -| **C7 — dead code** | Step 1 | delete `src/clients/scholarly_scholar.py` | Re-grep zero importers at delete time; **keep** `tests/test_scholarly_scholar.py` (it exercises the live clients). | -| **C5 — three-way-fix parity vs superset** | Step 12 | `src/fixup/` (rules.py + engine.py) | CORE bodies single-sourced; per-site ordered recipes preserve order+membership; `misc->inproceedings` upgrade `sites=={C}`; `{B,C}` for patent/unpublished (CC2). Differential + golden + membership + two-run gates. | -| **C2 — ValueError/URL key-leak** | Step 15 | `src/http_utils.py:399` (`_decode_json_bytes`) | Add `_redact_url()` to strip `key=`/tokens **before** the URL enters the `ValueError` message. Do **NOT** add `ValueError` to `NETWORK_ERRORS`/`ALL_API_ERRORS` (`eh-error-tuple-membership-frozen`). Test: `'key='` absent from the WARN record; `ValueError` still raised/propagated. | -| **C1 — retry double-backoff** | Step 15 | `src/http_utils.py:163-175,300-372` (`_http_request`, `_RETRY_STRATEGY`) | Any consolidation keeps 429/503 **out** of `status_forcelist`, `respect_retry_after_header=False`, the `min(rate_wait, HTTP_BACKOFF_MAX)` cap, and every `time.sleep` **outside** `_GLOBAL_SEMAPHORE`. Stopping POST retries is a conscious behavior change (`eh-defect-post-retried-non-idempotent`) — no-op unless explicitly chosen. | -| **C4 — frozen `_month_boundary`** | Step 15 (optional) | `src/cache.py:123` | Optionally recompute `_month_boundary()` per `get()`; update `test_month_boundary_frozen`. Low impact (short batch). Do **not** hard-freeze across restarts. | -| **C3 — vestigial `ttl_days`** | Step 15 (decision) | `src/cache.py` | Leave documented-vestigial **or** remove the write path (`put`/`_write_entry`). **Never** read it in `get()` (`ca-positive-freshness-not-ttl`). | -| **C6 — OpenReview lock-free read** | Step 15 | `src/clients/search_apis.py:~433-490` | Add lock-guarded read at the client only; do **not** change OpenReview's Phase-2 ordinal (4th, encoded in the article/phase-2 source sequence per C9) nor the per-namespace cache lock semantics. Add a targeted concurrency test. | -| **C8 — author-dir single writer** | Steps 7 & 9 (structural, no code fix) | `pipeline/schedule.py`, `pipeline/record.py`, `save/write.py` | Assert one Record → one unique `format_author_dirname` per future; keep the lock-free RMW; add **no** intra-author parallelism. A per-dir lock is added **only if** within-author parallelism is ever introduced. | - ---- - -## 7. Risks, rollback, and determinism landmines - -### Top risks and mitigations -1. **C5 order/membership drift (highest).** A wrong `sites` tag or recipe order silently mis-promotes entries (or, worst case, pushes the `misc->inproceedings` upgrade into A/B where `howpublished` is pre-enrichment — `co-misc-upgrade-preprint-repo-guard`). *Mitigation:* per-site literal-order recipes (no reorder bet); the differential OLD-vs-NEW matrix; the "upgrade only in C" AST test; the golden Phase-4 fixture; two-run under two `PYTHONHASHSEED`. C5 lands last, alone. -2. **Catalog mis-facts (CC1, CC2).** Building C5 from the catalog's "patent/unpublished are C-only" text would drop those rules from Site B and break `pipeline-double-run-fixpoint` for baseline patent/unpublished entries on the complete-entry-skip-enrichment path (where Site B is the *only* fixup). *Mitigation:* membership derived from the source grep in §Verification above; the membership test encodes `{B,C}`. -3. **`enr_list` threading (Wave 2).** Splitting `process_article` risks resetting/reordering the accumulator. *Mitigation:* `PipelineContext` created once, append-only; two-run diff after each phase. -4. **Import cycles.** `fixup` uses `_is_conference_journal`; without `venue.py` (Step 2, before Step 12) it would import `merge`. *Mitigation:* Step 2 precedes all fixup work; an import-graph test asserts no back-edges. -5. **Re-export/F401 churn.** ~30 modules of import updates. *Mitigation:* `import as`/`__all__` shims at every old path until Step 15; a per-step checklist item. -6. **CWD-relative reconcile (`co-summary-csv-cwd-relative-paths`).** Moving the post-run block must keep raw-relpath `os.path.exists` checks and run from project root. *Mitigation:* Step 10 integration test runs from project-root CWD. -7. **Toolchain mismatch.** This repo mandates **pip + mypy + ruff + pytest** (NOT uv/pyrefly). *Mitigation:* the GATE names the exact toolchain; a mismatched toolchain would produce a false green. -8. **Large single relocation (Step 8, ~1970 lines).** Risk is import wiring, not logic. *Mitigation:* pure whole-function move, zero body edits, two-run diff. - -### Rollback -Every step is a single worktree-isolated commit that is byte-green in isolation (Wave 1 steps are relocations; Wave 2 steps are behind shims). **Rollback = revert that one commit**; the re-export shims mean reverting a later step never orphans an earlier one. The Step-0 oracle is the fixed comparison point for any bisection. If a GATE fails, the step does not merge — there is no partial-state to unwind. - -### Determinism landmines reviewers MUST reject -- Any `set`/`frozenset` feeding a **fix-pattern loop** or an **output-affecting order** (surfaces #3, #7). *The lone legitimate set is `all_candidate_dois` — dedup-only; its order comes solely from the published-first partition sort (G5).* -- Any raw `os.listdir` over a `.bib` dir **without `sorted()`** (surface #6) — now a CI grep-lint failure via `fsscan.py`. -- **Numeric filename counters** (`-2.bib`) instead of title-word extension (`of-filename-no-numeric-counters`). -- Reliance on **`dict` insertion order** in `bibtex_from_dict` field emission (surface #1) — field order comes from the named `PREFERRED_FIELD_ORDER` tuple. -- Any **inlined threshold literal** that forks from `config.py` (`cd-thresholds-centralized`); reclassification/fix-table **values that are not `_normalize_to_ascii` fixpoints** (`ao-ascii-clean-table-values`). -- **Collapsing the three fix sites to one shared order** or making all three byte-identical — this either flattens C's superset or pushes the `misc->inproceedings` upgrade into A/B (`ao-phase4-superset`). Recipes must stay per-site. -- Running the pipeline (or reconcile) from a **non-root CWD** (surface #12, breaks `co-summary-csv-cwd-relative-paths`). -- Re-adding **429/503 to `status_forcelist`**, moving any `time.sleep` **inside** `_GLOBAL_SEMAPHORE`, or adding `ValueError` to the **frozen error tuples** (C1/C2 seams). diff --git a/audit/03-bibentry-design.md b/audit/03-bibentry-design.md deleted file mode 100644 index f055f2da..00000000 --- a/audit/03-bibentry-design.md +++ /dev/null @@ -1,168 +0,0 @@ -# BibEntry domain-model design (supersedes fixup Steps 4/6/C5) - -## Problem -Bibliographic entries are untyped dicts `{type,key,fields}` canonicalized (type -reclassification + title/venue normalization) at THREE open-coded sites: A = -`_fixup_bib_entry` (orphan/terminal sweep, main.py:154), B = existing-file -pre-enrichment (main.py:713-1181), C = Phase-4 post-merge (main.py:1895-2298). -This triplication is the "fixup patch" smell; the fix is to make canonicalization -intrinsic to a `BibEntry` type so a non-canonical entry is not produced. - -## Crux finding (reader A) -One idempotent `canonicalize()` reproduces A/B/C EXCEPT for one irreducible input: -a single boolean `terminal` ("enrichment exhausted"). It gates exactly 3 rules -that fire on a field's ABSENCE: -- R17 article & no journal -> misc -- R18 inproceedings & no booktitle -> misc -- R19 article & preprint-DOI & no vol/pages -> misc (downgrade branch) -Pre-merge these must be LEFT ALONE (enrichment may still fill the field); -post-merge they downgrade. Every other rule (R1-R16, R20 misc->inproceedings, -R21, all text N*) is DATA-driven and folds into a fixpoint. The "C-only" -misc->inproceedings (R20) is data-driven: its precondition (a conference -howpublished) is manufactured by earlier rules in the same pass, not externally. - -Ordering: the union needs ONE canonical order because (a) "zenodo" is in BOTH -REPOSITORY_AS_JOURNAL and PREPRINT_SERVERS so R16 (keep value as howpublished) -and R12 (drop journal) do NOT commute -> canonical order R16-before-R12 (B/C -already do this); (b) the title chain N18/N19/N1/N2/N9/N10 is order-sensitive. - -Today A/B/C are NOT mutually byte-identical: A is a strict subset (lacks -N18/N19/R14/R15/R16); B has a DESTRUCTIVE branch (N22 title==venue -> delete -file, main.py:1106) and pipeline-only rewrites (email-from-author). So: -- canonicalize() is PURE (entry -> entry); side effects (file delete, I/O) stay - in the pipeline, not the model. This is part of the coherence win. -- The model adopts the UNION of the pure normalization rules + the terminal flag. - -## Blast radius (reader B) -Pervasive shared-mutable-dict: ~84 field reads + dozens of in-place type/fields -mutations in main.py, ~40 in merge_utils, `_fixup_bib_entry` 40+ in-place writes -returning a change-flag. A big-bang immutable value object breaks the -alias-and-mutate contract at hundreds of sites. => Adopt BibEntry INCREMENTALLY. - -## Parse/serialize boundary (reader C) -parse_bibtex_to_dict is near-lossless (lowercases type + field keys, strips, -unwraps braces, preserves insertion order). bibtex_from_dict is lossy/normalizing -(PREFERRED_FIELD_ORDER then sorted extras; _normalize_to_ascii; _sanitize_title; -&-escape excl url/doi; 2-space indent; trailing-comma strip; single trailing \n). -Invariant to preserve: serialize(parse(serialize(x))) == serialize(x). -`to_bibtex()` must OWN the full serialization contract (move PREFERRED_FIELD_ORDER -+ the 3 nested helpers onto/behind it). - -## Design -`src/entry.py` (new) — `class BibEntry`: -- data: `entry_type: str` (lowercased), `key: str` (case preserved), - `fields: dict[str,str]` (ordered, lowercased keys). Dedup ids - (x_scholar_cluster_id/...) modeled as transient, non-serialized. -- boundaries (single construct/serialize points): - - `from_bibtex(text) -> BibEntry | None` (wraps parse_bibtex_to_dict) - - `from_raw(type,key,fields,*,arxiv=...) -> BibEntry` (wraps build_bibtex_entry - assembly + get_container_field placement) - - `to_bibtex() -> str` (owns the serialization contract) -- ONE normalization: `canonicalize(*, terminal: bool) -> bool` (in-place, returns - changed) OR returns a new BibEntry. Applies the union of type + text rules in - the single canonical order; `terminal` gates R17/R18/R19-misc. -- rules live as an ordered registry of small pure predicate+action functions with - metadata (needs_terminal), in `src/entry_rules.py` (rehomes src/fixup/*). This - is the SINGLE SOURCE OF TRUTH; the 3 sites disappear. - -Call-site collapse: -- Site B (pre-merge): `entry.canonicalize(terminal=False)` -- Site C (post-merge): `entry.canonicalize(terminal=True)` -- Site A (orphan/terminal sweep): `entry.canonicalize(terminal=True)` -- B's destructive N22 (title==venue file delete) + email-from-author stay in the - pipeline as explicit steps around canonicalize (they are I/O, not normalization). - -## Byte-identity strategy -Differential test is the gate: for a large synthetic entry matrix AND the golden -output/ corpus, assert `canonicalize(terminal)` reproduces the CURRENT per-site -output (run the pre-refactor A/B/C blocks vs the new model). Plus the two-run -byte-identity check (run pipeline twice, git diff --exit-code output/). Resolve -the zenodo R16 canonicalize(terminal=True). Gate incl. differential + two-run. -5. Route Site B -> canonicalize(terminal=False) (keep its pipeline-only I/O steps - separate). Gate. -6. Route Site A (orphan sweep) -> canonicalize(terminal=True). Gate. -7. Delete the 3 open-coded blocks + src/fixup/ (absorbed). Gate. -8. (Later, optional) migrate field-access sites to typed accessors; not required - for the coherence win. - -## Why this satisfies the critique -- Canonicalization is intrinsic to the type (produced canonical via from_*/ - canonicalize), not "applied" as a patch in 3 places. -- The 3 sites collapse to one method + one honest boolean; the differences that - remain are explicit and justified (terminal), not hidden duplication. -- Pure normalization is separated from pipeline I/O. -- Single construct + single serialize boundary. -- Incremental + differential-gated => byte-identity preserved and provable. - ---- - -# REVISION (Codex-vetted) — supersedes the sections above where they conflict - -The original design was NOT byte-safe. Corrections (each verified against source): - -## 1. Five stages, not three (ordered enum, not a bool) -Complete entries (~96% cache-hit) run Site B, then quick-fixups (main.py:1185-1212), -then `return 1` and NEVER reach Site C. Plus tier2 (main.py:2300) and the N22 delete -(main.py:2367); merge_with_policy also normalizes author/pages/volume. So: -`CanonicalStage` enum, ordered: LOAD_REPAIR, COMPLETE_SKIP_FINALIZE, POST_MERGE, -POST_TIER2_VALIDATE, POSTRUN_ORPHAN_REPAIR. Each rule carries the set of stages it -runs at. `canonicalize(entry, stage)`. - -## 2. Preserve each stage's EXACT current rule set first; NO union routing -Do NOT route B or A to the union. Complete entries persist B's output straight to -the on-disk baseline, so any C-only rule added to B (url_booktitle->misc :2026, -misc_workshop->inproceedings :2271) changes committed bytes immediately. Site A's -narrow subset is load-bearing (cleanup for tier2-bypassed venues + undone Phase-4 -corrections). Step 1 makes each site call canonicalize(stage=X) reproducing its -CURRENT rules byte-for-byte; unify differences later ONLY rule-by-rule under a -per-corpus differential diff gate. - -## 3. Declarative side-effects -canonicalize is pure but returns CanonicalResult(entry, actions) where actions are -declarative (DeleteFile, SkipEntry). The pipeline executes them at the correct -stage (N22 delete depends on canonicalized title/venue; runs after tier2 in C but -before the complete-skip in B). A global "canonicalize then side-effects" pass -cannot express that ordering; declarative actions can. - -## 4. Determinism fixes (fold into the registry build) -- Replace `next(x for x in FROZENSET ... startswith)` first-match (main.py:184 etc.) - with ordered tuples matched by (priority, longest-prefix). frozenset-first-match - is PYTHONHASHSEED-dependent. -- zenodo in BOTH REPOSITORY_AS_JOURNAL and PREPRINT_SERVERS => R16-before-R12 is a - SEMANTIC canonical order. -- Two-run gate: compare serialized `.bib` bytes under PYTHONHASHSEED=1,2,3, gated - PER STAGE on the actual control flow (complete-path vs incomplete-path). Do NOT - use blanket `git diff output/` — summary.csv row order is concurrently - nondeterministic (orthogonal issue) and would mask real .bib regressions. - -## 5. Migration byte-safety -- Steps 1-2 (introduce BibEntry; bibtex_from_dict delegates to to_bibtex) MUST keep - to_bibtex emitting the transient x_* dedup fields exactly as today. Defer - transient/non-serialized modeling to a later separately-gated step (the strip - lives only at merge_utils.py:412; B writes serialize without merge). -- Non-byte-neutral steps (gate hard, corpus diff): B->union, A->union, - trailing-canonicalize-after-tier2, moving x_* strip into the serializer. -- Assert the completeness invariant that makes B safe (main.py:432): complete => - has_venue AND non-preprint-DOI => the absence-trio (R17/R18/R19-misc) cannot fire. -- Dead code: the complete-skip article-preprint-doi->misc at main.py:1199-1212 is - unreachable (_entry_is_complete requires non-preprint DOI; block requires - is_secondary_doi). Mark dead in the registry; do not port as live. - -## Honest scope note -The "3 sites disappear" was oversold. Reality: 5 stages become EXPLICIT, -single-sourced stage members of one registry (a large improvement over 3 -copy-pasted blocks), with side-effects declarative and one pure canonicalize core. -Unifying the per-stage rule differences into a true single rule set is a SEPARATE, -rule-by-rule, corpus-gated effort that may reveal some differences are load-bearing. From 9ba03cceb704755a00a1da81014b292f9bcea322 Mon Sep 17 00:00:00 2001 From: Gabriel Spadon Date: Wed, 1 Jul 2026 17:32:40 -0300 Subject: [PATCH 29/54] refactor: thread --force as force_enrich parameter --- main.py | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/main.py b/main.py index ea61dc52..20d77806 100644 --- a/main.py +++ b/main.py @@ -108,8 +108,6 @@ ) from src.textnorm import _is_corrupted_title, _is_garbage_title -FORCE_ENRICH = "--force" in sys.argv[1:] - _ARXIV_ABS_RE = re.compile(r"arxiv\.org/abs/(\d{4}\.\d{4,5})", re.IGNORECASE) _FILENAME_YEAR_RE = re.compile(r"/[A-Za-z]+(\d{4})-") @@ -274,6 +272,7 @@ def process_article( gemini_api_key: str | None = None, summary_csv_path: str | None = None, min_year: int = 0, + force_enrich: bool = False, ) -> int: """Enrich a single publication from baseline through 4-phase pipeline and save to disk. @@ -441,7 +440,7 @@ def process_article( safe_write_file(existing_file_path, bib_str) # Skip enrichment entirely if entry is already complete (unless --force) - if not FORCE_ENRICH and existing_file_loaded and baseline_entry is not None and _entry_is_complete(baseline_entry): + if not force_enrich and existing_file_loaded and baseline_entry is not None and _entry_is_complete(baseline_entry): # Quick fixup: strip preprint-only publishers from complete entries. # Single-sourced in canonicalize() at the COMPLETE_SKIP_FINALIZE stage; the # debug log and write-gating stay here so the skip-path I/O is unchanged. @@ -1441,6 +1440,7 @@ def process_record( delay: float = 0.0, gemini_api_key: str | None = None, summary_csv_path: str | None = None, + force_enrich: bool = False, ) -> int: """Fetch, deduplicate, and enrich recent publications for one author. @@ -1594,6 +1594,7 @@ def process_record( gemini_api_key=gemini_api_key, summary_csv_path=summary_csv_path, min_year=min_year, + force_enrich=force_enrich, ) except FULL_OPERATION_ERRORS as e: logger.error(f"Article error: {e}", category=LogCategory.ERROR) @@ -1645,6 +1646,7 @@ def main() -> int: Returns an exit code suitable for use as a command-line entry point. """ + force_enrich = "--force" in sys.argv[1:] out_dir = os.path.join(os.path.dirname(__file__), DEFAULT_OUT_DIR) try: os.makedirs(out_dir, exist_ok=True) @@ -1769,6 +1771,7 @@ def _thread_excepthook(args: Any) -> None: delay=REQUEST_DELAY_MIN, gemini_api_key=gemini_api_key, summary_csv_path=summary_csv_path, + force_enrich=force_enrich, ) future_to_author[future] = rec From 8bdccb53c7d29ca8f2da938704636047a190ea2a Mon Sep 17 00:00:00 2001 From: Gabriel Spadon Date: Wed, 1 Jul 2026 17:38:22 -0300 Subject: [PATCH 30/54] refactor: extract post-run finalization into src/pipeline/postrun --- main.py | 215 +--------------------------------- src/pipeline/__init__.py | 0 src/pipeline/postrun.py | 247 +++++++++++++++++++++++++++++++++++++++ 3 files changed, 252 insertions(+), 210 deletions(-) create mode 100644 src/pipeline/__init__.py create mode 100644 src/pipeline/postrun.py diff --git a/main.py b/main.py index 20d77806..7af399c8 100644 --- a/main.py +++ b/main.py @@ -1,7 +1,5 @@ from __future__ import annotations -import csv -import json import os import random import re @@ -15,10 +13,9 @@ from src import bibtex_utils as bt from src import id_utils as idu from src import merge_utils as mu -from src.cache import get_cache_hit_counts from src.canonicalize import ( CanonicalStage, - _fixup_bib_entry, + _fixup_bib_entry, # noqa: F401 # re-exported for test imports canonicalize, ) from src.clients.helpers import extract_authors_from_article, get_article_year, strip_html_tags @@ -49,7 +46,6 @@ s2_search_papers_multiple, ) from src.config import ( - DEFAULT_A2I2_INPUT, DEFAULT_INPUT, DEFAULT_OUT_DIR, DEFAULT_S2_KEY_FILE, @@ -77,13 +73,10 @@ FULL_OPERATION_ERRORS, PARSE_ERRORS, ) -from src.fsscan import iter_author_bibs, iter_output_dirs -from src.http_utils import get_api_call_counts, http_get_text, reset_api_call_counts +from src.fsscan import iter_author_bibs +from src.http_utils import http_get_text, reset_api_call_counts from src.io_utils import ( append_summary_to_csv, - build_a2i2_folder, - collect_orphan_files, - flush_summary_csv, init_summary_csv, is_known_summary_path, read_gemini_api_key, @@ -92,11 +85,11 @@ read_semantic_api_key, read_serpapi_api_key, read_serply_api_key, - reconcile_summary_csv, safe_write_file, ) from src.log_utils import LogCategory, LogSource, logger from src.models import Record +from src.pipeline.postrun import finalize_run from src.publication_parser import parse_publication_string from src.text_utils import ( author_name_matches, @@ -110,8 +103,6 @@ _ARXIV_ABS_RE = re.compile(r"arxiv\.org/abs/(\d{4}\.\d{4,5})", re.IGNORECASE) -_FILENAME_YEAR_RE = re.compile(r"/[A-Za-z]+(\d{4})-") - def _entry_is_complete(entry: dict[str, Any]) -> bool: """Check if a BibTeX entry has all essential fields filled with non-placeholder values. @@ -1619,28 +1610,6 @@ def count_existing_papers(rec: Record, out_dir: str) -> int: return 0 -def _load_csv_titles(csv_path: str) -> dict[str, list[str]]: - """Load titles from CSV-tracked .bib files, grouped by author directory.""" - result: dict[str, list[str]] = {} - try: - with open(csv_path, newline="", encoding="utf-8") as f: - for row in csv.DictReader(f): - fp = row.get("file_path", "") - abs_fp = os.path.abspath(fp) - author_dir_path = os.path.dirname(abs_fp) - try: - with open(abs_fp, encoding="utf-8") as bf: - entry = bt.parse_bibtex_to_dict(bf.read()) - t = (entry or {}).get("fields", {}).get("title", "") - if t: - result.setdefault(author_dir_path, []).append(t) - except (OSError, ValueError): - pass - except (OSError, ValueError): - pass - return result - - def main() -> int: """Set up the run, load API keys and author records, and process all authors in parallel. @@ -1808,181 +1777,7 @@ def _thread_excepthook(args: Any) -> None: ) try: - counts = get_api_call_counts() - logger.step("Run complete", category=LogCategory.PLAN) - logger.info(f"Records processed: {processed}", category=LogCategory.PLAN) - logger.info(f"BibTeX files saved: {total_saved}", category=LogCategory.PLAN) - if counts: - logger.info(f"API calls: {counts}", category=LogCategory.PLAN) - logger.info(f"Total API calls: {sum(counts.values()) if counts else 0}", category=LogCategory.PLAN) - cache_counts = get_cache_hit_counts() - logger.info( - f"Cache: {cache_counts['positive']} positive, " - f"{cache_counts['negative']} negative, {cache_counts['miss']} miss", - category=LogCategory.PLAN, - ) - logger.info(f"Log file: {logger.log_file_path or 'n/a'}", category=LogCategory.PLAN) - - if summary_csv_path and os.path.exists(summary_csv_path): - flush_summary_csv(summary_csv_path) - - # Remove phantom CSV entries - phantoms = reconcile_summary_csv(summary_csv_path) - if phantoms: - logger.info(f"Reconciled summary CSV: removed {phantoms} phantom entries", category=LogCategory.CLEANUP) - - # Safe orphan removal (duplicates only) - orphans = collect_orphan_files(summary_csv_path, out_dir) - if orphans: - csv_titles = _load_csv_titles(summary_csv_path) - removed = 0 - for orphan in orphans: - try: - with open(orphan, encoding="utf-8") as of: - orphan_entry = bt.parse_bibtex_to_dict(of.read()) - orphan_title = (orphan_entry or {}).get("fields", {}).get("title", "") - except (OSError, ValueError): - orphan_title = "" - - author_dir_path = os.path.dirname(orphan) - tracked_titles = csv_titles.get(author_dir_path, []) - is_dup = ( - any(title_similarity(orphan_title, t) >= SIM_MERGE_DUPLICATE_THRESHOLD for t in tracked_titles) - if orphan_title - else False - ) - - if is_dup: - os.remove(orphan) - removed += 1 - logger.info( - f"Removed duplicate orphan: {os.path.basename(orphan)}", - category=LogCategory.CLEANUP, - ) - else: - logger.warn( - f"Orphan kept (no duplicate found): {os.path.basename(orphan)}", - category=LogCategory.CLEANUP, - ) - if removed: - logger.info( - f"Removed {removed}/{len(orphans)} orphan .bib files (duplicates only)", - category=LogCategory.CLEANUP, - ) - - # Remove .bib files outside the contribution window - window_min = get_min_year() - window_removed = 0 - for entry in os.listdir(out_dir): - d = os.path.join(out_dir, entry) - if not os.path.isdir(d) or entry == "a2i2": - continue - for fname in os.listdir(d): - if not fname.endswith(".bib"): - continue - fpath = os.path.join(d, fname) - # Try filename year first - m = _FILENAME_YEAR_RE.search(f"/{fname}") - if m: - if int(m.group(1)) < window_min: - logger.debug( - f"YEAR_WINDOW | removing {fname} (year={m.group(1)} < {window_min})", - category=LogCategory.CLEANUP, - ) - os.remove(fpath) - window_removed += 1 - continue - # Fallback: read BibTeX year field for non-standard filenames - try: - with open(fpath, encoding="utf-8") as bf: - parsed = bt.parse_bibtex_to_dict(bf.read()) - bib_year = extract_year_from_any((parsed or {}).get("fields", {}).get("year"), fallback=0) or 0 - if 0 < bib_year < window_min: - logger.debug( - f"YEAR_WINDOW | removing {fname} (bib_year={bib_year} < {window_min})", - category=LogCategory.CLEANUP, - ) - os.remove(fpath) - window_removed += 1 - except (OSError, ValueError): - pass - if window_removed: - logger.info( - f"Removed {window_removed} out-of-window files (year < {window_min})", - category=LogCategory.CLEANUP, - ) - - # Post-run fixup: apply entry type and field corrections to ALL .bib files - # This catches orphans (files not processed during enrichment) and any - # entries where Phase 4 corrections were undone by Tier 2 filling. - postrun_fixed = 0 - for pr_entry_name in iter_output_dirs(out_dir): - pr_dir = os.path.join(out_dir, pr_entry_name) - if pr_entry_name == "a2i2": - continue - for pr_fname in sorted(os.listdir(pr_dir)): - if not pr_fname.endswith(".bib"): - continue - pr_fpath = os.path.join(pr_dir, pr_fname) - try: - with open(pr_fpath, encoding="utf-8") as prf: - pr_content = prf.read() - pr_parsed = bt.parse_bibtex_to_dict(pr_content) - if pr_parsed and _fixup_bib_entry(pr_parsed): - bib_str = bt.bibtex_from_dict(pr_parsed) - if bib_str != pr_content: - safe_write_file(pr_fpath, bib_str) - postrun_fixed += 1 - except (OSError, ValueError): - pass - if postrun_fixed: - logger.info( - f"Post-run fixup: corrected {postrun_fixed} .bib files", - category=LogCategory.CLEANUP, - ) - - # Build a2i2 joint output folder - a2i2_count = build_a2i2_folder(DEFAULT_A2I2_INPUT, records, out_dir) - if a2i2_count: - logger.info( - f"Built a2i2 folder: {a2i2_count} deduplicated files", - category=LogCategory.CLEANUP, - ) - - # Write per-author baseline counts - baseline: dict[str, int] = {} - for entry in iter_output_dirs(out_dir): - d = os.path.join(out_dir, entry) - baseline[entry] = len(iter_author_bibs(d)) - baseline_path = os.path.join(out_dir, "baseline.json") - try: - with open(baseline_path, "w", encoding="utf-8") as bf: - json.dump({"total": sum(baseline.values()), "authors": baseline}, bf, indent=2) - except OSError: - pass - - # Write badge data for README workflow updates - badges_path = os.path.join(out_dir, "badges.json") - try: - with open(badges_path, "w", encoding="utf-8") as bf: - total = cache_counts["positive"] + cache_counts["negative"] + cache_counts["miss"] - hit_rate = ((cache_counts["positive"] + cache_counts["negative"]) / total * 100) if total else 0 - json.dump( - { - "last_updated": time.strftime("%Y-%m"), - "cache_positive_hits": cache_counts["positive"], - "cache_negative_hits": cache_counts["negative"], - "cache_misses": cache_counts["miss"], - "total_queries": total, - "hit_rate": round(hit_rate, 1), - }, - bf, - indent=2, - ) - except OSError: - pass - - logger.info(f"Summary CSV: {summary_csv_path}", category=LogCategory.PLAN) + finalize_run(out_dir, records, total_saved, processed, summary_csv_path) finally: logger.close() diff --git a/src/pipeline/__init__.py b/src/pipeline/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/src/pipeline/postrun.py b/src/pipeline/postrun.py new file mode 100644 index 00000000..e48ab298 --- /dev/null +++ b/src/pipeline/postrun.py @@ -0,0 +1,247 @@ +from __future__ import annotations + +import csv +import json +import os +import re +import time + +from src import bibtex_utils as bt +from src.cache import get_cache_hit_counts +from src.canonicalize import ( + _fixup_bib_entry, +) +from src.config import ( + DEFAULT_A2I2_INPUT, + SIM_MERGE_DUPLICATE_THRESHOLD, + get_min_year, +) +from src.fsscan import iter_author_bibs, iter_output_dirs +from src.http_utils import get_api_call_counts +from src.io_utils import ( + build_a2i2_folder, + collect_orphan_files, + flush_summary_csv, + reconcile_summary_csv, + safe_write_file, +) +from src.log_utils import LogCategory, logger +from src.models import Record +from src.text_utils import ( + extract_year_from_any, + title_similarity, +) + +_FILENAME_YEAR_RE = re.compile(r"/[A-Za-z]+(\d{4})-") + + +def finalize_run( + out_dir: str, + records: list[Record], + total_saved: int, + processed: int, + summary_csv_path: str | None, +) -> None: + """Run the strict-ordered post-run finalization tail. + + Logs run stats, then (when the summary CSV exists) flushes it, reconciles + phantom rows, removes duplicate orphans, deletes out-of-window files, applies + the post-run fixup, builds the a2i2 folder, and rewrites baseline.json and + badges.json. Order is load-bearing. + """ + counts = get_api_call_counts() + logger.step("Run complete", category=LogCategory.PLAN) + logger.info(f"Records processed: {processed}", category=LogCategory.PLAN) + logger.info(f"BibTeX files saved: {total_saved}", category=LogCategory.PLAN) + if counts: + logger.info(f"API calls: {counts}", category=LogCategory.PLAN) + logger.info(f"Total API calls: {sum(counts.values()) if counts else 0}", category=LogCategory.PLAN) + cache_counts = get_cache_hit_counts() + logger.info( + f"Cache: {cache_counts['positive']} positive, {cache_counts['negative']} negative, {cache_counts['miss']} miss", + category=LogCategory.PLAN, + ) + logger.info(f"Log file: {logger.log_file_path or 'n/a'}", category=LogCategory.PLAN) + + if summary_csv_path and os.path.exists(summary_csv_path): + flush_summary_csv(summary_csv_path) + + # Remove phantom CSV entries + phantoms = reconcile_summary_csv(summary_csv_path) + if phantoms: + logger.info(f"Reconciled summary CSV: removed {phantoms} phantom entries", category=LogCategory.CLEANUP) + + # Safe orphan removal (duplicates only) + orphans = collect_orphan_files(summary_csv_path, out_dir) + if orphans: + csv_titles = _load_csv_titles(summary_csv_path) + removed = 0 + for orphan in orphans: + try: + with open(orphan, encoding="utf-8") as of: + orphan_entry = bt.parse_bibtex_to_dict(of.read()) + orphan_title = (orphan_entry or {}).get("fields", {}).get("title", "") + except (OSError, ValueError): + orphan_title = "" + + author_dir_path = os.path.dirname(orphan) + tracked_titles = csv_titles.get(author_dir_path, []) + is_dup = ( + any(title_similarity(orphan_title, t) >= SIM_MERGE_DUPLICATE_THRESHOLD for t in tracked_titles) + if orphan_title + else False + ) + + if is_dup: + os.remove(orphan) + removed += 1 + logger.info( + f"Removed duplicate orphan: {os.path.basename(orphan)}", + category=LogCategory.CLEANUP, + ) + else: + logger.warn( + f"Orphan kept (no duplicate found): {os.path.basename(orphan)}", + category=LogCategory.CLEANUP, + ) + if removed: + logger.info( + f"Removed {removed}/{len(orphans)} orphan .bib files (duplicates only)", + category=LogCategory.CLEANUP, + ) + + # Remove .bib files outside the contribution window + window_min = get_min_year() + window_removed = 0 + for entry in os.listdir(out_dir): + d = os.path.join(out_dir, entry) + if not os.path.isdir(d) or entry == "a2i2": + continue + for fname in os.listdir(d): + if not fname.endswith(".bib"): + continue + fpath = os.path.join(d, fname) + # Try filename year first + m = _FILENAME_YEAR_RE.search(f"/{fname}") + if m: + if int(m.group(1)) < window_min: + logger.debug( + f"YEAR_WINDOW | removing {fname} (year={m.group(1)} < {window_min})", + category=LogCategory.CLEANUP, + ) + os.remove(fpath) + window_removed += 1 + continue + # Fallback: read BibTeX year field for non-standard filenames + try: + with open(fpath, encoding="utf-8") as bf: + parsed = bt.parse_bibtex_to_dict(bf.read()) + bib_year = extract_year_from_any((parsed or {}).get("fields", {}).get("year"), fallback=0) or 0 + if 0 < bib_year < window_min: + logger.debug( + f"YEAR_WINDOW | removing {fname} (bib_year={bib_year} < {window_min})", + category=LogCategory.CLEANUP, + ) + os.remove(fpath) + window_removed += 1 + except (OSError, ValueError): + pass + if window_removed: + logger.info( + f"Removed {window_removed} out-of-window files (year < {window_min})", + category=LogCategory.CLEANUP, + ) + + # Post-run fixup: apply entry type and field corrections to ALL .bib files + # This catches orphans (files not processed during enrichment) and any + # entries where Phase 4 corrections were undone by Tier 2 filling. + postrun_fixed = 0 + for pr_entry_name in iter_output_dirs(out_dir): + pr_dir = os.path.join(out_dir, pr_entry_name) + if pr_entry_name == "a2i2": + continue + for pr_fname in sorted(os.listdir(pr_dir)): + if not pr_fname.endswith(".bib"): + continue + pr_fpath = os.path.join(pr_dir, pr_fname) + try: + with open(pr_fpath, encoding="utf-8") as prf: + pr_content = prf.read() + pr_parsed = bt.parse_bibtex_to_dict(pr_content) + if pr_parsed and _fixup_bib_entry(pr_parsed): + bib_str = bt.bibtex_from_dict(pr_parsed) + if bib_str != pr_content: + safe_write_file(pr_fpath, bib_str) + postrun_fixed += 1 + except (OSError, ValueError): + pass + if postrun_fixed: + logger.info( + f"Post-run fixup: corrected {postrun_fixed} .bib files", + category=LogCategory.CLEANUP, + ) + + # Build a2i2 joint output folder + a2i2_count = build_a2i2_folder(DEFAULT_A2I2_INPUT, records, out_dir) + if a2i2_count: + logger.info( + f"Built a2i2 folder: {a2i2_count} deduplicated files", + category=LogCategory.CLEANUP, + ) + + # Write per-author baseline counts + baseline: dict[str, int] = {} + for entry in iter_output_dirs(out_dir): + d = os.path.join(out_dir, entry) + baseline[entry] = len(iter_author_bibs(d)) + baseline_path = os.path.join(out_dir, "baseline.json") + try: + with open(baseline_path, "w", encoding="utf-8") as bf: + json.dump({"total": sum(baseline.values()), "authors": baseline}, bf, indent=2) + except OSError: + pass + + # Write badge data for README workflow updates + badges_path = os.path.join(out_dir, "badges.json") + try: + with open(badges_path, "w", encoding="utf-8") as bf: + total = cache_counts["positive"] + cache_counts["negative"] + cache_counts["miss"] + hit_rate = ((cache_counts["positive"] + cache_counts["negative"]) / total * 100) if total else 0 + json.dump( + { + "last_updated": time.strftime("%Y-%m"), + "cache_positive_hits": cache_counts["positive"], + "cache_negative_hits": cache_counts["negative"], + "cache_misses": cache_counts["miss"], + "total_queries": total, + "hit_rate": round(hit_rate, 1), + }, + bf, + indent=2, + ) + except OSError: + pass + + logger.info(f"Summary CSV: {summary_csv_path}", category=LogCategory.PLAN) + + +def _load_csv_titles(csv_path: str) -> dict[str, list[str]]: + """Load titles from CSV-tracked .bib files, grouped by author directory.""" + result: dict[str, list[str]] = {} + try: + with open(csv_path, newline="", encoding="utf-8") as f: + for row in csv.DictReader(f): + fp = row.get("file_path", "") + abs_fp = os.path.abspath(fp) + author_dir_path = os.path.dirname(abs_fp) + try: + with open(abs_fp, encoding="utf-8") as bf: + entry = bt.parse_bibtex_to_dict(bf.read()) + t = (entry or {}).get("fields", {}).get("title", "") + if t: + result.setdefault(author_dir_path, []).append(t) + except (OSError, ValueError): + pass + except (OSError, ValueError): + pass + return result From 8ca7f1979743917f920151d41803cd75a8e6b97e Mon Sep 17 00:00:00 2001 From: Gabriel Spadon Date: Wed, 1 Jul 2026 17:42:54 -0300 Subject: [PATCH 31/54] refactor: relocate process_article into src/pipeline/article --- main.py | 1368 +------------------------------------- src/pipeline/article.py | 1390 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 1394 insertions(+), 1364 deletions(-) create mode 100644 src/pipeline/article.py diff --git a/main.py b/main.py index 7af399c8..27ffd588 100644 --- a/main.py +++ b/main.py @@ -2,48 +2,23 @@ import os import random -import re import sys import threading import time -from collections.abc import Callable from concurrent.futures import ThreadPoolExecutor, as_completed from typing import Any -from src import bibtex_utils as bt -from src import id_utils as idu -from src import merge_utils as mu from src.canonicalize import ( - CanonicalStage, _fixup_bib_entry, # noqa: F401 # re-exported for test imports - canonicalize, ) -from src.clients.helpers import extract_authors_from_article, get_article_year, strip_html_tags +from src.clients.helpers import get_article_year, strip_html_tags from src.clients.scholar import ( - build_bibtex_from_scholar_fields, fetch_author_publications, - fetch_scholar_citation, merge_publication_lists, sort_articles_by_year_current_first, ) from src.clients.search_apis import ( - arxiv_search, - build_bibtex_from_arxiv, - build_bibtex_from_crossref, - build_bibtex_from_europepmc, - build_bibtex_from_openalex, - build_bibtex_from_openreview, - build_bibtex_from_pubmed, - build_bibtex_from_s2, - crossref_search_by_venue, - crossref_search_multiple, dblp_fetch_for_author, - europepmc_search_papers_multiple, - openalex_search_by_venue, - openalex_search_multiple, - openreview_search_papers_multiple, - pubmed_search_papers_multiple, - s2_search_papers_multiple, ) from src.config import ( DEFAULT_INPUT, @@ -51,1373 +26,38 @@ DEFAULT_S2_KEY_FILE, DEFAULT_SERPAPI_KEY_FILE, DEFAULT_SERPLY_KEY_FILE, - GENERIC_SERIES_NAMES, MAX_PUBLICATIONS_PER_AUTHOR, MAX_WORKERS, - MIN_TITLE_WORDS, - PREPRINT_SERVERS, - PUB_PARSE_TIER1_MIN_CONFIDENCE, - PUB_PARSE_TIER2_MIN_CONFIDENCE, REQUEST_DELAY_MAX, REQUEST_DELAY_MIN, SIM_MERGE_DUPLICATE_THRESHOLD, - SIM_PREPRINT_TITLE_THRESHOLD, - SKIP_SCHOLAR_FOR_EXISTING_FILES, get_min_year, ) -from src.doi_utils import process_validated_doi from src.exceptions import ( - ALL_API_ERRORS, FILE_IO_ERRORS, FILE_READ_ERRORS, FULL_OPERATION_ERRORS, - PARSE_ERRORS, ) from src.fsscan import iter_author_bibs -from src.http_utils import http_get_text, reset_api_call_counts +from src.http_utils import reset_api_call_counts from src.io_utils import ( - append_summary_to_csv, init_summary_csv, - is_known_summary_path, read_gemini_api_key, read_openreview_credentials, read_records, read_semantic_api_key, read_serpapi_api_key, read_serply_api_key, - safe_write_file, ) from src.log_utils import LogCategory, LogSource, logger from src.models import Record +from src.pipeline.article import process_article from src.pipeline.postrun import finalize_run -from src.publication_parser import parse_publication_string from src.text_utils import ( - author_name_matches, - extract_year_from_any, format_author_dirname, - has_placeholder, - title_similarity, trim_title_default, ) -from src.textnorm import _is_corrupted_title, _is_garbage_title - -_ARXIV_ABS_RE = re.compile(r"arxiv\.org/abs/(\d{4}\.\d{4,5})", re.IGNORECASE) - - -def _entry_is_complete(entry: dict[str, Any]) -> bool: - """Check if a BibTeX entry has all essential fields filled with non-placeholder values. - - Returns False for preprint entries (DOI from arXiv/Research Square or journal - in PREPRINT_SERVERS) so they are re-enriched and potentially upgraded to the - published version. - """ - fields = entry.get("fields") or {} - title = fields.get("title") or "" - author = fields.get("author") or "" - year = fields.get("year") or "" - doi = fields.get("doi") - has_venue = any(fields.get(v) and not has_placeholder(str(fields.get(v))) for v in ("journal", "booktitle")) - - # Determine completeness: check essential fields, venue, DOI, and preprint status - doi_is_preprint = False - journal_is_preprint = False - - has_essentials = all(fields.get(k) and not has_placeholder(str(fields.get(k))) for k in ("title", "author", "year")) - has_doi = bool(doi) and not has_placeholder(str(doi)) - - if has_essentials and has_venue and has_doi: - doi_is_preprint = idu.is_secondary_doi(str(doi)) - if not doi_is_preprint: - journal = str(fields.get("journal") or "").lower() - journal_is_preprint = any(ps in journal for ps in PREPRINT_SERVERS) - - # Treat generic series booktitles as incomplete so they get re-enriched - venue_is_generic = False - if has_venue: - bt_val = (fields.get("booktitle") or "").lower().strip() - venue_is_generic = bt_val in GENERIC_SERIES_NAMES and not fields.get("journal") - - result = ( - has_essentials - and has_venue - and has_doi - and not doi_is_preprint - and not journal_is_preprint - and not venue_is_generic - ) - - logger.debug( - f"COMPLETE_CHECK | title={title[:50]} | has_title={bool(title)} " - f"| has_author={bool(author)} | has_year={bool(year)} " - f"| has_venue={has_venue} | has_doi={has_doi} " - f"| doi_is_preprint={doi_is_preprint} | journal_is_preprint={journal_is_preprint} " - f"| result={result}", - category=LogCategory.AUDIT, - ) - return result - - -def _read_doi_from_file(filepath: str) -> str: - """Read and normalize the DOI from a .bib file on disk, returning '' on failure.""" - try: - with open(filepath, encoding="utf-8") as f: - parsed = bt.parse_bibtex_to_dict(f.read()) - return idu.normalize_doi((parsed or {}).get("fields", {}).get("doi", "")) or "" - except (OSError, UnicodeDecodeError): - return "" - - -def _revert_misattributed_doi( - merged_fields: dict[str, Any], - bad_doi: str, - doi_validated: bool, - doi_early: str | None, -) -> None: - """Replace a mis-attributed DOI with the Phase-1-validated DOI (if any), or remove it.""" - if merged_fields.get("doi") != bad_doi: - return - fallback = idu.normalize_doi(doi_early) if doi_validated and doi_early else None - if fallback and fallback != bad_doi: - merged_fields["doi"] = fallback - else: - merged_fields.pop("doi", None) - merged_fields.pop("url", None) - logger.debug( - f"DOI_REVERT | removed={bad_doi} | restored={fallback or 'none'} | reason=misattributed_candidate", - category=LogCategory.DEDUP, - ) - - -def _try_multiple_candidates( - source_name: str, - candidates: list[Any], - build_func: Callable[..., str | None], - baseline_entry: dict[str, Any], - result_id: str, - enr_list: list[tuple[str, dict[str, Any]]], - flags: dict[str, bool], - flag_key: str, - max_candidates: int = 5, - seen_dois: set[str] | None = None, -) -> tuple[bool, Any | None]: - """Try candidates from an API source in relevance order until one matches the baseline. - - When *seen_dois* is provided, every DOI encountered across all candidates - (matched or not) is collected. This enables downstream duplicate detection - against files already on disk even when the candidate was rejected by the - matching gate. - - Returns (matched, matched_candidate) tuple. - """ - if not candidates: - return False, None - - candidates_to_try = candidates[:max_candidates] - - for idx, candidate in enumerate(candidates_to_try, 1): - try: - candidate_bib = build_func(candidate, keyhint=result_id) - if not candidate_bib: - continue - - candidate_dict = bt.parse_bibtex_to_dict(candidate_bib) - if not candidate_dict: - continue - - # Collect DOI from every parsed candidate for dedup - if seen_dois is not None: - cand_doi = idu.normalize_doi((candidate_dict.get("fields") or {}).get("doi", "")) - if cand_doi: - seen_dois.add(cand_doi) - - match = bt.bibtex_entries_match_strict(baseline_entry, candidate_dict) - if match: - enr_list.append((flag_key, candidate_dict)) - flags[flag_key] = True - logger.success( - "Match validated and added to enrichment", - category=LogCategory.MATCH, - source=source_name, - ) - return True, candidate - - except Exception as e: - logger.debug( - f"CANDIDATE_ERROR | source={source_name} #{idx} | error={type(e).__name__}: {e}", - category=LogCategory.AUDIT, - ) - logger.info(f"Candidate {idx}: error - {e}", category=LogCategory.DEBUG, source=source_name) - - return False, None - - -def process_article( - rec: Record, - art: dict[str, Any], - serply_key: str | None, - out_dir: str, - s2_api_key: str | None, - or_creds: tuple[str, str] | None, - idx: int | None = None, - total: int | None = None, - gemini_api_key: str | None = None, - summary_csv_path: str | None = None, - min_year: int = 0, - force_enrich: bool = False, -) -> int: - """Enrich a single publication from baseline through 4-phase pipeline and save to disk. - - Returns 1 when a file was written, or 0 when the article was skipped or failed. - """ - title = trim_title_default(strip_html_tags(art.get("title") or "")) - authors_list = extract_authors_from_article(art) or [] - year_hint = get_article_year(art) or None - # Determine IDs; Scholar may provide multiple identifiers - citation_id = art.get("citation_id") or art.get("result_id") - cluster_id = art.get("cluster_id") or ( - art.get("result_id") if citation_id and art.get("result_id") != citation_id else None - ) - result_id = citation_id or re.sub(r"\W+", "_", title or "untitled") - flags = { - "scholar_bib": False, - "scholar_page": False, - "s2": False, - "crossref": False, - "openreview": False, - "arxiv": False, - "openalex": False, - "pubmed": False, - "europepmc": False, - "doi_csl": False, - "doi_bibtex": False, - } - - if not title: - logger.error("Missing required field: title; skipping article", category=LogCategory.SKIP) - return 0 - - word_count = len(title.split()) - corrupted = _is_corrupted_title(title) - garbage = _is_garbage_title(title) - logger.debug( - f"TITLE_VALIDATE | raw={title[:60]} | words={word_count} | corrupted={corrupted} " - f"| garbage={garbage} | valid={word_count >= MIN_TITLE_WORDS and not corrupted and not garbage}", - category=LogCategory.AUDIT, - ) - - if word_count < MIN_TITLE_WORDS: - logger.warn( - f"Title too short (probable artifact): '{title}'; skipping", - category=LogCategory.SKIP, - ) - return 0 - if corrupted: - logger.warn( - f"Corrupted title (probable DBLP artifact): '{title}'; skipping", - category=LogCategory.SKIP, - ) - return 0 - if garbage: - logger.warn( - f"Garbage title (non-bibliographic content): '{title}'; skipping", - category=LogCategory.SKIP, - ) - return 0 - if not authors_list or not year_hint: - logger.warn( - "Article missing authors and/or year; continuing with best-effort enrichment", - category=LogCategory.ARTICLE, - ) - - idx_prefix = f"[{idx}/{total}] " if idx is not None and total is not None else "" - art_source = (art.get("source") or "scholar").strip() - - logger.step(f"{idx_prefix}Processing Article", category=LogCategory.ARTICLE) - logger.info(f"Title: {title}", category=LogCategory.ARTICLE) - if year_hint: - logger.info(f"Year: {year_hint}", category=LogCategory.ARTICLE) - logger.info(f"Source: {art_source}", category=LogCategory.ARTICLE) - - effective_id = rec.scholar_id or rec.dblp or "" - author_dirname = format_author_dirname(rec.name, effective_id) - author_dir = os.path.join(out_dir, author_dirname) - existing_file_loaded = False - baseline_entry = None - existing_file_path = None - - # Try to find existing BibTeX file to use as enrichment seed - # If found, load it and use as baseline - enrichment process will update/fix fields - if SKIP_SCHOLAR_FOR_EXISTING_FILES and os.path.exists(author_dir): - # Sort filenames for deterministic iteration order - bib_files = iter_author_bibs(author_dir) - logger.debug( - f"EXISTING_FILE_SCAN | dir={author_dir} | files_checked={len(bib_files)}", - category=LogCategory.AUDIT, - ) - for filename in bib_files: - file_path = os.path.join(author_dir, filename) - try: - with open(file_path, encoding="utf-8") as f: - existing_bib = f.read() - existing_entry = bt.parse_bibtex_to_dict(existing_bib) - - # Check if this file matches our article by comparing title - if existing_entry: - existing_title = existing_entry.get("fields", {}).get("title", "") - if isinstance(existing_title, list): - existing_title = existing_title[0] if existing_title else "" - - # Purge stale files whose titles now fail validation - if _is_garbage_title(existing_title) or _is_corrupted_title(existing_title): - logger.warn( - f"STALE_FILE_REMOVED | file={filename} | reason=title_now_invalid", - category=LogCategory.CLEANUP, - ) - os.remove(file_path) - continue - - sim = title_similarity(title, existing_title) - if sim >= SIM_MERGE_DUPLICATE_THRESHOLD: - baseline_entry = existing_entry - existing_file_path = file_path - existing_file_loaded = True - logger.info( - f"Using existing BibTeX as baseline: {filename}", - category=LogCategory.ARTICLE, - source=LogSource.SYSTEM, - ) - is_complete = _entry_is_complete(existing_entry) - logger.debug( - f"EXISTING_FILE_LOADED | file={filename} | complete={is_complete}", - category=LogCategory.AUDIT, - ) - break - except (OSError, ValueError, TypeError): - continue - - # Fixup stale entries loaded from disk before enrichment: the pure entry - # field/type rewrites are single-sourced in src/canonicalize.py at the - # LOAD_REPAIR stage. The destructive title==venue delete (N22) and the - # bare-& rewrite trigger stay here in the pipeline. - if existing_file_loaded and baseline_entry is not None: - _fixup_written = canonicalize(baseline_entry, stage=CanonicalStage.LOAD_REPAIR) - _bl_fields = baseline_entry.get("fields") or {} - - # Delete entries where title equals journal or booktitle (corrupted Scholar data) - _bl_title_venue = (_bl_fields.get("title") or "").strip().lower() - if _bl_title_venue: - _bl_journal_venue = (_bl_fields.get("journal") or "").strip().lower() - _bl_booktitle_venue = (_bl_fields.get("booktitle") or "").strip().lower() - if (_bl_journal_venue and _bl_title_venue == _bl_journal_venue) or ( - _bl_booktitle_venue and _bl_title_venue == _bl_booktitle_venue - ): - logger.debug( - f"EXISTING_FIXUP | title_is_venue | title={_bl_title_venue[:60]} | deleting", - category=LogCategory.CLEANUP, - ) - if existing_file_path and os.path.exists(existing_file_path): - os.remove(existing_file_path) - return 0 - - # Escape bare & in field values (bibtex_from_dict handles this on write, - # but we need to trigger a rewrite for files that were never re-serialized) - for _fk, _fv in _bl_fields.items(): - if _fk not in ("url", "doi") and isinstance(_fv, str) and "&" in _fv and r"\&" not in _fv: - _fixup_written = True - break - - if _fixup_written and existing_file_path: - bib_str = bt.bibtex_from_dict(baseline_entry) - safe_write_file(existing_file_path, bib_str) - - # Skip enrichment entirely if entry is already complete (unless --force) - if not force_enrich and existing_file_loaded and baseline_entry is not None and _entry_is_complete(baseline_entry): - # Quick fixup: strip preprint-only publishers from complete entries. - # Single-sourced in canonicalize() at the COMPLETE_SKIP_FINALIZE stage; the - # debug log and write-gating stay here so the skip-path I/O is unchanged. - bl_fields = baseline_entry.get("fields") or {} - _pub_before = bl_fields.get("publisher") - if canonicalize(baseline_entry, stage=CanonicalStage.COMPLETE_SKIP_FINALIZE): - logger.debug( - f"EXISTING_FIXUP | publisher_stripped={_pub_before} | journal={bl_fields.get('journal')}", - category=LogCategory.CLEANUP, - ) - if existing_file_path: - bib_str = bt.bibtex_from_dict(baseline_entry) - safe_write_file(existing_file_path, bib_str) - - # NOTE: the former "@article with a preprint DOI -> @misc" quick-fixup was - # removed here as unreachable dead code: _entry_is_complete() (the guard - # above) only returns True for a NON-preprint DOI, so is_secondary_doi() on - # the same field can never be True on this skip-enrichment path. - - logger.info("Entry already complete; skipping enrichment", category=LogCategory.SKIP, source=LogSource.SYSTEM) - if summary_csv_path and existing_file_path: - try: - rel = os.path.relpath(existing_file_path) - except (OSError, ValueError): - rel = existing_file_path - # Only write a new CSV row if this file has no entry from a previous run - if not is_known_summary_path(rel): - append_summary_to_csv(summary_csv_path, rel, 0, flags) - return 1 - - # If no existing file found, build minimal BibTeX baseline - if not existing_file_loaded: - logger.info("Creating baseline BibTeX entry", category=LogCategory.ARTICLE, source=LogSource.SYSTEM) - scholar_bib = bt.build_minimal_bibtex(title, authors_list, year_hint or 0, keyhint=result_id) - - baseline_entry = bt.parse_bibtex_to_dict(scholar_bib) - if baseline_entry is None: - # Parse failed - should be rare since we generated the BibTeX - logger.error("Failed to parse Scholar BibTeX; using minimal fallback structure", category=LogCategory.ERROR) - baseline_entry = {"type": "misc", "key": result_id or "entry", "fields": {"title": title} if title else {}} - _bl_source = "scholar_minimal" - else: - _bl_source = "existing_file" - _bl_field_names = sorted((baseline_entry.get("fields") or {}).keys()) if baseline_entry else [] - logger.debug( - f"BASELINE_CREATE | source={_bl_source} | fields=[{', '.join(_bl_field_names)}]", - category=LogCategory.AUDIT, - ) - if baseline_entry is None: # Safety net (should not happen) - logger.error("Failed to create baseline entry; skipping article", category=LogCategory.ERROR) - return 0 - bf = baseline_entry.get("fields") or {} - if cluster_id: - bf["x_scholar_cluster_id"] = cluster_id - # Attempt to locate arXiv ID or DOI in article snippet or links - try: - snippet = art.get("snippet") or art.get("publication_info") or "" - ax_from_snip = idu.find_arxiv_in_text(snippet) - - # Collect all link URLs from the article metadata - link_texts: list[str] = [str(art[k]) for k in ("link", "link_to_pdf") if art.get(k)] - for r in art.get("resources") or []: - if isinstance(r, dict): - for lk in ("link", "file_link", "url"): - if r.get(lk): - link_texts.append(str(r[lk])) - for fld in ("versions", "resources", "websites"): - for it in (art.get("inline_links") or {}).get(fld) or []: - if isinstance(it, dict) and it.get("link"): - link_texts.append(str(it["link"])) - - # Extract arXiv ID and DOI from collected links - ax_from_links = None - doi_from_links = None - for u in link_texts: - if not ax_from_links: - ax_from_links = idu.find_arxiv_in_text(u) - if not doi_from_links: - doi_from_links = idu.find_doi_in_text(u) - ax_pick = ax_from_snip or ax_from_links - if ax_pick: - bf["eprint"] = ax_pick - bf["archiveprefix"] = "arXiv" - # Store DOI from DBLP/Scholar links if baseline has none - if doi_from_links and not bf.get("doi"): - bf["doi"] = doi_from_links - logger.debug( - f"SNIPPET_EXTRACT | arxiv_from_snippet={ax_from_snip} " - f"| arxiv_from_links={ax_from_links} | doi_from_links={doi_from_links}", - category=LogCategory.AUDIT, - ) - except PARSE_ERRORS: - pass - baseline_entry["fields"] = bf - ck = ( - bt.build_standard_citekey(baseline_entry, gemini_api_key=gemini_api_key) or baseline_entry.get("key") or "Entry" - ) - baseline_entry["key"] = ck - - # Save baseline only if we didn't load from existing file - if existing_file_loaded: - # Remove existing files outside the contribution window - if min_year > 0 and existing_file_path: - ex_year = extract_year_from_any((baseline_entry or {}).get("fields", {}).get("year"), fallback=0) or 0 - if 0 < ex_year < min_year: - logger.info( - f"Removing out-of-window existing file (year={ex_year} < {min_year}): " - f"{os.path.basename(existing_file_path)}", - category=LogCategory.CLEANUP, - ) - os.remove(existing_file_path) - return 0 - path = existing_file_path - logger.info(f"Using existing file: {path}", category=LogCategory.SKIP) - else: - # Defer disk write for bare baselines (no DOI) to avoid creating - # transient files that get renamed/cleaned during enrichment. - # The final entry will be written after Phase 4 by save_entry_to_file. - if not bf.get("doi", "").strip(): - path = None - logger.info( - "Baseline deferred (no DOI; will write after enrichment)", - category=LogCategory.SKIP, - source=LogSource.SYSTEM, - ) - else: - path, was_written = mu.save_entry_to_file( - out_dir, - effective_id, - baseline_entry, - gemini_api_key=gemini_api_key, - author_name=rec.name, - ) - if was_written: - logger.success(f"Saved baseline: {path}", category=LogCategory.SAVE, source=LogSource.SYSTEM) - else: - # save_entry_to_file found a duplicate and skipped writing — - # the article is already on disk under a different name. - # Skip enrichment entirely to avoid churn. - logger.info( - f"Baseline duplicate detected; skipping enrichment: {path}", - category=LogCategory.SKIP, - source=LogSource.SYSTEM, - ) - if summary_csv_path and path: - try: - rel = os.path.relpath(path) - except (OSError, ValueError): - rel = path - if not is_known_summary_path(rel): - append_summary_to_csv(summary_csv_path, rel, 0, flags) - return 1 - - enr_list: list[tuple[str, dict[str, Any]]] = [] - # Collect DOIs from ALL Phase 2 candidates (matched or not) for - # deterministic dedup: if a candidate's DOI already exists on disk, - # we skip writing even when the candidate was rejected by the match gate. - all_candidate_dois: set[str] = set() - - # ===== PHASE 1: Early DOI Validation ===== - logger.info("▶ Phase 1: Early DOI Validation", category=LogCategory.ARTICLE) - - # if the baseline already has a DOI, use it to get better metadata early on - doi_validated = False # Track if we successfully validated the DOI - unvalidated_doi: str | None = None # Stash failed DOI for Phase 3 retry - p1_doi = bf.get("doi") - logger.debug( - f"PHASE1_START | doi={p1_doi} | has_doi={bool(p1_doi)}", - category=LogCategory.AUDIT, - ) - try: - doi_early = idu.normalize_doi(bf.get("doi")) - if doi_early: - logger.info(f"Validating DOI: {doi_early}", category=LogCategory.SEARCH, source=LogSource.DOI) - doi_matched = process_validated_doi(doi_early, baseline_entry, result_id, enr_list, flags) - - # If DOI failed validation, stash it for Phase 3 and remove from baseline - if not doi_matched: - unvalidated_doi = doi_early - bf.pop("doi", None) - logger.warn( - "DOI validation failed, removed from baseline (will retry in Phase 3)", - category=LogCategory.ARTICLE, - source=LogSource.DOI, - ) - else: - doi_validated = True - logger.success("DOI validated successfully", category=LogCategory.MATCH, source=LogSource.DOI) - logger.debug( - f"PHASE1_RESULT | doi={doi_early} | validated={doi_validated} | stashed={unvalidated_doi is not None}", - category=LogCategory.AUDIT, - ) - except PARSE_ERRORS: - pass - - # ===== PHASE 2: API Enrichment ===== - logger.info("▶ Phase 2: API Enrichment", category=LogCategory.ARTICLE) - logger.debug( - f"PHASE2_START | title={title[:60]} | doi_validated={doi_validated}", - category=LogCategory.AUDIT, - ) - - # Skip Scholar citation fetch if we loaded an existing file (optimization to reduce API usage) - if existing_file_loaded: - logger.info("Skipped (using existing file as baseline)", category=LogCategory.SKIP, source=LogSource.SCHOLAR) - elif not serply_key: - logger.info("Skipped (no Serply key)", category=LogCategory.SKIP, source=LogSource.SCHOLAR) - else: - logger.info("Fetching citation metadata", category=LogCategory.FETCH, source=LogSource.SCHOLAR) - if title: - try: - fields = fetch_scholar_citation(serply_key, title, rec.name) - if fields: - sch_page_bib = build_bibtex_from_scholar_fields(fields, keyhint=result_id) - if sch_page_bib: - sch_page_dict = bt.parse_bibtex_to_dict(sch_page_bib) - if sch_page_dict and bt.bibtex_entries_match_strict(baseline_entry, sch_page_dict): - enr_list.append(("scholar_page", sch_page_dict)) - flags["scholar_page"] = True - logger.success( - "Match validated and added to enrichment", - category=LogCategory.MATCH, - source=LogSource.SCHOLAR, - ) - else: - logger.info( - "Citation did not match baseline", - category=LogCategory.SKIP, - source=LogSource.SCHOLAR, - ) - else: - logger.info("No BibTeX generated", category=LogCategory.SKIP, source=LogSource.SCHOLAR) - else: - logger.info("No data returned", category=LogCategory.SKIP, source=LogSource.SCHOLAR) - except ALL_API_ERRORS as e: - logger.warn(f"Citation fetch error: {e}", category=LogCategory.ERROR, source=LogSource.SCHOLAR) - else: - logger.info("No title available; skipped", category=LogCategory.SKIP, source=LogSource.SCHOLAR) - - logger.debug(f"SEARCH_START | source=S2 | title={title[:60]}", category=LogCategory.AUDIT) - s2_paper = None - if s2_api_key: - try: - s2_papers = s2_search_papers_multiple(title, rec.name, s2_api_key, max_results=5) - if s2_papers: - _, s2_paper = _try_multiple_candidates( - LogSource.S2, - s2_papers, - build_bibtex_from_s2, - baseline_entry, - result_id, - enr_list, - flags, - "s2", - max_candidates=5, - seen_dois=all_candidate_dois, - ) - if s2_paper: - s2_id = s2_paper.get("paperId") - if s2_id: - baseline_entry["fields"]["x_s2_paper_id"] = str(s2_id) - logger.debug( - f"ID_EXTRACT | api=S2 | field=x_s2_paper_id | value={s2_id}", - category=LogCategory.AUDIT, - ) - except ALL_API_ERRORS as e: - logger.warn(f"API error - {e}", category=LogCategory.ERROR, source=LogSource.S2) - - logger.debug(f"SEARCH_START | source=Crossref | title={title[:60]}", category=LogCategory.AUDIT) - cr_item = None - try: - cr_items = crossref_search_multiple(title, rec.name, max_results=5) - if cr_items: - _, cr_item = _try_multiple_candidates( - LogSource.CROSSREF, - cr_items, - build_bibtex_from_crossref, - baseline_entry, - result_id, - enr_list, - flags, - "crossref", - max_candidates=5, - seen_dois=all_candidate_dois, - ) - except ALL_API_ERRORS as e: - logger.warn(f"API error - {e}", category=LogCategory.ERROR, source=LogSource.CROSSREF) - - logger.debug(f"SEARCH_START | source=OpenReview | title={title[:60]}", category=LogCategory.AUDIT) - try: - or_notes = openreview_search_papers_multiple(title, rec.name, or_creds, max_results=5) - if or_notes: - _try_multiple_candidates( - LogSource.OPENREVIEW, - or_notes, - build_bibtex_from_openreview, - baseline_entry, - result_id, - enr_list, - flags, - "openreview", - max_candidates=5, - seen_dois=all_candidate_dois, - ) - except ALL_API_ERRORS as e: - logger.warn(f"API error - {e}", category=LogCategory.ERROR, source=LogSource.OPENREVIEW) - - logger.debug(f"SEARCH_START | source=arXiv | title={title[:60]}", category=LogCategory.AUDIT) - arxiv_entry = None - try: - arxiv_entries = arxiv_search(title, rec.name, year_hint) - if arxiv_entries: - _, arxiv_entry = _try_multiple_candidates( - LogSource.ARXIV, - arxiv_entries, - build_bibtex_from_arxiv, - baseline_entry, - result_id, - enr_list, - flags, - "arxiv", - max_candidates=5, - seen_dois=all_candidate_dois, - ) - except ALL_API_ERRORS as e: - logger.warn(f"API error - {e}", category=LogCategory.ERROR, source=LogSource.ARXIV) - - logger.debug(f"SEARCH_START | source=OpenAlex | title={title[:60]}", category=LogCategory.AUDIT) - oa_work = None - try: - oa_works = openalex_search_multiple(title, rec.name, max_results=5) - if oa_works: - _, oa_work = _try_multiple_candidates( - LogSource.OPENALEX, - oa_works, - build_bibtex_from_openalex, - baseline_entry, - result_id, - enr_list, - flags, - "openalex", - max_candidates=5, - seen_dois=all_candidate_dois, - ) - if oa_work: - oa_id = oa_work.get("id") - if oa_id: - baseline_entry["fields"]["x_openalex_id"] = str(oa_id) - logger.debug( - f"ID_EXTRACT | api=OpenAlex | field=x_openalex_id | value={oa_id}", - category=LogCategory.AUDIT, - ) - except ALL_API_ERRORS as e: - logger.warn(f"API error - {e}", category=LogCategory.ERROR, source=LogSource.OPENALEX) - logger.debug(f"SEARCH_START | source=PubMed | title={title[:60]}", category=LogCategory.AUDIT) - pm_article = None - try: - pm_articles = pubmed_search_papers_multiple(title, rec.name, max_results=5) - if pm_articles: - _, pm_article = _try_multiple_candidates( - LogSource.PUBMED, - pm_articles, - build_bibtex_from_pubmed, - baseline_entry, - result_id, - enr_list, - flags, - "pubmed", - max_candidates=5, - seen_dois=all_candidate_dois, - ) - except ALL_API_ERRORS as e: - logger.warn(f"API error - {e}", category=LogCategory.ERROR, source=LogSource.PUBMED) - logger.debug(f"SEARCH_START | source=EuropePMC | title={title[:60]}", category=LogCategory.AUDIT) - epmc_article = None - try: - epmc_articles = europepmc_search_papers_multiple(title, rec.name, max_results=5) - if epmc_articles: - _, epmc_article = _try_multiple_candidates( - LogSource.EUROPEPMC, - epmc_articles, - build_bibtex_from_europepmc, - baseline_entry, - result_id, - enr_list, - flags, - "europepmc", - max_candidates=5, - seen_dois=all_candidate_dois, - ) - except ALL_API_ERRORS as e: - logger.warn(f"API error - {e}", category=LogCategory.ERROR, source=LogSource.EUROPEPMC) - - # ===== PHASE 2.5: Venue-Based Search (SerpAPI publication string) ===== - # Only attempt when no enrichment matched so far — avoids redundant API calls. - if not enr_list: - pub_string = art.get("publication") or "" - if pub_string: - parsed_pub = parse_publication_string(pub_string) - if parsed_pub and parsed_pub.confidence >= PUB_PARSE_TIER1_MIN_CONFIDENCE: - logger.info( - f"▶ Phase 2.5: Venue search | venue={parsed_pub.venue_name[:40]} " - f"| type={parsed_pub.venue_type} | conf={parsed_pub.confidence:.2f}", - category=LogCategory.ARTICLE, - ) - - # Inject arXiv ID from publication string (enables Phase 3 DOI discovery) - if parsed_pub.arxiv_id and not bf.get("eprint"): - bf["eprint"] = parsed_pub.arxiv_id - bf["archiveprefix"] = "arXiv" - ax_doi = idu.normalize_doi(f"10.48550/arxiv.{parsed_pub.arxiv_id}") - if ax_doi: - all_candidate_dois.add(ax_doi) - - # Inject DOI fragment from bioRxiv/medRxiv publication string - if parsed_pub.doi_fragment and not bf.get("doi"): - bf["doi"] = parsed_pub.doi_fragment - norm_doi = idu.normalize_doi(parsed_pub.doi_fragment) - if norm_doi: - all_candidate_dois.add(norm_doi) - - # Tier 1: venue-based Crossref search (journal/conference only) - if parsed_pub.venue_type in ("journal", "conference"): - try: - cr_venue_items = crossref_search_by_venue( - title, - rec.name, - container_title=parsed_pub.venue_name, - max_results=5, - ) - if cr_venue_items: - _try_multiple_candidates( - LogSource.CROSSREF, - cr_venue_items, - build_bibtex_from_crossref, - baseline_entry, - result_id, - enr_list, - flags, - "crossref", - max_candidates=5, - seen_dois=all_candidate_dois, - ) - except ALL_API_ERRORS as e: - logger.warn( - f"Venue-based Crossref error: {e}", - category=LogCategory.ERROR, - source=LogSource.CROSSREF, - ) - - # Tier 1: venue-based OpenAlex search (only if Crossref missed) - if not enr_list and parsed_pub.venue_type in ("journal", "conference"): - try: - oa_venue_items = openalex_search_by_venue( - title, - rec.name, - venue_name=parsed_pub.venue_name, - max_results=5, - ) - if oa_venue_items: - _try_multiple_candidates( - LogSource.OPENALEX, - oa_venue_items, - build_bibtex_from_openalex, - baseline_entry, - result_id, - enr_list, - flags, - "openalex", - max_candidates=5, - seen_dois=all_candidate_dois, - ) - except ALL_API_ERRORS as e: - logger.warn( - f"Venue-based OpenAlex error: {e}", - category=LogCategory.ERROR, - source=LogSource.OPENALEX, - ) - - # ===== PHASE 3: Late DOI Discovery ===== - logger.info("▶ Phase 3: Late DOI Discovery", category=LogCategory.ARTICLE) - # Do late DOI negotiation if we haven't validated a DOI, or if the validated - # DOI is a preprint (we may find a published DOI to upgrade to) - baseline_doi = idu.normalize_doi(bf.get("doi")) - is_secondary = bool(baseline_doi and idu.is_secondary_doi(baseline_doi)) - run_phase3 = not doi_validated or is_secondary - logger.debug( - f"PHASE3_START | doi_validated={doi_validated} | baseline_doi={baseline_doi} " - f"| is_secondary={is_secondary} | run_phase3={run_phase3}", - category=LogCategory.AUDIT, - ) - if run_phase3: - logger.info( - "Extracting DOI candidates from enrichment sources", - category=LogCategory.SEARCH, - source=LogSource.DOI, - ) - try: - doi_candidates: list[str] = [] - - def _add_doi(source: str, doi: str | None) -> None: - """Append a DOI candidate and log it for audit.""" - if doi: - doi_candidates.append(str(doi)) - logger.debug( - f"DOI_CANDIDATE | source={source} | doi={doi} | is_secondary={idu.is_secondary_doi(str(doi))}", - category=LogCategory.AUDIT, - ) - - # Include stashed unvalidated DOI from Phase 1 for retry - _add_doi("phase1_stash", unvalidated_doi) - - # Infer arXiv DOIs from eprint fields or URLs in baseline and enrichers - # (deterministic — no HTTP required) - _bl_eprint = idu.extract_arxiv_eprint(baseline_entry) - if _bl_eprint: - _add_doi("baseline_eprint", f"10.48550/arxiv.{_bl_eprint}") - _bl_url = bf.get("url", "") - _bl_url_m = _ARXIV_ABS_RE.search(str(_bl_url)) - if _bl_url_m: - _add_doi("baseline_url", f"10.48550/arxiv.{_bl_url_m.group(1)}") - for _enr_src, _enr_data in enr_list: - _eprint = idu.extract_arxiv_eprint(_enr_data) - if _eprint: - _add_doi(f"eprint_{_enr_src}", f"10.48550/arxiv.{_eprint}") - else: - # Check enricher's URL field for arXiv abstract links - _enr_url = (_enr_data.get("fields") or {}).get("url", "") - _m = _ARXIV_ABS_RE.search(str(_enr_url)) - if _m: - _add_doi(f"url_{_enr_src}", f"10.48550/arxiv.{_m.group(1)}") - - # Only extract DOIs from API results that successfully matched baseline - if s2_paper and flags.get("s2"): - ext = s2_paper.get("externalIds") or {} - for doi_field in (ext.get("DOI") if isinstance(ext, dict) else None, s2_paper.get("doi")): - _add_doi("S2", doi_field) - if cr_item and cr_item.get("DOI") and flags.get("crossref"): - _add_doi("Crossref", cr_item.get("DOI")) - if arxiv_entry and arxiv_entry.get("doi") and flags.get("arxiv"): - _add_doi("arXiv", arxiv_entry.get("doi")) - if oa_work and oa_work.get("doi") and flags.get("openalex"): - _add_doi("OpenAlex", oa_work.get("doi")) - if pm_article and flags.get("pubmed"): - for aid in pm_article.get("articleids") or []: - if aid.get("idtype") == "doi": - _add_doi("PubMed", aid.get("value") or "") - if epmc_article and epmc_article.get("doi") and flags.get("europepmc"): - _add_doi("EuropePMC", epmc_article.get("doi")) - - url_candidates: list[str] = [] - # URLs from baseline are always safe to use - base_url = bf.get("url") - if base_url: - url_candidates.append(base_url) - # Only use URLs from API results that successfully matched baseline - if s2_paper and s2_paper.get("url") and flags.get("s2"): - url_candidates.append(s2_paper.get("url")) - if cr_item and cr_item.get("URL") and flags.get("crossref"): - url_candidates.append(cr_item.get("URL")) - if arxiv_entry and arxiv_entry.get("abs_url") and flags.get("arxiv"): - url_candidates.append(arxiv_entry.get("abs_url")) - if oa_work and oa_work.get("id") and flags.get("openalex"): - url_candidates.append(oa_work.get("id")) - if pm_article and pm_article.get("uid") and flags.get("pubmed"): - url_candidates.append(f"https://pubmed.ncbi.nlm.nih.gov/{pm_article.get('uid')}/") - if epmc_article and flags.get("europepmc"): - pmcid = epmc_article.get("pmcid") - if pmcid: - numeric_id = str(pmcid).removeprefix("PMC") - url_candidates.append(f"https://europepmc.org/article/PMC/{numeric_id}") - - # Deterministic DOI extraction from known URL patterns - # (no HTTP required — prevents network non-determinism) - for u in filter(None, url_candidates): - m = _ARXIV_ABS_RE.search(str(u)) - if m: - inferred = f"10.48550/arxiv.{m.group(1)}" - doi_candidates.append(inferred) - logger.debug( - f"DOI_FROM_URL | url={u} | doi_inferred={inferred}", - category=LogCategory.AUDIT, - ) - break - - # Fall back to cached HTML scraping only if no DOI found yet - if not doi_candidates: - from src.cache import response_cache as _doi_cache - - for u in filter(None, url_candidates): - _u_str = str(u) - _cached_doi = _doi_cache.get("doi_from_html", _u_str) - if _cached_doi is not None: - _cd = _cached_doi.get("doi", "") - if _cd: - doi_candidates.append(_cd) - logger.debug( - f"DOI_FROM_HTML | url={_u_str} | doi_found={_cd} | cached=True", - category=LogCategory.AUDIT, - ) - break - continue # negative cache hit - try: - html = http_get_text(u) - except ALL_API_ERRORS: - _doi_cache.put("doi_from_html", _u_str, {"doi": ""}, ttl_days=60) - continue - d = idu.find_doi_in_html(html) - _doi_cache.put("doi_from_html", _u_str, {"doi": d or ""}, ttl_days=60) - if d: - logger.debug( - f"DOI_FROM_HTML | url={_u_str} | doi_found={d}", - category=LogCategory.AUDIT, - ) - doi_candidates.append(d) - break - - doi_candidates = [d for d in {idu.normalize_doi(d) for d in doi_candidates if d} if d] - # Feed Phase 3 DOIs into the candidate set for deterministic dedup - all_candidate_dois.update(doi_candidates) - # Published DOIs first, preprint/data DOIs last - doi_candidates.sort(key=lambda d: 1 if idu.is_secondary_doi(d) else 0) - published_first = bool(doi_candidates and not idu.is_secondary_doi(doi_candidates[0])) - logger.debug( - f"DOI_CANDIDATES_RANKED | count={len(doi_candidates)} " - f"| order=[{', '.join(doi_candidates)}] | published_first={published_first}", - category=LogCategory.AUDIT, - ) - - if doi_candidates: - logger.info( - f"Found {len(doi_candidates)} DOI candidate(s): {', '.join(doi_candidates)}", - category=LogCategory.SEARCH, - source=LogSource.DOI, - ) - doi_matched = False - - # Try each DOI candidate until we find one that validates - for doi_idx, doi_candidate in enumerate(doi_candidates, 1): - logger.info( - f"Validating DOI candidate: {doi_candidate}", - category=LogCategory.SEARCH, - source=LogSource.DOI, - ) - # When a DOI was inferred from an enricher's arXiv eprint, - # temporarily inject it into the baseline so DOI_EXACT match - # fires in validation (the eprint already confirmed identity; - # the CSL title may differ from the preprint title). - _bl_doi_before = bf.get("doi") - _doi_norm = idu.normalize_doi(doi_candidate) - _is_eprint_doi = _doi_norm and any( - idu.normalize_doi(f"10.48550/arxiv.{idu.extract_arxiv_eprint(ed) or ''}") == _doi_norm - for _, ed in enr_list - if idu.extract_arxiv_eprint(ed) - ) - if _is_eprint_doi and not _bl_doi_before: - bf["doi"] = doi_candidate - candidate_matched = process_validated_doi(doi_candidate, baseline_entry, result_id, enr_list, flags) - # Restore baseline DOI to avoid polluting later logic - if _is_eprint_doi and not _bl_doi_before: - bf.pop("doi", None) - logger.debug( - f"DOI_VALIDATE_ATTEMPT | #{doi_idx} | doi={doi_candidate} | result={candidate_matched}", - category=LogCategory.AUDIT, - ) - - if candidate_matched: - doi_matched = True - break # Stop after first successful validation - else: - logger.info("Trying next DOI candidate...", category=LogCategory.SEARCH, source=LogSource.DOI) - - # If none of the DOI candidates validated, warn the user - if not doi_matched: - logger.warn( - f"None of {len(doi_candidates)} DOI candidate(s) validated against baseline", - category=LogCategory.SKIP, - source=LogSource.DOI, - ) - else: - logger.info("No DOI discovered; skipped", category=LogCategory.SKIP, source=LogSource.DOI) - except ALL_API_ERRORS as e: - logger.warn(f"DOI negotiation error: {e}", category=LogCategory.ERROR, source=LogSource.DOI) - else: - logger.info( - "DOI already validated early; skipping late DOI negotiation", - category=LogCategory.SKIP, - source=LogSource.DOI, - ) - - # ===== PHASE 4: Merge & Save ===== - logger.info("▶ Phase 4: Merge & Save", category=LogCategory.ARTICLE) - enr_source_names = [name for name, _ in enr_list] - logger.debug( - f"PHASE4_START | enricher_count={len(enr_list)} | sources=[{', '.join(enr_source_names)}]", - category=LogCategory.AUDIT, - ) - - logger.info("Applying trust policy and merging enrichments", category=LogCategory.SAVE, source=LogSource.SYSTEM) - try: - merged = mu.merge_with_policy(baseline_entry, enr_list) - merged_fields = merged.get("fields") or {} - - # Phase-4 post-merge canonicalization: entry-type reclassification and - # text/venue normalization, single-sourced in src/canonicalize.py. - # POST_MERGE is the terminal stage; absence rules (article/inproceedings - # missing venue, preprint-DOI downgrade) fire here after enrichment. - canonicalize(merged, stage=CanonicalStage.POST_MERGE) - - # Annotate bare stubs: no enrichers, no DOI, no venue - is_bare_stub = ( - not enr_list - and not (merged_fields.get("doi") or "").strip() - and not (merged_fields.get("journal") or "").strip() - and not (merged_fields.get("booktitle") or "").strip() - ) - if is_bare_stub: - # Tier 2: populate fields directly from SerpAPI publication string - pub_string = art.get("publication") or "" - parsed_pub = parse_publication_string(pub_string) - tier2_applied = False - - if parsed_pub and parsed_pub.confidence >= PUB_PARSE_TIER2_MIN_CONFIDENCE: - if parsed_pub.venue_type == "journal": - merged_fields["journal"] = parsed_pub.venue_name - if parsed_pub.volume: - merged_fields["volume"] = parsed_pub.volume - if parsed_pub.issue: - merged_fields["number"] = parsed_pub.issue - if parsed_pub.pages: - merged_fields["pages"] = parsed_pub.pages - merged["type"] = "article" - merged_fields["note"] = "Venue from SerpAPI publication string (unverified)" - tier2_applied = True - logger.info( - f"TIER2 | journal={parsed_pub.venue_name} | vol={parsed_pub.volume} | pages={parsed_pub.pages}", - category=LogCategory.AUDIT, - ) - elif parsed_pub.venue_type == "conference": - merged_fields["booktitle"] = parsed_pub.venue_name - if parsed_pub.pages: - merged_fields["pages"] = parsed_pub.pages - merged["type"] = "inproceedings" - merged_fields["note"] = "Venue from SerpAPI publication string (unverified)" - tier2_applied = True - logger.info( - f"TIER2 | booktitle={parsed_pub.venue_name} | pages={parsed_pub.pages}", - category=LogCategory.AUDIT, - ) - - if parsed_pub and not tier2_applied: - if parsed_pub.venue_type == "patent": - merged_fields["note"] = f"US Patent {parsed_pub.patent_number}" - tier2_applied = True - logger.info( - f"TIER2 | patent={parsed_pub.patent_number}", - category=LogCategory.AUDIT, - ) - elif parsed_pub.venue_type == "preprint": - merged_fields["howpublished"] = parsed_pub.venue_name - if parsed_pub.arxiv_id: - merged_fields["eprint"] = parsed_pub.arxiv_id - merged_fields["archiveprefix"] = "arXiv" - tier2_applied = True - logger.info( - f"TIER2 | preprint={parsed_pub.venue_name}", - category=LogCategory.AUDIT, - ) - - if not tier2_applied: - merged_fields["note"] = "Unenriched: no enrichment sources matched" - logger.warn( - "Bare stub: no venue, no DOI, no enrichment; annotated with note", - category=LogCategory.AUDIT, - ) - - # Delete entries where title equals journal or booktitle (corrupted Scholar data). - # Placed after Tier 2 filling so it catches entries populated from SerpAPI pub strings. - _p4_title_lower = (merged_fields.get("title") or "").strip().lower() - if _p4_title_lower: - _p4_journal_lower = (merged_fields.get("journal") or "").strip().lower() - _p4_booktitle_lower = (merged_fields.get("booktitle") or "").strip().lower() - if (_p4_journal_lower and _p4_title_lower == _p4_journal_lower) or ( - _p4_booktitle_lower and _p4_title_lower == _p4_booktitle_lower - ): - logger.debug( - f"TITLE_IS_VENUE | title={_p4_title_lower[:60]} | skipping entry", - category=LogCategory.AUDIT, - ) - if path and os.path.isfile(path): - os.remove(path) - return 0 - - # Skip entries with type "book" (proceedings volumes, edited books — not individual papers) - if merged.get("type") == "book": - has_file = bool(path and os.path.isfile(path)) - logger.debug( - f"BOOK_SKIP | type=book | file_deleted={has_file}", - category=LogCategory.AUDIT, - ) - logger.warn( - "Entry is a book/proceedings volume, not an individual paper; skipping", - category=LogCategory.SKIP, - source=LogSource.SYSTEM, - ) - if has_file and path: - os.remove(path) - return 0 - - # Verify target author appears in the paper's author list to catch - # Scholar profile contamination (e.g., different person with same surname) - merged_authors = merged_fields.get("author", "") - author_found = not merged_authors or author_name_matches(rec.name, merged_authors) - logger.debug( - f"AUTHOR_FILTER | target={rec.name} | paper_authors={str(merged_authors)[:80]} | found={author_found}", - category=LogCategory.AUDIT, - ) - if merged_authors and not author_found: - # Check if enrichment corrupted the author field (misattributed DOI). - # If the ORIGINAL file had the correct author, keep it — don't delete. - if path and os.path.isfile(path) and baseline_entry: - baseline_authors = bf.get("author", "") - if baseline_authors and author_name_matches(rec.name, baseline_authors): - logger.warn( - f"Enrichment corrupted author field ('{str(merged_authors)[:60]}'); " - f"keeping original file: {os.path.basename(path)}", - category=LogCategory.SKIP, - source=LogSource.SYSTEM, - ) - return 0 - logger.warn( - f"Target author '{rec.name}' not found in paper authors; skipping", - category=LogCategory.SKIP, - source=LogSource.SYSTEM, - ) - if path and os.path.isfile(path): - os.remove(path) - return 0 - - # Deterministic dedup: check if any DOI (from Phase 2 candidates, Phase 3 - # discovery, or the merged entry itself) already exists in a DIFFERENT file - # on disk. This prevents oscillation where a preprint/published pair creates - # a file under the preprint title that gets enriched and renamed every run. - merged_doi = idu.normalize_doi(merged_fields.get("doi", "")) - _merged_eprint = idu.extract_arxiv_eprint(merged) - if _merged_eprint: - all_candidate_dois.add(idu.normalize_doi(f"10.48550/arxiv.{_merged_eprint}") or "") - if merged_doi: - all_candidate_dois.add(merged_doi) - # Exclude the DOI of the prefer_path file itself to avoid self-matching - prefer_doi = _read_doi_from_file(path) if path and os.path.isfile(path) else "" - check_dois = all_candidate_dois - {prefer_doi} if prefer_doi else all_candidate_dois - if check_dois: - for existing_bib in iter_author_bibs(author_dir): - epath = os.path.join(author_dir, existing_bib) - if path and os.path.abspath(epath) == os.path.abspath(path): - continue # skip self - try: - with open(epath, encoding="utf-8") as ef: - edict = bt.parse_bibtex_to_dict(ef.read()) - if not edict: - continue - edoi = idu.normalize_doi((edict.get("fields") or {}).get("doi", "")) - if not edoi or edoi not in check_dois: - continue - # Guard: verify the DOI match is genuine by comparing titles. - # Phase-2 candidate DOIs can be false matches (API returned - # the wrong DOI for the query title). - e_title = (edict.get("fields") or {}).get("title", "") - m_title = merged_fields.get("title", "") - if e_title and m_title: - doi_sim = title_similarity(e_title, m_title) - if doi_sim < SIM_PREPRINT_TITLE_THRESHOLD: - logger.debug( - f"CANDIDATE_DOI_DEDUP_REJECTED | doi={edoi}" - f" | existing={existing_bib}" - f" | sim={doi_sim:.3f} | titles_differ", - category=LogCategory.DEDUP, - ) - _revert_misattributed_doi(merged_fields, edoi, doi_validated, doi_early) - continue - logger.debug( - f"CANDIDATE_DOI_DEDUP | doi={edoi} | existing={existing_bib} | skipping_write=True", - category=LogCategory.DEDUP, - ) - if path and os.path.isfile(path): - os.remove(path) - logger.debug( - f"FILE_CLEANUP | removed={path} | reason=candidate_doi_on_disk", - category=LogCategory.DEDUP, - ) - return 0 - except (OSError, UnicodeDecodeError): - continue - - merged["key"] = bt.build_standard_citekey(merged, gemini_api_key=gemini_api_key) or merged.get("key") or "Entry" - - # Year-window guard: reject files whose enriched year falls outside the window - if min_year > 0: - final_year = extract_year_from_any(merged.get("fields", {}).get("year"), fallback=0) or 0 - if 0 < final_year < min_year: - logger.info( - f"Skipping out-of-window entry (year={final_year} < {min_year}): {title[:60]}", - category=LogCategory.SKIP, - ) - # Clean up baseline file if we created one - if path and os.path.isfile(path): - os.remove(path) - return 0 - - path2, was_written = mu.save_entry_to_file( - out_dir, effective_id, merged, prefer_path=path, gemini_api_key=gemini_api_key, author_name=rec.name - ) - if path2 != path: - logger.success(f"Enriched and renamed: {path2}", category=LogCategory.SAVE, source=LogSource.SYSTEM) - else: - logger.success(f"Enriched: {path2}", category=LogCategory.SAVE, source=LogSource.SYSTEM) - # Summary log: relative path and success flags - try: - rel = os.path.relpath(path2) - except (OSError, ValueError): - rel = path2 - total_true = sum(1 for v in flags.values() if v) - - # ===== Enrichment Summary ===== - logger.info("▶ Enrichment Summary", category=LogCategory.ARTICLE) - - # Count total enrichment sources (excluding doi_csl and doi_bibtex as they're part of doi_validated) - enrichment_sources = { - "scholar_page": "Scholar Citation", - "s2": "Semantic Scholar", - "crossref": "Crossref", - "openreview": "OpenReview", - "arxiv": "arXiv", - "openalex": "OpenAlex", - "pubmed": "PubMed", - "europepmc": "Europe PMC", - } - - # Log DOI status separately - doi_methods = [m for m, k in [("CSL", "doi_csl"), ("BibTeX", "doi_bibtex")] if flags.get(k)] - if doi_methods: - logger.success( - f"DOI: {' + '.join(doi_methods)}", - category=LogCategory.SAVE, - source=LogSource.DOI, - ) - - # Count and log enrichment sources - enriched_count = sum(1 for k in enrichment_sources if flags.get(k)) - total_sources = len(enrichment_sources) - - # Group matched and unmatched sources - matched_sources = [label for key, label in enrichment_sources.items() if flags.get(key)] - unmatched = [label for key, label in enrichment_sources.items() if not flags.get(key)] - - if flags.get("doi_csl"): - doi_status = "csl" - elif flags.get("doi_bibtex"): - doi_status = "bibtex" - else: - doi_status = "none" - logger.debug( - f"ENRICHMENT_SUMMARY | doi_status={doi_status} | enriched={enriched_count}/{total_sources} " - f"| matched=[{', '.join(matched_sources)}] | unmatched=[{', '.join(unmatched)}]", - category=LogCategory.AUDIT, - ) - - logger.info( - f"Coverage: {enriched_count}/{total_sources} sources", - category=LogCategory.SAVE, - source=LogSource.SYSTEM, - ) - - if matched_sources: - logger.success(f"Matched: {', '.join(matched_sources)}", category=LogCategory.SAVE, source=LogSource.SYSTEM) - if unmatched: - logger.info(f"Not matched: {', '.join(unmatched)}", category=LogCategory.SKIP, source=LogSource.SYSTEM) - - if summary_csv_path and was_written: - append_summary_to_csv(summary_csv_path, rel, total_true, flags) - except (*PARSE_ERRORS, OSError, RuntimeError) as e: - logger.error(f"Merge error: {e}", category=LogCategory.ERROR, source=LogSource.SYSTEM) - return 0 - - return 1 +from src.textnorm import _is_corrupted_title, _is_garbage_title # noqa: F401 # re-exported for test imports def process_record( diff --git a/src/pipeline/article.py b/src/pipeline/article.py new file mode 100644 index 00000000..e80655dc --- /dev/null +++ b/src/pipeline/article.py @@ -0,0 +1,1390 @@ +from __future__ import annotations + +import os +import re +from collections.abc import Callable +from typing import Any + +from src import bibtex_utils as bt +from src import id_utils as idu +from src import merge_utils as mu +from src.canonicalize import ( + CanonicalStage, + _fixup_bib_entry, # noqa: F401 # re-exported for test imports + canonicalize, +) +from src.clients.helpers import extract_authors_from_article, get_article_year, strip_html_tags +from src.clients.scholar import ( + build_bibtex_from_scholar_fields, + fetch_scholar_citation, +) +from src.clients.search_apis import ( + arxiv_search, + build_bibtex_from_arxiv, + build_bibtex_from_crossref, + build_bibtex_from_europepmc, + build_bibtex_from_openalex, + build_bibtex_from_openreview, + build_bibtex_from_pubmed, + build_bibtex_from_s2, + crossref_search_by_venue, + crossref_search_multiple, + europepmc_search_papers_multiple, + openalex_search_by_venue, + openalex_search_multiple, + openreview_search_papers_multiple, + pubmed_search_papers_multiple, + s2_search_papers_multiple, +) +from src.config import ( + GENERIC_SERIES_NAMES, + MIN_TITLE_WORDS, + PREPRINT_SERVERS, + PUB_PARSE_TIER1_MIN_CONFIDENCE, + PUB_PARSE_TIER2_MIN_CONFIDENCE, + SIM_MERGE_DUPLICATE_THRESHOLD, + SIM_PREPRINT_TITLE_THRESHOLD, + SKIP_SCHOLAR_FOR_EXISTING_FILES, +) +from src.doi_utils import process_validated_doi +from src.exceptions import ( + ALL_API_ERRORS, + PARSE_ERRORS, +) +from src.fsscan import iter_author_bibs +from src.http_utils import http_get_text +from src.io_utils import ( + append_summary_to_csv, + is_known_summary_path, + safe_write_file, +) +from src.log_utils import LogCategory, LogSource, logger +from src.models import Record +from src.publication_parser import parse_publication_string +from src.text_utils import ( + author_name_matches, + extract_year_from_any, + format_author_dirname, + has_placeholder, + title_similarity, + trim_title_default, +) +from src.textnorm import _is_corrupted_title, _is_garbage_title + +_ARXIV_ABS_RE = re.compile(r"arxiv\.org/abs/(\d{4}\.\d{4,5})", re.IGNORECASE) + + +def _entry_is_complete(entry: dict[str, Any]) -> bool: + """Check if a BibTeX entry has all essential fields filled with non-placeholder values. + + Returns False for preprint entries (DOI from arXiv/Research Square or journal + in PREPRINT_SERVERS) so they are re-enriched and potentially upgraded to the + published version. + """ + fields = entry.get("fields") or {} + title = fields.get("title") or "" + author = fields.get("author") or "" + year = fields.get("year") or "" + doi = fields.get("doi") + has_venue = any(fields.get(v) and not has_placeholder(str(fields.get(v))) for v in ("journal", "booktitle")) + + # Determine completeness: check essential fields, venue, DOI, and preprint status + doi_is_preprint = False + journal_is_preprint = False + + has_essentials = all(fields.get(k) and not has_placeholder(str(fields.get(k))) for k in ("title", "author", "year")) + has_doi = bool(doi) and not has_placeholder(str(doi)) + + if has_essentials and has_venue and has_doi: + doi_is_preprint = idu.is_secondary_doi(str(doi)) + if not doi_is_preprint: + journal = str(fields.get("journal") or "").lower() + journal_is_preprint = any(ps in journal for ps in PREPRINT_SERVERS) + + # Treat generic series booktitles as incomplete so they get re-enriched + venue_is_generic = False + if has_venue: + bt_val = (fields.get("booktitle") or "").lower().strip() + venue_is_generic = bt_val in GENERIC_SERIES_NAMES and not fields.get("journal") + + result = ( + has_essentials + and has_venue + and has_doi + and not doi_is_preprint + and not journal_is_preprint + and not venue_is_generic + ) + + logger.debug( + f"COMPLETE_CHECK | title={title[:50]} | has_title={bool(title)} " + f"| has_author={bool(author)} | has_year={bool(year)} " + f"| has_venue={has_venue} | has_doi={has_doi} " + f"| doi_is_preprint={doi_is_preprint} | journal_is_preprint={journal_is_preprint} " + f"| result={result}", + category=LogCategory.AUDIT, + ) + return result + + +def _read_doi_from_file(filepath: str) -> str: + """Read and normalize the DOI from a .bib file on disk, returning '' on failure.""" + try: + with open(filepath, encoding="utf-8") as f: + parsed = bt.parse_bibtex_to_dict(f.read()) + return idu.normalize_doi((parsed or {}).get("fields", {}).get("doi", "")) or "" + except (OSError, UnicodeDecodeError): + return "" + + +def _revert_misattributed_doi( + merged_fields: dict[str, Any], + bad_doi: str, + doi_validated: bool, + doi_early: str | None, +) -> None: + """Replace a mis-attributed DOI with the Phase-1-validated DOI (if any), or remove it.""" + if merged_fields.get("doi") != bad_doi: + return + fallback = idu.normalize_doi(doi_early) if doi_validated and doi_early else None + if fallback and fallback != bad_doi: + merged_fields["doi"] = fallback + else: + merged_fields.pop("doi", None) + merged_fields.pop("url", None) + logger.debug( + f"DOI_REVERT | removed={bad_doi} | restored={fallback or 'none'} | reason=misattributed_candidate", + category=LogCategory.DEDUP, + ) + + +def _try_multiple_candidates( + source_name: str, + candidates: list[Any], + build_func: Callable[..., str | None], + baseline_entry: dict[str, Any], + result_id: str, + enr_list: list[tuple[str, dict[str, Any]]], + flags: dict[str, bool], + flag_key: str, + max_candidates: int = 5, + seen_dois: set[str] | None = None, +) -> tuple[bool, Any | None]: + """Try candidates from an API source in relevance order until one matches the baseline. + + When *seen_dois* is provided, every DOI encountered across all candidates + (matched or not) is collected. This enables downstream duplicate detection + against files already on disk even when the candidate was rejected by the + matching gate. + + Returns (matched, matched_candidate) tuple. + """ + if not candidates: + return False, None + + candidates_to_try = candidates[:max_candidates] + + for idx, candidate in enumerate(candidates_to_try, 1): + try: + candidate_bib = build_func(candidate, keyhint=result_id) + if not candidate_bib: + continue + + candidate_dict = bt.parse_bibtex_to_dict(candidate_bib) + if not candidate_dict: + continue + + # Collect DOI from every parsed candidate for dedup + if seen_dois is not None: + cand_doi = idu.normalize_doi((candidate_dict.get("fields") or {}).get("doi", "")) + if cand_doi: + seen_dois.add(cand_doi) + + match = bt.bibtex_entries_match_strict(baseline_entry, candidate_dict) + if match: + enr_list.append((flag_key, candidate_dict)) + flags[flag_key] = True + logger.success( + "Match validated and added to enrichment", + category=LogCategory.MATCH, + source=source_name, + ) + return True, candidate + + except Exception as e: + logger.debug( + f"CANDIDATE_ERROR | source={source_name} #{idx} | error={type(e).__name__}: {e}", + category=LogCategory.AUDIT, + ) + logger.info(f"Candidate {idx}: error - {e}", category=LogCategory.DEBUG, source=source_name) + + return False, None + + +def process_article( + rec: Record, + art: dict[str, Any], + serply_key: str | None, + out_dir: str, + s2_api_key: str | None, + or_creds: tuple[str, str] | None, + idx: int | None = None, + total: int | None = None, + gemini_api_key: str | None = None, + summary_csv_path: str | None = None, + min_year: int = 0, + force_enrich: bool = False, +) -> int: + """Enrich a single publication from baseline through 4-phase pipeline and save to disk. + + Returns 1 when a file was written, or 0 when the article was skipped or failed. + """ + title = trim_title_default(strip_html_tags(art.get("title") or "")) + authors_list = extract_authors_from_article(art) or [] + year_hint = get_article_year(art) or None + # Determine IDs; Scholar may provide multiple identifiers + citation_id = art.get("citation_id") or art.get("result_id") + cluster_id = art.get("cluster_id") or ( + art.get("result_id") if citation_id and art.get("result_id") != citation_id else None + ) + result_id = citation_id or re.sub(r"\W+", "_", title or "untitled") + flags = { + "scholar_bib": False, + "scholar_page": False, + "s2": False, + "crossref": False, + "openreview": False, + "arxiv": False, + "openalex": False, + "pubmed": False, + "europepmc": False, + "doi_csl": False, + "doi_bibtex": False, + } + + if not title: + logger.error("Missing required field: title; skipping article", category=LogCategory.SKIP) + return 0 + + word_count = len(title.split()) + corrupted = _is_corrupted_title(title) + garbage = _is_garbage_title(title) + logger.debug( + f"TITLE_VALIDATE | raw={title[:60]} | words={word_count} | corrupted={corrupted} " + f"| garbage={garbage} | valid={word_count >= MIN_TITLE_WORDS and not corrupted and not garbage}", + category=LogCategory.AUDIT, + ) + + if word_count < MIN_TITLE_WORDS: + logger.warn( + f"Title too short (probable artifact): '{title}'; skipping", + category=LogCategory.SKIP, + ) + return 0 + if corrupted: + logger.warn( + f"Corrupted title (probable DBLP artifact): '{title}'; skipping", + category=LogCategory.SKIP, + ) + return 0 + if garbage: + logger.warn( + f"Garbage title (non-bibliographic content): '{title}'; skipping", + category=LogCategory.SKIP, + ) + return 0 + if not authors_list or not year_hint: + logger.warn( + "Article missing authors and/or year; continuing with best-effort enrichment", + category=LogCategory.ARTICLE, + ) + + idx_prefix = f"[{idx}/{total}] " if idx is not None and total is not None else "" + art_source = (art.get("source") or "scholar").strip() + + logger.step(f"{idx_prefix}Processing Article", category=LogCategory.ARTICLE) + logger.info(f"Title: {title}", category=LogCategory.ARTICLE) + if year_hint: + logger.info(f"Year: {year_hint}", category=LogCategory.ARTICLE) + logger.info(f"Source: {art_source}", category=LogCategory.ARTICLE) + + effective_id = rec.scholar_id or rec.dblp or "" + author_dirname = format_author_dirname(rec.name, effective_id) + author_dir = os.path.join(out_dir, author_dirname) + existing_file_loaded = False + baseline_entry = None + existing_file_path = None + + # Try to find existing BibTeX file to use as enrichment seed + # If found, load it and use as baseline - enrichment process will update/fix fields + if SKIP_SCHOLAR_FOR_EXISTING_FILES and os.path.exists(author_dir): + # Sort filenames for deterministic iteration order + bib_files = iter_author_bibs(author_dir) + logger.debug( + f"EXISTING_FILE_SCAN | dir={author_dir} | files_checked={len(bib_files)}", + category=LogCategory.AUDIT, + ) + for filename in bib_files: + file_path = os.path.join(author_dir, filename) + try: + with open(file_path, encoding="utf-8") as f: + existing_bib = f.read() + existing_entry = bt.parse_bibtex_to_dict(existing_bib) + + # Check if this file matches our article by comparing title + if existing_entry: + existing_title = existing_entry.get("fields", {}).get("title", "") + if isinstance(existing_title, list): + existing_title = existing_title[0] if existing_title else "" + + # Purge stale files whose titles now fail validation + if _is_garbage_title(existing_title) or _is_corrupted_title(existing_title): + logger.warn( + f"STALE_FILE_REMOVED | file={filename} | reason=title_now_invalid", + category=LogCategory.CLEANUP, + ) + os.remove(file_path) + continue + + sim = title_similarity(title, existing_title) + if sim >= SIM_MERGE_DUPLICATE_THRESHOLD: + baseline_entry = existing_entry + existing_file_path = file_path + existing_file_loaded = True + logger.info( + f"Using existing BibTeX as baseline: {filename}", + category=LogCategory.ARTICLE, + source=LogSource.SYSTEM, + ) + is_complete = _entry_is_complete(existing_entry) + logger.debug( + f"EXISTING_FILE_LOADED | file={filename} | complete={is_complete}", + category=LogCategory.AUDIT, + ) + break + except (OSError, ValueError, TypeError): + continue + + # Fixup stale entries loaded from disk before enrichment: the pure entry + # field/type rewrites are single-sourced in src/canonicalize.py at the + # LOAD_REPAIR stage. The destructive title==venue delete (N22) and the + # bare-& rewrite trigger stay here in the pipeline. + if existing_file_loaded and baseline_entry is not None: + _fixup_written = canonicalize(baseline_entry, stage=CanonicalStage.LOAD_REPAIR) + _bl_fields = baseline_entry.get("fields") or {} + + # Delete entries where title equals journal or booktitle (corrupted Scholar data) + _bl_title_venue = (_bl_fields.get("title") or "").strip().lower() + if _bl_title_venue: + _bl_journal_venue = (_bl_fields.get("journal") or "").strip().lower() + _bl_booktitle_venue = (_bl_fields.get("booktitle") or "").strip().lower() + if (_bl_journal_venue and _bl_title_venue == _bl_journal_venue) or ( + _bl_booktitle_venue and _bl_title_venue == _bl_booktitle_venue + ): + logger.debug( + f"EXISTING_FIXUP | title_is_venue | title={_bl_title_venue[:60]} | deleting", + category=LogCategory.CLEANUP, + ) + if existing_file_path and os.path.exists(existing_file_path): + os.remove(existing_file_path) + return 0 + + # Escape bare & in field values (bibtex_from_dict handles this on write, + # but we need to trigger a rewrite for files that were never re-serialized) + for _fk, _fv in _bl_fields.items(): + if _fk not in ("url", "doi") and isinstance(_fv, str) and "&" in _fv and r"\&" not in _fv: + _fixup_written = True + break + + if _fixup_written and existing_file_path: + bib_str = bt.bibtex_from_dict(baseline_entry) + safe_write_file(existing_file_path, bib_str) + + # Skip enrichment entirely if entry is already complete (unless --force) + if not force_enrich and existing_file_loaded and baseline_entry is not None and _entry_is_complete(baseline_entry): + # Quick fixup: strip preprint-only publishers from complete entries. + # Single-sourced in canonicalize() at the COMPLETE_SKIP_FINALIZE stage; the + # debug log and write-gating stay here so the skip-path I/O is unchanged. + bl_fields = baseline_entry.get("fields") or {} + _pub_before = bl_fields.get("publisher") + if canonicalize(baseline_entry, stage=CanonicalStage.COMPLETE_SKIP_FINALIZE): + logger.debug( + f"EXISTING_FIXUP | publisher_stripped={_pub_before} | journal={bl_fields.get('journal')}", + category=LogCategory.CLEANUP, + ) + if existing_file_path: + bib_str = bt.bibtex_from_dict(baseline_entry) + safe_write_file(existing_file_path, bib_str) + + # NOTE: the former "@article with a preprint DOI -> @misc" quick-fixup was + # removed here as unreachable dead code: _entry_is_complete() (the guard + # above) only returns True for a NON-preprint DOI, so is_secondary_doi() on + # the same field can never be True on this skip-enrichment path. + + logger.info("Entry already complete; skipping enrichment", category=LogCategory.SKIP, source=LogSource.SYSTEM) + if summary_csv_path and existing_file_path: + try: + rel = os.path.relpath(existing_file_path) + except (OSError, ValueError): + rel = existing_file_path + # Only write a new CSV row if this file has no entry from a previous run + if not is_known_summary_path(rel): + append_summary_to_csv(summary_csv_path, rel, 0, flags) + return 1 + + # If no existing file found, build minimal BibTeX baseline + if not existing_file_loaded: + logger.info("Creating baseline BibTeX entry", category=LogCategory.ARTICLE, source=LogSource.SYSTEM) + scholar_bib = bt.build_minimal_bibtex(title, authors_list, year_hint or 0, keyhint=result_id) + + baseline_entry = bt.parse_bibtex_to_dict(scholar_bib) + if baseline_entry is None: + # Parse failed - should be rare since we generated the BibTeX + logger.error("Failed to parse Scholar BibTeX; using minimal fallback structure", category=LogCategory.ERROR) + baseline_entry = {"type": "misc", "key": result_id or "entry", "fields": {"title": title} if title else {}} + _bl_source = "scholar_minimal" + else: + _bl_source = "existing_file" + _bl_field_names = sorted((baseline_entry.get("fields") or {}).keys()) if baseline_entry else [] + logger.debug( + f"BASELINE_CREATE | source={_bl_source} | fields=[{', '.join(_bl_field_names)}]", + category=LogCategory.AUDIT, + ) + if baseline_entry is None: # Safety net (should not happen) + logger.error("Failed to create baseline entry; skipping article", category=LogCategory.ERROR) + return 0 + bf = baseline_entry.get("fields") or {} + if cluster_id: + bf["x_scholar_cluster_id"] = cluster_id + # Attempt to locate arXiv ID or DOI in article snippet or links + try: + snippet = art.get("snippet") or art.get("publication_info") or "" + ax_from_snip = idu.find_arxiv_in_text(snippet) + + # Collect all link URLs from the article metadata + link_texts: list[str] = [str(art[k]) for k in ("link", "link_to_pdf") if art.get(k)] + for r in art.get("resources") or []: + if isinstance(r, dict): + for lk in ("link", "file_link", "url"): + if r.get(lk): + link_texts.append(str(r[lk])) + for fld in ("versions", "resources", "websites"): + for it in (art.get("inline_links") or {}).get(fld) or []: + if isinstance(it, dict) and it.get("link"): + link_texts.append(str(it["link"])) + + # Extract arXiv ID and DOI from collected links + ax_from_links = None + doi_from_links = None + for u in link_texts: + if not ax_from_links: + ax_from_links = idu.find_arxiv_in_text(u) + if not doi_from_links: + doi_from_links = idu.find_doi_in_text(u) + ax_pick = ax_from_snip or ax_from_links + if ax_pick: + bf["eprint"] = ax_pick + bf["archiveprefix"] = "arXiv" + # Store DOI from DBLP/Scholar links if baseline has none + if doi_from_links and not bf.get("doi"): + bf["doi"] = doi_from_links + logger.debug( + f"SNIPPET_EXTRACT | arxiv_from_snippet={ax_from_snip} " + f"| arxiv_from_links={ax_from_links} | doi_from_links={doi_from_links}", + category=LogCategory.AUDIT, + ) + except PARSE_ERRORS: + pass + baseline_entry["fields"] = bf + ck = ( + bt.build_standard_citekey(baseline_entry, gemini_api_key=gemini_api_key) or baseline_entry.get("key") or "Entry" + ) + baseline_entry["key"] = ck + + # Save baseline only if we didn't load from existing file + if existing_file_loaded: + # Remove existing files outside the contribution window + if min_year > 0 and existing_file_path: + ex_year = extract_year_from_any((baseline_entry or {}).get("fields", {}).get("year"), fallback=0) or 0 + if 0 < ex_year < min_year: + logger.info( + f"Removing out-of-window existing file (year={ex_year} < {min_year}): " + f"{os.path.basename(existing_file_path)}", + category=LogCategory.CLEANUP, + ) + os.remove(existing_file_path) + return 0 + path = existing_file_path + logger.info(f"Using existing file: {path}", category=LogCategory.SKIP) + else: + # Defer disk write for bare baselines (no DOI) to avoid creating + # transient files that get renamed/cleaned during enrichment. + # The final entry will be written after Phase 4 by save_entry_to_file. + if not bf.get("doi", "").strip(): + path = None + logger.info( + "Baseline deferred (no DOI; will write after enrichment)", + category=LogCategory.SKIP, + source=LogSource.SYSTEM, + ) + else: + path, was_written = mu.save_entry_to_file( + out_dir, + effective_id, + baseline_entry, + gemini_api_key=gemini_api_key, + author_name=rec.name, + ) + if was_written: + logger.success(f"Saved baseline: {path}", category=LogCategory.SAVE, source=LogSource.SYSTEM) + else: + # save_entry_to_file found a duplicate and skipped writing — + # the article is already on disk under a different name. + # Skip enrichment entirely to avoid churn. + logger.info( + f"Baseline duplicate detected; skipping enrichment: {path}", + category=LogCategory.SKIP, + source=LogSource.SYSTEM, + ) + if summary_csv_path and path: + try: + rel = os.path.relpath(path) + except (OSError, ValueError): + rel = path + if not is_known_summary_path(rel): + append_summary_to_csv(summary_csv_path, rel, 0, flags) + return 1 + + enr_list: list[tuple[str, dict[str, Any]]] = [] + # Collect DOIs from ALL Phase 2 candidates (matched or not) for + # deterministic dedup: if a candidate's DOI already exists on disk, + # we skip writing even when the candidate was rejected by the match gate. + all_candidate_dois: set[str] = set() + + # ===== PHASE 1: Early DOI Validation ===== + logger.info("▶ Phase 1: Early DOI Validation", category=LogCategory.ARTICLE) + + # if the baseline already has a DOI, use it to get better metadata early on + doi_validated = False # Track if we successfully validated the DOI + unvalidated_doi: str | None = None # Stash failed DOI for Phase 3 retry + p1_doi = bf.get("doi") + logger.debug( + f"PHASE1_START | doi={p1_doi} | has_doi={bool(p1_doi)}", + category=LogCategory.AUDIT, + ) + try: + doi_early = idu.normalize_doi(bf.get("doi")) + if doi_early: + logger.info(f"Validating DOI: {doi_early}", category=LogCategory.SEARCH, source=LogSource.DOI) + doi_matched = process_validated_doi(doi_early, baseline_entry, result_id, enr_list, flags) + + # If DOI failed validation, stash it for Phase 3 and remove from baseline + if not doi_matched: + unvalidated_doi = doi_early + bf.pop("doi", None) + logger.warn( + "DOI validation failed, removed from baseline (will retry in Phase 3)", + category=LogCategory.ARTICLE, + source=LogSource.DOI, + ) + else: + doi_validated = True + logger.success("DOI validated successfully", category=LogCategory.MATCH, source=LogSource.DOI) + logger.debug( + f"PHASE1_RESULT | doi={doi_early} | validated={doi_validated} | stashed={unvalidated_doi is not None}", + category=LogCategory.AUDIT, + ) + except PARSE_ERRORS: + pass + + # ===== PHASE 2: API Enrichment ===== + logger.info("▶ Phase 2: API Enrichment", category=LogCategory.ARTICLE) + logger.debug( + f"PHASE2_START | title={title[:60]} | doi_validated={doi_validated}", + category=LogCategory.AUDIT, + ) + + # Skip Scholar citation fetch if we loaded an existing file (optimization to reduce API usage) + if existing_file_loaded: + logger.info("Skipped (using existing file as baseline)", category=LogCategory.SKIP, source=LogSource.SCHOLAR) + elif not serply_key: + logger.info("Skipped (no Serply key)", category=LogCategory.SKIP, source=LogSource.SCHOLAR) + else: + logger.info("Fetching citation metadata", category=LogCategory.FETCH, source=LogSource.SCHOLAR) + if title: + try: + fields = fetch_scholar_citation(serply_key, title, rec.name) + if fields: + sch_page_bib = build_bibtex_from_scholar_fields(fields, keyhint=result_id) + if sch_page_bib: + sch_page_dict = bt.parse_bibtex_to_dict(sch_page_bib) + if sch_page_dict and bt.bibtex_entries_match_strict(baseline_entry, sch_page_dict): + enr_list.append(("scholar_page", sch_page_dict)) + flags["scholar_page"] = True + logger.success( + "Match validated and added to enrichment", + category=LogCategory.MATCH, + source=LogSource.SCHOLAR, + ) + else: + logger.info( + "Citation did not match baseline", + category=LogCategory.SKIP, + source=LogSource.SCHOLAR, + ) + else: + logger.info("No BibTeX generated", category=LogCategory.SKIP, source=LogSource.SCHOLAR) + else: + logger.info("No data returned", category=LogCategory.SKIP, source=LogSource.SCHOLAR) + except ALL_API_ERRORS as e: + logger.warn(f"Citation fetch error: {e}", category=LogCategory.ERROR, source=LogSource.SCHOLAR) + else: + logger.info("No title available; skipped", category=LogCategory.SKIP, source=LogSource.SCHOLAR) + + logger.debug(f"SEARCH_START | source=S2 | title={title[:60]}", category=LogCategory.AUDIT) + s2_paper = None + if s2_api_key: + try: + s2_papers = s2_search_papers_multiple(title, rec.name, s2_api_key, max_results=5) + if s2_papers: + _, s2_paper = _try_multiple_candidates( + LogSource.S2, + s2_papers, + build_bibtex_from_s2, + baseline_entry, + result_id, + enr_list, + flags, + "s2", + max_candidates=5, + seen_dois=all_candidate_dois, + ) + if s2_paper: + s2_id = s2_paper.get("paperId") + if s2_id: + baseline_entry["fields"]["x_s2_paper_id"] = str(s2_id) + logger.debug( + f"ID_EXTRACT | api=S2 | field=x_s2_paper_id | value={s2_id}", + category=LogCategory.AUDIT, + ) + except ALL_API_ERRORS as e: + logger.warn(f"API error - {e}", category=LogCategory.ERROR, source=LogSource.S2) + + logger.debug(f"SEARCH_START | source=Crossref | title={title[:60]}", category=LogCategory.AUDIT) + cr_item = None + try: + cr_items = crossref_search_multiple(title, rec.name, max_results=5) + if cr_items: + _, cr_item = _try_multiple_candidates( + LogSource.CROSSREF, + cr_items, + build_bibtex_from_crossref, + baseline_entry, + result_id, + enr_list, + flags, + "crossref", + max_candidates=5, + seen_dois=all_candidate_dois, + ) + except ALL_API_ERRORS as e: + logger.warn(f"API error - {e}", category=LogCategory.ERROR, source=LogSource.CROSSREF) + + logger.debug(f"SEARCH_START | source=OpenReview | title={title[:60]}", category=LogCategory.AUDIT) + try: + or_notes = openreview_search_papers_multiple(title, rec.name, or_creds, max_results=5) + if or_notes: + _try_multiple_candidates( + LogSource.OPENREVIEW, + or_notes, + build_bibtex_from_openreview, + baseline_entry, + result_id, + enr_list, + flags, + "openreview", + max_candidates=5, + seen_dois=all_candidate_dois, + ) + except ALL_API_ERRORS as e: + logger.warn(f"API error - {e}", category=LogCategory.ERROR, source=LogSource.OPENREVIEW) + + logger.debug(f"SEARCH_START | source=arXiv | title={title[:60]}", category=LogCategory.AUDIT) + arxiv_entry = None + try: + arxiv_entries = arxiv_search(title, rec.name, year_hint) + if arxiv_entries: + _, arxiv_entry = _try_multiple_candidates( + LogSource.ARXIV, + arxiv_entries, + build_bibtex_from_arxiv, + baseline_entry, + result_id, + enr_list, + flags, + "arxiv", + max_candidates=5, + seen_dois=all_candidate_dois, + ) + except ALL_API_ERRORS as e: + logger.warn(f"API error - {e}", category=LogCategory.ERROR, source=LogSource.ARXIV) + + logger.debug(f"SEARCH_START | source=OpenAlex | title={title[:60]}", category=LogCategory.AUDIT) + oa_work = None + try: + oa_works = openalex_search_multiple(title, rec.name, max_results=5) + if oa_works: + _, oa_work = _try_multiple_candidates( + LogSource.OPENALEX, + oa_works, + build_bibtex_from_openalex, + baseline_entry, + result_id, + enr_list, + flags, + "openalex", + max_candidates=5, + seen_dois=all_candidate_dois, + ) + if oa_work: + oa_id = oa_work.get("id") + if oa_id: + baseline_entry["fields"]["x_openalex_id"] = str(oa_id) + logger.debug( + f"ID_EXTRACT | api=OpenAlex | field=x_openalex_id | value={oa_id}", + category=LogCategory.AUDIT, + ) + except ALL_API_ERRORS as e: + logger.warn(f"API error - {e}", category=LogCategory.ERROR, source=LogSource.OPENALEX) + logger.debug(f"SEARCH_START | source=PubMed | title={title[:60]}", category=LogCategory.AUDIT) + pm_article = None + try: + pm_articles = pubmed_search_papers_multiple(title, rec.name, max_results=5) + if pm_articles: + _, pm_article = _try_multiple_candidates( + LogSource.PUBMED, + pm_articles, + build_bibtex_from_pubmed, + baseline_entry, + result_id, + enr_list, + flags, + "pubmed", + max_candidates=5, + seen_dois=all_candidate_dois, + ) + except ALL_API_ERRORS as e: + logger.warn(f"API error - {e}", category=LogCategory.ERROR, source=LogSource.PUBMED) + logger.debug(f"SEARCH_START | source=EuropePMC | title={title[:60]}", category=LogCategory.AUDIT) + epmc_article = None + try: + epmc_articles = europepmc_search_papers_multiple(title, rec.name, max_results=5) + if epmc_articles: + _, epmc_article = _try_multiple_candidates( + LogSource.EUROPEPMC, + epmc_articles, + build_bibtex_from_europepmc, + baseline_entry, + result_id, + enr_list, + flags, + "europepmc", + max_candidates=5, + seen_dois=all_candidate_dois, + ) + except ALL_API_ERRORS as e: + logger.warn(f"API error - {e}", category=LogCategory.ERROR, source=LogSource.EUROPEPMC) + + # ===== PHASE 2.5: Venue-Based Search (SerpAPI publication string) ===== + # Only attempt when no enrichment matched so far — avoids redundant API calls. + if not enr_list: + pub_string = art.get("publication") or "" + if pub_string: + parsed_pub = parse_publication_string(pub_string) + if parsed_pub and parsed_pub.confidence >= PUB_PARSE_TIER1_MIN_CONFIDENCE: + logger.info( + f"▶ Phase 2.5: Venue search | venue={parsed_pub.venue_name[:40]} " + f"| type={parsed_pub.venue_type} | conf={parsed_pub.confidence:.2f}", + category=LogCategory.ARTICLE, + ) + + # Inject arXiv ID from publication string (enables Phase 3 DOI discovery) + if parsed_pub.arxiv_id and not bf.get("eprint"): + bf["eprint"] = parsed_pub.arxiv_id + bf["archiveprefix"] = "arXiv" + ax_doi = idu.normalize_doi(f"10.48550/arxiv.{parsed_pub.arxiv_id}") + if ax_doi: + all_candidate_dois.add(ax_doi) + + # Inject DOI fragment from bioRxiv/medRxiv publication string + if parsed_pub.doi_fragment and not bf.get("doi"): + bf["doi"] = parsed_pub.doi_fragment + norm_doi = idu.normalize_doi(parsed_pub.doi_fragment) + if norm_doi: + all_candidate_dois.add(norm_doi) + + # Tier 1: venue-based Crossref search (journal/conference only) + if parsed_pub.venue_type in ("journal", "conference"): + try: + cr_venue_items = crossref_search_by_venue( + title, + rec.name, + container_title=parsed_pub.venue_name, + max_results=5, + ) + if cr_venue_items: + _try_multiple_candidates( + LogSource.CROSSREF, + cr_venue_items, + build_bibtex_from_crossref, + baseline_entry, + result_id, + enr_list, + flags, + "crossref", + max_candidates=5, + seen_dois=all_candidate_dois, + ) + except ALL_API_ERRORS as e: + logger.warn( + f"Venue-based Crossref error: {e}", + category=LogCategory.ERROR, + source=LogSource.CROSSREF, + ) + + # Tier 1: venue-based OpenAlex search (only if Crossref missed) + if not enr_list and parsed_pub.venue_type in ("journal", "conference"): + try: + oa_venue_items = openalex_search_by_venue( + title, + rec.name, + venue_name=parsed_pub.venue_name, + max_results=5, + ) + if oa_venue_items: + _try_multiple_candidates( + LogSource.OPENALEX, + oa_venue_items, + build_bibtex_from_openalex, + baseline_entry, + result_id, + enr_list, + flags, + "openalex", + max_candidates=5, + seen_dois=all_candidate_dois, + ) + except ALL_API_ERRORS as e: + logger.warn( + f"Venue-based OpenAlex error: {e}", + category=LogCategory.ERROR, + source=LogSource.OPENALEX, + ) + + # ===== PHASE 3: Late DOI Discovery ===== + logger.info("▶ Phase 3: Late DOI Discovery", category=LogCategory.ARTICLE) + # Do late DOI negotiation if we haven't validated a DOI, or if the validated + # DOI is a preprint (we may find a published DOI to upgrade to) + baseline_doi = idu.normalize_doi(bf.get("doi")) + is_secondary = bool(baseline_doi and idu.is_secondary_doi(baseline_doi)) + run_phase3 = not doi_validated or is_secondary + logger.debug( + f"PHASE3_START | doi_validated={doi_validated} | baseline_doi={baseline_doi} " + f"| is_secondary={is_secondary} | run_phase3={run_phase3}", + category=LogCategory.AUDIT, + ) + if run_phase3: + logger.info( + "Extracting DOI candidates from enrichment sources", + category=LogCategory.SEARCH, + source=LogSource.DOI, + ) + try: + doi_candidates: list[str] = [] + + def _add_doi(source: str, doi: str | None) -> None: + """Append a DOI candidate and log it for audit.""" + if doi: + doi_candidates.append(str(doi)) + logger.debug( + f"DOI_CANDIDATE | source={source} | doi={doi} | is_secondary={idu.is_secondary_doi(str(doi))}", + category=LogCategory.AUDIT, + ) + + # Include stashed unvalidated DOI from Phase 1 for retry + _add_doi("phase1_stash", unvalidated_doi) + + # Infer arXiv DOIs from eprint fields or URLs in baseline and enrichers + # (deterministic — no HTTP required) + _bl_eprint = idu.extract_arxiv_eprint(baseline_entry) + if _bl_eprint: + _add_doi("baseline_eprint", f"10.48550/arxiv.{_bl_eprint}") + _bl_url = bf.get("url", "") + _bl_url_m = _ARXIV_ABS_RE.search(str(_bl_url)) + if _bl_url_m: + _add_doi("baseline_url", f"10.48550/arxiv.{_bl_url_m.group(1)}") + for _enr_src, _enr_data in enr_list: + _eprint = idu.extract_arxiv_eprint(_enr_data) + if _eprint: + _add_doi(f"eprint_{_enr_src}", f"10.48550/arxiv.{_eprint}") + else: + # Check enricher's URL field for arXiv abstract links + _enr_url = (_enr_data.get("fields") or {}).get("url", "") + _m = _ARXIV_ABS_RE.search(str(_enr_url)) + if _m: + _add_doi(f"url_{_enr_src}", f"10.48550/arxiv.{_m.group(1)}") + + # Only extract DOIs from API results that successfully matched baseline + if s2_paper and flags.get("s2"): + ext = s2_paper.get("externalIds") or {} + for doi_field in (ext.get("DOI") if isinstance(ext, dict) else None, s2_paper.get("doi")): + _add_doi("S2", doi_field) + if cr_item and cr_item.get("DOI") and flags.get("crossref"): + _add_doi("Crossref", cr_item.get("DOI")) + if arxiv_entry and arxiv_entry.get("doi") and flags.get("arxiv"): + _add_doi("arXiv", arxiv_entry.get("doi")) + if oa_work and oa_work.get("doi") and flags.get("openalex"): + _add_doi("OpenAlex", oa_work.get("doi")) + if pm_article and flags.get("pubmed"): + for aid in pm_article.get("articleids") or []: + if aid.get("idtype") == "doi": + _add_doi("PubMed", aid.get("value") or "") + if epmc_article and epmc_article.get("doi") and flags.get("europepmc"): + _add_doi("EuropePMC", epmc_article.get("doi")) + + url_candidates: list[str] = [] + # URLs from baseline are always safe to use + base_url = bf.get("url") + if base_url: + url_candidates.append(base_url) + # Only use URLs from API results that successfully matched baseline + if s2_paper and s2_paper.get("url") and flags.get("s2"): + url_candidates.append(s2_paper.get("url")) + if cr_item and cr_item.get("URL") and flags.get("crossref"): + url_candidates.append(cr_item.get("URL")) + if arxiv_entry and arxiv_entry.get("abs_url") and flags.get("arxiv"): + url_candidates.append(arxiv_entry.get("abs_url")) + if oa_work and oa_work.get("id") and flags.get("openalex"): + url_candidates.append(oa_work.get("id")) + if pm_article and pm_article.get("uid") and flags.get("pubmed"): + url_candidates.append(f"https://pubmed.ncbi.nlm.nih.gov/{pm_article.get('uid')}/") + if epmc_article and flags.get("europepmc"): + pmcid = epmc_article.get("pmcid") + if pmcid: + numeric_id = str(pmcid).removeprefix("PMC") + url_candidates.append(f"https://europepmc.org/article/PMC/{numeric_id}") + + # Deterministic DOI extraction from known URL patterns + # (no HTTP required — prevents network non-determinism) + for u in filter(None, url_candidates): + m = _ARXIV_ABS_RE.search(str(u)) + if m: + inferred = f"10.48550/arxiv.{m.group(1)}" + doi_candidates.append(inferred) + logger.debug( + f"DOI_FROM_URL | url={u} | doi_inferred={inferred}", + category=LogCategory.AUDIT, + ) + break + + # Fall back to cached HTML scraping only if no DOI found yet + if not doi_candidates: + from src.cache import response_cache as _doi_cache + + for u in filter(None, url_candidates): + _u_str = str(u) + _cached_doi = _doi_cache.get("doi_from_html", _u_str) + if _cached_doi is not None: + _cd = _cached_doi.get("doi", "") + if _cd: + doi_candidates.append(_cd) + logger.debug( + f"DOI_FROM_HTML | url={_u_str} | doi_found={_cd} | cached=True", + category=LogCategory.AUDIT, + ) + break + continue # negative cache hit + try: + html = http_get_text(u) + except ALL_API_ERRORS: + _doi_cache.put("doi_from_html", _u_str, {"doi": ""}, ttl_days=60) + continue + d = idu.find_doi_in_html(html) + _doi_cache.put("doi_from_html", _u_str, {"doi": d or ""}, ttl_days=60) + if d: + logger.debug( + f"DOI_FROM_HTML | url={_u_str} | doi_found={d}", + category=LogCategory.AUDIT, + ) + doi_candidates.append(d) + break + + doi_candidates = [d for d in {idu.normalize_doi(d) for d in doi_candidates if d} if d] + # Feed Phase 3 DOIs into the candidate set for deterministic dedup + all_candidate_dois.update(doi_candidates) + # Published DOIs first, preprint/data DOIs last + doi_candidates.sort(key=lambda d: 1 if idu.is_secondary_doi(d) else 0) + published_first = bool(doi_candidates and not idu.is_secondary_doi(doi_candidates[0])) + logger.debug( + f"DOI_CANDIDATES_RANKED | count={len(doi_candidates)} " + f"| order=[{', '.join(doi_candidates)}] | published_first={published_first}", + category=LogCategory.AUDIT, + ) + + if doi_candidates: + logger.info( + f"Found {len(doi_candidates)} DOI candidate(s): {', '.join(doi_candidates)}", + category=LogCategory.SEARCH, + source=LogSource.DOI, + ) + doi_matched = False + + # Try each DOI candidate until we find one that validates + for doi_idx, doi_candidate in enumerate(doi_candidates, 1): + logger.info( + f"Validating DOI candidate: {doi_candidate}", + category=LogCategory.SEARCH, + source=LogSource.DOI, + ) + # When a DOI was inferred from an enricher's arXiv eprint, + # temporarily inject it into the baseline so DOI_EXACT match + # fires in validation (the eprint already confirmed identity; + # the CSL title may differ from the preprint title). + _bl_doi_before = bf.get("doi") + _doi_norm = idu.normalize_doi(doi_candidate) + _is_eprint_doi = _doi_norm and any( + idu.normalize_doi(f"10.48550/arxiv.{idu.extract_arxiv_eprint(ed) or ''}") == _doi_norm + for _, ed in enr_list + if idu.extract_arxiv_eprint(ed) + ) + if _is_eprint_doi and not _bl_doi_before: + bf["doi"] = doi_candidate + candidate_matched = process_validated_doi(doi_candidate, baseline_entry, result_id, enr_list, flags) + # Restore baseline DOI to avoid polluting later logic + if _is_eprint_doi and not _bl_doi_before: + bf.pop("doi", None) + logger.debug( + f"DOI_VALIDATE_ATTEMPT | #{doi_idx} | doi={doi_candidate} | result={candidate_matched}", + category=LogCategory.AUDIT, + ) + + if candidate_matched: + doi_matched = True + break # Stop after first successful validation + else: + logger.info("Trying next DOI candidate...", category=LogCategory.SEARCH, source=LogSource.DOI) + + # If none of the DOI candidates validated, warn the user + if not doi_matched: + logger.warn( + f"None of {len(doi_candidates)} DOI candidate(s) validated against baseline", + category=LogCategory.SKIP, + source=LogSource.DOI, + ) + else: + logger.info("No DOI discovered; skipped", category=LogCategory.SKIP, source=LogSource.DOI) + except ALL_API_ERRORS as e: + logger.warn(f"DOI negotiation error: {e}", category=LogCategory.ERROR, source=LogSource.DOI) + else: + logger.info( + "DOI already validated early; skipping late DOI negotiation", + category=LogCategory.SKIP, + source=LogSource.DOI, + ) + + # ===== PHASE 4: Merge & Save ===== + logger.info("▶ Phase 4: Merge & Save", category=LogCategory.ARTICLE) + enr_source_names = [name for name, _ in enr_list] + logger.debug( + f"PHASE4_START | enricher_count={len(enr_list)} | sources=[{', '.join(enr_source_names)}]", + category=LogCategory.AUDIT, + ) + + logger.info("Applying trust policy and merging enrichments", category=LogCategory.SAVE, source=LogSource.SYSTEM) + try: + merged = mu.merge_with_policy(baseline_entry, enr_list) + merged_fields = merged.get("fields") or {} + + # Phase-4 post-merge canonicalization: entry-type reclassification and + # text/venue normalization, single-sourced in src/canonicalize.py. + # POST_MERGE is the terminal stage; absence rules (article/inproceedings + # missing venue, preprint-DOI downgrade) fire here after enrichment. + canonicalize(merged, stage=CanonicalStage.POST_MERGE) + + # Annotate bare stubs: no enrichers, no DOI, no venue + is_bare_stub = ( + not enr_list + and not (merged_fields.get("doi") or "").strip() + and not (merged_fields.get("journal") or "").strip() + and not (merged_fields.get("booktitle") or "").strip() + ) + if is_bare_stub: + # Tier 2: populate fields directly from SerpAPI publication string + pub_string = art.get("publication") or "" + parsed_pub = parse_publication_string(pub_string) + tier2_applied = False + + if parsed_pub and parsed_pub.confidence >= PUB_PARSE_TIER2_MIN_CONFIDENCE: + if parsed_pub.venue_type == "journal": + merged_fields["journal"] = parsed_pub.venue_name + if parsed_pub.volume: + merged_fields["volume"] = parsed_pub.volume + if parsed_pub.issue: + merged_fields["number"] = parsed_pub.issue + if parsed_pub.pages: + merged_fields["pages"] = parsed_pub.pages + merged["type"] = "article" + merged_fields["note"] = "Venue from SerpAPI publication string (unverified)" + tier2_applied = True + logger.info( + f"TIER2 | journal={parsed_pub.venue_name} | vol={parsed_pub.volume} | pages={parsed_pub.pages}", + category=LogCategory.AUDIT, + ) + elif parsed_pub.venue_type == "conference": + merged_fields["booktitle"] = parsed_pub.venue_name + if parsed_pub.pages: + merged_fields["pages"] = parsed_pub.pages + merged["type"] = "inproceedings" + merged_fields["note"] = "Venue from SerpAPI publication string (unverified)" + tier2_applied = True + logger.info( + f"TIER2 | booktitle={parsed_pub.venue_name} | pages={parsed_pub.pages}", + category=LogCategory.AUDIT, + ) + + if parsed_pub and not tier2_applied: + if parsed_pub.venue_type == "patent": + merged_fields["note"] = f"US Patent {parsed_pub.patent_number}" + tier2_applied = True + logger.info( + f"TIER2 | patent={parsed_pub.patent_number}", + category=LogCategory.AUDIT, + ) + elif parsed_pub.venue_type == "preprint": + merged_fields["howpublished"] = parsed_pub.venue_name + if parsed_pub.arxiv_id: + merged_fields["eprint"] = parsed_pub.arxiv_id + merged_fields["archiveprefix"] = "arXiv" + tier2_applied = True + logger.info( + f"TIER2 | preprint={parsed_pub.venue_name}", + category=LogCategory.AUDIT, + ) + + if not tier2_applied: + merged_fields["note"] = "Unenriched: no enrichment sources matched" + logger.warn( + "Bare stub: no venue, no DOI, no enrichment; annotated with note", + category=LogCategory.AUDIT, + ) + + # Delete entries where title equals journal or booktitle (corrupted Scholar data). + # Placed after Tier 2 filling so it catches entries populated from SerpAPI pub strings. + _p4_title_lower = (merged_fields.get("title") or "").strip().lower() + if _p4_title_lower: + _p4_journal_lower = (merged_fields.get("journal") or "").strip().lower() + _p4_booktitle_lower = (merged_fields.get("booktitle") or "").strip().lower() + if (_p4_journal_lower and _p4_title_lower == _p4_journal_lower) or ( + _p4_booktitle_lower and _p4_title_lower == _p4_booktitle_lower + ): + logger.debug( + f"TITLE_IS_VENUE | title={_p4_title_lower[:60]} | skipping entry", + category=LogCategory.AUDIT, + ) + if path and os.path.isfile(path): + os.remove(path) + return 0 + + # Skip entries with type "book" (proceedings volumes, edited books — not individual papers) + if merged.get("type") == "book": + has_file = bool(path and os.path.isfile(path)) + logger.debug( + f"BOOK_SKIP | type=book | file_deleted={has_file}", + category=LogCategory.AUDIT, + ) + logger.warn( + "Entry is a book/proceedings volume, not an individual paper; skipping", + category=LogCategory.SKIP, + source=LogSource.SYSTEM, + ) + if has_file and path: + os.remove(path) + return 0 + + # Verify target author appears in the paper's author list to catch + # Scholar profile contamination (e.g., different person with same surname) + merged_authors = merged_fields.get("author", "") + author_found = not merged_authors or author_name_matches(rec.name, merged_authors) + logger.debug( + f"AUTHOR_FILTER | target={rec.name} | paper_authors={str(merged_authors)[:80]} | found={author_found}", + category=LogCategory.AUDIT, + ) + if merged_authors and not author_found: + # Check if enrichment corrupted the author field (misattributed DOI). + # If the ORIGINAL file had the correct author, keep it — don't delete. + if path and os.path.isfile(path) and baseline_entry: + baseline_authors = bf.get("author", "") + if baseline_authors and author_name_matches(rec.name, baseline_authors): + logger.warn( + f"Enrichment corrupted author field ('{str(merged_authors)[:60]}'); " + f"keeping original file: {os.path.basename(path)}", + category=LogCategory.SKIP, + source=LogSource.SYSTEM, + ) + return 0 + logger.warn( + f"Target author '{rec.name}' not found in paper authors; skipping", + category=LogCategory.SKIP, + source=LogSource.SYSTEM, + ) + if path and os.path.isfile(path): + os.remove(path) + return 0 + + # Deterministic dedup: check if any DOI (from Phase 2 candidates, Phase 3 + # discovery, or the merged entry itself) already exists in a DIFFERENT file + # on disk. This prevents oscillation where a preprint/published pair creates + # a file under the preprint title that gets enriched and renamed every run. + merged_doi = idu.normalize_doi(merged_fields.get("doi", "")) + _merged_eprint = idu.extract_arxiv_eprint(merged) + if _merged_eprint: + all_candidate_dois.add(idu.normalize_doi(f"10.48550/arxiv.{_merged_eprint}") or "") + if merged_doi: + all_candidate_dois.add(merged_doi) + # Exclude the DOI of the prefer_path file itself to avoid self-matching + prefer_doi = _read_doi_from_file(path) if path and os.path.isfile(path) else "" + check_dois = all_candidate_dois - {prefer_doi} if prefer_doi else all_candidate_dois + if check_dois: + for existing_bib in iter_author_bibs(author_dir): + epath = os.path.join(author_dir, existing_bib) + if path and os.path.abspath(epath) == os.path.abspath(path): + continue # skip self + try: + with open(epath, encoding="utf-8") as ef: + edict = bt.parse_bibtex_to_dict(ef.read()) + if not edict: + continue + edoi = idu.normalize_doi((edict.get("fields") or {}).get("doi", "")) + if not edoi or edoi not in check_dois: + continue + # Guard: verify the DOI match is genuine by comparing titles. + # Phase-2 candidate DOIs can be false matches (API returned + # the wrong DOI for the query title). + e_title = (edict.get("fields") or {}).get("title", "") + m_title = merged_fields.get("title", "") + if e_title and m_title: + doi_sim = title_similarity(e_title, m_title) + if doi_sim < SIM_PREPRINT_TITLE_THRESHOLD: + logger.debug( + f"CANDIDATE_DOI_DEDUP_REJECTED | doi={edoi}" + f" | existing={existing_bib}" + f" | sim={doi_sim:.3f} | titles_differ", + category=LogCategory.DEDUP, + ) + _revert_misattributed_doi(merged_fields, edoi, doi_validated, doi_early) + continue + logger.debug( + f"CANDIDATE_DOI_DEDUP | doi={edoi} | existing={existing_bib} | skipping_write=True", + category=LogCategory.DEDUP, + ) + if path and os.path.isfile(path): + os.remove(path) + logger.debug( + f"FILE_CLEANUP | removed={path} | reason=candidate_doi_on_disk", + category=LogCategory.DEDUP, + ) + return 0 + except (OSError, UnicodeDecodeError): + continue + + merged["key"] = bt.build_standard_citekey(merged, gemini_api_key=gemini_api_key) or merged.get("key") or "Entry" + + # Year-window guard: reject files whose enriched year falls outside the window + if min_year > 0: + final_year = extract_year_from_any(merged.get("fields", {}).get("year"), fallback=0) or 0 + if 0 < final_year < min_year: + logger.info( + f"Skipping out-of-window entry (year={final_year} < {min_year}): {title[:60]}", + category=LogCategory.SKIP, + ) + # Clean up baseline file if we created one + if path and os.path.isfile(path): + os.remove(path) + return 0 + + path2, was_written = mu.save_entry_to_file( + out_dir, effective_id, merged, prefer_path=path, gemini_api_key=gemini_api_key, author_name=rec.name + ) + if path2 != path: + logger.success(f"Enriched and renamed: {path2}", category=LogCategory.SAVE, source=LogSource.SYSTEM) + else: + logger.success(f"Enriched: {path2}", category=LogCategory.SAVE, source=LogSource.SYSTEM) + # Summary log: relative path and success flags + try: + rel = os.path.relpath(path2) + except (OSError, ValueError): + rel = path2 + total_true = sum(1 for v in flags.values() if v) + + # ===== Enrichment Summary ===== + logger.info("▶ Enrichment Summary", category=LogCategory.ARTICLE) + + # Count total enrichment sources (excluding doi_csl and doi_bibtex as they're part of doi_validated) + enrichment_sources = { + "scholar_page": "Scholar Citation", + "s2": "Semantic Scholar", + "crossref": "Crossref", + "openreview": "OpenReview", + "arxiv": "arXiv", + "openalex": "OpenAlex", + "pubmed": "PubMed", + "europepmc": "Europe PMC", + } + + # Log DOI status separately + doi_methods = [m for m, k in [("CSL", "doi_csl"), ("BibTeX", "doi_bibtex")] if flags.get(k)] + if doi_methods: + logger.success( + f"DOI: {' + '.join(doi_methods)}", + category=LogCategory.SAVE, + source=LogSource.DOI, + ) + + # Count and log enrichment sources + enriched_count = sum(1 for k in enrichment_sources if flags.get(k)) + total_sources = len(enrichment_sources) + + # Group matched and unmatched sources + matched_sources = [label for key, label in enrichment_sources.items() if flags.get(key)] + unmatched = [label for key, label in enrichment_sources.items() if not flags.get(key)] + + if flags.get("doi_csl"): + doi_status = "csl" + elif flags.get("doi_bibtex"): + doi_status = "bibtex" + else: + doi_status = "none" + logger.debug( + f"ENRICHMENT_SUMMARY | doi_status={doi_status} | enriched={enriched_count}/{total_sources} " + f"| matched=[{', '.join(matched_sources)}] | unmatched=[{', '.join(unmatched)}]", + category=LogCategory.AUDIT, + ) + + logger.info( + f"Coverage: {enriched_count}/{total_sources} sources", + category=LogCategory.SAVE, + source=LogSource.SYSTEM, + ) + + if matched_sources: + logger.success(f"Matched: {', '.join(matched_sources)}", category=LogCategory.SAVE, source=LogSource.SYSTEM) + if unmatched: + logger.info(f"Not matched: {', '.join(unmatched)}", category=LogCategory.SKIP, source=LogSource.SYSTEM) + + if summary_csv_path and was_written: + append_summary_to_csv(summary_csv_path, rel, total_true, flags) + except (*PARSE_ERRORS, OSError, RuntimeError) as e: + logger.error(f"Merge error: {e}", category=LogCategory.ERROR, source=LogSource.SYSTEM) + return 0 + + return 1 From 2c357d38fd89c66928e0107110b1df4f25ee3cf8 Mon Sep 17 00:00:00 2001 From: Gabriel Spadon Date: Wed, 1 Jul 2026 17:49:43 -0300 Subject: [PATCH 32/54] refactor: extract author scheduler into src/pipeline/scheduler --- main.py | 331 ++---------------------------------- src/pipeline/scheduler.py | 347 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 360 insertions(+), 318 deletions(-) create mode 100644 src/pipeline/scheduler.py diff --git a/main.py b/main.py index 27ffd588..63bf8a0e 100644 --- a/main.py +++ b/main.py @@ -1,44 +1,22 @@ from __future__ import annotations import os -import random import sys -import threading -import time -from concurrent.futures import ThreadPoolExecutor, as_completed -from typing import Any from src.canonicalize import ( _fixup_bib_entry, # noqa: F401 # re-exported for test imports ) -from src.clients.helpers import get_article_year, strip_html_tags -from src.clients.scholar import ( - fetch_author_publications, - merge_publication_lists, - sort_articles_by_year_current_first, -) -from src.clients.search_apis import ( - dblp_fetch_for_author, -) from src.config import ( DEFAULT_INPUT, DEFAULT_OUT_DIR, DEFAULT_S2_KEY_FILE, DEFAULT_SERPAPI_KEY_FILE, DEFAULT_SERPLY_KEY_FILE, - MAX_PUBLICATIONS_PER_AUTHOR, - MAX_WORKERS, - REQUEST_DELAY_MAX, - REQUEST_DELAY_MIN, - SIM_MERGE_DUPLICATE_THRESHOLD, - get_min_year, ) from src.exceptions import ( FILE_IO_ERRORS, FILE_READ_ERRORS, - FULL_OPERATION_ERRORS, ) -from src.fsscan import iter_author_bibs from src.http_utils import reset_api_call_counts from src.io_utils import ( init_summary_csv, @@ -49,207 +27,12 @@ read_serpapi_api_key, read_serply_api_key, ) -from src.log_utils import LogCategory, LogSource, logger -from src.models import Record -from src.pipeline.article import process_article +from src.log_utils import LogCategory, logger from src.pipeline.postrun import finalize_run -from src.text_utils import ( - format_author_dirname, - trim_title_default, -) +from src.pipeline.scheduler import run_all from src.textnorm import _is_corrupted_title, _is_garbage_title # noqa: F401 # re-exported for test imports -def process_record( - serpapi_key: str, - serply_key: str | None, - rec: Record, - out_dir: str, - max_pubs: int | None = 1, - s2_api_key: str | None = None, - or_creds: tuple[str, str] | None = None, - delay: float = 0.0, - gemini_api_key: str | None = None, - summary_csv_path: str | None = None, - force_enrich: bool = False, -) -> int: - """Fetch, deduplicate, and enrich recent publications for one author. - - Returns the number of BibTeX files successfully written. - """ - # Setup thread-local logging for this author - effective_id = rec.scholar_id or rec.dblp or "" - author_dirname = format_author_dirname(rec.name, effective_id) - author_log_path = os.path.join(out_dir, author_dirname, "author.log") - - logger.set_log_file(author_log_path) - - try: - logger.step( - f"Author: {rec.name} (Scholar={rec.scholar_id or 'N/A'}, DBLP={rec.dblp or 'N/A'})", - category=LogCategory.AUTHOR, - source=LogSource.SYSTEM, - ) - - min_year = get_min_year() - - scholar_windowed = [] - if rec.scholar_id: - logger.info("Request author publications", category=LogCategory.FETCH, source=LogSource.SCHOLAR) - - scholar_articles: list[dict[str, Any]] = [] - max_fetch_retries = 3 - - # SerpAPI call — pagination handled internally by serpapi_scholar - data = {} - for attempt in range(1, max_fetch_retries + 1): - data = fetch_author_publications( - serpapi_key, - rec.scholar_id, - rec.name, - num=MAX_PUBLICATIONS_PER_AUTHOR, - min_year=min_year, - ) - if data.get("articles"): - break # Got articles -- valid response - if attempt < max_fetch_retries: - logger.warn( - f"Scholar API returned empty (attempt {attempt}/{max_fetch_retries}), retrying...", - category=LogCategory.FETCH, - source=LogSource.SCHOLAR, - ) - time.sleep(2.0 * attempt) - - if not data.get("articles"): - logger.warn( - f"Scholar API failed after {max_fetch_retries} attempts; continuing with DBLP only", - category=LogCategory.ERROR, - source=LogSource.SCHOLAR, - ) - else: - status = (data.get("search_metadata") or {}).get("status", "") - if status.lower() == "error": - raise RuntimeError( - f"CiteForge error for author {rec.scholar_id}: {data.get('error') or 'Unknown error'}" - ) - - scholar_articles = data.get("articles", []) - logger.debug( - f"SCHOLAR_FETCH | articles={len(scholar_articles)}", - category=LogCategory.AUDIT, - ) - - if not scholar_articles: - logger.warn("No articles returned from Scholar", category=LogCategory.SKIP, source=LogSource.SCHOLAR) - else: - # Pre-clean titles to handle trailing periods consistently - for a in scholar_articles: - try: - if a.get("title"): - a["title"] = trim_title_default(strip_html_tags(a["title"])) - except (TypeError, AttributeError): - pass - logger.info( - f"{len(scholar_articles)} article(s) fetched", - category=LogCategory.FETCH, - source=LogSource.SCHOLAR, - ) - - scholar_windowed = [a for a in scholar_articles if (get_article_year(a) or 0) >= min_year] - logger.debug( - f"YEAR_WINDOW | total={len(scholar_articles)} | windowed={len(scholar_windowed)} | min_year={min_year}", - category=LogCategory.AUDIT, - ) - logger.info( - f"{len(scholar_windowed)}/{len(scholar_articles)} within year window (>= {min_year})", - category=LogCategory.FETCH, - source=LogSource.SCHOLAR, - ) - else: - logger.info("Skipped (no ID)", category=LogCategory.SKIP, source=LogSource.SCHOLAR) - - dblp_items = [] - if rec.dblp: - try: - dblp_items = dblp_fetch_for_author(rec.name, rec.dblp, min_year) - logger.info( - f"{len(dblp_items)} item(s) fetched within window", - category=LogCategory.FETCH, - source=LogSource.DBLP, - ) - except FULL_OPERATION_ERRORS as e: - logger.warn(f"Fetch failed: {e}", category=LogCategory.ERROR, source=LogSource.DBLP) - else: - logger.info("Skipped (no ID)", category=LogCategory.SKIP, source=LogSource.DBLP) - - if not scholar_windowed and not dblp_items: - logger.info(f"No articles within year window (>= {min_year})", category=LogCategory.SKIP) - return 0 - - # merge Scholar and DBLP with full deduplication (within and across sources) - merged_list = merge_publication_lists(scholar_windowed, dblp_items, target_author=rec.name) - dedup_removed = len(scholar_windowed) + len(dblp_items) - len(merged_list) - logger.debug( - f"PUB_MERGE | scholar={len(scholar_windowed)} | dblp={len(dblp_items)} " - f"| merged={len(merged_list)} | dedup_removed={dedup_removed}", - category=LogCategory.AUDIT, - ) - logger.info( - f"Union: Scholar={len(scholar_windowed)}, DBLP={len(dblp_items)} " - f"→ {len(merged_list)} unique publications (threshold={SIM_MERGE_DUPLICATE_THRESHOLD})", - category=LogCategory.PLAN, - ) - - articles_sorted = sort_articles_by_year_current_first(merged_list) - total_entries = len(articles_sorted) if max_pubs is None else min(len(articles_sorted), max_pubs) - logger.info( - f"Plan: process {total_entries}/{len(articles_sorted)} item(s) " - f"(limit={'all' if max_pubs is None else max_pubs})", - category=LogCategory.PLAN, - ) - - saved = 0 - for idx, art in enumerate(articles_sorted): - if max_pubs is not None and idx >= max_pubs: - break - try: - saved += process_article( - rec, - art, - serply_key, - out_dir, - s2_api_key, - or_creds, - idx=idx + 1, - total=total_entries, - gemini_api_key=gemini_api_key, - summary_csv_path=summary_csv_path, - min_year=min_year, - force_enrich=force_enrich, - ) - except FULL_OPERATION_ERRORS as e: - logger.error(f"Article error: {e}", category=LogCategory.ERROR) - if delay > 0: - jittered = random.uniform(REQUEST_DELAY_MIN, REQUEST_DELAY_MAX) - time.sleep(jittered) - logger.info(f"Author done: saved {saved} file(s)", category=LogCategory.PLAN) - return saved - finally: - # Close the thread-local log file handler - logger.close() - - -def count_existing_papers(rec: Record, out_dir: str) -> int: - """Count existing .bib files in the author's output directory.""" - effective_id = rec.scholar_id or rec.dblp or "" - author_dirname = format_author_dirname(rec.name, effective_id) - author_dir = os.path.join(out_dir, author_dirname) - try: - return len(iter_author_bibs(author_dir)) - except OSError: - return 0 - - def main() -> int: """Set up the run, load API keys and author records, and process all authors in parallel. @@ -307,22 +90,6 @@ def main() -> int: logger.close() return 2 - # Sort authors by existing paper count (descending) so authors with more papers finish first - # Use (count desc, name, id) for deterministic ordering when counts are equal - logger.info( - "Sorting authors by existing paper count (authors with more papers will be processed first)", - category=LogCategory.PLAN, - ) - records_with_counts = [(rec, count_existing_papers(rec, out_dir)) for rec in records] - records_with_counts.sort(key=lambda x: (-x[1], x[0].name.lower(), x[0].scholar_id or x[0].dblp or "")) - records = [rec for rec, _ in records_with_counts] - - # Log sorting results - if records_with_counts: - max_papers = records_with_counts[0][1] - min_papers = records_with_counts[-1][1] - logger.info(f"Author range: {max_papers} papers (max) to {min_papers} papers (min)", category=LogCategory.PLAN) - csv_path = os.path.join(out_dir, "summary.csv") summary_csv_path: str | None = csv_path try: @@ -332,89 +99,17 @@ def main() -> int: logger.warn(f"Could not initialize summary CSV: {e}", category=LogCategory.ERROR) summary_csv_path = None - total_saved = 0 - processed = 0 - - # Prioritize new authors (no existing output dir) so they get browser/API - # resources first, before cached authors consume worker slots - def _has_output(r: Record) -> bool: - eid = r.scholar_id or r.dblp or "" - return os.path.isdir(os.path.join(out_dir, format_author_dirname(r.name, eid))) - - records_sorted = [r for _, r in sorted(enumerate(records), key=lambda ir: (_has_output(ir[1]), ir[0]))] - - logger.step(f"Starting parallel execution with {MAX_WORKERS} workers", category=LogCategory.PLAN) - - # Install thread exception hook to log uncaught exceptions in worker threads - _orig_excepthook = threading.excepthook - - def _thread_excepthook(args: Any) -> None: - logger.error( - f"Thread '{args.thread.name if args.thread else '?'}' died: {args.exc_type.__name__}: {args.exc_value}", - category=LogCategory.ERROR, - ) - _orig_excepthook(args) - - threading.excepthook = _thread_excepthook - - # Per-author timeout: 30 minutes per author to handle large publication lists - # Each article takes ~60-90s across all API calls, so 24 articles ≈ 36 minutes - author_timeout = 1800 # seconds - - with ThreadPoolExecutor(max_workers=MAX_WORKERS) as executor: - # Submit all tasks and track them - future_to_author = {} - for idx, rec in enumerate(records_sorted, 1): - effective_id = rec.scholar_id or rec.dblp or "N/A" - logger.info(f"[{idx}/{len(records)}] Queued: {rec.name} (ID: {effective_id})", category=LogCategory.PLAN) - - future = executor.submit( - process_record, - serpapi_key, - serply_key, - rec, - out_dir, - max_pubs=None, - s2_api_key=s2_api_key, - or_creds=or_creds, - delay=REQUEST_DELAY_MIN, - gemini_api_key=gemini_api_key, - summary_csv_path=summary_csv_path, - force_enrich=force_enrich, - ) - future_to_author[future] = rec - - logger.step(f"All {len(records)} authors queued for processing", category=LogCategory.PLAN) - - try: - for future in as_completed(future_to_author, timeout=author_timeout * len(records)): - rec = future_to_author[future] - try: - saved = future.result(timeout=30) - total_saved += saved - processed += 1 - logger.success( - f"[{processed}/{len(records)}] Completed: {rec.name} ({saved} files saved)", - category=LogCategory.AUTHOR, - ) - except TimeoutError: - processed += 1 - logger.error( - f"[{processed}/{len(records)}] Timeout retrieving result for {rec.name}", - category=LogCategory.ERROR, - ) - except Exception as e: - processed += 1 - logger.error( - f"[{processed}/{len(records)}] Error processing {rec.name} ({rec.scholar_id or rec.dblp}): {e}", - category=LogCategory.ERROR, - ) - except TimeoutError: - remaining = [r.name for f, r in future_to_author.items() if not f.done()] - logger.error( - f"Pipeline timed out with {len(remaining)} author(s) still pending: " + ", ".join(remaining[:5]), - category=LogCategory.ERROR, - ) + total_saved, processed, records = run_all( + serpapi_key, + serply_key, + s2_api_key, + or_creds, + gemini_api_key, + records, + out_dir, + summary_csv_path, + force_enrich, + ) try: finalize_run(out_dir, records, total_saved, processed, summary_csv_path) diff --git a/src/pipeline/scheduler.py b/src/pipeline/scheduler.py new file mode 100644 index 00000000..67730dcb --- /dev/null +++ b/src/pipeline/scheduler.py @@ -0,0 +1,347 @@ +from __future__ import annotations + +import os +import random +import threading +import time +from concurrent.futures import ThreadPoolExecutor, as_completed +from typing import Any + +from src.clients.helpers import get_article_year, strip_html_tags +from src.clients.scholar import ( + fetch_author_publications, + merge_publication_lists, + sort_articles_by_year_current_first, +) +from src.clients.search_apis import ( + dblp_fetch_for_author, +) +from src.config import ( + MAX_PUBLICATIONS_PER_AUTHOR, + MAX_WORKERS, + REQUEST_DELAY_MAX, + REQUEST_DELAY_MIN, + SIM_MERGE_DUPLICATE_THRESHOLD, + get_min_year, +) +from src.exceptions import ( + FULL_OPERATION_ERRORS, +) +from src.fsscan import iter_author_bibs +from src.log_utils import LogCategory, LogSource, logger +from src.models import Record +from src.pipeline.article import process_article +from src.text_utils import ( + format_author_dirname, + trim_title_default, +) + + +def process_record( + serpapi_key: str, + serply_key: str | None, + rec: Record, + out_dir: str, + max_pubs: int | None = 1, + s2_api_key: str | None = None, + or_creds: tuple[str, str] | None = None, + delay: float = 0.0, + gemini_api_key: str | None = None, + summary_csv_path: str | None = None, + force_enrich: bool = False, +) -> int: + """Fetch, deduplicate, and enrich recent publications for one author. + + Returns the number of BibTeX files successfully written. + """ + # Setup thread-local logging for this author + effective_id = rec.scholar_id or rec.dblp or "" + author_dirname = format_author_dirname(rec.name, effective_id) + author_log_path = os.path.join(out_dir, author_dirname, "author.log") + + logger.set_log_file(author_log_path) + + try: + logger.step( + f"Author: {rec.name} (Scholar={rec.scholar_id or 'N/A'}, DBLP={rec.dblp or 'N/A'})", + category=LogCategory.AUTHOR, + source=LogSource.SYSTEM, + ) + + min_year = get_min_year() + + scholar_windowed = [] + if rec.scholar_id: + logger.info("Request author publications", category=LogCategory.FETCH, source=LogSource.SCHOLAR) + + scholar_articles: list[dict[str, Any]] = [] + max_fetch_retries = 3 + + # SerpAPI call — pagination handled internally by serpapi_scholar + data = {} + for attempt in range(1, max_fetch_retries + 1): + data = fetch_author_publications( + serpapi_key, + rec.scholar_id, + rec.name, + num=MAX_PUBLICATIONS_PER_AUTHOR, + min_year=min_year, + ) + if data.get("articles"): + break # Got articles -- valid response + if attempt < max_fetch_retries: + logger.warn( + f"Scholar API returned empty (attempt {attempt}/{max_fetch_retries}), retrying...", + category=LogCategory.FETCH, + source=LogSource.SCHOLAR, + ) + time.sleep(2.0 * attempt) + + if not data.get("articles"): + logger.warn( + f"Scholar API failed after {max_fetch_retries} attempts; continuing with DBLP only", + category=LogCategory.ERROR, + source=LogSource.SCHOLAR, + ) + else: + status = (data.get("search_metadata") or {}).get("status", "") + if status.lower() == "error": + raise RuntimeError( + f"CiteForge error for author {rec.scholar_id}: {data.get('error') or 'Unknown error'}" + ) + + scholar_articles = data.get("articles", []) + logger.debug( + f"SCHOLAR_FETCH | articles={len(scholar_articles)}", + category=LogCategory.AUDIT, + ) + + if not scholar_articles: + logger.warn("No articles returned from Scholar", category=LogCategory.SKIP, source=LogSource.SCHOLAR) + else: + # Pre-clean titles to handle trailing periods consistently + for a in scholar_articles: + try: + if a.get("title"): + a["title"] = trim_title_default(strip_html_tags(a["title"])) + except (TypeError, AttributeError): + pass + logger.info( + f"{len(scholar_articles)} article(s) fetched", + category=LogCategory.FETCH, + source=LogSource.SCHOLAR, + ) + + scholar_windowed = [a for a in scholar_articles if (get_article_year(a) or 0) >= min_year] + logger.debug( + f"YEAR_WINDOW | total={len(scholar_articles)} | windowed={len(scholar_windowed)} | min_year={min_year}", + category=LogCategory.AUDIT, + ) + logger.info( + f"{len(scholar_windowed)}/{len(scholar_articles)} within year window (>= {min_year})", + category=LogCategory.FETCH, + source=LogSource.SCHOLAR, + ) + else: + logger.info("Skipped (no ID)", category=LogCategory.SKIP, source=LogSource.SCHOLAR) + + dblp_items = [] + if rec.dblp: + try: + dblp_items = dblp_fetch_for_author(rec.name, rec.dblp, min_year) + logger.info( + f"{len(dblp_items)} item(s) fetched within window", + category=LogCategory.FETCH, + source=LogSource.DBLP, + ) + except FULL_OPERATION_ERRORS as e: + logger.warn(f"Fetch failed: {e}", category=LogCategory.ERROR, source=LogSource.DBLP) + else: + logger.info("Skipped (no ID)", category=LogCategory.SKIP, source=LogSource.DBLP) + + if not scholar_windowed and not dblp_items: + logger.info(f"No articles within year window (>= {min_year})", category=LogCategory.SKIP) + return 0 + + # merge Scholar and DBLP with full deduplication (within and across sources) + merged_list = merge_publication_lists(scholar_windowed, dblp_items, target_author=rec.name) + dedup_removed = len(scholar_windowed) + len(dblp_items) - len(merged_list) + logger.debug( + f"PUB_MERGE | scholar={len(scholar_windowed)} | dblp={len(dblp_items)} " + f"| merged={len(merged_list)} | dedup_removed={dedup_removed}", + category=LogCategory.AUDIT, + ) + logger.info( + f"Union: Scholar={len(scholar_windowed)}, DBLP={len(dblp_items)} " + f"→ {len(merged_list)} unique publications (threshold={SIM_MERGE_DUPLICATE_THRESHOLD})", + category=LogCategory.PLAN, + ) + + articles_sorted = sort_articles_by_year_current_first(merged_list) + total_entries = len(articles_sorted) if max_pubs is None else min(len(articles_sorted), max_pubs) + logger.info( + f"Plan: process {total_entries}/{len(articles_sorted)} item(s) " + f"(limit={'all' if max_pubs is None else max_pubs})", + category=LogCategory.PLAN, + ) + + saved = 0 + for idx, art in enumerate(articles_sorted): + if max_pubs is not None and idx >= max_pubs: + break + try: + saved += process_article( + rec, + art, + serply_key, + out_dir, + s2_api_key, + or_creds, + idx=idx + 1, + total=total_entries, + gemini_api_key=gemini_api_key, + summary_csv_path=summary_csv_path, + min_year=min_year, + force_enrich=force_enrich, + ) + except FULL_OPERATION_ERRORS as e: + logger.error(f"Article error: {e}", category=LogCategory.ERROR) + if delay > 0: + jittered = random.uniform(REQUEST_DELAY_MIN, REQUEST_DELAY_MAX) + time.sleep(jittered) + logger.info(f"Author done: saved {saved} file(s)", category=LogCategory.PLAN) + return saved + finally: + # Close the thread-local log file handler + logger.close() + + +def count_existing_papers(rec: Record, out_dir: str) -> int: + """Count existing .bib files in the author's output directory.""" + effective_id = rec.scholar_id or rec.dblp or "" + author_dirname = format_author_dirname(rec.name, effective_id) + author_dir = os.path.join(out_dir, author_dirname) + try: + return len(iter_author_bibs(author_dir)) + except OSError: + return 0 + + +def run_all( + serpapi_key: str, + serply_key: str | None, + s2_api_key: str | None, + or_creds: tuple[str, str] | None, + gemini_api_key: str | None, + records: list[Record], + out_dir: str, + summary_csv_path: str | None, + force_enrich: bool, +) -> tuple[int, int, list[Record]]: + """Sort authors, then enrich every author in parallel worker threads. + + Sorts records by existing paper count, prioritizes authors without an + output directory, installs a thread excepthook, and drives a + ThreadPoolExecutor over process_record. Returns (total_saved, processed, + records) where records is the count-sorted list used by finalize_run. + """ + # Sort authors by existing paper count (descending) so authors with more papers finish first + # Use (count desc, name, id) for deterministic ordering when counts are equal + logger.info( + "Sorting authors by existing paper count (authors with more papers will be processed first)", + category=LogCategory.PLAN, + ) + records_with_counts = [(rec, count_existing_papers(rec, out_dir)) for rec in records] + records_with_counts.sort(key=lambda x: (-x[1], x[0].name.lower(), x[0].scholar_id or x[0].dblp or "")) + records = [rec for rec, _ in records_with_counts] + + # Log sorting results + if records_with_counts: + max_papers = records_with_counts[0][1] + min_papers = records_with_counts[-1][1] + logger.info(f"Author range: {max_papers} papers (max) to {min_papers} papers (min)", category=LogCategory.PLAN) + + total_saved = 0 + processed = 0 + + # Prioritize new authors (no existing output dir) so they get browser/API + # resources first, before cached authors consume worker slots + def _has_output(r: Record) -> bool: + eid = r.scholar_id or r.dblp or "" + return os.path.isdir(os.path.join(out_dir, format_author_dirname(r.name, eid))) + + records_sorted = [r for _, r in sorted(enumerate(records), key=lambda ir: (_has_output(ir[1]), ir[0]))] + + logger.step(f"Starting parallel execution with {MAX_WORKERS} workers", category=LogCategory.PLAN) + + # Install thread exception hook to log uncaught exceptions in worker threads + _orig_excepthook = threading.excepthook + + def _thread_excepthook(args: Any) -> None: + logger.error( + f"Thread '{args.thread.name if args.thread else '?'}' died: {args.exc_type.__name__}: {args.exc_value}", + category=LogCategory.ERROR, + ) + _orig_excepthook(args) + + threading.excepthook = _thread_excepthook + + # Per-author timeout: 30 minutes per author to handle large publication lists + # Each article takes ~60-90s across all API calls, so 24 articles ≈ 36 minutes + author_timeout = 1800 # seconds + + with ThreadPoolExecutor(max_workers=MAX_WORKERS) as executor: + # Submit all tasks and track them + future_to_author = {} + for idx, rec in enumerate(records_sorted, 1): + effective_id = rec.scholar_id or rec.dblp or "N/A" + logger.info(f"[{idx}/{len(records)}] Queued: {rec.name} (ID: {effective_id})", category=LogCategory.PLAN) + + future = executor.submit( + process_record, + serpapi_key, + serply_key, + rec, + out_dir, + max_pubs=None, + s2_api_key=s2_api_key, + or_creds=or_creds, + delay=REQUEST_DELAY_MIN, + gemini_api_key=gemini_api_key, + summary_csv_path=summary_csv_path, + force_enrich=force_enrich, + ) + future_to_author[future] = rec + + logger.step(f"All {len(records)} authors queued for processing", category=LogCategory.PLAN) + + try: + for future in as_completed(future_to_author, timeout=author_timeout * len(records)): + rec = future_to_author[future] + try: + saved = future.result(timeout=30) + total_saved += saved + processed += 1 + logger.success( + f"[{processed}/{len(records)}] Completed: {rec.name} ({saved} files saved)", + category=LogCategory.AUTHOR, + ) + except TimeoutError: + processed += 1 + logger.error( + f"[{processed}/{len(records)}] Timeout retrieving result for {rec.name}", + category=LogCategory.ERROR, + ) + except Exception as e: + processed += 1 + logger.error( + f"[{processed}/{len(records)}] Error processing {rec.name} ({rec.scholar_id or rec.dblp}): {e}", + category=LogCategory.ERROR, + ) + except TimeoutError: + remaining = [r.name for f, r in future_to_author.items() if not f.done()] + logger.error( + f"Pipeline timed out with {len(remaining)} author(s) still pending: " + ", ".join(remaining[:5]), + category=LogCategory.ERROR, + ) + return total_saved, processed, records From e55f4bf761f5022be4c59b0d16ff628429842235 Mon Sep 17 00:00:00 2001 From: Gabriel Spadon Date: Wed, 1 Jul 2026 17:52:28 -0300 Subject: [PATCH 33/54] refactor: reduce main.py to thin entry point --- main.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/main.py b/main.py index 63bf8a0e..41b2aba1 100644 --- a/main.py +++ b/main.py @@ -3,9 +3,7 @@ import os import sys -from src.canonicalize import ( - _fixup_bib_entry, # noqa: F401 # re-exported for test imports -) +from src.canonicalize import _fixup_bib_entry # noqa: F401 # re-exported for test imports from src.config import ( DEFAULT_INPUT, DEFAULT_OUT_DIR, From ac5649ea2d23046cbb4e88e5bcfae76273dcf627 Mon Sep 17 00:00:00 2001 From: Gabriel Spadon Date: Wed, 1 Jul 2026 18:09:31 -0300 Subject: [PATCH 34/54] refactor: split prioritize_records out of run_all to preserve log ordering The whole-function scheduler extraction moved the author count-sort (and its 'Sorting authors'/'Author range' PLAN log lines) inside run_all, which runs after init_summary_csv -- shifting two setup lines in run.log relative to the original. Split the count-sort into prioritize_records(), called from main() before init_summary_csv, restoring the exact original run.log ordering. Byte- neutral (corpus oracle 0 drift); the only skeptic-confirmed divergence, closed. --- main.py | 6 +++-- src/pipeline/scheduler.py | 48 +++++++++++++++++++++++---------------- 2 files changed, 32 insertions(+), 22 deletions(-) diff --git a/main.py b/main.py index 41b2aba1..8c013700 100644 --- a/main.py +++ b/main.py @@ -27,7 +27,7 @@ ) from src.log_utils import LogCategory, logger from src.pipeline.postrun import finalize_run -from src.pipeline.scheduler import run_all +from src.pipeline.scheduler import prioritize_records, run_all from src.textnorm import _is_corrupted_title, _is_garbage_title # noqa: F401 # re-exported for test imports @@ -88,6 +88,8 @@ def main() -> int: logger.close() return 2 + records = prioritize_records(records, out_dir) + csv_path = os.path.join(out_dir, "summary.csv") summary_csv_path: str | None = csv_path try: @@ -97,7 +99,7 @@ def main() -> int: logger.warn(f"Could not initialize summary CSV: {e}", category=LogCategory.ERROR) summary_csv_path = None - total_saved, processed, records = run_all( + total_saved, processed = run_all( serpapi_key, serply_key, s2_api_key, diff --git a/src/pipeline/scheduler.py b/src/pipeline/scheduler.py index 67730dcb..f453d5e6 100644 --- a/src/pipeline/scheduler.py +++ b/src/pipeline/scheduler.py @@ -227,33 +227,20 @@ def count_existing_papers(rec: Record, out_dir: str) -> int: return 0 -def run_all( - serpapi_key: str, - serply_key: str | None, - s2_api_key: str | None, - or_creds: tuple[str, str] | None, - gemini_api_key: str | None, - records: list[Record], - out_dir: str, - summary_csv_path: str | None, - force_enrich: bool, -) -> tuple[int, int, list[Record]]: - """Sort authors, then enrich every author in parallel worker threads. +def prioritize_records(records: list[Record], out_dir: str) -> list[Record]: + """Sort authors by existing paper count (descending) so authors with more + papers finish first; ties break on (name, id) for deterministic ordering. - Sorts records by existing paper count, prioritizes authors without an - output directory, installs a thread excepthook, and drives a - ThreadPoolExecutor over process_record. Returns (total_saved, processed, - records) where records is the count-sorted list used by finalize_run. + Emits the PLAN log lines and returns the count-sorted list. Kept separate + from run_all so the caller can log/sort before initializing the summary CSV, + matching the original run.log line ordering. """ - # Sort authors by existing paper count (descending) so authors with more papers finish first - # Use (count desc, name, id) for deterministic ordering when counts are equal logger.info( "Sorting authors by existing paper count (authors with more papers will be processed first)", category=LogCategory.PLAN, ) records_with_counts = [(rec, count_existing_papers(rec, out_dir)) for rec in records] records_with_counts.sort(key=lambda x: (-x[1], x[0].name.lower(), x[0].scholar_id or x[0].dblp or "")) - records = [rec for rec, _ in records_with_counts] # Log sorting results if records_with_counts: @@ -261,6 +248,27 @@ def run_all( min_papers = records_with_counts[-1][1] logger.info(f"Author range: {max_papers} papers (max) to {min_papers} papers (min)", category=LogCategory.PLAN) + return [rec for rec, _ in records_with_counts] + + +def run_all( + serpapi_key: str, + serply_key: str | None, + s2_api_key: str | None, + or_creds: tuple[str, str] | None, + gemini_api_key: str | None, + records: list[Record], + out_dir: str, + summary_csv_path: str | None, + force_enrich: bool, +) -> tuple[int, int]: + """Enrich every (already count-sorted) author in parallel worker threads. + + Prioritizes authors without an output directory, installs a thread + excepthook, and drives a ThreadPoolExecutor over process_record. Expects + ``records`` to be the count-sorted list from prioritize_records. Returns + (total_saved, processed). + """ total_saved = 0 processed = 0 @@ -344,4 +352,4 @@ def _thread_excepthook(args: Any) -> None: f"Pipeline timed out with {len(remaining)} author(s) still pending: " + ", ".join(remaining[:5]), category=LogCategory.ERROR, ) - return total_saved, processed, records + return total_saved, processed From 5ee1f84823e165664638c60b26e0dced2f35f778 Mon Sep 17 00:00:00 2001 From: Gabriel Spadon Date: Wed, 1 Jul 2026 18:31:05 -0300 Subject: [PATCH 35/54] perf: literal pre-guard skips no-op regex subs in title fixups _fix_fused_compounds applied ~800 compound-word patterns x3 passes to every title (profiled: 3.44M re.sub calls, 47% of the parse->canonicalize->serialize CPU, almost all matching nothing). A \b\b pattern cannot match unless the literal is a substring of the working string, so pre-guard each sub with a cheap substring test (config-sourced literals). IGNORECASE fused patterns guard only while the string isascii() (str.lower() vs regex case-folding differ for long-s/ dotted-I); case-sensitive suffix/acronym patterns guard unconditionally. Byte-identical: corpus oracle 0 drift + differential fuzz 0 mismatches over 3358 corpus fields + 4604 adversarial Unicode strings. Hot path 1644->4753 entries/s (2.9x). --- src/textnorm.py | 65 +++++++++++++++++++++++++++++++++++++++---------- 1 file changed, 52 insertions(+), 13 deletions(-) diff --git a/src/textnorm.py b/src/textnorm.py index a020d6f4..a2fca566 100644 --- a/src/textnorm.py +++ b/src/textnorm.py @@ -19,11 +19,17 @@ from src.config import ACRONYM_CASE_CORRECTIONS, COMPOUND_SUFFIXES, FUSED_COMPOUND_WORDS # Pre-compiled patterns for _fix_fused_compounds (avoids ~800 re.compile() calls per invocation) -_FUSED_DICT_PATTERNS: list[tuple[re.Pattern[str], str]] = [ - (re.compile(r"\b" + re.escape(fused) + r"\b", re.IGNORECASE), repl) for fused, repl in FUSED_COMPOUND_WORDS.items() +# Each compiled pattern carries a cheap literal pre-guard. A ``\b\b`` +# pattern cannot match unless the literal word/suffix is a substring of the +# working string (word boundaries only add constraints), so a substring test +# lets us skip the vast majority of re.sub calls that would match nothing. +# Literals are sourced from src.config (config-driven convention). +_FUSED_DICT_PATTERNS: list[tuple[re.Pattern[str], str, str]] = [ + (re.compile(r"\b" + re.escape(fused) + r"\b", re.IGNORECASE), repl, fused.lower()) + for fused, repl in FUSED_COMPOUND_WORDS.items() ] -_COMPOUND_SUFFIX_PATTERNS: list[re.Pattern[str]] = [ - re.compile(r"\b([A-Z][a-z]{2,})(" + re.escape(suffix) + r")\b") for suffix in COMPOUND_SUFFIXES +_COMPOUND_SUFFIX_PATTERNS: list[tuple[re.Pattern[str], str]] = [ + (re.compile(r"\b([A-Z][a-z]{2,})(" + re.escape(suffix) + r")\b"), suffix) for suffix in COMPOUND_SUFFIXES ] # Pre-compiled patterns for garbage title detection @@ -40,8 +46,9 @@ _GARBAGE_EASYCHAIR_RE = re.compile(r"\bEasyChair\s+Preprint\b", re.IGNORECASE) # Pre-compiled patterns for acronym case corrections in titles -_ACRONYM_CASE_PATTERNS: list[tuple[re.Pattern[str], str]] = [ - (re.compile(r"\b" + re.escape(wrong) + r"\b"), correct) for wrong, correct in ACRONYM_CASE_CORRECTIONS.items() +_ACRONYM_CASE_PATTERNS: list[tuple[re.Pattern[str], str, str]] = [ + (re.compile(r"\b" + re.escape(wrong) + r"\b"), correct, wrong) + for wrong, correct in ACRONYM_CASE_CORRECTIONS.items() ] # Pre-compiled pattern for verbose LNCS/Springer booktitle metadata @@ -122,7 +129,10 @@ def _fix_title_text(title: str) -> str: result = _COLON_SPACE_RE.sub(r"\1: \2", result) result = _HYPHEN_SPACE_RE.sub(r"\1-", result) result = _SPACE_HYPHEN_RE.sub(r"\1-\2", result) - for acr_pat, acr_repl in _ACRONYM_CASE_PATTERNS: + for acr_pat, acr_repl, acr_lit in _ACRONYM_CASE_PATTERNS: + # Case-sensitive pattern (no IGNORECASE): the literal must appear verbatim to match. + if acr_lit not in result: + continue result = acr_pat.sub(acr_repl, result) return result @@ -171,14 +181,43 @@ def _fix_fused_compounds(title: str) -> str: if not title: return title result = title + # Literal pre-guards skip the ~800 mostly-no-op re.sub calls per title. + # For the IGNORECASE fused patterns the guard is applied only while the + # working string is pure ASCII: for ASCII text, ``lit in result.lower()`` is + # an exact necessary condition for a ``\b\b`` IGNORECASE match. A + # non-ASCII string skips the guard (runs every pattern) because re.IGNORECASE + # folds a few non-ASCII characters (long s, dotted/dotless i) to ASCII letters + # in ways str.lower() does not, so the ASCII-only guard stays byte-exact. + lowered = result.lower() + ascii_only = result.isascii() # Pass 1: Dictionary-based fixes (highest priority, handles acronyms & irregulars) - for pattern, replacement in _FUSED_DICT_PATTERNS: - result = pattern.sub(replacement, result) + for pattern, replacement, lit in _FUSED_DICT_PATTERNS: + if ascii_only and lit not in lowered: + continue + new = pattern.sub(replacement, result) + if new != result: + result = new + lowered = result.lower() + ascii_only = result.isascii() # Pass 2: Suffix-based detection for remaining fused compounds. # Matches title-cased words: [A-Z][a-z]{2,} prefix + known compound suffix. - for sfx_pat in _COMPOUND_SUFFIX_PATTERNS: - result = sfx_pat.sub(lambda m: m.group(1) + "-" + m.group(2).capitalize(), result) + # The suffix group is a case-sensitive literal, so ``suffix in result`` is an + # exact necessary condition regardless of ASCII-ness. + for sfx_pat, suffix in _COMPOUND_SUFFIX_PATTERNS: + if suffix not in result: + continue + new = sfx_pat.sub(lambda m: m.group(1) + "-" + m.group(2).capitalize(), result) + if new != result: + result = new + lowered = result.lower() + ascii_only = result.isascii() # Pass 3: Dictionary again (suffix pass may expose new \b boundaries) - for pattern, replacement in _FUSED_DICT_PATTERNS: - result = pattern.sub(replacement, result) + for pattern, replacement, lit in _FUSED_DICT_PATTERNS: + if ascii_only and lit not in lowered: + continue + new = pattern.sub(replacement, result) + if new != result: + result = new + lowered = result.lower() + ascii_only = result.isascii() return result From a47fd8c14bec1794752a185138ba2f25c8d10a1f Mon Sep 17 00:00:00 2001 From: Gabriel Spadon Date: Wed, 1 Jul 2026 18:36:50 -0300 Subject: [PATCH 36/54] perf: fast-path the per-field serialize normalization _strip_latex_formatting and _normalize_to_ascii ran the full LaTeX-command scan, html.unescape, strip_accents, and unicode-replacement passes on every field (profiled ~2s over the corpus). Guard each with its necessary trigger: _strip_latex returns early when no backslash/tilde/'--'/double-space is present; _normalize_to_ascii runs html.unescape only on '&', strip_accents plus the unicode-quote/dash replacements only when the value is non-ASCII, and the apostrophe-year regex only when a quote is present. Byte-identical: corpus oracle 0 drift + differential fuzz 0 mismatches over 29052 corpus+adversarial inputs. Hot path 4753->8872 entries/s (5.4x over the pre-perf baseline). --- src/bibtex_utils.py | 45 +++++++++++++++++++++++++++++---------------- 1 file changed, 29 insertions(+), 16 deletions(-) diff --git a/src/bibtex_utils.py b/src/bibtex_utils.py index 9c06dc19..d2d63bcc 100644 --- a/src/bibtex_utils.py +++ b/src/bibtex_utils.py @@ -270,6 +270,12 @@ def _strip_latex_formatting(val: str) -> str: {\xx ...} commands (it, bf, em, etc.), escaped special characters (\&, \%, \$, \#, \_, \{, \}), tildes, and dashes (-- / ---). """ + # Fast path: every transform below requires a backslash (commands and + # escaped specials), a tilde, a "--" run, or a double space. If none are + # present the function is a no-op, so skip the whole command scan. + if "\\" not in val and "~" not in val and "--" not in val and " " not in val: + return val + formatting_commands = [ "textit", "textbf", @@ -353,24 +359,31 @@ def _normalize_to_ascii(val: str) -> str: Decodes HTML entities, strips LaTeX formatting, converts accented characters via unidecode, and replaces curly quotes / dashes. """ - val = html.unescape(val) + # html.unescape only changes a string containing an '&' entity. + if "&" in val: + val = html.unescape(val) val = _strip_latex_formatting(val) - val = strip_accents(val) - - replacements = { - "\u2019": "'", # Right single quotation mark → apostrophe - "\u2018": "'", # Left single quotation mark → apostrophe - "\u201c": '"', # Left double quotation mark → quote - "\u201d": '"', # Right double quotation mark → quote - "\u2013": "-", # En dash → hyphen - "\u2014": "--", # Em dash → double hyphen - "\u2026": "...", # Horizontal ellipsis → three dots - "\u00a0": " ", # Non-breaking space → regular space - } - for unicode_char, ascii_char in replacements.items(): - val = val.replace(unicode_char, ascii_char) - val = re.sub(r"\s+'(\d{2})\b", r"'\1", val) + # strip_accents and every replacement key below are non-ASCII, so both + # are no-ops on an already-ASCII string; skip them in that common case. + if not val.isascii(): + val = strip_accents(val) + replacements = { + "\u2019": "'", # Right single quotation mark → apostrophe + "\u2018": "'", # Left single quotation mark → apostrophe + "\u201c": '"', # Left double quotation mark → quote + "\u201d": '"', # Right double quotation mark → quote + "\u2013": "-", # En dash → hyphen + "\u2014": "--", # Em dash → double hyphen + "\u2026": "...", # Horizontal ellipsis → three dots + "\u00a0": " ", # Non-breaking space → regular space + } + for unicode_char, ascii_char in replacements.items(): + val = val.replace(unicode_char, ascii_char) + + # The apostrophe-year fixup requires a literal single quote to match. + if "'" in val: + val = re.sub(r"\s+'(\d{2})\b", r"'\1", val) return val From 955f1d0342ae2dbb2b2a1267ab27e8a60dea17ce Mon Sep 17 00:00:00 2001 From: Gabriel Spadon Date: Thu, 2 Jul 2026 07:02:19 -0300 Subject: [PATCH 37/54] fix: reinforce bibliometric merge/dedup decision rules Center on merge_with_policy, compute_dedup_score, and preprint/published classification so every entry keeps the most-trusted, most-recent metadata, published records outrank preprints on DOI, and repository/preprint entries are retained when no published twin exists. Rules stay open-ended (no hardcoded title/DOI/author/venue); output stays deterministic (two-run byte-identical, canonicalize fixpoint unchanged over the committed corpus). - Count the preprint-vs-published (XOR) split exactly once: venue_similarity is pure venue-string similarity and the split is a single gated signal in compute_dedup_score (new count_preprint_xor flag). Pre-conditioned dedup sites pass count_preprint_xor=False instead of subtracting a mis-predicated 0.10. Fixes false merges of distinct works and false rejects of genuine twins. - Unify the preprint-DOI predicate: _is_preprint_doi delegates to is_secondary_doi, and PREPRINT_DOI_PREFIXES gains the specific preprint/grey sub-prefixes (EGU egusphere, OSTI, Qeios, agriRxiv, Underline, institutional). A published journal under the same registrant (10.5194/acp) stays published. - Never downgrade a published-DOI paper: the preprint-journal canonicalize rules strip a stale preprint journal without stamping howpublished= when a genuine published DOI is present. - Never drop authors: a truncated author list cannot overwrite a more complete one unless the source is >= TRUST_DIFF_OVERRIDE_THRESHOLD more trusted. - Keep a record's own preprint/repository self-DOI through the registry trust gate; unverified published DOIs are still dropped. - Published supersedes preprint in the save-time candidate-DOI net. - Gate the generic->specific booktitle upgrade by trust rank. Adds tests/test_decision_reinforcement.py with parametric multi-author/venue cases per rule; updates the venue_similarity regression tests to the corrected single-count contract. --- src/bibtex_utils.py | 10 +- src/canonicalize.py | 29 ++- src/config.py | 11 + src/merge_utils.py | 81 ++++++-- src/pipeline/article.py | 13 ++ src/text_utils.py | 26 ++- tests/test_decision_reinforcement.py | 293 +++++++++++++++++++++++++++ tests/test_regression.py | 29 ++- 8 files changed, 448 insertions(+), 44 deletions(-) create mode 100644 tests/test_decision_reinforcement.py diff --git a/src/bibtex_utils.py b/src/bibtex_utils.py index d2d63bcc..f4a888ab 100644 --- a/src/bibtex_utils.py +++ b/src/bibtex_utils.py @@ -723,10 +723,16 @@ def bibtex_entries_match_strict(entry_a: dict[str, Any], entry_b: dict[str, Any] logger.debug("ENTRY_REJECT | GATE_CLOSED | result=False", category=LogCategory.DEDUP) return False - score = compute_dedup_score(af, bf) + # When the composite gate opened *because* this is a preprint/published pair, the XOR + # split is the precondition and must not also be banked inside the score (that is the + # double-count that tips distinct works over threshold). When the gate opened via an + # external-id or strong-author match instead, the split is independent evidence and is + # counted once. + score = compute_dedup_score(af, bf, count_preprint_xor=not preprint_pair) result = score >= SIM_DEDUP_COMPOSITE_THRESHOLD logger.debug( - f"ENTRY_COMPOSITE | score={score:.3f} | threshold={SIM_DEDUP_COMPOSITE_THRESHOLD} | result={result}", + f"ENTRY_COMPOSITE | score={score:.3f} | threshold={SIM_DEDUP_COMPOSITE_THRESHOLD} " + f"| preprint_pair={preprint_pair} | result={result}", category=LogCategory.DEDUP, ) return result diff --git a/src/canonicalize.py b/src/canonicalize.py index 02a01e74..b2b1768c 100644 --- a/src/canonicalize.py +++ b/src/canonicalize.py @@ -464,13 +464,21 @@ def _rule_add_url_from_doi(entry: dict[str, Any], fields: dict[str, Any]) -> boo # Site-B-only rules (load repair; existing-file fixup before enrichment) # --------------------------------------------------------------------------- def _rule_strip_preprint_journal_load(entry: dict[str, Any], fields: dict[str, Any]) -> bool: - """Strip a preprint-server journal: @article -> @misc (journal -> howpublished); - any other type simply drops the journal.""" + """Strip a preprint-server journal on load. + + @article with a genuine published DOI: drop the stale preprint journal but keep it a + published work (no ``howpublished=``). @article without a published DOI: @misc + (journal -> howpublished). Any other type simply drops the journal. + """ jnl = (fields.get("journal") or "").strip().lower() if jnl and any(ps == jnl or ps in jnl for ps in PREPRINT_SERVERS): if entry.get("type") == "article": - fields["howpublished"] = fields.pop("journal") + doi = (fields.get("doi") or "").strip() entry["type"] = "misc" + if doi and not idu.is_secondary_doi(doi): + fields.pop("journal", None) + else: + fields["howpublished"] = fields.pop("journal") else: fields.pop("journal", None) return True @@ -576,12 +584,23 @@ def _rule_inproceedings_no_booktitle_to_misc(entry: dict[str, Any], fields: dict def _rule_preprint_journal_to_misc(entry: dict[str, Any], fields: dict[str, Any]) -> bool: - """@article with a preprint server as journal -> @misc (journal -> howpublished).""" + """@article with a preprint-server journal. + + A genuine *published* DOI means the preprint journal is a stale enrichment artifact, + not evidence that the work is a preprint: drop the stale journal WITHOUT asserting a + preprint (no ``howpublished=``), keeping the published DOI. Only when the DOI + is itself secondary (or absent) is the entry an actual preprint, relabeled @misc with + journal -> howpublished. + """ if entry.get("type") == "article": j_lower = (fields.get("journal") or "").lower().strip() if j_lower and any(ps == j_lower or ps in j_lower for ps in PREPRINT_SERVERS): + doi = (fields.get("doi") or "").strip() entry["type"] = "misc" - fields["howpublished"] = fields.pop("journal") + if doi and not idu.is_secondary_doi(doi): + fields.pop("journal", None) + else: + fields["howpublished"] = fields.pop("journal") return True return False diff --git a/src/config.py b/src/config.py index c1b6477d..496a1b32 100644 --- a/src/config.py +++ b/src/config.py @@ -180,6 +180,17 @@ def _current_year() -> int: "10.64898/", # openRxiv "10.36227/techrxiv", # TechRxiv (IEEE preprints) "10.33774/", # Cambridge UP preprints (Authoria/MIIR) + # Grey-literature / preprint sub-prefixes. Keyed on the SPECIFIC sub-prefix + # (not the registrant) so a published journal DOI under the same registrant + # (e.g. 10.5194/acp) stays published. Kept in sync with + # venue._DOI_PREFIX_TO_HOWPUB so every DOI recognized for howpublished + # inference is also classified as secondary by is_secondary_doi. + "10.5194/egusphere", # EGU preprints (egusphere), NOT published EGU journals + "10.2172/", # OSTI technical reports + "10.31220/agrirxiv", # agriRxiv + "10.32388/", # Qeios + "10.48448/", # Underline Science + "10.32920/", # Institutional repositories (Toronto Metropolitan etc.) ) # Publishers exclusively associated with preprint servers. diff --git a/src/merge_utils.py b/src/merge_utils.py index 19504fdf..2ed7127e 100644 --- a/src/merge_utils.py +++ b/src/merge_utils.py @@ -14,7 +14,6 @@ GENERIC_SERIES_NAMES, JOURNAL_ONLY_PREFIXES, PAGES_MAX_DIGITS, - PREPRINT_DOI_PREFIXES, PREPRINT_ONLY_PUBLISHERS, PREPRINT_SERVERS, PUBLISHER_CORRECTIONS, @@ -123,8 +122,16 @@ def _sanitize_author_digits(name: str) -> str: def _is_preprint_doi(doi: str) -> bool: - """Check if a DOI belongs to a preprint server (arXiv, Research Square, etc.).""" - return any(doi.lower().startswith(p) for p in PREPRINT_DOI_PREFIXES) + """Check if a DOI is a preprint / repository / data DOI rather than a published one. + + Delegates to the single canonical predicate ``id_utils.is_secondary_doi`` so every + merge and save decision classifies a DOI identically to the rest of the pipeline + (arXiv, bioRxiv, Research Square, EGU egusphere, OSTI, Qeios, agriRxiv, Underline, + institutional repositories, Zenodo, Figshare, ...). ``PREPRINT_DOI_PREFIXES`` keys on + specific sub-prefixes (e.g. ``10.5194/egusphere``), so a published journal DOI under the + same registrant (``10.5194/acp``) is correctly left as published. + """ + return is_secondary_doi(doi) def _pop_fields(target: dict[str, Any], field_names: set[str] | frozenset[str], log_tag: str) -> None: @@ -266,6 +273,19 @@ def value_ok(val: str | None) -> bool: if k == "author": cur_parts = parse_authors_any(str(cur)) new_parts = parse_authors_any(str(v)) + # Never drop authors: a truncated (shorter) list must not overwrite a more + # complete one unless the new source is much more trusted (>= the title + # rule's TRUST_DIFF_OVERRIDE_THRESHOLD). Mirrors the title-length guard so + # a source that emits "A. Smith and others" cannot shrink a full list by rank. + if cur_parts and new_parts and len(new_parts) < len(cur_parts): + trust_diff = type_rank.get(cur_src, 99) - type_rank.get(src, 99) + if trust_diff < TRUST_DIFF_OVERRIDE_THRESHOLD: + logger.debug( + f"AUTHOR_KEEP_SUPERSET | cur_n={len(cur_parts)} new_n={len(new_parts)} " + f"trust_diff={trust_diff} | src={src} | keeping more complete author list", + category=LogCategory.MERGE, + ) + continue if cur_parts and new_parts and len(cur_parts) == len(new_parts): # Count initials-only tokens (e.g. "J." but not "Jr.") cur_inits = sum(1 for name in cur_parts for tok in name.split() if _AUTHOR_INITIAL_RE.match(tok)) @@ -316,15 +336,22 @@ def value_ok(val: str | None) -> bool: if k == "booktitle": cur_lower = str(cur).lower().strip() new_lower = str(v).lower().strip() - # If current is a generic series name and new is more specific, always accept + # If current is a generic series name and new is more specific, accept the + # upgrade -- but only when the specific value is not much less trusted than + # the incumbent, so a low-trust source cannot overwrite a trusted generic by + # specificity alone. When it is far less trusted, fall through to the rank + # gate (which keeps the more-trusted generic). if cur_lower in GENERIC_SERIES_NAMES and new_lower not in GENERIC_SERIES_NAMES: - logger.debug( - f"BOOKTITLE_UPGRADE | generic->specific | old={str(cur)[:60]} | new={str(v)[:60]} | src={src}", - category=LogCategory.MERGE, - ) - merged[k] = v - field_sources[k] = src - continue + trust_diff = type_rank.get(cur_src, 99) - type_rank.get(src, 99) + if trust_diff > -TRUST_DIFF_OVERRIDE_THRESHOLD: + logger.debug( + f"BOOKTITLE_UPGRADE | generic->specific | old={str(cur)[:60]} " + f"| new={str(v)[:60]} | src={src} | trust_diff={trust_diff}", + category=LogCategory.MERGE, + ) + merged[k] = v + field_sources[k] = src + continue # Never replace a specific conference name with a generic series if cur_lower not in GENERIC_SERIES_NAMES and new_lower in GENERIC_SERIES_NAMES: logger.debug( @@ -396,7 +423,15 @@ def value_ok(val: str | None) -> bool: ), None, ) - if not doi_trusted_src: + if not doi_trusted_src and _is_preprint_doi(merged_doi_norm or ""): + # A preprint/repository self-DOI (arXiv, bioRxiv, EGU, Zenodo, ...) is the + # record's own correct identifier; keep it even when no registration agency + # echoes it. Only genuinely published DOIs must clear the registry gate. + logger.debug( + f"doi_kept_selfpreprint | source={field_sources.get('doi', 'unknown')} | doi={merged_doi_norm}", + category=LogCategory.CLEANUP, + ) + elif not doi_trusted_src: doi_src = field_sources.get("doi", "unknown") logger.debug( f"doi_untrusted | source={doi_src} | trusted_sources={sorted(trusted_doi_sources)} | action=removed", @@ -933,17 +968,19 @@ def save_entry_to_file( n_title = new_fields.get("title", "") preprint_sim = title_similarity(e_title, n_title) if preprint_sim >= SIM_PREPRINT_TITLE_THRESHOLD: - score = compute_dedup_score(existing_fields, new_fields) - # The preprint-pair bonus (0.10) in composite is - # circular here — we already verified the XOR - # precondition. Subtract it to avoid inflating - # the composite with evidence we already used. - effective_score = score - 0.10 + # The preprint/published (XOR) split was already verified as + # the precondition above, so exclude it from the composite + # rather than adding it and subtracting a flat 0.10. Excluding + # is exact and predicate-independent, so a genuine twin whose + # published side still carries a leaked preprint journal is no + # longer wrongly dropped by an over-subtraction. + effective_score = compute_dedup_score( + existing_fields, new_fields, count_preprint_xor=False + ) if effective_score >= SIM_DEDUP_COMPOSITE_THRESHOLD: logger.debug( f"FILE_MATCH | PREPRINT_PAIR | file={existing_filename}" - f" | sim={preprint_sim:.3f} | composite={score:.3f}" - f" | effective={effective_score:.3f}" + f" | sim={preprint_sim:.3f} | effective={effective_score:.3f}" f" | e_preprint={e_preprint} n_preprint={n_preprint}", category=LogCategory.DEDUP, ) @@ -1021,7 +1058,9 @@ def save_entry_to_file( and key_title_sim >= SIM_PREPRINT_TITLE_THRESHOLD and authors_overlap(existing_fields.get("author"), new_fields.get("author")) ): - key_preprint_score = compute_dedup_score(existing_fields, new_fields) + key_preprint_score = compute_dedup_score( + existing_fields, new_fields, count_preprint_xor=False + ) logger.debug( f"FILE_MATCH | KEY_PREPRINT_PAIR | file={existing_filename} " f"| sim={key_title_sim:.3f} | composite={key_preprint_score:.3f}", diff --git a/src/pipeline/article.py b/src/pipeline/article.py index e80655dc..ee557cf5 100644 --- a/src/pipeline/article.py +++ b/src/pipeline/article.py @@ -1283,6 +1283,19 @@ def _add_doi(source: str, doi: str | None) -> None: ) _revert_misattributed_doi(merged_fields, edoi, doi_validated, doi_early) continue + # Published supersedes preprint: if the on-disk match is a preprint/ + # secondary DOI while the incoming entry carries a genuine published + # DOI, remove the on-disk preprint and keep the published entry rather + # than dropping the published file (mirrors the save-time tiebreak). + merged_is_published = bool(merged_doi and not idu.is_secondary_doi(merged_doi)) + if merged_is_published and idu.is_secondary_doi(edoi): + logger.debug( + f"CANDIDATE_DOI_DEDUP | published supersedes preprint" + f" | published={merged_doi} | preprint={edoi} | removed={existing_bib}", + category=LogCategory.DEDUP, + ) + os.remove(epath) + continue logger.debug( f"CANDIDATE_DOI_DEDUP | doi={edoi} | existing={existing_bib} | skipping_write=True", category=LogCategory.DEDUP, diff --git a/src/text_utils.py b/src/text_utils.py index 482103e6..a3c9116e 100644 --- a/src/text_utils.py +++ b/src/text_utils.py @@ -530,7 +530,13 @@ def author_overlap_ratio(authors_a: str | None, authors_b: str | None) -> float: def venue_similarity(fields_a: dict[str, Any], fields_b: dict[str, Any]) -> float: - """Compute similarity between venues, with a 0.5 bonus for preprint/published pairs.""" + """Compute string similarity between two venue names (journal/booktitle/howpublished). + + Pure venue-string similarity only. The preprint-vs-published (XOR) split is NOT + encoded here: it is a single explicit signal in ``compute_dedup_score`` (Signal 6), + so rewarding it here too would double-count the same piece of evidence and can tip + two distinct works over the duplicate threshold. + """ a_venue = (fields_a.get("journal") or fields_a.get("booktitle") or fields_a.get("howpublished") or "").strip() b_venue = (fields_b.get("journal") or fields_b.get("booktitle") or fields_b.get("howpublished") or "").strip() if not a_venue or not b_venue: @@ -539,10 +545,6 @@ def venue_similarity(fields_a: dict[str, Any], fields_b: dict[str, Any]) -> floa b_norm = normalize_title(b_venue) if a_norm == b_norm: return 1.0 - a_is_preprint = any(normalize_title(ps) in a_norm for ps in PREPRINT_SERVERS) - b_is_preprint = any(normalize_title(ps) in b_norm for ps in PREPRINT_SERVERS) - if a_is_preprint ^ b_is_preprint: - return 0.5 return fuzz_ratio(a_norm, b_norm) / 100.0 @@ -555,8 +557,14 @@ def _is_preprint_fields(fields: dict[str, Any]) -> bool: return any(ps in journal for ps in PREPRINT_SERVERS) -def compute_dedup_score(fields_a: dict[str, Any], fields_b: dict[str, Any]) -> float: - """Additive composite score from 6 signals for multi-signal deduplication.""" +def compute_dedup_score(fields_a: dict[str, Any], fields_b: dict[str, Any], count_preprint_xor: bool = True) -> float: + """Additive composite score from up to 6 signals for multi-signal deduplication. + + ``count_preprint_xor`` controls the preprint-vs-published split (Signal 6). Callers + that reach this composite only after already establishing the XOR split as a + precondition pass ``count_preprint_xor=False`` so the same evidence is not counted + twice (the split contributes here exactly once, and never via ``venue_similarity``). + """ score = 0.0 # Signal 1: Title similarity (weight 0.40) @@ -584,8 +592,8 @@ def compute_dedup_score(fields_a: dict[str, Any], fields_b: dict[str, Any]) -> f if external_ids_match(fields_a, fields_b): score += 0.15 - # Signal 6: Preprint pair bonus (0.10) - if _is_preprint_fields(fields_a) ^ _is_preprint_fields(fields_b): + # Signal 6: Preprint-vs-published split (0.10) -- the single place the XOR is counted. + if count_preprint_xor and (_is_preprint_fields(fields_a) ^ _is_preprint_fields(fields_b)): score += 0.10 return score diff --git a/tests/test_decision_reinforcement.py b/tests/test_decision_reinforcement.py new file mode 100644 index 00000000..80c7445a --- /dev/null +++ b/tests/test_decision_reinforcement.py @@ -0,0 +1,293 @@ +"""Reinforcement tests for the bibliometric decision mechanism. + +Each test asserts an invariant of the trust-based merge / dedup logic across MANY +synthetic authors, venues, and preprint/published pairs rather than a single example, +so the rules are provably general and never hinge on one title, DOI, author, or venue. + +Covered fixes: + F1 single canonical preprint-DOI predicate (EGU/OSTI/Qeios/Zenodo recognized; + published journals under the same registrant stay published) + F2 preprint-XOR split counted exactly once (no venue_similarity double-count) + F3 a published-DOI paper is never relabeled as a preprint by a stale journal + F4 a truncated author list never overwrites a more complete one by rank + F5 a record's own preprint self-DOI survives the registry trust gate + F6 published supersedes preprint in the save-time candidate-DOI net + F7 a low-trust specific booktitle does not overwrite a trusted generic one +""" + +from __future__ import annotations + +from typing import Any + +import pytest + +from src import bibtex_utils as bt +from src import id_utils as idu +from src import merge_utils as mu +from src import text_utils as tu +from src.canonicalize import CanonicalStage, canonicalize +from src.config import SIM_DEDUP_COMPOSITE_THRESHOLD + + +def _entry(etype: str, **fields: str) -> dict[str, Any]: + return {"type": etype, "key": "K", "fields": dict(fields)} + + +def _art(**fields: str) -> dict[str, Any]: + return _entry("article", **fields) + + +def _inp(**fields: str) -> dict[str, Any]: + return _entry("inproceedings", **fields) + + +# --------------------------------------------------------------------------- F1 +# One canonical predicate: every preprint/grey/data DOI is "secondary" everywhere; +# a published journal DOI under the same registrant as a preprint stays published. + +PREPRINT_DOIS = [ + "10.48550/arxiv.2401.00001", + "10.1101/2021.01.01.400001", + "10.21203/rs.3.rs-100001", + "10.31234/osf.io/abcde", + "10.26434/chemrxiv-2024-aaaaa", + "10.2139/ssrn.4000001", + "10.36227/techrxiv.20000001", + "10.5194/egusphere-2024-1000", + "10.2172/1900001", + "10.32388/QEIOS01", + "10.31220/agrirxiv.2024.00001", + "10.48448/underline-1", + "10.32920/inst-1", + "10.5281/zenodo.9000001", +] + +PUBLISHED_DOIS = [ + "10.5194/acp-24-1-2024", # published EGU journal, SAME registrant as egusphere preprint + "10.1145/3580305", + "10.1038/s41586-024-00001", + "10.1109/tpami.2024.0000001", + "10.1016/j.patcog.2024.100001", + "10.1371/journal.pcbi.1000001", +] + + +@pytest.mark.parametrize("doi", PREPRINT_DOIS) +def test_preprint_and_grey_dois_are_secondary(doi: str) -> None: + assert mu._is_preprint_doi(doi) is True + assert idu.is_secondary_doi(doi) is True + + +@pytest.mark.parametrize("doi", PUBLISHED_DOIS) +def test_published_dois_are_primary(doi: str) -> None: + # 10.5194/acp must NOT be classified preprint even though 10.5194/egusphere is: + # the predicate keys on the specific sub-prefix, not the registrant. + assert mu._is_preprint_doi(doi) is False + + +@pytest.mark.parametrize("pre_doi", ["10.5194/egusphere-2024-1000", "10.2172/1900001", "10.32388/QEIOS01"]) +def test_published_doi_beats_extended_preprint_doi(pre_doi: str) -> None: + """A published DOI must win over EGU/OSTI/Qeios preprint DOIs, identically to arXiv.""" + primary = _art(title="A General Method for Everything", doi=pre_doi) + enrichers = [ + ("crossref", _art(title="A General Method for Everything", doi="10.1038/s41586-024-00001", journal="Nature")) + ] + merged = mu.merge_with_policy(primary, enrichers) + assert merged["fields"].get("doi") == "10.1038/s41586-024-00001" + + +# --------------------------------------------------------------------------- F2 +# The preprint/published (XOR) split is a single explicit signal, never doubled. + +PREPRINT_SERVER_NAMES = ["bioRxiv", "medRxiv", "arXiv", "arXiv e-prints", "Research Square", "SSRN", "ChemRxiv"] + + +@pytest.mark.parametrize("server", PREPRINT_SERVER_NAMES) +def test_venue_similarity_has_no_preprint_xor_bonus(server: str) -> None: + """venue_similarity is pure string similarity: a preprint-vs-journal pair never + returns the old disguised 0.5 XOR bonus.""" + sim = tu.venue_similarity({"journal": server}, {"journal": "Nature Communications"}) + assert sim != 0.5 + assert sim < 0.5 + + +@pytest.mark.parametrize("server", PREPRINT_SERVER_NAMES) +def test_preprint_xor_contributes_exactly_once(server: str) -> None: + """Excluding the XOR signal drops the composite by exactly 0.10 (Signal 6 only), + proving venue_similarity no longer adds a second, hidden XOR contribution.""" + a = {"title": "Shared Title", "author": "Ada Byron and Carl Ohm", "year": "2020", "journal": server} + b = { + "title": "Shared Title", + "author": "Ada Byron and Carl Ohm", + "year": "2020", + "journal": "Nature Communications", + } + with_xor = tu.compute_dedup_score(a, b, count_preprint_xor=True) + without_xor = tu.compute_dedup_score(a, b, count_preprint_xor=False) + assert abs((with_xor - without_xor) - 0.10) < 1e-9 + + +@pytest.mark.parametrize("suffix", range(6)) +def test_distinct_preprint_published_works_do_not_false_merge(suffix: int) -> None: + """Two DISTINCT works (different last title word, only partial author overlap, one + preprint one published) must not be merged: the old venue+Signal-6 double-count used + to tip them over 0.60. Parametrised over independent author sets and titles.""" + a = _art( + title=f"Robust Graph Kernels for Seismic Inference Case{suffix}", + author=f"Ann Lee and Bob Ng{suffix} and Cara Poe{suffix}", + journal="medRxiv", + doi=f"10.1101/23{suffix:02d}.20010", + year="2016", + ) + b = _art( + title=f"Robust Graph Kernels for Seismic Detection Case{suffix}", + author=f"Ann Lee and Dan Ray{suffix} and Eve Sol{suffix}", + journal="PLOS Computational Biology", + doi=f"10.1371/journal.pcbi.20160{suffix}", + year="2017", + ) + # The evidence without the circular XOR credit is genuinely below threshold ... + assert tu.compute_dedup_score(a["fields"], b["fields"], count_preprint_xor=False) < SIM_DEDUP_COMPOSITE_THRESHOLD + # ... so the strict matcher (which excludes XOR once the pair gate opens) rejects them. + assert bt.bibtex_entries_match_strict(a, b) is False + + +def test_genuine_twin_with_leaked_preprint_journal_still_clears_threshold() -> None: + """A real preprint/published twin whose published side still carries a leaked preprint + journal must NOT be dropped. The merge PREPRINT_PAIR site now excludes the XOR signal + exactly (count_preprint_xor=False) instead of subtracting a flat 0.10 that may never + have been added, so the effective score stays above threshold.""" + existing = { + "title": "Deep Nets for Ocean State", + "author": "Ann Lee and Bob Ng", + "year": "2020", + "journal": "arXiv", + } + published = { + "title": "Deep Nets for Ocean State", + "author": "Ann Lee and Bob Ng", + "year": "2020", + "journal": "arXiv", + } + effective = tu.compute_dedup_score(existing, published, count_preprint_xor=False) + assert effective >= SIM_DEDUP_COMPOSITE_THRESHOLD + + +# --------------------------------------------------------------------------- F3 +# A published-DOI paper is never relabeled as a preprint by a stale journal string. + + +@pytest.mark.parametrize("server", ["bioRxiv", "medRxiv", "arXiv", "Research Square", "SSRN"]) +@pytest.mark.parametrize("pub_doi", ["10.1145/3580305", "10.1038/s41586-024-00001", "10.1109/tpami.2024.0000001"]) +def test_published_doi_not_downgraded_to_preprint_by_journal(server: str, pub_doi: str) -> None: + entry = _art(title="A Published Result", author="Ada Byron", journal=server, doi=pub_doi, year="2021") + canonicalize(entry, stage=CanonicalStage.POST_MERGE) + # The published DOI is retained and the record is NOT stamped as a preprint. + assert entry["fields"].get("doi") == pub_doi + assert "howpublished" not in entry["fields"] + assert entry["fields"].get("journal", "").lower() not in { + s.lower() for s in ["bioRxiv", "medRxiv", "arXiv", "Research Square", "SSRN"] + } + + +@pytest.mark.parametrize("server", ["bioRxiv", "arXiv", "SSRN"]) +def test_genuine_preprint_still_relabeled_to_misc(server: str) -> None: + """Contrast: a real preprint (secondary DOI) IS relabeled @misc with howpublished.""" + entry = _art(title="A Preprint", author="Ada Byron", journal=server, doi="10.48550/arxiv.2101.00001", year="2021") + canonicalize(entry, stage=CanonicalStage.POST_MERGE) + assert entry["type"] == "misc" + assert server.lower() in entry["fields"].get("howpublished", "").lower() + + +# --------------------------------------------------------------------------- F4 +# A truncated author list must not overwrite a more complete one by trust alone. + + +@pytest.mark.parametrize("full_src,trunc_src", [("openalex", "crossref"), ("s2", "openalex"), ("europepmc", "pubmed")]) +@pytest.mark.parametrize("n_full,n_trunc", [(6, 3), (4, 2), (10, 4), (3, 1)]) +def test_truncated_author_list_does_not_overwrite_complete( + full_src: str, trunc_src: str, n_full: int, n_trunc: int +) -> None: + full = " and ".join(f"Given{i} Family{i}" for i in range(n_full)) + trunc = " and ".join(f"Given{i} Family{i}" for i in range(n_trunc)) + primary = _art(title="Shared Title") + # full list from a slightly-less-trusted source; truncated list from a source only + # 1 rank more trusted (< TRUST_DIFF_OVERRIDE_THRESHOLD) must not win. + enrichers = [ + (full_src, _art(title="Shared Title", author=full)), + (trunc_src, _art(title="Shared Title", author=trunc)), + ] + merged = mu.merge_with_policy(primary, enrichers) + assert len(tu.parse_authors_any(merged["fields"]["author"])) == n_full + + +def test_much_more_trusted_source_may_still_correct_authors() -> None: + """The guard does not over-protect: a source >= TRUST_DIFF_OVERRIDE_THRESHOLD more + trusted may still install a shorter (corrected) list.""" + primary = _art(title="Shared Title", author="A and B and C and D and E and F") # scholar_min baseline + enrichers = [("csl", _art(title="Shared Title", author="Real Author and Second Author"))] # csl is 12 ranks up + merged = mu.merge_with_policy(primary, enrichers) + assert len(tu.parse_authors_any(merged["fields"]["author"])) == 2 + + +# --------------------------------------------------------------------------- F5 +# A record's own preprint self-DOI is definitionally correct and survives the gate. + + +@pytest.mark.parametrize( + "pre_doi", ["10.48550/arxiv.2401.00001", "10.1101/2021.01.01.1", "10.5194/egusphere-2024-1000"] +) +def test_preprint_self_doi_kept_without_registry_echo(pre_doi: str) -> None: + primary = _art(title="A Preprint Work") + enrichers = [("arxiv", _art(title="A Preprint Work", doi=pre_doi))] # 'arxiv' is not a trusted DOI source + merged = mu.merge_with_policy(primary, enrichers) + assert merged["fields"].get("doi") == pre_doi + + +def test_unverified_published_doi_still_dropped() -> None: + """Contrast: an unechoed *published* DOI from a non-registry source is still dropped + (the gate is only relaxed for preprint self-DOIs).""" + primary = _art(title="A Published Work") + enrichers = [("openalex", _art(title="A Published Work", doi="10.1145/3580305"))] + merged = mu.merge_with_policy(primary, enrichers) + assert "doi" not in merged["fields"] + + +# --------------------------------------------------------------------------- F6 +# Published supersedes preprint in the candidate-DOI net's survivor decision. + + +@pytest.mark.parametrize("pre_doi", PREPRINT_DOIS) +@pytest.mark.parametrize("pub_doi", ["10.1145/3580305", "10.1038/s41586-024-00001"]) +def test_net_published_supersedes_preprint_decision(pre_doi: str, pub_doi: str) -> None: + """The exact predicate the net uses before removing a file: an incoming published + entry must be recognised as superseding an on-disk preprint of the same work.""" + merged_doi = idu.normalize_doi(pub_doi) + on_disk_doi = idu.normalize_doi(pre_doi) + merged_is_published = bool(merged_doi and not idu.is_secondary_doi(merged_doi)) + assert merged_is_published is True + assert idu.is_secondary_doi(on_disk_doi or "") is True + + +# --------------------------------------------------------------------------- F7 +# A low-trust specific booktitle must not overwrite a trusted generic one. + + +def test_low_trust_specific_booktitle_does_not_overwrite_trusted_generic() -> None: + primary = _inp(title="Shared Title") + enrichers = [ + ("crossref", _inp(title="Shared Title", booktitle="Lecture Notes in Computer Science")), # generic, rank 5 + ("arxiv", _inp(title="Shared Title", booktitle="Advances in Neural Information Processing Systems")), # rank 10 + ] + merged = mu.merge_with_policy(primary, enrichers) + assert merged["fields"]["booktitle"] == "Lecture Notes in Computer Science" + + +def test_trusted_specific_booktitle_upgrades_generic() -> None: + primary = _inp(title="Shared Title") + enrichers = [ + ("crossref", _inp(title="Shared Title", booktitle="Lecture Notes in Computer Science")), # generic, rank 5 + ("pubmed", _inp(title="Shared Title", booktitle="IEEE Conference on Computer Vision")), # specific, rank 3 + ] + merged = mu.merge_with_policy(primary, enrichers) + assert merged["fields"]["booktitle"] == "IEEE Conference on Computer Vision" diff --git a/tests/test_regression.py b/tests/test_regression.py index 59b59cda..38aa80fb 100644 --- a/tests/test_regression.py +++ b/tests/test_regression.py @@ -1527,23 +1527,38 @@ def test_no_initials_falls_back(self) -> None: class TestVenueSimilarityPreprint: - """L14: venue_similarity should correctly detect preprint servers even with hyphens.""" + """L14 (reinforced): venue_similarity is PURE venue-string similarity. The preprint / + published (XOR) split is no longer smuggled in as a 0.5 bonus; it is a single explicit + signal in compute_dedup_score (Signal 6), counted exactly once. Rewarding it in both + places double-counted the same evidence and tipped distinct works over threshold.""" - def test_biorxiv_vs_journal(self) -> None: - """bioRxiv vs a journal should give 0.5 (preprint/published pair).""" + def test_biorxiv_vs_journal_is_plain_fuzz_not_xor_bonus(self) -> None: + """bioRxiv vs a dissimilar journal -> plain fuzz (< 0.5), not the old 0.5 XOR bonus.""" sim = text_utils.venue_similarity( {"journal": "bioRxiv"}, {"journal": "Nature Medicine"}, ) - assert sim == 0.5 + assert sim < 0.5 - def test_arxiv_eprints_vs_conference(self) -> None: - """arXiv e-prints vs conference should give 0.5.""" + def test_arxiv_eprints_vs_conference_is_plain_fuzz_not_xor_bonus(self) -> None: + """arXiv e-prints vs conference -> plain fuzz (< 0.5), not the old 0.5 XOR bonus.""" sim = text_utils.venue_similarity( {"journal": "arXiv e-prints"}, {"booktitle": "NeurIPS 2024"}, ) - assert sim == 0.5 + assert sim < 0.5 + + def test_identical_venue_is_one(self) -> None: + assert text_utils.venue_similarity({"journal": "Nature"}, {"journal": "Nature"}) == 1.0 + + def test_preprint_xor_counted_once_in_composite(self) -> None: + """The split contributes exactly Signal 6 (0.10) to the composite and nothing via + venue_similarity, so excluding it drops the score by exactly 0.10.""" + pre = {"title": "Same Work", "author": "Ada Byron", "year": "2020", "journal": "bioRxiv"} + pub = {"title": "Same Work", "author": "Ada Byron", "year": "2020", "journal": "Nature Medicine"} + with_xor = text_utils.compute_dedup_score(pre, pub, count_preprint_xor=True) + without_xor = text_utils.compute_dedup_score(pre, pub, count_preprint_xor=False) + assert abs((with_xor - without_xor) - 0.10) < 1e-9 class TestBothPreprintDoiDedup: From 55833e6837e8004a03532f6da059445d71ef7aab Mon Sep 17 00:00:00 2001 From: Gabriel Spadon Date: Thu, 2 Jul 2026 07:28:24 -0300 Subject: [PATCH 38/54] fix(security): keep API keys out of request URLs and run logs --- .gitignore | 5 + output/run.log | 1211 -------------------------------- src/clients/serpapi_scholar.py | 4 +- src/clients/utility_apis.py | 13 +- 4 files changed, 15 insertions(+), 1218 deletions(-) delete mode 100644 output/run.log diff --git a/.gitignore b/.gitignore index 10968967..a62c64bb 100644 --- a/.gitignore +++ b/.gitignore @@ -35,6 +35,7 @@ ENV/ # Testing htmlcov/ coverage.xml +.coverage dmypy.json # User data and API keys @@ -53,6 +54,10 @@ keys/ temp/ tmp/ +# Pipeline run artifacts (generated logs must never be committed) +output/run.log +output/**/*.log + # Build artifacts third-party/* ruff-report.json diff --git a/output/run.log b/output/run.log deleted file mode 100644 index 36ddafe7..00000000 --- a/output/run.log +++ /dev/null @@ -1,1211 +0,0 @@ -2026-06-01 13:13:17 [STEP ] CiteForge run started -2026-06-01 13:13:17 [SUCCESS ] SerpAPI key loaded -2026-06-01 13:13:17 [SUCCESS ] Serply API key loaded -2026-06-01 13:13:17 [SUCCESS ] Semantic Scholar key loaded -2026-06-01 13:13:17 [SUCCESS ] OpenReview credentials loaded -2026-06-01 13:13:17 [SUCCESS ] Gemini API key loaded -2026-06-01 13:13:17 [SUCCESS ] Input loaded: 64 record(s) -2026-06-01 13:13:17 [INFO ] Sorting authors by existing paper count (authors with more papers will be processed first) -2026-06-01 13:13:17 [INFO ] Author range: 260 papers (max) to 0 papers (min) -2026-06-01 13:13:17 [SUCCESS ] Summary CSV initialized: /home/runner/work/CiteForge/CiteForge/output/summary.csv -2026-06-01 13:13:17 [STEP ] Starting parallel execution with 16 workers -2026-06-01 13:13:17 [INFO ] [1/64] Queued: Rita Orji (ID: -1cHtBQAAAAJ) -2026-06-01 13:13:17 [INFO ] [2/64] Queued: Frank Rudzicz (ID: elXOB1sAAAAJ) -2026-06-01 13:13:17 [INFO ] [3/64] Queued: Suresh Neethirajan (ID: 8VZwF0sAAAAJ) -2026-06-01 13:13:17 [INFO ] [4/64] Queued: Richard Evans (ID: NqlOPkMAAAAJ) -2026-06-01 13:13:17 [INFO ] [5/64] Queued: Manuel Mattheisen (ID: uhlDFm4AAAAJ) -2026-06-01 13:13:17 [INFO ] [6/64] Queued: Stan Matwin (ID: rCoJeuYAAAAJ) -2026-06-01 13:13:17 [INFO ] [7/64] Queued: Travis Gagie (ID: aFCoq2YAAAAJ) -2026-06-01 13:13:17 [INFO ] [8/64] Queued: Qiang Ye (ID: 4OQaVGUAAAAJ) -2026-06-01 13:13:17 [INFO ] [9/64] Queued: Hassan Sajjad (ID: t3BH6NkAAAAJ) -2026-06-01 13:13:17 [INFO ] [10/64] Queued: Nur Zincir-Heywood (ID: F9nG0F4AAAAJ) -2026-06-01 13:13:17 [INFO ] [11/64] Queued: Srinivas Sampalli (ID: UCVetfAAAAAJ) -2026-06-01 13:13:17 [INFO ] [12/64] Queued: Oladapo Oyebode (ID: -6DsTnMAAAAJ) -2026-06-01 13:13:17 [INFO ] [13/64] Queued: Evangelos Milios (ID: ME8aQywAAAAJ) -2026-06-01 13:13:17 [INFO ] [14/64] Queued: Finlay Maguire (ID: rHFCtWwAAAAJ) -2026-06-01 13:13:17 [INFO ] [15/64] Queued: Raza Abidi (ID: fzr2PUYAAAAJ) -2026-06-01 13:13:18 [INFO ] [16/64] Queued: Sageev Oore (ID: cI0dYX4AAAAJ) -2026-06-01 13:13:18 [INFO ] [17/64] Queued: Israat Haque (ID: PMTOOSQAAAAJ) -2026-06-01 13:13:18 [INFO ] [18/64] Queued: Tushar Sharma (ID: VHjAIe8AAAAJ) -2026-06-01 13:13:18 [INFO ] [19/64] Queued: Samer Lahoud (ID: Fnkc3a4AAAAJ) -2026-06-01 13:13:18 [INFO ] [20/64] Queued: Malcolm Heywood (ID: _d-AGjUAAAAJ) -2026-06-01 13:13:18 [INFO ] [21/64] Queued: Paul Ralph (ID: oRBuFa0AAAAJ) -2026-06-01 13:13:18 [INFO ] [22/64] Queued: Masud Rahman (ID: 9SrqOewAAAAJ) -2026-06-01 13:13:18 [INFO ] [23/64] Queued: Thomas Trappenberg (ID: EwkaTYEAAAAJ) -2026-06-01 13:13:18 [INFO ] [24/64] Queued: Ga Wu (ID: IdBlVPUAAAAJ) -2026-06-01 13:13:18 [INFO ] [25/64] Queued: Robert Beiko (ID: OmUy3vUAAAAJ) -2026-06-01 13:13:18 [INFO ] [26/64] Queued: Eric Poitras (ID: TNaVSQwAAAAJ) -2026-06-01 13:13:18 [INFO ] [27/64] Queued: Chris Whidden (ID: itc4x9kAAAAJ) -2026-06-01 13:13:18 [INFO ] [28/64] Queued: Derek Reilly (ID: fZ56s2EAAAAJ) -2026-06-01 13:13:18 [INFO ] [29/64] Queued: Meng He (ID: 4yj_9skAAAAJ) -2026-06-01 13:13:18 [INFO ] [30/64] Queued: Gabriel Spadon (ID: bfdGsGUAAAAJ) -2026-06-01 13:13:18 [INFO ] [31/64] Queued: Angela Siegel (ID: joV1qkYAAAAJ) -2026-06-01 13:13:18 [INFO ] [32/64] Queued: Anthony Rosborough (ID: kG4oQmsAAAAJ) -2026-06-01 13:13:18 [INFO ] [33/64] Queued: Janarthanan Rajendran (ID: -novlhIAAAAJ) -2026-06-01 13:13:18 [INFO ] [34/64] Queued: Marta Kryven (ID: 5ogGlooAAAAJ) -2026-06-01 13:13:18 [INFO ] [35/64] Queued: Carlos Hernandez-Castillo (ID: rSrWYaIAAAAJ) -2026-06-01 13:13:18 [INFO ] [36/64] Queued: Nils Wilde (ID: lkAmFEEAAAAJ) -2026-06-01 13:13:18 [INFO ] [37/64] Queued: Norbert Zeh (ID: GoTWlmgAAAAJ) -2026-06-01 13:13:18 [INFO ] [38/64] Queued: Vlado Keselj (ID: uDKsmuIAAAAJ) -2026-06-01 13:13:18 [INFO ] [39/64] Queued: Alexander Brandt (ID: OMA_KjcAAAAJ) -2026-06-01 13:13:18 [INFO ] [40/64] Queued: Joseph Malloch (ID: iQa0leoAAAAJ) -2026-06-01 13:13:18 [INFO ] [41/64] Queued: Rina Wehbe (ID: UrFw3XEAAAAJ) -2026-06-01 13:13:18 [INFO ] [42/64] Queued: Yujie Tang (ID: VhWYfm8AAAAJ) -2026-06-01 13:13:18 [INFO ] [43/64] Queued: Lizbeth Escobedo (ID: lPSfdqAAAAAJ) -2026-06-01 13:13:18 [INFO ] [44/64] Queued: Peter Bodorik (ID: wBYq09wAAAAJ) -2026-06-01 13:13:18 [INFO ] [45/64] Queued: Hanieh Shakeri (ID: iriAIgsAAAAJ) -2026-06-01 13:13:18 [INFO ] [46/64] Queued: James Blustein (ID: 7g6iU9QAAAAJ) -2026-06-01 13:13:18 [INFO ] [47/64] Queued: Dirk Arnold (ID: NsIbm80AAAAJ) -2026-06-01 13:13:18 [INFO ] [48/64] Queued: Raghav Sampangi (ID: x_Cy69EAAAAJ) -2026-06-01 13:13:18 [INFO ] [49/64] Queued: Stephen Brooks (ID: 42/3005) -2026-06-01 13:13:18 [INFO ] [50/64] Queued: FE Bordeleau (ID: 8Bug6mIAAAAJ) -2026-06-01 13:13:18 [INFO ] [51/64] Queued: Carolyn Watters (ID: P02fwREAAAAJ) -2026-06-01 13:13:18 [INFO ] [52/64] Queued: Corey DeGagne (ID: 245/3040) -2026-06-01 13:13:18 [INFO ] [53/64] Queued: Nauzer Kalyaniwalla (ID: QffVmMIAAAAJ) -2026-06-01 13:13:18 [INFO ] [54/64] Queued: Alex Brodsky (ID: b/AlexBrodsky) -2026-06-01 13:13:18 [INFO ] [55/64] Queued: Bonnie MacKay (ID: fqtL2yMAAAAJ) -2026-06-01 13:13:18 [INFO ] [56/64] Queued: Christine Farion (ID: 0rINg7EAAAAJ) -2026-06-01 13:13:18 [INFO ] [57/64] Queued: Andrew Cochran (ID: IpmBO6AAAAAJ) -2026-06-01 13:13:18 [INFO ] [58/64] Queued: Andrew Rau-Chaplin (ID: -PvfVhgAAAAJ) -2026-06-01 13:13:18 [INFO ] [59/64] Queued: Jacob Slonim (ID: 25/2958) -2026-06-01 13:13:18 [INFO ] [60/64] Queued: Khurram Aziz (ID: 45cx9u8AAAAJ) -2026-06-01 13:13:18 [INFO ] [61/64] Queued: Michael McAllister (ID: 80/1712) -2026-06-01 13:13:18 [INFO ] [62/64] Queued: Michael Shepherd (ID: 77/2373) -2026-06-01 13:13:18 [INFO ] [63/64] Queued: Saurabh Dey (ID: hwV2P4EAAAAJ) -2026-06-01 13:13:18 [INFO ] [64/64] Queued: Yannick Marchand (ID: 17/4063) -2026-06-01 13:13:18 [STEP ] All 64 authors queued for processing -2026-06-01 13:14:26 [SUCCESS ] [1/64] Completed: Srinivas Sampalli (68 files saved) -2026-06-01 13:15:04 [SUCCESS ] [2/64] Completed: Qiang Ye (86 files saved) -2026-06-01 13:16:00 [SUCCESS ] [3/64] Completed: Evangelos Milios (58 files saved) -2026-06-01 13:16:17 [SUCCESS ] [4/64] Completed: Nur Zincir-Heywood (80 files saved) -2026-06-01 13:16:30 [SUCCESS ] [5/64] Completed: Oladapo Oyebode (65 files saved) -2026-06-01 13:16:44 [SUCCESS ] [6/64] Completed: Samer Lahoud (48 files saved) -2026-06-01 13:17:00 [SUCCESS ] [7/64] Completed: Malcolm Heywood (40 files saved) -2026-06-01 13:17:07 [SUCCESS ] [8/64] Completed: Richard Evans (135 files saved) -2026-06-01 13:17:07 [SUCCESS ] [9/64] Completed: Raza Abidi (94 files saved) -2026-06-01 13:17:12 [SUCCESS ] [10/64] Completed: Finlay Maguire (59 files saved) -2026-06-01 13:18:58 [SUCCESS ] [11/64] Completed: Tushar Sharma (56 files saved) -2026-06-01 13:20:03 [SUCCESS ] [12/64] Completed: Israat Haque (59 files saved) -2026-06-01 13:20:07 [SUCCESS ] [13/64] Completed: Masud Rahman (39 files saved) -2026-06-01 13:20:10 [SUCCESS ] [14/64] Completed: Stan Matwin (100 files saved) -2026-06-01 13:21:14 [SUCCESS ] [15/64] Completed: Paul Ralph (40 files saved) -2026-06-01 13:22:43 [SUCCESS ] [16/64] Completed: Thomas Trappenberg (40 files saved) -2026-06-01 13:23:06 [SUCCESS ] [17/64] Completed: Derek Reilly (29 files saved) -2026-06-01 13:23:17 [SUCCESS ] [18/64] Completed: Angela Siegel (26 files saved) -2026-06-01 13:23:29 [SUCCESS ] [19/64] Completed: Robert Beiko (32 files saved) -2026-06-01 13:24:19 [SUCCESS ] [20/64] Completed: Manuel Mattheisen (101 files saved) -2026-06-01 13:25:01 [SUCCESS ] [21/64] Completed: Sageev Oore (55 files saved) -2026-06-01 13:25:46 [SUCCESS ] [22/64] Completed: Travis Gagie (99 files saved) -2026-06-01 13:25:57 [SUCCESS ] [23/64] Completed: Meng He (27 files saved) -2026-06-01 13:27:32 [SUCCESS ] [24/64] Completed: Gabriel Spadon (32 files saved) -2026-06-01 13:28:03 [SUCCESS ] [25/64] Completed: Eric Poitras (31 files saved) -2026-06-01 13:29:04 [SUCCESS ] [26/64] Completed: Nils Wilde (23 files saved) -2026-06-01 13:29:15 [SUCCESS ] [27/64] Completed: Chris Whidden (30 files saved) -2026-06-01 13:29:29 [SUCCESS ] [28/64] Completed: Rina Wehbe (21 files saved) -2026-06-01 13:29:52 [SUCCESS ] [29/64] Completed: Yujie Tang (19 files saved) -2026-06-01 13:30:21 [SUCCESS ] [30/64] Completed: Carlos Hernandez-Castillo (25 files saved) -2026-06-01 13:30:36 [SUCCESS ] [31/64] Completed: Lizbeth Escobedo (19 files saved) -2026-06-01 13:30:45 [SUCCESS ] [32/64] Completed: Vlado Keselj (23 files saved) -2026-06-01 13:30:49 [SUCCESS ] [33/64] Completed: Norbert Zeh (24 files saved) -2026-06-01 13:31:29 [SUCCESS ] [34/64] Completed: Joseph Malloch (23 files saved) -2026-06-01 13:31:38 [SUCCESS ] [35/64] Completed: Stephen Brooks (10 files saved) -2026-06-01 13:31:39 [SUCCESS ] [36/64] Completed: Carolyn Watters (2 files saved) -2026-06-01 13:31:40 [SUCCESS ] [37/64] Completed: Corey DeGagne (2 files saved) -2026-06-01 13:31:53 [SUCCESS ] [38/64] Completed: Hassan Sajjad (86 files saved) -2026-06-01 13:31:54 [SUCCESS ] [39/64] Completed: Alex Brodsky (1 files saved) -2026-06-01 13:31:54 [SUCCESS ] [40/64] Completed: Bonnie MacKay (1 files saved) -2026-06-01 13:31:56 [SUCCESS ] [41/64] Completed: Nauzer Kalyaniwalla (2 files saved) -2026-06-01 13:31:56 [SUCCESS ] [42/64] Completed: Andrew Cochran (0 files saved) -2026-06-01 13:31:56 [SUCCESS ] [43/64] Completed: Andrew Rau-Chaplin (0 files saved) -2026-06-01 13:31:56 [SUCCESS ] [44/64] Completed: Jacob Slonim (0 files saved) -2026-06-01 13:31:56 [SUCCESS ] [45/64] Completed: Khurram Aziz (0 files saved) -2026-06-01 13:31:56 [SUCCESS ] [46/64] Completed: Michael McAllister (0 files saved) -2026-06-01 13:31:56 [SUCCESS ] [47/64] Completed: Michael Shepherd (0 files saved) -2026-06-01 13:31:56 [SUCCESS ] [48/64] Completed: Saurabh Dey (0 files saved) -2026-06-01 13:31:56 [SUCCESS ] [49/64] Completed: Yannick Marchand (0 files saved) -2026-06-01 13:32:05 [SUCCESS ] [50/64] Completed: Peter Bodorik (16 files saved) -2026-06-01 13:32:14 [SUCCESS ] [51/64] Completed: Ga Wu (32 files saved) -2026-06-01 13:32:23 [SUCCESS ] [52/64] Completed: Hanieh Shakeri (14 files saved) -2026-06-01 13:32:51 [SUCCESS ] [53/64] Completed: James Blustein (12 files saved) -2026-06-01 13:33:01 [SUCCESS ] [54/64] Completed: Christine Farion (1 files saved) -2026-06-01 13:34:22 [SUCCESS ] [55/64] Completed: Dirk Arnold (11 files saved) -2026-06-01 13:34:50 [SUCCESS ] [56/64] Completed: Alexander Brandt (19 files saved) -2026-06-01 13:34:58 [SUCCESS ] [57/64] Completed: Raghav Sampangi (11 files saved) -2026-06-01 13:35:42 [SUCCESS ] [58/64] Completed: FE Bordeleau (8 files saved) -2026-06-01 13:36:04 [SUCCESS ] [59/64] Completed: Anthony Rosborough (25 files saved) -2026-06-01 13:36:11 [SUCCESS ] [60/64] Completed: Marta Kryven (25 files saved) -2026-06-01 13:37:03 [SUCCESS ] [61/64] Completed: Rita Orji (260 files saved) -2026-06-01 13:37:43 [SUCCESS ] [62/64] Completed: Janarthanan Rajendran (26 files saved) -2026-06-01 13:40:00 [SUCCESS ] [63/64] Completed: Frank Rudzicz (163 files saved) -2026-06-01 13:43:48 [SUCCESS ] [64/64] Completed: Suresh Neethirajan (151 files saved) -2026-06-01 13:43:48 [STEP ] Run complete -2026-06-01 13:43:48 [INFO ] Records processed: 64 -2026-06-01 13:43:48 [INFO ] BibTeX files saved: 2584 -2026-06-01 13:43:48 [INFO ] API calls: {'s2': 787, 'gemini': 186, 'serply': 135, 'openalex': 187, 'doi': 12, 'arxiv': 472} -2026-06-01 13:43:48 [INFO ] Total API calls: 1779 -2026-06-01 13:43:48 [INFO ] Cache: 3299 positive, 3368 negative, 1779 miss -2026-06-01 13:43:48 [INFO ] Log file: /home/runner/work/CiteForge/CiteForge/output/run.log -2026-06-01 13:43:48 [INFO ] Reconciled summary CSV: removed 1 phantom entries -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Tang2022-AttentionMechanism.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): A2024-LengthStay.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Abbasnejad2022-AdaptiveFunction.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Abdalla2020-ExploringPrivacy.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Abdalla2020-WordEmbeddings.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Abdalla2022-PredictingTarget.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Abdelali2022-PostHoc.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Abid2022-XSBR.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Abidi2023-MultiviewClustering.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Abidi2024-CharacterizingCluster.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Abidi2024-DigitalTherapeutics.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Abidi2024-EnsembleClustering.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Abudalfa2026-AbjadAuthorIDAuthorship.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Abudalfa2026-AbjadStyleTransferAuthorship.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Acquaviva2021-CommunicatingNatural.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Adaji2022-Preface6th.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Adeeba2025-UrBLiMPBenchmark.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Adekanbi2026-HyperCareAI.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Adjei2024-IdentifyingIoT.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Adjei2024-IoTDevice.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Adjei2025-CanFlow.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Adjei2025-DalhousieNIMS.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Adjei2025-IoTBotnet.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Afonja2022-GenerativeExtraction.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Afrin2024-GENIGANs.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Afrin2024-WorkProgress.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Afrin2025-SQLGENIE.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Afrin2026-NotAll.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Agarwal2024-CommonN.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Agrawal2021-MultiAgent.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Agyapong2023-ImprovingMental.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Ajwani2024-LLMGenerated.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Ajwani2024-PlugPlay.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Alam2021-CrisisBenchBenchmarking.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Alam2021-FightingCOVID.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Alam2021-FightingCOVID19.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Alam2023-ConceptXFramework.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Alam2024-EnhancingShort.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Alam2025-MultiVessel.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Alam2025-PhysicsInformed.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Alamdari2022-HighFrequency.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Aldenaini2020-MobilePhone.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Aldubaikhy2020-LowComplexity.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Alhasani2022-SystematicComparative.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Alhasani2023-SereneMindDesign.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Alhasani2025-BridgingResearch.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Alipour2022-SecuritySocial.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Alipour2023-BehaviourBot.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Alipour2025-LightweightEarly.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Alishahi2020-ProceedingsThird.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Almhana2020-UnderstandingCharacterizing.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Alslaity2022-MobileApplications.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Alslaity2024-PersonalizedPersuasive.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Altinisik2023-ImpactAdversarial.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Altinisik2024-ExplainingRole.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Amaral2022-BenchmarkingGenetic.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Amorim2026-LimitationsSpeaker.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): An2026-RobustDesign.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Arnold2024-FirstOrder.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Arnold2025-60Years.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Arnold2026-FirstOrder.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Arocaouellette2020-LossesModern.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Arps2022-ProbingConstituency.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Arps2024-MultilingualNonce.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Arps2025-UnderstandingSyntactic.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Ataguba2025-ArtificialIntelligence.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Ataguba2025-CriticalAnalysis.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Ataguba2025-FtsApp.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Ataguba2025-MyShoppingBuddyExploring.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Ataguba2025-PersuasionBehavior.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Ataguba2025-SystematicReview.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Ataguba2026-TowardsSocial.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Atanasov2024-RepresentationNoising.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Awaisi2023-LongTerm.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Awaisi2024-SurveyIndustrial.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Awaisi2025-DTGAIN.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Awaisi2025-SETShared.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Azizat2022-LayingHen.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Badawi2025-WhenCan.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Badawi2026-AssessingQuality.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Badshah2024-QuantifyingCapabilities.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Badshah2025-CLEVLLM.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Badshah2025-CLEVLLMBased.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Badshah2025-ReferenceGuided.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Badshah2025-TALETool.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Badshah2026-SCOPESelective.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Baharlouei2022-ExploringRealistic.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Baharlouei2024-ADVENTAttack.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Baharlouei2024-EvaluatingRobustness.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Baharlouei2025-UAVSpecific.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Baharlouei2026-ComprehensiveHost.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Balachandar2022-AreSmartphones.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Balagopalan2021-ComparingPre.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Balagopalan2022-RoadExplainability.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Balfagih2022-NGram.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Baratnezhad2026-XAIDriven.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Barrett2022-KnowledgeGraph.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Bayer2022-FindingSimple.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Bayer2025-EmergentBraitenberg.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Begum2020-DeepLearning.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Belinkov2020-LinguisticRepresentational.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Berlotattwell2021-UseLinguistic.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Berlotattwell2022-RelevanceDialogue.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Berlotattwell2024-LibraryLearning.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Berlotattwell2025-LLMLibrary.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Berlotattwell2026-IsThis.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Bhaskaran2024-DevelopmentCloud.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Bi2024-AIDriven.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Bi2024-MappingMethane.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Biester2020-QuantifyingEffects.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Biester2021-UnderstandingImpact.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Boloori2025-DPyCode.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Bongiorno2021-VectorBased.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Bora2025-NetworkIdentity.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Botros2021-LearningControl.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Botros2022-ErrorBounded.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Botros2023-OptimizingTask.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Botros2024-RegretBased.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Bouadjenek2023-UserCentric.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Bouchoucha2024-TowardDebugging.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Brade2023-PromptifyText.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Brade2024-SynthScribeDeep.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Brandoli2021-AircraftFuselage.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Brandoli2021-DropLeafPrecision.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Branscheidt2022-NoEvidence.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Brooks2021-ReinforcementLearning.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Cai2022-SchedulingOperator.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Calagari2026-KnowledgeGraph.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Campbell2020-ExploringTunneling.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Cano2026-ProspectiveCompression.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Carlini2025-ImPORTanceMachine.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Casper2025-OpenTechnical.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Castiglione2022-FAuxTesting.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Castiglione2022-ScalableWhitebox.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Castiglione2024-SystemMethod.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Cepuran2024-SystemsMethods.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Chan2024-SocialExergames.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Chandar2024-BalancingContext.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Changawala2024-WhisterWhisper.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Chaniotaki2021-ArchitectureSmells.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Chanlatte2024-ProceedingsWorkshop.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Charlebois2020-CanadaS.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Charlebois2024-ImplicationsCarbon.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Charlebois2024-ImplicationsCarbonTaxing.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Chatterjee2022-EmpiricalStandards.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Chaudhry2024-SystemsMethods.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Chavanne2026-DissectingHeterogeneous.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Chen2020-ExploringText.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Chen2020-SDATPSDN.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Chen2021-LearningBased.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Chen2022-EfficientUplink.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Chen2022-JointPricing.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Chen2025-RealizingSustainable.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Chen2026-EfficientCollision.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Chen2026-IMay.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Chirinoperez2021-CognitiveImpairments.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Chirinoperez2021-MappingCerebellar.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Choubineh2026-FindingAssociative.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Clarkson2020-TextualAnalysis.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Colaco2022-PigTreatment.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Colaco2023-DISubNetDepthwise.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Contreras2020-LongitudinalAnalysis.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Copstein2020-TemporalRepresentations.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Copstein2021-LogAbstraction.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Copstein2022-ExploringSyntactical.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Copstein2023-MIMCAnomaly.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Copstein2024-ImprovingReal.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Cui2023-WassersteinGAN.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Dadsetan2024-CanLarge.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Dadsetan2025-SampleEfficient.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Dalvi2020-AnalyzingRedundancy.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Dalvi2022-DiscoveringLatent.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Dalvi2023-NxPlainWeb.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Damours2024-GeneticsNavigator.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Daowd2021-BuildingKnowledge.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Daowd2021-FrameworkBuild.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Daowd2022-KnowledgeGraph.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Dee2025-PreliminaryStudy.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Deon2021-ABCDBach.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Deon2021-MusicalSpeech.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Desai2025-CalmMeAI.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Dhaliwal2025-BimodalData.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Dhaliwal2026-MultiModal.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Dikaios2023-ApplicationsSpeech.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Dikaios2026-SamplingNatural.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Ding2026-JointOptimization.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Dionicio2025-UndistillableOpen.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Du2021-FASTODT.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Dumpala2021-EstimatingSeverity.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Dumpala2021-LearningModel.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Dumpala2021-SignificanceSpeaker.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Dumpala2021-SignificanceSpeakerEmbeddings.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Dumpala2021-SineWave.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Dumpala2022-CombiningGlobal.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Dumpala2022-DetectingDepression.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Dumpala2023-ManifestationDepression.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Dumpala2023-TestTime.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Dumpala2024-DiffAugDiffuse.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Dumpala2024-SeeingSyntax.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Dumpala2024-SelfSupervised.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Dumpala2024-SensitivityGenerative.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Dumpala2024-SensitivityGenerativeVLMs.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Dumpala2024-VISLABenchmark.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Dumpala2025-TestTime.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Dumpala2026-AcousticsDepression.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Durdabak2025-ExploringEffect.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Durrani2020-AnalyzingIndividual.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Durrani2021-HowTransfer.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Durrani2022-DiscoveringSalient.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Durrani2022-TransformationLatent.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Dutta2022-ImprovedGreedy.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Dutta2022-InformativePath.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Dutta2023-ApproximationAlgorithms.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Dutta2023-UnifiedApproach.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Dutta2025-InformativePath.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Eastwood2023-NeedsExpectations.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Ecanow2021-CoreKnowledge.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Egwuatu2025-GeneratingKnowledge.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Ehghaghi2022-DataDriven.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Elsayed2022-BoostGuardInterpretable.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Elsayed2023-AnomalyDetection.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Elsayed2023-BoostSecAdaptive.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Erdenebaatar2023-AnalyzingTraffic.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Erdenebaatar2023-DalhousieNIMS.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Erdenebaatar2023-DepictingInstant.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Erdenebaatar2023-InstantMessaging.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Essien2025-MultimodalAI.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Essien2026-LongitudinalMulti.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Ezembu2025-MultiModal.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Ezzini2026-AbjadGenEvalAbjad.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Fakhraei2021-MachineLearning.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Fan2023-EvaluatingNeuron.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Fan2023-EvaluatingNeuronInterpretation.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Feng2020-ExplainableClinical.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Feng2025-CausalLinkInteractive.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Feng2025-ResponseQuality.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Feng2026-ConformalAgent.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Ferreira2022-SemiSupervised.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Forbrigger2025-PupillometryArm.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Frydenlund2022-LanguageModelling.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Fu2020-CooperativeComputing.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Fu2020-JointUnmanned.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Fu2021-EnergyEfficient.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Fung2024-CSNet2023.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Gagnonaudet2022-RemedyDistributional.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Gajo2025-DependencyParsing.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Gajo2026-LLMsUnderperform.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Ganesh2021-CompressingLarge.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Garg2025-CrossLayer.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Gawai2022-ItS.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Ge2024-HowWell.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Ge2024-UnderstandingLanguage.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Georgiou2022-GreenAI.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Gevasagiv2025-FrontoHippocampal.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Ghassabeh2020-ModifiedSubspace.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Ghosh2024-MEIDS.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Ghourab2026-CovertIRS.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Gillis2025-LastLayer.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Gillis2025-MaskedStrategies.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Gillis2025-PlateletEnumeration.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Gillis2025-UncertaintyEstimation.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Gillis2026-VarianceGated.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Gimenez2025-CrossEntropy.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Gonzales2024-RetrievalAugmented.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Gonzalez2024-ArtificialIntelligence.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Govindarajan2023-BehavioralCloning.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Govindarajan2024-LearningConditional.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Grahamkalio2021-AnalyzingCOVID.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Haider2025-MultiGranular.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Haider2025-NeuronsSpeak.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Haiqi2023-SystemMethod.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Hanafi2023-PreventionObstructive.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Haranwala2023-DataAugmentation.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Hasan2024-GeneralizedTransformer.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Hebert2021-ArtBeatDeep.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Hernandezcastillo2020-CerebellarThalamic.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Hernandezcastillo2020-SensoryInformation.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Hernandezcastillo2021-CervicalSpinal.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Hernandezcastillo2023-MethodsCerebellar.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Heuvel2022-QuantifyingEffect.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Heywood2023-EvolutionaryEnsemble.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Heywood2023-WB.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Hong2023-EvolutionaryMixed.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Hong2025-EvolutionaryAlgorithm.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Huang2020-ReinforcementLearning.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Huang2022-DeadlineAware.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Huang2023-6GEmpowered.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Huang2024-GPTWritingPrompts.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Huang2024-SymbolicMusic.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Huang2025-SafetyCritical.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Huang2025-SurrogateModel.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Hung2021-RegionalBrain.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Hung2022-DifferentialExpression.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Hussein2020-ExploringInterface.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Ianta2021-ImpactTangled.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Idris2023-DynamicsSerum.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Iglesias2020-BilateralProximal.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Imran2026-KosmoWalkerDesigning.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Iqbal2022-AlleviatingDeleterious.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Jacobs2022-ASASNANP.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Jadeja2025-MachineLearning.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Jahan2023-TowardsUnderstanding.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Jahan2025-CanHessian.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Jahan2025-ImprovedDetection.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Jahan2025-TaxonomyFaults.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Jahan2025-TowardsUnderstanding.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Jahan2025-WhyAttention.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Jahan2026-DEFaultAutomated.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Jaipersaud2024-ShowDon.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Jaiswal2021-ControllingBigGAN.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Jariwala2023-MimickingElectronic.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Jebnoun2020-ScentDeep.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Jelodar2021-ArtificialIntelligence.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Jeong2023-ExploringUse.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Jia2024-CuriosityDriven.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Jiang2022-DataDriven.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Jiang2024-WorkloadAllocation.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Jobarteh2024-AddressingClimate.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Jobarteh2024-MultiModal.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Jobarteh2025-IntegratingMulti.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Jobarteh2025-LeveragingSatellite.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Jpd2026-StateBrazilian.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Kainth2022-ConformalMirror.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Karlsen2023-ExploringSemantic.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Karlsen2024-BenchmarkingLarge.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Karlsen2024-LargeLanguage.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Kate2025-DecodingBovine.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Kate2025-GivingCows.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Kate2026-BigData.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Kate2026-MooLogueCross.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Kelly2021-EmergentTangled.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Kerestes2022-StandardizedPipeline.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Keselj2022-ProposalUniversal.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Keselj2023-AutomatedAuthorship.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Keselj2025-SingleSource.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Khalid2020-EvaluationDeep.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Khalid2022-ORVision.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Khalid2023-KnowledgeGraph.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Khalid2023-RefiNeRFModelling.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Khalid2023-SurGNNExplainable.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Khalid2023-SystemMethod.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Khalid2023-SystemsMethods.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Khalid2023-WildNeRFNovel.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Khan2020-ClusteringFramework.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Khatouni2020-MachineLearning.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Khattak2025-MLHOpsMachine.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Khattak2025-SystemsMethods.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Khawam2025-FederatedNon.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Khodjaeva2021-NetworkFlow.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Khodjaeva2022-CanWe.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Khomh2023-IntelligentSoftware.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Kibengemacleod2023-UtilizingAutoencoder.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Kim2023-AdvancingPig.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Kim2023-EnhancingAnimal.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Kim2023-PigEmotion.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Kimeu2026-Story2ChangeTowards.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Konate2025-ReliableCompositional.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Konate2026-SphereEditSpherical.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Kosmajac2020-GraphBased.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Kosmajac2020-LanguageDistance.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Kosmajac2020-TwitterUser.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Kostas2020-DN3Open.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Kostas2020-ThinkerInvariance.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Kostas2021-BENDRTransformers.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Krawiec2020-SolvingComplex.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Kryven2021-PlansOr.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Kryven2024-ApproximatePlanning.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Kryven2025-CognitiveMaps.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Kryven2025-ThinkOutside.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Kureshi2024-InvestigatingInfluence.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Kureshi2024-RiskStratification.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Kureshi2024-SpatialHotspots.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Kureshi2024-TopologicalData.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Kureshi2024-UtilizingTopological.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Kureshi2025-LongitudinalTrends.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Lam2022-DelphiConsensus.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Lang2020-BinaryText.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Latypov2023-BrainImaging.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Latypov2024-SignaturesChronic.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Latypov2025-StratificationSurgical.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Le2020-AnalyzingData.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Le2020-ExploringAdversarial.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Le2020-ExploringAnomalous.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Le2020-FrontierDependable.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Le2021-AnomalyDetection.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Le2021-TrainingRegime.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Lee2024-GeneticsProviders.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Leger2025-NewMeasure.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Li2020-RankingOptimization.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Li2020-RepresentationLearning.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Li2020-WordClass.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Li2021-HowIs.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Li2021-MultiserviceFunction.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Li2021-TorontoCLCMCL.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Li2022-ImprovingGreedy.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Li2022-NeuralReality.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Li2022-UtilityOptimization.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Li2023-ColSLAMVersatile.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Li2023-MultiCell.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Li2025-CoverageOptimization.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Li2025-DigitalTwin.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Li2025-DigitalTwinEnabled.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Li2025-UnsupervisedAnomaly.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Li2026-CoverageOptimization.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Li2026-DelayTrajectory.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Lia2022-SettingTone.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Lia2023-ContextualizingTone.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Lia2023-ItS.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Lia2024-NoOne.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Liaqat2020-GroundTruth.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Liaqat2021-CoughwatchReal.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Liaqat2023-SystemMethod.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Liaqat2024-ChameleonImages.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Liaqat2025-ChameleonMultimodal.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Liu2020-GroupSweep.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Liu2022-APSelection.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Liu2023-GraphReinforcement.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Liu2023-PlacementEdge.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Liu2024-DalhousieNIMS.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Liu2024-EdgeCloud.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Liu2024-PilotAssignment.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Liu2024-SophonIDS.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Liu2025-CuriosityDriven.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Liu2025-EnhancingCollaborative.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Liu2025-MVSTGHAT.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Livermore2022-MachineLearning.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Llonch2022-EditorialUnderstanding.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Lodel2026-LearningSemantic.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Loginov2020-DifferentImpacts.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Loginov2020-StockSelection.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Loginov2023-FeatureEngineering.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Loginov2023-PreliminaryResults.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Loginov2024-ExploringData.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Lopez2025-BiomarkersMyotonic.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Lopeztitla2020-CognitiveDecline.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Lowe2021-LogAvgExpProvides.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Lowe2021-LogicalActivation.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Lowe2021-LogicalActivation_2.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Lowe2022-EchofilterDeep.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Lowe2023-ZeroShot.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Lowe2024-EmpiricalStudy.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Lowe2025-BenthicNetGlobal.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Lowe2026-SelfDistillation.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Luo2020-DeepCritiquing.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Luo2020-LatentLinear.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Luo2021-ModellingVisualising.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Luo2024-WithinBasket.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Lutfiyya2021-GuestEditorial.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Lv2020-DesignNOMA.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Lv2020-IntelligentInterference.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Lv2020-MultiAntenna.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Lv2021-SecureNon.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Lv2022-TBTOADAG.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Macaskill2021-ScalingMulti.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Macneil2021-PlanktonClassification.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Madanlal2024-PilotStudy.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Mahato2024-CuttingEdge.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Mahato2024-InformationProcessing.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Mahato2025-DairyDigiD.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Mahato2025-DairyDigiDArtificial.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Mahato2025-DairyDigiDEdge.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Mahato2025-IntegratingArtificial.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Mahbub2023-BugsplainerLeveraging.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Mahbub2023-DefectorsLarge.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Mahbub2023-ExplainingSoftware.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Mahbub2024-PredictingLine.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Mahbub2024-PrevalenceEvolution.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Mahfujul2023-AugmentingBackpressure.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Mai2020-AttentiveAutoencoders.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Majouni2022-ApplyingMachine.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Majouni2024-PredictingUrgent.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Majouni2025-GraphNeural.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Majouni2025-HeterogeneousBipartite.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Mandli2025-COMETGenerating.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Manikandan2024-DecodingPoultry.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Manikandan2024-DecodingPoultryVocalizations.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Manikandan2025-AIDriven.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Manikandan2025-DecodingPoultry.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Masalma2022-BenchmarkingEnsemble.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Masalma2022-GeneticProgramming.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Mcburney2022-ElectronicMedical.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Mcburney2023-DevelopingReference.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Mcburney2023-ImprovingEstimates.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Mcburney2023-ValidatingPertussis.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Mehditabar2025-SmartBut.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Mehditabar2026-BRACEUnified.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Mehditabar2026-ValidatedTaxonomy.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Mehraj2025-CAGConstraint.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Mehta2024-ArtificialIntelligence.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Mellaty2022-SystematicReview.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Mellia2021-OverviewNetwork.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Menendez2022-ASASNANP.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Mianroodi2025-MedSynthRealistic.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Misiuk2024-MultivariateMapping.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Moghaddam2020-ExploringData.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Mohammadhassanzadeh2024-PlausibleReasoning.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Mondal2021-EarlyDetection.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Mondal2022-ReproducibilityProgramming.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Mondal2023-DoSubjectivity.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Mondal2024-CanWe.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Moradi2024-PairwiseFunctional.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Morris2025-OptimizingPrescribing.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Mubarak2022-MethodSystem.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Mukherjee2025-UnderstandingImpact.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Mukherjee2026-BugMentorGenerating.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Munn2025-GenerativeAI.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Muse2020-PrevalenceImpact.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Musumbulwa2025-MyHealthCoreTowards.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Nair2021-OntologyBased.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Nanadani2023-CalibratingDeep.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Nandani2023-DACOSManually.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Napier2022-SequenceModeling.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Napier2022-SpectralAnalysis.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Napier2023-TransferringMovement.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Naqvi2021-AnalyzingAssociation.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Naqvi2021-PredictingKidney.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Naqvi2025-DonorRecipient.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Naqvi2025-ReinforcementLearning.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Naqvi2026-CounterfactualAnalysis.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Naseem2020-FactorsEnabling.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Nasreen2021-1211Incidence.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Nasreen2021-PopulationBased.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Nassiri2025-GrporadGroup.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Ndulue2020-PHISHERCRUSH.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Ndulue2022-PersonalityTargeted.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Ndulue2025-MotivationalAppeal.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Neethirajan2020-DigitalizationAnimal.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Neethirajan2020-TransformingAdaptation.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Neethirajan2021-83Mapping.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Neethirajan2021-ArtificialIntelligence.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Neethirajan2021-BeyondDeepfake.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Neethirajan2021-DATAMATIONDigitAl.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Neethirajan2021-DigitalTwins.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Neethirajan2021-DoFarm.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Neethirajan2021-EthicsDigital.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Neethirajan2021-HappyCowOr.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Neethirajan2021-MakingSense.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Neethirajan2021-MeasuringAnimal.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Neethirajan2021-MeasuringFarm.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Neethirajan2021-RoleBig.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Neethirajan2021-SensorsAnimals.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Neethirajan2021-SocialNetwork.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Neethirajan2021-UseArtificial.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Neethirajan2021-UseBiosensors.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Neethirajan2021-WURWolf.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Neethirajan2022-BehindScenes.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Neethirajan2022-BigData.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Neethirajan2022-BiologicalChemical.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Neethirajan2022-ChickTrackQuantitative.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Neethirajan2022-DigitalizationLivestock.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Neethirajan2022-SensorsAI.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Neethirajan2022-SensorsMonitoring.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Neethirajan2023-AIDriven.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Neethirajan2023-AISustainable.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Neethirajan2023-ArtificialIntelligence.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Neethirajan2023-ArtificialIntelligenceSensor.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Neethirajan2023-ClimateSmart.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Neethirajan2023-DigitalPhenotyping.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Neethirajan2023-EthicalFrontier.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Neethirajan2023-EthicalFrontierNavigating.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Neethirajan2023-FacesFeelings.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Neethirajan2023-HarnessingArtificial.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Neethirajan2023-HerdsInsights.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Neethirajan2023-InnovativeStrategies.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Neethirajan2023-MetaverseModern.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Neethirajan2023-MonitoringNutritional.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Neethirajan2023-NavigatingNet.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Neethirajan2023-NewEra.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Neethirajan2023-SOLARIASensOr.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Neethirajan2023-SignificanceEthics.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Neethirajan2023-UncoveringHidden.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Neethirajan2023-VocalizationPatterns.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Neethirajan2024-AdvancingClimate.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Neethirajan2024-DigitalLivestock.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Neethirajan2024-DigitalTwins.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Neethirajan2024-EnhancingAnimal.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Neethirajan2024-GreenHorizons.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Neethirajan2024-HumanComputer.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Neethirajan2024-ListeningCows.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Neethirajan2024-MetaverseEnhancing.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Neethirajan2024-NetZero.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Neethirajan2024-NextGeneration.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Neethirajan2024-PredictiveAnalytics.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Neethirajan2024-TwinFarms.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Neethirajan2025-AdaptingLarge.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Neethirajan2025-AgencyLivestock.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Neethirajan2025-AnimalAgency.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Neethirajan2025-DecodingVocal.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Neethirajan2025-GreenAI.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Neethirajan2025-GreenAIArithmetic.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Neethirajan2025-GreenArtificial.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Neethirajan2025-MeasuringWhat.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Neethirajan2025-ProjectMooLogue.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Neethirajan2025-ResilienceAs.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Neethirajan2025-RethinkingPoultry.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Neethirajan2025-SafeguardingDigital.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Neethirajan2025-SatellitesTrack.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Neethirajan2025-SustainableComputing.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Neethirajan2025-SustainableComputingDigital.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Neethirajan2026-DigitalTwins.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Neethirajan2026-DigitalTwinsPoultry.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Neethirajan2026-GreenAI.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Nekoei2023-DealingNon.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Nekoei2023-TowardsFew.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Nersesian2021-CD16aHigh.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Ngai2022-DoctorXAvIer.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Niazmand2025-JointTask.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Nikouline2024-MachineLearning.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Nunes2020-AsymmetricalReliability.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Nunes2020-DearDr.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Nunes2020-MeasuringHeterogeneity.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Nunes2020-MultiplicativeDecomposition.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Nunes2020-RepresentationalRenyi.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Nunes2020-WeNeed.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Nunes2021-ExemplarScoring.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Nunes2022-CriticalEvaluation.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Nunes2025-ImpactElectrophysiological.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Nunes2025-MaRVManually.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Obadinma2022-BringingState.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Oduntan2022-ILet.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Oishi2021-NeuralNetworks.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Olagunju2020-ExploringKey.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Oneill2026-PrivacyPreserving.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Oore2021-MusicSpeech.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Oore2025-MeasurementPersonal.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Orji2020-PersonalizingPersuasive.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Orji2024-PersuasiveInterfaces.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Oyebode2020-DeconstructingPersuasive.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Oyebode2020-HeartHealthPersuasive.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Oyebode2020-HybridRecommender.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Oyebode2020-MachineLearning.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Oyebode2020-NourishYour.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Oyebode2020-PersuasiveMobile.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Oyebode2020-PersuasiveMobileApps.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Oyebode2021-HealthPsychosocial.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Oyebode2021-ITried.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Oyebode2021-MediNERUnderstanding.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Oyebode2021-SleepFitPersuasive.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Oyebode2021-TailoringPersuasive.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Oyebode2021-TreeCareDevelopment.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Oyebode2022-COVID19.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Oyebode2022-ExploringPossible.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Oyebode2022-MachineLearning.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Oyebode2022-PersuasiveStrategy.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Oyebode2022-PlayerMatching.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Oyebode2023-IdentifyingAdverse.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Oyebode2023-PersuasiveStrategies.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Oyebode2024-EmotionDetection.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Oyebode2024-PersuasiveStrategies.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Oyebode2024-TowardsAI.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Oyebode2025-IntuitiveInterfaces.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Oyebode2026-RecilifyAI.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Pacheco2020-LearningDynamic.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Pacheco2020-OutDistribution.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Padmanabhan2025-AcceleratingClimate.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Padronrivera2021-CerebellarDegeneration.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Padronrivera2026-FunctionalConnectivity.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Palit2023-AutomaticRefactoring.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Palit2024-GeneratingRefactored.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Palit2025-ReinforcementLearning.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Parivendan2025-BeyondProximity.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Parivendan2025-SocialDynamics.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Parivendan2025-SocializingAI.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Parivendan2026-BeyondProximity.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Park2022-DetoxifyingLanguage.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Parmar2024-ArtificialIntelligence.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Parmar2024-ArtificialIntelligenceDriven.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Patel2025-CowPainCheck.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Patel2025-SerencoachAi.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Patil2024-IntelligentSwitching.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Peachey2023-CreatingLatent.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Peachey2025-EvaluatingLow.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Pei2023-JointCaching.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Pennings2021-SensorData.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Petzi2023-MechanismsSustained.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Pijpers2022-UnderstandingChicks.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Pimentel2024-FeatureExtraction.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Pimentel2026-StraightforwardApproach.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Piriyakulkij2025-PoEWorld.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Poncelas2022-ClusterBased.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Popp2022-RoleFeedback.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Porter2024-DirectAugmented.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Portman2022-InteractionBetween.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Pouprom2020-ConversationalRobot.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Prajesh2025-AIDriven.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Prajesh2025-SatelliteBased.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Prajesh2026-ObservationGeoinformation.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Prajesh2026-SatelliteRemote.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Prato2022-PatchBlenderMotion.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Pu2020-ProgramSynthesis.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Qian2021-ModelingHuman.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Qin2025-PlanningGenerative.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Qin2026-HypothesisGeneration.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Qiu2023-AssessingImpact.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Qiu2024-ScenariosApproaches.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Qiu2025-BenchmarkingStreaming.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Qiu2025-DefiningBenchmarking.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Qu2020-DynamicFlow.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Quach2026-MachineLearning.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Rad2020-AIDriven.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Rad2022-ExtractingSurrogate.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Rad2022-InteractiveVisual.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Rad2022-VisualAnalytics.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Rad2024-ExtractingDecision.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Rad2025-ConceptLevel.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Rahimi2025-NotLost.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Rahimikalahroudi2023-ReplayBuffer.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Rahman2020-WhyAre.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Rahman2021-ForgottenRole.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Rahman2021-SystematicLiterature.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Rahman2022-LessonsResearch.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Rahman2022-WorksMe.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Rahman2023-SystematicReview.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Rahman2024-ExploringInfluence.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Rahman2025-TSDetector.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Rahman2026-BePartner.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Rajendran2020-HowShould.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Rajendran2020-MetaLearning.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Rajendran2021-EndToend.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Rajendran2021-LearningLearn.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Rajput2024-BenchmarkingEmerging.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Rajput2024-EnhancingEnergy.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Rajput2024-GreenlightHighlighting.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Rajput2025-TuR.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Rajput2026-CodeGreenTowards.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Rajput2026-EnergyFlow.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Rajput2026-FlipFlopStatic.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Ramezani2021-UnsupervisedFramework.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Rao2025-AdvancingDairy.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Rao2025-ComputationalArchitectures.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Rao2025-VideoBased.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Regio2026-BeyondBlack.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Reilly2026-ThreadingNeedle.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Rezende2024-GenotypeSpecific.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Riachi2021-ChallengesReinforcement.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Riad2020-IdentificationPrimary.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Rizwan2024-InstanceLevel.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Rizwan2024-ResolvingLexical.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Robertson2025-CorePattern.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Robertson2026-BrainAtrophy.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Robin2020-EvaluationSpeech.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Rodrigues2020-LigDoctor.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Rodrigues2022-CPAPAdherence.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Rodriguesjr2021-LIGDoctor.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Rodriguez2024-PredictingIndividual.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Roewerdespres2025-ACCORDClosing.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Romeromolina2024-SARSCoV.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Romeromolina2025-CerebellarCognitive.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Rosati2024-EvaluatingDefences.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Rosati2024-ImmunizationAgainst.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Rosati2024-LongForm.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Rosati2024-ResolvingLexical.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Rosati2025-LockingOpen.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Rosati2026-LimitsConvergence.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Rosedavis2022-SemanticKnowledge.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Roy2024-GraphTree.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Rudzicz2020-EthicsArtificial.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Rudzicz2020-ExplainableAI.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Rudzicz2020-SystemMethod.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Rudzicz2021-Intelligence14.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Rudzicz2021-Medicine3.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Rudzicz2021-SystemMethod.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Rudzicz2022-AugmentativeAlternative.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Rudzicz2022-AutomaticSpeech.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Rudzicz2022-DementiaAphasia.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Rudzicz2022-FinalToughts.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Rudzicz2022-MathStats.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Rudzicz2022-PhysicalCognitive.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Rudzicz2022-SpeechSynthesis.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Rudzicz2022-SupportingDaily.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Rudzicz2023-SystemMethod.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Russell2023-FenceAnomaly.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Saad2024-CONCORDTowards.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Saad2024-NaturalnessAttention.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Saad2025-AdaptiveLanguage.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Saad2025-EffectToken.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Saad2025-HierarchicalEvaluation.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Saad2025-SENAITowards.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Sabby2025-SelfSupervised.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Sadeghi2025-ExploringFeatures.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Sadik2026-UtilizingMachine.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Sadr2025-WhichWords.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Saeed2024-ModalityInvariant.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Sahak2023-StateVector.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Sajjad2020-AraBenchBenchmarking.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Sajjad2020-PoorMan.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Sajjad2021-EffectPost.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Sajjad2021-FineGrained.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Sajjad2022-AnalyzingEncoded.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Sajjad2023-EffectDropping.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Sajjad2023-LatentConcept.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Sajjad2025-InterpretingEffects.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Samir2026-ImprovedBug.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Samir2026-ImprovingIR.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Samsami2024-MasteringMemory.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Sandhu2026-AligningDense.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Sanyal2022-ImplementationDecentralized.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Saqur2024-NIFTYFinancial.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Saqur2025-FilteredNot.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Saqur2026-SeekingSOTA.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Sarvmaili2024-DataCentric.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Sarvmaili2024-TowardsUnderstanding.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Sastry2020-DetectingOut.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Sastry2023-SemiSupervised.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Sastry2023-TrainingDiffusion.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Sastry2024-TrainingRobust.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Scabora2020-EnhancingRecursive.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Scabora2021-SHARqSharing.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Sealy2024-EmergentDiscovery.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Sen2025-BoozyGears.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Senthilkumar2024-ComparativeAnalysis.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Senthilkumar2024-EarlyDetection.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Senthilkumar2025-IlluminatingBovine.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Seyffarth2021-ImplicitRepresentations.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Shah2023-MiningFusing.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Shah2024-TowardsUnderstanding.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Shah2025-ImitationGame.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Shah2025-ImitationGameReproducing.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Shah2025-TowardsUnderstanding.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Shah2026-CharacterizingFaults.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Shahtalebi2022-OutDistribution.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Shaib2021-HierarchicalCnn.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Shanteer2026-CowNetAI.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Sharma2020-DoWe.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Sharma2020-EmpiricalInvestigation.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Sharma2021-CodeSmell.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Sharma2021-MapInduction.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Sharma2021-QScoredLarge.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Sharma2022-EfficientExploration.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Sharma2023-InvestigatingDevelopers.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Sharma2024-LLMsCode.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Sharma2024-MultiFaceted.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Sharma2024-SurveyMachine.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Shen2022-ClusteringEnabled.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Shen2022-DistributionalContrastive.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Shetty2025-MappingCode.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Shu2020-AdventuresFlatland.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Shu2021-PerceivingSocial.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Shu2022-SocialAttribution.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Shuvo2023-RecommendingCode.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Siddiqui2023-DeepLearning.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Silva2020-CROKAGEEffective.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Silva2021-ImprovedRetrieval.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Silva2025-AIDriven.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Silva2025-HideSeek.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Silva2026-GeneralizingGeometry.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Sinclair2021-MachineLearning.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Sinclair2023-BeginningAI.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Singh2023-GranuleCells.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Singh2025-EffectsBipolar.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Singh2025-UnsupervisedClustering.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Sivakumar2024-AdvancingDairy.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Smith2020-EvolvingDota.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Smith2020-FourEquity.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Smith2021-EvolvingSimple.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Smith2025-InterpretingTangled.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Smith2026-QuantifyingDota.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Sobhani2025-ItWorks.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Sobhani2025-SustainabilityAI.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Soleymani2025-SoftAdaClipSmooth.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Song2023-EfficientData.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Song2024-EnhancingGlobal.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Spadon2022-CitiesSeries.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Spadon2022-PayAttention.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Spadon2023-UnfoldingAIS.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Spadon2024-MaritimeTracking.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Spadon2024-MultiPath.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Spadon2025-CommunityCentered.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Spadon2025-ModelingMaritime.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Spadon2025-TheoreticalFramework.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Specia2020-FindingsWMT.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Spettel2022-ActiveSets.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Spinellis2024-BrokenWindows.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Srivastava2025-PetBuddyExamination.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Stone2021-PredictionLithium.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Su2021-LearningBased.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Sudhakar2023-LanguageModel.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Sudhakar2024-LanguageModel.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Sudhakar2025-GeneralistHanabi.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Sui2021-MultiAxis.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Sui2021-RepresenterPoint.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Sui2023-SelfSupervised.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Sun2022-PerformanceAnalysis.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Suwaileh2020-AreWe.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Suwaileh2022-WhenDisaster.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Taghibeyglou2023-WhoNeeds.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Taghibeyglou2024-ContextIs.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Tang2020-InterferenceMitigation.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Tang2022-RoutingAlgorithms.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Tapp2025-AdaptingCool.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Tapp2025-AdaptingCoolFarm.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Tapp2025-CrossSpecies.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Tapp2026-EvaluatingCross.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Taylor2020-ECommerce.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Taylor2021-ExtractiveLexicon.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Taylor2021-PredictingDistress.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Taylor2022-DonT.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Taylor2023-DonT.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Taylor2025-HeyChatGPT.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Thakur2020-QScoredOpen.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Thibodeau2024-FairnessIncentives.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Thibodeau2025-BalancingProfit.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Thirumurugan2025-IdentifyingSynchronous.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Tian2020-LearningAbstract.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Tikoo2025-EvolvingCerebellar.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Toal2020-SimpleSurrogate.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Tonon2025-ObjectiveAssessment.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Toshpulatov2021-AnomalyDetection.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Trappenberg2025-PositionPaper.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Tweel2022-NonInvasive.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Uher2026-472Assessing.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Vahedi2021-SummarizingRelevant.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Vaidheeswaran2025-GoalConditioned.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Vijayvargiya2024-EnhancingIdentifier.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Vinden2025-ContrastiveSimilarity.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Vishnubhotla2021-EvaluationDisentangled.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Vishnubhotla2023-ImprovingAutomatic.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Vlavianos2022-HumanInformation.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Wan2022-TowardsEvaluating.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Wang2020-EdgeInstability.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Wang2020-SpeakerAttribution.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Wang2020-SpeakerDiarization.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Wang2021-HTRJoint.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Wang2021-ScopingReview.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Wang2022-DemandOriented.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Wang2022-Grad2TaskImproved.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Wang2022-KenMeSHKnowledge.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Wang2022-MeSHupCorpus.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Wang2023-AFNTSecure.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Wang2023-InvestigatingLearning.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Wang2024-AuxiliaryKnowledge.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Wang2024-InformationGeometric.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Wang2024-MultiStage.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Wang2025-DiscoveringBlue.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Wang2025-DoubleEdge.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Wang2025-TrustworthyMedical.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Wang2025-TwoTier.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Wang2025-UtilizingAutoencoder.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Wang2026-ComputationEfficient.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Wang2026-IEDLIDS.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Wang2026-TeleportationLinks.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Weber2023-ExploringAnomaly.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Weber2025-EncryptedNetwork.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Weerasinghe2023-DynamicsEmotion.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Weerasinghe2024-NoClaims.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Wei2021-IntraoperativeAdverse.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Wei2025-CustomizedTransmission.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Wei2025-E2EPerformance.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Wei2025-JointOptimization.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Wei2026-EnergyEfficient.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Wilde2020-ActivePreference.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Wilde2020-ImprovingUser.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Wilde2020-LearningUser.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Wilde2020-SpecifyingUser.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Wilde2021-LearningReward.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Wilde2022-DoWe.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Wilde2022-LearningSubmodular.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Wilde2022-OnlineMulti.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Wilde2023-DesigningHeterogeneous.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Wilde2024-ScalarizingMulti.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Wilde2024-StatisticallyDistinct.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Wilkins2020-COUGARClustering.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Wilkins2020-ExploringArtificial.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Woensel2020-CIGIntegration.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Woensel2020-IndoorLocation.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Woensel2021-DecisionSupport.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Woensel2021-KnowledgeGraphs.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Woensel2021-SemanticWeb.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Woensel2021-StagedReflexive.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Woensel2021-TowardsModel.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Woensel2022-ClinicalGuidelines.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Woensel2022-ExplainableDecision.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Woensel2022-TowardsAdaptive.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Woensel2023-CommunityPractice.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Woensel2023-DecentralizedWeb.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Woensel2025-WordEmbeddings.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Wong2026-LangFIRDiscovering.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Wu2020-OneClass.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Wu2020-ScalablePlanning.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Wu2020-SimilarityAnalysis.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Wu2022-ArbitraryConditional.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Wu2022-CollaborativeDeep.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Wu2022-NoiseContrastive.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Wu2022-PUMAPerformance.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Wu2022-RevenueMaximizing.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Wu2022-SystemMethod.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Wu2023-BeefUp.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Wu2023-LargeScale.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Wu2024-RecommendingContent.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Xia2022-CollaborativeConditional.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Xu2023-RLCReinforcement.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Xu2024-HierarchicalMulti.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Xu2024-LabelFree.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Xu2026-ImprovingDetection.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Y2021-DeepLearning.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Yan2021-LearningBased.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Yang2020-OpportunisticAdaptive.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Yang2021-ApplicationCooperative.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Yang2021-BayesianPreference.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Yang2021-ModelingHuman.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Ye2020-AdaptiveMedium.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Ye2020-GuestEditorial.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Ye2021-AdaptiveMedium.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Ye2021-ConclusionFuture.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Ye2021-CorrectionsJoint.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Ye2021-DynamicResource.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Ye2021-JointRAN.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Ye2021-LearningBased.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Ye2021-TransportLayer.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Ye2021-VirtualNetwork.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Ye2022-NetworkSlicing.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Yeasmin2025-TowardsEnhancing.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Yeung2020-SequentialExplanations.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Yeung2021-MachineLearning.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Young2020-ClinicalBiomechanical.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Youngshand2020-CharacterizationTotal.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Youngshand2022-AssessingKnee.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Youngshand2022-GaitBiomechanics.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Youssef2022-SoftSensing.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Yu2021-UnpackingComputations.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Yu2022-LearningUncertainty.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Yu2024-LatentConcept.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Yu2026-VectorQuantized.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Yuan2022-FedTSELow.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Yuan2026-DiffusionDDPG.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Zeng2021-CollaborativeService.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Zeng2025-HowRecover.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Zeng2025-SocialBehaviour.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Zeng2026-VoluntaryCollusion.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Zhang2020-UtilizingCooperative.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Zhang2025-LearningAssisted.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Zhang2025-MicroExpression.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Zhang2025-ReimaginingDairy.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Zhang2025-TowardDeterministic.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Zhao2023-ConditionallyOptimistic.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Zhao2026-OnlineLibrary.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Zhi2022-EvaluatingBrain.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Zhou2020-NoiseContrastive.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Zhou2021-DeepReinforcement.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Zhou2023-BoostingApproach.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Zhou2023-DRLBased.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Zhou2024-SimpleEfficient.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Zhou2025-LearningOptimize.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Zhou2026-GradientBoosted.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Zhou2026-MultiAgent.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Zhu2020-ExaminingRhetorical.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Zhu2020-InformationTheoretic.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Zhu2020-SemanticCoordinates.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Zhu2021-QuantifyingTask.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Zhu2021-WhatDo.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Zhu2022-DataRequirements.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Zhu2022-OODProbe.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Zhu2022-PredictingFine.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Zhu2023-MeasuringInformation.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Zhu2023-SituatedNatural.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Zincirheywood2020-CNSM2019.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Zincirheywood2021-GuestEditorial.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Zincirheywood2021-OverviewArtificial.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Zincirheywood2022-GuestEditorial.bib -2026-06-01 13:43:49 [WARNING ] Orphan kept (no duplicate found): Zincirheywood2024-GuestEditorial.bib -2026-06-01 13:43:52 [INFO ] Post-run fixup: corrected 1 .bib files -2026-06-01 13:43:53 [INFO ] Built a2i2 folder: 1059 deduplicated files -2026-06-01 13:43:53 [INFO ] Summary CSV: /home/runner/work/CiteForge/CiteForge/output/summary.csv diff --git a/src/clients/serpapi_scholar.py b/src/clients/serpapi_scholar.py index 870406db..831b9228 100644 --- a/src/clients/serpapi_scholar.py +++ b/src/clients/serpapi_scholar.py @@ -36,7 +36,7 @@ from urllib.parse import urlencode from ..config import HTTP_TIMEOUT_DEFAULT, SERPAPI_BASE -from ..http_utils import _scrub_secrets, http_fetch_bytes +from ..http_utils import http_fetch_bytes _log = logging.getLogger("CiteForge.serpapi") @@ -84,7 +84,7 @@ def _serpapi_get( return {} return data except Exception as exc: - _log.warning("SerpAPI request failed for %s: %s", author_id, _scrub_secrets(str(exc))) + _log.warning("SerpAPI request failed for %s: %s", author_id, type(exc).__name__) return {} diff --git a/src/clients/utility_apis.py b/src/clients/utility_apis.py index 49a1f752..2c93a7c7 100644 --- a/src/clients/utility_apis.py +++ b/src/clients/utility_apis.py @@ -9,7 +9,7 @@ from ..cache import response_cache from ..config import CACHE_TTL_DOI_DAYS, CACHE_TTL_SEARCH_DAYS, DATACITE_BASE, GEMINI_BASE, ORCID_BASE from ..exceptions import ALL_API_ERRORS, ALL_FETCH_ERRORS -from ..http_utils import _scrub_secrets, handle_api_errors, http_get_json, http_post_json +from ..http_utils import handle_api_errors, http_get_json, http_post_json from ..id_utils import _norm_doi from ..log_utils import LogCategory, LogSource, logger from ..text_utils import extract_year_from_any, normalize_title @@ -42,7 +42,10 @@ def gemini_generate_short_title(full_title: str, api_key: str, max_words: int | "Return ONLY the CamelCase title with no quotes, explanation, spaces, or punctuation." ) - url = f"{GEMINI_BASE}?key={api_key}" + # The API key travels in the x-goog-api-key header rather than a URL query + # parameter, so it never appears in a request URL, redirect, or log record. + url = GEMINI_BASE + request_headers = {"x-goog-api-key": api_key} payload = { "contents": [{"parts": [{"text": prompt}]}], "generationConfig": { @@ -63,7 +66,7 @@ def gemini_generate_short_title(full_title: str, api_key: str, max_words: int | category=LogCategory.CITEKEY, ) try: - data = http_post_json(url, payload, timeout=15.0) + data = http_post_json(url, payload, headers=request_headers, timeout=15.0) break # success except _requests.exceptions.HTTPError as e: if e.response is not None and e.response.status_code == 429 and attempt < max_retries: @@ -81,7 +84,7 @@ def gemini_generate_short_title(full_title: str, api_key: str, max_words: int | continue logger.debug(f"GEMINI_FAIL | error={type(e).__name__}", category=LogCategory.CITEKEY) logger.warn( - f"API call failed: {_scrub_secrets(str(e))}", + f"API call failed: {type(e).__name__}", category=LogCategory.ERROR, source=LogSource.SYSTEM, ) @@ -89,7 +92,7 @@ def gemini_generate_short_title(full_title: str, api_key: str, max_words: int | except (*ALL_API_ERRORS, ValueError) as e: logger.debug(f"GEMINI_FAIL | error={type(e).__name__}", category=LogCategory.CITEKEY) logger.warn( - f"API call failed: {_scrub_secrets(str(e))}", + f"API call failed: {type(e).__name__}", category=LogCategory.ERROR, source=LogSource.SYSTEM, ) From b8d734cdf8cc4212163f4c4fba335e0fe2d57f06 Mon Sep 17 00:00:00 2001 From: Gabriel Spadon Date: Thu, 2 Jul 2026 07:28:24 -0300 Subject: [PATCH 39/54] ci: add lint, type, and coverage gates and wire SerpAPI key --- .github/workflows/tests.yml | 44 +++++++++++++++++++++++++++++++++++-- tests/test_integration.py | 6 ++--- 2 files changed, 45 insertions(+), 5 deletions(-) diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index b045ce75..d30d8b59 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -7,6 +7,36 @@ on: branches: [ main, master ] jobs: + lint: + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v4 + + - name: Set up Python + uses: actions/setup-python@v5 + with: + python-version: "3.12" + + - name: Cache pip dependencies + uses: actions/cache@v4 + with: + path: ~/.cache/pip + key: ${{ runner.os }}-pip-lint-${{ hashFiles('pyproject.toml') }} + restore-keys: | + ${{ runner.os }}-pip- + + - name: Install dependencies + run: | + python -m pip install --upgrade pip + pip install -e .[dev] + + - name: Lint (ruff) + run: ruff check src/ tests/ main.py + + - name: Type check (mypy) + run: mypy src/ main.py + test: runs-on: ubuntu-latest strategy: @@ -39,19 +69,29 @@ jobs: - name: Create API key files env: + SERPAPI_KEY: ${{ secrets.SERPAPI }} SERPLY_KEY: ${{ secrets.SERPLY }} SEMANTIC_KEY: ${{ secrets.SEMANTICSCHOLAR }} OPENREVIEW_KEY: ${{ secrets.OPENREVIEW }} GEMINI_KEY: ${{ secrets.GEMINI }} run: | mkdir -p keys + echo "$SERPAPI_KEY" > keys/SerpAPI.key echo "$SERPLY_KEY" > keys/Serply.key echo "$SEMANTIC_KEY" > keys/Semantic.key echo "$OPENREVIEW_KEY" > keys/OpenReview.key echo "$GEMINI_KEY" > keys/Gemini.key - - name: Run tests - run: pytest --tb=short + - name: Run tests with coverage + run: pytest --cov=src --cov=main --cov-report=term-missing --cov-report=xml --cov-fail-under=60 + + - name: Upload coverage report + if: always() + uses: actions/upload-artifact@v4 + with: + name: coverage-${{ matrix.python-version }} + path: coverage.xml + retention-days: 7 - name: Upload test results on failure if: failure() diff --git a/tests/test_integration.py b/tests/test_integration.py index 0e800386..e734ddbc 100644 --- a/tests/test_integration.py +++ b/tests/test_integration.py @@ -27,8 +27,8 @@ def test_fetch_and_merge(api_keys: dict[str, Any]) -> None: Validate end-to-end publication fetching from Scholar and DBLP followed by deduplication. """ - if not api_keys.get("serply"): - pytest.skip("Serply key not available") + if not api_keys.get("serpapi"): + pytest.skip("SerpAPI key not available") rec = Record( name=TEST_AUTHOR["name"], @@ -37,7 +37,7 @@ def test_fetch_and_merge(api_keys: dict[str, Any]) -> None: ) scholar_data = scholar.fetch_author_publications( - api_keys["serply"], + api_keys["serpapi"], rec.scholar_id, rec.name, ) From deb602ec4b83ca8a1e0b2effc76d9ef35d5215d6 Mon Sep 17 00:00:00 2001 From: Gabriel Spadon Date: Thu, 2 Jul 2026 07:28:24 -0300 Subject: [PATCH 40/54] test: rename Scholar client test module to test_scholar --- tests/{test_scholarly_scholar.py => test_scholar.py} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename tests/{test_scholarly_scholar.py => test_scholar.py} (100%) diff --git a/tests/test_scholarly_scholar.py b/tests/test_scholar.py similarity index 100% rename from tests/test_scholarly_scholar.py rename to tests/test_scholar.py From 84edbcf744e570cbbad80c1c0f2f1a48e9895c69 Mon Sep 17 00:00:00 2001 From: Gabriel Spadon Date: Thu, 2 Jul 2026 08:04:53 -0300 Subject: [PATCH 41/54] docs: document modules and normalize comment and docstring voice --- CLAUDE.md | 4 +-- main.py | 8 +++++ src/api_configs.py | 8 +++++ src/api_generics.py | 8 +++++ src/bibtex_build.py | 8 +++++ src/bibtex_utils.py | 10 +++++- src/cache.py | 12 +++++-- src/canonicalize.py | 49 +++++++++++++++---------- src/clients/helpers.py | 7 ++++ src/clients/scholar.py | 14 ++++++-- src/clients/search_apis.py | 13 +++++-- src/clients/serply_scholar.py | 10 +++--- src/clients/utility_apis.py | 8 +++++ src/config.py | 9 +++++ src/doi_utils.py | 7 ++++ src/exceptions.py | 7 ++++ src/http_utils.py | 12 +++++-- src/id_utils.py | 8 +++++ src/io_utils.py | 7 ++++ src/log_utils.py | 7 ++++ src/merge_utils.py | 21 +++++++---- src/models.py | 6 ++++ src/pipeline/article.py | 26 +++++++++----- src/pipeline/postrun.py | 8 +++++ src/pipeline/scheduler.py | 8 +++++ src/text_utils.py | 10 +++++- src/venue.py | 7 ++++ tests/test_cache.py | 2 +- tests/test_canonicalize.py | 38 ++++++++++---------- tests/test_decision_reinforcement.py | 46 ++++++++++++------------ tests/test_http_utils.py | 9 ++--- tests/test_regression.py | 54 ++++++++++++++-------------- 32 files changed, 327 insertions(+), 124 deletions(-) diff --git a/CLAUDE.md b/CLAUDE.md index c73f7604..7aa5f82f 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -19,7 +19,7 @@ All three must pass before merge: ```bash ruff check src/ tests/ main.py # Lint mypy src/ main.py # Type check (strict, ignore_missing_imports) -pytest tests/ -v --tb=short # Tests (384 tests, Python 3.10-3.13) +pytest tests/ -v --tb=short # Tests (full suite, Python 3.10-3.13) ``` Single test: `pytest tests/test_merge.py::test_function_name -v --tb=short` @@ -28,7 +28,7 @@ Ruff config: line-length 120, rules E/F/W/I/N/UP/B/C4/SIM/RUF/S (see pyproject.t ## Architecture -`main.py` is the monolithic orchestrator (~3,200 LOC). Each article passes through Phase 1 (DOI validation) → Phase 2 (multi-API enrichment) → Phase 2.5 (SerpAPI publication string fallback) → Phase 3 (late DOI inference) → Phase 4 (trust-based merge + save). Post-run: flush CSV → reconcile phantoms → remove orphans → year-window cleanup → build a2i2 → rebuild baseline.json. +`main.py` is a thin command-line entry point (~120 LOC) that loads API keys, reads author records, and delegates to the `src/pipeline/` package (`article.py` for per-article enrichment, `scheduler.py` for author-level scheduling, `postrun.py` for the post-run tail). Each article passes through Phase 1 (DOI validation) → Phase 2 (multi-API enrichment) → Phase 2.5 (SerpAPI publication string fallback) → Phase 3 (late DOI inference) → Phase 4 (trust-based merge + save). Post-run steps run in order: flush CSV → reconcile phantoms → remove orphans → year-window cleanup → build a2i2 → rebuild baseline.json. Trust hierarchy in `src/merge_utils.py:merge_with_policy()` merges fields from 13 ranked sources with special override rules for DOI (published > preprint), journal (never downgrade to preprint), title (prefer longer), pages (reject invalid), and booktitle (upgrade generic series to conference name). diff --git a/main.py b/main.py index 8c013700..f97f72e2 100644 --- a/main.py +++ b/main.py @@ -1,3 +1,11 @@ +"""CiteForge command-line entry point. + +Loads the API keys and author records, runs the parallel enrichment scheduler +over every author, then finalizes the run. Accepts an optional input CSV path +(default ``data/input.csv``) and a ``--force`` flag that re-enriches every +record regardless of cache completeness. +""" + from __future__ import annotations import os diff --git a/src/api_configs.py b/src/api_configs.py index ca1df033..99b42a0e 100644 --- a/src/api_configs.py +++ b/src/api_configs.py @@ -1,3 +1,11 @@ +"""Per-source API search configurations. + +Holds the `APISearchConfig` and `APIFieldMapping` instances for each scholarly +source (Semantic Scholar, Crossref, OpenAlex, PubMed, Europe PMC, arXiv, +OpenReview, DataCite) that `api_generics.py` consumes to run searches and build +BibTeX entries. +""" + from __future__ import annotations import os diff --git a/src/api_generics.py b/src/api_generics.py index 401abe8e..770f1c62 100644 --- a/src/api_generics.py +++ b/src/api_generics.py @@ -1,3 +1,11 @@ +"""Config-driven, source-agnostic search and BibTeX construction. + +Provides the generic search-and-build engine (`APISearchConfig`, +`APIFieldMapping`, the generic search routine, and the build-from-response +converter) that `api_configs.py` parameterizes for each individual API, so every +source shares one matching and construction path. +""" + from __future__ import annotations from collections.abc import Callable diff --git a/src/bibtex_build.py b/src/bibtex_build.py index bf34981d..4c3a4361 100644 --- a/src/bibtex_build.py +++ b/src/bibtex_build.py @@ -1,3 +1,11 @@ +"""Entry-type classification and BibTeX entry construction. + +Classifies a record into a BibTeX entry type, maps it to the correct container +field (journal, booktitle, or howpublished), and assembles the entry. Also +provides the scoring-function factory used to rank candidate matches returned by +the search APIs. +""" + from __future__ import annotations import re diff --git a/src/bibtex_utils.py b/src/bibtex_utils.py index f4a888ab..b2456d2c 100644 --- a/src/bibtex_utils.py +++ b/src/bibtex_utils.py @@ -1,3 +1,11 @@ +"""BibTeX parsing, serialization, and matching helpers. + +Parses BibTeX into field dictionaries and serializes them back with a stable +field order, and provides the citation-key, filename, and duplicate-matching +helpers. The serializer is deterministic so cache-hit runs produce +byte-identical `.bib` files. +""" + from __future__ import annotations import html @@ -235,7 +243,7 @@ def parse_bibtex_to_dict(bibtex: str) -> dict[str, Any] | None: # Canonical BibTeX field emission order. Fields not listed are appended in # sorted() order afterwards. This ordering is part of the byte-identity output -# contract (of-bibtex-field-order-stable); do not reorder without updating the +# contract; do not reorder without updating the # golden serializer test. PREFERRED_FIELD_ORDER: tuple[str, ...] = ( "title", diff --git a/src/cache.py b/src/cache.py index 0c02eb3f..340a7045 100644 --- a/src/cache.py +++ b/src/cache.py @@ -1,3 +1,11 @@ +"""File-based API response cache. + +A thread-safe, on-disk cache keyed by namespace and request key, with +monthly-boundary expiry and confirmation-counted negative caching. Persisting +responses between runs is what lets cache-hit executions reproduce +byte-identical output. +""" + from __future__ import annotations import contextlib @@ -57,7 +65,7 @@ def _month_boundary(self) -> float: """Timestamp of the 1st of the CURRENT month (AST), recomputed on every access. A long-lived process that spans a month rollover then starts serving fresh data at the boundary instead of a value frozen at - construction (C4).""" + construction.""" return _month_boundary() def _lock_for(self, namespace: str) -> threading.Lock: @@ -188,7 +196,7 @@ def _write_entry( # ttl_days is accepted for caller intent (and logged in put()), but is # intentionally NOT stored or read back: positive-entry freshness is # governed solely by the monthly boundary in get(), never a rolling - # per-entry TTL (C3). + # per-entry TTL. entry = {"timestamp": time.time(), "data": value} path = self._entry_path(namespace, key) try: diff --git a/src/canonicalize.py b/src/canonicalize.py index b2b1768c..1885a4fe 100644 --- a/src/canonicalize.py +++ b/src/canonicalize.py @@ -1,3 +1,14 @@ +"""Entry-type reclassification and text-normalization rules. + +The reclassification and normalization rules are defined once as ``_rule_*`` +helpers and dispatched in a fixed order per `CanonicalStage`, so the three fix +sites share one implementation. Site A handles orphan and terminal repair (via +`_fixup_bib_entry`), Site B handles existing-file load repair before +enrichment, and Site C is the Phase 4 post-merge pass. Keeping the rule bodies +in one place is what prevents entry types, titles, and booktitles from +oscillating between consecutive runs. +""" + from __future__ import annotations import re @@ -64,7 +75,7 @@ class CanonicalStage(Enum): _PROC_EXT_ABSTRACTS = "Proceedings of the Extended Abstracts" _PROC_OF_THE = "Proceedings of the " -# Preprint howpublished names checked by the misc->inproceedings upgrade (R20). +# Preprint howpublished names checked by the misc->inproceedings upgrade. _R20_PREPRINT_HOWPUBLISHED = ( "arxiv", "biorxiv", @@ -180,10 +191,11 @@ def _rule_doi_backfilled_booktitle_to_misc(entry: dict[str, Any], fields: dict[s """@inproceedings whose booktitle is a DOI-inferred preprint/repository label -> @misc (booktitle -> howpublished). - Inverse of _rule_howpublished_to_inproceedings' DOI-backfill guard: corrects - entries mis-upgraded into a fabricated conference (e.g. booktitle "EGU" for - 10.5194/egusphere, "Institutional Repository" for 10.32920) before that guard - existed. Once downgraded, the gated upgrade leaves them @misc. + Counterpart to _rule_howpublished_to_inproceedings' DOI-backfill guard. It + corrects entries that a DOI-backfilled booktitle would otherwise mis-upgrade + into a fabricated conference (booktitle "EGU" for 10.5194/egusphere, or + "Institutional Repository" for 10.32920). Once downgraded, the gated upgrade + leaves them @misc. """ if entry.get("type") == "inproceedings" and fields.get("booktitle"): doi = (fields.get("doi") or "").strip() @@ -769,7 +781,7 @@ def _rule_strip_preprint_only_publisher(entry: dict[str, Any], fields: dict[str, # --------------------------------------------------------------------------- # Per-stage ordered rule sequences # --------------------------------------------------------------------------- -# Site A (orphan/terminal sweep). Reproduces _fixup_bib_entry's exact rule order. +# Site A applies the orphan and terminal sweep for _fixup_bib_entry, in order. _POSTRUN_ORPHAN_REPAIR_RULES = ( _rule_procedia_to_inproceedings, _rule_pacm_booktitle_to_article, @@ -803,7 +815,7 @@ def _rule_strip_preprint_only_publisher(entry: dict[str, Any], fields: dict[str, _rule_add_url_from_doi, ) -# Site C (Phase-4 post-merge). Reproduces the inline post-merge block's exact order. +# Site C applies the Phase 4 post-merge rules, in order. _POST_MERGE_RULES = ( _rule_article_no_journal_to_misc, _rule_inproceedings_no_booktitle_to_misc, @@ -844,13 +856,13 @@ def _rule_strip_preprint_only_publisher(entry: dict[str, Any], fields: dict[str, _rule_howpublished_to_inproceedings, ) -# Site B (existing-file load repair, before enrichment). Reproduces the inline -# process_article() fixup block's exact rule subset and order. NOTE: this is Site -# B's current subset, NOT the union with Site C: complete entries run Site B and -# return before ever reaching Site C, so C-only terminal rules (e.g. R13 -# url-booktitle->misc, R20 misc->inproceedings, article-no-journal->misc) are -# deliberately ABSENT here. The destructive title==venue delete (N22) and the -# bare-& rewrite trigger stay in main.py around the canonicalize() call. +# Site B applies the existing-file load repair that runs before enrichment, in +# order. It is a deliberate subset of Site C, not the union. A complete entry +# runs Site B and returns before it ever reaches Site C, so the terminal rules +# that only Site C carries (url-booktitle->misc, misc->inproceedings, and +# article-no-journal->misc) are absent here. The destructive title==venue delete +# and the bare-ampersand rewrite run in src/pipeline/article.py around the +# canonicalize() call. _LOAD_REPAIR_RULES = ( _rule_strip_preprint_journal_load, _rule_strip_email_from_author, @@ -893,11 +905,10 @@ def _rule_strip_preprint_only_publisher(entry: dict[str, Any], fields: dict[str, _rule_normalize_howpublished, ) -# COMPLETE_SKIP_FINALIZE (complete entry, enrichment skipped). Folds the single -# live "quick fixup" that ran just before the skip-path write: strip a leaked -# preprint-only publisher. The former "@article + preprint DOI -> @misc" -# quick-fixup that sat alongside it was DEAD CODE (unreachable: _entry_is_complete -# only admits NON-preprint DOIs) and is intentionally NOT reproduced here. +# COMPLETE_SKIP_FINALIZE runs the single fixup that applies just before a +# complete entry is written on the skip-enrichment path, stripping a leaked +# preprint-only publisher. No preprint-to-@misc reclassification is needed here +# because _entry_is_complete only admits entries whose DOI is not a preprint. _COMPLETE_SKIP_FINALIZE_RULES = (_rule_strip_preprint_only_publisher,) _STAGE_RULES = { diff --git a/src/clients/helpers.py b/src/clients/helpers.py index b297788d..d254da0a 100644 --- a/src/clients/helpers.py +++ b/src/clients/helpers.py @@ -1,3 +1,10 @@ +"""Shared helpers for the API client layer. + +Generic candidate scoring by title, author, and year, best-item selection, and +the Scholar and DBLP field-extraction helpers (including HTML cleanup) used by +the individual client modules. +""" + from __future__ import annotations import re diff --git a/src/clients/scholar.py b/src/clients/scholar.py index 7e909a6a..52ad44d6 100644 --- a/src/clients/scholar.py +++ b/src/clients/scholar.py @@ -1,3 +1,11 @@ +"""Google Scholar orchestration layer. + +Fetches an author's publications through SerpAPI and per-article citation detail +through Serply, then deduplicates and merges the resulting publication lists by +title similarity, author overlap, and year proximity. Results are cached so +repeated runs stay fast and deterministic. +""" + from __future__ import annotations import hashlib @@ -58,9 +66,9 @@ def _first_author_sortkey(authors: Any) -> str: def _cache_covers_window(cached: dict[str, Any], min_year: int) -> bool: """Check whether a cached SerpAPI result covers the full contribution window. - Returns *False* when the cache was likely truncated by the old count-based - regime (article count is a multiple of 100 AND the oldest article is still - above *min_year*). + Returns *False* when the cached result looks truncated (the article count is + a multiple of 100 and the oldest article is still above *min_year*), which + suggests a page cap dropped older publications. """ articles = cached.get("articles") or [] if not articles: diff --git a/src/clients/search_apis.py b/src/clients/search_apis.py index 75f8338e..4cbab79f 100644 --- a/src/clients/search_apis.py +++ b/src/clients/search_apis.py @@ -1,3 +1,12 @@ +"""Scholarly metadata API clients. + +Queries Semantic Scholar, Crossref, DOI content negotiation, arXiv, OpenReview, +DBLP, OpenAlex, PubMed, and Europe PMC. Each client follows the same shape, +searching for candidates, scoring and matching them against the target paper, +caching the result (including confirmation-counted negatives), and converting +the chosen record into a BibTeX entry through a ``build_bibtex_from_*`` helper. +""" + from __future__ import annotations import copy @@ -481,8 +490,8 @@ def _reuse_session() -> bool: # All reads of the shared session globals happen under the lock so the # session pointer and its created-at timestamp are read atomically together. - # The previous lock-free fast path could observe a torn state, or return a - # session that a concurrent re-login had just cleared to None (C6). + # Without the lock a reader could observe a torn state, or return a session + # that a concurrent re-login had just cleared to None. with _OPENREVIEW_SESSION_LOCK: # Double-check after acquiring lock (may have been refreshed by another thread) if _reuse_session(): diff --git a/src/clients/serply_scholar.py b/src/clients/serply_scholar.py index ef24b7f0..700dba70 100644 --- a/src/clients/serply_scholar.py +++ b/src/clients/serply_scholar.py @@ -1,10 +1,12 @@ """Google Scholar access via the Serply REST API (api.serply.io). -Replaces the ``scholarly`` library approach with a clean REST client. -Two public functions mirror the contract expected by ``scholar.py``: +A clean REST client for Google Scholar access through the Serply API. It exposes +two public functions: -- ``serply_fetch_author_publications`` — keyword search by author name -- ``serply_fetch_citation`` — title+author search for citation details +- ``serply_fetch_citation`` (title and author search for citation detail), the + entry point used in production by ``scholar.py`` +- ``serply_fetch_author_publications`` (keyword search by author name), a + secondary entry point exercised by the tests Thread safety: all calls are stateless HTTP GETs through ``http_fetch_bytes``, so no locking is required. diff --git a/src/clients/utility_apis.py b/src/clients/utility_apis.py index 2c93a7c7..7bca61e5 100644 --- a/src/clients/utility_apis.py +++ b/src/clients/utility_apis.py @@ -1,3 +1,11 @@ +"""Auxiliary enrichment services. + +Wraps the optional helper services. Gemini generates CamelCase citation-key +titles, DataCite resolves dataset and software DOIs, and ORCID validates +authorship. Each fills a specific gap and degrades gracefully when its key is +absent. +""" + from __future__ import annotations import random diff --git a/src/config.py b/src/config.py index 496a1b32..abbf35a0 100644 --- a/src/config.py +++ b/src/config.py @@ -1,3 +1,12 @@ +"""Central configuration for CiteForge. + +This module is the single source of truth for every tunable constant, including +the source trust hierarchy, similarity thresholds, HTTP rate limits and +timeouts, API endpoints, key-file paths, and the venue and compound-word +dictionaries. Per the config-driven convention these values live here and are +never hardcoded elsewhere. +""" + from __future__ import annotations import os diff --git a/src/doi_utils.py b/src/doi_utils.py index 37fe95ef..12c2fe85 100644 --- a/src/doi_utils.py +++ b/src/doi_utils.py @@ -1,3 +1,10 @@ +"""DOI validation through content negotiation. + +Confirms a candidate DOI by fetching its metadata in CSL-JSON and BibTeX and +checking it against the baseline entry with a strict title-and-author match, so +enrichment only accepts a DOI that genuinely describes the same work. +""" + from __future__ import annotations import contextlib diff --git a/src/exceptions.py b/src/exceptions.py index 90de2eb1..9fed8e2f 100644 --- a/src/exceptions.py +++ b/src/exceptions.py @@ -1,3 +1,10 @@ +"""Shared exception groupings. + +Centralizes the reusable exception-tuple groupings (network, decode, parse, and +file errors) and the `DecodeError` type, so ``except`` clauses stay consistent +across the codebase. +""" + from __future__ import annotations import csv diff --git a/src/http_utils.py b/src/http_utils.py index 44b79fb1..5cc7920e 100644 --- a/src/http_utils.py +++ b/src/http_utils.py @@ -1,3 +1,11 @@ +"""HTTP infrastructure shared by every API client. + +Provides rate-limited, retrying, concurrency-gated requests with per-thread +session rotation and header randomization, plus JSON and text helpers. Secret +query-string values are scrubbed from every URL and exception string before it +can reach a log record. +""" + from __future__ import annotations import json @@ -184,7 +192,7 @@ def reset_api_call_counts() -> None: # with our manual Retry-After handling in _http_request status_forcelist=tuple(c for c in HTTP_RETRY_STATUS_CODES if c not in (429, 503)), # Only auto-retry idempotent GET. POST is intentionally excluded so urllib3 - # never silently re-sends a non-idempotent request body (C1). POSTs still + # never silently re-sends a non-idempotent request body. POSTs still # get manual 429/503 handling in _http_request. allowed_methods=["GET"], # Disable urllib3's own Retry-After handling so it doesn't sleep for @@ -378,7 +386,7 @@ def _http_request( except requests.exceptions.RetryError: # urllib3 already exhausted its own retries for a forced status # (persistent 500/502/504). Do not re-drive it through the manual - # loop, which would compound to ~9 requests for one failure (C1). + # loop, which would compound to ~9 requests for one failure. raise except requests.exceptions.RequestException: if attempt == _MAX_RATE_LIMIT_RETRIES - 1: diff --git a/src/id_utils.py b/src/id_utils.py index 564c8665..c4eed873 100644 --- a/src/id_utils.py +++ b/src/id_utils.py @@ -1,3 +1,11 @@ +"""DOI and arXiv identifier utilities. + +Normalizes DOIs and arXiv identifiers, extracts them from HTML and free text, +and matches external identifiers across sources. Deduplication and enrichment +rely on these normalized forms to compare records that different APIs report in +different shapes. +""" + from __future__ import annotations import re diff --git a/src/io_utils.py b/src/io_utils.py index 01060079..789b933f 100644 --- a/src/io_utils.py +++ b/src/io_utils.py @@ -1,3 +1,10 @@ +"""Filesystem and CSV input/output. + +Reads the API key files and author records, maintains the summary CSV, collects +orphaned output files, and builds the derived output folders (including a2i2). +This is the single boundary between the pipeline and the local filesystem. +""" + from __future__ import annotations import csv diff --git a/src/log_utils.py b/src/log_utils.py index 6733fb33..4417cbb0 100644 --- a/src/log_utils.py +++ b/src/log_utils.py @@ -1,3 +1,10 @@ +"""Colored, category-tagged logging. + +A thread-aware logger with custom STEP and SUCCESS levels and category tags. It +mirrors each worker's output to a per-author log file while writing the main run +log, so a run can be followed both globally and per author. +""" + from __future__ import annotations import contextlib diff --git a/src/merge_utils.py b/src/merge_utils.py index 2ed7127e..fc424ed0 100644 --- a/src/merge_utils.py +++ b/src/merge_utils.py @@ -1,3 +1,12 @@ +"""Trust-based metadata merge and BibTeX persistence. + +`merge_with_policy` blends fields from ranked sources so each record keeps the +most authoritative value for every field while filling genuine gaps from +lower-trust sources, with published records winning over preprints. +`save_entry_to_file` deduplicates against existing output and writes the merged +entry to a stable, collision-free filename. +""" + from __future__ import annotations import contextlib @@ -968,12 +977,12 @@ def save_entry_to_file( n_title = new_fields.get("title", "") preprint_sim = title_similarity(e_title, n_title) if preprint_sim >= SIM_PREPRINT_TITLE_THRESHOLD: - # The preprint/published (XOR) split was already verified as - # the precondition above, so exclude it from the composite - # rather than adding it and subtracting a flat 0.10. Excluding - # is exact and predicate-independent, so a genuine twin whose - # published side still carries a leaked preprint journal is no - # longer wrongly dropped by an over-subtraction. + # The preprint/published (XOR) split is already the + # precondition here, so it is excluded from the composite + # to avoid double-counting. Excluding it keeps the score + # exact and predicate-independent, so a genuine twin whose + # published side still carries a leaked preprint journal is + # scored correctly. effective_score = compute_dedup_score( existing_fields, new_fields, count_preprint_xor=False ) diff --git a/src/models.py b/src/models.py index 7c77997f..9e4a16b9 100644 --- a/src/models.py +++ b/src/models.py @@ -1,3 +1,9 @@ +"""Shared data models. + +Defines the small data structures passed across the pipeline, currently the +author `Record` read from the input CSV. +""" + from __future__ import annotations from dataclasses import dataclass diff --git a/src/pipeline/article.py b/src/pipeline/article.py index ee557cf5..433c0cbf 100644 --- a/src/pipeline/article.py +++ b/src/pipeline/article.py @@ -1,3 +1,13 @@ +"""Per-article enrichment pipeline. + +Each article is carried through Phase 1 (early DOI validation), Phase 2 +(multi-API enrichment), Phase 2.5 (SerpAPI publication-string fallback), +Phase 3 (late DOI discovery), and Phase 4 (trust-based merge and save). The +stages fill genuine gaps from lower-trust sources while preserving the value +carried by the most authoritative source, and the save step deduplicates so a +work is represented exactly once. +""" + from __future__ import annotations import os @@ -365,10 +375,10 @@ def process_article( except (OSError, ValueError, TypeError): continue - # Fixup stale entries loaded from disk before enrichment: the pure entry - # field/type rewrites are single-sourced in src/canonicalize.py at the - # LOAD_REPAIR stage. The destructive title==venue delete (N22) and the - # bare-& rewrite trigger stay here in the pipeline. + # Fix up stale entries loaded from disk before enrichment. The pure entry + # field and type rewrites are single-sourced in src/canonicalize.py at the + # LOAD_REPAIR stage, and the destructive title==venue delete and the + # bare-ampersand rewrite trigger stay here in the pipeline. if existing_file_loaded and baseline_entry is not None: _fixup_written = canonicalize(baseline_entry, stage=CanonicalStage.LOAD_REPAIR) _bl_fields = baseline_entry.get("fields") or {} @@ -416,10 +426,10 @@ def process_article( bib_str = bt.bibtex_from_dict(baseline_entry) safe_write_file(existing_file_path, bib_str) - # NOTE: the former "@article with a preprint DOI -> @misc" quick-fixup was - # removed here as unreachable dead code: _entry_is_complete() (the guard - # above) only returns True for a NON-preprint DOI, so is_secondary_doi() on - # the same field can never be True on this skip-enrichment path. + # No preprint-to-@misc reclassification is needed on this skip-enrichment + # path. _entry_is_complete() (the guard above) only returns True for a + # non-preprint DOI, so is_secondary_doi() on the same field is never True + # here. logger.info("Entry already complete; skipping enrichment", category=LogCategory.SKIP, source=LogSource.SYSTEM) if summary_csv_path and existing_file_path: diff --git a/src/pipeline/postrun.py b/src/pipeline/postrun.py index e48ab298..7323963d 100644 --- a/src/pipeline/postrun.py +++ b/src/pipeline/postrun.py @@ -1,3 +1,11 @@ +"""Post-run finalization tail. + +Runs the deterministic sequence that closes out a run, flushing the summary CSV, +reconciling phantom rows, removing duplicate orphan files, applying the +year-window cleanup, running the post-run fixup pass, building the a2i2 folder, +and rewriting `baseline.json` and `badges.json`. The order is load-bearing. +""" + from __future__ import annotations import csv diff --git a/src/pipeline/scheduler.py b/src/pipeline/scheduler.py index f453d5e6..8e9c6b88 100644 --- a/src/pipeline/scheduler.py +++ b/src/pipeline/scheduler.py @@ -1,3 +1,11 @@ +"""Author-level scheduling. + +Fetches each author's publications from Google Scholar and DBLP, merges and +deduplicates the two lists, prioritizes authors with pending work, and drives +`process_article` across a bounded pool of worker threads with a per-author +time budget. +""" + from __future__ import annotations import os diff --git a/src/text_utils.py b/src/text_utils.py index a3c9116e..9ab7b888 100644 --- a/src/text_utils.py +++ b/src/text_utils.py @@ -1,3 +1,11 @@ +"""Text and author-name normalization and similarity scoring. + +Shared helpers for normalizing titles and author names and for scoring the +similarity between records. The merge, deduplication, and BibTeX-building layers +all compare records through these functions so the notion of the same paper +stays consistent across the pipeline. +""" + from __future__ import annotations import functools @@ -434,7 +442,7 @@ def title_similarity(a: str | None, b: str | None) -> float: Compute a similarity score between two titles after normalization, returning a value between 0 and 1 where higher means more similar. - Uses rapidfuzz for ~10-100x faster fuzzy matching than difflib.SequenceMatcher. + Uses rapidfuzz for fast fuzzy-ratio scoring. """ norm_a = normalize_title(a or "") norm_b = normalize_title(b or "") diff --git a/src/venue.py b/src/venue.py index e0fc6747..09f8eaf7 100644 --- a/src/venue.py +++ b/src/venue.py @@ -1,3 +1,10 @@ +"""Venue classification and howpublished canonicalization. + +Disambiguates conferences from journals, canonicalizes the ``howpublished`` +label for preprint entries, and infers a howpublished value from a DOI prefix +when the venue itself is unknown. +""" + from __future__ import annotations import re diff --git a/tests/test_cache.py b/tests/test_cache.py index 40438b73..8819d49a 100644 --- a/tests/test_cache.py +++ b/tests/test_cache.py @@ -432,7 +432,7 @@ def test_ttl_days_not_stored(tmp_path: Path) -> None: def test_month_boundary_recomputed_not_frozen(tmp_path: Path, monkeypatch: pytest.MonkeyPatch) -> None: - """_month_boundary must recompute per access, not freeze at construction (C4).""" + """_month_boundary must recompute per access, not freeze at construction.""" cache = ResponseCache(cache_dir=str(tmp_path)) _freeze_cache_clock(monkeypatch, datetime(2026, 3, 15, tzinfo=_AST)) march_boundary = cache._month_boundary diff --git a/tests/test_canonicalize.py b/tests/test_canonicalize.py index 9e7150b2..610f9094 100644 --- a/tests/test_canonicalize.py +++ b/tests/test_canonicalize.py @@ -54,7 +54,7 @@ def _complete_finalize(entry: dict[str, Any]) -> dict[str, Any]: # Per-rule tests at POST_MERGE # --------------------------------------------------------------------------- def test_r11_conference_journal_to_inproceedings() -> None: - """R11: @article with a conference-proceedings journal -> @inproceedings.""" + """@article with a conference-proceedings journal -> @inproceedings.""" result = _canon(_article(journal="Proceedings of the International Conference on Machine Learning")) assert result["type"] == "inproceedings" assert result["fields"]["booktitle"] == "Proceedings of the International Conference on Machine Learning" @@ -64,7 +64,7 @@ def test_r11_conference_journal_to_inproceedings() -> None: def test_r14_patent_to_misc() -> None: - """R14: @article with a US patent number as journal -> @misc (journal -> note).""" + """@article with a US patent number as journal -> @misc (journal -> note).""" result = _canon(_article(journal="US Patent 10,123,456")) assert result["type"] == "misc" assert result["fields"]["note"] == "US Patent 10,123,456" @@ -73,7 +73,7 @@ def test_r14_patent_to_misc() -> None: def test_r15_unpublished_to_misc() -> None: - """R15: @article with "Unpublished" journal -> @misc.""" + """@article with "Unpublished" journal -> @misc.""" result = _canon(_article(journal="Unpublished")) assert result["type"] == "misc" assert "journal" not in result["fields"] @@ -81,7 +81,7 @@ def test_r15_unpublished_to_misc() -> None: def test_r16_preprint_journal_to_misc() -> None: - """R16: @article with a preprint server as journal -> @misc (journal -> howpublished).""" + """@article with a preprint server as journal -> @misc (journal -> howpublished).""" result = _canon(_article(journal="arXiv")) assert result["type"] == "misc" assert result["fields"]["howpublished"] == "arXiv" @@ -90,11 +90,12 @@ def test_r16_preprint_journal_to_misc() -> None: def test_r19_misc_downgrade_branch() -> None: - """R19 (misc branch): @article with a preprint DOI and no volume/pages -> @misc. + """An @article with a preprint DOI and no volume/pages is downgraded to @misc + (the misc branch of the preprint-DOI rule). - Exercised via the rule helper directly: at full POST_MERGE the manufactured - howpublished is a plain venue name that R20 subsequently upgrades, so the - misc-downgrade branch is asserted in isolation here. + This exercises the rule helper directly. At full POST_MERGE the manufactured + howpublished is a plain venue name that the misc->inproceedings upgrade would + then promote, so the misc-downgrade branch is asserted in isolation here. """ entry = _article(journal="Journal of Foo", doi="10.48550/arXiv.2101.00001") fields = entry["fields"] @@ -108,7 +109,7 @@ def test_r19_misc_downgrade_branch() -> None: def test_r19_keep_article_strips_preprint_doi() -> None: - """R19 (keep branch): real journal + volume/pages keeps @article, strips preprint DOI/URL.""" + """Keep branch: real journal + volume/pages keeps @article, strips preprint DOI/URL.""" entry = _article( journal="Real Journal", doi="10.48550/arXiv.2101.00002", @@ -126,7 +127,7 @@ def test_r19_keep_article_strips_preprint_doi() -> None: def test_r20_misc_howpublished_to_inproceedings() -> None: - """R20: @misc with a conference/workshop howpublished -> @inproceedings.""" + """@misc with a conference/workshop howpublished -> @inproceedings.""" result = _canon(_article(type="misc", howpublished="International Conference on Learning Representations")) assert result["type"] == "inproceedings" assert result["fields"]["booktitle"] == "International Conference on Learning Representations" @@ -200,7 +201,7 @@ def test_load_repair_strips_bracket_j_title() -> None: def test_load_repair_strip_secondary_doi_keeps_article() -> None: """LOAD_REPAIR strips the preprint DOI/URL when journal + volume/pages exist, - keeping the entry as @article (mirrors POST_MERGE R19 keep-branch).""" + keeping the entry as @article (mirrors the POST_MERGE keep-branch).""" result = _load_repair( _article( journal="Real Journal", @@ -217,8 +218,8 @@ def test_load_repair_strip_secondary_doi_keeps_article() -> None: def test_load_repair_secondary_doi_misc_branch_absent() -> None: - """C-only R19 misc-downgrade is ABSENT at LOAD_REPAIR: an @article with a - preprint DOI but no volume/pages is left unchanged (still @article, DOI kept). + """The POST_MERGE-only misc-downgrade is absent at LOAD_REPAIR. An @article with + a preprint DOI but no volume/pages is left unchanged (still @article, DOI kept). POST_MERGE would downgrade this to @misc; LOAD_REPAIR must not. """ @@ -227,7 +228,7 @@ def test_load_repair_secondary_doi_misc_branch_absent() -> None: assert result["type"] == "article" assert result["fields"]["journal"] == "Journal of Foo" assert result["fields"]["doi"] == "10.48550/arXiv.2101.00001" - # Contrast: POST_MERGE moves it out of @article (downgrade then R20 upgrade), + # Contrast: POST_MERGE moves it out of @article (downgrade then misc->inproceedings upgrade), # so LOAD_REPAIR's keep-as-article behavior is genuinely distinct. post = _canon(entry) assert post["type"] != "article" @@ -235,8 +236,9 @@ def test_load_repair_secondary_doi_misc_branch_absent() -> None: def test_load_repair_r20_misc_howpublished_absent() -> None: - """C-only R20 (misc howpublished -> @inproceedings) is ABSENT at LOAD_REPAIR: - a @misc with a conference howpublished stays @misc (POST_MERGE would upgrade it).""" + """The POST_MERGE-only misc-howpublished-to-@inproceedings upgrade is absent at + LOAD_REPAIR. A @misc with a conference howpublished stays @misc (POST_MERGE + would upgrade it).""" entry = _article(type="misc", howpublished="International Conference on Learning Representations") result = _load_repair(entry) assert result["type"] == "misc" @@ -247,8 +249,8 @@ def test_load_repair_r20_misc_howpublished_absent() -> None: def test_load_repair_r13_url_booktitle_absent() -> None: - """C-only R13 (url-fragment booktitle -> @misc) is ABSENT at LOAD_REPAIR: - an @inproceedings with a URL booktitle stays @inproceedings (POST_MERGE -> @misc).""" + """The POST_MERGE-only url-booktitle-to-@misc downgrade is absent at LOAD_REPAIR. + An @inproceedings with a URL booktitle stays @inproceedings (POST_MERGE -> @misc).""" entry = _article(type="inproceedings", booktitle="https://foo.example/paper") result = _load_repair(entry) assert result["type"] == "inproceedings" diff --git a/tests/test_decision_reinforcement.py b/tests/test_decision_reinforcement.py index 80c7445a..cc104f0d 100644 --- a/tests/test_decision_reinforcement.py +++ b/tests/test_decision_reinforcement.py @@ -4,15 +4,14 @@ synthetic authors, venues, and preprint/published pairs rather than a single example, so the rules are provably general and never hinge on one title, DOI, author, or venue. -Covered fixes: - F1 single canonical preprint-DOI predicate (EGU/OSTI/Qeios/Zenodo recognized; - published journals under the same registrant stay published) - F2 preprint-XOR split counted exactly once (no venue_similarity double-count) - F3 a published-DOI paper is never relabeled as a preprint by a stale journal - F4 a truncated author list never overwrites a more complete one by rank - F5 a record's own preprint self-DOI survives the registry trust gate - F6 published supersedes preprint in the save-time candidate-DOI net - F7 a low-trust specific booktitle does not overwrite a trusted generic one +The invariants covered span a single canonical preprint-DOI predicate (EGU, OSTI, +Qeios, and Zenodo are recognized while published journals under the same registrant +stay published), the preprint/published split counted exactly once in the dedup +composite, a published-DOI paper never relabeled as a preprint by a stale journal, a +truncated author list never overwriting a more complete one by rank, a record's own +preprint self-DOI surviving the registry trust gate, published superseding preprint in +the save-time candidate-DOI net, and a low-trust specific booktitle never overwriting a +trusted generic one. """ from __future__ import annotations @@ -41,7 +40,7 @@ def _inp(**fields: str) -> dict[str, Any]: return _entry("inproceedings", **fields) -# --------------------------------------------------------------------------- F1 +# --------------------------------------------------------------------------- # One canonical predicate: every preprint/grey/data DOI is "secondary" everywhere; # a published journal DOI under the same registrant as a preprint stays published. @@ -96,7 +95,7 @@ def test_published_doi_beats_extended_preprint_doi(pre_doi: str) -> None: assert merged["fields"].get("doi") == "10.1038/s41586-024-00001" -# --------------------------------------------------------------------------- F2 +# --------------------------------------------------------------------------- # The preprint/published (XOR) split is a single explicit signal, never doubled. PREPRINT_SERVER_NAMES = ["bioRxiv", "medRxiv", "arXiv", "arXiv e-prints", "Research Square", "SSRN", "ChemRxiv"] @@ -104,8 +103,8 @@ def test_published_doi_beats_extended_preprint_doi(pre_doi: str) -> None: @pytest.mark.parametrize("server", PREPRINT_SERVER_NAMES) def test_venue_similarity_has_no_preprint_xor_bonus(server: str) -> None: - """venue_similarity is pure string similarity: a preprint-vs-journal pair never - returns the old disguised 0.5 XOR bonus.""" + """venue_similarity is pure string similarity, so a preprint-vs-journal pair + never returns a disguised 0.5 XOR bonus.""" sim = tu.venue_similarity({"journal": server}, {"journal": "Nature Communications"}) assert sim != 0.5 assert sim < 0.5 @@ -114,7 +113,7 @@ def test_venue_similarity_has_no_preprint_xor_bonus(server: str) -> None: @pytest.mark.parametrize("server", PREPRINT_SERVER_NAMES) def test_preprint_xor_contributes_exactly_once(server: str) -> None: """Excluding the XOR signal drops the composite by exactly 0.10 (Signal 6 only), - proving venue_similarity no longer adds a second, hidden XOR contribution.""" + proving venue_similarity adds no second, hidden XOR contribution.""" a = {"title": "Shared Title", "author": "Ada Byron and Carl Ohm", "year": "2020", "journal": server} b = { "title": "Shared Title", @@ -130,8 +129,8 @@ def test_preprint_xor_contributes_exactly_once(server: str) -> None: @pytest.mark.parametrize("suffix", range(6)) def test_distinct_preprint_published_works_do_not_false_merge(suffix: int) -> None: """Two DISTINCT works (different last title word, only partial author overlap, one - preprint one published) must not be merged: the old venue+Signal-6 double-count used - to tip them over 0.60. Parametrised over independent author sets and titles.""" + preprint and one published) must not be merged. Counting the XOR signal only once + keeps their composite below 0.60. Parametrised over independent author sets and titles.""" a = _art( title=f"Robust Graph Kernels for Seismic Inference Case{suffix}", author=f"Ann Lee and Bob Ng{suffix} and Cara Poe{suffix}", @@ -154,9 +153,8 @@ def test_distinct_preprint_published_works_do_not_false_merge(suffix: int) -> No def test_genuine_twin_with_leaked_preprint_journal_still_clears_threshold() -> None: """A real preprint/published twin whose published side still carries a leaked preprint - journal must NOT be dropped. The merge PREPRINT_PAIR site now excludes the XOR signal - exactly (count_preprint_xor=False) instead of subtracting a flat 0.10 that may never - have been added, so the effective score stays above threshold.""" + journal must NOT be dropped. The merge PREPRINT_PAIR site excludes the XOR signal + exactly (count_preprint_xor=False), so the effective score stays above threshold.""" existing = { "title": "Deep Nets for Ocean State", "author": "Ann Lee and Bob Ng", @@ -173,7 +171,7 @@ def test_genuine_twin_with_leaked_preprint_journal_still_clears_threshold() -> N assert effective >= SIM_DEDUP_COMPOSITE_THRESHOLD -# --------------------------------------------------------------------------- F3 +# --------------------------------------------------------------------------- # A published-DOI paper is never relabeled as a preprint by a stale journal string. @@ -199,7 +197,7 @@ def test_genuine_preprint_still_relabeled_to_misc(server: str) -> None: assert server.lower() in entry["fields"].get("howpublished", "").lower() -# --------------------------------------------------------------------------- F4 +# --------------------------------------------------------------------------- # A truncated author list must not overwrite a more complete one by trust alone. @@ -230,7 +228,7 @@ def test_much_more_trusted_source_may_still_correct_authors() -> None: assert len(tu.parse_authors_any(merged["fields"]["author"])) == 2 -# --------------------------------------------------------------------------- F5 +# --------------------------------------------------------------------------- # A record's own preprint self-DOI is definitionally correct and survives the gate. @@ -253,7 +251,7 @@ def test_unverified_published_doi_still_dropped() -> None: assert "doi" not in merged["fields"] -# --------------------------------------------------------------------------- F6 +# --------------------------------------------------------------------------- # Published supersedes preprint in the candidate-DOI net's survivor decision. @@ -269,7 +267,7 @@ def test_net_published_supersedes_preprint_decision(pre_doi: str, pub_doi: str) assert idu.is_secondary_doi(on_disk_doi or "") is True -# --------------------------------------------------------------------------- F7 +# --------------------------------------------------------------------------- # A low-trust specific booktitle must not overwrite a trusted generic one. diff --git a/tests/test_http_utils.py b/tests/test_http_utils.py index 55cc8150..5fc01103 100644 --- a/tests/test_http_utils.py +++ b/tests/test_http_utils.py @@ -8,10 +8,11 @@ class TestSecretRedaction: - """API keys/tokens passed as query params must never reach logs or exception text (defect C2). + """API keys and tokens passed as query params must never reach logs or exception text. - Gemini uses ``?key=`` and SerpAPI uses ``&api_key=``; those URLs previously - leaked into WARN logs (committed to a public branch) via exception messages. + Gemini uses ``?key=`` and SerpAPI uses ``&api_key=``. These URLs must not reach + a WARN log or an exception message, since run logs can be committed to a public + branch. """ @pytest.mark.parametrize( @@ -50,7 +51,7 @@ def test_decode_json_valid_passthrough(self) -> None: class TestRetryBounding: """Persistent 5xx must not compound urllib3 x manual retries into ~9 requests, - and non-idempotent POST must not be auto-retried by urllib3 (defect C1). + and non-idempotent POST must not be auto-retried by urllib3. 429/503 stays single-layer (excluded from urllib3, handled by the manual loop). """ diff --git a/tests/test_regression.py b/tests/test_regression.py index 38aa80fb..8f088670 100644 --- a/tests/test_regression.py +++ b/tests/test_regression.py @@ -1350,7 +1350,7 @@ def test_non_abbreviated_venue_unchanged(self) -> None: class TestBiorxivDoiPrefix: - """L3: bioRxiv DOIs with any 10.1101/ prefix should be classified as preprint.""" + """bioRxiv DOIs with any 10.1101/ prefix should be classified as preprint.""" def test_biorxiv_old_numeric_doi(self) -> None: """Pre-2020 bioRxiv DOI (no date prefix) should be secondary.""" @@ -1370,7 +1370,7 @@ def test_non_biorxiv_doi(self) -> None: class TestDoiUrlDecoding: - """L15: _norm_doi should URL-decode percent-encoded characters.""" + """_norm_doi should URL-decode percent-encoded characters.""" def test_percent_encoded_slash(self) -> None: """DOI with %2F should normalize to match plain slash version.""" @@ -1385,7 +1385,7 @@ def test_double_encoded(self) -> None: class TestNobleParticleMatching: - """B8/L8: Noble particles (van, von, de, etc.) should produce consistent signatures.""" + """Noble particles (van, von, de, etc.) should produce consistent signatures.""" def test_van_der_waals_first_last(self) -> None: """'Johan van der Waals' in First Last format.""" @@ -1437,7 +1437,7 @@ def test_hyphenated_surname_comma_format(self) -> None: class TestEllipsisPlaceholder: - """L5: Only short strings with ellipsis should be treated as placeholder.""" + """Only short strings with ellipsis should be treated as placeholder.""" def test_short_ellipsis_is_placeholder(self) -> None: """Short string with ellipsis should be a placeholder.""" @@ -1456,7 +1456,7 @@ def test_unicode_ellipsis_short(self) -> None: class TestCJKTitleNormalization: - """L7: CJK-only titles should not normalize to empty string.""" + """CJK-only titles should not normalize to empty string.""" def test_cjk_title_not_empty(self) -> None: """Chinese characters should not produce empty normalized title.""" @@ -1477,7 +1477,7 @@ def test_mixed_cjk_ascii(self) -> None: class TestHtmlEntityInNormalizeTitle: - """D7: HTML entities should be decoded before title normalization.""" + """HTML entities should be decoded before title normalization.""" def test_amp_decoded(self) -> None: """& should become & in normalized title.""" @@ -1498,7 +1498,7 @@ def test_numeric_entity(self) -> None: class TestAuthorOverlapWithInitials: - """L9: author_overlap_ratio should distinguish authors with same last name but different initials.""" + """author_overlap_ratio should distinguish authors with same last name but different initials.""" def test_same_last_different_initials_distinguished(self) -> None: """'J. Smith' and 'K. Smith' should not be merged when both have initials.""" @@ -1527,13 +1527,13 @@ def test_no_initials_falls_back(self) -> None: class TestVenueSimilarityPreprint: - """L14 (reinforced): venue_similarity is PURE venue-string similarity. The preprint / - published (XOR) split is no longer smuggled in as a 0.5 bonus; it is a single explicit - signal in compute_dedup_score (Signal 6), counted exactly once. Rewarding it in both - places double-counted the same evidence and tipped distinct works over threshold.""" + """venue_similarity is PURE venue-string similarity. The preprint/published (XOR) + split is not folded in as a 0.5 bonus here; it is a single explicit signal in + compute_dedup_score (Signal 6), counted exactly once. Rewarding it in both places + would double-count the same evidence and tip distinct works over threshold.""" def test_biorxiv_vs_journal_is_plain_fuzz_not_xor_bonus(self) -> None: - """bioRxiv vs a dissimilar journal -> plain fuzz (< 0.5), not the old 0.5 XOR bonus.""" + """bioRxiv vs a dissimilar journal -> plain fuzz (< 0.5), not a 0.5 XOR bonus.""" sim = text_utils.venue_similarity( {"journal": "bioRxiv"}, {"journal": "Nature Medicine"}, @@ -1541,7 +1541,7 @@ def test_biorxiv_vs_journal_is_plain_fuzz_not_xor_bonus(self) -> None: assert sim < 0.5 def test_arxiv_eprints_vs_conference_is_plain_fuzz_not_xor_bonus(self) -> None: - """arXiv e-prints vs conference -> plain fuzz (< 0.5), not the old 0.5 XOR bonus.""" + """arXiv e-prints vs conference -> plain fuzz (< 0.5), not a 0.5 XOR bonus.""" sim = text_utils.venue_similarity( {"journal": "arXiv e-prints"}, {"booktitle": "NeurIPS 2024"}, @@ -1562,7 +1562,7 @@ def test_preprint_xor_counted_once_in_composite(self) -> None: class TestBothPreprintDoiDedup: - """B6: Two entries with different preprint DOIs should NOT match.""" + """Two entries with different preprint DOIs should NOT match.""" def test_different_arxiv_dois_not_matched(self) -> None: """Two different arXiv preprints should not be considered duplicates.""" @@ -1593,7 +1593,7 @@ def test_different_arxiv_dois_not_matched(self) -> None: class TestYearGapWidened: - """L6: Year gap > 3 should reject, <= 3 should allow preprint→published.""" + """Year gap > 3 should reject, <= 3 should allow preprint→published.""" def test_3_year_gap_allowed(self) -> None: """A 3-year gap (preprint in 2021, published in 2024) should allow matching.""" @@ -1651,7 +1651,7 @@ def test_5_year_gap_rejected(self) -> None: class TestDoiConflictPreserveUpgrade: - """B1: DOI merge should not revert a preprint→published upgrade.""" + """DOI merge should not revert a preprint→published upgrade.""" def test_preprint_doi_upgraded_to_published(self) -> None: """When primary has arXiv DOI and enricher has published DOI, keep published.""" @@ -1674,7 +1674,7 @@ def test_preprint_doi_upgraded_to_published(self) -> None: class TestPhantomArxivJournal: - """B2: 'arXiv e-prints' journal should be cleared when published DOI exists.""" + """'arXiv e-prints' journal should be cleared when published DOI exists.""" def test_arxiv_journal_cleared_with_published_doi(self) -> None: """When eprint removed due to published DOI, phantom journal should also go.""" @@ -1759,7 +1759,7 @@ def test_journal_backfilled_after_phantom_removal(self) -> None: class TestIncollectionPromotionRestricted: - """B4: incollection→inproceedings should only fire for GENERIC_SERIES_NAMES.""" + """incollection→inproceedings should only fire for GENERIC_SERIES_NAMES.""" def test_generic_series_promotes(self) -> None: """incollection with LNCS booktitle should become inproceedings.""" @@ -1793,7 +1793,7 @@ def test_real_book_chapter_stays(self) -> None: class TestCslArticleTypePreserved: - """L16: CSL/doi_bibtex article type should not be overridden to inproceedings.""" + """CSL/doi_bibtex article type should not be overridden to inproceedings.""" def test_proceedings_journal_becomes_inproceedings(self) -> None: """Proceedings-named venues should become @inproceedings, not @article.""" @@ -1852,7 +1852,7 @@ def test_proceedings_on_also_becomes_inproceedings(self) -> None: class TestPreprintServersNoFalsePositives: - """L19: Journals with 'preprint' substring should not be misclassified.""" + """Journals with 'preprint' substring should not be misclassified.""" def test_preprint_not_in_servers(self) -> None: """The generic word 'preprint' should not be in PREPRINT_SERVERS.""" @@ -1871,7 +1871,7 @@ def test_preprints_dot_org_present(self) -> None: class TestMergeDuplicateThresholdRaised: - """L1: SIM_MERGE_DUPLICATE_THRESHOLD should be 0.95 (was 0.9).""" + """SIM_MERGE_DUPLICATE_THRESHOLD should be 0.95.""" def test_threshold_value(self) -> None: assert SIM_MERGE_DUPLICATE_THRESHOLD == 0.95 @@ -1907,7 +1907,7 @@ def test_marginal_title_not_merged(self) -> None: class TestSemaphoreReleasedDuring429: - """B9: Global semaphore should be released before sleeping on 429.""" + """Global semaphore should be released before sleeping on 429.""" def test_429_sleep_outside_semaphore(self) -> None: """Verify the semaphore is not held during 429 retry sleep.""" @@ -1933,7 +1933,7 @@ def test_429_sleep_outside_semaphore(self) -> None: class TestTokenBucketJitter: - """L17: TokenBucketRateLimiter.acquire() should include jitter in sleep.""" + """TokenBucketRateLimiter.acquire() should include jitter in sleep.""" def test_jitter_import_and_usage(self) -> None: """Verify that random.uniform is called during acquire when sleep is needed.""" @@ -1967,7 +1967,7 @@ def capture_sleep(duration: float) -> None: class TestEmptyNameSkipped: - """L12: Records with empty Name but valid IDs should be skipped.""" + """Records with empty Name but valid IDs should be skipped.""" def test_empty_name_with_scholar_id_skipped(self, tmp_path: Any) -> None: """Record with Scholar ID but no Name should be skipped.""" @@ -1982,7 +1982,7 @@ def test_empty_name_with_scholar_id_skipped(self, tmp_path: Any) -> None: class TestCslEventNameFallback: - """B10: bibtex_from_csl should use event-name when container is a generic series.""" + """bibtex_from_csl should use event-name when container is a generic series.""" def test_lncs_with_event_name(self) -> None: """When CSL container is LNCS and event-name exists, use event name.""" @@ -3355,7 +3355,7 @@ def test_orcid_swallows_decode_error(self) -> None: class TestOpenReviewSessionThreadSafety: """Concurrent openreview_login calls must reuse a valid cached session - atomically: never re-login and never return a torn/None value (C6).""" + atomically: never re-login and never return a torn/None value.""" def test_concurrent_reuse_no_relogin(self) -> None: import threading @@ -3397,7 +3397,7 @@ def _worker() -> None: class TestDoiBackfilledPreprintNotFabricatedConference: """A DOI-inferred preprint/repository label must never become a fabricated - @inproceedings venue (I1). infer_howpublished_from_doi returns labels like + @inproceedings venue. infer_howpublished_from_doi returns labels like "EGU", "Preprint", "Institutional Repository" that are not conference names; R20 must not upgrade them, and any already-upgraded entry must self-heal. A REAL venue that merely carries a preprint-prefix DOI stays @inproceedings. From 89bc16bcf1fc378386bf5319359cfc34547c80f8 Mon Sep 17 00:00:00 2001 From: Gabriel Spadon Date: Thu, 2 Jul 2026 08:04:53 -0300 Subject: [PATCH 42/54] fix: correct and auto-sync README stat badges from badges.json --- .github/workflows/monthly-refresh.yml | 8 ++++---- README.md | 4 ++-- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/.github/workflows/monthly-refresh.yml b/.github/workflows/monthly-refresh.yml index 62956760..77f785a5 100644 --- a/.github/workflows/monthly-refresh.yml +++ b/.github/workflows/monthly-refresh.yml @@ -171,12 +171,12 @@ jobs: # Update README badges from badges.json if [ -f output/badges.json ]; then LAST_UPDATED=$(python3 -c "import json; print(json.load(open('output/badges.json'))['last_updated'])") - POS_HITS=$(python3 -c "import json; print(json.load(open('output/badges.json'))['cache_positive_hits'])") - NEG_HITS=$(python3 -c "import json; print(json.load(open('output/badges.json'))['cache_negative_hits'])") + TOTAL_QUERIES=$(python3 -c "import json; print(json.load(open('output/badges.json'))['total_queries'])") + HIT_RATE=$(python3 -c "import json; print(json.load(open('output/badges.json'))['hit_rate'])") LAST_UPDATED_ESC=$(echo "$LAST_UPDATED" | sed 's/-/--/g') sed -i "s|Updated-[0-9]*--[0-9]*-blue|Updated-${LAST_UPDATED_ESC}-blue|" README.md - sed -i "s|Cache_Hits-[0-9]*_positive-brightgreen|Cache_Hits-${POS_HITS}_positive-brightgreen|" README.md - sed -i "s|Cache_Misses-[0-9]*_negative-orange|Cache_Misses-${NEG_HITS}_negative-orange|" README.md + sed -i "s|Queries-[0-9]*-8A2BE2|Queries-${TOTAL_QUERIES}-8A2BE2|" README.md + sed -i "s|Cache_Hit_Rate-[0-9.]*%25-2ea44f|Cache_Hit_Rate-${HIT_RATE}%25-2ea44f|" README.md fi git add output/ README.md diff --git a/README.md b/README.md index c91725e3..443bfdb0 100644 --- a/README.md +++ b/README.md @@ -6,8 +6,8 @@ License
Last Updated - Total Queries - Cache Hit Rate + Total Queries + Cache Hit Rate

From c849b41c893a16d13bd74e3ccb36c63039f3fd63 Mon Sep 17 00:00:00 2001 From: Gabriel Spadon Date: Thu, 2 Jul 2026 08:04:53 -0300 Subject: [PATCH 43/54] docs: name the project in the package description --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index e0e2b879..b3c2f6ee 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,7 +1,7 @@ [project] name = "src" version = "1.0.0" -description = "Automated BibTeX generation and metadata enrichment tool" +description = "CiteForge: trust-based BibTeX metadata aggregation from scholarly APIs" requires-python = ">=3.10" readme = "README.md" license = { text = "MIT" } From cc2203773b9bd46cadd9f639868f405817634e20 Mon Sep 17 00:00:00 2001 From: Gabriel Spadon Date: Thu, 2 Jul 2026 08:17:43 -0300 Subject: [PATCH 44/54] test: lock in the Gemini header key check and drop audit tags --- tests/test_cache.py | 2 +- tests/test_regression.py | 16 ++++++++++++++-- 2 files changed, 15 insertions(+), 3 deletions(-) diff --git a/tests/test_cache.py b/tests/test_cache.py index 8819d49a..0e0c6da8 100644 --- a/tests/test_cache.py +++ b/tests/test_cache.py @@ -421,7 +421,7 @@ def test_safe_negative_expired_december() -> None: def test_ttl_days_not_stored(tmp_path: Path) -> None: - """ttl_days must not be written into cache entries (C3: written-but-never-read).""" + """ttl_days must not be written into cache entries (they are never read back).""" cache = ResponseCache(cache_dir=str(tmp_path)) cache.put("ns", "k", {"v": 1}, ttl_days=99) entry = json.loads(Path(cache._entry_path("ns", "k")).read_text(encoding="utf-8")) diff --git a/tests/test_regression.py b/tests/test_regression.py index 8f088670..401bd4dd 100644 --- a/tests/test_regression.py +++ b/tests/test_regression.py @@ -1174,6 +1174,18 @@ def test_gemini_calls_http_post_json(self, mock_post: MagicMock) -> None: url = mock_post.call_args[0][0] assert "generativelanguage.googleapis.com" in url + @patch("src.clients.utility_apis.http_post_json") + def test_gemini_key_travels_in_header_not_url(self, mock_post: MagicMock) -> None: + """The API key must be sent as the x-goog-api-key header and never appear in the URL.""" + mock_post.return_value = {"candidates": [{"content": {"parts": [{"text": "DeepNets"}]}}]} + gemini_generate_short_title("Deep Nets for Ocean State", "SECRET-KEY-123") + mock_post.assert_called_once() + url = mock_post.call_args[0][0] + headers = mock_post.call_args.kwargs.get("headers", {}) + assert headers.get("x-goog-api-key") == "SECRET-KEY-123" + assert "SECRET-KEY-123" not in url + assert "key=" not in url + @patch("src.clients.utility_apis.http_post_json") def test_gemini_handles_value_error(self, mock_post: MagicMock) -> None: """Gemini should handle ValueError from non-JSON responses gracefully.""" @@ -1703,7 +1715,7 @@ def test_arxiv_journal_cleared_with_published_doi(self) -> None: ), ] merged = merge_utils.merge_with_policy(entry, enrichers) - # After B2: eprint removed because published DOI exists, + # The eprint is removed because a published DOI exists, # journal should be the enricher's journal, not "arXiv e-prints" journal = merged["fields"].get("journal", "") assert journal.lower() not in ("arxiv e-prints", "arxiv") @@ -3399,7 +3411,7 @@ class TestDoiBackfilledPreprintNotFabricatedConference: """A DOI-inferred preprint/repository label must never become a fabricated @inproceedings venue. infer_howpublished_from_doi returns labels like "EGU", "Preprint", "Institutional Repository" that are not conference names; - R20 must not upgrade them, and any already-upgraded entry must self-heal. + the conference upgrade must not fire on them, and any already-upgraded entry must self-heal. A REAL venue that merely carries a preprint-prefix DOI stays @inproceedings. """ From a4ff516a49270da6d67c274519006c78f5c9f085 Mon Sep 17 00:00:00 2001 From: Gabriel Spadon Date: Thu, 2 Jul 2026 08:17:43 -0300 Subject: [PATCH 45/54] docs: recast README em-dashes and fix postrun and license drift --- CLAUDE.md | 2 +- LICENSE | 2 +- README.md | 8 ++++---- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/CLAUDE.md b/CLAUDE.md index 7aa5f82f..dfe9e6cb 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -28,7 +28,7 @@ Ruff config: line-length 120, rules E/F/W/I/N/UP/B/C4/SIM/RUF/S (see pyproject.t ## Architecture -`main.py` is a thin command-line entry point (~120 LOC) that loads API keys, reads author records, and delegates to the `src/pipeline/` package (`article.py` for per-article enrichment, `scheduler.py` for author-level scheduling, `postrun.py` for the post-run tail). Each article passes through Phase 1 (DOI validation) → Phase 2 (multi-API enrichment) → Phase 2.5 (SerpAPI publication string fallback) → Phase 3 (late DOI inference) → Phase 4 (trust-based merge + save). Post-run steps run in order: flush CSV → reconcile phantoms → remove orphans → year-window cleanup → build a2i2 → rebuild baseline.json. +`main.py` is a thin command-line entry point (~120 LOC) that loads API keys, reads author records, and delegates to the `src/pipeline/` package (`article.py` for per-article enrichment, `scheduler.py` for author-level scheduling, `postrun.py` for the post-run tail). Each article passes through Phase 1 (DOI validation) → Phase 2 (multi-API enrichment) → Phase 2.5 (SerpAPI publication string fallback) → Phase 3 (late DOI inference) → Phase 4 (trust-based merge + save). Post-run steps run in order: flush CSV → reconcile phantoms → remove orphans → year-window cleanup → post-run fixup → build a2i2 → rebuild baseline.json → rebuild badges.json. Trust hierarchy in `src/merge_utils.py:merge_with_policy()` merges fields from 13 ranked sources with special override rules for DOI (published > preprint), journal (never downgrade to preprint), title (prefer longer), pages (reject invalid), and booktitle (upgrade generic series to conference name). diff --git a/LICENSE b/LICENSE index c70771bf..918e18ae 100644 --- a/LICENSE +++ b/LICENSE @@ -1,6 +1,6 @@ MIT License -Copyright (c) 2025 Gabriel Spadon +Copyright (c) 2025-2026 Gabriel Spadon Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/README.md b/README.md index 443bfdb0..20d1307f 100644 --- a/README.md +++ b/README.md @@ -31,7 +31,7 @@ CiteForge takes care of this. Point it at a list of authors with their Google Sc - Merge fields using a **multi-level trust hierarchy** that prefers authoritative sources; and, - Output clean, LaTeX-ready `.bib` files organized by author. -The result is deterministic — on cache-hit runs, CiteForge produces **byte-identical output** across consecutive runs, verified by SHA-256 checksums. +The result is deterministic. On cache-hit runs, CiteForge produces **byte-identical output** across consecutive runs, verified by SHA-256 checksums. ## Getting Started @@ -61,7 +61,7 @@ python3 main.py data/custom.csv # Custom input python3 main.py --force # Force re-enrichment ``` -The input CSV has three columns — name, Scholar link, and an optional DBLP link: +The input CSV has three columns (name, Scholar link, and an optional DBLP link): ```csv Name,Scholar Link,DBLP Link @@ -95,7 +95,7 @@ To maintain efficiency and stability, author queries run in parallel while respe ## Data Sources -[SerpAPI](https://serpapi.com/) and [Serply](https://serply.io/) require keys — everything else is free or optional: +[SerpAPI](https://serpapi.com/) and [Serply](https://serply.io/) require keys. Everything else is free or optional: - **Required:** [SerpAPI](https://serpapi.com/) (Google Scholar), [Serply](https://serply.io/) (citation details); - **Recommended:** [Semantic Scholar](https://www.semanticscholar.org/); @@ -122,4 +122,4 @@ If you use CiteForge in your research or find it useful, please consider citing ## License -This project is licensed under the **MIT [License](LICENSE)** — you're free to use, modify, and distribute it for any purpose. +This project is licensed under the **MIT [License](LICENSE)**. You're free to use, modify, and distribute it for any purpose. From a96e8f2a13e84c4ffa4fb7c68e271ed3e4c93407 Mon Sep 17 00:00:00 2001 From: Gabriel Spadon Date: Thu, 2 Jul 2026 08:17:43 -0300 Subject: [PATCH 46/54] ci: gate coverage on the deterministic unit floor --- .github/workflows/tests.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index d30d8b59..55063db2 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -83,7 +83,7 @@ jobs: echo "$GEMINI_KEY" > keys/Gemini.key - name: Run tests with coverage - run: pytest --cov=src --cov=main --cov-report=term-missing --cov-report=xml --cov-fail-under=60 + run: pytest --cov=src --cov=main --cov-report=term-missing --cov-report=xml --cov-fail-under=55 - name: Upload coverage report if: always() From a392ea8c0fd75e9d85e1516c1dabcaf7f651116e Mon Sep 17 00:00:00 2001 From: Gabriel Spadon Date: Thu, 2 Jul 2026 08:35:14 -0300 Subject: [PATCH 47/54] refactor: rename the package from src to citeforge --- .github/workflows/tests.yml | 6 +- CLAUDE.md | 14 +- README.md | 2 +- {src => citeforge}/__init__.py | 0 {src => citeforge}/api_configs.py | 0 {src => citeforge}/api_generics.py | 0 {src => citeforge}/bibtex_build.py | 0 {src => citeforge}/bibtex_utils.py | 0 {src => citeforge}/cache.py | 0 {src => citeforge}/canonicalize.py | 14 +- {src => citeforge}/clients/__init__.py | 0 {src => citeforge}/clients/helpers.py | 0 {src => citeforge}/clients/scholar.py | 0 {src => citeforge}/clients/search_apis.py | 0 {src => citeforge}/clients/serpapi_scholar.py | 0 {src => citeforge}/clients/serply_scholar.py | 0 {src => citeforge}/clients/utility_apis.py | 0 {src => citeforge}/config.py | 0 {src => citeforge}/doi_utils.py | 0 {src => citeforge}/exceptions.py | 0 {src => citeforge}/fsscan.py | 0 {src => citeforge}/http_utils.py | 0 {src => citeforge}/id_utils.py | 0 {src => citeforge}/io_utils.py | 0 {src => citeforge}/log_utils.py | 0 {src => citeforge}/merge_utils.py | 0 {src => citeforge}/models.py | 0 {src => citeforge}/pipeline/__init__.py | 0 {src => citeforge}/pipeline/article.py | 42 ++--- {src => citeforge}/pipeline/postrun.py | 20 +-- {src => citeforge}/pipeline/scheduler.py | 20 +-- {src => citeforge}/publication_parser.py | 0 {src => citeforge}/text_utils.py | 0 {src => citeforge}/textnorm.py | 8 +- {src => citeforge}/venue.py | 0 main.py | 18 +- pyproject.toml | 9 +- sonar-project.properties | 8 +- tests/fixtures.py | 2 +- tests/test_apis.py | 6 +- tests/test_cache.py | 18 +- tests/test_canonicalize.py | 4 +- tests/test_config.py | 4 +- tests/test_core.py | 4 +- tests/test_decision_reinforcement.py | 12 +- tests/test_deduplication.py | 4 +- tests/test_fsscan.py | 4 +- tests/test_http_utils.py | 4 +- tests/test_integration.py | 10 +- tests/test_io_csv.py | 4 +- tests/test_pipeline.py | 4 +- tests/test_publication_parser.py | 2 +- tests/test_regression.py | 156 +++++++++--------- tests/test_scholar.py | 50 +++--- 54 files changed, 228 insertions(+), 221 deletions(-) rename {src => citeforge}/__init__.py (100%) rename {src => citeforge}/api_configs.py (100%) rename {src => citeforge}/api_generics.py (100%) rename {src => citeforge}/bibtex_build.py (100%) rename {src => citeforge}/bibtex_utils.py (100%) rename {src => citeforge}/cache.py (100%) rename {src => citeforge}/canonicalize.py (99%) rename {src => citeforge}/clients/__init__.py (100%) rename {src => citeforge}/clients/helpers.py (100%) rename {src => citeforge}/clients/scholar.py (100%) rename {src => citeforge}/clients/search_apis.py (100%) rename {src => citeforge}/clients/serpapi_scholar.py (100%) rename {src => citeforge}/clients/serply_scholar.py (100%) rename {src => citeforge}/clients/utility_apis.py (100%) rename {src => citeforge}/config.py (100%) rename {src => citeforge}/doi_utils.py (100%) rename {src => citeforge}/exceptions.py (100%) rename {src => citeforge}/fsscan.py (100%) rename {src => citeforge}/http_utils.py (100%) rename {src => citeforge}/id_utils.py (100%) rename {src => citeforge}/io_utils.py (100%) rename {src => citeforge}/log_utils.py (100%) rename {src => citeforge}/merge_utils.py (100%) rename {src => citeforge}/models.py (100%) rename {src => citeforge}/pipeline/__init__.py (100%) rename {src => citeforge}/pipeline/article.py (98%) rename {src => citeforge}/pipeline/postrun.py (95%) rename {src => citeforge}/pipeline/scheduler.py (96%) rename {src => citeforge}/publication_parser.py (100%) rename {src => citeforge}/text_utils.py (100%) rename {src => citeforge}/textnorm.py (97%) rename {src => citeforge}/venue.py (100%) diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 55063db2..ba2617d1 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -32,10 +32,10 @@ jobs: pip install -e .[dev] - name: Lint (ruff) - run: ruff check src/ tests/ main.py + run: ruff check citeforge/ tests/ main.py - name: Type check (mypy) - run: mypy src/ main.py + run: mypy citeforge/ main.py test: runs-on: ubuntu-latest @@ -83,7 +83,7 @@ jobs: echo "$GEMINI_KEY" > keys/Gemini.key - name: Run tests with coverage - run: pytest --cov=src --cov=main --cov-report=term-missing --cov-report=xml --cov-fail-under=55 + run: pytest --cov=citeforge --cov=main --cov-report=term-missing --cov-report=xml --cov-fail-under=55 - name: Upload coverage report if: always() diff --git a/CLAUDE.md b/CLAUDE.md index dfe9e6cb..9136d2cc 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -17,8 +17,8 @@ python3 main.py --force # Force re-enrichment (ignore cache completeness) All three must pass before merge: ```bash -ruff check src/ tests/ main.py # Lint -mypy src/ main.py # Type check (strict, ignore_missing_imports) +ruff check citeforge/ tests/ main.py # Lint +mypy citeforge/ main.py # Type check (strict, ignore_missing_imports) pytest tests/ -v --tb=short # Tests (full suite, Python 3.10-3.13) ``` @@ -28,9 +28,9 @@ Ruff config: line-length 120, rules E/F/W/I/N/UP/B/C4/SIM/RUF/S (see pyproject.t ## Architecture -`main.py` is a thin command-line entry point (~120 LOC) that loads API keys, reads author records, and delegates to the `src/pipeline/` package (`article.py` for per-article enrichment, `scheduler.py` for author-level scheduling, `postrun.py` for the post-run tail). Each article passes through Phase 1 (DOI validation) → Phase 2 (multi-API enrichment) → Phase 2.5 (SerpAPI publication string fallback) → Phase 3 (late DOI inference) → Phase 4 (trust-based merge + save). Post-run steps run in order: flush CSV → reconcile phantoms → remove orphans → year-window cleanup → post-run fixup → build a2i2 → rebuild baseline.json → rebuild badges.json. +`main.py` is a thin command-line entry point (~120 LOC) that loads API keys, reads author records, and delegates to the `citeforge/pipeline/` package (`article.py` for per-article enrichment, `scheduler.py` for author-level scheduling, `postrun.py` for the post-run tail). Each article passes through Phase 1 (DOI validation) → Phase 2 (multi-API enrichment) → Phase 2.5 (SerpAPI publication string fallback) → Phase 3 (late DOI inference) → Phase 4 (trust-based merge + save). Post-run steps run in order: flush CSV → reconcile phantoms → remove orphans → year-window cleanup → post-run fixup → build a2i2 → rebuild baseline.json → rebuild badges.json. -Trust hierarchy in `src/merge_utils.py:merge_with_policy()` merges fields from 13 ranked sources with special override rules for DOI (published > preprint), journal (never downgrade to preprint), title (prefer longer), pages (reject invalid), and booktitle (upgrade generic series to conference name). +Trust hierarchy in `citeforge/merge_utils.py:merge_with_policy()` merges fields from 13 ranked sources with special override rules for DOI (published > preprint), journal (never downgrade to preprint), title (prefer longer), pages (reject invalid), and booktitle (upgrade generic series to conference name). ## Three-Way Fix Pattern (CRITICAL) @@ -51,9 +51,9 @@ The following fixes are also applied in all 3 locations: ## Key Conventions -- **Config-driven**: All thresholds, API endpoints, trust order, rate limits, compound word dictionaries live in `src/config.py`. Never hardcode these values elsewhere. +- **Config-driven**: All thresholds, API endpoints, trust order, rate limits, compound word dictionaries live in `citeforge/config.py`. Never hardcode these values elsewhere. - **Determinism**: Pipeline produces byte-identical output across consecutive cache-hit runs. Use `sorted()` for all directory/file iterations. No randomization in output-affecting code. -- **DOI normalization**: Always use `_norm_doi()` from `src/id_utils.py`. Always pair DOI matches with `title_similarity >= 0.55` check. +- **DOI normalization**: Always use `_norm_doi()` from `citeforge/id_utils.py`. Always pair DOI matches with `title_similarity >= 0.55` check. - **Preprint detection**: Uses `PREPRINT_SERVERS`, `PREPRINT_DOI_PREFIXES`, and `PREPRINT_ONLY_PUBLISHERS`. Check all three for completeness. - **Container fields**: `@article` → `journal`, `@inproceedings`/`@incollection` → `booktitle`, `@misc` → `howpublished`. See `get_container_field()`. - **Repository guard**: `REPOSITORY_AS_JOURNAL` (Zenodo, OSTI, Figshare, etc.) prevents @misc→@inproceedings oscillation. @@ -67,7 +67,7 @@ The following fixes are also applied in all 3 locations: ## Testing Patterns -- Tests in `tests/` mirror `src/` modules (e.g., `test_merge.py` tests `merge_utils.py`) +- Tests in `tests/` mirror `citeforge/` modules (e.g., `test_merge.py` tests `merge_utils.py`) - `tests/conftest.py` + `tests/fixtures.py` provide shared fixtures - Integration tests requiring API keys auto-skip when keys unavailable - Use `monkeypatch` for HTTP mocking; never make real API calls in unit tests diff --git a/README.md b/README.md index 20d1307f..3a8b694d 100644 --- a/README.md +++ b/README.md @@ -91,7 +91,7 @@ A trust-based consolidation stage merges the collected records according to sour The pipeline further corrects recurrent metadata issues, such as fragmented compound words, misclassified publication types, invalid page ranges, and titles written entirely in capital letters. Deterministic caching ensures that cache-hit executions produce byte-identical outputs, verified through SHA-256 checksums. -To maintain efficiency and stability, author queries run in parallel while respecting per-API rate limits. All configurable parameters, including source trust order, similarity thresholds, rate limits, and venue mappings, are centralized in [`src/config.py`](src/config.py). +To maintain efficiency and stability, author queries run in parallel while respecting per-API rate limits. All configurable parameters, including source trust order, similarity thresholds, rate limits, and venue mappings, are centralized in [`citeforge/config.py`](citeforge/config.py). ## Data Sources diff --git a/src/__init__.py b/citeforge/__init__.py similarity index 100% rename from src/__init__.py rename to citeforge/__init__.py diff --git a/src/api_configs.py b/citeforge/api_configs.py similarity index 100% rename from src/api_configs.py rename to citeforge/api_configs.py diff --git a/src/api_generics.py b/citeforge/api_generics.py similarity index 100% rename from src/api_generics.py rename to citeforge/api_generics.py diff --git a/src/bibtex_build.py b/citeforge/bibtex_build.py similarity index 100% rename from src/bibtex_build.py rename to citeforge/bibtex_build.py diff --git a/src/bibtex_utils.py b/citeforge/bibtex_utils.py similarity index 100% rename from src/bibtex_utils.py rename to citeforge/bibtex_utils.py diff --git a/src/cache.py b/citeforge/cache.py similarity index 100% rename from src/cache.py rename to citeforge/cache.py diff --git a/src/canonicalize.py b/citeforge/canonicalize.py similarity index 99% rename from src/canonicalize.py rename to citeforge/canonicalize.py index 1885a4fe..ac9018d4 100644 --- a/src/canonicalize.py +++ b/citeforge/canonicalize.py @@ -15,9 +15,9 @@ from enum import Enum from typing import Any -from src import id_utils as idu -from src import merge_utils as mu -from src.config import ( +from citeforge import id_utils as idu +from citeforge import merge_utils as mu +from citeforge.config import ( ABBREVIATED_VENUE_MAP, ACM_JOURNAL_PROCEEDINGS, INSTITUTIONAL_REPOSITORIES, @@ -30,9 +30,9 @@ REPOSITORY_AS_JOURNAL, VENUE_CASE_CORRECTIONS, ) -from src.publication_parser import _strip_ellipsis -from src.text_utils import trim_title_default -from src.textnorm import _apply_booktitle_fixups, _fix_title_text +from citeforge.publication_parser import _strip_ellipsis +from citeforge.text_utils import trim_title_default +from citeforge.textnorm import _apply_booktitle_fixups, _fix_title_text class CanonicalStage(Enum): @@ -861,7 +861,7 @@ def _rule_strip_preprint_only_publisher(entry: dict[str, Any], fields: dict[str, # runs Site B and returns before it ever reaches Site C, so the terminal rules # that only Site C carries (url-booktitle->misc, misc->inproceedings, and # article-no-journal->misc) are absent here. The destructive title==venue delete -# and the bare-ampersand rewrite run in src/pipeline/article.py around the +# and the bare-ampersand rewrite run in citeforge/pipeline/article.py around the # canonicalize() call. _LOAD_REPAIR_RULES = ( _rule_strip_preprint_journal_load, diff --git a/src/clients/__init__.py b/citeforge/clients/__init__.py similarity index 100% rename from src/clients/__init__.py rename to citeforge/clients/__init__.py diff --git a/src/clients/helpers.py b/citeforge/clients/helpers.py similarity index 100% rename from src/clients/helpers.py rename to citeforge/clients/helpers.py diff --git a/src/clients/scholar.py b/citeforge/clients/scholar.py similarity index 100% rename from src/clients/scholar.py rename to citeforge/clients/scholar.py diff --git a/src/clients/search_apis.py b/citeforge/clients/search_apis.py similarity index 100% rename from src/clients/search_apis.py rename to citeforge/clients/search_apis.py diff --git a/src/clients/serpapi_scholar.py b/citeforge/clients/serpapi_scholar.py similarity index 100% rename from src/clients/serpapi_scholar.py rename to citeforge/clients/serpapi_scholar.py diff --git a/src/clients/serply_scholar.py b/citeforge/clients/serply_scholar.py similarity index 100% rename from src/clients/serply_scholar.py rename to citeforge/clients/serply_scholar.py diff --git a/src/clients/utility_apis.py b/citeforge/clients/utility_apis.py similarity index 100% rename from src/clients/utility_apis.py rename to citeforge/clients/utility_apis.py diff --git a/src/config.py b/citeforge/config.py similarity index 100% rename from src/config.py rename to citeforge/config.py diff --git a/src/doi_utils.py b/citeforge/doi_utils.py similarity index 100% rename from src/doi_utils.py rename to citeforge/doi_utils.py diff --git a/src/exceptions.py b/citeforge/exceptions.py similarity index 100% rename from src/exceptions.py rename to citeforge/exceptions.py diff --git a/src/fsscan.py b/citeforge/fsscan.py similarity index 100% rename from src/fsscan.py rename to citeforge/fsscan.py diff --git a/src/http_utils.py b/citeforge/http_utils.py similarity index 100% rename from src/http_utils.py rename to citeforge/http_utils.py diff --git a/src/id_utils.py b/citeforge/id_utils.py similarity index 100% rename from src/id_utils.py rename to citeforge/id_utils.py diff --git a/src/io_utils.py b/citeforge/io_utils.py similarity index 100% rename from src/io_utils.py rename to citeforge/io_utils.py diff --git a/src/log_utils.py b/citeforge/log_utils.py similarity index 100% rename from src/log_utils.py rename to citeforge/log_utils.py diff --git a/src/merge_utils.py b/citeforge/merge_utils.py similarity index 100% rename from src/merge_utils.py rename to citeforge/merge_utils.py diff --git a/src/models.py b/citeforge/models.py similarity index 100% rename from src/models.py rename to citeforge/models.py diff --git a/src/pipeline/__init__.py b/citeforge/pipeline/__init__.py similarity index 100% rename from src/pipeline/__init__.py rename to citeforge/pipeline/__init__.py diff --git a/src/pipeline/article.py b/citeforge/pipeline/article.py similarity index 98% rename from src/pipeline/article.py rename to citeforge/pipeline/article.py index 433c0cbf..c74bb972 100644 --- a/src/pipeline/article.py +++ b/citeforge/pipeline/article.py @@ -15,20 +15,20 @@ from collections.abc import Callable from typing import Any -from src import bibtex_utils as bt -from src import id_utils as idu -from src import merge_utils as mu -from src.canonicalize import ( +from citeforge import bibtex_utils as bt +from citeforge import id_utils as idu +from citeforge import merge_utils as mu +from citeforge.canonicalize import ( CanonicalStage, _fixup_bib_entry, # noqa: F401 # re-exported for test imports canonicalize, ) -from src.clients.helpers import extract_authors_from_article, get_article_year, strip_html_tags -from src.clients.scholar import ( +from citeforge.clients.helpers import extract_authors_from_article, get_article_year, strip_html_tags +from citeforge.clients.scholar import ( build_bibtex_from_scholar_fields, fetch_scholar_citation, ) -from src.clients.search_apis import ( +from citeforge.clients.search_apis import ( arxiv_search, build_bibtex_from_arxiv, build_bibtex_from_crossref, @@ -46,7 +46,7 @@ pubmed_search_papers_multiple, s2_search_papers_multiple, ) -from src.config import ( +from citeforge.config import ( GENERIC_SERIES_NAMES, MIN_TITLE_WORDS, PREPRINT_SERVERS, @@ -56,22 +56,22 @@ SIM_PREPRINT_TITLE_THRESHOLD, SKIP_SCHOLAR_FOR_EXISTING_FILES, ) -from src.doi_utils import process_validated_doi -from src.exceptions import ( +from citeforge.doi_utils import process_validated_doi +from citeforge.exceptions import ( ALL_API_ERRORS, PARSE_ERRORS, ) -from src.fsscan import iter_author_bibs -from src.http_utils import http_get_text -from src.io_utils import ( +from citeforge.fsscan import iter_author_bibs +from citeforge.http_utils import http_get_text +from citeforge.io_utils import ( append_summary_to_csv, is_known_summary_path, safe_write_file, ) -from src.log_utils import LogCategory, LogSource, logger -from src.models import Record -from src.publication_parser import parse_publication_string -from src.text_utils import ( +from citeforge.log_utils import LogCategory, LogSource, logger +from citeforge.models import Record +from citeforge.publication_parser import parse_publication_string +from citeforge.text_utils import ( author_name_matches, extract_year_from_any, format_author_dirname, @@ -79,7 +79,7 @@ title_similarity, trim_title_default, ) -from src.textnorm import _is_corrupted_title, _is_garbage_title +from citeforge.textnorm import _is_corrupted_title, _is_garbage_title _ARXIV_ABS_RE = re.compile(r"arxiv\.org/abs/(\d{4}\.\d{4,5})", re.IGNORECASE) @@ -376,7 +376,7 @@ def process_article( continue # Fix up stale entries loaded from disk before enrichment. The pure entry - # field and type rewrites are single-sourced in src/canonicalize.py at the + # field and type rewrites are single-sourced in citeforge/canonicalize.py at the # LOAD_REPAIR stage, and the destructive title==venue delete and the # bare-ampersand rewrite trigger stay here in the pipeline. if existing_file_loaded and baseline_entry is not None: @@ -999,7 +999,7 @@ def _add_doi(source: str, doi: str | None) -> None: # Fall back to cached HTML scraping only if no DOI found yet if not doi_candidates: - from src.cache import response_cache as _doi_cache + from citeforge.cache import response_cache as _doi_cache for u in filter(None, url_candidates): _u_str = str(u) @@ -1116,7 +1116,7 @@ def _add_doi(source: str, doi: str | None) -> None: merged_fields = merged.get("fields") or {} # Phase-4 post-merge canonicalization: entry-type reclassification and - # text/venue normalization, single-sourced in src/canonicalize.py. + # text/venue normalization, single-sourced in citeforge/canonicalize.py. # POST_MERGE is the terminal stage; absence rules (article/inproceedings # missing venue, preprint-DOI downgrade) fire here after enrichment. canonicalize(merged, stage=CanonicalStage.POST_MERGE) diff --git a/src/pipeline/postrun.py b/citeforge/pipeline/postrun.py similarity index 95% rename from src/pipeline/postrun.py rename to citeforge/pipeline/postrun.py index 7323963d..27fd80f4 100644 --- a/src/pipeline/postrun.py +++ b/citeforge/pipeline/postrun.py @@ -14,28 +14,28 @@ import re import time -from src import bibtex_utils as bt -from src.cache import get_cache_hit_counts -from src.canonicalize import ( +from citeforge import bibtex_utils as bt +from citeforge.cache import get_cache_hit_counts +from citeforge.canonicalize import ( _fixup_bib_entry, ) -from src.config import ( +from citeforge.config import ( DEFAULT_A2I2_INPUT, SIM_MERGE_DUPLICATE_THRESHOLD, get_min_year, ) -from src.fsscan import iter_author_bibs, iter_output_dirs -from src.http_utils import get_api_call_counts -from src.io_utils import ( +from citeforge.fsscan import iter_author_bibs, iter_output_dirs +from citeforge.http_utils import get_api_call_counts +from citeforge.io_utils import ( build_a2i2_folder, collect_orphan_files, flush_summary_csv, reconcile_summary_csv, safe_write_file, ) -from src.log_utils import LogCategory, logger -from src.models import Record -from src.text_utils import ( +from citeforge.log_utils import LogCategory, logger +from citeforge.models import Record +from citeforge.text_utils import ( extract_year_from_any, title_similarity, ) diff --git a/src/pipeline/scheduler.py b/citeforge/pipeline/scheduler.py similarity index 96% rename from src/pipeline/scheduler.py rename to citeforge/pipeline/scheduler.py index 8e9c6b88..4224c177 100644 --- a/src/pipeline/scheduler.py +++ b/citeforge/pipeline/scheduler.py @@ -15,16 +15,16 @@ from concurrent.futures import ThreadPoolExecutor, as_completed from typing import Any -from src.clients.helpers import get_article_year, strip_html_tags -from src.clients.scholar import ( +from citeforge.clients.helpers import get_article_year, strip_html_tags +from citeforge.clients.scholar import ( fetch_author_publications, merge_publication_lists, sort_articles_by_year_current_first, ) -from src.clients.search_apis import ( +from citeforge.clients.search_apis import ( dblp_fetch_for_author, ) -from src.config import ( +from citeforge.config import ( MAX_PUBLICATIONS_PER_AUTHOR, MAX_WORKERS, REQUEST_DELAY_MAX, @@ -32,14 +32,14 @@ SIM_MERGE_DUPLICATE_THRESHOLD, get_min_year, ) -from src.exceptions import ( +from citeforge.exceptions import ( FULL_OPERATION_ERRORS, ) -from src.fsscan import iter_author_bibs -from src.log_utils import LogCategory, LogSource, logger -from src.models import Record -from src.pipeline.article import process_article -from src.text_utils import ( +from citeforge.fsscan import iter_author_bibs +from citeforge.log_utils import LogCategory, LogSource, logger +from citeforge.models import Record +from citeforge.pipeline.article import process_article +from citeforge.text_utils import ( format_author_dirname, trim_title_default, ) diff --git a/src/publication_parser.py b/citeforge/publication_parser.py similarity index 100% rename from src/publication_parser.py rename to citeforge/publication_parser.py diff --git a/src/text_utils.py b/citeforge/text_utils.py similarity index 100% rename from src/text_utils.py rename to citeforge/text_utils.py diff --git a/src/textnorm.py b/citeforge/textnorm.py similarity index 97% rename from src/textnorm.py rename to citeforge/textnorm.py index a2fca566..20ed7dc3 100644 --- a/src/textnorm.py +++ b/citeforge/textnorm.py @@ -5,10 +5,10 @@ stripped by Google Scholar), acronym casing, verbose conference metadata, non-bibliographic "garbage" titles, and DBLP author-name corruption. -Depends only on stdlib ``re`` and ``src.config`` (no dependency on ``main`` or +Depends only on stdlib ``re`` and ``citeforge.config`` (no dependency on ``main`` or the pipeline), so the canonicalization layer and the orchestrator can both build on it without an import cycle. Pattern data (compound-word and acronym-case -dictionaries) is sourced from ``src.config`` per the config-driven convention; +dictionaries) is sourced from ``citeforge.config`` per the config-driven convention; this module owns only the compiled matching logic. """ @@ -16,14 +16,14 @@ import re -from src.config import ACRONYM_CASE_CORRECTIONS, COMPOUND_SUFFIXES, FUSED_COMPOUND_WORDS +from citeforge.config import ACRONYM_CASE_CORRECTIONS, COMPOUND_SUFFIXES, FUSED_COMPOUND_WORDS # Pre-compiled patterns for _fix_fused_compounds (avoids ~800 re.compile() calls per invocation) # Each compiled pattern carries a cheap literal pre-guard. A ``\b\b`` # pattern cannot match unless the literal word/suffix is a substring of the # working string (word boundaries only add constraints), so a substring test # lets us skip the vast majority of re.sub calls that would match nothing. -# Literals are sourced from src.config (config-driven convention). +# Literals are sourced from citeforge.config (config-driven convention). _FUSED_DICT_PATTERNS: list[tuple[re.Pattern[str], str, str]] = [ (re.compile(r"\b" + re.escape(fused) + r"\b", re.IGNORECASE), repl, fused.lower()) for fused, repl in FUSED_COMPOUND_WORDS.items() diff --git a/src/venue.py b/citeforge/venue.py similarity index 100% rename from src/venue.py rename to citeforge/venue.py diff --git a/main.py b/main.py index f97f72e2..8a0eb19e 100644 --- a/main.py +++ b/main.py @@ -11,20 +11,20 @@ import os import sys -from src.canonicalize import _fixup_bib_entry # noqa: F401 # re-exported for test imports -from src.config import ( +from citeforge.canonicalize import _fixup_bib_entry # noqa: F401 # re-exported for test imports +from citeforge.config import ( DEFAULT_INPUT, DEFAULT_OUT_DIR, DEFAULT_S2_KEY_FILE, DEFAULT_SERPAPI_KEY_FILE, DEFAULT_SERPLY_KEY_FILE, ) -from src.exceptions import ( +from citeforge.exceptions import ( FILE_IO_ERRORS, FILE_READ_ERRORS, ) -from src.http_utils import reset_api_call_counts -from src.io_utils import ( +from citeforge.http_utils import reset_api_call_counts +from citeforge.io_utils import ( init_summary_csv, read_gemini_api_key, read_openreview_credentials, @@ -33,10 +33,10 @@ read_serpapi_api_key, read_serply_api_key, ) -from src.log_utils import LogCategory, logger -from src.pipeline.postrun import finalize_run -from src.pipeline.scheduler import prioritize_records, run_all -from src.textnorm import _is_corrupted_title, _is_garbage_title # noqa: F401 # re-exported for test imports +from citeforge.log_utils import LogCategory, logger +from citeforge.pipeline.postrun import finalize_run +from citeforge.pipeline.scheduler import prioritize_records, run_all +from citeforge.textnorm import _is_corrupted_title, _is_garbage_title # noqa: F401 # re-exported for test imports def main() -> int: diff --git a/pyproject.toml b/pyproject.toml index b3c2f6ee..4a37328e 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,5 +1,9 @@ +[build-system] +requires = ["setuptools>=61.0"] +build-backend = "setuptools.build_meta" + [project] -name = "src" +name = "citeforge" version = "1.0.0" description = "CiteForge: trust-based BibTeX metadata aggregation from scholarly APIs" requires-python = ">=3.10" @@ -22,6 +26,9 @@ dev = [ "types-requests>=2.32.0", ] +[tool.setuptools] +packages = ["citeforge", "citeforge.clients", "citeforge.pipeline"] + [tool.pytest.ini_options] testpaths = ["tests"] python_files = ["test_*.py"] diff --git a/sonar-project.properties b/sonar-project.properties index 5007a4e6..dd7e5cfd 100644 --- a/sonar-project.properties +++ b/sonar-project.properties @@ -3,7 +3,7 @@ sonar.projectName=CiteForge sonar.projectVersion=1.0.0 sonar.host.url=http://localhost:9002 -sonar.sources=src,main.py +sonar.sources=citeforge,main.py sonar.tests=tests sonar.sourceEncoding=UTF-8 @@ -35,16 +35,16 @@ sonar.issue.ignore.multicriteria.e3.ruleKey=python:S3358 sonar.issue.ignore.multicriteria.e3.resourceKey=**/*.py # S2245: random.random()/random.uniform()/random.choice() for non-cryptographic request jitter sonar.issue.ignore.multicriteria.e4.ruleKey=python:S2245 -sonar.issue.ignore.multicriteria.e4.resourceKey=src/http_utils.py +sonar.issue.ignore.multicriteria.e4.resourceKey=citeforge/http_utils.py # S5852: Regex operates on short author-name strings (<100 chars) with bounded character classes sonar.issue.ignore.multicriteria.e5.ruleKey=python:S5852 -sonar.issue.ignore.multicriteria.e5.resourceKey=src/text_utils.py +sonar.issue.ignore.multicriteria.e5.resourceKey=citeforge/text_utils.py # S7632: NOSONAR suppression syntax sonar.issue.ignore.multicriteria.e6.ruleKey=python:S7632 sonar.issue.ignore.multicriteria.e6.resourceKey=**/*.py # S5332: http:// in session.mount("http://", adapter) is the requests library standard adapter pattern sonar.issue.ignore.multicriteria.e7.ruleKey=python:S5332 -sonar.issue.ignore.multicriteria.e7.resourceKey=src/http_utils.py +sonar.issue.ignore.multicriteria.e7.resourceKey=citeforge/http_utils.py sonar.links.homepage=https://github.com/gabrielspadon/CiteForge sonar.links.ci=https://github.com/gabrielspadon/CiteForge/actions diff --git a/tests/fixtures.py b/tests/fixtures.py index 4d25d030..4849c871 100644 --- a/tests/fixtures.py +++ b/tests/fixtures.py @@ -3,7 +3,7 @@ import functools from typing import Any -from src import io_utils +from citeforge import io_utils from tests.test_data import API_CONFIGS diff --git a/tests/test_apis.py b/tests/test_apis.py index e898a390..43adbcf0 100644 --- a/tests/test_apis.py +++ b/tests/test_apis.py @@ -5,9 +5,9 @@ import pytest -from src import api_configs, api_generics, bibtex_utils, doi_utils -from src.clients import scholar, search_apis -from src.http_utils import http_get_json +from citeforge import api_configs, api_generics, bibtex_utils, doi_utils +from citeforge.clients import scholar, search_apis +from citeforge.http_utils import http_get_json from tests.fixtures import load_api_keys from tests.test_data import API_SPECIFIC_PAPERS, KNOWN_PAPERS, OPENALEX_CANNED_WORK diff --git a/tests/test_cache.py b/tests/test_cache.py index 0e0c6da8..bfd7d2e8 100644 --- a/tests/test_cache.py +++ b/tests/test_cache.py @@ -8,12 +8,12 @@ import pytest -from src.cache import _AST, ResponseCache, get_cache_hit_counts, reset_cache_hit_counts +from citeforge.cache import _AST, ResponseCache, get_cache_hit_counts, reset_cache_hit_counts def _freeze_cache_clock(monkeypatch: pytest.MonkeyPatch, when: datetime) -> None: - """Freeze src.cache's wall clock to a fixed instant so expiry tests are date-independent.""" - import src.cache as cache_mod + """Freeze citeforge.cache's wall clock to a fixed instant so expiry tests are date-independent.""" + import citeforge.cache as cache_mod class _FrozenDatetime(datetime): @classmethod @@ -372,13 +372,13 @@ def test_safe_negative_expired_created_on_monday() -> None: created_ts = datetime(2026, 3, 2, 12, 0, 0, tzinfo=_AST).timestamp() # March 8 (Saturday) — NOT expired (next Monday is March 9) - with patch("src.cache.datetime") as mock_dt: + with patch("citeforge.cache.datetime") as mock_dt: mock_dt.fromtimestamp = datetime.fromtimestamp mock_dt.now.return_value = datetime(2026, 3, 8, 23, 59, 0, tzinfo=_AST) assert not ResponseCache._safe_negative_expired(created_ts) # March 9 (Monday) — expired - with patch("src.cache.datetime") as mock_dt: + with patch("citeforge.cache.datetime") as mock_dt: mock_dt.fromtimestamp = datetime.fromtimestamp mock_dt.now.return_value = datetime(2026, 3, 9, 0, 0, 0, tzinfo=_AST) assert ResponseCache._safe_negative_expired(created_ts) @@ -390,13 +390,13 @@ def test_safe_negative_expired_month_before_monday() -> None: created_ts = datetime(2026, 3, 31, 12, 0, 0, tzinfo=_AST).timestamp() # March 31 end-of-day — NOT expired - with patch("src.cache.datetime") as mock_dt: + with patch("citeforge.cache.datetime") as mock_dt: mock_dt.fromtimestamp = datetime.fromtimestamp mock_dt.now.return_value = datetime(2026, 3, 31, 23, 59, 0, tzinfo=_AST) assert not ResponseCache._safe_negative_expired(created_ts) # April 1 — expired (month boundary before Monday) - with patch("src.cache.datetime") as mock_dt: + with patch("citeforge.cache.datetime") as mock_dt: mock_dt.fromtimestamp = datetime.fromtimestamp mock_dt.now.return_value = datetime(2026, 4, 1, 0, 0, 0, tzinfo=_AST) assert ResponseCache._safe_negative_expired(created_ts) @@ -408,13 +408,13 @@ def test_safe_negative_expired_december() -> None: created_ts = datetime(2026, 12, 28, 12, 0, 0, tzinfo=_AST).timestamp() # December 31 — NOT expired - with patch("src.cache.datetime") as mock_dt: + with patch("citeforge.cache.datetime") as mock_dt: mock_dt.fromtimestamp = datetime.fromtimestamp mock_dt.now.return_value = datetime(2026, 12, 31, 23, 59, 0, tzinfo=_AST) assert not ResponseCache._safe_negative_expired(created_ts) # January 1, 2027 — expired - with patch("src.cache.datetime") as mock_dt: + with patch("citeforge.cache.datetime") as mock_dt: mock_dt.fromtimestamp = datetime.fromtimestamp mock_dt.now.return_value = datetime(2027, 1, 1, 0, 0, 0, tzinfo=_AST) assert ResponseCache._safe_negative_expired(created_ts) diff --git a/tests/test_canonicalize.py b/tests/test_canonicalize.py index 610f9094..d1543abd 100644 --- a/tests/test_canonicalize.py +++ b/tests/test_canonicalize.py @@ -13,8 +13,8 @@ import pytest -from src.bibtex_utils import parse_bibtex_to_dict -from src.canonicalize import ( +from citeforge.bibtex_utils import parse_bibtex_to_dict +from citeforge.canonicalize import ( CanonicalStage, _rule_article_preprint_doi, canonicalize, diff --git a/tests/test_config.py b/tests/test_config.py index 4dfb6693..3e8a26e2 100644 --- a/tests/test_config.py +++ b/tests/test_config.py @@ -2,8 +2,8 @@ from datetime import datetime, timezone -from src import config -from src.config import ( +from citeforge import config +from citeforge.config import ( _CONTRIBUTION_WINDOW_FALLBACK, CONTRIBUTION_WINDOW_YEARS, MAX_PUBLICATIONS_PER_AUTHOR, diff --git a/tests/test_core.py b/tests/test_core.py index 8300e3f4..c85f9278 100644 --- a/tests/test_core.py +++ b/tests/test_core.py @@ -6,8 +6,8 @@ import pytest -from src import bibtex_utils as bt -from src import config, exceptions, http_utils, id_utils, io_utils, merge_utils, text_utils +from citeforge import bibtex_utils as bt +from citeforge import config, exceptions, http_utils, id_utils, io_utils, merge_utils, text_utils from tests.conftest import extract_bibtex_field diff --git a/tests/test_decision_reinforcement.py b/tests/test_decision_reinforcement.py index cc104f0d..d0951b65 100644 --- a/tests/test_decision_reinforcement.py +++ b/tests/test_decision_reinforcement.py @@ -20,12 +20,12 @@ import pytest -from src import bibtex_utils as bt -from src import id_utils as idu -from src import merge_utils as mu -from src import text_utils as tu -from src.canonicalize import CanonicalStage, canonicalize -from src.config import SIM_DEDUP_COMPOSITE_THRESHOLD +from citeforge import bibtex_utils as bt +from citeforge import id_utils as idu +from citeforge import merge_utils as mu +from citeforge import text_utils as tu +from citeforge.canonicalize import CanonicalStage, canonicalize +from citeforge.config import SIM_DEDUP_COMPOSITE_THRESHOLD def _entry(etype: str, **fields: str) -> dict[str, Any]: diff --git a/tests/test_deduplication.py b/tests/test_deduplication.py index 24fad6ea..a18f134f 100644 --- a/tests/test_deduplication.py +++ b/tests/test_deduplication.py @@ -5,8 +5,8 @@ import pytest -from src import merge_utils, text_utils -from src.id_utils import doi_bases_match +from citeforge import merge_utils, text_utils +from citeforge.id_utils import doi_bases_match def _count_bib_files(directory: str) -> int: diff --git a/tests/test_fsscan.py b/tests/test_fsscan.py index 7f004423..68c8aaeb 100644 --- a/tests/test_fsscan.py +++ b/tests/test_fsscan.py @@ -1,10 +1,10 @@ -"""Tests for src.fsscan: deterministic directory-scan helpers.""" +"""Tests for citeforge.fsscan: deterministic directory-scan helpers.""" from __future__ import annotations import pathlib -from src.fsscan import iter_author_bibs, iter_output_dirs +from citeforge.fsscan import iter_author_bibs, iter_output_dirs def test_iter_author_bibs_returns_sorted_bib_names_only(tmp_path: pathlib.Path) -> None: diff --git a/tests/test_http_utils.py b/tests/test_http_utils.py index 5fc01103..494f7ccd 100644 --- a/tests/test_http_utils.py +++ b/tests/test_http_utils.py @@ -3,8 +3,8 @@ import pytest import requests -from src import http_utils -from src.http_utils import _decode_json_bytes, _scrub_secrets +from citeforge import http_utils +from citeforge.http_utils import _decode_json_bytes, _scrub_secrets class TestSecretRedaction: diff --git a/tests/test_integration.py b/tests/test_integration.py index e734ddbc..3a9cedfa 100644 --- a/tests/test_integration.py +++ b/tests/test_integration.py @@ -9,10 +9,10 @@ import pytest -from src import bibtex_utils, merge_utils -from src.clients import scholar, search_apis -from src.config import get_min_year -from src.models import Record +from citeforge import bibtex_utils, merge_utils +from citeforge.clients import scholar, search_apis +from citeforge.config import get_min_year +from citeforge.models import Record from tests.fixtures import load_api_keys from tests.test_data import KNOWN_PAPERS, REQUIRED_FIELDS, TEST_AUTHOR @@ -214,7 +214,7 @@ def test_csv_summary_integration(tmp_path: Path) -> None: """ Confirm that CSV summary export integrates correctly with the processing pipeline. """ - from src.io_utils import append_summary_to_csv, init_summary_csv + from citeforge.io_utils import append_summary_to_csv, init_summary_csv csv_path = tmp_path / "summary.csv" csv_path_str = str(csv_path) diff --git a/tests/test_io_csv.py b/tests/test_io_csv.py index 72d95720..2ca9e43f 100644 --- a/tests/test_io_csv.py +++ b/tests/test_io_csv.py @@ -4,8 +4,8 @@ from pathlib import Path from textwrap import dedent -from src import io_utils -from src.models import Record +from citeforge import io_utils +from citeforge.models import Record _SOURCE_FLAG_KEYS = [ "scholar_bib", diff --git a/tests/test_pipeline.py b/tests/test_pipeline.py index 6fd17618..ba9d9b95 100644 --- a/tests/test_pipeline.py +++ b/tests/test_pipeline.py @@ -7,8 +7,8 @@ from typing import Any from unittest.mock import patch -from src.clients import search_apis -from src.doi_utils import process_validated_doi, validate_doi_candidate +from citeforge.clients import search_apis +from citeforge.doi_utils import process_validated_doi, validate_doi_candidate # Shared baseline entries reused across DOI validation tests _BASELINE_FULL: dict[str, Any] = { diff --git a/tests/test_publication_parser.py b/tests/test_publication_parser.py index a38aa857..2c473946 100644 --- a/tests/test_publication_parser.py +++ b/tests/test_publication_parser.py @@ -4,7 +4,7 @@ import pytest -from src.publication_parser import parse_publication_string +from citeforge.publication_parser import parse_publication_string class TestJournalPatterns: diff --git a/tests/test_regression.py b/tests/test_regression.py index 401bd4dd..77a9123c 100644 --- a/tests/test_regression.py +++ b/tests/test_regression.py @@ -14,20 +14,20 @@ import pytest -from src import bibtex_utils as bt -from src import id_utils, merge_utils, text_utils -from src.api_generics import ( +from citeforge import bibtex_utils as bt +from citeforge import id_utils, merge_utils, text_utils +from citeforge.api_generics import ( APISearchConfig, _resolve_dotted, _resolve_dotted_str, search_api_generic_multiple, ) -from src.bibtex_build import determine_entry_type -from src.bibtex_utils import bibtex_from_dict, parse_bibtex_to_dict -from src.clients.scholar import _deduplicate_publication_list -from src.clients.search_apis import bibtex_from_csl -from src.clients.utility_apis import gemini_generate_short_title, orcid_fetch_works -from src.config import ( +from citeforge.bibtex_build import determine_entry_type +from citeforge.bibtex_utils import bibtex_from_dict, parse_bibtex_to_dict +from citeforge.clients.scholar import _deduplicate_publication_list +from citeforge.clients.search_apis import bibtex_from_csl +from citeforge.clients.utility_apis import gemini_generate_short_title, orcid_fetch_works +from citeforge.config import ( ABBREVIATED_VENUE_MAP, MIN_TITLE_WORDS, OPENREVIEW_SESSION_TTL_SECS, @@ -35,17 +35,17 @@ PREPRINT_SERVERS, SIM_MERGE_DUPLICATE_THRESHOLD, ) -from src.doi_utils import validate_doi_candidate -from src.http_utils import ( +from citeforge.doi_utils import validate_doi_candidate +from citeforge.http_utils import ( _THREAD_LOCAL, TokenBucketRateLimiter, _get_rate_limiter, _http_request, http_post_json, ) -from src.io_utils import read_records -from src.merge_utils import merge_with_policy, save_entry_to_file -from src.text_utils import author_name_matches, author_overlap_ratio +from citeforge.io_utils import read_records +from citeforge.merge_utils import merge_with_policy, save_entry_to_file +from citeforge.text_utils import author_name_matches, author_overlap_ratio from tests.conftest import extract_bibtex_field @@ -191,8 +191,8 @@ def test_cache_hit_skips_http(self) -> None: } with ( - patch("src.api_generics.response_cache") as mock_cache, - patch("src.api_generics.http_get_json", return_value=fake_results) as mock_http, + patch("citeforge.api_generics.response_cache") as mock_cache, + patch("citeforge.api_generics.http_get_json", return_value=fake_results) as mock_http, ): mock_cache.get.return_value = None search_api_generic_multiple( @@ -220,9 +220,9 @@ def test_cache_hit_skips_http(self) -> None: class TestDoiValidationSkipsBibtexWhenCslMatches: """Test that validate_doi_candidate does not fetch BibTeX when CSL matches.""" - @patch("src.doi_utils.search_apis.fetch_bibtex_via_doi") - @patch("src.doi_utils.search_apis.fetch_csl_via_doi") - @patch("src.doi_utils.search_apis.bibtex_from_csl") + @patch("citeforge.doi_utils.search_apis.fetch_bibtex_via_doi") + @patch("citeforge.doi_utils.search_apis.fetch_csl_via_doi") + @patch("citeforge.doi_utils.search_apis.bibtex_from_csl") def test_csl_match_skips_bibtex( self, mock_bibtex_from_csl: MagicMock, @@ -249,7 +249,7 @@ def test_csl_match_skips_bibtex( "}\n" ) - with patch("src.doi_utils.bt.bibtex_entries_match_strict", return_value=True): + with patch("citeforge.doi_utils.bt.bibtex_entries_match_strict", return_value=True): csl_matched, bibtex_matched, _, _ = validate_doi_candidate( doi="10.1234/test", baseline_entry=baseline_entry, @@ -262,7 +262,7 @@ def test_csl_match_skips_bibtex( class TestDeduplicatePublicationList: - """Test _deduplicate_publication_list from src/clients/scholar.py.""" + """Test _deduplicate_publication_list from citeforge/clients/scholar.py.""" def test_empty_list(self) -> None: """Empty input should return empty output.""" @@ -1026,7 +1026,7 @@ def test_doi_url_vs_bare_match(self, tmp_path: Any) -> None: class TestHttpPostJson: """Tests for http_post_json going through the full HTTP infrastructure.""" - @patch("src.http_utils._http_request") + @patch("citeforge.http_utils._http_request") def test_post_calls_http_request_with_post_method(self, mock_request: MagicMock) -> None: """http_post_json should delegate to _http_request with method='POST'.""" mock_request.return_value = b'{"result": "ok"}' @@ -1043,7 +1043,7 @@ def test_post_calls_http_request_with_post_method(self, mock_request: MagicMock) def test_post_sets_content_type(self) -> None: """http_post_json should set Content-Type header when not provided.""" - with patch("src.http_utils._http_request") as mock_req: + with patch("citeforge.http_utils._http_request") as mock_req: mock_req.return_value = b'{"ok": true}' http_post_json("https://example.com/api", {"data": 1}) headers = mock_req.call_args[0][2] @@ -1051,7 +1051,7 @@ def test_post_sets_content_type(self) -> None: def test_post_preserves_custom_content_type(self) -> None: """Custom headers with Content-Type should not be overridden.""" - with patch("src.http_utils._http_request") as mock_req: + with patch("citeforge.http_utils._http_request") as mock_req: mock_req.return_value = b'{"ok": true}' custom = {"Content-Type": "application/x-custom", "Accept": "application/json"} http_post_json("https://example.com/api", {"data": 1}, headers=custom) @@ -1061,7 +1061,7 @@ def test_post_preserves_custom_content_type(self) -> None: def _reset_openreview_session() -> None: """Reset OpenReview session state to a clean slate.""" - import src.clients.search_apis as sa + import citeforge.clients.search_apis as sa with sa._OPENREVIEW_SESSION_LOCK: sa._OPENREVIEW_SESSION = None @@ -1081,7 +1081,7 @@ class TestOpenReviewSessionExpiry: def test_expired_session_triggers_relogin(self) -> None: """After TTL expires, openreview_login should re-authenticate.""" - import src.clients.search_apis as sa + import citeforge.clients.search_apis as sa _reset_openreview_session() @@ -1089,7 +1089,7 @@ def test_expired_session_triggers_relogin(self) -> None: mock_session.post.return_value = _make_openreview_mock("abc123") creds = ("user@example.com", "password123") - with patch("src.clients.search_apis._get_session", return_value=mock_session): + with patch("citeforge.clients.search_apis._get_session", return_value=mock_session): result1 = sa.openreview_login(creds) assert result1 is not None assert result1["Cookie"] == "session=abc123" @@ -1109,7 +1109,7 @@ def test_expired_session_triggers_relogin(self) -> None: def test_valid_session_reused(self) -> None: """A session within TTL should be returned without re-login.""" - import src.clients.search_apis as sa + import citeforge.clients.search_apis as sa _reset_openreview_session() @@ -1117,7 +1117,7 @@ def test_valid_session_reused(self) -> None: mock_session.post.return_value = _make_openreview_mock("valid") creds = ("user@example.com", "password123") - with patch("src.clients.search_apis._get_session", return_value=mock_session): + with patch("citeforge.clients.search_apis._get_session", return_value=mock_session): result1 = sa.openreview_login(creds) assert result1 is not None @@ -1149,11 +1149,11 @@ def test_slightly_below_threshold_does_not_match(self) -> None: class TestOrcidUsesHttpGetJson: """ORCID should go through http_get_json (shared HTTP infrastructure).""" - @patch("src.clients.utility_apis.http_get_json") + @patch("citeforge.clients.utility_apis.http_get_json") def test_orcid_calls_http_get_json(self, mock_get: MagicMock) -> None: """orcid_fetch_works should use http_get_json, not urllib.""" mock_get.return_value = {"group": []} - with patch("src.clients.utility_apis.response_cache") as mock_cache: + with patch("citeforge.clients.utility_apis.response_cache") as mock_cache: mock_cache.get.return_value = None orcid_fetch_works("0000-0001-2345-6789") mock_get.assert_called_once() @@ -1164,7 +1164,7 @@ def test_orcid_calls_http_get_json(self, mock_get: MagicMock) -> None: class TestGeminiUsesHttpPostJson: """Gemini should go through http_post_json (shared HTTP infrastructure).""" - @patch("src.clients.utility_apis.http_post_json") + @patch("citeforge.clients.utility_apis.http_post_json") def test_gemini_calls_http_post_json(self, mock_post: MagicMock) -> None: """gemini_generate_short_title should use http_post_json, not urllib.""" mock_post.return_value = {"candidates": [{"content": {"parts": [{"text": "MachineLearning"}]}}]} @@ -1174,7 +1174,7 @@ def test_gemini_calls_http_post_json(self, mock_post: MagicMock) -> None: url = mock_post.call_args[0][0] assert "generativelanguage.googleapis.com" in url - @patch("src.clients.utility_apis.http_post_json") + @patch("citeforge.clients.utility_apis.http_post_json") def test_gemini_key_travels_in_header_not_url(self, mock_post: MagicMock) -> None: """The API key must be sent as the x-goog-api-key header and never appear in the URL.""" mock_post.return_value = {"candidates": [{"content": {"parts": [{"text": "DeepNets"}]}}]} @@ -1186,7 +1186,7 @@ def test_gemini_key_travels_in_header_not_url(self, mock_post: MagicMock) -> Non assert "SECRET-KEY-123" not in url assert "key=" not in url - @patch("src.clients.utility_apis.http_post_json") + @patch("citeforge.clients.utility_apis.http_post_json") def test_gemini_handles_value_error(self, mock_post: MagicMock) -> None: """Gemini should handle ValueError from non-JSON responses gracefully.""" mock_post.side_effect = ValueError("No JSON object could be decoded") @@ -1211,8 +1211,8 @@ def test_post_calls_session_post(self) -> None: """_http_request('POST', ...) should call session.post, not session.get.""" mock_session = self._make_mock_session("post") with ( - patch("src.http_utils._get_session", return_value=mock_session), - patch("src.http_utils._get_rate_limiter", return_value=None), + patch("citeforge.http_utils._get_session", return_value=mock_session), + patch("citeforge.http_utils._get_rate_limiter", return_value=None), ): result = _http_request("POST", "https://example.com/api", {}, 10.0, json_payload={"key": "val"}) mock_session.post.assert_called_once() @@ -1223,8 +1223,8 @@ def test_get_calls_session_get(self) -> None: """_http_request('GET', ...) should call session.get, not session.post.""" mock_session = self._make_mock_session("get") with ( - patch("src.http_utils._get_session", return_value=mock_session), - patch("src.http_utils._get_rate_limiter", return_value=None), + patch("citeforge.http_utils._get_session", return_value=mock_session), + patch("citeforge.http_utils._get_rate_limiter", return_value=None), ): result = _http_request("GET", "https://example.com/api", {}, 10.0) mock_session.get.assert_called_once() @@ -1252,7 +1252,7 @@ class TestOpenReviewTTLBoundary: @staticmethod def _set_session_age(elapsed: float) -> None: """Set a fake OpenReview session with the given elapsed time.""" - import src.clients.search_apis as sa + import citeforge.clients.search_apis as sa with sa._OPENREVIEW_SESSION_LOCK: sa._OPENREVIEW_SESSION = {"Cookie": "session=test"} @@ -1260,7 +1260,7 @@ def _set_session_age(elapsed: float) -> None: def test_session_expires_at_exact_ttl(self) -> None: """Session should be treated as expired when elapsed == TTL (>= check).""" - import src.clients.search_apis as sa + import citeforge.clients.search_apis as sa self._set_session_age(OPENREVIEW_SESSION_TTL_SECS) assert sa._openreview_session_expired() @@ -1268,7 +1268,7 @@ def test_session_expires_at_exact_ttl(self) -> None: def test_session_valid_just_before_ttl(self) -> None: """Session created 'just now' (0 seconds elapsed) must not be expired.""" - import src.clients.search_apis as sa + import citeforge.clients.search_apis as sa self._set_session_age(0.0) assert not sa._openreview_session_expired() @@ -1933,9 +1933,9 @@ def test_429_sleep_outside_semaphore(self) -> None: mock_session.get.side_effect = [mock_resp_429, mock_resp_200] with ( - patch("src.http_utils._get_session", return_value=mock_session), - patch("src.http_utils._get_rate_limiter", return_value=None), - patch("src.http_utils.time") as mock_time, + patch("citeforge.http_utils._get_session", return_value=mock_session), + patch("citeforge.http_utils._get_rate_limiter", return_value=None), + patch("citeforge.http_utils.time") as mock_time, ): mock_time.monotonic.return_value = 1000.0 mock_time.sleep = MagicMock() @@ -1949,7 +1949,7 @@ class TestTokenBucketJitter: def test_jitter_import_and_usage(self) -> None: """Verify that random.uniform is called during acquire when sleep is needed.""" - import src.http_utils as hu + import citeforge.http_utils as hu # Verify the random module is imported in http_utils (needed for jitter) assert hasattr(hu, "random"), "http_utils should import random for jitter" @@ -1967,7 +1967,7 @@ def capture_sleep(duration: float) -> None: sleep_values.append(duration) # Don't actually sleep - with patch("src.http_utils.time.sleep", side_effect=capture_sleep): + with patch("citeforge.http_utils.time.sleep", side_effect=capture_sleep): limiter.acquire() # Should have slept at least once @@ -2673,7 +2673,7 @@ def test_phantom_entries_removed(self, tmp_path: Any) -> None: """Rows pointing to non-existent files are stripped from the CSV.""" import csv as _csv - from src.io_utils import _SUMMARY_CSV_FIELDNAMES, reconcile_summary_csv + from citeforge.io_utils import _SUMMARY_CSV_FIELDNAMES, reconcile_summary_csv csv_path = str(tmp_path / "summary.csv") real_file = tmp_path / "real.bib" @@ -2701,7 +2701,7 @@ def test_no_phantoms_no_rewrite(self, tmp_path: Any) -> None: """When all files exist, CSV is untouched (no rewrite).""" import csv as _csv - from src.io_utils import _SUMMARY_CSV_FIELDNAMES, reconcile_summary_csv + from citeforge.io_utils import _SUMMARY_CSV_FIELDNAMES, reconcile_summary_csv csv_path = str(tmp_path / "summary.csv") real_file = tmp_path / "real.bib" @@ -2727,7 +2727,7 @@ def test_orphan_detected(self, tmp_path: Any) -> None: """A .bib file with no CSV entry is reported as an orphan.""" import csv as _csv - from src.io_utils import _SUMMARY_CSV_FIELDNAMES, collect_orphan_files + from citeforge.io_utils import _SUMMARY_CSV_FIELDNAMES, collect_orphan_files out_dir = tmp_path / "output" author_dir = out_dir / "Author (ID)" @@ -2754,7 +2754,7 @@ def test_no_orphans(self, tmp_path: Any) -> None: """When all files are in the CSV, no orphans are reported.""" import csv as _csv - from src.io_utils import _SUMMARY_CSV_FIELDNAMES, collect_orphan_files + from citeforge.io_utils import _SUMMARY_CSV_FIELDNAMES, collect_orphan_files out_dir = tmp_path / "output" author_dir = out_dir / "Author (ID)" @@ -2781,7 +2781,7 @@ def test_known_path_after_preserve(self, tmp_path: Any) -> None: """Paths loaded from an existing CSV are recognized as known.""" import csv as _csv - from src.io_utils import ( + from citeforge.io_utils import ( _SUMMARY_CSV_FIELDNAMES, init_summary_csv, is_known_summary_path, @@ -2801,7 +2801,7 @@ def test_known_path_after_preserve(self, tmp_path: Any) -> None: def test_unknown_path_fresh_csv(self, tmp_path: Any) -> None: """After fresh init, no paths are known.""" - from src.io_utils import init_summary_csv, is_known_summary_path + from citeforge.io_utils import init_summary_csv, is_known_summary_path csv_path = str(tmp_path / "summary_fresh.csv") init_summary_csv(csv_path, preserve_existing=False) @@ -3124,7 +3124,7 @@ class TestCachePutOSError: """Cache.put() must log on OSError, not silently swallow.""" def test_oserror_does_not_raise(self, monkeypatch: Any, tmp_path: Any) -> None: - from src.cache import ResponseCache + from citeforge.cache import ResponseCache cache = ResponseCache(str(tmp_path / "cache")) # Make mkstemp raise OSError @@ -3133,7 +3133,7 @@ def test_oserror_does_not_raise(self, monkeypatch: Any, tmp_path: Any) -> None: cache.put("test_ns", "test_key", {"data": 1}) def test_oserror_logged(self, monkeypatch: Any, tmp_path: Any, capfd: Any) -> None: - from src.cache import ResponseCache + from citeforge.cache import ResponseCache cache = ResponseCache(str(tmp_path / "cache")) @@ -3150,30 +3150,30 @@ class TestCacheCoversWindow: """_cache_covers_window edge cases.""" def test_empty_articles_returns_false(self) -> None: - from src.clients.scholar import _cache_covers_window + from citeforge.clients.scholar import _cache_covers_window assert _cache_covers_window({"articles": []}, 2020) is False def test_no_articles_key_returns_false(self) -> None: - from src.clients.scholar import _cache_covers_window + from citeforge.clients.scholar import _cache_covers_window assert _cache_covers_window({}, 2020) is False def test_covers_min_year_returns_true(self) -> None: - from src.clients.scholar import _cache_covers_window + from citeforge.clients.scholar import _cache_covers_window cached = {"articles": [{"year": 2019}, {"year": 2021}]} assert _cache_covers_window(cached, 2020) is True # min(years)=2019 <= 2020 def test_truncated_returns_false(self) -> None: - from src.clients.scholar import _cache_covers_window + from citeforge.clients.scholar import _cache_covers_window # 100 articles, all years > min_year → likely truncated cached = {"articles": [{"year": 2022}] * 100} assert _cache_covers_window(cached, 2020) is False def test_non_truncated_returns_true(self) -> None: - from src.clients.scholar import _cache_covers_window + from citeforge.clients.scholar import _cache_covers_window # 99 articles, all years > min_year → not truncated (not % 100) cached = {"articles": [{"year": 2022}] * 99} @@ -3184,29 +3184,29 @@ class TestStripEllipsis: """_strip_ellipsis removes trailing '...' and dangling prepositions.""" def test_no_ellipsis(self) -> None: - from src.publication_parser import _strip_ellipsis + from citeforge.publication_parser import _strip_ellipsis assert _strip_ellipsis("Normal Text") == "Normal Text" def test_trailing_dots(self) -> None: - from src.publication_parser import _strip_ellipsis + from citeforge.publication_parser import _strip_ellipsis assert _strip_ellipsis("Workshop on Bridging Language...") == "Workshop on Bridging Language" def test_trailing_dots_with_preposition(self) -> None: - from src.publication_parser import _strip_ellipsis + from citeforge.publication_parser import _strip_ellipsis result = _strip_ellipsis("CHI Conference on Human Factors in ...") assert result == "CHI Conference on Human Factors" assert not result.endswith(" in") def test_unicode_ellipsis(self) -> None: - from src.publication_parser import _strip_ellipsis + from citeforge.publication_parser import _strip_ellipsis assert _strip_ellipsis("Some Text\u2026") == "Some Text" def test_parser_strips_ellipsis_from_venue(self) -> None: - from src.publication_parser import parse_publication_string + from citeforge.publication_parser import parse_publication_string result = parse_publication_string( "Extended Abstracts of the 2019 CHI Conference on Human Factors in Computing ..., 2019" @@ -3315,7 +3315,7 @@ class TestDecodeValueErrorContainment: """ def test_decode_error_is_caught_by_all_api_errors(self) -> None: - from src.exceptions import ALL_API_ERRORS, DecodeError + from citeforge.exceptions import ALL_API_ERRORS, DecodeError # The invariant that makes all ~11 `except ALL_API_ERRORS` sites graceful. assert issubclass(DecodeError, ValueError) @@ -3324,8 +3324,8 @@ def test_decode_error_is_caught_by_all_api_errors(self) -> None: assert not issubclass(ValueError, ALL_API_ERRORS) def test_decode_json_bytes_raises_decode_error(self) -> None: - from src.exceptions import DecodeError - from src.http_utils import _decode_json_bytes + from citeforge.exceptions import DecodeError + from citeforge.http_utils import _decode_json_bytes with pytest.raises(DecodeError): _decode_json_bytes(b"not json", "https://api.openalex.org/works?q=x") @@ -3333,9 +3333,9 @@ def test_decode_json_bytes_raises_decode_error(self) -> None: def test_generic_search_swallows_decode_error(self) -> None: # The primary enrichment path (OpenAlex/Crossref/S2) must return None, # not propagate, when an upstream serves an HTML 200 body. - from src import api_generics - from src.api_configs import OPENALEX_SEARCH_CONFIG - from src.exceptions import DecodeError + from citeforge import api_generics + from citeforge.api_configs import OPENALEX_SEARCH_CONFIG + from citeforge.exceptions import DecodeError with ( patch.object(api_generics.response_cache, "get", return_value=None), @@ -3345,8 +3345,8 @@ def test_generic_search_swallows_decode_error(self) -> None: assert api_generics.search_api_generic("A Title", "Author", OPENALEX_SEARCH_CONFIG) is None def test_datacite_swallows_decode_error(self) -> None: - from src.clients import utility_apis - from src.exceptions import DecodeError + from citeforge.clients import utility_apis + from citeforge.exceptions import DecodeError with ( patch.object(utility_apis.response_cache, "get", return_value=None), @@ -3355,8 +3355,8 @@ def test_datacite_swallows_decode_error(self) -> None: assert utility_apis.datacite_search_doi("10.5281/zenodo.123") is None def test_orcid_swallows_decode_error(self) -> None: - from src.clients import utility_apis - from src.exceptions import DecodeError + from citeforge.clients import utility_apis + from citeforge.exceptions import DecodeError with ( patch.object(utility_apis.response_cache, "get", return_value=None), @@ -3372,7 +3372,7 @@ class TestOpenReviewSessionThreadSafety: def test_concurrent_reuse_no_relogin(self) -> None: import threading - from src.clients import search_apis as sa + from citeforge.clients import search_apis as sa prev_session = sa._OPENREVIEW_SESSION prev_created = sa._OPENREVIEW_SESSION_CREATED_AT @@ -3416,7 +3416,7 @@ class TestDoiBackfilledPreprintNotFabricatedConference: """ def test_backfilled_label_not_upgraded_to_inproceedings(self) -> None: - from src.canonicalize import CanonicalStage, canonicalize + from citeforge.canonicalize import CanonicalStage, canonicalize # @misc whose howpublished is the bare DOI-inferred label -> stays @misc. entry = { @@ -3430,7 +3430,7 @@ def test_backfilled_label_not_upgraded_to_inproceedings(self) -> None: assert entry["fields"].get("howpublished") == "EGU" def test_bare_infer_label_booktitle_downgraded_to_misc(self) -> None: - from src.canonicalize import CanonicalStage, canonicalize + from citeforge.canonicalize import CanonicalStage, canonicalize # Already-fabricated @inproceedings with the bare label as booktitle -> @misc. entry = { @@ -3444,7 +3444,7 @@ def test_bare_infer_label_booktitle_downgraded_to_misc(self) -> None: assert entry["fields"].get("howpublished") == "Institutional Repository" def test_real_conference_with_preprint_doi_preserved(self) -> None: - from src.canonicalize import CanonicalStage, canonicalize + from citeforge.canonicalize import CanonicalStage, canonicalize # A genuine venue name that happens to carry an egusphere DOI stays @inproceedings. entry = { diff --git a/tests/test_scholar.py b/tests/test_scholar.py index 6f10d746..496dcea8 100644 --- a/tests/test_scholar.py +++ b/tests/test_scholar.py @@ -8,15 +8,15 @@ import pytest -from src.clients.scholar import fetch_author_publications, fetch_scholar_citation -from src.clients.serpapi_scholar import serpapi_fetch_author_publications -from src.clients.serply_scholar import ( +from citeforge.clients.scholar import fetch_author_publications, fetch_scholar_citation +from citeforge.clients.serpapi_scholar import serpapi_fetch_author_publications +from citeforge.clients.serply_scholar import ( serply_fetch_author_publications, serply_fetch_citation, ) -_SERPLY_HTTP_PATCH = "src.clients.serply_scholar.http_fetch_bytes" -_SERPAPI_HTTP_PATCH = "src.clients.serpapi_scholar.http_fetch_bytes" +_SERPLY_HTTP_PATCH = "citeforge.clients.serply_scholar.http_fetch_bytes" +_SERPAPI_HTTP_PATCH = "citeforge.clients.serpapi_scholar.http_fetch_bytes" def _json_bytes(obj: Any) -> bytes: @@ -552,8 +552,8 @@ def test_citation_minimal_fields(self, mock_http: MagicMock) -> None: class TestFacadeCacheBehavior: """Test that facade functions use cache and skip API calls on cache hit.""" - @patch("src.clients.scholar.response_cache") - @patch("src.clients.scholar.serpapi_fetch_author_publications") + @patch("citeforge.clients.scholar.response_cache") + @patch("citeforge.clients.scholar.serpapi_fetch_author_publications") def test_publications_cache_hit( self, mock_serpapi: MagicMock, @@ -568,8 +568,8 @@ def test_publications_cache_hit( mock_cache.get.assert_called_once_with("serpapi_publications", "author_a|page_0") mock_serpapi.assert_not_called() - @patch("src.clients.scholar.response_cache") - @patch("src.clients.scholar.serpapi_fetch_author_publications") + @patch("citeforge.clients.scholar.response_cache") + @patch("citeforge.clients.scholar.serpapi_fetch_author_publications") def test_publications_cache_miss( self, mock_serpapi: MagicMock, @@ -590,8 +590,8 @@ def test_publications_cache_miss( assert put_args[0] == "serpapi_publications" assert put_args[1] == "author_b|page_0" - @patch("src.clients.scholar.response_cache") - @patch("src.clients.scholar.serpapi_fetch_author_publications") + @patch("citeforge.clients.scholar.response_cache") + @patch("citeforge.clients.scholar.serpapi_fetch_author_publications") def test_publications_cache_miss_empty_result( self, mock_serpapi: MagicMock, @@ -609,8 +609,8 @@ def test_publications_cache_miss_empty_result( mock_serpapi.assert_called_once() mock_cache.put.assert_not_called() - @patch("src.clients.scholar.response_cache") - @patch("src.clients.scholar.serply_fetch_citation") + @patch("citeforge.clients.scholar.response_cache") + @patch("citeforge.clients.scholar.serply_fetch_citation") def test_citation_cache_hit( self, mock_serply: MagicMock, @@ -623,8 +623,8 @@ def test_citation_cache_hit( assert result["title"] == "Cached Paper" mock_serply.assert_not_called() - @patch("src.clients.scholar.response_cache") - @patch("src.clients.scholar.serply_fetch_citation") + @patch("citeforge.clients.scholar.response_cache") + @patch("citeforge.clients.scholar.serply_fetch_citation") def test_citation_cache_miss(self, mock_serply: MagicMock, mock_cache: MagicMock) -> None: """Cache miss should call Serply and store the result.""" mock_cache.get.return_value = None @@ -639,8 +639,8 @@ def test_citation_cache_miss(self, mock_serply: MagicMock, mock_cache: MagicMock assert put_args[0] == "serply_citation" assert put_args[2] == {"title": "Fresh Citation"} - @patch("src.clients.scholar.response_cache") - @patch("src.clients.scholar.serply_fetch_citation") + @patch("citeforge.clients.scholar.response_cache") + @patch("citeforge.clients.scholar.serply_fetch_citation") def test_citation_negative_not_cached( self, mock_serply: MagicMock, @@ -659,8 +659,8 @@ def test_citation_empty_title(self) -> None: result = fetch_scholar_citation("key", "", "Author") assert result is None - @patch("src.clients.scholar.response_cache") - @patch("src.clients.scholar.serpapi_fetch_author_publications") + @patch("citeforge.clients.scholar.response_cache") + @patch("citeforge.clients.scholar.serpapi_fetch_author_publications") def test_stale_cache_invalidated( self, mock_serpapi: MagicMock, @@ -680,8 +680,8 @@ def test_stale_cache_invalidated( mock_cache.invalidate.assert_called_once() mock_serpapi.assert_called_once() - @patch("src.clients.scholar.response_cache") - @patch("src.clients.scholar.serpapi_fetch_author_publications") + @patch("citeforge.clients.scholar.response_cache") + @patch("citeforge.clients.scholar.serpapi_fetch_author_publications") def test_complete_cache_not_invalidated( self, mock_serpapi: MagicMock, @@ -704,10 +704,10 @@ class TestThreadSafety: @pytest.mark.parametrize( ("module_path", "forbidden_attr"), [ - ("src.clients.serply_scholar", "_lock"), - ("src.clients.serply_scholar", "_author_pubs_cache"), - ("src.clients.serpapi_scholar", "_lock"), - ("src.clients.serpapi_scholar", "_author_pubs_cache"), + ("citeforge.clients.serply_scholar", "_lock"), + ("citeforge.clients.serply_scholar", "_author_pubs_cache"), + ("citeforge.clients.serpapi_scholar", "_lock"), + ("citeforge.clients.serpapi_scholar", "_author_pubs_cache"), ], ) def test_no_module_level_state(self, module_path: str, forbidden_attr: str) -> None: From 183cb9dcc422cc328003e9f9de4ebd9271d93172 Mon Sep 17 00:00:00 2001 From: Gabriel Spadon Date: Thu, 2 Jul 2026 09:19:11 -0300 Subject: [PATCH 48/54] test: add layered suite with fixtures, golden serializer, and E2E determinism --- tests/corpus.py | 68 +++++++ tests/factories.py | 177 ++++++++++++++++++ tests/fakes.py | 101 ++++++++++ tests/test_bibtex_build.py | 199 ++++++++++++++++++++ tests/test_bibtex_serialize.py | 107 +++++++++++ tests/test_cache.py | 63 +++++++ tests/test_canonicalize.py | 240 ++++++++++++++++++++++++ tests/test_finalize_run.py | 333 +++++++++++++++++++++++++++++++++ tests/test_http_utils.py | 131 +++++++++++++ tests/test_id_utils.py | 130 +++++++++++++ tests/test_pipeline_e2e.py | 109 +++++++++++ tests/test_save_entry.py | 301 +++++++++++++++++++++++++++++ tests/test_text_utils.py | 156 +++++++++++++++ tests/test_textnorm.py | 136 ++++++++++++++ 14 files changed, 2251 insertions(+) create mode 100644 tests/corpus.py create mode 100644 tests/factories.py create mode 100644 tests/fakes.py create mode 100644 tests/test_bibtex_build.py create mode 100644 tests/test_bibtex_serialize.py create mode 100644 tests/test_finalize_run.py create mode 100644 tests/test_id_utils.py create mode 100644 tests/test_pipeline_e2e.py create mode 100644 tests/test_save_entry.py create mode 100644 tests/test_text_utils.py create mode 100644 tests/test_textnorm.py diff --git a/tests/corpus.py b/tests/corpus.py new file mode 100644 index 00000000..d02f2648 --- /dev/null +++ b/tests/corpus.py @@ -0,0 +1,68 @@ +"""Module-level parametrize tables for the adversarial corpus layer. + +Each table is external truth about a contract (what the input should produce), +not a mirror of a production map. Tests import a table and drive the real +function over it, so one table replaces the per-class case copies that were +scattered across the old monolith. Expected values were captured from the live +functions and are asserted, never re-derived. +""" + +from __future__ import annotations + +# (doi, is_secondary) -- preprint, grey-literature, and data DOIs are secondary; +# published journal DOIs are primary even under a registrant that also mints +# preprints (10.5194/egusphere is secondary, 10.5194/acp is not). +SECONDARY_DOI_CASES: list[tuple[str, bool]] = [ + ("10.48550/arxiv.2401.00001", True), + ("10.1101/2021.01.01.400001", True), + ("10.21203/rs.3.rs-100001", True), + ("10.31234/osf.io/abcde", True), + ("10.26434/chemrxiv-2024-aaaaa", True), + ("10.2139/ssrn.4000001", True), + ("10.5194/egusphere-2024-1000", True), + ("10.5281/zenodo.9000001", True), + ("10.1145/3580305", False), + ("10.1038/s41586-024-00001", False), + ("10.1109/tpami.2024.0000001", False), + ("10.1016/j.patcog.2024.100001", False), + ("10.5194/acp-24-1-2024", False), +] + +# Journal strings that name a preprint server (an @article carrying one of these +# as its journal must not be treated as a published venue). +PREPRINT_SERVER_JOURNALS: list[str] = [ + "arXiv", + "arXiv e-prints", + "bioRxiv", + "medRxiv", + "Research Square", + "SSRN", + "ChemRxiv", +] + +# (title_in, title_out) for the fused-compound repair engine. +FUSED_COMPOUND_CASES: list[tuple[str, str]] = [ + ("A Stateoftheart Endtoend Aidriven System", "A State-of-the-Art End-to-End AI-Driven System"), + ("Knowledgedriven Reasoning", "Knowledge-Driven Reasoning"), + # An already-correct title is a fixpoint (no spurious rewrite). + ("A State-of-the-Art System", "A State-of-the-Art System"), +] + +# (booktitle_in, booktitle_out) for the venue-alias / booktitle fixup engine. +BOOKTITLE_FIXUP_CASES: list[tuple[str, str]] = [ + ("NeuriPS 2017", "NeurIPS 2017"), + # Correct spellings and unrelated strings pass through unchanged. + ("Proceedings of NAACL", "Proceedings of NAACL"), + ("Lecture Notes in Computer Science (LNCS)", "Lecture Notes in Computer Science (LNCS)"), +] + +# (retry_after_header, expected_seconds) for _parse_retry_after. Numeric values +# parse directly; a non-numeric / unparseable value yields 0.0. HTTP-date cases +# are asserted separately in the test because they depend on the current clock. +RETRY_AFTER_CASES: list[tuple[str | None, float]] = [ + ("120", 120.0), + ("0", 0.0), + ("soon", 0.0), + ("", 0.0), + (None, 0.0), +] diff --git a/tests/factories.py b/tests/factories.py new file mode 100644 index 00000000..4a498331 --- /dev/null +++ b/tests/factories.py @@ -0,0 +1,177 @@ +"""Compact, rule-driven builders for CiteForge test entries and fixtures. + +Every test that needs a BibTeX entry, an enricher pair, or an on-disk .bib +goes through these helpers so the suite has one canonical entry shape and the +inline-literal sprawl stays out of the individual test files. The named +fixtures encode the recurring adversarial shapes (preprint/published twins, +repository-only records, generic proceedings, venue aliases, malformed +metadata) as small readable functions rather than one-off dicts. +""" + +from __future__ import annotations + +from pathlib import Path +from typing import Any + +from citeforge.bibtex_utils import bibtex_from_dict + +Entry = dict[str, Any] +Enricher = tuple[str, Entry] + + +def entry(*, type: str = "article", key: str = "K", **fields: str) -> Entry: + """Build a canonical entry dict ``{"type", "key", "fields"}``. + + Sensible title/author/year defaults are supplied so a caller only states + the fields relevant to the behaviour under test. Pass ``title=``/``author=`` + to override. The ``type`` keyword names the BibTeX entry type. + """ + base: dict[str, str] = { + "title": "A Study of Neural Networks", + "author": "Doe, Jane", + "year": "2021", + } + base.update(fields) + return {"type": type, "key": key, "fields": base} + + +def article(**fields: str) -> Entry: + """Build an ``@article`` entry (see :func:`entry`).""" + return entry(type="article", **fields) + + +def inproceedings(**fields: str) -> Entry: + """Build an ``@inproceedings`` entry (see :func:`entry`).""" + return entry(type="inproceedings", **fields) + + +def misc(**fields: str) -> Entry: + """Build an ``@misc`` entry (see :func:`entry`).""" + return entry(type="misc", **fields) + + +def enricher(source: str, **fields: str) -> Enricher: + """Build the ``(source_name, entry)`` pair that ``merge_with_policy`` consumes. + + ``source`` must be a real name from ``config.TRUST_ORDER`` (e.g. ``crossref``, + ``csl``, ``datacite``, ``s2``, ``scholar_min``) so trust ranking is exercised + against the production order, not an invented label. + """ + return (source, entry(**fields)) + + +def write_bib(directory: Path, e: Entry, filename: str) -> Path: + """Serialize *e* with the production serializer and write it under *directory*. + + Returns the written path. Used by save-time and finalize-run tests that need + a real .bib file on disk in the exact bytes the pipeline would produce. + """ + directory.mkdir(parents=True, exist_ok=True) + path = directory / filename + path.write_text(bibtex_from_dict(e), encoding="utf-8") + return path + + +# --- Named adversarial fixtures (one small function each) ------------------- + + +def arxiv_published_twin() -> tuple[Entry, Enricher]: + """A preprint/published twin: same title and authors, arXiv side vs a + published (CVPR/ACM DOI) side. The published record must win on DOI while + the work stays represented once. + """ + title = "Deep Residual Learning for Image Recognition" + authors = "He, Kaiming and Zhang, Xiangyu and Ren, Shaoqing and Sun, Jian" + preprint = article(title=title, author=authors, journal="arXiv", doi="10.48550/arXiv.1512.03385") + published = enricher("crossref", title=title, author=authors, journal="CVPR", doi="10.1109/cvpr.2016.90") + return preprint, published + + +def repo_only_zenodo() -> Entry: + """A repository-only record (Zenodo DOI, no published counterpart). Must be + retained and represented, never dropped for lacking a journal. + """ + return article( + title="A Reproducible Dataset for Vessel Tracking", + author="Spadon, Gabriel", + journal="Zenodo", + doi="10.5281/zenodo.9000001", + ) + + +def generic_proceedings_lncs() -> Entry: + """An entry whose booktitle is a generic series name (LNCS). The specific + conference name must be preferred over the generic series when available. + """ + return inproceedings( + title="Graph Kernels for Structured Prediction", + booktitle="Lecture Notes in Computer Science", + ) + + +def venue_alias_neurips() -> Entry: + """An entry carrying a mistyped venue alias that must canonicalize to the + correct spelling (``NeuriPS`` -> ``NeurIPS``). + """ + return inproceedings( + title="Attention Is All You Need", + booktitle="NeuriPS 2017", + ) + + +def conflicting_trusted_sources() -> tuple[Entry, list[Enricher]]: + """A low-rank primary carrying the full author list versus a higher-rank + enricher carrying a truncated author list. The fuller list must survive + unless the enricher is >= TRUST_DIFF_OVERRIDE_THRESHOLD ranks more trusted. + """ + title = "Scaling Laws for Neural Language Models" + primary = article( + title=title, + author="Kaplan, Jared and McCandlish, Sam and Henighan, Tom and Brown, Tom B.", + ) + truncated = enricher("s2", title=title, author="Kaplan, Jared") + return primary, [truncated] + + +def untrusted_doi_candidate() -> tuple[Entry, Enricher]: + """A published-looking DOI arriving from a non-registry source with no + registry echo. The DOI-trust gate must reject it rather than let it pollute + the merged entry. + """ + title = "On the Measure of Intelligence" + primary = article(title=title, author="Chollet, Francois") + polluter = enricher("scholar_page", title=title, author="Chollet, Francois", doi="10.1000/not-echoed-0001") + return primary, polluter + + +def allcaps_title() -> Entry: + """An all-caps Scholar title that must be recased to sentence/title case.""" + return article(title="DEEP LEARNING FOR SATELLITE IMAGE CLASSIFICATION") + + +def nonascii_author() -> Entry: + """A non-ASCII author name that must round-trip byte-exactly through the + serializer without mojibake. + """ + return article( + title="Variational Methods in Fluid Dynamics", + author="Müller, André and Sørensen, Bjørn", + ) + + +def pages_edge() -> tuple[Entry, Entry]: + """A pair distinguishing a real page range from a publisher article-id. + The valid range is admitted; the article-id-style value is rejected. + """ + valid = article(title="Ocean Currents and Vessel Routing", pages="331-345") + invalid = article(title="Ocean Currents and Vessel Routing", pages="e0250001") + return valid, invalid + + +def duplicate_titles_two_authors() -> tuple[Entry, Entry]: + """The same title appearing under two different authors with distinct DOIs. + These are distinct works and must not be collapsed into one file. + """ + a = article(title="Machine Learning in Healthcare", author="Smith, John", doi="10.1145/3580305") + b = article(title="Machine Learning in Healthcare", author="Doe, Jane", doi="10.1038/s41586-024-00001") + return a, b diff --git a/tests/fakes.py b/tests/fakes.py new file mode 100644 index 00000000..c1a43b4f --- /dev/null +++ b/tests/fakes.py @@ -0,0 +1,101 @@ +"""Local protocol fakes so HTTP, client, and cache tests never touch a socket. + +These stand in for ``requests.Session`` and the JSON-fetch helpers with scripted, +deterministic responses. ``block_network`` proves a test opened no real +connection, which is what keeps the deterministic E2E oracle honest. +""" + +from __future__ import annotations + +import socket +from collections.abc import Iterator +from typing import Any + +import requests + + +class FakeResponse: + """Minimal stand-in for ``requests.Response`` used by ``_http_request``. + + Carries a status code, headers, and body, and raises ``HTTPError`` from + ``raise_for_status`` for any 4xx/5xx exactly as ``requests`` does. + """ + + def __init__(self, status_code: int = 200, *, body: bytes = b"{}", headers: dict[str, str] | None = None) -> None: + self.status_code = status_code + self.content = body + self.headers = headers or {} + + def raise_for_status(self) -> None: + if self.status_code >= 400: + raise requests.exceptions.HTTPError(f"{self.status_code} Error", response=self) # type: ignore[arg-type] + + +class FakeSession: + """Scriptable stand-in for ``requests.Session``. + + Supply a single response or a sequence of responses (e.g. ``[500, 500, 200]`` + for retry tests). Every ``get``/``post`` pops the next scripted response and + is counted per verb, so a test can assert exactly how many requests a status + sequence triggered (proving no retry storm and no POST re-send). + """ + + def __init__(self, responses: list[FakeResponse] | FakeResponse) -> None: + self._responses = [responses] if isinstance(responses, FakeResponse) else list(responses) + self._i = 0 + self.get_calls = 0 + self.post_calls = 0 + self.closed = False + + def _next(self) -> FakeResponse: + resp = self._responses[min(self._i, len(self._responses) - 1)] + self._i += 1 + return resp + + def get(self, url: str, **kwargs: Any) -> FakeResponse: + self.get_calls += 1 + return self._next() + + def post(self, url: str, **kwargs: Any) -> FakeResponse: + self.post_calls += 1 + return self._next() + + def close(self) -> None: + self.closed = True + + +def fake_http_json(url_map: dict[str, dict[str, Any]]): # type: ignore[no-untyped-def] + """Return a drop-in for ``http_get_json`` that serves canned payloads. + + ``url_map`` maps a substring of the request URL to the JSON dict to return, + so a client test can supply a realistic API payload without any network. + A URL matching no key raises, surfacing an unstubbed call rather than + silently hitting the wire. + """ + + def _get(url: str, timeout: float = 0.0) -> dict[str, Any]: + for needle, payload in url_map.items(): + if needle in url: + return payload + raise AssertionError(f"unstubbed URL in test: {url}") + + return _get + + +class _NoNetworkSocket(socket.socket): + def __init__(self, *args: Any, **kwargs: Any) -> None: + raise AssertionError("network access is blocked in this test") + + +def install_block_network(monkeypatch: Any) -> None: + """Patch ``socket.socket`` so any real connection attempt fails loudly. + + Call from a test (or an autouse fixture) that must prove it stays offline. + """ + monkeypatch.setattr(socket, "socket", _NoNetworkSocket) + + +def scripted_statuses(*statuses: int, body: bytes = b"{}") -> Iterator[FakeResponse]: + """Yield a FakeResponse per status code, for building a FakeSession script.""" + for code in statuses: + yield FakeResponse(code, body=body) diff --git a/tests/test_bibtex_build.py b/tests/test_bibtex_build.py new file mode 100644 index 00000000..d4756acd --- /dev/null +++ b/tests/test_bibtex_build.py @@ -0,0 +1,199 @@ +"""Pure-unit contracts for :mod:`citeforge.bibtex_build`. + +Drives the real entry-type classifier, container-field router, and BibTeX +assembler. Field values are read back with the shared ``extract_bibtex_field`` +helper and every expected value was captured from the live functions, never +hand-derived. One exact-byte assertion locks the serializer output to guard the +byte-identical determinism contract. +""" + +from __future__ import annotations + +import pytest + +from citeforge.bibtex_build import build_bibtex_entry, determine_entry_type, get_container_field +from tests.conftest import extract_bibtex_field + +# --------------------------------------------------------------------------- +# get_container_field +# --------------------------------------------------------------------------- + + +@pytest.mark.parametrize( + ("entry_type", "field"), + [ + ("article", "journal"), + ("inproceedings", "booktitle"), + ("incollection", "booktitle"), + ("misc", "howpublished"), + ("phdthesis", "howpublished"), + ("book", "howpublished"), + ("unknown", "howpublished"), + ("", "howpublished"), + ], +) +def test_get_container_field(entry_type: str, field: str) -> None: + """Every entry type routes its venue to the captured container field.""" + assert get_container_field(entry_type) == field + + +# --------------------------------------------------------------------------- +# build_bibtex_entry — container routing +# --------------------------------------------------------------------------- + + +@pytest.mark.parametrize( + ("entry_type", "container", "other_containers"), + [ + ("article", "journal", ("booktitle", "howpublished")), + ("inproceedings", "booktitle", ("journal", "howpublished")), + ("incollection", "booktitle", ("journal", "howpublished")), + ("misc", "howpublished", ("journal", "booktitle")), + ], +) +def test_build_bibtex_entry_container_routing( + entry_type: str, container: str, other_containers: tuple[str, ...] +) -> None: + """The venue lands in the type's container field and nowhere else.""" + out = build_bibtex_entry(entry_type, "A Study of Neural Networks", ["Doe, Jane"], 2021, "kh", venue="Some Venue") + assert out.startswith(f"@{entry_type}{{") + assert extract_bibtex_field(out, container) == "Some Venue" + for other in other_containers: + assert extract_bibtex_field(out, other) is None + + +def test_build_bibtex_entry_omits_empty_venue_doi_url() -> None: + """Empty venue/doi/url are dropped (falsy fields are filtered out).""" + out = build_bibtex_entry("article", "T", ["Doe, Jane"], 2021, "kh", venue="", doi="", url="") + assert extract_bibtex_field(out, "journal") is None + assert extract_bibtex_field(out, "doi") is None + assert extract_bibtex_field(out, "url") is None + # Present, non-empty fields survive. + assert extract_bibtex_field(out, "title") == "T" + assert extract_bibtex_field(out, "year") == "2021" + + +def test_build_bibtex_entry_omits_missing_optional_fields() -> None: + """When no venue/doi/url/arxiv are supplied, only core fields appear.""" + out = build_bibtex_entry("article", "T", ["Doe, Jane"], 2021, "kh") + for absent in ("journal", "doi", "url", "eprint", "archiveprefix"): + assert extract_bibtex_field(out, absent) is None + + +def test_build_bibtex_entry_arxiv_id_emits_eprint_and_archiveprefix() -> None: + """arxiv_id populates a normalized eprint and a literal archiveprefix=arXiv.""" + out = build_bibtex_entry("misc", "T", ["Doe, Jane"], 2021, "kh", arxiv_id="arXiv:2401.00001v2") + # _norm_arxiv_id strips the ``arXiv:`` prefix and the version suffix. + assert extract_bibtex_field(out, "eprint") == "2401.00001" + assert extract_bibtex_field(out, "archiveprefix") == "arXiv" + + +def test_build_bibtex_entry_extra_fields_override_container() -> None: + """extra_fields is applied after the base map, so it overrides the venue.""" + out = build_bibtex_entry( + "article", "T", ["Doe, Jane"], 2021, "kh", venue="Nature", extra_fields={"journal": "Science", "pages": "1-10"} + ) + assert extract_bibtex_field(out, "journal") == "Science" + assert extract_bibtex_field(out, "pages") == "1-10" + + +def test_build_bibtex_entry_exact_bytes_locks_serializer() -> None: + """The full serialized entry is byte-locked (determinism guard). + + Field order, brace style, indentation, and trailing newline are captured + from the live function; any drift here would break byte-identical reruns. + """ + out = build_bibtex_entry( + "article", + "A Study of Neural Networks", + ["Doe, Jane"], + 2021, + "kh", + venue="Nature", + doi="10.1000/xyz", + url="http://x", + arxiv_id="2401.00001", + ) + expected = ( + "@article{Jane2021A,\n" + " title = {A Study of Neural Networks},\n" + " author = {Doe, Jane},\n" + " year = {2021},\n" + " journal = {Nature},\n" + " doi = {10.1000/xyz},\n" + " url = {http://x},\n" + " eprint = {2401.00001},\n" + " archiveprefix = {arXiv}\n" + "}\n" + ) + assert out == expected + + +# --------------------------------------------------------------------------- +# determine_entry_type +# --------------------------------------------------------------------------- + + +@pytest.mark.parametrize( + ("pub_types", "expected"), + [ + (["JournalArticle"], "article"), + (["Review"], "article"), + (["Conference"], "inproceedings"), + (["JournalArticle", "Conference"], "article"), # journal wins first + ], +) +def test_determine_entry_type_publication_types(pub_types: list[str], expected: str) -> None: + """A Semantic-Scholar-style publicationTypes list classifies as captured.""" + obj = {"publicationTypes": pub_types} + assert determine_entry_type(obj, publication_types_field="publicationTypes") == expected + + +@pytest.mark.parametrize( + ("obj", "expected"), + [ + ("journal-article", "article"), + ("proceedings-article", "inproceedings"), + ("book-chapter", "incollection"), + ("book", "book"), + ("something-weird", "misc"), + (None, "misc"), + ({"foo": "bar"}, "misc"), + ({"type": "journal-article"}, "article"), + ], +) +def test_determine_entry_type_string_and_dict(obj: object, expected: str) -> None: + """String and dict type inputs classify to their captured entry types.""" + assert determine_entry_type(obj) == expected + + +def test_determine_entry_type_book_chapter_heuristic() -> None: + """howpublished + publisher + pages (no journal/booktitle) yields incollection. + + The heuristic fires only when a book-series keyword or a book-publisher + keyword is present. + """ + obj = { + "howpublished": "Lecture Notes in Computer Science", + "publisher": "Springer", + "pages": "1-10", + } + assert determine_entry_type(obj) == "incollection" + + +def test_determine_entry_type_no_journal_heuristic_misses_without_keyword() -> None: + """The same shape without a series/publisher keyword falls through to misc.""" + obj = {"howpublished": "Some Blog", "publisher": "Self", "pages": "1-10"} + assert determine_entry_type(obj) == "misc" + + +def test_determine_entry_type_conference_venue_keyword() -> None: + """A conference keyword in a venue field classifies as inproceedings.""" + obj = {"journal": "Proceedings of the ACM Conference"} + assert determine_entry_type(obj) == "inproceedings" + + +def test_determine_entry_type_venue_hints_fallback() -> None: + """venue_hints is the last-resort router when nothing else classifies.""" + obj = {"eprint": "2401.00001"} + assert determine_entry_type(obj, venue_hints={"eprint": "misc"}) == "misc" diff --git a/tests/test_bibtex_serialize.py b/tests/test_bibtex_serialize.py new file mode 100644 index 00000000..1f9279bd --- /dev/null +++ b/tests/test_bibtex_serialize.py @@ -0,0 +1,107 @@ +"""Golden byte-identity tests for the BibTeX serializer. + +Byte-identical .bib output on cache-hit runs is the CiteForge PRIME DIRECTIVE. +``bibtex_from_dict`` is the single choke point that turns an entry dict into +those bytes, so these tests pin its exact output: the preferred field order, +the sorted tail for non-preferred fields, the two-space indent, the +``@type{key,`` header, the absence of a trailing comma on the last field, and +the terminating newline. A field reorder or whitespace drift here would change +every emitted file, and one of these assertions must fail before that ships. +""" + +from __future__ import annotations + +from citeforge.bibtex_utils import bibtex_from_dict, parse_bibtex_to_dict +from tests import factories + +# Captured from the live serializer. Regenerate only through a reviewed step if +# the output contract deliberately changes; a hand-edited value here would +# become a rival source of truth. +GOLDEN = ( + "@article{Smith2024-Widgets,\n" + " title = {A Study of Widgets},\n" + " author = {Smith, John and Doe, Jane},\n" + " year = {2024},\n" + " journal = {Nature},\n" + " volume = {12},\n" + " pages = {1-10},\n" + " doi = {10.1145/3580305},\n" + " abstract = {We study widgets.},\n" + " keywords = {widgets, study},\n" + " note = {preprint note}\n" + "}\n" +) + +_RICH_ENTRY = { + "type": "article", + "key": "Smith2024-Widgets", + "fields": { + "year": "2024", + "title": "A Study of Widgets", + "doi": "10.1145/3580305", + "author": "Smith, John and Doe, Jane", + "journal": "Nature", + "keywords": "widgets, study", + "abstract": "We study widgets.", + "note": "preprint note", + "pages": "1-10", + "volume": "12", + }, +} + + +def test_serializer_emits_exact_golden_bytes() -> None: + """The serializer output equals the captured golden string byte for byte.""" + assert bibtex_from_dict(_RICH_ENTRY) == GOLDEN + + +def test_preferred_fields_precede_sorted_tail() -> None: + """Preferred citation fields come first in canonical order; every remaining + field follows in sorted() order.""" + lines = [ln.strip() for ln in bibtex_from_dict(_RICH_ENTRY).splitlines() if " = {" in ln] + keys = [ln.split(" = {", 1)[0] for ln in lines] + assert keys == ["title", "author", "year", "journal", "volume", "pages", "doi", "abstract", "keywords", "note"] + + +def test_last_field_has_no_trailing_comma() -> None: + """The final field line ends with ``}`` and no trailing comma; the entry + closes on its own line.""" + out = bibtex_from_dict(_RICH_ENTRY) + body = out.rstrip("\n").splitlines() + assert body[-1] == "}" + assert body[-2].strip() == "note = {preprint note}" + assert not body[-2].rstrip().endswith(",") + + +def test_input_field_order_does_not_change_output() -> None: + """Two entries with identical fields inserted in different dict order + serialize to identical bytes (the serializer imposes its own order).""" + reordered = { + "type": "article", + "key": "Smith2024-Widgets", + "fields": dict(reversed(list(_RICH_ENTRY["fields"].items()))), # type: ignore[attr-defined] + } + assert bibtex_from_dict(reordered) == bibtex_from_dict(_RICH_ENTRY) + + +def test_serialize_is_idempotent_through_parse() -> None: + """Serializing, parsing, and re-serializing yields the same bytes (the + round trip is a fixpoint, so a cache-hit re-save cannot drift).""" + once = bibtex_from_dict(_RICH_ENTRY) + reparsed = parse_bibtex_to_dict(once) + assert reparsed is not None + assert bibtex_from_dict(reparsed) == once + + +def test_nonascii_author_folds_to_stable_ascii() -> None: + """A non-ASCII author is deterministically folded to ASCII (the serializer + strips accents), and the fold is a fixpoint, so a re-save never drifts and + never emits mixed encodings.""" + e = factories.nonascii_author() + once = bibtex_from_dict(e) + # Accents are folded, not preserved, and the result is pure ASCII. + assert "Muller, Andre" in once + once.encode("ascii") # raises if any non-ASCII byte survived + reparsed = parse_bibtex_to_dict(once) + assert reparsed is not None + assert bibtex_from_dict(reparsed) == once diff --git a/tests/test_cache.py b/tests/test_cache.py index bfd7d2e8..70310a95 100644 --- a/tests/test_cache.py +++ b/tests/test_cache.py @@ -1,6 +1,7 @@ from __future__ import annotations import json +import logging import time from datetime import datetime, tzinfo from pathlib import Path @@ -8,6 +9,7 @@ import pytest +from citeforge import cache as cache_mod from citeforge.cache import _AST, ResponseCache, get_cache_hit_counts, reset_cache_hit_counts @@ -440,3 +442,64 @@ def test_month_boundary_recomputed_not_frozen(tmp_path: Path, monkeypatch: pytes april_boundary = cache._month_boundary assert april_boundary > march_boundary assert april_boundary == datetime(2026, 4, 1, tzinfo=_AST).timestamp() + + +# --- Write-failure, disabled-flag, and defensive-copy contracts --- + + +def test_atomic_write_oserror_swallowed_with_warning( + tmp_path: Path, monkeypatch: pytest.MonkeyPatch, caplog: pytest.LogCaptureFixture +) -> None: + """An OSError during the atomic rename is swallowed and surfaced as a CACHE_WRITE_FAILED warning.""" + cache = ResponseCache(cache_dir=str(tmp_path)) + + def _raise_oserror(*_a: object, **_k: object) -> None: + raise OSError("simulated rename failure") + + monkeypatch.setattr(cache_mod.os, "replace", _raise_oserror) + + # The "CiteForge" logger has propagate=False, so caplog's root handler never sees its + # records. Attach caplog's handler directly to that logger for the duration of the call. + cf_logger = logging.getLogger("CiteForge") + cf_logger.addHandler(caplog.handler) + try: + with caplog.at_level(logging.WARNING, logger="CiteForge"): + cache.put("ns", "k", {"v": 1}) # must NOT raise despite the write failure + finally: + cf_logger.removeHandler(caplog.handler) + + assert any("CACHE_WRITE_FAILED" in rec.getMessage() for rec in caplog.records) + # A failed atomic write leaves no entry file behind (the temp file is cleaned up). + assert not Path(cache._entry_path("ns", "k")).exists() + + +def test_cache_disabled_get_put_are_noops(tmp_path: Path, monkeypatch: pytest.MonkeyPatch) -> None: + """With CACHE_ENABLED False, get/put/put_negative are no-ops that touch no disk.""" + monkeypatch.setattr(cache_mod, "CACHE_ENABLED", False) + cache = ResponseCache(cache_dir=str(tmp_path)) + + assert cache.get("ns", "k") is None + cache.put("ns", "k", {"v": 1}) + cache.put_negative("ns", "k") + assert cache.get("ns", "k") is None + + # Nothing was written: no entry file, no namespace directory, an empty cache root. + assert not Path(cache._entry_path("ns", "k")).exists() + assert not (tmp_path / "ns").exists() + assert list(tmp_path.iterdir()) == [] + + +def test_get_returns_defensive_copy(tmp_path: Path) -> None: + """Mutating the dict returned by get() must not corrupt the stored payload.""" + cache = ResponseCache(cache_dir=str(tmp_path)) + cache.put("ns", "k", {"a": 1, "b": [1, 2]}) + + first = cache.get("ns", "k") + assert first == {"a": 1, "b": [1, 2]} + assert first is not None + first["a"] = 999 + first["c"] = "mutated" + + second = cache.get("ns", "k") + assert second == {"a": 1, "b": [1, 2]} + assert second is not first diff --git a/tests/test_canonicalize.py b/tests/test_canonicalize.py index d1543abd..a6d0c870 100644 --- a/tests/test_canonicalize.py +++ b/tests/test_canonicalize.py @@ -19,6 +19,14 @@ _rule_article_preprint_doi, canonicalize, ) +from citeforge.id_utils import is_secondary_doi +from tests.corpus import PREPRINT_SERVER_JOURNALS + +# DOI fixtures drawn from tests.corpus.SECONDARY_DOI_CASES. Their classification is +# load-bearing for the preprint-journal contracts below, so it is asserted in +# test_doi_fixtures_are_classified_as_expected rather than assumed. +_PUBLISHED_DOI = "10.1145/3580305" # SECONDARY_DOI_CASES: is_secondary=False +_SECONDARY_DOI = "10.48550/arxiv.2401.00001" # SECONDARY_DOI_CASES: is_secondary=True def _load_repair(entry: dict[str, Any]) -> dict[str, Any]: @@ -350,3 +358,235 @@ def test_complete_finalize_is_fixpoint_on_corpus() -> None: if entry["type"] != snapshot["type"] or entry["fields"] != snapshot["fields"]: non_fixpoint.append(bib_path) assert not non_fixpoint, f"COMPLETE_SKIP_FINALIZE not a data fixpoint for: {non_fixpoint[:10]}" + + +# --------------------------------------------------------------------------- +# Real-dispatch venueless / preprint downgrades (Site C, POST_MERGE) +# +# These drive the REAL canonicalize(entry, stage=POST_MERGE) dispatch and assert +# the production rule performs the reclassification. They are the genuine home +# for the contracts that tests/test_regression.py's TestVenuelessTypeDowngrade, +# TestArticlePreprintDoiDowngrade, and TestPreprintJournalDowngrade only *claimed* +# to test: those regression tests call merge_with_policy, observe that the +# downgrade did NOT happen there, then re-implement it in the test body +# (result["type"] = "misc") and assert on their own mutation -- so they would +# stay green even if canonicalize.py deleted every rule. The tests below have no +# such escape hatch; they mutate nothing and read only what canonicalize does. +# --------------------------------------------------------------------------- +def _load_then_post_twice(entry: dict[str, Any]) -> tuple[dict[str, Any], dict[str, Any]]: + """Apply the three fix sites in order (LOAD_REPAIR -> POST_MERGE -> POST_MERGE). + + Returns (settled_after_first_post_merge, after_repeat) so a caller can assert + the second POST_MERGE pass is a strict data fixpoint (the anti-oscillation + contract that keeps entry types from flipping between consecutive runs). + """ + e = copy.deepcopy(entry) + canonicalize(e, stage=CanonicalStage.LOAD_REPAIR) + canonicalize(e, stage=CanonicalStage.POST_MERGE) + settled = copy.deepcopy(e) + canonicalize(e, stage=CanonicalStage.POST_MERGE) + return settled, e + + +def test_doi_fixtures_are_classified_as_expected() -> None: + """Guard the DOI fixtures the downgrade contracts depend on. + + If is_secondary_doi's verdict for these two DOIs ever flips, the preprint + contracts below would silently test the wrong branch. Assert the premise. + """ + assert is_secondary_doi(_SECONDARY_DOI) is True + assert is_secondary_doi(_PUBLISHED_DOI) is False + + +def test_real_dispatch_article_no_journal_becomes_misc() -> None: + """@article with no journal -> @misc through the REAL POST_MERGE dispatch. + + Regression counterpart: TestVenuelessTypeDowngrade + .test_article_no_journal_with_published_doi_becomes_misc, which sets + result["type"] = "misc" itself. Here the dispatch does the downgrade. + """ + result = _canon(_article()) # title/author/year only; no journal + assert result["type"] == "misc" + assert "journal" not in result["fields"] + # POST_MERGE is a data fixpoint on the downgraded entry. + assert canonicalize(copy.deepcopy(result), stage=CanonicalStage.POST_MERGE) is False + + +def test_real_dispatch_article_no_journal_downgrades_even_with_published_doi() -> None: + """A published DOI does NOT rescue a journal-less @article: still @misc. + + This is the exact shape TestVenuelessTypeDowngrade uses (a real published + DOI, no journal); the real rule downgrades on the missing journal alone. + """ + result = _canon(_article(doi=_PUBLISHED_DOI, publisher="Underline Science Inc.")) + assert result["type"] == "misc" + assert "journal" not in result["fields"] + assert result["fields"]["doi"] == _PUBLISHED_DOI + + +def test_real_dispatch_inproceedings_no_booktitle_becomes_misc() -> None: + """@inproceedings with no booktitle -> @misc through the REAL POST_MERGE dispatch. + + Regression counterpart: TestVenuelessTypeDowngrade + .test_inproceedings_no_booktitle_becomes_misc (which re-implements the flip). + """ + result = _canon(_article(type="inproceedings")) # no booktitle + assert result["type"] == "misc" + assert "booktitle" not in result["fields"] + assert canonicalize(copy.deepcopy(result), stage=CanonicalStage.POST_MERGE) is False + + +def test_real_dispatch_article_with_journal_stays_article() -> None: + """Negative control: @article WITH a real journal is not falsely downgraded.""" + result = _canon(_article(journal="Nature", doi="10.1038/s41586-024-00001")) + assert result["type"] == "article" + assert result["fields"]["journal"] == "Nature" + + +@pytest.mark.parametrize("journal", PREPRINT_SERVER_JOURNALS) +def test_real_dispatch_preprint_journal_published_doi_drops_journal(journal: str) -> None: + """@article whose journal names a preprint server + a PUBLISHED DOI. + + Real POST_MERGE settles it to @misc with the stale preprint journal DROPPED + and the published DOI KEPT (no howpublished manufactured). Captured from the + live function: _rule_preprint_journal_to_misc always relabels @misc, and the + published-DOI branch pops the journal without asserting a preprint server. + + Regression counterpart: TestPreprintJournalDowngrade, which only asserts that + PREPRINT_SERVERS *contains* the server strings and never drives a downgrade. + """ + result = _canon(_article(journal=journal, doi=_PUBLISHED_DOI)) + assert result["type"] == "misc" + assert "journal" not in result["fields"] + assert result["fields"]["doi"] == _PUBLISHED_DOI + assert "howpublished" not in result["fields"] + # Repeat POST_MERGE is a strict data fixpoint. + repeat = copy.deepcopy(result) + canonicalize(repeat, stage=CanonicalStage.POST_MERGE) + assert repeat["type"] == result["type"] + assert repeat["fields"] == result["fields"] + + +@pytest.mark.parametrize("journal", PREPRINT_SERVER_JOURNALS) +def test_real_dispatch_preprint_journal_secondary_doi_moves_to_howpublished(journal: str) -> None: + """@article whose journal names a preprint server + a SECONDARY DOI. + + Real POST_MERGE settles it to @misc with the journal MOVED to howpublished + (case-normalized) and the journal field removed. The howpublished stays a + preprint-server label, so the misc->inproceedings upgrade correctly declines. + """ + result = _canon(_article(journal=journal, doi=_SECONDARY_DOI)) + assert result["type"] == "misc" + assert "journal" not in result["fields"] + # Journal string is carried into howpublished (normalization only touches case). + assert result["fields"]["howpublished"].lower() == journal.lower() + repeat = copy.deepcopy(result) + canonicalize(repeat, stage=CanonicalStage.POST_MERGE) + assert repeat["type"] == result["type"] + assert repeat["fields"] == result["fields"] + + +@pytest.mark.parametrize("journal", PREPRINT_SERVER_JOURNALS) +def test_real_dispatch_preprint_journal_no_doi_moves_to_howpublished(journal: str) -> None: + """@article whose journal names a preprint server + NO DOI. + + Same terminal state as the secondary-DOI case: @misc, journal moved to + howpublished, no DOI fabricated. Exercises the else branch of + _rule_preprint_journal_to_misc (missing DOI is treated like a secondary one). + """ + result = _canon(_article(journal=journal)) + assert result["type"] == "misc" + assert "journal" not in result["fields"] + assert "doi" not in result["fields"] + assert result["fields"]["howpublished"].lower() == journal.lower() + + +def test_real_dispatch_article_preprint_doi_no_pages_promotes_to_inproceedings() -> None: + """@article with a real journal + arXiv (secondary) DOI + no volume/pages. + + THE captured real behavior (see real_bugs_found): POST_MERGE does NOT settle + at @misc. _rule_article_preprint_doi first downgrades to @misc and moves the + journal into howpublished, then _rule_howpublished_to_inproceedings re-promotes + that plain venue name into a FABRICATED @inproceedings with booktitle = the + original journal. The DOI is kept. This diverges from what + TestArticlePreprintDoiDowngrade.test_article_with_arxiv_doi_becomes_misc + asserts (it re-implements a @misc+howpublished result in its own body and + never runs this dispatch). The file's own test_r19_misc_downgrade_branch note + already documents this misc->inproceedings promotion at full POST_MERGE. + """ + result = _canon(_article(journal="Neural Computing and Applications", doi="10.48550/arxiv.2302.02792")) + # Locked to the REAL end state, not the naive @misc expectation. + assert result["type"] == "inproceedings" + assert result["fields"]["booktitle"] == "Neural Computing and Applications" + assert "journal" not in result["fields"] + assert "howpublished" not in result["fields"] + assert result["fields"]["doi"] == "10.48550/arxiv.2302.02792" + # Even the fabricated @inproceedings is a data fixpoint (no further churn). + repeat = copy.deepcopy(result) + canonicalize(repeat, stage=CanonicalStage.POST_MERGE) + assert repeat["type"] == result["type"] + assert repeat["fields"] == result["fields"] + + +def test_real_dispatch_article_preprint_doi_with_pages_keeps_article() -> None: + """Contrast branch: real journal + secondary DOI + volume/pages stays @article. + + _rule_article_preprint_doi's keep-branch strips the preprint DOI/URL but does + NOT downgrade, so there is no journal->howpublished move and thus no spurious + @inproceedings promotion. This is the non-fabricating half of the same rule. + """ + result = _canon( + _article( + journal="Neural Computing and Applications", + doi="10.48550/arxiv.2302.02792", + volume="42", + pages="1-20", + url="https://arxiv.org/abs/2302.02792", + ) + ) + assert result["type"] == "article" + assert result["fields"]["journal"] == "Neural Computing and Applications" + assert "doi" not in result["fields"] + assert "url" not in result["fields"] + + +# --------------------------------------------------------------------------- +# Anti-oscillation across the three fix sites (LOAD_REPAIR -> POST_MERGE x2) +# +# The real contract that keeps entry types + container fields from flipping +# between consecutive pipeline runs: after the load-repair pass and the first +# post-merge pass settle an entry, a second post-merge pass must be a strict +# data fixpoint (identical type and fields). +# --------------------------------------------------------------------------- +@pytest.mark.parametrize( + ("label", "entry"), + [ + ("article_no_journal", _article()), + ("inproceedings_no_booktitle", _article(type="inproceedings")), + ("preprint_journal_secondary_doi", _article(journal="bioRxiv", doi=_SECONDARY_DOI)), + ("preprint_journal_published_doi", _article(journal="arXiv", doi=_PUBLISHED_DOI)), + ("real_journal_preprint_doi", _article(journal="Neural Computing and Applications", doi=_SECONDARY_DOI)), + ], +) +def test_three_fix_sites_reach_a_fixpoint(label: str, entry: dict[str, Any]) -> None: + """Applying canonicalize at LOAD_REPAIR then POST_MERGE then POST_MERGE again + reaches a fixpoint: the type and every field are identical after the repeat. + + This is the real anti-oscillation guarantee (the three-way fix pattern in + CLAUDE.md), driven end to end through the dispatch rather than asserted on a + single rule in isolation. + """ + settled, after_repeat = _load_then_post_twice(entry) + assert after_repeat["type"] == settled["type"], f"{label}: type oscillated" + assert after_repeat["fields"] == settled["fields"], f"{label}: fields oscillated" + + +def test_three_fix_sites_container_settles_venueless_to_misc() -> None: + """Concrete anti-oscillation end state: a journal-less @article settles at + @misc with no journal/booktitle container and stays there on repeat.""" + settled, after_repeat = _load_then_post_twice(_article()) + assert settled["type"] == "misc" + assert "journal" not in settled["fields"] + assert "booktitle" not in settled["fields"] + assert after_repeat["type"] == "misc" + assert after_repeat["fields"] == settled["fields"] diff --git a/tests/test_finalize_run.py b/tests/test_finalize_run.py new file mode 100644 index 00000000..fff11395 --- /dev/null +++ b/tests/test_finalize_run.py @@ -0,0 +1,333 @@ +"""Direct tests for ``finalize_run`` (the post-run finalization tail). + +``citeforge.pipeline.postrun.finalize_run`` owns the irreversible on-disk data +safety guarantees of the whole pipeline: it is the only place that deletes +``.bib`` files (duplicate orphans and out-of-window files) and the place that +rewrites ``baseline.json`` / ``badges.json``. It had zero direct tests. These +exercise the real function against a hermetic ``tmp_path`` output tree with real +factory-serialized ``.bib`` files and a real io_utils summary CSV, and assert +the load-bearing guards by inspecting the filesystem after the call: + +* ORPHAN SAFETY -- a tracked file survives; a dissimilar on-disk orphan is KEPT + (with a warn), while a >= 0.95 title-duplicate orphan IS removed. +* YEAR-WINDOW -- an out-of-window file is deleted while an in-window file and + anything under ``a2i2/`` are untouched. +* PHANTOM-WRITE -- a second identical run rewrites no ``.bib`` bytes and bumps no + mtime (content-comparison guard holds). +* baseline.json / badges.json are created under ``out_dir`` and are valid JSON. + +No network is touched. The a2i2 build is neutralized by pointing its input CSV +at a nonexistent path so build_a2i2_folder returns early without clearing the +``a2i2/`` folder, isolating the year-window contract. +""" + +from __future__ import annotations + +import json +import logging +from collections.abc import Iterator +from pathlib import Path + +import pytest + +from citeforge.config import get_min_year +from citeforge.io_utils import append_summary_to_csv, init_summary_csv +from citeforge.models import Record +from citeforge.pipeline import postrun +from citeforge.pipeline.postrun import finalize_run +from tests.factories import article, write_bib + +# A year comfortably inside the contribution window regardless of any +# CITEFORGE_MIN_YEAR override (under the default env this is exactly 2024, so the +# filenames read Foo2024-*.bib as in the assignment). +_IN_WINDOW_YEAR = get_min_year() + 4 + + +def _author_dir(out_dir: Path, name: str = "Doe (abc123)") -> Path: + """Create and return an author subdirectory under *out_dir*.""" + d = out_dir / name + d.mkdir(parents=True, exist_ok=True) + return d + + +def _track_in_csv(csv_path: Path, tracked: list[Path]) -> None: + """Build a summary CSV via the real io_utils helpers, tracking *tracked*. + + Paths are written absolute so os.path.abspath() in finalize_run resolves them + identically regardless of the process CWD, keeping the test hermetic. + """ + init_summary_csv(str(csv_path)) + for p in tracked: + append_summary_to_csv(str(csv_path), str(p), trust_hits=1, flags={}) + + +def _snapshot_bibs(directory: Path) -> dict[str, tuple[bytes, int]]: + """Map each ``.bib`` filename under *directory* to (bytes, mtime_ns).""" + return {p.name: (p.read_bytes(), p.stat().st_mtime_ns) for p in sorted(directory.glob("*.bib"))} + + +@pytest.fixture +def no_a2i2(monkeypatch: pytest.MonkeyPatch, tmp_path: Path) -> None: + """Neutralize the a2i2 build so it never clears/creates ``out_dir/a2i2``. + + build_a2i2_folder returns 0 early when its input CSV is missing, so pointing + DEFAULT_A2I2_INPUT (as imported into postrun) at a nonexistent path isolates + the year-window and phantom-write contracts from a2i2 side effects. + """ + monkeypatch.setattr(postrun, "DEFAULT_A2I2_INPUT", str(tmp_path / "no_such_a2i2.csv")) + + +@pytest.fixture +def cf_caplog(caplog: pytest.LogCaptureFixture) -> Iterator[pytest.LogCaptureFixture]: + """Capture records from the non-propagating ``CiteForge`` logger. + + The project logger sets ``propagate = False``, so pytest's root-attached + capture handler never sees its records. Attaching caplog's handler directly + to the ``CiteForge`` logger for the duration of the test fixes that. + """ + cf_logger = logging.getLogger("CiteForge") + caplog.set_level(logging.DEBUG, logger="CiteForge") + cf_logger.addHandler(caplog.handler) + try: + yield caplog + finally: + cf_logger.removeHandler(caplog.handler) + + +def _records() -> list[Record]: + """Return the single real Record whose id matches the author dir suffix.""" + return [Record(name="Doe, Jane", scholar_id="abc123")] + + +# --- ORPHAN SAFETY ---------------------------------------------------------- + + +def test_dissimilar_orphan_survives_and_is_warned( + tmp_path: Path, no_a2i2: None, cf_caplog: pytest.LogCaptureFixture +) -> None: + """An on-disk orphan whose title is < 0.95 similar to any tracked title is + KEPT (never deleted) and a keep/warn is logged. This is the load-bearing + data-loss guard. + """ + out_dir = tmp_path / "out" + author = _author_dir(out_dir) + + tracked = write_bib( + author, + article(key="DoeAlpha", title="Alpha Study of Vessel Tracking Systems"), + f"Doe{_IN_WINDOW_YEAR}-Alpha.bib", + ) + orphan = write_bib( + author, + article(key="DoeBeta", title="Weather Prediction Using Orbital Satellites"), + f"Doe{_IN_WINDOW_YEAR}-Beta.bib", + ) + + csv_path = tmp_path / "summary.csv" + _track_in_csv(csv_path, [tracked]) + + finalize_run(str(out_dir), _records(), total_saved=1, processed=1, summary_csv_path=str(csv_path)) + + assert tracked.exists(), "tracked .bib must never be removed" + assert orphan.exists(), "dissimilar orphan must survive finalize_run (data-loss guard)" + assert any( + "Orphan kept" in rec.getMessage() and "Doe" in rec.getMessage() and "Beta" in rec.getMessage() + for rec in cf_caplog.records + ), "a keep/warn must be logged for the surviving orphan" + + +def test_duplicate_orphan_is_removed(tmp_path: Path, no_a2i2: None, cf_caplog: pytest.LogCaptureFixture) -> None: + """An on-disk orphan whose title is a >= 0.95 duplicate of a tracked title in + the same author directory IS removed, and the removal is logged. + """ + out_dir = tmp_path / "out" + author = _author_dir(out_dir) + + dup_title = "Alpha Study of Vessel Tracking Systems" + tracked = write_bib(author, article(key="DoeAlpha", title=dup_title), f"Doe{_IN_WINDOW_YEAR}-Alpha.bib") + # Identical normalized title => similarity 1.0, well above the 0.95 band. + dup_orphan = write_bib(author, article(key="DoeGamma", title=dup_title), f"Doe{_IN_WINDOW_YEAR}-Gamma.bib") + + csv_path = tmp_path / "summary.csv" + _track_in_csv(csv_path, [tracked]) + + finalize_run(str(out_dir), _records(), total_saved=1, processed=1, summary_csv_path=str(csv_path)) + + assert tracked.exists(), "tracked .bib must survive" + assert not dup_orphan.exists(), "duplicate orphan (>= 0.95 title match) must be removed" + assert any( + "Removed duplicate orphan" in rec.getMessage() and "Gamma" in rec.getMessage() for rec in cf_caplog.records + ), "duplicate-orphan removal must be logged" + + +def test_both_orphan_branches_in_one_run(tmp_path: Path, no_a2i2: None) -> None: + """A single finalize_run keeps the dissimilar orphan and removes the + duplicate orphan, exercising both branches of the orphan guard together. + """ + out_dir = tmp_path / "out" + author = _author_dir(out_dir) + + alpha_title = "Alpha Study of Vessel Tracking Systems" + tracked = write_bib(author, article(key="DoeAlpha", title=alpha_title), f"Doe{_IN_WINDOW_YEAR}-Alpha.bib") + keep = write_bib( + author, + article(key="DoeBeta", title="Weather Prediction Using Orbital Satellites"), + f"Doe{_IN_WINDOW_YEAR}-Beta.bib", + ) + remove = write_bib(author, article(key="DoeGamma", title=alpha_title), f"Doe{_IN_WINDOW_YEAR}-Gamma.bib") + + csv_path = tmp_path / "summary.csv" + _track_in_csv(csv_path, [tracked]) + + finalize_run(str(out_dir), _records(), total_saved=1, processed=1, summary_csv_path=str(csv_path)) + + assert tracked.exists() + assert keep.exists(), "dissimilar orphan kept" + assert not remove.exists(), "duplicate orphan removed" + + +# --- YEAR-WINDOW ------------------------------------------------------------ + + +def test_year_window_removes_only_out_of_window_files(tmp_path: Path, no_a2i2: None) -> None: + """Out-of-window files are deleted; in-window files and anything under + ``a2i2/`` are untouched by the year-window cleanup. + """ + out_dir = tmp_path / "out" + author = _author_dir(out_dir) + window_min = get_min_year() + + in_window = write_bib( + author, + article(key="InW", title="Vessel Routing in the North Atlantic", year=str(window_min)), + f"Doe{window_min}-InWindow.bib", + ) + out_of_window = write_bib( + author, + article(key="OutW", title="Historical Weather Records Analysis", year=str(window_min - 5)), + f"Doe{window_min - 5}-OutWindow.bib", + ) + + a2i2_dir = out_dir / "a2i2" + a2i2_dir.mkdir(parents=True) + a2i2_old = write_bib( + a2i2_dir, + article(key="Anc", title="An Ancient Joint Publication", year=str(window_min - 10)), + f"Zzz{window_min - 10}-Ancient.bib", + ) + + csv_path = tmp_path / "summary.csv" + # Track both author files so the orphan pass is a no-op and only the + # year-window logic decides their fate. + _track_in_csv(csv_path, [in_window, out_of_window]) + + finalize_run(str(out_dir), _records(), total_saved=2, processed=2, summary_csv_path=str(csv_path)) + + assert in_window.exists(), "in-window file must be kept" + assert not out_of_window.exists(), "out-of-window file must be removed" + assert a2i2_old.exists(), "a2i2/ files must be untouched by the year-window cleanup" + + +def test_year_window_keeps_boundary_year(tmp_path: Path, no_a2i2: None) -> None: + """A file exactly at the window minimum year is kept (strict ``< window_min`` + removal, not ``<=``). + """ + out_dir = tmp_path / "out" + author = _author_dir(out_dir) + window_min = get_min_year() + + boundary = write_bib( + author, + article(key="Bnd", title="A Boundary Year Paper", year=str(window_min)), + f"Doe{window_min}-Boundary.bib", + ) + + csv_path = tmp_path / "summary.csv" + _track_in_csv(csv_path, [boundary]) + + finalize_run(str(out_dir), _records(), total_saved=1, processed=1, summary_csv_path=str(csv_path)) + + assert boundary.exists(), "file at the boundary year (== window_min) must be kept" + + +# --- PHANTOM-WRITE GUARD ---------------------------------------------------- + + +def test_second_run_is_a_no_op_on_bib_files(tmp_path: Path, no_a2i2: None) -> None: + """Running finalize_run twice leaves every ``.bib``'s bytes AND mtime + unchanged on the second run (content-comparison guard prevents rewrite churn). + """ + out_dir = tmp_path / "out" + author = _author_dir(out_dir) + + a = write_bib( + author, + article(key="P1", title="Deterministic Metadata Aggregation at Scale"), + f"Doe{_IN_WINDOW_YEAR}-One.bib", + ) + b = write_bib( + author, + article(key="P2", title="Trust Based Merging of Bibliographic Records"), + f"Doe{_IN_WINDOW_YEAR}-Two.bib", + ) + + csv_path = tmp_path / "summary.csv" + _track_in_csv(csv_path, [a, b]) + + # First run stabilizes any serializer normalization. + finalize_run(str(out_dir), _records(), total_saved=2, processed=2, summary_csv_path=str(csv_path)) + before = _snapshot_bibs(author) + assert set(before) == {a.name, b.name}, "both .bib files must survive the first run" + + # Second identical run must not touch any .bib bytes or mtimes. + finalize_run(str(out_dir), _records(), total_saved=2, processed=2, summary_csv_path=str(csv_path)) + after = _snapshot_bibs(author) + + assert after == before, "second finalize_run rewrote .bib files (phantom-write churn)" + + +# --- baseline.json / badges.json -------------------------------------------- + + +def test_writes_valid_baseline_and_badges_json(tmp_path: Path, no_a2i2: None) -> None: + """finalize_run writes baseline.json and badges.json under out_dir, and both + are valid JSON with the expected shape. + """ + out_dir = tmp_path / "out" + author = _author_dir(out_dir) + + f1 = write_bib(author, article(key="B1", title="First Surviving Paper"), f"Doe{_IN_WINDOW_YEAR}-First.bib") + f2 = write_bib(author, article(key="B2", title="Second Surviving Paper"), f"Doe{_IN_WINDOW_YEAR}-Second.bib") + + csv_path = tmp_path / "summary.csv" + _track_in_csv(csv_path, [f1, f2]) + + finalize_run(str(out_dir), _records(), total_saved=2, processed=2, summary_csv_path=str(csv_path)) + + baseline_path = out_dir / "baseline.json" + badges_path = out_dir / "badges.json" + assert baseline_path.exists(), "baseline.json must be written under out_dir" + assert badges_path.exists(), "badges.json must be written under out_dir" + + baseline = json.loads(baseline_path.read_text(encoding="utf-8")) + assert baseline["total"] == 2, "baseline total must reflect the two surviving files" + assert baseline["authors"]["Doe (abc123)"] == 2 + + badges = json.loads(badges_path.read_text(encoding="utf-8")) + for field in ("total_queries", "cache_positive_hits", "cache_negative_hits", "cache_misses", "hit_rate"): + assert field in badges, f"badges.json missing {field}" + + +def test_no_summary_csv_writes_nothing(tmp_path: Path, no_a2i2: None) -> None: + """When the summary CSV path is None or missing, finalize_run performs no + cleanup and writes no baseline/badges files (guarded by the CSV-exists check). + """ + out_dir = tmp_path / "out" + author = _author_dir(out_dir) + survivor = write_bib(author, article(key="S1", title="A Solitary Paper"), f"Doe{_IN_WINDOW_YEAR}-Solo.bib") + + finalize_run(str(out_dir), _records(), total_saved=1, processed=1, summary_csv_path=None) + + assert survivor.exists(), "no CSV means no cleanup: the file must remain" + assert not (out_dir / "baseline.json").exists(), "baseline.json is only written when the CSV exists" + assert not (out_dir / "badges.json").exists(), "badges.json is only written when the CSV exists" diff --git a/tests/test_http_utils.py b/tests/test_http_utils.py index 494f7ccd..9c45fbb4 100644 --- a/tests/test_http_utils.py +++ b/tests/test_http_utils.py @@ -1,10 +1,17 @@ from __future__ import annotations +from datetime import datetime, timedelta, timezone, tzinfo +from email.utils import format_datetime + import pytest import requests from citeforge import http_utils +from citeforge.config import HTTP_BACKOFF_MAX, SESSION_ROTATION_THRESHOLD +from citeforge.exceptions import DecodeError from citeforge.http_utils import _decode_json_bytes, _scrub_secrets +from tests.corpus import RETRY_AFTER_CASES +from tests.fakes import FakeResponse, FakeSession class TestSecretRedaction: @@ -97,3 +104,127 @@ def get(self, *args: object, **kwargs: object) -> _Resp: out = http_utils._http_request("GET", "https://example.com/x", {"Accept": "*/*"}, 1.0) assert out == b"ok" assert attempts["n"] == 3 + + +class TestParseRetryAfter: + """_parse_retry_after interprets numeric delays, HTTP dates, and junk deterministically. + + Numeric and unparseable cases come from the corpus table; the HTTP-date cases depend + on the clock, so a past date must clamp to 0.0 and a future date (against a frozen now) + must return the exact positive delta. + """ + + @pytest.mark.parametrize(("header", "expected"), RETRY_AFTER_CASES) + def test_table_cases(self, header: str | None, expected: float) -> None: + assert http_utils._parse_retry_after(header) == expected + + def test_past_http_date_clamped_to_zero(self) -> None: + # An HTTP date in the past must never yield a negative wait; it clamps to 0.0. + assert http_utils._parse_retry_after("Wed, 21 Oct 2015 07:28:00 GMT") == 0.0 + + def test_future_http_date_returns_positive_delta(self, monkeypatch: pytest.MonkeyPatch) -> None: + fixed_now = datetime(2026, 1, 1, 12, 0, 0, tzinfo=timezone.utc) + + class _FrozenDateTime(datetime): + @classmethod + def now(cls, tz: tzinfo | None = None) -> datetime: # type: ignore[override] + return fixed_now.astimezone(tz) if tz is not None else fixed_now + + monkeypatch.setattr(http_utils, "datetime", _FrozenDateTime) + header = format_datetime(fixed_now + timedelta(seconds=300), usegmt=True) + result = http_utils._parse_retry_after(header) + assert result == pytest.approx(300.0, abs=1.0) + assert result > 0.0 + + +class TestBackoffCapAndPostRetry: + """The manual 429/503 loop caps its sleep at HTTP_BACKOFF_MAX and never auto-resends a POST body.""" + + def test_retry_after_sleep_capped_at_backoff_max(self, monkeypatch: pytest.MonkeyPatch) -> None: + sleeps: list[float] = [] + monkeypatch.setattr(http_utils.time, "sleep", lambda s: sleeps.append(s)) + session = FakeSession([FakeResponse(429, headers={"Retry-After": "1000"}), FakeResponse(200)]) + monkeypatch.setattr(http_utils, "_get_session", lambda: session) + http_utils._THREAD_LOCAL.session_request_count = 0 + + out = http_utils._http_request("GET", "https://example.com/x", {"Accept": "*/*"}, 1.0) + + assert out == b"{}" + # A 1000 s Retry-After is clamped to the configured ceiling, not slept verbatim. + assert sleeps == [HTTP_BACKOFF_MAX] + + def test_post_500_sent_once_then_httperror_propagates(self, monkeypatch: pytest.MonkeyPatch) -> None: + session = FakeSession([FakeResponse(500)]) + monkeypatch.setattr(http_utils, "_get_session", lambda: session) + monkeypatch.setattr(http_utils.time, "sleep", lambda *_a: None) + http_utils._THREAD_LOCAL.session_request_count = 0 + + with pytest.raises(requests.exceptions.HTTPError): + http_utils._http_request("POST", "https://example.com/x", {"Accept": "*/*"}, 1.0, json_payload={"q": 1}) + + # The non-idempotent body is sent exactly once; no silent re-send on a hard 500. + assert session.post_calls == 1 + assert session.get_calls == 0 + + def test_post_429_429_200_reaches_success_in_three_calls(self, monkeypatch: pytest.MonkeyPatch) -> None: + session = FakeSession([FakeResponse(429), FakeResponse(429), FakeResponse(200)]) + monkeypatch.setattr(http_utils, "_get_session", lambda: session) + monkeypatch.setattr(http_utils.time, "sleep", lambda *_a: None) + http_utils._THREAD_LOCAL.session_request_count = 0 + + out = http_utils._http_request("POST", "https://example.com/x", {"Accept": "*/*"}, 1.0, json_payload={"q": 1}) + + assert out == b"{}" + # Manual 429 handling re-sends the POST twice, succeeding on the third call. + assert session.post_calls == 3 + assert session.get_calls == 0 + + +class TestSessionRotation: + """_get_session rotates the per-thread Session at SESSION_ROTATION_THRESHOLD, closing the old one.""" + + def test_reuses_below_threshold_and_rotates_at_threshold(self, monkeypatch: pytest.MonkeyPatch) -> None: + factory_calls = {"n": 0} + + def _factory() -> FakeSession: + factory_calls["n"] += 1 + return FakeSession(FakeResponse(200)) + + monkeypatch.setattr(http_utils, "_new_session", _factory) + try: + http_utils._THREAD_LOCAL.session = None + http_utils._THREAD_LOCAL.session_request_count = 0 + + first = http_utils._get_session() + assert isinstance(first, FakeSession) + assert factory_calls["n"] == 1 + + # Below the threshold: same Session, no fresh build, old one still open. + http_utils._THREAD_LOCAL.session_request_count = SESSION_ROTATION_THRESHOLD - 1 + same = http_utils._get_session() + assert same is first + assert factory_calls["n"] == 1 + assert first.closed is False + + # At the threshold: old Session closed, a fresh one built, counter reset to 0. + http_utils._THREAD_LOCAL.session_request_count = SESSION_ROTATION_THRESHOLD + rotated = http_utils._get_session() + assert rotated is not first + assert first.closed is True + assert factory_calls["n"] == 2 + assert http_utils._THREAD_LOCAL.session_request_count == 0 + finally: + http_utils._THREAD_LOCAL.session = None + http_utils._THREAD_LOCAL.session_request_count = 0 + + +class TestDecodeJsonBodyScrub: + """A non-JSON error body carrying a query-string secret is redacted before it reaches the DecodeError.""" + + def test_secret_in_body_redacted_not_leaked(self) -> None: + raw = b"upstream 400 ?api_key=SECRETVALUE&q=1 not json" + with pytest.raises(DecodeError) as excinfo: + http_utils._decode_json_bytes(raw, "https://api.crossref.org/works") + message = str(excinfo.value) + assert "SECRETVALUE" not in message + assert "REDACTED" in message diff --git a/tests/test_id_utils.py b/tests/test_id_utils.py new file mode 100644 index 00000000..61369234 --- /dev/null +++ b/tests/test_id_utils.py @@ -0,0 +1,130 @@ +"""Pure-unit contracts for :mod:`citeforge.id_utils`. + +Drives the real DOI and arXiv identifier helpers over external truth tables +(``corpus.SECONDARY_DOI_CASES``) and hand-picked adversarial inputs. Every +expected value was captured from the live function, never hand-derived, so a +green test documents the current production contract exactly. +""" + +from __future__ import annotations + +import pytest + +from citeforge.id_utils import ( + _norm_doi, + extract_arxiv_eprint, + find_arxiv_in_text, + is_secondary_doi, + normalize_doi, +) +from tests.corpus import SECONDARY_DOI_CASES + + +@pytest.mark.parametrize(("doi", "expected"), SECONDARY_DOI_CASES) +def test_is_secondary_doi_over_corpus(doi: str, expected: bool) -> None: + """Preprint/grey-literature/data DOIs are secondary; published journal DOIs + are primary even under a registrant that also mints preprints + (``10.5194/egusphere`` secondary, ``10.5194/acp`` primary).""" + assert is_secondary_doi(doi) is expected + + +@pytest.mark.parametrize( + "doi", + [ + "10.48550/ARXIV.2401.00001", + "10.5281/ZENODO.9000001", + "10.1101/2021.01.01.400001".upper(), + ], +) +def test_is_secondary_doi_is_case_insensitive(doi: str) -> None: + """The prefix check lowercases first, so an uppercase preprint DOI is still + recognised as secondary.""" + assert is_secondary_doi(doi) is True + + +# (raw_doi, normalized) -- captured from the live _norm_doi. +_NORM_DOI_CASES: list[tuple[str | None, str | None]] = [ + ("10.1145/3580305", "10.1145/3580305"), + ("https://doi.org/10.1145/3580305", "10.1145/3580305"), + ("http://dx.doi.org/10.1145/3580305", "10.1145/3580305"), + ("HTTPS://DOI.ORG/10.1145/3580305", "10.1145/3580305"), + ("doi: 10.1145/3580305", "10.1145/3580305"), + (" 10.1145/3580305 ", "10.1145/3580305"), + ("10.1145/ABCdef", "10.1145/abcdef"), + ("10.1000/abc%2Fdef", "10.1000/abc/def"), + (None, None), + ("", None), + ("https://doi.org/", None), +] + + +@pytest.mark.parametrize(("raw", "expected"), _NORM_DOI_CASES) +def test_norm_doi_normalization(raw: str | None, expected: str | None) -> None: + """``_norm_doi`` strips resolver/prefix wrappers, URL-decodes percent + escapes, lowercases, and collapses empties to ``None``.""" + assert _norm_doi(raw) == expected + + +@pytest.mark.parametrize( + "wrapper", + [ + "https://doi.org/10.1145/3580305", + "http://dx.doi.org/10.1145/3580305", + "doi:10.1145/3580305", + "10.1145/3580305", + ], +) +def test_norm_doi_bare_url_equivalence(wrapper: str) -> None: + """A bare DOI and its URL/``doi:``-wrapped forms normalize to one canonical + string, which is what lets dedup compare records from different APIs.""" + assert _norm_doi(wrapper) == "10.1145/3580305" + + +def test_norm_doi_percent_encoding_matches_decoded_form() -> None: + """A percent-encoded slash normalizes to the same value as the decoded DOI.""" + assert _norm_doi("10.1000/abc%2Fdef") == _norm_doi("10.1000/abc/def") + + +def test_normalize_doi_delegates_to_norm_doi() -> None: + """The public ``normalize_doi`` is a thin alias over ``_norm_doi``.""" + for raw in ("https://doi.org/10.1/X", "doi: 10.2/Y", None, ""): + assert normalize_doi(raw) == _norm_doi(raw) + + +# (entry_fields, expected_arxiv_id) for extract_arxiv_eprint -- version suffix +# is stripped so all versions collapse to one base id. +_EXTRACT_EPRINT_CASES: list[tuple[dict[str, str], str | None]] = [ + ({"doi": "10.48550/arXiv.2401.12345"}, "2401.12345"), + ({"doi": "10.48550/arxiv.1512.03385"}, "1512.03385"), + ({"archiveprefix": "arXiv", "eprint": "2401.12345v2"}, "2401.12345"), + ({"journal": "arXiv:2401.12345"}, "2401.12345"), + ({"doi": "10.1145/3580305"}, None), + ({}, None), +] + + +@pytest.mark.parametrize(("fields", "expected"), _EXTRACT_EPRINT_CASES) +def test_extract_arxiv_eprint(fields: dict[str, str], expected: str | None) -> None: + """arXiv id is recovered from the ``10.48550/arxiv.*`` DOI, the + ``archiveprefix``/``eprint`` pair (version stripped), or an ``arXiv:...`` + journal string, and is ``None`` when no arXiv marker is present.""" + assert extract_arxiv_eprint({"fields": fields}) == expected + + +# (text_or_html, expected_arxiv_id) for find_arxiv_in_text. +_FIND_ARXIV_CASES: list[tuple[str, str | None]] = [ + ("see arXiv:2401.12345v3 for details", "2401.12345"), + ("https://arxiv.org/abs/2401.12345", "2401.12345"), + ("https://arxiv.org/pdf/1512.03385", "1512.03385"), + ("10.48550/arxiv.2401.12345", "2401.12345"), + ('preprint', "2401.12345"), + ("no identifier here", None), + ("", None), +] + + +@pytest.mark.parametrize(("text", "expected"), _FIND_ARXIV_CASES) +def test_find_arxiv_in_text(text: str, expected: str | None) -> None: + """arXiv ids are extracted from ``arxiv:`` prefixes, abs/pdf URLs (including + inside HTML), and arXiv DOIs, returning ``None`` when nothing matches.""" + assert find_arxiv_in_text(text) == expected diff --git a/tests/test_pipeline_e2e.py b/tests/test_pipeline_e2e.py new file mode 100644 index 00000000..23e9faf3 --- /dev/null +++ b/tests/test_pipeline_e2e.py @@ -0,0 +1,109 @@ +"""Deterministic end-to-end tests for the article pipeline and post-run tail. + +``process_article`` (the 4-phase per-article flow) and ``finalize_run`` (the +ordered post-run tail) are the functions that most directly own the PRIME +DIRECTIVE and the on-disk data-safety guarantees, yet neither had a direct +test. These run the real functions with every network client stubbed to an +empty result, so only the deterministic baseline -> merge -> canonicalize -> +serialize -> save path executes, and assert byte-identical .bib output across a +cold re-run and a cache-hit re-run. The post-run finalization safety guarantees +(orphan-only deletion, contamination guard, year-window, phantom-write) are +covered in test_finalize_run.py. + +No socket is ever opened (asserted), so a leaked real call would fail loudly +rather than make the oracle flaky. +""" + +from __future__ import annotations + +import hashlib +from pathlib import Path +from typing import Any + +import pytest + +from citeforge.models import Record +from citeforge.pipeline import article as article_mod +from tests.fakes import install_block_network + +# Every article-module name that would otherwise reach the network. Each is +# replaced with a stub returning the empty result its caller expects, so the +# pipeline runs fully offline and deterministically. +_EMPTY_LIST_STUBS = [ + "crossref_search_multiple", + "openreview_search_papers_multiple", + "arxiv_search", + "openalex_search_multiple", + "pubmed_search_papers_multiple", + "europepmc_search_papers_multiple", + "s2_search_papers_multiple", + "crossref_search_by_venue", + "openalex_search_by_venue", +] + + +def _stub_all_network(monkeypatch: pytest.MonkeyPatch) -> None: + """Patch every enrichment entry point to an offline empty result.""" + for name in _EMPTY_LIST_STUBS: + monkeypatch.setattr(article_mod, name, lambda *a, **k: [], raising=True) + # DOI validation and Scholar citation detail: no candidate, no detail. + monkeypatch.setattr(article_mod, "process_validated_doi", lambda *a, **k: False, raising=True) + if hasattr(article_mod, "fetch_scholar_citation"): + monkeypatch.setattr(article_mod, "fetch_scholar_citation", lambda *a, **k: None, raising=True) + + +def _art() -> dict[str, Any]: + """A minimal Scholar-shaped article record (no network needed to seed it).""" + return { + "title": "A Deterministic Study of Vessel Trajectories", + "authors": "Ada Lovelace and Charles Babbage", + "year": "2021", + "publication": "Journal of Maritime Analytics", + "source": "scholar", + "citation_id": "cid-deterministic-1", + } + + +def _run_once(out_dir: Path, monkeypatch: pytest.MonkeyPatch) -> int: + _stub_all_network(monkeypatch) + install_block_network(monkeypatch) # any real connection attempt now fails loudly + rec = Record(name="Ada Lovelace", scholar_id="ABC1234567") + return article_mod.process_article( + rec, + _art(), + serply_key=None, + out_dir=str(out_dir), + s2_api_key=None, + or_creds=None, + gemini_api_key=None, + summary_csv_path=None, + min_year=0, + ) + + +def _bib_files(out_dir: Path) -> list[Path]: + return sorted(out_dir.rglob("*.bib")) + + +def _digest(paths: list[Path]) -> dict[str, str]: + return {p.name: hashlib.sha256(p.read_bytes()).hexdigest() for p in paths} + + +def test_cold_runs_are_byte_identical(tmp_path: Path, monkeypatch: pytest.MonkeyPatch) -> None: + """Two fresh runs of the same input produce byte-identical .bib files.""" + a, b = tmp_path / "a", tmp_path / "b" + assert _run_once(a, monkeypatch) == 1 + assert _run_once(b, monkeypatch) == 1 + da, db = _digest(_bib_files(a)), _digest(_bib_files(b)) + assert da and da == db, f"cold-run drift: {da} vs {db}" + + +def test_cache_hit_rerun_is_byte_identical(tmp_path: Path, monkeypatch: pytest.MonkeyPatch) -> None: + """Re-running into the same directory (the existing .bib becomes the seed) + leaves the bytes unchanged: the cache-hit PRIME DIRECTIVE.""" + out = tmp_path / "out" + assert _run_once(out, monkeypatch) == 1 + first = _digest(_bib_files(out)) + _run_once(out, monkeypatch) + second = _digest(_bib_files(out)) + assert first == second, f"cache-hit drift: {first} vs {second}" diff --git a/tests/test_save_entry.py b/tests/test_save_entry.py new file mode 100644 index 00000000..320e0660 --- /dev/null +++ b/tests/test_save_entry.py @@ -0,0 +1,301 @@ +"""On-disk survivor-decision contracts for ``merge_utils.save_entry_to_file``. + +These tests drive the real save surface (``merge_utils.py`` ~966-1248): they +write actual ``.bib`` files with :func:`tests.factories.write_bib`, then call +``save_entry_to_file`` and assert the *real* on-disk outcome (file count, which +file survived, its bytes, the ``was_written`` flag). No mock stands in for the +function under test and the decision logic is never re-implemented here; every +golden verdict was captured by running the live function. + +The surface under test had zero coverage before this file. The behaviours +pinned below are: + +* preprint/published survivor selection (published always wins, work stays once); +* DOI precedence (a DOI-carrying record beats its DOI-less twin either way); +* orphan safety (same title + distinct DOIs => two files, never collapsed); +* DOI url-vs-bare normalization dedup via ``_norm_doi``; +* the ``OSError`` scan branch (an unreadable ``.bib`` never aborts the dedup); +* the composite-dedup threshold (a single-signal flip across + ``SIM_DEDUP_COMPOSITE_THRESHOLD`` toggles merge vs no-merge). +""" + +from __future__ import annotations + +from pathlib import Path + +import pytest + +from citeforge.config import SIM_DEDUP_COMPOSITE_THRESHOLD +from citeforge.merge_utils import save_entry_to_file +from citeforge.text_utils import compute_dedup_score, format_author_dirname +from tests import factories + +AUTHOR_ID = "TestScholar01" + +# Golden DOIs used across the boundary/precedence fixtures. Preprint vs +# published classification was confirmed against the live ``_is_preprint_doi``. +PREPRINT_DOI = "10.48550/arxiv.2401.00001" +PUBLISHED_DOI = "10.1145/3580305" +BOUNDARY_TITLE = "Neural Operators for Turbulent Flow Prediction" + + +def _author_dir(out_dir: Path, author_id: str = AUTHOR_ID) -> Path: + """Return the author subdirectory ``save_entry_to_file`` writes into.""" + return out_dir / format_author_dirname(None, author_id) + + +def _bib_files(author_dir: Path) -> list[str]: + """Sorted ``.bib`` *file* names in *author_dir* (directories excluded).""" + if not author_dir.exists(): + return [] + return sorted(p.name for p in author_dir.iterdir() if p.is_file() and p.suffix == ".bib") + + +def _read(author_dir: Path, name: str) -> str: + """Read a single ``.bib`` file's text.""" + return (author_dir / name).read_text(encoding="utf-8") + + +def _dois_on_disk(author_dir: Path) -> set[str]: + """Collect the lowercased DOI substrings present across all ``.bib`` files.""" + found: set[str] = set() + for name in _bib_files(author_dir): + text = _read(author_dir, name).lower() + for doi in (PREPRINT_DOI, PUBLISHED_DOI): + if doi in text: + found.add(doi) + return found + + +# --- SURVIVOR: preprint vs published of the same work ---------------------- + + +def test_published_on_disk_kept_against_incoming_preprint(tmp_path: Path) -> None: + """Published record already on disk survives an incoming preprint twin. + + ``was_written`` is False (SKIP_WRITE), exactly one ``.bib`` remains, and it + is the published file untouched. + """ + author_dir = _author_dir(tmp_path) + preprint, published_enricher = factories.arxiv_published_twin() + published = published_enricher[1] + factories.write_bib(author_dir, published, "published.bib") + + path, was_written = save_entry_to_file(str(tmp_path), AUTHOR_ID, preprint) + + assert was_written is False + assert _bib_files(author_dir) == ["published.bib"] + assert Path(path).name == "published.bib" + surviving = _read(author_dir, "published.bib").lower() + assert "10.1109/cvpr.2016.90" in surviving + assert "10.48550/arxiv.1512.03385" not in surviving + + +def test_preprint_on_disk_replaced_by_incoming_published(tmp_path: Path) -> None: + """A preprint on disk is removed when its published twin arrives. + + Exactly one ``.bib`` remains, carrying the published DOI (not the preprint + arXiv DOI), and ``was_written`` is True. + """ + author_dir = _author_dir(tmp_path) + preprint, published_enricher = factories.arxiv_published_twin() + published = published_enricher[1] + factories.write_bib(author_dir, preprint, "preprint.bib") + + path, was_written = save_entry_to_file(str(tmp_path), AUTHOR_ID, published) + + assert was_written is True + remaining = _bib_files(author_dir) + assert len(remaining) == 1 + surviving = _read(author_dir, remaining[0]).lower() + assert "10.1109/cvpr.2016.90" in surviving + assert "10.48550/arxiv.1512.03385" not in surviving + assert Path(path).name == remaining[0] + + +# --- DOI precedence: a DOI-carrying record beats its DOI-less twin ---------- + + +def test_existing_doi_beats_incoming_doiless_same_work(tmp_path: Path) -> None: + """Existing record with a DOI is kept over a DOI-less incoming twin.""" + author_dir = _author_dir(tmp_path) + with_doi = factories.article(title="Ocean Graph Networks", author="Spadon, Gabriel", doi=PUBLISHED_DOI, key="A") + doiless = factories.article(title="Ocean Graph Networks", author="Spadon, Gabriel", key="B") + factories.write_bib(author_dir, with_doi, "withdoi.bib") + + path, was_written = save_entry_to_file(str(tmp_path), AUTHOR_ID, doiless) + + assert was_written is False + assert _bib_files(author_dir) == ["withdoi.bib"] + assert Path(path).name == "withdoi.bib" + assert PUBLISHED_DOI in _read(author_dir, "withdoi.bib").lower() + + +def test_incoming_doi_replaces_existing_doiless_same_work(tmp_path: Path) -> None: + """Incoming record with a DOI replaces a DOI-less record of the same work.""" + author_dir = _author_dir(tmp_path) + with_doi = factories.article(title="Ocean Graph Networks", author="Spadon, Gabriel", doi=PUBLISHED_DOI, key="A") + doiless = factories.article(title="Ocean Graph Networks", author="Spadon, Gabriel", key="B") + factories.write_bib(author_dir, doiless, "nodoi.bib") + + path, was_written = save_entry_to_file(str(tmp_path), AUTHOR_ID, with_doi) + + assert was_written is True + remaining = _bib_files(author_dir) + assert len(remaining) == 1 + assert PUBLISHED_DOI in _read(author_dir, remaining[0]).lower() + assert Path(path).name == remaining[0] + + +# --- ORPHAN SAFETY: distinct works must never collapse ---------------------- + + +def test_distinct_works_same_title_kept_as_two_files(tmp_path: Path) -> None: + """Same title under two authors with distinct DOIs stays as two files.""" + author_dir = _author_dir(tmp_path) + first, second = factories.duplicate_titles_two_authors() + factories.write_bib(author_dir, first, "first.bib") + + _path, was_written = save_entry_to_file(str(tmp_path), AUTHOR_ID, second) + + assert was_written is True + remaining = _bib_files(author_dir) + assert len(remaining) == 2 + all_text = "".join(_read(author_dir, name).lower() for name in remaining) + assert "10.1145/3580305" in all_text + assert "10.1038/s41586-024-00001" in all_text + + +# --- DOI url-vs-bare normalization ------------------------------------------ + + +def test_same_doi_url_and_bare_dedup_to_one_file(tmp_path: Path) -> None: + """Two different-title entries sharing one DOI (url form vs bare) => one file. + + Dedup runs through ``_norm_doi``, which strips the ``https://doi.org/`` + wrapper, so the DOIs compare equal despite the different titles/keys. + """ + author_dir = _author_dir(tmp_path) + as_url = factories.article(title="Title One", author="Alpha, A", doi="https://doi.org/10.1145/3580305", key="K1") + as_bare = factories.article(title="Completely Different Title", author="Beta, B", doi="10.1145/3580305", key="K2") + factories.write_bib(author_dir, as_url, "one.bib") + + path, _was_written = save_entry_to_file(str(tmp_path), AUTHOR_ID, as_bare) + + remaining = _bib_files(author_dir) + assert len(remaining) == 1 + assert Path(path).name in remaining + assert PUBLISHED_DOI in _read(author_dir, remaining[0]).lower() + + +# --- OSError scan branch ----------------------------------------------------- + + +def test_unreadable_bib_does_not_abort_dedup(tmp_path: Path) -> None: + """An unreadable ``.bib`` on disk is skipped; dedup still hits the readable one. + + A directory named ``*.bib`` is enumerated by ``iter_author_bibs`` but raises + ``IsADirectoryError`` (an ``OSError``) on ``open()``. The per-file ``except + OSError`` must swallow it so the readable true-duplicate is still matched. + """ + author_dir = _author_dir(tmp_path) + author_dir.mkdir(parents=True, exist_ok=True) + # Sorts before the readable file, so it is scanned first and must not abort. + (author_dir / "aaa_unreadable.bib").mkdir() + readable = factories.article(title="Deep Sea Mapping", author="Nara, A", doi=PUBLISHED_DOI, key="R") + factories.write_bib(author_dir, readable, "zzz_readable.bib") + incoming = factories.article(title="Deep Sea Mapping", author="Nara, A", doi=PUBLISHED_DOI, key="R") + + path, _was_written = save_entry_to_file(str(tmp_path), AUTHOR_ID, incoming) + + # Deduped against the readable file (no third file created), no exception. + assert Path(path).name == "zzz_readable.bib" + assert _bib_files(author_dir) == ["zzz_readable.bib"] + assert (author_dir / "aaa_unreadable.bib").is_dir() + assert PUBLISHED_DOI in _read(author_dir, "zzz_readable.bib").lower() + + +# --- Composite-dedup threshold boundary ------------------------------------- +# +# Path exercised: existing=preprint on disk, incoming=published, identical +# title (title_sim = 1.0, so the preprint-pair composite check is entered). +# The only variable across the two cases is the author list, which moves +# compute_dedup_score(count_preprint_xor=False) from ~0.535 (below) to ~0.785 +# (above) the 0.60 threshold. Both sides sit > 0.02 from the threshold. + +_BELOW_AUTHORS = ("Smith, John", "Doe, Jane") # disjoint => author_overlap 0.0 +_ABOVE_AUTHORS = ("Kaiming, He and Zhang, Xiangyu", "Kaiming, He and Zhang, Xiangyu") + + +def _boundary_pair(existing_author: str, incoming_author: str) -> tuple[factories.Entry, factories.Entry]: + existing_preprint = factories.article( + title=BOUNDARY_TITLE, author=existing_author, year="2023", journal="arXiv", doi=PREPRINT_DOI, key="P" + ) + incoming_published = factories.article( + title=BOUNDARY_TITLE, + author=incoming_author, + year="2023", + journal="Nature Communications", + doi=PUBLISHED_DOI, + key="Q", + ) + return existing_preprint, incoming_published + + +def test_composite_below_threshold_keeps_two_files(tmp_path: Path) -> None: + """Composite just below ``SIM_DEDUP_COMPOSITE_THRESHOLD`` => no merge, two files.""" + author_dir = _author_dir(tmp_path) + existing, incoming = _boundary_pair(*_BELOW_AUTHORS) + score = compute_dedup_score(existing["fields"], incoming["fields"], count_preprint_xor=False) + assert score < SIM_DEDUP_COMPOSITE_THRESHOLD - 0.02 # robustly below, not on the fence + factories.write_bib(author_dir, existing, "pre.bib") + + _path, was_written = save_entry_to_file(str(tmp_path), AUTHOR_ID, incoming) + + assert was_written is True + remaining = _bib_files(author_dir) + assert len(remaining) == 2 + assert _dois_on_disk(author_dir) == {PREPRINT_DOI, PUBLISHED_DOI} + + +def test_composite_above_threshold_merges_to_one_file(tmp_path: Path) -> None: + """Composite just above ``SIM_DEDUP_COMPOSITE_THRESHOLD`` => merge, one file. + + The single flipped signal (author overlap) tips the same preprint/published + pair over the threshold; the preprint is replaced by the published record. + """ + author_dir = _author_dir(tmp_path) + existing, incoming = _boundary_pair(*_ABOVE_AUTHORS) + score = compute_dedup_score(existing["fields"], incoming["fields"], count_preprint_xor=False) + assert score > SIM_DEDUP_COMPOSITE_THRESHOLD + 0.02 # robustly above, not on the fence + factories.write_bib(author_dir, existing, "pre.bib") + + _path, was_written = save_entry_to_file(str(tmp_path), AUTHOR_ID, incoming) + + assert was_written is True + remaining = _bib_files(author_dir) + assert len(remaining) == 1 + surviving = _read(author_dir, remaining[0]).lower() + assert PUBLISHED_DOI in surviving + assert PREPRINT_DOI not in surviving + + +@pytest.mark.parametrize( + ("authors", "expected_files"), + [(_BELOW_AUTHORS, 2), (_ABOVE_AUTHORS, 1)], + ids=["below_threshold_two_files", "above_threshold_one_file"], +) +def test_composite_boundary_flips_verdict(tmp_path: Path, authors: tuple[str, str], expected_files: int) -> None: + """The merge/no-merge verdict flips across the composite threshold. + + Consolidated parametrized guard: only the author list changes between the + two rows, yet the on-disk file count flips 2 <-> 1 as the composite crosses + ``SIM_DEDUP_COMPOSITE_THRESHOLD``. + """ + author_dir = _author_dir(tmp_path) + existing, incoming = _boundary_pair(*authors) + factories.write_bib(author_dir, existing, "pre.bib") + + save_entry_to_file(str(tmp_path), AUTHOR_ID, incoming) + + assert len(_bib_files(author_dir)) == expected_files diff --git a/tests/test_text_utils.py b/tests/test_text_utils.py new file mode 100644 index 00000000..8c28fa5f --- /dev/null +++ b/tests/test_text_utils.py @@ -0,0 +1,156 @@ +"""Pure-unit contracts for the similarity scorers in :mod:`citeforge.text_utils`. + +Covers the four signals dedup relies on: venue similarity (pure fuzz, no hidden +preprint-vs-published bonus), title similarity, author-overlap Jaccard, and the +XOR signal accounting inside ``compute_dedup_score``. Golden values were read +from the live functions; fuzz-derived checks use bands robustly away from every +decision threshold rather than brittle exact scores. +""" + +from __future__ import annotations + +import pytest +from rapidfuzz.fuzz import ratio as fuzz_ratio + +from citeforge.text_utils import ( + author_overlap_ratio, + compute_dedup_score, + normalize_title, + title_similarity, + venue_similarity, +) +from tests.corpus import PREPRINT_SERVER_JOURNALS + +# A real journal name distinct from every preprint server, so a preprint-vs-this +# pair scores far below the 0.5 duplicate band (max observed ~0.24). +_JOURNAL = "IEEE Transactions on Pattern Analysis and Machine Intelligence" + + +def _pure_fuzz(a: str, b: str) -> float: + """Reference venue score: rapidfuzz over normalized strings, 1.0 when equal. + + This is the whole contract of ``venue_similarity`` -- no preprint/published + (XOR) term is added, so equality with this value proves no double-counting. + """ + na, nb = normalize_title(a), normalize_title(b) + if na == nb: + return 1.0 + return fuzz_ratio(na, nb) / 100.0 + + +def _venue_rows() -> list[tuple[str, str, bool]]: + """(venue_a, venue_b, expect_below_half) rows covering the full contract.""" + rows: list[tuple[str, str, bool]] = [] + for srv in PREPRINT_SERVER_JOURNALS: + rows.append((srv, srv, False)) # identical venue -> 1.0 + rows.append((srv, _JOURNAL, True)) # preprint server vs journal -> pure fuzz, < 0.5 + return rows + + +@pytest.mark.parametrize(("venue_a", "venue_b", "below_half"), _venue_rows()) +def test_venue_similarity_is_pure_fuzz(venue_a: str, venue_b: str, below_half: bool) -> None: + """``venue_similarity`` equals rapidfuzz-over-normalized-strings with no + hidden XOR bonus: identical venues score 1.0, and a preprint-server-vs-journal + pair returns exactly the fuzz ratio and stays below the 0.5 duplicate band.""" + fields_a = {"journal": venue_a} + fields_b = {"journal": venue_b} + got = venue_similarity(fields_a, fields_b) + assert got == _pure_fuzz(venue_a, venue_b) + if venue_a == venue_b: + assert got == 1.0 + if below_half: + assert got < 0.5 + + +def test_venue_similarity_empty_side_is_zero() -> None: + """A missing venue on either side yields 0.0 (no container to compare).""" + assert venue_similarity({"journal": ""}, {"journal": "Nature"}) == 0.0 + assert venue_similarity({}, {"journal": "Nature"}) == 0.0 + + +# (title_a, title_b, lo, hi) -- inclusive band for the returned score. Identical +# and empty/None cases pin an exact value (lo == hi); fuzz cases use a band that +# is at least 0.13 from any threshold, per the no-close-to-threshold rule. +_TITLE_CASES: list[tuple[str | None, str | None, float, float]] = [ + ("Deep Residual Learning", "Deep Residual Learning", 1.0, 1.0), + ("Attention Is All You Need", "attention is all you need", 1.0, 1.0), + ( + "Deep Residual Learning for Image Recognition", + "Deep Residual Learning for Image Recognation", + 0.90, + 0.999, + ), + ("Quantum Computing Foundations", "A Survey of Marine Biology", 0.0, 0.45), + ("", "", 1.0, 1.0), + (None, None, 1.0, 1.0), + (None, "Something", 0.0, 0.0), + ("", "Something", 0.0, 0.0), +] + + +@pytest.mark.parametrize(("a", "b", "lo", "hi"), _TITLE_CASES) +def test_title_similarity_bands(a: str | None, b: str | None, lo: float, hi: float) -> None: + """Identical titles score 1.0, near-duplicates score high (0.90-0.999), + distinct titles score low (< 0.5), and empty/None inputs are safe -- two + empties/Nones normalize equal (1.0) while an empty-vs-text pair is 0.0.""" + score = title_similarity(a, b) + assert lo <= score <= hi + + +# (authors_a, authors_b, expected) -- Jaccard on last-name+initials signatures, +# exact rationals (no fuzz), so equality is asserted directly. +_AUTHOR_CASES: list[tuple[str, str, float]] = [ + ("Smith, John and Doe, Jane", "Smith, John and Doe, Jane", 1.0), + ("Doe, Jane and Smith, John", "Smith, John and Doe, Jane", 1.0), + ("Smith, John A", "Smith, Robert B", 0.0), + ("Smith, John", "Zhang, Wei", 0.0), + ("Smith, John and Doe, Jane", "Smith, John", 0.5), + ("", "Smith, John", 0.0), +] + + +@pytest.mark.parametrize(("authors_a", "authors_b", "expected"), _AUTHOR_CASES) +def test_author_overlap_ratio(authors_a: str, authors_b: str, expected: float) -> None: + """Jaccard over normalized author signatures: full overlap (any order) is + 1.0, partial overlap is a proper fraction, and disjoint/empty lists are + 0.0.""" + assert author_overlap_ratio(authors_a, authors_b) == expected + + +def test_author_overlap_distinguishes_same_surname_different_initials() -> None: + """Same surname with different initials is NOT treated as overlap: the shared + surname alone scores 0.0, while identical initials score 1.0.""" + identical = author_overlap_ratio("Smith, John A", "Smith, John A") + different = author_overlap_ratio("Smith, John A", "Smith, Robert B") + assert identical == 1.0 + assert different == 0.0 + assert different < identical + + +def _preprint_side() -> dict[str, str]: + return {"title": "T", "author": "Smith, John", "year": "2021", "journal": "arXiv"} + + +def _published_side(journal: str) -> dict[str, str]: + return {"title": "T", "author": "Smith, John", "year": "2021", "journal": journal} + + +# (fields_a, fields_b, expected_delta) -- difference between counting the +# preprint-vs-published XOR (Signal 6) and not counting it. +_XOR_DELTA_CASES: list[tuple[dict[str, str], dict[str, str], float]] = [ + (_preprint_side(), _published_side("Nature"), 0.10), # XOR true -> the 0.10 signal fires + (_published_side("Nature"), _published_side("Science"), 0.0), # both published -> no split + (_preprint_side(), {"title": "T", "author": "Smith, John", "year": "2021", "journal": "bioRxiv"}, 0.0), +] + + +@pytest.mark.parametrize(("fields_a", "fields_b", "expected_delta"), _XOR_DELTA_CASES) +def test_compute_dedup_score_xor_signal_accounting( + fields_a: dict[str, str], fields_b: dict[str, str], expected_delta: float +) -> None: + """Toggling ``count_preprint_xor`` moves the composite by exactly the 0.10 + XOR signal for a preprint/journal pair and by 0.0 when both sides are the + same class -- proving the split is counted exactly once.""" + with_xor = compute_dedup_score(fields_a, fields_b, count_preprint_xor=True) + without_xor = compute_dedup_score(fields_a, fields_b, count_preprint_xor=False) + assert with_xor - without_xor == pytest.approx(expected_delta, abs=1e-9) diff --git a/tests/test_textnorm.py b/tests/test_textnorm.py new file mode 100644 index 00000000..d2cfb34d --- /dev/null +++ b/tests/test_textnorm.py @@ -0,0 +1,136 @@ +"""Pure-unit contracts for :mod:`citeforge.textnorm`. + +Drives the real title/booktitle normalization primitives over the shared +adversarial corpus tables. Every expected value here was captured from the live +functions (see the probe in the assignment log), never hand-derived. The +fixpoint / idempotence assertions are load-bearing: the pipeline applies these +fixes in three places across a run (initial fixup, pre-enrichment, post-merge), +so a spurious rewrite on already-correct input would oscillate between +consecutive cache-hit runs and break the byte-identical determinism guarantee. +""" + +from __future__ import annotations + +import pytest + +from citeforge.textnorm import _apply_booktitle_fixups, _fix_fused_compounds, _fix_title_text +from tests.corpus import BOOKTITLE_FIXUP_CASES, FUSED_COMPOUND_CASES + +# --------------------------------------------------------------------------- +# _fix_fused_compounds +# --------------------------------------------------------------------------- + + +@pytest.mark.parametrize(("title_in", "title_out"), FUSED_COMPOUND_CASES) +def test_fix_fused_compounds_corpus(title_in: str, title_out: str) -> None: + """Each corpus case maps to its captured golden output, incl. the fixpoint.""" + assert _fix_fused_compounds(title_in) == title_out + + +@pytest.mark.parametrize(("title_in", "title_out"), FUSED_COMPOUND_CASES) +def test_fix_fused_compounds_idempotent(title_in: str, title_out: str) -> None: + """Re-running the fix on its own output is a no-op (determinism-critical).""" + once = _fix_fused_compounds(title_in) + assert _fix_fused_compounds(once) == once + + +def test_fix_fused_compounds_empty_passthrough() -> None: + """The empty string short-circuits and returns unchanged.""" + assert _fix_fused_compounds("") == "" + + +def test_fix_fused_compounds_nonascii_guard_preserves_bytes() -> None: + """A non-ASCII title with no fused compound is byte-preserved. + + For non-ASCII input the literal pre-guard in ``_fix_fused_compounds`` is + bypassed and every pattern runs, so this exercises the guard-skip path. The + output must stay byte-identical to the accented input. + """ + title = "Étude sur les Réseaux Neuronaux" + result = _fix_fused_compounds(title) + assert result == title + assert result.encode("utf-8") == title.encode("utf-8") + + +def test_fix_fused_compounds_nonascii_still_repairs_ascii_compound() -> None: + """The guard-skip path still repairs an ASCII fused compound in a mixed string.""" + assert _fix_fused_compounds("Étude Knowledgedriven") == "Étude Knowledge-Driven" + + +# --------------------------------------------------------------------------- +# _apply_booktitle_fixups +# --------------------------------------------------------------------------- + + +@pytest.mark.parametrize(("bt_in", "bt_out"), BOOKTITLE_FIXUP_CASES) +def test_apply_booktitle_fixups_corpus(bt_in: str, bt_out: str) -> None: + """Each corpus booktitle maps to its captured golden output.""" + assert _apply_booktitle_fixups(bt_in) == bt_out + + +@pytest.mark.parametrize(("bt_in", "bt_out"), BOOKTITLE_FIXUP_CASES) +def test_apply_booktitle_fixups_idempotent(bt_in: str, bt_out: str) -> None: + """Re-applying the booktitle fixups on their own output is a no-op.""" + once = _apply_booktitle_fixups(bt_in) + assert _apply_booktitle_fixups(once) == once + + +# --------------------------------------------------------------------------- +# _fix_title_text — colon/hyphen spacing and acronym casing +# --------------------------------------------------------------------------- + +# (title_in, title_out) golden pairs captured live from _fix_title_text. +_TITLE_TEXT_CASES: list[tuple[str, str]] = [ + # Colon glued to a following capital gets a space inserted after the colon. + ("Deep Learning:A Survey", "Deep Learning: A Survey"), + # "word- X" collapses the stray space into a real hyphen. + ("Multi- Task Learning", "Multi-Task Learning"), + # "word -Y" collapses the stray space the other way. + ("Multi -Task Learning", "Multi-Task Learning"), + # Case-sensitive acronym corrections (Iot->IoT, Ai->AI, Nims->NIMS). + ("Iot Security and Ai Systems", "IoT Security and AI Systems"), + ("Nims Data Pipeline", "NIMS Data Pipeline"), + # Combined: fused compound + colon spacing + acronym in one title. + ("Knowledgedriven Reasoning:An Iot Study", "Knowledge-Driven Reasoning: An IoT Study"), +] + + +@pytest.mark.parametrize(("title_in", "title_out"), _TITLE_TEXT_CASES) +def test_fix_title_text_golden(title_in: str, title_out: str) -> None: + """Colon/hyphen spacing and acronym casing match captured golden outputs.""" + assert _fix_title_text(title_in) == title_out + + +@pytest.mark.parametrize(("title_in", "title_out"), _TITLE_TEXT_CASES) +def test_fix_title_text_idempotent(title_in: str, title_out: str) -> None: + """A second pass over the fixed title changes nothing (determinism-critical).""" + once = _fix_title_text(title_in) + assert _fix_title_text(once) == once + + +@pytest.mark.parametrize( + "title", + [ + "A State-of-the-Art System", + "A Clean Title Without Issues", + "Deep Learning: A Survey", + "IoT Security and AI Systems", + ], +) +def test_fix_title_text_fixpoint_on_correct_input(title: str) -> None: + """Already-correct titles pass through unchanged (no spurious rewrite).""" + assert _fix_title_text(title) == title + + +def test_fix_title_text_hyphen_lookahead_spares_conjunctions() -> None: + """ "word- and/or/to " keeps its space (negative lookahead in the hyphen rule).""" + assert _fix_title_text("Learn- and Adapt") == "Learn- and Adapt" + assert _fix_title_text("Learn- or Die") == "Learn- or Die" + assert _fix_title_text("Point- to Point") == "Point- to Point" + + +def test_fix_title_text_nonascii_preserves_bytes_but_applies_ascii_fixes() -> None: + """A non-ASCII title is byte-preserved where no ASCII rule matches, yet an + embedded ASCII acronym literal is still corrected.""" + assert _fix_title_text("Étude sur les Réseaux Neuronaux") == "Étude sur les Réseaux Neuronaux" + assert _fix_title_text("Análisis de Datos Iot") == "Análisis de Datos IoT" From b42402a7e5407c296104fe3a7912f58c3b316228 Mon Sep 17 00:00:00 2001 From: Gabriel Spadon Date: Thu, 2 Jul 2026 09:23:23 -0300 Subject: [PATCH 49/54] test: delete self-mutating downgrade tests and trivial config assertions --- tests/test_config.py | 30 ------ tests/test_regression.py | 221 +-------------------------------------- 2 files changed, 1 insertion(+), 250 deletions(-) diff --git a/tests/test_config.py b/tests/test_config.py index 3e8a26e2..9e811367 100644 --- a/tests/test_config.py +++ b/tests/test_config.py @@ -13,14 +13,6 @@ ) -def test_dynamic_publication_limit() -> None: - """Test that MAX_PUBLICATIONS_PER_AUTHOR is calculated correctly.""" - expected = PUBLICATIONS_PER_YEAR * CONTRIBUTION_WINDOW_YEARS - assert expected == MAX_PUBLICATIONS_PER_AUTHOR, ( - f"Calculation error: expected {expected}, got {MAX_PUBLICATIONS_PER_AUTHOR}" - ) - - def test_publications_per_year_reasonable() -> None: """Test that PUBLICATIONS_PER_YEAR is a reasonable value.""" assert PUBLICATIONS_PER_YEAR >= 1, "PUBLICATIONS_PER_YEAR must be at least 1" @@ -42,19 +34,6 @@ def test_max_publications_positive() -> None: ) -def test_config_types() -> None: - """Test that configuration values have correct types.""" - assert isinstance(CONTRIBUTION_WINDOW_YEARS, int), ( - f"CONTRIBUTION_WINDOW_YEARS should be int, got {type(CONTRIBUTION_WINDOW_YEARS)}" - ) - assert isinstance(PUBLICATIONS_PER_YEAR, int), ( - f"PUBLICATIONS_PER_YEAR should be int, got {type(PUBLICATIONS_PER_YEAR)}" - ) - assert isinstance(MAX_PUBLICATIONS_PER_AUTHOR, int), ( - f"MAX_PUBLICATIONS_PER_AUTHOR should be int, got {type(MAX_PUBLICATIONS_PER_AUTHOR)}" - ) - - def test_min_year_valid() -> None: """Test that MIN_YEAR is either None or a sensible year.""" assert MIN_YEAR is None or 1900 <= MIN_YEAR <= 2100 @@ -79,12 +58,3 @@ def test_get_min_year_rolling(monkeypatch: object) -> None: expected = datetime.now(timezone.utc).year - (_CONTRIBUTION_WINDOW_FALLBACK - 1) assert get_min_year() == expected mp.undo() - - -def test_contribution_window_derived_from_min_year() -> None: - """Test that CONTRIBUTION_WINDOW_YEARS is derived from MIN_YEAR and current year.""" - if MIN_YEAR is not None: - expected = datetime.now(timezone.utc).year - MIN_YEAR + 1 - assert expected == CONTRIBUTION_WINDOW_YEARS, ( - f"Expected {expected} years (current_year - MIN_YEAR + 1), got {CONTRIBUTION_WINDOW_YEARS}" - ) diff --git a/tests/test_regression.py b/tests/test_regression.py index 77a9123c..da44be24 100644 --- a/tests/test_regression.py +++ b/tests/test_regression.py @@ -1883,10 +1883,7 @@ def test_preprints_dot_org_present(self) -> None: class TestMergeDuplicateThresholdRaised: - """SIM_MERGE_DUPLICATE_THRESHOLD should be 0.95.""" - - def test_threshold_value(self) -> None: - assert SIM_MERGE_DUPLICATE_THRESHOLD == 0.95 + """Two clearly different papers by the same authors must not be merged.""" def test_marginal_title_not_merged(self) -> None: """Two clearly different papers by the same authors should NOT be treated as duplicates.""" @@ -1947,13 +1944,6 @@ def test_429_sleep_outside_semaphore(self) -> None: class TestTokenBucketJitter: """TokenBucketRateLimiter.acquire() should include jitter in sleep.""" - def test_jitter_import_and_usage(self) -> None: - """Verify that random.uniform is called during acquire when sleep is needed.""" - import citeforge.http_utils as hu - - # Verify the random module is imported in http_utils (needed for jitter) - assert hasattr(hu, "random"), "http_utils should import random for jitter" - def test_acquire_sleeps_with_jitter_component(self) -> None: """When tokens are exhausted, sleep should include a jitter component.""" # Very slow rate = 0.1 tokens/sec, so after burst=1 exhausted, @@ -2387,20 +2377,6 @@ def test_preprint_publisher_kept_for_preprint_journal(self) -> None: ) -class TestPreprintJournalDowngrade: - """@article with a preprint server as journal should become @misc.""" - - def test_biorxiv_journal_downgrades_to_misc(self) -> None: - assert any(ps == "biorxiv" for ps in PREPRINT_SERVERS), ( - "biorxiv must be in PREPRINT_SERVERS for this test to be valid" - ) - - def test_preprint_server_journal_detected(self) -> None: - """Verify PREPRINT_SERVERS contains the servers needed for journal detection.""" - for server in ("biorxiv", "medrxiv", "ssrn", "arxiv"): - assert server in PREPRINT_SERVERS, f"{server} should be in PREPRINT_SERVERS" - - class TestDagstuhlFestschriftDoi: """Festschrift DOIs (10.4230/oasics.name.N) should resolve to @inproceedings.""" @@ -2491,181 +2467,6 @@ def test_clean_authors_unchanged(self) -> None: assert fields.get("author") == "John Smith and Jane Doe" -class TestVenuelessTypeDowngrade: - """Entries missing required venue fields should be downgraded to @misc.""" - - def test_article_no_journal_with_published_doi_becomes_misc(self) -> None: - """@article without journal should be @misc even with a published DOI.""" - baseline: dict[str, Any] = { - "type": "article", - "key": "Sajjad2025:Interpreting", - "fields": { - "title": "Interpreting the Effects of Quantization on LLMs", - "author": "Hassan Sajjad and Manpreet Singh", - "year": "2025", - "publisher": "Underline Science Inc.", - "doi": "10.48448/1vag-qn48", - }, - } - result = merge_utils.merge_with_policy(baseline, []) - fields = result.get("fields", {}) - assert not fields.get("journal"), "No journal from any enricher" - if result["type"] == "article" and not fields.get("journal"): - result["type"] = "misc" - assert result["type"] == "misc", "@article without journal must be @misc regardless of DOI" - - def test_inproceedings_no_booktitle_becomes_misc(self) -> None: - """@inproceedings without booktitle should be @misc.""" - baseline: dict[str, Any] = { - "type": "inproceedings", - "key": "Yu2022:Learning", - "fields": { - "title": "Learning Uncertainty for Unknown Domains", - "author": "Y Yu and H Sajjad and J Xu", - "year": "2022", - }, - } - result = merge_utils.merge_with_policy(baseline, []) - fields = result.get("fields", {}) - assert not fields.get("booktitle"), "No booktitle from any enricher" - if result["type"] == "inproceedings" and not fields.get("booktitle"): - result["type"] = "misc" - assert result["type"] == "misc", "@inproceedings without booktitle must be @misc" - - def test_article_with_journal_stays_article(self) -> None: - """@article WITH journal stays @article (no false downgrade).""" - baseline: dict[str, Any] = { - "type": "article", - "key": "Smith2024:Normal", - "fields": { - "title": "A Normal Paper", - "author": "John Smith", - "year": "2024", - "journal": "Nature", - "doi": "10.1038/s41586-024-00001-0", - }, - } - csl: dict[str, Any] = { - "type": "article", - "fields": {"doi": "10.1038/s41586-024-00001-0", "title": "A Normal Paper"}, - } - result = merge_utils.merge_with_policy(baseline, [("csl", csl)]) - assert result["type"] == "article" - assert result.get("fields", {}).get("journal") == "Nature" - - -class TestArticlePreprintDoiDowngrade: - """@article with preprint DOI should be downgraded to @misc.""" - - def test_article_with_arxiv_doi_becomes_misc(self) -> None: - """@article with arXiv DOI and journal-like venue -> @misc.""" - baseline: dict[str, Any] = { - "type": "article", - "key": "Smith2023:SomeWork", - "fields": { - "title": "Some Research Work", - "author": "Jane Smith and John Doe", - "year": "2023", - "journal": "Neural Computing and Applications", - "doi": "10.48550/arxiv.2302.02792", - "eprint": "2302.02792", - "archiveprefix": "arXiv", - }, - } - csl: dict[str, Any] = { - "type": "article", - "fields": {"doi": "10.48550/arxiv.2302.02792", "title": "Some Research Work"}, - } - result = merge_utils.merge_with_policy(baseline, [("csl", csl)]) - fields = result.get("fields", {}) - doi = (fields.get("doi") or "").strip() - if result["type"] == "article" and doi and id_utils.is_secondary_doi(doi): - result["type"] = "misc" - if fields.get("journal"): - fields["howpublished"] = fields.pop("journal") - assert result["type"] == "misc", "@article with arXiv DOI must be @misc" - assert fields.get("howpublished") == "Neural Computing and Applications", ( - "Venue should be preserved in howpublished" - ) - assert "journal" not in fields, "journal field should be removed" - - def test_conference_acronym_with_arxiv_doi_becomes_inproceedings(self) -> None: - """Conference acronym in ABBREVIATED_VENUE_MAP with arXiv DOI -> @inproceedings.""" - baseline: dict[str, Any] = { - "type": "article", - "key": "Nekoei2023:DealingNon", - "fields": { - "title": "Dealing With Non-stationarity", - "author": "Hadi Nekoei and Janarthanan Rajendran", - "year": "2023", - "journal": "CoLLAs", - "doi": "10.48550/arxiv.2302.02792", - "eprint": "2302.02792", - "archiveprefix": "arXiv", - }, - } - csl: dict[str, Any] = { - "type": "article", - "fields": {"doi": "10.48550/arxiv.2302.02792", "title": "Dealing With Non-stationarity"}, - } - result = merge_utils.merge_with_policy(baseline, [("csl", csl)]) - fields = result.get("fields", {}) - # CoLLAs is in ABBREVIATED_VENUE_MAP: merge expands to full conference name - assert result["type"] == "inproceedings", "Conference acronym in venue map should become @inproceedings" - assert fields.get("booktitle") == "Conference on Lifelong Learning Agents", ( - "CoLLAs should be expanded to full conference name" - ) - assert "journal" not in fields, "journal field should be moved to booktitle" - - def test_article_with_published_doi_stays_article(self) -> None: - """@article with published DOI stays @article (no false downgrade).""" - baseline: dict[str, Any] = { - "type": "article", - "key": "Smith2024:Real", - "fields": { - "title": "A Real Paper", - "author": "Jane Smith", - "year": "2024", - "journal": "Nature", - "doi": "10.1038/s41586-024-99999-9", - }, - } - csl: dict[str, Any] = { - "type": "article", - "fields": {"doi": "10.1038/s41586-024-99999-9", "title": "A Real Paper"}, - } - result = merge_utils.merge_with_policy(baseline, [("csl", csl)]) - fields = result.get("fields", {}) - doi = (fields.get("doi") or "").strip() - if result["type"] == "article" and doi and id_utils.is_secondary_doi(doi): - result["type"] = "misc" - assert result["type"] == "article", "@article with published DOI should stay @article" - assert fields.get("journal") == "Nature" - - def test_article_with_biorxiv_doi_becomes_misc(self) -> None: - """@article with bioRxiv DOI -> @misc (not just arXiv).""" - baseline: dict[str, Any] = { - "type": "article", - "key": "Doe2024:Bio", - "fields": { - "title": "A Biology Preprint", - "author": "John Doe", - "year": "2024", - "journal": "ISMB", - "doi": "10.1101/2024.01.01.12345", - }, - } - fields = baseline["fields"] - doi = fields["doi"] - assert id_utils.is_secondary_doi(doi), "bioRxiv DOI should be secondary" - if baseline["type"] == "article" and doi and id_utils.is_secondary_doi(doi): - baseline["type"] = "misc" - if fields.get("journal"): - fields["howpublished"] = fields.pop("journal") - assert baseline["type"] == "misc" - assert fields.get("howpublished") == "ISMB" - - class TestReconcileSummaryCSV: """reconcile_summary_csv removes phantom entries for deleted files.""" @@ -2922,26 +2723,6 @@ def test_regular_howpublished_unchanged(self) -> None: assert result["fields"]["howpublished"] == "Technical Report" -class TestArxivEprintsJournalStripping: - """arXiv e-prints journal should be stripped and entry downgraded to @misc.""" - - def test_arxiv_eprints_stripped_from_article(self) -> None: - """@article with journal='arXiv e-prints' should become @misc after merge.""" - entry = { - "type": "article", - "key": "Test2024:Test", - "fields": { - "title": "Test Paper", - "author": "Author A", - "year": "2024", - "journal": "arXiv e-prints", - "doi": "10.48550/arxiv.2401.12345", - }, - } - result = merge_utils.merge_with_policy(entry, []) - assert "journal" not in result["fields"] - - class TestJournalNamedProceedingsWordBoundary: """_matches_journal_named_proceedings must use word-boundary matching.""" From 24b3bd47d229353544e9c87149dab785543aff0f Mon Sep 17 00:00:00 2001 From: Gabriel Spadon Date: Thu, 2 Jul 2026 09:54:33 -0300 Subject: [PATCH 50/54] fix: don't fabricate a conference from a journal howpublished --- citeforge/canonicalize.py | 23 ++++++++++++------ tests/test_canonicalize.py | 49 +++++++++++++++++++++++++------------- 2 files changed, 48 insertions(+), 24 deletions(-) diff --git a/citeforge/canonicalize.py b/citeforge/canonicalize.py index ac9018d4..c0748d28 100644 --- a/citeforge/canonicalize.py +++ b/citeforge/canonicalize.py @@ -15,6 +15,7 @@ from enum import Enum from typing import Any +from citeforge import bibtex_build as bb from citeforge import id_utils as idu from citeforge import merge_utils as mu from citeforge.config import ( @@ -734,13 +735,20 @@ def _rule_normalize_howpublished(entry: dict[str, Any], fields: dict[str, Any]) def _rule_howpublished_to_inproceedings(entry: dict[str, Any], fields: dict[str, Any]) -> bool: """Upgrade @misc with a conference/workshop howpublished -> @inproceedings. - When howpublished is a venue name (not a preprint server or repository), - the entry is a conference/workshop paper that should be @inproceedings. + The howpublished must carry a positive conference signal (a conference + keyword or a known conference venue) before it is treated as a proceedings + booktitle. This prevents fabricating a conference out of a journal name that + reached howpublished through the preprint-DOI downgrade (e.g. an @article in + "Neural Computing and Applications" carrying only an arXiv DOI becomes @misc + with that journal as its howpublished, and must stay @misc rather than turn + into a bogus @inproceedings). A journal that merely contains "Proceedings" + in its name (PNAS, PVLDB) is likewise excluded. + A howpublished that was backfilled from the DOI (i.e. equals - infer_howpublished_from_doi) is a preprint/repository label, never a - conference venue -- e.g. "EGU" (10.5194/egusphere), "Preprint" (Cambridge - Open Engage), "Institutional Repository" (10.32920) -- so it must NOT be - upgraded into a fabricated @inproceedings. + infer_howpublished_from_doi), a preprint server, or a repository label is a + preprint/repository marker -- e.g. "EGU" (10.5194/egusphere), "Preprint" + (Cambridge Open Engage), "Institutional Repository" (10.32920) -- and is + never a conference venue, so it is excluded too. """ if entry.get("type") == "misc" and fields.get("howpublished"): hp_val = (fields.get("howpublished") or "").strip() @@ -752,7 +760,8 @@ def _rule_howpublished_to_inproceedings(entry: dict[str, Any], fields: dict[str, doi = (fields.get("doi") or "").strip() inferred = mu.infer_howpublished_from_doi(doi) if doi else None is_doi_backfilled = inferred is not None and hp_lower == inferred.lower() - if not is_preprint_hp and not is_repository_hp and not is_doi_backfilled and hp_val: + is_conference_hp = bb._is_conference_venue(hp_val) and not mu._matches_journal_named_proceedings(hp_lower) + if is_conference_hp and not is_preprint_hp and not is_repository_hp and not is_doi_backfilled: entry["type"] = "inproceedings" fields["booktitle"] = fields.pop("howpublished") return True diff --git a/tests/test_canonicalize.py b/tests/test_canonicalize.py index a6d0c870..101df5c2 100644 --- a/tests/test_canonicalize.py +++ b/tests/test_canonicalize.py @@ -501,33 +501,48 @@ def test_real_dispatch_preprint_journal_no_doi_moves_to_howpublished(journal: st assert result["fields"]["howpublished"].lower() == journal.lower() -def test_real_dispatch_article_preprint_doi_no_pages_promotes_to_inproceedings() -> None: - """@article with a real journal + arXiv (secondary) DOI + no volume/pages. - - THE captured real behavior (see real_bugs_found): POST_MERGE does NOT settle - at @misc. _rule_article_preprint_doi first downgrades to @misc and moves the - journal into howpublished, then _rule_howpublished_to_inproceedings re-promotes - that plain venue name into a FABRICATED @inproceedings with booktitle = the - original journal. The DOI is kept. This diverges from what - TestArticlePreprintDoiDowngrade.test_article_with_arxiv_doi_becomes_misc - asserts (it re-implements a @misc+howpublished result in its own body and - never runs this dispatch). The file's own test_r19_misc_downgrade_branch note - already documents this misc->inproceedings promotion at full POST_MERGE. +def test_real_dispatch_article_preprint_doi_no_pages_settles_at_misc() -> None: + """@article with a real journal + arXiv (secondary) DOI + no volume/pages + settles at @misc and must NOT be fabricated into a conference. + + _rule_article_preprint_doi downgrades to @misc and moves the journal into + howpublished. _rule_howpublished_to_inproceedings must then leave it alone: + a journal name ("Neural Computing and Applications") carries no conference + signal, so promoting it to @inproceedings with the journal as a booktitle + would fabricate a venue that does not exist. The DOI is kept. """ result = _canon(_article(journal="Neural Computing and Applications", doi="10.48550/arxiv.2302.02792")) - # Locked to the REAL end state, not the naive @misc expectation. - assert result["type"] == "inproceedings" - assert result["fields"]["booktitle"] == "Neural Computing and Applications" + assert result["type"] == "misc" + assert result["fields"]["howpublished"] == "Neural Computing and Applications" + assert "booktitle" not in result["fields"] assert "journal" not in result["fields"] - assert "howpublished" not in result["fields"] assert result["fields"]["doi"] == "10.48550/arxiv.2302.02792" - # Even the fabricated @inproceedings is a data fixpoint (no further churn). + # The @misc end state is a data fixpoint (no oscillation on repeat). repeat = copy.deepcopy(result) canonicalize(repeat, stage=CanonicalStage.POST_MERGE) assert repeat["type"] == result["type"] assert repeat["fields"] == result["fields"] +@pytest.mark.parametrize("journal", ["Nature Communications", "Scientific Reports", "IEEE Transactions on Computers"]) +def test_real_dispatch_journal_preprint_never_becomes_conference(journal: str) -> None: + """A real journal reaching howpublished via the preprint-DOI downgrade never + becomes a fabricated @inproceedings, across several journals.""" + result = _canon(_article(journal=journal, doi="10.48550/arxiv.2401.00001")) + assert result["type"] == "misc" + assert result["fields"].get("howpublished") == journal + assert "booktitle" not in result["fields"] + + +def test_real_dispatch_misc_conference_howpublished_still_promotes() -> None: + """A @misc whose howpublished is a genuine conference is still upgraded to + @inproceedings (the fix narrows the rule, it does not disable it).""" + result = _canon(_article(type="misc", howpublished="Workshop on Machine Learning for Health")) + assert result["type"] == "inproceedings" + assert result["fields"]["booktitle"] == "Workshop on Machine Learning for Health" + assert "howpublished" not in result["fields"] + + def test_real_dispatch_article_preprint_doi_with_pages_keeps_article() -> None: """Contrast branch: real journal + secondary DOI + volume/pages stays @article. From 3728f935a391ffe5fa6c08448b1081483743476e Mon Sep 17 00:00:00 2001 From: Gabriel Spadon Date: Thu, 2 Jul 2026 12:54:33 -0300 Subject: [PATCH 51/54] fix: drop superseded preprints and prefer same-year published DOIs Two campaign-validation defects fixed at their root: - postrun: remove a preprint .bib when a published record of the same work (title similarity >= dedup threshold, real DOI/container) exists in the same author dir. Generalizes 'published outranks preprint'; standalone preprints are always retained and published files are never removed. Deterministic and idempotent. - scoring: thread the known article year into crossref/openalex multi-search scoring so a same-year, same-author, near-identical-title published record earns the year bonus and clears the accept threshold. Recovers authoritative published DOIs that a trivial title-word difference had left as preprints, without weakening any threshold (title-min and author gates still gate first). --- citeforge/api_generics.py | 19 +++-- citeforge/clients/search_apis.py | 27 +++++-- citeforge/pipeline/article.py | 4 +- citeforge/pipeline/postrun.py | 88 +++++++++++++++++++++++ tests/test_bibtex_build.py | 78 +++++++++++++++++++- tests/test_finalize_run.py | 119 ++++++++++++++++++++++++++++++- 6 files changed, 321 insertions(+), 14 deletions(-) diff --git a/citeforge/api_generics.py b/citeforge/api_generics.py index 770f1c62..d4930612 100644 --- a/citeforge/api_generics.py +++ b/citeforge/api_generics.py @@ -146,12 +146,18 @@ def _build_scoring_function( title: str, author_name: str | None, config: APISearchConfig, + year_hint: int | None = None, ) -> Callable[[Any], float]: """Build getter functions from an APISearchConfig and return a scoring function. Resolves custom getters (title_getter, authors_getter, year_getter) from the config, falling back to default field-based accessors, and composes them into - a single scoring function via ``create_scoring_function``. + a single scoring function via ``create_scoring_function``. When ``year_hint`` + is supplied, a candidate whose year agrees with it earns the year bonus, which + lets a same-year, same-author, near-identical-title published record clear the + accept threshold even when a trivial title-word difference lowers the raw title + similarity. It never admits a title/author mismatch: the title-minimum and + author gates run first and short-circuit to zero before year is considered. """ from .bibtex_build import create_scoring_function @@ -166,7 +172,7 @@ def _build_scoring_function( return create_scoring_function( title=title, author_name=author_name, - year_hint=None, + year_hint=year_hint, title_getter=title_getter, authors_getter=authors_getter, year_getter=year_getter, @@ -268,7 +274,12 @@ def search_api_generic( def search_api_generic_multiple( - title: str, author_name: str | None, config: APISearchConfig, api_key: str | None = None, max_results: int = 5 + title: str, + author_name: str | None, + config: APISearchConfig, + api_key: str | None = None, + max_results: int = 5, + year_hint: int | None = None, ) -> list[dict[str, Any]]: """ Search for academic publications and return multiple candidates sorted by relevance. @@ -309,7 +320,7 @@ def search_api_generic_multiple( response_cache.put_negative(config.api_name, cache_key) return [] - score_fn = _build_scoring_function(title, author_name, config) + score_fn = _build_scoring_function(title, author_name, config, year_hint) scored_results = [] effective_threshold = SIM_EXACT_PICK_THRESHOLD - SIM_THRESHOLD_TOLERANCE diff --git a/citeforge/clients/search_apis.py b/citeforge/clients/search_apis.py index 4cbab79f..94837ad3 100644 --- a/citeforge/clients/search_apis.py +++ b/citeforge/clients/search_apis.py @@ -170,8 +170,16 @@ def build_bibtex_from_crossref(item: dict[str, Any], keyhint: str) -> str | None return build_bibtex_from_response(item, keyhint, CROSSREF_FIELD_MAPPING) -def crossref_search_multiple(title: str, author_name: str | None, max_results: int = 5) -> list[dict[str, Any]]: - """Search Crossref for multiple work candidates.""" +def crossref_search_multiple( + title: str, author_name: str | None, max_results: int = 5, year_hint: int | None = None +) -> list[dict[str, Any]]: + """Search Crossref for multiple work candidates. + + ``year_hint`` (the known publication year of the paper being enriched) is + passed through to scoring so a same-year published record earns the year + bonus, letting the authoritative version outrank a preprint even when a + trivial title-word difference lowers the raw title similarity. + """ if not title: return [] from ..api_configs import CROSSREF_SEARCH_CONFIG @@ -188,7 +196,7 @@ def crossref_search_multiple(title: str, author_name: str | None, max_results: i if mailto: additional_params["mailto"] = mailto config.additional_params = additional_params - return search_api_generic_multiple(title, author_name, config, None, max_results) + return search_api_generic_multiple(title, author_name, config, None, max_results, year_hint) # ============ DOI / CSL ============ @@ -859,14 +867,21 @@ def build_bibtex_from_openalex(work: dict[str, Any], keyhint: str) -> str | None return build_bibtex_from_response(work, keyhint, OPENALEX_FIELD_MAPPING) -def openalex_search_multiple(title: str, author_name: str | None, max_results: int = 5) -> list[dict[str, Any]]: - """Search OpenAlex for multiple work candidates.""" +def openalex_search_multiple( + title: str, author_name: str | None, max_results: int = 5, year_hint: int | None = None +) -> list[dict[str, Any]]: + """Search OpenAlex for multiple work candidates. + + ``year_hint`` (the known publication year of the paper being enriched) is + passed through to scoring so a same-year record earns the year bonus, keeping + parity with the Crossref search path. + """ if not title: return [] from ..api_configs import OPENALEX_SEARCH_CONFIG from ..api_generics import search_api_generic_multiple - return search_api_generic_multiple(title, author_name, OPENALEX_SEARCH_CONFIG, None, max_results) + return search_api_generic_multiple(title, author_name, OPENALEX_SEARCH_CONFIG, None, max_results, year_hint) # ============ PubMed ============ diff --git a/citeforge/pipeline/article.py b/citeforge/pipeline/article.py index c74bb972..0364b18e 100644 --- a/citeforge/pipeline/article.py +++ b/citeforge/pipeline/article.py @@ -683,7 +683,7 @@ def process_article( logger.debug(f"SEARCH_START | source=Crossref | title={title[:60]}", category=LogCategory.AUDIT) cr_item = None try: - cr_items = crossref_search_multiple(title, rec.name, max_results=5) + cr_items = crossref_search_multiple(title, rec.name, max_results=5, year_hint=year_hint) if cr_items: _, cr_item = _try_multiple_candidates( LogSource.CROSSREF, @@ -742,7 +742,7 @@ def process_article( logger.debug(f"SEARCH_START | source=OpenAlex | title={title[:60]}", category=LogCategory.AUDIT) oa_work = None try: - oa_works = openalex_search_multiple(title, rec.name, max_results=5) + oa_works = openalex_search_multiple(title, rec.name, max_results=5, year_hint=year_hint) if oa_works: _, oa_work = _try_multiple_candidates( LogSource.OPENALEX, diff --git a/citeforge/pipeline/postrun.py b/citeforge/pipeline/postrun.py index 27fd80f4..3f33780b 100644 --- a/citeforge/pipeline/postrun.py +++ b/citeforge/pipeline/postrun.py @@ -13,8 +13,10 @@ import os import re import time +from typing import Any from citeforge import bibtex_utils as bt +from citeforge.bibtex_build import get_container_field from citeforge.cache import get_cache_hit_counts from citeforge.canonicalize import ( _fixup_bib_entry, @@ -36,6 +38,7 @@ from citeforge.log_utils import LogCategory, logger from citeforge.models import Record from citeforge.text_utils import ( + _is_preprint_fields, extract_year_from_any, title_similarity, ) @@ -189,6 +192,14 @@ def finalize_run( category=LogCategory.CLEANUP, ) + # Drop preprints superseded by a published record of the same work. + superseded = _remove_superseded_preprints(out_dir) + if superseded: + logger.info( + f"Removed {superseded} superseded preprint .bib files (published twin exists)", + category=LogCategory.CLEANUP, + ) + # Build a2i2 joint output folder a2i2_count = build_a2i2_folder(DEFAULT_A2I2_INPUT, records, out_dir) if a2i2_count: @@ -233,6 +244,83 @@ def finalize_run( logger.info(f"Summary CSV: {summary_csv_path}", category=LogCategory.PLAN) +def _looks_published(entry: dict[str, Any]) -> bool: + """Return True when *entry* is a published record rather than a preprint. + + A record counts as published when it is not preprint-flagged (by DOI prefix or + journal name) and carries either a DOI or a real container field (journal for + ``@article``, booktitle for ``@inproceedings``/``@incollection``). Used to + decide whether a preprint twin has been superseded. + """ + fields = entry.get("fields", {}) or {} + if _is_preprint_fields(fields): + return False + if str(fields.get("doi") or "").strip(): + return True + container = get_container_field(str(entry.get("type") or "")) + return bool(container and str(fields.get(container) or "").strip()) + + +def _remove_superseded_preprints(out_dir: str) -> int: + """Delete a preprint ``.bib`` when a published record of the same work exists. + + Within each author directory, a preprint file is removed only when another + file in that directory is a genuinely published record (see + :func:`_looks_published`) whose title matches at or above + ``SIM_MERGE_DUPLICATE_THRESHOLD``. This generalizes the "published outranks a + preprint" rule across every author and paper: a standalone preprint with no + published counterpart is always retained, and published files are never + removed. Deterministic (sorted iteration) and idempotent -- once the preprint + is gone a later run finds no preprint+published pair and removes nothing. + + Returns the number of preprint files removed. + """ + removed = 0 + for entry_name in iter_output_dirs(out_dir): + if entry_name == "a2i2": + continue + author_dir = os.path.join(out_dir, entry_name) + parsed: list[tuple[str, dict[str, Any]]] = [] + for fname in iter_author_bibs(author_dir): + path = os.path.join(author_dir, fname) + try: + with open(path, encoding="utf-8") as bf: + parsed_entry = bt.parse_bibtex_to_dict(bf.read()) + except (OSError, ValueError): + parsed_entry = None + if parsed_entry: + parsed.append((path, parsed_entry)) + + published = [(p, e) for p, e in parsed if _looks_published(e)] + if not published: + continue + + for path, entry in parsed: + fields = entry.get("fields", {}) or {} + if not _is_preprint_fields(fields): + continue + title = str(fields.get("title") or "") + if not title: + continue + has_published_twin = any( + pub_path != path + and title_similarity(title, str((pub_entry.get("fields", {}) or {}).get("title") or "")) + >= SIM_MERGE_DUPLICATE_THRESHOLD + for pub_path, pub_entry in published + ) + if has_published_twin: + try: + os.remove(path) + removed += 1 + logger.info( + f"Removed superseded preprint: {os.path.basename(path)}", + category=LogCategory.CLEANUP, + ) + except OSError: + pass + return removed + + def _load_csv_titles(csv_path: str) -> dict[str, list[str]]: """Load titles from CSV-tracked .bib files, grouped by author directory.""" result: dict[str, list[str]] = {} diff --git a/tests/test_bibtex_build.py b/tests/test_bibtex_build.py index d4756acd..9f62d527 100644 --- a/tests/test_bibtex_build.py +++ b/tests/test_bibtex_build.py @@ -11,7 +11,13 @@ import pytest -from citeforge.bibtex_build import build_bibtex_entry, determine_entry_type, get_container_field +from citeforge.bibtex_build import ( + build_bibtex_entry, + create_scoring_function, + determine_entry_type, + get_container_field, +) +from citeforge.config import SIM_EXACT_PICK_THRESHOLD, SIM_THRESHOLD_TOLERANCE from tests.conftest import extract_bibtex_field # --------------------------------------------------------------------------- @@ -129,6 +135,76 @@ def test_build_bibtex_entry_exact_bytes_locks_serializer() -> None: assert out == expected +# --------------------------------------------------------------------------- +# create_scoring_function -- year signal (published DOI recovery) +# --------------------------------------------------------------------------- + +_ACCEPT = SIM_EXACT_PICK_THRESHOLD - SIM_THRESHOLD_TOLERANCE + + +def _candidate(title: str, author: str, year: int) -> dict[str, object]: + """A Crossref-shaped candidate with a single author and an ``issued`` year.""" + given, _, family = author.partition(" ") + return { + "title": [title], + "author": [{"given": given, "family": family}], + "issued": {"date-parts": [[year]]}, + } + + +def _score(target_title: str, target_author: str, year_hint: int | None, cand: dict[str, object]) -> float: + """Score *cand* against the target using the real scoring function.""" + fn = create_scoring_function( + title=target_title, + author_name=target_author, + year_hint=year_hint, + title_getter=lambda c: (c.get("title") or [""])[0], + authors_getter=lambda c: c.get("author") or [], + year_getter=lambda c: c.get("issued", {}).get("date-parts", [[None]])[0][0], + ) + return fn(cand) + + +def test_year_hint_recovers_published_record_with_trivial_title_diff() -> None: + """A same-year, same-author candidate whose title differs only by a leading + article word ("A Web-based" vs "Web-based") clears the accept threshold WHEN a + matching year hint is supplied, but falls just below it without one. This is + the exact NxPlain/EACL case that left a preprint DOI in place; the year signal + is what recovers the authoritative published DOI. + """ + target_title = "NxPlain: Web-based Tool for Discovery of Latent Concepts" + cand = _candidate("NxPlain: A Web-based Tool for Discovery of Latent Concepts", "Hassan Sajjad", 2023) + + without_year = _score(target_title, "Hassan Sajjad", None, cand) + with_year = _score(target_title, "Hassan Sajjad", 2023, cand) + + assert without_year < _ACCEPT, "regression guard: without a year hint the record is (wrongly) rejected" + assert with_year >= _ACCEPT, "with a matching year hint the published record must be accepted" + + +def test_year_hint_does_not_admit_title_mismatch() -> None: + """The year signal never rescues a title mismatch: the title-minimum gate + short-circuits to zero before year is considered, so a wrong-title candidate + scores 0 even with a matching year and author. + """ + target_title = "Detecting Ongoing Events Using Contextual Word Embeddings" + cand = _candidate("A Completely Unrelated Paper About Marine Biology", "Hassan Sajjad", 2023) + assert _score(target_title, "Hassan Sajjad", 2023, cand) == 0.0 + + +def test_year_hint_wrong_year_gives_no_bonus() -> None: + """A candidate whose year disagrees with the hint earns no year bonus, so the + bonus cannot inflate an off-year near-title match past the threshold. + """ + target_title = "NxPlain: Web-based Tool for Discovery of Latent Concepts" + cand = _candidate("NxPlain: A Web-based Tool for Discovery of Latent Concepts", "Hassan Sajjad", 2019) + + off_year = _score(target_title, "Hassan Sajjad", 2023, cand) + no_hint = _score(target_title, "Hassan Sajjad", None, cand) + assert off_year == no_hint, "a year mismatch must contribute exactly nothing (same as no hint)" + assert off_year < _ACCEPT, "an off-year near-title match must not be auto-accepted" + + # --------------------------------------------------------------------------- # determine_entry_type # --------------------------------------------------------------------------- diff --git a/tests/test_finalize_run.py b/tests/test_finalize_run.py index fff11395..3479329a 100644 --- a/tests/test_finalize_run.py +++ b/tests/test_finalize_run.py @@ -35,7 +35,7 @@ from citeforge.models import Record from citeforge.pipeline import postrun from citeforge.pipeline.postrun import finalize_run -from tests.factories import article, write_bib +from tests.factories import article, misc, write_bib # A year comfortably inside the contribution window regardless of any # CITEFORGE_MIN_YEAR override (under the default env this is exactly 2024, so the @@ -186,6 +186,123 @@ def test_both_orphan_branches_in_one_run(tmp_path: Path, no_a2i2: None) -> None: assert not remove.exists(), "duplicate orphan removed" +# --- PREPRINT SUPERSEDED BY PUBLISHED --------------------------------------- + + +def test_preprint_superseded_by_published_is_removed( + tmp_path: Path, no_a2i2: None, cf_caplog: pytest.LogCaptureFixture +) -> None: + """When an author has a preprint (arXiv DOI) AND a published record of the + same work (same title, real journal DOI), the preprint file is deleted and + the published one is kept. This is the "published outranks preprint" pair + guard, applied generally across authors. + """ + out_dir = tmp_path / "out" + author = _author_dir(out_dir) + same_title = "Detecting Ongoing Events Using Contextual Word and Sentence Embeddings" + + preprint = write_bib( + author, + misc( + key="PreA", + title=same_title, + year=str(_IN_WINDOW_YEAR - 2), + howpublished="arXiv", + doi="10.48550/arxiv.2007.01379", + ), + f"Doe{_IN_WINDOW_YEAR - 2}-Detecting.bib", + ) + published = write_bib( + author, + article( + key="PubA", + title=same_title, + year=str(_IN_WINDOW_YEAR), + journal="Expert Systems with Applications", + doi="10.1016/j.eswa.2022.118257", + ), + f"Doe{_IN_WINDOW_YEAR}-Detecting.bib", + ) + + csv_path = tmp_path / "summary.csv" + _track_in_csv(csv_path, [preprint, published]) + + finalize_run(str(out_dir), _records(), total_saved=2, processed=2, summary_csv_path=str(csv_path)) + + assert published.exists(), "published record must be kept" + assert not preprint.exists(), "preprint superseded by a published twin must be removed" + assert any( + "Removed superseded preprint" in rec.getMessage() and "Detecting" in rec.getMessage() + for rec in cf_caplog.records + ), "superseded-preprint removal must be logged" + + +def test_standalone_preprint_is_retained(tmp_path: Path, no_a2i2: None) -> None: + """A preprint with NO published counterpart in the author dir is retained + (the goal keeps arXiv/repository entries when no published record exists). + """ + out_dir = tmp_path / "out" + author = _author_dir(out_dir) + + lone = write_bib( + author, + misc( + key="Lone", + title="Succinct Euler Tour Trees for Sparse Graphs", + year=str(_IN_WINDOW_YEAR), + howpublished="arXiv", + doi="10.48550/arxiv.2105.04965", + ), + f"Doe{_IN_WINDOW_YEAR}-Euler.bib", + ) + unrelated = write_bib( + author, + article( + key="Other", + title="A Completely Different Published Paper on Weather", + year=str(_IN_WINDOW_YEAR), + journal="Journal of Climate", + doi="10.1175/jcli-d-20-0001.1", + ), + f"Doe{_IN_WINDOW_YEAR}-Weather.bib", + ) + + csv_path = tmp_path / "summary.csv" + _track_in_csv(csv_path, [lone, unrelated]) + + finalize_run(str(out_dir), _records(), total_saved=2, processed=2, summary_csv_path=str(csv_path)) + + assert lone.exists(), "standalone preprint (no published twin) must be retained" + assert unrelated.exists(), "unrelated published paper must be kept" + + +def test_two_preprints_no_published_both_retained(tmp_path: Path, no_a2i2: None) -> None: + """Two preprints with no published record are both kept: supersede only fires + against a genuinely published twin, never preprint-vs-preprint. + """ + out_dir = tmp_path / "out" + author = _author_dir(out_dir) + title = "On the Convergence of Variable Metric Methods" + + p1 = write_bib( + author, + misc(key="P1", title=title, year=str(_IN_WINDOW_YEAR), howpublished="arXiv", doi="10.48550/arxiv.2401.00001"), + f"Doe{_IN_WINDOW_YEAR}-One.bib", + ) + p2 = write_bib( + author, + misc(key="P2", title=title, year=str(_IN_WINDOW_YEAR), howpublished="arXiv", doi="10.48550/arxiv.2401.00002"), + f"Doe{_IN_WINDOW_YEAR}-Two.bib", + ) + + csv_path = tmp_path / "summary.csv" + _track_in_csv(csv_path, [p1, p2]) + + finalize_run(str(out_dir), _records(), total_saved=2, processed=2, summary_csv_path=str(csv_path)) + + assert p1.exists() and p2.exists(), "two preprints with no published twin must both be retained" + + # --- YEAR-WINDOW ------------------------------------------------------------ From 2dbbbdce749167d938023b7be1a226b1db7f1181 Mon Sep 17 00:00:00 2001 From: Gabriel Spadon Date: Thu, 2 Jul 2026 18:39:10 -0300 Subject: [PATCH 52/54] fix: reject exact DOI/arXiv matches when titles are a different paper bibtex_entries_match_strict treated any exact DOI or arXiv-eprint match as a definite match with no title check. A Scholar entry carrying the wrong arXiv id (e.g. 'Movelet Trees' pointing at 2408.04537 = 'Faster run-length compressed suffix arrays') therefore adopted the wrong paper's CSL metadata, overwriting the title, and did so intermittently (the metadata fetch is flaky) which broke run-to-run determinism. Guard both exact-identifier fast paths with a title-conflict check (SIM_IDENTIFIER_TITLE_MIN=0.55): when both records have titles and they are clearly different papers, the shared identifier is a mislabel and is not a match. Missing-title records still match on the identifier alone. Fixes the mis-identification (correctness) and the resulting oscillation (determinism). --- citeforge/bibtex_utils.py | 29 +++++++++++++++++++ citeforge/config.py | 8 ++++++ tests/test_core.py | 60 +++++++++++++++++++++++++++++++++++++++ 3 files changed, 97 insertions(+) diff --git a/citeforge/bibtex_utils.py b/citeforge/bibtex_utils.py index b2456d2c..ae632b61 100644 --- a/citeforge/bibtex_utils.py +++ b/citeforge/bibtex_utils.py @@ -23,6 +23,7 @@ SIM_DEDUP_COMPOSITE_THRESHOLD, SIM_DEDUP_MULTI_SIGNAL_MIN, SIM_FILE_DUPLICATE_THRESHOLD, + SIM_IDENTIFIER_TITLE_MIN, ) from .id_utils import _norm_doi, external_ids_match, extract_arxiv_eprint from .log_utils import LogCategory, logger @@ -610,6 +611,22 @@ def _is_preprint_entry(fields: dict[str, Any]) -> bool: return any(ps in journal for ps in PREPRINT_SERVERS) +def _identifier_title_conflict(af: dict[str, Any], bf: dict[str, Any]) -> bool: + """Return True when two records carry clearly different titles. + + "Clearly different" means both titles are present and their similarity is + below ``SIM_IDENTIFIER_TITLE_MIN``. Used to veto an exact DOI/arXiv identifier + match that stems from a mislabeled identifier (a source attaching the wrong id + to a work). When either title is missing there is nothing to contradict the + identifier, so the match is allowed to stand (returns False). + """ + a_title = normalize_title(af.get("title")) + b_title = normalize_title(bf.get("title")) + if not a_title or not b_title: + return False + return title_similarity(a_title, b_title) < SIM_IDENTIFIER_TITLE_MIN + + def bibtex_entries_match_strict(entry_a: dict[str, Any], entry_b: dict[str, Any]) -> bool: """ Decide whether two BibTeX records refer to the same publication by comparing @@ -630,6 +647,12 @@ def bibtex_entries_match_strict(entry_a: dict[str, Any], entry_b: dict[str, Any] b_doi = _norm_doi(bf.get("doi")) if a_doi and b_doi: if a_doi == b_doi: + if _identifier_title_conflict(af, bf): + logger.debug( + f"ENTRY_REJECT | DOI_EXACT_TITLE_CONFLICT | doi={a_doi} | result=False", + category=LogCategory.DEDUP, + ) + return False logger.debug(f"ENTRY_MATCH | DOI_EXACT | doi={a_doi} | result=True", category=LogCategory.DEDUP) return True a_is_preprint = any(a_doi.startswith(p) for p in PREPRINT_DOI_PREFIXES) @@ -655,6 +678,12 @@ def bibtex_entries_match_strict(entry_a: dict[str, Any], entry_b: dict[str, Any] b_ax = extract_arxiv_eprint(entry_b) if a_ax and b_ax: if a_ax == b_ax: + if _identifier_title_conflict(af, bf): + logger.debug( + f"ENTRY_REJECT | ARXIV_EXACT_TITLE_CONFLICT | id={a_ax} | result=False", + category=LogCategory.DEDUP, + ) + return False logger.debug(f"ENTRY_MATCH | ARXIV_EXACT | id={a_ax} | result=True", category=LogCategory.DEDUP) return True logger.debug(f"ENTRY_REJECT | DIFF_ARXIV | a={a_ax} b={b_ax} | result=False", category=LogCategory.DEDUP) diff --git a/citeforge/config.py b/citeforge/config.py index abbf35a0..f2371ccc 100644 --- a/citeforge/config.py +++ b/citeforge/config.py @@ -152,6 +152,14 @@ def _current_year() -> int: # File-level dedup threshold (must be >= SIM_MERGE_DUPLICATE_THRESHOLD) SIM_FILE_DUPLICATE_THRESHOLD = 0.95 +# Minimum title similarity required to trust an EXACT DOI/arXiv identifier match. +# Guards against mislabeled identifiers: when two records share a DOI or arXiv id +# but their titles are clearly different papers, the identifier was attached to +# the wrong work (e.g., a Scholar entry pointing at the wrong arXiv id) and must +# not be treated as a match. The same paper reformatted across sources scores far +# above this; only genuinely different titles fall below it. +SIM_IDENTIFIER_TITLE_MIN = 0.55 + # Preprint detection PREPRINT_SERVERS = frozenset( { diff --git a/tests/test_core.py b/tests/test_core.py index c85f9278..d4d8f94c 100644 --- a/tests/test_core.py +++ b/tests/test_core.py @@ -461,6 +461,66 @@ def test_bibtex_extra_fields() -> None: assert bt.bibtex_entries_match_strict(parsed_minimal, parsed_enriched), "Extra fields should not prevent matching" +def test_bibtex_mislabeled_arxiv_id_does_not_match() -> None: + """A shared arXiv id with clearly different titles must NOT match. + + Guards against a mislabeled identifier (a Scholar entry pointing at the wrong + arXiv id): the exact-id fast path must not adopt a different paper's metadata. + """ + movelet = dedent(""" + @misc{Gagie2024Movelet, + title = {Movelet Trees}, + author = {Travis Gagie and Giovanni Manzini}, + year = {2024}, + eprint = {2408.04537}, + archiveprefix = {arXiv} + } + """).strip() + faster = dedent(""" + @misc{Gagie2024Faster, + title = {Faster run-length compressed suffix arrays}, + author = {Travis Gagie and Giovanni Manzini}, + year = {2024}, + eprint = {2408.04537}, + archiveprefix = {arXiv} + } + """).strip() + p_movelet = bt.parse_bibtex_to_dict(movelet) + p_faster = bt.parse_bibtex_to_dict(faster) + assert p_movelet is not None and p_faster is not None + assert not bt.bibtex_entries_match_strict(p_movelet, p_faster), ( + "same arXiv id but clearly different titles must be treated as a mislabeled id, not a match" + ) + + +def test_bibtex_same_arxiv_id_reformatted_title_still_matches() -> None: + """The guard must not break legitimate matches: the same arXiv id with only a + reformatted (case/punctuation) title is still the same paper and must match. + """ + canonical = dedent(""" + @misc{Sajjad2020, + title = {Poor Man's BERT: Smaller and Faster Transformer Models}, + author = {Hassan Sajjad}, + year = {2020}, + eprint = {2004.03844}, + archiveprefix = {arXiv} + } + """).strip() + reformatted = dedent(""" + @misc{Sajjad2020b, + title = {Poor man s bert smaller and faster transformer models}, + author = {Hassan Sajjad}, + year = {2020}, + eprint = {2004.03844}, + archiveprefix = {arXiv} + } + """).strip() + p_a = bt.parse_bibtex_to_dict(canonical) + p_b = bt.parse_bibtex_to_dict(reformatted) + assert p_a is not None and p_b is not None + assert bt.bibtex_entries_match_strict(p_a, p_b), "same arXiv id with a reformatted title must still match" + + def test_config() -> None: """Test configuration constants.""" for const in ("CONTRIBUTION_WINDOW_YEARS", "SIM_EXACT_PICK_THRESHOLD"): From 71e3e323b2e23cb37874fe6a668d030886741a71 Mon Sep 17 00:00:00 2001 From: Gabriel Spadon Date: Thu, 2 Jul 2026 20:30:27 -0300 Subject: [PATCH 53/54] chore(audit): snapshot local audit data and output artifacts --- ...8f4d489dbec42d47cbefae17d6a2347410251.json | 2 +- ...0cb05f3b3aea913566d1c025e3c7843db74af.json | 2 +- ...9c67c73bcb309ecb9fb6e5cf623a3beac93d6.json | 2 +- ...21cede9d3e052f775c45a1d416e2453a773ef.json | 2 +- ...eea7410b595ae3ee1c51e962c5089d8e96962.json | 2 +- ...0f6e00f825f0a42713adda205ad1e4fdeee48.json | 2 +- ...9f1f1798f3b52a6ff4d1006f0df0477b8bcc4.json | 2 +- ...69ce43e272b862d2f7975dccc733646e3ab52.json | 2 +- ...020e527e85f1ef7220799a3c478b449ef57f5.json | 2 +- ...c0a52f3d5fa214fd18f9e57525766aeefe5f6.json | 2 +- ...c2f00e4092c7a87cef5575245dcc7db36932a.json | 2 +- ...781a51c6ada84a99b0161440f3a14faf40a84.json | 2 +- ...0cb05f3b3aea913566d1c025e3c7843db74af.json | 2 +- ...3fc7fa8abe7678fceef2d81f3567947cb0001.json | 2 +- ...463b3bd10881a9e8be247bf25e36417d34202.json | 2 +- ...bc0ae5cfd0b09816bdcb744d0019c96e5011a.json | 2 +- ...7cbbc519fc0bf520ec8b4a363bd3605715982.json | 2 +- ...28c02fea02147e35c48a52fea75d488ab7c86.json | 2 +- ...c321a02b797daee6df07b7849aaf552c6688d.json | 2 +- ...cca5bf6cfffef71d539551459e127482e77bf.json | 2 +- ...7d8c84a0910546ad990f619d0942ef3ef9213.json | 2 +- ...706999931e8f7b521fbb11594c79d15bf8a99.json | 2 +- ...7c12b969f7e5371535521a1716a0ee08120d1.json | 2 +- ...1f6697f0643e059ead6e3437a09b7f511263b.json | 2 +- ...242a6305846a32846af22401d97ce72f9b02b.json | 2 +- ...4059de9e90f499372cc5ed20f42278e7eaba2.json | 2 +- ...3e2aea1bde20a06c8676c5bc92b3b46e7ad20.json | 2 +- ...a5f9e029b35588fca25deb034c72ce5b1dc0f.json | 2 +- ...accf5f2fb7fed5ccc1413b1df70c4eff44933.json | 2 +- ...8828dd6cda5fa7f238dc972f5c336bb57cdce.json | 2 +- ...ecf35de42ec7429d6721f5adecfbe17d0c9c9.json | 2 +- ...9940f6f23e0e06b5df4f34109f0460b0714ad.json | 2 +- ...69ce43e272b862d2f7975dccc733646e3ab52.json | 2 +- ...c0a52f3d5fa214fd18f9e57525766aeefe5f6.json | 2 +- ...781a51c6ada84a99b0161440f3a14faf40a84.json | 2 +- ...3fc7fa8abe7678fceef2d81f3567947cb0001.json | 2 +- ...463b3bd10881a9e8be247bf25e36417d34202.json | 2 +- ...7cbbc519fc0bf520ec8b4a363bd3605715982.json | 2 +- ...28c02fea02147e35c48a52fea75d488ab7c86.json | 2 +- ...c321a02b797daee6df07b7849aaf552c6688d.json | 2 +- ...cca5bf6cfffef71d539551459e127482e77bf.json | 2 +- ...7d8c84a0910546ad990f619d0942ef3ef9213.json | 2 +- ...706999931e8f7b521fbb11594c79d15bf8a99.json | 2 +- ...7c12b969f7e5371535521a1716a0ee08120d1.json | 2 +- ...a5906e47d94dc628cbe4f3cb11814070213ab.json | 2 +- ...1ae5d25659239d4977150aa4085e17785a7e8.json | 2 +- ...f31833f5c0c6871c56083df6032970721f816.json | 2 +- ...0c330721113442fc568bc1ec01bf3a4598bb4.json | 2 +- ...2e8b5a3270ee5597c67074ff684bc20af459a.json | 2 +- ...2e064ca4695a1ebc43b6888d2b14f917b66fe.json | 2 +- ...28d07e33d1c2838efc540b456d4f18340b28a.json | 2 +- ...4aafaa6b3aead1076b1b6fdd7df6cb1cbead0.json | 2 +- ...354e01e39ae9e7de9fa6c8f5890040e9aff2b.json | 2 +- ...7ffab84b484eadce978a3277e0eaefcc8bc51.json | 2 +- ...96df4c7e5cac32097b7e0565c6711b897c450.json | 2 +- ...255099d202025f94fc522bb68755c6fa74604.json | 2 +- ...00fefce851f1bdbccd760cd2e5ac7f1d71bda.json | 2 +- ...387950458cfb05d27dc2110c212d44631f014.json | 2 +- ...69ce43e272b862d2f7975dccc733646e3ab52.json | 2 +- ...c0a52f3d5fa214fd18f9e57525766aeefe5f6.json | 2 +- ...781a51c6ada84a99b0161440f3a14faf40a84.json | 2 +- ...3fc7fa8abe7678fceef2d81f3567947cb0001.json | 2 +- ...463b3bd10881a9e8be247bf25e36417d34202.json | 2 +- ...7cbbc519fc0bf520ec8b4a363bd3605715982.json | 2 +- ...28c02fea02147e35c48a52fea75d488ab7c86.json | 2 +- ...c321a02b797daee6df07b7849aaf552c6688d.json | 2 +- ...cca5bf6cfffef71d539551459e127482e77bf.json | 2 +- ...7d8c84a0910546ad990f619d0942ef3ef9213.json | 2 +- ...706999931e8f7b521fbb11594c79d15bf8a99.json | 2 +- ...7c12b969f7e5371535521a1716a0ee08120d1.json | 2 +- ...69ce43e272b862d2f7975dccc733646e3ab52.json | 2 +- ...c0a52f3d5fa214fd18f9e57525766aeefe5f6.json | 2 +- ...781a51c6ada84a99b0161440f3a14faf40a84.json | 2 +- ...3fc7fa8abe7678fceef2d81f3567947cb0001.json | 2 +- ...463b3bd10881a9e8be247bf25e36417d34202.json | 2 +- ...7cbbc519fc0bf520ec8b4a363bd3605715982.json | 2 +- ...28c02fea02147e35c48a52fea75d488ab7c86.json | 2 +- ...c321a02b797daee6df07b7849aaf552c6688d.json | 2 +- ...cca5bf6cfffef71d539551459e127482e77bf.json | 2 +- ...7d8c84a0910546ad990f619d0942ef3ef9213.json | 2 +- ...706999931e8f7b521fbb11594c79d15bf8a99.json | 2 +- ...7c12b969f7e5371535521a1716a0ee08120d1.json | 2 +- ...8e92b8b54b90b8b66f052c156fd355d3c6fb0.json | 2 +- ...d57c1cf9a1cdb7ad22d71a307e72eca4e6388.json | 2 +- ...8986dafda4753d5fb10a4ad8d1991c714bdb1.json | 2 +- ...060db53cd36f3b1b31b2a12367dbe588e8f7f.json | 2 +- ...1a3ce4bd0556a455387cb50e70a9ae1063bb8.json | 2 +- ...0a815cddab7582149a4b5ed9577e98eacf7d2.json | 2 +- ...b742716ecc01cab8c33562f344158b8c0fb35.json | 2 +- ...551fbe4350070cda1e1442fde23cd93c35785.json | 2 +- ...a39a1e15675ab71ff4de92a2425e7f691cfa0.json | 2 +- ...e5a76ed55c855aa3c39bd43434c7155f6571b.json | 2 +- .../Youngshand2020-CharacterizationTotal.bib | 7 +- .../Barawi2026-EvolutionaryDynamics.bib | 7 + .../Beiko2025-AutomatedEDNA.bib | 7 +- .../Odoherty2026-MicrobiomeStewardship.bib | 9 + .../Brandt2023-DynamicallyFinding.bib | 7 + .../Brooks2023-HigherOrder.bib | 4 +- .../Ansari2026-ParticipatoryDesign.bib | 11 + .../Wiafe2026-DesigningAI.bib | 10 + .../Gagie2021-CompactEuler.bib | 10 + .../Gagie2024-MoveletTrees.bib | 6 + .../Gagie2026-ParseIndexing.bib | 10 +- ...Boeira2026-PerformanceCharacterization.bib | 7 +- .../Parizotto2024-AraucariaSimplifying.bib | 6 + .../He (4yj_9skAAAAJ)/He2020-BreadthFirst.bib | 11 +- .../Lyu2022-RectangularRuler.bib | 9 + .../Robertson2026-BrainAtrophy.bib | 2 +- .../Keselj2020-StarfishPrototype.bib | 12 + .../Cano2026-ProspectiveCompression.bib | 3 +- .../Qin2026-HypothesisGeneration.bib | 9 +- .../Shu2020-AdventuresFlatland.bib | 6 +- .../Yu2021-UnpackingComputations.bib | 3 +- .../Delplace2026-TowardsRealistic.bib | 12 +- .../Long2026-GenomicAntigenic.bib | 2 +- .../Martinez2026-CladePredictorMPXV.bib | 2 +- ...Giannakopoulou2021-GeneticArchitecture.bib | 12 + .../Grotzinger2025-LandscapeShared.bib | 3 +- .../H2026-ValidatingField.bib | 9 + .../Naamanka2025-GenomeWide.bib | 9 + .../Strom2021-GenomeWide.bib | 9 + .../Y2026-AlteredNeurodevelopmental.bib | 2 +- .../Eljabu2021-DestinationPort.bib | 3 +- .../Naderi2026-BeyondFeature.bib | 7 +- .../Naderi2026-CrossModal.bib | 7 +- .../Naderi2026-TokenImbalance.bib | 7 + .../Sadeghi2024-ReviewGlobal.bib | 10 + .../Maisonnave2020-ImprovingEvent.bib | 6 - .../Dhaliwal2026-HenTwinMulti.bib | 7 + .../Essien2026-ComparativeAnalysis.bib | 7 + .../Kate2026-BeyondAccuracy.bib | 9 + .../Kate2026-MultiExpert.bib | 7 + .../Mahato2024-DairyDigiD.bib | 9 + .../Neethirajan2021-SocialNetwork.bib | 13 +- .../Neethirajan2023-DecodingDigital.bib | 9 + .../Neethirajan2024-DecodingLanguage.bib | 9 + .../Neethirajan2026-DigitalisationHealth.bib | 7 + .../Padmanabhan2026-SatelliteConstrained.bib | 7 + ...arivendan2026-BeyondProximityKeypoint.bib} | 11 +- .../Parivendan2026-TemporalModeling.bib | 7 + .../Patel2026-CowPainCheckTemporal.bib | 7 + .../Patel2026-ProtocolGuided.bib | 9 + .../Rao2026-RealTime.bib | 7 + .../Senthilkumar2025-IlluminatingBovine.bib | 5 +- .../Lowe2026-BridgingGenerative.bib | 7 + .../Lowe2026-HiddenLayer.bib | 7 + .../Oore2024-ExplicitSolutions.bib | 12 + .../Oore2025-LoopyFramework.bib | 7 + .../Oore2025-RobustPersonalized.bib | 7 + .../Sastry2020-ZeroShot.bib | 6 + .../Silva2026-GeneralizingGeometry.bib | 5 - .../Silva2026-GeometricView.bib | 10 + .../Alhasani2026-StateArt.bib | 10 + .../Duke2026-PROTOCOLLife.bib | 9 +- .../Kaura2026-NutriPalPersuasive.bib | 10 + .../Kimeu2026-CalmMindAI.bib | 10 + .../Nwokolo2026-HydrogenStorage.bib | 11 + .../Olatinwo2026-ExploringEffectiveness.bib | 10 + .../Oyebode2020-PersuasiveStrategies.bib | 11 +- .../Skov2020-Persuasive2020.bib | 6 + .../Vitale2026-PersonalisedAI.bib | 9 + .../Kaura2026-NutriPalPersuasive.bib | 10 + .../Kimeu2026-CalmMindAI.bib | 10 + .../Oyebode2020-DeconstructingPersuasive.bib | 5 +- .../Huang2020-ExploringAssociations.bib | 2 +- .../Huang2021-DataVisualizations.bib | 7 +- .../Rahman2021-SystematicLiterature.bib | 6 - .../Rahman2026-BePartner.bib | 1 + .../Ayoola2026-AdvancingEvidence.bib | 6 +- .../Jackson2024-CreativityGenerative.bib | 7 + .../Kuutila2025-SoftwareInfrastructure.bib | 1 + .../Santos2022-PracticesImprove.bib | 10 +- .../Tempero2026-MakingSoftware.bib | 7 +- .../Cortes2026-NovelEnhanced.bib | 11 + .../Amirkandeh2025-ComparativeEvaluation.bib | 6 + .../Bravo2024-AdvancingPrecision.bib | 10 + .../Rosborough2025-OurOwn.bib | 6 + .../Azad2026-SurgiDiffContext.bib | 10 + .../Badawi2026-TowardsUnderstanding.bib | 10 + .../Rudzicz (elXOB1sAAAAJ)/Ge2024-WhatDo.bib | 9 + .../Mianroodi2025-MedSynthRealistic.bib | 2 +- .../Novikova2022-SystemMethod.bib | 6 + .../Oore2025-MeasurementPersonal.bib | 13 + .../Saqur2024-FilteredNot.bib | 9 + .../Saqur2025-FilteredNot.bib | 6 - .../Saqur2026-SeekingSOTA.bib | 6 +- .../Wiafe2026-DesigningAI.bib | 10 + .../Zhu2023-SituatedNatural.bib | 3 +- .../Adeeba2025-UrBLiMPBenchmark.bib | 13 +- ...25-CLEVLLM.bib => Badshah2025-DAFELLM.bib} | 5 +- .../Badshah2025-TALETool.bib | 10 - .../Badshah2026-SAGESearch.bib | 10 + .../Dalvi2023-NxPlainWeb.bib | 11 +- .../Dumpala2024-VISLABenchmark.bib | 10 + .../Durrani2022-DiscoveringSalientNeurons.bib | 10 + .../Gajo2026-LLMsUnderperform.bib | 9 +- .../Rizwan2026-PersistentEffects.bib | 10 + .../Sajjad2020-PoorMan.bib | 5 +- .../Sajjad2025-InterpretingEffects.bib | 9 +- .../Wong2026-LangFIRDiscovering.bib | 6 +- .../Steeves2026-CorrectionEngaging.bib | 12 + .../Jahan2025-TaxonomyFaults.bib | 6 - .../Jahan2025-WhyAttention.bib | 10 + .../Mehditabar2026-ValidatedTaxonomy.bib | 8 +- .../Rajput2023-FECoMStep.bib | 9 + .../Rajput2026-CodeGreenTowards.bib | 1 + ...aad2025-HierarchicalEvaluationSoftware.bib | 10 + .../Huang2021-DataVisualizations.bib | 7 +- .../Mayette2026-AssessmentVessel.bib | 9 + .../Song2026-MoCoAIS.bib | 11 + .../Spadon2023-BuildingSafer.bib | 10 + .../Spadon2024-GravityInformed.bib | 11 + .../Hasan2024-GeneralizedTransformer.bib | 14 +- .../Lowe2021-LogicalActivation.bib | 6 - .../Lowe2022-LogicalActivation.bib | 11 + .../Ansari2026-ParticipatoryDesign.bib | 10 + .../F2026-AdvancingPassive.bib | 12 + .../Whidden2020-SystematicExploration.bib | 12 + .../Lodel2026-LearningSemantic.bib | 6 +- .../Wilde2020-SpecifyingUser.bib | 1 + .../Jia2026-SynergizingDigital.bib | 11 + .../Lv2020-IntelligentInterference.bib | 9 +- .../Wang2026-DOCAttackData.bib | 10 + .../Baharlouei2024-ADVENTAttackAnomaly.bib | 10 + output/a2i2/Adeeba2025-UrBLiMPBenchmark.bib | 13 +- output/a2i2/Azad2026-SurgiDiffContext.bib | 10 + .../a2i2/Badawi2026-TowardsUnderstanding.bib | 10 + ...25-CLEVLLM.bib => Badshah2025-DAFELLM.bib} | 5 +- output/a2i2/Badshah2025-TALETool.bib | 10 - output/a2i2/Badshah2026-SAGESearch.bib | 10 + .../Baharlouei2024-ADVENTAttackAnomaly.bib | 10 + .../a2i2/Cano2026-ProspectiveCompression.bib | 3 +- output/a2i2/Dalvi2023-NxPlainWeb.bib | 11 +- output/a2i2/Dhaliwal2026-HenTwinMulti.bib | 7 + .../Durrani2022-DiscoveringSalientNeurons.bib | 10 + .../a2i2/Essien2026-ComparativeAnalysis.bib | 7 + output/a2i2/Gajo2026-LLMsUnderperform.bib | 9 +- output/a2i2/Ge2024-WhatDo.bib | 9 + .../a2i2/Hasan2024-GeneralizedTransformer.bib | 14 +- output/a2i2/Jahan2025-TaxonomyFaults.bib | 6 - output/a2i2/Jia2026-SynergizingDigital.bib | 11 + output/a2i2/Kate2026-BeyondAccuracy.bib | 9 + output/a2i2/Kate2026-MultiExpert.bib | 7 + output/a2i2/Kaura2026-NutriPalPersuasive.bib | 10 + output/a2i2/Keselj2020-StarfishPrototype.bib | 12 + output/a2i2/Kimeu2026-CalmMindAI.bib | 10 + output/a2i2/Lodel2026-LearningSemantic.bib | 6 +- output/a2i2/Lowe2021-LogicalActivation.bib | 10 - output/a2i2/Lowe2021-LogicalActivation_2.bib | 6 - output/a2i2/Lowe2022-LogicalActivation.bib | 11 + output/a2i2/Lowe2026-BridgingGenerative.bib | 7 + output/a2i2/Lowe2026-HiddenLayer.bib | 7 + .../a2i2/Lv2020-IntelligentInterference.bib | 9 +- output/a2i2/Mahato2024-DairyDigiD.bib | 9 + output/a2i2/Mayette2026-AssessmentVessel.bib | 9 + .../a2i2/Mehditabar2026-ValidatedTaxonomy.bib | 8 +- .../a2i2/Mianroodi2025-MedSynthRealistic.bib | 2 +- output/a2i2/Neethirajan2021-SocialNetwork.bib | 13 +- .../a2i2/Neethirajan2023-DecodingDigital.bib | 9 + .../a2i2/Neethirajan2024-DecodingLanguage.bib | 9 + .../Neethirajan2026-DigitalisationHealth.bib | 7 + output/a2i2/Novikova2022-SystemMethod.bib | 6 + output/a2i2/Oore2024-ExplicitSolutions.bib | 12 + output/a2i2/Oore2025-LoopyFramework.bib | 7 + output/a2i2/Oore2025-MeasurementPersonal.bib | 6 +- output/a2i2/Oore2025-RobustPersonalized.bib | 7 + .../Oyebode2020-DeconstructingPersuasive.bib | 5 +- .../Padmanabhan2026-SatelliteConstrained.bib | 7 + ...arivendan2026-BeyondProximityKeypoint.bib} | 11 +- .../a2i2/Parivendan2026-TemporalModeling.bib | 7 + .../a2i2/Patel2026-CowPainCheckTemporal.bib | 7 + output/a2i2/Patel2026-ProtocolGuided.bib | 9 + output/a2i2/Qin2026-HypothesisGeneration.bib | 9 +- .../a2i2/Rahman2021-SystematicLiterature.bib | 6 - output/a2i2/Rahman2026-BePartner.bib | 1 + output/a2i2/Rajput2023-FECoMStep.bib | 9 + output/a2i2/Rajput2026-CodeGreenTowards.bib | 1 + output/a2i2/Rao2026-RealTime.bib | 7 + output/a2i2/Rizwan2026-PersistentEffects.bib | 10 + output/a2i2/Robertson2026-BrainAtrophy.bib | 2 +- ...aad2025-HierarchicalEvaluationSoftware.bib | 10 + output/a2i2/Sajjad2020-PoorMan.bib | 5 +- .../a2i2/Sajjad2025-InterpretingEffects.bib | 9 +- output/a2i2/Saqur2024-FilteredNot.bib | 9 + output/a2i2/Saqur2025-FilteredNot.bib | 6 - output/a2i2/Saqur2026-SeekingSOTA.bib | 6 +- output/a2i2/Sastry2020-ZeroShot.bib | 6 + .../Senthilkumar2025-IlluminatingBovine.bib | 5 +- output/a2i2/Shu2020-AdventuresFlatland.bib | 6 +- .../a2i2/Silva2026-GeneralizingGeometry.bib | 5 - output/a2i2/Silva2026-GeometricView.bib | 10 + output/a2i2/Song2026-MoCoAIS.bib | 11 + output/a2i2/Spadon2023-BuildingSafer.bib | 10 + output/a2i2/Spadon2024-GravityInformed.bib | 11 + output/a2i2/Wang2026-DOCAttackData.bib | 10 + output/a2i2/Wiafe2026-DesigningAI.bib | 10 + output/a2i2/Wilde2020-SpecifyingUser.bib | 1 + output/a2i2/Wong2026-LangFIRDiscovering.bib | 6 +- .../Youngshand2020-CharacterizationTotal.bib | 7 +- output/a2i2/Yu2021-UnpackingComputations.bib | 3 +- output/a2i2/Zhu2023-SituatedNatural.bib | 3 +- output/badges.json | 12 +- output/baseline.json | 60 +- output/summary.csv | 648 ++++++++++-------- 304 files changed, 1875 insertions(+), 678 deletions(-) create mode 100644 output/Beiko (OmUy3vUAAAAJ)/Barawi2026-EvolutionaryDynamics.bib create mode 100644 output/Beiko (OmUy3vUAAAAJ)/Odoherty2026-MicrobiomeStewardship.bib create mode 100644 output/Brandt (OMA_KjcAAAAJ)/Brandt2023-DynamicallyFinding.bib create mode 100644 output/Escobedo (lPSfdqAAAAAJ)/Ansari2026-ParticipatoryDesign.bib create mode 100644 output/Escobedo (lPSfdqAAAAAJ)/Wiafe2026-DesigningAI.bib create mode 100644 output/Gagie (aFCoq2YAAAAJ)/Gagie2021-CompactEuler.bib create mode 100644 output/Gagie (aFCoq2YAAAAJ)/Gagie2024-MoveletTrees.bib create mode 100644 output/Haque (PMTOOSQAAAAJ)/Parizotto2024-AraucariaSimplifying.bib create mode 100644 output/He (4yj_9skAAAAJ)/Lyu2022-RectangularRuler.bib create mode 100644 output/Keselj (uDKsmuIAAAAJ)/Keselj2020-StarfishPrototype.bib create mode 100644 output/Mattheisen (uhlDFm4AAAAJ)/Giannakopoulou2021-GeneticArchitecture.bib create mode 100644 output/Mattheisen (uhlDFm4AAAAJ)/H2026-ValidatingField.bib create mode 100644 output/Mattheisen (uhlDFm4AAAAJ)/Naamanka2025-GenomeWide.bib create mode 100644 output/Mattheisen (uhlDFm4AAAAJ)/Strom2021-GenomeWide.bib create mode 100644 output/Matwin (rCoJeuYAAAAJ)/Naderi2026-TokenImbalance.bib create mode 100644 output/Matwin (rCoJeuYAAAAJ)/Sadeghi2024-ReviewGlobal.bib delete mode 100644 output/Milios (ME8aQywAAAAJ)/Maisonnave2020-ImprovingEvent.bib create mode 100644 output/Neethirajan (8VZwF0sAAAAJ)/Dhaliwal2026-HenTwinMulti.bib create mode 100644 output/Neethirajan (8VZwF0sAAAAJ)/Essien2026-ComparativeAnalysis.bib create mode 100644 output/Neethirajan (8VZwF0sAAAAJ)/Kate2026-BeyondAccuracy.bib create mode 100644 output/Neethirajan (8VZwF0sAAAAJ)/Kate2026-MultiExpert.bib create mode 100644 output/Neethirajan (8VZwF0sAAAAJ)/Mahato2024-DairyDigiD.bib create mode 100644 output/Neethirajan (8VZwF0sAAAAJ)/Neethirajan2023-DecodingDigital.bib create mode 100644 output/Neethirajan (8VZwF0sAAAAJ)/Neethirajan2024-DecodingLanguage.bib create mode 100644 output/Neethirajan (8VZwF0sAAAAJ)/Neethirajan2026-DigitalisationHealth.bib create mode 100644 output/Neethirajan (8VZwF0sAAAAJ)/Padmanabhan2026-SatelliteConstrained.bib rename output/{a2i2/Parivendan2025-BeyondProximity.bib => Neethirajan (8VZwF0sAAAAJ)/Parivendan2026-BeyondProximityKeypoint.bib} (55%) create mode 100644 output/Neethirajan (8VZwF0sAAAAJ)/Parivendan2026-TemporalModeling.bib create mode 100644 output/Neethirajan (8VZwF0sAAAAJ)/Patel2026-CowPainCheckTemporal.bib create mode 100644 output/Neethirajan (8VZwF0sAAAAJ)/Patel2026-ProtocolGuided.bib create mode 100644 output/Neethirajan (8VZwF0sAAAAJ)/Rao2026-RealTime.bib create mode 100644 output/Oore (cI0dYX4AAAAJ)/Lowe2026-BridgingGenerative.bib create mode 100644 output/Oore (cI0dYX4AAAAJ)/Lowe2026-HiddenLayer.bib create mode 100644 output/Oore (cI0dYX4AAAAJ)/Oore2024-ExplicitSolutions.bib create mode 100644 output/Oore (cI0dYX4AAAAJ)/Oore2025-LoopyFramework.bib create mode 100644 output/Oore (cI0dYX4AAAAJ)/Oore2025-RobustPersonalized.bib create mode 100644 output/Oore (cI0dYX4AAAAJ)/Sastry2020-ZeroShot.bib delete mode 100644 output/Oore (cI0dYX4AAAAJ)/Silva2026-GeneralizingGeometry.bib create mode 100644 output/Oore (cI0dYX4AAAAJ)/Silva2026-GeometricView.bib create mode 100644 output/Orji (-1cHtBQAAAAJ)/Alhasani2026-StateArt.bib create mode 100644 output/Orji (-1cHtBQAAAAJ)/Kaura2026-NutriPalPersuasive.bib create mode 100644 output/Orji (-1cHtBQAAAAJ)/Kimeu2026-CalmMindAI.bib create mode 100644 output/Orji (-1cHtBQAAAAJ)/Nwokolo2026-HydrogenStorage.bib create mode 100644 output/Orji (-1cHtBQAAAAJ)/Olatinwo2026-ExploringEffectiveness.bib create mode 100644 output/Orji (-1cHtBQAAAAJ)/Skov2020-Persuasive2020.bib create mode 100644 output/Orji (-1cHtBQAAAAJ)/Vitale2026-PersonalisedAI.bib create mode 100644 output/Oyebode (-6DsTnMAAAAJ)/Kaura2026-NutriPalPersuasive.bib create mode 100644 output/Oyebode (-6DsTnMAAAAJ)/Kimeu2026-CalmMindAI.bib delete mode 100644 output/Rahman (9SrqOewAAAAJ)/Rahman2021-SystematicLiterature.bib create mode 100644 output/Ralph (oRBuFa0AAAAJ)/Jackson2024-CreativityGenerative.bib create mode 100644 output/Rau-Chaplin (-PvfVhgAAAAJ)/Cortes2026-NovelEnhanced.bib create mode 100644 output/Reilly (fZ56s2EAAAAJ)/Amirkandeh2025-ComparativeEvaluation.bib create mode 100644 output/Reilly (fZ56s2EAAAAJ)/Bravo2024-AdvancingPrecision.bib create mode 100644 output/Rosborough (kG4oQmsAAAAJ)/Rosborough2025-OurOwn.bib create mode 100644 output/Rudzicz (elXOB1sAAAAJ)/Azad2026-SurgiDiffContext.bib create mode 100644 output/Rudzicz (elXOB1sAAAAJ)/Badawi2026-TowardsUnderstanding.bib create mode 100644 output/Rudzicz (elXOB1sAAAAJ)/Ge2024-WhatDo.bib create mode 100644 output/Rudzicz (elXOB1sAAAAJ)/Novikova2022-SystemMethod.bib create mode 100644 output/Rudzicz (elXOB1sAAAAJ)/Oore2025-MeasurementPersonal.bib create mode 100644 output/Rudzicz (elXOB1sAAAAJ)/Saqur2024-FilteredNot.bib delete mode 100644 output/Rudzicz (elXOB1sAAAAJ)/Saqur2025-FilteredNot.bib create mode 100644 output/Rudzicz (elXOB1sAAAAJ)/Wiafe2026-DesigningAI.bib rename output/Sajjad (t3BH6NkAAAAJ)/{Badshah2025-CLEVLLM.bib => Badshah2025-DAFELLM.bib} (69%) delete mode 100644 output/Sajjad (t3BH6NkAAAAJ)/Badshah2025-TALETool.bib create mode 100644 output/Sajjad (t3BH6NkAAAAJ)/Badshah2026-SAGESearch.bib create mode 100644 output/Sajjad (t3BH6NkAAAAJ)/Dumpala2024-VISLABenchmark.bib create mode 100644 output/Sajjad (t3BH6NkAAAAJ)/Durrani2022-DiscoveringSalientNeurons.bib create mode 100644 output/Sajjad (t3BH6NkAAAAJ)/Rizwan2026-PersistentEffects.bib create mode 100644 output/Sampalli (UCVetfAAAAAJ)/Steeves2026-CorrectionEngaging.bib delete mode 100644 output/Sharma (VHjAIe8AAAAJ)/Jahan2025-TaxonomyFaults.bib create mode 100644 output/Sharma (VHjAIe8AAAAJ)/Jahan2025-WhyAttention.bib create mode 100644 output/Sharma (VHjAIe8AAAAJ)/Rajput2023-FECoMStep.bib create mode 100644 output/Sharma (VHjAIe8AAAAJ)/Saad2025-HierarchicalEvaluationSoftware.bib create mode 100644 output/Spadon (bfdGsGUAAAAJ)/Mayette2026-AssessmentVessel.bib create mode 100644 output/Spadon (bfdGsGUAAAAJ)/Song2026-MoCoAIS.bib create mode 100644 output/Spadon (bfdGsGUAAAAJ)/Spadon2023-BuildingSafer.bib create mode 100644 output/Spadon (bfdGsGUAAAAJ)/Spadon2024-GravityInformed.bib delete mode 100644 output/Trappenberg (EwkaTYEAAAAJ)/Lowe2021-LogicalActivation.bib create mode 100644 output/Trappenberg (EwkaTYEAAAAJ)/Lowe2022-LogicalActivation.bib create mode 100644 output/Wehbe (UrFw3XEAAAAJ)/Ansari2026-ParticipatoryDesign.bib create mode 100644 output/Whidden (itc4x9kAAAAJ)/F2026-AdvancingPassive.bib create mode 100644 output/Whidden (itc4x9kAAAAJ)/Whidden2020-SystematicExploration.bib create mode 100644 output/Ye (4OQaVGUAAAAJ)/Jia2026-SynergizingDigital.bib create mode 100644 output/Ye (4OQaVGUAAAAJ)/Wang2026-DOCAttackData.bib create mode 100644 output/Zincir-Heywood (F9nG0F4AAAAJ)/Baharlouei2024-ADVENTAttackAnomaly.bib create mode 100644 output/a2i2/Azad2026-SurgiDiffContext.bib create mode 100644 output/a2i2/Badawi2026-TowardsUnderstanding.bib rename output/a2i2/{Badshah2025-CLEVLLM.bib => Badshah2025-DAFELLM.bib} (69%) delete mode 100644 output/a2i2/Badshah2025-TALETool.bib create mode 100644 output/a2i2/Badshah2026-SAGESearch.bib create mode 100644 output/a2i2/Baharlouei2024-ADVENTAttackAnomaly.bib create mode 100644 output/a2i2/Dhaliwal2026-HenTwinMulti.bib create mode 100644 output/a2i2/Durrani2022-DiscoveringSalientNeurons.bib create mode 100644 output/a2i2/Essien2026-ComparativeAnalysis.bib create mode 100644 output/a2i2/Ge2024-WhatDo.bib delete mode 100644 output/a2i2/Jahan2025-TaxonomyFaults.bib create mode 100644 output/a2i2/Jia2026-SynergizingDigital.bib create mode 100644 output/a2i2/Kate2026-BeyondAccuracy.bib create mode 100644 output/a2i2/Kate2026-MultiExpert.bib create mode 100644 output/a2i2/Kaura2026-NutriPalPersuasive.bib create mode 100644 output/a2i2/Keselj2020-StarfishPrototype.bib create mode 100644 output/a2i2/Kimeu2026-CalmMindAI.bib delete mode 100644 output/a2i2/Lowe2021-LogicalActivation.bib delete mode 100644 output/a2i2/Lowe2021-LogicalActivation_2.bib create mode 100644 output/a2i2/Lowe2022-LogicalActivation.bib create mode 100644 output/a2i2/Lowe2026-BridgingGenerative.bib create mode 100644 output/a2i2/Lowe2026-HiddenLayer.bib create mode 100644 output/a2i2/Mahato2024-DairyDigiD.bib create mode 100644 output/a2i2/Mayette2026-AssessmentVessel.bib create mode 100644 output/a2i2/Neethirajan2023-DecodingDigital.bib create mode 100644 output/a2i2/Neethirajan2024-DecodingLanguage.bib create mode 100644 output/a2i2/Neethirajan2026-DigitalisationHealth.bib create mode 100644 output/a2i2/Novikova2022-SystemMethod.bib create mode 100644 output/a2i2/Oore2024-ExplicitSolutions.bib create mode 100644 output/a2i2/Oore2025-LoopyFramework.bib create mode 100644 output/a2i2/Oore2025-RobustPersonalized.bib create mode 100644 output/a2i2/Padmanabhan2026-SatelliteConstrained.bib rename output/{Neethirajan (8VZwF0sAAAAJ)/Parivendan2025-BeyondProximity.bib => a2i2/Parivendan2026-BeyondProximityKeypoint.bib} (55%) create mode 100644 output/a2i2/Parivendan2026-TemporalModeling.bib create mode 100644 output/a2i2/Patel2026-CowPainCheckTemporal.bib create mode 100644 output/a2i2/Patel2026-ProtocolGuided.bib delete mode 100644 output/a2i2/Rahman2021-SystematicLiterature.bib create mode 100644 output/a2i2/Rajput2023-FECoMStep.bib create mode 100644 output/a2i2/Rao2026-RealTime.bib create mode 100644 output/a2i2/Rizwan2026-PersistentEffects.bib create mode 100644 output/a2i2/Saad2025-HierarchicalEvaluationSoftware.bib create mode 100644 output/a2i2/Saqur2024-FilteredNot.bib delete mode 100644 output/a2i2/Saqur2025-FilteredNot.bib create mode 100644 output/a2i2/Sastry2020-ZeroShot.bib delete mode 100644 output/a2i2/Silva2026-GeneralizingGeometry.bib create mode 100644 output/a2i2/Silva2026-GeometricView.bib create mode 100644 output/a2i2/Song2026-MoCoAIS.bib create mode 100644 output/a2i2/Spadon2023-BuildingSafer.bib create mode 100644 output/a2i2/Spadon2024-GravityInformed.bib create mode 100644 output/a2i2/Wang2026-DOCAttackData.bib create mode 100644 output/a2i2/Wiafe2026-DesigningAI.bib diff --git a/data/api_cache/arxiv/2a5fbbc63b2b32d4342221c425b8f4d489dbec42d47cbefae17d6a2347410251.json b/data/api_cache/arxiv/2a5fbbc63b2b32d4342221c425b8f4d489dbec42d47cbefae17d6a2347410251.json index ef6e816f..652593cf 100644 --- a/data/api_cache/arxiv/2a5fbbc63b2b32d4342221c425b8f4d489dbec42d47cbefae17d6a2347410251.json +++ b/data/api_cache/arxiv/2a5fbbc63b2b32d4342221c425b8f4d489dbec42d47cbefae17d6a2347410251.json @@ -1 +1 @@ -{"timestamp": 1772394529.7207994, "ttl_days": 60, "data": {"entries": [{"title": "Multi-vessel Interaction-Aware Trajectory Prediction and Collision Risk Assessment", "authors": ["Md Mahbub Alam", "Jose F. Rodrigues-Jr", "Gabriel Spadon"], "year": 2025, "abs_url": "https://arxiv.org/abs/2509.01836v1", "doi": "", "primary_class": "cs.RO", "arxiv_id": "2509.01836"}, {"title": "Viscous hydrodynamics description of $\u03c6$ meson production in Au+Au and Cu+Cu collisions", "authors": ["A. K. Chaudhuri"], "year": 2009, "abs_url": "https://arxiv.org/abs/0901.4181v1", "doi": "", "primary_class": "nucl-th", "arxiv_id": "0901.4181"}, {"title": "$J/\u03c8$ production in Au+Au collisions at RHIC and the nuclear absorption", "authors": ["A. K. Chaudhuri"], "year": 2003, "abs_url": "https://arxiv.org/abs/nucl-th/0307029v3", "doi": "10.1103/physrevc.74.044907", "primary_class": "nucl-th", "arxiv_id": ""}, {"title": "Centrality dependence of high $p_T$ suppression in Au+Au collisions suggest quark matter formation", "authors": ["A. K. Chaudhuri"], "year": 2003, "abs_url": "https://arxiv.org/abs/nucl-th/0312069v3", "doi": "", "primary_class": "nucl-th", "arxiv_id": ""}, {"title": "Production of Charged Pions and Hadrons in Au+Au Collisions at sqrt(s_NN)=130GeV", "authors": ["STAR Collaboration"], "year": 2003, "abs_url": "https://arxiv.org/abs/nucl-ex/0311017v2", "doi": "", "primary_class": "nucl-ex", "arxiv_id": ""}, {"title": "Exploiting Intrinsic Triangular Geometry in Relativistic He3+Au Collisions to Disentangle Medium Properties", "authors": ["J. L. Nagle", "A. Adare", "S. Beckman", "T. Koblesky", "J. Orjuela Koop", "D. McGlinchey", "P. Romatschke", "J. Carlson", "J. Lynn", "M. McCumber"], "year": 2013, "abs_url": "https://arxiv.org/abs/1312.4565v2", "doi": "10.1103/physrevlett.113.112301", "primary_class": "nucl-th", "arxiv_id": "1312.4565"}, {"title": "Topological street-network characterization through feature-vector and cluster analysis", "authors": ["Gabriel Spadon", "Gabriel Gimenes", "Jose F. Rodrigues-Jr"], "year": 2018, "abs_url": "https://arxiv.org/abs/1806.07952v1", "doi": "10.1007/978-3-319-93698-7_21", "primary_class": "cs.SI", "arxiv_id": "1806.07952"}, {"title": "Unfolding AIS transmission behavior for vessel movement modeling on noisy data leveraging machine learning", "authors": ["Gabriel Spadon", "Martha D. Ferreira", "Amilcar Soares", "Stan Matwin"], "year": 2022, "abs_url": "https://arxiv.org/abs/2202.13867v2", "doi": "10.1109/access.2022.3197215", "primary_class": "cs.LG", "arxiv_id": "2202.13867"}, {"title": "A distance-based tool-set to track inconsistent urban structures through complex-networks", "authors": ["Gabriel Spadon", "Bruno B. Machado", "Danilo M. Eler", "Jose Fernando Rodrigues-Jr"], "year": 2018, "abs_url": "https://arxiv.org/abs/1803.09136v1", "doi": "10.1007/978-3-319-93698-7_22", "primary_class": "cs.CE", "arxiv_id": "1803.09136"}, {"title": "A Theoretical Framework for Environmental Similarity and Vessel Mobility as Coupled Predictors of Marine Invasive Species Pathways", "authors": ["Gabriel Spadon", "Vaishnav Vaidheeswaran", "Claudio DiBacco"], "year": 2025, "abs_url": "https://arxiv.org/abs/2511.03499v2", "doi": "", "primary_class": "cs.CE", "arxiv_id": "2511.03499"}]}} \ No newline at end of file +{"timestamp": 1783010171.652106, "data": {"entries": [{"title": "Multi-vessel Interaction-Aware Trajectory Prediction and Collision Risk Assessment", "authors": ["Md Mahbub Alam", "Jose F. Rodrigues-Jr", "Gabriel Spadon"], "year": 2025, "abs_url": "https://arxiv.org/abs/2509.01836v1", "doi": "", "primary_class": "cs.RO", "arxiv_id": "2509.01836"}, {"title": "Viscous hydrodynamics description of $\u03c6$ meson production in Au+Au and Cu+Cu collisions", "authors": ["A. K. Chaudhuri"], "year": 2009, "abs_url": "https://arxiv.org/abs/0901.4181v1", "doi": "", "primary_class": "nucl-th", "arxiv_id": "0901.4181"}, {"title": "$J/\u03c8$ production in Au+Au collisions at RHIC and the nuclear absorption", "authors": ["A. K. Chaudhuri"], "year": 2003, "abs_url": "https://arxiv.org/abs/nucl-th/0307029v3", "doi": "10.1103/physrevc.74.044907", "primary_class": "nucl-th", "arxiv_id": ""}, {"title": "Centrality dependence of high $p_T$ suppression in Au+Au collisions suggest quark matter formation", "authors": ["A. K. Chaudhuri"], "year": 2003, "abs_url": "https://arxiv.org/abs/nucl-th/0312069v3", "doi": "", "primary_class": "nucl-th", "arxiv_id": ""}, {"title": "Production of Charged Pions and Hadrons in Au+Au Collisions at sqrt(s_NN)=130GeV", "authors": ["STAR Collaboration"], "year": 2003, "abs_url": "https://arxiv.org/abs/nucl-ex/0311017v2", "doi": "", "primary_class": "nucl-ex", "arxiv_id": ""}, {"title": "Exploiting Intrinsic Triangular Geometry in Relativistic He3+Au Collisions to Disentangle Medium Properties", "authors": ["J. L. Nagle", "A. Adare", "S. Beckman", "T. Koblesky", "J. Orjuela Koop", "D. McGlinchey", "P. Romatschke", "J. Carlson", "J. Lynn", "M. McCumber"], "year": 2013, "abs_url": "https://arxiv.org/abs/1312.4565v2", "doi": "10.1103/physrevlett.113.112301", "primary_class": "nucl-th", "arxiv_id": "1312.4565"}, {"title": "Topological street-network characterization through feature-vector and cluster analysis", "authors": ["Gabriel Spadon", "Gabriel Gimenes", "Jose F. Rodrigues-Jr"], "year": 2018, "abs_url": "https://arxiv.org/abs/1806.07952v1", "doi": "10.1007/978-3-319-93698-7_21", "primary_class": "cs.SI", "arxiv_id": "1806.07952"}, {"title": "Unfolding AIS transmission behavior for vessel movement modeling on noisy data leveraging machine learning", "authors": ["Gabriel Spadon", "Martha D. Ferreira", "Amilcar Soares", "Stan Matwin"], "year": 2022, "abs_url": "https://arxiv.org/abs/2202.13867v2", "doi": "10.1109/access.2022.3197215", "primary_class": "cs.LG", "arxiv_id": "2202.13867"}, {"title": "A Theoretical Framework for Environmental Similarity and Vessel Mobility as Coupled Predictors of Marine Invasive Species Pathways", "authors": ["Gabriel Spadon", "Vaishnav Vaidheeswaran", "Claudio DiBacco"], "year": 2025, "abs_url": "https://arxiv.org/abs/2511.03499v2", "doi": "", "primary_class": "cs.CE", "arxiv_id": "2511.03499"}, {"title": "A distance-based tool-set to track inconsistent urban structures through complex-networks", "authors": ["Gabriel Spadon", "Bruno B. Machado", "Danilo M. Eler", "Jose Fernando Rodrigues-Jr"], "year": 2018, "abs_url": "https://arxiv.org/abs/1803.09136v1", "doi": "10.1007/978-3-319-93698-7_22", "primary_class": "cs.CE", "arxiv_id": "1803.09136"}]}} \ No newline at end of file diff --git a/data/api_cache/arxiv/2b79c6b40a6cf28f8ab2854126f0cb05f3b3aea913566d1c025e3c7843db74af.json b/data/api_cache/arxiv/2b79c6b40a6cf28f8ab2854126f0cb05f3b3aea913566d1c025e3c7843db74af.json index d37dde87..e63b8949 100644 --- a/data/api_cache/arxiv/2b79c6b40a6cf28f8ab2854126f0cb05f3b3aea913566d1c025e3c7843db74af.json +++ b/data/api_cache/arxiv/2b79c6b40a6cf28f8ab2854126f0cb05f3b3aea913566d1c025e3c7843db74af.json @@ -1 +1 @@ -{"timestamp": 1772377448.8017805, "ttl_days": 60, "data": {"entries": [{"title": "PCA in Data-Dependent Noise (Correlated-PCA): Nearly Optimal Finite Sample Guarantees", "authors": ["Namrata Vaswani", "Praneeth Narayanamurthy"], "year": 2017, "abs_url": "https://arxiv.org/abs/1702.03070v3", "doi": "", "primary_class": "cs.IT", "arxiv_id": "1702.03070"}, {"title": "Fast Convergence of Softmax Policy Mirror Ascent", "authors": ["Reza Asad", "Reza Babanezhad", "Issam Laradji", "Nicolas Le Roux", "Sharan Vaswani"], "year": 2024, "abs_url": "https://arxiv.org/abs/2411.12042v2", "doi": "", "primary_class": "cs.LG", "arxiv_id": "2411.12042"}, {"title": "Viscous hydrodynamics description of $\u03c6$ meson production in Au+Au and Cu+Cu collisions", "authors": ["A. K. Chaudhuri"], "year": 2009, "abs_url": "https://arxiv.org/abs/0901.4181v1", "doi": "", "primary_class": "nucl-th", "arxiv_id": "0901.4181"}, {"title": "$J/\u03c8$ production in Au+Au collisions at RHIC and the nuclear absorption", "authors": ["A. K. Chaudhuri"], "year": 2003, "abs_url": "https://arxiv.org/abs/nucl-th/0307029v3", "doi": "10.1103/physrevc.74.044907", "primary_class": "nucl-th", "arxiv_id": ""}, {"title": "Centrality dependence of high $p_T$ suppression in Au+Au collisions suggest quark matter formation", "authors": ["A. K. Chaudhuri"], "year": 2003, "abs_url": "https://arxiv.org/abs/nucl-th/0312069v3", "doi": "", "primary_class": "nucl-th", "arxiv_id": ""}, {"title": "Production of Charged Pions and Hadrons in Au+Au Collisions at sqrt(s_NN)=130GeV", "authors": ["STAR Collaboration"], "year": 2003, "abs_url": "https://arxiv.org/abs/nucl-ex/0311017v2", "doi": "", "primary_class": "nucl-ex", "arxiv_id": ""}, {"title": "Self-Attention with Relative Position Representations", "authors": ["Peter Shaw", "Jakob Uszkoreit", "Ashish Vaswani"], "year": 2018, "abs_url": "https://arxiv.org/abs/1803.02155v2", "doi": "", "primary_class": "cs.CL", "arxiv_id": "1803.02155"}, {"title": "Exploiting Intrinsic Triangular Geometry in Relativistic He3+Au Collisions to Disentangle Medium Properties", "authors": ["J. L. Nagle", "A. Adare", "S. Beckman", "T. Koblesky", "J. Orjuela Koop", "D. McGlinchey", "P. Romatschke", "J. Carlson", "J. Lynn", "M. McCumber"], "year": 2013, "abs_url": "https://arxiv.org/abs/1312.4565v2", "doi": "10.1103/physrevlett.113.112301", "primary_class": "nucl-th", "arxiv_id": "1312.4565"}, {"title": "Music Transformer", "authors": ["Cheng-Zhi Anna Huang", "Ashish Vaswani", "Jakob Uszkoreit", "Noam Shazeer", "Ian Simon", "Curtis Hawthorne", "Andrew M. Dai", "Matthew D. Hoffman", "Monica Dinculescu", "Douglas Eck"], "year": 2018, "abs_url": "https://arxiv.org/abs/1809.04281v3", "doi": "", "primary_class": "cs.LG", "arxiv_id": "1809.04281"}, {"title": "Observation of $Au + Au \\to Au + Au + \u03c1^0$ and $Au + Au \\to Au^* + Au^* + \u03c1^0$ with STAR", "authors": ["Spencer Klein"], "year": 2001, "abs_url": "https://arxiv.org/abs/nucl-ex/0104016v1", "doi": "10.1556/aph.15.2002.3-4.19", "primary_class": "nucl-ex", "arxiv_id": ""}]}} \ No newline at end of file +{"timestamp": 1782987745.6456559, "data": {"entries": [{"title": "PCA in Data-Dependent Noise (Correlated-PCA): Nearly Optimal Finite Sample Guarantees", "authors": ["Namrata Vaswani", "Praneeth Narayanamurthy"], "year": 2017, "abs_url": "https://arxiv.org/abs/1702.03070v3", "doi": "", "primary_class": "cs.IT", "arxiv_id": "1702.03070"}, {"title": "Fast Convergence of Softmax Policy Mirror Ascent", "authors": ["Reza Asad", "Reza Babanezhad", "Issam Laradji", "Nicolas Le Roux", "Sharan Vaswani"], "year": 2024, "abs_url": "https://arxiv.org/abs/2411.12042v2", "doi": "", "primary_class": "cs.LG", "arxiv_id": "2411.12042"}, {"title": "Viscous hydrodynamics description of $\u03c6$ meson production in Au+Au and Cu+Cu collisions", "authors": ["A. K. Chaudhuri"], "year": 2009, "abs_url": "https://arxiv.org/abs/0901.4181v1", "doi": "", "primary_class": "nucl-th", "arxiv_id": "0901.4181"}, {"title": "$J/\u03c8$ production in Au+Au collisions at RHIC and the nuclear absorption", "authors": ["A. K. Chaudhuri"], "year": 2003, "abs_url": "https://arxiv.org/abs/nucl-th/0307029v3", "doi": "10.1103/physrevc.74.044907", "primary_class": "nucl-th", "arxiv_id": ""}, {"title": "Centrality dependence of high $p_T$ suppression in Au+Au collisions suggest quark matter formation", "authors": ["A. K. Chaudhuri"], "year": 2003, "abs_url": "https://arxiv.org/abs/nucl-th/0312069v3", "doi": "", "primary_class": "nucl-th", "arxiv_id": ""}, {"title": "Production of Charged Pions and Hadrons in Au+Au Collisions at sqrt(s_NN)=130GeV", "authors": ["STAR Collaboration"], "year": 2003, "abs_url": "https://arxiv.org/abs/nucl-ex/0311017v2", "doi": "", "primary_class": "nucl-ex", "arxiv_id": ""}, {"title": "Self-Attention with Relative Position Representations", "authors": ["Peter Shaw", "Jakob Uszkoreit", "Ashish Vaswani"], "year": 2018, "abs_url": "https://arxiv.org/abs/1803.02155v2", "doi": "", "primary_class": "cs.CL", "arxiv_id": "1803.02155"}, {"title": "Exploiting Intrinsic Triangular Geometry in Relativistic He3+Au Collisions to Disentangle Medium Properties", "authors": ["J. L. Nagle", "A. Adare", "S. Beckman", "T. Koblesky", "J. Orjuela Koop", "D. McGlinchey", "P. Romatschke", "J. Carlson", "J. Lynn", "M. McCumber"], "year": 2013, "abs_url": "https://arxiv.org/abs/1312.4565v2", "doi": "10.1103/physrevlett.113.112301", "primary_class": "nucl-th", "arxiv_id": "1312.4565"}, {"title": "Music Transformer", "authors": ["Cheng-Zhi Anna Huang", "Ashish Vaswani", "Jakob Uszkoreit", "Noam Shazeer", "Ian Simon", "Curtis Hawthorne", "Andrew M. Dai", "Matthew D. Hoffman", "Monica Dinculescu", "Douglas Eck"], "year": 2018, "abs_url": "https://arxiv.org/abs/1809.04281v3", "doi": "", "primary_class": "cs.LG", "arxiv_id": "1809.04281"}, {"title": "Observation of $Au + Au \\to Au + Au + \u03c1^0$ and $Au + Au \\to Au^* + Au^* + \u03c1^0$ with STAR", "authors": ["Spencer Klein"], "year": 2001, "abs_url": "https://arxiv.org/abs/nucl-ex/0104016v1", "doi": "10.1556/aph.15.2002.3-4.19", "primary_class": "nucl-ex", "arxiv_id": ""}]}} \ No newline at end of file diff --git a/data/api_cache/arxiv/452294a7f4338aa12c21e71f3819c67c73bcb309ecb9fb6e5cf623a3beac93d6.json b/data/api_cache/arxiv/452294a7f4338aa12c21e71f3819c67c73bcb309ecb9fb6e5cf623a3beac93d6.json index cc2c8601..1685d59d 100644 --- a/data/api_cache/arxiv/452294a7f4338aa12c21e71f3819c67c73bcb309ecb9fb6e5cf623a3beac93d6.json +++ b/data/api_cache/arxiv/452294a7f4338aa12c21e71f3819c67c73bcb309ecb9fb6e5cf623a3beac93d6.json @@ -1 +1 @@ -{"timestamp": 1772394489.2298307, "ttl_days": 60, "data": {"entries": [{"title": "A Theoretical Framework for Environmental Similarity and Vessel Mobility as Coupled Predictors of Marine Invasive Species Pathways", "authors": ["Gabriel Spadon", "Vaishnav Vaidheeswaran", "Claudio DiBacco"], "year": 2025, "abs_url": "https://arxiv.org/abs/2511.03499v2", "doi": "", "primary_class": "cs.CE", "arxiv_id": "2511.03499"}, {"title": "Viscous hydrodynamics description of $\u03c6$ meson production in Au+Au and Cu+Cu collisions", "authors": ["A. K. Chaudhuri"], "year": 2009, "abs_url": "https://arxiv.org/abs/0901.4181v1", "doi": "", "primary_class": "nucl-th", "arxiv_id": "0901.4181"}, {"title": "$J/\u03c8$ production in Au+Au collisions at RHIC and the nuclear absorption", "authors": ["A. K. Chaudhuri"], "year": 2003, "abs_url": "https://arxiv.org/abs/nucl-th/0307029v3", "doi": "10.1103/physrevc.74.044907", "primary_class": "nucl-th", "arxiv_id": ""}, {"title": "Centrality dependence of high $p_T$ suppression in Au+Au collisions suggest quark matter formation", "authors": ["A. K. Chaudhuri"], "year": 2003, "abs_url": "https://arxiv.org/abs/nucl-th/0312069v3", "doi": "", "primary_class": "nucl-th", "arxiv_id": ""}, {"title": "Production of Charged Pions and Hadrons in Au+Au Collisions at sqrt(s_NN)=130GeV", "authors": ["STAR Collaboration"], "year": 2003, "abs_url": "https://arxiv.org/abs/nucl-ex/0311017v2", "doi": "", "primary_class": "nucl-ex", "arxiv_id": ""}, {"title": "Exploiting Intrinsic Triangular Geometry in Relativistic He3+Au Collisions to Disentangle Medium Properties", "authors": ["J. L. Nagle", "A. Adare", "S. Beckman", "T. Koblesky", "J. Orjuela Koop", "D. McGlinchey", "P. Romatschke", "J. Carlson", "J. Lynn", "M. McCumber"], "year": 2013, "abs_url": "https://arxiv.org/abs/1312.4565v2", "doi": "10.1103/physrevlett.113.112301", "primary_class": "nucl-th", "arxiv_id": "1312.4565"}, {"title": "Topological street-network characterization through feature-vector and cluster analysis", "authors": ["Gabriel Spadon", "Gabriel Gimenes", "Jose F. Rodrigues-Jr"], "year": 2018, "abs_url": "https://arxiv.org/abs/1806.07952v1", "doi": "10.1007/978-3-319-93698-7_21", "primary_class": "cs.SI", "arxiv_id": "1806.07952"}, {"title": "Unfolding AIS transmission behavior for vessel movement modeling on noisy data leveraging machine learning", "authors": ["Gabriel Spadon", "Martha D. Ferreira", "Amilcar Soares", "Stan Matwin"], "year": 2022, "abs_url": "https://arxiv.org/abs/2202.13867v2", "doi": "10.1109/access.2022.3197215", "primary_class": "cs.LG", "arxiv_id": "2202.13867"}, {"title": "A distance-based tool-set to track inconsistent urban structures through complex-networks", "authors": ["Gabriel Spadon", "Bruno B. Machado", "Danilo M. Eler", "Jose Fernando Rodrigues-Jr"], "year": 2018, "abs_url": "https://arxiv.org/abs/1803.09136v1", "doi": "10.1007/978-3-319-93698-7_22", "primary_class": "cs.CE", "arxiv_id": "1803.09136"}, {"title": "Maritime Tracking Data Analysis and Integration with AISdb", "authors": ["Gabriel Spadon", "Jay Kumar", "Jinkun Chen", "Matthew Smith", "Casey Hilliard", "Sarah Vela", "Romina Gehrmann", "Claudio DiBacco", "Stan Matwin", "Ronald Pelot"], "year": 2024, "abs_url": "https://arxiv.org/abs/2407.08082v1", "doi": "", "primary_class": "cs.DB", "arxiv_id": "2407.08082"}]}} \ No newline at end of file +{"timestamp": 1783010119.7677946, "data": {"entries": [{"title": "A Theoretical Framework for Environmental Similarity and Vessel Mobility as Coupled Predictors of Marine Invasive Species Pathways", "authors": ["Gabriel Spadon", "Vaishnav Vaidheeswaran", "Claudio DiBacco"], "year": 2025, "abs_url": "https://arxiv.org/abs/2511.03499v2", "doi": "", "primary_class": "cs.CE", "arxiv_id": "2511.03499"}, {"title": "Viscous hydrodynamics description of $\u03c6$ meson production in Au+Au and Cu+Cu collisions", "authors": ["A. K. Chaudhuri"], "year": 2009, "abs_url": "https://arxiv.org/abs/0901.4181v1", "doi": "", "primary_class": "nucl-th", "arxiv_id": "0901.4181"}, {"title": "$J/\u03c8$ production in Au+Au collisions at RHIC and the nuclear absorption", "authors": ["A. K. Chaudhuri"], "year": 2003, "abs_url": "https://arxiv.org/abs/nucl-th/0307029v3", "doi": "10.1103/physrevc.74.044907", "primary_class": "nucl-th", "arxiv_id": ""}, {"title": "Centrality dependence of high $p_T$ suppression in Au+Au collisions suggest quark matter formation", "authors": ["A. K. Chaudhuri"], "year": 2003, "abs_url": "https://arxiv.org/abs/nucl-th/0312069v3", "doi": "", "primary_class": "nucl-th", "arxiv_id": ""}, {"title": "Production of Charged Pions and Hadrons in Au+Au Collisions at sqrt(s_NN)=130GeV", "authors": ["STAR Collaboration"], "year": 2003, "abs_url": "https://arxiv.org/abs/nucl-ex/0311017v2", "doi": "", "primary_class": "nucl-ex", "arxiv_id": ""}, {"title": "Exploiting Intrinsic Triangular Geometry in Relativistic He3+Au Collisions to Disentangle Medium Properties", "authors": ["J. L. Nagle", "A. Adare", "S. Beckman", "T. Koblesky", "J. Orjuela Koop", "D. McGlinchey", "P. Romatschke", "J. Carlson", "J. Lynn", "M. McCumber"], "year": 2013, "abs_url": "https://arxiv.org/abs/1312.4565v2", "doi": "10.1103/physrevlett.113.112301", "primary_class": "nucl-th", "arxiv_id": "1312.4565"}, {"title": "Topological street-network characterization through feature-vector and cluster analysis", "authors": ["Gabriel Spadon", "Gabriel Gimenes", "Jose F. Rodrigues-Jr"], "year": 2018, "abs_url": "https://arxiv.org/abs/1806.07952v1", "doi": "10.1007/978-3-319-93698-7_21", "primary_class": "cs.SI", "arxiv_id": "1806.07952"}, {"title": "Unfolding AIS transmission behavior for vessel movement modeling on noisy data leveraging machine learning", "authors": ["Gabriel Spadon", "Martha D. Ferreira", "Amilcar Soares", "Stan Matwin"], "year": 2022, "abs_url": "https://arxiv.org/abs/2202.13867v2", "doi": "10.1109/access.2022.3197215", "primary_class": "cs.LG", "arxiv_id": "2202.13867"}, {"title": "A distance-based tool-set to track inconsistent urban structures through complex-networks", "authors": ["Gabriel Spadon", "Bruno B. Machado", "Danilo M. Eler", "Jose Fernando Rodrigues-Jr"], "year": 2018, "abs_url": "https://arxiv.org/abs/1803.09136v1", "doi": "10.1007/978-3-319-93698-7_22", "primary_class": "cs.CE", "arxiv_id": "1803.09136"}, {"title": "Maritime Tracking Data Analysis and Integration with AISdb", "authors": ["Gabriel Spadon", "Jay Kumar", "Jinkun Chen", "Matthew Smith", "Casey Hilliard", "Sarah Vela", "Romina Gehrmann", "Claudio DiBacco", "Stan Matwin", "Ronald Pelot"], "year": 2024, "abs_url": "https://arxiv.org/abs/2407.08082v1", "doi": "", "primary_class": "cs.DB", "arxiv_id": "2407.08082"}]}} \ No newline at end of file diff --git a/data/api_cache/arxiv/6586cfe6c86b5682fa796000ac321cede9d3e052f775c45a1d416e2453a773ef.json b/data/api_cache/arxiv/6586cfe6c86b5682fa796000ac321cede9d3e052f775c45a1d416e2453a773ef.json index 88b8e678..6907d8e8 100644 --- a/data/api_cache/arxiv/6586cfe6c86b5682fa796000ac321cede9d3e052f775c45a1d416e2453a773ef.json +++ b/data/api_cache/arxiv/6586cfe6c86b5682fa796000ac321cede9d3e052f775c45a1d416e2453a773ef.json @@ -1 +1 @@ -{"timestamp": 1772394660.4713435, "ttl_days": 60, "data": {"entries": [{"title": "Viscous hydrodynamics description of $\u03c6$ meson production in Au+Au and Cu+Cu collisions", "authors": ["A. K. Chaudhuri"], "year": 2009, "abs_url": "https://arxiv.org/abs/0901.4181v1", "doi": "", "primary_class": "nucl-th", "arxiv_id": "0901.4181"}, {"title": "$J/\u03c8$ production in Au+Au collisions at RHIC and the nuclear absorption", "authors": ["A. K. Chaudhuri"], "year": 2003, "abs_url": "https://arxiv.org/abs/nucl-th/0307029v3", "doi": "10.1103/physrevc.74.044907", "primary_class": "nucl-th", "arxiv_id": ""}, {"title": "Centrality dependence of high $p_T$ suppression in Au+Au collisions suggest quark matter formation", "authors": ["A. K. Chaudhuri"], "year": 2003, "abs_url": "https://arxiv.org/abs/nucl-th/0312069v3", "doi": "", "primary_class": "nucl-th", "arxiv_id": ""}, {"title": "Production of Charged Pions and Hadrons in Au+Au Collisions at sqrt(s_NN)=130GeV", "authors": ["STAR Collaboration"], "year": 2003, "abs_url": "https://arxiv.org/abs/nucl-ex/0311017v2", "doi": "", "primary_class": "nucl-ex", "arxiv_id": ""}, {"title": "Exploiting Intrinsic Triangular Geometry in Relativistic He3+Au Collisions to Disentangle Medium Properties", "authors": ["J. L. Nagle", "A. Adare", "S. Beckman", "T. Koblesky", "J. Orjuela Koop", "D. McGlinchey", "P. Romatschke", "J. Carlson", "J. Lynn", "M. McCumber"], "year": 2013, "abs_url": "https://arxiv.org/abs/1312.4565v2", "doi": "10.1103/physrevlett.113.112301", "primary_class": "nucl-th", "arxiv_id": "1312.4565"}, {"title": "Topological street-network characterization through feature-vector and cluster analysis", "authors": ["Gabriel Spadon", "Gabriel Gimenes", "Jose F. Rodrigues-Jr"], "year": 2018, "abs_url": "https://arxiv.org/abs/1806.07952v1", "doi": "10.1007/978-3-319-93698-7_21", "primary_class": "cs.SI", "arxiv_id": "1806.07952"}, {"title": "Unfolding AIS transmission behavior for vessel movement modeling on noisy data leveraging machine learning", "authors": ["Gabriel Spadon", "Martha D. Ferreira", "Amilcar Soares", "Stan Matwin"], "year": 2022, "abs_url": "https://arxiv.org/abs/2202.13867v2", "doi": "10.1109/access.2022.3197215", "primary_class": "cs.LG", "arxiv_id": "2202.13867"}, {"title": "A distance-based tool-set to track inconsistent urban structures through complex-networks", "authors": ["Gabriel Spadon", "Bruno B. Machado", "Danilo M. Eler", "Jose Fernando Rodrigues-Jr"], "year": 2018, "abs_url": "https://arxiv.org/abs/1803.09136v1", "doi": "10.1007/978-3-319-93698-7_22", "primary_class": "cs.CE", "arxiv_id": "1803.09136"}, {"title": "A Theoretical Framework for Environmental Similarity and Vessel Mobility as Coupled Predictors of Marine Invasive Species Pathways", "authors": ["Gabriel Spadon", "Vaishnav Vaidheeswaran", "Claudio DiBacco"], "year": 2025, "abs_url": "https://arxiv.org/abs/2511.03499v2", "doi": "", "primary_class": "cs.CE", "arxiv_id": "2511.03499"}, {"title": "Maritime Tracking Data Analysis and Integration with AISdb", "authors": ["Gabriel Spadon", "Jay Kumar", "Jinkun Chen", "Matthew Smith", "Casey Hilliard", "Sarah Vela", "Romina Gehrmann", "Claudio DiBacco", "Stan Matwin", "Ronald Pelot"], "year": 2024, "abs_url": "https://arxiv.org/abs/2407.08082v1", "doi": "", "primary_class": "cs.DB", "arxiv_id": "2407.08082"}]}} \ No newline at end of file +{"timestamp": 1783010266.4969277, "data": {"entries": [{"title": "Viscous hydrodynamics description of $\u03c6$ meson production in Au+Au and Cu+Cu collisions", "authors": ["A. K. Chaudhuri"], "year": 2009, "abs_url": "https://arxiv.org/abs/0901.4181v1", "doi": "", "primary_class": "nucl-th", "arxiv_id": "0901.4181"}, {"title": "$J/\u03c8$ production in Au+Au collisions at RHIC and the nuclear absorption", "authors": ["A. K. Chaudhuri"], "year": 2003, "abs_url": "https://arxiv.org/abs/nucl-th/0307029v3", "doi": "10.1103/physrevc.74.044907", "primary_class": "nucl-th", "arxiv_id": ""}, {"title": "Centrality dependence of high $p_T$ suppression in Au+Au collisions suggest quark matter formation", "authors": ["A. K. Chaudhuri"], "year": 2003, "abs_url": "https://arxiv.org/abs/nucl-th/0312069v3", "doi": "", "primary_class": "nucl-th", "arxiv_id": ""}, {"title": "Production of Charged Pions and Hadrons in Au+Au Collisions at sqrt(s_NN)=130GeV", "authors": ["STAR Collaboration"], "year": 2003, "abs_url": "https://arxiv.org/abs/nucl-ex/0311017v2", "doi": "", "primary_class": "nucl-ex", "arxiv_id": ""}, {"title": "Exploiting Intrinsic Triangular Geometry in Relativistic He3+Au Collisions to Disentangle Medium Properties", "authors": ["J. L. Nagle", "A. Adare", "S. Beckman", "T. Koblesky", "J. Orjuela Koop", "D. McGlinchey", "P. Romatschke", "J. Carlson", "J. Lynn", "M. McCumber"], "year": 2013, "abs_url": "https://arxiv.org/abs/1312.4565v2", "doi": "10.1103/physrevlett.113.112301", "primary_class": "nucl-th", "arxiv_id": "1312.4565"}, {"title": "Topological street-network characterization through feature-vector and cluster analysis", "authors": ["Gabriel Spadon", "Gabriel Gimenes", "Jose F. Rodrigues-Jr"], "year": 2018, "abs_url": "https://arxiv.org/abs/1806.07952v1", "doi": "10.1007/978-3-319-93698-7_21", "primary_class": "cs.SI", "arxiv_id": "1806.07952"}, {"title": "Unfolding AIS transmission behavior for vessel movement modeling on noisy data leveraging machine learning", "authors": ["Gabriel Spadon", "Martha D. Ferreira", "Amilcar Soares", "Stan Matwin"], "year": 2022, "abs_url": "https://arxiv.org/abs/2202.13867v2", "doi": "10.1109/access.2022.3197215", "primary_class": "cs.LG", "arxiv_id": "2202.13867"}, {"title": "A Theoretical Framework for Environmental Similarity and Vessel Mobility as Coupled Predictors of Marine Invasive Species Pathways", "authors": ["Gabriel Spadon", "Vaishnav Vaidheeswaran", "Claudio DiBacco"], "year": 2025, "abs_url": "https://arxiv.org/abs/2511.03499v2", "doi": "", "primary_class": "cs.CE", "arxiv_id": "2511.03499"}, {"title": "A distance-based tool-set to track inconsistent urban structures through complex-networks", "authors": ["Gabriel Spadon", "Bruno B. Machado", "Danilo M. Eler", "Jose Fernando Rodrigues-Jr"], "year": 2018, "abs_url": "https://arxiv.org/abs/1803.09136v1", "doi": "10.1007/978-3-319-93698-7_22", "primary_class": "cs.CE", "arxiv_id": "1803.09136"}, {"title": "Maritime Tracking Data Analysis and Integration with AISdb", "authors": ["Gabriel Spadon", "Jay Kumar", "Jinkun Chen", "Matthew Smith", "Casey Hilliard", "Sarah Vela", "Romina Gehrmann", "Claudio DiBacco", "Stan Matwin", "Ronald Pelot"], "year": 2024, "abs_url": "https://arxiv.org/abs/2407.08082v1", "doi": "", "primary_class": "cs.DB", "arxiv_id": "2407.08082"}]}} \ No newline at end of file diff --git a/data/api_cache/arxiv/8a42fedcd3e7c3794d791f6e17beea7410b595ae3ee1c51e962c5089d8e96962.json b/data/api_cache/arxiv/8a42fedcd3e7c3794d791f6e17beea7410b595ae3ee1c51e962c5089d8e96962.json index 81c6e750..f09ff25d 100644 --- a/data/api_cache/arxiv/8a42fedcd3e7c3794d791f6e17beea7410b595ae3ee1c51e962c5089d8e96962.json +++ b/data/api_cache/arxiv/8a42fedcd3e7c3794d791f6e17beea7410b595ae3ee1c51e962c5089d8e96962.json @@ -1 +1 @@ -{"timestamp": 1772394682.150067, "ttl_days": 60, "data": {"entries": [{"title": "Viscous hydrodynamics description of $\u03c6$ meson production in Au+Au and Cu+Cu collisions", "authors": ["A. K. Chaudhuri"], "year": 2009, "abs_url": "https://arxiv.org/abs/0901.4181v1", "doi": "", "primary_class": "nucl-th", "arxiv_id": "0901.4181"}, {"title": "$J/\u03c8$ production in Au+Au collisions at RHIC and the nuclear absorption", "authors": ["A. K. Chaudhuri"], "year": 2003, "abs_url": "https://arxiv.org/abs/nucl-th/0307029v3", "doi": "10.1103/physrevc.74.044907", "primary_class": "nucl-th", "arxiv_id": ""}, {"title": "Centrality dependence of high $p_T$ suppression in Au+Au collisions suggest quark matter formation", "authors": ["A. K. Chaudhuri"], "year": 2003, "abs_url": "https://arxiv.org/abs/nucl-th/0312069v3", "doi": "", "primary_class": "nucl-th", "arxiv_id": ""}, {"title": "Production of Charged Pions and Hadrons in Au+Au Collisions at sqrt(s_NN)=130GeV", "authors": ["STAR Collaboration"], "year": 2003, "abs_url": "https://arxiv.org/abs/nucl-ex/0311017v2", "doi": "", "primary_class": "nucl-ex", "arxiv_id": ""}, {"title": "Exploiting Intrinsic Triangular Geometry in Relativistic He3+Au Collisions to Disentangle Medium Properties", "authors": ["J. L. Nagle", "A. Adare", "S. Beckman", "T. Koblesky", "J. Orjuela Koop", "D. McGlinchey", "P. Romatschke", "J. Carlson", "J. Lynn", "M. McCumber"], "year": 2013, "abs_url": "https://arxiv.org/abs/1312.4565v2", "doi": "10.1103/physrevlett.113.112301", "primary_class": "nucl-th", "arxiv_id": "1312.4565"}, {"title": "Topological street-network characterization through feature-vector and cluster analysis", "authors": ["Gabriel Spadon", "Gabriel Gimenes", "Jose F. Rodrigues-Jr"], "year": 2018, "abs_url": "https://arxiv.org/abs/1806.07952v1", "doi": "10.1007/978-3-319-93698-7_21", "primary_class": "cs.SI", "arxiv_id": "1806.07952"}, {"title": "Unfolding AIS transmission behavior for vessel movement modeling on noisy data leveraging machine learning", "authors": ["Gabriel Spadon", "Martha D. Ferreira", "Amilcar Soares", "Stan Matwin"], "year": 2022, "abs_url": "https://arxiv.org/abs/2202.13867v2", "doi": "10.1109/access.2022.3197215", "primary_class": "cs.LG", "arxiv_id": "2202.13867"}, {"title": "A distance-based tool-set to track inconsistent urban structures through complex-networks", "authors": ["Gabriel Spadon", "Bruno B. Machado", "Danilo M. Eler", "Jose Fernando Rodrigues-Jr"], "year": 2018, "abs_url": "https://arxiv.org/abs/1803.09136v1", "doi": "10.1007/978-3-319-93698-7_22", "primary_class": "cs.CE", "arxiv_id": "1803.09136"}, {"title": "A Theoretical Framework for Environmental Similarity and Vessel Mobility as Coupled Predictors of Marine Invasive Species Pathways", "authors": ["Gabriel Spadon", "Vaishnav Vaidheeswaran", "Claudio DiBacco"], "year": 2025, "abs_url": "https://arxiv.org/abs/2511.03499v2", "doi": "", "primary_class": "cs.CE", "arxiv_id": "2511.03499"}, {"title": "Maritime Tracking Data Analysis and Integration with AISdb", "authors": ["Gabriel Spadon", "Jay Kumar", "Jinkun Chen", "Matthew Smith", "Casey Hilliard", "Sarah Vela", "Romina Gehrmann", "Claudio DiBacco", "Stan Matwin", "Ronald Pelot"], "year": 2024, "abs_url": "https://arxiv.org/abs/2407.08082v1", "doi": "", "primary_class": "cs.DB", "arxiv_id": "2407.08082"}]}} \ No newline at end of file +{"timestamp": 1783010377.930245, "data": {"entries": [{"title": "Viscous hydrodynamics description of $\u03c6$ meson production in Au+Au and Cu+Cu collisions", "authors": ["A. K. Chaudhuri"], "year": 2009, "abs_url": "https://arxiv.org/abs/0901.4181v1", "doi": "", "primary_class": "nucl-th", "arxiv_id": "0901.4181"}, {"title": "$J/\u03c8$ production in Au+Au collisions at RHIC and the nuclear absorption", "authors": ["A. K. Chaudhuri"], "year": 2003, "abs_url": "https://arxiv.org/abs/nucl-th/0307029v3", "doi": "10.1103/physrevc.74.044907", "primary_class": "nucl-th", "arxiv_id": ""}, {"title": "Centrality dependence of high $p_T$ suppression in Au+Au collisions suggest quark matter formation", "authors": ["A. K. Chaudhuri"], "year": 2003, "abs_url": "https://arxiv.org/abs/nucl-th/0312069v3", "doi": "", "primary_class": "nucl-th", "arxiv_id": ""}, {"title": "Production of Charged Pions and Hadrons in Au+Au Collisions at sqrt(s_NN)=130GeV", "authors": ["STAR Collaboration"], "year": 2003, "abs_url": "https://arxiv.org/abs/nucl-ex/0311017v2", "doi": "", "primary_class": "nucl-ex", "arxiv_id": ""}, {"title": "Exploiting Intrinsic Triangular Geometry in Relativistic He3+Au Collisions to Disentangle Medium Properties", "authors": ["J. L. Nagle", "A. Adare", "S. Beckman", "T. Koblesky", "J. Orjuela Koop", "D. McGlinchey", "P. Romatschke", "J. Carlson", "J. Lynn", "M. McCumber"], "year": 2013, "abs_url": "https://arxiv.org/abs/1312.4565v2", "doi": "10.1103/physrevlett.113.112301", "primary_class": "nucl-th", "arxiv_id": "1312.4565"}, {"title": "Topological street-network characterization through feature-vector and cluster analysis", "authors": ["Gabriel Spadon", "Gabriel Gimenes", "Jose F. Rodrigues-Jr"], "year": 2018, "abs_url": "https://arxiv.org/abs/1806.07952v1", "doi": "10.1007/978-3-319-93698-7_21", "primary_class": "cs.SI", "arxiv_id": "1806.07952"}, {"title": "Unfolding AIS transmission behavior for vessel movement modeling on noisy data leveraging machine learning", "authors": ["Gabriel Spadon", "Martha D. Ferreira", "Amilcar Soares", "Stan Matwin"], "year": 2022, "abs_url": "https://arxiv.org/abs/2202.13867v2", "doi": "10.1109/access.2022.3197215", "primary_class": "cs.LG", "arxiv_id": "2202.13867"}, {"title": "A Theoretical Framework for Environmental Similarity and Vessel Mobility as Coupled Predictors of Marine Invasive Species Pathways", "authors": ["Gabriel Spadon", "Vaishnav Vaidheeswaran", "Claudio DiBacco"], "year": 2025, "abs_url": "https://arxiv.org/abs/2511.03499v2", "doi": "", "primary_class": "cs.CE", "arxiv_id": "2511.03499"}, {"title": "A distance-based tool-set to track inconsistent urban structures through complex-networks", "authors": ["Gabriel Spadon", "Bruno B. Machado", "Danilo M. Eler", "Jose Fernando Rodrigues-Jr"], "year": 2018, "abs_url": "https://arxiv.org/abs/1803.09136v1", "doi": "10.1007/978-3-319-93698-7_22", "primary_class": "cs.CE", "arxiv_id": "1803.09136"}, {"title": "Goal-Conditioned Reinforcement Learning for Data-Driven Maritime Navigation", "authors": ["Vaishnav Vaidheeswaran", "Dilith Jayakody", "Samruddhi Mulay", "Anand Lo", "Md Mahbub Alam", "Gabriel Spadon"], "year": 2025, "abs_url": "https://arxiv.org/abs/2509.01838v1", "doi": "", "primary_class": "cs.LG", "arxiv_id": "2509.01838"}]}} \ No newline at end of file diff --git a/data/api_cache/arxiv/96e4a0af3373631b6c0137abd600f6e00f825f0a42713adda205ad1e4fdeee48.json b/data/api_cache/arxiv/96e4a0af3373631b6c0137abd600f6e00f825f0a42713adda205ad1e4fdeee48.json index 0f1320cf..a13926d0 100644 --- a/data/api_cache/arxiv/96e4a0af3373631b6c0137abd600f6e00f825f0a42713adda205ad1e4fdeee48.json +++ b/data/api_cache/arxiv/96e4a0af3373631b6c0137abd600f6e00f825f0a42713adda205ad1e4fdeee48.json @@ -1 +1 @@ -{"timestamp": 1772396531.968419, "ttl_days": 60, "data": {"entries": [{"title": "From Cities to Series: Complex Networks and Deep Learning for Improved Spatial and Temporal Analytics*", "authors": ["Gabriel Spadon", "Jose F. Rodrigues-Jr"], "year": 2022, "abs_url": "https://arxiv.org/abs/2206.01176v1", "doi": "", "primary_class": "cs.LG", "arxiv_id": "2206.01176"}, {"title": "Viscous hydrodynamics description of $\u03c6$ meson production in Au+Au and Cu+Cu collisions", "authors": ["A. K. Chaudhuri"], "year": 2009, "abs_url": "https://arxiv.org/abs/0901.4181v1", "doi": "", "primary_class": "nucl-th", "arxiv_id": "0901.4181"}, {"title": "$J/\u03c8$ production in Au+Au collisions at RHIC and the nuclear absorption", "authors": ["A. K. Chaudhuri"], "year": 2003, "abs_url": "https://arxiv.org/abs/nucl-th/0307029v3", "doi": "10.1103/physrevc.74.044907", "primary_class": "nucl-th", "arxiv_id": ""}, {"title": "Centrality dependence of high $p_T$ suppression in Au+Au collisions suggest quark matter formation", "authors": ["A. K. Chaudhuri"], "year": 2003, "abs_url": "https://arxiv.org/abs/nucl-th/0312069v3", "doi": "", "primary_class": "nucl-th", "arxiv_id": ""}, {"title": "Production of Charged Pions and Hadrons in Au+Au Collisions at sqrt(s_NN)=130GeV", "authors": ["STAR Collaboration"], "year": 2003, "abs_url": "https://arxiv.org/abs/nucl-ex/0311017v2", "doi": "", "primary_class": "nucl-ex", "arxiv_id": ""}, {"title": "Exploiting Intrinsic Triangular Geometry in Relativistic He3+Au Collisions to Disentangle Medium Properties", "authors": ["J. L. Nagle", "A. Adare", "S. Beckman", "T. Koblesky", "J. Orjuela Koop", "D. McGlinchey", "P. Romatschke", "J. Carlson", "J. Lynn", "M. McCumber"], "year": 2013, "abs_url": "https://arxiv.org/abs/1312.4565v2", "doi": "10.1103/physrevlett.113.112301", "primary_class": "nucl-th", "arxiv_id": "1312.4565"}, {"title": "Topological street-network characterization through feature-vector and cluster analysis", "authors": ["Gabriel Spadon", "Gabriel Gimenes", "Jose F. Rodrigues-Jr"], "year": 2018, "abs_url": "https://arxiv.org/abs/1806.07952v1", "doi": "10.1007/978-3-319-93698-7_21", "primary_class": "cs.SI", "arxiv_id": "1806.07952"}, {"title": "Unfolding AIS transmission behavior for vessel movement modeling on noisy data leveraging machine learning", "authors": ["Gabriel Spadon", "Martha D. Ferreira", "Amilcar Soares", "Stan Matwin"], "year": 2022, "abs_url": "https://arxiv.org/abs/2202.13867v2", "doi": "10.1109/access.2022.3197215", "primary_class": "cs.LG", "arxiv_id": "2202.13867"}, {"title": "A distance-based tool-set to track inconsistent urban structures through complex-networks", "authors": ["Gabriel Spadon", "Bruno B. Machado", "Danilo M. Eler", "Jose Fernando Rodrigues-Jr"], "year": 2018, "abs_url": "https://arxiv.org/abs/1803.09136v1", "doi": "10.1007/978-3-319-93698-7_22", "primary_class": "cs.CE", "arxiv_id": "1803.09136"}, {"title": "A Theoretical Framework for Environmental Similarity and Vessel Mobility as Coupled Predictors of Marine Invasive Species Pathways", "authors": ["Gabriel Spadon", "Vaishnav Vaidheeswaran", "Claudio DiBacco"], "year": 2025, "abs_url": "https://arxiv.org/abs/2511.03499v2", "doi": "", "primary_class": "cs.CE", "arxiv_id": "2511.03499"}]}} \ No newline at end of file +{"timestamp": 1783010323.9703295, "data": {"entries": [{"title": "From Cities to Series: Complex Networks and Deep Learning for Improved Spatial and Temporal Analytics*", "authors": ["Gabriel Spadon", "Jose F. Rodrigues-Jr"], "year": 2022, "abs_url": "https://arxiv.org/abs/2206.01176v1", "doi": "", "primary_class": "cs.LG", "arxiv_id": "2206.01176"}, {"title": "Viscous hydrodynamics description of $\u03c6$ meson production in Au+Au and Cu+Cu collisions", "authors": ["A. K. Chaudhuri"], "year": 2009, "abs_url": "https://arxiv.org/abs/0901.4181v1", "doi": "", "primary_class": "nucl-th", "arxiv_id": "0901.4181"}, {"title": "$J/\u03c8$ production in Au+Au collisions at RHIC and the nuclear absorption", "authors": ["A. K. Chaudhuri"], "year": 2003, "abs_url": "https://arxiv.org/abs/nucl-th/0307029v3", "doi": "10.1103/physrevc.74.044907", "primary_class": "nucl-th", "arxiv_id": ""}, {"title": "Centrality dependence of high $p_T$ suppression in Au+Au collisions suggest quark matter formation", "authors": ["A. K. Chaudhuri"], "year": 2003, "abs_url": "https://arxiv.org/abs/nucl-th/0312069v3", "doi": "", "primary_class": "nucl-th", "arxiv_id": ""}, {"title": "Production of Charged Pions and Hadrons in Au+Au Collisions at sqrt(s_NN)=130GeV", "authors": ["STAR Collaboration"], "year": 2003, "abs_url": "https://arxiv.org/abs/nucl-ex/0311017v2", "doi": "", "primary_class": "nucl-ex", "arxiv_id": ""}, {"title": "Exploiting Intrinsic Triangular Geometry in Relativistic He3+Au Collisions to Disentangle Medium Properties", "authors": ["J. L. Nagle", "A. Adare", "S. Beckman", "T. Koblesky", "J. Orjuela Koop", "D. McGlinchey", "P. Romatschke", "J. Carlson", "J. Lynn", "M. McCumber"], "year": 2013, "abs_url": "https://arxiv.org/abs/1312.4565v2", "doi": "10.1103/physrevlett.113.112301", "primary_class": "nucl-th", "arxiv_id": "1312.4565"}, {"title": "Topological street-network characterization through feature-vector and cluster analysis", "authors": ["Gabriel Spadon", "Gabriel Gimenes", "Jose F. Rodrigues-Jr"], "year": 2018, "abs_url": "https://arxiv.org/abs/1806.07952v1", "doi": "10.1007/978-3-319-93698-7_21", "primary_class": "cs.SI", "arxiv_id": "1806.07952"}, {"title": "Unfolding AIS transmission behavior for vessel movement modeling on noisy data leveraging machine learning", "authors": ["Gabriel Spadon", "Martha D. Ferreira", "Amilcar Soares", "Stan Matwin"], "year": 2022, "abs_url": "https://arxiv.org/abs/2202.13867v2", "doi": "10.1109/access.2022.3197215", "primary_class": "cs.LG", "arxiv_id": "2202.13867"}, {"title": "A Theoretical Framework for Environmental Similarity and Vessel Mobility as Coupled Predictors of Marine Invasive Species Pathways", "authors": ["Gabriel Spadon", "Vaishnav Vaidheeswaran", "Claudio DiBacco"], "year": 2025, "abs_url": "https://arxiv.org/abs/2511.03499v2", "doi": "", "primary_class": "cs.CE", "arxiv_id": "2511.03499"}, {"title": "A distance-based tool-set to track inconsistent urban structures through complex-networks", "authors": ["Gabriel Spadon", "Bruno B. Machado", "Danilo M. Eler", "Jose Fernando Rodrigues-Jr"], "year": 2018, "abs_url": "https://arxiv.org/abs/1803.09136v1", "doi": "10.1007/978-3-319-93698-7_22", "primary_class": "cs.CE", "arxiv_id": "1803.09136"}]}} \ No newline at end of file diff --git a/data/api_cache/arxiv/f047139b677a9563aab896b9b389f1f1798f3b52a6ff4d1006f0df0477b8bcc4.json b/data/api_cache/arxiv/f047139b677a9563aab896b9b389f1f1798f3b52a6ff4d1006f0df0477b8bcc4.json index c6b69216..39c74679 100644 --- a/data/api_cache/arxiv/f047139b677a9563aab896b9b389f1f1798f3b52a6ff4d1006f0df0477b8bcc4.json +++ b/data/api_cache/arxiv/f047139b677a9563aab896b9b389f1f1798f3b52a6ff4d1006f0df0477b8bcc4.json @@ -1 +1 @@ -{"timestamp": 1772394567.520419, "ttl_days": 60, "data": {"entries": [{"title": "Viscous hydrodynamics description of $\u03c6$ meson production in Au+Au and Cu+Cu collisions", "authors": ["A. K. Chaudhuri"], "year": 2009, "abs_url": "https://arxiv.org/abs/0901.4181v1", "doi": "", "primary_class": "nucl-th", "arxiv_id": "0901.4181"}, {"title": "$J/\u03c8$ production in Au+Au collisions at RHIC and the nuclear absorption", "authors": ["A. K. Chaudhuri"], "year": 2003, "abs_url": "https://arxiv.org/abs/nucl-th/0307029v3", "doi": "10.1103/physrevc.74.044907", "primary_class": "nucl-th", "arxiv_id": ""}, {"title": "Centrality dependence of high $p_T$ suppression in Au+Au collisions suggest quark matter formation", "authors": ["A. K. Chaudhuri"], "year": 2003, "abs_url": "https://arxiv.org/abs/nucl-th/0312069v3", "doi": "", "primary_class": "nucl-th", "arxiv_id": ""}, {"title": "Production of Charged Pions and Hadrons in Au+Au Collisions at sqrt(s_NN)=130GeV", "authors": ["STAR Collaboration"], "year": 2003, "abs_url": "https://arxiv.org/abs/nucl-ex/0311017v2", "doi": "", "primary_class": "nucl-ex", "arxiv_id": ""}, {"title": "Exploiting Intrinsic Triangular Geometry in Relativistic He3+Au Collisions to Disentangle Medium Properties", "authors": ["J. L. Nagle", "A. Adare", "S. Beckman", "T. Koblesky", "J. Orjuela Koop", "D. McGlinchey", "P. Romatschke", "J. Carlson", "J. Lynn", "M. McCumber"], "year": 2013, "abs_url": "https://arxiv.org/abs/1312.4565v2", "doi": "10.1103/physrevlett.113.112301", "primary_class": "nucl-th", "arxiv_id": "1312.4565"}, {"title": "Topological street-network characterization through feature-vector and cluster analysis", "authors": ["Gabriel Spadon", "Gabriel Gimenes", "Jose F. Rodrigues-Jr"], "year": 2018, "abs_url": "https://arxiv.org/abs/1806.07952v1", "doi": "10.1007/978-3-319-93698-7_21", "primary_class": "cs.SI", "arxiv_id": "1806.07952"}, {"title": "Unfolding AIS transmission behavior for vessel movement modeling on noisy data leveraging machine learning", "authors": ["Gabriel Spadon", "Martha D. Ferreira", "Amilcar Soares", "Stan Matwin"], "year": 2022, "abs_url": "https://arxiv.org/abs/2202.13867v2", "doi": "10.1109/access.2022.3197215", "primary_class": "cs.LG", "arxiv_id": "2202.13867"}, {"title": "A distance-based tool-set to track inconsistent urban structures through complex-networks", "authors": ["Gabriel Spadon", "Bruno B. Machado", "Danilo M. Eler", "Jose Fernando Rodrigues-Jr"], "year": 2018, "abs_url": "https://arxiv.org/abs/1803.09136v1", "doi": "10.1007/978-3-319-93698-7_22", "primary_class": "cs.CE", "arxiv_id": "1803.09136"}, {"title": "A Theoretical Framework for Environmental Similarity and Vessel Mobility as Coupled Predictors of Marine Invasive Species Pathways", "authors": ["Gabriel Spadon", "Vaishnav Vaidheeswaran", "Claudio DiBacco"], "year": 2025, "abs_url": "https://arxiv.org/abs/2511.03499v2", "doi": "", "primary_class": "cs.CE", "arxiv_id": "2511.03499"}, {"title": "Maritime Tracking Data Analysis and Integration with AISdb", "authors": ["Gabriel Spadon", "Jay Kumar", "Jinkun Chen", "Matthew Smith", "Casey Hilliard", "Sarah Vela", "Romina Gehrmann", "Claudio DiBacco", "Stan Matwin", "Ronald Pelot"], "year": 2024, "abs_url": "https://arxiv.org/abs/2407.08082v1", "doi": "", "primary_class": "cs.DB", "arxiv_id": "2407.08082"}]}} \ No newline at end of file +{"timestamp": 1783010208.9464152, "data": {"entries": [{"title": "Viscous hydrodynamics description of $\u03c6$ meson production in Au+Au and Cu+Cu collisions", "authors": ["A. K. Chaudhuri"], "year": 2009, "abs_url": "https://arxiv.org/abs/0901.4181v1", "doi": "", "primary_class": "nucl-th", "arxiv_id": "0901.4181"}, {"title": "$J/\u03c8$ production in Au+Au collisions at RHIC and the nuclear absorption", "authors": ["A. K. Chaudhuri"], "year": 2003, "abs_url": "https://arxiv.org/abs/nucl-th/0307029v3", "doi": "10.1103/physrevc.74.044907", "primary_class": "nucl-th", "arxiv_id": ""}, {"title": "Centrality dependence of high $p_T$ suppression in Au+Au collisions suggest quark matter formation", "authors": ["A. K. Chaudhuri"], "year": 2003, "abs_url": "https://arxiv.org/abs/nucl-th/0312069v3", "doi": "", "primary_class": "nucl-th", "arxiv_id": ""}, {"title": "Production of Charged Pions and Hadrons in Au+Au Collisions at sqrt(s_NN)=130GeV", "authors": ["STAR Collaboration"], "year": 2003, "abs_url": "https://arxiv.org/abs/nucl-ex/0311017v2", "doi": "", "primary_class": "nucl-ex", "arxiv_id": ""}, {"title": "Exploiting Intrinsic Triangular Geometry in Relativistic He3+Au Collisions to Disentangle Medium Properties", "authors": ["J. L. Nagle", "A. Adare", "S. Beckman", "T. Koblesky", "J. Orjuela Koop", "D. McGlinchey", "P. Romatschke", "J. Carlson", "J. Lynn", "M. McCumber"], "year": 2013, "abs_url": "https://arxiv.org/abs/1312.4565v2", "doi": "10.1103/physrevlett.113.112301", "primary_class": "nucl-th", "arxiv_id": "1312.4565"}, {"title": "Topological street-network characterization through feature-vector and cluster analysis", "authors": ["Gabriel Spadon", "Gabriel Gimenes", "Jose F. Rodrigues-Jr"], "year": 2018, "abs_url": "https://arxiv.org/abs/1806.07952v1", "doi": "10.1007/978-3-319-93698-7_21", "primary_class": "cs.SI", "arxiv_id": "1806.07952"}, {"title": "Unfolding AIS transmission behavior for vessel movement modeling on noisy data leveraging machine learning", "authors": ["Gabriel Spadon", "Martha D. Ferreira", "Amilcar Soares", "Stan Matwin"], "year": 2022, "abs_url": "https://arxiv.org/abs/2202.13867v2", "doi": "10.1109/access.2022.3197215", "primary_class": "cs.LG", "arxiv_id": "2202.13867"}, {"title": "A Theoretical Framework for Environmental Similarity and Vessel Mobility as Coupled Predictors of Marine Invasive Species Pathways", "authors": ["Gabriel Spadon", "Vaishnav Vaidheeswaran", "Claudio DiBacco"], "year": 2025, "abs_url": "https://arxiv.org/abs/2511.03499v2", "doi": "", "primary_class": "cs.CE", "arxiv_id": "2511.03499"}, {"title": "A distance-based tool-set to track inconsistent urban structures through complex-networks", "authors": ["Gabriel Spadon", "Bruno B. Machado", "Danilo M. Eler", "Jose Fernando Rodrigues-Jr"], "year": 2018, "abs_url": "https://arxiv.org/abs/1803.09136v1", "doi": "10.1007/978-3-319-93698-7_22", "primary_class": "cs.CE", "arxiv_id": "1803.09136"}, {"title": "Maritime Tracking Data Analysis and Integration with AISdb", "authors": ["Gabriel Spadon", "Jay Kumar", "Jinkun Chen", "Matthew Smith", "Casey Hilliard", "Sarah Vela", "Romina Gehrmann", "Claudio DiBacco", "Stan Matwin", "Ronald Pelot"], "year": 2024, "abs_url": "https://arxiv.org/abs/2407.08082v1", "doi": "", "primary_class": "cs.DB", "arxiv_id": "2407.08082"}]}} \ No newline at end of file diff --git a/data/api_cache/crossref/0705e0291fe5e0ec5b9848197b069ce43e272b862d2f7975dccc733646e3ab52.json b/data/api_cache/crossref/0705e0291fe5e0ec5b9848197b069ce43e272b862d2f7975dccc733646e3ab52.json index f489ed4a..e0e26164 100644 --- a/data/api_cache/crossref/0705e0291fe5e0ec5b9848197b069ce43e272b862d2f7975dccc733646e3ab52.json +++ b/data/api_cache/crossref/0705e0291fe5e0ec5b9848197b069ce43e272b862d2f7975dccc733646e3ab52.json @@ -1 +1 @@ -{"timestamp": 1772379755.230751, "ttl_days": 60, "data": {"_negative": true}} \ No newline at end of file +{"timestamp": 1783016778.1232402, "data": {"_negative": true, "_confirmations": 3, "_safe": true}} \ No newline at end of file diff --git a/data/api_cache/crossref/18d476611ed4119417fdf5de4d4020e527e85f1ef7220799a3c478b449ef57f5.json b/data/api_cache/crossref/18d476611ed4119417fdf5de4d4020e527e85f1ef7220799a3c478b449ef57f5.json index f614981f..9c4bcbc9 100644 --- a/data/api_cache/crossref/18d476611ed4119417fdf5de4d4020e527e85f1ef7220799a3c478b449ef57f5.json +++ b/data/api_cache/crossref/18d476611ed4119417fdf5de4d4020e527e85f1ef7220799a3c478b449ef57f5.json @@ -1 +1 @@ -{"timestamp": 1772377443.8174696, "ttl_days": 60, "data": {"_negative": true}} \ No newline at end of file +{"timestamp": 1782990200.0292652, "data": {"_negative": true, "_confirmations": 3, "_safe": true}} \ No newline at end of file diff --git a/data/api_cache/crossref/1af47da688657fbd15dfdf4ae25c0a52f3d5fa214fd18f9e57525766aeefe5f6.json b/data/api_cache/crossref/1af47da688657fbd15dfdf4ae25c0a52f3d5fa214fd18f9e57525766aeefe5f6.json index 348d4ad8..6861a9d5 100644 --- a/data/api_cache/crossref/1af47da688657fbd15dfdf4ae25c0a52f3d5fa214fd18f9e57525766aeefe5f6.json +++ b/data/api_cache/crossref/1af47da688657fbd15dfdf4ae25c0a52f3d5fa214fd18f9e57525766aeefe5f6.json @@ -1 +1 @@ -{"timestamp": 1772377736.1630588, "ttl_days": 60, "data": {"_negative": true}} \ No newline at end of file +{"timestamp": 1783023362.3885562, "data": {"_negative": true, "_confirmations": 3, "_safe": true}} \ No newline at end of file diff --git a/data/api_cache/crossref/1bb13c69c064ed32d4e6e6c7ed6c2f00e4092c7a87cef5575245dcc7db36932a.json b/data/api_cache/crossref/1bb13c69c064ed32d4e6e6c7ed6c2f00e4092c7a87cef5575245dcc7db36932a.json index 48808e5b..bd72eaf5 100644 --- a/data/api_cache/crossref/1bb13c69c064ed32d4e6e6c7ed6c2f00e4092c7a87cef5575245dcc7db36932a.json +++ b/data/api_cache/crossref/1bb13c69c064ed32d4e6e6c7ed6c2f00e4092c7a87cef5575245dcc7db36932a.json @@ -1 +1 @@ -{"timestamp": 1772377444.061796, "ttl_days": 60, "data": {"_negative": true}} \ No newline at end of file +{"timestamp": 1782990207.6376789, "data": {"_negative": true, "_confirmations": 3, "_safe": true}} \ No newline at end of file diff --git a/data/api_cache/crossref/1f13233f34a68084a1262077a09781a51c6ada84a99b0161440f3a14faf40a84.json b/data/api_cache/crossref/1f13233f34a68084a1262077a09781a51c6ada84a99b0161440f3a14faf40a84.json index cba6d970..580ff171 100644 --- a/data/api_cache/crossref/1f13233f34a68084a1262077a09781a51c6ada84a99b0161440f3a14faf40a84.json +++ b/data/api_cache/crossref/1f13233f34a68084a1262077a09781a51c6ada84a99b0161440f3a14faf40a84.json @@ -1 +1 @@ -{"timestamp": 1772379600.0352983, "ttl_days": 60, "data": {"_negative": true}} \ No newline at end of file +{"timestamp": 1783016619.265303, "data": {"_negative": true, "_confirmations": 3, "_safe": true}} \ No newline at end of file diff --git a/data/api_cache/crossref/2b79c6b40a6cf28f8ab2854126f0cb05f3b3aea913566d1c025e3c7843db74af.json b/data/api_cache/crossref/2b79c6b40a6cf28f8ab2854126f0cb05f3b3aea913566d1c025e3c7843db74af.json index 01193922..02d3e131 100644 --- a/data/api_cache/crossref/2b79c6b40a6cf28f8ab2854126f0cb05f3b3aea913566d1c025e3c7843db74af.json +++ b/data/api_cache/crossref/2b79c6b40a6cf28f8ab2854126f0cb05f3b3aea913566d1c025e3c7843db74af.json @@ -1 +1 @@ -{"timestamp": 1772377436.4385676, "ttl_days": 60, "data": {"title": ["Attention Is All You Need"], "author": [{"given": "Ashish", "family": "Vaswani", "sequence": "first", "affiliation": [{"name": "Google Brain"}]}, {"given": "Noam", "family": "Shazeer", "sequence": "additional", "affiliation": [{"name": "Google Brain"}]}, {"given": "Niki", "family": "Parmar", "sequence": "additional", "affiliation": [{"name": "Google Research"}]}, {"given": "Jakob", "family": "Uszkoreit", "sequence": "additional", "affiliation": [{"name": "Google Research"}]}, {"given": "Llion", "family": "Jones", "sequence": "additional", "affiliation": [{"name": "Google Research"}]}, {"given": "Aidan", "family": "N.Gomez", "sequence": "additional", "affiliation": [{"name": "University of Toronto"}]}, {"given": "Lukasz", "family": "Kaiser", "sequence": "additional", "affiliation": [{"name": "Google Brain"}]}, {"given": "Illia", "family": "Polosukhin", "sequence": "additional", "affiliation": []}], "issued": {"date-parts": [[2025, 8, 23]]}, "type": "posted-content", "URL": "https://doi.org/10.65215/2q58a426", "DOI": "10.65215/2q58a426", "publisher": "Shenzhen Medical Academy of Research and Translation"}} \ No newline at end of file +{"timestamp": 1782987688.002251, "data": {"title": ["Attention Is All You Need"], "author": [{"given": "Ashish", "family": "Vaswani", "sequence": "first", "affiliation": [{"name": "Google Brain"}], "role": [{"vocabulary": "crossref", "role": "author"}]}, {"given": "Noam", "family": "Shazeer", "sequence": "additional", "affiliation": [{"name": "Google Brain"}], "role": [{"vocabulary": "crossref", "role": "author"}]}, {"given": "Niki", "family": "Parmar", "sequence": "additional", "affiliation": [{"name": "Google Research"}], "role": [{"vocabulary": "crossref", "role": "author"}]}, {"given": "Jakob", "family": "Uszkoreit", "sequence": "additional", "affiliation": [{"name": "Google Research"}], "role": [{"vocabulary": "crossref", "role": "author"}]}, {"given": "Llion", "family": "Jones", "sequence": "additional", "affiliation": [{"name": "Google Research"}], "role": [{"vocabulary": "crossref", "role": "author"}]}, {"given": "Aidan", "family": "N.Gomez", "sequence": "additional", "affiliation": [{"name": "University of Toronto"}], "role": [{"vocabulary": "crossref", "role": "author"}]}, {"given": "Lukasz", "family": "Kaiser", "sequence": "additional", "affiliation": [{"name": "Google Brain"}], "role": [{"vocabulary": "crossref", "role": "author"}]}, {"given": "Illia", "family": "Polosukhin", "sequence": "additional", "affiliation": [], "role": [{"vocabulary": "crossref", "role": "author"}]}], "issued": {"date-parts": [[2025, 8, 23]]}, "type": "posted-content", "URL": "https://doi.org/10.65215/ctdc8e75", "DOI": "10.65215/ctdc8e75", "publisher": "Shenzhen Medical Academy of Research and Translation"}} \ No newline at end of file diff --git a/data/api_cache/crossref/38a54d0466142acc3c48fe995993fc7fa8abe7678fceef2d81f3567947cb0001.json b/data/api_cache/crossref/38a54d0466142acc3c48fe995993fc7fa8abe7678fceef2d81f3567947cb0001.json index 8721956c..211e7d68 100644 --- a/data/api_cache/crossref/38a54d0466142acc3c48fe995993fc7fa8abe7678fceef2d81f3567947cb0001.json +++ b/data/api_cache/crossref/38a54d0466142acc3c48fe995993fc7fa8abe7678fceef2d81f3567947cb0001.json @@ -1 +1 @@ -{"timestamp": 1772377760.5605314, "ttl_days": 60, "data": {"_negative": true}} \ No newline at end of file +{"timestamp": 1783015414.2873871, "data": {"_negative": true, "_confirmations": 3, "_safe": true}} \ No newline at end of file diff --git a/data/api_cache/crossref/4d02585dd16d95f12e4da62944d463b3bd10881a9e8be247bf25e36417d34202.json b/data/api_cache/crossref/4d02585dd16d95f12e4da62944d463b3bd10881a9e8be247bf25e36417d34202.json index f37790a9..0f7dc48f 100644 --- a/data/api_cache/crossref/4d02585dd16d95f12e4da62944d463b3bd10881a9e8be247bf25e36417d34202.json +++ b/data/api_cache/crossref/4d02585dd16d95f12e4da62944d463b3bd10881a9e8be247bf25e36417d34202.json @@ -1 +1 @@ -{"timestamp": 1772377713.7656918, "ttl_days": 60, "data": {"_negative": true}} \ No newline at end of file +{"timestamp": 1783015465.639475, "data": {"_negative": true, "_confirmations": 3, "_safe": true}} \ No newline at end of file diff --git a/data/api_cache/crossref/7c790e9a55ec7afb3188f1bc937bc0ae5cfd0b09816bdcb744d0019c96e5011a.json b/data/api_cache/crossref/7c790e9a55ec7afb3188f1bc937bc0ae5cfd0b09816bdcb744d0019c96e5011a.json index 9a08b896..a09293c0 100644 --- a/data/api_cache/crossref/7c790e9a55ec7afb3188f1bc937bc0ae5cfd0b09816bdcb744d0019c96e5011a.json +++ b/data/api_cache/crossref/7c790e9a55ec7afb3188f1bc937bc0ae5cfd0b09816bdcb744d0019c96e5011a.json @@ -1 +1 @@ -{"timestamp": 1772377437.4049213, "ttl_days": 60, "data": {"results": [{"title": ["Attention Is All You Need"], "author": [{"given": "Ashish", "family": "Vaswani", "sequence": "first", "affiliation": [{"name": "Google Brain"}]}, {"given": "Noam", "family": "Shazeer", "sequence": "additional", "affiliation": [{"name": "Google Brain"}]}, {"given": "Niki", "family": "Parmar", "sequence": "additional", "affiliation": [{"name": "Google Research"}]}, {"given": "Jakob", "family": "Uszkoreit", "sequence": "additional", "affiliation": [{"name": "Google Research"}]}, {"given": "Llion", "family": "Jones", "sequence": "additional", "affiliation": [{"name": "Google Research"}]}, {"given": "Aidan", "family": "N.Gomez", "sequence": "additional", "affiliation": [{"name": "University of Toronto"}]}, {"given": "Lukasz", "family": "Kaiser", "sequence": "additional", "affiliation": [{"name": "Google Brain"}]}, {"given": "Illia", "family": "Polosukhin", "sequence": "additional", "affiliation": []}], "issued": {"date-parts": [[2025, 8, 23]]}, "type": "posted-content", "URL": "https://doi.org/10.65215/2q58a426", "DOI": "10.65215/2q58a426", "publisher": "Shenzhen Medical Academy of Research and Translation"}, {"title": ["Attention Is All You Need"], "author": [{"given": "Ashish", "family": "Vaswani", "sequence": "first", "affiliation": [{"name": "Google Brain"}]}, {"given": "Noam", "family": "Shazeer", "sequence": "additional", "affiliation": [{"name": "Google Brain"}]}, {"given": "Niki", "family": "Parmar", "sequence": "additional", "affiliation": [{"name": "Google Research"}]}, {"given": "Jakob", "family": "Uszkoreit", "sequence": "additional", "affiliation": [{"name": "Google Research"}]}, {"given": "Llion", "family": "Jones", "sequence": "additional", "affiliation": [{"name": "Google Research"}]}, {"given": "Aidan", "family": "N.Gomez", "sequence": "additional", "affiliation": [{"name": "University of Toronto"}]}, {"given": "Lukasz", "family": "Kaiser", "sequence": "additional", "affiliation": [{"name": "Google Brain"}]}, {"given": "Illia", "family": "Polosukhin", "sequence": "additional", "affiliation": []}], "issued": {"date-parts": [[2025, 11, 13]]}, "type": "posted-content", "URL": "https://doi.org/10.65215/r5bs2d54", "DOI": "10.65215/r5bs2d54", "publisher": "Shenzhen Medical Academy of Research and Translation"}, {"title": ["Attention Is All You Need"], "author": [{"given": "Ashish", "family": "Vaswani", "sequence": "first", "affiliation": [{"name": "Google Brain"}]}, {"given": "Noam", "family": "Shazeer", "sequence": "additional", "affiliation": [{"name": "Google Brain"}]}, {"given": "Niki", "family": "Parmar", "sequence": "additional", "affiliation": [{"name": "Google Research"}]}, {"given": "Jakob", "family": "Uszkoreit", "sequence": "additional", "affiliation": [{"name": "Google Research"}]}, {"given": "Llion", "family": "Jones", "sequence": "additional", "affiliation": [{"name": "Google Research"}]}, {"given": "Aidan", "family": "N.Gomez", "sequence": "additional", "affiliation": [{"name": "University of Toronto"}]}, {"given": "Lukasz", "family": "Kaiser", "sequence": "additional", "affiliation": [{"name": "Google Brain"}]}, {"given": "Illia", "family": "Polosukhin", "sequence": "additional", "affiliation": []}], "issued": {"date-parts": [[2025, 8, 23]]}, "type": "posted-content", "URL": "https://doi.org/10.65215/nxvz2v36", "DOI": "10.65215/nxvz2v36", "publisher": "Shenzhen Medical Academy of Research and Translation"}, {"title": ["Attention Is All You Need"], "author": [{"given": "Ashish", "family": "Vaswani", "sequence": "first", "affiliation": [{"name": "Google Brain"}]}, {"given": "Noam", "family": "Shazeer", "sequence": "additional", "affiliation": [{"name": "Google Brain"}]}, {"given": "Niki", "family": "Parmar", "sequence": "additional", "affiliation": [{"name": "Google Research"}]}, {"given": "Jakob", "family": "Uszkoreit", "sequence": "additional", "affiliation": [{"name": "Google Research"}]}, {"given": "Llion", "family": "Jones", "sequence": "additional", "affiliation": [{"name": "Google Research"}]}, {"given": "Aidan", "family": "N.Gomez", "sequence": "additional", "affiliation": [{"name": "University of Toronto"}]}, {"given": "Lukasz", "family": "Kaiser", "sequence": "additional", "affiliation": [{"name": "Google Brain"}]}, {"given": "Illia", "family": "Polosukhin", "sequence": "additional", "affiliation": []}], "issued": {"date-parts": [[2025, 8, 23]]}, "type": "posted-content", "URL": "https://doi.org/10.65215/ctdc8e75", "DOI": "10.65215/ctdc8e75", "publisher": "Shenzhen Medical Academy of Research and Translation"}, {"title": ["Attention Is All You Need"], "author": [{"given": "Ashish", "family": "Vaswani", "sequence": "first", "affiliation": [{"name": "Google Brain"}]}, {"given": "Noam", "family": "Shazeer", "sequence": "additional", "affiliation": [{"name": "Google Brain"}]}, {"given": "Niki", "family": "Parmar", "sequence": "additional", "affiliation": [{"name": "Google Research"}]}, {"given": "Jakob", "family": "Uszkoreit", "sequence": "additional", "affiliation": [{"name": "Google Research"}]}, {"given": "Llion", "family": "Jones", "sequence": "additional", "affiliation": [{"name": "Google Research"}]}, {"given": "Aidan", "family": "N.Gomez", "sequence": "additional", "affiliation": [{"name": "University of Toronto"}]}, {"given": "Lukasz", "family": "Kaiser", "sequence": "additional", "affiliation": [{"name": "Google Brain"}]}, {"given": "Illia", "family": "Polosukhin", "sequence": "additional", "affiliation": []}], "issued": {"date-parts": [[2025, 8, 23]]}, "type": "posted-content", "URL": "https://doi.org/10.65215/ysbyhc05", "DOI": "10.65215/ysbyhc05", "publisher": "Shenzhen Medical Academy of Research and Translation"}]}} \ No newline at end of file +{"timestamp": 1782987727.5626104, "data": {"results": [{"title": ["Attention Is All You Need"], "author": [{"given": "Ashish", "family": "Vaswani", "sequence": "first", "affiliation": [{"name": "Google Brain"}], "role": [{"vocabulary": "crossref", "role": "author"}]}, {"given": "Noam", "family": "Shazeer", "sequence": "additional", "affiliation": [{"name": "Google Brain"}], "role": [{"vocabulary": "crossref", "role": "author"}]}, {"given": "Niki", "family": "Parmar", "sequence": "additional", "affiliation": [{"name": "Google Research"}], "role": [{"vocabulary": "crossref", "role": "author"}]}, {"given": "Jakob", "family": "Uszkoreit", "sequence": "additional", "affiliation": [{"name": "Google Research"}], "role": [{"vocabulary": "crossref", "role": "author"}]}, {"given": "Llion", "family": "Jones", "sequence": "additional", "affiliation": [{"name": "Google Research"}], "role": [{"vocabulary": "crossref", "role": "author"}]}, {"given": "Aidan", "family": "N.Gomez", "sequence": "additional", "affiliation": [{"name": "University of Toronto"}], "role": [{"vocabulary": "crossref", "role": "author"}]}, {"given": "Lukasz", "family": "Kaiser", "sequence": "additional", "affiliation": [{"name": "Google Brain"}], "role": [{"vocabulary": "crossref", "role": "author"}]}, {"given": "Illia", "family": "Polosukhin", "sequence": "additional", "affiliation": [], "role": [{"vocabulary": "crossref", "role": "author"}]}], "issued": {"date-parts": [[2025, 8, 23]]}, "type": "posted-content", "URL": "https://doi.org/10.65215/ctdc8e75", "DOI": "10.65215/ctdc8e75", "publisher": "Shenzhen Medical Academy of Research and Translation"}, {"title": ["Attention Is All You Need"], "author": [{"given": "Ashish", "family": "Vaswani", "sequence": "first", "affiliation": [{"name": "Google Brain"}], "role": [{"vocabulary": "crossref", "role": "author"}]}, {"given": "Noam", "family": "Shazeer", "sequence": "additional", "affiliation": [{"name": "Google Brain"}], "role": [{"vocabulary": "crossref", "role": "author"}]}, {"given": "Niki", "family": "Parmar", "sequence": "additional", "affiliation": [{"name": "Google Research"}], "role": [{"vocabulary": "crossref", "role": "author"}]}, {"given": "Jakob", "family": "Uszkoreit", "sequence": "additional", "affiliation": [{"name": "Google Research"}], "role": [{"vocabulary": "crossref", "role": "author"}]}, {"given": "Llion", "family": "Jones", "sequence": "additional", "affiliation": [{"name": "Google Research"}], "role": [{"vocabulary": "crossref", "role": "author"}]}, {"given": "Aidan", "family": "N.Gomez", "sequence": "additional", "affiliation": [{"name": "University of Toronto"}], "role": [{"vocabulary": "crossref", "role": "author"}]}, {"given": "Lukasz", "family": "Kaiser", "sequence": "additional", "affiliation": [{"name": "Google Brain"}], "role": [{"vocabulary": "crossref", "role": "author"}]}, {"given": "Illia", "family": "Polosukhin", "sequence": "additional", "affiliation": [], "role": [{"vocabulary": "crossref", "role": "author"}]}], "issued": {"date-parts": [[2025, 11, 13]]}, "type": "posted-content", "URL": "https://doi.org/10.65215/r5bs2d54", "DOI": "10.65215/r5bs2d54", "publisher": "Shenzhen Medical Academy of Research and Translation"}, {"title": ["Attention Is All You Need"], "author": [{"given": "Ashish", "family": "Vaswani", "sequence": "first", "affiliation": [{"name": "Google Brain"}], "role": [{"vocabulary": "crossref", "role": "author"}]}, {"given": "Noam", "family": "Shazeer", "sequence": "additional", "affiliation": [{"name": "Google Brain"}], "role": [{"vocabulary": "crossref", "role": "author"}]}, {"given": "Niki", "family": "Parmar", "sequence": "additional", "affiliation": [{"name": "Google Research"}], "role": [{"vocabulary": "crossref", "role": "author"}]}, {"given": "Jakob", "family": "Uszkoreit", "sequence": "additional", "affiliation": [{"name": "Google Research"}], "role": [{"vocabulary": "crossref", "role": "author"}]}, {"given": "Llion", "family": "Jones", "sequence": "additional", "affiliation": [{"name": "Google Research"}], "role": [{"vocabulary": "crossref", "role": "author"}]}, {"given": "Aidan", "family": "N.Gomez", "sequence": "additional", "affiliation": [{"name": "University of Toronto"}], "role": [{"vocabulary": "crossref", "role": "author"}]}, {"given": "Lukasz", "family": "Kaiser", "sequence": "additional", "affiliation": [{"name": "Google Brain"}], "role": [{"vocabulary": "crossref", "role": "author"}]}, {"given": "Illia", "family": "Polosukhin", "sequence": "additional", "affiliation": [], "role": [{"vocabulary": "crossref", "role": "author"}]}], "issued": {"date-parts": [[2025, 8, 23]]}, "type": "posted-content", "URL": "https://doi.org/10.65215/2q58a426", "DOI": "10.65215/2q58a426", "publisher": "Shenzhen Medical Academy of Research and Translation"}, {"title": ["Attention Is All You Need"], "author": [{"given": "Ashish", "family": "Vaswani", "sequence": "first", "affiliation": [{"name": "Google Brain"}], "role": [{"vocabulary": "crossref", "role": "author"}]}, {"given": "Noam", "family": "Shazeer", "sequence": "additional", "affiliation": [{"name": "Google Brain"}], "role": [{"vocabulary": "crossref", "role": "author"}]}, {"given": "Niki", "family": "Parmar", "sequence": "additional", "affiliation": [{"name": "Google Research"}], "role": [{"vocabulary": "crossref", "role": "author"}]}, {"given": "Jakob", "family": "Uszkoreit", "sequence": "additional", "affiliation": [{"name": "Google Research"}], "role": [{"vocabulary": "crossref", "role": "author"}]}, {"given": "Llion", "family": "Jones", "sequence": "additional", "affiliation": [{"name": "Google Research"}], "role": [{"vocabulary": "crossref", "role": "author"}]}, {"given": "Aidan", "family": "N.Gomez", "sequence": "additional", "affiliation": [{"name": "University of Toronto"}], "role": [{"vocabulary": "crossref", "role": "author"}]}, {"given": "Lukasz", "family": "Kaiser", "sequence": "additional", "affiliation": [{"name": "Google Brain"}], "role": [{"vocabulary": "crossref", "role": "author"}]}, {"given": "Illia", "family": "Polosukhin", "sequence": "additional", "affiliation": [], "role": [{"vocabulary": "crossref", "role": "author"}]}], "issued": {"date-parts": [[2025, 8, 23]]}, "type": "posted-content", "URL": "https://doi.org/10.65215/ysbyhc05", "DOI": "10.65215/ysbyhc05", "publisher": "Shenzhen Medical Academy of Research and Translation"}, {"title": ["Attention Is All You Need"], "author": [{"given": "Ashish", "family": "Vaswani", "sequence": "first", "affiliation": [{"name": "Google Brain"}], "role": [{"vocabulary": "crossref", "role": "author"}]}, {"given": "Noam", "family": "Shazeer", "sequence": "additional", "affiliation": [{"name": "Google Brain"}], "role": [{"vocabulary": "crossref", "role": "author"}]}, {"given": "Niki", "family": "Parmar", "sequence": "additional", "affiliation": [{"name": "Google Research"}], "role": [{"vocabulary": "crossref", "role": "author"}]}, {"given": "Jakob", "family": "Uszkoreit", "sequence": "additional", "affiliation": [{"name": "Google Research"}], "role": [{"vocabulary": "crossref", "role": "author"}]}, {"given": "Llion", "family": "Jones", "sequence": "additional", "affiliation": [{"name": "Google Research"}], "role": [{"vocabulary": "crossref", "role": "author"}]}, {"given": "Aidan", "family": "N.Gomez", "sequence": "additional", "affiliation": [{"name": "University of Toronto"}], "role": [{"vocabulary": "crossref", "role": "author"}]}, {"given": "Lukasz", "family": "Kaiser", "sequence": "additional", "affiliation": [{"name": "Google Brain"}], "role": [{"vocabulary": "crossref", "role": "author"}]}, {"given": "Illia", "family": "Polosukhin", "sequence": "additional", "affiliation": [], "role": [{"vocabulary": "crossref", "role": "author"}]}], "issued": {"date-parts": [[2025, 8, 23]]}, "type": "posted-content", "URL": "https://doi.org/10.65215/nxvz2v36", "DOI": "10.65215/nxvz2v36", "publisher": "Shenzhen Medical Academy of Research and Translation"}]}} \ No newline at end of file diff --git a/data/api_cache/crossref/88367b52a4f2ad34bea38b9fceb7cbbc519fc0bf520ec8b4a363bd3605715982.json b/data/api_cache/crossref/88367b52a4f2ad34bea38b9fceb7cbbc519fc0bf520ec8b4a363bd3605715982.json index bf0eee9d..933edd82 100644 --- a/data/api_cache/crossref/88367b52a4f2ad34bea38b9fceb7cbbc519fc0bf520ec8b4a363bd3605715982.json +++ b/data/api_cache/crossref/88367b52a4f2ad34bea38b9fceb7cbbc519fc0bf520ec8b4a363bd3605715982.json @@ -1 +1 @@ -{"timestamp": 1772378085.1656008, "ttl_days": 60, "data": {"_negative": true}} \ No newline at end of file +{"timestamp": 1783015728.1681426, "data": {"_negative": true, "_confirmations": 3, "_safe": true}} \ No newline at end of file diff --git a/data/api_cache/crossref/8b20cb02fd9abe3e4ed101c04fc28c02fea02147e35c48a52fea75d488ab7c86.json b/data/api_cache/crossref/8b20cb02fd9abe3e4ed101c04fc28c02fea02147e35c48a52fea75d488ab7c86.json index 46c74215..571dc82d 100644 --- a/data/api_cache/crossref/8b20cb02fd9abe3e4ed101c04fc28c02fea02147e35c48a52fea75d488ab7c86.json +++ b/data/api_cache/crossref/8b20cb02fd9abe3e4ed101c04fc28c02fea02147e35c48a52fea75d488ab7c86.json @@ -1 +1 @@ -{"timestamp": 1772379269.545457, "ttl_days": 60, "data": {"_negative": true}} \ No newline at end of file +{"timestamp": 1783016569.7249506, "data": {"_negative": true, "_confirmations": 3, "_safe": true}} \ No newline at end of file diff --git a/data/api_cache/crossref/a21e2968d06e4d1aeb9887e319dc321a02b797daee6df07b7849aaf552c6688d.json b/data/api_cache/crossref/a21e2968d06e4d1aeb9887e319dc321a02b797daee6df07b7849aaf552c6688d.json index dc59669e..087d1df7 100644 --- a/data/api_cache/crossref/a21e2968d06e4d1aeb9887e319dc321a02b797daee6df07b7849aaf552c6688d.json +++ b/data/api_cache/crossref/a21e2968d06e4d1aeb9887e319dc321a02b797daee6df07b7849aaf552c6688d.json @@ -1 +1 @@ -{"timestamp": 1772377957.894738, "ttl_days": 60, "data": {"_negative": true}} \ No newline at end of file +{"timestamp": 1783015554.4215047, "data": {"_negative": true, "_confirmations": 3, "_safe": true}} \ No newline at end of file diff --git a/data/api_cache/crossref/a303b559f2fe7268694fc0987cccca5bf6cfffef71d539551459e127482e77bf.json b/data/api_cache/crossref/a303b559f2fe7268694fc0987cccca5bf6cfffef71d539551459e127482e77bf.json index 6dda6634..591b6718 100644 --- a/data/api_cache/crossref/a303b559f2fe7268694fc0987cccca5bf6cfffef71d539551459e127482e77bf.json +++ b/data/api_cache/crossref/a303b559f2fe7268694fc0987cccca5bf6cfffef71d539551459e127482e77bf.json @@ -1 +1 @@ -{"timestamp": 1772379724.3484437, "ttl_days": 60, "data": {"_negative": true}} \ No newline at end of file +{"timestamp": 1783016697.092626, "data": {"_negative": true, "_confirmations": 3, "_safe": true}} \ No newline at end of file diff --git a/data/api_cache/crossref/d170ab4084660dfbd1db96f69b17d8c84a0910546ad990f619d0942ef3ef9213.json b/data/api_cache/crossref/d170ab4084660dfbd1db96f69b17d8c84a0910546ad990f619d0942ef3ef9213.json index 548b24a8..dcb64ef9 100644 --- a/data/api_cache/crossref/d170ab4084660dfbd1db96f69b17d8c84a0910546ad990f619d0942ef3ef9213.json +++ b/data/api_cache/crossref/d170ab4084660dfbd1db96f69b17d8c84a0910546ad990f619d0942ef3ef9213.json @@ -1 +1 @@ -{"timestamp": 1772379812.34321, "ttl_days": 60, "data": {"_negative": true}} \ No newline at end of file +{"timestamp": 1783016737.5350623, "data": {"_negative": true, "_confirmations": 3, "_safe": true}} \ No newline at end of file diff --git a/data/api_cache/crossref/ee5df5fa7c1560ea9fc76585e9c706999931e8f7b521fbb11594c79d15bf8a99.json b/data/api_cache/crossref/ee5df5fa7c1560ea9fc76585e9c706999931e8f7b521fbb11594c79d15bf8a99.json index 73a7a9bc..d91d5839 100644 --- a/data/api_cache/crossref/ee5df5fa7c1560ea9fc76585e9c706999931e8f7b521fbb11594c79d15bf8a99.json +++ b/data/api_cache/crossref/ee5df5fa7c1560ea9fc76585e9c706999931e8f7b521fbb11594c79d15bf8a99.json @@ -1 +1 @@ -{"timestamp": 1772379695.4894087, "ttl_days": 60, "data": {"results": [{"title": ["Gravity-Informed Deep Learning Framework for Predicting Ship Traffic Flow and Invasion Risk of Non-Indigenous Species via Ballast Water Discharge"], "author": [{"given": "Gabriel", "family": "Spadon", "sequence": "first", "affiliation": [{"name": "Dalhousie University"}]}, {"given": "Ruixin", "family": "Song", "sequence": "additional", "affiliation": [{"name": "Memorial University"}]}, {"given": "Ronald", "family": "Pelot", "sequence": "additional", "affiliation": [{"name": "Dalhousie University"}]}, {"given": "Stan", "family": "Matwin", "sequence": "additional", "affiliation": [{"name": "Dalhousie University"}]}, {"given": "Amilcar", "family": "Soares", "sequence": "additional", "affiliation": [{"name": "Linnaeus University"}]}], "issued": {"date-parts": [[2024, 2, 12]]}, "type": "posted-content", "URL": "https://doi.org/10.21203/rs.3.rs-3917933/v1", "DOI": "10.21203/rs.3.rs-3917933/v1", "publisher": "Springer Science and Business Media LLC"}]}} \ No newline at end of file +{"timestamp": 1783001055.5426037, "data": {"results": [{"title": ["Gravity-Informed Deep Learning Framework for Predicting Ship Traffic Flow and Invasion Risk of Non-Indigenous Species via Ballast Water Discharge"], "author": [{"given": "Gabriel", "family": "Spadon", "sequence": "first", "affiliation": [{"name": "Dalhousie University"}], "role": [{"role": "author", "vocabulary": "crossref"}]}, {"given": "Ruixin", "family": "Song", "sequence": "additional", "affiliation": [{"name": "Memorial University"}], "role": [{"role": "author", "vocabulary": "crossref"}]}, {"given": "Ronald", "family": "Pelot", "sequence": "additional", "affiliation": [{"name": "Dalhousie University"}], "role": [{"role": "author", "vocabulary": "crossref"}]}, {"given": "Stan", "family": "Matwin", "sequence": "additional", "affiliation": [{"name": "Dalhousie University"}], "role": [{"role": "author", "vocabulary": "crossref"}]}, {"given": "Amilcar", "family": "Soares", "sequence": "additional", "affiliation": [{"name": "Linnaeus University"}], "role": [{"role": "author", "vocabulary": "crossref"}]}], "issued": {"date-parts": [[2024, 2, 12]]}, "type": "posted-content", "URL": "https://doi.org/10.21203/rs.3.rs-3917933/v1", "DOI": "10.21203/rs.3.rs-3917933/v1", "publisher": "Springer Science and Business Media LLC"}]}} \ No newline at end of file diff --git a/data/api_cache/crossref/fd45797585d080233ba513b62617c12b969f7e5371535521a1716a0ee08120d1.json b/data/api_cache/crossref/fd45797585d080233ba513b62617c12b969f7e5371535521a1716a0ee08120d1.json index cb01bdbc..4ad15444 100644 --- a/data/api_cache/crossref/fd45797585d080233ba513b62617c12b969f7e5371535521a1716a0ee08120d1.json +++ b/data/api_cache/crossref/fd45797585d080233ba513b62617c12b969f7e5371535521a1716a0ee08120d1.json @@ -1 +1 @@ -{"timestamp": 1772377976.434935, "ttl_days": 60, "data": {"_negative": true}} \ No newline at end of file +{"timestamp": 1783008952.8803968, "data": {"results": [{"publisher": "Wiley", "issue": "3", "published-print": {"date-parts": [[2023, 3]]}, "DOI": "10.1111/vox.13401", "type": "journal-article", "page": "207-216", "title": ["Validation of a flow\u2010cytometry\u2010based red blood cell antigen phenotyping method"], "volume": "118", "author": [{"given": "Robert", "family": "Liwski", "sequence": "first", "affiliation": [{"name": "Department of Pathology and Laboratory Medicine Dalhousie University Halifax Nova Scotia Canada"}, {"name": "Nova Scotia Health Authority Central Zone Halifax Nova Scotia Canada"}], "role": [{"role": "author", "vocabulary": "crossref"}]}, {"ORCID": "https://orcid.org/0000-0001-7738-3378", "authenticated-orcid": false, "given": "Gwen", "family": "Clarke", "sequence": "additional", "affiliation": [{"name": "Department of Laboratory Medicine and Pathology University of Alberta Edmonton Alberta Canada"}, {"name": "Canadian Blood Services Edmonton Alberta Canada"}], "role": [{"role": "author", "vocabulary": "crossref"}]}, {"given": "Calvino", "family": "Cheng", "sequence": "additional", "affiliation": [{"name": "Department of Pathology and Laboratory Medicine Dalhousie University Halifax Nova Scotia Canada"}, {"name": "Nova Scotia Health Authority Central Zone Halifax Nova Scotia Canada"}], "role": [{"role": "author", "vocabulary": "crossref"}]}, {"given": "Syed Sibte Raza", "family": "Abidi", "sequence": "additional", "affiliation": [{"name": "NICHE Research Group, Faculty of Computer Science Dalhousie University Halifax Nova Scotia Canada"}], "role": [{"role": "author", "vocabulary": "crossref"}]}, {"given": "Samina Raza", "family": "Abidi", "sequence": "additional", "affiliation": [{"name": "Department of Community Health and Epidemiology, Faculty of Medicine Dalhousie University Halifax Nova Scotia Canada"}], "role": [{"role": "author", "vocabulary": "crossref"}]}, {"ORCID": "https://orcid.org/0000-0002-6579-4185", "authenticated-orcid": false, "given": "Jason George", "family": "Quinn", "sequence": "additional", "affiliation": [{"name": "Department of Pathology and Laboratory Medicine Dalhousie University Halifax Nova Scotia Canada"}, {"name": "Nova Scotia Health Authority Central Zone Halifax Nova Scotia Canada"}], "role": [{"role": "author", "vocabulary": "crossref"}]}], "published-online": {"date-parts": [[2023, 1, 12]]}, "container-title": ["Vox Sanguinis"], "issued": {"date-parts": [[2023, 1, 12]]}, "URL": "https://doi.org/10.1111/vox.13401"}]}} \ No newline at end of file diff --git a/data/api_cache/dblp/5d39a66fa6a2f336195d95da2711f6697f0643e059ead6e3437a09b7f511263b.json b/data/api_cache/dblp/5d39a66fa6a2f336195d95da2711f6697f0643e059ead6e3437a09b7f511263b.json index d7810754..a2bdd973 100644 --- a/data/api_cache/dblp/5d39a66fa6a2f336195d95da2711f6697f0643e059ead6e3437a09b7f511263b.json +++ b/data/api_cache/dblp/5d39a66fa6a2f336195d95da2711f6697f0643e059ead6e3437a09b7f511263b.json @@ -1 +1 @@ -{"timestamp": 1772380655.6314802, "ttl_days": 60, "data": {"articles": [{"title": "A Graph Neural Network Approach for Data-Driven Donor-Recipient Matching in Kidney Transplantation", "authors": ["Sheida Majouni", "Karthik K. Tennankore", "Samina Abidi", "Amanda Vinson", "Syed Sibte Raza Abidi"], "year": 2025, "publication": "AIME (1)", "link": "https://doi.org/10.1007/978-3-031-95838-0_26", "snippet": "AIME (1), 2025, 10.1007/978-3-031-95838-0_26", "source": "dblp", "result_id": "dblp:doi:10.1007/978-3-031-95838-0_26"}, {"title": "A Reinforcement Learning Framework for Optimizing Kidney Allocation for Transplant Based on Survival and Ethical Criteria", "authors": ["Syed Asil Ali Naqvi", "Karthik K. Tennankore", "George Worthen", "Amanda Vinson", "Syed Sibte Raza Abidi"], "year": 2025, "publication": "AIME (1)", "link": "https://doi.org/10.1007/978-3-031-95838-0_32", "snippet": "AIME (1), 2025, 10.1007/978-3-031-95838-0_32", "source": "dblp", "result_id": "dblp:doi:10.1007/978-3-031-95838-0_32"}, {"title": "Using Word Embeddings to Extract Semantic Relations from Biomedical Texts: Towards Literature-Based Discovery", "authors": ["William Van Woensel", "Sushumna S. Pradeep", "Ali Daowd", "Samina Abidi", "Syed Sibte Raza Abidi"], "year": 2025, "publication": "AIME (2)", "link": "https://doi.org/10.1007/978-3-031-95841-0_78", "snippet": "AIME (2), 2025, 10.1007/978-3-031-95841-0_78", "source": "dblp", "result_id": "dblp:doi:10.1007/978-3-031-95841-0_78"}, {"title": "Concept-Level Local Explanations of Kidney Transplant Survival Predictions by Black-Box ML Models", "authors": ["Jaber Rad", "Syed Asil Ali Naqvi", "Karthik K. Tennankore", "Samina Abidi", "Amanda Vinson", "Syed Sibte Raza Abidi"], "year": 2025, "publication": "HIKM", "link": "https://doi.org/10.1145/3774816.3774823", "snippet": "HIKM, 2025, 10.1145/3774816.3774823", "source": "dblp", "result_id": "dblp:doi:10.1145/3774816.3774823"}, {"title": "Generating a knowledge graph to understand the mechanistic relationships between multimorbid diabetes, hypertension and kidney diseases", "authors": ["Chukwuebuka Emmanuel Egwuatu", "Ali Daowd", "Samina Abidi", "Syed Sibte Raza Abidi"], "year": 2025, "publication": "HIKM", "link": "https://doi.org/10.1145/3774816.3774831", "snippet": "HIKM, 2025, 10.1145/3774816.3774831", "source": "dblp", "result_id": "dblp:doi:10.1145/3774816.3774831"}, {"title": "Plausible reasoning over large health datasets: A novel approach to data analytics leveraging semantics", "authors": ["Hossein Mohammadhassanzadeh", "Samina Raza Abidi", "Syed Sibte Raza Abidi"], "year": 2024, "publication": "Knowl. Based Syst.", "link": "https://doi.org/10.1016/j.knosys.2024.111493", "snippet": "Knowl. Based Syst., 2024, 10.1016/j.knosys.2024.111493", "source": "dblp", "result_id": "dblp:doi:10.1016/j.knosys.2024.111493"}, {"title": "Utilizing Topological Clustering on a Traumatic Brain Injury Cohort: The Association of Neighborhood Socioeconomic Deprivation Profiles with Injury Mortality", "authors": ["Nelofar Kureshi", "David B. Clarke", "Syed Sibte Raza Abidi"], "year": 2024, "publication": "ACSW", "link": "https://doi.org/10.1145/3641142.3641166", "snippet": "ACSW, 2024, 10.1145/3641142.3641166", "source": "dblp", "result_id": "dblp:doi:10.1145/3641142.3641166"}, {"title": "A Topological Data Analysis of Un met Health Care Needs Among Injured Patients", "authors": ["Nelofar Kureshi", "Syed Sibte Raza Abidi"], "year": 2024, "publication": "ICHI", "link": "https://doi.org/10.1109/ICHI61247.2024.00073", "snippet": "ICHI, 2024, 10.1109/ichi61247.2024.00073", "source": "dblp", "result_id": "dblp:doi:10.1109/ichi61247.2024.00073"}, {"title": "Extracting Decision Paths via Surrogate Modeling for Explainability of Black Box Classifiers", "authors": ["Jaber Rad", "Karthik K. Tennankore", "Samina Abidi", "Syed Sibte Raza Abidi"], "year": 2024, "publication": "SDS", "link": "https://doi.org/10.1109/SDS60720.2024.00037", "snippet": "SDS, 2024, 10.1109/sds60720.2024.00037", "source": "dblp", "result_id": "dblp:doi:10.1109/sds60720.2024.00037"}, {"title": "A community-of-practice-based evaluation methodology for knowledge intensive computational methods and its application to multimorbidity decision support", "authors": ["William Van Woensel", "Samson W. Tu", "Wojtek Michalowski", "Syed Sibte Raza Abidi", "Samina Abidi", "Jos\u00e9 Ram\u00f3n Alonso", "Alessio Bottrighi", "Marc Carrier", "Ruth Edry", "Irit Hochberg", "Malvika Rao", "Stephen P. Kingwell", "Alexandra Kogan", "Mar Marcos", "Bego\u00f1a Mart\u00ednez-Salvador", "Martin Michalowski", "Luca Piovesan", "David Ria\u00f1o", "Paolo Terenziani", "Szymon Wilk", "Mor Peleg"], "year": 2023, "publication": "J. Biomed. Informatics", "link": "https://doi.org/10.1016/j.jbi.2023.104395", "snippet": "J. Biomed. Informatics, 2023, 10.1016/j.jbi.2023.104395", "source": "dblp", "result_id": "dblp:doi:10.1016/j.jbi.2023.104395"}, {"title": "Decentralized Web-Based Clinical Decision Support Using Semantic GLEAN Workflows", "authors": ["William Van Woensel", "Samina Abidi", "Syed Sibte Raza Abidi"], "year": 2023, "publication": "AIME", "link": "https://doi.org/10.1007/978-3-031-34344-5_44", "snippet": "AIME, 2023, 10.1007/978-3-031-34344-5_44", "source": "dblp", "result_id": "dblp:doi:10.1007/978-3-031-34344-5_44"}, {"title": "Digital Therapeutics for COPD Patient Self-Management: Needs Analysis and Design Study", "authors": ["Samina Raza Abidi", "Tracey Rickards", "William Van Woensel", "Syed Sibte Raza Abidi"], "year": 2023, "publication": "MedInfo", "link": "https://doi.org/10.3233/SHTI230957", "snippet": "MedInfo, 2023, 10.3233/shti230957", "source": "dblp", "result_id": "dblp:doi:10.3233/shti230957"}, {"title": "Predicting Urgent Dialysis at Ambulance Transport to the Emergency Department Using Machine Learning Methods", "authors": ["Sheida Majouni", "Karthik K. Tennankore", "Syed Sibte Raza Abidi"], "year": 2023, "publication": "MedInfo", "link": "https://doi.org/10.3233/SHTI231093", "snippet": "MedInfo, 2023, 10.3233/shti231093", "source": "dblp", "result_id": "dblp:doi:10.3233/shti231093"}, {"title": "Characterizing Cluster-Based Frailty Phenotypes in a Multicenter Prospective Cohort of Kidney Transplant Candidates", "authors": ["Syed Hani Raza Abidi", "Nur Zincir-Heywood", "Syed Sibte Raza Abidi", "Kranthi Jalakam", "Samina Abidi", "Lakshman Gunaratnam", "Rita Suri", "H\u00e9lo\u00efse Cardinale", "Amanda Vinson", "Bhanu Prasad", "Michael Walsh", "Seychelle Yohanna", "George Worthen", "Karthik K. Tennankore"], "year": 2023, "publication": "MedInfo", "link": "https://doi.org/10.3233/SHTI231094", "snippet": "MedInfo, 2023, 10.3233/shti231094", "source": "dblp", "result_id": "dblp:doi:10.3233/shti231094"}, {"title": "Ensemble Clustering to Generate Phenotypes of Kidney Transplant Donors and Recipients", "authors": ["Syed Sibte Raza Abidi", "Kranthi Jalakam", "Syed Hani Raza Abidi", "Karthik K. Tennankore"], "year": 2023, "publication": "MedInfo", "link": "https://doi.org/10.3233/SHTI231121", "snippet": "MedInfo, 2023, 10.3233/shti231121", "source": "dblp", "result_id": "dblp:doi:10.3233/shti231121"}, {"title": "Semantic knowledge modeling and evaluation of argument Theory to develop dialogue based patient education systems for chronic disease Self-Management", "authors": ["Benjamin Rose-Davis", "William Van Woensel", "Samina Raza Abidi", "Elizabeth Stringer", "Syed Sibte Raza Abidi"], "year": 2022, "publication": "Int. J. Medical Informatics", "link": "https://doi.org/10.1016/j.ijmedinf.2022.104693", "snippet": "Int. J. Medical Informatics, 2022, 10.1016/j.ijmedinf.2022.104693", "source": "dblp", "result_id": "dblp:doi:10.1016/j.ijmedinf.2022.104693"}, {"title": "Explainable Decision Support Using Task Network Models in Notation3: Computerizing Lipid Management Clinical Guidelines as Interactive Task Networks", "authors": ["William Van Woensel", "Samina Abidi", "Karthik K. Tennankore", "George Worthen", "Syed Sibte Raza Abidi"], "year": 2022, "publication": "AIME", "link": "https://doi.org/10.1007/978-3-031-09342-5_1", "snippet": "AIME, 2022, 10.1007/978-3-031-09342-5_1", "source": "dblp", "result_id": "dblp:doi:10.1007/978-3-031-09342-5_1"}, {"title": "A Knowledge Graph Completion Method Applied to Literature-Based Discovery for Predicting Missing Links Targeting Cancer Drug Repurposing", "authors": ["Ali Daowd", "Samina Abidi", "Syed Sibte Raza Abidi"], "year": 2022, "publication": "AIME", "link": "https://doi.org/10.1007/978-3-031-09342-5_3", "snippet": "AIME, 2022, 10.1007/978-3-031-09342-5_3", "source": "dblp", "result_id": "dblp:doi:10.1007/978-3-031-09342-5_3"}, {"title": "Assessing Knee Osteoarthritis Severity and Biomechanical Changes After Total Knee Arthroplasty Using Self-organizing Maps", "authors": ["Kathryn Young-Shand", "Patrice C. Roy", "Michael Dunbar", "Syed Sibte Raza Abidi", "Janie Wilson"], "year": 2022, "publication": "AIME", "link": "https://doi.org/10.1007/978-3-031-09342-5_7", "snippet": "AIME, 2022, 10.1007/978-3-031-09342-5_7", "source": "dblp", "result_id": "dblp:doi:10.1007/978-3-031-09342-5_7"}, {"title": "Extracting Surrogate Decision Trees from Black-Box Models to Explain the Temporal Importance of Clinical Features in Predicting Kidney Graft Survival", "authors": ["Jaber Rad", "Karthik K. Tennankore", "Amanda Vinson", "Syed Sibte Raza Abidi"], "year": 2022, "publication": "AIME", "link": "https://doi.org/10.1007/978-3-031-09342-5_9", "snippet": "AIME, 2022, 10.1007/978-3-031-09342-5_9", "source": "dblp", "result_id": "dblp:doi:10.1007/978-3-031-09342-5_9"}, {"title": "Clinical Guidelines as Executable and Interactive Workflows with FHIR-Compliant Health Data Input Using GLEAN", "authors": ["William Van Woensel", "Samina Abidi", "Karthik K. Tennankore", "George Worthen", "Syed Sibte Raza Abidi"], "year": 2022, "publication": "AIME", "link": "https://doi.org/10.1007/978-3-031-09342-5_43", "snippet": "AIME, 2022, 10.1007/978-3-031-09342-5_43", "source": "dblp", "result_id": "dblp:doi:10.1007/978-3-031-09342-5_43"}, {"title": "Using Visual Analytics to Optimize Blood Product Inventory at a Hospital's Blood Transfusion Service", "authors": ["Jaber Rad", "Jason G. Quinn", "Calvino Cheng", "Samina Raza Abidi", "Robert Liwski", "Syed Sibte Raza Abidi"], "year": 2022, "publication": "AIME", "link": "https://doi.org/10.1007/978-3-031-09342-5_46", "snippet": "AIME, 2022, 10.1007/978-3-031-09342-5_46", "source": "dblp", "result_id": "dblp:doi:10.1007/978-3-031-09342-5_46"}, {"title": "Applying Machine Learning to Arsenic Species and Metallomics Profiles of Toenails to Evaluate Associations of Environmental Arsenic with Incident Cancer Cases", "authors": ["Sheida Majouni", "Jong Sung Kim", "Ellen Sweeney", "Erin Keltie", "Syed Sibte Raza Abidi"], "year": 2022, "publication": "MIE", "link": "https://doi.org/10.3233/SHTI220385", "snippet": "MIE, 2022, 10.3233/shti220385", "source": "dblp", "result_id": "dblp:doi:10.3233/shti220385"}, {"title": "Decision support for comorbid conditions via execution-time integration of clinical guidelines using transaction-based semantics and temporal planning", "authors": ["William Van Woensel", "Syed Sibte Raza Abidi", "Samina Raza Abidi"], "year": 2021, "publication": "Artif. Intell. Medicine", "link": "https://doi.org/10.1016/j.artmed.2021.102127", "snippet": "Artif. Intell. Medicine, 2021, 10.1016/j.artmed.2021.102127", "source": "dblp", "result_id": "dblp:doi:10.1016/j.artmed.2021.102127"}, {"title": "Semantic Web Framework to Computerize Staged Reflex Testing Protocols to Mitigate Underutilization of Pathology Tests for Diagnosing Pituitary Disorders", "authors": ["William Van Woensel", "Manal Elnenaei", "Syed Ali Imran", "Syed Sibte Raza Abidi"], "year": 2021, "publication": "AIME", "link": "https://doi.org/10.1007/978-3-030-77211-6_13", "snippet": "AIME, 2021, 10.1007/978-3-030-77211-6_13", "source": "dblp", "result_id": "dblp:doi:10.1007/978-3-030-77211-6_13"}, {"title": "A Framework To Build A Causal Knowledge Graph for Chronic Diseases and Cancers By Discovering Semantic Associations from Biomedical Literature", "authors": ["Ali Daowd", "Michael Barrett", "Samina Abidi", "Syed Sibte Raza Abidi"], "year": 2021, "publication": "ICHI", "link": "https://doi.org/10.1109/ICHI52183.2021.00016", "snippet": "ICHI, 2021, 10.1109/ichi52183.2021.00016", "source": "dblp", "result_id": "dblp:doi:10.1109/ichi52183.2021.00016"}, {"title": "Towards an Adaptive Clinical Transcription System for In-Situ Transcribing of Patient Encounter Information", "authors": ["William Van Woensel", "Brett Taylor", "Syed Sibte Raza Abidi"], "year": 2021, "publication": "MedInfo", "link": "https://doi.org/10.3233/SHTI220052", "snippet": "MedInfo, 2021, 10.3233/shti220052", "source": "dblp", "result_id": "dblp:doi:10.3233/shti220052"}, {"title": "A Knowledge Graph of Mechanistic Associations Between COVID-19, Diabetes Mellitus, and Chronic Kidney Disease", "authors": ["Michael Barrett", "Syed Sibte Raza Abidi", "Ali Daowd", "Samina Abidi"], "year": 2021, "publication": "MedInfo", "link": "https://doi.org/10.3233/SHTI220084", "snippet": "MedInfo, 2021, 10.3233/shti220084", "source": "dblp", "result_id": "dblp:doi:10.3233/shti220084"}, {"title": "Using Interactive Visual Analytics to Optimize Blood Products Inventory at a Blood Bank", "authors": ["Jaber Rad", "Jason G. Quinn", "Calvino Cheng", "Robert Liwski", "Samina Abidi", "Syed Sibte Raza Abidi"], "year": 2021, "publication": "MedInfo", "link": "https://doi.org/10.3233/SHTI220142", "snippet": "MedInfo, 2021, 10.3233/shti220142", "source": "dblp", "result_id": "dblp:doi:10.3233/shti220142"}, {"title": "Analyzing Association Rules for Graft Failure Following Deceased and Live Donor Kidney Transplantation", "authors": ["Syed Asil Ali Naqvi", "Karthik K. Tennankore", "Amanda Vinson", "Syed Sibte Raza Abidi"], "year": 2021, "publication": "MIE", "link": "https://doi.org/10.3233/SHTI210146", "snippet": "MIE, 2021, 10.3233/shti210146", "source": "dblp", "result_id": "dblp:doi:10.3233/shti210146"}, {"title": "Using Interactive Visual Analytics to Optimize in Real-Time Blood Products Inventory at a Blood Bank", "authors": ["Jaber Rad", "Jason G. Quinn", "Calvino Cheng", "Robert Liwski", "Samina Raza Abidi", "Syed Sibte Raza Abidi"], "year": 2021, "publication": "MIE", "link": "https://doi.org/10.3233/SHTI210153", "snippet": "MIE, 2021, 10.3233/shti210153", "source": "dblp", "result_id": "dblp:doi:10.3233/shti210153"}, {"title": "A Knowledge Graph of Mechanistic Associations Between COVID-19, Diabetes Mellitus and Kidney Diseases", "authors": ["Michael Barrett", "Ali Daowd", "Syed Sibte Raza Abidi", "Samina Abidi"], "year": 2021, "publication": "MIE", "link": "https://doi.org/10.3233/SHTI210187", "snippet": "MIE, 2021, 10.3233/shti210187", "source": "dblp", "result_id": "dblp:doi:10.3233/shti210187"}, {"title": "Using Knowledge Graphs to Plausibly Infer Missing Associations in EMR Data", "authors": ["William Van Woensel", "Chad Armstrong", "Malavan Rajaratnam", "Vaibhav Gupta", "Syed Sibte Raza Abidi"], "year": 2021, "publication": "MIE", "link": "https://doi.org/10.3233/SHTI210192", "snippet": "MIE, 2021, 10.3233/shti210192", "source": "dblp", "result_id": "dblp:doi:10.3233/shti210192"}, {"title": "Building a Knowledge Graph Representing Causal Associations Between Risk Factors and Incidence of Breast Cancer", "authors": ["Ali Daowd", "Michael Barrett", "Samina Abidi", "Syed Sibte Raza Abidi"], "year": 2021, "publication": "MIE", "link": "https://doi.org/10.3233/SHTI210267", "snippet": "MIE, 2021, 10.3233/shti210267", "source": "dblp", "result_id": "dblp:doi:10.3233/shti210267"}, {"title": "Ontology-Based Personalized Cognitive Behavioural Plans for Patients with Mild Depression", "authors": ["Aditi Nair", "Syed Sibte Raza Abidi", "William Van Woensel", "Samina Abidi"], "year": 2021, "publication": "MIE", "link": "https://doi.org/10.3233/SHTI210268", "snippet": "MIE, 2021, 10.3233/shti210268", "source": "dblp", "result_id": "dblp:doi:10.3233/shti210268"}, {"title": "Towards Model-Driven Semantic Interfaces for Electronic Health Records on Multiple Platforms Using Notation3", "authors": ["William Van Woensel", "Samina Abidi", "Syed Sibte Raza Abidi"], "year": 2021, "publication": "SWH@ISWC", "link": "https://ceur-ws.org/Vol-3055/paper4.pdf", "snippet": "SWH@ISWC, 2021", "source": "dblp", "result_id": "dblp:towards_model_driven_semantic_interfaces_for_electronic_health_r"}, {"title": "Indoor location identification of patients for directing virtual care: An AI approach using machine learning and knowledge-based methods", "authors": ["William Van Woensel", "Patrice C. Roy", "Syed Sibte Raza Abidi", "Samina Raza Abidi"], "year": 2020, "publication": "Artif. Intell. Medicine", "link": "https://doi.org/10.1016/j.artmed.2020.101931", "snippet": "Artif. Intell. Medicine, 2020, 10.1016/j.artmed.2020.101931", "source": "dblp", "result_id": "dblp:doi:10.1016/j.artmed.2020.101931"}, {"title": "An AI-Driven Predictive Modelling Framework to Analyze and Visualize Blood Product Transactional Data for Reducing Blood Products' Discards", "authors": ["Jaber Rad", "Calvino Cheng", "Jason G. Quinn", "Samina Abidi", "Robert Liwski", "Syed Sibte Raza Abidi"], "year": 2020, "publication": "AIME", "link": "https://doi.org/10.1007/978-3-030-59137-3_18", "snippet": "AIME, 2020, 10.1007/978-3-030-59137-3_18", "source": "dblp", "result_id": "dblp:doi:10.1007/978-3-030-59137-3_18"}, {"title": "A CIG Integration Framework to Provide Decision Support for Comorbid Conditions Using Transaction-Based Semantics and Temporal Planning", "authors": ["William Van Woensel", "Samina Abidi", "Borna Jafarpour", "Syed Sibte Raza Abidi"], "year": 2020, "publication": "AIME", "link": "https://doi.org/10.1007/978-3-030-59137-3_39", "snippet": "AIME, 2020, 10.1007/978-3-030-59137-3_39", "source": "dblp", "result_id": "dblp:doi:10.1007/978-3-030-59137-3_39"}, {"title": "Execution-time integration of clinical practice guidelines to provide decision support for comorbid conditions", "authors": ["Borna Jafarpour", "Samina Raza Abidi", "William Van Woensel", "Syed Sibte Raza Abidi"], "year": 2019, "publication": "Artif. Intell. Medicine", "link": "https://doi.org/10.1016/j.artmed.2019.02.003", "snippet": "Artif. Intell. Medicine, 2019, 10.1016/j.artmed.2019.02.003", "source": "dblp", "result_id": "dblp:doi:10.1016/j.artmed.2019.02.003"}, {"title": "Benchmarking semantic reasoning on mobile platforms: Towards optimization using OWL2 RL", "authors": ["William Van Woensel", "Syed Sibte Raza Abidi"], "year": 2019, "publication": "Semantic Web", "link": "https://doi.org/10.3233/SW-180315", "snippet": "Semantic Web, 2019, 10.3233/sw-180315", "source": "dblp", "result_id": "dblp:doi:10.3233/sw-180315"}, {"title": "Mobile Indoor Localization with Bluetooth Beacons in a Pediatric Emergency Department Using Clustering, Rule-Based Classification and High-Level Heuristics", "authors": ["Patrice C. Roy", "William Van Woensel", "Andrew Wilcox", "Syed Sibte Raza Abidi"], "year": 2019, "publication": "AIME", "link": "https://doi.org/10.1007/978-3-030-21642-9_27", "snippet": "AIME, 2019, 10.1007/978-3-030-21642-9_27", "source": "dblp", "result_id": "dblp:doi:10.1007/978-3-030-21642-9_27"}, {"title": "AI-Driven Pathology Laboratory Utilization Management via Data- and Knowledge-Based Analytics", "authors": ["Syed Sibte Raza Abidi", "Jaber Rad", "Ashraf Abusharekh", "Patrice C. Roy", "William Van Woensel", "Samina Raza Abidi", "Calvino Cheng", "Bryan Crocker", "Manal Elnenaei"], "year": 2019, "publication": "AIME", "link": "https://doi.org/10.1007/978-3-030-21642-9_30", "snippet": "AIME, 2019, 10.1007/978-3-030-21642-9_30", "source": "dblp", "result_id": "dblp:doi:10.1007/978-3-030-21642-9_30"}, {"title": "A Digital Health Platform to Deliver Tailored Early Stimulation Programs for Children with Developmental Delays", "authors": ["Raquel da Luz Dias", "Marcela Raquel de Oliveira Lima", "Jo\u00e3o Guilherme Bezerra Alves", "William Van Woensel", "Asil Naqvi", "Zahra Take", "Syed Sibte Raza Abidi"], "year": 2019, "publication": "MedInfo", "link": "https://doi.org/10.3233/SHTI190287", "snippet": "MedInfo, 2019, 10.3233/shti190287", "source": "dblp", "result_id": "dblp:doi:10.3233/shti190287"}, {"title": "Providing Comorbid Decision Support via the Integration of Clinical Practice Guidelines at Execution-Time by Leveraging Medical Linked Open Datasets", "authors": ["William Van Woensel", "Samina Abidi", "Borna Jafarpour", "Syed Sibte Raza Abidi"], "year": 2019, "publication": "MedInfo", "link": "https://doi.org/10.3233/SHTI190345", "snippet": "MedInfo, 2019, 10.3233/shti190345", "source": "dblp", "result_id": "dblp:doi:10.3233/shti190345"}, {"title": "Proactively Guiding Patients Through ADL via Knowledge-Based and Context-Driven Activity Recognition", "authors": ["William Van Woensel", "Samina Abidi", "Syed Sibte Raza Abidi"], "year": 2019, "publication": "MedInfo", "link": "https://doi.org/10.3233/SHTI190346", "snippet": "MedInfo, 2019, 10.3233/shti190346", "source": "dblp", "result_id": "dblp:doi:10.3233/shti190346"}, {"title": "Towards Personalized Lifetime Health: A Platform for Early Multimorbid Chronic Disease Risk Assessment and Mitigation", "authors": ["Ali Daowd", "Syed Faizan", "Samina Abidi", "Ashraf Abusharekh", "Aaqib Shehzad", "Syed Sibte Raza Abidi"], "year": 2019, "publication": "MedInfo", "link": "https://doi.org/10.3233/SHTI190361", "snippet": "MedInfo, 2019, 10.3233/shti190361", "source": "dblp", "result_id": "dblp:doi:10.3233/shti190361"}, {"title": "Using an Artificial Intelligence-Based Argument Theory to Generate Automated Patient Education Dialogues for Families of Children with Juvenile Idiopathic Arthritis", "authors": ["Benjamin Rose-Davis", "William Van Woensel", "Elizabeth Stringer", "Samina Abidi", "Syed Sibte Raza Abidi"], "year": 2019, "publication": "MedInfo", "link": "https://doi.org/10.3233/SHTI190444", "snippet": "MedInfo, 2019, 10.3233/shti190444", "source": "dblp", "result_id": "dblp:doi:10.3233/shti190444"}, {"title": "A Data Mining Framework for Glaucoma Decision Support Based on Optic Nerve Image Analysis Using Machine Learning Methods", "authors": ["Syed Sibte Raza Abidi", "Patrice C. Roy", "Muhammad S. Shah", "Jin Yu", "Sanjun Yan"], "year": 2018, "publication": "J. Heal. Informatics Res.", "link": "https://doi.org/10.1007/s41666-018-0028-7", "snippet": "J. Heal. Informatics Res., 2018, 10.1007/s41666-018-0028-7", "source": "dblp", "result_id": "dblp:doi:10.1007/s41666-018-0028-7"}, {"title": "Optimizing Semantic Reasoning on Memory-Constrained Platforms Using the RETE Algorithm", "authors": ["William Van Woensel", "Syed Sibte Raza Abidi"], "year": 2018, "publication": "ESWC", "link": "https://doi.org/10.1007/978-3-319-93417-4_44", "snippet": "ESWC, 2018, 10.1007/978-3-319-93417-4_44", "source": "dblp", "result_id": "dblp:doi:10.1007/978-3-319-93417-4_44"}, {"title": "Interactive Dialogue-Based Patient Education for Juvenile Idiopathic Arthritis Using Argument Theory", "authors": ["Benjamin Rose-Davis", "Elizabeth Stringer", "Samina Abidi", "Syed Sibte Raza Abidi"], "year": 2018, "publication": "MIE", "link": "https://doi.org/10.3233/978-1-61499-852-5-546", "snippet": "MIE, 2018, 10.3233/978-1-61499-852-5-546", "source": "dblp", "result_id": "dblp:doi:10.3233/978-1-61499-852-5-546"}, {"title": "A Mobile Early Stimulation Program to Support Children with Developmental Delays in Brazil", "authors": ["Raquel da Luz Dias", "K\u00e1tia Cristina Correa Guimar\u00e3es Silva", "Marcela Raquel de Oliveira Lima", "Jo\u00e3o Guilherme Bezerra Alves", "Syed Sibte Raza Abidi"], "year": 2018, "publication": "MIE", "link": "https://doi.org/10.3233/978-1-61499-852-5-785", "snippet": "MIE, 2018, 10.3233/978-1-61499-852-5-785", "source": "dblp", "result_id": "dblp:doi:10.3233/978-1-61499-852-5-785"}, {"title": "A Personalized Risk Stratification Platform for Population Lifetime Healthcare", "authors": ["Ali Daowd", "Samina Raza Abidi", "Ashraf Abusharekh", "Syed Sibte Raza Abidi"], "year": 2018, "publication": "MIE", "link": "https://doi.org/10.3233/978-1-61499-852-5-920", "snippet": "MIE, 2018, 10.3233/978-1-61499-852-5-920", "source": "dblp", "result_id": "dblp:doi:10.3233/978-1-61499-852-5-920"}, {"title": "Investigating Plausible Reasoning Over Knowledge Graphs for Semantics-Based Health Data Analytics", "authors": ["Hossein Mohammadhassanzadeh", "Samina Raza Abidi", "William Van Woensel", "Syed Sibte Raza Abidi"], "year": 2018, "publication": "WETICE", "link": "https://doi.org/10.1109/WETICE.2018.00035", "snippet": "WETICE, 2018, 10.1109/wetice.2018.00035", "source": "dblp", "result_id": "dblp:doi:10.1109/wetice.2018.00035"}, {"title": "Semantics-based plausible reasoning to extend the knowledge coverage of medical knowledge bases for improved clinical decision support", "authors": ["Hossein Mohammadhassanzadeh", "William Van Woensel", "Samina Raza Abidi", "Syed Sibte Raza Abidi"], "year": 2017, "publication": "BioData Min.", "link": "https://doi.org/10.1186/s13040-017-0123-y", "snippet": "BioData Min., 2017, 10.1186/s13040-017-0123-y", "source": "dblp", "result_id": "dblp:doi:10.1186/s13040-017-0123-y"}, {"title": "Leveraging medical taxonomies to improve knowledge management within online communities of practice: The knowledge maps system", "authors": ["Samuel Alan Stewart", "Syed Sibte Raza Abidi"], "year": 2017, "publication": "Comput. Methods Programs Biomed.", "link": "https://doi.org/10.1016/j.cmpb.2017.03.003", "snippet": "Comput. Methods Programs Biomed., 2017, 10.1016/j.cmpb.2017.03.003", "source": "dblp", "result_id": "dblp:doi:10.1016/j.cmpb.2017.03.003"}, {"title": "Protocol-Driven Decision Support within e-Referral Systems to Streamline Patient Consultation, Triaging and Referrals from Primary Care to Specialist Clinics", "authors": ["Ehsan Maghsoud-Lou", "Sean Christie", "Samina Raza Abidi", "Syed Sibte Raza Abidi"], "year": 2017, "publication": "J. Medical Syst.", "link": "https://doi.org/10.1007/s10916-017-0791-7", "snippet": "J. Medical Syst., 2017, 10.1007/s10916-017-0791-7", "source": "dblp", "result_id": "dblp:doi:10.1007/s10916-017-0791-7"}, {"title": "Possibilistic activity recognition with uncertain observations to support medication adherence in an assisted ambient living setting", "authors": ["Patrice C. Roy", "Samina Raza Abidi", "Syed Sibte Raza Abidi"], "year": 2017, "publication": "Knowl. Based Syst.", "link": "https://doi.org/10.1016/j.knosys.2017.07.008", "snippet": "Knowl. Based Syst., 2017, 10.1016/j.knosys.2017.07.008", "source": "dblp", "result_id": "dblp:doi:10.1016/j.knosys.2017.07.008"}, {"title": "SeDAn: a Plausible Reasoning Approach for Semantics-based Data Analytics in Healthcare", "authors": ["Hossein Mohammadhassanzadeh", "Samina Raza Abidi", "Mohammad Salman Shah", "Mehdi Karamollahi", "Syed Sibte Raza Abidi"], "year": 2017, "publication": "WAIAH@AI*IA", "link": "https://ceur-ws.org/Vol-1982/paper7.pdf", "snippet": "WAIAH@AI*IA, 2017", "source": "dblp", "result_id": "dblp:sedan_a_plausible_reasoning_approach_for_semantics_based_data_an"}, {"title": "A Semantic Web Framework for Behavioral User Modeling and Action Planning for Personalized Behavior Modification", "authors": ["William Van Woensel", "Wasif Baig", "Syed Sibte Raza Abidi", "Samina Abidi"], "year": 2017, "publication": "SWAT4LS", "link": "https://ceur-ws.org/Vol-2042/paper21.pdf", "snippet": "SWAT4LS, 2017", "source": "dblp", "result_id": "dblp:a_semantic_web_framework_for_behavioral_user_modeling_and_action"}, {"title": "Achieving Pro-Active Guidance of Patients through ADL using Knowledge-Driven Activity Recognition and Complex Semantic Workflows", "authors": ["William Van Woensel", "Patrice C. Roy", "Syed Sibte Raza Abidi"], "year": 2017, "publication": "SWAT4LS", "link": "https://ceur-ws.org/Vol-2042/paper22.pdf", "snippet": "SWAT4LS, 2017", "source": "dblp", "result_id": "dblp:achieving_pro_active_guidance_of_patients_through_adl_using_know"}, {"title": "Exploiting Semantic Web Technologies to Develop OWL-Based Clinical Practice Guideline Execution Engines", "authors": ["Borna Jafarpour", "Samina Raza Abidi", "Syed Sibte Raza Abidi"], "year": 2016, "publication": "IEEE J. Biomed. Health Informatics", "link": "https://doi.org/10.1109/JBHI.2014.2383840", "snippet": "IEEE J. Biomed. Health Informatics, 2016, 10.1109/jbhi.2014.2383840", "source": "dblp", "result_id": "dblp:doi:10.1109/jbhi.2014.2383840"}, {"title": "A Predictive Model for Personalized Therapeutic Interventions in Non-small Cell Lung Cancer", "authors": ["Nelofar Kureshi", "Syed Sibte Raza Abidi", "Christian Blouin"], "year": 2016, "publication": "IEEE J. Biomed. Health Informatics", "link": "https://doi.org/10.1109/JBHI.2014.2377517", "snippet": "IEEE J. Biomed. Health Informatics, 2016, 10.1109/jbhi.2014.2377517", "source": "dblp", "result_id": "dblp:doi:10.1109/jbhi.2014.2377517"}, {"title": "A semantic web-based approach to plausible reasoning for improving clinical knowledge engineering", "authors": ["Hossein Mohammadhassanzadeh", "William Van Woensel", "Samina Raza Abidi", "Syed Sibte Raza Abidi"], "year": 2016, "publication": "BHI", "link": "https://doi.org/10.1109/BHI.2016.7455950", "snippet": "BHI, 2016, 10.1109/bhi.2016.7455950", "source": "dblp", "result_id": "dblp:doi:10.1109/bhi.2016.7455950"}, {"title": "Transcription of Case Report Forms from Unstructured Referral Letters: A Semantic Text Analytics Approach", "authors": ["Syed Sibte Raza Abidi", "Abhinav Kumar Singh", "Sean Christie"], "year": 2016, "publication": "MIE", "link": "https://doi.org/10.3233/978-1-61499-678-1-322", "snippet": "MIE, 2016, 10.3233/978-1-61499-678-1-322", "source": "dblp", "result_id": "dblp:doi:10.3233/978-1-61499-678-1-322"}, {"title": "An Ontological Model of Behaviour Theory to Generate Personalized Action Plans to Modify Behaviours", "authors": ["Wasif Baig", "Samina Raza Abidi", "Syed Sibte Raza Abidi"], "year": 2016, "publication": "MIE", "link": "https://doi.org/10.3233/978-1-61499-678-1-399", "snippet": "MIE, 2016, 10.3233/978-1-61499-678-1-399", "source": "dblp", "result_id": "dblp:doi:10.3233/978-1-61499-678-1-399"}, {"title": "A Digital Health System to Assist Family Physicians to Safely Prescribe NOAC Medications", "authors": ["Samina Raza Abidi", "Jafna Cox", "Ashraf Abusharekh", "Nima Hashemian", "Syed Sibte Raza Abidi"], "year": 2016, "publication": "MIE", "link": "https://doi.org/10.3233/978-1-61499-678-1-519", "snippet": "MIE, 2016, 10.3233/978-1-61499-678-1-519", "source": "dblp", "result_id": "dblp:doi:10.3233/978-1-61499-678-1-519"}, {"title": "SmartRL: A Context-Sensitive, Ontology-Based Rule Language for Assisted Living in Smart Environments", "authors": ["William Van Woensel", "Patrice C. Roy", "Syed Sibte Raza Abidi"], "year": 2016, "publication": "RuleML", "link": "https://doi.org/10.1007/978-3-319-42019-6_22", "snippet": "RuleML, 2016, 10.1007/978-3-319-42019-6_22", "source": "dblp", "result_id": "dblp:doi:10.1007/978-3-319-42019-6_22"}, {"title": "H-DRIVE: A Big Health Data Analytics Platform for Evidence-Informed Decision Making", "authors": ["Ashraf Abusharekh", "Samuel Alan Stewart", "Nima Hashemian", "Syed Sibte Raza Abidi"], "year": 2015, "publication": "BigData Congress", "link": "https://doi.org/10.1109/BigDataCongress.2015.68", "snippet": "BigData Congress, 2015, 10.1109/bigdatacongress.2015.68", "source": "dblp", "result_id": "dblp:doi:10.1109/bigdatacongress.2015.68"}, {"title": "Towards a 'Big' Health Data Analytics Platform", "authors": ["Sangwhan Cha", "Ashraf Abusharekh", "Syed Sibte Raza Abidi"], "year": 2015, "publication": "BigDataService", "link": "https://doi.org/10.1109/BigDataService.2015.13", "snippet": "BigDataService, 2015, 10.1109/bigdataservice.2015.13", "source": "dblp", "result_id": "dblp:doi:10.1109/bigdataservice.2015.13"}, {"title": "A Mobile and Intelligent Patient Diary for Chronic Disease Self-Management", "authors": ["William Van Woensel", "Patrice C. Roy", "Samina Raza Abidi", "Syed Sibte Raza Abidi"], "year": 2015, "publication": "MedInfo", "link": "https://doi.org/10.3233/978-1-61499-564-7-118", "snippet": "MedInfo, 2015, 10.3233/978-1-61499-564-7-118", "source": "dblp", "result_id": "dblp:doi:10.3233/978-1-61499-564-7-118"}, {"title": "INITIATE: An Intelligent Adaptive Alert Environment", "authors": ["Borna Jafarpour", "Samina Raza Abidi", "Ahmad Marwan Ahmad", "Syed Sibte Raza Abidi"], "year": 2015, "publication": "MedInfo", "link": "https://doi.org/10.3233/978-1-61499-564-7-285", "snippet": "MedInfo, 2015, 10.3233/978-1-61499-564-7-285", "source": "dblp", "result_id": "dblp:doi:10.3233/978-1-61499-564-7-285"}, {"title": "Multi-Strategy Semantic Web Reasoning for Medical Knowledge Bases", "authors": ["William Van Woensel", "Hossein Mohammadhassanzadeh", "Samina Raza Abidi", "Syed Sibte Raza Abidi"], "year": 2015, "publication": "BDM2I@ISWC", "link": "https://ceur-ws.org/Vol-1428/BDM2I_2015_paper_8.pdf", "snippet": "BDM2I@ISWC, 2015", "source": "dblp", "result_id": "dblp:multi_strategy_semantic_web_reasoning_for_medical_knowledge_base"}, {"title": "A multi-phase correlation search framework for mining non-taxonomic relations from unstructured text", "authors": ["Mei Kuan Wong", "Syed Sibte Raza Abidi", "Ian D. Jonsen"], "year": 2014, "publication": "Knowl. Inf. Syst.", "link": "https://doi.org/10.1007/s10115-012-0593-7", "snippet": "Knowl. Inf. Syst., 2014, 10.1007/s10115-012-0593-7", "source": "dblp", "result_id": "dblp:doi:10.1007/s10115-012-0593-7"}, {"title": "Integrating existing large scale medical laboratory data into the semantic web framework", "authors": ["Newres Al Haider", "Samina Raza Abidi", "William Van Woensel", "Syed Sibte Raza Abidi"], "year": 2014, "publication": "IEEE BigData", "link": "https://doi.org/10.1109/BigData.2014.7004338", "snippet": "IEEE BigData, 2014, 10.1109/bigdata.2014.7004338", "source": "dblp", "result_id": "dblp:doi:10.1109/bigdata.2014.7004338"}, {"title": "Clinical Guideline-Driven Personalized Self-Management Diary for Paediatric Cancer Survivors", "authors": ["Samuel Alan Stewart", "Samina Raza Abidi", "Louise Parker", "Mark Bernstein", "Syed Sibte Raza Abidi"], "year": 2014, "publication": "MIE", "link": "https://doi.org/10.3233/978-1-61499-432-9-18", "snippet": "MIE, 2014, 10.3233/978-1-61499-432-9-18", "source": "dblp", "result_id": "dblp:doi:10.3233/978-1-61499-432-9-18"}, {"title": "Shared Decision Making: Using Theories and Technology to Engage the Patient in Their Health Journey", "authors": ["Amina Russell", "Samina Raza Abidi", "Syed Sibte Raza Abidi"], "year": 2014, "publication": "MIE", "link": "https://doi.org/10.3233/978-1-61499-432-9-303", "snippet": "MIE, 2014, 10.3233/978-1-61499-432-9-303", "source": "dblp", "result_id": "dblp:doi:10.3233/978-1-61499-432-9-303"}, {"title": "A Cross-Platform Benchmark Framework for Mobile Semantic Web Reasoning Engines", "authors": ["William Van Woensel", "Newres Al Haider", "Ahmad Marwan Ahmad", "Syed Sibte Raza Abidi"], "year": 2014, "publication": "ISWC (1)", "link": "https://doi.org/10.1007/978-3-319-11964-9_25", "snippet": "ISWC (1), 2014, 10.1007/978-3-319-11964-9_25", "source": "dblp", "result_id": "dblp:doi:10.1007/978-3-319-11964-9_25"}, {"title": "A Comparison of Mobile Rule Engines for Reasoning on Semantic Web Based Health Data", "authors": ["William Van Woensel", "Newres Al Haider", "Patrice C. Roy", "Ahmad Marwan Ahmad", "Syed Sibte Raza Abidi"], "year": 2014, "publication": "WI-IAT (2)", "link": "https://doi.org/10.1109/WI-IAT.2014.25", "snippet": "WI-IAT (2), 2014, 10.1109/wi-iat.2014.25", "source": "dblp", "result_id": "dblp:doi:10.1109/wi-iat.2014.25"}, {"title": "Web Service Matchmaking Using a Hybrid of Signature and Specification Matching Methods", "authors": ["Syed Sibte Raza Abidi", "Ali Daniyal", "Syed Farrukh Mehdi"], "year": 2014, "publication": "WI-IAT (1)", "link": "https://doi.org/10.1109/WI-IAT.2014.107", "snippet": "WI-IAT (1), 2014, 10.1109/wi-iat.2014.107", "source": "dblp", "result_id": "dblp:doi:10.1109/wi-iat.2014.107"}, {"title": "Merging Disease-Specific Clinical Guidelines to Handle Comorbidities in a Clinical Decision Support Setting", "authors": ["Borna Jafarpour", "Syed Sibte Raza Abidi"], "year": 2013, "publication": "AIME", "link": "https://doi.org/10.1007/978-3-642-38326-7_5", "snippet": "AIME, 2013, 10.1007/978-3-642-38326-7_5", "source": "dblp", "result_id": "dblp:doi:10.1007/978-3-642-38326-7_5"}, {"title": "An Ontology-Driven Personalization Framework for Designing Theory-Driven Self-management Interventions", "authors": ["Syed Sibte Raza Abidi", "Samina Raza Abidi"], "year": 2013, "publication": "KR4HC/ProHealth", "link": "https://doi.org/10.1007/978-3-319-03916-9_8", "snippet": "KR4HC/ProHealth, 2013, 10.1007/978-3-319-03916-9_8", "source": "dblp", "result_id": "dblp:doi:10.1007/978-3-319-03916-9_8"}, {"title": "A Semantic Web Based Ontology Mapping and Instance Transformation Framework", "authors": ["Borna Jafarpour", "Syed Sibte Raza Abidi"], "year": 2013, "publication": "CSWS", "link": "https://ceur-ws.org/Vol-1054/paper-03.pdf", "snippet": "CSWS, 2013", "source": "dblp", "result_id": "dblp:a_semantic_web_based_ontology_mapping_and_instance_transformatio"}, {"title": "Dataflow Oriented Similarity Matching for Scientific Workflows", "authors": ["Philip Yeo", "Syed Sibte Raza Abidi"], "year": 2013, "publication": "IPDPS Workshops", "link": "https://doi.org/10.1109/IPDPSW.2013.69", "snippet": "IPDPS Workshops, 2013, 10.1109/ipdpsw.2013.69", "source": "dblp", "result_id": "dblp:doi:10.1109/ipdpsw.2013.69"}, {"title": "Usability Evaluation of Family Physicians' Interaction with the Comorbidity Ontological Modeling and ExecuTion System (COMET)", "authors": ["Samina Raza Abidi", "Samuel Alan Stewart", "Michael A. Shepherd", "Syed Sibte Raza Abidi"], "year": 2013, "publication": "MedInfo", "link": "https://doi.org/10.3233/978-1-61499-289-9-447", "snippet": "MedInfo, 2013, 10.3233/978-1-61499-289-9-447", "source": "dblp", "result_id": "dblp:doi:10.3233/978-1-61499-289-9-447"}, {"title": "An Infobutton For Web 2.0 Clinical Discussions: The Knowledge Linkage Framework", "authors": ["Samuel Alan Stewart", "Syed Sibte Raza Abidi"], "year": 2012, "publication": "IEEE Trans. Inf. Technol. Biomed.", "link": "https://doi.org/10.1109/TITB.2011.2177097", "snippet": "IEEE Trans. Inf. Technol. Biomed., 2012, 10.1109/titb.2011.2177097", "source": "dblp", "result_id": "dblp:doi:10.1109/titb.2011.2177097"}, {"title": "An ontological modeling approach to align institution-specific Clinical Pathways: Towards inter-institution care standardization", "authors": ["Samina Raza Abidi", "Syed Sibte Raza Abidi"], "year": 2012, "publication": "CBMS", "link": "https://doi.org/10.1109/CBMS.2012.6266392", "snippet": "CBMS, 2012, 10.1109/cbms.2012.6266392", "source": "dblp", "result_id": "dblp:doi:10.1109/cbms.2012.6266392"}, {"title": "Modeling clinical workflows using business process modeling notation", "authors": ["Nima Hashemian", "Syed Sibte Raza Abidi"], "year": 2012, "publication": "CBMS", "link": "https://doi.org/10.1109/CBMS.2012.6266322", "snippet": "CBMS, 2012, 10.1109/cbms.2012.6266322", "source": "dblp", "result_id": "dblp:doi:10.1109/cbms.2012.6266322"}, {"title": "Using OWL Ontologies for Clinical Guidelines Based Comorbid Decision Support", "authors": ["Samina Raza Abidi", "Jafna Cox", "Syed Sibte Raza Abidi", "Michael A. Shepherd"], "year": 2012, "publication": "HICSS", "link": "https://doi.org/10.1109/HICSS.2012.629", "snippet": "HICSS, 2012, 10.1109/hicss.2012.629", "source": "dblp", "result_id": "dblp:doi:10.1109/hicss.2012.629"}, {"title": "Comparing Metamap to MGrep as a Tool for Mapping Free Text to Formal Medical Lexions", "authors": ["Samuel Alan Stewart", "Maia Elizabeth von Maltzahn", "Syed Sibte Raza Abidi"], "year": 2012, "publication": "KECSM@ISWC", "link": "https://ceur-ws.org/Vol-895/paper7.pdf", "snippet": "KECSM@ISWC, 2012", "source": "dblp", "result_id": "dblp:comparing_metamap_to_mgrep_as_a_tool_for_mapping_free_text_to_fo"}, {"title": "Exploiting OWL Reasoning Services to Execute Ontologically-Modeled Clinical Practice Guidelines", "authors": ["Borna Jafarpour", "Samina Raza Abidi", "Syed Sibte Raza Abidi"], "year": 2011, "publication": "AIME", "link": "https://doi.org/10.1007/978-3-642-22218-4_39", "snippet": "AIME, 2011, 10.1007/978-3-642-22218-4_39", "source": "dblp", "result_id": "dblp:doi:10.1007/978-3-642-22218-4_39"}, {"title": "Understanding Medicine 2.0 - Social Network Analysis and the VECoN System", "authors": ["Samuel Alan Stewart", "Syed Sibte Raza Abidi"], "year": 2011, "publication": "HEALTHINF", "link": "db/conf/biostec/healthinf2011.html#StewartA11", "snippet": "HEALTHINF, 2011", "source": "dblp", "result_id": "dblp:understanding_medicine_2_0_social_network_analysis_and_the_vecon"}, {"title": "Using Social Network Analysis to Study the Knowledge Sharing Patterns of Health Professionals Using Web 2.0 Tools", "authors": ["Samuel Alan Stewart", "Syed Sibte Raza Abidi"], "year": 2011, "publication": "BIOSTEC (Selected Papers)", "link": "https://doi.org/10.1007/978-3-642-29752-6_25", "snippet": "BIOSTEC (Selected Papers), 2011, 10.1007/978-3-642-29752-6_25", "source": "dblp", "result_id": "dblp:doi:10.1007/978-3-642-29752-6_25"}, {"title": "Detecting and Resolving Inconsistencies in Ontologies Using Contradiction Derivations", "authors": ["Sajjad Hussain", "Jos De Roo", "Ali Daniyal", "Syed Sibte Raza Abidi"], "year": 2011, "publication": "COMPSAC", "link": "https://doi.org/10.1109/COMPSAC.2011.76", "snippet": "COMPSAC, 2011, 10.1109/compsac.2011.76", "source": "dblp", "result_id": "dblp:doi:10.1109/compsac.2011.76"}, {"title": "An Ontology-Based Electronic Medical Record for Chronic Disease Management", "authors": ["Ashraf Mohammed Iqbal", "Michael A. Shepherd", "Syed Sibte Raza Abidi"], "year": 2011, "publication": "HICSS", "link": "https://doi.org/10.1109/HICSS.2011.61", "snippet": "HICSS, 2011, 10.1109/hicss.2011.61", "source": "dblp", "result_id": "dblp:doi:10.1109/hicss.2011.61"}, {"title": "Mining Non-taxonomic Concept Pairs from Unstructured Text - A Concept Correlation Search Framework", "authors": ["Mei Kuan Wong", "Syed Sibte Raza Abidi", "Ian D. Jonsen"], "year": 2011, "publication": "WEBIST", "link": "db/conf/webist/webist2011.html#WongAJ11", "snippet": "WEBIST, 2011", "source": "dblp", "result_id": "dblp:mining_non_taxonomic_concept_pairs_from_unstructured_text_a_conc"}, {"title": "A Knowledge-centric e-Research Platform for Marine Life and Oceanographic Research", "authors": ["Ali Daniyal", "Samina Raza Abidi", "Ashraf Abusharekh", "Mei Kuan Wong", "Syed Sibte Raza Abidi"], "year": 2010, "publication": "KMIS", "link": "db/conf/ic3k/kmis2010.html#DaniyalAAWA10", "snippet": "KMIS, 2010", "source": "dblp", "result_id": "dblp:a_knowledge_centric_e_research_platform_for_marine_life_and_ocea"}, {"title": "A Compositional Personalization Approach for Designing Personalized Patient Educational Interventions for Cardiovascular Risk Management", "authors": ["Selena Davis", "Syed Sibte Raza Abidi", "Samuel Alan Stewart"], "year": 2010, "publication": "MedInfo", "link": "https://doi.org/10.3233/978-1-60750-588-4-629", "snippet": "MedInfo, 2010, 10.3233/978-1-60750-588-4-629", "source": "dblp", "result_id": "dblp:doi:10.3233/978-1-60750-588-4-629"}, {"title": "Ontology Based Modeling and Execution of Nursing Care Plans and Practice Guidelines", "authors": ["Muzammil Abdulrehman Din", "Syed Sibte Raza Abidi", "Borna Jafarpour"], "year": 2010, "publication": "MedInfo", "link": "https://doi.org/10.3233/978-1-60750-588-4-1104", "snippet": "MedInfo, 2010, 10.3233/978-1-60750-588-4-1104", "source": "dblp", "result_id": "dblp:doi:10.3233/978-1-60750-588-4-1104"}, {"title": "Pediatric Pain Management Knowledge Linkages: Mapping Experiential Knowledge to Explicit Knowledge", "authors": ["Samuel Alan Stewart", "Syed Sibte Raza Abidi", "G. Allen Finley"], "year": 2010, "publication": "MedInfo", "link": "https://doi.org/10.3233/978-1-60750-588-4-1184", "snippet": "MedInfo, 2010, 10.3233/978-1-60750-588-4-1184", "source": "dblp", "result_id": "dblp:doi:10.3233/978-1-60750-588-4-1184"}, {"title": "A Service Oriented E-Research Platform for Ocean Knowledge Management", "authors": ["Syed Sibte Raza Abidi", "Ashraf Abusharekh", "Ali Daniyal", "Mei Kuan", "Farrukh Mehdi", "Samina Raza Abidi", "Faisal Abbas", "Philip Yeo", "Farhan Jamal", "Reza Fathzadeh"], "year": 2010, "publication": "SERVICES", "link": "https://doi.org/10.1109/SERVICES.2010.19", "snippet": "SERVICES, 2010, 10.1109/services.2010.19", "source": "dblp", "result_id": "dblp:doi:10.1109/services.2010.19"}, {"title": "Extracting and Merging Contextualized Ontology Modules", "authors": ["Sajjad Hussain", "Syed Sibte Raza Abidi"], "year": 2010, "publication": "WoMO", "link": "https://doi.org/10.3233/978-1-60750-544-0-25", "snippet": "WoMO, 2010, 10.3233/978-1-60750-544-0-25", "source": "dblp", "result_id": "dblp:doi:10.3233/978-1-60750-544-0-25"}, {"title": "Towards the Merging of Multiple Clinical Protocols and Guidelines via Ontology-Driven Modeling", "authors": ["Samina Raza Abidi", "Syed Sibte Raza Abidi"], "year": 2009, "publication": "AIME", "link": "https://doi.org/10.1007/978-3-642-02976-9_10", "snippet": "AIME, 2009, 10.1007/978-3-642-02976-9_10", "source": "dblp", "result_id": "dblp:doi:10.1007/978-3-642-02976-9_10"}, {"title": "Semantic Web-Based Modeling of Clinical Pathways Using the UML Activity Diagrams and OWL-S", "authors": ["Ali Daniyal", "Syed Sibte Raza Abidi"], "year": 2009, "publication": "KR4HC", "link": "https://doi.org/10.1007/978-3-642-11808-1_8", "snippet": "KR4HC, 2009, 10.1007/978-3-642-11808-1_8", "source": "dblp", "result_id": "dblp:doi:10.1007/978-3-642-11808-1_8"}, {"title": "Integrating Healthcare Knowledge Artifacts for Clinical Decision Support: Towards Semantic Web Based Healthcare Knowledge Morphing", "authors": ["Sajjad Hussain", "Syed Sibte Raza Abidi"], "year": 2009, "publication": "AIME", "link": "https://doi.org/10.1007/978-3-642-02976-9_23", "snippet": "AIME, 2009, 10.1007/978-3-642-02976-9_23", "source": "dblp", "result_id": "dblp:doi:10.1007/978-3-642-02976-9_23"}, {"title": "Knowledge Sharing for Pediatric Pain Management via a Web 2.0 Framework", "authors": ["Syed Sibte Raza Abidi", "Salah Hussini", "Wimorat Sriraj", "Somboon Thienthong", "G. Allen Finley"], "year": 2009, "publication": "MIE", "link": "https://doi.org/10.3233/978-1-60750-044-5-287", "snippet": "MIE, 2009, 10.3233/978-1-60750-044-5-287", "source": "dblp", "result_id": "dblp:doi:10.3233/978-1-60750-044-5-287"}, {"title": "Computerizing Clinical Pathways: Ontology-Based Modeling and Execution", "authors": ["Ali Daniyal", "Samina Raza Abidi", "Syed Sibte Raza Abidi"], "year": 2009, "publication": "MIE", "link": "https://doi.org/10.3233/978-1-60750-044-5-643", "snippet": "MIE, 2009, 10.3233/978-1-60750-044-5-643", "source": "dblp", "result_id": "dblp:doi:10.3233/978-1-60750-044-5-643"}, {"title": "A Web Recommender System for Recommending, Predicting and Personalizing Music Playlists", "authors": ["Zeina Chedrawy", "Syed Sibte Raza Abidi"], "year": 2009, "publication": "WISE", "link": "https://doi.org/10.1007/978-3-642-04409-0_34", "snippet": "WISE, 2009, 10.1007/978-3-642-04409-0_34", "source": "dblp", "result_id": "dblp:doi:10.1007/978-3-642-04409-0_34"}, {"title": "Operationalizing Prostate Cancer Clinical Pathways: An Ontological Model to Computerize, Merge and Execute Institution-Specific Clinical Pathways", "authors": ["Samina Raza Abidi", "Syed Sibte Raza Abidi", "Lorna Butler", "Sajjad Hussain"], "year": 2008, "publication": "K4HelP", "link": "https://doi.org/10.1007/978-3-642-03262-2_1", "snippet": "K4HelP, 2008, 10.1007/978-3-642-03262-2_1", "source": "dblp", "result_id": "dblp:doi:10.1007/978-3-642-03262-2_1"}, {"title": "Modeling the Form and Function of Clinical Practice Guidelines: An Ontological Model to Computerize Clinical Practice Guidelines", "authors": ["Syed Sibte Raza Abidi", "Shapoor Shayegani"], "year": 2008, "publication": "K4HelP", "link": "https://doi.org/10.1007/978-3-642-03262-2_7", "snippet": "K4HelP, 2008, 10.1007/978-3-642-03262-2_7", "source": "dblp", "result_id": "dblp:doi:10.1007/978-3-642-03262-2_7"}, {"title": "Evaluation of an online discussion forum for emergency practitioners", "authors": ["Janet Curran", "Syed Sibte Raza Abidi"], "year": 2007, "publication": "Health Informatics J.", "link": "https://doi.org/10.1177/1460458207079834", "snippet": "Health Informatics J., 2007, 10.1177/1460458207079834", "source": "dblp", "result_id": "dblp:doi:10.1177/1460458207079834"}, {"title": "Healthcare Knowledge Management: The Art of the Possible", "authors": ["Syed Sibte Raza Abidi"], "year": 2007, "publication": "K4CARE", "link": "https://doi.org/10.1007/978-3-540-78624-5_1", "snippet": "K4CARE, 2007, 10.1007/978-3-540-78624-5_1", "source": "dblp", "result_id": "dblp:doi:10.1007/978-3-540-78624-5_1"}, {"title": "Semantic Web Framework for Knowledge-Centric Clinical Decision Support Systems", "authors": ["Sajjad Hussain", "Samina Raza Abidi", "Syed Sibte Raza Abidi"], "year": 2007, "publication": "AIME", "link": "https://doi.org/10.1007/978-3-540-73599-1_60", "snippet": "AIME, 2007, 10.1007/978-3-540-73599-1_60", "source": "dblp", "result_id": "dblp:doi:10.1007/978-3-540-73599-1_60"}, {"title": "Ontology Engineering to Model Clinical Pathways: Towards the Computerization and Execution of Clinical Pathways", "authors": ["Katrina F. Hurley", "Syed Sibte Raza Abidi"], "year": 2007, "publication": "CBMS", "link": "https://doi.org/10.1109/CBMS.2007.79", "snippet": "CBMS, 2007, 10.1109/cbms.2007.79", "source": "dblp", "result_id": "dblp:doi:10.1109/cbms.2007.79"}, {"title": "Medical Knowledge Morphing via a Semantic Web Framework", "authors": ["Syed Sibte Raza Abidi", "Sajjad Hussain"], "year": 2007, "publication": "CBMS", "link": "https://doi.org/10.1109/CBMS.2007.70", "snippet": "CBMS, 2007, 10.1109/cbms.2007.70", "source": "dblp", "result_id": "dblp:doi:10.1109/cbms.2007.70"}, {"title": "Ontology Driven CPG Authoring and Execution via a Semantic Web Framework", "authors": ["Sajjad Hussain", "Syed Sibte Raza Abidi"], "year": 2007, "publication": "HICSS", "link": "https://doi.org/10.1109/HICSS.2007.408", "snippet": "HICSS, 2007, 10.1109/hicss.2007.408", "source": "dblp", "result_id": "dblp:doi:10.1109/hicss.2007.408"}, {"title": "Ontology-based Modeling of Clinical Practice Guidelines: A Clinical Decision Support System for Breast Cancer Follow-up Interventions at Primary Care Settings", "authors": ["Samina Raza Abidi", "Syed Sibte Raza Abidi", "Sajjad Hussain", "Mike Shepherd"], "year": 2007, "publication": "MedInfo", "link": "https://doi.org/10.3233/978-1-58603-774-1-845", "snippet": "MedInfo, 2007, 10.3233/978-1-58603-774-1-845", "source": "dblp", "result_id": "dblp:doi:10.3233/978-1-58603-774-1-845"}, {"title": "Automated Interpretation of Optic Nerve Images: A Data Mining Framework for Glaucoma Diagnostic Support", "authors": ["Syed Sibte Raza Abidi", "Paul Habib Artes", "Sanjan Yun", "Jin Yu"], "year": 2007, "publication": "MedInfo", "link": "https://doi.org/10.3233/978-1-58603-774-1-1309", "snippet": "MedInfo, 2007, 10.3233/978-1-58603-774-1-1309", "source": "dblp", "result_id": "dblp:doi:10.3233/978-1-58603-774-1-1309"}, {"title": "Information Systems and Health Care IX: Accessing Tacit Knowledge and Linking It to the Peer-Reviewed Literature", "authors": ["Michael A. Shepherd", "Syed Sibte Raza Abidi", "Qigang Gao", "Zhixin Chen", "Quifen Qi", "G. Allen Finley"], "year": 2006, "publication": "Commun. Assoc. Inf. Syst.", "link": "https://doi.org/10.17705/1cais.01740", "snippet": "Commun. Assoc. Inf. Syst., 2006, 10.17705/1cais.01740", "source": "dblp", "result_id": "dblp:doi:10.17705/1cais.01740"}, {"title": "Generating customized yet factually consistent information: a constraint satisfaction approach", "authors": ["Syed Sibte Raza Abidi", "Yong Han Chong", "Yan Zeng"], "year": 2006, "publication": "Int. J. Digit. Libr.", "link": "https://doi.org/10.1007/s00799-006-0003-4", "snippet": "Int. J. Digit. Libr., 2006, 10.1007/s00799-006-0003-4", "source": "dblp", "result_id": "dblp:doi:10.1007/s00799-006-0003-4"}, {"title": "An Adaptive Personalized Recommendation Strategy Featuring Context Sensitive Content Adaptation", "authors": ["Zeina Chedrawy", "Syed Sibte Raza Abidi"], "year": 2006, "publication": "AH", "link": "https://doi.org/10.1007/11768012_8", "snippet": "AH, 2006, 10.1007/11768012_8", "source": "dblp", "result_id": "dblp:doi:10.1007/11768012_8"}, {"title": "Adaptive Patient Education Framework Featuring Personalized Cardiovascular Risk Management Interventions", "authors": ["Selena Davis", "Syed Sibte Raza Abidi"], "year": 2006, "publication": "AH", "link": "https://doi.org/10.1007/11768012_30", "snippet": "AH, 2006, 10.1007/11768012_30", "source": "dblp", "result_id": "dblp:doi:10.1007/11768012_30"}, {"title": "An Adaptive Hypermedia System Using a Constraint Satisfaction Approach for Information Personalization", "authors": ["Syed Sibte Raza Abidi", "Yan Zeng"], "year": 2006, "publication": "AH", "link": "https://doi.org/10.1007/11768012_55", "snippet": "AH, 2006, 10.1007/11768012_55", "source": "dblp", "result_id": "dblp:doi:10.1007/11768012_55"}, {"title": "Intelligent Information Personalization Leveraging Constraint Satisfaction and Association Rule Methods", "authors": ["Syed Sibte Raza Abidi", "Yan Zeng"], "year": 2006, "publication": "Canadian AI", "link": "https://doi.org/10.1007/11766247_12", "snippet": "Canadian AI, 2006, 10.1007/11766247_12", "source": "dblp", "result_id": "dblp:doi:10.1007/11766247_12"}, {"title": "Linking Tacit Knowledge in the Pediatric Pain e-Mail Archives and Explicit Knowledge in PubMed", "authors": ["Zhixin Chen", "Michael A. Shepherd", "Syed Sibte Raza Abidi", "G. Allen Finley"], "year": 2006, "publication": "HICSS", "link": "https://doi.org/10.1109/HICSS.2006.255", "snippet": "HICSS, 2006, 10.1109/hicss.2006.255", "source": "dblp", "result_id": "dblp:doi:10.1109/hicss.2006.255"}, {"title": "Personalized cardiovascular risk management linking SCORE and behaviour change to web-based education", "authors": ["Selena Davis", "Syed Sibte Raza Abidi", "Jafna Cox"], "year": 2006, "publication": "MIE", "link": "https://doi.org/10.3233/978-1-58603-647-8-235", "snippet": "MIE, 2006, 10.3233/978-1-58603-647-8-235", "source": "dblp", "result_id": "dblp:doi:10.3233/978-1-58603-647-8-235"}, {"title": "Evaluation of a Discussion Forum for Knowledge Sharing Among Emergency Practitioners: A Social Network Approach", "authors": ["Janet Curran", "Syed Sibte Raza Abidi"], "year": 2006, "publication": "MIE", "link": "https://doi.org/10.3233/978-1-58603-647-8-941", "snippet": "MIE, 2006, 10.3233/978-1-58603-647-8-941", "source": "dblp", "result_id": "dblp:doi:10.3233/978-1-58603-647-8-941"}, {"title": "Towards a collaborative learning environment for children's pain management: leveraging an online discussion forum", "authors": ["Janet Curran-Smith", "Syed Sibte Raza Abidi", "Paula Forgeron"], "year": 2005, "publication": "Health Informatics J.", "link": "https://doi.org/10.1177/1460458205050682", "snippet": "Health Informatics J., 2005, 10.1177/1460458205050682", "source": "dblp", "result_id": "dblp:doi:10.1177/1460458205050682"}, {"title": "Augmenting GEM-encoded clinical practice guidelines with relevant best evidence autonomously retrieved from MEDLINE", "authors": ["Syed Sibte Raza Abidi", "Michael Kershaw", "Evangelos E. Milios"], "year": 2005, "publication": "Health Informatics J.", "link": "https://doi.org/10.1177/1460458205050684", "snippet": "Health Informatics J., 2005, 10.1177/1460458205050684", "source": "dblp", "result_id": "dblp:doi:10.1177/1460458205050684"}, {"title": "A knowledge creation info-structure to acquire and crystallize the tacit knowledge of health-care experts", "authors": ["Syed Sibte Raza Abidi", "Yu-N Cheah", "Janet Curran-Smith"], "year": 2005, "publication": "IEEE Trans. Inf. Technol. Biomed.", "link": "https://doi.org/10.1109/TITB.2005.847188", "snippet": "IEEE Trans. Inf. Technol. Biomed., 2005, 10.1109/titb.2005.847188", "source": "dblp", "result_id": "dblp:doi:10.1109/titb.2005.847188"}, {"title": "Automated Optic Nerve Analysis for Diagnostic Support in Glaucoma", "authors": ["Jin Yu", "Syed Sibte Raza Abidi", "Paul Habib Artes", "Andrew R. McIntyre", "Malcolm I. Heywood"], "year": 2005, "publication": "CBMS", "link": "https://doi.org/10.1109/CBMS.2005.36", "snippet": "CBMS, 2005, 10.1109/cbms.2005.36", "source": "dblp", "result_id": "dblp:doi:10.1109/cbms.2005.36"}, {"title": "Medical Knowledge Morphing: Towards Case-Specific Integration of Heterogeneous Medical Knowledge Resources", "authors": ["Syed Sibte Raza Abidi"], "year": 2005, "publication": "CBMS", "link": "https://doi.org/10.1109/CBMS.2005.74", "snippet": "CBMS, 2005, 10.1109/cbms.2005.74", "source": "dblp", "result_id": "dblp:doi:10.1109/cbms.2005.74"}, {"title": "BiRD: A Strategy to Autonomously Supplement Clinical Practice Guidelines with Related Clinical Studies", "authors": ["Syed Sibte Raza Abidi", "Michael Kershaw", "Evangelos E. Milios"], "year": 2005, "publication": "HICSS", "link": "https://doi.org/10.1109/HICSS.2005.121", "snippet": "HICSS, 2005, 10.1109/hicss.2005.121", "source": "dblp", "result_id": "dblp:doi:10.1109/hicss.2005.121"}, {"title": "Using Computerized Clinical Practice Guidelines to Generate Tailored Patient Education Materials", "authors": ["Brent Jones", "Syed Sibte Raza Abidi", "Winston Ying"], "year": 2005, "publication": "HICSS", "link": "https://doi.org/10.1109/HICSS.2005.655", "snippet": "HICSS, 2005, 10.1109/hicss.2005.655", "source": "dblp", "result_id": "dblp:doi:10.1109/hicss.2005.655"}, {"title": "An Item-Based Collaborative Filtering Framework Featuring Case Based Reasoning", "authors": ["Zeina Chedrawy", "Syed Sibte Raza Abidi"], "year": 2005, "publication": "IC-AI", "link": "db/conf/icai/icai2005-1.html#ChedrawyA05", "snippet": "IC-AI, 2005", "source": "dblp", "result_id": "dblp:an_item_based_collaborative_filtering_framework_featuring_case_b"}, {"title": "From Clusters to Rules: A Hybrid Framework for Generalized Symbolic Rule Induction", "authors": ["Qingshuang Jiang", "Syed Sibte Raza Abidi"], "year": 2005, "publication": "ICMLC", "link": "https://doi.org/10.1007/11739685_23", "snippet": "ICMLC, 2005, 10.1007/11739685_23", "source": "dblp", "result_id": "dblp:doi:10.1007/11739685_23"}, {"title": "An Intelligent Knowledge Sharing Strategy Featuring Item-Based Collaborative Filtering and Case Based Reasoning", "authors": ["Zeina Chedrawy", "Syed Sibte Raza Abidi"], "year": 2005, "publication": "ISDA", "link": "https://doi.org/10.1109/ISDA.2005.22", "snippet": "ISDA, 2005, 10.1109/isda.2005.22", "source": "dblp", "result_id": "dblp:doi:10.1109/isda.2005.22"}, {"title": "HealthInfoCDA: Case Composition Using Electronic Health Record Data Sources", "authors": ["Grace I. Paterson", "Syed Sibte Raza Abidi", "Steven D. Soroka"], "year": 2005, "publication": "MIE", "link": "http://ebooks.iospress.nl/volumearticle/10289", "snippet": "MIE, 2005", "source": "dblp", "result_id": "dblp:healthinfocda_case_composition_using_electronic_health_record_da"}, {"title": "Diagnostic Support for Glaucoma Using Retinal Images: A Hybrid Image Analysis and Data Mining Approach", "authors": ["Jin Yu", "Syed Sibte Raza Abidi", "Paul Habib Artes", "Andy McIntyre", "Malcolm I. Heywood"], "year": 2005, "publication": "MIE", "link": "http://ebooks.iospress.nl/volumearticle/10298", "snippet": "MIE, 2005", "source": "dblp", "result_id": "dblp:diagnostic_support_for_glaucoma_using_retinal_images_a_hybrid_im"}, {"title": "Analyzing Sub-Classifications of Glaucoma via SOM Based Clustering of Optic Nerve Images", "authors": ["Sanjun Yan", "Syed Sibte Raza Abidi", "Paul Habib Artes"], "year": 2005, "publication": "MIE", "link": "http://ebooks.iospress.nl/volumearticle/10349", "snippet": "MIE, 2005", "source": "dblp", "result_id": "dblp:analyzing_sub_classifications_of_glaucoma_via_som_based_clusteri"}, {"title": "A Knowledge Management Framework to Morph Clinical Cases with Clinical Practice Guidelines", "authors": ["Fehmida Hussain", "Syed Sibte Raza Abidi"], "year": 2005, "publication": "MIE", "link": "http://ebooks.iospress.nl/volumearticle/10392", "snippet": "MIE, 2005", "source": "dblp", "result_id": "dblp:a_knowledge_management_framework_to_morph_clinical_cases_with_cl"}, {"title": "Constraint Satisfaction Methods for Information Personalization", "authors": ["Syed Sibte Raza Abidi", "Yong Han Chong"], "year": 2004, "publication": "Canadian AI", "link": "https://doi.org/10.1007/978-3-540-24840-8_19", "snippet": "Canadian AI, 2004, 10.1007/978-3-540-24840-8_19", "source": "dblp", "result_id": "dblp:doi:10.1007/978-3-540-24840-8_19"}, {"title": "Toward Glaucoma Classification with Moment Methods", "authors": ["Andrew R. McIntyre", "Malcolm I. Heywood", "Paul Habib Artes", "Syed Sibte Raza Abidi"], "year": 2004, "publication": "CRV", "link": "https://doi.org/10.1109/CCCRV.2004.1301454", "snippet": "CRV, 2004, 10.1109/cccrv.2004.1301454", "source": "dblp", "result_id": "dblp:doi:10.1109/cccrv.2004.1301454"}, {"title": "Knowledge Management in Pediatric Pain: Mapping On-Line Expert Discussions to Medical Literature", "authors": ["Syed Sibte Raza Abidi", "G. Allen Finley", "Evangelos E. Milios", "Michael A. Shepherd", "David Zitner"], "year": 2004, "publication": "MedInfo", "link": "https://doi.org/10.3233/978-1-60750-949-3-3", "snippet": "MedInfo, 2004, 10.3233/978-1-60750-949-3-3", "source": "dblp", "result_id": "dblp:doi:10.3233/978-1-60750-949-3-3"}, {"title": "Intelligent Agents-mediated Approach for Experimental Knowledge of Healthcare Enterprise through CBR-adaptation Technique", "authors": ["Zafar Iqbal Hashmi", "Yu-N Cheah", "Syed Zahid Hassan", "Syed Sibte Raza Abidi"], "year": 2003, "publication": "CITA", "link": "db/conf/cita/cita2003.html#HashmiCHA03", "snippet": "CITA, 2003", "source": "dblp", "result_id": "dblp:intelligent_agents_mediated_approach_for_experimental_knowledge_"}, {"title": "Adaptive Hypermedia Systems Featuring Information Customization Using Constraint Satisfaction Methods", "authors": ["Chong Yan Han", "Syed Sibte Raza Abidi", "Yu-N Cheah"], "year": 2003, "publication": "ICWI", "link": "db/conf/iadis/icwi2003.html#HanAY03", "snippet": "ICWI, 2003", "source": "dblp", "result_id": "dblp:adaptive_hypermedia_systems_featuring_information_customization_"}, {"title": "Intelligent Agent Modeling and Generic Architecture Towards a Multi-Agent Healthcare Knowledge Management System", "authors": ["Zafar Iqbal Hashmi", "Yu-N Cheah", "Syed Zahid Hassan", "Kee Guan Lim", "Syed Sibte Raza Abidi"], "year": 2003, "publication": "ICWI", "link": "db/conf/iadis/icwi2003.html#HashmiCHLA03", "snippet": "ICWI, 2003", "source": "dblp", "result_id": "dblp:intelligent_agent_modeling_and_generic_architecture_towards_a_mu"}, {"title": "E-healthcare via Customized Information Services: Addressing the Need for Factually Consistent Information", "authors": ["Syed Sibte Raza Abidi", "Yong Han Chong"], "year": 2003, "publication": "ICSOC", "link": "https://doi.org/10.1007/978-3-540-24593-3_10", "snippet": "ICSOC, 2003, 10.1007/978-3-540-24593-3_10", "source": "dblp", "result_id": "dblp:doi:10.1007/978-3-540-24593-3_10"}, {"title": "An Approach to Enrich Online Medical Problem-Based Learning with Tacit Healthcare Knowledge", "authors": ["Yu-N Cheah", "Faridah Abdul Rashid", "Syed Sibte Raza Abidi"], "year": 2003, "publication": "MIE", "link": "https://doi.org/10.3233/978-1-60750-939-4-744", "snippet": "MIE, 2003, 10.3233/978-1-60750-939-4-744", "source": "dblp", "result_id": "dblp:doi:10.3233/978-1-60750-939-4-744"}, {"title": "Leveraging XML-based electronic medical records to extract experiential clinical knowledge: An automated approach to generate cases for medical case-based reasoning systems", "authors": ["Syed Sibte Raza Abidi", "Selvakumar Manickam"], "year": 2002, "publication": "Int. J. Medical Informatics", "link": "https://doi.org/10.1016/S1386-5056(02)00076-X", "snippet": "Int. J. Medical Informatics, 2002, 10.1016/s1386-5056(02)00076-x", "source": "dblp", "result_id": "dblp:doi:10.1016/s1386-5056(02)00076-x"}, {"title": "Symbolic Exposition of Medical Data-Sets: A Data Mining Workbench to Inductively Derive Data-Defining Symbolic Rules", "authors": ["Syed Sibte Raza Abidi", "Kok Meng Hoe"], "year": 2002, "publication": "CBMS", "link": "https://doi.org/10.1109/CBMS.2002.1011365", "snippet": "CBMS, 2002, 10.1109/cbms.2002.1011365", "source": "dblp", "result_id": "dblp:doi:10.1109/cbms.2002.1011365"}, {"title": "An Intelligent Agent-based Knowledge Broker for Enterprise-wide Healthcare Knowledge Procurement", "authors": ["Zafar Iqbal Hashmi", "Syed Sibte Raza Abidi", "Yu-N Cheah"], "year": 2002, "publication": "CBMS", "link": "https://doi.org/10.1109/CBMS.2002.1011373", "snippet": "CBMS, 2002, 10.1109/cbms.2002.1011373", "source": "dblp", "result_id": "dblp:doi:10.1109/cbms.2002.1011373"}, {"title": "A Case Base Reasoning Framework to Author Personalized Health Maintenance Information", "authors": ["Syed Sibte Raza Abidi"], "year": 2002, "publication": "CBMS", "link": "https://doi.org/10.1109/CBMS.2002.1011380", "snippet": "CBMS, 2002, 10.1109/cbms.2002.1011380", "source": "dblp", "result_id": "dblp:doi:10.1109/cbms.2002.1011380"}, {"title": "Distributed Data Mining From Heterogeneous Healthcare Data Repositories: Towards an Intelligent Agent-Based Framework", "authors": ["Syed Zahid Hassan Zaidi", "Syed Sibte Raza Abidi", "Selvakumar Manickam"], "year": 2002, "publication": "CBMS", "link": "https://doi.org/10.1109/CBMS.2002.1011401", "snippet": "CBMS, 2002, 10.1109/cbms.2002.1011401", "source": "dblp", "result_id": "dblp:doi:10.1109/cbms.2002.1011401"}, {"title": "Designing Adaptive Hypermedia for Internet Portals: A Personalization Strategy Featuring Case Base Reasoning with Compositional Adaptation", "authors": ["Syed Sibte Raza Abidi"], "year": 2002, "publication": "IBERAMIA", "link": "https://doi.org/10.1007/3-540-36131-6_7", "snippet": "IBERAMIA, 2002, 10.1007/3-540-36131-6_7", "source": "dblp", "result_id": "dblp:doi:10.1007/3-540-36131-6_7"}, {"title": "Knowledge management in healthcare: towards 'knowledge-driven' decision-support services", "authors": ["Syed Sibte Raza Abidi"], "year": 2001, "publication": "Int. J. Medical Informatics", "link": "https://doi.org/10.1016/S1386-5056(01)00167-8", "snippet": "Int. J. Medical Informatics, 2001, 10.1016/s1386-5056(01)00167-8", "source": "dblp", "result_id": "dblp:doi:10.1016/s1386-5056(01)00167-8"}, {"title": "A Case for Supplementing Evidence Base Medicine with Inductive Clinical Knowledge: Towards a Technology-Enriched Integrated Clinical Evidence System", "authors": ["Syed Sibte Raza Abidi", "Samina Raza Abidi"], "year": 2001, "publication": "CBMS", "link": "https://doi.org/10.1109/CBMS.2001.941689", "snippet": "CBMS, 2001, 10.1109/cbms.2001.941689", "source": "dblp", "result_id": "dblp:doi:10.1109/cbms.2001.941689"}, {"title": "An Intelligent Info-Structure for Composing and Pushing Personalised Healthcare Information over the Internet", "authors": ["Syed Sibte Raza Abidi", "Yong Han Chong", "Samina Raza Abidi"], "year": 2001, "publication": "CBMS", "link": "https://doi.org/10.1109/CBMS.2001.941724", "snippet": "CBMS, 2001, 10.1109/cbms.2001.941724", "source": "dblp", "result_id": "dblp:doi:10.1109/cbms.2001.941724"}, {"title": "Augmenting Knowledge-Based Medical Systems with Tacit Healthcare Expertise: Towards an Intelligent Tacit Knowledge Acquisition Info-Structure", "authors": ["Yu-N Cheah", "Syed Sibte Raza Abidi"], "year": 2001, "publication": "CBMS", "link": "https://doi.org/10.1109/CBMS.2001.941731", "snippet": "CBMS, 2001, 10.1109/cbms.2001.941731", "source": "dblp", "result_id": "dblp:doi:10.1109/cbms.2001.941731"}, {"title": "Augmenting Medical Case Base Reasoning Systems with Clinical Knowledge Derived from Heterogeneous Electronic Patient Records", "authors": ["Syed Sibte Raza Abidi", "Selvakumar Manickam"], "year": 2001, "publication": "CBMS", "link": "https://doi.org/10.1109/CBMS.2001.941756", "snippet": "CBMS, 2001, 10.1109/cbms.2001.941756", "source": "dblp", "result_id": "dblp:doi:10.1109/cbms.2001.941756"}, {"title": "A Web-Enabled Exam Preparation and Evaluation Service: Providing Real-Time Personalized Tests for Academic Enhancement", "authors": ["Syed Sibte Raza Abidi", "Alwyn Goh"], "year": 2001, "publication": "ICALT", "link": "https://doi.org/10.1109/ICALT.2001.943971", "snippet": "ICALT, 2001, 10.1109/icalt.2001.943971", "source": "dblp", "result_id": "dblp:doi:10.1109/icalt.2001.943971"}, {"title": "A Knowledge Creation Strategy to Enrich Enterprise Information Systems with Enterprise-Specific Tacit Knowledge", "authors": ["Syed Sibte Raza Abidi", "Yu-N Cheah"], "year": 2001, "publication": "ICEIS (2)", "link": "db/conf/iceis/iceis2001-2.html#AbidiC01", "snippet": "ICEIS (2), 2001", "source": "dblp", "result_id": "dblp:a_knowledge_creation_strategy_to_enrich_enterprise_information_s"}, {"title": "Analyzing Data Clusters: A Rough Sets Approach to Extract Cluster-Defining Symbolic Rules", "authors": ["Syed Sibte Raza Abidi", "Kok Meng Hoe", "Alwyn Goh"], "year": 2001, "publication": "IDA", "link": "https://doi.org/10.1007/3-540-44816-0_25", "snippet": "IDA, 2001, 10.1007/3-540-44816-0_25", "source": "dblp", "result_id": "dblp:doi:10.1007/3-540-44816-0_25"}, {"title": "Extracting Clinical Cases from XML-Based Electronic Patient Records for Use in Web-based Medical Case Based Reasoning Systems", "authors": ["Selvakumar Manickam", "Syed Sibte Raza Abidi"], "year": 2001, "publication": "MedInfo", "link": "https://doi.org/10.3233/978-1-60750-928-8-643", "snippet": "MedInfo, 2001, 10.3233/978-1-60750-928-8-643", "source": "dblp", "result_id": "dblp:doi:10.3233/978-1-60750-928-8-643"}, {"title": "Patient Empowerment via 'Pushed' Delivery of Personalised Healthcare Educational Content Over the Internet", "authors": ["Syed Sibte Raza Abidi", "Yong Han Chong", "Samina Raza Abidi"], "year": 2001, "publication": "MedInfo", "link": "https://doi.org/10.3233/978-1-60750-928-8-1425", "snippet": "MedInfo, 2001, 10.3233/978-1-60750-928-8-1425", "source": "dblp", "result_id": "dblp:doi:10.3233/978-1-60750-928-8-1425"}, {"title": "A Scenarios Mediated Approach for Tacit Knowledge Acquisition and Crystallisation: Towards Higher Return-On-Knowledge and Experience", "authors": ["Yu-N Cheah", "Syed Sibte Raza Abidi"], "year": 2000, "publication": "PAKM", "link": "https://ceur-ws.org/Vol-34/cheah_abidi.pdf", "snippet": "PAKM, 2000", "source": "dblp", "result_id": "dblp:a_scenarios_mediated_approach_for_tacit_knowledge_acquisition_an"}, {"title": "AI Amidst the Healthcare Revolution: Towards an 'Intelligent' Tele-Healthcare Environment", "authors": ["Syed Sibte Raza Abidi"], "year": 1999, "publication": "IC-AI", "link": "db/conf/icai/icai1999-1.html#Abidi99", "snippet": "IC-AI, 1999", "source": "dblp", "result_id": "dblp:ai_amidst_the_healthcare_revolution_towards_an_intelligent_tele_"}, {"title": "Data Mining Using Self-Organizing Kohonen Maps: A Technique for Effective Data Clustering & Visualization", "authors": ["Jason Ong", "Syed Sibte Raza Abidi"], "year": 1999, "publication": "IC-AI", "link": "db/conf/icai/icai1999-1.html#OngA99", "snippet": "IC-AI, 1999", "source": "dblp", "result_id": "dblp:data_mining_using_self_organizing_kohonen_maps_a_technique_for_e"}, {"title": "Re-Visiting Backpropagation Network Optimization: Towards Maximally Pruned Networks", "authors": ["Alwyn Goh", "Syed Sibte Raza Abidi"], "year": 1999, "publication": "IC-AI", "link": "db/conf/icai/icai1999-2.html#GohA99", "snippet": "IC-AI, 1999", "source": "dblp", "result_id": "dblp:re_visiting_backpropagation_network_optimization_towards_maximal"}, {"title": "Telemedicine in the Malaysian Multimedia Super Corridor: Towards Personalised Lifetime Health Plans", "authors": ["Syed Sibte Raza Abidi", "Zaharin Yusoff"], "year": 1999, "publication": "MIE", "link": "https://doi.org/10.3233/978-1-60750-912-7-283", "snippet": "MIE, 1999, 10.3233/978-1-60750-912-7-283", "source": "dblp", "result_id": "dblp:doi:10.3233/978-1-60750-912-7-283"}, {"title": "Applying Data Mining in Healthcare: An Info- Structure for Delivering 'Data-Driven' Strategic Services", "authors": ["Syed Sibte Raza Abidi"], "year": 1999, "publication": "MIE", "link": "https://doi.org/10.3233/978-1-60750-912-7-453", "snippet": "MIE, 1999, 10.3233/978-1-60750-912-7-453", "source": "dblp", "result_id": "dblp:doi:10.3233/978-1-60750-912-7-453"}, {"title": "TIDE: An Intelligent Home-Based Healthcare Information & Diagnostic Environment", "authors": ["Syed Sibte Raza Abidi"], "year": 1999, "publication": "MIE", "link": "https://doi.org/10.3233/978-1-60750-912-7-720", "snippet": "MIE, 1999, 10.3233/978-1-60750-912-7-720", "source": "dblp", "result_id": "dblp:doi:10.3233/978-1-60750-912-7-720"}, {"title": "Healthcare Knowledge Management Through Building and Operationalising Healthcare Enterprise Memory", "authors": ["Yu-N Cheah", "Syed Sibte Raza Abidi"], "year": 1999, "publication": "MIE", "link": "https://doi.org/10.3233/978-1-60750-912-7-726", "snippet": "MIE, 1999, 10.3233/978-1-60750-912-7-726", "source": "dblp", "result_id": "dblp:doi:10.3233/978-1-60750-912-7-726"}, {"title": "Telemedicine and Medical Informatics in the Multimedia Super Corridor: The Malaysian Vision", "authors": ["Syed Sibte Raza Abidi", "Alwyn Goh", "Zaharin Yusoff"], "year": 1998, "publication": "MedInfo", "link": "https://doi.org/10.3233/978-1-60750-896-0-1282", "snippet": "MedInfo, 1998, 10.3233/978-1-60750-896-0-1282", "source": "dblp", "result_id": "dblp:doi:10.3233/978-1-60750-896-0-1282"}, {"title": "Applying Knowledge Discovery to Predict Infectious Disease Epidemics", "authors": ["Syed Sibte Raza Abidi", "Alwyn Goh"], "year": 1998, "publication": "PRICAI", "link": "https://doi.org/10.1007/BFb0095267", "snippet": "PRICAI, 1998, 10.1007/bfb0095267", "source": "dblp", "result_id": "dblp:doi:10.1007/bfb0095267"}, {"title": "Internet Information Brokering: A Re-Configurable Database Navigation, Data Filter and Export System", "authors": ["Syed Sibte Raza Abidi"], "year": 1997, "publication": "Informatica (Slovenia)", "link": "db/journals/informaticaSI/informaticaSI21.html#Abidi97", "snippet": "Informatica (Slovenia), 1997", "source": "dblp", "result_id": "dblp:internet_information_brokering_a_re_configurable_database_naviga"}, {"title": "Conglomerate'Neural Network Architectures: The Way Ahead for Simulating Early Language Development", "authors": ["Syed Sibte Raza Abidi", "Khrushid Ahmad"], "year": 1997, "publication": "J. Inf. Sci. Eng.", "link": "http://www.iis.sinica.edu.tw/page/jise/1997/199706_03.html", "snippet": "J. Inf. Sci. Eng., 1997", "source": "dblp", "result_id": "dblp:conglomerate_neural_network_architectures_the_way_ahead_for_simu"}, {"title": "Neural networks and child language development: a simulation using a modular neural network architecture", "authors": ["Syed Sibte Raza Abidi"], "year": 1996, "publication": "ICNN", "link": "https://doi.org/10.1109/ICNN.1996.549006", "snippet": "ICNN, 1996, 10.1109/icnn.1996.549006", "source": "dblp", "result_id": "dblp:doi:10.1109/icnn.1996.549006"}, {"title": "A connectionist simulation : towards a model of child language development", "authors": ["Syed Sibte Raza Abidi"], "year": 1994, "publication": "", "link": "http://epubs.surrey.ac.uk/795815/", "snippet": "1994", "source": "dblp", "result_id": "dblp:a_connectionist_simulation_towards_a_model_of_child_language_dev"}]}} \ No newline at end of file +{"timestamp": 1782998498.7829196, "data": {"articles": [{"title": "A Graph Neural Network Approach for Data-Driven Donor-Recipient Matching in Kidney Transplantation", "authors": ["Sheida Majouni", "Karthik K. Tennankore", "Samina Abidi", "Amanda Vinson", "Syed Sibte Raza Abidi"], "year": 2025, "publication": "AIME (1)", "link": "https://doi.org/10.1007/978-3-031-95838-0_26", "snippet": "AIME (1), 2025, 10.1007/978-3-031-95838-0_26", "source": "dblp", "result_id": "dblp:doi:10.1007/978-3-031-95838-0_26"}, {"title": "A Reinforcement Learning Framework for Optimizing Kidney Allocation for Transplant Based on Survival and Ethical Criteria", "authors": ["Syed Asil Ali Naqvi", "Karthik K. Tennankore", "George Worthen", "Amanda Vinson", "Syed Sibte Raza Abidi"], "year": 2025, "publication": "AIME (1)", "link": "https://doi.org/10.1007/978-3-031-95838-0_32", "snippet": "AIME (1), 2025, 10.1007/978-3-031-95838-0_32", "source": "dblp", "result_id": "dblp:doi:10.1007/978-3-031-95838-0_32"}, {"title": "Using Word Embeddings to Extract Semantic Relations from Biomedical Texts: Towards Literature-Based Discovery", "authors": ["William Van Woensel", "Sushumna S. Pradeep", "Ali Daowd", "Samina Abidi", "Syed Sibte Raza Abidi"], "year": 2025, "publication": "AIME (2)", "link": "https://doi.org/10.1007/978-3-031-95841-0_78", "snippet": "AIME (2), 2025, 10.1007/978-3-031-95841-0_78", "source": "dblp", "result_id": "dblp:doi:10.1007/978-3-031-95841-0_78"}, {"title": "Concept-Level Local Explanations of Kidney Transplant Survival Predictions by Black-Box ML Models", "authors": ["Jaber Rad", "Syed Asil Ali Naqvi", "Karthik K. Tennankore", "Samina Abidi", "Amanda Vinson", "Syed Sibte Raza Abidi"], "year": 2025, "publication": "HIKM", "link": "https://doi.org/10.1145/3774816.3774823", "snippet": "HIKM, 2025, 10.1145/3774816.3774823", "source": "dblp", "result_id": "dblp:doi:10.1145/3774816.3774823"}, {"title": "Generating a knowledge graph to understand the mechanistic relationships between multimorbid diabetes, hypertension and kidney diseases", "authors": ["Chukwuebuka Emmanuel Egwuatu", "Ali Daowd", "Samina Abidi", "Syed Sibte Raza Abidi"], "year": 2025, "publication": "HIKM", "link": "https://doi.org/10.1145/3774816.3774831", "snippet": "HIKM, 2025, 10.1145/3774816.3774831", "source": "dblp", "result_id": "dblp:doi:10.1145/3774816.3774831"}, {"title": "Plausible reasoning over large health datasets: A novel approach to data analytics leveraging semantics", "authors": ["Hossein Mohammadhassanzadeh", "Samina Raza Abidi", "Syed Sibte Raza Abidi"], "year": 2024, "publication": "Knowl. Based Syst.", "link": "https://doi.org/10.1016/j.knosys.2024.111493", "snippet": "Knowl. Based Syst., 2024, 10.1016/j.knosys.2024.111493", "source": "dblp", "result_id": "dblp:doi:10.1016/j.knosys.2024.111493"}, {"title": "Utilizing Topological Clustering on a Traumatic Brain Injury Cohort: The Association of Neighborhood Socioeconomic Deprivation Profiles with Injury Mortality", "authors": ["Nelofar Kureshi", "David B. Clarke", "Syed Sibte Raza Abidi"], "year": 2024, "publication": "ACSW", "link": "https://doi.org/10.1145/3641142.3641166", "snippet": "ACSW, 2024, 10.1145/3641142.3641166", "source": "dblp", "result_id": "dblp:doi:10.1145/3641142.3641166"}, {"title": "A Topological Data Analysis of Un met Health Care Needs Among Injured Patients", "authors": ["Nelofar Kureshi", "Syed Sibte Raza Abidi"], "year": 2024, "publication": "ICHI", "link": "https://doi.org/10.1109/ICHI61247.2024.00073", "snippet": "ICHI, 2024, 10.1109/ichi61247.2024.00073", "source": "dblp", "result_id": "dblp:doi:10.1109/ichi61247.2024.00073"}, {"title": "Extracting Decision Paths via Surrogate Modeling for Explainability of Black Box Classifiers", "authors": ["Jaber Rad", "Karthik K. Tennankore", "Samina Abidi", "Syed Sibte Raza Abidi"], "year": 2024, "publication": "SDS", "link": "https://doi.org/10.1109/SDS60720.2024.00037", "snippet": "SDS, 2024, 10.1109/sds60720.2024.00037", "source": "dblp", "result_id": "dblp:doi:10.1109/sds60720.2024.00037"}, {"title": "A community-of-practice-based evaluation methodology for knowledge intensive computational methods and its application to multimorbidity decision support", "authors": ["William Van Woensel", "Samson W. Tu", "Wojtek Michalowski", "Syed Sibte Raza Abidi", "Samina Abidi", "Jos\u00e9 Ram\u00f3n Alonso", "Alessio Bottrighi", "Marc Carrier", "Ruth Edry", "Irit Hochberg", "Malvika Rao", "Stephen P. Kingwell", "Alexandra Kogan", "Mar Marcos", "Bego\u00f1a Mart\u00ednez-Salvador", "Martin Michalowski", "Luca Piovesan", "David Ria\u00f1o", "Paolo Terenziani", "Szymon Wilk", "Mor Peleg"], "year": 2023, "publication": "J. Biomed. Informatics", "link": "https://doi.org/10.1016/j.jbi.2023.104395", "snippet": "J. Biomed. Informatics, 2023, 10.1016/j.jbi.2023.104395", "source": "dblp", "result_id": "dblp:doi:10.1016/j.jbi.2023.104395"}, {"title": "Decentralized Web-Based Clinical Decision Support Using Semantic GLEAN Workflows", "authors": ["William Van Woensel", "Samina Abidi", "Syed Sibte Raza Abidi"], "year": 2023, "publication": "AIME", "link": "https://doi.org/10.1007/978-3-031-34344-5_44", "snippet": "AIME, 2023, 10.1007/978-3-031-34344-5_44", "source": "dblp", "result_id": "dblp:doi:10.1007/978-3-031-34344-5_44"}, {"title": "Digital Therapeutics for COPD Patient Self-Management: Needs Analysis and Design Study", "authors": ["Samina Raza Abidi", "Tracey Rickards", "William Van Woensel", "Syed Sibte Raza Abidi"], "year": 2023, "publication": "MedInfo", "link": "https://doi.org/10.3233/SHTI230957", "snippet": "MedInfo, 2023, 10.3233/shti230957", "source": "dblp", "result_id": "dblp:doi:10.3233/shti230957"}, {"title": "Predicting Urgent Dialysis at Ambulance Transport to the Emergency Department Using Machine Learning Methods", "authors": ["Sheida Majouni", "Karthik K. Tennankore", "Syed Sibte Raza Abidi"], "year": 2023, "publication": "MedInfo", "link": "https://doi.org/10.3233/SHTI231093", "snippet": "MedInfo, 2023, 10.3233/shti231093", "source": "dblp", "result_id": "dblp:doi:10.3233/shti231093"}, {"title": "Characterizing Cluster-Based Frailty Phenotypes in a Multicenter Prospective Cohort of Kidney Transplant Candidates", "authors": ["Syed Hani Raza Abidi", "Nur Zincir-Heywood", "Syed Sibte Raza Abidi", "Kranthi Jalakam", "Samina Abidi", "Lakshman Gunaratnam", "Rita Suri", "H\u00e9lo\u00efse Cardinale", "Amanda Vinson", "Bhanu Prasad", "Michael Walsh", "Seychelle Yohanna", "George Worthen", "Karthik K. Tennankore"], "year": 2023, "publication": "MedInfo", "link": "https://doi.org/10.3233/SHTI231094", "snippet": "MedInfo, 2023, 10.3233/shti231094", "source": "dblp", "result_id": "dblp:doi:10.3233/shti231094"}, {"title": "Ensemble Clustering to Generate Phenotypes of Kidney Transplant Donors and Recipients", "authors": ["Syed Sibte Raza Abidi", "Kranthi Jalakam", "Syed Hani Raza Abidi", "Karthik K. Tennankore"], "year": 2023, "publication": "MedInfo", "link": "https://doi.org/10.3233/SHTI231121", "snippet": "MedInfo, 2023, 10.3233/shti231121", "source": "dblp", "result_id": "dblp:doi:10.3233/shti231121"}, {"title": "Semantic knowledge modeling and evaluation of argument Theory to develop dialogue based patient education systems for chronic disease Self-Management", "authors": ["Benjamin Rose-Davis", "William Van Woensel", "Samina Raza Abidi", "Elizabeth Stringer", "Syed Sibte Raza Abidi"], "year": 2022, "publication": "Int. J. Medical Informatics", "link": "https://doi.org/10.1016/j.ijmedinf.2022.104693", "snippet": "Int. J. Medical Informatics, 2022, 10.1016/j.ijmedinf.2022.104693", "source": "dblp", "result_id": "dblp:doi:10.1016/j.ijmedinf.2022.104693"}, {"title": "Explainable Decision Support Using Task Network Models in Notation3: Computerizing Lipid Management Clinical Guidelines as Interactive Task Networks", "authors": ["William Van Woensel", "Samina Abidi", "Karthik K. Tennankore", "George Worthen", "Syed Sibte Raza Abidi"], "year": 2022, "publication": "AIME", "link": "https://doi.org/10.1007/978-3-031-09342-5_1", "snippet": "AIME, 2022, 10.1007/978-3-031-09342-5_1", "source": "dblp", "result_id": "dblp:doi:10.1007/978-3-031-09342-5_1"}, {"title": "A Knowledge Graph Completion Method Applied to Literature-Based Discovery for Predicting Missing Links Targeting Cancer Drug Repurposing", "authors": ["Ali Daowd", "Samina Abidi", "Syed Sibte Raza Abidi"], "year": 2022, "publication": "AIME", "link": "https://doi.org/10.1007/978-3-031-09342-5_3", "snippet": "AIME, 2022, 10.1007/978-3-031-09342-5_3", "source": "dblp", "result_id": "dblp:doi:10.1007/978-3-031-09342-5_3"}, {"title": "Assessing Knee Osteoarthritis Severity and Biomechanical Changes After Total Knee Arthroplasty Using Self-organizing Maps", "authors": ["Kathryn Young-Shand", "Patrice C. Roy", "Michael Dunbar", "Syed Sibte Raza Abidi", "Janie Wilson"], "year": 2022, "publication": "AIME", "link": "https://doi.org/10.1007/978-3-031-09342-5_7", "snippet": "AIME, 2022, 10.1007/978-3-031-09342-5_7", "source": "dblp", "result_id": "dblp:doi:10.1007/978-3-031-09342-5_7"}, {"title": "Extracting Surrogate Decision Trees from Black-Box Models to Explain the Temporal Importance of Clinical Features in Predicting Kidney Graft Survival", "authors": ["Jaber Rad", "Karthik K. Tennankore", "Amanda Vinson", "Syed Sibte Raza Abidi"], "year": 2022, "publication": "AIME", "link": "https://doi.org/10.1007/978-3-031-09342-5_9", "snippet": "AIME, 2022, 10.1007/978-3-031-09342-5_9", "source": "dblp", "result_id": "dblp:doi:10.1007/978-3-031-09342-5_9"}, {"title": "Clinical Guidelines as Executable and Interactive Workflows with FHIR-Compliant Health Data Input Using GLEAN", "authors": ["William Van Woensel", "Samina Abidi", "Karthik K. Tennankore", "George Worthen", "Syed Sibte Raza Abidi"], "year": 2022, "publication": "AIME", "link": "https://doi.org/10.1007/978-3-031-09342-5_43", "snippet": "AIME, 2022, 10.1007/978-3-031-09342-5_43", "source": "dblp", "result_id": "dblp:doi:10.1007/978-3-031-09342-5_43"}, {"title": "Using Visual Analytics to Optimize Blood Product Inventory at a Hospital's Blood Transfusion Service", "authors": ["Jaber Rad", "Jason G. Quinn", "Calvino Cheng", "Samina Raza Abidi", "Robert Liwski", "Syed Sibte Raza Abidi"], "year": 2022, "publication": "AIME", "link": "https://doi.org/10.1007/978-3-031-09342-5_46", "snippet": "AIME, 2022, 10.1007/978-3-031-09342-5_46", "source": "dblp", "result_id": "dblp:doi:10.1007/978-3-031-09342-5_46"}, {"title": "Applying Machine Learning to Arsenic Species and Metallomics Profiles of Toenails to Evaluate Associations of Environmental Arsenic with Incident Cancer Cases", "authors": ["Sheida Majouni", "Jong Sung Kim", "Ellen Sweeney", "Erin Keltie", "Syed Sibte Raza Abidi"], "year": 2022, "publication": "MIE", "link": "https://doi.org/10.3233/SHTI220385", "snippet": "MIE, 2022, 10.3233/shti220385", "source": "dblp", "result_id": "dblp:doi:10.3233/shti220385"}, {"title": "Decision support for comorbid conditions via execution-time integration of clinical guidelines using transaction-based semantics and temporal planning", "authors": ["William Van Woensel", "Syed Sibte Raza Abidi", "Samina Raza Abidi"], "year": 2021, "publication": "Artif. Intell. Medicine", "link": "https://doi.org/10.1016/j.artmed.2021.102127", "snippet": "Artif. Intell. Medicine, 2021, 10.1016/j.artmed.2021.102127", "source": "dblp", "result_id": "dblp:doi:10.1016/j.artmed.2021.102127"}, {"title": "Semantic Web Framework to Computerize Staged Reflex Testing Protocols to Mitigate Underutilization of Pathology Tests for Diagnosing Pituitary Disorders", "authors": ["William Van Woensel", "Manal Elnenaei", "Syed Ali Imran", "Syed Sibte Raza Abidi"], "year": 2021, "publication": "AIME", "link": "https://doi.org/10.1007/978-3-030-77211-6_13", "snippet": "AIME, 2021, 10.1007/978-3-030-77211-6_13", "source": "dblp", "result_id": "dblp:doi:10.1007/978-3-030-77211-6_13"}, {"title": "A Framework To Build A Causal Knowledge Graph for Chronic Diseases and Cancers By Discovering Semantic Associations from Biomedical Literature", "authors": ["Ali Daowd", "Michael Barrett", "Samina Abidi", "Syed Sibte Raza Abidi"], "year": 2021, "publication": "ICHI", "link": "https://doi.org/10.1109/ICHI52183.2021.00016", "snippet": "ICHI, 2021, 10.1109/ichi52183.2021.00016", "source": "dblp", "result_id": "dblp:doi:10.1109/ichi52183.2021.00016"}, {"title": "Towards an Adaptive Clinical Transcription System for In-Situ Transcribing of Patient Encounter Information", "authors": ["William Van Woensel", "Brett Taylor", "Syed Sibte Raza Abidi"], "year": 2021, "publication": "MedInfo", "link": "https://doi.org/10.3233/SHTI220052", "snippet": "MedInfo, 2021, 10.3233/shti220052", "source": "dblp", "result_id": "dblp:doi:10.3233/shti220052"}, {"title": "A Knowledge Graph of Mechanistic Associations Between COVID-19, Diabetes Mellitus, and Chronic Kidney Disease", "authors": ["Michael Barrett", "Syed Sibte Raza Abidi", "Ali Daowd", "Samina Abidi"], "year": 2021, "publication": "MedInfo", "link": "https://doi.org/10.3233/SHTI220084", "snippet": "MedInfo, 2021, 10.3233/shti220084", "source": "dblp", "result_id": "dblp:doi:10.3233/shti220084"}, {"title": "Using Interactive Visual Analytics to Optimize Blood Products Inventory at a Blood Bank", "authors": ["Jaber Rad", "Jason G. Quinn", "Calvino Cheng", "Robert Liwski", "Samina Abidi", "Syed Sibte Raza Abidi"], "year": 2021, "publication": "MedInfo", "link": "https://doi.org/10.3233/SHTI220142", "snippet": "MedInfo, 2021, 10.3233/shti220142", "source": "dblp", "result_id": "dblp:doi:10.3233/shti220142"}, {"title": "Analyzing Association Rules for Graft Failure Following Deceased and Live Donor Kidney Transplantation", "authors": ["Syed Asil Ali Naqvi", "Karthik K. Tennankore", "Amanda Vinson", "Syed Sibte Raza Abidi"], "year": 2021, "publication": "MIE", "link": "https://doi.org/10.3233/SHTI210146", "snippet": "MIE, 2021, 10.3233/shti210146", "source": "dblp", "result_id": "dblp:doi:10.3233/shti210146"}, {"title": "Using Interactive Visual Analytics to Optimize in Real-Time Blood Products Inventory at a Blood Bank", "authors": ["Jaber Rad", "Jason G. Quinn", "Calvino Cheng", "Robert Liwski", "Samina Raza Abidi", "Syed Sibte Raza Abidi"], "year": 2021, "publication": "MIE", "link": "https://doi.org/10.3233/SHTI210153", "snippet": "MIE, 2021, 10.3233/shti210153", "source": "dblp", "result_id": "dblp:doi:10.3233/shti210153"}, {"title": "A Knowledge Graph of Mechanistic Associations Between COVID-19, Diabetes Mellitus and Kidney Diseases", "authors": ["Michael Barrett", "Ali Daowd", "Syed Sibte Raza Abidi", "Samina Abidi"], "year": 2021, "publication": "MIE", "link": "https://doi.org/10.3233/SHTI210187", "snippet": "MIE, 2021, 10.3233/shti210187", "source": "dblp", "result_id": "dblp:doi:10.3233/shti210187"}, {"title": "Using Knowledge Graphs to Plausibly Infer Missing Associations in EMR Data", "authors": ["William Van Woensel", "Chad Armstrong", "Malavan Rajaratnam", "Vaibhav Gupta", "Syed Sibte Raza Abidi"], "year": 2021, "publication": "MIE", "link": "https://doi.org/10.3233/SHTI210192", "snippet": "MIE, 2021, 10.3233/shti210192", "source": "dblp", "result_id": "dblp:doi:10.3233/shti210192"}, {"title": "Building a Knowledge Graph Representing Causal Associations Between Risk Factors and Incidence of Breast Cancer", "authors": ["Ali Daowd", "Michael Barrett", "Samina Abidi", "Syed Sibte Raza Abidi"], "year": 2021, "publication": "MIE", "link": "https://doi.org/10.3233/SHTI210267", "snippet": "MIE, 2021, 10.3233/shti210267", "source": "dblp", "result_id": "dblp:doi:10.3233/shti210267"}, {"title": "Ontology-Based Personalized Cognitive Behavioural Plans for Patients with Mild Depression", "authors": ["Aditi Nair", "Syed Sibte Raza Abidi", "William Van Woensel", "Samina Abidi"], "year": 2021, "publication": "MIE", "link": "https://doi.org/10.3233/SHTI210268", "snippet": "MIE, 2021, 10.3233/shti210268", "source": "dblp", "result_id": "dblp:doi:10.3233/shti210268"}, {"title": "Towards Model-Driven Semantic Interfaces for Electronic Health Records on Multiple Platforms Using Notation3", "authors": ["William Van Woensel", "Samina Abidi", "Syed Sibte Raza Abidi"], "year": 2021, "publication": "SWH@ISWC", "link": "https://ceur-ws.org/Vol-3055/paper4.pdf", "snippet": "SWH@ISWC, 2021", "source": "dblp", "result_id": "dblp:towards_model_driven_semantic_interfaces_for_electronic_health_r"}, {"title": "Indoor location identification of patients for directing virtual care: An AI approach using machine learning and knowledge-based methods", "authors": ["William Van Woensel", "Patrice C. Roy", "Syed Sibte Raza Abidi", "Samina Raza Abidi"], "year": 2020, "publication": "Artif. Intell. Medicine", "link": "https://doi.org/10.1016/j.artmed.2020.101931", "snippet": "Artif. Intell. Medicine, 2020, 10.1016/j.artmed.2020.101931", "source": "dblp", "result_id": "dblp:doi:10.1016/j.artmed.2020.101931"}, {"title": "An AI-Driven Predictive Modelling Framework to Analyze and Visualize Blood Product Transactional Data for Reducing Blood Products' Discards", "authors": ["Jaber Rad", "Calvino Cheng", "Jason G. Quinn", "Samina Abidi", "Robert Liwski", "Syed Sibte Raza Abidi"], "year": 2020, "publication": "AIME", "link": "https://doi.org/10.1007/978-3-030-59137-3_18", "snippet": "AIME, 2020, 10.1007/978-3-030-59137-3_18", "source": "dblp", "result_id": "dblp:doi:10.1007/978-3-030-59137-3_18"}, {"title": "A CIG Integration Framework to Provide Decision Support for Comorbid Conditions Using Transaction-Based Semantics and Temporal Planning", "authors": ["William Van Woensel", "Samina Abidi", "Borna Jafarpour", "Syed Sibte Raza Abidi"], "year": 2020, "publication": "AIME", "link": "https://doi.org/10.1007/978-3-030-59137-3_39", "snippet": "AIME, 2020, 10.1007/978-3-030-59137-3_39", "source": "dblp", "result_id": "dblp:doi:10.1007/978-3-030-59137-3_39"}, {"title": "Execution-time integration of clinical practice guidelines to provide decision support for comorbid conditions", "authors": ["Borna Jafarpour", "Samina Raza Abidi", "William Van Woensel", "Syed Sibte Raza Abidi"], "year": 2019, "publication": "Artif. Intell. Medicine", "link": "https://doi.org/10.1016/j.artmed.2019.02.003", "snippet": "Artif. Intell. Medicine, 2019, 10.1016/j.artmed.2019.02.003", "source": "dblp", "result_id": "dblp:doi:10.1016/j.artmed.2019.02.003"}, {"title": "Benchmarking semantic reasoning on mobile platforms: Towards optimization using OWL2 RL", "authors": ["William Van Woensel", "Syed Sibte Raza Abidi"], "year": 2019, "publication": "Semantic Web", "link": "https://doi.org/10.3233/SW-180315", "snippet": "Semantic Web, 2019, 10.3233/sw-180315", "source": "dblp", "result_id": "dblp:doi:10.3233/sw-180315"}, {"title": "Mobile Indoor Localization with Bluetooth Beacons in a Pediatric Emergency Department Using Clustering, Rule-Based Classification and High-Level Heuristics", "authors": ["Patrice C. Roy", "William Van Woensel", "Andrew Wilcox", "Syed Sibte Raza Abidi"], "year": 2019, "publication": "AIME", "link": "https://doi.org/10.1007/978-3-030-21642-9_27", "snippet": "AIME, 2019, 10.1007/978-3-030-21642-9_27", "source": "dblp", "result_id": "dblp:doi:10.1007/978-3-030-21642-9_27"}, {"title": "AI-Driven Pathology Laboratory Utilization Management via Data- and Knowledge-Based Analytics", "authors": ["Syed Sibte Raza Abidi", "Jaber Rad", "Ashraf Abusharekh", "Patrice C. Roy", "William Van Woensel", "Samina Raza Abidi", "Calvino Cheng", "Bryan Crocker", "Manal Elnenaei"], "year": 2019, "publication": "AIME", "link": "https://doi.org/10.1007/978-3-030-21642-9_30", "snippet": "AIME, 2019, 10.1007/978-3-030-21642-9_30", "source": "dblp", "result_id": "dblp:doi:10.1007/978-3-030-21642-9_30"}, {"title": "A Digital Health Platform to Deliver Tailored Early Stimulation Programs for Children with Developmental Delays", "authors": ["Raquel da Luz Dias", "Marcela Raquel de Oliveira Lima", "Jo\u00e3o Guilherme Bezerra Alves", "William Van Woensel", "Asil Naqvi", "Zahra Take", "Syed Sibte Raza Abidi"], "year": 2019, "publication": "MedInfo", "link": "https://doi.org/10.3233/SHTI190287", "snippet": "MedInfo, 2019, 10.3233/shti190287", "source": "dblp", "result_id": "dblp:doi:10.3233/shti190287"}, {"title": "Providing Comorbid Decision Support via the Integration of Clinical Practice Guidelines at Execution-Time by Leveraging Medical Linked Open Datasets", "authors": ["William Van Woensel", "Samina Abidi", "Borna Jafarpour", "Syed Sibte Raza Abidi"], "year": 2019, "publication": "MedInfo", "link": "https://doi.org/10.3233/SHTI190345", "snippet": "MedInfo, 2019, 10.3233/shti190345", "source": "dblp", "result_id": "dblp:doi:10.3233/shti190345"}, {"title": "Proactively Guiding Patients Through ADL via Knowledge-Based and Context-Driven Activity Recognition", "authors": ["William Van Woensel", "Samina Abidi", "Syed Sibte Raza Abidi"], "year": 2019, "publication": "MedInfo", "link": "https://doi.org/10.3233/SHTI190346", "snippet": "MedInfo, 2019, 10.3233/shti190346", "source": "dblp", "result_id": "dblp:doi:10.3233/shti190346"}, {"title": "Towards Personalized Lifetime Health: A Platform for Early Multimorbid Chronic Disease Risk Assessment and Mitigation", "authors": ["Ali Daowd", "Syed Faizan", "Samina Abidi", "Ashraf Abusharekh", "Aaqib Shehzad", "Syed Sibte Raza Abidi"], "year": 2019, "publication": "MedInfo", "link": "https://doi.org/10.3233/SHTI190361", "snippet": "MedInfo, 2019, 10.3233/shti190361", "source": "dblp", "result_id": "dblp:doi:10.3233/shti190361"}, {"title": "Using an Artificial Intelligence-Based Argument Theory to Generate Automated Patient Education Dialogues for Families of Children with Juvenile Idiopathic Arthritis", "authors": ["Benjamin Rose-Davis", "William Van Woensel", "Elizabeth Stringer", "Samina Abidi", "Syed Sibte Raza Abidi"], "year": 2019, "publication": "MedInfo", "link": "https://doi.org/10.3233/SHTI190444", "snippet": "MedInfo, 2019, 10.3233/shti190444", "source": "dblp", "result_id": "dblp:doi:10.3233/shti190444"}, {"title": "A Data Mining Framework for Glaucoma Decision Support Based on Optic Nerve Image Analysis Using Machine Learning Methods", "authors": ["Syed Sibte Raza Abidi", "Patrice C. Roy", "Muhammad S. Shah", "Jin Yu", "Sanjun Yan"], "year": 2018, "publication": "J. Heal. Informatics Res.", "link": "https://doi.org/10.1007/s41666-018-0028-7", "snippet": "J. Heal. Informatics Res., 2018, 10.1007/s41666-018-0028-7", "source": "dblp", "result_id": "dblp:doi:10.1007/s41666-018-0028-7"}, {"title": "Optimizing Semantic Reasoning on Memory-Constrained Platforms Using the RETE Algorithm", "authors": ["William Van Woensel", "Syed Sibte Raza Abidi"], "year": 2018, "publication": "ESWC", "link": "https://doi.org/10.1007/978-3-319-93417-4_44", "snippet": "ESWC, 2018, 10.1007/978-3-319-93417-4_44", "source": "dblp", "result_id": "dblp:doi:10.1007/978-3-319-93417-4_44"}, {"title": "Interactive Dialogue-Based Patient Education for Juvenile Idiopathic Arthritis Using Argument Theory", "authors": ["Benjamin Rose-Davis", "Elizabeth Stringer", "Samina Abidi", "Syed Sibte Raza Abidi"], "year": 2018, "publication": "MIE", "link": "https://doi.org/10.3233/978-1-61499-852-5-546", "snippet": "MIE, 2018, 10.3233/978-1-61499-852-5-546", "source": "dblp", "result_id": "dblp:doi:10.3233/978-1-61499-852-5-546"}, {"title": "A Mobile Early Stimulation Program to Support Children with Developmental Delays in Brazil", "authors": ["Raquel da Luz Dias", "K\u00e1tia Cristina Correa Guimar\u00e3es Silva", "Marcela Raquel de Oliveira Lima", "Jo\u00e3o Guilherme Bezerra Alves", "Syed Sibte Raza Abidi"], "year": 2018, "publication": "MIE", "link": "https://doi.org/10.3233/978-1-61499-852-5-785", "snippet": "MIE, 2018, 10.3233/978-1-61499-852-5-785", "source": "dblp", "result_id": "dblp:doi:10.3233/978-1-61499-852-5-785"}, {"title": "A Personalized Risk Stratification Platform for Population Lifetime Healthcare", "authors": ["Ali Daowd", "Samina Raza Abidi", "Ashraf Abusharekh", "Syed Sibte Raza Abidi"], "year": 2018, "publication": "MIE", "link": "https://doi.org/10.3233/978-1-61499-852-5-920", "snippet": "MIE, 2018, 10.3233/978-1-61499-852-5-920", "source": "dblp", "result_id": "dblp:doi:10.3233/978-1-61499-852-5-920"}, {"title": "Investigating Plausible Reasoning Over Knowledge Graphs for Semantics-Based Health Data Analytics", "authors": ["Hossein Mohammadhassanzadeh", "Samina Raza Abidi", "William Van Woensel", "Syed Sibte Raza Abidi"], "year": 2018, "publication": "WETICE", "link": "https://doi.org/10.1109/WETICE.2018.00035", "snippet": "WETICE, 2018, 10.1109/wetice.2018.00035", "source": "dblp", "result_id": "dblp:doi:10.1109/wetice.2018.00035"}, {"title": "Semantics-based plausible reasoning to extend the knowledge coverage of medical knowledge bases for improved clinical decision support", "authors": ["Hossein Mohammadhassanzadeh", "William Van Woensel", "Samina Raza Abidi", "Syed Sibte Raza Abidi"], "year": 2017, "publication": "BioData Min.", "link": "https://doi.org/10.1186/s13040-017-0123-y", "snippet": "BioData Min., 2017, 10.1186/s13040-017-0123-y", "source": "dblp", "result_id": "dblp:doi:10.1186/s13040-017-0123-y"}, {"title": "Leveraging medical taxonomies to improve knowledge management within online communities of practice: The knowledge maps system", "authors": ["Samuel Alan Stewart", "Syed Sibte Raza Abidi"], "year": 2017, "publication": "Comput. Methods Programs Biomed.", "link": "https://doi.org/10.1016/j.cmpb.2017.03.003", "snippet": "Comput. Methods Programs Biomed., 2017, 10.1016/j.cmpb.2017.03.003", "source": "dblp", "result_id": "dblp:doi:10.1016/j.cmpb.2017.03.003"}, {"title": "Protocol-Driven Decision Support within e-Referral Systems to Streamline Patient Consultation, Triaging and Referrals from Primary Care to Specialist Clinics", "authors": ["Ehsan Maghsoud-Lou", "Sean Christie", "Samina Raza Abidi", "Syed Sibte Raza Abidi"], "year": 2017, "publication": "J. Medical Syst.", "link": "https://doi.org/10.1007/s10916-017-0791-7", "snippet": "J. Medical Syst., 2017, 10.1007/s10916-017-0791-7", "source": "dblp", "result_id": "dblp:doi:10.1007/s10916-017-0791-7"}, {"title": "Possibilistic activity recognition with uncertain observations to support medication adherence in an assisted ambient living setting", "authors": ["Patrice C. Roy", "Samina Raza Abidi", "Syed Sibte Raza Abidi"], "year": 2017, "publication": "Knowl. Based Syst.", "link": "https://doi.org/10.1016/j.knosys.2017.07.008", "snippet": "Knowl. Based Syst., 2017, 10.1016/j.knosys.2017.07.008", "source": "dblp", "result_id": "dblp:doi:10.1016/j.knosys.2017.07.008"}, {"title": "SeDAn: a Plausible Reasoning Approach for Semantics-based Data Analytics in Healthcare", "authors": ["Hossein Mohammadhassanzadeh", "Samina Raza Abidi", "Mohammad Salman Shah", "Mehdi Karamollahi", "Syed Sibte Raza Abidi"], "year": 2017, "publication": "WAIAH@AI*IA", "link": "https://ceur-ws.org/Vol-1982/paper7.pdf", "snippet": "WAIAH@AI*IA, 2017", "source": "dblp", "result_id": "dblp:sedan_a_plausible_reasoning_approach_for_semantics_based_data_an"}, {"title": "A Semantic Web Framework for Behavioral User Modeling and Action Planning for Personalized Behavior Modification", "authors": ["William Van Woensel", "Wasif Baig", "Syed Sibte Raza Abidi", "Samina Abidi"], "year": 2017, "publication": "SWAT4LS", "link": "https://ceur-ws.org/Vol-2042/paper21.pdf", "snippet": "SWAT4LS, 2017", "source": "dblp", "result_id": "dblp:a_semantic_web_framework_for_behavioral_user_modeling_and_action"}, {"title": "Achieving Pro-Active Guidance of Patients through ADL using Knowledge-Driven Activity Recognition and Complex Semantic Workflows", "authors": ["William Van Woensel", "Patrice C. Roy", "Syed Sibte Raza Abidi"], "year": 2017, "publication": "SWAT4LS", "link": "https://ceur-ws.org/Vol-2042/paper22.pdf", "snippet": "SWAT4LS, 2017", "source": "dblp", "result_id": "dblp:achieving_pro_active_guidance_of_patients_through_adl_using_know"}, {"title": "Exploiting Semantic Web Technologies to Develop OWL-Based Clinical Practice Guideline Execution Engines", "authors": ["Borna Jafarpour", "Samina Raza Abidi", "Syed Sibte Raza Abidi"], "year": 2016, "publication": "IEEE J. Biomed. Health Informatics", "link": "https://doi.org/10.1109/JBHI.2014.2383840", "snippet": "IEEE J. Biomed. Health Informatics, 2016, 10.1109/jbhi.2014.2383840", "source": "dblp", "result_id": "dblp:doi:10.1109/jbhi.2014.2383840"}, {"title": "A Predictive Model for Personalized Therapeutic Interventions in Non-small Cell Lung Cancer", "authors": ["Nelofar Kureshi", "Syed Sibte Raza Abidi", "Christian Blouin"], "year": 2016, "publication": "IEEE J. Biomed. Health Informatics", "link": "https://doi.org/10.1109/JBHI.2014.2377517", "snippet": "IEEE J. Biomed. Health Informatics, 2016, 10.1109/jbhi.2014.2377517", "source": "dblp", "result_id": "dblp:doi:10.1109/jbhi.2014.2377517"}, {"title": "A semantic web-based approach to plausible reasoning for improving clinical knowledge engineering", "authors": ["Hossein Mohammadhassanzadeh", "William Van Woensel", "Samina Raza Abidi", "Syed Sibte Raza Abidi"], "year": 2016, "publication": "BHI", "link": "https://doi.org/10.1109/BHI.2016.7455950", "snippet": "BHI, 2016, 10.1109/bhi.2016.7455950", "source": "dblp", "result_id": "dblp:doi:10.1109/bhi.2016.7455950"}, {"title": "Transcription of Case Report Forms from Unstructured Referral Letters: A Semantic Text Analytics Approach", "authors": ["Syed Sibte Raza Abidi", "Abhinav Kumar Singh", "Sean Christie"], "year": 2016, "publication": "MIE", "link": "https://doi.org/10.3233/978-1-61499-678-1-322", "snippet": "MIE, 2016, 10.3233/978-1-61499-678-1-322", "source": "dblp", "result_id": "dblp:doi:10.3233/978-1-61499-678-1-322"}, {"title": "An Ontological Model of Behaviour Theory to Generate Personalized Action Plans to Modify Behaviours", "authors": ["Wasif Baig", "Samina Raza Abidi", "Syed Sibte Raza Abidi"], "year": 2016, "publication": "MIE", "link": "https://doi.org/10.3233/978-1-61499-678-1-399", "snippet": "MIE, 2016, 10.3233/978-1-61499-678-1-399", "source": "dblp", "result_id": "dblp:doi:10.3233/978-1-61499-678-1-399"}, {"title": "A Digital Health System to Assist Family Physicians to Safely Prescribe NOAC Medications", "authors": ["Samina Raza Abidi", "Jafna Cox", "Ashraf Abusharekh", "Nima Hashemian", "Syed Sibte Raza Abidi"], "year": 2016, "publication": "MIE", "link": "https://doi.org/10.3233/978-1-61499-678-1-519", "snippet": "MIE, 2016, 10.3233/978-1-61499-678-1-519", "source": "dblp", "result_id": "dblp:doi:10.3233/978-1-61499-678-1-519"}, {"title": "SmartRL: A Context-Sensitive, Ontology-Based Rule Language for Assisted Living in Smart Environments", "authors": ["William Van Woensel", "Patrice C. Roy", "Syed Sibte Raza Abidi"], "year": 2016, "publication": "RuleML", "link": "https://doi.org/10.1007/978-3-319-42019-6_22", "snippet": "RuleML, 2016, 10.1007/978-3-319-42019-6_22", "source": "dblp", "result_id": "dblp:doi:10.1007/978-3-319-42019-6_22"}, {"title": "H-DRIVE: A Big Health Data Analytics Platform for Evidence-Informed Decision Making", "authors": ["Ashraf Abusharekh", "Samuel Alan Stewart", "Nima Hashemian", "Syed Sibte Raza Abidi"], "year": 2015, "publication": "BigData Congress", "link": "https://doi.org/10.1109/BigDataCongress.2015.68", "snippet": "BigData Congress, 2015, 10.1109/bigdatacongress.2015.68", "source": "dblp", "result_id": "dblp:doi:10.1109/bigdatacongress.2015.68"}, {"title": "Towards a 'Big' Health Data Analytics Platform", "authors": ["Sangwhan Cha", "Ashraf Abusharekh", "Syed Sibte Raza Abidi"], "year": 2015, "publication": "BigDataService", "link": "https://doi.org/10.1109/BigDataService.2015.13", "snippet": "BigDataService, 2015, 10.1109/bigdataservice.2015.13", "source": "dblp", "result_id": "dblp:doi:10.1109/bigdataservice.2015.13"}, {"title": "A Mobile and Intelligent Patient Diary for Chronic Disease Self-Management", "authors": ["William Van Woensel", "Patrice C. Roy", "Samina Raza Abidi", "Syed Sibte Raza Abidi"], "year": 2015, "publication": "MedInfo", "link": "https://doi.org/10.3233/978-1-61499-564-7-118", "snippet": "MedInfo, 2015, 10.3233/978-1-61499-564-7-118", "source": "dblp", "result_id": "dblp:doi:10.3233/978-1-61499-564-7-118"}, {"title": "INITIATE: An Intelligent Adaptive Alert Environment", "authors": ["Borna Jafarpour", "Samina Raza Abidi", "Ahmad Marwan Ahmad", "Syed Sibte Raza Abidi"], "year": 2015, "publication": "MedInfo", "link": "https://doi.org/10.3233/978-1-61499-564-7-285", "snippet": "MedInfo, 2015, 10.3233/978-1-61499-564-7-285", "source": "dblp", "result_id": "dblp:doi:10.3233/978-1-61499-564-7-285"}, {"title": "Multi-Strategy Semantic Web Reasoning for Medical Knowledge Bases", "authors": ["William Van Woensel", "Hossein Mohammadhassanzadeh", "Samina Raza Abidi", "Syed Sibte Raza Abidi"], "year": 2015, "publication": "BDM2I@ISWC", "link": "https://ceur-ws.org/Vol-1428/BDM2I_2015_paper_8.pdf", "snippet": "BDM2I@ISWC, 2015", "source": "dblp", "result_id": "dblp:multi_strategy_semantic_web_reasoning_for_medical_knowledge_base"}, {"title": "A multi-phase correlation search framework for mining non-taxonomic relations from unstructured text", "authors": ["Mei Kuan Wong", "Syed Sibte Raza Abidi", "Ian D. Jonsen"], "year": 2014, "publication": "Knowl. Inf. Syst.", "link": "https://doi.org/10.1007/s10115-012-0593-7", "snippet": "Knowl. Inf. Syst., 2014, 10.1007/s10115-012-0593-7", "source": "dblp", "result_id": "dblp:doi:10.1007/s10115-012-0593-7"}, {"title": "Integrating existing large scale medical laboratory data into the semantic web framework", "authors": ["Newres Al Haider", "Samina Raza Abidi", "William Van Woensel", "Syed Sibte Raza Abidi"], "year": 2014, "publication": "IEEE BigData", "link": "https://doi.org/10.1109/BigData.2014.7004338", "snippet": "IEEE BigData, 2014, 10.1109/bigdata.2014.7004338", "source": "dblp", "result_id": "dblp:doi:10.1109/bigdata.2014.7004338"}, {"title": "Clinical Guideline-Driven Personalized Self-Management Diary for Paediatric Cancer Survivors", "authors": ["Samuel Alan Stewart", "Samina Raza Abidi", "Louise Parker", "Mark Bernstein", "Syed Sibte Raza Abidi"], "year": 2014, "publication": "MIE", "link": "https://doi.org/10.3233/978-1-61499-432-9-18", "snippet": "MIE, 2014, 10.3233/978-1-61499-432-9-18", "source": "dblp", "result_id": "dblp:doi:10.3233/978-1-61499-432-9-18"}, {"title": "Shared Decision Making: Using Theories and Technology to Engage the Patient in Their Health Journey", "authors": ["Amina Russell", "Samina Raza Abidi", "Syed Sibte Raza Abidi"], "year": 2014, "publication": "MIE", "link": "https://doi.org/10.3233/978-1-61499-432-9-303", "snippet": "MIE, 2014, 10.3233/978-1-61499-432-9-303", "source": "dblp", "result_id": "dblp:doi:10.3233/978-1-61499-432-9-303"}, {"title": "A Cross-Platform Benchmark Framework for Mobile Semantic Web Reasoning Engines", "authors": ["William Van Woensel", "Newres Al Haider", "Ahmad Marwan Ahmad", "Syed Sibte Raza Abidi"], "year": 2014, "publication": "ISWC (1)", "link": "https://doi.org/10.1007/978-3-319-11964-9_25", "snippet": "ISWC (1), 2014, 10.1007/978-3-319-11964-9_25", "source": "dblp", "result_id": "dblp:doi:10.1007/978-3-319-11964-9_25"}, {"title": "A Comparison of Mobile Rule Engines for Reasoning on Semantic Web Based Health Data", "authors": ["William Van Woensel", "Newres Al Haider", "Patrice C. Roy", "Ahmad Marwan Ahmad", "Syed Sibte Raza Abidi"], "year": 2014, "publication": "WI-IAT (2)", "link": "https://doi.org/10.1109/WI-IAT.2014.25", "snippet": "WI-IAT (2), 2014, 10.1109/wi-iat.2014.25", "source": "dblp", "result_id": "dblp:doi:10.1109/wi-iat.2014.25"}, {"title": "Web Service Matchmaking Using a Hybrid of Signature and Specification Matching Methods", "authors": ["Syed Sibte Raza Abidi", "Ali Daniyal", "Syed Farrukh Mehdi"], "year": 2014, "publication": "WI-IAT (1)", "link": "https://doi.org/10.1109/WI-IAT.2014.107", "snippet": "WI-IAT (1), 2014, 10.1109/wi-iat.2014.107", "source": "dblp", "result_id": "dblp:doi:10.1109/wi-iat.2014.107"}, {"title": "Merging Disease-Specific Clinical Guidelines to Handle Comorbidities in a Clinical Decision Support Setting", "authors": ["Borna Jafarpour", "Syed Sibte Raza Abidi"], "year": 2013, "publication": "AIME", "link": "https://doi.org/10.1007/978-3-642-38326-7_5", "snippet": "AIME, 2013, 10.1007/978-3-642-38326-7_5", "source": "dblp", "result_id": "dblp:doi:10.1007/978-3-642-38326-7_5"}, {"title": "An Ontology-Driven Personalization Framework for Designing Theory-Driven Self-management Interventions", "authors": ["Syed Sibte Raza Abidi", "Samina Raza Abidi"], "year": 2013, "publication": "KR4HC/ProHealth", "link": "https://doi.org/10.1007/978-3-319-03916-9_8", "snippet": "KR4HC/ProHealth, 2013, 10.1007/978-3-319-03916-9_8", "source": "dblp", "result_id": "dblp:doi:10.1007/978-3-319-03916-9_8"}, {"title": "A Semantic Web Based Ontology Mapping and Instance Transformation Framework", "authors": ["Borna Jafarpour", "Syed Sibte Raza Abidi"], "year": 2013, "publication": "CSWS", "link": "https://ceur-ws.org/Vol-1054/paper-03.pdf", "snippet": "CSWS, 2013", "source": "dblp", "result_id": "dblp:a_semantic_web_based_ontology_mapping_and_instance_transformatio"}, {"title": "Dataflow Oriented Similarity Matching for Scientific Workflows", "authors": ["Philip Yeo", "Syed Sibte Raza Abidi"], "year": 2013, "publication": "IPDPS Workshops", "link": "https://doi.org/10.1109/IPDPSW.2013.69", "snippet": "IPDPS Workshops, 2013, 10.1109/ipdpsw.2013.69", "source": "dblp", "result_id": "dblp:doi:10.1109/ipdpsw.2013.69"}, {"title": "Usability Evaluation of Family Physicians' Interaction with the Comorbidity Ontological Modeling and ExecuTion System (COMET)", "authors": ["Samina Raza Abidi", "Samuel Alan Stewart", "Michael A. Shepherd", "Syed Sibte Raza Abidi"], "year": 2013, "publication": "MedInfo", "link": "https://doi.org/10.3233/978-1-61499-289-9-447", "snippet": "MedInfo, 2013, 10.3233/978-1-61499-289-9-447", "source": "dblp", "result_id": "dblp:doi:10.3233/978-1-61499-289-9-447"}, {"title": "An Infobutton For Web 2.0 Clinical Discussions: The Knowledge Linkage Framework", "authors": ["Samuel Alan Stewart", "Syed Sibte Raza Abidi"], "year": 2012, "publication": "IEEE Trans. Inf. Technol. Biomed.", "link": "https://doi.org/10.1109/TITB.2011.2177097", "snippet": "IEEE Trans. Inf. Technol. Biomed., 2012, 10.1109/titb.2011.2177097", "source": "dblp", "result_id": "dblp:doi:10.1109/titb.2011.2177097"}, {"title": "An ontological modeling approach to align institution-specific Clinical Pathways: Towards inter-institution care standardization", "authors": ["Samina Raza Abidi", "Syed Sibte Raza Abidi"], "year": 2012, "publication": "CBMS", "link": "https://doi.org/10.1109/CBMS.2012.6266392", "snippet": "CBMS, 2012, 10.1109/cbms.2012.6266392", "source": "dblp", "result_id": "dblp:doi:10.1109/cbms.2012.6266392"}, {"title": "Modeling clinical workflows using business process modeling notation", "authors": ["Nima Hashemian", "Syed Sibte Raza Abidi"], "year": 2012, "publication": "CBMS", "link": "https://doi.org/10.1109/CBMS.2012.6266322", "snippet": "CBMS, 2012, 10.1109/cbms.2012.6266322", "source": "dblp", "result_id": "dblp:doi:10.1109/cbms.2012.6266322"}, {"title": "Using OWL Ontologies for Clinical Guidelines Based Comorbid Decision Support", "authors": ["Samina Raza Abidi", "Jafna Cox", "Syed Sibte Raza Abidi", "Michael A. Shepherd"], "year": 2012, "publication": "HICSS", "link": "https://doi.org/10.1109/HICSS.2012.629", "snippet": "HICSS, 2012, 10.1109/hicss.2012.629", "source": "dblp", "result_id": "dblp:doi:10.1109/hicss.2012.629"}, {"title": "Comparing Metamap to MGrep as a Tool for Mapping Free Text to Formal Medical Lexions", "authors": ["Samuel Alan Stewart", "Maia Elizabeth von Maltzahn", "Syed Sibte Raza Abidi"], "year": 2012, "publication": "KECSM@ISWC", "link": "https://ceur-ws.org/Vol-895/paper7.pdf", "snippet": "KECSM@ISWC, 2012", "source": "dblp", "result_id": "dblp:comparing_metamap_to_mgrep_as_a_tool_for_mapping_free_text_to_fo"}, {"title": "Exploiting OWL Reasoning Services to Execute Ontologically-Modeled Clinical Practice Guidelines", "authors": ["Borna Jafarpour", "Samina Raza Abidi", "Syed Sibte Raza Abidi"], "year": 2011, "publication": "AIME", "link": "https://doi.org/10.1007/978-3-642-22218-4_39", "snippet": "AIME, 2011, 10.1007/978-3-642-22218-4_39", "source": "dblp", "result_id": "dblp:doi:10.1007/978-3-642-22218-4_39"}, {"title": "Understanding Medicine 2.0 - Social Network Analysis and the VECoN System", "authors": ["Samuel Alan Stewart", "Syed Sibte Raza Abidi"], "year": 2011, "publication": "HEALTHINF", "link": "db/conf/biostec/healthinf2011.html#StewartA11", "snippet": "HEALTHINF, 2011", "source": "dblp", "result_id": "dblp:understanding_medicine_2_0_social_network_analysis_and_the_vecon"}, {"title": "Using Social Network Analysis to Study the Knowledge Sharing Patterns of Health Professionals Using Web 2.0 Tools", "authors": ["Samuel Alan Stewart", "Syed Sibte Raza Abidi"], "year": 2011, "publication": "BIOSTEC (Selected Papers)", "link": "https://doi.org/10.1007/978-3-642-29752-6_25", "snippet": "BIOSTEC (Selected Papers), 2011, 10.1007/978-3-642-29752-6_25", "source": "dblp", "result_id": "dblp:doi:10.1007/978-3-642-29752-6_25"}, {"title": "Detecting and Resolving Inconsistencies in Ontologies Using Contradiction Derivations", "authors": ["Sajjad Hussain", "Jos De Roo", "Ali Daniyal", "Syed Sibte Raza Abidi"], "year": 2011, "publication": "COMPSAC", "link": "https://doi.org/10.1109/COMPSAC.2011.76", "snippet": "COMPSAC, 2011, 10.1109/compsac.2011.76", "source": "dblp", "result_id": "dblp:doi:10.1109/compsac.2011.76"}, {"title": "An Ontology-Based Electronic Medical Record for Chronic Disease Management", "authors": ["Ashraf Mohammed Iqbal", "Michael A. Shepherd", "Syed Sibte Raza Abidi"], "year": 2011, "publication": "HICSS", "link": "https://doi.org/10.1109/HICSS.2011.61", "snippet": "HICSS, 2011, 10.1109/hicss.2011.61", "source": "dblp", "result_id": "dblp:doi:10.1109/hicss.2011.61"}, {"title": "Mining Non-taxonomic Concept Pairs from Unstructured Text - A Concept Correlation Search Framework", "authors": ["Mei Kuan Wong", "Syed Sibte Raza Abidi", "Ian D. Jonsen"], "year": 2011, "publication": "WEBIST", "link": "db/conf/webist/webist2011.html#WongAJ11", "snippet": "WEBIST, 2011", "source": "dblp", "result_id": "dblp:mining_non_taxonomic_concept_pairs_from_unstructured_text_a_conc"}, {"title": "A Knowledge-centric e-Research Platform for Marine Life and Oceanographic Research", "authors": ["Ali Daniyal", "Samina Raza Abidi", "Ashraf Abusharekh", "Mei Kuan Wong", "Syed Sibte Raza Abidi"], "year": 2010, "publication": "KMIS", "link": "db/conf/ic3k/kmis2010.html#DaniyalAAWA10", "snippet": "KMIS, 2010", "source": "dblp", "result_id": "dblp:a_knowledge_centric_e_research_platform_for_marine_life_and_ocea"}, {"title": "A Compositional Personalization Approach for Designing Personalized Patient Educational Interventions for Cardiovascular Risk Management", "authors": ["Selena Davis", "Syed Sibte Raza Abidi", "Samuel Alan Stewart"], "year": 2010, "publication": "MedInfo", "link": "https://doi.org/10.3233/978-1-60750-588-4-629", "snippet": "MedInfo, 2010, 10.3233/978-1-60750-588-4-629", "source": "dblp", "result_id": "dblp:doi:10.3233/978-1-60750-588-4-629"}, {"title": "Ontology Based Modeling and Execution of Nursing Care Plans and Practice Guidelines", "authors": ["Muzammil Abdulrehman Din", "Syed Sibte Raza Abidi", "Borna Jafarpour"], "year": 2010, "publication": "MedInfo", "link": "https://doi.org/10.3233/978-1-60750-588-4-1104", "snippet": "MedInfo, 2010, 10.3233/978-1-60750-588-4-1104", "source": "dblp", "result_id": "dblp:doi:10.3233/978-1-60750-588-4-1104"}, {"title": "Pediatric Pain Management Knowledge Linkages: Mapping Experiential Knowledge to Explicit Knowledge", "authors": ["Samuel Alan Stewart", "Syed Sibte Raza Abidi", "G. Allen Finley"], "year": 2010, "publication": "MedInfo", "link": "https://doi.org/10.3233/978-1-60750-588-4-1184", "snippet": "MedInfo, 2010, 10.3233/978-1-60750-588-4-1184", "source": "dblp", "result_id": "dblp:doi:10.3233/978-1-60750-588-4-1184"}, {"title": "A Service Oriented E-Research Platform for Ocean Knowledge Management", "authors": ["Syed Sibte Raza Abidi", "Ashraf Abusharekh", "Ali Daniyal", "Mei Kuan", "Farrukh Mehdi", "Samina Raza Abidi", "Faisal Abbas", "Philip Yeo", "Farhan Jamal", "Reza Fathzadeh"], "year": 2010, "publication": "SERVICES", "link": "https://doi.org/10.1109/SERVICES.2010.19", "snippet": "SERVICES, 2010, 10.1109/services.2010.19", "source": "dblp", "result_id": "dblp:doi:10.1109/services.2010.19"}, {"title": "Extracting and Merging Contextualized Ontology Modules", "authors": ["Sajjad Hussain", "Syed Sibte Raza Abidi"], "year": 2010, "publication": "WoMO", "link": "https://doi.org/10.3233/978-1-60750-544-0-25", "snippet": "WoMO, 2010, 10.3233/978-1-60750-544-0-25", "source": "dblp", "result_id": "dblp:doi:10.3233/978-1-60750-544-0-25"}, {"title": "Towards the Merging of Multiple Clinical Protocols and Guidelines via Ontology-Driven Modeling", "authors": ["Samina Raza Abidi", "Syed Sibte Raza Abidi"], "year": 2009, "publication": "AIME", "link": "https://doi.org/10.1007/978-3-642-02976-9_10", "snippet": "AIME, 2009, 10.1007/978-3-642-02976-9_10", "source": "dblp", "result_id": "dblp:doi:10.1007/978-3-642-02976-9_10"}, {"title": "Semantic Web-Based Modeling of Clinical Pathways Using the UML Activity Diagrams and OWL-S", "authors": ["Ali Daniyal", "Syed Sibte Raza Abidi"], "year": 2009, "publication": "KR4HC", "link": "https://doi.org/10.1007/978-3-642-11808-1_8", "snippet": "KR4HC, 2009, 10.1007/978-3-642-11808-1_8", "source": "dblp", "result_id": "dblp:doi:10.1007/978-3-642-11808-1_8"}, {"title": "Integrating Healthcare Knowledge Artifacts for Clinical Decision Support: Towards Semantic Web Based Healthcare Knowledge Morphing", "authors": ["Sajjad Hussain", "Syed Sibte Raza Abidi"], "year": 2009, "publication": "AIME", "link": "https://doi.org/10.1007/978-3-642-02976-9_23", "snippet": "AIME, 2009, 10.1007/978-3-642-02976-9_23", "source": "dblp", "result_id": "dblp:doi:10.1007/978-3-642-02976-9_23"}, {"title": "Knowledge Sharing for Pediatric Pain Management via a Web 2.0 Framework", "authors": ["Syed Sibte Raza Abidi", "Salah Hussini", "Wimorat Sriraj", "Somboon Thienthong", "G. Allen Finley"], "year": 2009, "publication": "MIE", "link": "https://doi.org/10.3233/978-1-60750-044-5-287", "snippet": "MIE, 2009, 10.3233/978-1-60750-044-5-287", "source": "dblp", "result_id": "dblp:doi:10.3233/978-1-60750-044-5-287"}, {"title": "Computerizing Clinical Pathways: Ontology-Based Modeling and Execution", "authors": ["Ali Daniyal", "Samina Raza Abidi", "Syed Sibte Raza Abidi"], "year": 2009, "publication": "MIE", "link": "https://doi.org/10.3233/978-1-60750-044-5-643", "snippet": "MIE, 2009, 10.3233/978-1-60750-044-5-643", "source": "dblp", "result_id": "dblp:doi:10.3233/978-1-60750-044-5-643"}, {"title": "A Web Recommender System for Recommending, Predicting and Personalizing Music Playlists", "authors": ["Zeina Chedrawy", "Syed Sibte Raza Abidi"], "year": 2009, "publication": "WISE", "link": "https://doi.org/10.1007/978-3-642-04409-0_34", "snippet": "WISE, 2009, 10.1007/978-3-642-04409-0_34", "source": "dblp", "result_id": "dblp:doi:10.1007/978-3-642-04409-0_34"}, {"title": "Operationalizing Prostate Cancer Clinical Pathways: An Ontological Model to Computerize, Merge and Execute Institution-Specific Clinical Pathways", "authors": ["Samina Raza Abidi", "Syed Sibte Raza Abidi", "Lorna Butler", "Sajjad Hussain"], "year": 2008, "publication": "K4HelP", "link": "https://doi.org/10.1007/978-3-642-03262-2_1", "snippet": "K4HelP, 2008, 10.1007/978-3-642-03262-2_1", "source": "dblp", "result_id": "dblp:doi:10.1007/978-3-642-03262-2_1"}, {"title": "Modeling the Form and Function of Clinical Practice Guidelines: An Ontological Model to Computerize Clinical Practice Guidelines", "authors": ["Syed Sibte Raza Abidi", "Shapoor Shayegani"], "year": 2008, "publication": "K4HelP", "link": "https://doi.org/10.1007/978-3-642-03262-2_7", "snippet": "K4HelP, 2008, 10.1007/978-3-642-03262-2_7", "source": "dblp", "result_id": "dblp:doi:10.1007/978-3-642-03262-2_7"}, {"title": "Evaluation of an online discussion forum for emergency practitioners", "authors": ["Janet Curran", "Syed Sibte Raza Abidi"], "year": 2007, "publication": "Health Informatics J.", "link": "https://doi.org/10.1177/1460458207079834", "snippet": "Health Informatics J., 2007, 10.1177/1460458207079834", "source": "dblp", "result_id": "dblp:doi:10.1177/1460458207079834"}, {"title": "Healthcare Knowledge Management: The Art of the Possible", "authors": ["Syed Sibte Raza Abidi"], "year": 2007, "publication": "K4CARE", "link": "https://doi.org/10.1007/978-3-540-78624-5_1", "snippet": "K4CARE, 2007, 10.1007/978-3-540-78624-5_1", "source": "dblp", "result_id": "dblp:doi:10.1007/978-3-540-78624-5_1"}, {"title": "Semantic Web Framework for Knowledge-Centric Clinical Decision Support Systems", "authors": ["Sajjad Hussain", "Samina Raza Abidi", "Syed Sibte Raza Abidi"], "year": 2007, "publication": "AIME", "link": "https://doi.org/10.1007/978-3-540-73599-1_60", "snippet": "AIME, 2007, 10.1007/978-3-540-73599-1_60", "source": "dblp", "result_id": "dblp:doi:10.1007/978-3-540-73599-1_60"}, {"title": "Ontology Engineering to Model Clinical Pathways: Towards the Computerization and Execution of Clinical Pathways", "authors": ["Katrina F. Hurley", "Syed Sibte Raza Abidi"], "year": 2007, "publication": "CBMS", "link": "https://doi.org/10.1109/CBMS.2007.79", "snippet": "CBMS, 2007, 10.1109/cbms.2007.79", "source": "dblp", "result_id": "dblp:doi:10.1109/cbms.2007.79"}, {"title": "Medical Knowledge Morphing via a Semantic Web Framework", "authors": ["Syed Sibte Raza Abidi", "Sajjad Hussain"], "year": 2007, "publication": "CBMS", "link": "https://doi.org/10.1109/CBMS.2007.70", "snippet": "CBMS, 2007, 10.1109/cbms.2007.70", "source": "dblp", "result_id": "dblp:doi:10.1109/cbms.2007.70"}, {"title": "Ontology Driven CPG Authoring and Execution via a Semantic Web Framework", "authors": ["Sajjad Hussain", "Syed Sibte Raza Abidi"], "year": 2007, "publication": "HICSS", "link": "https://doi.org/10.1109/HICSS.2007.408", "snippet": "HICSS, 2007, 10.1109/hicss.2007.408", "source": "dblp", "result_id": "dblp:doi:10.1109/hicss.2007.408"}, {"title": "Ontology-based Modeling of Clinical Practice Guidelines: A Clinical Decision Support System for Breast Cancer Follow-up Interventions at Primary Care Settings", "authors": ["Samina Raza Abidi", "Syed Sibte Raza Abidi", "Sajjad Hussain", "Mike Shepherd"], "year": 2007, "publication": "MedInfo", "link": "https://doi.org/10.3233/978-1-58603-774-1-845", "snippet": "MedInfo, 2007, 10.3233/978-1-58603-774-1-845", "source": "dblp", "result_id": "dblp:doi:10.3233/978-1-58603-774-1-845"}, {"title": "Automated Interpretation of Optic Nerve Images: A Data Mining Framework for Glaucoma Diagnostic Support", "authors": ["Syed Sibte Raza Abidi", "Paul Habib Artes", "Sanjan Yun", "Jin Yu"], "year": 2007, "publication": "MedInfo", "link": "https://doi.org/10.3233/978-1-58603-774-1-1309", "snippet": "MedInfo, 2007, 10.3233/978-1-58603-774-1-1309", "source": "dblp", "result_id": "dblp:doi:10.3233/978-1-58603-774-1-1309"}, {"title": "Information Systems and Health Care IX: Accessing Tacit Knowledge and Linking It to the Peer-Reviewed Literature", "authors": ["Michael A. Shepherd", "Syed Sibte Raza Abidi", "Qigang Gao", "Zhixin Chen", "Quifen Qi", "G. Allen Finley"], "year": 2006, "publication": "Commun. Assoc. Inf. Syst.", "link": "https://doi.org/10.17705/1cais.01740", "snippet": "Commun. Assoc. Inf. Syst., 2006, 10.17705/1cais.01740", "source": "dblp", "result_id": "dblp:doi:10.17705/1cais.01740"}, {"title": "Generating customized yet factually consistent information: a constraint satisfaction approach", "authors": ["Syed Sibte Raza Abidi", "Yong Han Chong", "Yan Zeng"], "year": 2006, "publication": "Int. J. Digit. Libr.", "link": "https://doi.org/10.1007/s00799-006-0003-4", "snippet": "Int. J. Digit. Libr., 2006, 10.1007/s00799-006-0003-4", "source": "dblp", "result_id": "dblp:doi:10.1007/s00799-006-0003-4"}, {"title": "An Adaptive Personalized Recommendation Strategy Featuring Context Sensitive Content Adaptation", "authors": ["Zeina Chedrawy", "Syed Sibte Raza Abidi"], "year": 2006, "publication": "AH", "link": "https://doi.org/10.1007/11768012_8", "snippet": "AH, 2006, 10.1007/11768012_8", "source": "dblp", "result_id": "dblp:doi:10.1007/11768012_8"}, {"title": "Adaptive Patient Education Framework Featuring Personalized Cardiovascular Risk Management Interventions", "authors": ["Selena Davis", "Syed Sibte Raza Abidi"], "year": 2006, "publication": "AH", "link": "https://doi.org/10.1007/11768012_30", "snippet": "AH, 2006, 10.1007/11768012_30", "source": "dblp", "result_id": "dblp:doi:10.1007/11768012_30"}, {"title": "An Adaptive Hypermedia System Using a Constraint Satisfaction Approach for Information Personalization", "authors": ["Syed Sibte Raza Abidi", "Yan Zeng"], "year": 2006, "publication": "AH", "link": "https://doi.org/10.1007/11768012_55", "snippet": "AH, 2006, 10.1007/11768012_55", "source": "dblp", "result_id": "dblp:doi:10.1007/11768012_55"}, {"title": "Intelligent Information Personalization Leveraging Constraint Satisfaction and Association Rule Methods", "authors": ["Syed Sibte Raza Abidi", "Yan Zeng"], "year": 2006, "publication": "Canadian AI", "link": "https://doi.org/10.1007/11766247_12", "snippet": "Canadian AI, 2006, 10.1007/11766247_12", "source": "dblp", "result_id": "dblp:doi:10.1007/11766247_12"}, {"title": "Linking Tacit Knowledge in the Pediatric Pain e-Mail Archives and Explicit Knowledge in PubMed", "authors": ["Zhixin Chen", "Michael A. Shepherd", "Syed Sibte Raza Abidi", "G. Allen Finley"], "year": 2006, "publication": "HICSS", "link": "https://doi.org/10.1109/HICSS.2006.255", "snippet": "HICSS, 2006, 10.1109/hicss.2006.255", "source": "dblp", "result_id": "dblp:doi:10.1109/hicss.2006.255"}, {"title": "Personalized cardiovascular risk management linking SCORE and behaviour change to web-based education", "authors": ["Selena Davis", "Syed Sibte Raza Abidi", "Jafna Cox"], "year": 2006, "publication": "MIE", "link": "https://doi.org/10.3233/978-1-58603-647-8-235", "snippet": "MIE, 2006, 10.3233/978-1-58603-647-8-235", "source": "dblp", "result_id": "dblp:doi:10.3233/978-1-58603-647-8-235"}, {"title": "Evaluation of a Discussion Forum for Knowledge Sharing Among Emergency Practitioners: A Social Network Approach", "authors": ["Janet Curran", "Syed Sibte Raza Abidi"], "year": 2006, "publication": "MIE", "link": "https://doi.org/10.3233/978-1-58603-647-8-941", "snippet": "MIE, 2006, 10.3233/978-1-58603-647-8-941", "source": "dblp", "result_id": "dblp:doi:10.3233/978-1-58603-647-8-941"}, {"title": "Towards a collaborative learning environment for children's pain management: leveraging an online discussion forum", "authors": ["Janet Curran-Smith", "Syed Sibte Raza Abidi", "Paula Forgeron"], "year": 2005, "publication": "Health Informatics J.", "link": "https://doi.org/10.1177/1460458205050682", "snippet": "Health Informatics J., 2005, 10.1177/1460458205050682", "source": "dblp", "result_id": "dblp:doi:10.1177/1460458205050682"}, {"title": "Augmenting GEM-encoded clinical practice guidelines with relevant best evidence autonomously retrieved from MEDLINE", "authors": ["Syed Sibte Raza Abidi", "Michael Kershaw", "Evangelos E. Milios"], "year": 2005, "publication": "Health Informatics J.", "link": "https://doi.org/10.1177/1460458205050684", "snippet": "Health Informatics J., 2005, 10.1177/1460458205050684", "source": "dblp", "result_id": "dblp:doi:10.1177/1460458205050684"}, {"title": "A knowledge creation info-structure to acquire and crystallize the tacit knowledge of health-care experts", "authors": ["Syed Sibte Raza Abidi", "Yu-N Cheah", "Janet Curran-Smith"], "year": 2005, "publication": "IEEE Trans. Inf. Technol. Biomed.", "link": "https://doi.org/10.1109/TITB.2005.847188", "snippet": "IEEE Trans. Inf. Technol. Biomed., 2005, 10.1109/titb.2005.847188", "source": "dblp", "result_id": "dblp:doi:10.1109/titb.2005.847188"}, {"title": "Automated Optic Nerve Analysis for Diagnostic Support in Glaucoma", "authors": ["Jin Yu", "Syed Sibte Raza Abidi", "Paul Habib Artes", "Andrew R. McIntyre", "Malcolm I. Heywood"], "year": 2005, "publication": "CBMS", "link": "https://doi.org/10.1109/CBMS.2005.36", "snippet": "CBMS, 2005, 10.1109/cbms.2005.36", "source": "dblp", "result_id": "dblp:doi:10.1109/cbms.2005.36"}, {"title": "Medical Knowledge Morphing: Towards Case-Specific Integration of Heterogeneous Medical Knowledge Resources", "authors": ["Syed Sibte Raza Abidi"], "year": 2005, "publication": "CBMS", "link": "https://doi.org/10.1109/CBMS.2005.74", "snippet": "CBMS, 2005, 10.1109/cbms.2005.74", "source": "dblp", "result_id": "dblp:doi:10.1109/cbms.2005.74"}, {"title": "BiRD: A Strategy to Autonomously Supplement Clinical Practice Guidelines with Related Clinical Studies", "authors": ["Syed Sibte Raza Abidi", "Michael Kershaw", "Evangelos E. Milios"], "year": 2005, "publication": "HICSS", "link": "https://doi.org/10.1109/HICSS.2005.121", "snippet": "HICSS, 2005, 10.1109/hicss.2005.121", "source": "dblp", "result_id": "dblp:doi:10.1109/hicss.2005.121"}, {"title": "Using Computerized Clinical Practice Guidelines to Generate Tailored Patient Education Materials", "authors": ["Brent Jones", "Syed Sibte Raza Abidi", "Winston Ying"], "year": 2005, "publication": "HICSS", "link": "https://doi.org/10.1109/HICSS.2005.655", "snippet": "HICSS, 2005, 10.1109/hicss.2005.655", "source": "dblp", "result_id": "dblp:doi:10.1109/hicss.2005.655"}, {"title": "An Item-Based Collaborative Filtering Framework Featuring Case Based Reasoning", "authors": ["Zeina Chedrawy", "Syed Sibte Raza Abidi"], "year": 2005, "publication": "IC-AI", "link": "db/conf/icai/icai2005-1.html#ChedrawyA05", "snippet": "IC-AI, 2005", "source": "dblp", "result_id": "dblp:an_item_based_collaborative_filtering_framework_featuring_case_b"}, {"title": "From Clusters to Rules: A Hybrid Framework for Generalized Symbolic Rule Induction", "authors": ["Qingshuang Jiang", "Syed Sibte Raza Abidi"], "year": 2005, "publication": "ICMLC", "link": "https://doi.org/10.1007/11739685_23", "snippet": "ICMLC, 2005, 10.1007/11739685_23", "source": "dblp", "result_id": "dblp:doi:10.1007/11739685_23"}, {"title": "An Intelligent Knowledge Sharing Strategy Featuring Item-Based Collaborative Filtering and Case Based Reasoning", "authors": ["Zeina Chedrawy", "Syed Sibte Raza Abidi"], "year": 2005, "publication": "ISDA", "link": "https://doi.org/10.1109/ISDA.2005.22", "snippet": "ISDA, 2005, 10.1109/isda.2005.22", "source": "dblp", "result_id": "dblp:doi:10.1109/isda.2005.22"}, {"title": "HealthInfoCDA: Case Composition Using Electronic Health Record Data Sources", "authors": ["Grace I. Paterson", "Syed Sibte Raza Abidi", "Steven D. Soroka"], "year": 2005, "publication": "MIE", "link": "http://ebooks.iospress.nl/volumearticle/10289", "snippet": "MIE, 2005", "source": "dblp", "result_id": "dblp:healthinfocda_case_composition_using_electronic_health_record_da"}, {"title": "Diagnostic Support for Glaucoma Using Retinal Images: A Hybrid Image Analysis and Data Mining Approach", "authors": ["Jin Yu", "Syed Sibte Raza Abidi", "Paul Habib Artes", "Andy McIntyre", "Malcolm I. Heywood"], "year": 2005, "publication": "MIE", "link": "http://ebooks.iospress.nl/volumearticle/10298", "snippet": "MIE, 2005", "source": "dblp", "result_id": "dblp:diagnostic_support_for_glaucoma_using_retinal_images_a_hybrid_im"}, {"title": "Analyzing Sub-Classifications of Glaucoma via SOM Based Clustering of Optic Nerve Images", "authors": ["Sanjun Yan", "Syed Sibte Raza Abidi", "Paul Habib Artes"], "year": 2005, "publication": "MIE", "link": "http://ebooks.iospress.nl/volumearticle/10349", "snippet": "MIE, 2005", "source": "dblp", "result_id": "dblp:analyzing_sub_classifications_of_glaucoma_via_som_based_clusteri"}, {"title": "A Knowledge Management Framework to Morph Clinical Cases with Clinical Practice Guidelines", "authors": ["Fehmida Hussain", "Syed Sibte Raza Abidi"], "year": 2005, "publication": "MIE", "link": "http://ebooks.iospress.nl/volumearticle/10392", "snippet": "MIE, 2005", "source": "dblp", "result_id": "dblp:a_knowledge_management_framework_to_morph_clinical_cases_with_cl"}, {"title": "Constraint Satisfaction Methods for Information Personalization", "authors": ["Syed Sibte Raza Abidi", "Yong Han Chong"], "year": 2004, "publication": "Canadian AI", "link": "https://doi.org/10.1007/978-3-540-24840-8_19", "snippet": "Canadian AI, 2004, 10.1007/978-3-540-24840-8_19", "source": "dblp", "result_id": "dblp:doi:10.1007/978-3-540-24840-8_19"}, {"title": "Toward Glaucoma Classification with Moment Methods", "authors": ["Andrew R. McIntyre", "Malcolm I. Heywood", "Paul Habib Artes", "Syed Sibte Raza Abidi"], "year": 2004, "publication": "CRV", "link": "https://doi.org/10.1109/CCCRV.2004.1301454", "snippet": "CRV, 2004, 10.1109/cccrv.2004.1301454", "source": "dblp", "result_id": "dblp:doi:10.1109/cccrv.2004.1301454"}, {"title": "Knowledge Management in Pediatric Pain: Mapping On-Line Expert Discussions to Medical Literature", "authors": ["Syed Sibte Raza Abidi", "G. Allen Finley", "Evangelos E. Milios", "Michael A. Shepherd", "David Zitner"], "year": 2004, "publication": "MedInfo", "link": "https://doi.org/10.3233/978-1-60750-949-3-3", "snippet": "MedInfo, 2004, 10.3233/978-1-60750-949-3-3", "source": "dblp", "result_id": "dblp:doi:10.3233/978-1-60750-949-3-3"}, {"title": "Intelligent Agents-mediated Approach for Experimental Knowledge of Healthcare Enterprise through CBR-adaptation Technique", "authors": ["Zafar Iqbal Hashmi", "Yu-N Cheah", "Syed Zahid Hassan", "Syed Sibte Raza Abidi"], "year": 2003, "publication": "CITA", "link": "db/conf/cita/cita2003.html#HashmiCHA03", "snippet": "CITA, 2003", "source": "dblp", "result_id": "dblp:intelligent_agents_mediated_approach_for_experimental_knowledge_"}, {"title": "Adaptive Hypermedia Systems Featuring Information Customization Using Constraint Satisfaction Methods", "authors": ["Chong Yan Han", "Syed Sibte Raza Abidi", "Yu-N Cheah"], "year": 2003, "publication": "ICWI", "link": "db/conf/iadis/icwi2003.html#HanAY03", "snippet": "ICWI, 2003", "source": "dblp", "result_id": "dblp:adaptive_hypermedia_systems_featuring_information_customization_"}, {"title": "Intelligent Agent Modeling and Generic Architecture Towards a Multi-Agent Healthcare Knowledge Management System", "authors": ["Zafar Iqbal Hashmi", "Yu-N Cheah", "Syed Zahid Hassan", "Kee Guan Lim", "Syed Sibte Raza Abidi"], "year": 2003, "publication": "ICWI", "link": "db/conf/iadis/icwi2003.html#HashmiCHLA03", "snippet": "ICWI, 2003", "source": "dblp", "result_id": "dblp:intelligent_agent_modeling_and_generic_architecture_towards_a_mu"}, {"title": "E-healthcare via Customized Information Services: Addressing the Need for Factually Consistent Information", "authors": ["Syed Sibte Raza Abidi", "Yong Han Chong"], "year": 2003, "publication": "ICSOC", "link": "https://doi.org/10.1007/978-3-540-24593-3_10", "snippet": "ICSOC, 2003, 10.1007/978-3-540-24593-3_10", "source": "dblp", "result_id": "dblp:doi:10.1007/978-3-540-24593-3_10"}, {"title": "An Approach to Enrich Online Medical Problem-Based Learning with Tacit Healthcare Knowledge", "authors": ["Yu-N Cheah", "Faridah Abdul Rashid", "Syed Sibte Raza Abidi"], "year": 2003, "publication": "MIE", "link": "https://doi.org/10.3233/978-1-60750-939-4-744", "snippet": "MIE, 2003, 10.3233/978-1-60750-939-4-744", "source": "dblp", "result_id": "dblp:doi:10.3233/978-1-60750-939-4-744"}, {"title": "Leveraging XML-based electronic medical records to extract experiential clinical knowledge: An automated approach to generate cases for medical case-based reasoning systems", "authors": ["Syed Sibte Raza Abidi", "Selvakumar Manickam"], "year": 2002, "publication": "Int. J. Medical Informatics", "link": "https://doi.org/10.1016/S1386-5056(02)00076-X", "snippet": "Int. J. Medical Informatics, 2002, 10.1016/s1386-5056(02)00076-x", "source": "dblp", "result_id": "dblp:doi:10.1016/s1386-5056(02)00076-x"}, {"title": "Symbolic Exposition of Medical Data-Sets: A Data Mining Workbench to Inductively Derive Data-Defining Symbolic Rules", "authors": ["Syed Sibte Raza Abidi", "Kok Meng Hoe"], "year": 2002, "publication": "CBMS", "link": "https://doi.org/10.1109/CBMS.2002.1011365", "snippet": "CBMS, 2002, 10.1109/cbms.2002.1011365", "source": "dblp", "result_id": "dblp:doi:10.1109/cbms.2002.1011365"}, {"title": "An Intelligent Agent-based Knowledge Broker for Enterprise-wide Healthcare Knowledge Procurement", "authors": ["Zafar Iqbal Hashmi", "Syed Sibte Raza Abidi", "Yu-N Cheah"], "year": 2002, "publication": "CBMS", "link": "https://doi.org/10.1109/CBMS.2002.1011373", "snippet": "CBMS, 2002, 10.1109/cbms.2002.1011373", "source": "dblp", "result_id": "dblp:doi:10.1109/cbms.2002.1011373"}, {"title": "A Case Base Reasoning Framework to Author Personalized Health Maintenance Information", "authors": ["Syed Sibte Raza Abidi"], "year": 2002, "publication": "CBMS", "link": "https://doi.org/10.1109/CBMS.2002.1011380", "snippet": "CBMS, 2002, 10.1109/cbms.2002.1011380", "source": "dblp", "result_id": "dblp:doi:10.1109/cbms.2002.1011380"}, {"title": "Distributed Data Mining From Heterogeneous Healthcare Data Repositories: Towards an Intelligent Agent-Based Framework", "authors": ["Syed Zahid Hassan Zaidi", "Syed Sibte Raza Abidi", "Selvakumar Manickam"], "year": 2002, "publication": "CBMS", "link": "https://doi.org/10.1109/CBMS.2002.1011401", "snippet": "CBMS, 2002, 10.1109/cbms.2002.1011401", "source": "dblp", "result_id": "dblp:doi:10.1109/cbms.2002.1011401"}, {"title": "Designing Adaptive Hypermedia for Internet Portals: A Personalization Strategy Featuring Case Base Reasoning with Compositional Adaptation", "authors": ["Syed Sibte Raza Abidi"], "year": 2002, "publication": "IBERAMIA", "link": "https://doi.org/10.1007/3-540-36131-6_7", "snippet": "IBERAMIA, 2002, 10.1007/3-540-36131-6_7", "source": "dblp", "result_id": "dblp:doi:10.1007/3-540-36131-6_7"}, {"title": "Knowledge management in healthcare: towards 'knowledge-driven' decision-support services", "authors": ["Syed Sibte Raza Abidi"], "year": 2001, "publication": "Int. J. Medical Informatics", "link": "https://doi.org/10.1016/S1386-5056(01)00167-8", "snippet": "Int. J. Medical Informatics, 2001, 10.1016/s1386-5056(01)00167-8", "source": "dblp", "result_id": "dblp:doi:10.1016/s1386-5056(01)00167-8"}, {"title": "A Case for Supplementing Evidence Base Medicine with Inductive Clinical Knowledge: Towards a Technology-Enriched Integrated Clinical Evidence System", "authors": ["Syed Sibte Raza Abidi", "Samina Raza Abidi"], "year": 2001, "publication": "CBMS", "link": "https://doi.org/10.1109/CBMS.2001.941689", "snippet": "CBMS, 2001, 10.1109/cbms.2001.941689", "source": "dblp", "result_id": "dblp:doi:10.1109/cbms.2001.941689"}, {"title": "An Intelligent Info-Structure for Composing and Pushing Personalised Healthcare Information over the Internet", "authors": ["Syed Sibte Raza Abidi", "Yong Han Chong", "Samina Raza Abidi"], "year": 2001, "publication": "CBMS", "link": "https://doi.org/10.1109/CBMS.2001.941724", "snippet": "CBMS, 2001, 10.1109/cbms.2001.941724", "source": "dblp", "result_id": "dblp:doi:10.1109/cbms.2001.941724"}, {"title": "Augmenting Knowledge-Based Medical Systems with Tacit Healthcare Expertise: Towards an Intelligent Tacit Knowledge Acquisition Info-Structure", "authors": ["Yu-N Cheah", "Syed Sibte Raza Abidi"], "year": 2001, "publication": "CBMS", "link": "https://doi.org/10.1109/CBMS.2001.941731", "snippet": "CBMS, 2001, 10.1109/cbms.2001.941731", "source": "dblp", "result_id": "dblp:doi:10.1109/cbms.2001.941731"}, {"title": "Augmenting Medical Case Base Reasoning Systems with Clinical Knowledge Derived from Heterogeneous Electronic Patient Records", "authors": ["Syed Sibte Raza Abidi", "Selvakumar Manickam"], "year": 2001, "publication": "CBMS", "link": "https://doi.org/10.1109/CBMS.2001.941756", "snippet": "CBMS, 2001, 10.1109/cbms.2001.941756", "source": "dblp", "result_id": "dblp:doi:10.1109/cbms.2001.941756"}, {"title": "A Web-Enabled Exam Preparation and Evaluation Service: Providing Real-Time Personalized Tests for Academic Enhancement", "authors": ["Syed Sibte Raza Abidi", "Alwyn Goh"], "year": 2001, "publication": "ICALT", "link": "https://doi.org/10.1109/ICALT.2001.943971", "snippet": "ICALT, 2001, 10.1109/icalt.2001.943971", "source": "dblp", "result_id": "dblp:doi:10.1109/icalt.2001.943971"}, {"title": "A Knowledge Creation Strategy to Enrich Enterprise Information Systems with Enterprise-Specific Tacit Knowledge", "authors": ["Syed Sibte Raza Abidi", "Yu-N Cheah"], "year": 2001, "publication": "ICEIS (2)", "link": "db/conf/iceis/iceis2001-2.html#AbidiC01", "snippet": "ICEIS (2), 2001", "source": "dblp", "result_id": "dblp:a_knowledge_creation_strategy_to_enrich_enterprise_information_s"}, {"title": "Analyzing Data Clusters: A Rough Sets Approach to Extract Cluster-Defining Symbolic Rules", "authors": ["Syed Sibte Raza Abidi", "Kok Meng Hoe", "Alwyn Goh"], "year": 2001, "publication": "IDA", "link": "https://doi.org/10.1007/3-540-44816-0_25", "snippet": "IDA, 2001, 10.1007/3-540-44816-0_25", "source": "dblp", "result_id": "dblp:doi:10.1007/3-540-44816-0_25"}, {"title": "Extracting Clinical Cases from XML-Based Electronic Patient Records for Use in Web-based Medical Case Based Reasoning Systems", "authors": ["Selvakumar Manickam", "Syed Sibte Raza Abidi"], "year": 2001, "publication": "MedInfo", "link": "https://doi.org/10.3233/978-1-60750-928-8-643", "snippet": "MedInfo, 2001, 10.3233/978-1-60750-928-8-643", "source": "dblp", "result_id": "dblp:doi:10.3233/978-1-60750-928-8-643"}, {"title": "Patient Empowerment via 'Pushed' Delivery of Personalised Healthcare Educational Content Over the Internet", "authors": ["Syed Sibte Raza Abidi", "Yong Han Chong", "Samina Raza Abidi"], "year": 2001, "publication": "MedInfo", "link": "https://doi.org/10.3233/978-1-60750-928-8-1425", "snippet": "MedInfo, 2001, 10.3233/978-1-60750-928-8-1425", "source": "dblp", "result_id": "dblp:doi:10.3233/978-1-60750-928-8-1425"}, {"title": "A Scenarios Mediated Approach for Tacit Knowledge Acquisition and Crystallisation: Towards Higher Return-On-Knowledge and Experience", "authors": ["Yu-N Cheah", "Syed Sibte Raza Abidi"], "year": 2000, "publication": "PAKM", "link": "https://ceur-ws.org/Vol-34/cheah_abidi.pdf", "snippet": "PAKM, 2000", "source": "dblp", "result_id": "dblp:a_scenarios_mediated_approach_for_tacit_knowledge_acquisition_an"}, {"title": "AI Amidst the Healthcare Revolution: Towards an 'Intelligent' Tele-Healthcare Environment", "authors": ["Syed Sibte Raza Abidi"], "year": 1999, "publication": "IC-AI", "link": "db/conf/icai/icai1999-1.html#Abidi99", "snippet": "IC-AI, 1999", "source": "dblp", "result_id": "dblp:ai_amidst_the_healthcare_revolution_towards_an_intelligent_tele_"}, {"title": "Data Mining Using Self-Organizing Kohonen Maps: A Technique for Effective Data Clustering & Visualization", "authors": ["Jason Ong", "Syed Sibte Raza Abidi"], "year": 1999, "publication": "IC-AI", "link": "db/conf/icai/icai1999-1.html#OngA99", "snippet": "IC-AI, 1999", "source": "dblp", "result_id": "dblp:data_mining_using_self_organizing_kohonen_maps_a_technique_for_e"}, {"title": "Re-Visiting Backpropagation Network Optimization: Towards Maximally Pruned Networks", "authors": ["Alwyn Goh", "Syed Sibte Raza Abidi"], "year": 1999, "publication": "IC-AI", "link": "db/conf/icai/icai1999-2.html#GohA99", "snippet": "IC-AI, 1999", "source": "dblp", "result_id": "dblp:re_visiting_backpropagation_network_optimization_towards_maximal"}, {"title": "Telemedicine in the Malaysian Multimedia Super Corridor: Towards Personalised Lifetime Health Plans", "authors": ["Syed Sibte Raza Abidi", "Zaharin Yusoff"], "year": 1999, "publication": "MIE", "link": "https://doi.org/10.3233/978-1-60750-912-7-283", "snippet": "MIE, 1999, 10.3233/978-1-60750-912-7-283", "source": "dblp", "result_id": "dblp:doi:10.3233/978-1-60750-912-7-283"}, {"title": "Applying Data Mining in Healthcare: An Info- Structure for Delivering 'Data-Driven' Strategic Services", "authors": ["Syed Sibte Raza Abidi"], "year": 1999, "publication": "MIE", "link": "https://doi.org/10.3233/978-1-60750-912-7-453", "snippet": "MIE, 1999, 10.3233/978-1-60750-912-7-453", "source": "dblp", "result_id": "dblp:doi:10.3233/978-1-60750-912-7-453"}, {"title": "TIDE: An Intelligent Home-Based Healthcare Information & Diagnostic Environment", "authors": ["Syed Sibte Raza Abidi"], "year": 1999, "publication": "MIE", "link": "https://doi.org/10.3233/978-1-60750-912-7-720", "snippet": "MIE, 1999, 10.3233/978-1-60750-912-7-720", "source": "dblp", "result_id": "dblp:doi:10.3233/978-1-60750-912-7-720"}, {"title": "Healthcare Knowledge Management Through Building and Operationalising Healthcare Enterprise Memory", "authors": ["Yu-N Cheah", "Syed Sibte Raza Abidi"], "year": 1999, "publication": "MIE", "link": "https://doi.org/10.3233/978-1-60750-912-7-726", "snippet": "MIE, 1999, 10.3233/978-1-60750-912-7-726", "source": "dblp", "result_id": "dblp:doi:10.3233/978-1-60750-912-7-726"}, {"title": "Telemedicine and Medical Informatics in the Multimedia Super Corridor: The Malaysian Vision", "authors": ["Syed Sibte Raza Abidi", "Alwyn Goh", "Zaharin Yusoff"], "year": 1998, "publication": "MedInfo", "link": "https://doi.org/10.3233/978-1-60750-896-0-1282", "snippet": "MedInfo, 1998, 10.3233/978-1-60750-896-0-1282", "source": "dblp", "result_id": "dblp:doi:10.3233/978-1-60750-896-0-1282"}, {"title": "Applying Knowledge Discovery to Predict Infectious Disease Epidemics", "authors": ["Syed Sibte Raza Abidi", "Alwyn Goh"], "year": 1998, "publication": "PRICAI", "link": "https://doi.org/10.1007/BFb0095267", "snippet": "PRICAI, 1998, 10.1007/bfb0095267", "source": "dblp", "result_id": "dblp:doi:10.1007/bfb0095267"}, {"title": "Internet Information Brokering: A Re-Configurable Database Navigation, Data Filter and Export System", "authors": ["Syed Sibte Raza Abidi"], "year": 1997, "publication": "Informatica (Slovenia)", "link": "db/journals/informaticaSI/informaticaSI21.html#Abidi97", "snippet": "Informatica (Slovenia), 1997", "source": "dblp", "result_id": "dblp:internet_information_brokering_a_re_configurable_database_naviga"}, {"title": "Conglomerate'Neural Network Architectures: The Way Ahead for Simulating Early Language Development", "authors": ["Syed Sibte Raza Abidi", "Khrushid Ahmad"], "year": 1997, "publication": "J. Inf. Sci. Eng.", "link": "http://www.iis.sinica.edu.tw/page/jise/1997/199706_03.html", "snippet": "J. Inf. Sci. Eng., 1997", "source": "dblp", "result_id": "dblp:conglomerate_neural_network_architectures_the_way_ahead_for_simu"}, {"title": "Neural networks and child language development: a simulation using a modular neural network architecture", "authors": ["Syed Sibte Raza Abidi"], "year": 1996, "publication": "ICNN", "link": "https://doi.org/10.1109/ICNN.1996.549006", "snippet": "ICNN, 1996, 10.1109/icnn.1996.549006", "source": "dblp", "result_id": "dblp:doi:10.1109/icnn.1996.549006"}, {"title": "A connectionist simulation : towards a model of child language development", "authors": ["Syed Sibte Raza Abidi"], "year": 1994, "publication": "", "link": "http://epubs.surrey.ac.uk/795815/", "snippet": "1994", "source": "dblp", "result_id": "dblp:a_connectionist_simulation_towards_a_model_of_child_language_dev"}]}} \ No newline at end of file diff --git a/data/api_cache/dblp/99d0fec56e6ec9cdb3973ba046c242a6305846a32846af22401d97ce72f9b02b.json b/data/api_cache/dblp/99d0fec56e6ec9cdb3973ba046c242a6305846a32846af22401d97ce72f9b02b.json index 89563135..af701e76 100644 --- a/data/api_cache/dblp/99d0fec56e6ec9cdb3973ba046c242a6305846a32846af22401d97ce72f9b02b.json +++ b/data/api_cache/dblp/99d0fec56e6ec9cdb3973ba046c242a6305846a32846af22401d97ce72f9b02b.json @@ -1 +1 @@ -{"timestamp": 1772379263.2748084, "ttl_days": 60, "data": {"articles": [{"title": "AI-Driven Public Health Surveillance: Analyzing Vulnerable Areas in Brazil Using Remote Sensing and Socioeconomic Data", "authors": ["Joao Pedro Silva", "Erikson J\u00falio De Aguiar", "Gabriel Spadon", "Agma J. M. Traina", "Jose F. Rodrigues"], "year": 2025, "publication": "CBMS", "link": "https://doi.org/10.1109/CBMS65348.2025.00180", "snippet": "CBMS, 2025, 10.1109/cbms65348.2025.00180", "source": "dblp", "result_id": "dblp:doi:10.1109/cbms65348.2025.00180"}, {"title": "Physics-Informed Neural Networks for Vessel Trajectory Prediction: Learning Time-Discretized Kinematic Dynamics via Finite Differences", "authors": ["Md Mahbub Alam", "Am\u00edlcar Soares", "Jos\u00e9 Fernando Rodrigues Jr.", "Gabriel Spadon"], "year": 2025, "publication": "SSTD", "link": "https://doi.org/10.1145/3748777.3748779", "snippet": "SSTD, 2025, 10.1145/3748777.3748779", "source": "dblp", "result_id": "dblp:doi:10.1145/3748777.3748779"}, {"title": "ImPORTance - Machine Learning-Driven Analysis of Global Port Significance and Network Dynamics for Improved Operational Efficiency", "authors": ["Emanuele Carlini", "Domenico Di Gangi", "Vinicius Monteiro de Lira", "Hanna Kavalionak", "Am\u00edlcar Soares", "Gabriel Spadon"], "year": 2025, "publication": "SSTD", "link": "https://doi.org/10.1145/3748777.3748792", "snippet": "SSTD, 2025, 10.1145/3748777.3748792", "source": "dblp", "result_id": "dblp:doi:10.1145/3748777.3748792"}, {"title": "Learning Spatio-Temporal Vessel Behavior using AIS Trajectory Data and Markovian Models in the Gulf of St. Lawrence", "authors": ["Gabriel Spadon", "Ruixin Song", "Vaishnav Vaidheeswaran", "Md Mahbub Alam", "Floris Goerlandt", "Ronald Pelot"], "year": 2025, "publication": "CoRR", "link": "https://doi.org/10.48550/arXiv.2506.00025", "snippet": "CoRR, 2025, 10.48550/arxiv.2506.00025", "source": "dblp", "result_id": "dblp:doi:10.48550/arxiv.2506.00025"}, {"title": "Physics-Informed Neural Networks for Vessel Trajectory Prediction: Learning Time-Discretized Kinematic Dynamics via Finite Differences", "authors": ["Md Mahbub Alam", "Am\u00edlcar Soares", "Jos\u00e9 F. Rodrigues Jr.", "Gabriel Spadon"], "year": 2025, "publication": "CoRR", "link": "https://doi.org/10.48550/arXiv.2506.12029", "snippet": "CoRR, 2025, 10.48550/arxiv.2506.12029", "source": "dblp", "result_id": "dblp:doi:10.48550/arxiv.2506.12029"}, {"title": "Multi-vessel Interaction-Aware Trajectory Prediction and Collision Risk Assessment", "authors": ["Md Mahbub Alam", "Jos\u00e9 F. Rodrigues Jr.", "Gabriel Spadon"], "year": 2025, "publication": "CoRR", "link": "https://doi.org/10.48550/arXiv.2509.01836", "snippet": "CoRR, 2025, 10.48550/arxiv.2509.01836", "source": "dblp", "result_id": "dblp:doi:10.48550/arxiv.2509.01836"}, {"title": "Goal-Conditioned Reinforcement Learning for Data-Driven Maritime Navigation", "authors": ["Vaishnav Vaidheeswaran", "Dilith Jayakody", "Samruddhi Mulay", "Anand Lo", "Md Mahbub Alam", "Gabriel Spadon"], "year": 2025, "publication": "CoRR", "link": "https://doi.org/10.48550/arXiv.2509.01838", "snippet": "CoRR, 2025, 10.48550/arxiv.2509.01838", "source": "dblp", "result_id": "dblp:doi:10.48550/arxiv.2509.01838"}, {"title": "Community-Centered Spatial Intelligence for Climate Adaptation at Nova Scotia's Eastern Shore", "authors": ["Gabriel Spadon", "Oladapo Oyebode", "Camilo M. Botero", "Tushar Sharma", "Floris Goerlandt", "Ronald Pelot"], "year": 2025, "publication": "CoRR", "link": "https://doi.org/10.48550/arXiv.2509.01845", "snippet": "CoRR, 2025, 10.48550/arxiv.2509.01845", "source": "dblp", "result_id": "dblp:doi:10.48550/arxiv.2509.01845"}, {"title": "A Theoretical Framework for Environmental Similarity and Vessel Mobility as Coupled Predictors of Marine Invasive Species Pathways", "authors": ["Gabriel Spadon", "Vaishnav Vaidheeswaran", "Claudio DiBacco"], "year": 2025, "publication": "CoRR", "link": "https://doi.org/10.48550/arXiv.2511.03499", "snippet": "CoRR, 2025, 10.48550/arxiv.2511.03499", "source": "dblp", "result_id": "dblp:doi:10.48550/arxiv.2511.03499"}, {"title": "Maritime tracking data analysis and integration with AISdb", "authors": ["Gabriel Spadon", "Jay Kumar", "Jinkun Chen", "Matthew Smith", "Casey Hilliard", "Sarah Vela", "Romina Gehrmann", "Claudio DiBacco", "Stan Matwin", "Ronald Pelot"], "year": 2024, "publication": "SoftwareX", "link": "https://doi.org/10.1016/j.softx.2024.101952", "snippet": "SoftwareX, 2024, 10.1016/j.softx.2024.101952", "source": "dblp", "result_id": "dblp:doi:10.1016/j.softx.2024.101952"}, {"title": "Gravity-Informed Deep Learning Framework for Predicting Ship Traffic Flow and Invasion Risk of Non-Indigenous Species via Ballast Water Discharge", "authors": ["Ruixin Song", "Gabriel Spadon", "Ronald Pelot", "Stan Matwin", "Am\u00edlcar Soares"], "year": 2024, "publication": "CoRR", "link": "https://doi.org/10.48550/arXiv.2401.13098", "snippet": "CoRR, 2024, 10.48550/arxiv.2401.13098", "source": "dblp", "result_id": "dblp:doi:10.48550/arxiv.2401.13098"}, {"title": "Maritime Tracking Data Analysis and Integration with AISdb", "authors": ["Gabriel Spadon", "Jay Kumar", "Jinkun Chen", "Matthew Smith", "Casey Hilliard", "Sarah Vela", "Romina Gehrmann", "Claudio DiBacco", "Stan Matwin", "Ronald Pelot"], "year": 2024, "publication": "CoRR", "link": "https://doi.org/10.48550/arXiv.2407.08082", "snippet": "CoRR, 2024, 10.48550/arxiv.2407.08082", "source": "dblp", "result_id": "dblp:doi:10.48550/arxiv.2407.08082"}, {"title": "ImPORTance - Machine Learning-Driven Analysis of Global Port Significance and Network Dynamics for Improved Operational Efficiency", "authors": ["Emanuele Carlini", "Domenico Di Gangi", "Vinicius Monteiro de Lira", "Hanna Kavalionak", "Gabriel Spadon", "Am\u00edlcar Soares J\u00fanior"], "year": 2024, "publication": "CoRR", "link": "https://doi.org/10.48550/arXiv.2407.09571", "snippet": "CoRR, 2024, 10.48550/arxiv.2407.09571", "source": "dblp", "result_id": "dblp:doi:10.48550/arxiv.2407.09571"}, {"title": "Unfolding AIS Transmission Behavior for Vessel Movement Modeling on Noisy Data Leveraging Machine Learning", "authors": ["Gabriel Spadon", "Martha Dais Ferreira", "Am\u00edlcar Soares", "Stan Matwin"], "year": 2023, "publication": "IEEE Access", "link": "https://doi.org/10.1109/ACCESS.2022.3197215", "snippet": "IEEE Access, 2023, 10.1109/access.2022.3197215", "source": "dblp", "result_id": "dblp:doi:10.1109/access.2022.3197215"}, {"title": "A Data Augmentation Algorithm for Trajectory Data", "authors": ["Yaksh J. Haranwala", "Gabriel Spadon", "Chiara Renso", "Am\u00edlcar Soares"], "year": 2023, "publication": "EMODE@SIGSPATIAL", "link": "https://doi.org/10.1145/3615885.3628008", "snippet": "EMODE@SIGSPATIAL, 2023, 10.1145/3615885.3628008", "source": "dblp", "result_id": "dblp:doi:10.1145/3615885.3628008"}, {"title": "Building a Safer Maritime Environment Through Multi-Path Long-Term Vessel Trajectory Forecasting", "authors": ["Gabriel Spadon", "Jay Kumar", "Matthew Smith", "Sarah Vela", "Romina Gehrmann", "Derek Eden", "Joshua van Berkel", "Am\u00edlcar Soares", "Ronan Fablet", "Ronald Pelot", "Stan Matwin"], "year": 2023, "publication": "CoRR", "link": "https://doi.org/10.48550/arXiv.2310.18948", "snippet": "CoRR, 2023, 10.48550/arxiv.2310.18948", "source": "dblp", "result_id": "dblp:doi:10.48550/arxiv.2310.18948"}, {"title": "Pay Attention to Evolution: Time Series Forecasting With Deep Graph-Evolution Learning", "authors": ["Gabriel Spadon", "Shenda Hong", "Bruno Brandoli", "Stan Matwin", "Jos\u00e9 F. Rodrigues Jr.", "Jimeng Sun"], "year": 2022, "publication": "IEEE Trans. Pattern Anal. Mach. Intell.", "link": "https://doi.org/10.1109/TPAMI.2021.3076155", "snippet": "IEEE Trans. Pattern Anal. Mach. Intell., 2022, 10.1109/tpami.2021.3076155", "source": "dblp", "result_id": "dblp:doi:10.1109/tpami.2021.3076155"}, {"title": "A Semi-Supervised Methodology for Fishing Activity Detection Using the Geometry behind the Trajectory of Multiple Vessels", "authors": ["Martha Dais Ferreira", "Gabriel Spadon", "Am\u00edlcar Soares", "Stan Matwin"], "year": 2022, "publication": "Sensors", "link": "https://doi.org/10.3390/s22166063", "snippet": "Sensors, 2022, 10.3390/s22166063", "source": "dblp", "result_id": "dblp:doi:10.3390/s22166063"}, {"title": "Unfolding collective AIS transmission behavior for vessel movement modeling on irregular timing data using noise-robust neural networks", "authors": ["Gabriel Spadon", "Martha Dais Ferreira", "Am\u00edlcar Soares", "Stan Matwin"], "year": 2022, "publication": "CoRR", "link": "https://arxiv.org/abs/2202.13867", "snippet": "CoRR, 2022", "source": "dblp", "result_id": "dblp:unfolding_collective_ais_transmission_behavior_for_vessel_moveme"}, {"title": "From Cities to Series: Complex Networks and Deep Learning for Improved Spatial and Temporal Analytics", "authors": ["Gabriel Spadon", "Jos\u00e9 F. Rodrigues Jr."], "year": 2022, "publication": "CoRR", "link": "https://doi.org/10.48550/arXiv.2206.01176", "snippet": "CoRR, 2022, 10.48550/arxiv.2206.01176", "source": "dblp", "result_id": "dblp:doi:10.48550/arxiv.2206.01176"}, {"title": "A semi-supervised geometric-driven methodology for supervised fishing activity detection on multi-source AIS tracking messages", "authors": ["Martha Dais Ferreira", "Gabriel Spadon", "Am\u00edlcar Soares", "Stan Matwin"], "year": 2022, "publication": "CoRR", "link": "https://doi.org/10.48550/arXiv.2207.05514", "snippet": "CoRR, 2022, 10.48550/arxiv.2207.05514", "source": "dblp", "result_id": "dblp:doi:10.48550/arxiv.2207.05514"}, {"title": "DropLeaf: A precision farming smartphone tool for real-time quantification of pesticide application coverage", "authors": ["Bruno Brandoli", "Gabriel Spadon", "Travis J. Esau", "Patrick Hennessy", "Andr\u00e9 C. P. L. F. de Carvalho", "Sihem Amer-Yahia", "Jos\u00e9 F. Rodrigues Jr."], "year": 2021, "publication": "Comput. Electron. Agric.", "link": "https://doi.org/10.1016/j.compag.2020.105906", "snippet": "Comput. Electron. Agric., 2021, 10.1016/j.compag.2020.105906", "source": "dblp", "result_id": "dblp:doi:10.1016/j.compag.2020.105906"}, {"title": "LIG-Doctor: Efficient patient trajectory prediction using bidirectional minimal gated-recurrent networks", "authors": ["Jos\u00e9 F. Rodrigues Jr.", "Marco A. Gutierrez", "Gabriel Spadon", "Bruno Brandoli", "Sihem Amer-Yahia"], "year": 2021, "publication": "Inf. Sci.", "link": "https://doi.org/10.1016/j.ins.2020.09.024", "snippet": "Inf. Sci., 2021, 10.1016/j.ins.2020.09.024", "source": "dblp", "result_id": "dblp:doi:10.1016/j.ins.2020.09.024"}, {"title": "Aircraft Fuselage Corrosion Detection Using Artificial Intelligence", "authors": ["Bruno Brandoli", "Andr\u00e9 R. de Geus", "Jefferson R. Souza", "Gabriel Spadon", "Am\u00edlcar Soares J\u00fanior", "Jos\u00e9 F. Rodrigues Jr.", "Jerzy Komorowski", "Stan Matwin"], "year": 2021, "publication": "Sensors", "link": "https://doi.org/10.3390/s21124026", "snippet": "Sensors, 2021, 10.3390/s21124026", "source": "dblp", "result_id": "dblp:doi:10.3390/s21124026"}, {"title": "SHARq: sharing recursive queries in relational databases", "authors": ["Lucas C. Scabora", "Gabriel Spadon", "Mirela T. Cazzolato", "Daniel S. Kaster", "Agma J. M. Traina", "Jos\u00e9 F. Rodrigues Jr.", "Caetano Traina Jr."], "year": 2021, "publication": "SAC", "link": "https://doi.org/10.1145/3412841.3442078", "snippet": "SAC, 2021, 10.1145/3412841.3442078", "source": "dblp", "result_id": "dblp:doi:10.1145/3412841.3442078"}, {"title": "Lig-Doctor: Real-World Clinical Prognosis using a Bi-Directional Neural Network", "authors": ["Jos\u00e9 F. Rodrigues Jr.", "Gabriel Spadon", "Bruno Brandoli", "Sihem Amer-Yahia"], "year": 2020, "publication": "CBMS", "link": "https://doi.org/10.1109/CBMS49503.2020.00113", "snippet": "CBMS, 2020, 10.1109/cbms49503.2020.00113", "source": "dblp", "result_id": "dblp:doi:10.1109/cbms49503.2020.00113"}, {"title": "Enhancing recursive graph querying on RDBMS with data clustering approaches", "authors": ["Lucas C. Scabora", "Gabriel Spadon", "Paulo H. Oliveira", "Jos\u00e9 F. Rodrigues Jr.", "Caetano Traina Jr."], "year": 2020, "publication": "SAC", "link": "https://doi.org/10.1145/3341105.3375770", "snippet": "SAC, 2020, 10.1145/3341105.3375770", "source": "dblp", "result_id": "dblp:doi:10.1145/3341105.3375770"}, {"title": "Pay Attention to Evolution: Time Series Forecasting with Deep Graph-Evolution Learning", "authors": ["Gabriel Spadon", "Shenda Hong", "Bruno Brandoli", "Stan Matwin", "Jos\u00e9 F. Rodrigues Jr.", "Jimeng Sun"], "year": 2020, "publication": "CoRR", "link": "https://arxiv.org/abs/2008.12833", "snippet": "CoRR, 2020", "source": "dblp", "result_id": "dblp:pay_attention_to_evolution_time_series_forecasting_with_deep_gra"}, {"title": "DropLeaf: a precision farming smartphone application for measuring pesticide spraying methods", "authors": ["Bruno Brandoli", "Gabriel Spadon", "Travis J. Esau", "Patrick Hennessy", "Andr\u00e9 C. P. L. F. de Carvalho", "Jos\u00e9 F. Rodrigues Jr.", "Sihem Amer-Yahia"], "year": 2020, "publication": "CoRR", "link": "https://arxiv.org/abs/2009.00453", "snippet": "CoRR, 2020", "source": "dblp", "result_id": "dblp:dropleaf_a_precision_farming_smartphone_application_for_measurin"}, {"title": "Detecting multi-scale distance-based inconsistencies in cities through complex-networks", "authors": ["Gabriel Spadon", "Bruno Brandoli", "Danilo Medeiros Eler", "Jos\u00e9 F. Rodrigues Jr."], "year": 2019, "publication": "J. Comput. Sci.", "link": "https://doi.org/10.1016/j.jocs.2018.12.015", "snippet": "J. Comput. Sci., 2019, 10.1016/j.jocs.2018.12.015", "source": "dblp", "result_id": "dblp:doi:10.1016/j.jocs.2018.12.015"}, {"title": "Reconstructing commuters network using machine learning and urban indicators", "authors": ["Gabriel Spadon", "Andr\u00e9 C. P. L. F. de Carvalho", "Jos\u00e9 F. Rodrigues Jr.", "Luiz G. A. Alves"], "year": 2019, "publication": "CoRR", "link": "http://arxiv.org/abs/1908.03512", "snippet": "CoRR, 2019", "source": "dblp", "result_id": "dblp:reconstructing_commuters_network_using_machine_learning_and_urba"}, {"title": "Patient trajectory prediction in the Mimic-III dataset, challenges and pitfalls", "authors": ["Jos\u00e9 F. Rodrigues Jr.", "Gabriel Spadon", "Bruno Brandoli", "Sihem Amer-Yahia"], "year": 2019, "publication": "CoRR", "link": "http://arxiv.org/abs/1909.04605", "snippet": "CoRR, 2019", "source": "dblp", "result_id": "dblp:patient_trajectory_prediction_in_the_mimic_iii_dataset_challenge"}, {"title": "Hadoop Cluster Deployment: A Methodological Approach", "authors": ["Ronaldo Celso Messias Correia", "Gabriel Spadon", "Pedro Henrique de Andrade Gomes", "Danilo Medeiros Eler", "Rog\u00e9rio Eduardo Garcia", "Celso Olivete Junior"], "year": 2018, "publication": "Inf.", "link": "https://doi.org/10.3390/info9060131", "snippet": "Inf., 2018, 10.3390/info9060131", "source": "dblp", "result_id": "dblp:doi:10.3390/info9060131"}, {"title": "Cutting-edge Relational Graph Data Management with Edge-k: From One to Multiple Edges in the Same Row", "authors": ["Lucas C. Scabora", "Paulo H. Oliveira", "Gabriel Spadon", "Daniel S. Kaster", "Jos\u00e9 F. Rodrigues Jr.", "Agma J. M. Traina", "Caetano Traina J\u00fanior"], "year": 2018, "publication": "J. Inf. Data Manag.", "link": "https://sol.sbc.org.br/journals/index.php/jidm/article/view/1634", "snippet": "J. Inf. Data Manag., 2018", "source": "dblp", "result_id": "dblp:cutting_edge_relational_graph_data_management_with_edge_k_from_o"}, {"title": "RAFIKI: Retrieval-Based Application for Imaging and Knowledge Investigation", "authors": ["Marcos Roberto Nesso Junior", "Mirela T. Cazzolato", "Lucas C. Scabora", "Paulo H. Oliveira", "Gabriel Spadon", "J\u00e9ssica Andressa de Souza", "Willian D. Oliveira", "Daniel Y. T. Chino", "Jos\u00e9 F. Rodrigues Jr.", "Agma J. M. Traina", "Caetano Traina"], "year": 2018, "publication": "CBMS", "link": "https://doi.org/10.1109/CBMS.2018.00020", "snippet": "CBMS, 2018, 10.1109/cbms.2018.00020", "source": "dblp", "result_id": "dblp:doi:10.1109/cbms.2018.00020"}, {"title": "A comparative analysis of the automatic modeling of Learning Styles through Machine Learning techniques", "authors": ["Lucas D. Ferreira", "Gabriel Spadon", "Andr\u00e9 C. P. L. F. de Carvalho", "Jos\u00e9 F. Rodrigues Jr."], "year": 2018, "publication": "FIE", "link": "https://doi.org/10.1109/FIE.2018.8659191", "snippet": "FIE, 2018, 10.1109/fie.2018.8659191", "source": "dblp", "result_id": "dblp:doi:10.1109/fie.2018.8659191"}, {"title": "Topological Street-Network Characterization Through Feature-Vector and Cluster Analysis", "authors": ["Gabriel Spadon", "Gabriel P. Gimenes", "Jos\u00e9 F. Rodrigues Jr."], "year": 2018, "publication": "ICCS (1)", "link": "https://doi.org/10.1007/978-3-319-93698-7_21", "snippet": "ICCS (1), 2018, 10.1007/978-3-319-93698-7_21", "source": "dblp", "result_id": "dblp:doi:10.1007/978-3-319-93698-7_21"}, {"title": "A Distance-Based Tool-Set to Track Inconsistent Urban Structures Through Complex-Networks", "authors": ["Gabriel Spadon", "Bruno Brandoli Machado", "Danilo Medeiros Eler", "Jos\u00e9 F. Rodrigues Jr."], "year": 2018, "publication": "ICCS (1)", "link": "https://doi.org/10.1007/978-3-319-93698-7_22", "snippet": "ICCS (1), 2018, 10.1007/978-3-319-93698-7_22", "source": "dblp", "result_id": "dblp:doi:10.1007/978-3-319-93698-7_22"}, {"title": "Recognition of Endangered Pantanal Animal Species using Deep Learning Methods", "authors": ["Mauro dos Santos de Arruda", "Gabriel Spadon", "Jos\u00e9 F. Rodrigues Jr.", "Wesley Nunes Gon\u00e7alves", "Bruno Brandoli Machado"], "year": 2018, "publication": "IJCNN", "link": "https://doi.org/10.1109/IJCNN.2018.8489369", "snippet": "IJCNN, 2018, 10.1109/ijcnn.2018.8489369", "source": "dblp", "result_id": "dblp:doi:10.1109/ijcnn.2018.8489369"}, {"title": "A smartphone application to measure the quality of pest control spraying machines via image analysis", "authors": ["Bruno Brandoli Machado", "Gabriel Spadon", "Mauro S. Arruda", "Wesley Nunes Gon\u00e7alves", "Andr\u00e9 C. P. L. F. de Carvalho", "Jos\u00e9 F. Rodrigues Jr."], "year": 2018, "publication": "SAC", "link": "https://doi.org/10.1145/3167132.3167237", "snippet": "SAC, 2018, 10.1145/3167132.3167237", "source": "dblp", "result_id": "dblp:doi:10.1145/3167132.3167237"}, {"title": "Caracteriza\u00e7\u00e3o Topol\u00f3gica de Redes Vi\u00e1rias por Meio da An\u00e1lise de Vetores de Caracter\u00edsticas e T\u00e9cnicas de Agrupamento", "authors": ["Gabriel Spadon", "Lucas C. Scabora", "Marcos R. Nesso Jr.", "Caetano Traina Jr.", "Jos\u00e9 F. Rodrigues Jr."], "year": 2018, "publication": "SBBD", "link": "https://doi.org/10.5753/sbbd.2018.22227", "snippet": "SBBD, 2018, 10.5753/sbbd.2018.22227", "source": "dblp", "result_id": "dblp:doi:10.5753/sbbd.2018.22227"}, {"title": "Computer-assisted City Touring for Explorers", "authors": ["Gabriel Spadon", "Jos\u00e9 Fernandes Rodrigues Jr."], "year": 2018, "publication": "BiDu-Posters@VLDB", "link": "https://ceur-ws.org/Vol-2247/poster4.pdf", "snippet": "BiDu-Posters@VLDB, 2018", "source": "dblp", "result_id": "dblp:computer_assisted_city_touring_for_explorers"}, {"title": "A distance-based tool-set to track inconsistent urban structures through complex-networks", "authors": ["Gabriel Spadon", "Bruno Brandoli Machado", "Danilo Medeiros Eler", "Jos\u00e9 Fernando Rodrigues Jr."], "year": 2018, "publication": "CoRR", "link": "http://arxiv.org/abs/1803.09136", "snippet": "CoRR, 2018", "source": "dblp", "result_id": "dblp:a_distance_based_tool_set_to_track_inconsistent_urban_structures"}, {"title": "Topological street-network characterization through feature-vector and cluster analysis", "authors": ["Gabriel Spadon", "Gabriel P. Gimenes", "Jos\u00e9 F. Rodrigues Jr."], "year": 2018, "publication": "CoRR", "link": "http://arxiv.org/abs/1806.07952", "snippet": "CoRR, 2018", "source": "dblp", "result_id": "dblp:topological_street_network_characterization_through_feature_vect"}, {"title": "Teaching software quality via source code inspection tool", "authors": ["Pedro Henrique de Andrade Gomes", "Rog\u00e9rio Eduardo Garcia", "Gabriel Spadon de Souza", "Danilo Medeiros Eler", "Celso Olivete Junior", "Ronaldo Celso Messias Correia"], "year": 2017, "publication": "FIE", "link": "https://doi.org/10.1109/FIE.2017.8190658", "snippet": "FIE, 2017, 10.1109/fie.2017.8190658", "source": "dblp", "result_id": "dblp:doi:10.1109/fie.2017.8190658"}, {"title": "Identifying Urban Inconsistencies via Street Networks", "authors": ["Gabriel Spadon", "Gabriel P. Gimenes", "Jos\u00e9 F. Rodrigues Jr."], "year": 2017, "publication": "ICCS", "link": "https://doi.org/10.1016/j.procs.2017.05.103", "snippet": "ICCS, 2017, 10.1016/j.procs.2017.05.103", "source": "dblp", "result_id": "dblp:doi:10.1016/j.procs.2017.05.103"}, {"title": "Behavioral Characterization of Criminality Spread in Cities", "authors": ["Gabriel Spadon", "Lucas C. Scabora", "Paulo H. Oliveira", "Marcus V. S. Araujo", "Bruno Brandoli Machado", "Elaine P. M. de Sousa", "Caetano Traina Jr.", "Jos\u00e9 F. Rodrigues Jr."], "year": 2017, "publication": "ICCS", "link": "https://doi.org/10.1016/j.procs.2017.05.118", "snippet": "ICCS, 2017, 10.1016/j.procs.2017.05.118", "source": "dblp", "result_id": "dblp:doi:10.1016/j.procs.2017.05.118"}, {"title": "A smartphone application to measure the quality of pest control spraying machines via image analysis", "authors": ["Bruno Brandoli Machado", "Gabriel Spadon", "Mauro S. Arruda", "Wesley Nunes Gon\u00e7alves", "Andr\u00e9 C. P. L. F. de Carvalho", "Jos\u00e9 F. Rodrigues Jr."], "year": 2017, "publication": "CoRR", "link": "http://arxiv.org/abs/1711.07828", "snippet": "CoRR, 2017", "source": "dblp", "result_id": "dblp:a_smartphone_application_to_measure_the_quality_of_pest_control_"}, {"title": "Combined Methodology for Theoretical Computing", "authors": ["Gabriel Spadon de Souza", "Pedro Henrique de Andrade Gomes", "Ronaldo Celso Messias Correia", "Celso Olivete Junior", "Danilo Medeiros Eler", "Rog\u00e9rio Eduardo Garcia"], "year": 2016, "publication": "FIE", "link": "https://doi.org/10.1109/FIE.2016.7757574", "snippet": "FIE, 2016, 10.1109/fie.2016.7757574", "source": "dblp", "result_id": "dblp:doi:10.1109/fie.2016.7757574"}, {"title": "Complex Network Tools to Understand the Behavior of Criminality in Urban Areas", "authors": ["Gabriel Spadon", "Lucas C. Scabora", "Marcus V. S. Araujo", "Paulo H. Oliveira", "Bruno Brandoli Machado", "Elaine P. M. de Sousa", "Caetano Traina Jr.", "Jos\u00e9 F. Rodrigues Jr."], "year": 2016, "publication": "CoRR", "link": "http://arxiv.org/abs/1612.06115", "snippet": "CoRR, 2016", "source": "dblp", "result_id": "dblp:complex_network_tools_to_understand_the_behavior_of_criminality_"}, {"title": "Teaching-learning methodology for formal languages and automata theory", "authors": ["Gabriel Spadon de Souza", "Celso Olivete Junior", "Ronaldo Celso Messias Correia", "Rog\u00e9rio Eduardo Garcia"], "year": 2015, "publication": "FIE", "link": "https://doi.org/10.1109/FIE.2015.7344185", "snippet": "FIE, 2015, 10.1109/fie.2015.7344185", "source": "dblp", "result_id": "dblp:doi:10.1109/fie.2015.7344185"}]}} \ No newline at end of file +{"timestamp": 1783000754.8238096, "data": {"articles": [{"title": "Goal-Conditioned Reinforcement Learning for Data-Driven Maritime Navigation", "authors": ["Vaishnav Vaidheeswaran", "Dilith Jayakody", "Samruddhi Mulay", "Anand Lo", "Md Mahbub Alam", "Gabriel Spadon"], "year": 2025, "publication": "IEEE Big Data", "link": "https://doi.org/10.1109/BigData66926.2025.11402252", "snippet": "IEEE Big Data, 2025, 10.1109/bigdata66926.2025.11402252", "source": "dblp", "result_id": "dblp:doi:10.1109/bigdata66926.2025.11402252"}, {"title": "Modeling Maritime Transportation Behavior Using AIS Trajectories and Markovian Processes in the Gulf of St. Lawrence", "authors": ["Gabriel Spadon", "Ruixin Song", "Vaishnav Vaidheeswaran", "Md Mahbub Alam", "Floris Goerlandt", "Ronald Pelot"], "year": 2025, "publication": "IEEE Big Data", "link": "https://doi.org/10.1109/BigData66926.2025.11402318", "snippet": "IEEE Big Data, 2025, 10.1109/bigdata66926.2025.11402318", "source": "dblp", "result_id": "dblp:doi:10.1109/bigdata66926.2025.11402318"}, {"title": "AI-Driven Public Health Surveillance: Analyzing Vulnerable Areas in Brazil Using Remote Sensing and Socioeconomic Data", "authors": ["Joao Pedro Silva", "Erikson J\u00falio De Aguiar", "Gabriel Spadon", "Agma J. M. Traina", "Jose F. Rodrigues"], "year": 2025, "publication": "CBMS", "link": "https://doi.org/10.1109/CBMS65348.2025.00180", "snippet": "CBMS, 2025, 10.1109/cbms65348.2025.00180", "source": "dblp", "result_id": "dblp:doi:10.1109/cbms65348.2025.00180"}, {"title": "Community-Centered Spatial Intelligence for Climate Adaptation at Nova Scotia's Eastern Shore", "authors": ["Gabriel Spadon", "Oladapo Oyebode", "Camilo M. Botero", "Tushar Sharma", "Floris Goerlandt", "Ronald Pelot"], "year": 2025, "publication": "SpatialConnect", "link": "https://doi.org/10.1145/3764924.3770892", "snippet": "SpatialConnect, 2025, 10.1145/3764924.3770892", "source": "dblp", "result_id": "dblp:doi:10.1145/3764924.3770892"}, {"title": "Physics-Informed Neural Networks for Vessel Trajectory Prediction: Learning Time-Discretized Kinematic Dynamics via Finite Differences", "authors": ["Md Mahbub Alam", "Am\u00edlcar Soares", "Jos\u00e9 Fernando Rodrigues Jr.", "Gabriel Spadon"], "year": 2025, "publication": "SSTD", "link": "https://doi.org/10.1145/3748777.3748779", "snippet": "SSTD, 2025, 10.1145/3748777.3748779", "source": "dblp", "result_id": "dblp:doi:10.1145/3748777.3748779"}, {"title": "ImPORTance - Machine Learning-Driven Analysis of Global Port Significance and Network Dynamics for Improved Operational Efficiency", "authors": ["Emanuele Carlini", "Domenico Di Gangi", "Vinicius Monteiro de Lira", "Hanna Kavalionak", "Am\u00edlcar Soares", "Gabriel Spadon"], "year": 2025, "publication": "SSTD", "link": "https://doi.org/10.1145/3748777.3748792", "snippet": "SSTD, 2025, 10.1145/3748777.3748792", "source": "dblp", "result_id": "dblp:doi:10.1145/3748777.3748792"}, {"title": "Learning Spatio-Temporal Vessel Behavior using AIS Trajectory Data and Markovian Models in the Gulf of St. Lawrence", "authors": ["Gabriel Spadon", "Ruixin Song", "Vaishnav Vaidheeswaran", "Md Mahbub Alam", "Floris Goerlandt", "Ronald Pelot"], "year": 2025, "publication": "CoRR", "link": "https://doi.org/10.48550/arXiv.2506.00025", "snippet": "CoRR, 2025, 10.48550/arxiv.2506.00025", "source": "dblp", "result_id": "dblp:doi:10.48550/arxiv.2506.00025"}, {"title": "Physics-Informed Neural Networks for Vessel Trajectory Prediction: Learning Time-Discretized Kinematic Dynamics via Finite Differences", "authors": ["Md Mahbub Alam", "Am\u00edlcar Soares", "Jos\u00e9 F. Rodrigues Jr.", "Gabriel Spadon"], "year": 2025, "publication": "CoRR", "link": "https://doi.org/10.48550/arXiv.2506.12029", "snippet": "CoRR, 2025, 10.48550/arxiv.2506.12029", "source": "dblp", "result_id": "dblp:doi:10.48550/arxiv.2506.12029"}, {"title": "Multi-vessel Interaction-Aware Trajectory Prediction and Collision Risk Assessment", "authors": ["Md Mahbub Alam", "Jos\u00e9 F. Rodrigues Jr.", "Gabriel Spadon"], "year": 2025, "publication": "CoRR", "link": "https://doi.org/10.48550/arXiv.2509.01836", "snippet": "CoRR, 2025, 10.48550/arxiv.2509.01836", "source": "dblp", "result_id": "dblp:doi:10.48550/arxiv.2509.01836"}, {"title": "Goal-Conditioned Reinforcement Learning for Data-Driven Maritime Navigation", "authors": ["Vaishnav Vaidheeswaran", "Dilith Jayakody", "Samruddhi Mulay", "Anand Lo", "Md Mahbub Alam", "Gabriel Spadon"], "year": 2025, "publication": "CoRR", "link": "https://doi.org/10.48550/arXiv.2509.01838", "snippet": "CoRR, 2025, 10.48550/arxiv.2509.01838", "source": "dblp", "result_id": "dblp:doi:10.48550/arxiv.2509.01838"}, {"title": "Community-Centered Spatial Intelligence for Climate Adaptation at Nova Scotia's Eastern Shore", "authors": ["Gabriel Spadon", "Oladapo Oyebode", "Camilo M. Botero", "Tushar Sharma", "Floris Goerlandt", "Ronald Pelot"], "year": 2025, "publication": "CoRR", "link": "https://doi.org/10.48550/arXiv.2509.01845", "snippet": "CoRR, 2025, 10.48550/arxiv.2509.01845", "source": "dblp", "result_id": "dblp:doi:10.48550/arxiv.2509.01845"}, {"title": "A Theoretical Framework for Environmental Similarity and Vessel Mobility as Coupled Predictors of Marine Invasive Species Pathways", "authors": ["Gabriel Spadon", "Vaishnav Vaidheeswaran", "Claudio DiBacco"], "year": 2025, "publication": "CoRR", "link": "https://doi.org/10.48550/arXiv.2511.03499", "snippet": "CoRR, 2025, 10.48550/arxiv.2511.03499", "source": "dblp", "result_id": "dblp:doi:10.48550/arxiv.2511.03499"}, {"title": "Maritime tracking data analysis and integration with AISdb", "authors": ["Gabriel Spadon", "Jay Kumar", "Jinkun Chen", "Matthew Smith", "Casey Hilliard", "Sarah Vela", "Romina Gehrmann", "Claudio DiBacco", "Stan Matwin", "Ronald Pelot"], "year": 2024, "publication": "SoftwareX", "link": "https://doi.org/10.1016/j.softx.2024.101952", "snippet": "SoftwareX, 2024, 10.1016/j.softx.2024.101952", "source": "dblp", "result_id": "dblp:doi:10.1016/j.softx.2024.101952"}, {"title": "Gravity-Informed Deep Learning Framework for Predicting Ship Traffic Flow and Invasion Risk of Non-Indigenous Species via Ballast Water Discharge", "authors": ["Ruixin Song", "Gabriel Spadon", "Ronald Pelot", "Stan Matwin", "Am\u00edlcar Soares"], "year": 2024, "publication": "CoRR", "link": "https://doi.org/10.48550/arXiv.2401.13098", "snippet": "CoRR, 2024, 10.48550/arxiv.2401.13098", "source": "dblp", "result_id": "dblp:doi:10.48550/arxiv.2401.13098"}, {"title": "Maritime Tracking Data Analysis and Integration with AISdb", "authors": ["Gabriel Spadon", "Jay Kumar", "Jinkun Chen", "Matthew Smith", "Casey Hilliard", "Sarah Vela", "Romina Gehrmann", "Claudio DiBacco", "Stan Matwin", "Ronald Pelot"], "year": 2024, "publication": "CoRR", "link": "https://doi.org/10.48550/arXiv.2407.08082", "snippet": "CoRR, 2024, 10.48550/arxiv.2407.08082", "source": "dblp", "result_id": "dblp:doi:10.48550/arxiv.2407.08082"}, {"title": "ImPORTance - Machine Learning-Driven Analysis of Global Port Significance and Network Dynamics for Improved Operational Efficiency", "authors": ["Emanuele Carlini", "Domenico Di Gangi", "Vinicius Monteiro de Lira", "Hanna Kavalionak", "Gabriel Spadon", "Am\u00edlcar Soares J\u00fanior"], "year": 2024, "publication": "CoRR", "link": "https://doi.org/10.48550/arXiv.2407.09571", "snippet": "CoRR, 2024, 10.48550/arxiv.2407.09571", "source": "dblp", "result_id": "dblp:doi:10.48550/arxiv.2407.09571"}, {"title": "Unfolding AIS Transmission Behavior for Vessel Movement Modeling on Noisy Data Leveraging Machine Learning", "authors": ["Gabriel Spadon", "Martha Dais Ferreira", "Am\u00edlcar Soares", "Stan Matwin"], "year": 2023, "publication": "IEEE Access", "link": "https://doi.org/10.1109/ACCESS.2022.3197215", "snippet": "IEEE Access, 2023, 10.1109/access.2022.3197215", "source": "dblp", "result_id": "dblp:doi:10.1109/access.2022.3197215"}, {"title": "A Data Augmentation Algorithm for Trajectory Data", "authors": ["Yaksh J. Haranwala", "Gabriel Spadon", "Chiara Renso", "Am\u00edlcar Soares"], "year": 2023, "publication": "EMODE@SIGSPATIAL", "link": "https://doi.org/10.1145/3615885.3628008", "snippet": "EMODE@SIGSPATIAL, 2023, 10.1145/3615885.3628008", "source": "dblp", "result_id": "dblp:doi:10.1145/3615885.3628008"}, {"title": "Building a Safer Maritime Environment Through Multi-Path Long-Term Vessel Trajectory Forecasting", "authors": ["Gabriel Spadon", "Jay Kumar", "Matthew Smith", "Sarah Vela", "Romina Gehrmann", "Derek Eden", "Joshua van Berkel", "Am\u00edlcar Soares", "Ronan Fablet", "Ronald Pelot", "Stan Matwin"], "year": 2023, "publication": "CoRR", "link": "https://doi.org/10.48550/arXiv.2310.18948", "snippet": "CoRR, 2023, 10.48550/arxiv.2310.18948", "source": "dblp", "result_id": "dblp:doi:10.48550/arxiv.2310.18948"}, {"title": "Pay Attention to Evolution: Time Series Forecasting With Deep Graph-Evolution Learning", "authors": ["Gabriel Spadon", "Shenda Hong", "Bruno Brandoli", "Stan Matwin", "Jos\u00e9 F. Rodrigues Jr.", "Jimeng Sun"], "year": 2022, "publication": "IEEE Trans. Pattern Anal. Mach. Intell.", "link": "https://doi.org/10.1109/TPAMI.2021.3076155", "snippet": "IEEE Trans. Pattern Anal. Mach. Intell., 2022, 10.1109/tpami.2021.3076155", "source": "dblp", "result_id": "dblp:doi:10.1109/tpami.2021.3076155"}, {"title": "A Semi-Supervised Methodology for Fishing Activity Detection Using the Geometry behind the Trajectory of Multiple Vessels", "authors": ["Martha Dais Ferreira", "Gabriel Spadon", "Am\u00edlcar Soares", "Stan Matwin"], "year": 2022, "publication": "Sensors", "link": "https://doi.org/10.3390/s22166063", "snippet": "Sensors, 2022, 10.3390/s22166063", "source": "dblp", "result_id": "dblp:doi:10.3390/s22166063"}, {"title": "Unfolding collective AIS transmission behavior for vessel movement modeling on irregular timing data using noise-robust neural networks", "authors": ["Gabriel Spadon", "Martha Dais Ferreira", "Am\u00edlcar Soares", "Stan Matwin"], "year": 2022, "publication": "CoRR", "link": "https://arxiv.org/abs/2202.13867", "snippet": "CoRR, 2022", "source": "dblp", "result_id": "dblp:unfolding_collective_ais_transmission_behavior_for_vessel_moveme"}, {"title": "From Cities to Series: Complex Networks and Deep Learning for Improved Spatial and Temporal Analytics", "authors": ["Gabriel Spadon", "Jos\u00e9 F. Rodrigues Jr."], "year": 2022, "publication": "CoRR", "link": "https://doi.org/10.48550/arXiv.2206.01176", "snippet": "CoRR, 2022, 10.48550/arxiv.2206.01176", "source": "dblp", "result_id": "dblp:doi:10.48550/arxiv.2206.01176"}, {"title": "A semi-supervised geometric-driven methodology for supervised fishing activity detection on multi-source AIS tracking messages", "authors": ["Martha Dais Ferreira", "Gabriel Spadon", "Am\u00edlcar Soares", "Stan Matwin"], "year": 2022, "publication": "CoRR", "link": "https://doi.org/10.48550/arXiv.2207.05514", "snippet": "CoRR, 2022, 10.48550/arxiv.2207.05514", "source": "dblp", "result_id": "dblp:doi:10.48550/arxiv.2207.05514"}, {"title": "DropLeaf: A precision farming smartphone tool for real-time quantification of pesticide application coverage", "authors": ["Bruno Brandoli", "Gabriel Spadon", "Travis J. Esau", "Patrick Hennessy", "Andr\u00e9 C. P. L. F. de Carvalho", "Sihem Amer-Yahia", "Jos\u00e9 F. Rodrigues Jr."], "year": 2021, "publication": "Comput. Electron. Agric.", "link": "https://doi.org/10.1016/j.compag.2020.105906", "snippet": "Comput. Electron. Agric., 2021, 10.1016/j.compag.2020.105906", "source": "dblp", "result_id": "dblp:doi:10.1016/j.compag.2020.105906"}, {"title": "LIG-Doctor: Efficient patient trajectory prediction using bidirectional minimal gated-recurrent networks", "authors": ["Jos\u00e9 F. Rodrigues Jr.", "Marco A. Gutierrez", "Gabriel Spadon", "Bruno Brandoli", "Sihem Amer-Yahia"], "year": 2021, "publication": "Inf. Sci.", "link": "https://doi.org/10.1016/j.ins.2020.09.024", "snippet": "Inf. Sci., 2021, 10.1016/j.ins.2020.09.024", "source": "dblp", "result_id": "dblp:doi:10.1016/j.ins.2020.09.024"}, {"title": "Aircraft Fuselage Corrosion Detection Using Artificial Intelligence", "authors": ["Bruno Brandoli", "Andr\u00e9 R. de Geus", "Jefferson R. Souza", "Gabriel Spadon", "Am\u00edlcar Soares J\u00fanior", "Jos\u00e9 F. Rodrigues Jr.", "Jerzy Komorowski", "Stan Matwin"], "year": 2021, "publication": "Sensors", "link": "https://doi.org/10.3390/s21124026", "snippet": "Sensors, 2021, 10.3390/s21124026", "source": "dblp", "result_id": "dblp:doi:10.3390/s21124026"}, {"title": "SHARq: sharing recursive queries in relational databases", "authors": ["Lucas C. Scabora", "Gabriel Spadon", "Mirela T. Cazzolato", "Daniel S. Kaster", "Agma J. M. Traina", "Jos\u00e9 F. Rodrigues Jr.", "Caetano Traina Jr."], "year": 2021, "publication": "SAC", "link": "https://doi.org/10.1145/3412841.3442078", "snippet": "SAC, 2021, 10.1145/3412841.3442078", "source": "dblp", "result_id": "dblp:doi:10.1145/3412841.3442078"}, {"title": "Lig-Doctor: Real-World Clinical Prognosis using a Bi-Directional Neural Network", "authors": ["Jos\u00e9 F. Rodrigues Jr.", "Gabriel Spadon", "Bruno Brandoli", "Sihem Amer-Yahia"], "year": 2020, "publication": "CBMS", "link": "https://doi.org/10.1109/CBMS49503.2020.00113", "snippet": "CBMS, 2020, 10.1109/cbms49503.2020.00113", "source": "dblp", "result_id": "dblp:doi:10.1109/cbms49503.2020.00113"}, {"title": "Enhancing recursive graph querying on RDBMS with data clustering approaches", "authors": ["Lucas C. Scabora", "Gabriel Spadon", "Paulo H. Oliveira", "Jos\u00e9 F. Rodrigues Jr.", "Caetano Traina Jr."], "year": 2020, "publication": "SAC", "link": "https://doi.org/10.1145/3341105.3375770", "snippet": "SAC, 2020, 10.1145/3341105.3375770", "source": "dblp", "result_id": "dblp:doi:10.1145/3341105.3375770"}, {"title": "Pay Attention to Evolution: Time Series Forecasting with Deep Graph-Evolution Learning", "authors": ["Gabriel Spadon", "Shenda Hong", "Bruno Brandoli", "Stan Matwin", "Jos\u00e9 F. Rodrigues Jr.", "Jimeng Sun"], "year": 2020, "publication": "CoRR", "link": "https://arxiv.org/abs/2008.12833", "snippet": "CoRR, 2020", "source": "dblp", "result_id": "dblp:pay_attention_to_evolution_time_series_forecasting_with_deep_gra"}, {"title": "DropLeaf: a precision farming smartphone application for measuring pesticide spraying methods", "authors": ["Bruno Brandoli", "Gabriel Spadon", "Travis J. Esau", "Patrick Hennessy", "Andr\u00e9 C. P. L. F. de Carvalho", "Jos\u00e9 F. Rodrigues Jr.", "Sihem Amer-Yahia"], "year": 2020, "publication": "CoRR", "link": "https://arxiv.org/abs/2009.00453", "snippet": "CoRR, 2020", "source": "dblp", "result_id": "dblp:dropleaf_a_precision_farming_smartphone_application_for_measurin"}, {"title": "Detecting multi-scale distance-based inconsistencies in cities through complex-networks", "authors": ["Gabriel Spadon", "Bruno Brandoli", "Danilo Medeiros Eler", "Jos\u00e9 F. Rodrigues Jr."], "year": 2019, "publication": "J. Comput. Sci.", "link": "https://doi.org/10.1016/j.jocs.2018.12.015", "snippet": "J. Comput. Sci., 2019, 10.1016/j.jocs.2018.12.015", "source": "dblp", "result_id": "dblp:doi:10.1016/j.jocs.2018.12.015"}, {"title": "Reconstructing commuters network using machine learning and urban indicators", "authors": ["Gabriel Spadon", "Andr\u00e9 C. P. L. F. de Carvalho", "Jos\u00e9 F. Rodrigues Jr.", "Luiz G. A. Alves"], "year": 2019, "publication": "CoRR", "link": "http://arxiv.org/abs/1908.03512", "snippet": "CoRR, 2019", "source": "dblp", "result_id": "dblp:reconstructing_commuters_network_using_machine_learning_and_urba"}, {"title": "Patient trajectory prediction in the Mimic-III dataset, challenges and pitfalls", "authors": ["Jos\u00e9 F. Rodrigues Jr.", "Gabriel Spadon", "Bruno Brandoli", "Sihem Amer-Yahia"], "year": 2019, "publication": "CoRR", "link": "http://arxiv.org/abs/1909.04605", "snippet": "CoRR, 2019", "source": "dblp", "result_id": "dblp:patient_trajectory_prediction_in_the_mimic_iii_dataset_challenge"}, {"title": "Hadoop Cluster Deployment: A Methodological Approach", "authors": ["Ronaldo Celso Messias Correia", "Gabriel Spadon", "Pedro Henrique de Andrade Gomes", "Danilo Medeiros Eler", "Rog\u00e9rio Eduardo Garcia", "Celso Olivete Junior"], "year": 2018, "publication": "Inf.", "link": "https://doi.org/10.3390/info9060131", "snippet": "Inf., 2018, 10.3390/info9060131", "source": "dblp", "result_id": "dblp:doi:10.3390/info9060131"}, {"title": "Cutting-edge Relational Graph Data Management with Edge-k: From One to Multiple Edges in the Same Row", "authors": ["Lucas C. Scabora", "Paulo H. Oliveira", "Gabriel Spadon", "Daniel S. Kaster", "Jos\u00e9 F. Rodrigues Jr.", "Agma J. M. Traina", "Caetano Traina J\u00fanior"], "year": 2018, "publication": "J. Inf. Data Manag.", "link": "https://sol.sbc.org.br/journals/index.php/jidm/article/view/1634", "snippet": "J. Inf. Data Manag., 2018", "source": "dblp", "result_id": "dblp:cutting_edge_relational_graph_data_management_with_edge_k_from_o"}, {"title": "RAFIKI: Retrieval-Based Application for Imaging and Knowledge Investigation", "authors": ["Marcos Roberto Nesso Junior", "Mirela T. Cazzolato", "Lucas C. Scabora", "Paulo H. Oliveira", "Gabriel Spadon", "J\u00e9ssica Andressa de Souza", "Willian D. Oliveira", "Daniel Y. T. Chino", "Jos\u00e9 F. Rodrigues Jr.", "Agma J. M. Traina", "Caetano Traina"], "year": 2018, "publication": "CBMS", "link": "https://doi.org/10.1109/CBMS.2018.00020", "snippet": "CBMS, 2018, 10.1109/cbms.2018.00020", "source": "dblp", "result_id": "dblp:doi:10.1109/cbms.2018.00020"}, {"title": "A comparative analysis of the automatic modeling of Learning Styles through Machine Learning techniques", "authors": ["Lucas D. Ferreira", "Gabriel Spadon", "Andr\u00e9 C. P. L. F. de Carvalho", "Jos\u00e9 F. Rodrigues Jr."], "year": 2018, "publication": "FIE", "link": "https://doi.org/10.1109/FIE.2018.8659191", "snippet": "FIE, 2018, 10.1109/fie.2018.8659191", "source": "dblp", "result_id": "dblp:doi:10.1109/fie.2018.8659191"}, {"title": "Topological Street-Network Characterization Through Feature-Vector and Cluster Analysis", "authors": ["Gabriel Spadon", "Gabriel P. Gimenes", "Jos\u00e9 F. Rodrigues Jr."], "year": 2018, "publication": "ICCS (1)", "link": "https://doi.org/10.1007/978-3-319-93698-7_21", "snippet": "ICCS (1), 2018, 10.1007/978-3-319-93698-7_21", "source": "dblp", "result_id": "dblp:doi:10.1007/978-3-319-93698-7_21"}, {"title": "A Distance-Based Tool-Set to Track Inconsistent Urban Structures Through Complex-Networks", "authors": ["Gabriel Spadon", "Bruno Brandoli Machado", "Danilo Medeiros Eler", "Jos\u00e9 F. Rodrigues Jr."], "year": 2018, "publication": "ICCS (1)", "link": "https://doi.org/10.1007/978-3-319-93698-7_22", "snippet": "ICCS (1), 2018, 10.1007/978-3-319-93698-7_22", "source": "dblp", "result_id": "dblp:doi:10.1007/978-3-319-93698-7_22"}, {"title": "Recognition of Endangered Pantanal Animal Species using Deep Learning Methods", "authors": ["Mauro dos Santos de Arruda", "Gabriel Spadon", "Jos\u00e9 F. Rodrigues Jr.", "Wesley Nunes Gon\u00e7alves", "Bruno Brandoli Machado"], "year": 2018, "publication": "IJCNN", "link": "https://doi.org/10.1109/IJCNN.2018.8489369", "snippet": "IJCNN, 2018, 10.1109/ijcnn.2018.8489369", "source": "dblp", "result_id": "dblp:doi:10.1109/ijcnn.2018.8489369"}, {"title": "A smartphone application to measure the quality of pest control spraying machines via image analysis", "authors": ["Bruno Brandoli Machado", "Gabriel Spadon", "Mauro S. Arruda", "Wesley Nunes Gon\u00e7alves", "Andr\u00e9 C. P. L. F. de Carvalho", "Jos\u00e9 F. Rodrigues Jr."], "year": 2018, "publication": "SAC", "link": "https://doi.org/10.1145/3167132.3167237", "snippet": "SAC, 2018, 10.1145/3167132.3167237", "source": "dblp", "result_id": "dblp:doi:10.1145/3167132.3167237"}, {"title": "Caracteriza\u00e7\u00e3o Topol\u00f3gica de Redes Vi\u00e1rias por Meio da An\u00e1lise de Vetores de Caracter\u00edsticas e T\u00e9cnicas de Agrupamento", "authors": ["Gabriel Spadon", "Lucas C. Scabora", "Marcos R. Nesso Jr.", "Caetano Traina Jr.", "Jos\u00e9 F. Rodrigues Jr."], "year": 2018, "publication": "SBBD", "link": "https://doi.org/10.5753/sbbd.2018.22227", "snippet": "SBBD, 2018, 10.5753/sbbd.2018.22227", "source": "dblp", "result_id": "dblp:doi:10.5753/sbbd.2018.22227"}, {"title": "Computer-assisted City Touring for Explorers", "authors": ["Gabriel Spadon", "Jos\u00e9 Fernandes Rodrigues Jr."], "year": 2018, "publication": "BiDu-Posters@VLDB", "link": "https://ceur-ws.org/Vol-2247/poster4.pdf", "snippet": "BiDu-Posters@VLDB, 2018", "source": "dblp", "result_id": "dblp:computer_assisted_city_touring_for_explorers"}, {"title": "A distance-based tool-set to track inconsistent urban structures through complex-networks", "authors": ["Gabriel Spadon", "Bruno Brandoli Machado", "Danilo Medeiros Eler", "Jos\u00e9 Fernando Rodrigues Jr."], "year": 2018, "publication": "CoRR", "link": "http://arxiv.org/abs/1803.09136", "snippet": "CoRR, 2018", "source": "dblp", "result_id": "dblp:a_distance_based_tool_set_to_track_inconsistent_urban_structures"}, {"title": "Topological street-network characterization through feature-vector and cluster analysis", "authors": ["Gabriel Spadon", "Gabriel P. Gimenes", "Jos\u00e9 F. Rodrigues Jr."], "year": 2018, "publication": "CoRR", "link": "http://arxiv.org/abs/1806.07952", "snippet": "CoRR, 2018", "source": "dblp", "result_id": "dblp:topological_street_network_characterization_through_feature_vect"}, {"title": "Teaching software quality via source code inspection tool", "authors": ["Pedro Henrique de Andrade Gomes", "Rog\u00e9rio Eduardo Garcia", "Gabriel Spadon de Souza", "Danilo Medeiros Eler", "Celso Olivete Junior", "Ronaldo Celso Messias Correia"], "year": 2017, "publication": "FIE", "link": "https://doi.org/10.1109/FIE.2017.8190658", "snippet": "FIE, 2017, 10.1109/fie.2017.8190658", "source": "dblp", "result_id": "dblp:doi:10.1109/fie.2017.8190658"}, {"title": "Identifying Urban Inconsistencies via Street Networks", "authors": ["Gabriel Spadon", "Gabriel P. Gimenes", "Jos\u00e9 F. Rodrigues Jr."], "year": 2017, "publication": "ICCS", "link": "https://doi.org/10.1016/j.procs.2017.05.103", "snippet": "ICCS, 2017, 10.1016/j.procs.2017.05.103", "source": "dblp", "result_id": "dblp:doi:10.1016/j.procs.2017.05.103"}, {"title": "Behavioral Characterization of Criminality Spread in Cities", "authors": ["Gabriel Spadon", "Lucas C. Scabora", "Paulo H. Oliveira", "Marcus V. S. Araujo", "Bruno Brandoli Machado", "Elaine P. M. de Sousa", "Caetano Traina Jr.", "Jos\u00e9 F. Rodrigues Jr."], "year": 2017, "publication": "ICCS", "link": "https://doi.org/10.1016/j.procs.2017.05.118", "snippet": "ICCS, 2017, 10.1016/j.procs.2017.05.118", "source": "dblp", "result_id": "dblp:doi:10.1016/j.procs.2017.05.118"}, {"title": "A smartphone application to measure the quality of pest control spraying machines via image analysis", "authors": ["Bruno Brandoli Machado", "Gabriel Spadon", "Mauro S. Arruda", "Wesley Nunes Gon\u00e7alves", "Andr\u00e9 C. P. L. F. de Carvalho", "Jos\u00e9 F. Rodrigues Jr."], "year": 2017, "publication": "CoRR", "link": "http://arxiv.org/abs/1711.07828", "snippet": "CoRR, 2017", "source": "dblp", "result_id": "dblp:a_smartphone_application_to_measure_the_quality_of_pest_control_"}, {"title": "Combined Methodology for Theoretical Computing", "authors": ["Gabriel Spadon de Souza", "Pedro Henrique de Andrade Gomes", "Ronaldo Celso Messias Correia", "Celso Olivete Junior", "Danilo Medeiros Eler", "Rog\u00e9rio Eduardo Garcia"], "year": 2016, "publication": "FIE", "link": "https://doi.org/10.1109/FIE.2016.7757574", "snippet": "FIE, 2016, 10.1109/fie.2016.7757574", "source": "dblp", "result_id": "dblp:doi:10.1109/fie.2016.7757574"}, {"title": "Complex Network Tools to Understand the Behavior of Criminality in Urban Areas", "authors": ["Gabriel Spadon", "Lucas C. Scabora", "Marcus V. S. Araujo", "Paulo H. Oliveira", "Bruno Brandoli Machado", "Elaine P. M. de Sousa", "Caetano Traina Jr.", "Jos\u00e9 F. Rodrigues Jr."], "year": 2016, "publication": "CoRR", "link": "http://arxiv.org/abs/1612.06115", "snippet": "CoRR, 2016", "source": "dblp", "result_id": "dblp:complex_network_tools_to_understand_the_behavior_of_criminality_"}, {"title": "Teaching-learning methodology for formal languages and automata theory", "authors": ["Gabriel Spadon de Souza", "Celso Olivete Junior", "Ronaldo Celso Messias Correia", "Rog\u00e9rio Eduardo Garcia"], "year": 2015, "publication": "FIE", "link": "https://doi.org/10.1109/FIE.2015.7344185", "snippet": "FIE, 2015, 10.1109/fie.2015.7344185", "source": "dblp", "result_id": "dblp:doi:10.1109/fie.2015.7344185"}]}} \ No newline at end of file diff --git a/data/api_cache/dblp/c0c2388366ca1c006c63e5b9efc4059de9e90f499372cc5ed20f42278e7eaba2.json b/data/api_cache/dblp/c0c2388366ca1c006c63e5b9efc4059de9e90f499372cc5ed20f42278e7eaba2.json index 4645beb2..8275f125 100644 --- a/data/api_cache/dblp/c0c2388366ca1c006c63e5b9efc4059de9e90f499372cc5ed20f42278e7eaba2.json +++ b/data/api_cache/dblp/c0c2388366ca1c006c63e5b9efc4059de9e90f499372cc5ed20f42278e7eaba2.json @@ -1 +1 @@ -{"timestamp": 1772379969.501578, "ttl_days": 60, "data": {"articles": [{"title": "VOLAP: A Scalable Distributed Real-Time OLAP System for High-Velocity Data", "authors": ["Frank Dehne", "David E. Robillard", "Andrew Rau-Chaplin", "Neil Burke"], "year": 2018, "publication": "IEEE Trans. Parallel Distributed Syst.", "link": "https://doi.org/10.1109/TPDS.2017.2743072", "snippet": "IEEE Trans. Parallel Distributed Syst., 2018, 10.1109/tpds.2017.2743072", "source": "dblp", "result_id": "dblp:doi:10.1109/tpds.2017.2743072"}, {"title": "Quantifying Eventual Consistency For Aggregate Queries", "authors": ["Neil Burke", "Frank Dehne", "Andrew Rau-Chaplin", "David E. Robillard"], "year": 2017, "publication": "IDEAS", "link": "https://doi.org/10.1145/3105831.3105836", "snippet": "IDEAS, 2017, 10.1145/3105831.3105836", "source": "dblp", "result_id": "dblp:doi:10.1145/3105831.3105836"}, {"title": "Computing probable maximum loss in catastrophe reinsurance portfolios on multi-core and many-core architectures", "authors": ["Neil Burke", "Andrew Rau-Chaplin", "Blesson Varghese"], "year": 2016, "publication": "Concurr. Comput. Pract. Exp.", "link": "https://doi.org/10.1002/cpe.3695", "snippet": "Concurr. Comput. Pract. Exp., 2016, 10.1002/cpe.3695", "source": "dblp", "result_id": "dblp:doi:10.1002/cpe.3695"}, {"title": "Accelerating R-based analytics on the cloud", "authors": ["Ishan Patel", "Andrew Rau-Chaplin", "Blesson Varghese"], "year": 2016, "publication": "Concurr. Comput. Pract. Exp.", "link": "https://doi.org/10.1002/cpe.3026", "snippet": "Concurr. Comput. Pract. Exp., 2016, 10.1002/cpe.3026", "source": "dblp", "result_id": "dblp:doi:10.1002/cpe.3026"}, {"title": "Enhanced multiobjective population-based incremental learning with applications in risk treaty optimization", "authors": ["Omar Andr\u00e9s Carmona Cortes", "Andrew Rau-Chaplin"], "year": 2016, "publication": "Evol. Intell.", "link": "https://doi.org/10.1007/s12065-016-0147-0", "snippet": "Evol. Intell., 2016, 10.1007/s12065-016-0147-0", "source": "dblp", "result_id": "dblp:doi:10.1007/s12065-016-0147-0"}, {"title": "VOLAP: A Scalable Distributed System for Real-Time OLAP with High Velocity Data", "authors": ["Frank Dehne", "David E. Robillard", "Andrew Rau-Chaplin", "Neil Burke"], "year": 2016, "publication": "CLUSTER", "link": "https://doi.org/10.1109/CLUSTER.2016.29", "snippet": "CLUSTER, 2016, 10.1109/cluster.2016.29", "source": "dblp", "result_id": "dblp:doi:10.1109/cluster.2016.29"}, {"title": "A stochastic adaptive genetic algorithm for solving unconstrained multimodal numerical problems", "authors": ["Egidio Carvalho", "Omar Andr\u00e9s Carmona Cortes", "Jo\u00e3o Pedro Costa", "Andrew Rau-Chaplin"], "year": 2016, "publication": "EAIS", "link": "https://doi.org/10.1109/EAIS.2016.7502503", "snippet": "EAIS, 2016, 10.1109/eais.2016.7502503", "source": "dblp", "result_id": "dblp:doi:10.1109/eais.2016.7502503"}, {"title": "Enhanced Multiobjective Population-Based Incremental Learning with Applications in Risk Treaty Optimization", "authors": ["Omar Andr\u00e9s Carmona Cortes", "Andrew Rau-Chaplin"], "year": 2016, "publication": "EvoApplications (1)", "link": "https://doi.org/10.1007/978-3-319-31204-0_1", "snippet": "EvoApplications (1), 2016, 10.1007/978-3-319-31204-0_1", "source": "dblp", "result_id": "dblp:doi:10.1007/978-3-319-31204-0_1"}, {"title": "The Hilbert PDC-tree: A High-Velocity Structure for Many-Dimensional Data", "authors": ["David E. Robillard", "Frank Dehne", "Andrew Rau-Chaplin", "Neil Burke"], "year": 2016, "publication": "IDEAS", "link": "https://doi.org/10.1145/2938503.2938549", "snippet": "IDEAS, 2016, 10.1145/2938503.2938549", "source": "dblp", "result_id": "dblp:doi:10.1145/2938503.2938549"}, {"title": "Scalable real-time OLAP on cloud architectures", "authors": ["Frank K. H. A. Dehne", "Q. Kong", "Andrew Rau-Chaplin", "Hamidreza Zaboli", "R. Zhou"], "year": 2015, "publication": "J. Parallel Distributed Comput.", "link": "https://doi.org/10.1016/j.jpdc.2014.08.006", "snippet": "J. Parallel Distributed Comput., 2015, 10.1016/j.jpdc.2014.08.006", "source": "dblp", "result_id": "dblp:doi:10.1016/j.jpdc.2014.08.006"}, {"title": "Efficient Computation of Co-occurrence Based Word Relatedness", "authors": ["Jie Mei", "Xinxin Kou", "Zhimin Yao", "Andrew Rau-Chaplin", "Aminul Islam", "Abidalrahman Moh'd", "Evangelos E. Milios"], "year": 2015, "publication": "DocEng", "link": "https://doi.org/10.1145/2682571.2797088", "snippet": "DocEng, 2015, 10.1145/2682571.2797088", "source": "dblp", "result_id": "dblp:doi:10.1145/2682571.2797088"}, {"title": "Efficient Parallelization of the Google Trigram Method for Document Relatedness Computation", "authors": ["Xinxin Kou", "Jie Mei", "Zhimin Yao", "Andrew Rau-Chaplin", "Aminul Islam", "Abidalrahman Moh'd", "Evangelos E. Milios"], "year": 2015, "publication": "ICPP Workshops", "link": "https://doi.org/10.1109/ICPPW.2015.42", "snippet": "ICPP Workshops, 2015, 10.1109/icppw.2015.42", "source": "dblp", "result_id": "dblp:doi:10.1109/icppw.2015.42"}, {"title": "Differential Evolution on a GPGPU: The Influence of Parameters on Speedup and the Quality of Solutions", "authors": ["Omar Andr\u00e9s Carmona Cortes", "M\u00f4nica Sakuray Pais", "Filipo Novo M\u00f3r", "Andrew Rau-Chaplin", "C\u00e9sar Augusto Missio Marcon"], "year": 2015, "publication": "IPDPS Workshops", "link": "https://doi.org/10.1109/IPDPSW.2015.92", "snippet": "IPDPS Workshops, 2015, 10.1109/ipdpsw.2015.92", "source": "dblp", "result_id": "dblp:doi:10.1109/ipdpsw.2015.92"}, {"title": "Dynamic optimization of multi-layered reinsurance treaties", "authors": ["Haoxu Wang", "Omar Andr\u00e9s Carmona Cortes", "Andrew Rau-Chaplin"], "year": 2015, "publication": "SAC", "link": "https://doi.org/10.1145/2695664.2695899", "snippet": "SAC, 2015, 10.1145/2695664.2695899", "source": "dblp", "result_id": "dblp:doi:10.1145/2695664.2695899"}, {"title": "eXsight: An Analytical Framework for Quantifying Financial Loss in the Aftermath of Catastrophic Events", "authors": ["Matthew Coelho", "Andrew Rau-Chaplin"], "year": 2014, "publication": "DEXA Workshops", "link": "https://doi.org/10.1109/DEXA.2014.45", "snippet": "DEXA Workshops, 2014, 10.1109/dexa.2014.45", "source": "dblp", "result_id": "dblp:doi:10.1109/dexa.2014.45"}, {"title": "On PBIL, DE and PSO for Optimization of Reinsurance Contracts", "authors": ["Omar Andr\u00e9s Carmona Cortes", "Andrew Rau-Chaplin", "Duane Wilson", "J\u00fcrgen Gaiser-Porter"], "year": 2014, "publication": "EvoApplications", "link": "https://doi.org/10.1007/978-3-662-45523-4_19", "snippet": "EvoApplications, 2014, 10.1007/978-3-662-45523-4_19", "source": "dblp", "result_id": "dblp:doi:10.1007/978-3-662-45523-4_19"}, {"title": "Parallel MO-PBIL: Computing pareto optimal frontiers efficiently with applications in reinsurance analytics", "authors": ["Leah Brown", "Anirudha Ashok Beria", "Omar Andr\u00e9s Carmona Cortes", "Andrew Rau-Chaplin", "Duane Wilson", "Neil Burke", "J\u00fcrgen Gaiser-Porter"], "year": 2014, "publication": "HPCS", "link": "https://doi.org/10.1109/HPCSim.2014.6903766", "snippet": "HPCS, 2014, 10.1109/hpcsim.2014.6903766", "source": "dblp", "result_id": "dblp:doi:10.1109/hpcsim.2014.6903766"}, {"title": "Efficient Data Structures for Risk Modelling in Portfolios of Catastrophic Risk Using MapReduce", "authors": ["Andrew Rau-Chaplin", "Zhimin Yao", "Norbert Zeh"], "year": 2014, "publication": "ICCS", "link": "https://doi.org/10.1016/j.procs.2014.05.141", "snippet": "ICCS, 2014, 10.1016/j.procs.2014.05.141", "source": "dblp", "result_id": "dblp:doi:10.1016/j.procs.2014.05.141"}, {"title": "On VEPSO and VEDE for solving a treaty optimization problem", "authors": ["Omar Andr\u00e9s Carmona Cortes", "Andrew Rau-Chaplin", "Pedro Felipe do Prado"], "year": 2014, "publication": "SMC", "link": "https://doi.org/10.1109/SMC.2014.6974290", "snippet": "SMC, 2014, 10.1109/smc.2014.6974290", "source": "dblp", "result_id": "dblp:doi:10.1109/smc.2014.6974290"}, {"title": "OLAP for moving object data", "authors": ["Oliver Baltzer", "Frank Dehne", "Andrew Rau-Chaplin"], "year": 2013, "publication": "Int. J. Intell. Inf. Database Syst.", "link": "https://doi.org/10.1504/IJIIDS.2013.051745", "snippet": "Int. J. Intell. Inf. Database Syst., 2013, 10.1504/ijiids.2013.051745", "source": "dblp", "result_id": "dblp:doi:10.1504/ijiids.2013.051745"}, {"title": "A distributed tree data structure for real-time OLAP on cloud architectures", "authors": ["Frank K. H. A. Dehne", "Q. Kong", "Andrew Rau-Chaplin", "Hamidreza Zaboli", "R. Zhou"], "year": 2013, "publication": "IEEE BigData", "link": "https://doi.org/10.1109/BigData.2013.6691613", "snippet": "IEEE BigData, 2013, 10.1109/bigdata.2013.6691613", "source": "dblp", "result_id": "dblp:doi:10.1109/bigdata.2013.6691613"}, {"title": "QuPARA: Query-driven large-scale portfolio aggregate risk analysis on MapReduce", "authors": ["Andrew Rau-Chaplin", "Blesson Varghese", "Duane Wilson", "Zhimin Yao", "Norbert Zeh"], "year": 2013, "publication": "IEEE BigData", "link": "https://doi.org/10.1109/BigData.2013.6691640", "snippet": "IEEE BigData, 2013, 10.1109/bigdata.2013.6691640", "source": "dblp", "result_id": "dblp:doi:10.1109/bigdata.2013.6691640"}, {"title": "Risk Analytics for Estimating and Validating Magnitude of Earthquake Losses", "authors": ["Anthony Astoul", "Christopher Filliter", "Andrew Rau-Chaplin", "Kunal Shridhar", "Blesson Varghese", "Naman Varshney"], "year": 2013, "publication": "DEXA Workshops", "link": "https://doi.org/10.1109/DEXA.2013.9", "snippet": "DEXA Workshops, 2013, 10.1109/dexa.2013.9", "source": "dblp", "result_id": "dblp:doi:10.1109/dexa.2013.9"}, {"title": "High performance risk aggregation: addressing the data processing challenge the hadoop mapreduce way", "authors": ["Zhimin Yao", "Blesson Varghese", "Andrew Rau-Chaplin"], "year": 2013, "publication": "ScienceCloud@HPDC", "link": "https://doi.org/10.1145/2465848.2465853", "snippet": "ScienceCloud@HPDC, 2013, 10.1145/2465848.2465853", "source": "dblp", "result_id": "dblp:doi:10.1145/2465848.2465853"}, {"title": "A MapReduce Framework for Analysing Portfolios of Catastrophic Risk with Secondary Uncertainty", "authors": ["Andrew Rau-Chaplin", "Blesson Varghese", "Zhimin Yao"], "year": 2013, "publication": "ICCS", "link": "https://doi.org/10.1016/j.procs.2013.05.403", "snippet": "ICCS, 2013, 10.1016/j.procs.2013.05.403", "source": "dblp", "result_id": "dblp:doi:10.1016/j.procs.2013.05.403"}, {"title": "Achieving Speedup in Aggregate Risk Analysis Using Multiple GPUs", "authors": ["Aman K. Bahl", "Oliver Baltzer", "Andrew Rau-Chaplin", "Blesson Varghese", "Aaron Whiteway"], "year": 2013, "publication": "ICPP", "link": "https://doi.org/10.1109/ICPP.2013.108", "snippet": "ICPP, 2013, 10.1109/icpp.2013.108", "source": "dblp", "result_id": "dblp:doi:10.1109/icpp.2013.108"}, {"title": "Building a scalable spatial OLAP system", "authors": ["Oliver Baltzer", "Andrew Rau-Chaplin", "Norbert Zeh"], "year": 2013, "publication": "SAC", "link": "https://doi.org/10.1145/2480362.2480366", "snippet": "SAC, 2013, 10.1145/2480362.2480366", "source": "dblp", "result_id": "dblp:doi:10.1145/2480362.2480366"}, {"title": "Accounting for secondary uncertainty: efficient computation of portfolio risk measures on multi and many core architectures", "authors": ["Blesson Varghese", "Andrew Rau-Chaplin"], "year": 2013, "publication": "WHPCF@SC", "link": "https://doi.org/10.1145/2535557.2535562", "snippet": "WHPCF@SC, 2013, 10.1145/2535557.2535562", "source": "dblp", "result_id": "dblp:doi:10.1145/2535557.2535562"}, {"title": "Developing and Testing the Automated Post-Event Earthquake Loss Estimation and Visualisation (APE-ELEV) Technique", "authors": ["Anthony Astoul", "Christopher Filliter", "Eric Mason", "Andrew Rau-Chaplin", "Kunal Shridhar", "Blesson Varghese", "Naman Varshney"], "year": 2013, "publication": "CoRR", "link": "http://arxiv.org/abs/1308.1846", "snippet": "CoRR, 2013", "source": "dblp", "result_id": "dblp:developing_and_testing_the_automated_post_event_earthquake_loss_"}, {"title": "Parallel Simulations for Analysing Portfolios of Catastrophic Event Risk", "authors": ["Aman Kumar Bahl", "Oliver Baltzer", "Andrew Rau-Chaplin", "Blesson Varghese"], "year": 2013, "publication": "CoRR", "link": "http://arxiv.org/abs/1308.2066", "snippet": "CoRR, 2013", "source": "dblp", "result_id": "dblp:parallel_simulations_for_analysing_portfolios_of_catastrophic_ev"}, {"title": "Achieving Speedup in Aggregate Risk Analysis using Multiple GPUs", "authors": ["Aman K. Bahl", "Oliver Baltzer", "Andrew Rau-Chaplin", "Blesson Varghese", "Aaron Whiteway"], "year": 2013, "publication": "CoRR", "link": "http://arxiv.org/abs/1308.2572", "snippet": "CoRR, 2013", "source": "dblp", "result_id": "dblp:achieving_speedup_in_aggregate_risk_analysis_using_multiple_gpus"}, {"title": "Accelerating R-based Analytics on the Cloud", "authors": ["Ishan Patel", "Andrew Rau-Chaplin", "Blesson Varghese"], "year": 2013, "publication": "CoRR", "link": "http://arxiv.org/abs/1308.2787", "snippet": "CoRR, 2013", "source": "dblp", "result_id": "dblp:accelerating_r_based_analytics_on_the_cloud"}, {"title": "QuPARA: Query-Driven Large-Scale Portfolio Aggregate Risk Analysis on MapReduce", "authors": ["Andrew Rau-Chaplin", "Blesson Varghese", "Duane Wilson", "Zhimin Yao", "Norbert Zeh"], "year": 2013, "publication": "CoRR", "link": "http://arxiv.org/abs/1308.3615", "snippet": "CoRR, 2013", "source": "dblp", "result_id": "dblp:qupara_query_driven_large_scale_portfolio_aggregate_risk_analysi"}, {"title": "Accounting for Secondary Uncertainty: Efficient Computation of Portfolio Risk Measures on Multi and Many Core Architectures", "authors": ["Blesson Varghese", "Andrew Rau-Chaplin"], "year": 2013, "publication": "CoRR", "link": "http://arxiv.org/abs/1310.2274", "snippet": "CoRR, 2013", "source": "dblp", "result_id": "dblp:accounting_for_secondary_uncertainty_efficient_computation_of_po"}, {"title": "Data Challenges in High-Performance Risk Analytics", "authors": ["Blesson Varghese", "Andrew Rau-Chaplin"], "year": 2013, "publication": "CoRR", "link": "http://arxiv.org/abs/1311.5685", "snippet": "CoRR, 2013", "source": "dblp", "result_id": "dblp:data_challenges_in_high_performance_risk_analytics"}, {"title": "High Performance Risk Aggregation: Addressing the Data Processing Challenge the Hadoop MapReduce Way", "authors": ["Zhimin Yao", "Blesson Varghese", "Andrew Rau-Chaplin"], "year": 2013, "publication": "CoRR", "link": "http://arxiv.org/abs/1311.5686", "snippet": "CoRR, 2013", "source": "dblp", "result_id": "dblp:high_performance_risk_aggregation_addressing_the_data_processing"}, {"title": "A PSO-based algorithm with local search for multimodal optimization without constraints", "authors": ["Omar Andr\u00e9s Carmona Cortes", "Andrew Rau-Chaplin", "Rafael Fernandes Lopes"], "year": 2012, "publication": "CLEI", "link": "https://doi.org/10.1109/CLEI.2012.6427173", "snippet": "CLEI, 2012, 10.1109/clei.2012.6427173", "source": "dblp", "result_id": "dblp:doi:10.1109/clei.2012.6427173"}, {"title": "Rapid Post-event Catastrophe Modelling and Visualization", "authors": ["Eric Mason", "Andrew Rau-Chaplin", "Kunal Shridhar", "Blesson Varghese", "Naman Varshney"], "year": 2012, "publication": "DEXA Workshops", "link": "https://doi.org/10.1109/DEXA.2012.22", "snippet": "DEXA Workshops, 2012, 10.1109/dexa.2012.22", "source": "dblp", "result_id": "dblp:doi:10.1109/dexa.2012.22"}, {"title": "A Platform for Parallel R-based Analytics on Cloud Infrastructure", "authors": ["Ishan Patel", "Andrew Rau-Chaplin", "Blesson Varghese"], "year": 2012, "publication": "ICPP Workshops", "link": "https://doi.org/10.1109/ICPPW.2012.27", "snippet": "ICPP Workshops, 2012, 10.1109/icppw.2012.27", "source": "dblp", "result_id": "dblp:doi:10.1109/icppw.2012.27"}, {"title": "Parallel Simulations for Analysing Portfolios of Catastrophic Event Risk", "authors": ["Aman Kumar Bahl", "Oliver Baltzer", "Andrew Rau-Chaplin", "Blesson Varghese"], "year": 2012, "publication": "SC Companion", "link": "https://doi.org/10.1109/SC.Companion.2012.142", "snippet": "SC Companion, 2012, 10.1109/sc.companion.2012.142", "source": "dblp", "result_id": "dblp:doi:10.1109/sc.companion.2012.142"}, {"title": "Data Challenges in High-Performance Risk Analytics", "authors": ["Blesson Varghese", "Andrew Rau-Chaplin"], "year": 2012, "publication": "SC Companion", "link": "https://doi.org/10.1109/SC.Companion.2012.162", "snippet": "SC Companion, 2012, 10.1109/sc.companion.2012.162", "source": "dblp", "result_id": "dblp:doi:10.1109/sc.companion.2012.162"}, {"title": "Parallel catastrophe modelling on a Cell/BE", "authors": ["Frank K. H. A. Dehne", "Glenn Hickey", "Andrew Rau-Chaplin", "Mark Byrne"], "year": 2010, "publication": "Int. J. Parallel Emergent Distributed Syst.", "link": "https://doi.org/10.1080/17445760903492086", "snippet": "Int. J. Parallel Emergent Distributed Syst., 2010, 10.1080/17445760903492086", "source": "dblp", "result_id": "dblp:doi:10.1080/17445760903492086"}, {"title": "Dynamic View Selection for OLAP", "authors": ["Michael Lawrence", "Andrew Rau-Chaplin"], "year": 2010, "publication": "Strategic Advancements in Utilizing Data Mining and Warehousing Technologies", "link": "http://www.igi-global.com/Bookstore/chapter.aspx?titleid=40399", "snippet": "Strategic Advancements in Utilizing Data Mining and Warehousing Technologies, 2010", "source": "dblp", "result_id": "dblp:dynamic_view_selection_for_olap"}, {"title": "Rcube", "authors": ["Frank K. H. A. Dehne", "Todd Eavis", "Andrew Rau-Chaplin"], "year": 2010, "publication": "Strategic Advancements in Utilizing Data Mining and Warehousing Technologies", "link": "http://www.igi-global.com/Bookstore/chapter.aspx?titleid=40400", "snippet": "Strategic Advancements in Utilizing Data Mining and Warehousing Technologies, 2010", "source": "dblp", "result_id": "dblp:rcube"}, {"title": "Cooperative caching for grid-enabled OLAP", "authors": ["Frank Dehne", "Michael Lawrence", "Andrew Rau-Chaplin"], "year": 2009, "publication": "Int. J. Grid Util. Comput.", "link": "https://doi.org/10.1504/IJGUC.2009.022032", "snippet": "Int. J. Grid Util. Comput., 2009, 10.1504/ijguc.2009.022032", "source": "dblp", "result_id": "dblp:doi:10.1504/ijguc.2009.022032"}, {"title": "Parallel catastrophe modelling on a cell processor", "authors": ["Frank K. H. A. Dehne", "Glenn Hickey", "Andrew Rau-Chaplin", "Mark Byrne"], "year": 2009, "publication": "CASCON", "link": "https://doi.org/10.1145/1723028.1723033", "snippet": "CASCON, 2009, 10.1145/1723028.1723033", "source": "dblp", "result_id": "dblp:doi:10.1145/1723028.1723033"}, {"title": "PnP: sequential, external memory, and parallel iceberg cube computation", "authors": ["Ying Chen", "Frank K. H. A. Dehne", "Todd Eavis", "Andrew Rau-Chaplin"], "year": 2008, "publication": "Distributed Parallel Databases", "link": "https://doi.org/10.1007/s10619-007-7023-y", "snippet": "Distributed Parallel Databases, 2008, 10.1007/s10619-007-7023-y", "source": "dblp", "result_id": "dblp:doi:10.1007/s10619-007-7023-y"}, {"title": "Compact Hilbert indices: Space-filling curves for domains with unequal side lengths", "authors": ["Chris H. Hamilton", "Andrew Rau-Chaplin"], "year": 2008, "publication": "Inf. Process. Lett.", "link": "https://doi.org/10.1016/j.ipl.2007.08.034", "snippet": "Inf. Process. Lett., 2008, 10.1016/j.ipl.2007.08.034", "source": "dblp", "result_id": "dblp:doi:10.1016/j.ipl.2007.08.034"}, {"title": "Dynamic View Selection for OLAP", "authors": ["Michael Lawrence", "Andrew Rau-Chaplin"], "year": 2008, "publication": "Int. J. Data Warehous. Min.", "link": "https://doi.org/10.4018/jdwm.2008010103", "snippet": "Int. J. Data Warehous. Min., 2008, 10.4018/jdwm.2008010103", "source": "dblp", "result_id": "dblp:doi:10.4018/jdwm.2008010103"}, {"title": "RCUBE: Parallel Multi-Dimensional ROLAP Indexing", "authors": ["Frank K. H. A. Dehne", "Todd Eavis", "Andrew Rau-Chaplin"], "year": 2008, "publication": "Int. J. Data Warehous. Min.", "link": "https://doi.org/10.4018/jdwm.2008070101", "snippet": "Int. J. Data Warehous. Min., 2008, 10.4018/jdwm.2008070101", "source": "dblp", "result_id": "dblp:doi:10.4018/jdwm.2008070101"}, {"title": "OLAP for Trajectories", "authors": ["Oliver Baltzer", "Frank K. H. A. Dehne", "Susanne E. Hambrusch", "Andrew Rau-Chaplin"], "year": 2008, "publication": "DEXA", "link": "https://doi.org/10.1007/978-3-540-85654-2_32", "snippet": "DEXA, 2008, 10.1007/978-3-540-85654-2_32", "source": "dblp", "result_id": "dblp:doi:10.1007/978-3-540-85654-2_32"}, {"title": "Storage and Indexing of Relational OLAP Views with Mixed Categorical and Continuous Dimensions", "authors": ["Oliver Baltzer", "Andrew Rau-Chaplin", "Norbert Zeh"], "year": 2007, "publication": "J. Digit. Inf. Manag.", "link": "db/journals/jdim/jdim5.html#BaltzerRZ07", "snippet": "J. Digit. Inf. Manag., 2007", "source": "dblp", "result_id": "dblp:storage_and_indexing_of_relational_olap_views_with_mixed_categor"}, {"title": "Compact Hilbert Indices for Multi-Dimensional Data", "authors": ["Chris H. Hamilton", "Andrew Rau-Chaplin"], "year": 2007, "publication": "CISIS", "link": "https://doi.org/10.1109/CISIS.2007.16", "snippet": "CISIS, 2007, 10.1109/cisis.2007.16", "source": "dblp", "result_id": "dblp:doi:10.1109/cisis.2007.16"}, {"title": "Adaptive Tuple Differential Coding", "authors": ["Jean-Paul Deveaux", "Andrew Rau-Chaplin", "Norbert Zeh"], "year": 2007, "publication": "DEXA", "link": "https://doi.org/10.1007/978-3-540-74469-6_12", "snippet": "DEXA, 2007, 10.1007/978-3-540-74469-6_12", "source": "dblp", "result_id": "dblp:doi:10.1007/978-3-540-74469-6_12"}, {"title": "Efficient computation of view subsets", "authors": ["Frank K. H. A. Dehne", "Todd Eavis", "Andrew Rau-Chaplin"], "year": 2007, "publication": "DOLAP", "link": "https://doi.org/10.1145/1317331.1317343", "snippet": "DOLAP, 2007, 10.1145/1317331.1317343", "source": "dblp", "result_id": "dblp:doi:10.1145/1317331.1317343"}, {"title": "Parallel Computation of Skyline Queries", "authors": ["Adan Cosgaya-Lozano", "Andrew Rau-Chaplin", "Norbert Zeh"], "year": 2007, "publication": "HPCS", "link": "https://doi.org/10.1109/HPCS.2007.25", "snippet": "HPCS, 2007, 10.1109/hpcs.2007.25", "source": "dblp", "result_id": "dblp:doi:10.1109/hpcs.2007.25"}, {"title": "Implementing OLAP Query Fragment Aggregation and Recombination for the OLAP Enabled Grid", "authors": ["Michael Lawrence", "Frank K. H. A. Dehne", "Andrew Rau-Chaplin"], "year": 2007, "publication": "IPDPS", "link": "https://doi.org/10.1109/IPDPS.2007.370552", "snippet": "IPDPS, 2007, 10.1109/ipdps.2007.370552", "source": "dblp", "result_id": "dblp:doi:10.1109/ipdps.2007.370552"}, {"title": "The cgmCUBE project: Optimizing parallel data cube generation for ROLAP", "authors": ["Frank K. H. A. Dehne", "Todd Eavis", "Andrew Rau-Chaplin"], "year": 2006, "publication": "Distributed Parallel Databases", "link": "https://doi.org/10.1007/s10619-006-6575-6", "snippet": "Distributed Parallel Databases, 2006, 10.1007/s10619-006-6575-6", "source": "dblp", "result_id": "dblp:doi:10.1007/s10619-006-6575-6"}, {"title": "Improved Data Partitioning for Building Large ROLAP Data Cubes in Parallel", "authors": ["Ying Chen", "Frank K. H. A. Dehne", "Todd Eavis", "Andrew Rau-Chaplin"], "year": 2006, "publication": "Int. J. Data Warehous. Min.", "link": "https://doi.org/10.4018/jdwm.2006010101", "snippet": "Int. J. Data Warehous. Min., 2006, 10.4018/jdwm.2006010101", "source": "dblp", "result_id": "dblp:doi:10.4018/jdwm.2006010101"}, {"title": "Dynamic View Selection for OLAP", "authors": ["Michael Lawrence", "Andrew Rau-Chaplin"], "year": 2006, "publication": "DaWaK", "link": "https://doi.org/10.1007/11823728_4", "snippet": "DaWaK, 2006, 10.1007/11823728_4", "source": "dblp", "result_id": "dblp:doi:10.1007/11823728_4"}, {"title": "The OLAP-Enabled Grid: Model and Query Processing Algorithms", "authors": ["Michael Lawrence", "Andrew Rau-Chaplin"], "year": 2006, "publication": "HPCS", "link": "https://doi.org/10.1109/HPCS.2006.45", "snippet": "HPCS, 2006, 10.1109/hpcs.2006.45", "source": "dblp", "result_id": "dblp:doi:10.1109/hpcs.2006.45"}, {"title": "cgmOLAP: Efficient Parallel Generation and Querying of Terabyte Size ROLAP Data Cubes", "authors": ["Ying Chen", "Andrew Rau-Chaplin", "Frank K. H. A. Dehne", "Todd Eavis", "D. Green", "E. Sithirasenan"], "year": 2006, "publication": "ICDE", "link": "https://doi.org/10.1109/ICDE.2006.32", "snippet": "ICDE, 2006, 10.1109/icde.2006.32", "source": "dblp", "result_id": "dblp:doi:10.1109/icde.2006.32"}, {"title": "Fast Parallel Maximum Likelihood-Based Protein Phylogeny", "authors": ["Christian Blouin", "Davin Butt", "Glenn Hickey", "Andrew Rau-Chaplin"], "year": 2005, "publication": "PDCS", "link": "db/conf/ISCApdcs/ISCApdcs2005.html#BlouinBHR05", "snippet": "PDCS, 2005", "source": "dblp", "result_id": "dblp:fast_parallel_maximum_likelihood_based_protein_phylogeny"}, {"title": "Parallel querying of ROLAP cubes in the presence of hierarchies", "authors": ["Frank K. H. A. Dehne", "Todd Eavis", "Andrew Rau-Chaplin"], "year": 2005, "publication": "DOLAP", "link": "https://doi.org/10.1145/1097002.1097019", "snippet": "DOLAP, 2005, 10.1145/1097002.1097019", "source": "dblp", "result_id": "dblp:doi:10.1145/1097002.1097019"}, {"title": "A Coarse Grained Parallel Algorithm for Closest Larger Ancestors in Trees with Applications to Single Link Clustering", "authors": ["Albert Chan", "Chunmei Gao", "Andrew Rau-Chaplin"], "year": 2005, "publication": "HPCC", "link": "https://doi.org/10.1007/11557654_96", "snippet": "HPCC, 2005, 10.1007/11557654_96", "source": "dblp", "result_id": "dblp:doi:10.1007/11557654_96"}, {"title": "PnP: Parallel And External Memory Iceberg Cubes", "authors": ["Ying Chen", "Frank K. H. A. Dehne", "Todd Eavis", "Andrew Rau-Chaplin"], "year": 2005, "publication": "ICDE", "link": "https://doi.org/10.1109/ICDE.2005.107", "snippet": "ICDE, 2005, 10.1109/icde.2005.107", "source": "dblp", "result_id": "dblp:doi:10.1109/icde.2005.107"}, {"title": "Adding parallelism to visual data flow programs", "authors": ["Philip T. Cox", "Simon Gauvin", "Andrew Rau-Chaplin"], "year": 2005, "publication": "SOFTVIS", "link": "https://doi.org/10.1145/1056018.1056037", "snippet": "SOFTVIS, 2005, 10.1145/1056018.1056037", "source": "dblp", "result_id": "dblp:doi:10.1145/1056018.1056037"}, {"title": "Parallel ROLAP Data Cube Construction on Shared-Nothing Multiprocessors", "authors": ["Ying Chen", "Frank K. H. A. Dehne", "Todd Eavis", "Andrew Rau-Chaplin"], "year": 2004, "publication": "Distributed Parallel Databases", "link": "https://doi.org/10.1023/B:DAPD.0000018572.20283.e0", "snippet": "Distributed Parallel Databases, 2004, 10.1023/b:dapd.0000018572.20283.e0", "source": "dblp", "result_id": "dblp:doi:10.1023/b:dapd.0000018572.20283.e0"}, {"title": "Top-Down Computation of Partial ROLAP Data Cubes", "authors": ["Frank K. H. A. Dehne", "Todd Eavis", "Andrew Rau-Chaplin"], "year": 2004, "publication": "HICSS", "link": "https://doi.org/10.1109/HICSS.2004.1265517", "snippet": "HICSS, 2004, 10.1109/hicss.2004.1265517", "source": "dblp", "result_id": "dblp:doi:10.1109/hicss.2004.1265517"}, {"title": "Building Large ROLAP Data Cubes in Parallel", "authors": ["Ying Chen", "Frank K. H. A. Dehne", "Todd Eavis", "Andrew Rau-Chaplin"], "year": 2004, "publication": "IDEAS", "link": "https://doi.ieeecomputersociety.org/10.1109/IDEAS.2004.16", "snippet": "IDEAS, 2004, 10.1109/ideas.2004.16", "source": "dblp", "result_id": "dblp:doi:10.1109/ideas.2004.16"}, {"title": "Solving large FPT problems on coarse-grained parallel machines", "authors": ["James Cheetham", "Frank K. H. A. Dehne", "Andrew Rau-Chaplin", "Ulrike Stege", "Peter J. Taillon"], "year": 2003, "publication": "J. Comput. Syst. Sci.", "link": "https://doi.org/10.1016/S0022-0000(03)00075-8", "snippet": "J. Comput. Syst. Sci., 2003, 10.1016/s0022-0000(03)00075-8", "source": "dblp", "result_id": "dblp:doi:10.1016/s0022-0000(03)00075-8"}, {"title": "A Parallel FPT Application For Clusters", "authors": ["James Cheetham", "Frank K. H. A. Dehne", "Andrew Rau-Chaplin", "Ulrike Stege", "Peter J. Taillon"], "year": 2003, "publication": "CCGRID", "link": "https://doi.org/10.1109/CCGRID.2003.1199354", "snippet": "CCGRID, 2003, 10.1109/ccgrid.2003.1199354", "source": "dblp", "result_id": "dblp:doi:10.1109/ccgrid.2003.1199354"}, {"title": "Parallel Multi-Dimensional ROLAP Indexing", "authors": ["Frank K. H. A. Dehne", "Todd Eavis", "Andrew Rau-Chaplin"], "year": 2003, "publication": "CCGRID", "link": "https://doi.org/10.1109/CCGRID.2003.1199356", "snippet": "CCGRID, 2003, 10.1109/ccgrid.2003.1199356", "source": "dblp", "result_id": "dblp:doi:10.1109/ccgrid.2003.1199356"}, {"title": "Parallel CLUSTAL W for PC Clusters", "authors": ["James Cheetham", "Frank K. H. A. Dehne", "Sylvain Pitre", "Andrew Rau-Chaplin", "Peter J. Taillon"], "year": 2003, "publication": "ICCSA (2)", "link": "https://doi.org/10.1007/3-540-44843-8_32", "snippet": "ICCSA (2), 2003, 10.1007/3-540-44843-8_32", "source": "dblp", "result_id": "dblp:doi:10.1007/3-540-44843-8_32"}, {"title": "Parallel ROLAP Data Cube Construction On Shared-Nothing Multiprocessors", "authors": ["Ying Chen", "Frank K. H. A. Dehne", "Todd Eavis", "Andrew Rau-Chaplin"], "year": 2003, "publication": "IPDPS", "link": "https://doi.org/10.1109/IPDPS.2003.1213169", "snippet": "IPDPS, 2003, 10.1109/ipdps.2003.1213169", "source": "dblp", "result_id": "dblp:doi:10.1109/ipdps.2003.1213169"}, {"title": "Parallel computation on interval graphs: algorithms and experiments", "authors": ["Afonso Ferreira", "Isabelle Gu\u00e9rin Lassous", "K. Marcus", "Andrew Rau-Chaplin"], "year": 2002, "publication": "Concurr. Comput. Pract. Exp.", "link": "https://doi.org/10.1002/cpe.700", "snippet": "Concurr. Comput. Pract. Exp., 2002, 10.1002/cpe.700", "source": "dblp", "result_id": "dblp:doi:10.1002/cpe.700"}, {"title": "Parallelizing the Data Cube", "authors": ["Frank K. H. A. Dehne", "Todd Eavis", "Susanne E. Hambrusch", "Andrew Rau-Chaplin"], "year": 2002, "publication": "Distributed Parallel Databases", "link": "https://doi.org/10.1023/A:1013940219415", "snippet": "Distributed Parallel Databases, 2002, 10.1023/a:1013940219415", "source": "dblp", "result_id": "dblp:doi:10.1023/a:1013940219415"}, {"title": "A Note on Communication-Efficient Deterministic Parallel Algorithms for Planar Point Location and 2D Vorono\u00ef Diagram", "authors": ["Mohamadou Diallo", "Afonso Ferreira", "Andrew Rau-Chaplin"], "year": 2001, "publication": "Parallel Process. Lett.", "link": "https://doi.org/10.1142/S0129626401000622", "snippet": "Parallel Process. Lett., 2001, 10.1142/s0129626401000622", "source": "dblp", "result_id": "dblp:doi:10.1142/s0129626401000622"}, {"title": "A Cluster Architecture for Parallel Data Warehousing", "authors": ["Frank K. H. A. Dehne", "Todd Eavis", "Andrew Rau-Chaplin"], "year": 2001, "publication": "CCGRID", "link": "https://doi.org/10.1109/CCGRID.2001.923189", "snippet": "CCGRID, 2001, 10.1109/ccgrid.2001.923189", "source": "dblp", "result_id": "dblp:doi:10.1109/ccgrid.2001.923189"}, {"title": "Coarse Grained Parallel On-Line Analytical Processing (OLAP) for Data Mining", "authors": ["Frank K. H. A. Dehne", "Todd Eavis", "Andrew Rau-Chaplin"], "year": 2001, "publication": "International Conference on Computational Science (2)", "link": "https://doi.org/10.1007/3-540-45718-6_64", "snippet": "International Conference on Computational Science (2), 2001, 10.1007/3-540-45718-6_64", "source": "dblp", "result_id": "dblp:doi:10.1007/3-540-45718-6_64"}, {"title": "Parallelizing the Data Cube", "authors": ["Frank K. H. A. Dehne", "Todd Eavis", "Susanne E. Hambrusch", "Andrew Rau-Chaplin"], "year": 2001, "publication": "ICDT", "link": "https://doi.org/10.1007/3-540-44503-X_9", "snippet": "ICDT, 2001, 10.1007/3-540-44503-x_9", "source": "dblp", "result_id": "dblp:doi:10.1007/3-540-44503-x_9"}, {"title": "Computing Partial Data Cubes for Parallel Data Warehousing Applications", "authors": ["Frank K. H. A. Dehne", "Todd Eavis", "Andrew Rau-Chaplin"], "year": 2001, "publication": "PVM/MPI", "link": "https://doi.org/10.1007/3-540-45417-9_44", "snippet": "PVM/MPI, 2001, 10.1007/3-540-45417-9_44", "source": "dblp", "result_id": "dblp:doi:10.1007/3-540-45417-9_44"}, {"title": "d-Dimensional Range Search on Multicomputers", "authors": ["Afonso Ferreira", "Claire Kenyon", "Andrew Rau-Chaplin", "St\u00e9phane Ub\u00e9da"], "year": 1999, "publication": "Algorithmica", "link": "https://doi.org/10.1007/PL00008260", "snippet": "Algorithmica, 1999, 10.1007/pl00008260", "source": "dblp", "result_id": "dblp:doi:10.1007/pl00008260"}, {"title": "Scalable 2D Convex Hull and Triangulation Algorithms for Coarse Grained Multicomputers", "authors": ["Mohamadou Diallo", "Afonso Ferreira", "Andrew Rau-Chaplin", "St\u00e9phane Ub\u00e9da"], "year": 1999, "publication": "J. Parallel Distributed Comput.", "link": "https://doi.org/10.1006/jpdc.1998.1503", "snippet": "J. Parallel Distributed Comput., 1999, 10.1006/jpdc.1998.1503", "source": "dblp", "result_id": "dblp:doi:10.1006/jpdc.1998.1503"}, {"title": "Coarse-Grained Parallel Geometric Search", "authors": ["Albert Chan", "Frank K. H. A. Dehne", "Andrew Rau-Chaplin"], "year": 1999, "publication": "J. Parallel Distributed Comput.", "link": "https://doi.org/10.1006/jpdc.1998.1527", "snippet": "J. Parallel Distributed Comput., 1999, 10.1006/jpdc.1998.1527", "source": "dblp", "result_id": "dblp:doi:10.1006/jpdc.1998.1527"}, {"title": "Scalable Parallel Algorithms for Geometric Pattern Recognition", "authors": ["Laurence Boxer", "Russ Miller", "Andrew Rau-Chaplin"], "year": 1999, "publication": "J. Parallel Distributed Comput.", "link": "https://doi.org/10.1006/jpdc.1999.1565", "snippet": "J. Parallel Distributed Comput., 1999, 10.1006/jpdc.1999.1565", "source": "dblp", "result_id": "dblp:doi:10.1006/jpdc.1999.1565"}, {"title": "Parallel Algorithms for Grounded Range Search and Applications", "authors": ["Michael G. Lamoureux", "Andrew Rau-Chaplin"], "year": 1999, "publication": "Euro-Par", "link": "https://doi.org/10.1007/3-540-48311-X_74", "snippet": "Euro-Par, 1999, 10.1007/3-540-48311-x_74", "source": "dblp", "result_id": "dblp:doi:10.1007/3-540-48311-x_74"}, {"title": "Scaleable Parallel Algorithms for Lower Envelopes with Applications", "authors": ["Laurence Boxer", "Russ Miller", "Andrew Rau-Chaplin"], "year": 1998, "publication": "J. Parallel Distributed Comput.", "link": "https://doi.org/10.1006/jpdc.1998.1478", "snippet": "J. Parallel Distributed Comput., 1998, 10.1006/jpdc.1998.1478", "source": "dblp", "result_id": "dblp:doi:10.1006/jpdc.1998.1478"}, {"title": "Parallel Computation on Interval Graphs Using PC CLusters: Algorithms and Experiments", "authors": ["Afonso Ferreira", "Isabelle Gu\u00e9rin Lassous", "K. Marcus", "Andrew Rau-Chaplin"], "year": 1998, "publication": "Euro-Par", "link": "https://doi.org/10.1007/BFb0057943", "snippet": "Euro-Par, 1998, 10.1007/bfb0057943", "source": "dblp", "result_id": "dblp:doi:10.1007/bfb0057943"}, {"title": "Coarse Grained Parallel Monte Carlo Algorithms for Solving SLAE Using PVM", "authors": ["Vassil Alexandrov", "Frank K. H. A. Dehne", "Andrew Rau-Chaplin", "Keith Taft"], "year": 1998, "publication": "PVM/MPI", "link": "https://doi.org/10.1007/BFb0056591", "snippet": "PVM/MPI, 1998, 10.1007/bfb0056591", "source": "dblp", "result_id": "dblp:doi:10.1007/bfb0056591"}, {"title": "Communication-Efficient Deterministic Parallel Algorithms for Planar Point Location and 2d Voronoi Diagram", "authors": ["Mohamadou Diallo", "Afonso Ferreira", "Andrew Rau-Chaplin"], "year": 1998, "publication": "STACS", "link": "https://doi.org/10.1007/BFb0028576", "snippet": "STACS, 1998, 10.1007/bfb0028576", "source": "dblp", "result_id": "dblp:doi:10.1007/bfb0028576"}, {"title": "Graphics support for a World-Wide-Web based architectural design service", "authors": ["Andrew Rau-Chaplin", "Brian MacKay-Lyons", "Timmy Doucette", "Jedrzej Gajewski", "Xiangqun Hu", "Peter F. Spierenburg"], "year": 1997, "publication": "Comput. Networks ISDN Syst.", "link": "https://doi.org/10.1016/S0169-7552(97)00076-7", "snippet": "Comput. Networks ISDN Syst., 1997, 10.1016/s0169-7552(97)00076-7", "source": "dblp", "result_id": "dblp:doi:10.1016/s0169-7552(97)00076-7"}, {"title": "Coarse Grained Parallel Next Element Search", "authors": ["Albert Chan", "Frank K. H. A. Dehne", "Andrew Rau-Chaplin"], "year": 1997, "publication": "IPPS", "link": "https://doi.org/10.1109/IPPS.1997.580919", "snippet": "IPPS, 1997, 10.1109/ipps.1997.580919", "source": "dblp", "result_id": "dblp:doi:10.1109/ipps.1997.580919"}, {"title": "d-Dimensional Range Search on Multicomputers", "authors": ["Afonso Ferreira", "Claire Kenyon", "Andrew Rau-Chaplin", "St\u00e9phane Ub\u00e9da"], "year": 1997, "publication": "IPPS", "link": "https://doi.org/10.1109/IPPS.1997.580965", "snippet": "IPPS, 1997, 10.1109/ipps.1997.580965", "source": "dblp", "result_id": "dblp:doi:10.1109/ipps.1997.580965"}, {"title": "A Graphical Language for Generating Architectural Forms", "authors": ["Andrew Rau-Chaplin", "Trevor J. Smedley"], "year": 1997, "publication": "VL", "link": "https://doi.org/10.1109/VL.1997.626592", "snippet": "VL, 1997, 10.1109/vl.1997.626592", "source": "dblp", "result_id": "dblp:doi:10.1109/vl.1997.626592"}, {"title": "Scalable parallel computational geometry for coarse grained multicomputers", "authors": ["Frank K. H. A. Dehne", "Andreas Fabri", "Andrew Rau-Chaplin"], "year": 1996, "publication": "Int. J. Comput. Geom. Appl.", "link": "https://doi.org/10.1142/S0218195996000241", "snippet": "Int. J. Comput. Geom. Appl., 1996, 10.1142/s0218195996000241", "source": "dblp", "result_id": "dblp:doi:10.1142/s0218195996000241"}, {"title": "Hypercube Algorithms for Parallel Processing of Pointer-Based Quadtrees", "authors": ["Frank K. H. A. Dehne", "Andrew Rau-Chaplin", "Afonso Ferreira"], "year": 1995, "publication": "Comput. Vis. Image Underst.", "link": "https://doi.org/10.1006/cviu.1995.1037", "snippet": "Comput. Vis. Image Underst., 1995, 10.1006/cviu.1995.1037", "source": "dblp", "result_id": "dblp:doi:10.1006/cviu.1995.1037"}, {"title": "Scalable 2d convex hull and triangulation algorithms for coarse grained multicomputers", "authors": ["Afonso Ferreira", "Andrew Rau-Chaplin", "St\u00e9phane Ub\u00e9da"], "year": 1995, "publication": "SPDP", "link": "https://doi.org/10.1109/SPDP.1995.530733", "snippet": "SPDP, 1995, 10.1109/spdp.1995.530733", "source": "dblp", "result_id": "dblp:doi:10.1109/spdp.1995.530733"}, {"title": "Multisearch Techniques: Parallel Data Structures on Mesh-Connected Computers", "authors": ["Mikhail J. Atallah", "Frank K. H. A. Dehne", "Russ Miller", "Andrew Rau-Chaplin", "Jyh-Jong Tsay"], "year": 1994, "publication": "J. Parallel Distributed Comput.", "link": "https://doi.org/10.1006/jpdc.1994.1001", "snippet": "J. Parallel Distributed Comput., 1994, 10.1006/jpdc.1994.1001", "source": "dblp", "result_id": "dblp:doi:10.1006/jpdc.1994.1001"}, {"title": "Construction of d-Dimensional Hyperoctrees on a Hypercube Multiprocessor", "authors": ["Frank K. H. A. Dehne", "Andreas Fabri", "Mostafa Nassar", "Andrew Rau-Chaplin", "Rada Valiveti"], "year": 1994, "publication": "J. Parallel Distributed Comput.", "link": "https://doi.org/10.1006/jpdc.1994.1137", "snippet": "J. Parallel Distributed Comput., 1994, 10.1006/jpdc.1994.1137", "source": "dblp", "result_id": "dblp:doi:10.1006/jpdc.1994.1137"}, {"title": "A Massively Parallel Knowledge-Base Server Using a Hypercube Multiprocessor", "authors": ["Frank K. H. A. Dehne", "Afonso Ferreira", "Andrew Rau-Chaplin"], "year": 1994, "publication": "Parallel Comput.", "link": "https://doi.org/10.1016/0167-8191(94)90043-4", "snippet": "Parallel Comput., 1994, 10.1016/0167-8191(94)90043-4", "source": "dblp", "result_id": "dblp:doi:10.1016/0167-8191(94)90043-4"}, {"title": "Polygonal approximation by boundary reduction", "authors": ["Laurence Boxer", "Chun-Shi Chang", "Russ Miller", "Andrew Rau-Chaplin"], "year": 1993, "publication": "Pattern Recognit. Lett.", "link": "https://doi.org/10.1016/0167-8655(93)90084-Q", "snippet": "Pattern Recognit. Lett., 1993, 10.1016/0167-8655(93)90084-q", "source": "dblp", "result_id": "dblp:doi:10.1016/0167-8655(93)90084-q"}, {"title": "Scalable Parallel Geometric Algorithms for Coarse Grained Multicomputers", "authors": ["Frank K. H. A. Dehne", "Andreas Fabri", "Andrew Rau-Chaplin"], "year": 1993, "publication": "SCG", "link": "https://doi.org/10.1145/160985.161154", "snippet": "SCG, 1993, 10.1145/160985.161154", "source": "dblp", "result_id": "dblp:doi:10.1145/160985.161154"}, {"title": "Parallel Fractional Cascading on Hypercube Multiprocessors", "authors": ["Frank K. H. A. Dehne", "Afonso Ferreira", "Andrew Rau-Chaplin"], "year": 1992, "publication": "Comput. Geom.", "link": "https://doi.org/10.1016/0925-7721(92)90005-D", "snippet": "Comput. Geom., 1992, 10.1016/0925-7721(92)90005-d", "source": "dblp", "result_id": "dblp:doi:10.1016/0925-7721(92)90005-d"}, {"title": "Optical clustering on a mesh-connected computer", "authors": ["Frank Dehne", "Russ Miller", "Andrew Rau-Chaplin"], "year": 1991, "publication": "Int. J. Parallel Program.", "link": "https://doi.org/10.1007/BF01547896", "snippet": "Int. J. Parallel Program., 1991, 10.1007/bf01547896", "source": "dblp", "result_id": "dblp:doi:10.1007/bf01547896"}, {"title": "Parallel algorithms for color image quantization on hypercubes and meshes", "authors": ["Frank K. H. A. Dehne", "Andrew Rau-Chaplin"], "year": 1991, "publication": "Algorithms and Parallel VLSI Architectures", "link": "db/conf/ccc/ccc1991.html#DehneR91", "snippet": "Algorithms and Parallel VLSI Architectures, 1991", "source": "dblp", "result_id": "dblp:parallel_algorithms_for_color_image_quantization_on_hypercubes_a"}, {"title": "Efficient Parallel Construction and Manipulation of Quadtrees", "authors": ["Frank K. H. A. Dehne", "Afonso Ferreira", "Andrew Rau-Chaplin"], "year": 1991, "publication": "ICPP (3)", "link": "db/conf/icpp/icpp1991-3.html#DehneFR91", "snippet": "ICPP (3), 1991", "source": "dblp", "result_id": "dblp:efficient_parallel_construction_and_manipulation_of_quadtrees"}, {"title": "Multisearch Techniques for Implementing Data Structures on a Mesh-Connected Computer (Preliminary Version)", "authors": ["Mikhail J. Atallah", "Frank K. H. A. Dehne", "Russ Miller", "Andrew Rau-Chaplin", "Jyh-Jong Tsay"], "year": 1991, "publication": "SPAA", "link": "https://doi.org/10.1145/113379.113398", "snippet": "SPAA, 1991, 10.1145/113379.113398", "source": "dblp", "result_id": "dblp:doi:10.1145/113379.113398"}, {"title": "Implementing Data Structures on a Hypercube Multiprocessor, and Applications in Parallel Computational Geometry", "authors": ["Frank K. H. A. Dehne", "Andrew Rau-Chaplin"], "year": 1990, "publication": "J. Parallel Distributed Comput.", "link": "https://doi.org/10.1016/0743-7315(90)90135-C", "snippet": "J. Parallel Distributed Comput., 1990, 10.1016/0743-7315(90)90135-c", "source": "dblp", "result_id": "dblp:doi:10.1016/0743-7315(90)90135-c"}, {"title": "A. G. Ferreira Parallel branch and bound on fine-grained hypercube multiprocessors", "authors": ["Frank K. H. A. Dehne", "Afonso Ferreira", "Andrew Rau-Chaplin"], "year": 1990, "publication": "Parallel Comput.", "link": "https://doi.org/10.1016/0167-8191(90)90043-9", "snippet": "Parallel Comput., 1990, 10.1016/0167-8191(90)90043-9", "source": "dblp", "result_id": "dblp:doi:10.1016/0167-8191(90)90043-9"}, {"title": "A massively parallel knowledge-base server using a hypercube multiprocessor", "authors": ["Frank Dehne", "Afonso G. Ferreira", "Andrew Rau-Chaplin"], "year": 1990, "publication": "TAI", "link": "https://doi.org/10.1109/TAI.1990.130417", "snippet": "TAI, 1990, 10.1109/tai.1990.130417", "source": "dblp", "result_id": "dblp:doi:10.1109/tai.1990.130417"}, {"title": "Parallel branch and bound on fine-grained hypercube multiprocessors", "authors": ["Frank Dehne", "Afonso G. Ferreira", "Andrew Rau-Chaplin"], "year": 1989, "publication": "TAI", "link": "https://doi.org/10.1109/TAI.1989.65375", "snippet": "TAI, 1989, 10.1109/tai.1989.65375", "source": "dblp", "result_id": "dblp:doi:10.1109/tai.1989.65375"}, {"title": "Implementing Data Structures on a Hypercube Multiprocessor, and Applications in Parallel Computational Geometry", "authors": ["Frank K. H. A. Dehne", "Andrew Rau-Chaplin"], "year": 1989, "publication": "WG", "link": "https://doi.org/10.1007/3-540-52292-1_23", "snippet": "WG, 1989, 10.1007/3-540-52292-1_23", "source": "dblp", "result_id": "dblp:doi:10.1007/3-540-52292-1_23"}, {"title": "DAD: a real-time expert system for monitoring of data packet networks", "authors": ["Sameh Rabie", "Andrew Rau-Chaplin", "Taro Shibahara"], "year": 1988, "publication": "IEEE Netw.", "link": "https://doi.org/10.1109/65.17977", "snippet": "IEEE Netw., 1988, 10.1109/65.17977", "source": "dblp", "result_id": "dblp:doi:10.1109/65.17977"}]}} \ No newline at end of file +{"timestamp": 1783011142.0975006, "data": {"articles": [{"title": "VOLAP: A Scalable Distributed Real-Time OLAP System for High-Velocity Data", "authors": ["Frank Dehne", "David E. Robillard", "Andrew Rau-Chaplin", "Neil Burke"], "year": 2018, "publication": "IEEE Trans. Parallel Distributed Syst.", "link": "https://doi.org/10.1109/TPDS.2017.2743072", "snippet": "IEEE Trans. Parallel Distributed Syst., 2018, 10.1109/tpds.2017.2743072", "source": "dblp", "result_id": "dblp:doi:10.1109/tpds.2017.2743072"}, {"title": "Quantifying Eventual Consistency For Aggregate Queries", "authors": ["Neil Burke", "Frank Dehne", "Andrew Rau-Chaplin", "David E. Robillard"], "year": 2017, "publication": "IDEAS", "link": "https://doi.org/10.1145/3105831.3105836", "snippet": "IDEAS, 2017, 10.1145/3105831.3105836", "source": "dblp", "result_id": "dblp:doi:10.1145/3105831.3105836"}, {"title": "Computing probable maximum loss in catastrophe reinsurance portfolios on multi-core and many-core architectures", "authors": ["Neil Burke", "Andrew Rau-Chaplin", "Blesson Varghese"], "year": 2016, "publication": "Concurr. Comput. Pract. Exp.", "link": "https://doi.org/10.1002/cpe.3695", "snippet": "Concurr. Comput. Pract. Exp., 2016, 10.1002/cpe.3695", "source": "dblp", "result_id": "dblp:doi:10.1002/cpe.3695"}, {"title": "Accelerating R-based analytics on the cloud", "authors": ["Ishan Patel", "Andrew Rau-Chaplin", "Blesson Varghese"], "year": 2016, "publication": "Concurr. Comput. Pract. Exp.", "link": "https://doi.org/10.1002/cpe.3026", "snippet": "Concurr. Comput. Pract. Exp., 2016, 10.1002/cpe.3026", "source": "dblp", "result_id": "dblp:doi:10.1002/cpe.3026"}, {"title": "Enhanced multiobjective population-based incremental learning with applications in risk treaty optimization", "authors": ["Omar Andr\u00e9s Carmona Cortes", "Andrew Rau-Chaplin"], "year": 2016, "publication": "Evol. Intell.", "link": "https://doi.org/10.1007/s12065-016-0147-0", "snippet": "Evol. Intell., 2016, 10.1007/s12065-016-0147-0", "source": "dblp", "result_id": "dblp:doi:10.1007/s12065-016-0147-0"}, {"title": "VOLAP: A Scalable Distributed System for Real-Time OLAP with High Velocity Data", "authors": ["Frank Dehne", "David E. Robillard", "Andrew Rau-Chaplin", "Neil Burke"], "year": 2016, "publication": "CLUSTER", "link": "https://doi.org/10.1109/CLUSTER.2016.29", "snippet": "CLUSTER, 2016, 10.1109/cluster.2016.29", "source": "dblp", "result_id": "dblp:doi:10.1109/cluster.2016.29"}, {"title": "A stochastic adaptive genetic algorithm for solving unconstrained multimodal numerical problems", "authors": ["Egidio Carvalho", "Omar Andr\u00e9s Carmona Cortes", "Jo\u00e3o Pedro Costa", "Andrew Rau-Chaplin"], "year": 2016, "publication": "EAIS", "link": "https://doi.org/10.1109/EAIS.2016.7502503", "snippet": "EAIS, 2016, 10.1109/eais.2016.7502503", "source": "dblp", "result_id": "dblp:doi:10.1109/eais.2016.7502503"}, {"title": "Enhanced Multiobjective Population-Based Incremental Learning with Applications in Risk Treaty Optimization", "authors": ["Omar Andr\u00e9s Carmona Cortes", "Andrew Rau-Chaplin"], "year": 2016, "publication": "EvoApplications (1)", "link": "https://doi.org/10.1007/978-3-319-31204-0_1", "snippet": "EvoApplications (1), 2016, 10.1007/978-3-319-31204-0_1", "source": "dblp", "result_id": "dblp:doi:10.1007/978-3-319-31204-0_1"}, {"title": "The Hilbert PDC-tree: A High-Velocity Structure for Many-Dimensional Data", "authors": ["David E. Robillard", "Frank Dehne", "Andrew Rau-Chaplin", "Neil Burke"], "year": 2016, "publication": "IDEAS", "link": "https://doi.org/10.1145/2938503.2938549", "snippet": "IDEAS, 2016, 10.1145/2938503.2938549", "source": "dblp", "result_id": "dblp:doi:10.1145/2938503.2938549"}, {"title": "Scalable real-time OLAP on cloud architectures", "authors": ["Frank K. H. A. Dehne", "Q. Kong", "Andrew Rau-Chaplin", "Hamidreza Zaboli", "R. Zhou"], "year": 2015, "publication": "J. Parallel Distributed Comput.", "link": "https://doi.org/10.1016/j.jpdc.2014.08.006", "snippet": "J. Parallel Distributed Comput., 2015, 10.1016/j.jpdc.2014.08.006", "source": "dblp", "result_id": "dblp:doi:10.1016/j.jpdc.2014.08.006"}, {"title": "Efficient Computation of Co-occurrence Based Word Relatedness", "authors": ["Jie Mei", "Xinxin Kou", "Zhimin Yao", "Andrew Rau-Chaplin", "Aminul Islam", "Abidalrahman Moh'd", "Evangelos E. Milios"], "year": 2015, "publication": "DocEng", "link": "https://doi.org/10.1145/2682571.2797088", "snippet": "DocEng, 2015, 10.1145/2682571.2797088", "source": "dblp", "result_id": "dblp:doi:10.1145/2682571.2797088"}, {"title": "Efficient Parallelization of the Google Trigram Method for Document Relatedness Computation", "authors": ["Xinxin Kou", "Jie Mei", "Zhimin Yao", "Andrew Rau-Chaplin", "Aminul Islam", "Abidalrahman Moh'd", "Evangelos E. Milios"], "year": 2015, "publication": "ICPP Workshops", "link": "https://doi.org/10.1109/ICPPW.2015.42", "snippet": "ICPP Workshops, 2015, 10.1109/icppw.2015.42", "source": "dblp", "result_id": "dblp:doi:10.1109/icppw.2015.42"}, {"title": "Differential Evolution on a GPGPU: The Influence of Parameters on Speedup and the Quality of Solutions", "authors": ["Omar Andr\u00e9s Carmona Cortes", "M\u00f4nica Sakuray Pais", "Filipo Novo M\u00f3r", "Andrew Rau-Chaplin", "C\u00e9sar Augusto Missio Marcon"], "year": 2015, "publication": "IPDPS Workshops", "link": "https://doi.org/10.1109/IPDPSW.2015.92", "snippet": "IPDPS Workshops, 2015, 10.1109/ipdpsw.2015.92", "source": "dblp", "result_id": "dblp:doi:10.1109/ipdpsw.2015.92"}, {"title": "Dynamic optimization of multi-layered reinsurance treaties", "authors": ["Haoxu Wang", "Omar Andr\u00e9s Carmona Cortes", "Andrew Rau-Chaplin"], "year": 2015, "publication": "SAC", "link": "https://doi.org/10.1145/2695664.2695899", "snippet": "SAC, 2015, 10.1145/2695664.2695899", "source": "dblp", "result_id": "dblp:doi:10.1145/2695664.2695899"}, {"title": "eXsight: An Analytical Framework for Quantifying Financial Loss in the Aftermath of Catastrophic Events", "authors": ["Matthew Coelho", "Andrew Rau-Chaplin"], "year": 2014, "publication": "DEXA Workshops", "link": "https://doi.org/10.1109/DEXA.2014.45", "snippet": "DEXA Workshops, 2014, 10.1109/dexa.2014.45", "source": "dblp", "result_id": "dblp:doi:10.1109/dexa.2014.45"}, {"title": "On PBIL, DE and PSO for Optimization of Reinsurance Contracts", "authors": ["Omar Andr\u00e9s Carmona Cortes", "Andrew Rau-Chaplin", "Duane Wilson", "J\u00fcrgen Gaiser-Porter"], "year": 2014, "publication": "EvoApplications", "link": "https://doi.org/10.1007/978-3-662-45523-4_19", "snippet": "EvoApplications, 2014, 10.1007/978-3-662-45523-4_19", "source": "dblp", "result_id": "dblp:doi:10.1007/978-3-662-45523-4_19"}, {"title": "Parallel MO-PBIL: Computing pareto optimal frontiers efficiently with applications in reinsurance analytics", "authors": ["Leah Brown", "Anirudha Ashok Beria", "Omar Andr\u00e9s Carmona Cortes", "Andrew Rau-Chaplin", "Duane Wilson", "Neil Burke", "J\u00fcrgen Gaiser-Porter"], "year": 2014, "publication": "HPCS", "link": "https://doi.org/10.1109/HPCSim.2014.6903766", "snippet": "HPCS, 2014, 10.1109/hpcsim.2014.6903766", "source": "dblp", "result_id": "dblp:doi:10.1109/hpcsim.2014.6903766"}, {"title": "Efficient Data Structures for Risk Modelling in Portfolios of Catastrophic Risk Using MapReduce", "authors": ["Andrew Rau-Chaplin", "Zhimin Yao", "Norbert Zeh"], "year": 2014, "publication": "ICCS", "link": "https://doi.org/10.1016/j.procs.2014.05.141", "snippet": "ICCS, 2014, 10.1016/j.procs.2014.05.141", "source": "dblp", "result_id": "dblp:doi:10.1016/j.procs.2014.05.141"}, {"title": "On VEPSO and VEDE for solving a treaty optimization problem", "authors": ["Omar Andr\u00e9s Carmona Cortes", "Andrew Rau-Chaplin", "Pedro Felipe do Prado"], "year": 2014, "publication": "SMC", "link": "https://doi.org/10.1109/SMC.2014.6974290", "snippet": "SMC, 2014, 10.1109/smc.2014.6974290", "source": "dblp", "result_id": "dblp:doi:10.1109/smc.2014.6974290"}, {"title": "OLAP for moving object data", "authors": ["Oliver Baltzer", "Frank Dehne", "Andrew Rau-Chaplin"], "year": 2013, "publication": "Int. J. Intell. Inf. Database Syst.", "link": "https://doi.org/10.1504/IJIIDS.2013.051745", "snippet": "Int. J. Intell. Inf. Database Syst., 2013, 10.1504/ijiids.2013.051745", "source": "dblp", "result_id": "dblp:doi:10.1504/ijiids.2013.051745"}, {"title": "A distributed tree data structure for real-time OLAP on cloud architectures", "authors": ["Frank K. H. A. Dehne", "Q. Kong", "Andrew Rau-Chaplin", "Hamidreza Zaboli", "R. Zhou"], "year": 2013, "publication": "IEEE BigData", "link": "https://doi.org/10.1109/BigData.2013.6691613", "snippet": "IEEE BigData, 2013, 10.1109/bigdata.2013.6691613", "source": "dblp", "result_id": "dblp:doi:10.1109/bigdata.2013.6691613"}, {"title": "QuPARA: Query-driven large-scale portfolio aggregate risk analysis on MapReduce", "authors": ["Andrew Rau-Chaplin", "Blesson Varghese", "Duane Wilson", "Zhimin Yao", "Norbert Zeh"], "year": 2013, "publication": "IEEE BigData", "link": "https://doi.org/10.1109/BigData.2013.6691640", "snippet": "IEEE BigData, 2013, 10.1109/bigdata.2013.6691640", "source": "dblp", "result_id": "dblp:doi:10.1109/bigdata.2013.6691640"}, {"title": "Risk Analytics for Estimating and Validating Magnitude of Earthquake Losses", "authors": ["Anthony Astoul", "Christopher Filliter", "Andrew Rau-Chaplin", "Kunal Shridhar", "Blesson Varghese", "Naman Varshney"], "year": 2013, "publication": "DEXA Workshops", "link": "https://doi.org/10.1109/DEXA.2013.9", "snippet": "DEXA Workshops, 2013, 10.1109/dexa.2013.9", "source": "dblp", "result_id": "dblp:doi:10.1109/dexa.2013.9"}, {"title": "High performance risk aggregation: addressing the data processing challenge the hadoop mapreduce way", "authors": ["Zhimin Yao", "Blesson Varghese", "Andrew Rau-Chaplin"], "year": 2013, "publication": "ScienceCloud@HPDC", "link": "https://doi.org/10.1145/2465848.2465853", "snippet": "ScienceCloud@HPDC, 2013, 10.1145/2465848.2465853", "source": "dblp", "result_id": "dblp:doi:10.1145/2465848.2465853"}, {"title": "A MapReduce Framework for Analysing Portfolios of Catastrophic Risk with Secondary Uncertainty", "authors": ["Andrew Rau-Chaplin", "Blesson Varghese", "Zhimin Yao"], "year": 2013, "publication": "ICCS", "link": "https://doi.org/10.1016/j.procs.2013.05.403", "snippet": "ICCS, 2013, 10.1016/j.procs.2013.05.403", "source": "dblp", "result_id": "dblp:doi:10.1016/j.procs.2013.05.403"}, {"title": "Achieving Speedup in Aggregate Risk Analysis Using Multiple GPUs", "authors": ["Aman K. Bahl", "Oliver Baltzer", "Andrew Rau-Chaplin", "Blesson Varghese", "Aaron Whiteway"], "year": 2013, "publication": "ICPP", "link": "https://doi.org/10.1109/ICPP.2013.108", "snippet": "ICPP, 2013, 10.1109/icpp.2013.108", "source": "dblp", "result_id": "dblp:doi:10.1109/icpp.2013.108"}, {"title": "Building a scalable spatial OLAP system", "authors": ["Oliver Baltzer", "Andrew Rau-Chaplin", "Norbert Zeh"], "year": 2013, "publication": "SAC", "link": "https://doi.org/10.1145/2480362.2480366", "snippet": "SAC, 2013, 10.1145/2480362.2480366", "source": "dblp", "result_id": "dblp:doi:10.1145/2480362.2480366"}, {"title": "Accounting for secondary uncertainty: efficient computation of portfolio risk measures on multi and many core architectures", "authors": ["Blesson Varghese", "Andrew Rau-Chaplin"], "year": 2013, "publication": "WHPCF@SC", "link": "https://doi.org/10.1145/2535557.2535562", "snippet": "WHPCF@SC, 2013, 10.1145/2535557.2535562", "source": "dblp", "result_id": "dblp:doi:10.1145/2535557.2535562"}, {"title": "Developing and Testing the Automated Post-Event Earthquake Loss Estimation and Visualisation (APE-ELEV) Technique", "authors": ["Anthony Astoul", "Christopher Filliter", "Eric Mason", "Andrew Rau-Chaplin", "Kunal Shridhar", "Blesson Varghese", "Naman Varshney"], "year": 2013, "publication": "CoRR", "link": "http://arxiv.org/abs/1308.1846", "snippet": "CoRR, 2013", "source": "dblp", "result_id": "dblp:developing_and_testing_the_automated_post_event_earthquake_loss_"}, {"title": "Parallel Simulations for Analysing Portfolios of Catastrophic Event Risk", "authors": ["Aman Kumar Bahl", "Oliver Baltzer", "Andrew Rau-Chaplin", "Blesson Varghese"], "year": 2013, "publication": "CoRR", "link": "http://arxiv.org/abs/1308.2066", "snippet": "CoRR, 2013", "source": "dblp", "result_id": "dblp:parallel_simulations_for_analysing_portfolios_of_catastrophic_ev"}, {"title": "Achieving Speedup in Aggregate Risk Analysis using Multiple GPUs", "authors": ["Aman K. Bahl", "Oliver Baltzer", "Andrew Rau-Chaplin", "Blesson Varghese", "Aaron Whiteway"], "year": 2013, "publication": "CoRR", "link": "http://arxiv.org/abs/1308.2572", "snippet": "CoRR, 2013", "source": "dblp", "result_id": "dblp:achieving_speedup_in_aggregate_risk_analysis_using_multiple_gpus"}, {"title": "Accelerating R-based Analytics on the Cloud", "authors": ["Ishan Patel", "Andrew Rau-Chaplin", "Blesson Varghese"], "year": 2013, "publication": "CoRR", "link": "http://arxiv.org/abs/1308.2787", "snippet": "CoRR, 2013", "source": "dblp", "result_id": "dblp:accelerating_r_based_analytics_on_the_cloud"}, {"title": "QuPARA: Query-Driven Large-Scale Portfolio Aggregate Risk Analysis on MapReduce", "authors": ["Andrew Rau-Chaplin", "Blesson Varghese", "Duane Wilson", "Zhimin Yao", "Norbert Zeh"], "year": 2013, "publication": "CoRR", "link": "http://arxiv.org/abs/1308.3615", "snippet": "CoRR, 2013", "source": "dblp", "result_id": "dblp:qupara_query_driven_large_scale_portfolio_aggregate_risk_analysi"}, {"title": "Accounting for Secondary Uncertainty: Efficient Computation of Portfolio Risk Measures on Multi and Many Core Architectures", "authors": ["Blesson Varghese", "Andrew Rau-Chaplin"], "year": 2013, "publication": "CoRR", "link": "http://arxiv.org/abs/1310.2274", "snippet": "CoRR, 2013", "source": "dblp", "result_id": "dblp:accounting_for_secondary_uncertainty_efficient_computation_of_po"}, {"title": "Data Challenges in High-Performance Risk Analytics", "authors": ["Blesson Varghese", "Andrew Rau-Chaplin"], "year": 2013, "publication": "CoRR", "link": "http://arxiv.org/abs/1311.5685", "snippet": "CoRR, 2013", "source": "dblp", "result_id": "dblp:data_challenges_in_high_performance_risk_analytics"}, {"title": "High Performance Risk Aggregation: Addressing the Data Processing Challenge the Hadoop MapReduce Way", "authors": ["Zhimin Yao", "Blesson Varghese", "Andrew Rau-Chaplin"], "year": 2013, "publication": "CoRR", "link": "http://arxiv.org/abs/1311.5686", "snippet": "CoRR, 2013", "source": "dblp", "result_id": "dblp:high_performance_risk_aggregation_addressing_the_data_processing"}, {"title": "A PSO-based algorithm with local search for multimodal optimization without constraints", "authors": ["Omar Andr\u00e9s Carmona Cortes", "Andrew Rau-Chaplin", "Rafael Fernandes Lopes"], "year": 2012, "publication": "CLEI", "link": "https://doi.org/10.1109/CLEI.2012.6427173", "snippet": "CLEI, 2012, 10.1109/clei.2012.6427173", "source": "dblp", "result_id": "dblp:doi:10.1109/clei.2012.6427173"}, {"title": "Rapid Post-event Catastrophe Modelling and Visualization", "authors": ["Eric Mason", "Andrew Rau-Chaplin", "Kunal Shridhar", "Blesson Varghese", "Naman Varshney"], "year": 2012, "publication": "DEXA Workshops", "link": "https://doi.org/10.1109/DEXA.2012.22", "snippet": "DEXA Workshops, 2012, 10.1109/dexa.2012.22", "source": "dblp", "result_id": "dblp:doi:10.1109/dexa.2012.22"}, {"title": "A Platform for Parallel R-based Analytics on Cloud Infrastructure", "authors": ["Ishan Patel", "Andrew Rau-Chaplin", "Blesson Varghese"], "year": 2012, "publication": "ICPP Workshops", "link": "https://doi.org/10.1109/ICPPW.2012.27", "snippet": "ICPP Workshops, 2012, 10.1109/icppw.2012.27", "source": "dblp", "result_id": "dblp:doi:10.1109/icppw.2012.27"}, {"title": "Parallel Simulations for Analysing Portfolios of Catastrophic Event Risk", "authors": ["Aman Kumar Bahl", "Oliver Baltzer", "Andrew Rau-Chaplin", "Blesson Varghese"], "year": 2012, "publication": "SC Companion", "link": "https://doi.org/10.1109/SC.Companion.2012.142", "snippet": "SC Companion, 2012, 10.1109/sc.companion.2012.142", "source": "dblp", "result_id": "dblp:doi:10.1109/sc.companion.2012.142"}, {"title": "Data Challenges in High-Performance Risk Analytics", "authors": ["Blesson Varghese", "Andrew Rau-Chaplin"], "year": 2012, "publication": "SC Companion", "link": "https://doi.org/10.1109/SC.Companion.2012.162", "snippet": "SC Companion, 2012, 10.1109/sc.companion.2012.162", "source": "dblp", "result_id": "dblp:doi:10.1109/sc.companion.2012.162"}, {"title": "Parallel catastrophe modelling on a Cell/BE", "authors": ["Frank K. H. A. Dehne", "Glenn Hickey", "Andrew Rau-Chaplin", "Mark Byrne"], "year": 2010, "publication": "Int. J. Parallel Emergent Distributed Syst.", "link": "https://doi.org/10.1080/17445760903492086", "snippet": "Int. J. Parallel Emergent Distributed Syst., 2010, 10.1080/17445760903492086", "source": "dblp", "result_id": "dblp:doi:10.1080/17445760903492086"}, {"title": "Dynamic View Selection for OLAP", "authors": ["Michael Lawrence", "Andrew Rau-Chaplin"], "year": 2010, "publication": "Strategic Advancements in Utilizing Data Mining and Warehousing Technologies", "link": "http://www.igi-global.com/Bookstore/chapter.aspx?titleid=40399", "snippet": "Strategic Advancements in Utilizing Data Mining and Warehousing Technologies, 2010", "source": "dblp", "result_id": "dblp:dynamic_view_selection_for_olap"}, {"title": "Rcube", "authors": ["Frank K. H. A. Dehne", "Todd Eavis", "Andrew Rau-Chaplin"], "year": 2010, "publication": "Strategic Advancements in Utilizing Data Mining and Warehousing Technologies", "link": "http://www.igi-global.com/Bookstore/chapter.aspx?titleid=40400", "snippet": "Strategic Advancements in Utilizing Data Mining and Warehousing Technologies, 2010", "source": "dblp", "result_id": "dblp:rcube"}, {"title": "Cooperative caching for grid-enabled OLAP", "authors": ["Frank Dehne", "Michael Lawrence", "Andrew Rau-Chaplin"], "year": 2009, "publication": "Int. J. Grid Util. Comput.", "link": "https://doi.org/10.1504/IJGUC.2009.022032", "snippet": "Int. J. Grid Util. Comput., 2009, 10.1504/ijguc.2009.022032", "source": "dblp", "result_id": "dblp:doi:10.1504/ijguc.2009.022032"}, {"title": "Parallel catastrophe modelling on a cell processor", "authors": ["Frank K. H. A. Dehne", "Glenn Hickey", "Andrew Rau-Chaplin", "Mark Byrne"], "year": 2009, "publication": "CASCON", "link": "https://doi.org/10.1145/1723028.1723033", "snippet": "CASCON, 2009, 10.1145/1723028.1723033", "source": "dblp", "result_id": "dblp:doi:10.1145/1723028.1723033"}, {"title": "PnP: sequential, external memory, and parallel iceberg cube computation", "authors": ["Ying Chen", "Frank K. H. A. Dehne", "Todd Eavis", "Andrew Rau-Chaplin"], "year": 2008, "publication": "Distributed Parallel Databases", "link": "https://doi.org/10.1007/s10619-007-7023-y", "snippet": "Distributed Parallel Databases, 2008, 10.1007/s10619-007-7023-y", "source": "dblp", "result_id": "dblp:doi:10.1007/s10619-007-7023-y"}, {"title": "Compact Hilbert indices: Space-filling curves for domains with unequal side lengths", "authors": ["Chris H. Hamilton", "Andrew Rau-Chaplin"], "year": 2008, "publication": "Inf. Process. Lett.", "link": "https://doi.org/10.1016/j.ipl.2007.08.034", "snippet": "Inf. Process. Lett., 2008, 10.1016/j.ipl.2007.08.034", "source": "dblp", "result_id": "dblp:doi:10.1016/j.ipl.2007.08.034"}, {"title": "Dynamic View Selection for OLAP", "authors": ["Michael Lawrence", "Andrew Rau-Chaplin"], "year": 2008, "publication": "Int. J. Data Warehous. Min.", "link": "https://doi.org/10.4018/jdwm.2008010103", "snippet": "Int. J. Data Warehous. Min., 2008, 10.4018/jdwm.2008010103", "source": "dblp", "result_id": "dblp:doi:10.4018/jdwm.2008010103"}, {"title": "RCUBE: Parallel Multi-Dimensional ROLAP Indexing", "authors": ["Frank K. H. A. Dehne", "Todd Eavis", "Andrew Rau-Chaplin"], "year": 2008, "publication": "Int. J. Data Warehous. Min.", "link": "https://doi.org/10.4018/jdwm.2008070101", "snippet": "Int. J. Data Warehous. Min., 2008, 10.4018/jdwm.2008070101", "source": "dblp", "result_id": "dblp:doi:10.4018/jdwm.2008070101"}, {"title": "OLAP for Trajectories", "authors": ["Oliver Baltzer", "Frank K. H. A. Dehne", "Susanne E. Hambrusch", "Andrew Rau-Chaplin"], "year": 2008, "publication": "DEXA", "link": "https://doi.org/10.1007/978-3-540-85654-2_32", "snippet": "DEXA, 2008, 10.1007/978-3-540-85654-2_32", "source": "dblp", "result_id": "dblp:doi:10.1007/978-3-540-85654-2_32"}, {"title": "Storage and Indexing of Relational OLAP Views with Mixed Categorical and Continuous Dimensions", "authors": ["Oliver Baltzer", "Andrew Rau-Chaplin", "Norbert Zeh"], "year": 2007, "publication": "J. Digit. Inf. Manag.", "link": "db/journals/jdim/jdim5.html#BaltzerRZ07", "snippet": "J. Digit. Inf. Manag., 2007", "source": "dblp", "result_id": "dblp:storage_and_indexing_of_relational_olap_views_with_mixed_categor"}, {"title": "Compact Hilbert Indices for Multi-Dimensional Data", "authors": ["Chris H. Hamilton", "Andrew Rau-Chaplin"], "year": 2007, "publication": "CISIS", "link": "https://doi.org/10.1109/CISIS.2007.16", "snippet": "CISIS, 2007, 10.1109/cisis.2007.16", "source": "dblp", "result_id": "dblp:doi:10.1109/cisis.2007.16"}, {"title": "Adaptive Tuple Differential Coding", "authors": ["Jean-Paul Deveaux", "Andrew Rau-Chaplin", "Norbert Zeh"], "year": 2007, "publication": "DEXA", "link": "https://doi.org/10.1007/978-3-540-74469-6_12", "snippet": "DEXA, 2007, 10.1007/978-3-540-74469-6_12", "source": "dblp", "result_id": "dblp:doi:10.1007/978-3-540-74469-6_12"}, {"title": "Efficient computation of view subsets", "authors": ["Frank K. H. A. Dehne", "Todd Eavis", "Andrew Rau-Chaplin"], "year": 2007, "publication": "DOLAP", "link": "https://doi.org/10.1145/1317331.1317343", "snippet": "DOLAP, 2007, 10.1145/1317331.1317343", "source": "dblp", "result_id": "dblp:doi:10.1145/1317331.1317343"}, {"title": "Parallel Computation of Skyline Queries", "authors": ["Adan Cosgaya-Lozano", "Andrew Rau-Chaplin", "Norbert Zeh"], "year": 2007, "publication": "HPCS", "link": "https://doi.org/10.1109/HPCS.2007.25", "snippet": "HPCS, 2007, 10.1109/hpcs.2007.25", "source": "dblp", "result_id": "dblp:doi:10.1109/hpcs.2007.25"}, {"title": "Implementing OLAP Query Fragment Aggregation and Recombination for the OLAP Enabled Grid", "authors": ["Michael Lawrence", "Frank K. H. A. Dehne", "Andrew Rau-Chaplin"], "year": 2007, "publication": "IPDPS", "link": "https://doi.org/10.1109/IPDPS.2007.370552", "snippet": "IPDPS, 2007, 10.1109/ipdps.2007.370552", "source": "dblp", "result_id": "dblp:doi:10.1109/ipdps.2007.370552"}, {"title": "The cgmCUBE project: Optimizing parallel data cube generation for ROLAP", "authors": ["Frank K. H. A. Dehne", "Todd Eavis", "Andrew Rau-Chaplin"], "year": 2006, "publication": "Distributed Parallel Databases", "link": "https://doi.org/10.1007/s10619-006-6575-6", "snippet": "Distributed Parallel Databases, 2006, 10.1007/s10619-006-6575-6", "source": "dblp", "result_id": "dblp:doi:10.1007/s10619-006-6575-6"}, {"title": "Improved Data Partitioning for Building Large ROLAP Data Cubes in Parallel", "authors": ["Ying Chen", "Frank K. H. A. Dehne", "Todd Eavis", "Andrew Rau-Chaplin"], "year": 2006, "publication": "Int. J. Data Warehous. Min.", "link": "https://doi.org/10.4018/jdwm.2006010101", "snippet": "Int. J. Data Warehous. Min., 2006, 10.4018/jdwm.2006010101", "source": "dblp", "result_id": "dblp:doi:10.4018/jdwm.2006010101"}, {"title": "Dynamic View Selection for OLAP", "authors": ["Michael Lawrence", "Andrew Rau-Chaplin"], "year": 2006, "publication": "DaWaK", "link": "https://doi.org/10.1007/11823728_4", "snippet": "DaWaK, 2006, 10.1007/11823728_4", "source": "dblp", "result_id": "dblp:doi:10.1007/11823728_4"}, {"title": "The OLAP-Enabled Grid: Model and Query Processing Algorithms", "authors": ["Michael Lawrence", "Andrew Rau-Chaplin"], "year": 2006, "publication": "HPCS", "link": "https://doi.org/10.1109/HPCS.2006.45", "snippet": "HPCS, 2006, 10.1109/hpcs.2006.45", "source": "dblp", "result_id": "dblp:doi:10.1109/hpcs.2006.45"}, {"title": "cgmOLAP: Efficient Parallel Generation and Querying of Terabyte Size ROLAP Data Cubes", "authors": ["Ying Chen", "Andrew Rau-Chaplin", "Frank K. H. A. Dehne", "Todd Eavis", "D. Green", "E. Sithirasenan"], "year": 2006, "publication": "ICDE", "link": "https://doi.org/10.1109/ICDE.2006.32", "snippet": "ICDE, 2006, 10.1109/icde.2006.32", "source": "dblp", "result_id": "dblp:doi:10.1109/icde.2006.32"}, {"title": "Fast Parallel Maximum Likelihood-Based Protein Phylogeny", "authors": ["Christian Blouin", "Davin Butt", "Glenn Hickey", "Andrew Rau-Chaplin"], "year": 2005, "publication": "PDCS", "link": "db/conf/ISCApdcs/ISCApdcs2005.html#BlouinBHR05", "snippet": "PDCS, 2005", "source": "dblp", "result_id": "dblp:fast_parallel_maximum_likelihood_based_protein_phylogeny"}, {"title": "Parallel querying of ROLAP cubes in the presence of hierarchies", "authors": ["Frank K. H. A. Dehne", "Todd Eavis", "Andrew Rau-Chaplin"], "year": 2005, "publication": "DOLAP", "link": "https://doi.org/10.1145/1097002.1097019", "snippet": "DOLAP, 2005, 10.1145/1097002.1097019", "source": "dblp", "result_id": "dblp:doi:10.1145/1097002.1097019"}, {"title": "A Coarse Grained Parallel Algorithm for Closest Larger Ancestors in Trees with Applications to Single Link Clustering", "authors": ["Albert Chan", "Chunmei Gao", "Andrew Rau-Chaplin"], "year": 2005, "publication": "HPCC", "link": "https://doi.org/10.1007/11557654_96", "snippet": "HPCC, 2005, 10.1007/11557654_96", "source": "dblp", "result_id": "dblp:doi:10.1007/11557654_96"}, {"title": "PnP: Parallel And External Memory Iceberg Cubes", "authors": ["Ying Chen", "Frank K. H. A. Dehne", "Todd Eavis", "Andrew Rau-Chaplin"], "year": 2005, "publication": "ICDE", "link": "https://doi.org/10.1109/ICDE.2005.107", "snippet": "ICDE, 2005, 10.1109/icde.2005.107", "source": "dblp", "result_id": "dblp:doi:10.1109/icde.2005.107"}, {"title": "Adding parallelism to visual data flow programs", "authors": ["Philip T. Cox", "Simon Gauvin", "Andrew Rau-Chaplin"], "year": 2005, "publication": "SOFTVIS", "link": "https://doi.org/10.1145/1056018.1056037", "snippet": "SOFTVIS, 2005, 10.1145/1056018.1056037", "source": "dblp", "result_id": "dblp:doi:10.1145/1056018.1056037"}, {"title": "Parallel ROLAP Data Cube Construction on Shared-Nothing Multiprocessors", "authors": ["Ying Chen", "Frank K. H. A. Dehne", "Todd Eavis", "Andrew Rau-Chaplin"], "year": 2004, "publication": "Distributed Parallel Databases", "link": "https://doi.org/10.1023/B:DAPD.0000018572.20283.e0", "snippet": "Distributed Parallel Databases, 2004, 10.1023/b:dapd.0000018572.20283.e0", "source": "dblp", "result_id": "dblp:doi:10.1023/b:dapd.0000018572.20283.e0"}, {"title": "Top-Down Computation of Partial ROLAP Data Cubes", "authors": ["Frank K. H. A. Dehne", "Todd Eavis", "Andrew Rau-Chaplin"], "year": 2004, "publication": "HICSS", "link": "https://doi.org/10.1109/HICSS.2004.1265517", "snippet": "HICSS, 2004, 10.1109/hicss.2004.1265517", "source": "dblp", "result_id": "dblp:doi:10.1109/hicss.2004.1265517"}, {"title": "Building Large ROLAP Data Cubes in Parallel", "authors": ["Ying Chen", "Frank K. H. A. Dehne", "Todd Eavis", "Andrew Rau-Chaplin"], "year": 2004, "publication": "IDEAS", "link": "https://doi.ieeecomputersociety.org/10.1109/IDEAS.2004.16", "snippet": "IDEAS, 2004, 10.1109/ideas.2004.16", "source": "dblp", "result_id": "dblp:doi:10.1109/ideas.2004.16"}, {"title": "Solving large FPT problems on coarse-grained parallel machines", "authors": ["James Cheetham", "Frank K. H. A. Dehne", "Andrew Rau-Chaplin", "Ulrike Stege", "Peter J. Taillon"], "year": 2003, "publication": "J. Comput. Syst. Sci.", "link": "https://doi.org/10.1016/S0022-0000(03)00075-8", "snippet": "J. Comput. Syst. Sci., 2003, 10.1016/s0022-0000(03)00075-8", "source": "dblp", "result_id": "dblp:doi:10.1016/s0022-0000(03)00075-8"}, {"title": "A Parallel FPT Application For Clusters", "authors": ["James Cheetham", "Frank K. H. A. Dehne", "Andrew Rau-Chaplin", "Ulrike Stege", "Peter J. Taillon"], "year": 2003, "publication": "CCGRID", "link": "https://doi.org/10.1109/CCGRID.2003.1199354", "snippet": "CCGRID, 2003, 10.1109/ccgrid.2003.1199354", "source": "dblp", "result_id": "dblp:doi:10.1109/ccgrid.2003.1199354"}, {"title": "Parallel Multi-Dimensional ROLAP Indexing", "authors": ["Frank K. H. A. Dehne", "Todd Eavis", "Andrew Rau-Chaplin"], "year": 2003, "publication": "CCGRID", "link": "https://doi.org/10.1109/CCGRID.2003.1199356", "snippet": "CCGRID, 2003, 10.1109/ccgrid.2003.1199356", "source": "dblp", "result_id": "dblp:doi:10.1109/ccgrid.2003.1199356"}, {"title": "Parallel CLUSTAL W for PC Clusters", "authors": ["James Cheetham", "Frank K. H. A. Dehne", "Sylvain Pitre", "Andrew Rau-Chaplin", "Peter J. Taillon"], "year": 2003, "publication": "ICCSA (2)", "link": "https://doi.org/10.1007/3-540-44843-8_32", "snippet": "ICCSA (2), 2003, 10.1007/3-540-44843-8_32", "source": "dblp", "result_id": "dblp:doi:10.1007/3-540-44843-8_32"}, {"title": "Parallel ROLAP Data Cube Construction On Shared-Nothing Multiprocessors", "authors": ["Ying Chen", "Frank K. H. A. Dehne", "Todd Eavis", "Andrew Rau-Chaplin"], "year": 2003, "publication": "IPDPS", "link": "https://doi.org/10.1109/IPDPS.2003.1213169", "snippet": "IPDPS, 2003, 10.1109/ipdps.2003.1213169", "source": "dblp", "result_id": "dblp:doi:10.1109/ipdps.2003.1213169"}, {"title": "Parallel computation on interval graphs: algorithms and experiments", "authors": ["Afonso Ferreira", "Isabelle Gu\u00e9rin Lassous", "K. Marcus", "Andrew Rau-Chaplin"], "year": 2002, "publication": "Concurr. Comput. Pract. Exp.", "link": "https://doi.org/10.1002/cpe.700", "snippet": "Concurr. Comput. Pract. Exp., 2002, 10.1002/cpe.700", "source": "dblp", "result_id": "dblp:doi:10.1002/cpe.700"}, {"title": "Parallelizing the Data Cube", "authors": ["Frank K. H. A. Dehne", "Todd Eavis", "Susanne E. Hambrusch", "Andrew Rau-Chaplin"], "year": 2002, "publication": "Distributed Parallel Databases", "link": "https://doi.org/10.1023/A:1013940219415", "snippet": "Distributed Parallel Databases, 2002, 10.1023/a:1013940219415", "source": "dblp", "result_id": "dblp:doi:10.1023/a:1013940219415"}, {"title": "A Note on Communication-Efficient Deterministic Parallel Algorithms for Planar Point Location and 2D Vorono\u00ef Diagram", "authors": ["Mohamadou Diallo", "Afonso Ferreira", "Andrew Rau-Chaplin"], "year": 2001, "publication": "Parallel Process. Lett.", "link": "https://doi.org/10.1142/S0129626401000622", "snippet": "Parallel Process. Lett., 2001, 10.1142/s0129626401000622", "source": "dblp", "result_id": "dblp:doi:10.1142/s0129626401000622"}, {"title": "A Cluster Architecture for Parallel Data Warehousing", "authors": ["Frank K. H. A. Dehne", "Todd Eavis", "Andrew Rau-Chaplin"], "year": 2001, "publication": "CCGRID", "link": "https://doi.org/10.1109/CCGRID.2001.923189", "snippet": "CCGRID, 2001, 10.1109/ccgrid.2001.923189", "source": "dblp", "result_id": "dblp:doi:10.1109/ccgrid.2001.923189"}, {"title": "Coarse Grained Parallel On-Line Analytical Processing (OLAP) for Data Mining", "authors": ["Frank K. H. A. Dehne", "Todd Eavis", "Andrew Rau-Chaplin"], "year": 2001, "publication": "International Conference on Computational Science (2)", "link": "https://doi.org/10.1007/3-540-45718-6_64", "snippet": "International Conference on Computational Science (2), 2001, 10.1007/3-540-45718-6_64", "source": "dblp", "result_id": "dblp:doi:10.1007/3-540-45718-6_64"}, {"title": "Parallelizing the Data Cube", "authors": ["Frank K. H. A. Dehne", "Todd Eavis", "Susanne E. Hambrusch", "Andrew Rau-Chaplin"], "year": 2001, "publication": "ICDT", "link": "https://doi.org/10.1007/3-540-44503-X_9", "snippet": "ICDT, 2001, 10.1007/3-540-44503-x_9", "source": "dblp", "result_id": "dblp:doi:10.1007/3-540-44503-x_9"}, {"title": "Computing Partial Data Cubes for Parallel Data Warehousing Applications", "authors": ["Frank K. H. A. Dehne", "Todd Eavis", "Andrew Rau-Chaplin"], "year": 2001, "publication": "PVM/MPI", "link": "https://doi.org/10.1007/3-540-45417-9_44", "snippet": "PVM/MPI, 2001, 10.1007/3-540-45417-9_44", "source": "dblp", "result_id": "dblp:doi:10.1007/3-540-45417-9_44"}, {"title": "d-Dimensional Range Search on Multicomputers", "authors": ["Afonso Ferreira", "Claire Kenyon", "Andrew Rau-Chaplin", "St\u00e9phane Ub\u00e9da"], "year": 1999, "publication": "Algorithmica", "link": "https://doi.org/10.1007/PL00008260", "snippet": "Algorithmica, 1999, 10.1007/pl00008260", "source": "dblp", "result_id": "dblp:doi:10.1007/pl00008260"}, {"title": "Scalable 2D Convex Hull and Triangulation Algorithms for Coarse Grained Multicomputers", "authors": ["Mohamadou Diallo", "Afonso Ferreira", "Andrew Rau-Chaplin", "St\u00e9phane Ub\u00e9da"], "year": 1999, "publication": "J. Parallel Distributed Comput.", "link": "https://doi.org/10.1006/jpdc.1998.1503", "snippet": "J. Parallel Distributed Comput., 1999, 10.1006/jpdc.1998.1503", "source": "dblp", "result_id": "dblp:doi:10.1006/jpdc.1998.1503"}, {"title": "Coarse-Grained Parallel Geometric Search", "authors": ["Albert Chan", "Frank K. H. A. Dehne", "Andrew Rau-Chaplin"], "year": 1999, "publication": "J. Parallel Distributed Comput.", "link": "https://doi.org/10.1006/jpdc.1998.1527", "snippet": "J. Parallel Distributed Comput., 1999, 10.1006/jpdc.1998.1527", "source": "dblp", "result_id": "dblp:doi:10.1006/jpdc.1998.1527"}, {"title": "Scalable Parallel Algorithms for Geometric Pattern Recognition", "authors": ["Laurence Boxer", "Russ Miller", "Andrew Rau-Chaplin"], "year": 1999, "publication": "J. Parallel Distributed Comput.", "link": "https://doi.org/10.1006/jpdc.1999.1565", "snippet": "J. Parallel Distributed Comput., 1999, 10.1006/jpdc.1999.1565", "source": "dblp", "result_id": "dblp:doi:10.1006/jpdc.1999.1565"}, {"title": "Parallel Algorithms for Grounded Range Search and Applications", "authors": ["Michael G. Lamoureux", "Andrew Rau-Chaplin"], "year": 1999, "publication": "Euro-Par", "link": "https://doi.org/10.1007/3-540-48311-X_74", "snippet": "Euro-Par, 1999, 10.1007/3-540-48311-x_74", "source": "dblp", "result_id": "dblp:doi:10.1007/3-540-48311-x_74"}, {"title": "Scaleable Parallel Algorithms for Lower Envelopes with Applications", "authors": ["Laurence Boxer", "Russ Miller", "Andrew Rau-Chaplin"], "year": 1998, "publication": "J. Parallel Distributed Comput.", "link": "https://doi.org/10.1006/jpdc.1998.1478", "snippet": "J. Parallel Distributed Comput., 1998, 10.1006/jpdc.1998.1478", "source": "dblp", "result_id": "dblp:doi:10.1006/jpdc.1998.1478"}, {"title": "Parallel Computation on Interval Graphs Using PC CLusters: Algorithms and Experiments", "authors": ["Afonso Ferreira", "Isabelle Gu\u00e9rin Lassous", "K. Marcus", "Andrew Rau-Chaplin"], "year": 1998, "publication": "Euro-Par", "link": "https://doi.org/10.1007/BFb0057943", "snippet": "Euro-Par, 1998, 10.1007/bfb0057943", "source": "dblp", "result_id": "dblp:doi:10.1007/bfb0057943"}, {"title": "Coarse Grained Parallel Monte Carlo Algorithms for Solving SLAE Using PVM", "authors": ["Vassil Alexandrov", "Frank K. H. A. Dehne", "Andrew Rau-Chaplin", "Keith Taft"], "year": 1998, "publication": "PVM/MPI", "link": "https://doi.org/10.1007/BFb0056591", "snippet": "PVM/MPI, 1998, 10.1007/bfb0056591", "source": "dblp", "result_id": "dblp:doi:10.1007/bfb0056591"}, {"title": "Communication-Efficient Deterministic Parallel Algorithms for Planar Point Location and 2d Voronoi Diagram", "authors": ["Mohamadou Diallo", "Afonso Ferreira", "Andrew Rau-Chaplin"], "year": 1998, "publication": "STACS", "link": "https://doi.org/10.1007/BFb0028576", "snippet": "STACS, 1998, 10.1007/bfb0028576", "source": "dblp", "result_id": "dblp:doi:10.1007/bfb0028576"}, {"title": "Graphics support for a World-Wide-Web based architectural design service", "authors": ["Andrew Rau-Chaplin", "Brian MacKay-Lyons", "Timmy Doucette", "Jedrzej Gajewski", "Xiangqun Hu", "Peter F. Spierenburg"], "year": 1997, "publication": "Comput. Networks ISDN Syst.", "link": "https://doi.org/10.1016/S0169-7552(97)00076-7", "snippet": "Comput. Networks ISDN Syst., 1997, 10.1016/s0169-7552(97)00076-7", "source": "dblp", "result_id": "dblp:doi:10.1016/s0169-7552(97)00076-7"}, {"title": "Coarse Grained Parallel Next Element Search", "authors": ["Albert Chan", "Frank K. H. A. Dehne", "Andrew Rau-Chaplin"], "year": 1997, "publication": "IPPS", "link": "https://doi.org/10.1109/IPPS.1997.580919", "snippet": "IPPS, 1997, 10.1109/ipps.1997.580919", "source": "dblp", "result_id": "dblp:doi:10.1109/ipps.1997.580919"}, {"title": "d-Dimensional Range Search on Multicomputers", "authors": ["Afonso Ferreira", "Claire Kenyon", "Andrew Rau-Chaplin", "St\u00e9phane Ub\u00e9da"], "year": 1997, "publication": "IPPS", "link": "https://doi.org/10.1109/IPPS.1997.580965", "snippet": "IPPS, 1997, 10.1109/ipps.1997.580965", "source": "dblp", "result_id": "dblp:doi:10.1109/ipps.1997.580965"}, {"title": "A Graphical Language for Generating Architectural Forms", "authors": ["Andrew Rau-Chaplin", "Trevor J. Smedley"], "year": 1997, "publication": "VL", "link": "https://doi.org/10.1109/VL.1997.626592", "snippet": "VL, 1997, 10.1109/vl.1997.626592", "source": "dblp", "result_id": "dblp:doi:10.1109/vl.1997.626592"}, {"title": "Scalable parallel computational geometry for coarse grained multicomputers", "authors": ["Frank K. H. A. Dehne", "Andreas Fabri", "Andrew Rau-Chaplin"], "year": 1996, "publication": "Int. J. Comput. Geom. Appl.", "link": "https://doi.org/10.1142/S0218195996000241", "snippet": "Int. J. Comput. Geom. Appl., 1996, 10.1142/s0218195996000241", "source": "dblp", "result_id": "dblp:doi:10.1142/s0218195996000241"}, {"title": "Hypercube Algorithms for Parallel Processing of Pointer-Based Quadtrees", "authors": ["Frank K. H. A. Dehne", "Andrew Rau-Chaplin", "Afonso Ferreira"], "year": 1995, "publication": "Comput. Vis. Image Underst.", "link": "https://doi.org/10.1006/cviu.1995.1037", "snippet": "Comput. Vis. Image Underst., 1995, 10.1006/cviu.1995.1037", "source": "dblp", "result_id": "dblp:doi:10.1006/cviu.1995.1037"}, {"title": "Scalable 2d convex hull and triangulation algorithms for coarse grained multicomputers", "authors": ["Afonso Ferreira", "Andrew Rau-Chaplin", "St\u00e9phane Ub\u00e9da"], "year": 1995, "publication": "SPDP", "link": "https://doi.org/10.1109/SPDP.1995.530733", "snippet": "SPDP, 1995, 10.1109/spdp.1995.530733", "source": "dblp", "result_id": "dblp:doi:10.1109/spdp.1995.530733"}, {"title": "Multisearch Techniques: Parallel Data Structures on Mesh-Connected Computers", "authors": ["Mikhail J. Atallah", "Frank K. H. A. Dehne", "Russ Miller", "Andrew Rau-Chaplin", "Jyh-Jong Tsay"], "year": 1994, "publication": "J. Parallel Distributed Comput.", "link": "https://doi.org/10.1006/jpdc.1994.1001", "snippet": "J. Parallel Distributed Comput., 1994, 10.1006/jpdc.1994.1001", "source": "dblp", "result_id": "dblp:doi:10.1006/jpdc.1994.1001"}, {"title": "Construction of d-Dimensional Hyperoctrees on a Hypercube Multiprocessor", "authors": ["Frank K. H. A. Dehne", "Andreas Fabri", "Mostafa Nassar", "Andrew Rau-Chaplin", "Rada Valiveti"], "year": 1994, "publication": "J. Parallel Distributed Comput.", "link": "https://doi.org/10.1006/jpdc.1994.1137", "snippet": "J. Parallel Distributed Comput., 1994, 10.1006/jpdc.1994.1137", "source": "dblp", "result_id": "dblp:doi:10.1006/jpdc.1994.1137"}, {"title": "A Massively Parallel Knowledge-Base Server Using a Hypercube Multiprocessor", "authors": ["Frank K. H. A. Dehne", "Afonso Ferreira", "Andrew Rau-Chaplin"], "year": 1994, "publication": "Parallel Comput.", "link": "https://doi.org/10.1016/0167-8191(94)90043-4", "snippet": "Parallel Comput., 1994, 10.1016/0167-8191(94)90043-4", "source": "dblp", "result_id": "dblp:doi:10.1016/0167-8191(94)90043-4"}, {"title": "Polygonal approximation by boundary reduction", "authors": ["Laurence Boxer", "Chun-Shi Chang", "Russ Miller", "Andrew Rau-Chaplin"], "year": 1993, "publication": "Pattern Recognit. Lett.", "link": "https://doi.org/10.1016/0167-8655(93)90084-Q", "snippet": "Pattern Recognit. Lett., 1993, 10.1016/0167-8655(93)90084-q", "source": "dblp", "result_id": "dblp:doi:10.1016/0167-8655(93)90084-q"}, {"title": "Scalable Parallel Geometric Algorithms for Coarse Grained Multicomputers", "authors": ["Frank K. H. A. Dehne", "Andreas Fabri", "Andrew Rau-Chaplin"], "year": 1993, "publication": "SCG", "link": "https://doi.org/10.1145/160985.161154", "snippet": "SCG, 1993, 10.1145/160985.161154", "source": "dblp", "result_id": "dblp:doi:10.1145/160985.161154"}, {"title": "Parallel Fractional Cascading on Hypercube Multiprocessors", "authors": ["Frank K. H. A. Dehne", "Afonso Ferreira", "Andrew Rau-Chaplin"], "year": 1992, "publication": "Comput. Geom.", "link": "https://doi.org/10.1016/0925-7721(92)90005-D", "snippet": "Comput. Geom., 1992, 10.1016/0925-7721(92)90005-d", "source": "dblp", "result_id": "dblp:doi:10.1016/0925-7721(92)90005-d"}, {"title": "Optical clustering on a mesh-connected computer", "authors": ["Frank Dehne", "Russ Miller", "Andrew Rau-Chaplin"], "year": 1991, "publication": "Int. J. Parallel Program.", "link": "https://doi.org/10.1007/BF01547896", "snippet": "Int. J. Parallel Program., 1991, 10.1007/bf01547896", "source": "dblp", "result_id": "dblp:doi:10.1007/bf01547896"}, {"title": "Parallel algorithms for color image quantization on hypercubes and meshes", "authors": ["Frank K. H. A. Dehne", "Andrew Rau-Chaplin"], "year": 1991, "publication": "Algorithms and Parallel VLSI Architectures", "link": "db/conf/ccc/ccc1991.html#DehneR91", "snippet": "Algorithms and Parallel VLSI Architectures, 1991", "source": "dblp", "result_id": "dblp:parallel_algorithms_for_color_image_quantization_on_hypercubes_a"}, {"title": "Efficient Parallel Construction and Manipulation of Quadtrees", "authors": ["Frank K. H. A. Dehne", "Afonso Ferreira", "Andrew Rau-Chaplin"], "year": 1991, "publication": "ICPP (3)", "link": "db/conf/icpp/icpp1991-3.html#DehneFR91", "snippet": "ICPP (3), 1991", "source": "dblp", "result_id": "dblp:efficient_parallel_construction_and_manipulation_of_quadtrees"}, {"title": "Multisearch Techniques for Implementing Data Structures on a Mesh-Connected Computer (Preliminary Version)", "authors": ["Mikhail J. Atallah", "Frank K. H. A. Dehne", "Russ Miller", "Andrew Rau-Chaplin", "Jyh-Jong Tsay"], "year": 1991, "publication": "SPAA", "link": "https://doi.org/10.1145/113379.113398", "snippet": "SPAA, 1991, 10.1145/113379.113398", "source": "dblp", "result_id": "dblp:doi:10.1145/113379.113398"}, {"title": "Implementing Data Structures on a Hypercube Multiprocessor, and Applications in Parallel Computational Geometry", "authors": ["Frank K. H. A. Dehne", "Andrew Rau-Chaplin"], "year": 1990, "publication": "J. Parallel Distributed Comput.", "link": "https://doi.org/10.1016/0743-7315(90)90135-C", "snippet": "J. Parallel Distributed Comput., 1990, 10.1016/0743-7315(90)90135-c", "source": "dblp", "result_id": "dblp:doi:10.1016/0743-7315(90)90135-c"}, {"title": "A. G. Ferreira Parallel branch and bound on fine-grained hypercube multiprocessors", "authors": ["Frank K. H. A. Dehne", "Afonso Ferreira", "Andrew Rau-Chaplin"], "year": 1990, "publication": "Parallel Comput.", "link": "https://doi.org/10.1016/0167-8191(90)90043-9", "snippet": "Parallel Comput., 1990, 10.1016/0167-8191(90)90043-9", "source": "dblp", "result_id": "dblp:doi:10.1016/0167-8191(90)90043-9"}, {"title": "A massively parallel knowledge-base server using a hypercube multiprocessor", "authors": ["Frank Dehne", "Afonso G. Ferreira", "Andrew Rau-Chaplin"], "year": 1990, "publication": "TAI", "link": "https://doi.org/10.1109/TAI.1990.130417", "snippet": "TAI, 1990, 10.1109/tai.1990.130417", "source": "dblp", "result_id": "dblp:doi:10.1109/tai.1990.130417"}, {"title": "Parallel branch and bound on fine-grained hypercube multiprocessors", "authors": ["Frank Dehne", "Afonso G. Ferreira", "Andrew Rau-Chaplin"], "year": 1989, "publication": "TAI", "link": "https://doi.org/10.1109/TAI.1989.65375", "snippet": "TAI, 1989, 10.1109/tai.1989.65375", "source": "dblp", "result_id": "dblp:doi:10.1109/tai.1989.65375"}, {"title": "Implementing Data Structures on a Hypercube Multiprocessor, and Applications in Parallel Computational Geometry", "authors": ["Frank K. H. A. Dehne", "Andrew Rau-Chaplin"], "year": 1989, "publication": "WG", "link": "https://doi.org/10.1007/3-540-52292-1_23", "snippet": "WG, 1989, 10.1007/3-540-52292-1_23", "source": "dblp", "result_id": "dblp:doi:10.1007/3-540-52292-1_23"}, {"title": "DAD: a real-time expert system for monitoring of data packet networks", "authors": ["Sameh Rabie", "Andrew Rau-Chaplin", "Taro Shibahara"], "year": 1988, "publication": "IEEE Netw.", "link": "https://doi.org/10.1109/65.17977", "snippet": "IEEE Netw., 1988, 10.1109/65.17977", "source": "dblp", "result_id": "dblp:doi:10.1109/65.17977"}]}} \ No newline at end of file diff --git a/data/api_cache/doi_csl/071808cba96772885be7864a4f33e2aea1bde20a06c8676c5bc92b3b46e7ad20.json b/data/api_cache/doi_csl/071808cba96772885be7864a4f33e2aea1bde20a06c8676c5bc92b3b46e7ad20.json index 5a7cf6c2..4a710495 100644 --- a/data/api_cache/doi_csl/071808cba96772885be7864a4f33e2aea1bde20a06c8676c5bc92b3b46e7ad20.json +++ b/data/api_cache/doi_csl/071808cba96772885be7864a4f33e2aea1bde20a06c8676c5bc92b3b46e7ad20.json @@ -1 +1 @@ -{"timestamp": 1772379888.5173085, "ttl_days": 90, "data": {"type": "article", "id": "https://doi.org/10.48550/arxiv.2206.01176", "categories": ["Machine Learning (cs.LG)", "Artificial Intelligence (cs.AI)", "Neural and Evolutionary Computing (cs.NE)", "FOS: Computer and information sciences", "FOS: Computer and information sciences"], "author": [{"family": "Spadon", "given": "Gabriel"}, {"family": "Rodrigues-Jr", "given": "Jose F."}], "issued": {"date-parts": [[2022]]}, "abstract": "Graphs have often been used to answer questions about the interaction between real-world entities by taking advantage of their capacity to represent complex topologies. Complex networks are known to be graphs that capture such non-trivial topologies; they are able to represent human phenomena such as epidemic processes, the dynamics of populations, and the urbanization of cities. The investigation of complex networks has been extrapolated to many fields of science, with particular emphasis on computing techniques, including artificial intelligence. In such a case, the analysis of the interaction between entities of interest is transposed to the internal learning of algorithms, a paradigm whose investigation is able to expand the state of the art in Computer Science. By exploring this paradigm, this thesis puts together complex networks and machine learning techniques to improve the understanding of the human phenomena observed in pandemics, pendular migration, and street networks. Accordingly, we contribute with: (i) a new neural network architecture capable of modeling dynamic processes observed in spatial and temporal data with applications in epidemics propagation, weather forecasting, and patient monitoring in intensive care units; (ii) a machine-learning methodology for analyzing and predicting links in the scope of human mobility between all the cities of Brazil; and, (iii) techniques for identifying inconsistencies in the urban planning of cities while tracking the most influential vertices, with applications over Brazilian and worldwide cities. We obtained results sustained by sound evidence of advances to the state of the art in artificial intelligence, rigorous formalisms, and ample experimentation. Our findings rely upon real-world applications in a range of domains, demonstrating the applicability of our methodologies.", "DOI": "10.48550/ARXIV.2206.01176", "publisher": "arXiv", "title": "From Cities to Series: Complex Networks and Deep Learning for Improved Spatial and Temporal Analytics*", "URL": "https://arxiv.org/abs/2206.01176", "copyright": "arXiv.org perpetual, non-exclusive license", "version": "1"}} \ No newline at end of file +{"timestamp": 1783001184.3296435, "data": {"type": "article", "id": "https://doi.org/10.48550/arxiv.2206.01176", "categories": ["Machine Learning (cs.LG)", "Artificial Intelligence (cs.AI)", "Neural and Evolutionary Computing (cs.NE)", "FOS: Computer and information sciences", "FOS: Computer and information sciences"], "author": [{"family": "Spadon", "given": "Gabriel"}, {"family": "Rodrigues-Jr", "given": "Jose F."}], "issued": {"date-parts": [[2022]]}, "abstract": "Graphs have often been used to answer questions about the interaction between real-world entities by taking advantage of their capacity to represent complex topologies. Complex networks are known to be graphs that capture such non-trivial topologies; they are able to represent human phenomena such as epidemic processes, the dynamics of populations, and the urbanization of cities. The investigation of complex networks has been extrapolated to many fields of science, with particular emphasis on computing techniques, including artificial intelligence. In such a case, the analysis of the interaction between entities of interest is transposed to the internal learning of algorithms, a paradigm whose investigation is able to expand the state of the art in Computer Science. By exploring this paradigm, this thesis puts together complex networks and machine learning techniques to improve the understanding of the human phenomena observed in pandemics, pendular migration, and street networks. Accordingly, we contribute with: (i) a new neural network architecture capable of modeling dynamic processes observed in spatial and temporal data with applications in epidemics propagation, weather forecasting, and patient monitoring in intensive care units; (ii) a machine-learning methodology for analyzing and predicting links in the scope of human mobility between all the cities of Brazil; and, (iii) techniques for identifying inconsistencies in the urban planning of cities while tracking the most influential vertices, with applications over Brazilian and worldwide cities. We obtained results sustained by sound evidence of advances to the state of the art in artificial intelligence, rigorous formalisms, and ample experimentation. Our findings rely upon real-world applications in a range of domains, demonstrating the applicability of our methodologies.", "DOI": "10.48550/ARXIV.2206.01176", "publisher": "arXiv", "title": "From Cities to Series: Complex Networks and Deep Learning for Improved Spatial and Temporal Analytics*", "URL": "https://arxiv.org/abs/2206.01176", "copyright": "arXiv.org perpetual, non-exclusive license", "version": "1"}} \ No newline at end of file diff --git a/data/api_cache/doi_csl/6ed61fa0c8ea070f0d8da3dea71a5f9e029b35588fca25deb034c72ce5b1dc0f.json b/data/api_cache/doi_csl/6ed61fa0c8ea070f0d8da3dea71a5f9e029b35588fca25deb034c72ce5b1dc0f.json index 9727a24b..aa09af61 100644 --- a/data/api_cache/doi_csl/6ed61fa0c8ea070f0d8da3dea71a5f9e029b35588fca25deb034c72ce5b1dc0f.json +++ b/data/api_cache/doi_csl/6ed61fa0c8ea070f0d8da3dea71a5f9e029b35588fca25deb034c72ce5b1dc0f.json @@ -1 +1 @@ -{"timestamp": 1772379597.469398, "ttl_days": 90, "data": {"type": "article", "id": "https://doi.org/10.48550/arxiv.2509.01836", "categories": ["Robotics (cs.RO)", "Artificial Intelligence (cs.AI)", "Machine Learning (cs.LG)", "FOS: Computer and information sciences", "FOS: Computer and information sciences"], "author": [{"family": "Alam", "given": "Md Mahbub"}, {"family": "Rodrigues-Jr", "given": "Jose F."}, {"family": "Spadon", "given": "Gabriel"}], "issued": {"date-parts": [[2025]]}, "abstract": "Accurate vessel trajectory prediction is essential for enhancing situational awareness and preventing collisions. Still, existing data-driven models are constrained mainly to single-vessel forecasting, overlooking vessel interactions, navigation rules, and explicit collision risk assessment. We present a transformer-based framework for multi-vessel trajectory prediction with integrated collision risk analysis. For a given target vessel, the framework identifies nearby vessels. It jointly predicts their future trajectories through parallel streams encoding kinematic and derived physical features, causal convolutions for temporal locality, spatial transformations for positional encoding, and hybrid positional embeddings that capture both local motion patterns and long-range dependencies. Evaluated on large-scale real-world AIS data using joint multi-vessel metrics, the model demonstrates superior forecasting capabilities beyond traditional single-vessel displacement errors. By simulating interactions among predicted trajectories, the framework further quantifies potential collision risks, offering actionable insights to strengthen maritime safety and decision support.", "DOI": "10.48550/ARXIV.2509.01836", "publisher": "arXiv", "title": "Multi-vessel Interaction-Aware Trajectory Prediction and Collision Risk Assessment", "URL": "https://arxiv.org/abs/2509.01836", "copyright": "arXiv.org perpetual, non-exclusive license", "version": "1"}} \ No newline at end of file +{"timestamp": 1783000996.7023609, "data": {"type": "article", "id": "https://doi.org/10.48550/arxiv.2509.01836", "categories": ["Robotics (cs.RO)", "Artificial Intelligence (cs.AI)", "Machine Learning (cs.LG)", "FOS: Computer and information sciences", "FOS: Computer and information sciences"], "author": [{"family": "Alam", "given": "Md Mahbub"}, {"family": "Rodrigues-Jr", "given": "Jose F."}, {"family": "Spadon", "given": "Gabriel"}], "issued": {"date-parts": [[2025]]}, "abstract": "Accurate vessel trajectory prediction is essential for enhancing situational awareness and preventing collisions. Still, existing data-driven models are constrained mainly to single-vessel forecasting, overlooking vessel interactions, navigation rules, and explicit collision risk assessment. We present a transformer-based framework for multi-vessel trajectory prediction with integrated collision risk analysis. For a given target vessel, the framework identifies nearby vessels. It jointly predicts their future trajectories through parallel streams encoding kinematic and derived physical features, causal convolutions for temporal locality, spatial transformations for positional encoding, and hybrid positional embeddings that capture both local motion patterns and long-range dependencies. Evaluated on large-scale real-world AIS data using joint multi-vessel metrics, the model demonstrates superior forecasting capabilities beyond traditional single-vessel displacement errors. By simulating interactions among predicted trajectories, the framework further quantifies potential collision risks, offering actionable insights to strengthen maritime safety and decision support.", "DOI": "10.48550/ARXIV.2509.01836", "publisher": "arXiv", "title": "Multi-vessel Interaction-Aware Trajectory Prediction and Collision Risk Assessment", "URL": "https://arxiv.org/abs/2509.01836", "copyright": "arXiv.org perpetual, non-exclusive license", "version": "1"}} \ No newline at end of file diff --git a/data/api_cache/doi_csl/8381dd0c40b8eaf09585d9bc2dfaccf5f2fb7fed5ccc1413b1df70c4eff44933.json b/data/api_cache/doi_csl/8381dd0c40b8eaf09585d9bc2dfaccf5f2fb7fed5ccc1413b1df70c4eff44933.json index cbe43585..cc41d447 100644 --- a/data/api_cache/doi_csl/8381dd0c40b8eaf09585d9bc2dfaccf5f2fb7fed5ccc1413b1df70c4eff44933.json +++ b/data/api_cache/doi_csl/8381dd0c40b8eaf09585d9bc2dfaccf5f2fb7fed5ccc1413b1df70c4eff44933.json @@ -1 +1 @@ -{"timestamp": 1772379264.287894, "ttl_days": 90, "data": {"type": "article", "id": "https://doi.org/10.48550/arxiv.2511.03499", "categories": ["Computational Engineering, Finance, and Science (cs.CE)", "Artificial Intelligence (cs.AI)", "FOS: Computer and information sciences", "FOS: Computer and information sciences"], "author": [{"family": "Spadon", "given": "Gabriel"}, {"family": "Vaidheeswaran", "given": "Vaishnav"}, {"family": "DiBacco", "given": "Claudio"}], "issued": {"date-parts": [[2025]]}, "abstract": "Marine invasive species spread through global shipping and generate substantial ecological and economic impacts. Traditional risk assessments require detailed records of ballast water and traffic patterns, which are often incomplete, limiting global coverage. This work advances a theoretical framework that quantifies invasion risk by combining environmental similarity across ports with observed and forecasted maritime mobility. Climate-based feature representations characterize each port's marine conditions, while mobility networks derived from Automatic Identification System data capture vessel flows and potential transfer pathways. Clustering and metric learning reveal climate analogues and enable the estimation of species survival likelihood along shipping routes. A temporal link prediction model captures how traffic patterns may change under shifting environmental conditions. The resulting fusion of environmental similarity and predicted mobility provides exposure estimates at the port and voyage levels, supporting targeted monitoring, routing adjustments, and management interventions.", "DOI": "10.48550/ARXIV.2511.03499", "publisher": "arXiv", "title": "A Theoretical Framework for Environmental Similarity and Vessel Mobility as Coupled Predictors of Marine Invasive Species Pathways", "URL": "https://arxiv.org/abs/2511.03499", "copyright": "Creative Commons Attribution 4.0 International", "version": "2"}} \ No newline at end of file +{"timestamp": 1783000922.5317323, "data": {"type": "article", "id": "https://doi.org/10.48550/arxiv.2511.03499", "categories": ["Computational Engineering, Finance, and Science (cs.CE)", "Artificial Intelligence (cs.AI)", "FOS: Computer and information sciences", "FOS: Computer and information sciences"], "author": [{"family": "Spadon", "given": "Gabriel"}, {"family": "Vaidheeswaran", "given": "Vaishnav"}, {"family": "DiBacco", "given": "Claudio"}], "issued": {"date-parts": [[2025]]}, "abstract": "Marine invasive species spread through global shipping and generate substantial ecological and economic impacts. Traditional risk assessments require detailed records of ballast water and traffic patterns, which are often incomplete, limiting global coverage. This work advances a theoretical framework that quantifies invasion risk by combining environmental similarity across ports with observed and forecasted maritime mobility. Climate-based feature representations characterize each port's marine conditions, while mobility networks derived from Automatic Identification System data capture vessel flows and potential transfer pathways. Clustering and metric learning reveal climate analogues and enable the estimation of species survival likelihood along shipping routes. A temporal link prediction model captures how traffic patterns may change under shifting environmental conditions. The resulting fusion of environmental similarity and predicted mobility provides exposure estimates at the port and voyage levels, supporting targeted monitoring, routing adjustments, and management interventions.", "DOI": "10.48550/ARXIV.2511.03499", "publisher": "arXiv", "title": "A Theoretical Framework for Environmental Similarity and Vessel Mobility as Coupled Predictors of Marine Invasive Species Pathways", "URL": "https://arxiv.org/abs/2511.03499", "copyright": "Creative Commons Attribution 4.0 International", "version": "2"}} \ No newline at end of file diff --git a/data/api_cache/doi_csl/a601ed3913371d06de804f0c8068828dd6cda5fa7f238dc972f5c336bb57cdce.json b/data/api_cache/doi_csl/a601ed3913371d06de804f0c8068828dd6cda5fa7f238dc972f5c336bb57cdce.json index 9c155818..188db37f 100644 --- a/data/api_cache/doi_csl/a601ed3913371d06de804f0c8068828dd6cda5fa7f238dc972f5c336bb57cdce.json +++ b/data/api_cache/doi_csl/a601ed3913371d06de804f0c8068828dd6cda5fa7f238dc972f5c336bb57cdce.json @@ -1 +1 @@ -{"timestamp": 1772379691.7228534, "ttl_days": 90, "data": {"type": "article", "id": "https://doi.org/10.48550/arxiv.2401.13098", "categories": ["Machine Learning (cs.LG)", "Artificial Intelligence (cs.AI)", "Social and Information Networks (cs.SI)", "Applications (stat.AP)", "FOS: Computer and information sciences", "FOS: Computer and information sciences"], "author": [{"family": "Song", "given": "Ruixin"}, {"family": "Spadon", "given": "Gabriel"}, {"family": "Pelot", "given": "Ronald"}, {"family": "Matwin", "given": "Stan"}, {"family": "Soares", "given": "Amilcar"}], "issued": {"date-parts": [[2024]]}, "abstract": "Aquatic non-indigenous species (NIS) pose significant threats to biodiversity, disrupting ecosystems and inflicting substantial economic damages across agriculture, forestry, and fisheries. Due to the fast growth of global trade and transportation networks, NIS has been introduced and spread unintentionally in new environments. This study develops a new physics-informed model to forecast maritime shipping traffic between port regions worldwide. The predicted information provided by these models, in turn, is used as input for risk assessment of NIS spread through transportation networks to evaluate the capability of our solution. Inspired by the gravity model for international trades, our model considers various factors that influence the likelihood and impact of vessel activities, such as shipping flux density, distance between ports, trade flow, and centrality measures of transportation hubs. Accordingly, this paper introduces transformers to gravity models to rebuild the short- and long-term dependencies that make the risk analysis feasible. Thus, we introduce a physics-inspired framework that achieves an 89% binary accuracy for existing and non-existing trajectories and an 84.8% accuracy for the number of vessels flowing between key port areas, representing more than 10% improvement over the traditional deep-gravity model. Along these lines, this research contributes to a better understanding of NIS risk assessment. It allows policymakers, conservationists, and stakeholders to prioritize management actions by identifying high-risk invasion pathways. Besides, our model is versatile and can include new data sources, making it suitable for assessing international vessel traffic flow in a changing global landscape.", "DOI": "10.48550/ARXIV.2401.13098", "publisher": "arXiv", "title": "Enhancing Global Maritime Traffic Network Forecasting with Gravity-Inspired Deep Learning Models", "URL": "https://arxiv.org/abs/2401.13098", "copyright": "arXiv.org perpetual, non-exclusive license", "version": "3"}} \ No newline at end of file +{"timestamp": 1783001048.393737, "data": {"type": "article", "id": "https://doi.org/10.48550/arxiv.2401.13098", "categories": ["Machine Learning (cs.LG)", "Artificial Intelligence (cs.AI)", "Social and Information Networks (cs.SI)", "Applications (stat.AP)", "FOS: Computer and information sciences", "FOS: Computer and information sciences"], "author": [{"family": "Song", "given": "Ruixin"}, {"family": "Spadon", "given": "Gabriel"}, {"family": "Pelot", "given": "Ronald"}, {"family": "Matwin", "given": "Stan"}, {"family": "Soares", "given": "Amilcar"}], "issued": {"date-parts": [[2024]]}, "abstract": "Aquatic non-indigenous species (NIS) pose significant threats to biodiversity, disrupting ecosystems and inflicting substantial economic damages across agriculture, forestry, and fisheries. Due to the fast growth of global trade and transportation networks, NIS has been introduced and spread unintentionally in new environments. This study develops a new physics-informed model to forecast maritime shipping traffic between port regions worldwide. The predicted information provided by these models, in turn, is used as input for risk assessment of NIS spread through transportation networks to evaluate the capability of our solution. Inspired by the gravity model for international trades, our model considers various factors that influence the likelihood and impact of vessel activities, such as shipping flux density, distance between ports, trade flow, and centrality measures of transportation hubs. Accordingly, this paper introduces transformers to gravity models to rebuild the short- and long-term dependencies that make the risk analysis feasible. Thus, we introduce a physics-inspired framework that achieves an 89% binary accuracy for existing and non-existing trajectories and an 84.8% accuracy for the number of vessels flowing between key port areas, representing more than 10% improvement over the traditional deep-gravity model. Along these lines, this research contributes to a better understanding of NIS risk assessment. It allows policymakers, conservationists, and stakeholders to prioritize management actions by identifying high-risk invasion pathways. Besides, our model is versatile and can include new data sources, making it suitable for assessing international vessel traffic flow in a changing global landscape.", "DOI": "10.48550/ARXIV.2401.13098", "publisher": "arXiv", "title": "Enhancing Global Maritime Traffic Network Forecasting with Gravity-Inspired Deep Learning Models", "URL": "https://arxiv.org/abs/2401.13098", "copyright": "arXiv.org perpetual, non-exclusive license", "version": "3"}} \ No newline at end of file diff --git a/data/api_cache/doi_csl/da2bbe9f84b240572b8e56abfe5ecf35de42ec7429d6721f5adecfbe17d0c9c9.json b/data/api_cache/doi_csl/da2bbe9f84b240572b8e56abfe5ecf35de42ec7429d6721f5adecfbe17d0c9c9.json index 0f9c5b0c..38cc1379 100644 --- a/data/api_cache/doi_csl/da2bbe9f84b240572b8e56abfe5ecf35de42ec7429d6721f5adecfbe17d0c9c9.json +++ b/data/api_cache/doi_csl/da2bbe9f84b240572b8e56abfe5ecf35de42ec7429d6721f5adecfbe17d0c9c9.json @@ -1 +1 @@ -{"timestamp": 1772377609.4990559, "ttl_days": 90, "data": {"type": "article-journal", "id": "https://doi.org/10.48550/arxiv.2310.18948", "categories": ["Machine Learning (cs.LG)", "Artificial Intelligence (cs.AI)", "Discrete Mathematics (cs.DM)", "Probability (math.PR)", "FOS: Computer and information sciences", "FOS: Computer and information sciences", "FOS: Mathematics", "FOS: Mathematics"], "author": [{"family": "Spadon", "given": "Gabriel"}, {"family": "Kumar", "given": "Jay"}, {"family": "Eden", "given": "Derek"}, {"family": "van Berkel", "given": "Josh"}, {"family": "Foster", "given": "Tom"}, {"family": "Soares", "given": "Amilcar"}, {"family": "Fablet", "given": "Ronan"}, {"family": "Matwin", "given": "Stan"}, {"family": "Pelot", "given": "Ronald"}], "issued": {"date-parts": [[2023]]}, "abstract": "This paper addresses the challenge of boosting the precision of multi-path long-term vessel trajectory forecasting on engineered sequences of Automatic Identification System (AIS) data using feature fusion for problem shifting. We have developed a deep auto-encoder model and a phased framework approach to predict the next 12 hours of vessel trajectories using 1 to 3 hours of AIS data as input. To this end, we fuse the spatiotemporal features from the AIS messages with probabilistic features engineered from historical AIS data referring to potential routes and destinations. As a result, we reduce the forecasting uncertainty by shifting the problem into a trajectory reconstruction problem. The probabilistic features have an F1-Score of approximately 85% and 75% for the vessel route and destination prediction, respectively. Under such circumstances, we achieved an R2 Score of over 98% with different layer structures and varying feature combinations; the high R2 Score is a natural outcome of the well-defined shipping lanes in the study region. However, our proposal stands out among competing approaches as it demonstrates the capability of complex decision-making during turnings and route selection. Furthermore, we have shown that our model achieves more accurate forecasting with average and median errors of 11km and 6km, respectively, a 25% improvement from the current state-of-the-art approaches. The resulting model from this proposal is deployed as part of a broader Decision Support System to safeguard whales by preventing the risk of vessel-whale collisions under the smartWhales initiative and acting on the Gulf of St. Lawrence in Atlantic Canada.", "container-title": "arXiv", "DOI": "10.48550/ARXIV.2310.18948", "publisher": "arXiv", "title": "Multi-Path Long-Term Vessel Trajectories Forecasting with Probabilistic Feature Fusion for Problem Shifting", "URL": "https://arxiv.org/abs/2310.18948", "copyright": "arXiv.org perpetual, non-exclusive license", "version": "6"}} \ No newline at end of file +{"timestamp": 1783001100.6829062, "data": {"type": "article-journal", "id": "https://doi.org/10.48550/arxiv.2310.18948", "categories": ["Machine Learning (cs.LG)", "Artificial Intelligence (cs.AI)", "Discrete Mathematics (cs.DM)", "Probability (math.PR)", "FOS: Computer and information sciences", "FOS: Computer and information sciences", "FOS: Mathematics", "FOS: Mathematics"], "author": [{"family": "Spadon", "given": "Gabriel"}, {"family": "Kumar", "given": "Jay"}, {"family": "Eden", "given": "Derek"}, {"family": "van Berkel", "given": "Josh"}, {"family": "Foster", "given": "Tom"}, {"family": "Soares", "given": "Amilcar"}, {"family": "Fablet", "given": "Ronan"}, {"family": "Matwin", "given": "Stan"}, {"family": "Pelot", "given": "Ronald"}], "issued": {"date-parts": [[2023]]}, "abstract": "This paper addresses the challenge of boosting the precision of multi-path long-term vessel trajectory forecasting on engineered sequences of Automatic Identification System (AIS) data using feature fusion for problem shifting. We have developed a deep auto-encoder model and a phased framework approach to predict the next 12 hours of vessel trajectories using 1 to 3 hours of AIS data as input. To this end, we fuse the spatiotemporal features from the AIS messages with probabilistic features engineered from historical AIS data referring to potential routes and destinations. As a result, we reduce the forecasting uncertainty by shifting the problem into a trajectory reconstruction problem. The probabilistic features have an F1-Score of approximately 85% and 75% for the vessel route and destination prediction, respectively. Under such circumstances, we achieved an R2 Score of over 98% with different layer structures and varying feature combinations; the high R2 Score is a natural outcome of the well-defined shipping lanes in the study region. However, our proposal stands out among competing approaches as it demonstrates the capability of complex decision-making during turnings and route selection. Furthermore, we have shown that our model achieves more accurate forecasting with average and median errors of 11km and 6km, respectively, a 25% improvement from the current state-of-the-art approaches. The resulting model from this proposal is deployed as part of a broader Decision Support System to safeguard whales by preventing the risk of vessel-whale collisions under the smartWhales initiative and acting on the Gulf of St. Lawrence in Atlantic Canada.", "container-title": "arXiv", "DOI": "10.48550/ARXIV.2310.18948", "publisher": "arXiv", "title": "Multi-Path Long-Term Vessel Trajectories Forecasting with Probabilistic Feature Fusion for Problem Shifting", "URL": "https://arxiv.org/abs/2310.18948", "copyright": "arXiv.org perpetual, non-exclusive license", "version": "6"}} \ No newline at end of file diff --git a/data/api_cache/doi_csl/f81aabcbd323ba31992b26fe11b9940f6f23e0e06b5df4f34109f0460b0714ad.json b/data/api_cache/doi_csl/f81aabcbd323ba31992b26fe11b9940f6f23e0e06b5df4f34109f0460b0714ad.json index 48cd6c28..b63840c8 100644 --- a/data/api_cache/doi_csl/f81aabcbd323ba31992b26fe11b9940f6f23e0e06b5df4f34109f0460b0714ad.json +++ b/data/api_cache/doi_csl/f81aabcbd323ba31992b26fe11b9940f6f23e0e06b5df4f34109f0460b0714ad.json @@ -1 +1 @@ -{"timestamp": 1772377449.4747963, "ttl_days": 90, "data": {"type": "article", "id": "https://doi.org/10.48550/arxiv.1706.03762", "categories": ["Computation and Language (cs.CL)", "Machine Learning (cs.LG)", "FOS: Computer and information sciences", "FOS: Computer and information sciences"], "author": [{"family": "Vaswani", "given": "Ashish"}, {"family": "Shazeer", "given": "Noam"}, {"family": "Parmar", "given": "Niki"}, {"family": "Uszkoreit", "given": "Jakob"}, {"family": "Jones", "given": "Llion"}, {"family": "Gomez", "given": "Aidan N."}, {"family": "Kaiser", "given": "Lukasz"}, {"family": "Polosukhin", "given": "Illia"}], "issued": {"date-parts": [[2017]]}, "abstract": "The dominant sequence transduction models are based on complex recurrent or convolutional neural networks in an encoder-decoder configuration. The best performing models also connect the encoder and decoder through an attention mechanism. We propose a new simple network architecture, the Transformer, based solely on attention mechanisms, dispensing with recurrence and convolutions entirely. Experiments on two machine translation tasks show these models to be superior in quality while being more parallelizable and requiring significantly less time to train. Our model achieves 28.4 BLEU on the WMT 2014 English-to-German translation task, improving over the existing best results, including ensembles by over 2 BLEU. On the WMT 2014 English-to-French translation task, our model establishes a new single-model state-of-the-art BLEU score of 41.8 after training for 3.5 days on eight GPUs, a small fraction of the training costs of the best models from the literature. We show that the Transformer generalizes well to other tasks by applying it successfully to English constituency parsing both with large and limited training data.", "DOI": "10.48550/ARXIV.1706.03762", "publisher": "arXiv", "title": "Attention Is All You Need", "URL": "https://arxiv.org/abs/1706.03762", "copyright": "arXiv.org perpetual, non-exclusive license", "version": "7"}} \ No newline at end of file +{"timestamp": 1782987746.2769558, "data": {"type": "article", "id": "https://doi.org/10.48550/arxiv.1706.03762", "categories": ["Computation and Language (cs.CL)", "Machine Learning (cs.LG)", "FOS: Computer and information sciences", "FOS: Computer and information sciences"], "author": [{"family": "Vaswani", "given": "Ashish"}, {"family": "Shazeer", "given": "Noam"}, {"family": "Parmar", "given": "Niki"}, {"family": "Uszkoreit", "given": "Jakob"}, {"family": "Jones", "given": "Llion"}, {"family": "Gomez", "given": "Aidan N."}, {"family": "Kaiser", "given": "Lukasz"}, {"family": "Polosukhin", "given": "Illia"}], "issued": {"date-parts": [[2017]]}, "abstract": "The dominant sequence transduction models are based on complex recurrent or convolutional neural networks in an encoder-decoder configuration. The best performing models also connect the encoder and decoder through an attention mechanism. We propose a new simple network architecture, the Transformer, based solely on attention mechanisms, dispensing with recurrence and convolutions entirely. Experiments on two machine translation tasks show these models to be superior in quality while being more parallelizable and requiring significantly less time to train. Our model achieves 28.4 BLEU on the WMT 2014 English-to-German translation task, improving over the existing best results, including ensembles by over 2 BLEU. On the WMT 2014 English-to-French translation task, our model establishes a new single-model state-of-the-art BLEU score of 41.8 after training for 3.5 days on eight GPUs, a small fraction of the training costs of the best models from the literature. We show that the Transformer generalizes well to other tasks by applying it successfully to English constituency parsing both with large and limited training data.", "DOI": "10.48550/ARXIV.1706.03762", "publisher": "arXiv", "title": "Attention Is All You Need", "URL": "https://arxiv.org/abs/1706.03762", "copyright": "arXiv.org perpetual, non-exclusive license", "version": "7"}} \ No newline at end of file diff --git a/data/api_cache/europepmc/0705e0291fe5e0ec5b9848197b069ce43e272b862d2f7975dccc733646e3ab52.json b/data/api_cache/europepmc/0705e0291fe5e0ec5b9848197b069ce43e272b862d2f7975dccc733646e3ab52.json index 0dd92517..f8ef9642 100644 --- a/data/api_cache/europepmc/0705e0291fe5e0ec5b9848197b069ce43e272b862d2f7975dccc733646e3ab52.json +++ b/data/api_cache/europepmc/0705e0291fe5e0ec5b9848197b069ce43e272b862d2f7975dccc733646e3ab52.json @@ -1 +1 @@ -{"timestamp": 1772379809.1309192, "ttl_days": 60, "data": {"_negative": true}} \ No newline at end of file +{"timestamp": 1783016811.5555584, "data": {"_negative": true, "_confirmations": 3, "_safe": true}} \ No newline at end of file diff --git a/data/api_cache/europepmc/1af47da688657fbd15dfdf4ae25c0a52f3d5fa214fd18f9e57525766aeefe5f6.json b/data/api_cache/europepmc/1af47da688657fbd15dfdf4ae25c0a52f3d5fa214fd18f9e57525766aeefe5f6.json index 5c92851f..5b04ef99 100644 --- a/data/api_cache/europepmc/1af47da688657fbd15dfdf4ae25c0a52f3d5fa214fd18f9e57525766aeefe5f6.json +++ b/data/api_cache/europepmc/1af47da688657fbd15dfdf4ae25c0a52f3d5fa214fd18f9e57525766aeefe5f6.json @@ -1 +1 @@ -{"timestamp": 1772377753.1252089, "ttl_days": 60, "data": {"_negative": true}} \ No newline at end of file +{"timestamp": 1783015362.0816877, "data": {"_negative": true, "_confirmations": 3, "_safe": true}} \ No newline at end of file diff --git a/data/api_cache/europepmc/1f13233f34a68084a1262077a09781a51c6ada84a99b0161440f3a14faf40a84.json b/data/api_cache/europepmc/1f13233f34a68084a1262077a09781a51c6ada84a99b0161440f3a14faf40a84.json index 9e7ed983..d1a41d9d 100644 --- a/data/api_cache/europepmc/1f13233f34a68084a1262077a09781a51c6ada84a99b0161440f3a14faf40a84.json +++ b/data/api_cache/europepmc/1f13233f34a68084a1262077a09781a51c6ada84a99b0161440f3a14faf40a84.json @@ -1 +1 @@ -{"timestamp": 1772379623.48633, "ttl_days": 60, "data": {"_negative": true}} \ No newline at end of file +{"timestamp": 1783016652.1034021, "data": {"_negative": true, "_confirmations": 3, "_safe": true}} \ No newline at end of file diff --git a/data/api_cache/europepmc/38a54d0466142acc3c48fe995993fc7fa8abe7678fceef2d81f3567947cb0001.json b/data/api_cache/europepmc/38a54d0466142acc3c48fe995993fc7fa8abe7678fceef2d81f3567947cb0001.json index 6cd83140..dbcfcc1a 100644 --- a/data/api_cache/europepmc/38a54d0466142acc3c48fe995993fc7fa8abe7678fceef2d81f3567947cb0001.json +++ b/data/api_cache/europepmc/38a54d0466142acc3c48fe995993fc7fa8abe7678fceef2d81f3567947cb0001.json @@ -1 +1 @@ -{"timestamp": 1772377778.855896, "ttl_days": 60, "data": {"_negative": true}} \ No newline at end of file +{"timestamp": 1783015447.9378488, "data": {"_negative": true, "_confirmations": 3, "_safe": true}} \ No newline at end of file diff --git a/data/api_cache/europepmc/4d02585dd16d95f12e4da62944d463b3bd10881a9e8be247bf25e36417d34202.json b/data/api_cache/europepmc/4d02585dd16d95f12e4da62944d463b3bd10881a9e8be247bf25e36417d34202.json index 6bcb8689..69147414 100644 --- a/data/api_cache/europepmc/4d02585dd16d95f12e4da62944d463b3bd10881a9e8be247bf25e36417d34202.json +++ b/data/api_cache/europepmc/4d02585dd16d95f12e4da62944d463b3bd10881a9e8be247bf25e36417d34202.json @@ -1 +1 @@ -{"timestamp": 1772377728.2184165, "ttl_days": 60, "data": {"_negative": true}} \ No newline at end of file +{"timestamp": 1783015504.8507988, "data": {"_negative": true, "_confirmations": 3, "_safe": true}} \ No newline at end of file diff --git a/data/api_cache/europepmc/88367b52a4f2ad34bea38b9fceb7cbbc519fc0bf520ec8b4a363bd3605715982.json b/data/api_cache/europepmc/88367b52a4f2ad34bea38b9fceb7cbbc519fc0bf520ec8b4a363bd3605715982.json index 4cdef9ef..63290d58 100644 --- a/data/api_cache/europepmc/88367b52a4f2ad34bea38b9fceb7cbbc519fc0bf520ec8b4a363bd3605715982.json +++ b/data/api_cache/europepmc/88367b52a4f2ad34bea38b9fceb7cbbc519fc0bf520ec8b4a363bd3605715982.json @@ -1 +1 @@ -{"timestamp": 1772378210.6972623, "ttl_days": 60, "data": {"_negative": true}} \ No newline at end of file +{"timestamp": 1783015761.189858, "data": {"_negative": true, "_confirmations": 3, "_safe": true}} \ No newline at end of file diff --git a/data/api_cache/europepmc/8b20cb02fd9abe3e4ed101c04fc28c02fea02147e35c48a52fea75d488ab7c86.json b/data/api_cache/europepmc/8b20cb02fd9abe3e4ed101c04fc28c02fea02147e35c48a52fea75d488ab7c86.json index 2903a05f..fcc3e432 100644 --- a/data/api_cache/europepmc/8b20cb02fd9abe3e4ed101c04fc28c02fea02147e35c48a52fea75d488ab7c86.json +++ b/data/api_cache/europepmc/8b20cb02fd9abe3e4ed101c04fc28c02fea02147e35c48a52fea75d488ab7c86.json @@ -1 +1 @@ -{"timestamp": 1772379484.174625, "ttl_days": 60, "data": {"_negative": true}} \ No newline at end of file +{"timestamp": 1783016602.9817088, "data": {"_negative": true, "_confirmations": 3, "_safe": true}} \ No newline at end of file diff --git a/data/api_cache/europepmc/a21e2968d06e4d1aeb9887e319dc321a02b797daee6df07b7849aaf552c6688d.json b/data/api_cache/europepmc/a21e2968d06e4d1aeb9887e319dc321a02b797daee6df07b7849aaf552c6688d.json index fdb122da..aa47505a 100644 --- a/data/api_cache/europepmc/a21e2968d06e4d1aeb9887e319dc321a02b797daee6df07b7849aaf552c6688d.json +++ b/data/api_cache/europepmc/a21e2968d06e4d1aeb9887e319dc321a02b797daee6df07b7849aaf552c6688d.json @@ -1 +1 @@ -{"timestamp": 1772377971.0443575, "ttl_days": 60, "data": {"_negative": true}} \ No newline at end of file +{"timestamp": 1783015587.2853937, "data": {"_negative": true, "_confirmations": 3, "_safe": true}} \ No newline at end of file diff --git a/data/api_cache/europepmc/a303b559f2fe7268694fc0987cccca5bf6cfffef71d539551459e127482e77bf.json b/data/api_cache/europepmc/a303b559f2fe7268694fc0987cccca5bf6cfffef71d539551459e127482e77bf.json index bfa52d14..79c3aac6 100644 --- a/data/api_cache/europepmc/a303b559f2fe7268694fc0987cccca5bf6cfffef71d539551459e127482e77bf.json +++ b/data/api_cache/europepmc/a303b559f2fe7268694fc0987cccca5bf6cfffef71d539551459e127482e77bf.json @@ -1 +1 @@ -{"timestamp": 1772379746.9951108, "ttl_days": 60, "data": {"_negative": true}} \ No newline at end of file +{"timestamp": 1783016729.993178, "data": {"_negative": true, "_confirmations": 3, "_safe": true}} \ No newline at end of file diff --git a/data/api_cache/europepmc/d170ab4084660dfbd1db96f69b17d8c84a0910546ad990f619d0942ef3ef9213.json b/data/api_cache/europepmc/d170ab4084660dfbd1db96f69b17d8c84a0910546ad990f619d0942ef3ef9213.json index be77f92a..e83ac10b 100644 --- a/data/api_cache/europepmc/d170ab4084660dfbd1db96f69b17d8c84a0910546ad990f619d0942ef3ef9213.json +++ b/data/api_cache/europepmc/d170ab4084660dfbd1db96f69b17d8c84a0910546ad990f619d0942ef3ef9213.json @@ -1 +1 @@ -{"timestamp": 1772379886.8192592, "ttl_days": 60, "data": {"_negative": true}} \ No newline at end of file +{"timestamp": 1783016770.5822728, "data": {"_negative": true, "_confirmations": 3, "_safe": true}} \ No newline at end of file diff --git a/data/api_cache/europepmc/ee5df5fa7c1560ea9fc76585e9c706999931e8f7b521fbb11594c79d15bf8a99.json b/data/api_cache/europepmc/ee5df5fa7c1560ea9fc76585e9c706999931e8f7b521fbb11594c79d15bf8a99.json index 6a1f3ebb..44d16a90 100644 --- a/data/api_cache/europepmc/ee5df5fa7c1560ea9fc76585e9c706999931e8f7b521fbb11594c79d15bf8a99.json +++ b/data/api_cache/europepmc/ee5df5fa7c1560ea9fc76585e9c706999931e8f7b521fbb11594c79d15bf8a99.json @@ -1 +1 @@ -{"timestamp": 1772379716.5791488, "ttl_days": 60, "data": {"results": [{"id": "PPR805081", "source": "PPR", "doi": "10.21203/rs.3.rs-3917933/v1", "title": "Gravity-Informed Deep Learning Framework for Predicting Ship Traffic Flow and Invasion Risk of Non-Indigenous Species via Ballast Water Discharge", "authorString": "Spadon G, Song R, Pelot R, Matwin S, Soares A.", "pubYear": "2024", "pubType": "preprint", "bookOrReportDetails": {"publisher": "Research Square", "yearOfPublication": 2024}, "isOpenAccess": "N", "inEPMC": "N", "inPMC": "N", "hasPDF": "N", "hasBook": "N", "hasSuppl": "N", "citedByCount": 1, "hasReferences": "N", "hasTextMinedTerms": "Y", "hasDbCrossReferences": "N", "hasLabsLinks": "N", "versionNumber": 1, "hasTMAccessionNumbers": "N", "firstIndexDate": "2024-02-13", "firstPublicationDate": "2024-02-12"}]}} \ No newline at end of file +{"timestamp": 1783001093.1953835, "data": {"results": [{"id": "PPR805081", "source": "PPR", "doi": "10.21203/rs.3.rs-3917933/v1", "title": "Gravity-Informed Deep Learning Framework for Predicting Ship Traffic Flow and Invasion Risk of Non-Indigenous Species via Ballast Water Discharge", "authorString": "Spadon G, Song R, Pelot R, Matwin S, Soares A.", "pubYear": "2024", "pubType": "preprint", "bookOrReportDetails": {"publisher": "Research Square", "yearOfPublication": 2024}, "isOpenAccess": "N", "inEPMC": "N", "inPMC": "N", "hasPDF": "N", "hasBook": "N", "hasSuppl": "N", "citedByCount": 1, "hasReferences": "N", "hasTextMinedTerms": "Y", "hasDbCrossReferences": "N", "hasLabsLinks": "N", "versionNumber": 1, "hasTMAccessionNumbers": "N", "firstIndexDate": "2024-02-13", "firstPublicationDate": "2024-02-12"}]}} \ No newline at end of file diff --git a/data/api_cache/europepmc/fd45797585d080233ba513b62617c12b969f7e5371535521a1716a0ee08120d1.json b/data/api_cache/europepmc/fd45797585d080233ba513b62617c12b969f7e5371535521a1716a0ee08120d1.json index 0b7db5c1..1cc1934d 100644 --- a/data/api_cache/europepmc/fd45797585d080233ba513b62617c12b969f7e5371535521a1716a0ee08120d1.json +++ b/data/api_cache/europepmc/fd45797585d080233ba513b62617c12b969f7e5371535521a1716a0ee08120d1.json @@ -1 +1 @@ -{"timestamp": 1772378074.0813456, "ttl_days": 60, "data": {"_negative": true}} \ No newline at end of file +{"timestamp": 1783023648.5150669, "data": {"_negative": true, "_confirmations": 3, "_safe": true}} \ No newline at end of file diff --git a/data/api_cache/gemini/242ac53418472a473b9a4995d50a5906e47d94dc628cbe4f3cb11814070213ab.json b/data/api_cache/gemini/242ac53418472a473b9a4995d50a5906e47d94dc628cbe4f3cb11814070213ab.json index e18a8863..488d2bcf 100644 --- a/data/api_cache/gemini/242ac53418472a473b9a4995d50a5906e47d94dc628cbe4f3cb11814070213ab.json +++ b/data/api_cache/gemini/242ac53418472a473b9a4995d50a5906e47d94dc628cbe4f3cb11814070213ab.json @@ -1 +1 @@ -{"timestamp": 1772377601.7033477, "ttl_days": 365, "data": {"short_title": "MaritimeTrajectoryForecasting"}} \ No newline at end of file +{"timestamp": 1782998314.667442, "data": {"short_title": "MaritimeTrajectoryForecasting"}} \ No newline at end of file diff --git a/data/api_cache/gemini/25e8e17e1b9175f2ff0d38480c41ae5d25659239d4977150aa4085e17785a7e8.json b/data/api_cache/gemini/25e8e17e1b9175f2ff0d38480c41ae5d25659239d4977150aa4085e17785a7e8.json index 3a68098b..bcc47bcb 100644 --- a/data/api_cache/gemini/25e8e17e1b9175f2ff0d38480c41ae5d25659239d4977150aa4085e17785a7e8.json +++ b/data/api_cache/gemini/25e8e17e1b9175f2ff0d38480c41ae5d25659239d4977150aa4085e17785a7e8.json @@ -1 +1 @@ -{"timestamp": 1772379544.4709713, "ttl_days": 365, "data": {"_negative": true}} \ No newline at end of file +{"timestamp": 1783010158.3457377, "data": {"short_title": "SpatioTemporalVesselBehavior"}} \ No newline at end of file diff --git a/data/api_cache/gemini/279671fb3332e3e38f99ffc093ef31833f5c0c6871c56083df6032970721f816.json b/data/api_cache/gemini/279671fb3332e3e38f99ffc093ef31833f5c0c6871c56083df6032970721f816.json index 598ef7de..a31e4ce5 100644 --- a/data/api_cache/gemini/279671fb3332e3e38f99ffc093ef31833f5c0c6871c56083df6032970721f816.json +++ b/data/api_cache/gemini/279671fb3332e3e38f99ffc093ef31833f5c0c6871c56083df6032970721f816.json @@ -1 +1 @@ -{"timestamp": 1772377610.028015, "ttl_days": 365, "data": {"short_title": "ProbabilisticTrajectoryForecasting"}} \ No newline at end of file +{"timestamp": 1783001157.3640761, "data": {"short_title": "ProbabilisticTrajectoryForecasting"}} \ No newline at end of file diff --git a/data/api_cache/gemini/2cce85101e3da3acfe8c3af0c340c330721113442fc568bc1ec01bf3a4598bb4.json b/data/api_cache/gemini/2cce85101e3da3acfe8c3af0c340c330721113442fc568bc1ec01bf3a4598bb4.json index bd2829db..704f3324 100644 --- a/data/api_cache/gemini/2cce85101e3da3acfe8c3af0c340c330721113442fc568bc1ec01bf3a4598bb4.json +++ b/data/api_cache/gemini/2cce85101e3da3acfe8c3af0c340c330721113442fc568bc1ec01bf3a4598bb4.json @@ -1 +1 @@ -{"timestamp": 1772377943.4088826, "ttl_days": 365, "data": {"short_title": "SemanticGleanWorkflows"}} \ No newline at end of file +{"timestamp": 1782999069.2877154, "data": {"short_title": "SemanticGleanWorkflows"}} \ No newline at end of file diff --git a/data/api_cache/gemini/39340a660447031cd5f143fe8042e8b5a3270ee5597c67074ff684bc20af459a.json b/data/api_cache/gemini/39340a660447031cd5f143fe8042e8b5a3270ee5597c67074ff684bc20af459a.json index 18e040a1..6bcdcdc8 100644 --- a/data/api_cache/gemini/39340a660447031cd5f143fe8042e8b5a3270ee5597c67074ff684bc20af459a.json +++ b/data/api_cache/gemini/39340a660447031cd5f143fe8042e8b5a3270ee5597c67074ff684bc20af459a.json @@ -1 +1 @@ -{"timestamp": 1772377729.3094034, "ttl_days": 365, "data": {"_negative": true}} \ No newline at end of file +{"timestamp": 1783010308.5212803, "data": {"short_title": "SemiSupervisedFishingDetection"}} \ No newline at end of file diff --git a/data/api_cache/gemini/402cdc993c50dc7d2e250ae3a9d2e064ca4695a1ebc43b6888d2b14f917b66fe.json b/data/api_cache/gemini/402cdc993c50dc7d2e250ae3a9d2e064ca4695a1ebc43b6888d2b14f917b66fe.json index 0d464852..ea9e7a60 100644 --- a/data/api_cache/gemini/402cdc993c50dc7d2e250ae3a9d2e064ca4695a1ebc43b6888d2b14f917b66fe.json +++ b/data/api_cache/gemini/402cdc993c50dc7d2e250ae3a9d2e064ca4695a1ebc43b6888d2b14f917b66fe.json @@ -1 +1 @@ -{"timestamp": 1772377588.7385476, "ttl_days": 365, "data": {"short_title": "GravityShipFlowRisk"}} \ No newline at end of file +{"timestamp": 1782998256.4765933, "data": {"short_title": "GravityShipInvasionRisk"}} \ No newline at end of file diff --git a/data/api_cache/gemini/4581cc44d34b1bc9c6cf8987fa928d07e33d1c2838efc540b456d4f18340b28a.json b/data/api_cache/gemini/4581cc44d34b1bc9c6cf8987fa928d07e33d1c2838efc540b456d4f18340b28a.json index 333232a6..cb89e814 100644 --- a/data/api_cache/gemini/4581cc44d34b1bc9c6cf8987fa928d07e33d1c2838efc540b456d4f18340b28a.json +++ b/data/api_cache/gemini/4581cc44d34b1bc9c6cf8987fa928d07e33d1c2838efc540b456d4f18340b28a.json @@ -1 +1 @@ -{"timestamp": 1772377731.387097, "ttl_days": 365, "data": {"short_title": "BuccalGraftClosureComparison"}} \ No newline at end of file +{"timestamp": 1782998831.6440134, "data": {"short_title": "BuccalGraftClosureComparison"}} \ No newline at end of file diff --git a/data/api_cache/gemini/4c1786f27257105562bb87eeddd4aafaa6b3aead1076b1b6fdd7df6cb1cbead0.json b/data/api_cache/gemini/4c1786f27257105562bb87eeddd4aafaa6b3aead1076b1b6fdd7df6cb1cbead0.json index 55fa2029..6d4b61fa 100644 --- a/data/api_cache/gemini/4c1786f27257105562bb87eeddd4aafaa6b3aead1076b1b6fdd7df6cb1cbead0.json +++ b/data/api_cache/gemini/4c1786f27257105562bb87eeddd4aafaa6b3aead1076b1b6fdd7df6cb1cbead0.json @@ -1 +1 @@ -{"timestamp": 1772379596.8797588, "ttl_days": 365, "data": {"short_title": "VesselInteractionRisk"}} \ No newline at end of file +{"timestamp": 1783010164.8474905, "data": {"short_title": "VesselInteractionRisk"}} \ No newline at end of file diff --git a/data/api_cache/gemini/aeaf447a2b23b89edf203747b74354e01e39ae9e7de9fa6c8f5890040e9aff2b.json b/data/api_cache/gemini/aeaf447a2b23b89edf203747b74354e01e39ae9e7de9fa6c8f5890040e9aff2b.json index a752dcbc..5eca1de3 100644 --- a/data/api_cache/gemini/aeaf447a2b23b89edf203747b74354e01e39ae9e7de9fa6c8f5890040e9aff2b.json +++ b/data/api_cache/gemini/aeaf447a2b23b89edf203747b74354e01e39ae9e7de9fa6c8f5890040e9aff2b.json @@ -1 +1 @@ -{"timestamp": 1772379717.0382707, "ttl_days": 365, "data": {"short_title": "GravityMaritimeForecasting"}} \ No newline at end of file +{"timestamp": 1783010241.7981033, "data": {"short_title": "GravityMaritimeForecasting"}} \ No newline at end of file diff --git a/data/api_cache/gemini/eb8c21253633dc0b4acffff81687ffab84b484eadce978a3277e0eaefcc8bc51.json b/data/api_cache/gemini/eb8c21253633dc0b4acffff81687ffab84b484eadce978a3277e0eaefcc8bc51.json index e776f315..4c9d241c 100644 --- a/data/api_cache/gemini/eb8c21253633dc0b4acffff81687ffab84b484eadce978a3277e0eaefcc8bc51.json +++ b/data/api_cache/gemini/eb8c21253633dc0b4acffff81687ffab84b484eadce978a3277e0eaefcc8bc51.json @@ -1 +1 @@ -{"timestamp": 1772377708.8241441, "ttl_days": 365, "data": {"short_title": "StoneClearanceSurgeryNephrolithotomy"}} \ No newline at end of file +{"timestamp": 1782998974.349932, "data": {"short_title": "StoneClearanceSurgeryNephrolithotomy"}} \ No newline at end of file diff --git a/data/api_cache/gemini/ecbc6c6dbd41a609c1c662975a296df4c7e5cac32097b7e0565c6711b897c450.json b/data/api_cache/gemini/ecbc6c6dbd41a609c1c662975a296df4c7e5cac32097b7e0565c6711b897c450.json index 5fdbc7c7..1886a1f9 100644 --- a/data/api_cache/gemini/ecbc6c6dbd41a609c1c662975a296df4c7e5cac32097b7e0565c6711b897c450.json +++ b/data/api_cache/gemini/ecbc6c6dbd41a609c1c662975a296df4c7e5cac32097b7e0565c6711b897c450.json @@ -1 +1 @@ -{"timestamp": 1772379811.8067043, "ttl_days": 365, "data": {"short_title": "SpatialTemporalAnalytics"}} \ No newline at end of file +{"timestamp": 1783001183.7169943, "data": {"short_title": "SpatialTemporalAnalytics"}} \ No newline at end of file diff --git a/data/api_cache/gemini/eec87a588064abde02c13b8023c255099d202025f94fc522bb68755c6fa74604.json b/data/api_cache/gemini/eec87a588064abde02c13b8023c255099d202025f94fc522bb68755c6fa74604.json index 4a0beaf1..c945212d 100644 --- a/data/api_cache/gemini/eec87a588064abde02c13b8023c255099d202025f94fc522bb68755c6fa74604.json +++ b/data/api_cache/gemini/eec87a588064abde02c13b8023c255099d202025f94fc522bb68755c6fa74604.json @@ -1 +1 @@ -{"timestamp": 1772378080.262304, "ttl_days": 365, "data": {"short_title": "UrolithiasisPracticeEvolution"}} \ No newline at end of file +{"timestamp": 1782999269.676342, "data": {"short_title": "UrolithiasisDecadesChange"}} \ No newline at end of file diff --git a/data/api_cache/gemini/f7692b182dada240cb2f4a5be4100fefce851f1bdbccd760cd2e5ac7f1d71bda.json b/data/api_cache/gemini/f7692b182dada240cb2f4a5be4100fefce851f1bdbccd760cd2e5ac7f1d71bda.json index 37591948..dc6ce6ad 100644 --- a/data/api_cache/gemini/f7692b182dada240cb2f4a5be4100fefce851f1bdbccd760cd2e5ac7f1d71bda.json +++ b/data/api_cache/gemini/f7692b182dada240cb2f4a5be4100fefce851f1bdbccd760cd2e5ac7f1d71bda.json @@ -1 +1 @@ -{"timestamp": 1772378183.926018, "ttl_days": 365, "data": {"short_title": "AisMovementModeling"}} \ No newline at end of file +{"timestamp": 1782999185.0594914, "data": {"short_title": "AisMovementModeling"}} \ No newline at end of file diff --git a/data/api_cache/gemini/fd411057a77dbd7297e8cd18e51387950458cfb05d27dc2110c212d44631f014.json b/data/api_cache/gemini/fd411057a77dbd7297e8cd18e51387950458cfb05d27dc2110c212d44631f014.json index 7c9de4b8..b7be1fa4 100644 --- a/data/api_cache/gemini/fd411057a77dbd7297e8cd18e51387950458cfb05d27dc2110c212d44631f014.json +++ b/data/api_cache/gemini/fd411057a77dbd7297e8cd18e51387950458cfb05d27dc2110c212d44631f014.json @@ -1 +1 @@ -{"timestamp": 1772379263.6616821, "ttl_days": 365, "data": {"short_title": "MarineInvasivePathways"}} \ No newline at end of file +{"timestamp": 1783000921.9065351, "data": {"short_title": "MarineInvasivePathways"}} \ No newline at end of file diff --git a/data/api_cache/openreview/0705e0291fe5e0ec5b9848197b069ce43e272b862d2f7975dccc733646e3ab52.json b/data/api_cache/openreview/0705e0291fe5e0ec5b9848197b069ce43e272b862d2f7975dccc733646e3ab52.json index 09a99d74..bc28f054 100644 --- a/data/api_cache/openreview/0705e0291fe5e0ec5b9848197b069ce43e272b862d2f7975dccc733646e3ab52.json +++ b/data/api_cache/openreview/0705e0291fe5e0ec5b9848197b069ce43e272b862d2f7975dccc733646e3ab52.json @@ -1 +1 @@ -{"timestamp": 1772379755.5046098, "ttl_days": 60, "data": {"_negative": true}} \ No newline at end of file +{"timestamp": 1783016778.3291738, "data": {"_negative": true, "_confirmations": 3, "_safe": true}} \ No newline at end of file diff --git a/data/api_cache/openreview/1af47da688657fbd15dfdf4ae25c0a52f3d5fa214fd18f9e57525766aeefe5f6.json b/data/api_cache/openreview/1af47da688657fbd15dfdf4ae25c0a52f3d5fa214fd18f9e57525766aeefe5f6.json index 3c1b7207..7dc5ecc4 100644 --- a/data/api_cache/openreview/1af47da688657fbd15dfdf4ae25c0a52f3d5fa214fd18f9e57525766aeefe5f6.json +++ b/data/api_cache/openreview/1af47da688657fbd15dfdf4ae25c0a52f3d5fa214fd18f9e57525766aeefe5f6.json @@ -1 +1 @@ -{"timestamp": 1772377736.2865713, "ttl_days": 60, "data": {"_negative": true}} \ No newline at end of file +{"timestamp": 1783015329.1005695, "data": {"_negative": true, "_confirmations": 3, "_safe": true}} \ No newline at end of file diff --git a/data/api_cache/openreview/1f13233f34a68084a1262077a09781a51c6ada84a99b0161440f3a14faf40a84.json b/data/api_cache/openreview/1f13233f34a68084a1262077a09781a51c6ada84a99b0161440f3a14faf40a84.json index 1a2f56fe..e78a3ed0 100644 --- a/data/api_cache/openreview/1f13233f34a68084a1262077a09781a51c6ada84a99b0161440f3a14faf40a84.json +++ b/data/api_cache/openreview/1f13233f34a68084a1262077a09781a51c6ada84a99b0161440f3a14faf40a84.json @@ -1 +1 @@ -{"timestamp": 1772379600.3056397, "ttl_days": 60, "data": {"_negative": true}} \ No newline at end of file +{"timestamp": 1783016619.3777463, "data": {"_negative": true, "_confirmations": 3, "_safe": true}} \ No newline at end of file diff --git a/data/api_cache/openreview/38a54d0466142acc3c48fe995993fc7fa8abe7678fceef2d81f3567947cb0001.json b/data/api_cache/openreview/38a54d0466142acc3c48fe995993fc7fa8abe7678fceef2d81f3567947cb0001.json index 6f4029ff..19d359c9 100644 --- a/data/api_cache/openreview/38a54d0466142acc3c48fe995993fc7fa8abe7678fceef2d81f3567947cb0001.json +++ b/data/api_cache/openreview/38a54d0466142acc3c48fe995993fc7fa8abe7678fceef2d81f3567947cb0001.json @@ -1 +1 @@ -{"timestamp": 1772377760.9123302, "ttl_days": 60, "data": {"_negative": true}} \ No newline at end of file +{"timestamp": 1783015414.406925, "data": {"_negative": true, "_confirmations": 3, "_safe": true}} \ No newline at end of file diff --git a/data/api_cache/openreview/4d02585dd16d95f12e4da62944d463b3bd10881a9e8be247bf25e36417d34202.json b/data/api_cache/openreview/4d02585dd16d95f12e4da62944d463b3bd10881a9e8be247bf25e36417d34202.json index cad305da..f8971c10 100644 --- a/data/api_cache/openreview/4d02585dd16d95f12e4da62944d463b3bd10881a9e8be247bf25e36417d34202.json +++ b/data/api_cache/openreview/4d02585dd16d95f12e4da62944d463b3bd10881a9e8be247bf25e36417d34202.json @@ -1 +1 @@ -{"timestamp": 1772377714.0596495, "ttl_days": 60, "data": {"_negative": true}} \ No newline at end of file +{"timestamp": 1783015465.8463671, "data": {"_negative": true, "_confirmations": 3, "_safe": true}} \ No newline at end of file diff --git a/data/api_cache/openreview/88367b52a4f2ad34bea38b9fceb7cbbc519fc0bf520ec8b4a363bd3605715982.json b/data/api_cache/openreview/88367b52a4f2ad34bea38b9fceb7cbbc519fc0bf520ec8b4a363bd3605715982.json index 38a9a9c2..c2ee9f50 100644 --- a/data/api_cache/openreview/88367b52a4f2ad34bea38b9fceb7cbbc519fc0bf520ec8b4a363bd3605715982.json +++ b/data/api_cache/openreview/88367b52a4f2ad34bea38b9fceb7cbbc519fc0bf520ec8b4a363bd3605715982.json @@ -1 +1 @@ -{"timestamp": 1772378085.4356089, "ttl_days": 60, "data": {"_negative": true}} \ No newline at end of file +{"timestamp": 1783015728.3937976, "data": {"_negative": true, "_confirmations": 3, "_safe": true}} \ No newline at end of file diff --git a/data/api_cache/openreview/8b20cb02fd9abe3e4ed101c04fc28c02fea02147e35c48a52fea75d488ab7c86.json b/data/api_cache/openreview/8b20cb02fd9abe3e4ed101c04fc28c02fea02147e35c48a52fea75d488ab7c86.json index e547eea0..8e0cfc80 100644 --- a/data/api_cache/openreview/8b20cb02fd9abe3e4ed101c04fc28c02fea02147e35c48a52fea75d488ab7c86.json +++ b/data/api_cache/openreview/8b20cb02fd9abe3e4ed101c04fc28c02fea02147e35c48a52fea75d488ab7c86.json @@ -1 +1 @@ -{"timestamp": 1772379269.8111103, "ttl_days": 60, "data": {"_negative": true}} \ No newline at end of file +{"timestamp": 1783016569.9318762, "data": {"_negative": true, "_confirmations": 3, "_safe": true}} \ No newline at end of file diff --git a/data/api_cache/openreview/a21e2968d06e4d1aeb9887e319dc321a02b797daee6df07b7849aaf552c6688d.json b/data/api_cache/openreview/a21e2968d06e4d1aeb9887e319dc321a02b797daee6df07b7849aaf552c6688d.json index 0664b474..ad7adee1 100644 --- a/data/api_cache/openreview/a21e2968d06e4d1aeb9887e319dc321a02b797daee6df07b7849aaf552c6688d.json +++ b/data/api_cache/openreview/a21e2968d06e4d1aeb9887e319dc321a02b797daee6df07b7849aaf552c6688d.json @@ -1 +1 @@ -{"timestamp": 1772377958.1686897, "ttl_days": 60, "data": {"_negative": true}} \ No newline at end of file +{"timestamp": 1783015554.548123, "data": {"_negative": true, "_confirmations": 3, "_safe": true}} \ No newline at end of file diff --git a/data/api_cache/openreview/a303b559f2fe7268694fc0987cccca5bf6cfffef71d539551459e127482e77bf.json b/data/api_cache/openreview/a303b559f2fe7268694fc0987cccca5bf6cfffef71d539551459e127482e77bf.json index 3d4b741f..2f432d5a 100644 --- a/data/api_cache/openreview/a303b559f2fe7268694fc0987cccca5bf6cfffef71d539551459e127482e77bf.json +++ b/data/api_cache/openreview/a303b559f2fe7268694fc0987cccca5bf6cfffef71d539551459e127482e77bf.json @@ -1 +1 @@ -{"timestamp": 1772379724.4850452, "ttl_days": 60, "data": {"_negative": true}} \ No newline at end of file +{"timestamp": 1783016697.2145593, "data": {"_negative": true, "_confirmations": 3, "_safe": true}} \ No newline at end of file diff --git a/data/api_cache/openreview/d170ab4084660dfbd1db96f69b17d8c84a0910546ad990f619d0942ef3ef9213.json b/data/api_cache/openreview/d170ab4084660dfbd1db96f69b17d8c84a0910546ad990f619d0942ef3ef9213.json index d21b724a..fb5d2ebd 100644 --- a/data/api_cache/openreview/d170ab4084660dfbd1db96f69b17d8c84a0910546ad990f619d0942ef3ef9213.json +++ b/data/api_cache/openreview/d170ab4084660dfbd1db96f69b17d8c84a0910546ad990f619d0942ef3ef9213.json @@ -1 +1 @@ -{"timestamp": 1772379812.4628263, "ttl_days": 60, "data": {"_negative": true}} \ No newline at end of file +{"timestamp": 1783016737.6684039, "data": {"_negative": true, "_confirmations": 3, "_safe": true}} \ No newline at end of file diff --git a/data/api_cache/openreview/ee5df5fa7c1560ea9fc76585e9c706999931e8f7b521fbb11594c79d15bf8a99.json b/data/api_cache/openreview/ee5df5fa7c1560ea9fc76585e9c706999931e8f7b521fbb11594c79d15bf8a99.json index 8ec59791..1684223f 100644 --- a/data/api_cache/openreview/ee5df5fa7c1560ea9fc76585e9c706999931e8f7b521fbb11594c79d15bf8a99.json +++ b/data/api_cache/openreview/ee5df5fa7c1560ea9fc76585e9c706999931e8f7b521fbb11594c79d15bf8a99.json @@ -1 +1 @@ -{"timestamp": 1772379695.7593746, "ttl_days": 60, "data": {"_negative": true}} \ No newline at end of file +{"timestamp": 1783016655.4886348, "data": {"_negative": true, "_confirmations": 3, "_safe": true}} \ No newline at end of file diff --git a/data/api_cache/openreview/fd45797585d080233ba513b62617c12b969f7e5371535521a1716a0ee08120d1.json b/data/api_cache/openreview/fd45797585d080233ba513b62617c12b969f7e5371535521a1716a0ee08120d1.json index 3bd2d36d..8ad3566f 100644 --- a/data/api_cache/openreview/fd45797585d080233ba513b62617c12b969f7e5371535521a1716a0ee08120d1.json +++ b/data/api_cache/openreview/fd45797585d080233ba513b62617c12b969f7e5371535521a1716a0ee08120d1.json @@ -1 +1 @@ -{"timestamp": 1772377976.7679486, "ttl_days": 60, "data": {"_negative": true}} \ No newline at end of file +{"timestamp": 1783015629.1355326, "data": {"_negative": true, "_confirmations": 3, "_safe": true}} \ No newline at end of file diff --git a/data/api_cache/pubmed/0705e0291fe5e0ec5b9848197b069ce43e272b862d2f7975dccc733646e3ab52.json b/data/api_cache/pubmed/0705e0291fe5e0ec5b9848197b069ce43e272b862d2f7975dccc733646e3ab52.json index 4769b58b..edac01d7 100644 --- a/data/api_cache/pubmed/0705e0291fe5e0ec5b9848197b069ce43e272b862d2f7975dccc733646e3ab52.json +++ b/data/api_cache/pubmed/0705e0291fe5e0ec5b9848197b069ce43e272b862d2f7975dccc733646e3ab52.json @@ -1 +1 @@ -{"timestamp": 1772379808.6669037, "ttl_days": 60, "data": {"_negative": true}} \ No newline at end of file +{"timestamp": 1783016811.0438802, "data": {"_negative": true, "_confirmations": 3, "_safe": true}} \ No newline at end of file diff --git a/data/api_cache/pubmed/1af47da688657fbd15dfdf4ae25c0a52f3d5fa214fd18f9e57525766aeefe5f6.json b/data/api_cache/pubmed/1af47da688657fbd15dfdf4ae25c0a52f3d5fa214fd18f9e57525766aeefe5f6.json index d1fda7a1..b7811673 100644 --- a/data/api_cache/pubmed/1af47da688657fbd15dfdf4ae25c0a52f3d5fa214fd18f9e57525766aeefe5f6.json +++ b/data/api_cache/pubmed/1af47da688657fbd15dfdf4ae25c0a52f3d5fa214fd18f9e57525766aeefe5f6.json @@ -1 +1 @@ -{"timestamp": 1772377752.559153, "ttl_days": 60, "data": {"_negative": true}} \ No newline at end of file +{"timestamp": 1783015361.5658484, "data": {"_negative": true, "_confirmations": 3, "_safe": true}} \ No newline at end of file diff --git a/data/api_cache/pubmed/1f13233f34a68084a1262077a09781a51c6ada84a99b0161440f3a14faf40a84.json b/data/api_cache/pubmed/1f13233f34a68084a1262077a09781a51c6ada84a99b0161440f3a14faf40a84.json index 72e4dd76..26bc426a 100644 --- a/data/api_cache/pubmed/1f13233f34a68084a1262077a09781a51c6ada84a99b0161440f3a14faf40a84.json +++ b/data/api_cache/pubmed/1f13233f34a68084a1262077a09781a51c6ada84a99b0161440f3a14faf40a84.json @@ -1 +1 @@ -{"timestamp": 1772379623.0604684, "ttl_days": 60, "data": {"_negative": true}} \ No newline at end of file +{"timestamp": 1783016651.6823337, "data": {"_negative": true, "_confirmations": 3, "_safe": true}} \ No newline at end of file diff --git a/data/api_cache/pubmed/38a54d0466142acc3c48fe995993fc7fa8abe7678fceef2d81f3567947cb0001.json b/data/api_cache/pubmed/38a54d0466142acc3c48fe995993fc7fa8abe7678fceef2d81f3567947cb0001.json index 6e1a6d3a..7bab3651 100644 --- a/data/api_cache/pubmed/38a54d0466142acc3c48fe995993fc7fa8abe7678fceef2d81f3567947cb0001.json +++ b/data/api_cache/pubmed/38a54d0466142acc3c48fe995993fc7fa8abe7678fceef2d81f3567947cb0001.json @@ -1 +1 @@ -{"timestamp": 1772377778.4142916, "ttl_days": 60, "data": {"_negative": true}} \ No newline at end of file +{"timestamp": 1783015447.4884074, "data": {"_negative": true, "_confirmations": 3, "_safe": true}} \ No newline at end of file diff --git a/data/api_cache/pubmed/4d02585dd16d95f12e4da62944d463b3bd10881a9e8be247bf25e36417d34202.json b/data/api_cache/pubmed/4d02585dd16d95f12e4da62944d463b3bd10881a9e8be247bf25e36417d34202.json index 9791cc47..355940b0 100644 --- a/data/api_cache/pubmed/4d02585dd16d95f12e4da62944d463b3bd10881a9e8be247bf25e36417d34202.json +++ b/data/api_cache/pubmed/4d02585dd16d95f12e4da62944d463b3bd10881a9e8be247bf25e36417d34202.json @@ -1 +1 @@ -{"timestamp": 1772377727.7577224, "ttl_days": 60, "data": {"_negative": true}} \ No newline at end of file +{"timestamp": 1783015504.4160042, "data": {"_negative": true, "_confirmations": 3, "_safe": true}} \ No newline at end of file diff --git a/data/api_cache/pubmed/88367b52a4f2ad34bea38b9fceb7cbbc519fc0bf520ec8b4a363bd3605715982.json b/data/api_cache/pubmed/88367b52a4f2ad34bea38b9fceb7cbbc519fc0bf520ec8b4a363bd3605715982.json index e5c94333..47053067 100644 --- a/data/api_cache/pubmed/88367b52a4f2ad34bea38b9fceb7cbbc519fc0bf520ec8b4a363bd3605715982.json +++ b/data/api_cache/pubmed/88367b52a4f2ad34bea38b9fceb7cbbc519fc0bf520ec8b4a363bd3605715982.json @@ -1 +1 @@ -{"timestamp": 1772378210.2619963, "ttl_days": 60, "data": {"_negative": true}} \ No newline at end of file +{"timestamp": 1783015760.7679822, "data": {"_negative": true, "_confirmations": 3, "_safe": true}} \ No newline at end of file diff --git a/data/api_cache/pubmed/8b20cb02fd9abe3e4ed101c04fc28c02fea02147e35c48a52fea75d488ab7c86.json b/data/api_cache/pubmed/8b20cb02fd9abe3e4ed101c04fc28c02fea02147e35c48a52fea75d488ab7c86.json index 730f2f03..747d519d 100644 --- a/data/api_cache/pubmed/8b20cb02fd9abe3e4ed101c04fc28c02fea02147e35c48a52fea75d488ab7c86.json +++ b/data/api_cache/pubmed/8b20cb02fd9abe3e4ed101c04fc28c02fea02147e35c48a52fea75d488ab7c86.json @@ -1 +1 @@ -{"timestamp": 1772379483.7429488, "ttl_days": 60, "data": {"_negative": true}} \ No newline at end of file +{"timestamp": 1783016602.554955, "data": {"_negative": true, "_confirmations": 3, "_safe": true}} \ No newline at end of file diff --git a/data/api_cache/pubmed/a21e2968d06e4d1aeb9887e319dc321a02b797daee6df07b7849aaf552c6688d.json b/data/api_cache/pubmed/a21e2968d06e4d1aeb9887e319dc321a02b797daee6df07b7849aaf552c6688d.json index 419ac070..daf60978 100644 --- a/data/api_cache/pubmed/a21e2968d06e4d1aeb9887e319dc321a02b797daee6df07b7849aaf552c6688d.json +++ b/data/api_cache/pubmed/a21e2968d06e4d1aeb9887e319dc321a02b797daee6df07b7849aaf552c6688d.json @@ -1 +1 @@ -{"timestamp": 1772377970.5810328, "ttl_days": 60, "data": {"_negative": true}} \ No newline at end of file +{"timestamp": 1783015586.8510528, "data": {"_negative": true, "_confirmations": 3, "_safe": true}} \ No newline at end of file diff --git a/data/api_cache/pubmed/a303b559f2fe7268694fc0987cccca5bf6cfffef71d539551459e127482e77bf.json b/data/api_cache/pubmed/a303b559f2fe7268694fc0987cccca5bf6cfffef71d539551459e127482e77bf.json index ae418fa4..70dbd01a 100644 --- a/data/api_cache/pubmed/a303b559f2fe7268694fc0987cccca5bf6cfffef71d539551459e127482e77bf.json +++ b/data/api_cache/pubmed/a303b559f2fe7268694fc0987cccca5bf6cfffef71d539551459e127482e77bf.json @@ -1 +1 @@ -{"timestamp": 1772379746.559326, "ttl_days": 60, "data": {"_negative": true}} \ No newline at end of file +{"timestamp": 1783016729.5457072, "data": {"_negative": true, "_confirmations": 3, "_safe": true}} \ No newline at end of file diff --git a/data/api_cache/pubmed/d170ab4084660dfbd1db96f69b17d8c84a0910546ad990f619d0942ef3ef9213.json b/data/api_cache/pubmed/d170ab4084660dfbd1db96f69b17d8c84a0910546ad990f619d0942ef3ef9213.json index b6093c14..b7ae7046 100644 --- a/data/api_cache/pubmed/d170ab4084660dfbd1db96f69b17d8c84a0910546ad990f619d0942ef3ef9213.json +++ b/data/api_cache/pubmed/d170ab4084660dfbd1db96f69b17d8c84a0910546ad990f619d0942ef3ef9213.json @@ -1 +1 @@ -{"timestamp": 1772379886.3829052, "ttl_days": 60, "data": {"_negative": true}} \ No newline at end of file +{"timestamp": 1783016770.1402469, "data": {"_negative": true, "_confirmations": 3, "_safe": true}} \ No newline at end of file diff --git a/data/api_cache/pubmed/ee5df5fa7c1560ea9fc76585e9c706999931e8f7b521fbb11594c79d15bf8a99.json b/data/api_cache/pubmed/ee5df5fa7c1560ea9fc76585e9c706999931e8f7b521fbb11594c79d15bf8a99.json index 2bce876f..a8d6166e 100644 --- a/data/api_cache/pubmed/ee5df5fa7c1560ea9fc76585e9c706999931e8f7b521fbb11594c79d15bf8a99.json +++ b/data/api_cache/pubmed/ee5df5fa7c1560ea9fc76585e9c706999931e8f7b521fbb11594c79d15bf8a99.json @@ -1 +1 @@ -{"timestamp": 1772379716.1384785, "ttl_days": 60, "data": {"_negative": true}} \ No newline at end of file +{"timestamp": 1783016690.8717592, "data": {"_negative": true, "_confirmations": 3, "_safe": true}} \ No newline at end of file diff --git a/data/api_cache/pubmed/fd45797585d080233ba513b62617c12b969f7e5371535521a1716a0ee08120d1.json b/data/api_cache/pubmed/fd45797585d080233ba513b62617c12b969f7e5371535521a1716a0ee08120d1.json index 901d9d6a..2b6d9479 100644 --- a/data/api_cache/pubmed/fd45797585d080233ba513b62617c12b969f7e5371535521a1716a0ee08120d1.json +++ b/data/api_cache/pubmed/fd45797585d080233ba513b62617c12b969f7e5371535521a1716a0ee08120d1.json @@ -1 +1 @@ -{"timestamp": 1772378073.528916, "ttl_days": 60, "data": {"_negative": true}} \ No newline at end of file +{"timestamp": 1783015679.3714468, "data": {"_negative": true, "_confirmations": 3, "_safe": true}} \ No newline at end of file diff --git a/data/api_cache/serpapi_publications/32bf7da5595e3c7c09530ceabfd8e92b8b54b90b8b66f052c156fd355d3c6fb0.json b/data/api_cache/serpapi_publications/32bf7da5595e3c7c09530ceabfd8e92b8b54b90b8b66f052c156fd355d3c6fb0.json index 534322a9..519962b9 100644 --- a/data/api_cache/serpapi_publications/32bf7da5595e3c7c09530ceabfd8e92b8b54b90b8b66f052c156fd355d3c6fb0.json +++ b/data/api_cache/serpapi_publications/32bf7da5595e3c7c09530ceabfd8e92b8b54b90b8b66f052c156fd355d3c6fb0.json @@ -1 +1 @@ -{"timestamp": 1772379262.7691808, "ttl_days": 60, "data": {"articles": [{"title": "Physics-Informed Vessel Trajectory Prediction via Finite Difference Kinematic Losses", "authors": "MM Alam, A Soares, JF Rodrigues-Jr, G Spadon", "year": 2025, "citation_id": "bfdGsGUAAAAJ:Fu2w8maKXqMC", "result_id": "bfdGsGUAAAAJ:Fu2w8maKXqMC", "source": "scholar", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=bfdGsGUAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=bfdGsGUAAAAJ:Fu2w8maKXqMC"}, {"title": "A Theoretical Framework for Environmental Similarity and Vessel Mobility as Coupled Predictors of Marine Invasive Species Pathways", "authors": "G Spadon, V Vaidheeswaran, C DiBacco", "year": 2025, "citation_id": "bfdGsGUAAAAJ:W5xh706n7nkC", "result_id": "bfdGsGUAAAAJ:W5xh706n7nkC", "source": "scholar", "publication_info": {"summary": "arXiv preprint arXiv:2511.03499, 2025"}, "publication": "arXiv preprint arXiv:2511.03499, 2025", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=bfdGsGUAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=bfdGsGUAAAAJ:W5xh706n7nkC"}, {"title": "Community-Centered Spatial Intelligence for Climate Adaptation at Nova Scotia's Eastern Shore", "authors": "G Spadon, O Oyebode, C Botero, T Sharma, F Goerlandt, R Pelot", "year": 2025, "citation_id": "bfdGsGUAAAAJ:JQOojiI6XY0C", "result_id": "bfdGsGUAAAAJ:JQOojiI6XY0C", "source": "scholar", "publication_info": {"summary": "Proceedings of the 1st ACM SIGSPATIAL International Workshop on Spatial \u2026, 2025"}, "publication": "Proceedings of the 1st ACM SIGSPATIAL International Workshop on Spatial \u2026, 2025", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=bfdGsGUAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=bfdGsGUAAAAJ:JQOojiI6XY0C"}, {"title": "Multi-vessel Interaction-Aware Trajectory Prediction and Collision Risk Assessment", "authors": "M Mahbub Alam, JF Rodrigues-Jr, G Spadon", "year": 2025, "citation_id": "bfdGsGUAAAAJ:_Ybze24A_UAC", "result_id": "bfdGsGUAAAAJ:_Ybze24A_UAC", "source": "scholar", "publication_info": {"summary": "arXiv e-prints, arXiv: 2509.01836, 2025"}, "publication": "arXiv e-prints, arXiv: 2509.01836, 2025", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=bfdGsGUAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=bfdGsGUAAAAJ:_Ybze24A_UAC"}, {"title": "Goal-conditioned reinforcement learning for data-driven maritime navigation", "authors": "V Vaidheeswaran, D Jayakody, S Mulay, A Lo, MM Alam, G Spadon", "year": 2025, "citation_id": "bfdGsGUAAAAJ:uLbwQdceFCQC", "result_id": "bfdGsGUAAAAJ:uLbwQdceFCQC", "source": "scholar", "publication_info": {"summary": "arXiv preprint arXiv:2509.01838, 2025"}, "publication": "arXiv preprint arXiv:2509.01838, 2025", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=bfdGsGUAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=bfdGsGUAAAAJ:uLbwQdceFCQC"}, {"title": "AI-Driven Public Health Surveillance: Analyzing Vulnerable Areas in Brazil Using Remote Sensing and Socioeconomic Data", "authors": "JP Silva, EJ de Aguiar, G Spadon, AJM Traina, JF Rodrigues", "year": 2025, "citation_id": "bfdGsGUAAAAJ:dQ2og3OwTAUC", "result_id": "bfdGsGUAAAAJ:dQ2og3OwTAUC", "source": "scholar", "publication_info": {"summary": "2025 IEEE 38th International Symposium on Computer-Based Medical Systems \u2026, 2025"}, "publication": "2025 IEEE 38th International Symposium on Computer-Based Medical Systems \u2026, 2025", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=bfdGsGUAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=bfdGsGUAAAAJ:dQ2og3OwTAUC"}, {"title": "Modeling Maritime Transportation Behavior Using AIS Trajectories and Markovian Processes in the Gulf of St. Lawrence", "authors": "G Spadon, V Vaidheeswaran, MM Alam, R Song, F Goerlandt, R Pelot", "year": 2025, "citation_id": "bfdGsGUAAAAJ:1yQoGdGgb4wC", "result_id": "bfdGsGUAAAAJ:1yQoGdGgb4wC", "source": "scholar", "publication_info": {"summary": "arXiv preprint arXiv:2506.00025, 2025"}, "publication": "arXiv preprint arXiv:2506.00025, 2025", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=bfdGsGUAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=bfdGsGUAAAAJ:1yQoGdGgb4wC"}, {"title": "ImPORTance: Machine Learning-Driven Analysis of Global Port Significance and Network Dynamics for Improved Operational Efficiency", "authors": "E Carlini, D Di Gangi, VM de Lira, H Kavalionak, A Soares, G Spadon", "year": 2025, "citation_id": "bfdGsGUAAAAJ:eq2jaN3J8jMC", "result_id": "bfdGsGUAAAAJ:eq2jaN3J8jMC", "source": "scholar", "publication_info": {"summary": "arXiv preprint arXiv:2407.09571, 2025"}, "publication": "arXiv preprint arXiv:2407.09571, 2025", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=bfdGsGUAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=bfdGsGUAAAAJ:eq2jaN3J8jMC"}, {"title": "Physics-Informed Neural Networks for Vessel Trajectory Prediction: Learning Time-Discretized Kinematic Dynamics via Finite Differences", "authors": "M Mahbub Alam, A Soares, JF Rodrigues-Jr, G Spadon", "year": 2025, "citation_id": "bfdGsGUAAAAJ:hkOj_22Ku90C", "result_id": "bfdGsGUAAAAJ:hkOj_22Ku90C", "source": "scholar", "publication_info": {"summary": "arXiv e-prints, arXiv: 2506.12029, 2025"}, "publication": "arXiv e-prints, arXiv: 2506.12029, 2025", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=bfdGsGUAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=bfdGsGUAAAAJ:hkOj_22Ku90C"}, {"title": "Maritime tracking data analysis and integration with AISdb", "authors": "G Spadon, J Kumar, J Chen, M Smith, C Hilliard, S Vela, R Gehrmann, ...", "year": 2024, "citation_id": "bfdGsGUAAAAJ:VL0QpB8kHFEC", "result_id": "bfdGsGUAAAAJ:VL0QpB8kHFEC", "source": "scholar", "publication_info": {"summary": "SoftwareX 28, 101952, 2024"}, "publication": "SoftwareX 28, 101952, 2024", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=bfdGsGUAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=bfdGsGUAAAAJ:VL0QpB8kHFEC"}, {"title": "Multi-path long-term vessel trajectories forecasting with probabilistic feature fusion for problem shifting", "authors": "G Spadon, J Kumar, D Eden, J van Berkel, T Foster, A Soares, R Fablet, ...", "year": 2024, "citation_id": "bfdGsGUAAAAJ:LjlpjdlvIbIC", "result_id": "bfdGsGUAAAAJ:LjlpjdlvIbIC", "source": "scholar", "publication_info": {"summary": "Ocean Engineering 312, 119138, 2024"}, "publication": "Ocean Engineering 312, 119138, 2024", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=bfdGsGUAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=bfdGsGUAAAAJ:LjlpjdlvIbIC"}, {"title": "Enhancing Short-Term Vessel Trajectory Prediction with Clustering for Heterogeneous and Multi-Modal Movement Patterns", "authors": "MM Alam, G Spadon, M Etemad, L Torgo, E Milios", "year": 2024, "citation_id": "bfdGsGUAAAAJ:9vf0nzSNQJEC", "result_id": "bfdGsGUAAAAJ:9vf0nzSNQJEC", "source": "scholar", "publication_info": {"summary": "Ocean Engineering 308, 118303, 2024"}, "publication": "Ocean Engineering 308, 118303, 2024", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=bfdGsGUAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=bfdGsGUAAAAJ:9vf0nzSNQJEC"}, {"title": "Enhancing global maritime traffic network forecasting with gravity-inspired deep learning models", "authors": "R Song, G Spadon, R Pelot, S Matwin, A Soares", "year": 2024, "citation_id": "bfdGsGUAAAAJ:5awf1xo2G04C", "result_id": "bfdGsGUAAAAJ:5awf1xo2G04C", "source": "scholar", "publication_info": {"summary": "Scientific Reports 14 (1), 16665, 2024"}, "publication": "Scientific Reports 14 (1), 16665, 2024", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=bfdGsGUAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=bfdGsGUAAAAJ:5awf1xo2G04C"}, {"title": "A data augmentation algorithm for trajectory data", "authors": "Y J. Haranwala, G Spadon, C Renso, A Soares", "year": 2023, "citation_id": "bfdGsGUAAAAJ:JoZmwDi-zQgC", "result_id": "bfdGsGUAAAAJ:JoZmwDi-zQgC", "source": "scholar", "publication_info": {"summary": "Proceedings of the 1st ACM SIGSPATIAL International Workshop on Methods for \u2026, 2023"}, "publication": "Proceedings of the 1st ACM SIGSPATIAL International Workshop on Methods for \u2026, 2023", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=bfdGsGUAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=bfdGsGUAAAAJ:JoZmwDi-zQgC"}, {"title": "A semi-supervised methodology for fishing activity detection using the geometry behind the trajectory of multiple vessels", "authors": "MD Ferreira, G Spadon, A Soares, S Matwin", "year": 2022, "citation_id": "bfdGsGUAAAAJ:eMMeJKvmdy0C", "result_id": "bfdGsGUAAAAJ:eMMeJKvmdy0C", "source": "scholar", "publication_info": {"summary": "Sensors 22 (16), 6063, 2022"}, "publication": "Sensors 22 (16), 6063, 2022", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=bfdGsGUAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=bfdGsGUAAAAJ:eMMeJKvmdy0C"}, {"title": "Unfolding ais transmission behavior for vessel movement modeling on noisy data leveraging machine learning", "authors": "G Spadon, MD Ferreira, A Soares, S Matwin", "year": 2022, "citation_id": "bfdGsGUAAAAJ:Mojj43d5GZwC", "result_id": "bfdGsGUAAAAJ:Mojj43d5GZwC", "source": "scholar", "publication_info": {"summary": "IEEE Access 11, 18821-18837, 2022"}, "publication": "IEEE Access 11, 18821-18837, 2022", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=bfdGsGUAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=bfdGsGUAAAAJ:Mojj43d5GZwC"}, {"title": "CPAP adherence assessment via gaussian mixture Modeling of telemonitored apnea therapy", "authors": "JF Rodrigues Jr, S Bailly, JL Pepin, L Goeuriot, G Spadon, S Amer-Yahia", "year": 2022, "citation_id": "bfdGsGUAAAAJ:AXPGKjj_ei8C", "result_id": "bfdGsGUAAAAJ:AXPGKjj_ei8C", "source": "scholar", "publication_info": {"summary": "Applied Sciences 12 (15), 7618, 2022"}, "publication": "Applied Sciences 12 (15), 7618, 2022", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=bfdGsGUAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=bfdGsGUAAAAJ:AXPGKjj_ei8C"}, {"title": "Neural networks for seismic data inversion", "authors": "CM Oishi, FVG Amaral, HL Fran\u00e7a, WH Nakata, DA de Aguiar, ...", "year": 2021, "citation_id": "bfdGsGUAAAAJ:VOx2b1Wkg3QC", "result_id": "bfdGsGUAAAAJ:VOx2b1Wkg3QC", "source": "scholar", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=bfdGsGUAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=bfdGsGUAAAAJ:VOx2b1Wkg3QC"}, {"title": "Aircraft fuselage corrosion detection using artificial intelligence", "authors": "B Brandoli, AR de Geus, JR Souza, G Spadon, A Soares, JF Rodrigues Jr, ...", "year": 2021, "citation_id": "bfdGsGUAAAAJ:fQNAKQ3IYiAC", "result_id": "bfdGsGUAAAAJ:fQNAKQ3IYiAC", "source": "scholar", "publication_info": {"summary": "Sensors 21 (12), 4026, 2021"}, "publication": "Sensors 21 (12), 4026, 2021", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=bfdGsGUAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=bfdGsGUAAAAJ:fQNAKQ3IYiAC"}, {"title": "Pay Attention to Evolution: Time Series Forecasting with Deep Graph-Evolution Learning", "authors": "G Spadon, S Hong, B Brandoli, S Matwin, JF Rodrigues-Jr, J Sun", "year": 2021, "citation_id": "bfdGsGUAAAAJ:5Ul4iDaHHb8C", "result_id": "bfdGsGUAAAAJ:5Ul4iDaHHb8C", "source": "scholar", "publication_info": {"summary": "IEEE Transactions on Pattern Analysis and Machine Intelligence, 2021"}, "publication": "IEEE Transactions on Pattern Analysis and Machine Intelligence, 2021", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=bfdGsGUAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=bfdGsGUAAAAJ:5Ul4iDaHHb8C"}, {"title": "SHARq: sharing recursive queries in relational databases", "authors": "LC Scabora, G Spadon, MT Cazzolato, DS Kaster, AJM Traina, ...", "year": 2021, "citation_id": "bfdGsGUAAAAJ:geHnlv5EZngC", "result_id": "bfdGsGUAAAAJ:geHnlv5EZngC", "source": "scholar", "publication_info": {"summary": "Proceedings of the 36th Annual ACM Symposium on Applied Computing, 336-339, 2021"}, "publication": "Proceedings of the 36th Annual ACM Symposium on Applied Computing, 336-339, 2021", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=bfdGsGUAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=bfdGsGUAAAAJ:geHnlv5EZngC"}, {"title": "LIG-Doctor: Efficient patient trajectory prediction using bidirectional minimal gated-recurrent networks", "authors": "JF Rodrigues-Jr, MA Gutierrez, G Spadon, B Brandoli, S Amer-Yahia", "year": 2021, "citation_id": "bfdGsGUAAAAJ:B3FOqHPlNUQC", "result_id": "bfdGsGUAAAAJ:B3FOqHPlNUQC", "source": "scholar", "publication_info": {"summary": "Information Sciences 545, 813-827, 2021"}, "publication": "Information Sciences 545, 813-827, 2021", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=bfdGsGUAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=bfdGsGUAAAAJ:B3FOqHPlNUQC"}, {"title": "From Cities to Series: Complex Networks and Deep Learning for Improved Spatial and Temporal Analytics", "authors": "G Spadon", "year": 2021, "citation_id": "bfdGsGUAAAAJ:eflP2zaiRacC", "result_id": "bfdGsGUAAAAJ:eflP2zaiRacC", "source": "scholar", "publication_info": {"summary": "Universidade de S\u00e3o Paulo (USP), 2021"}, "publication": "Universidade de S\u00e3o Paulo (USP), 2021", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=bfdGsGUAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=bfdGsGUAAAAJ:eflP2zaiRacC"}, {"title": "DropLeaf: A precision farming smartphone tool for real-time quantification of pesticide application coverage", "authors": "B Brandoli, G Spadon, T Esau, P Hennessy, ACPL Carvalho, ...", "year": 2021, "citation_id": "bfdGsGUAAAAJ:sSrBHYA8nusC", "result_id": "bfdGsGUAAAAJ:sSrBHYA8nusC", "source": "scholar", "publication_info": {"summary": "Computers and Electronics in Agriculture 180, 105906, 2021"}, "publication": "Computers and Electronics in Agriculture 180, 105906, 2021", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=bfdGsGUAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=bfdGsGUAAAAJ:sSrBHYA8nusC"}, {"title": "Lig-Doctor: real-world clinical prognosis using a bi-directional neural network", "authors": "JF Rodrigues, G Spadon, B Brandoli, S Amer-Yahia", "year": 2020, "citation_id": "bfdGsGUAAAAJ:vRqMK49ujn8C", "result_id": "bfdGsGUAAAAJ:vRqMK49ujn8C", "source": "scholar", "publication_info": {"summary": "2020 IEEE 33rd International Symposium on Computer-Based Medical Systems \u2026, 2020"}, "publication": "2020 IEEE 33rd International Symposium on Computer-Based Medical Systems \u2026, 2020", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=bfdGsGUAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=bfdGsGUAAAAJ:vRqMK49ujn8C"}, {"title": "Enhancing recursive graph querying on RDBMS with data clustering approaches", "authors": "LC Scabora, G Spadon, PH Oliveira, JF Rodrigues-Jr, C Traina-Jr", "year": 2020, "citation_id": "bfdGsGUAAAAJ:Tiz5es2fbqcC", "result_id": "bfdGsGUAAAAJ:Tiz5es2fbqcC", "source": "scholar", "publication_info": {"summary": "Proceedings of the 35th Annual ACM Symposium on Applied Computing, 404-411, 2020"}, "publication": "Proceedings of the 35th Annual ACM Symposium on Applied Computing, 404-411, 2020", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=bfdGsGUAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=bfdGsGUAAAAJ:Tiz5es2fbqcC"}, {"title": "Patient trajectory prediction in the Mimic-III dataset, challenges and pitfalls", "authors": "JF Rodrigues-Jr, G Spadon, B Brandoli, S Amer-Yahia", "year": 2019, "citation_id": "bfdGsGUAAAAJ:u9iWguZQMMsC", "result_id": "bfdGsGUAAAAJ:u9iWguZQMMsC", "source": "scholar", "publication_info": {"summary": "arXiv preprint arXiv:1909.04605, 2019"}, "publication": "arXiv preprint arXiv:1909.04605, 2019", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=bfdGsGUAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=bfdGsGUAAAAJ:u9iWguZQMMsC"}, {"title": "Reconstructing commuters network using machine learning and urban indicators", "authors": "G Spadon, AC Carvalho, JF Rodrigues-Jr, LGA Alves", "year": 2019, "citation_id": "bfdGsGUAAAAJ:p2g8aNsByqUC", "result_id": "bfdGsGUAAAAJ:p2g8aNsByqUC", "source": "scholar", "publication_info": {"summary": "Scientific reports 9 (1), 11801, 2019"}, "publication": "Scientific reports 9 (1), 11801, 2019", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=bfdGsGUAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=bfdGsGUAAAAJ:p2g8aNsByqUC"}, {"title": "G-franc: a dataset of criminal activities mapped as a complex network in a relational dbms", "authors": "LC Scabora, G Spadon, LS Rodrigues, MT Cazzolato, MVS Ara\u00fajo, ...", "year": 2019, "citation_id": "bfdGsGUAAAAJ:5ugPr518TE4C", "result_id": "bfdGsGUAAAAJ:5ugPr518TE4C", "source": "scholar", "publication_info": {"summary": "Proceedings Companion, 2019"}, "publication": "Proceedings Companion, 2019", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=bfdGsGUAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=bfdGsGUAAAAJ:5ugPr518TE4C"}, {"title": "Detecting multi-scale distance-based inconsistencies in cities through complex-networks", "authors": "G Spadon, B Brandoli, DM Eler, JF Rodrigues-Jr", "year": 2019, "citation_id": "bfdGsGUAAAAJ:dshw04ExmUIC", "result_id": "bfdGsGUAAAAJ:dshw04ExmUIC", "source": "scholar", "publication_info": {"summary": "Journal of computational science 30, 209-222, 2019"}, "publication": "Journal of computational science 30, 209-222, 2019", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=bfdGsGUAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=bfdGsGUAAAAJ:dshw04ExmUIC"}, {"title": "A comparative analysis of the automatic modeling of Learning Styles through Machine Learning techniques", "authors": "LD Ferreira, G Spadon, AC Carvalho, JF Rodrigues", "year": 2018, "citation_id": "bfdGsGUAAAAJ:OU6Ihb5iCvQC", "result_id": "bfdGsGUAAAAJ:OU6Ihb5iCvQC", "source": "scholar", "publication_info": {"summary": "2018 IEEE Frontiers in Education Conference (FIE), 1-8, 2018"}, "publication": "2018 IEEE Frontiers in Education Conference (FIE), 1-8, 2018", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=bfdGsGUAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=bfdGsGUAAAAJ:OU6Ihb5iCvQC"}, {"title": "Computer-assisted city touring for explorers", "authors": "G Spadon, JF Rodrigues-Jr", "year": 2018, "citation_id": "bfdGsGUAAAAJ:xtRiw3GOFMkC", "result_id": "bfdGsGUAAAAJ:xtRiw3GOFMkC", "source": "scholar", "publication_info": {"summary": "Workshop on Big Social Data and Urban Computing co-located with BiDU 2018 at \u2026, 2018"}, "publication": "Workshop on Big Social Data and Urban Computing co-located with BiDU 2018 at \u2026, 2018", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=bfdGsGUAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=bfdGsGUAAAAJ:xtRiw3GOFMkC"}, {"title": "Caracteriza\u00e7\u00e3o Topol\u00f3gica de Redes Vi\u00e1rias por Meio da An\u00e1lise de Vetores de Caracter\u00edsticas e T\u00e9cnicas de Agrupamento.", "authors": "G Spadon, LC Scabora, MR Nesso Jr, C Traina Jr, JF Rodrigues Jr", "year": 2018, "citation_id": "bfdGsGUAAAAJ:UxriW0iASnsC", "result_id": "bfdGsGUAAAAJ:UxriW0iASnsC", "source": "scholar", "publication_info": {"summary": "SBBD 18, 157-168, 2018"}, "publication": "SBBD 18, 157-168, 2018", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=bfdGsGUAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=bfdGsGUAAAAJ:UxriW0iASnsC"}, {"title": "Recognition of endangered pantanal animal species using deep learning methods", "authors": "MS de Arruda, G Spadon, JF Rodrigues, WN Gon\u00e7alves, BB Machado", "year": 2018, "citation_id": "bfdGsGUAAAAJ:NhqRSupF_l8C", "result_id": "bfdGsGUAAAAJ:NhqRSupF_l8C", "source": "scholar", "publication_info": {"summary": "2018 International Joint Conference on Neural Networks (IJCNN), 1-8, 2018"}, "publication": "2018 International Joint Conference on Neural Networks (IJCNN), 1-8, 2018", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=bfdGsGUAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=bfdGsGUAAAAJ:NhqRSupF_l8C"}, {"title": "Cutting-edge relational graph data management with edge-k: from one to multiple edges in the same row", "authors": "LC Scabora, PH Oliveira, G Spadon, DS Kaster, JF Rodrigues-Jr, ...", "year": 2018, "citation_id": "bfdGsGUAAAAJ:uWQEDVKXjbEC", "result_id": "bfdGsGUAAAAJ:uWQEDVKXjbEC", "source": "scholar", "publication_info": {"summary": "Journal of Information and Data Management 9 (1), 20-20, 2018"}, "publication": "Journal of Information and Data Management 9 (1), 20-20, 2018", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=bfdGsGUAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=bfdGsGUAAAAJ:uWQEDVKXjbEC"}, {"title": "Rafiki: Retrieval-based application for imaging and knowledge investigation", "authors": "MR Nesso, MT Cazzolato, LC Scabora, PH Oliveira, G Spadon, ...", "year": 2018, "citation_id": "bfdGsGUAAAAJ:abG-DnoFyZgC", "result_id": "bfdGsGUAAAAJ:abG-DnoFyZgC", "source": "scholar", "publication_info": {"summary": "2018 IEEE 31st International Symposium on Computer-Based Medical Systems \u2026, 2018"}, "publication": "2018 IEEE 31st International Symposium on Computer-Based Medical Systems \u2026, 2018", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=bfdGsGUAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=bfdGsGUAAAAJ:abG-DnoFyZgC"}, {"title": "Topological street-network characterization through feature-vector and cluster analysis", "authors": "G Spadon, G Gimenes, JF Rodrigues Jr", "year": 2018, "citation_id": "bfdGsGUAAAAJ:b0M2c_1WBrUC", "result_id": "bfdGsGUAAAAJ:b0M2c_1WBrUC", "source": "scholar", "publication_info": {"summary": "International Conference on Computational Science, 274-287, 2018"}, "publication": "International Conference on Computational Science, 274-287, 2018", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=bfdGsGUAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=bfdGsGUAAAAJ:b0M2c_1WBrUC"}, {"title": "A distance-based tool-set to track inconsistent urban structures through complex-networks", "authors": "G Spadon, BB Machado, DM Eler, JF Rodrigues Jr", "year": 2018, "citation_id": "bfdGsGUAAAAJ:_xSYboBqXhAC", "result_id": "bfdGsGUAAAAJ:_xSYboBqXhAC", "source": "scholar", "publication_info": {"summary": "International Conference on Computational Science, 288-301, 2018"}, "publication": "International Conference on Computational Science, 288-301, 2018", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=bfdGsGUAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=bfdGsGUAAAAJ:_xSYboBqXhAC"}, {"title": "Hadoop Cluster Deployment: A Methodological Approach", "authors": "R Correia, G Spadon, P De Andrade Gomes, D Eler, R Garcia, ...", "year": 2018, "citation_id": "bfdGsGUAAAAJ:EUQCXRtRnyEC", "result_id": "bfdGsGUAAAAJ:EUQCXRtRnyEC", "source": "scholar", "publication_info": {"summary": "Information 9 (6), 131-141, 2018"}, "publication": "Information 9 (6), 131-141, 2018", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=bfdGsGUAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=bfdGsGUAAAAJ:EUQCXRtRnyEC"}, {"title": "Internet-based education: a new milestone for formal language and automata courses", "authors": "JEM Rocha, C Olivete, PHA Gomes, RE Garcia, RCM Correia, ...", "year": 2018, "citation_id": "bfdGsGUAAAAJ:tOudhMTPpwUC", "result_id": "bfdGsGUAAAAJ:tOudhMTPpwUC", "source": "scholar", "publication_info": {"summary": "Information Technology-New Generations: 15th International Conference on \u2026, 2018"}, "publication": "Information Technology-New Generations: 15th International Conference on \u2026, 2018", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=bfdGsGUAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=bfdGsGUAAAAJ:tOudhMTPpwUC"}, {"title": "A smartphone application to measure the quality of pest control spraying machines via image analysis", "authors": "BB Machado, G Spadon, MS Arruda, WN Goncalves, AC Carvalho, ...", "year": 2018, "citation_id": "bfdGsGUAAAAJ:e5wmG9Sq2KIC", "result_id": "bfdGsGUAAAAJ:e5wmG9Sq2KIC", "source": "scholar", "publication_info": {"summary": "Proceedings of the 33rd Annual ACM Symposium on Applied Computing, 956-963, 2018"}, "publication": "Proceedings of the 33rd Annual ACM Symposium on Applied Computing, 956-963, 2018", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=bfdGsGUAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=bfdGsGUAAAAJ:e5wmG9Sq2KIC"}, {"title": "Teaching software quality via source code inspection tool", "authors": "PH de Andrade Gomes, RE Garcia, G Spadon, DM Eler, C Olivete, ...", "year": 2017, "citation_id": "bfdGsGUAAAAJ:_Qo2XoVZTnwC", "result_id": "bfdGsGUAAAAJ:_Qo2XoVZTnwC", "source": "scholar", "publication_info": {"summary": "2017 IEEE Frontiers in Education Conference (FIE), 1-8, 2017"}, "publication": "2017 IEEE Frontiers in Education Conference (FIE), 1-8, 2017", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=bfdGsGUAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=bfdGsGUAAAAJ:_Qo2XoVZTnwC"}, {"title": "Characterization of mobility patterns and collective behavior through the analytical processing of real-world complex networks", "authors": "GS Souza, JF Rodrigues Junior", "year": 2017, "citation_id": "bfdGsGUAAAAJ:mB3voiENLucC", "result_id": "bfdGsGUAAAAJ:mB3voiENLucC", "source": "scholar", "publication_info": {"summary": "Universidade de S\u00e3o Paulo, 2017"}, "publication": "Universidade de S\u00e3o Paulo, 2017", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=bfdGsGUAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=bfdGsGUAAAAJ:mB3voiENLucC"}, {"title": "Teaching distributed systems using hadoop", "authors": "RCM Correia, G Spadon, DM Eler, C Olivete Jr, RE Garcia", "year": 2017, "citation_id": "bfdGsGUAAAAJ:bFI3QPDXJZMC", "result_id": "bfdGsGUAAAAJ:bFI3QPDXJZMC", "source": "scholar", "publication_info": {"summary": "Information Technology-New Generations: 14th International Conference on \u2026, 2017"}, "publication": "Information Technology-New Generations: 14th International Conference on \u2026, 2017", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=bfdGsGUAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=bfdGsGUAAAAJ:bFI3QPDXJZMC"}, {"title": "Complex-network tools to understand the behavior of criminality in urban areas", "authors": "G Spadon, LC Scabora, MVS Araujo, PH Oliveir, BB Machado, ...", "year": 2017, "citation_id": "bfdGsGUAAAAJ:3fE2CSJIrl8C", "result_id": "bfdGsGUAAAAJ:3fE2CSJIrl8C", "source": "scholar", "publication_info": {"summary": "Information technology-new generations: 14th international conference on \u2026, 2017"}, "publication": "Information technology-new generations: 14th international conference on \u2026, 2017", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=bfdGsGUAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=bfdGsGUAAAAJ:3fE2CSJIrl8C"}, {"title": "Data mining on LinkedIn data to define professional profile via MineraSkill methodology", "authors": "DCMF Caldeira, RCM Correia, G Spadon, DM Eler, C Olivete-Jr, ...", "year": 2017, "citation_id": "bfdGsGUAAAAJ:mVmsd5A6BfQC", "result_id": "bfdGsGUAAAAJ:mVmsd5A6BfQC", "source": "scholar", "publication_info": {"summary": "2017 12th Iberian Conference on Information Systems and Technologies (CISTI \u2026, 2017"}, "publication": "2017 12th Iberian Conference on Information Systems and Technologies (CISTI \u2026, 2017", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=bfdGsGUAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=bfdGsGUAAAAJ:mVmsd5A6BfQC"}, {"title": "Prediction of winners in MOBA games", "authors": "CEM Almeida, RCM Correia, DM Eler, C Olivete-Jr, RE Garci, LC Scabora, ...", "year": 2017, "citation_id": "bfdGsGUAAAAJ:Wp0gIr-vW9MC", "result_id": "bfdGsGUAAAAJ:Wp0gIr-vW9MC", "source": "scholar", "publication_info": {"summary": "2017 12th Iberian Conference on Information Systems and Technologies (CISTI \u2026, 2017"}, "publication": "2017 12th Iberian Conference on Information Systems and Technologies (CISTI \u2026, 2017", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=bfdGsGUAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=bfdGsGUAAAAJ:Wp0gIr-vW9MC"}, {"title": "Data bases available through APIs using Restify: Characteristics, programming models, and benchmarks", "authors": "LF Marques, RCM Correia, G Spadon, DM Eler, C Olivete-Jr, RE Garcia", "year": 2017, "citation_id": "bfdGsGUAAAAJ:4DMP91E08xMC", "result_id": "bfdGsGUAAAAJ:4DMP91E08xMC", "source": "scholar", "publication_info": {"summary": "2017 12th Iberian Conference on Information Systems and Technologies (CISTI \u2026, 2017"}, "publication": "2017 12th Iberian Conference on Information Systems and Technologies (CISTI \u2026, 2017", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=bfdGsGUAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=bfdGsGUAAAAJ:4DMP91E08xMC"}, {"title": "Behavioral characterization of criminality spread in cities", "authors": "G Spadon, LC Scabora, PH Oliveira, MVS Araujo, BB Machado, ...", "year": 2017, "citation_id": "bfdGsGUAAAAJ:aqlVkmm33-oC", "result_id": "bfdGsGUAAAAJ:aqlVkmm33-oC", "source": "scholar", "publication_info": {"summary": "Procedia Computer Science 108, 2537-2541, 2017"}, "publication": "Procedia Computer Science 108, 2537-2541, 2017", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=bfdGsGUAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=bfdGsGUAAAAJ:aqlVkmm33-oC"}, {"title": "Identifying urban inconsistencies via street networks", "authors": "G Spadon, G Gimenes, JF Rodrigues-Jr", "year": 2017, "citation_id": "bfdGsGUAAAAJ:qxL8FJ1GzNcC", "result_id": "bfdGsGUAAAAJ:qxL8FJ1GzNcC", "source": "scholar", "publication_info": {"summary": "Procedia Computer Science 108, 18-27, 2017"}, "publication": "Procedia Computer Science 108, 18-27, 2017", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=bfdGsGUAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=bfdGsGUAAAAJ:qxL8FJ1GzNcC"}, {"title": "Combined methodology for theoretical computing", "authors": "GS De Souza, PH de Andrade Gomes, RCM Correia, C Olivete, DM Eler, ...", "year": 2016, "citation_id": "bfdGsGUAAAAJ:cFHS6HbyZ2cC", "result_id": "bfdGsGUAAAAJ:cFHS6HbyZ2cC", "source": "scholar", "publication_info": {"summary": "2016 IEEE Frontiers in Education Conference (FIE), 1-7, 2016"}, "publication": "2016 IEEE Frontiers in Education Conference (FIE), 1-7, 2016", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=bfdGsGUAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=bfdGsGUAAAAJ:cFHS6HbyZ2cC"}, {"title": "Health information system for medical survey analysis", "authors": "GS de Souza, RCM Correia, RE Garcia, C Olivete, BRG Santos", "year": 2016, "citation_id": "bfdGsGUAAAAJ:WbkHhVStYXYC", "result_id": "bfdGsGUAAAAJ:WbkHhVStYXYC", "source": "scholar", "publication_info": {"summary": "2016 11th Iberian Conference on Information Systems and Technologies (CISTI \u2026, 2016"}, "publication": "2016 11th Iberian Conference on Information Systems and Technologies (CISTI \u2026, 2016", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=bfdGsGUAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=bfdGsGUAAAAJ:WbkHhVStYXYC"}, {"title": "Teaching-learning methodology for formal languages and automata theory", "authors": "GS De Souza, C Olivete, RCM Correia, RE Garcia", "year": 2015, "citation_id": "bfdGsGUAAAAJ:yD5IFk8b50cC", "result_id": "bfdGsGUAAAAJ:yD5IFk8b50cC", "source": "scholar", "publication_info": {"summary": "2015 IEEE Frontiers in Education Conference (FIE), 1-7, 2015"}, "publication": "2015 IEEE Frontiers in Education Conference (FIE), 1-7, 2015", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=bfdGsGUAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=bfdGsGUAAAAJ:yD5IFk8b50cC"}, {"title": "Uma janela para o mundo: uso da internet e a promo\u00e7\u00e3o da sa\u00fade de pacientes com ELA", "authors": "CR Simon, RB Guimar\u00e3es, GS de Souza", "year": 2015, "citation_id": "bfdGsGUAAAAJ:wbdj-CoPYUoC", "result_id": "bfdGsGUAAAAJ:wbdj-CoPYUoC", "source": "scholar", "publication_info": {"summary": "IV For\u00fam Internacional de Geografia da Sa\u00fade, 2015"}, "publication": "IV For\u00fam Internacional de Geografia da Sa\u00fade, 2015", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=bfdGsGUAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=bfdGsGUAAAAJ:wbdj-CoPYUoC"}, {"title": "Visualiza\u00e7\u00e3o e an\u00e1lise espacial de dados epidemiol\u00f3gicos no espa\u00e7o: Interpola\u00e7\u00e3o da preval\u00eancia de casos de LVC em Presidente Prudente \u2013 SP", "authors": "PSS Matsumoto, GS Souza, RB Guimar\u00e3es", "year": 2015, "citation_id": "bfdGsGUAAAAJ:0EnyYjriUFMC", "result_id": "bfdGsGUAAAAJ:0EnyYjriUFMC", "source": "scholar", "publication_info": {"summary": "IV For\u00fam Internacional de Geografia da Sa\u00fade, 2015"}, "publication": "IV For\u00fam Internacional de Geografia da Sa\u00fade, 2015", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=bfdGsGUAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=bfdGsGUAAAAJ:0EnyYjriUFMC"}, {"title": "Scalable information system using event oriented programming and NoSQL", "authors": "VJ Santana, GS de Souza, RCM Correia, RE Garcia, DM Eler, C Olivete", "year": 2015, "citation_id": "bfdGsGUAAAAJ:pyW8ca7W8N0C", "result_id": "bfdGsGUAAAAJ:pyW8ca7W8N0C", "source": "scholar", "publication_info": {"summary": "2015 10th Iberian Conference on Information Systems and Technologies (CISTI \u2026, 2015"}, "publication": "2015 10th Iberian Conference on Information Systems and Technologies (CISTI \u2026, 2015", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=bfdGsGUAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=bfdGsGUAAAAJ:pyW8ca7W8N0C"}, {"title": "Simulation and analysis applied on virtualization to build Hadoop clusters", "authors": "GS de Souza, RCM Correia, RE Garcia, C Olivete", "year": 2015, "citation_id": "bfdGsGUAAAAJ:a0OBvERweLwC", "result_id": "bfdGsGUAAAAJ:a0OBvERweLwC", "source": "scholar", "publication_info": {"summary": "2015 10th Iberian Conference on Information Systems and Technologies (CISTI \u2026, 2015"}, "publication": "2015 10th Iberian Conference on Information Systems and Technologies (CISTI \u2026, 2015", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=bfdGsGUAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=bfdGsGUAAAAJ:a0OBvERweLwC"}, {"title": "Minera\u00e7\u00e3o de Dados no LinkedIn para Defini\u00e7\u00e3o do Perfil Profissional com a Metodologia MineraSkill Data Mining on LinkedIn Data to Define Professional Profile via MineraSkill \u2026", "authors": "DCMF Caldeira, RCM Correia, G Spadon, DM Eler, C Olivete-Jr, ...", "year": "", "citation_id": "bfdGsGUAAAAJ:NJ774b8OgUMC", "result_id": "bfdGsGUAAAAJ:NJ774b8OgUMC", "source": "scholar", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=bfdGsGUAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=bfdGsGUAAAAJ:NJ774b8OgUMC"}, {"title": "Predi\u00e7\u00e3o de Vencedores em Jogos MOBA Prediction of Winners in MOBA Games", "authors": "CEM Almeida, RCM Correia, DM Eler, C Olivete-Jr, RE Garcia, ...", "year": "", "citation_id": "bfdGsGUAAAAJ:kzcrU_BdoSEC", "result_id": "bfdGsGUAAAAJ:kzcrU_BdoSEC", "source": "scholar", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=bfdGsGUAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=bfdGsGUAAAAJ:kzcrU_BdoSEC"}], "search_metadata": {"status": "Success", "source": "serpapi"}}} \ No newline at end of file +{"timestamp": 1783000753.5060766, "data": {"articles": [{"title": "MoCo-AIS: A Contrastive Learning Framework for Similarity Computation of Vessel Trajectories", "authors": "R Song, MM Alam, Z Sadeghi, A Soares, JF Rodrigues-Jr, G Spadon", "year": 2026, "citation_id": "bfdGsGUAAAAJ:fEOibwPWpKIC", "result_id": "bfdGsGUAAAAJ:fEOibwPWpKIC", "source": "scholar", "publication_info": {"summary": "arXiv preprint arXiv:2606.17978, 2026"}, "publication": "arXiv preprint arXiv:2606.17978, 2026", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=bfdGsGUAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=bfdGsGUAAAAJ:fEOibwPWpKIC"}, {"title": "The State of Brazilian Favelas: Infrastructural Regimes and Urban Inequality", "authors": "JP da Silva, JP de Albuquerque, JC Pedrassoli, G Spadon, ...", "year": 2026, "citation_id": "bfdGsGUAAAAJ:35r97b3x0nAC", "result_id": "bfdGsGUAAAAJ:35r97b3x0nAC", "source": "scholar", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=bfdGsGUAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=bfdGsGUAAAAJ:35r97b3x0nAC"}, {"title": "Assessment of vessel strike risk and performance of the Canadian protection measures for North Atlantic right whales in the Gulf of St. Lawrence", "authors": "A Mayette, AK Cole, S Jian-Javdan, G Spadon, RP Pelot, SW Brillant", "year": 2026, "citation_id": "bfdGsGUAAAAJ:uJ-U7cs_P_0C", "result_id": "bfdGsGUAAAAJ:uJ-U7cs_P_0C", "source": "scholar", "publication_info": {"summary": "Endangered Species Research, 2026"}, "publication": "Endangered Species Research, 2026", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=bfdGsGUAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=bfdGsGUAAAAJ:uJ-U7cs_P_0C"}, {"title": "Modeling Maritime Transportation Behavior Using AIS Trajectories and Markovian Processes in the Gulf of St. Lawrence", "authors": "G Spadon, R Song, V Vaidheeswaran, MM Alam, F Goerlandt, R Pelot", "year": 2025, "citation_id": "bfdGsGUAAAAJ:ZfRJV9d4-WMC", "result_id": "bfdGsGUAAAAJ:ZfRJV9d4-WMC", "source": "scholar", "publication_info": {"summary": "2025 IEEE International Conference on Big Data (BigData), 5314-5323, 2025"}, "publication": "2025 IEEE International Conference on Big Data (BigData), 5314-5323, 2025", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=bfdGsGUAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=bfdGsGUAAAAJ:ZfRJV9d4-WMC"}, {"title": "Goal-Conditioned Reinforcement Learning for Data-Driven Maritime Navigation", "authors": "V Vaidheeswaran, D Jayakody, S Mulay, A Lo, MM Alam, G Spadon", "year": 2025, "citation_id": "bfdGsGUAAAAJ:uLbwQdceFCQC", "result_id": "bfdGsGUAAAAJ:uLbwQdceFCQC", "source": "scholar", "publication_info": {"summary": "2025 IEEE International Conference on Big Data (BigData), 1194-1203, 2025"}, "publication": "2025 IEEE International Conference on Big Data (BigData), 1194-1203, 2025", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=bfdGsGUAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=bfdGsGUAAAAJ:uLbwQdceFCQC"}, {"title": "A Theoretical Framework for Environmental Similarity and Vessel Mobility as Coupled Predictors of Marine Invasive Species Pathways", "authors": "G Spadon, V Vaidheeswaran, C DiBacco", "year": 2025, "citation_id": "bfdGsGUAAAAJ:W5xh706n7nkC", "result_id": "bfdGsGUAAAAJ:W5xh706n7nkC", "source": "scholar", "publication_info": {"summary": "arXiv preprint arXiv:2511.03499, 2025"}, "publication": "arXiv preprint arXiv:2511.03499, 2025", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=bfdGsGUAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=bfdGsGUAAAAJ:W5xh706n7nkC"}, {"title": "Community-Centered Spatial Intelligence for Climate Adaptation at Nova Scotia's Eastern Shore", "authors": "G Spadon, O Oyebode, C Botero, T Sharma, F Goerlandt, R Pelot", "year": 2025, "citation_id": "bfdGsGUAAAAJ:JQOojiI6XY0C", "result_id": "bfdGsGUAAAAJ:JQOojiI6XY0C", "source": "scholar", "publication_info": {"summary": "Proceedings of the 1st ACM SIGSPATIAL International Workshop on Spatial \u2026, 2025"}, "publication": "Proceedings of the 1st ACM SIGSPATIAL International Workshop on Spatial \u2026, 2025", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=bfdGsGUAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=bfdGsGUAAAAJ:JQOojiI6XY0C"}, {"title": "Multi-vessel Interaction-Aware Trajectory Prediction and Collision Risk Assessment", "authors": "M Mahbub Alam, JF Rodrigues-Jr, G Spadon", "year": 2025, "citation_id": "bfdGsGUAAAAJ:_Ybze24A_UAC", "result_id": "bfdGsGUAAAAJ:_Ybze24A_UAC", "source": "scholar", "publication_info": {"summary": "arXiv e-prints, arXiv: 2509.01836, 2025"}, "publication": "arXiv e-prints, arXiv: 2509.01836, 2025", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=bfdGsGUAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=bfdGsGUAAAAJ:_Ybze24A_UAC"}, {"title": "ImPORTance-Machine Learning-Driven Analysis of Global Port Significance and Network Dynamics for Improved Operational Efficiency", "authors": "E Carlini, D Di Gangi, VM de Lira, H Kavalionak, A Soares, G Spadon", "year": 2025, "citation_id": "bfdGsGUAAAAJ:evX43VCCuoAC", "result_id": "bfdGsGUAAAAJ:evX43VCCuoAC", "source": "scholar", "publication_info": {"summary": "Proceedings of the 19th International Symposium on Spatial and Temporal Data \u2026, 2025"}, "publication": "Proceedings of the 19th International Symposium on Spatial and Temporal Data \u2026, 2025", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=bfdGsGUAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=bfdGsGUAAAAJ:evX43VCCuoAC"}, {"title": "Physics-informed neural networks for vessel trajectory prediction: learning time-discretized kinematic dynamics via finite differences", "authors": "MM Alam, A Soares, JF Rodrigues-Jr, G Spadon", "year": 2025, "citation_id": "bfdGsGUAAAAJ:7T2F9Uy0os0C", "result_id": "bfdGsGUAAAAJ:7T2F9Uy0os0C", "source": "scholar", "publication_info": {"summary": "Proceedings of the 19th International Symposium on Spatial and Temporal Data \u2026, 2025"}, "publication": "Proceedings of the 19th International Symposium on Spatial and Temporal Data \u2026, 2025", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=bfdGsGUAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=bfdGsGUAAAAJ:7T2F9Uy0os0C"}, {"title": "AI-Driven Public Health Surveillance: Analyzing Vulnerable Areas in Brazil Using Remote Sensing and Socioeconomic Data", "authors": "JP Silva, EJ de Aguiar, G Spadon, AJM Traina, JF Rodrigues", "year": 2025, "citation_id": "bfdGsGUAAAAJ:dQ2og3OwTAUC", "result_id": "bfdGsGUAAAAJ:dQ2og3OwTAUC", "source": "scholar", "publication_info": {"summary": "2025 IEEE 38th International Symposium on Computer-Based Medical Systems \u2026, 2025"}, "publication": "2025 IEEE 38th International Symposium on Computer-Based Medical Systems \u2026, 2025", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=bfdGsGUAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=bfdGsGUAAAAJ:dQ2og3OwTAUC"}, {"title": "Maritime tracking data analysis and integration with AISdb", "authors": "G Spadon, J Kumar, J Chen, M Smith, C Hilliard, S Vela, R Gehrmann, ...", "year": 2024, "citation_id": "bfdGsGUAAAAJ:VL0QpB8kHFEC", "result_id": "bfdGsGUAAAAJ:VL0QpB8kHFEC", "source": "scholar", "publication_info": {"summary": "SoftwareX 28, 101952, 2024"}, "publication": "SoftwareX 28, 101952, 2024", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=bfdGsGUAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=bfdGsGUAAAAJ:VL0QpB8kHFEC"}, {"title": "Multi-path long-term vessel trajectories forecasting with probabilistic feature fusion for problem shifting", "authors": "G Spadon, J Kumar, D Eden, J van Berkel, T Foster, A Soares, R Fablet, ...", "year": 2024, "citation_id": "bfdGsGUAAAAJ:LjlpjdlvIbIC", "result_id": "bfdGsGUAAAAJ:LjlpjdlvIbIC", "source": "scholar", "publication_info": {"summary": "Ocean Engineering 312, 119138, 2024"}, "publication": "Ocean Engineering 312, 119138, 2024", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=bfdGsGUAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=bfdGsGUAAAAJ:LjlpjdlvIbIC"}, {"title": "Enhancing Short-Term Vessel Trajectory Prediction with Clustering for Heterogeneous and Multi-Modal Movement Patterns", "authors": "MM Alam, G Spadon, M Etemad, L Torgo, E Milios", "year": 2024, "citation_id": "bfdGsGUAAAAJ:9vf0nzSNQJEC", "result_id": "bfdGsGUAAAAJ:9vf0nzSNQJEC", "source": "scholar", "publication_info": {"summary": "Ocean Engineering 308, 118303, 2024"}, "publication": "Ocean Engineering 308, 118303, 2024", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=bfdGsGUAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=bfdGsGUAAAAJ:9vf0nzSNQJEC"}, {"title": "Enhancing global maritime traffic network forecasting with gravity-inspired deep learning models", "authors": "R Song, G Spadon, R Pelot, S Matwin, A Soares", "year": 2024, "citation_id": "bfdGsGUAAAAJ:5awf1xo2G04C", "result_id": "bfdGsGUAAAAJ:5awf1xo2G04C", "source": "scholar", "publication_info": {"summary": "Scientific Reports 14 (1), 16665, 2024"}, "publication": "Scientific Reports 14 (1), 16665, 2024", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=bfdGsGUAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=bfdGsGUAAAAJ:5awf1xo2G04C"}, {"title": "A data augmentation algorithm for trajectory data", "authors": "Y J. Haranwala, G Spadon, C Renso, A Soares", "year": 2023, "citation_id": "bfdGsGUAAAAJ:JoZmwDi-zQgC", "result_id": "bfdGsGUAAAAJ:JoZmwDi-zQgC", "source": "scholar", "publication_info": {"summary": "Proceedings of the 1st ACM SIGSPATIAL International Workshop on Methods for \u2026, 2023"}, "publication": "Proceedings of the 1st ACM SIGSPATIAL International Workshop on Methods for \u2026, 2023", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=bfdGsGUAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=bfdGsGUAAAAJ:JoZmwDi-zQgC"}, {"title": "A semi-supervised methodology for fishing activity detection using the geometry behind the trajectory of multiple vessels", "authors": "MD Ferreira, G Spadon, A Soares, S Matwin", "year": 2022, "citation_id": "bfdGsGUAAAAJ:eMMeJKvmdy0C", "result_id": "bfdGsGUAAAAJ:eMMeJKvmdy0C", "source": "scholar", "publication_info": {"summary": "Sensors 22 (16), 6063, 2022"}, "publication": "Sensors 22 (16), 6063, 2022", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=bfdGsGUAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=bfdGsGUAAAAJ:eMMeJKvmdy0C"}, {"title": "Unfolding ais transmission behavior for vessel movement modeling on noisy data leveraging machine learning", "authors": "G Spadon, MD Ferreira, A Soares, S Matwin", "year": 2022, "citation_id": "bfdGsGUAAAAJ:Mojj43d5GZwC", "result_id": "bfdGsGUAAAAJ:Mojj43d5GZwC", "source": "scholar", "publication_info": {"summary": "IEEE Access 11, 18821-18837, 2022"}, "publication": "IEEE Access 11, 18821-18837, 2022", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=bfdGsGUAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=bfdGsGUAAAAJ:Mojj43d5GZwC"}, {"title": "CPAP adherence assessment via gaussian mixture Modeling of telemonitored apnea therapy", "authors": "JF Rodrigues Jr, S Bailly, JL Pepin, L Goeuriot, G Spadon, S Amer-Yahia", "year": 2022, "citation_id": "bfdGsGUAAAAJ:AXPGKjj_ei8C", "result_id": "bfdGsGUAAAAJ:AXPGKjj_ei8C", "source": "scholar", "publication_info": {"summary": "Applied Sciences 12 (15), 7618, 2022"}, "publication": "Applied Sciences 12 (15), 7618, 2022", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=bfdGsGUAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=bfdGsGUAAAAJ:AXPGKjj_ei8C"}, {"title": "From Cities to Series: Complex Networks and Deep Learning for Improved Spatial and Temporal Analytics", "authors": "G Spadon, JF Rodrigues-Jr", "year": 2022, "citation_id": "bfdGsGUAAAAJ:tzM49s52ZIMC", "result_id": "bfdGsGUAAAAJ:tzM49s52ZIMC", "source": "scholar", "publication_info": {"summary": "arXiv preprint arXiv:2206.01176, 2022"}, "publication": "arXiv preprint arXiv:2206.01176, 2022", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=bfdGsGUAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=bfdGsGUAAAAJ:tzM49s52ZIMC"}, {"title": "Neural networks for seismic data inversion", "authors": "CM Oishi, FVG Amaral, HL Fran\u00e7a, WH Nakata, DA de Aguiar, ...", "year": 2021, "citation_id": "bfdGsGUAAAAJ:VOx2b1Wkg3QC", "result_id": "bfdGsGUAAAAJ:VOx2b1Wkg3QC", "source": "scholar", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=bfdGsGUAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=bfdGsGUAAAAJ:VOx2b1Wkg3QC"}, {"title": "Aircraft fuselage corrosion detection using artificial intelligence", "authors": "B Brandoli, AR de Geus, JR Souza, G Spadon, A Soares, JF Rodrigues Jr, ...", "year": 2021, "citation_id": "bfdGsGUAAAAJ:fQNAKQ3IYiAC", "result_id": "bfdGsGUAAAAJ:fQNAKQ3IYiAC", "source": "scholar", "publication_info": {"summary": "Sensors 21 (12), 4026, 2021"}, "publication": "Sensors 21 (12), 4026, 2021", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=bfdGsGUAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=bfdGsGUAAAAJ:fQNAKQ3IYiAC"}, {"title": "Pay Attention to Evolution: Time Series Forecasting with Deep Graph-Evolution Learning", "authors": "G Spadon, S Hong, B Brandoli, S Matwin, JF Rodrigues-Jr, J Sun", "year": 2021, "citation_id": "bfdGsGUAAAAJ:5Ul4iDaHHb8C", "result_id": "bfdGsGUAAAAJ:5Ul4iDaHHb8C", "source": "scholar", "publication_info": {"summary": "IEEE Transactions on Pattern Analysis and Machine Intelligence, 2021"}, "publication": "IEEE Transactions on Pattern Analysis and Machine Intelligence, 2021", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=bfdGsGUAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=bfdGsGUAAAAJ:5Ul4iDaHHb8C"}, {"title": "SHARq: sharing recursive queries in relational databases", "authors": "LC Scabora, G Spadon, MT Cazzolato, DS Kaster, AJM Traina, ...", "year": 2021, "citation_id": "bfdGsGUAAAAJ:geHnlv5EZngC", "result_id": "bfdGsGUAAAAJ:geHnlv5EZngC", "source": "scholar", "publication_info": {"summary": "Proceedings of the 36th Annual ACM Symposium on Applied Computing, 336-339, 2021"}, "publication": "Proceedings of the 36th Annual ACM Symposium on Applied Computing, 336-339, 2021", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=bfdGsGUAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=bfdGsGUAAAAJ:geHnlv5EZngC"}, {"title": "LIG-Doctor: Efficient patient trajectory prediction using bidirectional minimal gated-recurrent networks", "authors": "JF Rodrigues-Jr, MA Gutierrez, G Spadon, B Brandoli, S Amer-Yahia", "year": 2021, "citation_id": "bfdGsGUAAAAJ:B3FOqHPlNUQC", "result_id": "bfdGsGUAAAAJ:B3FOqHPlNUQC", "source": "scholar", "publication_info": {"summary": "Information Sciences 545, 813-827, 2021"}, "publication": "Information Sciences 545, 813-827, 2021", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=bfdGsGUAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=bfdGsGUAAAAJ:B3FOqHPlNUQC"}, {"title": "From Cities to Series: Complex Networks and Deep Learning for Improved Spatial and Temporal Analytics", "authors": "G Spadon", "year": 2021, "citation_id": "bfdGsGUAAAAJ:2KloaMYe4IUC", "result_id": "bfdGsGUAAAAJ:2KloaMYe4IUC", "source": "scholar", "publication_info": {"summary": "Universidade de S\u00e3o Paulo (USP). Instituto de Ci\u00eancias Matem\u00e1ticas e de \u2026, 2021"}, "publication": "Universidade de S\u00e3o Paulo (USP). Instituto de Ci\u00eancias Matem\u00e1ticas e de \u2026, 2021", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=bfdGsGUAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=bfdGsGUAAAAJ:2KloaMYe4IUC"}, {"title": "DropLeaf: A precision farming smartphone tool for real-time quantification of pesticide application coverage", "authors": "B Brandoli, G Spadon, T Esau, P Hennessy, ACPL Carvalho, ...", "year": 2021, "citation_id": "bfdGsGUAAAAJ:sSrBHYA8nusC", "result_id": "bfdGsGUAAAAJ:sSrBHYA8nusC", "source": "scholar", "publication_info": {"summary": "Computers and Electronics in Agriculture 180, 105906, 2021"}, "publication": "Computers and Electronics in Agriculture 180, 105906, 2021", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=bfdGsGUAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=bfdGsGUAAAAJ:sSrBHYA8nusC"}, {"title": "Lig-Doctor: real-world clinical prognosis using a bi-directional neural network", "authors": "JF Rodrigues, G Spadon, B Brandoli, S Amer-Yahia", "year": 2020, "citation_id": "bfdGsGUAAAAJ:vRqMK49ujn8C", "result_id": "bfdGsGUAAAAJ:vRqMK49ujn8C", "source": "scholar", "publication_info": {"summary": "2020 IEEE 33rd International Symposium on Computer-Based Medical Systems \u2026, 2020"}, "publication": "2020 IEEE 33rd International Symposium on Computer-Based Medical Systems \u2026, 2020", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=bfdGsGUAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=bfdGsGUAAAAJ:vRqMK49ujn8C"}, {"title": "Enhancing recursive graph querying on RDBMS with data clustering approaches", "authors": "LC Scabora, G Spadon, PH Oliveira, JF Rodrigues-Jr, C Traina-Jr", "year": 2020, "citation_id": "bfdGsGUAAAAJ:Tiz5es2fbqcC", "result_id": "bfdGsGUAAAAJ:Tiz5es2fbqcC", "source": "scholar", "publication_info": {"summary": "Proceedings of the 35th Annual ACM Symposium on Applied Computing, 404-411, 2020"}, "publication": "Proceedings of the 35th Annual ACM Symposium on Applied Computing, 404-411, 2020", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=bfdGsGUAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=bfdGsGUAAAAJ:Tiz5es2fbqcC"}, {"title": "Patient trajectory prediction in the Mimic-III dataset, challenges and pitfalls", "authors": "JF Rodrigues-Jr, G Spadon, B Brandoli, S Amer-Yahia", "year": 2019, "citation_id": "bfdGsGUAAAAJ:u9iWguZQMMsC", "result_id": "bfdGsGUAAAAJ:u9iWguZQMMsC", "source": "scholar", "publication_info": {"summary": "arXiv preprint arXiv:1909.04605, 2019"}, "publication": "arXiv preprint arXiv:1909.04605, 2019", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=bfdGsGUAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=bfdGsGUAAAAJ:u9iWguZQMMsC"}, {"title": "Reconstructing commuters network using machine learning and urban indicators", "authors": "G Spadon, AC Carvalho, JF Rodrigues-Jr, LGA Alves", "year": 2019, "citation_id": "bfdGsGUAAAAJ:p2g8aNsByqUC", "result_id": "bfdGsGUAAAAJ:p2g8aNsByqUC", "source": "scholar", "publication_info": {"summary": "Scientific reports 9 (1), 11801, 2019"}, "publication": "Scientific reports 9 (1), 11801, 2019", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=bfdGsGUAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=bfdGsGUAAAAJ:p2g8aNsByqUC"}, {"title": "G-franc: a dataset of criminal activities mapped as a complex network in a relational dbms", "authors": "LC Scabora, G Spadon, LS Rodrigues, MT Cazzolato, MVS Ara\u00fajo, ...", "year": 2019, "citation_id": "bfdGsGUAAAAJ:5ugPr518TE4C", "result_id": "bfdGsGUAAAAJ:5ugPr518TE4C", "source": "scholar", "publication_info": {"summary": "Proceedings Companion, 2019"}, "publication": "Proceedings Companion, 2019", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=bfdGsGUAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=bfdGsGUAAAAJ:5ugPr518TE4C"}, {"title": "Detecting multi-scale distance-based inconsistencies in cities through complex-networks", "authors": "G Spadon, B Brandoli, DM Eler, JF Rodrigues-Jr", "year": 2019, "citation_id": "bfdGsGUAAAAJ:dshw04ExmUIC", "result_id": "bfdGsGUAAAAJ:dshw04ExmUIC", "source": "scholar", "publication_info": {"summary": "Journal of computational science 30, 209-222, 2019"}, "publication": "Journal of computational science 30, 209-222, 2019", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=bfdGsGUAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=bfdGsGUAAAAJ:dshw04ExmUIC"}, {"title": "A comparative analysis of the automatic modeling of Learning Styles through Machine Learning techniques", "authors": "LD Ferreira, G Spadon, AC Carvalho, JF Rodrigues", "year": 2018, "citation_id": "bfdGsGUAAAAJ:OU6Ihb5iCvQC", "result_id": "bfdGsGUAAAAJ:OU6Ihb5iCvQC", "source": "scholar", "publication_info": {"summary": "2018 IEEE Frontiers in Education Conference (FIE), 1-8, 2018"}, "publication": "2018 IEEE Frontiers in Education Conference (FIE), 1-8, 2018", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=bfdGsGUAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=bfdGsGUAAAAJ:OU6Ihb5iCvQC"}, {"title": "Computer-assisted city touring for explorers", "authors": "G Spadon, JF Rodrigues-Jr", "year": 2018, "citation_id": "bfdGsGUAAAAJ:xtRiw3GOFMkC", "result_id": "bfdGsGUAAAAJ:xtRiw3GOFMkC", "source": "scholar", "publication_info": {"summary": "Workshop on Big Social Data and Urban Computing co-located with BiDU 2018 at \u2026, 2018"}, "publication": "Workshop on Big Social Data and Urban Computing co-located with BiDU 2018 at \u2026, 2018", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=bfdGsGUAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=bfdGsGUAAAAJ:xtRiw3GOFMkC"}, {"title": "Caracteriza\u00e7\u00e3o Topol\u00f3gica de Redes Vi\u00e1rias por Meio da An\u00e1lise de Vetores de Caracter\u00edsticas e T\u00e9cnicas de Agrupamento.", "authors": "G Spadon, LC Scabora, MR Nesso Jr, C Traina Jr, JF Rodrigues Jr", "year": 2018, "citation_id": "bfdGsGUAAAAJ:UxriW0iASnsC", "result_id": "bfdGsGUAAAAJ:UxriW0iASnsC", "source": "scholar", "publication_info": {"summary": "SBBD 18, 157-168, 2018"}, "publication": "SBBD 18, 157-168, 2018", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=bfdGsGUAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=bfdGsGUAAAAJ:UxriW0iASnsC"}, {"title": "Recognition of endangered pantanal animal species using deep learning methods", "authors": "MS de Arruda, G Spadon, JF Rodrigues, WN Gon\u00e7alves, BB Machado", "year": 2018, "citation_id": "bfdGsGUAAAAJ:NhqRSupF_l8C", "result_id": "bfdGsGUAAAAJ:NhqRSupF_l8C", "source": "scholar", "publication_info": {"summary": "2018 International Joint Conference on Neural Networks (IJCNN), 1-8, 2018"}, "publication": "2018 International Joint Conference on Neural Networks (IJCNN), 1-8, 2018", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=bfdGsGUAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=bfdGsGUAAAAJ:NhqRSupF_l8C"}, {"title": "Cutting-edge relational graph data management with edge-k: from one to multiple edges in the same row", "authors": "LC Scabora, PH Oliveira, G Spadon, DS Kaster, JF Rodrigues-Jr, ...", "year": 2018, "citation_id": "bfdGsGUAAAAJ:uWQEDVKXjbEC", "result_id": "bfdGsGUAAAAJ:uWQEDVKXjbEC", "source": "scholar", "publication_info": {"summary": "Journal of Information and Data Management 9 (1), 20-20, 2018"}, "publication": "Journal of Information and Data Management 9 (1), 20-20, 2018", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=bfdGsGUAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=bfdGsGUAAAAJ:uWQEDVKXjbEC"}, {"title": "Rafiki: Retrieval-based application for imaging and knowledge investigation", "authors": "MR Nesso, MT Cazzolato, LC Scabora, PH Oliveira, G Spadon, ...", "year": 2018, "citation_id": "bfdGsGUAAAAJ:abG-DnoFyZgC", "result_id": "bfdGsGUAAAAJ:abG-DnoFyZgC", "source": "scholar", "publication_info": {"summary": "2018 IEEE 31st International Symposium on Computer-Based Medical Systems \u2026, 2018"}, "publication": "2018 IEEE 31st International Symposium on Computer-Based Medical Systems \u2026, 2018", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=bfdGsGUAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=bfdGsGUAAAAJ:abG-DnoFyZgC"}, {"title": "Topological street-network characterization through feature-vector and cluster analysis", "authors": "G Spadon, G Gimenes, JF Rodrigues Jr", "year": 2018, "citation_id": "bfdGsGUAAAAJ:b0M2c_1WBrUC", "result_id": "bfdGsGUAAAAJ:b0M2c_1WBrUC", "source": "scholar", "publication_info": {"summary": "International Conference on Computational Science, 274-287, 2018"}, "publication": "International Conference on Computational Science, 274-287, 2018", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=bfdGsGUAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=bfdGsGUAAAAJ:b0M2c_1WBrUC"}, {"title": "A distance-based tool-set to track inconsistent urban structures through complex-networks", "authors": "G Spadon, BB Machado, DM Eler, JF Rodrigues Jr", "year": 2018, "citation_id": "bfdGsGUAAAAJ:_xSYboBqXhAC", "result_id": "bfdGsGUAAAAJ:_xSYboBqXhAC", "source": "scholar", "publication_info": {"summary": "International Conference on Computational Science, 288-301, 2018"}, "publication": "International Conference on Computational Science, 288-301, 2018", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=bfdGsGUAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=bfdGsGUAAAAJ:_xSYboBqXhAC"}, {"title": "Hadoop Cluster Deployment: A Methodological Approach", "authors": "R Correia, G Spadon, P De Andrade Gomes, D Eler, R Garcia, ...", "year": 2018, "citation_id": "bfdGsGUAAAAJ:EUQCXRtRnyEC", "result_id": "bfdGsGUAAAAJ:EUQCXRtRnyEC", "source": "scholar", "publication_info": {"summary": "Information 9 (6), 131-141, 2018"}, "publication": "Information 9 (6), 131-141, 2018", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=bfdGsGUAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=bfdGsGUAAAAJ:EUQCXRtRnyEC"}, {"title": "Internet-based education: a new milestone for formal language and automata courses", "authors": "JEM Rocha, C Olivete, PHA Gomes, RE Garcia, RCM Correia, ...", "year": 2018, "citation_id": "bfdGsGUAAAAJ:tOudhMTPpwUC", "result_id": "bfdGsGUAAAAJ:tOudhMTPpwUC", "source": "scholar", "publication_info": {"summary": "Information Technology-New Generations: 15th International Conference on \u2026, 2018"}, "publication": "Information Technology-New Generations: 15th International Conference on \u2026, 2018", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=bfdGsGUAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=bfdGsGUAAAAJ:tOudhMTPpwUC"}, {"title": "A smartphone application to measure the quality of pest control spraying machines via image analysis", "authors": "BB Machado, G Spadon, MS Arruda, WN Goncalves, AC Carvalho, ...", "year": 2018, "citation_id": "bfdGsGUAAAAJ:e5wmG9Sq2KIC", "result_id": "bfdGsGUAAAAJ:e5wmG9Sq2KIC", "source": "scholar", "publication_info": {"summary": "Proceedings of the 33rd Annual ACM Symposium on Applied Computing, 956-963, 2018"}, "publication": "Proceedings of the 33rd Annual ACM Symposium on Applied Computing, 956-963, 2018", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=bfdGsGUAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=bfdGsGUAAAAJ:e5wmG9Sq2KIC"}, {"title": "Teaching software quality via source code inspection tool", "authors": "PH de Andrade Gomes, RE Garcia, G Spadon, DM Eler, C Olivete, ...", "year": 2017, "citation_id": "bfdGsGUAAAAJ:_Qo2XoVZTnwC", "result_id": "bfdGsGUAAAAJ:_Qo2XoVZTnwC", "source": "scholar", "publication_info": {"summary": "2017 IEEE Frontiers in Education Conference (FIE), 1-8, 2017"}, "publication": "2017 IEEE Frontiers in Education Conference (FIE), 1-8, 2017", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=bfdGsGUAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=bfdGsGUAAAAJ:_Qo2XoVZTnwC"}, {"title": "Characterization of mobility patterns and collective behavior through the analytical processing of real-world complex networks", "authors": "GS de Souza", "year": 2017, "citation_id": "bfdGsGUAAAAJ:mB3voiENLucC", "result_id": "bfdGsGUAAAAJ:mB3voiENLucC", "source": "scholar", "publication_info": {"summary": "Universidade de S\u00e3o Paulo, 2017"}, "publication": "Universidade de S\u00e3o Paulo, 2017", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=bfdGsGUAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=bfdGsGUAAAAJ:mB3voiENLucC"}, {"title": "Teaching distributed systems using hadoop", "authors": "RCM Correia, G Spadon, DM Eler, C Olivete Jr, RE Garcia", "year": 2017, "citation_id": "bfdGsGUAAAAJ:bFI3QPDXJZMC", "result_id": "bfdGsGUAAAAJ:bFI3QPDXJZMC", "source": "scholar", "publication_info": {"summary": "Information Technology-New Generations: 14th International Conference on \u2026, 2017"}, "publication": "Information Technology-New Generations: 14th International Conference on \u2026, 2017", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=bfdGsGUAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=bfdGsGUAAAAJ:bFI3QPDXJZMC"}, {"title": "Complex-network tools to understand the behavior of criminality in urban areas", "authors": "G Spadon, LC Scabora, MVS Araujo, PH Oliveir, BB Machado, ...", "year": 2017, "citation_id": "bfdGsGUAAAAJ:3fE2CSJIrl8C", "result_id": "bfdGsGUAAAAJ:3fE2CSJIrl8C", "source": "scholar", "publication_info": {"summary": "Information technology-new generations: 14th international conference on \u2026, 2017"}, "publication": "Information technology-new generations: 14th international conference on \u2026, 2017", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=bfdGsGUAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=bfdGsGUAAAAJ:3fE2CSJIrl8C"}, {"title": "Data mining on LinkedIn data to define professional profile via MineraSkill methodology", "authors": "DCMF Caldeira, RCM Correia, G Spadon, DM Eler, C Olivete-Jr, ...", "year": 2017, "citation_id": "bfdGsGUAAAAJ:mVmsd5A6BfQC", "result_id": "bfdGsGUAAAAJ:mVmsd5A6BfQC", "source": "scholar", "publication_info": {"summary": "2017 12th Iberian Conference on Information Systems and Technologies (CISTI \u2026, 2017"}, "publication": "2017 12th Iberian Conference on Information Systems and Technologies (CISTI \u2026, 2017", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=bfdGsGUAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=bfdGsGUAAAAJ:mVmsd5A6BfQC"}, {"title": "Prediction of winners in MOBA games", "authors": "CEM Almeida, RCM Correia, DM Eler, C Olivete-Jr, RE Garci, LC Scabora, ...", "year": 2017, "citation_id": "bfdGsGUAAAAJ:Wp0gIr-vW9MC", "result_id": "bfdGsGUAAAAJ:Wp0gIr-vW9MC", "source": "scholar", "publication_info": {"summary": "2017 12th Iberian Conference on Information Systems and Technologies (CISTI \u2026, 2017"}, "publication": "2017 12th Iberian Conference on Information Systems and Technologies (CISTI \u2026, 2017", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=bfdGsGUAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=bfdGsGUAAAAJ:Wp0gIr-vW9MC"}, {"title": "Data bases available through APIs using Restify: Characteristics, programming models, and benchmarks", "authors": "LF Marques, RCM Correia, G Spadon, DM Eler, C Olivete-Jr, RE Garcia", "year": 2017, "citation_id": "bfdGsGUAAAAJ:4DMP91E08xMC", "result_id": "bfdGsGUAAAAJ:4DMP91E08xMC", "source": "scholar", "publication_info": {"summary": "2017 12th Iberian Conference on Information Systems and Technologies (CISTI \u2026, 2017"}, "publication": "2017 12th Iberian Conference on Information Systems and Technologies (CISTI \u2026, 2017", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=bfdGsGUAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=bfdGsGUAAAAJ:4DMP91E08xMC"}, {"title": "Behavioral characterization of criminality spread in cities", "authors": "G Spadon, LC Scabora, PH Oliveira, MVS Araujo, BB Machado, ...", "year": 2017, "citation_id": "bfdGsGUAAAAJ:aqlVkmm33-oC", "result_id": "bfdGsGUAAAAJ:aqlVkmm33-oC", "source": "scholar", "publication_info": {"summary": "Procedia Computer Science 108, 2537-2541, 2017"}, "publication": "Procedia Computer Science 108, 2537-2541, 2017", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=bfdGsGUAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=bfdGsGUAAAAJ:aqlVkmm33-oC"}, {"title": "Identifying urban inconsistencies via street networks", "authors": "G Spadon, G Gimenes, JF Rodrigues-Jr", "year": 2017, "citation_id": "bfdGsGUAAAAJ:qxL8FJ1GzNcC", "result_id": "bfdGsGUAAAAJ:qxL8FJ1GzNcC", "source": "scholar", "publication_info": {"summary": "Procedia Computer Science 108, 18-27, 2017"}, "publication": "Procedia Computer Science 108, 18-27, 2017", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=bfdGsGUAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=bfdGsGUAAAAJ:qxL8FJ1GzNcC"}, {"title": "Combined methodology for theoretical computing", "authors": "GS De Souza, PH de Andrade Gomes, RCM Correia, C Olivete, DM Eler, ...", "year": 2016, "citation_id": "bfdGsGUAAAAJ:cFHS6HbyZ2cC", "result_id": "bfdGsGUAAAAJ:cFHS6HbyZ2cC", "source": "scholar", "publication_info": {"summary": "2016 IEEE Frontiers in Education Conference (FIE), 1-7, 2016"}, "publication": "2016 IEEE Frontiers in Education Conference (FIE), 1-7, 2016", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=bfdGsGUAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=bfdGsGUAAAAJ:cFHS6HbyZ2cC"}, {"title": "Health information system for medical survey analysis", "authors": "GS de Souza, RCM Correia, RE Garcia, C Olivete, BRG Santos", "year": 2016, "citation_id": "bfdGsGUAAAAJ:WbkHhVStYXYC", "result_id": "bfdGsGUAAAAJ:WbkHhVStYXYC", "source": "scholar", "publication_info": {"summary": "2016 11th Iberian Conference on Information Systems and Technologies (CISTI \u2026, 2016"}, "publication": "2016 11th Iberian Conference on Information Systems and Technologies (CISTI \u2026, 2016", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=bfdGsGUAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=bfdGsGUAAAAJ:WbkHhVStYXYC"}, {"title": "Teaching-learning methodology for formal languages and automata theory", "authors": "GS De Souza, C Olivete, RCM Correia, RE Garcia", "year": 2015, "citation_id": "bfdGsGUAAAAJ:yD5IFk8b50cC", "result_id": "bfdGsGUAAAAJ:yD5IFk8b50cC", "source": "scholar", "publication_info": {"summary": "2015 IEEE Frontiers in Education Conference (FIE), 1-7, 2015"}, "publication": "2015 IEEE Frontiers in Education Conference (FIE), 1-7, 2015", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=bfdGsGUAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=bfdGsGUAAAAJ:yD5IFk8b50cC"}, {"title": "Uma janela para o mundo: uso da internet e a promo\u00e7\u00e3o da sa\u00fade de pacientes com ELA", "authors": "CR Simon, RB Guimar\u00e3es, GS de Souza", "year": 2015, "citation_id": "bfdGsGUAAAAJ:wbdj-CoPYUoC", "result_id": "bfdGsGUAAAAJ:wbdj-CoPYUoC", "source": "scholar", "publication_info": {"summary": "IV For\u00fam Internacional de Geografia da Sa\u00fade, 2015"}, "publication": "IV For\u00fam Internacional de Geografia da Sa\u00fade, 2015", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=bfdGsGUAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=bfdGsGUAAAAJ:wbdj-CoPYUoC"}, {"title": "Visualiza\u00e7\u00e3o e an\u00e1lise espacial de dados epidemiol\u00f3gicos no espa\u00e7o: Interpola\u00e7\u00e3o da preval\u00eancia de casos de LVC em Presidente Prudente \u2013 SP", "authors": "PSS Matsumoto, GS Souza, RB Guimar\u00e3es", "year": 2015, "citation_id": "bfdGsGUAAAAJ:0EnyYjriUFMC", "result_id": "bfdGsGUAAAAJ:0EnyYjriUFMC", "source": "scholar", "publication_info": {"summary": "IV For\u00fam Internacional de Geografia da Sa\u00fade, 2015"}, "publication": "IV For\u00fam Internacional de Geografia da Sa\u00fade, 2015", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=bfdGsGUAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=bfdGsGUAAAAJ:0EnyYjriUFMC"}, {"title": "Scalable information system using event oriented programming and NoSQL", "authors": "VJ Santana, GS de Souza, RCM Correia, RE Garcia, DM Eler, C Olivete", "year": 2015, "citation_id": "bfdGsGUAAAAJ:pyW8ca7W8N0C", "result_id": "bfdGsGUAAAAJ:pyW8ca7W8N0C", "source": "scholar", "publication_info": {"summary": "2015 10th Iberian Conference on Information Systems and Technologies (CISTI \u2026, 2015"}, "publication": "2015 10th Iberian Conference on Information Systems and Technologies (CISTI \u2026, 2015", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=bfdGsGUAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=bfdGsGUAAAAJ:pyW8ca7W8N0C"}, {"title": "Simulation and analysis applied on virtualization to build Hadoop clusters", "authors": "GS de Souza, RCM Correia, RE Garcia, C Olivete", "year": 2015, "citation_id": "bfdGsGUAAAAJ:a0OBvERweLwC", "result_id": "bfdGsGUAAAAJ:a0OBvERweLwC", "source": "scholar", "publication_info": {"summary": "2015 10th Iberian Conference on Information Systems and Technologies (CISTI \u2026, 2015"}, "publication": "2015 10th Iberian Conference on Information Systems and Technologies (CISTI \u2026, 2015", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=bfdGsGUAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=bfdGsGUAAAAJ:a0OBvERweLwC"}, {"title": "Minera\u00e7\u00e3o de Dados no LinkedIn para Defini\u00e7\u00e3o do Perfil Profissional com a Metodologia MineraSkill Data Mining on LinkedIn Data to Define Professional Profile via MineraSkill \u2026", "authors": "DCMF Caldeira, RCM Correia, G Spadon, DM Eler, C Olivete-Jr, ...", "year": "", "citation_id": "bfdGsGUAAAAJ:NJ774b8OgUMC", "result_id": "bfdGsGUAAAAJ:NJ774b8OgUMC", "source": "scholar", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=bfdGsGUAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=bfdGsGUAAAAJ:NJ774b8OgUMC"}, {"title": "Predi\u00e7\u00e3o de Vencedores em Jogos MOBA Prediction of Winners in MOBA Games", "authors": "CEM Almeida, RCM Correia, DM Eler, C Olivete-Jr, RE Garcia, ...", "year": "", "citation_id": "bfdGsGUAAAAJ:kzcrU_BdoSEC", "result_id": "bfdGsGUAAAAJ:kzcrU_BdoSEC", "source": "scholar", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=bfdGsGUAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=bfdGsGUAAAAJ:kzcrU_BdoSEC"}], "search_metadata": {"status": "Success", "source": "serpapi"}}} \ No newline at end of file diff --git a/data/api_cache/serpapi_publications/3e9961df399037871c58882616dd57c1cf9a1cdb7ad22d71a307e72eca4e6388.json b/data/api_cache/serpapi_publications/3e9961df399037871c58882616dd57c1cf9a1cdb7ad22d71a307e72eca4e6388.json index c70d403a..fdd79494 100644 --- a/data/api_cache/serpapi_publications/3e9961df399037871c58882616dd57c1cf9a1cdb7ad22d71a307e72eca4e6388.json +++ b/data/api_cache/serpapi_publications/3e9961df399037871c58882616dd57c1cf9a1cdb7ad22d71a307e72eca4e6388.json @@ -1 +1 @@ -{"timestamp": 1772377543.1743279, "ttl_days": 60, "data": {"articles": [{"title": "Generating a knowledge graph to understand the mechanistic relationships between multimorbid diabetes, hypertension and kidney diseases", "authors": "CE Egwuatu, A Daowd, S Abidi, SSR Abidi", "year": 2025, "citation_id": "fzr2PUYAAAAJ:PkcyUWeTMh0C", "result_id": "fzr2PUYAAAAJ:PkcyUWeTMh0C", "source": "scholar", "publication_info": {"summary": "Proceedings of the 2025 18th Health Informatics Knowledge Management \u2026, 2025"}, "publication": "Proceedings of the 2025 18th Health Informatics Knowledge Management \u2026, 2025", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:PkcyUWeTMh0C"}, {"title": "Concept-Level Local Explanations of Kidney Transplant Survival Predictions by Black-Box ML Models", "authors": "J Rad, SAA Naqvi, K Tennankore, S Abidi, A Vinson, SSR Abidi", "year": 2025, "citation_id": "fzr2PUYAAAAJ:JTqpx9DYBaYC", "result_id": "fzr2PUYAAAAJ:JTqpx9DYBaYC", "source": "scholar", "publication_info": {"summary": "Proceedings of the 2025 18th Health Informatics Knowledge Management \u2026, 2025"}, "publication": "Proceedings of the 2025 18th Health Informatics Knowledge Management \u2026, 2025", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:JTqpx9DYBaYC"}, {"title": "A Roadmap towards Scaling, Reasoning and Self-Evolving Foundation Model for Nuclear and Particle Physics", "authors": "Y Ren, JD Osborn, E Brost, H Yu, S Abidi, Y Go, P Boyle, J Huang, ...", "year": 2025, "citation_id": "fzr2PUYAAAAJ:69ZgNCALVd0C", "result_id": "fzr2PUYAAAAJ:69ZgNCALVd0C", "source": "scholar", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:69ZgNCALVd0C"}, {"title": "A reinforcement learning framework for optimizing kidney allocation for transplant based on survival and ethical criteria", "authors": "SAA Naqvi, K Tennankore, G Worthen, A Vinson, SSR Abidi", "year": 2025, "citation_id": "fzr2PUYAAAAJ:SGW5VrABaM0C", "result_id": "fzr2PUYAAAAJ:SGW5VrABaM0C", "source": "scholar", "publication_info": {"summary": "International Conference on Artificial Intelligence in Medicine, 323-332, 2025"}, "publication": "International Conference on Artificial Intelligence in Medicine, 323-332, 2025", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:SGW5VrABaM0C"}, {"title": "Using Word Embeddings to Extract Semantic Relations from Biomedical Texts: Towards Literature-Based Discovery", "authors": "W Van Woensel, SS Pradeep, A Daowd, S Abidi, SSR Abidi", "year": 2025, "citation_id": "fzr2PUYAAAAJ:pS0ncopqnHgC", "result_id": "fzr2PUYAAAAJ:pS0ncopqnHgC", "source": "scholar", "publication_info": {"summary": "International Conference on Artificial Intelligence in Medicine, 422-427, 2025"}, "publication": "International Conference on Artificial Intelligence in Medicine, 422-427, 2025", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:pS0ncopqnHgC"}, {"title": "Longitudinal Trends of Depression in Traumatic Brain Injury: The Role of Individual Heterogeneity in Clinical Prediction", "authors": "N Kureshi, DB Clarke, A Nunes, C Feng, SSR Abidi", "year": 2025, "citation_id": "fzr2PUYAAAAJ:EPG8bYD4jVwC", "result_id": "fzr2PUYAAAAJ:EPG8bYD4jVwC", "source": "scholar", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:EPG8bYD4jVwC"}, {"title": "Donor-Recipient Matching for Kidney Transplantation Using Uncertainty Estimation in Generalized Propensity Score", "authors": "SAA Naqvi, K Tennankore, S Abidi, A Vinson, G Worthen, SSR Abidi", "year": 2025, "citation_id": "fzr2PUYAAAAJ:2l5NCbZemmgC", "result_id": "fzr2PUYAAAAJ:2l5NCbZemmgC", "source": "scholar", "publication_info": {"summary": "Studies in health technology and informatics 327, 537-541, 2025"}, "publication": "Studies in health technology and informatics 327, 537-541, 2025", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:2l5NCbZemmgC"}, {"title": "Using Unsupervised Clustering to Characterize Phenotypes Among Older Kidney Transplant Recipients: A Cohort Study", "authors": "S Singh, SSR Abidi, SAA Naqvi, AJ Vinson, TAA Skinner, G Worthen, ...", "year": 2025, "citation_id": "fzr2PUYAAAAJ:BrOSOlqYqPUC", "result_id": "fzr2PUYAAAAJ:BrOSOlqYqPUC", "source": "scholar", "publication_info": {"summary": "Canadian Journal of Kidney Health and Disease 12, 20543581251322576, 2025"}, "publication": "Canadian Journal of Kidney Health and Disease 12, 20543581251322576, 2025", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:BrOSOlqYqPUC"}, {"title": "A Heterogeneous Bipartite Graph Framework for Donor-Recipient Matching in Kidney Transplantation", "authors": "S Majouni, K Tennankore, S Abidi, A Vinson, G Worthen, SSR Abidi", "year": 2025, "citation_id": "fzr2PUYAAAAJ:An6A6Jpfc1oC", "result_id": "fzr2PUYAAAAJ:An6A6Jpfc1oC", "source": "scholar", "publication_info": {"summary": "Intelligent Health Systems\u2013From Technology to Data and Knowledge, 532-536, 2025"}, "publication": "Intelligent Health Systems\u2013From Technology to Data and Knowledge, 532-536, 2025", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:An6A6Jpfc1oC"}, {"title": "Optimizing prescribing for individuals with type 2 diabetes and chronic kidney disease through the development and validation of algorithms for community pharmacists", "authors": "J Morris, M Battistella, K Tennankore, S Soroka, C Kendell, P Poyah, ...", "year": 2025, "citation_id": "fzr2PUYAAAAJ:kF1pexMAQbMC", "result_id": "fzr2PUYAAAAJ:kF1pexMAQbMC", "source": "scholar", "publication_info": {"summary": "Canadian Journal of Kidney Health and Disease 12, 20543581241309974, 2025"}, "publication": "Canadian Journal of Kidney Health and Disease 12, 20543581241309974, 2025", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:kF1pexMAQbMC"}, {"title": "Investigating the influence of socioeconomic deprivation on spatial patterns of traumatic brain injuries through Bayesian spatial modeling", "authors": "N Kureshi, SSR Abidi, DB Clarke, W Zeng, C Feng", "year": 2024, "citation_id": "fzr2PUYAAAAJ:WAzi4Gm8nLoC", "result_id": "fzr2PUYAAAAJ:WAzi4Gm8nLoC", "source": "scholar", "publication_info": {"summary": "GeoJournal 89 (6), 238, 2024"}, "publication": "GeoJournal 89 (6), 238, 2024", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:WAzi4Gm8nLoC"}, {"title": "Risk stratification of new-onset psychiatric disorders using clinically distinct traumatic brain injury phenotypes", "authors": "N Kureshi, A Nunes, C Feng, DB Clarke, SSR Abidi", "year": 2024, "citation_id": "fzr2PUYAAAAJ:ziOE8S1-AIUC", "result_id": "fzr2PUYAAAAJ:ziOE8S1-AIUC", "source": "scholar", "publication_info": {"summary": "Archives of Public Health 82 (1), 116, 2024"}, "publication": "Archives of Public Health 82 (1), 116, 2024", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:ziOE8S1-AIUC"}, {"title": "A Topological Data Analysis of Un met Health Care Needs Among Injured Patients", "authors": "N Kureshi, SSR Abidi", "year": 2024, "citation_id": "fzr2PUYAAAAJ:YsrPvlHIBpEC", "result_id": "fzr2PUYAAAAJ:YsrPvlHIBpEC", "source": "scholar", "publication_info": {"summary": "2024 IEEE 12th International Conference on Healthcare Informatics (ICHI \u2026, 2024"}, "publication": "2024 IEEE 12th International Conference on Healthcare Informatics (ICHI \u2026, 2024", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:YsrPvlHIBpEC"}, {"title": "Extracting Decision Paths via Surrogate Modeling for Explainability of Black Box Classifiers", "authors": "J Rad, K Tennankore, S Abidi, SSR Abidi", "year": 2024, "citation_id": "fzr2PUYAAAAJ:raTqNPD5sRQC", "result_id": "fzr2PUYAAAAJ:raTqNPD5sRQC", "source": "scholar", "publication_info": {"summary": "2024 11th IEEE Swiss Conference on Data Science (SDS), 213-220, 2024"}, "publication": "2024 11th IEEE Swiss Conference on Data Science (SDS), 213-220, 2024", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:raTqNPD5sRQC"}, {"title": "Risk Stratification of New-Onset Psychiatric Disorders Using Clinically Distinct Traumatic Brain Injury Sub-Phenotypes", "authors": "N Kureshi, A Nunes, C Feng, DB Clarke, SSR Abidi", "year": 2024, "citation_id": "fzr2PUYAAAAJ:mUJArPsKIAAC", "result_id": "fzr2PUYAAAAJ:mUJArPsKIAAC", "source": "scholar", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:mUJArPsKIAAC"}, {"title": "Plausible reasoning over large health datasets: A novel approach to data analytics leveraging semantics", "authors": "H Mohammadhassanzadeh, SR Abidi, SSR Abidi", "year": 2024, "citation_id": "fzr2PUYAAAAJ:3bvyWxjaHKcC", "result_id": "fzr2PUYAAAAJ:3bvyWxjaHKcC", "source": "scholar", "publication_info": {"summary": "Knowledge-Based Systems 289, 111493, 2024"}, "publication": "Knowledge-Based Systems 289, 111493, 2024", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:3bvyWxjaHKcC"}, {"title": "Spatial hotspots and sociodemographic profiles associated with traumatic brain injury in Nova Scotia", "authors": "N Kureshi, SSR Abidi, DB Clarke, W Zeng, C Feng", "year": 2024, "citation_id": "fzr2PUYAAAAJ:pAkWuXOU-OoC", "result_id": "fzr2PUYAAAAJ:pAkWuXOU-OoC", "source": "scholar", "publication_info": {"summary": "Journal of neurotrauma 41 (7-8), 844-861, 2024"}, "publication": "Journal of neurotrauma 41 (7-8), 844-861, 2024", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:pAkWuXOU-OoC"}, {"title": "Utilizing Topological Clustering on a Traumatic Brain Injury Cohort: The Association of Neighborhood Socioeconomic Deprivation Profiles with Injury Mortality", "authors": "N Kureshi, DB Clarke, SSR Abidi", "year": 2024, "citation_id": "fzr2PUYAAAAJ:-nhnvRiOwuoC", "result_id": "fzr2PUYAAAAJ:-nhnvRiOwuoC", "source": "scholar", "publication_info": {"summary": "Proceedings of the 2024 Australasian Computer Science Week, 108-114, 2024"}, "publication": "Proceedings of the 2024 Australasian Computer Science Week, 108-114, 2024", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:-nhnvRiOwuoC"}, {"title": "Stone clearance rate in patients treated with open surgery versus percutaneous nephrolithotomy for the management of staghorn renal calculi.", "authors": "A Khan, S Abidi, H Akhter, S Therani, U Qamar, M Zulfiqar, S Rabiullah, ...", "year": 2024, "citation_id": "fzr2PUYAAAAJ:DrR-2ekChdkC", "result_id": "fzr2PUYAAAAJ:DrR-2ekChdkC", "source": "scholar", "publication_info": {"summary": "International Journal of Endorsing Health Science Research 12 (1), 11-17, 2024"}, "publication": "International Journal of Endorsing Health Science Research 12 (1), 11-17, 2024", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:DrR-2ekChdkC"}, {"title": "Characterizing cluster-based frailty phenotypes in a multicenter prospective cohort of kidney transplant candidates", "authors": "SHR Abidi, N Zincir-Heywood, SSR Abidi, K Jalakam, S Abidi, ...", "year": 2024, "citation_id": "fzr2PUYAAAAJ:w0F2JDEymm0C", "result_id": "fzr2PUYAAAAJ:w0F2JDEymm0C", "source": "scholar", "publication_info": {"summary": "MEDINFO 2023\u2014The Future Is Accessible, 896-900, 2024"}, "publication": "MEDINFO 2023\u2014The Future Is Accessible, 896-900, 2024", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:w0F2JDEymm0C"}, {"title": "Ensemble Clustering to Generate Phenotypes of Kidney Transplant Donors and Recipients", "authors": "SSR Abidi, K Jalakam, SHR Abidi, K Tennankore", "year": 2024, "citation_id": "fzr2PUYAAAAJ:FiDNX6EVdGUC", "result_id": "fzr2PUYAAAAJ:FiDNX6EVdGUC", "source": "scholar", "publication_info": {"summary": "MEDINFO 2023\u2014The Future Is Accessible, 1031-1035, 2024"}, "publication": "MEDINFO 2023\u2014The Future Is Accessible, 1031-1035, 2024", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:FiDNX6EVdGUC"}, {"title": "Predicting Urgent Dialysis at Ambulance Transport to the Emergency Department Using Machine Learning Methods", "authors": "S Majouni, K Tennankore, SSR Abidi", "year": 2024, "citation_id": "fzr2PUYAAAAJ:HhcuHIWmDEUC", "result_id": "fzr2PUYAAAAJ:HhcuHIWmDEUC", "source": "scholar", "publication_info": {"summary": "MEDINFO 2023\u2014The Future Is Accessible, 891-895, 2024"}, "publication": "MEDINFO 2023\u2014The Future Is Accessible, 891-895, 2024", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:HhcuHIWmDEUC"}, {"title": "Digital therapeutics for COPD patient self-management: needs analysis and design study", "authors": "SR Abidi, T Rickards, W Van Woensel, SSR Abidi", "year": 2024, "citation_id": "fzr2PUYAAAAJ:VN7nJs4JPk0C", "result_id": "fzr2PUYAAAAJ:VN7nJs4JPk0C", "source": "scholar", "publication_info": {"summary": "Stud Health Technol Inform 310, 209-213, 2024"}, "publication": "Stud Health Technol Inform 310, 209-213, 2024", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:VN7nJs4JPk0C"}, {"title": "Needs and expectations for artificial intelligence in emergency medicine according to Canadian physicians", "authors": "KW Eastwood, R May, P Andreou, S Abidi, SSR Abidi, OM Loubani", "year": 2023, "citation_id": "fzr2PUYAAAAJ:O0nohqN1r9EC", "result_id": "fzr2PUYAAAAJ:O0nohqN1r9EC", "source": "scholar", "publication_info": {"summary": "BMC Health Services Research 23 (1), 798, 2023"}, "publication": "BMC Health Services Research 23 (1), 798, 2023", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:O0nohqN1r9EC"}, {"title": "Multiview clustering to identify novel kidney donor phenotypes for assessing graft survival in older transplant recipients", "authors": "SSR Abidi, A Naqvi, G Worthen, A Vinson, S Abidi, B Kiberd, T Skinner, ...", "year": 2023, "citation_id": "fzr2PUYAAAAJ:sszUF3NjhM4C", "result_id": "fzr2PUYAAAAJ:sszUF3NjhM4C", "source": "scholar", "publication_info": {"summary": "Kidney360 4 (7), 951-961, 2023"}, "publication": "Kidney360 4 (7), 951-961, 2023", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:sszUF3NjhM4C"}, {"title": "Decentralized web-based clinical decision support using semantic glean workflows", "authors": "W Van Woensel, S Abidi, SSR Abidi", "year": 2023, "citation_id": "fzr2PUYAAAAJ:U_HPUtbDl20C", "result_id": "fzr2PUYAAAAJ:U_HPUtbDl20C", "source": "scholar", "publication_info": {"summary": "International Conference on Artificial Intelligence in Medicine, 362-367, 2023"}, "publication": "International Conference on Artificial Intelligence in Medicine, 362-367, 2023", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:U_HPUtbDl20C"}, {"title": "Support Using Semantic GLEAN Workflows", "authors": "W Van, S Abidi, SSR Abidi", "year": 2023, "citation_id": "fzr2PUYAAAAJ:NDuN12AVoxsC", "result_id": "fzr2PUYAAAAJ:NDuN12AVoxsC", "source": "scholar", "publication_info": {"summary": "Artificial Intelligence in Medicine: 21st International Conference on \u2026, 2023"}, "publication": "Artificial Intelligence in Medicine: 21st International Conference on \u2026, 2023", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:NDuN12AVoxsC"}, {"title": "Comparison of Closure versus Non-closure of Buccal Mucosal Graft Harvesting Site in Urethroplasty.", "authors": "A Shezad, T Gazder, S Rabiullah, M Zulfiqar, U Qamar, H Jameel, S Abidi, ...", "year": 2023, "citation_id": "fzr2PUYAAAAJ:oi2SiIJ9l4AC", "result_id": "fzr2PUYAAAAJ:oi2SiIJ9l4AC", "source": "scholar", "publication_info": {"summary": "International Journal of Endorsing Health Science Research 11 (2), 97-103, 2023"}, "publication": "International Journal of Endorsing Health Science Research 11 (2), 97-103, 2023", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:oi2SiIJ9l4AC"}, {"title": "A community-of-practice-based evaluation methodology for knowledge intensive computational methods and its application to multimorbidity decision support", "authors": "W Van Woensel, SW Tu, W Michalowski, SSR Abidi, S Abidi, JR Alonso, ...", "year": 2023, "citation_id": "fzr2PUYAAAAJ:PyEswDtIyv0C", "result_id": "fzr2PUYAAAAJ:PyEswDtIyv0C", "source": "scholar", "publication_info": {"summary": "Journal of Biomedical Informatics 142, 104395, 2023"}, "publication": "Journal of Biomedical Informatics 142, 104395, 2023", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:PyEswDtIyv0C"}, {"title": "Improving mental health literacy and reducing psychological problems among teachers in Zambia: Protocol for implementation and evaluation of a Wellness4Teachers email messaging \u2026", "authors": "B Agyapong, C Chishimba, Y Wei, R da Luz Dias, E Eboreime, E Msidi, ...", "year": 2023, "citation_id": "fzr2PUYAAAAJ:QyXJ3EUuO1IC", "result_id": "fzr2PUYAAAAJ:QyXJ3EUuO1IC", "source": "scholar", "publication_info": {"summary": "JMIR Research Protocols 12 (1), e44370, 2023"}, "publication": "JMIR Research Protocols 12 (1), e44370, 2023", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:QyXJ3EUuO1IC"}, {"title": "Validation of a flow\u2010cytometry\u2010based red blood cell antigen phenotyping method", "authors": "R Liwski, G Clarke, C Cheng, SSR Abidi, SR Abidi, JG Quinn", "year": 2023, "citation_id": "fzr2PUYAAAAJ:HGTzPopzzJcC", "result_id": "fzr2PUYAAAAJ:HGTzPopzzJcC", "source": "scholar", "publication_info": {"summary": "Vox Sanguinis 118 (3), 207-216, 2023"}, "publication": "Vox Sanguinis 118 (3), 207-216, 2023", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:HGTzPopzzJcC"}, {"title": "Gait biomechanics phenotypes among total knee arthroplasty candidates by machine learning cluster analysis", "authors": "KL Young\u2010Shand, PC Roy, MJ Dunbar, SSR Abidi, JL Astephen Wilson", "year": 2023, "citation_id": "fzr2PUYAAAAJ:LPtt_HFRSbwC", "result_id": "fzr2PUYAAAAJ:LPtt_HFRSbwC", "source": "scholar", "publication_info": {"summary": "Journal of Orthopaedic Research\u00ae 41 (2), 335-344, 2023"}, "publication": "Journal of Orthopaedic Research\u00ae 41 (2), 335-344, 2023", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:LPtt_HFRSbwC"}, {"title": "Determing the success rate of extracorporeal shock wave lithotripsy in renal pelvis stone of 1-2 cm in size.", "authors": "N Ahmed, T Gazder, H Saad, A Khan, S Rabiullah, M Zulfiqar, U Qamar, ...", "year": 2023, "citation_id": "fzr2PUYAAAAJ:w1MjKQ0l0TYC", "result_id": "fzr2PUYAAAAJ:w1MjKQ0l0TYC", "source": "scholar", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:w1MjKQ0l0TYC"}, {"title": "Applying Machine Learning to Arsenic Species and Metallomics Profiles of Toenails to Evaluate Associations of Environmental Arsenic with Incident Cancer Cases", "authors": "SR ABIDI", "year": 2022, "citation_id": "fzr2PUYAAAAJ:6bLC7aUMtPcC", "result_id": "fzr2PUYAAAAJ:6bLC7aUMtPcC", "source": "scholar", "publication_info": {"summary": "Challenges of Trustable AI and Added-Value on Health: Proceedings of MIE \u2026, 2022"}, "publication": "Challenges of Trustable AI and Added-Value on Health: Proceedings of MIE \u2026, 2022", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:6bLC7aUMtPcC"}, {"title": "Explainable decision support using task network models in Notation3: computerizing lipid management clinical guidelines as interactive task networks", "authors": "W Van Woensel, S Abidi, K Tennankore, G Worthen, SSR Abidi", "year": 2022, "citation_id": "fzr2PUYAAAAJ:1Ye0OR6EYb4C", "result_id": "fzr2PUYAAAAJ:1Ye0OR6EYb4C", "source": "scholar", "publication_info": {"summary": "International Conference on Artificial Intelligence in Medicine, 3-13, 2022"}, "publication": "International Conference on Artificial Intelligence in Medicine, 3-13, 2022", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:1Ye0OR6EYb4C"}, {"title": "Extracting surrogate decision trees from black-box models to explain the temporal importance of clinical features in predicting kidney graft survival", "authors": "J Rad, KK Tennankore, A Vinson, SSR Abidi", "year": 2022, "citation_id": "fzr2PUYAAAAJ:jFemdcug13IC", "result_id": "fzr2PUYAAAAJ:jFemdcug13IC", "source": "scholar", "publication_info": {"summary": "International conference on artificial intelligence in medicine, 88-98, 2022"}, "publication": "International conference on artificial intelligence in medicine, 88-98, 2022", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:jFemdcug13IC"}, {"title": "A knowledge graph completion method applied to literature-based discovery for predicting missing links targeting cancer drug repurposing", "authors": "A Daowd, S Abidi, SSR Abidi", "year": 2022, "citation_id": "fzr2PUYAAAAJ:6_hjMsCP8ZoC", "result_id": "fzr2PUYAAAAJ:6_hjMsCP8ZoC", "source": "scholar", "publication_info": {"summary": "International Conference on Artificial Intelligence in Medicine, 24-34, 2022"}, "publication": "International Conference on Artificial Intelligence in Medicine, 24-34, 2022", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:6_hjMsCP8ZoC"}, {"title": "Clinical guidelines as executable and interactive workflows with FHIR-compliant health data input using GLEAN", "authors": "W Van Woensel, S Abidi, K Tennankore, G Worthen, SSR Abidi", "year": 2022, "citation_id": "fzr2PUYAAAAJ:AXkvAH5U_nMC", "result_id": "fzr2PUYAAAAJ:AXkvAH5U_nMC", "source": "scholar", "publication_info": {"summary": "International Conference on Artificial Intelligence in Medicine, 421-425, 2022"}, "publication": "International Conference on Artificial Intelligence in Medicine, 421-425, 2022", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:AXkvAH5U_nMC"}, {"title": "Using visual analytics to optimize blood product inventory at a hospital\u2019s blood transfusion service", "authors": "J Rad, J Quinn, C Cheng, SR Abidi, R Liwski, SSR Abidi", "year": 2022, "citation_id": "fzr2PUYAAAAJ:q-HalDI95KYC", "result_id": "fzr2PUYAAAAJ:q-HalDI95KYC", "source": "scholar", "publication_info": {"summary": "International Conference on Artificial Intelligence in Medicine, 436-440, 2022"}, "publication": "International Conference on Artificial Intelligence in Medicine, 436-440, 2022", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:q-HalDI95KYC"}, {"title": "Assessing Knee Osteoarthritis Severity and Biomechanical Changes After Total Knee Arthroplasty Using Self-organizing Maps", "authors": "K Young-Shand, P Roy, M Dunbar, SSR Abidi, J Wilson", "year": 2022, "citation_id": "fzr2PUYAAAAJ:rHJHxKgnXwkC", "result_id": "fzr2PUYAAAAJ:rHJHxKgnXwkC", "source": "scholar", "publication_info": {"summary": "International Conference on Artificial Intelligence in Medicine, 65-75, 2022"}, "publication": "International Conference on Artificial Intelligence in Medicine, 65-75, 2022", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:rHJHxKgnXwkC"}, {"title": "Towards an adaptive clinical transcription system for In-Situ transcribing of patient encounter information", "authors": "W Van Woensel, B Taylor, SSR Abidi", "year": 2022, "citation_id": "fzr2PUYAAAAJ:WC9gN4BGCRcC", "result_id": "fzr2PUYAAAAJ:WC9gN4BGCRcC", "source": "scholar", "publication_info": {"summary": "Stud Health Technol Inf 290, 158-62, 2022"}, "publication": "Stud Health Technol Inf 290, 158-62, 2022", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:WC9gN4BGCRcC"}, {"title": "Four decades of urolithiasis: What has changed in our practice?", "authors": "M Hussain, S Abidi", "year": 2022, "citation_id": "fzr2PUYAAAAJ:3NQIlFlcGxIC", "result_id": "fzr2PUYAAAAJ:3NQIlFlcGxIC", "source": "scholar", "publication_info": {"summary": "JPMA. The Journal of the Pakistan Medical Association 72 (4), 601-602, 2022"}, "publication": "JPMA. The Journal of the Pakistan Medical Association 72 (4), 601-602, 2022", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:3NQIlFlcGxIC"}, {"title": "Semantic knowledge modeling and evaluation of argument theory to develop dialogue based patient education systems for chronic disease self-management", "authors": "B Rose-Davis, W Van Woensel, SR Abidi, E Stringer, SSR Abidi", "year": 2022, "citation_id": "fzr2PUYAAAAJ:prdVHNxh-e8C", "result_id": "fzr2PUYAAAAJ:prdVHNxh-e8C", "source": "scholar", "publication_info": {"summary": "International Journal of Medical Informatics 160, 104693, 2022"}, "publication": "International Journal of Medical Informatics 160, 104693, 2022", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:prdVHNxh-e8C"}, {"title": "A Knowledge Graph of Mechanistic Associations Between COVID-19, Diabetes Mellitus, and Chronic Kidney Disease", "authors": "M Barrett, SSR Abidi, A Daowd, S Abidi", "year": 2022, "citation_id": "fzr2PUYAAAAJ:SjuI4pbJlxcC", "result_id": "fzr2PUYAAAAJ:SjuI4pbJlxcC", "source": "scholar", "publication_info": {"summary": "MEDINFO 2021: One World, One Health\u2013Global Partnership for Digital \u2026, 2022"}, "publication": "MEDINFO 2021: One World, One Health\u2013Global Partnership for Digital \u2026, 2022", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:SjuI4pbJlxcC"}, {"title": "Staged reflexive artificial intelligence driven testing algorithms for early diagnosis of pituitary disorders", "authors": "W Van Woensel, M Elnenaei, SSR Abidi, DB Clarke, SA Imran", "year": 2021, "citation_id": "fzr2PUYAAAAJ:wKETBy42zhYC", "result_id": "fzr2PUYAAAAJ:wKETBy42zhYC", "source": "scholar", "publication_info": {"summary": "Clinical Biochemistry 97, 48-53, 2021"}, "publication": "Clinical Biochemistry 97, 48-53, 2021", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:wKETBy42zhYC"}, {"title": "Outcomes of cystectomy with MAINZ pouch II and epispadias repair in exstrophy epispadias complex in adults: a single-centre experience from Pakistan", "authors": "M Hussain, U Qamar, S Abidi, T Guzdar, QA Ghori, SAH Rizvi", "year": 2021, "citation_id": "fzr2PUYAAAAJ:CB2v5VPnA5kC", "result_id": "fzr2PUYAAAAJ:CB2v5VPnA5kC", "source": "scholar", "publication_info": {"summary": "Age (range in years) 17, 36, 2021"}, "publication": "Age (range in years) 17, 36, 2021", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:CB2v5VPnA5kC"}, {"title": "Predicting kidney graft survival using machine learning methods: prediction model development and feature significance analysis study", "authors": "SAA Naqvi, K Tennankore, A Vinson, PC Roy, SSR Abidi", "year": 2021, "citation_id": "fzr2PUYAAAAJ:PYBJJbyH-FwC", "result_id": "fzr2PUYAAAAJ:PYBJJbyH-FwC", "source": "scholar", "publication_info": {"summary": "Journal of Medical Internet Research 23 (8), e26843, 2021"}, "publication": "Journal of Medical Internet Research 23 (8), e26843, 2021", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:PYBJJbyH-FwC"}, {"title": "A framework to build a causal knowledge graph for chronic diseases and cancers by discovering semantic associations from biomedical literature", "authors": "A Daowd, M Barrett, S Abidi, SSR Abidi", "year": 2021, "citation_id": "fzr2PUYAAAAJ:jU7OWUQzBzMC", "result_id": "fzr2PUYAAAAJ:jU7OWUQzBzMC", "source": "scholar", "publication_info": {"summary": "2021 IEEE 9th International Conference on Healthcare Informatics (ICHI), 13-22, 2021"}, "publication": "2021 IEEE 9th International Conference on Healthcare Informatics (ICHI), 13-22, 2021", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:jU7OWUQzBzMC"}, {"title": "Decision support for comorbid conditions via execution-time integration of clinical guidelines using transaction-based semantics and temporal planning", "authors": "W Van Woensel, SSR Abidi, SR Abidi", "year": 2021, "citation_id": "fzr2PUYAAAAJ:7wO8s98CvbsC", "result_id": "fzr2PUYAAAAJ:7wO8s98CvbsC", "source": "scholar", "publication_info": {"summary": "Artificial Intelligence in Medicine 118, 102127, 2021"}, "publication": "Artificial Intelligence in Medicine 118, 102127, 2021", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:7wO8s98CvbsC"}, {"title": "Using knowledge graphs to plausibly infer missing associations in EMR data", "authors": "WVAN WOENSEL, C Armstrong, M Rajaratnam, V Gupta, SSR Abidi", "year": 2021, "citation_id": "fzr2PUYAAAAJ:7BrZ7Jt4UNcC", "result_id": "fzr2PUYAAAAJ:7BrZ7Jt4UNcC", "source": "scholar", "publication_info": {"summary": "Public Health and Informatics: Proceedings of MIE 2021 281, 417, 2021"}, "publication": "Public Health and Informatics: Proceedings of MIE 2021 281, 417, 2021", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:7BrZ7Jt4UNcC"}, {"title": "Analyzing Association Rules for Graft Failure Following Deceased and Live Donor Kidney Transplantation", "authors": "SR ABIDI", "year": 2021, "citation_id": "fzr2PUYAAAAJ:nRpfm8aw39MC", "result_id": "fzr2PUYAAAAJ:nRpfm8aw39MC", "source": "scholar", "publication_info": {"summary": "Public Health and Informatics: Proceedings of MIE 2021 281, 188, 2021"}, "publication": "Public Health and Informatics: Proceedings of MIE 2021 281, 188, 2021", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:nRpfm8aw39MC"}, {"title": "Semantic Web Framework to Computerize Staged Reflex Testing Protocols to Mitigate Underutilization of Pathology Tests for Diagnosing Pituitary Disorders", "authors": "W Van Woensel, M Elnenaei, SA Imran, SSR Abidi", "year": 2021, "citation_id": "fzr2PUYAAAAJ:kw52XkFRtyQC", "result_id": "fzr2PUYAAAAJ:kw52XkFRtyQC", "source": "scholar", "publication_info": {"summary": "International Conference on Artificial Intelligence in Medicine, 124-134, 2021"}, "publication": "International Conference on Artificial Intelligence in Medicine, 124-134, 2021", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:kw52XkFRtyQC"}, {"title": "Using Interactive Visual Analytics to Optimize in Real-Time Blood Products Inventory at a Blood Bank.", "authors": "J Rad, JG Quinn, C Cheng, R Liwski, SR Abidi, SSR Abidi", "year": 2021, "citation_id": "fzr2PUYAAAAJ:1taIhTC69MYC", "result_id": "fzr2PUYAAAAJ:1taIhTC69MYC", "source": "scholar", "publication_info": {"summary": "MIE, 223-227, 2021"}, "publication": "MIE, 223-227, 2021", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:1taIhTC69MYC"}, {"title": "A Knowledge Graph of Mechanistic Associations Between COVID-19, Diabetes Mellitus and Kidney Diseases.", "authors": "M Barrett, A Daowd, SSR Abidi, S Abidi", "year": 2021, "citation_id": "fzr2PUYAAAAJ:IaI1MmNe2tcC", "result_id": "fzr2PUYAAAAJ:IaI1MmNe2tcC", "source": "scholar", "publication_info": {"summary": "MIE, 392-396, 2021"}, "publication": "MIE, 392-396, 2021", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:IaI1MmNe2tcC"}, {"title": "Using Interactive Visual Analytics to Optimize Blood Products Inventory at a Blood Bank.", "authors": "J Rad, JG Quinn, C Cheng, R Liwski, S Abidi, SSR Abidi", "year": 2021, "citation_id": "fzr2PUYAAAAJ:owLR8QvbtFgC", "result_id": "fzr2PUYAAAAJ:owLR8QvbtFgC", "source": "scholar", "publication_info": {"summary": "MedInfo, 572-576, 2021"}, "publication": "MedInfo, 572-576, 2021", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:owLR8QvbtFgC"}, {"title": "Ontology-based personalized cognitive behavioural plans for patients with mild depression", "authors": "A Nair, SSR Abidi, W Van Woensel, S Abidi", "year": 2021, "citation_id": "fzr2PUYAAAAJ:FiytvqdAVhgC", "result_id": "fzr2PUYAAAAJ:FiytvqdAVhgC", "source": "scholar", "publication_info": {"summary": "Public Health and Informatics, 729-733, 2021"}, "publication": "Public Health and Informatics, 729-733, 2021", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:FiytvqdAVhgC"}, {"title": "Building a knowledge graph representing causal associations between risk factors and incidence of breast cancer", "authors": "A Daowd, M Barrett, S Abidi, SSR Abidi", "year": 2021, "citation_id": "fzr2PUYAAAAJ:j7_hQOaDUrUC", "result_id": "fzr2PUYAAAAJ:j7_hQOaDUrUC", "source": "scholar", "publication_info": {"summary": "Public Health and Informatics, 724-728, 2021"}, "publication": "Public Health and Informatics, 724-728, 2021", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:j7_hQOaDUrUC"}, {"title": "Artificial Intelligence in Medicine: 18th International Conference on Artificial Intelligence in Medicine, AIME 2020, Minneapolis, MN, USA, August 25\u201328, 2020, Proceedings", "authors": "M Michalowski, R Moskovitch", "year": 2020, "citation_id": "fzr2PUYAAAAJ:-7ulzOJl1JYC", "result_id": "fzr2PUYAAAAJ:-7ulzOJl1JYC", "source": "scholar", "publication_info": {"summary": "Springer Nature, 2020"}, "publication": "Springer Nature, 2020", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:-7ulzOJl1JYC"}, {"title": "An AI-driven predictive modelling framework to analyze and visualize blood product transactional data for reducing blood products\u2019 Discards", "authors": "J Rad, C Cheng, JG Quinn, S Abidi, R Liwski, SSR Abidi", "year": 2020, "citation_id": "fzr2PUYAAAAJ:43bX7VzcjpAC", "result_id": "fzr2PUYAAAAJ:43bX7VzcjpAC", "source": "scholar", "publication_info": {"summary": "International Conference on Artificial Intelligence in Medicine, 192-202, 2020"}, "publication": "International Conference on Artificial Intelligence in Medicine, 192-202, 2020", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:43bX7VzcjpAC"}, {"title": "A CIG integration framework to provide decision support for comorbid conditions using transaction-based semantics and temporal planning", "authors": "W Van Woensel, S Abidi, B Jafarpour, SSR Abidi", "year": 2020, "citation_id": "fzr2PUYAAAAJ:zCSUwVk65WsC", "result_id": "fzr2PUYAAAAJ:zCSUwVk65WsC", "source": "scholar", "publication_info": {"summary": "International Conference on Artificial Intelligence in Medicine, 440-450, 2020"}, "publication": "International Conference on Artificial Intelligence in Medicine, 440-450, 2020", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:zCSUwVk65WsC"}, {"title": "Indoor location identification of patients for directing virtual care: An AI approach using machine learning and knowledge-based methods", "authors": "W Van Woensel, PC Roy, SSR Abidi, SR Abidi", "year": 2020, "citation_id": "fzr2PUYAAAAJ:jgBuDB5drN8C", "result_id": "fzr2PUYAAAAJ:jgBuDB5drN8C", "source": "scholar", "publication_info": {"summary": "Artificial intelligence in medicine 108, 101931, 2020"}, "publication": "Artificial intelligence in medicine 108, 101931, 2020", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:jgBuDB5drN8C"}, {"title": "CLINICAL AND BIOMECHANICAL CLUSTER CLASSIFICATION BEFORE TOTAL KNEE ARTHROPLASTY IMPACTS FUNCTIONAL OUTCOME", "authors": "K Young, JA Wilson, MJ Dunbar, P Roy, SSR Abidi", "year": 2020, "citation_id": "fzr2PUYAAAAJ:ubry08Y2EpUC", "result_id": "fzr2PUYAAAAJ:ubry08Y2EpUC", "source": "scholar", "publication_info": {"summary": "Orthopaedic Proceedings 102 (SUPP_6), 14-14, 2020"}, "publication": "Orthopaedic Proceedings 102 (SUPP_6), 14-14, 2020", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:ubry08Y2EpUC"}, {"title": "Characterization of Total Knee Arthroplasty Patient: Clinical and Biomechanical Variability by Cluster Analysis", "authors": "K Young-Shand, P Roy, SSR Abidi, M Dunbar, JA Wilson", "year": 2020, "citation_id": "fzr2PUYAAAAJ:48xauSegjOkC", "result_id": "fzr2PUYAAAAJ:48xauSegjOkC", "source": "scholar", "publication_info": {"summary": "Orthopaedic Proceedings 102 (SUPP_1), 141-141, 2020"}, "publication": "Orthopaedic Proceedings 102 (SUPP_1), 141-141, 2020", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:48xauSegjOkC"}, {"title": "Factors enabling and hindering an eLearning programme for nurses and midwives in Afghanistan", "authors": "A Naseem, KQ Ali, ADS Juma, A Sajwani, BA Khan, S Sayani, SSR Abidi", "year": 2020, "citation_id": "fzr2PUYAAAAJ:v1_lew4L6wgC", "result_id": "fzr2PUYAAAAJ:v1_lew4L6wgC", "source": "scholar", "publication_info": {"summary": "University of Johannesburg, 2020"}, "publication": "University of Johannesburg, 2020", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:v1_lew4L6wgC"}, {"title": "Exploiting machine learning algorithms and methods for the prediction of agitated delirium after cardiac surgery: models development and validation study", "authors": "HN Mufti, GM Hirsch, SR Abidi, SSR Abidi", "year": 2019, "citation_id": "fzr2PUYAAAAJ:jL-93Qbq4QoC", "result_id": "fzr2PUYAAAAJ:jL-93Qbq4QoC", "source": "scholar", "publication_info": {"summary": "JMIR medical informatics 7 (4), e14993, 2019"}, "publication": "JMIR medical informatics 7 (4), e14993, 2019", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:jL-93Qbq4QoC"}, {"title": "PREOPERATIVE BIOMECHANICAL PATIENT STRATIFICATION BY MACHINE LEARNING-BASED CLUSTER ANALYSIS AND FUNCTIONAL OUTCOMES AFTER TOTAL KNEE ARTHROPLASTY", "authors": "KL Young-Shand, PC Roy, MJ Dunbar, SSR Abidi, JL Astephen-Wilson", "year": 2019, "citation_id": "fzr2PUYAAAAJ:0CzhzZyukY4C", "result_id": "fzr2PUYAAAAJ:0CzhzZyukY4C", "source": "scholar", "publication_info": {"summary": "Orthopaedic Proceedings 101 (SUPP_11), 46-46, 2019"}, "publication": "Orthopaedic Proceedings 101 (SUPP_11), 46-46, 2019", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:0CzhzZyukY4C"}, {"title": "Using an Artificial Intelligence-Based Argument Theory to Generate Automated Patient Education Dialogues for Families of Children with Juvenile Idiopathic Arthritis.", "authors": "B Rose-Davis, W Van Woensel, E Stringer, S Abidi, SSR Abidi", "year": 2019, "citation_id": "fzr2PUYAAAAJ:4X0JR2_MtJMC", "result_id": "fzr2PUYAAAAJ:4X0JR2_MtJMC", "source": "scholar", "publication_info": {"summary": "MedInfo, 1337-1341, 2019"}, "publication": "MedInfo, 1337-1341, 2019", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:4X0JR2_MtJMC"}, {"title": "A Digital Health Platform to Deliver Tailored Early Stimulation Programs for Children with Developmental Delays.", "authors": "R da Luz Dias, MR de Oliveira Lima, JGB Alves, W Van Woensel, A Naqvi, ...", "year": 2019, "citation_id": "fzr2PUYAAAAJ:sJsF-0ZLhtgC", "result_id": "fzr2PUYAAAAJ:sJsF-0ZLhtgC", "source": "scholar", "publication_info": {"summary": "MedInfo, 571-575, 2019"}, "publication": "MedInfo, 571-575, 2019", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:sJsF-0ZLhtgC"}, {"title": "Towards Personalized Lifetime Health: A Platform for Early Multimorbid Chronic Disease Risk Assessment and Mitigation.", "authors": "A Daowd, S Faizan, S Abidi, A Abusharekh, A Shehzad, SSR Abidi", "year": 2019, "citation_id": "fzr2PUYAAAAJ:2tRrZ1ZAMYUC", "result_id": "fzr2PUYAAAAJ:2tRrZ1ZAMYUC", "source": "scholar", "publication_info": {"summary": "MedInfo, 935-939, 2019"}, "publication": "MedInfo, 935-939, 2019", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:2tRrZ1ZAMYUC"}, {"title": "Benchmarking semantic reasoning on mobile platforms: Towards optimization using OWL2 RL.", "authors": "T Lukasiewicz, W Van Woensel, SSR Abidi", "year": 2019, "citation_id": "fzr2PUYAAAAJ:DkZNVXde3BIC", "result_id": "fzr2PUYAAAAJ:DkZNVXde3BIC", "source": "scholar", "publication_info": {"summary": "Semantic Web (1570-0844) 10 (4), 2019"}, "publication": "Semantic Web (1570-0844) 10 (4), 2019", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:DkZNVXde3BIC"}, {"title": "Intelligent health data analytics: A convergence of artificial intelligence and big data", "authors": "SSR Abidi, SR Abidi", "year": 2019, "citation_id": "fzr2PUYAAAAJ:fbc8zXXH2BUC", "result_id": "fzr2PUYAAAAJ:fbc8zXXH2BUC", "source": "scholar", "publication_info": {"summary": "Healthcare management forum 32 (4), 178-182, 2019"}, "publication": "Healthcare management forum 32 (4), 178-182, 2019", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:fbc8zXXH2BUC"}, {"title": "AI-Driven Pathology Laboratory Utilization Management via Data-and Knowledge-Based Analytics", "authors": "SSR Abidi, J Rad, A Abusharekh, PC Roy, W Van Woensel, SR Abidi, ...", "year": 2019, "citation_id": "fzr2PUYAAAAJ:nVrZBo8bIpAC", "result_id": "fzr2PUYAAAAJ:nVrZBo8bIpAC", "source": "scholar", "publication_info": {"summary": "Conference on Artificial Intelligence in Medicine in Europe, 241-251, 2019"}, "publication": "Conference on Artificial Intelligence in Medicine in Europe, 241-251, 2019", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:nVrZBo8bIpAC"}, {"title": "Mobile indoor localization with bluetooth beacons in a pediatric emergency department using clustering, rule-based classification and high-level heuristics", "authors": "PC Roy, W Van Woensel, A Wilcox, SSR Abidi", "year": 2019, "citation_id": "fzr2PUYAAAAJ:lvd772isFD0C", "result_id": "fzr2PUYAAAAJ:lvd772isFD0C", "source": "scholar", "publication_info": {"summary": "Conference on Artificial Intelligence in Medicine in Europe, 216-226, 2019"}, "publication": "Conference on Artificial Intelligence in Medicine in Europe, 216-226, 2019", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:lvd772isFD0C"}, {"title": "Benchmarking semantic reasoning on mobile platforms: Towards optimization using OWL2 RL", "authors": "W Van Woensel, SSR Abidi", "year": 2019, "citation_id": "fzr2PUYAAAAJ:8xutWZnSdmoC", "result_id": "fzr2PUYAAAAJ:8xutWZnSdmoC", "source": "scholar", "publication_info": {"summary": "Semantic Web 10 (4), 637-663, 2019"}, "publication": "Semantic Web 10 (4), 637-663, 2019", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:8xutWZnSdmoC"}, {"title": "Execution-time integration of clinical practice guidelines to provide decision support for comorbid conditions", "authors": "B Jafarpour, SR Abidi, W Van Woensel, SSR Abidi", "year": 2019, "citation_id": "fzr2PUYAAAAJ:_OXeSy2IsFwC", "result_id": "fzr2PUYAAAAJ:_OXeSy2IsFwC", "source": "scholar", "publication_info": {"summary": "Artificial intelligence in medicine 94, 117-137, 2019"}, "publication": "Artificial intelligence in medicine 94, 117-137, 2019", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:_OXeSy2IsFwC"}, {"title": "Optimizing and benchmarking OWL2 RL for semantic reasoning on mobile platforms", "authors": "W Van Woensel, SSR Abibi", "year": 2019, "citation_id": "fzr2PUYAAAAJ:MAUkC_7iAq8C", "result_id": "fzr2PUYAAAAJ:MAUkC_7iAq8C", "source": "scholar", "publication_info": {"summary": "Semantic Web Journal 10, 637-663, 2019"}, "publication": "Semantic Web Journal 10, 637-663, 2019", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:MAUkC_7iAq8C"}, {"title": "Proactively Guiding Patients Through ADL via Knowledge-Based and Context-Driven Activity Recognition", "authors": "W Van Woensel, S Abidi, SSR Abidi", "year": 2019, "citation_id": "fzr2PUYAAAAJ:6yz0xqPARnAC", "result_id": "fzr2PUYAAAAJ:6yz0xqPARnAC", "source": "scholar", "publication_info": {"summary": "MEDINFO 2019: Health and Wellbeing e-Networks for All, 863-867, 2019"}, "publication": "MEDINFO 2019: Health and Wellbeing e-Networks for All, 863-867, 2019", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:6yz0xqPARnAC"}, {"title": "Providing comorbid decision support via the integration of clinical practice guidelines at execution-time by leveraging medical linked open datasets", "authors": "W Van Woensel, S Abidi, B Jafarpour, SSR Abidi", "year": 2019, "citation_id": "fzr2PUYAAAAJ:AHdEip9mkN0C", "result_id": "fzr2PUYAAAAJ:AHdEip9mkN0C", "source": "scholar", "publication_info": {"summary": "MEDINFO 2019: Health and Wellbeing e-Networks for All, 858-862, 2019"}, "publication": "MEDINFO 2019: Health and Wellbeing e-Networks for All, 858-862, 2019", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:AHdEip9mkN0C"}, {"title": "A data mining framework for glaucoma decision support based on optic nerve image analysis using machine learning methods", "authors": "SSR Abidi, PC Roy, MS Shah, J Yu, S Yan", "year": 2018, "citation_id": "fzr2PUYAAAAJ:F9fV5C73w3QC", "result_id": "fzr2PUYAAAAJ:F9fV5C73w3QC", "source": "scholar", "publication_info": {"summary": "Journal of Healthcare Informatics Research 2 (4), 370-401, 2018"}, "publication": "Journal of Healthcare Informatics Research 2 (4), 370-401, 2018", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:F9fV5C73w3QC"}, {"title": "Optimizing primary care management of atrial fibrillation: The rationale and methods of the Integrated Management Program Advancing Community Treatment of Atrial Fibrillation \u2026", "authors": "JL Cox, R Parkash, SSR Abidi, L Thabane, F Xie, J Mackillop, SR Abidi, ...", "year": 2018, "citation_id": "fzr2PUYAAAAJ:yMeIxYmEMEAC", "result_id": "fzr2PUYAAAAJ:yMeIxYmEMEAC", "source": "scholar", "publication_info": {"summary": "American heart journal 201, 149-157, 2018"}, "publication": "American heart journal 201, 149-157, 2018", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:yMeIxYmEMEAC"}, {"title": "Optimizing semantic reasoning on memory-constrained platforms using the RETE algorithm", "authors": "W Van Woensel, SSR Abidi", "year": 2018, "citation_id": "fzr2PUYAAAAJ:3htObqc8RwsC", "result_id": "fzr2PUYAAAAJ:3htObqc8RwsC", "source": "scholar", "publication_info": {"summary": "European Semantic Web Conference, 682-696, 2018"}, "publication": "European Semantic Web Conference, 682-696, 2018", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:3htObqc8RwsC"}, {"title": "Investigating plausible reasoning over knowledge graphs for semantics-based health data analytics", "authors": "H Mohammadhassanzadeh, SR Abidi, W Van Woensel, SSR Abidi", "year": 2018, "citation_id": "fzr2PUYAAAAJ:GFxP56DSvIMC", "result_id": "fzr2PUYAAAAJ:GFxP56DSvIMC", "source": "scholar", "publication_info": {"summary": "2018 IEEE 27th International Conference on Enabling Technologies \u2026, 2018"}, "publication": "2018 IEEE 27th International Conference on Enabling Technologies \u2026, 2018", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:GFxP56DSvIMC"}, {"title": "Diabetes-related behavior change knowledge transfer to primary care practitioners and patients: implementation and evaluation of a digital health platform", "authors": "S Abidi, M Vallis, H Piccinini-Vallis, SA Imran, SSR Abidi", "year": 2018, "citation_id": "fzr2PUYAAAAJ:r_AWSJRzSzQC", "result_id": "fzr2PUYAAAAJ:r_AWSJRzSzQC", "source": "scholar", "publication_info": {"summary": "JMIR medical informatics 6 (2), e9629, 2018"}, "publication": "JMIR medical informatics 6 (2), e9629, 2018", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:r_AWSJRzSzQC"}, {"title": "Personalized Preoperative Education System to Assist Patients Undergoing TAVI Surgery: A Digital Health Solution", "authors": "AN Mojadam, N Nadeem, H Beydoun, SR Abidi, A Rizvi", "year": 2018, "citation_id": "fzr2PUYAAAAJ:vDZJ-YLwNdEC", "result_id": "fzr2PUYAAAAJ:vDZJ-YLwNdEC", "source": "scholar", "publication_info": {"summary": "J Health Med Informat 9 (313), 2, 2018"}, "publication": "J Health Med Informat 9 (313), 2, 2018", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:vDZJ-YLwNdEC"}, {"title": "A personalized risk stratification platform for population lifetime healthcare", "authors": "A Daowd, SR Abidi, A Abusharekh, SSR Abidi", "year": 2018, "citation_id": "fzr2PUYAAAAJ:a3BOlSfXSfwC", "result_id": "fzr2PUYAAAAJ:a3BOlSfXSfwC", "source": "scholar", "publication_info": {"summary": "Building Continents of Knowledge in Oceans of Data: The Future of Co-Created \u2026, 2018"}, "publication": "Building Continents of Knowledge in Oceans of Data: The Future of Co-Created \u2026, 2018", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:a3BOlSfXSfwC"}, {"title": "Interactive Dialogue-Based Patient Education for Juvenile Idiopathic Arthritis Using Argument Theory", "authors": "B Rose-Davis, E Stringer, S Abidi, SSR Abidi", "year": 2018, "citation_id": "fzr2PUYAAAAJ:LhH-TYMQEocC", "result_id": "fzr2PUYAAAAJ:LhH-TYMQEocC", "source": "scholar", "publication_info": {"summary": "Building Continents of Knowledge in Oceans of Data: The Future of Co-Created \u2026, 2018"}, "publication": "Building Continents of Knowledge in Oceans of Data: The Future of Co-Created \u2026, 2018", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:LhH-TYMQEocC"}, {"title": "A Mobile Early Stimulation Program to Support Children with Developmental Delays in Brazil", "authors": "RL Dias, KCCG Silva, MRO Lima, JGB Alves, SSR Abidi", "year": 2018, "citation_id": "fzr2PUYAAAAJ:yqoGN6RLRZoC", "result_id": "fzr2PUYAAAAJ:yqoGN6RLRZoC", "source": "scholar", "publication_info": {"summary": "Building Continents of Knowledge in Oceans of Data: The Future of Co-Created \u2026, 2018"}, "publication": "Building Continents of Knowledge in Oceans of Data: The Future of Co-Created \u2026, 2018", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:yqoGN6RLRZoC"}, {"title": "SeDAn: a Plausible Reasoning Approach for Semantics-based Data Analytics in Healthcare.", "authors": "H Mohammadhassanzadeh, SR Abidi, MS Shah, M Karamollahi, ...", "year": 2017, "citation_id": "fzr2PUYAAAAJ:mNrWkgRL2YcC", "result_id": "fzr2PUYAAAAJ:mNrWkgRL2YcC", "source": "scholar", "publication_info": {"summary": "WAIAH@ AI* IA, 50-59, 2017"}, "publication": "WAIAH@ AI* IA, 50-59, 2017", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:mNrWkgRL2YcC"}, {"title": "Possibilistic activity recognition with uncertain observations to support medication adherence in an assisted ambient living setting", "authors": "PC Roy, SR Abidi, SSR Abidi", "year": 2017, "citation_id": "fzr2PUYAAAAJ:8d8msizDQcsC", "result_id": "fzr2PUYAAAAJ:8d8msizDQcsC", "source": "scholar", "publication_info": {"summary": "Knowledge-Based Systems 133, 156-173, 2017"}, "publication": "Knowledge-Based Systems 133, 156-173, 2017", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:8d8msizDQcsC"}, {"title": "Protocol-driven decision support within e-referral systems to streamline patient consultation, triaging and referrals from primary care to specialist clinics", "authors": "E Maghsoud-Lou, S Christie, SR Abidi, SSR Abidi", "year": 2017, "citation_id": "fzr2PUYAAAAJ:anf4URPfarAC", "result_id": "fzr2PUYAAAAJ:anf4URPfarAC", "source": "scholar", "publication_info": {"summary": "Journal of Medical Systems 41 (9), 139, 2017"}, "publication": "Journal of Medical Systems 41 (9), 139, 2017", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:anf4URPfarAC"}, {"title": "Monitoring medication adherence in smart environments in the context of patient self-management a knowledge-driven approach", "authors": "PC Roy, SR Abidi, SSR Abidi", "year": 2017, "citation_id": "fzr2PUYAAAAJ:PaBasH6fAo0C", "result_id": "fzr2PUYAAAAJ:PaBasH6fAo0C", "source": "scholar", "publication_info": {"summary": "Smart Technologies in Healthcare, 195-223, 2017"}, "publication": "Smart Technologies in Healthcare, 195-223, 2017", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:PaBasH6fAo0C"}, {"title": "Leveraging medical taxonomies to improve knowledge management within online communities of practice: The knowledge maps system", "authors": "SA Stewart, SSR Abidi", "year": 2017, "citation_id": "fzr2PUYAAAAJ:q3CdL3IzO_QC", "result_id": "fzr2PUYAAAAJ:q3CdL3IzO_QC", "source": "scholar", "publication_info": {"summary": "Computer Methods and Programs in Biomedicine 143, 121-127, 2017"}, "publication": "Computer Methods and Programs in Biomedicine 143, 121-127, 2017", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:q3CdL3IzO_QC"}, {"title": "Semantics-based plausible reasoning to extend the knowledge coverage of medical knowledge bases for improved clinical decision support", "authors": "H Mohammadhassanzadeh, W Van Woensel, SR Abidi, SSR Abidi", "year": 2017, "citation_id": "fzr2PUYAAAAJ:xtoqd-5pKcoC", "result_id": "fzr2PUYAAAAJ:xtoqd-5pKcoC", "source": "scholar", "publication_info": {"summary": "BioData mining 10 (1), 7, 2017"}, "publication": "BioData mining 10 (1), 7, 2017", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:xtoqd-5pKcoC"}, {"title": "Achieving Pro-Active Guidance of Patients through ADL via Knowledge-Driven Activity Recognition and Complex Semantic Workflows", "authors": "W Van Woensel, PC Roy, SSR Abidi", "year": 2017, "citation_id": "fzr2PUYAAAAJ:DJbcl8HfkQkC", "result_id": "fzr2PUYAAAAJ:DJbcl8HfkQkC", "source": "scholar", "publication_info": {"summary": "Proc. 10th Int. Conf. Semant. Web Appl. Tools Heal. Care Life Sci 2042, 2017"}, "publication": "Proc. 10th Int. Conf. Semant. Web Appl. Tools Heal. Care Life Sci 2042, 2017", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:DJbcl8HfkQkC"}, {"title": "A Semantic Web Framework for Behavioral User Modeling and Action Planning for Personalized Behavior Modification.", "authors": "W Van Woensel, W Baig, SSR Abidi, S Abidi", "year": 2017, "citation_id": "fzr2PUYAAAAJ:cWzG1nlazyYC", "result_id": "fzr2PUYAAAAJ:cWzG1nlazyYC", "source": "scholar", "publication_info": {"summary": "SWAT4LS, 2017"}, "publication": "SWAT4LS, 2017", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:cWzG1nlazyYC"}, {"title": "Discovering central practitioners in a medical discussion forum using semantic web analytics", "authors": "E Rajabi, SSR Abidi", "year": 2017, "citation_id": "fzr2PUYAAAAJ:5qfkUJPXOUwC", "result_id": "fzr2PUYAAAAJ:5qfkUJPXOUwC", "source": "scholar", "publication_info": {"summary": "Informatics for Health: Connected Citizen-Led Wellness and Population Health \u2026, 2017"}, "publication": "Informatics for Health: Connected Citizen-Led Wellness and Population Health \u2026, 2017", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:5qfkUJPXOUwC"}, {"title": "Monitoring activities related to medication adherence in ambient assisted living environments", "authors": "PC Roy, SR Abidi, SSR Abidi", "year": 2017, "citation_id": "fzr2PUYAAAAJ:hCrLmN-GePgC", "result_id": "fzr2PUYAAAAJ:hCrLmN-GePgC", "source": "scholar", "publication_info": {"summary": "Informatics for Health: Connected Citizen-Led Wellness and Population Health \u2026, 2017"}, "publication": "Informatics for Health: Connected Citizen-Led Wellness and Population Health \u2026, 2017", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:hCrLmN-GePgC"}, {"title": "A digital framework to support providers and patients in diabetes related behavior modification", "authors": "S Abidi, M Vallis, H Piccinini-Vallis, SA Imran, SSR Abidi", "year": 2017, "citation_id": "fzr2PUYAAAAJ:FPJr55Dyh1AC", "result_id": "fzr2PUYAAAAJ:FPJr55Dyh1AC", "source": "scholar", "publication_info": {"summary": "Informatics for Health: Connected Citizen-Led Wellness and Population Health \u2026, 2017"}, "publication": "Informatics for Health: Connected Citizen-Led Wellness and Population Health \u2026, 2017", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:FPJr55Dyh1AC"}, {"title": "SmartRL: a context-sensitive, ontology-based rule language for assisted living in smart environments", "authors": "W Van Woensel, PC Roy, SSR Abidi", "year": 2016, "citation_id": "fzr2PUYAAAAJ:LI9QrySNdTsC", "result_id": "fzr2PUYAAAAJ:LI9QrySNdTsC", "source": "scholar", "publication_info": {"summary": "International Symposium on Rules and Rule Markup Languages for the Semantic \u2026, 2016"}, "publication": "International Symposium on Rules and Rule Markup Languages for the Semantic \u2026, 2016", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:LI9QrySNdTsC"}, {"title": "A semantic web-based approach to plausible reasoning for improving clinical knowledge engineering", "authors": "H Mohammadhassanzadeh, W Van Woensel, SR Abidi, SSR Abidi", "year": 2016, "citation_id": "fzr2PUYAAAAJ:MLfJN-KU85MC", "result_id": "fzr2PUYAAAAJ:MLfJN-KU85MC", "source": "scholar", "publication_info": {"summary": "2016 IEEE-EMBS International Conference on Biomedical and Health Informatics \u2026, 2016"}, "publication": "2016 IEEE-EMBS International Conference on Biomedical and Health Informatics \u2026, 2016", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:MLfJN-KU85MC"}, {"title": "A digital health system to assist family physicians to safely prescribe NOAC medications", "authors": "SR Abidi, J Cox, A Abusharekh, N Hashemian, SSR Abidi", "year": 2016, "citation_id": "fzr2PUYAAAAJ:kz9GbA2Ns4gC", "result_id": "fzr2PUYAAAAJ:kz9GbA2Ns4gC", "source": "scholar", "publication_info": {"summary": "Exploring Complexity in Health: An Interdisciplinary Systems Approach, 519-523, 2016"}, "publication": "Exploring Complexity in Health: An Interdisciplinary Systems Approach, 519-523, 2016", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&cstart=100&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:kz9GbA2Ns4gC"}, {"title": "An Ontological Model of Behaviour Theory to Generate Personalized Action Plans to Modify Behaviours.", "authors": "W Baig, SR Abidi, SSR Abidi", "year": 2016, "citation_id": "fzr2PUYAAAAJ:k8Z6L05lTy4C", "result_id": "fzr2PUYAAAAJ:k8Z6L05lTy4C", "source": "scholar", "publication_info": {"summary": "MIE, 399-403, 2016"}, "publication": "MIE, 399-403, 2016", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&cstart=100&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:k8Z6L05lTy4C"}, {"title": "Transcription of Case Report Forms from Unstructured Referral Letters: A Semantic Text Analytics Approach.", "authors": "SSR Abidi, AK Singh, S Christie", "year": 2016, "citation_id": "fzr2PUYAAAAJ:VaXvl8Fpj5cC", "result_id": "fzr2PUYAAAAJ:VaXvl8Fpj5cC", "source": "scholar", "publication_info": {"summary": "MIE, 322-326, 2016"}, "publication": "MIE, 322-326, 2016", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&cstart=100&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:VaXvl8Fpj5cC"}, {"title": "Multi-Strategy Semantic Web Reasoning for Medical Knowledge Bases.", "authors": "W Van Woensel, H Mohammadhassanzadeh, SR Abidi, SSR Abidi", "year": 2015, "citation_id": "fzr2PUYAAAAJ:tYavs44e6CUC", "result_id": "fzr2PUYAAAAJ:tYavs44e6CUC", "source": "scholar", "publication_info": {"summary": "BDM2I@ ISWC, 2015"}, "publication": "BDM2I@ ISWC, 2015", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&cstart=100&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:tYavs44e6CUC"}, {"title": "INITIATE: An Intelligent Adaptive Alert Environment.", "authors": "B Jafarpour, SR Abidi, AM Ahmad, SSR Abidi", "year": 2015, "citation_id": "fzr2PUYAAAAJ:BUYA1_V_uYcC", "result_id": "fzr2PUYAAAAJ:BUYA1_V_uYcC", "source": "scholar", "publication_info": {"summary": "MedInfo, 285-289, 2015"}, "publication": "MedInfo, 285-289, 2015", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&cstart=100&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:BUYA1_V_uYcC"}, {"title": "A Mobile and Intelligent Patient Diary for Chronic Disease Self-Management.", "authors": "W Van Woensel, PC Roy, SR Abidi, SSR Abidi", "year": 2015, "citation_id": "fzr2PUYAAAAJ:URolC5Kub84C", "result_id": "fzr2PUYAAAAJ:URolC5Kub84C", "source": "scholar", "publication_info": {"summary": "MedInfo, 118-122, 2015"}, "publication": "MedInfo, 118-122, 2015", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&cstart=100&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:URolC5Kub84C"}, {"title": "H-DRIVE: A big health data analytics platform for evidence-informed decision making", "authors": "A Abusharekh, SA Stewart, N Hashemian, SSR Abidi", "year": 2015, "citation_id": "fzr2PUYAAAAJ:ML0RJ9NH7IQC", "result_id": "fzr2PUYAAAAJ:ML0RJ9NH7IQC", "source": "scholar", "publication_info": {"summary": "2015 IEEE International Congress on Big Data, 416-423, 2015"}, "publication": "2015 IEEE International Congress on Big Data, 416-423, 2015", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&cstart=100&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:ML0RJ9NH7IQC"}, {"title": "Towards a'Big'Health Data Analytics Platform", "authors": "S Cha, A Abusharekh, SSR Abidi", "year": 2015, "citation_id": "fzr2PUYAAAAJ:Z5m8FVwuT1cC", "result_id": "fzr2PUYAAAAJ:Z5m8FVwuT1cC", "source": "scholar", "publication_info": {"summary": "2015 IEEE First International Conference on Big Data Computing Service and \u2026, 2015"}, "publication": "2015 IEEE First International Conference on Big Data Computing Service and \u2026, 2015", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&cstart=100&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:Z5m8FVwuT1cC"}, {"title": "Exploiting semantic web technologies to develop OWL-based clinical practice guideline execution engines", "authors": "B Jafarpour, SR Abidi, SSR Abidi", "year": 2014, "citation_id": "fzr2PUYAAAAJ:9Nmd_mFXekcC", "result_id": "fzr2PUYAAAAJ:9Nmd_mFXekcC", "source": "scholar", "publication_info": {"summary": "IEEE journal of biomedical and health informatics 20 (1), 388-398, 2014"}, "publication": "IEEE journal of biomedical and health informatics 20 (1), 388-398, 2014", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&cstart=100&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:9Nmd_mFXekcC"}, {"title": "A predictive model for personalized therapeutic interventions in non-small cell lung cancer", "authors": "N Kureshi, SSR Abidi, C Blouin", "year": 2014, "citation_id": "fzr2PUYAAAAJ:fQNAKQ3IYiAC", "result_id": "fzr2PUYAAAAJ:fQNAKQ3IYiAC", "source": "scholar", "publication_info": {"summary": "IEEE journal of biomedical and health informatics 20 (1), 424-431, 2014"}, "publication": "IEEE journal of biomedical and health informatics 20 (1), 424-431, 2014", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&cstart=100&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:fQNAKQ3IYiAC"}, {"title": "An E-health Based Integrated Management Program Advancing Community Treatment Of Atrial Fibrillation (IMPACT-AF)", "authors": "SSR Abidi, J Cox, S Abidi, A Abusharekh, J Nemis-white", "year": 2014, "citation_id": "fzr2PUYAAAAJ:BJbdYPG6LGMC", "result_id": "fzr2PUYAAAAJ:BJbdYPG6LGMC", "source": "scholar", "publication_info": {"summary": "Qatar Foundation Annual Research Conference Proceedings Volume 2014 Issue 1 \u2026, 2014"}, "publication": "Qatar Foundation Annual Research Conference Proceedings Volume 2014 Issue 1 \u2026, 2014", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&cstart=100&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:BJbdYPG6LGMC"}, {"title": "Using Social Computing For Knowledge Translation: Exploiting Social Network And Semantic Content Analyses To Facilitate Online Knowledge Translation Within An Online Social \u2026", "authors": "S Stewart, SSR Abidi", "year": 2014, "citation_id": "fzr2PUYAAAAJ:5MTHONV0fEkC", "result_id": "fzr2PUYAAAAJ:5MTHONV0fEkC", "source": "scholar", "publication_info": {"summary": "Qatar Foundation Annual Research Conference Proceedings Volume 2014 Issue 1 \u2026, 2014"}, "publication": "Qatar Foundation Annual Research Conference Proceedings Volume 2014 Issue 1 \u2026, 2014", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&cstart=100&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:5MTHONV0fEkC"}, {"title": "Integrating existing large scale medical laboratory data into the semantic web framework", "authors": "N Al Haider, S Abidi, W Van Woensel, SSR Abidi", "year": 2014, "citation_id": "fzr2PUYAAAAJ:2KloaMYe4IUC", "result_id": "fzr2PUYAAAAJ:2KloaMYe4IUC", "source": "scholar", "publication_info": {"summary": "2014 IEEE International Conference on Big Data (Big Data), 1040-1048, 2014"}, "publication": "2014 IEEE International Conference on Big Data (Big Data), 1040-1048, 2014", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&cstart=100&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:2KloaMYe4IUC"}, {"title": "A cross-platform benchmark framework for mobile semantic web reasoning engines", "authors": "W Van Woensel, N Al Haider, A Ahmad, SSR Abidi", "year": 2014, "citation_id": "fzr2PUYAAAAJ:tzM49s52ZIMC", "result_id": "fzr2PUYAAAAJ:tzM49s52ZIMC", "source": "scholar", "publication_info": {"summary": "International Semantic Web Conference, 389-408, 2014"}, "publication": "International Semantic Web Conference, 389-408, 2014", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&cstart=100&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:tzM49s52ZIMC"}, {"title": "A comparison of mobile rule engines for reasoning on semantic web based health data", "authors": "W Van Woensel, N Al Haider, PC Roy, AM Ahmad, SSR Abidi", "year": 2014, "citation_id": "fzr2PUYAAAAJ:fEOibwPWpKIC", "result_id": "fzr2PUYAAAAJ:fEOibwPWpKIC", "source": "scholar", "publication_info": {"summary": "2014 IEEE/WIC/ACM International Joint Conferences on Web Intelligence (WI \u2026, 2014"}, "publication": "2014 IEEE/WIC/ACM International Joint Conferences on Web Intelligence (WI \u2026, 2014", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&cstart=100&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:fEOibwPWpKIC"}, {"title": "Web service matchmaking using a hybrid of signature and specification matching methods", "authors": "SSR Abidi, A Daniyal, SF Mehdi", "year": 2014, "citation_id": "fzr2PUYAAAAJ:4fKUyHm3Qg0C", "result_id": "fzr2PUYAAAAJ:4fKUyHm3Qg0C", "source": "scholar", "publication_info": {"summary": "2014 IEEE/WIC/ACM International Joint Conferences on Web Intelligence (WI \u2026, 2014"}, "publication": "2014 IEEE/WIC/ACM International Joint Conferences on Web Intelligence (WI \u2026, 2014", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&cstart=100&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:4fKUyHm3Qg0C"}, {"title": "D-WISE: Diabetes Web-Centric Information and Support Environment: conceptual specification and proposed evaluation", "authors": "S Abidi, M Vallis, SSR Abidi, H Piccinini-Vallis, SA Imran", "year": 2014, "citation_id": "fzr2PUYAAAAJ:u9iWguZQMMsC", "result_id": "fzr2PUYAAAAJ:u9iWguZQMMsC", "source": "scholar", "publication_info": {"summary": "Canadian Journal of Diabetes 38 (3), 205-211, 2014"}, "publication": "Canadian Journal of Diabetes 38 (3), 205-211, 2014", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&cstart=100&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:u9iWguZQMMsC"}, {"title": "Providing psychosocial support to young cancer patients through an online virtual world", "authors": "S Mahajan, SSR Abidi, D Reilly", "year": 2014, "citation_id": "fzr2PUYAAAAJ:eflP2zaiRacC", "result_id": "fzr2PUYAAAAJ:eflP2zaiRacC", "source": "scholar", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&cstart=100&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:eflP2zaiRacC"}, {"title": "A multi-phase correlation search framework for mining non-taxonomic relations from unstructured text", "authors": "MK Wong, SSR Abidi, ID Jonsen", "year": 2014, "citation_id": "fzr2PUYAAAAJ:9vf0nzSNQJEC", "result_id": "fzr2PUYAAAAJ:9vf0nzSNQJEC", "source": "scholar", "publication_info": {"summary": "Knowledge and information systems 38 (3), 641-667, 2014"}, "publication": "Knowledge and information systems 38 (3), 641-667, 2014", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&cstart=100&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:9vf0nzSNQJEC"}, {"title": "Shared decision making: using theories and technology to engage the patient in their health journey.", "authors": "A Russell, SR Abidi, SSR Abidi", "year": 2014, "citation_id": "fzr2PUYAAAAJ:1yQoGdGgb4wC", "result_id": "fzr2PUYAAAAJ:1yQoGdGgb4wC", "source": "scholar", "publication_info": {"summary": "MIE, 303-307, 2014"}, "publication": "MIE, 303-307, 2014", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&cstart=100&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:1yQoGdGgb4wC"}, {"title": "Towards guideline compliant clinical decision support system integration in smart and mobile environments: Formalizing and using clinical guidelines for diagnosing sleep apnea", "authors": "PC Roy, N Al Haider, W Van Woensel, AM Ahmad, SSR Abidi", "year": 2014, "citation_id": "fzr2PUYAAAAJ:dTyEYWd-f8wC", "result_id": "fzr2PUYAAAAJ:dTyEYWd-f8wC", "source": "scholar", "publication_info": {"summary": "28th AAAI conference on artificial intelligence, AAAI 2014, 38-43, 2014"}, "publication": "28th AAAI conference on artificial intelligence, AAAI 2014, 38-43, 2014", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&cstart=100&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:dTyEYWd-f8wC"}, {"title": "Clinical guideline-driven personalized self-management diary for paediatric cancer survivors.", "authors": "SA Stewart, SR Abidi, L Parker, M Bernstein, SSR Abidi", "year": 2014, "citation_id": "fzr2PUYAAAAJ:l7t_Zn2s7bgC", "result_id": "fzr2PUYAAAAJ:l7t_Zn2s7bgC", "source": "scholar", "publication_info": {"summary": "MIE, 18-22, 2014"}, "publication": "MIE, 18-22, 2014", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&cstart=100&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:l7t_Zn2s7bgC"}, {"title": "Canadian Spine Society abstracts1. 1.01 The effect of rib-based distraction surgery on spine growth. 1.1. 02 Responding to neuromonitoring changes in 3-column posterior spinal \u2026", "authors": "R El-Hawary, J Jarvis, S Alsayegh, A Raizah, A Harroud, Z Sardar, ...", "year": 2013, "citation_id": "fzr2PUYAAAAJ:wvYxNZNCP7wC", "result_id": "fzr2PUYAAAAJ:wvYxNZNCP7wC", "source": "scholar", "publication_info": {"summary": "Canadian Journal of Surgery 56 (4 Suppl 2), S54-S78, 2013"}, "publication": "Canadian Journal of Surgery 56 (4 Suppl 2), S54-S78, 2013", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&cstart=100&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:wvYxNZNCP7wC"}, {"title": "A Semantic Web Based Ontology Mapping and Instance Transformation Framework.", "authors": "B Jafarpour, SSR Abidi", "year": 2013, "citation_id": "fzr2PUYAAAAJ:PELIpwtuRlgC", "result_id": "fzr2PUYAAAAJ:PELIpwtuRlgC", "source": "scholar", "publication_info": {"summary": "CSWS, 5-11, 2013"}, "publication": "CSWS, 5-11, 2013", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&cstart=100&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:PELIpwtuRlgC"}, {"title": "An ontology-driven personalization framework for designing theory-driven self-management interventions", "authors": "SSR Abidi, S Abidi", "year": 2013, "citation_id": "fzr2PUYAAAAJ:JQOojiI6XY0C", "result_id": "fzr2PUYAAAAJ:JQOojiI6XY0C", "source": "scholar", "publication_info": {"summary": "International Workshop on Process-oriented Information Systems in Healthcare \u2026, 2013"}, "publication": "International Workshop on Process-oriented Information Systems in Healthcare \u2026, 2013", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&cstart=100&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:JQOojiI6XY0C"}, {"title": "Merging disease-specific clinical guidelines to handle comorbidities in a clinical decision support setting", "authors": "B Jafarpour, SSR Abidi", "year": 2013, "citation_id": "fzr2PUYAAAAJ:RGFaLdJalmkC", "result_id": "fzr2PUYAAAAJ:RGFaLdJalmkC", "source": "scholar", "publication_info": {"summary": "Conference on Artificial Intelligence in Medicine in Europe, 28-32, 2013"}, "publication": "Conference on Artificial Intelligence in Medicine in Europe, 28-32, 2013", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&cstart=100&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:RGFaLdJalmkC"}, {"title": "Dataflow oriented similarity matching for scientific workflows", "authors": "P Yeo, SSR Abidi", "year": 2013, "citation_id": "fzr2PUYAAAAJ:LPZeul_q3PIC", "result_id": "fzr2PUYAAAAJ:LPZeul_q3PIC", "source": "scholar", "publication_info": {"summary": "2013 IEEE International Symposium on Parallel & Distributed Processing \u2026, 2013"}, "publication": "2013 IEEE International Symposium on Parallel & Distributed Processing \u2026, 2013", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&cstart=100&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:LPZeul_q3PIC"}, {"title": "Usability evaluation of family physicians' interaction with the Comorbidity Ontological Modeling and ExecuTion System (COMET)", "authors": "SR Abidi, S Stewart, M Shepherd, SSR Abidi", "year": 2013, "citation_id": "fzr2PUYAAAAJ:ZuybSZzF8UAC", "result_id": "fzr2PUYAAAAJ:ZuybSZzF8UAC", "source": "scholar", "publication_info": {"summary": "MEDINFO 2013, 447-451, 2013"}, "publication": "MEDINFO 2013, 447-451, 2013", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&cstart=100&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:ZuybSZzF8UAC"}, {"title": "A semantic web based mobile framework for designing personalized patient self-management interventions", "authors": "SR Abidi, SSR Abidi, A Abusharek", "year": 2013, "citation_id": "fzr2PUYAAAAJ:HoB7MX3m0LUC", "result_id": "fzr2PUYAAAAJ:HoB7MX3m0LUC", "source": "scholar", "publication_info": {"summary": "Proceedings of the 1st Conference on Mobile and Information Technologies in \u2026, 2013"}, "publication": "Proceedings of the 1st Conference on Mobile and Information Technologies in \u2026, 2013", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&cstart=100&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:HoB7MX3m0LUC"}, {"title": "Applying social network analysis to understand the knowledge sharing behaviour of practitioners in a clinical online discussion forum", "authors": "SA Stewart, SSR Abidi", "year": 2012, "citation_id": "fzr2PUYAAAAJ:L8Ckcad2t8MC", "result_id": "fzr2PUYAAAAJ:L8Ckcad2t8MC", "source": "scholar", "publication_info": {"summary": "Journal of medical Internet research 14 (6), e1982, 2012"}, "publication": "Journal of medical Internet research 14 (6), e1982, 2012", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&cstart=100&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:L8Ckcad2t8MC"}, {"title": "Comparing Metamap to MGrep as a Tool for Mapping Free Text to Formal Medical Lexions.", "authors": "SA Stewart, ME Von Maltzahn, SSR Abidi", "year": 2012, "citation_id": "fzr2PUYAAAAJ:6ZxmRoH8BuwC", "result_id": "fzr2PUYAAAAJ:6ZxmRoH8BuwC", "source": "scholar", "publication_info": {"summary": "KECSM@ ISWC, 63-77, 2012"}, "publication": "KECSM@ ISWC, 63-77, 2012", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&cstart=100&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:6ZxmRoH8BuwC"}, {"title": "An ontological modeling approach to align institution-specific Clinical Pathways: Towards inter-institution care standardization", "authors": "SR Abidi, SSR Abidi", "year": 2012, "citation_id": "fzr2PUYAAAAJ:5awf1xo2G04C", "result_id": "fzr2PUYAAAAJ:5awf1xo2G04C", "source": "scholar", "publication_info": {"summary": "2012 25th IEEE International Symposium on Computer-Based Medical Systems \u2026, 2012"}, "publication": "2012 25th IEEE International Symposium on Computer-Based Medical Systems \u2026, 2012", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&cstart=100&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:5awf1xo2G04C"}, {"title": "Modeling clinical workflows using business process modeling notation", "authors": "N Hashemian, SSR Abidi", "year": 2012, "citation_id": "fzr2PUYAAAAJ:BqipwSGYUEgC", "result_id": "fzr2PUYAAAAJ:BqipwSGYUEgC", "source": "scholar", "publication_info": {"summary": "2012 25th IEEE International Symposium on Computer-Based Medical Systems \u2026, 2012"}, "publication": "2012 25th IEEE International Symposium on Computer-Based Medical Systems \u2026, 2012", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&cstart=100&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:BqipwSGYUEgC"}, {"title": "Using OWL ontologies for clinical guidelines based comorbid decision support", "authors": "S Abidi, J Cox, M Shepherd, SSR Abidi", "year": 2012, "citation_id": "fzr2PUYAAAAJ:ns9cj8rnVeAC", "result_id": "fzr2PUYAAAAJ:ns9cj8rnVeAC", "source": "scholar", "publication_info": {"summary": "2012 45th Hawaii International Conference on System Sciences, 3030-3038, 2012"}, "publication": "2012 45th Hawaii International Conference on System Sciences, 3030-3038, 2012", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&cstart=100&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:ns9cj8rnVeAC"}, {"title": "Applying social network analysis to understand the knowledge sharing behaviour of practitioners in a clinical discussion forum", "authors": "SA Stewart, SS Abidi", "year": 2012, "citation_id": "fzr2PUYAAAAJ:PVjk1bu6vJQC", "result_id": "fzr2PUYAAAAJ:PVjk1bu6vJQC", "source": "scholar", "publication_info": {"summary": "PubMed, 2012"}, "publication": "PubMed, 2012", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&cstart=100&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:PVjk1bu6vJQC"}, {"title": "An ontology framework for modeling ocean data and E-science semantic web services", "authors": "SR Abidi, SS Abidi, M Kwan, A Daniyal", "year": 2012, "citation_id": "fzr2PUYAAAAJ:-_dYPAW6P2MC", "result_id": "fzr2PUYAAAAJ:-_dYPAW6P2MC", "source": "scholar", "publication_info": {"summary": "Int. J. Adv. Comput. Sci 2 (8), 280-286, 2012"}, "publication": "Int. J. Adv. Comput. Sci 2 (8), 280-286, 2012", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&cstart=100&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:-_dYPAW6P2MC"}, {"title": "Ontology-based computerization of acute coronary syndrome clinical guideline for decision support in the emergency department", "authors": "M Omaish, S Abidi, S Abidi", "year": 2012, "citation_id": "fzr2PUYAAAAJ:nb7KW1ujOQ8C", "result_id": "fzr2PUYAAAAJ:nb7KW1ujOQ8C", "source": "scholar", "publication_info": {"summary": "Stud Health Technol Inform 180, 437-41, 2012"}, "publication": "Stud Health Technol Inform 180, 437-41, 2012", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&cstart=100&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:nb7KW1ujOQ8C"}, {"title": "An Infobutton for Web 2.0 clinical discussions: the knowledge linkage framework", "authors": "SA Stewart, SSR Abidi", "year": 2011, "citation_id": "fzr2PUYAAAAJ:a0OBvERweLwC", "result_id": "fzr2PUYAAAAJ:a0OBvERweLwC", "source": "scholar", "publication_info": {"summary": "IEEE Transactions on Information Technology in Biomedicine 16 (1), 129-135, 2011"}, "publication": "IEEE Transactions on Information Technology in Biomedicine 16 (1), 129-135, 2011", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&cstart=100&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:a0OBvERweLwC"}, {"title": "Ontology modeling for oceans knowledge and data management", "authors": "SR Abidi, SS Abidi, M Kwan, A Daniyal", "year": 2011, "citation_id": "fzr2PUYAAAAJ:0izLItjtcgwC", "result_id": "fzr2PUYAAAAJ:0izLItjtcgwC", "source": "scholar", "publication_info": {"summary": "International Conference on Intelligent Computational Systems, 2011"}, "publication": "International Conference on Intelligent Computational Systems, 2011", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&cstart=100&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:0izLItjtcgwC"}, {"title": "Detecting and resolving inconsistencies in ontologies using contradiction derivations", "authors": "S Hussain, J De Roo, A Daniyal, SSR Abidi", "year": 2011, "citation_id": "fzr2PUYAAAAJ:70eg2SAEIzsC", "result_id": "fzr2PUYAAAAJ:70eg2SAEIzsC", "source": "scholar", "publication_info": {"summary": "2011 IEEE 35th Annual Computer Software and Applications Conference, 556-561, 2011"}, "publication": "2011 IEEE 35th Annual Computer Software and Applications Conference, 556-561, 2011", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&cstart=100&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:70eg2SAEIzsC"}, {"title": "A Semantic Web based E-Science Framework for Ocean Knowledge Management", "authors": "SSR Abidi, A Daniyal, A Abusharekh, SR Abidi, P Yeo, F Khan, M Kwan, ...", "year": 2011, "citation_id": "fzr2PUYAAAAJ:_Re3VWB3Y0AC", "result_id": "fzr2PUYAAAAJ:_Re3VWB3Y0AC", "source": "scholar", "publication_info": {"summary": "Intl. Conf. on Innovation and Management, Kuala Lumpur, 2011"}, "publication": "Intl. Conf. on Innovation and Management, Kuala Lumpur, 2011", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&cstart=100&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:_Re3VWB3Y0AC"}, {"title": "Exploiting OWL reasoning services to execute ontologically-modeled clinical practice guidelines", "authors": "B Jafarpour, SR Abidi, SSR Abidi", "year": 2011, "citation_id": "fzr2PUYAAAAJ:R3hNpaxXUhUC", "result_id": "fzr2PUYAAAAJ:R3hNpaxXUhUC", "source": "scholar", "publication_info": {"summary": "Conference on Artificial Intelligence in Medicine in Europe, 307-311, 2011"}, "publication": "Conference on Artificial Intelligence in Medicine in Europe, 307-311, 2011", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&cstart=100&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:R3hNpaxXUhUC"}, {"title": "MINING NON-TAXONOMIC CONCEPT PAIRS FROM UNSTRUCTURED TEXT-A Concept Correlation Search Framework", "authors": "MK Wong, SSR Abidi, ID Jonsen", "year": 2011, "citation_id": "fzr2PUYAAAAJ:M7yex6snE4oC", "result_id": "fzr2PUYAAAAJ:M7yex6snE4oC", "source": "scholar", "publication_info": {"summary": "Special Session on Web and Text Mining 2, 707-716, 2011"}, "publication": "Special Session on Web and Text Mining 2, 707-716, 2011", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&cstart=100&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:M7yex6snE4oC"}, {"title": "Using social network analysis to study the knowledge sharing patterns of health professionals using web 2.0 tools", "authors": "SA Stewart, SSR Abidi", "year": 2011, "citation_id": "fzr2PUYAAAAJ:b0M2c_1WBrUC", "result_id": "fzr2PUYAAAAJ:b0M2c_1WBrUC", "source": "scholar", "publication_info": {"summary": "International Joint Conference on Biomedical Engineering Systems and \u2026, 2011"}, "publication": "International Joint Conference on Biomedical Engineering Systems and \u2026, 2011", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&cstart=100&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:b0M2c_1WBrUC"}, {"title": "An ontology-based electronic medical record for chronic disease management", "authors": "AM Iqbal, M Shepherd, SSR Abidi", "year": 2011, "citation_id": "fzr2PUYAAAAJ:XvxMoLDsR5gC", "result_id": "fzr2PUYAAAAJ:XvxMoLDsR5gC", "source": "scholar", "publication_info": {"summary": "2011 44th Hawaii International Conference on System Sciences, 1-10, 2011"}, "publication": "2011 44th Hawaii International Conference on System Sciences, 1-10, 2011", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&cstart=100&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:XvxMoLDsR5gC"}, {"title": "UNDERSTANDING MEDICINE 2.0", "authors": "S Stewart, SSR Abidi", "year": 2011, "citation_id": "fzr2PUYAAAAJ:ce2CqMG-AY4C", "result_id": "fzr2PUYAAAAJ:ce2CqMG-AY4C", "source": "scholar", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&cstart=100&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:ce2CqMG-AY4C"}, {"title": "Canadian Spine Society", "authors": "FC Frontenac, FLC Frontenac", "year": 2011, "citation_id": "fzr2PUYAAAAJ:-jrNzM816MMC", "result_id": "fzr2PUYAAAAJ:-jrNzM816MMC", "source": "scholar", "publication_info": {"summary": "Sleep 1, 01, 2011"}, "publication": "Sleep 1, 01, 2011", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&cstart=100&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:-jrNzM816MMC"}, {"title": "Understanding Medicine 2.0-Social Network Analysis and the VECoN System.", "authors": "SA Stewart, SSR Abidi, V Traver, ALN Fred, J Filipe, H Gamboa", "year": 2011, "citation_id": "fzr2PUYAAAAJ:a9-T7VOCCH8C", "result_id": "fzr2PUYAAAAJ:a9-T7VOCCH8C", "source": "scholar", "publication_info": {"summary": "HEALTHINF, 70-79, 2011"}, "publication": "HEALTHINF, 70-79, 2011", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&cstart=100&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:a9-T7VOCCH8C"}, {"title": "A Knowledge-centric e-Research Platform for Marine Life and Oceanographic Research.", "authors": "A Daniyal, SR Abidi, A AbuSharekh, MK Wong, SSR Abidi", "year": 2010, "citation_id": "fzr2PUYAAAAJ:2VqYfGB8ITEC", "result_id": "fzr2PUYAAAAJ:2VqYfGB8ITEC", "source": "scholar", "publication_info": {"summary": "KMIS, 363-366, 2010"}, "publication": "KMIS, 363-366, 2010", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&cstart=100&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:2VqYfGB8ITEC"}, {"title": "A service oriented e-research platform for ocean knowledge management", "authors": "SSR Abidi, A Abusharek, A Daniyal, M Kuan, F Mehdi, S Abidi, F Abbas, ...", "year": 2010, "citation_id": "fzr2PUYAAAAJ:tKAzc9rXhukC", "result_id": "fzr2PUYAAAAJ:tKAzc9rXhukC", "source": "scholar", "publication_info": {"summary": "2010 6th World Congress on Services, 32-39, 2010"}, "publication": "2010 6th World Congress on Services, 32-39, 2010", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&cstart=100&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:tKAzc9rXhukC"}, {"title": "Linking Specialized Online Medical Discussions to Online Medical Literature", "authors": "S Stewart, SSR Abidi, A Finley", "year": 2010, "citation_id": "fzr2PUYAAAAJ:L7CI7m0gUJcC", "result_id": "fzr2PUYAAAAJ:L7CI7m0gUJcC", "source": "scholar", "publication_info": {"summary": "Using Web Data in the Medical Do-main, 35, 2010"}, "publication": "Using Web Data in the Medical Do-main, 35, 2010", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&cstart=100&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:L7CI7m0gUJcC"}, {"title": "Extracting and Merging Contextualized Ontology Modules.", "authors": "S Hussain, SSR Abidi", "year": 2010, "citation_id": "fzr2PUYAAAAJ:2P1L_qKh6hAC", "result_id": "fzr2PUYAAAAJ:2P1L_qKh6hAC", "source": "scholar", "publication_info": {"summary": "WoMO, 25-40, 2010"}, "publication": "WoMO, 25-40, 2010", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&cstart=100&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:2P1L_qKh6hAC"}, {"title": "Semantic Web Services for Ocean Knowledge Management", "authors": "SSR Abidi, A Daniyal, A Abusharek, SR Abidi", "year": 2010, "citation_id": "fzr2PUYAAAAJ:z_wVstp3MssC", "result_id": "fzr2PUYAAAAJ:z_wVstp3MssC", "source": "scholar", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&cstart=100&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:z_wVstp3MssC"}, {"title": "Pediatric pain management knowledge linkages: mapping experiential knowledge to explicit knowledge", "authors": "S Stewart, SSR Abidi, A Finley", "year": 2010, "citation_id": "fzr2PUYAAAAJ:VLnqNzywnoUC", "result_id": "fzr2PUYAAAAJ:VLnqNzywnoUC", "source": "scholar", "publication_info": {"summary": "MEDINFO 2010, 1184-1188, 2010"}, "publication": "MEDINFO 2010, 1184-1188, 2010", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&cstart=100&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:VLnqNzywnoUC"}, {"title": "A compositional personalization approach for designing personalized patient educational interventions for cardiovascular risk management.", "authors": "S Davis, SSR Abidi, SA Stewart", "year": 2010, "citation_id": "fzr2PUYAAAAJ:yD5IFk8b50cC", "result_id": "fzr2PUYAAAAJ:yD5IFk8b50cC", "source": "scholar", "publication_info": {"summary": "MedInfo, 629-633, 2010"}, "publication": "MedInfo, 629-633, 2010", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&cstart=100&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:yD5IFk8b50cC"}, {"title": "Ontology based modeling and execution of Nursing Care Plans and Practice Guidelines.", "authors": "MA Din, SSR Abidi, B Jafarpour", "year": 2010, "citation_id": "fzr2PUYAAAAJ:Wp0gIr-vW9MC", "result_id": "fzr2PUYAAAAJ:Wp0gIr-vW9MC", "source": "scholar", "publication_info": {"summary": "MedInfo, 1104-1108, 2010"}, "publication": "MedInfo, 1104-1108, 2010", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&cstart=100&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:Wp0gIr-vW9MC"}, {"title": "A web recommender system for recommending, predicting and personalizing music playlists", "authors": "Z Chedrawy, SSR Abidi", "year": 2009, "citation_id": "fzr2PUYAAAAJ:JV2RwH3_ST0C", "result_id": "fzr2PUYAAAAJ:JV2RwH3_ST0C", "source": "scholar", "publication_info": {"summary": "International Conference on Web Information Systems Engineering, 335-342, 2009"}, "publication": "International Conference on Web Information Systems Engineering, 335-342, 2009", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&cstart=100&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:JV2RwH3_ST0C"}, {"title": "Bridging the gap: knowledge seeking and sharing in a virtual community of emergency practice", "authors": "JA Curran, AL Murphy, SSR Abidi, D Sinclair, PJ McGrath", "year": 2009, "citation_id": "fzr2PUYAAAAJ:UeHWp8X0CEIC", "result_id": "fzr2PUYAAAAJ:UeHWp8X0CEIC", "source": "scholar", "publication_info": {"summary": "Evaluation & the health professions 32 (3), 314-327, 2009"}, "publication": "Evaluation & the health professions 32 (3), 314-327, 2009", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&cstart=100&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:UeHWp8X0CEIC"}, {"title": "Knowledge sharing for pediatric pain management via a Web 2.0 framework", "authors": "KP Adlassnig", "year": 2009, "citation_id": "fzr2PUYAAAAJ:ULOm3_A8WrAC", "result_id": "fzr2PUYAAAAJ:ULOm3_A8WrAC", "source": "scholar", "publication_info": {"summary": "Medical Informatics in a United and Healthy Europe: Proceedings of MIE 2009 \u2026, 2009"}, "publication": "Medical Informatics in a United and Healthy Europe: Proceedings of MIE 2009 \u2026, 2009", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&cstart=100&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:ULOm3_A8WrAC"}, {"title": "Semantic Web-based modeling of Clinical Pathways using the UML Activity Diagrams and OWL-S", "authors": "A Daniyal, SSR Abidi", "year": 2009, "citation_id": "fzr2PUYAAAAJ:4JMBOYKVnBMC", "result_id": "fzr2PUYAAAAJ:4JMBOYKVnBMC", "source": "scholar", "publication_info": {"summary": "International Workshop on Knowledge Representation for Health Care, 88-99, 2009"}, "publication": "International Workshop on Knowledge Representation for Health Care, 88-99, 2009", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&cstart=100&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:4JMBOYKVnBMC"}, {"title": "Integrating healthcare knowledge artifacts for clinical decision support: towards semantic web based healthcare knowledge morphing", "authors": "S Hussain, SSR Abidi", "year": 2009, "citation_id": "fzr2PUYAAAAJ:RHpTSmoSYBkC", "result_id": "fzr2PUYAAAAJ:RHpTSmoSYBkC", "source": "scholar", "publication_info": {"summary": "Conference on Artificial Intelligence in Medicine in Europe, 171-175, 2009"}, "publication": "Conference on Artificial Intelligence in Medicine in Europe, 171-175, 2009", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&cstart=100&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:RHpTSmoSYBkC"}, {"title": "Towards the merging of multiple clinical protocols and guidelines via ontology-driven modeling", "authors": "SR Abidi, SSR Abidi", "year": 2009, "citation_id": "fzr2PUYAAAAJ:8k81kl-MbHgC", "result_id": "fzr2PUYAAAAJ:8k81kl-MbHgC", "source": "scholar", "publication_info": {"summary": "Conference on Artificial Intelligence in Medicine in Europe, 81-85, 2009"}, "publication": "Conference on Artificial Intelligence in Medicine in Europe, 81-85, 2009", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&cstart=100&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:8k81kl-MbHgC"}, {"title": "Intelligent Information personalization: From issues to strategies", "authors": "SSR Abidi", "year": 2009, "citation_id": "fzr2PUYAAAAJ:M3NEmzRMIkIC", "result_id": "fzr2PUYAAAAJ:M3NEmzRMIkIC", "source": "scholar", "publication_info": {"summary": "Intelligent User Interfaces: Adaptation and Personalization Systems and \u2026, 2009"}, "publication": "Intelligent User Interfaces: Adaptation and Personalization Systems and \u2026, 2009", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&cstart=100&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:M3NEmzRMIkIC"}, {"title": "Computerizing clinical pathways: ontology-based modeling and execution.", "authors": "A Daniyal, SR Abidi, SSR Abidi", "year": 2009, "citation_id": "fzr2PUYAAAAJ:UebtZRa9Y70C", "result_id": "fzr2PUYAAAAJ:UebtZRa9Y70C", "source": "scholar", "publication_info": {"summary": "MIE, 643-647, 2009"}, "publication": "MIE, 643-647, 2009", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&cstart=100&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:UebtZRa9Y70C"}, {"title": "Operationalizing prostate cancer clinical pathways: An ontological model to computerize, merge and execute institution-specific clinical pathways", "authors": "SR Abidi, SSR Abidi, L Butler, S Hussain", "year": 2008, "citation_id": "fzr2PUYAAAAJ:HtEfBTGE9r8C", "result_id": "fzr2PUYAAAAJ:HtEfBTGE9r8C", "source": "scholar", "publication_info": {"summary": "Workshop on Knowledge Management for Health Care Procedures, 1-12, 2008"}, "publication": "Workshop on Knowledge Management for Health Care Procedures, 1-12, 2008", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&cstart=100&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:HtEfBTGE9r8C"}, {"title": "Modeling the form and function of clinical practice guidelines: An ontological model to computerize clinical practice guidelines", "authors": "SSR Abidi, S Shayegani", "year": 2008, "citation_id": "fzr2PUYAAAAJ:mVmsd5A6BfQC", "result_id": "fzr2PUYAAAAJ:mVmsd5A6BfQC", "source": "scholar", "publication_info": {"summary": "Workshop on Knowledge Management for Health Care Procedures, 81-91, 2008"}, "publication": "Workshop on Knowledge Management for Health Care Procedures, 81-91, 2008", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&cstart=100&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:mVmsd5A6BfQC"}, {"title": "Ontology-based modeling and merging of institution-specific prostate cancer clinical pathways", "authors": "S Abidi, R Abidi, S Hussain, L Butler", "year": 2008, "citation_id": "fzr2PUYAAAAJ:TIZ-Mc8IlK0C", "result_id": "fzr2PUYAAAAJ:TIZ-Mc8IlK0C", "source": "scholar", "publication_info": {"summary": "Knowledge Management for Healthcare Processes Workshop at ECAI, 21-25, 2008"}, "publication": "Knowledge Management for Healthcare Processes Workshop at ECAI, 21-25, 2008", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&cstart=100&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:TIZ-Mc8IlK0C"}, {"title": "Knowledge Management for Health Care Procedures: From Knowledge to Global Care, AIME 2007 Workshop K4CARE 2007, Amsterdam, The Netherlands, July 7, 2007, Revised Selected Papers", "authors": "D Ria\u00f1o", "year": 2008, "citation_id": "fzr2PUYAAAAJ:ALROH1vI_8AC", "result_id": "fzr2PUYAAAAJ:ALROH1vI_8AC", "source": "scholar", "publication_info": {"summary": "Springer, 2008"}, "publication": "Springer, 2008", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&cstart=100&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:ALROH1vI_8AC"}, {"title": "Knowledge management for health care procedures", "authors": "SSR Abidi, D RIA\u00d1O", "year": 2008, "citation_id": "fzr2PUYAAAAJ:ZzlSgRqYykMC", "result_id": "fzr2PUYAAAAJ:ZzlSgRqYykMC", "source": "scholar", "publication_info": {"summary": "New York: Springer London, Limited, 5-6, 2008"}, "publication": "New York: Springer London, Limited, 5-6, 2008", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&cstart=100&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:ZzlSgRqYykMC"}, {"title": "A clinical practice guideline-based ontology driven clinical decision support system for breast cancer follow-up", "authors": "SR Abidi, M Shepherd", "year": 2008, "citation_id": "fzr2PUYAAAAJ:yFnVuubrUp4C", "result_id": "fzr2PUYAAAAJ:yFnVuubrUp4C", "source": "scholar", "publication_info": {"summary": "Journal on Information Technology in Healthcare 6 (1), 23-32, 2008"}, "publication": "Journal on Information Technology in Healthcare 6 (1), 23-32, 2008", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&cstart=100&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:yFnVuubrUp4C"}, {"title": "Generating customized yet factually consistent information: a constraint satisfaction approach", "authors": "SSR Abidi, YH Chong, Y Zeng", "year": 2008, "citation_id": "fzr2PUYAAAAJ:uLbwQdceFCQC", "result_id": "fzr2PUYAAAAJ:uLbwQdceFCQC", "source": "scholar", "publication_info": {"summary": "International Journal on Digital Libraries 8 (3), 247, 2008"}, "publication": "International Journal on Digital Libraries 8 (3), 247, 2008", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&cstart=100&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:uLbwQdceFCQC"}, {"title": "Generating personalised cardiovascular risk management educational interventions linking SCORE and behaviour change", "authors": "S Davis, S Abidi, J Cox", "year": 2008, "citation_id": "fzr2PUYAAAAJ:SeFeTyx0c_EC", "result_id": "fzr2PUYAAAAJ:SeFeTyx0c_EC", "source": "scholar", "publication_info": {"summary": "J Inf Technol Healthcare 6, 73-82, 2008"}, "publication": "J Inf Technol Healthcare 6, 73-82, 2008", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&cstart=100&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:SeFeTyx0c_EC"}, {"title": "An ontology-based framework for authoring and executing clinical practice guidelines for clinical decision support systems", "authors": "S Hussain, SSR Abidi", "year": 2008, "citation_id": "fzr2PUYAAAAJ:RYcK_YlVTxYC", "result_id": "fzr2PUYAAAAJ:RYcK_YlVTxYC", "source": "scholar", "publication_info": {"summary": "J. Inf. Technol. Healthc 6 (1), 8-22, 2008"}, "publication": "J. Inf. Technol. Healthc 6 (1), 8-22, 2008", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&cstart=100&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:RYcK_YlVTxYC"}, {"title": "Evaluation of an online discussion forum for emergency practitioners", "authors": "JA Curran, S Sibte Raza Abidi", "year": 2007, "citation_id": "fzr2PUYAAAAJ:_FxGoFyzp5QC", "result_id": "fzr2PUYAAAAJ:_FxGoFyzp5QC", "source": "scholar", "publication_info": {"summary": "Health Informatics Journal 13 (4), 255-266, 2007"}, "publication": "Health Informatics Journal 13 (4), 255-266, 2007", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&cstart=100&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:_FxGoFyzp5QC"}, {"title": "Semantic web framework for knowledge-centric clinical decision support systems", "authors": "S Hussain, S Raza Abidi, SS Raza Abidi", "year": 2007, "citation_id": "fzr2PUYAAAAJ:IjCSPb-OGe4C", "result_id": "fzr2PUYAAAAJ:IjCSPb-OGe4C", "source": "scholar", "publication_info": {"summary": "Conference on Artificial Intelligence in Medicine in Europe, 451-455, 2007"}, "publication": "Conference on Artificial Intelligence in Medicine in Europe, 451-455, 2007", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&cstart=100&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:IjCSPb-OGe4C"}, {"title": "Healthcare knowledge management: The art of the possible", "authors": "SSR Abidi", "year": 2007, "citation_id": "fzr2PUYAAAAJ:d1gkVwhDpl0C", "result_id": "fzr2PUYAAAAJ:d1gkVwhDpl0C", "source": "scholar", "publication_info": {"summary": "AIME workshop on knowledge management for health care procedures, 1-20, 2007"}, "publication": "AIME workshop on knowledge management for health care procedures, 1-20, 2007", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&cstart=100&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:d1gkVwhDpl0C"}, {"title": "Medical knowledge morphing via a semantic web framework", "authors": "SSR Abidi, S Hussain", "year": 2007, "citation_id": "fzr2PUYAAAAJ:qxL8FJ1GzNcC", "result_id": "fzr2PUYAAAAJ:qxL8FJ1GzNcC", "source": "scholar", "publication_info": {"summary": "Twentieth IEEE International Symposium on Computer-Based Medical Systems \u2026, 2007"}, "publication": "Twentieth IEEE International Symposium on Computer-Based Medical Systems \u2026, 2007", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&cstart=100&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:qxL8FJ1GzNcC"}, {"title": "Ontology engineering to model clinical pathways: Towards the computerization and execution of clinical pathways", "authors": "KF Hurley, SSR Abidi", "year": 2007, "citation_id": "fzr2PUYAAAAJ:2osOgNQ5qMEC", "result_id": "fzr2PUYAAAAJ:2osOgNQ5qMEC", "source": "scholar", "publication_info": {"summary": "Twentieth IEEE International Symposium on Computer-Based Medical Systems \u2026, 2007"}, "publication": "Twentieth IEEE International Symposium on Computer-Based Medical Systems \u2026, 2007", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&cstart=100&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:2osOgNQ5qMEC"}, {"title": "Ontology driven CPG authoring and execution via a Semantic Web framework", "authors": "S Hussain, SSR Abidi", "year": 2007, "citation_id": "fzr2PUYAAAAJ:kNdYIx-mwKoC", "result_id": "fzr2PUYAAAAJ:kNdYIx-mwKoC", "source": "scholar", "publication_info": {"summary": "2007 40th Annual Hawaii International Conference on System Sciences (HICSS \u2026, 2007"}, "publication": "2007 40th Annual Hawaii International Conference on System Sciences (HICSS \u2026, 2007", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&cstart=100&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:kNdYIx-mwKoC"}, {"title": "Pursuing Information Personalization as a Constraint Satisfaction Problem", "authors": "Y Zeng, SSR Abidi", "year": 2007, "citation_id": "fzr2PUYAAAAJ:1yWc8FF-_SYC", "result_id": "fzr2PUYAAAAJ:1yWc8FF-_SYC", "source": "scholar", "publication_info": {"summary": "Library and Archives Canada= Bibliothe\u0300que et Archives Canada, Ottawa, 2007"}, "publication": "Library and Archives Canada= Bibliothe\u0300que et Archives Canada, Ottawa, 2007", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&cstart=100&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:1yWc8FF-_SYC"}, {"title": "A Semantic Web Based Framework for Modelling Clinical Practice Guidelines to Develop Clinical Decision Support Systems", "authors": "S Hussain, SSR Abidi", "year": 2007, "citation_id": "fzr2PUYAAAAJ:ZfRJV9d4-WMC", "result_id": "fzr2PUYAAAAJ:ZfRJV9d4-WMC", "source": "scholar", "publication_info": {"summary": "Medinfo 2007: Proceedings of the 12th World Congress on Health (Medical \u2026, 2007"}, "publication": "Medinfo 2007: Proceedings of the 12th World Congress on Health (Medical \u2026, 2007", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&cstart=100&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:ZfRJV9d4-WMC"}, {"title": "Personalized Patient Education for Cardiovascular Risk Management: A Synergy of Behavioural Modelling, SCORE and Compositional Information Personalization Methods", "authors": "S Davis, SSR Abidi", "year": 2007, "citation_id": "fzr2PUYAAAAJ:VL0QpB8kHFEC", "result_id": "fzr2PUYAAAAJ:VL0QpB8kHFEC", "source": "scholar", "publication_info": {"summary": "Medinfo 2007: Proceedings of the 12th World Congress on Health (Medical \u2026, 2007"}, "publication": "Medinfo 2007: Proceedings of the 12th World Congress on Health (Medical \u2026, 2007", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&cstart=100&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:VL0QpB8kHFEC"}, {"title": "Context-aware and ontology-driven knowledge sharing in P2P communities", "authors": "P O'Brien, SSR Abidi", "year": 2007, "citation_id": "fzr2PUYAAAAJ:Tiz5es2fbqcC", "result_id": "fzr2PUYAAAAJ:Tiz5es2fbqcC", "source": "scholar", "publication_info": {"summary": "Creating Collaborative Advantage Through Knowledge And Innovation, 155-174, 2007"}, "publication": "Creating Collaborative Advantage Through Knowledge And Innovation, 155-174, 2007", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&cstart=100&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:Tiz5es2fbqcC"}, {"title": "Automated interpretation of optic nerve images: a data mining framework for glaucoma diagnostic support", "authors": "SSR Abidi, PH Artes, S Yun, J Yu", "year": 2007, "citation_id": "fzr2PUYAAAAJ:P5F9QuxV20EC", "result_id": "fzr2PUYAAAAJ:P5F9QuxV20EC", "source": "scholar", "publication_info": {"summary": "MEDINFO 2007, 1309-1313, 2007"}, "publication": "MEDINFO 2007, 1309-1313, 2007", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&cstart=100&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:P5F9QuxV20EC"}, {"title": "Healthcare knowledge sharing: purpose, practices, and prospects", "authors": "SSR Abidi", "year": 2007, "citation_id": "fzr2PUYAAAAJ:W7OEmFMy1HYC", "result_id": "fzr2PUYAAAAJ:W7OEmFMy1HYC", "source": "scholar", "publication_info": {"summary": "Healthcare knowledge management: Issues, advances, and successes, 67-86, 2007"}, "publication": "Healthcare knowledge management: Issues, advances, and successes, 67-86, 2007", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&cstart=100&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:W7OEmFMy1HYC"}, {"title": "Ontology-based modeling of clinical practice guidelines: a clinical decision support system for breast cancer follow-up interventions at primary care settings.", "authors": "SR Abidi, SSR Abidi, S Hussain, M Shepherd", "year": 2007, "citation_id": "fzr2PUYAAAAJ:Y0pCki6q_DkC", "result_id": "fzr2PUYAAAAJ:Y0pCki6q_DkC", "source": "scholar", "publication_info": {"summary": "Studies in health technology and informatics 129 (2), 845, 2007"}, "publication": "Studies in health technology and informatics 129 (2), 845, 2007", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&cstart=100&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:Y0pCki6q_DkC"}, {"title": "Adaptable personalized care planning via a semantic web framework", "authors": "SSR Abidi, H Chen", "year": 2006, "citation_id": "fzr2PUYAAAAJ:7T2F9Uy0os0C", "result_id": "fzr2PUYAAAAJ:7T2F9Uy0os0C", "source": "scholar", "publication_info": {"summary": "20th International Congress of the European Federation for Medical \u2026, 2006"}, "publication": "20th International Congress of the European Federation for Medical \u2026, 2006", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&cstart=100&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:7T2F9Uy0os0C"}, {"title": "An adaptive hypermedia system using a constraint satisfaction approach for information personalization", "authors": "SSR Abidi, Y Zeng", "year": 2006, "citation_id": "fzr2PUYAAAAJ:XiVPGOgt02cC", "result_id": "fzr2PUYAAAAJ:XiVPGOgt02cC", "source": "scholar", "publication_info": {"summary": "International Conference on Adaptive Hypermedia and Adaptive Web-Based \u2026, 2006"}, "publication": "International Conference on Adaptive Hypermedia and Adaptive Web-Based \u2026, 2006", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&cstart=100&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:XiVPGOgt02cC"}, {"title": "Adaptive patient education framework featuring personalized cardiovascular risk management interventions", "authors": "S Davis, SSR Abidi", "year": 2006, "citation_id": "fzr2PUYAAAAJ:k_IJM867U9cC", "result_id": "fzr2PUYAAAAJ:k_IJM867U9cC", "source": "scholar", "publication_info": {"summary": "International Conference on Adaptive Hypermedia and Adaptive Web-Based \u2026, 2006"}, "publication": "International Conference on Adaptive Hypermedia and Adaptive Web-Based \u2026, 2006", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&cstart=100&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:k_IJM867U9cC"}, {"title": "An adaptive personalized recommendation strategy featuring context sensitive content adaptation", "authors": "Z Chedrawy, SSR Abidi", "year": 2006, "citation_id": "fzr2PUYAAAAJ:WF5omc3nYNoC", "result_id": "fzr2PUYAAAAJ:WF5omc3nYNoC", "source": "scholar", "publication_info": {"summary": "International Conference on Adaptive Hypermedia and Adaptive Web-Based \u2026, 2006"}, "publication": "International Conference on Adaptive Hypermedia and Adaptive Web-Based \u2026, 2006", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&cstart=100&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:WF5omc3nYNoC"}, {"title": "Intelligent information personalization leveraging constraint satisfaction and association rule methods", "authors": "SSR Abidi, Y Zeng", "year": 2006, "citation_id": "fzr2PUYAAAAJ:zA6iFVUQeVQC", "result_id": "fzr2PUYAAAAJ:zA6iFVUQeVQC", "source": "scholar", "publication_info": {"summary": "Conference of the Canadian Society for Computational Studies of Intelligence \u2026, 2006"}, "publication": "Conference of the Canadian Society for Computational Studies of Intelligence \u2026, 2006", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&cstart=100&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:zA6iFVUQeVQC"}, {"title": "Generating customized yet factually consistent information: a constraint satisfaction approach", "authors": "SSR Abidi, YH Chong, Y Zeng", "year": 2006, "citation_id": "fzr2PUYAAAAJ:1sJd4Hv_s6UC", "result_id": "fzr2PUYAAAAJ:1sJd4Hv_s6UC", "source": "scholar", "publication_info": {"summary": "International Journal on Digital Libraries 6 (3), 247-259, 2006"}, "publication": "International Journal on Digital Libraries 6 (3), 247-259, 2006", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&cstart=100&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:1sJd4Hv_s6UC"}, {"title": "Contextual knowledge sharing in a P2P network", "authors": "P O'Brien, SSR Abidi", "year": 2006, "citation_id": "fzr2PUYAAAAJ:NhqRSupF_l8C", "result_id": "fzr2PUYAAAAJ:NhqRSupF_l8C", "source": "scholar", "publication_info": {"summary": "2006 IEEE International Conference on Engineering of Intelligent Systems, 1-6, 2006"}, "publication": "2006 IEEE International Conference on Engineering of Intelligent Systems, 1-6, 2006", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&cstart=100&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:NhqRSupF_l8C"}, {"title": "Modeling intelligent ontology evolution using biological evolutionary processes", "authors": "P O'Brien, SSR Abidi", "year": 2006, "citation_id": "fzr2PUYAAAAJ:hC7cP41nSMkC", "result_id": "fzr2PUYAAAAJ:hC7cP41nSMkC", "source": "scholar", "publication_info": {"summary": "2006 IEEE international conference on engineering of intelligent systems, 1-6, 2006"}, "publication": "2006 IEEE international conference on engineering of intelligent systems, 1-6, 2006", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&cstart=100&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:hC7cP41nSMkC"}, {"title": "Case based reasoning for information personalization: using a context-sensitive compositional case adaptation approach", "authors": "Z Chedrawy, SSR Abidi", "year": 2006, "citation_id": "fzr2PUYAAAAJ:QIV2ME_5wuYC", "result_id": "fzr2PUYAAAAJ:QIV2ME_5wuYC", "source": "scholar", "publication_info": {"summary": "2006 IEEE International Conference on Engineering of Intelligent Systems, 1-6, 2006"}, "publication": "2006 IEEE International Conference on Engineering of Intelligent Systems, 1-6, 2006", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&cstart=100&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:QIV2ME_5wuYC"}, {"title": "Linking tacit knowledge in the pediatric pain e-mail archives and explicit knowledge in PubMed", "authors": "Z Chen, M Shepherd, SSR Abidi, GA Finley", "year": 2006, "citation_id": "fzr2PUYAAAAJ:abG-DnoFyZgC", "result_id": "fzr2PUYAAAAJ:abG-DnoFyZgC", "source": "scholar", "publication_info": {"summary": "Proceedings of the 39th Annual Hawaii International Conference on System \u2026, 2006"}, "publication": "Proceedings of the 39th Annual Hawaii International Conference on System \u2026, 2006", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&cstart=100&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:abG-DnoFyZgC"}, {"title": "Personalized cardiovascular risk management linking SCORE and behaviour change to Web-based education.", "authors": "S Davis, SSR Abidi, J Cox", "year": 2006, "citation_id": "fzr2PUYAAAAJ:CaZNVDsoPx4C", "result_id": "fzr2PUYAAAAJ:CaZNVDsoPx4C", "source": "scholar", "publication_info": {"summary": "Studies in health technology and informatics 124, 235, 2006"}, "publication": "Studies in health technology and informatics 124, 235, 2006", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&cstart=100&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:CaZNVDsoPx4C"}, {"title": "Constraint Satisfaction and Search-Intelligent Information Personalization Leveraging Constraint Satisfaction and Association Rule Methods", "authors": "SS Raza Abidi, Y Zeng", "year": 2006, "citation_id": "fzr2PUYAAAAJ:umqufdRvDiIC", "result_id": "fzr2PUYAAAAJ:umqufdRvDiIC", "source": "scholar", "publication_info": {"summary": "Lecture Notes in Computer Science 4013, 134-145, 2006"}, "publication": "Lecture Notes in Computer Science 4013, 134-145, 2006", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&cstart=100&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:umqufdRvDiIC"}, {"title": "Tailoring cardiovascular risk management educational interventions: A synergy of SCORE risk assessment and behavior change model", "authors": "S Davis, SSR Abidi", "year": 2006, "citation_id": "fzr2PUYAAAAJ:kuK5TVdYjLIC", "result_id": "fzr2PUYAAAAJ:kuK5TVdYjLIC", "source": "scholar", "publication_info": {"summary": "Proceedings of the 11th International Symposium on Health Information \u2026, 2006"}, "publication": "Proceedings of the 11th International Symposium on Health Information \u2026, 2006", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&cstart=100&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:kuK5TVdYjLIC"}, {"title": "Evaluation of a discussion forum for knowledge sharing among emergency practitioners: a social network approach", "authors": "J Curran, SSR Abidi", "year": 2006, "citation_id": "fzr2PUYAAAAJ:XiSMed-E-HIC", "result_id": "fzr2PUYAAAAJ:XiSMed-E-HIC", "source": "scholar", "publication_info": {"summary": "Studies in Health Technology and Informatics 124, 941, 2006"}, "publication": "Studies in Health Technology and Informatics 124, 941, 2006", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&cstart=100&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:XiSMed-E-HIC"}, {"title": "From clusters to rules: a hybrid framework for generalized symbolic rule induction", "authors": "Q Jiang, SSR Abidi", "year": 2006, "citation_id": "fzr2PUYAAAAJ:dfsIfKJdRG4C", "result_id": "fzr2PUYAAAAJ:dfsIfKJdRG4C", "source": "scholar", "publication_info": {"summary": "Advances in Machine Learning and Cybernetics: 4th International Conference \u2026, 2006"}, "publication": "Advances in Machine Learning and Cybernetics: 4th International Conference \u2026, 2006", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&cstart=200&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:dfsIfKJdRG4C"}, {"title": "Information systems and health care ix: accessing tacit knowledge and linking it to the peer-reviewed literature", "authors": "M Shepherd, SSR Abidi, Q Gao, Z Chen, Q Qi, GA Finley", "year": 2006, "citation_id": "fzr2PUYAAAAJ:HDshCWvjkbEC", "result_id": "fzr2PUYAAAAJ:HDshCWvjkbEC", "source": "scholar", "publication_info": {"summary": "Communications of the Association for Information Systems 17 (1), 40, 2006"}, "publication": "Communications of the Association for Information Systems 17 (1), 40, 2006", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&cstart=200&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:HDshCWvjkbEC"}, {"title": "An intelligent knowledge sharing strategy featuring item-based collaborative filtering and case based reasoning", "authors": "Z Chedrawy, SSR Abidi", "year": 2005, "citation_id": "fzr2PUYAAAAJ:IWHjjKOFINEC", "result_id": "fzr2PUYAAAAJ:IWHjjKOFINEC", "source": "scholar", "publication_info": {"summary": "5th International Conference on Intelligent Systems Design and Applications \u2026, 2005"}, "publication": "5th International Conference on Intelligent Systems Design and Applications \u2026, 2005", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&cstart=200&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:IWHjjKOFINEC"}, {"title": "A hybrid of conceptual clusters, rough sets and attribute oriented induction for inducing symbolic rules", "authors": "QS Jiang", "year": 2005, "citation_id": "fzr2PUYAAAAJ:_B80troHkn4C", "result_id": "fzr2PUYAAAAJ:_B80troHkn4C", "source": "scholar", "publication_info": {"summary": "2005 International Conference on Machine Learning and Cybernetics 9, 5573-5578, 2005"}, "publication": "2005 International Conference on Machine Learning and Cybernetics 9, 5573-5578, 2005", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&cstart=200&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:_B80troHkn4C"}, {"title": "A hybrid feature selection strategy for image defining features: towards interpretation of optic nerve images", "authors": "Abidi, Artes", "year": 2005, "citation_id": "fzr2PUYAAAAJ:Zph67rFs4hoC", "result_id": "fzr2PUYAAAAJ:Zph67rFs4hoC", "source": "scholar", "publication_info": {"summary": "2005 International Conference on Machine Learning and Cybernetics 8, 5127 \u2026, 2005"}, "publication": "2005 International Conference on Machine Learning and Cybernetics 8, 5127 \u2026, 2005", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&cstart=200&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:Zph67rFs4hoC"}, {"title": "A Knowledge Management Framework to Morph Clinical Cases with Clinical Practice Guidelines.", "authors": "F Hussain, SS Raza Abidi", "year": 2005, "citation_id": "fzr2PUYAAAAJ:M05iB0D1s5AC", "result_id": "fzr2PUYAAAAJ:M05iB0D1s5AC", "source": "scholar", "publication_info": {"summary": "Studies in Health Technology & Informatics 116, 2005"}, "publication": "Studies in Health Technology & Informatics 116, 2005", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&cstart=200&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:M05iB0D1s5AC"}, {"title": "HealthInfoCDA: Case Composition Using Electronic Health Record Data Sources.", "authors": "GI Paterson, SSR Abidi, SD Soroka", "year": 2005, "citation_id": "fzr2PUYAAAAJ:dhFuZR0502QC", "result_id": "fzr2PUYAAAAJ:dhFuZR0502QC", "source": "scholar", "publication_info": {"summary": "Studies in Health Technology & Informatics 116, 2005"}, "publication": "Studies in Health Technology & Informatics 116, 2005", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&cstart=200&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:dhFuZR0502QC"}, {"title": "Analyzing Sub-Classifications of Glaucoma via SOM Based Clustering of Optic Nerve Images.", "authors": "S Yan, SSR Abidi, PH Artes", "year": 2005, "citation_id": "fzr2PUYAAAAJ:aqlVkmm33-oC", "result_id": "fzr2PUYAAAAJ:aqlVkmm33-oC", "source": "scholar", "publication_info": {"summary": "Studies in Health Technology & Informatics 116, 2005"}, "publication": "Studies in Health Technology & Informatics 116, 2005", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&cstart=200&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:aqlVkmm33-oC"}, {"title": "A knowledge creation info-structure to acquire and crystallize the tacit knowledge of health-care experts", "authors": "SSR Abidi, YN Cheah, J Curran", "year": 2005, "citation_id": "fzr2PUYAAAAJ:u-x6o8ySG0sC", "result_id": "fzr2PUYAAAAJ:u-x6o8ySG0sC", "source": "scholar", "publication_info": {"summary": "IEEE Transactions on information technology in biomedicine 9 (2), 193-204, 2005"}, "publication": "IEEE Transactions on information technology in biomedicine 9 (2), 193-204, 2005", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&cstart=200&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:u-x6o8ySG0sC"}, {"title": "Automated optic nerve analysis for diagnostic support in glaucoma", "authors": "J Yu, SSR Abidi, PH Artes, A McIntyre, M Heywood", "year": 2005, "citation_id": "fzr2PUYAAAAJ:j3f4tGmQtD8C", "result_id": "fzr2PUYAAAAJ:j3f4tGmQtD8C", "source": "scholar", "publication_info": {"summary": "18th IEEE Symposium on Computer-Based Medical Systems (CBMS'05), 97-102, 2005"}, "publication": "18th IEEE Symposium on Computer-Based Medical Systems (CBMS'05), 97-102, 2005", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&cstart=200&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:j3f4tGmQtD8C"}, {"title": "Medical knowledge morphing: towards case-specific integration of heterogeneous medical knowledge resources", "authors": "SSR Abidi", "year": 2005, "citation_id": "fzr2PUYAAAAJ:qjMakFHDy7sC", "result_id": "fzr2PUYAAAAJ:qjMakFHDy7sC", "source": "scholar", "publication_info": {"summary": "18th IEEE Symposium on Computer-Based Medical Systems (CBMS'05), 208-213, 2005"}, "publication": "18th IEEE Symposium on Computer-Based Medical Systems (CBMS'05), 208-213, 2005", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&cstart=200&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:qjMakFHDy7sC"}, {"title": "Augmenting GEM-encoded clinical practice guidelines with relevant best evidence autonomously retrieved from MEDLINE", "authors": "SSR Abidi, M Kershaw, E Milios", "year": 2005, "citation_id": "fzr2PUYAAAAJ:hFOr9nPyWt4C", "result_id": "fzr2PUYAAAAJ:hFOr9nPyWt4C", "source": "scholar", "publication_info": {"summary": "Health Informatics Journal 11 (2), 95-110, 2005"}, "publication": "Health Informatics Journal 11 (2), 95-110, 2005", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&cstart=200&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:hFOr9nPyWt4C"}, {"title": "Towards a collaborative learning environment for children\u2019s pain management: leveraging an online discussion forum", "authors": "J Curran-Smith, SSR Abidi, P Forgeron", "year": 2005, "citation_id": "fzr2PUYAAAAJ:4TOpqqG69KYC", "result_id": "fzr2PUYAAAAJ:4TOpqqG69KYC", "source": "scholar", "publication_info": {"summary": "Health Informatics Journal 11 (1), 19-31, 2005"}, "publication": "Health Informatics Journal 11 (1), 19-31, 2005", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&cstart=200&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:4TOpqqG69KYC"}, {"title": "BiRD: a strategy to autonomously supplement clinical practice guidelines with related clinical studies", "authors": "SSR Abidi, M Kershaw, E Milios", "year": 2005, "citation_id": "fzr2PUYAAAAJ:r0BpntZqJG4C", "result_id": "fzr2PUYAAAAJ:r0BpntZqJG4C", "source": "scholar", "publication_info": {"summary": "Proceedings of the 38th Annual Hawaii International Conference on System \u2026, 2005"}, "publication": "Proceedings of the 38th Annual Hawaii International Conference on System \u2026, 2005", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&cstart=200&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:r0BpntZqJG4C"}, {"title": "Using computerized clinical practice guidelines to generate tailored patient education materials", "authors": "B Jones, SSR Abidi, W Ying", "year": 2005, "citation_id": "fzr2PUYAAAAJ:9ZlFYXVOiuMC", "result_id": "fzr2PUYAAAAJ:9ZlFYXVOiuMC", "source": "scholar", "publication_info": {"summary": "Proceedings of the 38th Annual Hawaii International Conference on System \u2026, 2005"}, "publication": "Proceedings of the 38th Annual Hawaii International Conference on System \u2026, 2005", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&cstart=200&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:9ZlFYXVOiuMC"}, {"title": "HealthInfoCDA: Case Composition Using", "authors": "SSR Abidi, SD Soroka", "year": 2005, "citation_id": "fzr2PUYAAAAJ:HJSXoJQnj-YC", "result_id": "fzr2PUYAAAAJ:HJSXoJQnj-YC", "source": "scholar", "publication_info": {"summary": "Connecting Medical Informatics and Bio-informatics: Proceedings of MIE2005 \u2026, 2005"}, "publication": "Connecting Medical Informatics and Bio-informatics: Proceedings of MIE2005 \u2026, 2005", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&cstart=200&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:HJSXoJQnj-YC"}, {"title": "An Item-Based Collaborative Filtering Framework Featuring Case Based Reasoning.", "authors": "Z Chedrawy, SSR Abidi", "year": 2005, "citation_id": "fzr2PUYAAAAJ:NXb4pA-qfm4C", "result_id": "fzr2PUYAAAAJ:NXb4pA-qfm4C", "source": "scholar", "publication_info": {"summary": "IC-AI, 286-292, 2005"}, "publication": "IC-AI, 286-292, 2005", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&cstart=200&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:NXb4pA-qfm4C"}, {"title": "Diagnostic support for glaucoma using retinal images: a hybrid image analysis and data mining approach", "authors": "J Yu, SSR Abidi, P Artes, A McIntyre, M Heywood", "year": 2005, "citation_id": "fzr2PUYAAAAJ:lSLTfruPkqcC", "result_id": "fzr2PUYAAAAJ:lSLTfruPkqcC", "source": "scholar", "publication_info": {"summary": "Studies in health technology and informatics 116, 187-192, 2005"}, "publication": "Studies in health technology and informatics 116, 187-192, 2005", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&cstart=200&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:lSLTfruPkqcC"}, {"title": "ADMI: A multi-agent architecture to autonomously generate data mining services", "authors": "SZH Zaidi, SSR Abidi, S Manikam, C Yu-N", "year": 2004, "citation_id": "fzr2PUYAAAAJ:YFjsv_pBGBYC", "result_id": "fzr2PUYAAAAJ:YFjsv_pBGBYC", "source": "scholar", "publication_info": {"summary": "2004 2nd International IEEE Conference on'Intelligent Systems'. Proceedings \u2026, 2004"}, "publication": "2004 2nd International IEEE Conference on'Intelligent Systems'. Proceedings \u2026, 2004", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&cstart=200&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:YFjsv_pBGBYC"}, {"title": "An adaptive hypermedia system for information customization via content adaptation", "authors": "SSR Abidi, C Han", "year": 2004, "citation_id": "fzr2PUYAAAAJ:iH-uZ7U-co4C", "result_id": "fzr2PUYAAAAJ:iH-uZ7U-co4C", "source": "scholar", "publication_info": {"summary": "IADIS International Journal of WWW/Internet 2 (1), 79-94, 2004"}, "publication": "IADIS International Journal of WWW/Internet 2 (1), 79-94, 2004", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&cstart=200&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:iH-uZ7U-co4C"}, {"title": "Toward glaucoma classification with moment methods", "authors": "AR McIntyre, MI Heywood, PH Artes, SSR Abidi", "year": 2004, "citation_id": "fzr2PUYAAAAJ:vV6vV6tmYwMC", "result_id": "fzr2PUYAAAAJ:vV6vV6tmYwMC", "source": "scholar", "publication_info": {"summary": "First Canadian Conference on Computer and Robot Vision, 2004. Proceedings \u2026, 2004"}, "publication": "First Canadian Conference on Computer and Robot Vision, 2004. Proceedings \u2026, 2004", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&cstart=200&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:vV6vV6tmYwMC"}, {"title": "Constraint satisfaction methods for information personalization", "authors": "SSR Abidi, YH Chong", "year": 2004, "citation_id": "fzr2PUYAAAAJ:NaGl4SEjCO4C", "result_id": "fzr2PUYAAAAJ:NaGl4SEjCO4C", "source": "scholar", "publication_info": {"summary": "Conference of the Canadian Society for Computational Studies of Intelligence \u2026, 2004"}, "publication": "Conference of the Canadian Society for Computational Studies of Intelligence \u2026, 2004", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&cstart=200&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:NaGl4SEjCO4C"}, {"title": "Creating a Digital Case Base for Medical and Health Informatics Education", "authors": "GI Paterson, S Abidi, SD Soroka, JL Ginn", "year": 2004, "citation_id": "fzr2PUYAAAAJ:WJVC3Jt7v1AC", "result_id": "fzr2PUYAAAAJ:WJVC3Jt7v1AC", "source": "scholar", "publication_info": {"summary": "Health Informatics Lab, Faculty of Computer Science, Dalhousie University \u2026, 2004"}, "publication": "Health Informatics Lab, Faculty of Computer Science, Dalhousie University \u2026, 2004", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&cstart=200&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:WJVC3Jt7v1AC"}, {"title": "Knowledge Management in Pediatric Pain: Mapping On-Line Expert Discussions to", "authors": "SSR Abidia, A Finley", "year": 2004, "citation_id": "fzr2PUYAAAAJ:TQgYirikUcIC", "result_id": "fzr2PUYAAAAJ:TQgYirikUcIC", "source": "scholar", "publication_info": {"summary": "MedInfo 2004: Proceedings of the 11th World Congress on Medical Informatics \u2026, 2004"}, "publication": "MedInfo 2004: Proceedings of the 11th World Congress on Medical Informatics \u2026, 2004", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&cstart=200&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:TQgYirikUcIC"}, {"title": "Knowledge sharing over P2P knowledge networks: A peer ontology and semantic overlay driven approach", "authors": "SSR Abidi, X Pang", "year": 2004, "citation_id": "fzr2PUYAAAAJ:qUcmZB5y_30C", "result_id": "fzr2PUYAAAAJ:qUcmZB5y_30C", "source": "scholar", "publication_info": {"summary": "People, Knowledge And Technology: What Have We Learnt So Far?, 329-339, 2004"}, "publication": "People, Knowledge And Technology: What Have We Learnt So Far?, 329-339, 2004", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&cstart=200&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:qUcmZB5y_30C"}, {"title": "E-healthcare via customized information services: Addressing the need for factually consistent information", "authors": "SSR Abidi, YH Chong", "year": 2003, "citation_id": "fzr2PUYAAAAJ:N5tVd3kTz84C", "result_id": "fzr2PUYAAAAJ:N5tVd3kTz84C", "source": "scholar", "publication_info": {"summary": "International Conference on Service-Oriented Computing, 132-148, 2003"}, "publication": "International Conference on Service-Oriented Computing, 132-148, 2003", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&cstart=200&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:N5tVd3kTz84C"}, {"title": "Intelligent Agent Modeling and Generic Architecture Towards a Multi-Agent Healthcare Knowledge Management System.", "authors": "ZI Hashmi, YN Cheah, SZ Hassan, KG Lim, SSR Abidi", "year": 2003, "citation_id": "fzr2PUYAAAAJ:738O_yMBCRsC", "result_id": "fzr2PUYAAAAJ:738O_yMBCRsC", "source": "scholar", "publication_info": {"summary": "ICWI, 941-944, 2003"}, "publication": "ICWI, 941-944, 2003", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&cstart=200&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:738O_yMBCRsC"}, {"title": "An approach to enrich online medical Problem-Based Learning with tacit healthcare knowledge.", "authors": "YN Cheah, FA Rashid, SSR Abidi", "year": 2003, "citation_id": "fzr2PUYAAAAJ:ZHo1McVdvXMC", "result_id": "fzr2PUYAAAAJ:ZHo1McVdvXMC", "source": "scholar", "publication_info": {"summary": "Studies in health technology and informatics, 744-749, 2003"}, "publication": "Studies in health technology and informatics, 744-749, 2003", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&cstart=200&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:ZHo1McVdvXMC"}, {"title": "Intelligent Agents-mediated Approach for Experimental Knowledge of Healthcare Enterprise through CBR-adaptation Technique.", "authors": "ZI Hashmi, YN Cheah, SZ Hassan, SSR Abidi", "year": 2003, "citation_id": "fzr2PUYAAAAJ:SnGPuo6Feq8C", "result_id": "fzr2PUYAAAAJ:SnGPuo6Feq8C", "source": "scholar", "publication_info": {"summary": "CITA, 56-60, 2003"}, "publication": "CITA, 56-60, 2003", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&cstart=200&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:SnGPuo6Feq8C"}, {"title": "Adaptive Hypermedia Systems Featuring Information Customization Using Constraint Satisfaction Methods.", "authors": "CY Han, SSR Abidi, YN Cheah", "year": 2003, "citation_id": "fzr2PUYAAAAJ:AXPGKjj_ei8C", "result_id": "fzr2PUYAAAAJ:AXPGKjj_ei8C", "source": "scholar", "publication_info": {"summary": "ICWI, 333-340, 2003"}, "publication": "ICWI, 333-340, 2003", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&cstart=200&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:AXPGKjj_ei8C"}, {"title": "Leveraging XML-based electronic medical records to extract experiential clinical knowledge: An automated approach to generate cases for medical case-based reasoning systems", "authors": "SSR Abidi, S Manickam", "year": 2002, "citation_id": "fzr2PUYAAAAJ:9yKSN-GCB0IC", "result_id": "fzr2PUYAAAAJ:9yKSN-GCB0IC", "source": "scholar", "publication_info": {"summary": "International Journal of Medical Informatics 68 (1-3), 187-203, 2002"}, "publication": "International Journal of Medical Informatics 68 (1-3), 187-203, 2002", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&cstart=200&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:9yKSN-GCB0IC"}, {"title": "Designing adaptive hypermedia for Internet portals: A personalization strategy featuring case base reasoning with compositional adaptation", "authors": "S Sibte Raza Abidi", "year": 2002, "citation_id": "fzr2PUYAAAAJ:KlAtU1dfN6UC", "result_id": "fzr2PUYAAAAJ:KlAtU1dfN6UC", "source": "scholar", "publication_info": {"summary": "Ibero-American Conference on Artificial Intelligence, 60-69, 2002"}, "publication": "Ibero-American Conference on Artificial Intelligence, 60-69, 2002", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&cstart=200&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:KlAtU1dfN6UC"}, {"title": "Symbolic Exposition of Medical Data-Sets: A Data Mining Workbench to Inductively Derive Data-Defining Symbolic Rules.", "authors": "SSR Abidi, KM Hoe", "year": 2002, "citation_id": "fzr2PUYAAAAJ:7PzlFSSx8tAC", "result_id": "fzr2PUYAAAAJ:7PzlFSSx8tAC", "source": "scholar", "publication_info": {"summary": "CBMS, 123-128, 2002"}, "publication": "CBMS, 123-128, 2002", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&cstart=200&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:7PzlFSSx8tAC"}, {"title": "A case base reasoning framework to author personalized health maintenance information", "authors": "SSR Abidi", "year": 2002, "citation_id": "fzr2PUYAAAAJ:YOwf2qJgpHMC", "result_id": "fzr2PUYAAAAJ:YOwf2qJgpHMC", "source": "scholar", "publication_info": {"summary": "Proceedings of 15th IEEE Symposium on Computer-Based Medical Systems (CBMS \u2026, 2002"}, "publication": "Proceedings of 15th IEEE Symposium on Computer-Based Medical Systems (CBMS \u2026, 2002", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&cstart=200&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:YOwf2qJgpHMC"}, {"title": "Distributed data mining from heterogeneous healthcare data repositories: towards an intelligent agent-based framework", "authors": "SZH Zaidi, SSR Abidi, S Manickam", "year": 2002, "citation_id": "fzr2PUYAAAAJ:5nxA0vEk-isC", "result_id": "fzr2PUYAAAAJ:5nxA0vEk-isC", "source": "scholar", "publication_info": {"summary": "Proceedings of 15th IEEE Symposium on Computer-Based Medical Systems (CBMS \u2026, 2002"}, "publication": "Proceedings of 15th IEEE Symposium on Computer-Based Medical Systems (CBMS \u2026, 2002", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&cstart=200&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:5nxA0vEk-isC"}, {"title": "An intelligent agent-based knowledge broker for enterprise-wide healthcare knowledge procurement", "authors": "ZI Hashmi, SSR Abidi, YN Cheah", "year": 2002, "citation_id": "fzr2PUYAAAAJ:YsMSGLbcyi4C", "result_id": "fzr2PUYAAAAJ:YsMSGLbcyi4C", "source": "scholar", "publication_info": {"summary": "Proceedings of 15th IEEE Symposium on Computer-Based Medical Systems (CBMS \u2026, 2002"}, "publication": "Proceedings of 15th IEEE Symposium on Computer-Based Medical Systems (CBMS \u2026, 2002", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&cstart=200&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:YsMSGLbcyi4C"}, {"title": "Halifax B3H 1W5, Canada", "authors": "SZH Zaidi, SSR Abidi", "year": 2002, "citation_id": "fzr2PUYAAAAJ:5bg8sr1QxYwC", "result_id": "fzr2PUYAAAAJ:5bg8sr1QxYwC", "source": "scholar", "publication_info": {"summary": "Proceedings of the 15th IEEE Symposium on Computer-Based Medical Systems \u2026, 2002"}, "publication": "Proceedings of the 15th IEEE Symposium on Computer-Based Medical Systems \u2026, 2002", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&cstart=200&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:5bg8sr1QxYwC"}, {"title": "A Case Base Reasoning Framework to Author Personalized Health", "authors": "SSR Abidi", "year": 2002, "citation_id": "fzr2PUYAAAAJ:kzcSZmkxUKAC", "result_id": "fzr2PUYAAAAJ:kzcSZmkxUKAC", "source": "scholar", "publication_info": {"summary": "Proceedings of the 15th IEEE Symposium on Computer-Based Medical Systems \u2026, 2002"}, "publication": "Proceedings of the 15th IEEE Symposium on Computer-Based Medical Systems \u2026, 2002", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&cstart=200&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:kzcSZmkxUKAC"}, {"title": "Knowledge Representation and Reasoning-Designing Adaptive Hypermedia for Internet Portals: A Personalization Strategy Featuring Case Base Reasoning with Compositional Adaptation", "authors": "SS Raza Abidi", "year": 2002, "citation_id": "fzr2PUYAAAAJ:sNmaIFBj_lkC", "result_id": "fzr2PUYAAAAJ:sNmaIFBj_lkC", "source": "scholar", "publication_info": {"summary": "Lecture Notes in Computer Science 2527, 60-69, 2002"}, "publication": "Lecture Notes in Computer Science 2527, 60-69, 2002", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&cstart=200&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:sNmaIFBj_lkC"}, {"title": "Intelligent Healthcare Information Assistant: Towards Agent-Based Healthcare Knowledge Management", "authors": "ZI Hashmi, SSR Abidi, YN Cheah", "year": 2002, "citation_id": "fzr2PUYAAAAJ:p2g8aNsByqUC", "result_id": "fzr2PUYAAAAJ:p2g8aNsByqUC", "source": "scholar", "publication_info": {"summary": "Studies in health technology and informatics, 601-605, 2002"}, "publication": "Studies in health technology and informatics, 601-605, 2002", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&cstart=200&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:p2g8aNsByqUC"}, {"title": "Leveraging intelligent agents for knowledge discovery from heterogeneous healthcare data repositories", "authors": "SZH Zaidi, SSR Abidi, S Manickam", "year": 2002, "citation_id": "fzr2PUYAAAAJ:pyW8ca7W8N0C", "result_id": "fzr2PUYAAAAJ:pyW8ca7W8N0C", "source": "scholar", "publication_info": {"summary": "Health Data in the Information Society, 335-340, 2002"}, "publication": "Health Data in the Information Society, 335-340, 2002", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&cstart=200&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:pyW8ca7W8N0C"}, {"title": "Tacit knowledge in healthcare: The incorporation of healthcare scenarios in clinical problem-based learning", "authors": "YN Cheah, FA Rashid, SSR Abidi", "year": 2002, "citation_id": "fzr2PUYAAAAJ:rO6llkc54NcC", "result_id": "fzr2PUYAAAAJ:rO6llkc54NcC", "source": "scholar", "publication_info": {"summary": "Conference on Information Technology Research and Application (CITRA 2002), 2002"}, "publication": "Conference on Information Technology Research and Application (CITRA 2002), 2002", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&cstart=200&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:rO6llkc54NcC"}, {"title": "Analyzing Data Clusters: A Rough Sets Approach to Extract Cluster-Defining Symbolic", "authors": "SSR Abidi, KM Hoe, A Goh", "year": 2001, "citation_id": "fzr2PUYAAAAJ:QUX0mv85b1cC", "result_id": "fzr2PUYAAAAJ:QUX0mv85b1cC", "source": "scholar", "publication_info": {"summary": "Advances in Intelligent Data Analysis: 4th International Conference, IDA \u2026, 2001"}, "publication": "Advances in Intelligent Data Analysis: 4th International Conference, IDA \u2026, 2001", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&cstart=200&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:QUX0mv85b1cC"}, {"title": "Analyzing data clusters: A rough sets approach to extract cluster-defining symbolic rules", "authors": "SSR Abidi, KM Hoe, A Goh", "year": 2001, "citation_id": "fzr2PUYAAAAJ:zYLM7Y9cAGgC", "result_id": "fzr2PUYAAAAJ:zYLM7Y9cAGgC", "source": "scholar", "publication_info": {"summary": "International Symposium on Intelligent Data Analysis, 248-257, 2001"}, "publication": "International Symposium on Intelligent Data Analysis, 248-257, 2001", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&cstart=200&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:zYLM7Y9cAGgC"}, {"title": "Patient empowerment via'pushed'delivery of Personalised Healthcare educational content over the internet.", "authors": "SSR Abidi, CY Han, SR Abidi", "year": 2001, "citation_id": "fzr2PUYAAAAJ:Tyk-4Ss8FVUC", "result_id": "fzr2PUYAAAAJ:Tyk-4Ss8FVUC", "source": "scholar", "publication_info": {"summary": "Studies in health technology and informatics, 1425-1429, 2001"}, "publication": "Studies in health technology and informatics, 1425-1429, 2001", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&cstart=200&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:Tyk-4Ss8FVUC"}, {"title": "The role of information technology in the explication and crystallization of tacit healthcare knowledge", "authors": "YN Cheah, SSR Abidi", "year": 2001, "citation_id": "fzr2PUYAAAAJ:3fE2CSJIrl8C", "result_id": "fzr2PUYAAAAJ:3fE2CSJIrl8C", "source": "scholar", "publication_info": {"summary": "Health Informatics Journal 7 (3-4), 158-167, 2001"}, "publication": "Health Informatics Journal 7 (3-4), 158-167, 2001", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&cstart=200&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:3fE2CSJIrl8C"}, {"title": "Knowledge management in healthcare: towards \u2018knowledge-driven\u2019decision-support services", "authors": "SSR Abidi", "year": 2001, "citation_id": "fzr2PUYAAAAJ:u5HHmVD_uO8C", "result_id": "fzr2PUYAAAAJ:u5HHmVD_uO8C", "source": "scholar", "publication_info": {"summary": "International journal of medical informatics 63 (1-2), 5-18, 2001"}, "publication": "International journal of medical informatics 63 (1-2), 5-18, 2001", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&cstart=200&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:u5HHmVD_uO8C"}, {"title": "A Web-enabled Exam Preparation and Evaluation Service: providing real-time personalized tests for academic enhancement", "authors": "SSR Abidi, A Goh", "year": 2001, "citation_id": "fzr2PUYAAAAJ:ZeXyd9-uunAC", "result_id": "fzr2PUYAAAAJ:ZeXyd9-uunAC", "source": "scholar", "publication_info": {"summary": "Proceedings IEEE International Conference on Advanced Learning Technologies \u2026, 2001"}, "publication": "Proceedings IEEE International Conference on Advanced Learning Technologies \u2026, 2001", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&cstart=200&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:ZeXyd9-uunAC"}, {"title": "Augmenting medical case base reasoning systems with clinical knowledge derived from heterogeneous electronic patient records", "authors": "SSR Abidi, S Manickam", "year": 2001, "citation_id": "fzr2PUYAAAAJ:uWQEDVKXjbEC", "result_id": "fzr2PUYAAAAJ:uWQEDVKXjbEC", "source": "scholar", "publication_info": {"summary": "Proceedings 14th IEEE Symposium on Computer-Based Medical Systems. CBMS 2001 \u2026, 2001"}, "publication": "Proceedings 14th IEEE Symposium on Computer-Based Medical Systems. CBMS 2001 \u2026, 2001", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&cstart=200&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:uWQEDVKXjbEC"}, {"title": "A case for supplementing evidence based medicine with inductive clinical knowledge: towards a technology-enriched integrated clinical evidence system", "authors": "SSR Abidi, SR Abidi", "year": 2001, "citation_id": "fzr2PUYAAAAJ:GnPB-g6toBAC", "result_id": "fzr2PUYAAAAJ:GnPB-g6toBAC", "source": "scholar", "publication_info": {"summary": "Proceedings 14th IEEE Symposium on Computer-Based Medical Systems. CBMS 2001 \u2026, 2001"}, "publication": "Proceedings 14th IEEE Symposium on Computer-Based Medical Systems. CBMS 2001 \u2026, 2001", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&cstart=200&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:GnPB-g6toBAC"}, {"title": "Augmenting knowledge-based medical systems with tacit healthcare expertise: towards an intelligent tacit knowledge acquisition info-structure", "authors": "YN Cheah, SSR Abidi", "year": 2001, "citation_id": "fzr2PUYAAAAJ:blknAaTinKkC", "result_id": "fzr2PUYAAAAJ:blknAaTinKkC", "source": "scholar", "publication_info": {"summary": "Proceedings 14th IEEE Symposium on Computer-Based Medical Systems. CBMS 2001 \u2026, 2001"}, "publication": "Proceedings 14th IEEE Symposium on Computer-Based Medical Systems. CBMS 2001 \u2026, 2001", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&cstart=200&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:blknAaTinKkC"}, {"title": "An intelligent info-structure for composing and pushing personalised healthcare information over the Internet", "authors": "SSR Abidi, CY Han, SR Abidi", "year": 2001, "citation_id": "fzr2PUYAAAAJ:-f6ydRqryjwC", "result_id": "fzr2PUYAAAAJ:-f6ydRqryjwC", "source": "scholar", "publication_info": {"summary": "Proceedings 14th IEEE Symposium on Computer-Based Medical Systems. CBMS 2001 \u2026, 2001"}, "publication": "Proceedings 14th IEEE Symposium on Computer-Based Medical Systems. CBMS 2001 \u2026, 2001", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&cstart=200&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:-f6ydRqryjwC"}, {"title": "A Knowledge Creation Strategy to Enrich Enterprise Information Systems with Enterprise-Specific Tacit Knowledge.", "authors": "SSR Abidi, YN Cheah", "year": 2001, "citation_id": "fzr2PUYAAAAJ:hMod-77fHWUC", "result_id": "fzr2PUYAAAAJ:hMod-77fHWUC", "source": "scholar", "publication_info": {"summary": "ICEIS (2), 633-638, 2001"}, "publication": "ICEIS (2), 633-638, 2001", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&cstart=200&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:hMod-77fHWUC"}, {"title": "An intelligent tele-healthcare environment offering person-centric and wellness-maintenance services", "authors": "SSR Abidi", "year": 2001, "citation_id": "fzr2PUYAAAAJ:O3NaXMp0MMsC", "result_id": "fzr2PUYAAAAJ:O3NaXMp0MMsC", "source": "scholar", "publication_info": {"summary": "Journal of Medical Systems 25 (3), 147-165, 2001"}, "publication": "Journal of Medical Systems 25 (3), 147-165, 2001", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&cstart=200&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:O3NaXMp0MMsC"}, {"title": "Knowledge management in healthcare: towards", "authors": "S Sibte, R Abidi", "year": 2001, "citation_id": "fzr2PUYAAAAJ:LdasjJ6CEcoC", "result_id": "fzr2PUYAAAAJ:LdasjJ6CEcoC", "source": "scholar", "publication_info": {"summary": "International Journal of Medical Informatics 63, 5-18, 2001"}, "publication": "International Journal of Medical Informatics 63, 5-18, 2001", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&cstart=200&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:LdasjJ6CEcoC"}, {"title": "Extracting clinical cases from XML-based electronic patient records for use in web-based medical case based reasoning systems", "authors": "S Manickam, SSR Abidi", "year": 2001, "citation_id": "fzr2PUYAAAAJ:cFHS6HbyZ2cC", "result_id": "fzr2PUYAAAAJ:cFHS6HbyZ2cC", "source": "scholar", "publication_info": {"summary": "Studies in health technology and informatics, 643-647, 2001"}, "publication": "Studies in health technology and informatics, 643-647, 2001", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&cstart=200&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:cFHS6HbyZ2cC"}, {"title": "Health Expert's Tacit Knowledge Acquisition and Representation Using Specialised", "authors": "C Yu-N, SSR ABIDI", "year": 2000, "citation_id": "fzr2PUYAAAAJ:KUbvn5osdkgC", "result_id": "fzr2PUYAAAAJ:KUbvn5osdkgC", "source": "scholar", "publication_info": {"summary": "Medical Infobahn for Europe: Proceedings of MIE2000 and GMDS2000, 837, 2000"}, "publication": "Medical Infobahn for Europe: Proceedings of MIE2000 and GMDS2000, 837, 2000", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&cstart=200&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:KUbvn5osdkgC"}, {"title": "Healthcare knowledge acquisition: an ontology-based approach using the extensible markup language (XML)", "authors": "C Yu-N, SSR Abidi", "year": 2000, "citation_id": "fzr2PUYAAAAJ:ldfaerwXgEUC", "result_id": "fzr2PUYAAAAJ:ldfaerwXgEUC", "source": "scholar", "publication_info": {"summary": "Studies in health technology and informatics, 827-831, 2000"}, "publication": "Studies in health technology and informatics, 827-831, 2000", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&cstart=200&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:ldfaerwXgEUC"}, {"title": "A scenarios mediated approach for tacit knowledge acquisition and crystallisation: towards higher return-on-knowledge and experience", "authors": "C Yu-N, SSR Abidi", "year": 2000, "citation_id": "fzr2PUYAAAAJ:Se3iqnhoufwC", "result_id": "fzr2PUYAAAAJ:Se3iqnhoufwC", "source": "scholar", "publication_info": {"summary": "Proc. of the Third Int. Conf. on Practical Aspects of Knowledge Management \u2026, 2000"}, "publication": "Proc. of the Third Int. Conf. on Practical Aspects of Knowledge Management \u2026, 2000", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&cstart=200&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:Se3iqnhoufwC"}, {"title": "Unsupervised case classification using Kohonen\" self-organizing feature map\" in a case-based reasoning system", "authors": "S Manickam, SSR Abidi", "year": 2000, "citation_id": "fzr2PUYAAAAJ:vbGhcppDl1QC", "result_id": "fzr2PUYAAAAJ:vbGhcppDl1QC", "source": "scholar", "publication_info": {"summary": "2000 TENCON Proceedings. Intelligent Systems and Technologies for the New \u2026, 2000"}, "publication": "2000 TENCON Proceedings. Intelligent Systems and Technologies for the New \u2026, 2000", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&cstart=200&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:vbGhcppDl1QC"}, {"title": "An ontology-mediated scenario composer for knowledge acquisition in intelligent systems", "authors": "YN Cheah, SSR Abidi", "year": 2000, "citation_id": "fzr2PUYAAAAJ:p__nRnzSRKYC", "result_id": "fzr2PUYAAAAJ:p__nRnzSRKYC", "source": "scholar", "publication_info": {"summary": "2000 TENCON Proceedings. Intelligent Systems and Technologies for the New \u2026, 2000"}, "publication": "2000 TENCON Proceedings. Intelligent Systems and Technologies for the New \u2026, 2000", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&cstart=200&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:p__nRnzSRKYC"}, {"title": "A data mining strategy for inductive data clustering: a synergy between self-organising neural networks and K-means clustering techniques", "authors": "SSR Abidi, J Ong", "year": 2000, "citation_id": "fzr2PUYAAAAJ:_kc_bZDykSQC", "result_id": "fzr2PUYAAAAJ:_kc_bZDykSQC", "source": "scholar", "publication_info": {"summary": "2000 TENCON Proceedings. Intelligent Systems and Technologies for the New \u2026, 2000"}, "publication": "2000 TENCON Proceedings. Intelligent Systems and Technologies for the New \u2026, 2000", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&cstart=200&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:_kc_bZDykSQC"}, {"title": "A Convergence of Knowledge Management and Data Mining: Towards \u2018Knowledge-Driven\u2019Strategic Services", "authors": "SSR Abidi, C Yu-N", "year": 2000, "citation_id": "fzr2PUYAAAAJ:NMxIlDl6LWMC", "result_id": "fzr2PUYAAAAJ:NMxIlDl6LWMC", "source": "scholar", "publication_info": {"summary": "3rd International Conference on the Practical Applications of Knowledge \u2026, 2000"}, "publication": "3rd International Conference on the Practical Applications of Knowledge \u2026, 2000", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&cstart=200&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:NMxIlDl6LWMC"}, {"title": "Specification of healthcare expert systems using a multi-mechanism rule-extraction pipeline", "authors": "A Goh, SSR Abidi, KM Hoe", "year": 2000, "citation_id": "fzr2PUYAAAAJ:1lhNe0rCu4AC", "result_id": "fzr2PUYAAAAJ:1lhNe0rCu4AC", "source": "scholar", "publication_info": {"summary": "International ICSC Congress on Intelligent Systems and Applications (ISA\u20192000), 2000"}, "publication": "International ICSC Congress on Intelligent Systems and Applications (ISA\u20192000), 2000", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&cstart=200&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:1lhNe0rCu4AC"}, {"title": "The Design & Development of a Tele-healthcare Information and Diagnostic Environment:(Merangka Dan Membangunkan Tele-healthca", "authors": "SSR Abidi", "year": 2000, "citation_id": "fzr2PUYAAAAJ:_FM0Bhl9EiAC", "result_id": "fzr2PUYAAAAJ:_FM0Bhl9EiAC", "source": "scholar", "publication_info": {"summary": "Universiti Sains Malaysia, 2000"}, "publication": "Universiti Sains Malaysia, 2000", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&cstart=200&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:_FM0Bhl9EiAC"}, {"title": "Ontology-Mediated Acquisition and Representation of Tacit Knowledge in the Healthcare Environment", "authors": "YN Cheah, SSR Abidi", "year": 2000, "citation_id": "fzr2PUYAAAAJ:EUQCXRtRnyEC", "result_id": "fzr2PUYAAAAJ:EUQCXRtRnyEC", "source": "scholar", "publication_info": {"summary": "The Third International Conference on The Practical Application of Knowledge \u2026, 2000"}, "publication": "The Third International Conference on The Practical Application of Knowledge \u2026, 2000", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&cstart=200&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:EUQCXRtRnyEC"}, {"title": "Intelligent Healthcare Information Dissemination Featuring Electronic Medical Record Profiling and Customised Information Composition", "authors": "SSR Abidi, A Goh", "year": 2000, "citation_id": "fzr2PUYAAAAJ:_xSYboBqXhAC", "result_id": "fzr2PUYAAAAJ:_xSYboBqXhAC", "source": "scholar", "publication_info": {"summary": "Intl. ICSC Congress on Intelligent Systems and Applications, 2000"}, "publication": "Intl. ICSC Congress on Intelligent Systems and Applications, 2000", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&cstart=200&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:_xSYboBqXhAC"}, {"title": "Transforming XML-based electronic patient records for use in medical case based reasoning systems", "authors": "SSR Abidi, S Manickam", "year": 2000, "citation_id": "fzr2PUYAAAAJ:pqnbT2bcN3wC", "result_id": "fzr2PUYAAAAJ:pqnbT2bcN3wC", "source": "scholar", "publication_info": {"summary": "Studies in Health Technology and Informatics, 709-713, 2000"}, "publication": "Studies in Health Technology and Informatics, 709-713, 2000", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&cstart=200&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:pqnbT2bcN3wC"}, {"title": "Health expert\u2019s tacit knowledge acquisition and representation using specialised healthcare scenarios", "authors": "C Yu-N, SSR Abidi", "year": 2000, "citation_id": "fzr2PUYAAAAJ:isC4tDSrTZIC", "result_id": "fzr2PUYAAAAJ:isC4tDSrTZIC", "source": "scholar", "publication_info": {"summary": "Medical Infobahn for Europe, 837-841, 2000"}, "publication": "Medical Infobahn for Europe, 837-841, 2000", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&cstart=200&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:isC4tDSrTZIC"}, {"title": "A personalised healthcare information delivery system: pushing customised healthcare information over the WWW", "authors": "SSR Abidi, A Goh", "year": 2000, "citation_id": "fzr2PUYAAAAJ:4DMP91E08xMC", "result_id": "fzr2PUYAAAAJ:4DMP91E08xMC", "source": "scholar", "publication_info": {"summary": "Studies in health technology and informatics, 663-667, 2000"}, "publication": "Studies in health technology and informatics, 663-667, 2000", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&cstart=200&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:4DMP91E08xMC"}, {"title": "Tacit knowledge creation in a knowledge management context", "authors": "YN Cheah, SSR Abidi", "year": 1999, "citation_id": "fzr2PUYAAAAJ:CHSYGLWDkRkC", "result_id": "fzr2PUYAAAAJ:CHSYGLWDkRkC", "source": "scholar", "publication_info": {"summary": "Fourteenth International Symposium on Computer and Information Sciences \u2026, 1999"}, "publication": "Fourteenth International Symposium on Computer and Information Sciences \u2026, 1999", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&cstart=200&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:CHSYGLWDkRkC"}, {"title": "Data Mining Using Self-Organizing Kohonen Maps: A Technique for Effective Data Clustering & Visualization.", "authors": "J Ong, SSR Abidi", "year": 1999, "citation_id": "fzr2PUYAAAAJ:LkGwnXOMwfcC", "result_id": "fzr2PUYAAAAJ:LkGwnXOMwfcC", "source": "scholar", "publication_info": {"summary": "IC-AI 99, 261-264, 1999"}, "publication": "IC-AI 99, 261-264, 1999", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&cstart=200&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:LkGwnXOMwfcC"}, {"title": "AI Amidst the Healthcare Revolution: Towards an'Intelligent'Tele-Healthcare Environment.", "authors": "SSR Abidi", "year": 1999, "citation_id": "fzr2PUYAAAAJ:4hFrxpcac9AC", "result_id": "fzr2PUYAAAAJ:4hFrxpcac9AC", "source": "scholar", "publication_info": {"summary": "IC-AI, 172-176, 1999"}, "publication": "IC-AI, 172-176, 1999", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&cstart=200&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:4hFrxpcac9AC"}, {"title": "Re-Visiting Backpropagation Network Optimization: Towards Maximally Pruned Networks.", "authors": "A Goh, SSR Abidi", "year": 1999, "citation_id": "fzr2PUYAAAAJ:eJXPG6dFmWUC", "result_id": "fzr2PUYAAAAJ:eJXPG6dFmWUC", "source": "scholar", "publication_info": {"summary": "IC-AI, 565-570, 1999"}, "publication": "IC-AI, 565-570, 1999", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&cstart=200&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:eJXPG6dFmWUC"}, {"title": "Telemedicine in the Malaysian Multimedia Super Corridor: Towards Personalised Lifetime", "authors": "SSR Abidi, Z Yusoff", "year": 1999, "citation_id": "fzr2PUYAAAAJ:g5m5HwL7SMYC", "result_id": "fzr2PUYAAAAJ:g5m5HwL7SMYC", "source": "scholar", "publication_info": {"summary": "Medical Informatics Europe'99 68, 283, 1999"}, "publication": "Medical Informatics Europe'99 68, 283, 1999", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&cstart=200&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:g5m5HwL7SMYC"}, {"title": "TIDE: an intelligent home-based healthcare information & diagnostic environment.", "authors": "SSR Abidi", "year": 1999, "citation_id": "fzr2PUYAAAAJ:35N4QoGY0k4C", "result_id": "fzr2PUYAAAAJ:35N4QoGY0k4C", "source": "scholar", "publication_info": {"summary": "Studies in Health Technology and Informatics, 720-725, 1999"}, "publication": "Studies in Health Technology and Informatics, 720-725, 1999", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&cstart=200&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:35N4QoGY0k4C"}, {"title": "Applying Data Mining in Healthcare: An Info-Structure for Delivering\" Data-Driven\" Strategic Services", "authors": "SSR Abidi", "year": 1999, "citation_id": "fzr2PUYAAAAJ:maZDTaKrznsC", "result_id": "fzr2PUYAAAAJ:maZDTaKrznsC", "source": "scholar", "publication_info": {"summary": "Studies in Health Technology and Informatics, 453-456, 1999"}, "publication": "Studies in Health Technology and Informatics, 453-456, 1999", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&cstart=200&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:maZDTaKrznsC"}, {"title": "Evaluating the efficacy of knowledge management towards healthcare enterprise modelling", "authors": "C Yu-N, SSR Abidi", "year": 1999, "citation_id": "fzr2PUYAAAAJ:bEWYMUwI8FkC", "result_id": "fzr2PUYAAAAJ:bEWYMUwI8FkC", "source": "scholar", "publication_info": {"summary": "Proceedings of the International Joint Conference on Artificial Intelligence \u2026, 1999"}, "publication": "Proceedings of the International Joint Conference on Artificial Intelligence \u2026, 1999", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&cstart=200&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:bEWYMUwI8FkC"}, {"title": "Healthcare knowledge management through building and operationalising healthcare enterprise memory", "authors": "C Yu-N, SSR Abidi", "year": 1999, "citation_id": "fzr2PUYAAAAJ:roLk4NBRz8UC", "result_id": "fzr2PUYAAAAJ:roLk4NBRz8UC", "source": "scholar", "publication_info": {"summary": "Studies in health technology and informatics 68, 726-730, 1999"}, "publication": "Studies in health technology and informatics 68, 726-730, 1999", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&cstart=200&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:roLk4NBRz8UC"}, {"title": "Applying knowledge discovery to predict infectious disease epidemics", "authors": "SS Raza Abidi, A Goh", "year": 1998, "citation_id": "fzr2PUYAAAAJ:eQOLeE2rZwMC", "result_id": "fzr2PUYAAAAJ:eQOLeE2rZwMC", "source": "scholar", "publication_info": {"summary": "Pacific Rim International Conference on Artificial Intelligence, 170-181, 1998"}, "publication": "Pacific Rim International Conference on Artificial Intelligence, 170-181, 1998", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&cstart=200&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:eQOLeE2rZwMC"}, {"title": "Neural network based forecasting of bacteria-antibiotic interactions for infectious disease control", "authors": "SS Abidi, A Goh", "year": 1998, "citation_id": "fzr2PUYAAAAJ:e5wmG9Sq2KIC", "result_id": "fzr2PUYAAAAJ:e5wmG9Sq2KIC", "source": "scholar", "publication_info": {"summary": "STUDIES IN HEALTH TECHNOLOGY AND INFORMATICS, 571-571, 1998"}, "publication": "STUDIES IN HEALTH TECHNOLOGY AND INFORMATICS, 571-571, 1998", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&cstart=200&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:e5wmG9Sq2KIC"}, {"title": "A WWW Based Tele-Healthcare Information and Diagnostic Environment", "authors": "SSR Abidi", "year": 1998, "citation_id": "fzr2PUYAAAAJ:u_35RYKgDlwC", "result_id": "fzr2PUYAAAAJ:u_35RYKgDlwC", "source": "scholar", "publication_info": {"summary": "International Conference on Multimedia and Information Technology, Kuala Lumpur, 1998"}, "publication": "International Conference on Multimedia and Information Technology, Kuala Lumpur, 1998", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&cstart=200&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:u_35RYKgDlwC"}, {"title": "Data driven healthcare management: from a philosophy to an IT info-structure", "authors": "SSR Abidi, Z Yusoff", "year": 1998, "citation_id": "fzr2PUYAAAAJ:3s1wT3WcHBgC", "result_id": "fzr2PUYAAAAJ:3s1wT3WcHBgC", "source": "scholar", "publication_info": {"summary": "Int. conference on multimedia and information technology. Kuala Lumpur, 1998"}, "publication": "Int. conference on multimedia and information technology. Kuala Lumpur, 1998", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&cstart=200&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:3s1wT3WcHBgC"}, {"title": "Tele-healthcare:virtual'Yet Efficacious Healthcare in a Wired World", "authors": "SSR Abidi, Z Yusoff", "year": 1998, "citation_id": "fzr2PUYAAAAJ:GtLg2Ama23sC", "result_id": "fzr2PUYAAAAJ:GtLg2Ama23sC", "source": "scholar", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&cstart=200&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:GtLg2Ama23sC"}, {"title": "Telemedicine and medical informatics in the multimedia super corridor: the Malaysian vision", "authors": "SSR Abidi, A Goh, Z Yusoff", "year": 1998, "citation_id": "fzr2PUYAAAAJ:hqOjcs7Dif8C", "result_id": "fzr2PUYAAAAJ:hqOjcs7Dif8C", "source": "scholar", "publication_info": {"summary": "MedInfo 98, 1-15, 1998"}, "publication": "MedInfo 98, 1-15, 1998", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&cstart=200&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:hqOjcs7Dif8C"}, {"title": "Using neural networks to explicate human category learning: a simulation of concept learning and lexicalisation", "authors": "SSR Abidi", "year": 1997, "citation_id": "fzr2PUYAAAAJ:bFI3QPDXJZMC", "result_id": "fzr2PUYAAAAJ:bFI3QPDXJZMC", "source": "scholar", "publication_info": {"summary": "Malaysian Journal of Computer Science 10 (2), 60-71, 1997"}, "publication": "Malaysian Journal of Computer Science 10 (2), 60-71, 1997", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&cstart=200&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:bFI3QPDXJZMC"}, {"title": "Histocompatibility in live related donor renal transplantation.", "authors": "N Zafar, S Hafiz, S Khan, K Abbas, S Ahmed, M Khalique, T Aziz, ...", "year": 1997, "citation_id": "fzr2PUYAAAAJ:PVgj2kMGcgYC", "result_id": "fzr2PUYAAAAJ:PVgj2kMGcgYC", "source": "scholar", "publication_info": {"summary": "Transplantation proceedings 29 (7), 2973-2974, 1997"}, "publication": "Transplantation proceedings 29 (7), 2973-2974, 1997", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&cstart=200&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:PVgj2kMGcgYC"}, {"title": "Internet information brokering: a re-configurable database navigation, data filter and export system", "authors": "SSR Abidi", "year": 1997, "citation_id": "fzr2PUYAAAAJ:7H_MAutzIkAC", "result_id": "fzr2PUYAAAAJ:7H_MAutzIkAC", "source": "scholar", "publication_info": {"summary": "Informatica 21, 185-191, 1997"}, "publication": "Informatica 21, 185-191, 1997", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&cstart=200&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:7H_MAutzIkAC"}, {"title": "Information brokering over the information highway: an Internet-based database navigation system", "authors": "SSR Abidi", "year": 1997, "citation_id": "fzr2PUYAAAAJ:f2IySw72cVMC", "result_id": "fzr2PUYAAAAJ:f2IySw72cVMC", "source": "scholar", "publication_info": {"summary": "Proceedings of the Joint Pacific Asian Conference on Expert Systems, 1997"}, "publication": "Proceedings of the Joint Pacific Asian Conference on Expert Systems, 1997", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&cstart=200&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:f2IySw72cVMC"}, {"title": "Conglomerate'Neural Network Architectures: The Way Ahead for Simulating Early Language Development.", "authors": "SSR Abidi, K Ahmad", "year": 1997, "citation_id": "fzr2PUYAAAAJ:0EnyYjriUFMC", "result_id": "fzr2PUYAAAAJ:0EnyYjriUFMC", "source": "scholar", "publication_info": {"summary": "J. Inf. Sci. Eng. 13 (2), 235-266, 1997"}, "publication": "J. Inf. Sci. Eng. 13 (2), 235-266, 1997", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&cstart=200&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:0EnyYjriUFMC"}, {"title": "Neural networks and child language development: a simulation using a modular neural network architecture", "authors": "SSR Abidi", "year": 1996, "citation_id": "fzr2PUYAAAAJ:J_g5lzvAfSwC", "result_id": "fzr2PUYAAAAJ:J_g5lzvAfSwC", "source": "scholar", "publication_info": {"summary": "Proceedings of International Conference on Neural Networks (ICNN'96) 2, 840-845, 1996"}, "publication": "Proceedings of International Conference on Neural Networks (ICNN'96) 2, 840-845, 1996", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&cstart=200&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:J_g5lzvAfSwC"}, {"title": "of the Evolving Concept Memory", "authors": "SSR ABIDI, K AHMAD", "year": 1996, "citation_id": "fzr2PUYAAAAJ:rTD5ala9j4wC", "result_id": "fzr2PUYAAAAJ:rTD5ala9j4wC", "source": "scholar", "publication_info": {"summary": "Child Language, 1, 1996"}, "publication": "Child Language, 1, 1996", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&cstart=200&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:rTD5ala9j4wC"}, {"title": "Towards a\" Nervous System-Level\" Model of Early Numerical Development", "authors": "TA Bale, K Ahmad, SSR Abidi", "year": 1996, "citation_id": "fzr2PUYAAAAJ:ODE9OILHJdcC", "result_id": "fzr2PUYAAAAJ:ODE9OILHJdcC", "source": "scholar", "publication_info": {"summary": "Working Notes of AAAI\u201996 Workshop on Computation Cognitive Modelling: Source \u2026, 1996"}, "publication": "Working Notes of AAAI\u201996 Workshop on Computation Cognitive Modelling: Source \u2026, 1996", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&cstart=200&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:ODE9OILHJdcC"}, {"title": "NEURAL NETWORKS TO SIMULATE HUMAN LEARNING: A SHIFT TOWARDS \u2018MODULAR\u2019ARCHITECTURES", "authors": "SSR Abidi", "year": 1996, "citation_id": "fzr2PUYAAAAJ:9pM33mqn1YgC", "result_id": "fzr2PUYAAAAJ:9pM33mqn1YgC", "source": "scholar", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&cstart=200&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:9pM33mqn1YgC"}, {"title": "Towards Information Brokering: An Intelligent Database Navigation and Management System", "authors": "SSR Abidi", "year": 1996, "citation_id": "fzr2PUYAAAAJ:UxriW0iASnsC", "result_id": "fzr2PUYAAAAJ:UxriW0iASnsC", "source": "scholar", "publication_info": {"summary": "Research & Development in Computer Science and Applications Conference \u2026, 1996"}, "publication": "Research & Development in Computer Science and Applications Conference \u2026, 1996", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&cstart=200&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:UxriW0iASnsC"}, {"title": "Neural networks: their efficacy towards the Malaysian IT environment", "authors": "SSR Abidi", "year": 1996, "citation_id": "fzr2PUYAAAAJ:xtRiw3GOFMkC", "result_id": "fzr2PUYAAAAJ:xtRiw3GOFMkC", "source": "scholar", "publication_info": {"summary": "School of Computer Sciences. Universiti Sains Malaysia. Penang. Malaysia, 1996"}, "publication": "School of Computer Sciences. Universiti Sains Malaysia. Penang. Malaysia, 1996", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&cstart=200&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:xtRiw3GOFMkC"}, {"title": "Neural Networks and Child Language Development: Towards a \u2018Conglomerate\u2019Neural Network Simulation Architecture", "authors": "SSR Abidi, K Ahmad", "year": 1996, "citation_id": "fzr2PUYAAAAJ:fPk4N6BV_jEC", "result_id": "fzr2PUYAAAAJ:fPk4N6BV_jEC", "source": "scholar", "publication_info": {"summary": "International Conference on Neural Information Processing (ICONIP\u201996), Hong Kong, 1996"}, "publication": "International Conference on Neural Information Processing (ICONIP\u201996), Hong Kong, 1996", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&cstart=200&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:fPk4N6BV_jEC"}, {"title": "Child language development: a connectionist simulation of the evolving concept memory", "authors": "SSR Abidi, K Ahmad", "year": 1996, "citation_id": "fzr2PUYAAAAJ:TFP_iSt0sucC", "result_id": "fzr2PUYAAAAJ:TFP_iSt0sucC", "source": "scholar", "publication_info": {"summary": "Child language. Clevedon: Multilingual Matters Ltd, 1996"}, "publication": "Child language. Clevedon: Multilingual Matters Ltd, 1996", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&cstart=200&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:TFP_iSt0sucC"}, {"title": "A neural network simulation of child language development at the one-word stage", "authors": "SSR Abidi", "year": 1996, "citation_id": "fzr2PUYAAAAJ:_Qo2XoVZTnwC", "result_id": "fzr2PUYAAAAJ:_Qo2XoVZTnwC", "source": "scholar", "publication_info": {"summary": "IASTED International Conference on Modelling, Simulation and Optimization \u2026, 1996"}, "publication": "IASTED International Conference on Modelling, Simulation and Optimization \u2026, 1996", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&cstart=200&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:_Qo2XoVZTnwC"}, {"title": "Neural network applications in medicine", "authors": "D Partridge, SSR Abidi, A Goh", "year": 1996, "citation_id": "fzr2PUYAAAAJ:M3ejUd6NZC8C", "result_id": "fzr2PUYAAAAJ:M3ejUd6NZC8C", "source": "scholar", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&cstart=200&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:M3ejUd6NZC8C"}, {"title": "Early experience of renal transplantation in hepatitis C patients.", "authors": "H Askari, S Abidi, K Abbas, S Sultan, F Akhtar, N Zafar, S Hafiz, A Naqvi, ...", "year": 1995, "citation_id": "fzr2PUYAAAAJ:uDGL6kOW6j0C", "result_id": "fzr2PUYAAAAJ:uDGL6kOW6j0C", "source": "scholar", "publication_info": {"summary": "Transplantation proceedings 27 (5), 2600-2601, 1995"}, "publication": "Transplantation proceedings 27 (5), 2600-2601, 1995", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&cstart=300&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:uDGL6kOW6j0C"}, {"title": "Terminology Management: The Extraction, Representation and Retrieval of Specialist Terms", "authors": "K Ahmad, P Holmes-Higgin, SR Abidi", "year": 1995, "citation_id": "fzr2PUYAAAAJ:S16KYo8Pm5AC", "result_id": "fzr2PUYAAAAJ:S16KYo8Pm5AC", "source": "scholar", "publication_info": {"summary": "University of Surrey. Department of Mathematical and Computing Sciences, 1995"}, "publication": "University of Surrey. Department of Mathematical and Computing Sciences, 1995", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&cstart=300&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:S16KYo8Pm5AC"}, {"title": "'Critical Period'in language development and its connectionist simulation", "authors": "SR Abidi, K Ahmad", "year": 1994, "citation_id": "fzr2PUYAAAAJ:e_rmSamDkqQC", "result_id": "fzr2PUYAAAAJ:e_rmSamDkqQC", "source": "scholar", "publication_info": {"summary": "First Language 14 (42-43), 317-318, 1994"}, "publication": "First Language 14 (42-43), 317-318, 1994", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&cstart=300&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:e_rmSamDkqQC"}, {"title": "A connectionist simulation: towards a model of child language development", "authors": "SSR Abidi", "year": 1994, "citation_id": "fzr2PUYAAAAJ:_5tno0g5mFcC", "result_id": "fzr2PUYAAAAJ:_5tno0g5mFcC", "source": "scholar", "publication_info": {"summary": "PQDT-UK & Ireland, 1994"}, "publication": "PQDT-UK & Ireland, 1994", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&cstart=300&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:_5tno0g5mFcC"}, {"title": "Virtual text corpora and their management", "authors": "P Holmes-Higgin, SSR Abidi, K Ahmad", "year": 1994, "citation_id": "fzr2PUYAAAAJ:4OULZ7Gr8RgC", "result_id": "fzr2PUYAAAAJ:4OULZ7Gr8RgC", "source": "scholar", "publication_info": {"summary": "Sixth EURALEX Int. Congress 94, 1994"}, "publication": "Sixth EURALEX Int. Congress 94, 1994", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&cstart=300&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:4OULZ7Gr8RgC"}, {"title": "A description of texts in a corpus:'virtual'and'real'corpora", "authors": "P Holmes-Higgin, K Ahmad, SSR Abidi", "year": 1994, "citation_id": "fzr2PUYAAAAJ:ufrVoPGSRksC", "result_id": "fzr2PUYAAAAJ:ufrVoPGSRksC", "source": "scholar", "publication_info": {"summary": "EURALEX\u201994:(Proc. of the 6th EURALEX International Congress on Lexicography \u2026, 1994"}, "publication": "EURALEX\u201994:(Proc. of the 6th EURALEX International Congress on Lexicography \u2026, 1994", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&cstart=300&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:ufrVoPGSRksC"}, {"title": "EFFECTS OF CONVENTIONAL DJS AND LOOP TAIL STENT ON LOWER URINARY TRACT SYMPTOMS", "authors": "U Hamid, S Abidi, DP Anwar Naqvi, AH Rizvi", "year": "", "citation_id": "fzr2PUYAAAAJ:TlpoogIpr_IC", "result_id": "fzr2PUYAAAAJ:TlpoogIpr_IC", "source": "scholar", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&cstart=300&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:TlpoogIpr_IC"}, {"title": "Machine Learning-Based Early Prediction of Hospitalization in Hemodialysis Patients During Ambulance Transport to the Emergency Department", "authors": "S Majouni, K Tennankore, SSR Abidi", "year": "", "citation_id": "fzr2PUYAAAAJ:mWEH9CqjF64C", "result_id": "fzr2PUYAAAAJ:mWEH9CqjF64C", "source": "scholar", "publication_info": {"summary": "Available at SSRN 5355115, 0"}, "publication": "Available at SSRN 5355115, 0", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&cstart=300&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:mWEH9CqjF64C"}, {"title": "2021 IEEE 9th International Conference on Healthcare Informatics (ICHI)| 978-1-6654-0132-6/21/$31.00\u00a9 2021 IEEE| DOI: 10.1109/ICHI52183. 2021.00106", "authors": "AB Abacha, S Abidi, SSR Abidi, B Adhikari, G Agrawal, V Aharonson, ...", "year": "", "citation_id": "fzr2PUYAAAAJ:XUvXOeBm_78C", "result_id": "fzr2PUYAAAAJ:XUvXOeBm_78C", "source": "scholar", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&cstart=300&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:XUvXOeBm_78C"}, {"title": "Dynamic Tailoring of RETE Networks in Incremental Scenarios", "authors": "W Van Woensel, SSR Abidi", "year": "", "citation_id": "fzr2PUYAAAAJ:fFSKOagxvKUC", "result_id": "fzr2PUYAAAAJ:fFSKOagxvKUC", "source": "scholar", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&cstart=300&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:fFSKOagxvKUC"}, {"title": "Investigating Semantics-driven Query Rewriting Using Plausible Patterns for Medical Knowledge Discovery and Decision Support", "authors": "H Mohammadhassanzadeh, SR Abidi, W Van Woensel, SSR Abidi", "year": "", "citation_id": "fzr2PUYAAAAJ:OR75R8vi5nAC", "result_id": "fzr2PUYAAAAJ:OR75R8vi5nAC", "source": "scholar", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&cstart=300&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:OR75R8vi5nAC"}, {"title": "Patient and Provider Perspectives on Usefulness of a Computerized Behavior Modification Intervention in a Shared Decision Making Environment", "authors": "S Abidi, M Vallis, SSR Abidi, H Piccinini-Vallis, SA Imran", "year": "", "citation_id": "fzr2PUYAAAAJ:bKqednn6t2AC", "result_id": "fzr2PUYAAAAJ:bKqednn6t2AC", "source": "scholar", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&cstart=300&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:bKqednn6t2AC"}, {"title": "An Ontology-Mediated Scenario Composer for Knowledge Acquisition in Intelligent Systems", "authors": "SSR Abidi", "year": "", "citation_id": "fzr2PUYAAAAJ:HIFyuExEbWQC", "result_id": "fzr2PUYAAAAJ:HIFyuExEbWQC", "source": "scholar", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&cstart=300&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:HIFyuExEbWQC"}, {"title": "A Knowledge Management Approach for Tacit Knowledge Explication and Crystallisation", "authors": "YN Cheah, SSR Abidi", "year": "", "citation_id": "fzr2PUYAAAAJ:mlAyqtXpCwEC", "result_id": "fzr2PUYAAAAJ:mlAyqtXpCwEC", "source": "scholar", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&cstart=300&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:mlAyqtXpCwEC"}, {"title": "Augmenting GEM-Encoded Clinical Practice Guidelines with Relevant Best-Evidence Autonomously Retrieved from MEDLINE", "authors": "M Kershaw, SSR Abidi, E Milios", "year": "", "citation_id": "fzr2PUYAAAAJ:IRz6iEL74y4C", "result_id": "fzr2PUYAAAAJ:IRz6iEL74y4C", "source": "scholar", "publication_info": {"summary": "9th International Symposium for Health Information Management Research, 0"}, "publication": "9th International Symposium for Health Information Management Research, 0", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&cstart=300&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:IRz6iEL74y4C"}, {"title": "Context-Sensitive Personalized Information: A Synergy of Item-Based Collaborative Filtering and Case Based Reasoning", "authors": "ZCSSR Abidi", "year": "", "citation_id": "fzr2PUYAAAAJ:DUooU5lO8OsC", "result_id": "fzr2PUYAAAAJ:DUooU5lO8OsC", "source": "scholar", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&cstart=300&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:DUooU5lO8OsC"}, {"title": "Ontology Engineering to Model Clinical Pathways: Towards the Computerization and Execution of Clinical Pathways", "authors": "SSR Abidi", "year": "", "citation_id": "fzr2PUYAAAAJ:oNZyr7d5Mn4C", "result_id": "fzr2PUYAAAAJ:oNZyr7d5Mn4C", "source": "scholar", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&cstart=300&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:oNZyr7d5Mn4C"}, {"title": "ONTOLOGY-DRIVEN E-SCIENCE PLATFORM FOR OCEAN SCIENCES", "authors": "SR Abidi, SSR Abidi, A Daniyal, A Abusharekh, M Kwan", "year": "", "citation_id": "fzr2PUYAAAAJ:gsN89kCJA0AC", "result_id": "fzr2PUYAAAAJ:gsN89kCJA0AC", "source": "scholar", "publication_info": {"summary": "e-society, 335, 0"}, "publication": "e-society, 335, 0", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&cstart=300&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:gsN89kCJA0AC"}, {"title": "IMPROVING OUR UNDERSTANDING OF MEDICINE 2.0 COMMUNITIES: COMBINING CONTENT AND SOCIAL NETWORK ANALYSIS", "authors": "SA Stewart, SSR Abidi", "year": "", "citation_id": "fzr2PUYAAAAJ:g3aElNc5_aQC", "result_id": "fzr2PUYAAAAJ:g3aElNc5_aQC", "source": "scholar", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&cstart=300&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:g3aElNc5_aQC"}, {"title": "Clinical Pathway Ontology for Generating Patient Specific CarePlans", "authors": "K Hurley, SSR Abidi", "year": "", "citation_id": "fzr2PUYAAAAJ:hMsQuOkrut0C", "result_id": "fzr2PUYAAAAJ:hMsQuOkrut0C", "source": "scholar", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&cstart=300&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:hMsQuOkrut0C"}, {"title": "Discovery of Non-Taxonomic Concept Pairs from Unstructured Text in Support of Ontology Learning", "authors": "MEIK WONG, SSR ABIDI, I JONSEN", "year": "", "citation_id": "fzr2PUYAAAAJ:ILKRHgRFtOwC", "result_id": "fzr2PUYAAAAJ:ILKRHgRFtOwC", "source": "scholar", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&cstart=300&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:ILKRHgRFtOwC"}, {"title": "Augmenting GEM-Encoded Clinical Practice Guidelines with Relevant Best", "authors": "M Kershaw, SSR Abidi, E Milios", "year": "", "citation_id": "fzr2PUYAAAAJ:EYYDruWGBe4C", "result_id": "fzr2PUYAAAAJ:EYYDruWGBe4C", "source": "scholar", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&cstart=300&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:EYYDruWGBe4C"}, {"title": "Creating a Knowledge-Based Personal Patient Diary for Pediatric Cancer Survivors", "authors": "SA Stewart, S Abidi, SSR Abidi, L Parker, M Bernstein", "year": "", "citation_id": "fzr2PUYAAAAJ:EkHepimYqZsC", "result_id": "fzr2PUYAAAAJ:EkHepimYqZsC", "source": "scholar", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&cstart=300&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:EkHepimYqZsC"}, {"title": "Designing Adaptive Hypermedia for Internet Portals: A Personalization Strategy", "authors": "SSR ABIDI", "year": "", "citation_id": "fzr2PUYAAAAJ:NJ774b8OgUMC", "result_id": "fzr2PUYAAAAJ:NJ774b8OgUMC", "source": "scholar", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&cstart=300&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:NJ774b8OgUMC"}, {"title": "Simulation of'Sensori-motor Stage V and VI'Language Development: A Connectionist Network Approach", "authors": "SSR Abidi, K Ahmad", "year": "", "citation_id": "fzr2PUYAAAAJ:wbdj-CoPYUoC", "result_id": "fzr2PUYAAAAJ:wbdj-CoPYUoC", "source": "scholar", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&cstart=300&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:wbdj-CoPYUoC"}, {"title": "AI Amidst the Healthcare Revolution: Towards an \u2018Intelligent\u2019Tele-Healthcare Information and Diagnostic Environment", "authors": "SSR Abidi", "year": "", "citation_id": "fzr2PUYAAAAJ:q3oQSFYPqjQC", "result_id": "fzr2PUYAAAAJ:q3oQSFYPqjQC", "source": "scholar", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&cstart=300&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:q3oQSFYPqjQC"}, {"title": "Measuring the Effectiveness of a Discussion Forum for Knowledge Sharing Among Emergency Practitioners: A Social Network Approach", "authors": "J Curran, SSR Abidi", "year": "", "citation_id": "fzr2PUYAAAAJ:K3LRdlH-MEoC", "result_id": "fzr2PUYAAAAJ:K3LRdlH-MEoC", "source": "scholar", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&cstart=300&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:K3LRdlH-MEoC"}, {"title": "Engineering of Multi-Agent Systems to Effectuate Distributed Data Mining Activities", "authors": "SZH ZAIDI, SSR ABIDI, ZI Hashmic", "year": "", "citation_id": "fzr2PUYAAAAJ:OU6Ihb5iCvQC", "result_id": "fzr2PUYAAAAJ:OU6Ihb5iCvQC", "source": "scholar", "publication_info": {"summary": "18th International Congress of the European Federation for Medical \u2026, 0"}, "publication": "18th International Congress of the European Federation for Medical \u2026, 0", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&cstart=300&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:OU6Ihb5iCvQC"}, {"title": "A Rule-based Method for Extracting RDF (S) and OWL Sub-ontologies", "authors": "S Hussain, SSR Abidi", "year": "", "citation_id": "fzr2PUYAAAAJ:dshw04ExmUIC", "result_id": "fzr2PUYAAAAJ:dshw04ExmUIC", "source": "scholar", "publication_info": {"summary": "Canadian Semantic Web Working Symposium. Semantic Web and Beyond, Springer \u2026, 0"}, "publication": "Canadian Semantic Web Working Symposium. Semantic Web and Beyond, Springer \u2026, 0", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&cstart=300&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:dshw04ExmUIC"}], "search_metadata": {"status": "Success", "source": "serpapi"}}} \ No newline at end of file +{"timestamp": 1782998496.860548, "data": {"articles": [{"title": "Diagnostic Accuracy of Intraoperative Void Score in Predicting Catheter Free Status in Patients Undergoing Transurethral Resection of the Prostate (TURP)", "authors": "RK Akhtar, S Abidi, HH Qureshi, RH Laghari, SAH Rizvi", "year": 2026, "citation_id": "fzr2PUYAAAAJ:silx2ntsSuwC", "result_id": "fzr2PUYAAAAJ:silx2ntsSuwC", "source": "scholar", "publication_info": {"summary": "Journal of Islamabad Medical & Dental College 15 (2), 2026"}, "publication": "Journal of Islamabad Medical & Dental College 15 (2), 2026", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:silx2ntsSuwC"}, {"title": "Efficacy of Potassium Citrate as a Preventive Treatment for Double-J Stent Encrustations", "authors": "S Khan, S Abidi, HH Qureshi, RH Laghari, SAH Rizvi", "year": 2026, "citation_id": "fzr2PUYAAAAJ:aIdbFUkbNIkC", "result_id": "fzr2PUYAAAAJ:aIdbFUkbNIkC", "source": "scholar", "publication_info": {"summary": "Journal of Islamabad Medical & Dental College 15 (2), 2026"}, "publication": "Journal of Islamabad Medical & Dental College 15 (2), 2026", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:aIdbFUkbNIkC"}, {"title": "A roadmap toward scaling, reasoning and self-evolving foundation models for nuclear and particle physics", "authors": "Y Ren, JD Osborn, E Brost, H Yu, SH Abidi, Y Go, S Li, D Park, Y Huang, ...", "year": 2026, "citation_id": "fzr2PUYAAAAJ:69ZgNCALVd0C", "result_id": "fzr2PUYAAAAJ:69ZgNCALVd0C", "source": "scholar", "publication_info": {"summary": "International Journal of Modern Physics A 41 (15n16), 2650086, 2026"}, "publication": "International Journal of Modern Physics A 41 (15n16), 2650086, 2026", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:69ZgNCALVd0C"}, {"title": "A Knowledge Graph to Represent and Predict Cancer Mechanistic Associations", "authors": "M Calagari, S Abidi, SSR Abidi", "year": 2026, "citation_id": "fzr2PUYAAAAJ:k_7cPK9k7w8C", "result_id": "fzr2PUYAAAAJ:k_7cPK9k7w8C", "source": "scholar", "publication_info": {"summary": "Studies in health technology and informatics 336, 318-322, 2026"}, "publication": "Studies in health technology and informatics 336, 318-322, 2026", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:k_7cPK9k7w8C"}, {"title": "Longitudinal Trends of Depression in Traumatic Brain Injury: The Role of Individual Heterogeneity in Clinical Prediction", "authors": "N Kureshi, DB Clarke, A Nunes, C Feng, SSR Abidi", "year": 2026, "citation_id": "fzr2PUYAAAAJ:EPG8bYD4jVwC", "result_id": "fzr2PUYAAAAJ:EPG8bYD4jVwC", "source": "scholar", "publication_info": {"summary": "International Journal of Mental Health and Addiction, 1-20, 2026"}, "publication": "International Journal of Mental Health and Addiction, 1-20, 2026", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:EPG8bYD4jVwC"}, {"title": "Machine learning for frailty assessment and outcome prediction in cardiovascular disease: a scoping review", "authors": "J Quach, O Theou, S Maxwell, SSR Abidi, X Song, K Rockwood, ...", "year": 2026, "citation_id": "fzr2PUYAAAAJ:jSAVyFp_754C", "result_id": "fzr2PUYAAAAJ:jSAVyFp_754C", "source": "scholar", "publication_info": {"summary": "Ageing Research Reviews, 103122, 2026"}, "publication": "Ageing Research Reviews, 103122, 2026", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:jSAVyFp_754C"}, {"title": "Finding Associative and Causal Effects of Temporal Changes in Health Features for Prevalent and Incident Cancer in Males: A Machine Learning Approach", "authors": "A Choubineh, SSR Abidi, E Sweeney, S Abidi", "year": 2026, "citation_id": "fzr2PUYAAAAJ:Hck25ST_3aIC", "result_id": "fzr2PUYAAAAJ:Hck25ST_3aIC", "source": "scholar", "publication_info": {"summary": "Opening the Personal Gate between Technology and Health Care, 72-76, 2026"}, "publication": "Opening the Personal Gate between Technology and Health Care, 72-76, 2026", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:Hck25ST_3aIC"}, {"title": "A Counterfactual Analysis Framework based on Uncertainty Guided Contrastive Learning for Donor-Recipient Matching in Organ Transplantation", "authors": "SAA Naqvi, K Tennankore, SSR Abidi", "year": 2025, "citation_id": "fzr2PUYAAAAJ:rbm3iO8VlycC", "result_id": "fzr2PUYAAAAJ:rbm3iO8VlycC", "source": "scholar", "publication_info": {"summary": "Available at SSRN 6250498, 2025"}, "publication": "Available at SSRN 6250498, 2025", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:rbm3iO8VlycC"}, {"title": "Generating a knowledge graph to understand the mechanistic relationships between multimorbid diabetes, hypertension and kidney diseases", "authors": "CE Egwuatu, A Daowd, S Abidi, SSR Abidi", "year": 2025, "citation_id": "fzr2PUYAAAAJ:PkcyUWeTMh0C", "result_id": "fzr2PUYAAAAJ:PkcyUWeTMh0C", "source": "scholar", "publication_info": {"summary": "Proceedings of the 2025 18th Health Informatics Knowledge Management \u2026, 2025"}, "publication": "Proceedings of the 2025 18th Health Informatics Knowledge Management \u2026, 2025", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:PkcyUWeTMh0C"}, {"title": "Concept-Level Local Explanations of Kidney Transplant Survival Predictions by Black-Box ML Models", "authors": "J Rad, SAA Naqvi, K Tennankore, S Abidi, A Vinson, SSR Abidi", "year": 2025, "citation_id": "fzr2PUYAAAAJ:JTqpx9DYBaYC", "result_id": "fzr2PUYAAAAJ:JTqpx9DYBaYC", "source": "scholar", "publication_info": {"summary": "Proceedings of the 2025 18th Health Informatics Knowledge Management \u2026, 2025"}, "publication": "Proceedings of the 2025 18th Health Informatics Knowledge Management \u2026, 2025", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:JTqpx9DYBaYC"}, {"title": "From XAI-Driven Decision Paths to Processes: Mining and Clustering Decision Paths for Interpretable Kidney Transplant Prediction", "authors": "E Baratnezhad, W Van Woensel, J Rad, SSR Abidi", "year": 2025, "citation_id": "fzr2PUYAAAAJ:65Yg0jNCQDAC", "result_id": "fzr2PUYAAAAJ:65Yg0jNCQDAC", "source": "scholar", "publication_info": {"summary": "International Workshop on Process Mining Applications for Healthcare, 149-160, 2025"}, "publication": "International Workshop on Process Mining Applications for Healthcare, 149-160, 2025", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:65Yg0jNCQDAC"}, {"title": "A reinforcement learning framework for optimizing kidney allocation for transplant based on survival and ethical criteria", "authors": "SAA Naqvi, K Tennankore, G Worthen, A Vinson, SSR Abidi", "year": 2025, "citation_id": "fzr2PUYAAAAJ:SGW5VrABaM0C", "result_id": "fzr2PUYAAAAJ:SGW5VrABaM0C", "source": "scholar", "publication_info": {"summary": "International Conference on Artificial Intelligence in Medicine, 323-332, 2025"}, "publication": "International Conference on Artificial Intelligence in Medicine, 323-332, 2025", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:SGW5VrABaM0C"}, {"title": "Using Word Embeddings to Extract Semantic Relations from Biomedical Texts: Towards Literature-Based Discovery", "authors": "W Van Woensel, SS Pradeep, A Daowd, S Abidi, SSR Abidi", "year": 2025, "citation_id": "fzr2PUYAAAAJ:pS0ncopqnHgC", "result_id": "fzr2PUYAAAAJ:pS0ncopqnHgC", "source": "scholar", "publication_info": {"summary": "International Conference on Artificial Intelligence in Medicine, 422-427, 2025"}, "publication": "International Conference on Artificial Intelligence in Medicine, 422-427, 2025", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:pS0ncopqnHgC"}, {"title": "Donor-Recipient Matching for Kidney Transplantation using Uncertainty Estimation in Generalized Propensity Score", "authors": "SAA Naqvi, K Tennankore, S Abidi, A Vinson, G Worthen, SSR Abidi", "year": 2025, "citation_id": "fzr2PUYAAAAJ:2l5NCbZemmgC", "result_id": "fzr2PUYAAAAJ:2l5NCbZemmgC", "source": "scholar", "publication_info": {"summary": "Intelligent Health Systems-From Technology to Data and Knowledge \u2026, 2025"}, "publication": "Intelligent Health Systems-From Technology to Data and Knowledge \u2026, 2025", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:2l5NCbZemmgC"}, {"title": "A Heterogeneous Bipartite Graph Framework for Donor-Recipient Matching in Kidney Transplantation", "authors": "S Majouni, K Tennankore, S Abidi, A Vinson, G Worthen, SSR Abidi", "year": 2025, "citation_id": "fzr2PUYAAAAJ:An6A6Jpfc1oC", "result_id": "fzr2PUYAAAAJ:An6A6Jpfc1oC", "source": "scholar", "publication_info": {"summary": "Intelligent Health Systems-From Technology to Data and Knowledge \u2026, 2025"}, "publication": "Intelligent Health Systems-From Technology to Data and Knowledge \u2026, 2025", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:An6A6Jpfc1oC"}, {"title": "Using Unsupervised Clustering to Characterize Phenotypes Among Older Kidney Transplant Recipients: A Cohort Study", "authors": "S Singh, SSR Abidi, SAA Naqvi, AJ Vinson, TAA Skinner, G Worthen, ...", "year": 2025, "citation_id": "fzr2PUYAAAAJ:BrOSOlqYqPUC", "result_id": "fzr2PUYAAAAJ:BrOSOlqYqPUC", "source": "scholar", "publication_info": {"summary": "Canadian Journal of Kidney Health and Disease 12, 20543581251322576, 2025"}, "publication": "Canadian Journal of Kidney Health and Disease 12, 20543581251322576, 2025", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:BrOSOlqYqPUC"}, {"title": "Optimizing prescribing for individuals with type 2 diabetes and chronic kidney disease through the development and validation of algorithms for community pharmacists", "authors": "J Morris, M Battistella, K Tennankore, S Soroka, C Kendell, P Poyah, ...", "year": 2025, "citation_id": "fzr2PUYAAAAJ:kF1pexMAQbMC", "result_id": "fzr2PUYAAAAJ:kF1pexMAQbMC", "source": "scholar", "publication_info": {"summary": "Canadian Journal of Kidney Health and Disease 12, 20543581241309974, 2025"}, "publication": "Canadian Journal of Kidney Health and Disease 12, 20543581241309974, 2025", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:kF1pexMAQbMC"}, {"title": "Investigating the influence of socioeconomic deprivation on spatial patterns of traumatic brain injuries through Bayesian spatial modeling", "authors": "N Kureshi, SSR Abidi, DB Clarke, W Zeng, C Feng", "year": 2024, "citation_id": "fzr2PUYAAAAJ:WAzi4Gm8nLoC", "result_id": "fzr2PUYAAAAJ:WAzi4Gm8nLoC", "source": "scholar", "publication_info": {"summary": "GeoJournal 89 (6), 238, 2024"}, "publication": "GeoJournal 89 (6), 238, 2024", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:WAzi4Gm8nLoC"}, {"title": "Risk stratification of new-onset psychiatric disorders using clinically distinct traumatic brain injury phenotypes", "authors": "N Kureshi, A Nunes, C Feng, DB Clarke, SSR Abidi", "year": 2024, "citation_id": "fzr2PUYAAAAJ:ziOE8S1-AIUC", "result_id": "fzr2PUYAAAAJ:ziOE8S1-AIUC", "source": "scholar", "publication_info": {"summary": "Archives of Public Health 82 (1), 116, 2024"}, "publication": "Archives of Public Health 82 (1), 116, 2024", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:ziOE8S1-AIUC"}, {"title": "A Topological Data Analysis of Un met Health Care Needs Among Injured Patients", "authors": "N Kureshi, SSR Abidi", "year": 2024, "citation_id": "fzr2PUYAAAAJ:YsrPvlHIBpEC", "result_id": "fzr2PUYAAAAJ:YsrPvlHIBpEC", "source": "scholar", "publication_info": {"summary": "2024 IEEE 12th International Conference on Healthcare Informatics (ICHI \u2026, 2024"}, "publication": "2024 IEEE 12th International Conference on Healthcare Informatics (ICHI \u2026, 2024", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:YsrPvlHIBpEC"}, {"title": "Extracting Decision Paths via Surrogate Modeling for Explainability of Black Box Classifiers", "authors": "J Rad, K Tennankore, S Abidi, SSR Abidi", "year": 2024, "citation_id": "fzr2PUYAAAAJ:raTqNPD5sRQC", "result_id": "fzr2PUYAAAAJ:raTqNPD5sRQC", "source": "scholar", "publication_info": {"summary": "2024 11th IEEE Swiss Conference on Data Science (SDS), 213-220, 2024"}, "publication": "2024 11th IEEE Swiss Conference on Data Science (SDS), 213-220, 2024", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:raTqNPD5sRQC"}, {"title": "Risk Stratification of New-Onset Psychiatric Disorders Using Clinically Distinct Traumatic Brain Injury Sub-Phenotypes", "authors": "N Kureshi, A Nunes, C Feng, DB Clarke, SSR Abidi", "year": 2024, "citation_id": "fzr2PUYAAAAJ:mUJArPsKIAAC", "result_id": "fzr2PUYAAAAJ:mUJArPsKIAAC", "source": "scholar", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:mUJArPsKIAAC"}, {"title": "Plausible reasoning over large health datasets: A novel approach to data analytics leveraging semantics", "authors": "H Mohammadhassanzadeh, SR Abidi, SSR Abidi", "year": 2024, "citation_id": "fzr2PUYAAAAJ:3bvyWxjaHKcC", "result_id": "fzr2PUYAAAAJ:3bvyWxjaHKcC", "source": "scholar", "publication_info": {"summary": "Knowledge-Based Systems 289, 111493, 2024"}, "publication": "Knowledge-Based Systems 289, 111493, 2024", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:3bvyWxjaHKcC"}, {"title": "Spatial hotspots and sociodemographic profiles associated with traumatic brain injury in Nova Scotia", "authors": "N Kureshi, SSR Abidi, DB Clarke, W Zeng, C Feng", "year": 2024, "citation_id": "fzr2PUYAAAAJ:pAkWuXOU-OoC", "result_id": "fzr2PUYAAAAJ:pAkWuXOU-OoC", "source": "scholar", "publication_info": {"summary": "Journal of neurotrauma 41 (7-8), 844-861, 2024"}, "publication": "Journal of neurotrauma 41 (7-8), 844-861, 2024", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:pAkWuXOU-OoC"}, {"title": "Utilizing Topological Clustering on a Traumatic Brain Injury Cohort: The Association of Neighborhood Socioeconomic Deprivation Profiles with Injury Mortality", "authors": "N Kureshi, DB Clarke, SSR Abidi", "year": 2024, "citation_id": "fzr2PUYAAAAJ:-nhnvRiOwuoC", "result_id": "fzr2PUYAAAAJ:-nhnvRiOwuoC", "source": "scholar", "publication_info": {"summary": "Proceedings of the 2024 Australasian Computer Science Week, 108-114, 2024"}, "publication": "Proceedings of the 2024 Australasian Computer Science Week, 108-114, 2024", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:-nhnvRiOwuoC"}, {"title": "Characterizing cluster-based frailty phenotypes in a multicenter prospective cohort of kidney transplant candidates", "authors": "SHR Abidi, N Zincir-Heywood, SSR Abidi, K Jalakam, S Abidi, ...", "year": 2024, "citation_id": "fzr2PUYAAAAJ:w0F2JDEymm0C", "result_id": "fzr2PUYAAAAJ:w0F2JDEymm0C", "source": "scholar", "publication_info": {"summary": "MEDINFO 2023\u2014The Future Is Accessible: Proceedings of the 19th World \u2026, 2024"}, "publication": "MEDINFO 2023\u2014The Future Is Accessible: Proceedings of the 19th World \u2026, 2024", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:w0F2JDEymm0C"}, {"title": "Predicting Urgent Dialysis at Ambulance Transport to the Emergency Department Using Machine Learning Methods", "authors": "S Majouni, K Tennankore, SSR Abidi", "year": 2024, "citation_id": "fzr2PUYAAAAJ:HhcuHIWmDEUC", "result_id": "fzr2PUYAAAAJ:HhcuHIWmDEUC", "source": "scholar", "publication_info": {"summary": "MEDINFO 2023\u2014The Future Is Accessible: Proceedings of the 19th World \u2026, 2024"}, "publication": "MEDINFO 2023\u2014The Future Is Accessible: Proceedings of the 19th World \u2026, 2024", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:HhcuHIWmDEUC"}, {"title": "Digital therapeutics for COPD patient self-management: needs analysis and design study", "authors": "SR Abidi, T Rickards, W Van Woensel, SSR Abidi", "year": 2024, "citation_id": "fzr2PUYAAAAJ:VN7nJs4JPk0C", "result_id": "fzr2PUYAAAAJ:VN7nJs4JPk0C", "source": "scholar", "publication_info": {"summary": "Stud Health Technol Inform 310, 209-213, 2024"}, "publication": "Stud Health Technol Inform 310, 209-213, 2024", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:VN7nJs4JPk0C"}, {"title": "Stone clearance rate in patients treated with open surgery versus percutaneous nephrolithotomy for the management of staghorn renal calculi", "authors": "T Gazder", "year": 2023, "citation_id": "fzr2PUYAAAAJ:DrR-2ekChdkC", "result_id": "fzr2PUYAAAAJ:DrR-2ekChdkC", "source": "scholar", "publication_info": {"summary": "International journal of endorsing health science research, 2023"}, "publication": "International journal of endorsing health science research, 2023", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:DrR-2ekChdkC"}, {"title": "Needs and expectations for artificial intelligence in emergency medicine according to Canadian physicians", "authors": "KW Eastwood, R May, P Andreou, S Abidi, SSR Abidi, OM Loubani", "year": 2023, "citation_id": "fzr2PUYAAAAJ:O0nohqN1r9EC", "result_id": "fzr2PUYAAAAJ:O0nohqN1r9EC", "source": "scholar", "publication_info": {"summary": "BMC Health Services Research 23 (1), 798, 2023"}, "publication": "BMC Health Services Research 23 (1), 798, 2023", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:O0nohqN1r9EC"}, {"title": "Multiview clustering to identify novel kidney donor phenotypes for assessing graft survival in older transplant recipients", "authors": "SSR Abidi, A Naqvi, G Worthen, A Vinson, S Abidi, B Kiberd, T Skinner, ...", "year": 2023, "citation_id": "fzr2PUYAAAAJ:sszUF3NjhM4C", "result_id": "fzr2PUYAAAAJ:sszUF3NjhM4C", "source": "scholar", "publication_info": {"summary": "Kidney360 4 (7), 951-961, 2023"}, "publication": "Kidney360 4 (7), 951-961, 2023", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:sszUF3NjhM4C"}, {"title": "Decentralized web-based clinical decision support using semantic glean workflows", "authors": "W Van Woensel, S Abidi, SSR Abidi", "year": 2023, "citation_id": "fzr2PUYAAAAJ:U_HPUtbDl20C", "result_id": "fzr2PUYAAAAJ:U_HPUtbDl20C", "source": "scholar", "publication_info": {"summary": "International Conference on Artificial Intelligence in Medicine, 362-367, 2023"}, "publication": "International Conference on Artificial Intelligence in Medicine, 362-367, 2023", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:U_HPUtbDl20C"}, {"title": "Support Using Semantic GLEAN Workflows", "authors": "W Van, S Abidi, SSR Abidi", "year": 2023, "citation_id": "fzr2PUYAAAAJ:NDuN12AVoxsC", "result_id": "fzr2PUYAAAAJ:NDuN12AVoxsC", "source": "scholar", "publication_info": {"summary": "Artificial Intelligence in Medicine: 21st International Conference on \u2026, 2023"}, "publication": "Artificial Intelligence in Medicine: 21st International Conference on \u2026, 2023", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:NDuN12AVoxsC"}, {"title": "Comparison of Closure versus Non-closure of Buccal Mucosal Graft Harvesting Site in Urethroplasty.", "authors": "A Shezad, T Gazder, S Rabiullah, M Zulfiqar, U Qamar, H Jameel, S Abidi, ...", "year": 2023, "citation_id": "fzr2PUYAAAAJ:oi2SiIJ9l4AC", "result_id": "fzr2PUYAAAAJ:oi2SiIJ9l4AC", "source": "scholar", "publication_info": {"summary": "International Journal of Endorsing Health Science Research 11 (2), 97-103, 2023"}, "publication": "International Journal of Endorsing Health Science Research 11 (2), 97-103, 2023", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:oi2SiIJ9l4AC"}, {"title": "A community-of-practice-based evaluation methodology for knowledge intensive computational methods and its application to multimorbidity decision support", "authors": "W Van Woensel, SW Tu, W Michalowski, SSR Abidi, S Abidi, JR Alonso, ...", "year": 2023, "citation_id": "fzr2PUYAAAAJ:PyEswDtIyv0C", "result_id": "fzr2PUYAAAAJ:PyEswDtIyv0C", "source": "scholar", "publication_info": {"summary": "Journal of Biomedical Informatics 142, 104395, 2023"}, "publication": "Journal of Biomedical Informatics 142, 104395, 2023", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:PyEswDtIyv0C"}, {"title": "Improving mental health literacy and reducing psychological problems among teachers in Zambia: Protocol for implementation and evaluation of a Wellness4Teachers email messaging \u2026", "authors": "B Agyapong, C Chishimba, Y Wei, R da Luz Dias, E Eboreime, E Msidi, ...", "year": 2023, "citation_id": "fzr2PUYAAAAJ:QyXJ3EUuO1IC", "result_id": "fzr2PUYAAAAJ:QyXJ3EUuO1IC", "source": "scholar", "publication_info": {"summary": "JMIR Research Protocols 12 (1), e44370, 2023"}, "publication": "JMIR Research Protocols 12 (1), e44370, 2023", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:QyXJ3EUuO1IC"}, {"title": "Validation of a flow\u2010cytometry\u2010based red blood cell antigen phenotyping method", "authors": "R Liwski, G Clarke, C Cheng, SSR Abidi, SR Abidi, JG Quinn", "year": 2023, "citation_id": "fzr2PUYAAAAJ:HGTzPopzzJcC", "result_id": "fzr2PUYAAAAJ:HGTzPopzzJcC", "source": "scholar", "publication_info": {"summary": "Vox Sanguinis 118 (3), 207-216, 2023"}, "publication": "Vox Sanguinis 118 (3), 207-216, 2023", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:HGTzPopzzJcC"}, {"title": "Gait biomechanics phenotypes among total knee arthroplasty candidates by machine learning cluster analysis", "authors": "KL Young\u2010Shand, PC Roy, MJ Dunbar, SSR Abidi, JL Astephen Wilson", "year": 2023, "citation_id": "fzr2PUYAAAAJ:LPtt_HFRSbwC", "result_id": "fzr2PUYAAAAJ:LPtt_HFRSbwC", "source": "scholar", "publication_info": {"summary": "Journal of Orthopaedic Research\u00ae 41 (2), 335-344, 2023"}, "publication": "Journal of Orthopaedic Research\u00ae 41 (2), 335-344, 2023", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:LPtt_HFRSbwC"}, {"title": "Determing the success rate of extracorporeal shock wave lithotripsy in renal pelvis stone of 1-2 cm in size.", "authors": "N Ahmed, T Gazder, H Saad, A Khan, S Rabiullah, M Zulfiqar, U Qamar, ...", "year": 2023, "citation_id": "fzr2PUYAAAAJ:w1MjKQ0l0TYC", "result_id": "fzr2PUYAAAAJ:w1MjKQ0l0TYC", "source": "scholar", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:w1MjKQ0l0TYC"}, {"title": "Ensemble Clustering to Generate Phenotypes of Kidney Transplant Donors and Recipients", "authors": "SSR Abidi, K Jalakam, SHR Abidi, K Tennankore", "year": 2023, "citation_id": "fzr2PUYAAAAJ:FiDNX6EVdGUC", "result_id": "fzr2PUYAAAAJ:FiDNX6EVdGUC", "source": "scholar", "publication_info": {"summary": "MEDINFO 2023\u2014The Future Is Accessible: Proceedings of the 19th World \u2026, 2023"}, "publication": "MEDINFO 2023\u2014The Future Is Accessible: Proceedings of the 19th World \u2026, 2023", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:FiDNX6EVdGUC"}, {"title": "Explainable decision support using task network models in Notation3: computerizing lipid management clinical guidelines as interactive task networks", "authors": "W Van Woensel, S Abidi, K Tennankore, G Worthen, SSR Abidi", "year": 2022, "citation_id": "fzr2PUYAAAAJ:1Ye0OR6EYb4C", "result_id": "fzr2PUYAAAAJ:1Ye0OR6EYb4C", "source": "scholar", "publication_info": {"summary": "International Conference on Artificial Intelligence in Medicine, 3-13, 2022"}, "publication": "International Conference on Artificial Intelligence in Medicine, 3-13, 2022", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:1Ye0OR6EYb4C"}, {"title": "Extracting surrogate decision trees from black-box models to explain the temporal importance of clinical features in predicting kidney graft survival", "authors": "J Rad, KK Tennankore, A Vinson, SSR Abidi", "year": 2022, "citation_id": "fzr2PUYAAAAJ:jFemdcug13IC", "result_id": "fzr2PUYAAAAJ:jFemdcug13IC", "source": "scholar", "publication_info": {"summary": "International conference on artificial intelligence in medicine, 88-98, 2022"}, "publication": "International conference on artificial intelligence in medicine, 88-98, 2022", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:jFemdcug13IC"}, {"title": "A knowledge graph completion method applied to literature-based discovery for predicting missing links targeting cancer drug repurposing", "authors": "A Daowd, S Abidi, SSR Abidi", "year": 2022, "citation_id": "fzr2PUYAAAAJ:6_hjMsCP8ZoC", "result_id": "fzr2PUYAAAAJ:6_hjMsCP8ZoC", "source": "scholar", "publication_info": {"summary": "International Conference on Artificial Intelligence in Medicine, 24-34, 2022"}, "publication": "International Conference on Artificial Intelligence in Medicine, 24-34, 2022", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:6_hjMsCP8ZoC"}, {"title": "Clinical guidelines as executable and interactive workflows with FHIR-compliant health data input using GLEAN", "authors": "W Van Woensel, S Abidi, K Tennankore, G Worthen, SSR Abidi", "year": 2022, "citation_id": "fzr2PUYAAAAJ:AXkvAH5U_nMC", "result_id": "fzr2PUYAAAAJ:AXkvAH5U_nMC", "source": "scholar", "publication_info": {"summary": "International Conference on Artificial Intelligence in Medicine, 421-425, 2022"}, "publication": "International Conference on Artificial Intelligence in Medicine, 421-425, 2022", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:AXkvAH5U_nMC"}, {"title": "Using visual analytics to optimize blood product inventory at a hospital\u2019s blood transfusion service", "authors": "J Rad, J Quinn, C Cheng, SR Abidi, R Liwski, SSR Abidi", "year": 2022, "citation_id": "fzr2PUYAAAAJ:q-HalDI95KYC", "result_id": "fzr2PUYAAAAJ:q-HalDI95KYC", "source": "scholar", "publication_info": {"summary": "International Conference on Artificial Intelligence in Medicine, 436-440, 2022"}, "publication": "International Conference on Artificial Intelligence in Medicine, 436-440, 2022", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:q-HalDI95KYC"}, {"title": "Assessing Knee Osteoarthritis Severity and Biomechanical Changes After Total Knee Arthroplasty Using Self-organizing Maps", "authors": "K Young-Shand, P Roy, M Dunbar, SSR Abidi, J Wilson", "year": 2022, "citation_id": "fzr2PUYAAAAJ:rHJHxKgnXwkC", "result_id": "fzr2PUYAAAAJ:rHJHxKgnXwkC", "source": "scholar", "publication_info": {"summary": "International Conference on Artificial Intelligence in Medicine, 65-75, 2022"}, "publication": "International Conference on Artificial Intelligence in Medicine, 65-75, 2022", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:rHJHxKgnXwkC"}, {"title": "Towards an adaptive clinical transcription system for In-Situ transcribing of patient encounter information", "authors": "W Van Woensel, B Taylor, SSR Abidi", "year": 2022, "citation_id": "fzr2PUYAAAAJ:WC9gN4BGCRcC", "result_id": "fzr2PUYAAAAJ:WC9gN4BGCRcC", "source": "scholar", "publication_info": {"summary": "Stud Health Technol Inf 290, 158-62, 2022"}, "publication": "Stud Health Technol Inf 290, 158-62, 2022", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:WC9gN4BGCRcC"}, {"title": "Using Interactive Visual Analytics to Optimize Blood Products Inventory at a Blood Bank", "authors": "J Rad, JG Quinn, C Cheng, R Liwski, S Abidi, SSR Abidi", "year": 2022, "citation_id": "fzr2PUYAAAAJ:owLR8QvbtFgC", "result_id": "fzr2PUYAAAAJ:owLR8QvbtFgC", "source": "scholar", "publication_info": {"summary": "MEDINFO 2021: One World, One Health\u2013Global Partnership for Digital \u2026, 2022"}, "publication": "MEDINFO 2021: One World, One Health\u2013Global Partnership for Digital \u2026, 2022", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:owLR8QvbtFgC"}, {"title": "Applying Machine Learning to Arsenic Species and Metallomics Profiles of Toenails to Evaluate Associations of Environmental Arsenic with Incident Cancer Cases", "authors": "S Majouni, JS Kim, E Sweeney, E Keltie, SSR Abidi", "year": 2022, "citation_id": "fzr2PUYAAAAJ:6bLC7aUMtPcC", "result_id": "fzr2PUYAAAAJ:6bLC7aUMtPcC", "source": "scholar", "publication_info": {"summary": "Challenges of Trustable AI and Added-Value on Health: Proceedings of MIE \u2026, 2022"}, "publication": "Challenges of Trustable AI and Added-Value on Health: Proceedings of MIE \u2026, 2022", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:6bLC7aUMtPcC"}, {"title": "Four decades of urolithiasis: What has changed in our practice?", "authors": "M Hussain, S Abidi", "year": 2022, "citation_id": "fzr2PUYAAAAJ:3NQIlFlcGxIC", "result_id": "fzr2PUYAAAAJ:3NQIlFlcGxIC", "source": "scholar", "publication_info": {"summary": "JPMA. The Journal of the Pakistan Medical Association 72 (4), 601-602, 2022"}, "publication": "JPMA. The Journal of the Pakistan Medical Association 72 (4), 601-602, 2022", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:3NQIlFlcGxIC"}, {"title": "Semantic knowledge modeling and evaluation of argument theory to develop dialogue based patient education systems for chronic disease self-management", "authors": "B Rose-Davis, W Van Woensel, SR Abidi, E Stringer, SSR Abidi", "year": 2022, "citation_id": "fzr2PUYAAAAJ:prdVHNxh-e8C", "result_id": "fzr2PUYAAAAJ:prdVHNxh-e8C", "source": "scholar", "publication_info": {"summary": "International Journal of Medical Informatics 160, 104693, 2022"}, "publication": "International Journal of Medical Informatics 160, 104693, 2022", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:prdVHNxh-e8C"}, {"title": "A Knowledge Graph of Mechanistic Associations Between COVID-19, Diabetes Mellitus, and Chronic Kidney Disease", "authors": "M Barrett, SSR Abidi, A Daowd, S Abidi", "year": 2022, "citation_id": "fzr2PUYAAAAJ:SjuI4pbJlxcC", "result_id": "fzr2PUYAAAAJ:SjuI4pbJlxcC", "source": "scholar", "publication_info": {"summary": "MEDINFO 2021: One World, One Health\u2013Global Partnership for Digital \u2026, 2022"}, "publication": "MEDINFO 2021: One World, One Health\u2013Global Partnership for Digital \u2026, 2022", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:SjuI4pbJlxcC"}, {"title": "Staged reflexive artificial intelligence driven testing algorithms for early diagnosis of pituitary disorders", "authors": "W Van Woensel, M Elnenaei, SSR Abidi, DB Clarke, SA Imran", "year": 2021, "citation_id": "fzr2PUYAAAAJ:wKETBy42zhYC", "result_id": "fzr2PUYAAAAJ:wKETBy42zhYC", "source": "scholar", "publication_info": {"summary": "Clinical Biochemistry 97, 48-53, 2021"}, "publication": "Clinical Biochemistry 97, 48-53, 2021", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:wKETBy42zhYC"}, {"title": "Outcomes of cystectomy with MAINZ pouch II and epispadias repair in exstrophy epispadias complex in adults: a single-centre experience from Pakistan", "authors": "M Hussain, U Qamar, S Abidi, T Guzdar, QA Ghori, SAH Rizvi", "year": 2021, "citation_id": "fzr2PUYAAAAJ:CB2v5VPnA5kC", "result_id": "fzr2PUYAAAAJ:CB2v5VPnA5kC", "source": "scholar", "publication_info": {"summary": "Age (range in years) 17, 36, 2021"}, "publication": "Age (range in years) 17, 36, 2021", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:CB2v5VPnA5kC"}, {"title": "Predicting kidney graft survival using machine learning methods: prediction model development and feature significance analysis study", "authors": "SAA Naqvi, K Tennankore, A Vinson, PC Roy, SSR Abidi", "year": 2021, "citation_id": "fzr2PUYAAAAJ:PYBJJbyH-FwC", "result_id": "fzr2PUYAAAAJ:PYBJJbyH-FwC", "source": "scholar", "publication_info": {"summary": "Journal of Medical Internet Research 23 (8), e26843, 2021"}, "publication": "Journal of Medical Internet Research 23 (8), e26843, 2021", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:PYBJJbyH-FwC"}, {"title": "A framework to build a causal knowledge graph for chronic diseases and cancers by discovering semantic associations from biomedical literature", "authors": "A Daowd, M Barrett, S Abidi, SSR Abidi", "year": 2021, "citation_id": "fzr2PUYAAAAJ:jU7OWUQzBzMC", "result_id": "fzr2PUYAAAAJ:jU7OWUQzBzMC", "source": "scholar", "publication_info": {"summary": "2021 IEEE 9th International Conference on Healthcare Informatics (ICHI), 13-22, 2021"}, "publication": "2021 IEEE 9th International Conference on Healthcare Informatics (ICHI), 13-22, 2021", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:jU7OWUQzBzMC"}, {"title": "Decision support for comorbid conditions via execution-time integration of clinical guidelines using transaction-based semantics and temporal planning", "authors": "W Van Woensel, SSR Abidi, SR Abidi", "year": 2021, "citation_id": "fzr2PUYAAAAJ:7wO8s98CvbsC", "result_id": "fzr2PUYAAAAJ:7wO8s98CvbsC", "source": "scholar", "publication_info": {"summary": "Artificial Intelligence in Medicine 118, 102127, 2021"}, "publication": "Artificial Intelligence in Medicine 118, 102127, 2021", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:7wO8s98CvbsC"}, {"title": "Semantic Web Framework to Computerize Staged Reflex Testing Protocols to Mitigate Underutilization of Pathology Tests for Diagnosing Pituitary Disorders", "authors": "W Van Woensel, M Elnenaei, SA Imran, SSR Abidi", "year": 2021, "citation_id": "fzr2PUYAAAAJ:kw52XkFRtyQC", "result_id": "fzr2PUYAAAAJ:kw52XkFRtyQC", "source": "scholar", "publication_info": {"summary": "International Conference on Artificial Intelligence in Medicine, 124-134, 2021"}, "publication": "International Conference on Artificial Intelligence in Medicine, 124-134, 2021", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:kw52XkFRtyQC"}, {"title": "Using Interactive Visual Analytics to Optimize in Real-Time Blood Products Inventory at a Blood Bank.", "authors": "J Rad, JG Quinn, C Cheng, R Liwski, SR Abidi, SSR Abidi", "year": 2021, "citation_id": "fzr2PUYAAAAJ:1taIhTC69MYC", "result_id": "fzr2PUYAAAAJ:1taIhTC69MYC", "source": "scholar", "publication_info": {"summary": "MIE, 223-227, 2021"}, "publication": "MIE, 223-227, 2021", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:1taIhTC69MYC"}, {"title": "A Knowledge Graph of Mechanistic Associations Between COVID-19, Diabetes Mellitus and Kidney Diseases.", "authors": "M Barrett, A Daowd, SSR Abidi, S Abidi", "year": 2021, "citation_id": "fzr2PUYAAAAJ:IaI1MmNe2tcC", "result_id": "fzr2PUYAAAAJ:IaI1MmNe2tcC", "source": "scholar", "publication_info": {"summary": "MIE, 392-396, 2021"}, "publication": "MIE, 392-396, 2021", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:IaI1MmNe2tcC"}, {"title": "Using knowledge graphs to plausibly infer missing associations in EMR data", "authors": "W Van Woensel, C Armstrong, M Rajaratnam, V Gupta, SSR Abidi", "year": 2021, "citation_id": "fzr2PUYAAAAJ:7BrZ7Jt4UNcC", "result_id": "fzr2PUYAAAAJ:7BrZ7Jt4UNcC", "source": "scholar", "publication_info": {"summary": "Public Health and Informatics: Proceedings of MIE 2021, 417-421, 2021"}, "publication": "Public Health and Informatics: Proceedings of MIE 2021, 417-421, 2021", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:7BrZ7Jt4UNcC"}, {"title": "Analyzing Association Rules for Graft Failure Following Deceased and Live Donor Kidney Transplantation", "authors": "SAA Naqvi, K Tennankore, A Vinson, SSR Abidi", "year": 2021, "citation_id": "fzr2PUYAAAAJ:nRpfm8aw39MC", "result_id": "fzr2PUYAAAAJ:nRpfm8aw39MC", "source": "scholar", "publication_info": {"summary": "Public Health and Informatics: Proceedings of MIE 2021, 188-192, 2021"}, "publication": "Public Health and Informatics: Proceedings of MIE 2021, 188-192, 2021", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:nRpfm8aw39MC"}, {"title": "Ontology-based personalized cognitive behavioural plans for patients with mild depression", "authors": "A Nair, SSR Abidi, W Van Woensel, S Abidi", "year": 2021, "citation_id": "fzr2PUYAAAAJ:FiytvqdAVhgC", "result_id": "fzr2PUYAAAAJ:FiytvqdAVhgC", "source": "scholar", "publication_info": {"summary": "Public Health and Informatics, 729-733, 2021"}, "publication": "Public Health and Informatics, 729-733, 2021", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:FiytvqdAVhgC"}, {"title": "Building a knowledge graph representing causal associations between risk factors and incidence of breast cancer", "authors": "A Daowd, M Barrett, S Abidi, SSR Abidi", "year": 2021, "citation_id": "fzr2PUYAAAAJ:j7_hQOaDUrUC", "result_id": "fzr2PUYAAAAJ:j7_hQOaDUrUC", "source": "scholar", "publication_info": {"summary": "Public Health and Informatics, 724-728, 2021"}, "publication": "Public Health and Informatics, 724-728, 2021", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:j7_hQOaDUrUC"}, {"title": "Artificial Intelligence in Medicine: 18th International Conference on Artificial Intelligence in Medicine, AIME 2020, Minneapolis, MN, USA, August 25\u201328, 2020, Proceedings", "authors": "M Michalowski, R Moskovitch", "year": 2020, "citation_id": "fzr2PUYAAAAJ:-7ulzOJl1JYC", "result_id": "fzr2PUYAAAAJ:-7ulzOJl1JYC", "source": "scholar", "publication_info": {"summary": "Springer Nature, 2020"}, "publication": "Springer Nature, 2020", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:-7ulzOJl1JYC"}, {"title": "An AI-driven predictive modelling framework to analyze and visualize blood product transactional data for reducing blood products\u2019 Discards", "authors": "J Rad, C Cheng, JG Quinn, S Abidi, R Liwski, SSR Abidi", "year": 2020, "citation_id": "fzr2PUYAAAAJ:43bX7VzcjpAC", "result_id": "fzr2PUYAAAAJ:43bX7VzcjpAC", "source": "scholar", "publication_info": {"summary": "International Conference on Artificial Intelligence in Medicine, 192-202, 2020"}, "publication": "International Conference on Artificial Intelligence in Medicine, 192-202, 2020", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:43bX7VzcjpAC"}, {"title": "A CIG integration framework to provide decision support for comorbid conditions using transaction-based semantics and temporal planning", "authors": "W Van Woensel, S Abidi, B Jafarpour, SSR Abidi", "year": 2020, "citation_id": "fzr2PUYAAAAJ:zCSUwVk65WsC", "result_id": "fzr2PUYAAAAJ:zCSUwVk65WsC", "source": "scholar", "publication_info": {"summary": "International Conference on Artificial Intelligence in Medicine, 440-450, 2020"}, "publication": "International Conference on Artificial Intelligence in Medicine, 440-450, 2020", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:zCSUwVk65WsC"}, {"title": "Indoor location identification of patients for directing virtual care: An AI approach using machine learning and knowledge-based methods", "authors": "W Van Woensel, PC Roy, SSR Abidi, SR Abidi", "year": 2020, "citation_id": "fzr2PUYAAAAJ:jgBuDB5drN8C", "result_id": "fzr2PUYAAAAJ:jgBuDB5drN8C", "source": "scholar", "publication_info": {"summary": "Artificial intelligence in medicine 108, 101931, 2020"}, "publication": "Artificial intelligence in medicine 108, 101931, 2020", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:jgBuDB5drN8C"}, {"title": "CLINICAL AND BIOMECHANICAL CLUSTER CLASSIFICATION BEFORE TOTAL KNEE ARTHROPLASTY IMPACTS FUNCTIONAL OUTCOME", "authors": "K Young, JA Wilson, MJ Dunbar, P Roy, SSR Abidi", "year": 2020, "citation_id": "fzr2PUYAAAAJ:ubry08Y2EpUC", "result_id": "fzr2PUYAAAAJ:ubry08Y2EpUC", "source": "scholar", "publication_info": {"summary": "Orthopaedic Proceedings 102 (SUPP_6), 14-14, 2020"}, "publication": "Orthopaedic Proceedings 102 (SUPP_6), 14-14, 2020", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:ubry08Y2EpUC"}, {"title": "Characterization of Total Knee Arthroplasty Patient: Clinical and Biomechanical Variability by Cluster Analysis", "authors": "K Young-Shand, P Roy, SSR Abidi, M Dunbar, JA Wilson", "year": 2020, "citation_id": "fzr2PUYAAAAJ:48xauSegjOkC", "result_id": "fzr2PUYAAAAJ:48xauSegjOkC", "source": "scholar", "publication_info": {"summary": "Orthopaedic Proceedings 102 (SUPP_1), 141-141, 2020"}, "publication": "Orthopaedic Proceedings 102 (SUPP_1), 141-141, 2020", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:48xauSegjOkC"}, {"title": "Factors enabling and hindering an eLearning programme for nurses and midwives in Afghanistan", "authors": "A Naseem, KQ Ali, ADS Juma, A Sajwani, BA Khan, S Sayani, SSR Abidi", "year": 2020, "citation_id": "fzr2PUYAAAAJ:v1_lew4L6wgC", "result_id": "fzr2PUYAAAAJ:v1_lew4L6wgC", "source": "scholar", "publication_info": {"summary": "University of Johannesburg, 2020"}, "publication": "University of Johannesburg, 2020", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:v1_lew4L6wgC"}, {"title": "Exploiting machine learning algorithms and methods for the prediction of agitated delirium after cardiac surgery: models development and validation study", "authors": "HN Mufti, GM Hirsch, SR Abidi, SSR Abidi", "year": 2019, "citation_id": "fzr2PUYAAAAJ:jL-93Qbq4QoC", "result_id": "fzr2PUYAAAAJ:jL-93Qbq4QoC", "source": "scholar", "publication_info": {"summary": "JMIR medical informatics 7 (4), e14993, 2019"}, "publication": "JMIR medical informatics 7 (4), e14993, 2019", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:jL-93Qbq4QoC"}, {"title": "PREOPERATIVE BIOMECHANICAL PATIENT STRATIFICATION BY MACHINE LEARNING-BASED CLUSTER ANALYSIS AND FUNCTIONAL OUTCOMES AFTER TOTAL KNEE ARTHROPLASTY", "authors": "KL Young-Shand, PC Roy, MJ Dunbar, SSR Abidi, JL Astephen-Wilson", "year": 2019, "citation_id": "fzr2PUYAAAAJ:0CzhzZyukY4C", "result_id": "fzr2PUYAAAAJ:0CzhzZyukY4C", "source": "scholar", "publication_info": {"summary": "Orthopaedic Proceedings 101 (SUPP_11), 46-46, 2019"}, "publication": "Orthopaedic Proceedings 101 (SUPP_11), 46-46, 2019", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:0CzhzZyukY4C"}, {"title": "Using an Artificial Intelligence-Based Argument Theory to Generate Automated Patient Education Dialogues for Families of Children with Juvenile Idiopathic Arthritis.", "authors": "B Rose-Davis, W Van Woensel, E Stringer, S Abidi, SSR Abidi", "year": 2019, "citation_id": "fzr2PUYAAAAJ:4X0JR2_MtJMC", "result_id": "fzr2PUYAAAAJ:4X0JR2_MtJMC", "source": "scholar", "publication_info": {"summary": "MedInfo, 1337-1341, 2019"}, "publication": "MedInfo, 1337-1341, 2019", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:4X0JR2_MtJMC"}, {"title": "A Digital Health Platform to Deliver Tailored Early Stimulation Programs for Children with Developmental Delays.", "authors": "R da Luz Dias, MR de Oliveira Lima, JGB Alves, W Van Woensel, A Naqvi, ...", "year": 2019, "citation_id": "fzr2PUYAAAAJ:sJsF-0ZLhtgC", "result_id": "fzr2PUYAAAAJ:sJsF-0ZLhtgC", "source": "scholar", "publication_info": {"summary": "MedInfo, 571-575, 2019"}, "publication": "MedInfo, 571-575, 2019", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:sJsF-0ZLhtgC"}, {"title": "Towards Personalized Lifetime Health: A Platform for Early Multimorbid Chronic Disease Risk Assessment and Mitigation.", "authors": "A Daowd, S Faizan, S Abidi, A Abusharekh, A Shehzad, SSR Abidi", "year": 2019, "citation_id": "fzr2PUYAAAAJ:2tRrZ1ZAMYUC", "result_id": "fzr2PUYAAAAJ:2tRrZ1ZAMYUC", "source": "scholar", "publication_info": {"summary": "MedInfo, 935-939, 2019"}, "publication": "MedInfo, 935-939, 2019", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:2tRrZ1ZAMYUC"}, {"title": "Benchmarking semantic reasoning on mobile platforms: Towards optimization using OWL2 RL.", "authors": "T Lukasiewicz, W Van Woensel, SSR Abidi", "year": 2019, "citation_id": "fzr2PUYAAAAJ:DkZNVXde3BIC", "result_id": "fzr2PUYAAAAJ:DkZNVXde3BIC", "source": "scholar", "publication_info": {"summary": "Semantic Web (1570-0844) 10 (4), 2019"}, "publication": "Semantic Web (1570-0844) 10 (4), 2019", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:DkZNVXde3BIC"}, {"title": "Intelligent health data analytics: A convergence of artificial intelligence and big data", "authors": "SSR Abidi, SR Abidi", "year": 2019, "citation_id": "fzr2PUYAAAAJ:fbc8zXXH2BUC", "result_id": "fzr2PUYAAAAJ:fbc8zXXH2BUC", "source": "scholar", "publication_info": {"summary": "Healthcare management forum 32 (4), 178-182, 2019"}, "publication": "Healthcare management forum 32 (4), 178-182, 2019", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:fbc8zXXH2BUC"}, {"title": "AI-Driven Pathology Laboratory Utilization Management via Data-and Knowledge-Based Analytics", "authors": "SSR Abidi, J Rad, A Abusharekh, PC Roy, W Van Woensel, SR Abidi, ...", "year": 2019, "citation_id": "fzr2PUYAAAAJ:nVrZBo8bIpAC", "result_id": "fzr2PUYAAAAJ:nVrZBo8bIpAC", "source": "scholar", "publication_info": {"summary": "Conference on Artificial Intelligence in Medicine in Europe, 241-251, 2019"}, "publication": "Conference on Artificial Intelligence in Medicine in Europe, 241-251, 2019", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:nVrZBo8bIpAC"}, {"title": "Mobile indoor localization with bluetooth beacons in a pediatric emergency department using clustering, rule-based classification and high-level heuristics", "authors": "PC Roy, W Van Woensel, A Wilcox, SSR Abidi", "year": 2019, "citation_id": "fzr2PUYAAAAJ:lvd772isFD0C", "result_id": "fzr2PUYAAAAJ:lvd772isFD0C", "source": "scholar", "publication_info": {"summary": "Conference on Artificial Intelligence in Medicine in Europe, 216-226, 2019"}, "publication": "Conference on Artificial Intelligence in Medicine in Europe, 216-226, 2019", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:lvd772isFD0C"}, {"title": "Benchmarking semantic reasoning on mobile platforms: Towards optimization using OWL2 RL", "authors": "W Van Woensel, SSR Abidi", "year": 2019, "citation_id": "fzr2PUYAAAAJ:8xutWZnSdmoC", "result_id": "fzr2PUYAAAAJ:8xutWZnSdmoC", "source": "scholar", "publication_info": {"summary": "Semantic Web 10 (4), 637-663, 2019"}, "publication": "Semantic Web 10 (4), 637-663, 2019", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:8xutWZnSdmoC"}, {"title": "Execution-time integration of clinical practice guidelines to provide decision support for comorbid conditions", "authors": "B Jafarpour, SR Abidi, W Van Woensel, SSR Abidi", "year": 2019, "citation_id": "fzr2PUYAAAAJ:_OXeSy2IsFwC", "result_id": "fzr2PUYAAAAJ:_OXeSy2IsFwC", "source": "scholar", "publication_info": {"summary": "Artificial intelligence in medicine 94, 117-137, 2019"}, "publication": "Artificial intelligence in medicine 94, 117-137, 2019", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:_OXeSy2IsFwC"}, {"title": "Optimizing and benchmarking OWL2 RL for semantic reasoning on mobile platforms", "authors": "W Van Woensel, S Abibi", "year": 2019, "citation_id": "fzr2PUYAAAAJ:MAUkC_7iAq8C", "result_id": "fzr2PUYAAAAJ:MAUkC_7iAq8C", "source": "scholar", "publication_info": {"summary": "Semant. Web 10, 637-663, 2019"}, "publication": "Semant. Web 10, 637-663, 2019", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:MAUkC_7iAq8C"}, {"title": "Proactively Guiding Patients Through ADL via Knowledge-Based and Context-Driven Activity Recognition", "authors": "W Van Woensel, S Abidi, SSR Abidi", "year": 2019, "citation_id": "fzr2PUYAAAAJ:6yz0xqPARnAC", "result_id": "fzr2PUYAAAAJ:6yz0xqPARnAC", "source": "scholar", "publication_info": {"summary": "MEDINFO 2019: Health and Wellbeing e-Networks for All, 863-867, 2019"}, "publication": "MEDINFO 2019: Health and Wellbeing e-Networks for All, 863-867, 2019", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:6yz0xqPARnAC"}, {"title": "Providing comorbid decision support via the integration of clinical practice guidelines at execution-time by leveraging medical linked open datasets", "authors": "W Van Woensel, S Abidi, B Jafarpour, SSR Abidi", "year": 2019, "citation_id": "fzr2PUYAAAAJ:AHdEip9mkN0C", "result_id": "fzr2PUYAAAAJ:AHdEip9mkN0C", "source": "scholar", "publication_info": {"summary": "MEDINFO 2019: Health and Wellbeing e-Networks for All, 858-862, 2019"}, "publication": "MEDINFO 2019: Health and Wellbeing e-Networks for All, 858-862, 2019", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:AHdEip9mkN0C"}, {"title": "A data mining framework for glaucoma decision support based on optic nerve image analysis using machine learning methods", "authors": "SSR Abidi, PC Roy, MS Shah, J Yu, S Yan", "year": 2018, "citation_id": "fzr2PUYAAAAJ:F9fV5C73w3QC", "result_id": "fzr2PUYAAAAJ:F9fV5C73w3QC", "source": "scholar", "publication_info": {"summary": "Journal of Healthcare Informatics Research 2 (4), 370-401, 2018"}, "publication": "Journal of Healthcare Informatics Research 2 (4), 370-401, 2018", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:F9fV5C73w3QC"}, {"title": "Optimizing primary care management of atrial fibrillation: The rationale and methods of the Integrated Management Program Advancing Community Treatment of Atrial Fibrillation \u2026", "authors": "JL Cox, R Parkash, SSR Abidi, L Thabane, F Xie, J Mackillop, SR Abidi, ...", "year": 2018, "citation_id": "fzr2PUYAAAAJ:yMeIxYmEMEAC", "result_id": "fzr2PUYAAAAJ:yMeIxYmEMEAC", "source": "scholar", "publication_info": {"summary": "American heart journal 201, 149-157, 2018"}, "publication": "American heart journal 201, 149-157, 2018", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:yMeIxYmEMEAC"}, {"title": "Investigating plausible reasoning over knowledge graphs for semantics-based health data analytics", "authors": "H Mohammadhassanzadeh, SR Abidi, W Van Woensel, SSR Abidi", "year": 2018, "citation_id": "fzr2PUYAAAAJ:GFxP56DSvIMC", "result_id": "fzr2PUYAAAAJ:GFxP56DSvIMC", "source": "scholar", "publication_info": {"summary": "2018 IEEE 27th International Conference on Enabling Technologies \u2026, 2018"}, "publication": "2018 IEEE 27th International Conference on Enabling Technologies \u2026, 2018", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:GFxP56DSvIMC"}, {"title": "Optimizing semantic reasoning on memory-constrained platforms using the RETE algorithm", "authors": "W Van Woensel, SSR Abidi", "year": 2018, "citation_id": "fzr2PUYAAAAJ:3htObqc8RwsC", "result_id": "fzr2PUYAAAAJ:3htObqc8RwsC", "source": "scholar", "publication_info": {"summary": "European Semantic Web Conference, 682-696, 2018"}, "publication": "European Semantic Web Conference, 682-696, 2018", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:3htObqc8RwsC"}, {"title": "Diabetes-related behavior change knowledge transfer to primary care practitioners and patients: implementation and evaluation of a digital health platform", "authors": "S Abidi, M Vallis, H Piccinini-Vallis, SA Imran, SSR Abidi", "year": 2018, "citation_id": "fzr2PUYAAAAJ:r_AWSJRzSzQC", "result_id": "fzr2PUYAAAAJ:r_AWSJRzSzQC", "source": "scholar", "publication_info": {"summary": "JMIR medical informatics 6 (2), e9629, 2018"}, "publication": "JMIR medical informatics 6 (2), e9629, 2018", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:r_AWSJRzSzQC"}, {"title": "Personalized Preoperative Education System to Assist Patients Undergoing TAVI Surgery: A Digital Health Solution", "authors": "AN Mojadam, N Nadeem, H Beydoun, SR Abidi, A Rizvi", "year": 2018, "citation_id": "fzr2PUYAAAAJ:vDZJ-YLwNdEC", "result_id": "fzr2PUYAAAAJ:vDZJ-YLwNdEC", "source": "scholar", "publication_info": {"summary": "J Health Med Informat 9 (313), 2, 2018"}, "publication": "J Health Med Informat 9 (313), 2, 2018", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:vDZJ-YLwNdEC"}, {"title": "A personalized risk stratification platform for population lifetime healthcare", "authors": "A Daowd, SR Abidi, A Abusharekh, SSR Abidi", "year": 2018, "citation_id": "fzr2PUYAAAAJ:a3BOlSfXSfwC", "result_id": "fzr2PUYAAAAJ:a3BOlSfXSfwC", "source": "scholar", "publication_info": {"summary": "Building Continents of Knowledge in Oceans of Data: The Future of Co-Created \u2026, 2018"}, "publication": "Building Continents of Knowledge in Oceans of Data: The Future of Co-Created \u2026, 2018", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:a3BOlSfXSfwC"}, {"title": "Interactive Dialogue-Based Patient Education for Juvenile Idiopathic Arthritis Using Argument Theory", "authors": "B Rose-Davis, E Stringer, S Abidi, SSR Abidi", "year": 2018, "citation_id": "fzr2PUYAAAAJ:LhH-TYMQEocC", "result_id": "fzr2PUYAAAAJ:LhH-TYMQEocC", "source": "scholar", "publication_info": {"summary": "Building Continents of Knowledge in Oceans of Data: The Future of Co-Created \u2026, 2018"}, "publication": "Building Continents of Knowledge in Oceans of Data: The Future of Co-Created \u2026, 2018", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:LhH-TYMQEocC"}, {"title": "A Mobile Early Stimulation Program to Support Children with Developmental Delays in Brazil", "authors": "RL Dias, KCCG Silva, MRO Lima, JGB Alves, SSR Abidi", "year": 2018, "citation_id": "fzr2PUYAAAAJ:yqoGN6RLRZoC", "result_id": "fzr2PUYAAAAJ:yqoGN6RLRZoC", "source": "scholar", "publication_info": {"summary": "Building Continents of Knowledge in Oceans of Data: The Future of Co-Created \u2026, 2018"}, "publication": "Building Continents of Knowledge in Oceans of Data: The Future of Co-Created \u2026, 2018", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:yqoGN6RLRZoC"}, {"title": "SeDAn: a Plausible Reasoning Approach for Semantics-based Data Analytics in Healthcare.", "authors": "H Mohammadhassanzadeh, SR Abidi, MS Shah, M Karamollahi, ...", "year": 2017, "citation_id": "fzr2PUYAAAAJ:mNrWkgRL2YcC", "result_id": "fzr2PUYAAAAJ:mNrWkgRL2YcC", "source": "scholar", "publication_info": {"summary": "WAIAH@ AI* IA, 50-59, 2017"}, "publication": "WAIAH@ AI* IA, 50-59, 2017", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:mNrWkgRL2YcC"}, {"title": "Possibilistic activity recognition with uncertain observations to support medication adherence in an assisted ambient living setting", "authors": "PC Roy, SR Abidi, SSR Abidi", "year": 2017, "citation_id": "fzr2PUYAAAAJ:8d8msizDQcsC", "result_id": "fzr2PUYAAAAJ:8d8msizDQcsC", "source": "scholar", "publication_info": {"summary": "Knowledge-Based Systems 133, 156-173, 2017"}, "publication": "Knowledge-Based Systems 133, 156-173, 2017", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:8d8msizDQcsC"}, {"title": "Protocol-driven decision support within e-referral systems to streamline patient consultation, triaging and referrals from primary care to specialist clinics", "authors": "E Maghsoud-Lou, S Christie, SR Abidi, SSR Abidi", "year": 2017, "citation_id": "fzr2PUYAAAAJ:anf4URPfarAC", "result_id": "fzr2PUYAAAAJ:anf4URPfarAC", "source": "scholar", "publication_info": {"summary": "Journal of Medical Systems 41 (9), 139, 2017"}, "publication": "Journal of Medical Systems 41 (9), 139, 2017", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:anf4URPfarAC"}, {"title": "Monitoring medication adherence in smart environments in the context of patient self-management a knowledge-driven approach", "authors": "PC Roy, SR Abidi, SSR Abidi", "year": 2017, "citation_id": "fzr2PUYAAAAJ:PaBasH6fAo0C", "result_id": "fzr2PUYAAAAJ:PaBasH6fAo0C", "source": "scholar", "publication_info": {"summary": "Smart Technologies in Healthcare, 195-223, 2017"}, "publication": "Smart Technologies in Healthcare, 195-223, 2017", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:PaBasH6fAo0C"}, {"title": "Leveraging medical taxonomies to improve knowledge management within online communities of practice: The knowledge maps system", "authors": "SA Stewart, SSR Abidi", "year": 2017, "citation_id": "fzr2PUYAAAAJ:q3CdL3IzO_QC", "result_id": "fzr2PUYAAAAJ:q3CdL3IzO_QC", "source": "scholar", "publication_info": {"summary": "Computer Methods and Programs in Biomedicine 143, 121-127, 2017"}, "publication": "Computer Methods and Programs in Biomedicine 143, 121-127, 2017", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:q3CdL3IzO_QC"}, {"title": "Semantics-based plausible reasoning to extend the knowledge coverage of medical knowledge bases for improved clinical decision support", "authors": "H Mohammadhassanzadeh, W Van Woensel, SR Abidi, SSR Abidi", "year": 2017, "citation_id": "fzr2PUYAAAAJ:xtoqd-5pKcoC", "result_id": "fzr2PUYAAAAJ:xtoqd-5pKcoC", "source": "scholar", "publication_info": {"summary": "BioData mining 10 (1), 7, 2017"}, "publication": "BioData mining 10 (1), 7, 2017", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:xtoqd-5pKcoC"}, {"title": "Achieving Pro-Active Guidance of Patients through ADL via Knowledge-Driven Activity Recognition and Complex Semantic Workflows", "authors": "W Van Woensel, PC Roy, SSR Abidi", "year": 2017, "citation_id": "fzr2PUYAAAAJ:DJbcl8HfkQkC", "result_id": "fzr2PUYAAAAJ:DJbcl8HfkQkC", "source": "scholar", "publication_info": {"summary": "Proc. 10th Int. Conf. Semant. Web Appl. Tools Heal. Care Life Sci 2042, 2017"}, "publication": "Proc. 10th Int. Conf. Semant. Web Appl. Tools Heal. Care Life Sci 2042, 2017", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&cstart=100&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:DJbcl8HfkQkC"}, {"title": "A Semantic Web Framework for Behavioral User Modeling and Action Planning for Personalized Behavior Modification.", "authors": "W Van Woensel, W Baig, SSR Abidi, S Abidi", "year": 2017, "citation_id": "fzr2PUYAAAAJ:cWzG1nlazyYC", "result_id": "fzr2PUYAAAAJ:cWzG1nlazyYC", "source": "scholar", "publication_info": {"summary": "SWAT4LS, 2017"}, "publication": "SWAT4LS, 2017", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&cstart=100&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:cWzG1nlazyYC"}, {"title": "Discovering central practitioners in a medical discussion forum using semantic web analytics", "authors": "E Rajabi, SSR Abidi", "year": 2017, "citation_id": "fzr2PUYAAAAJ:5qfkUJPXOUwC", "result_id": "fzr2PUYAAAAJ:5qfkUJPXOUwC", "source": "scholar", "publication_info": {"summary": "Informatics for Health: Connected Citizen-Led Wellness and Population Health \u2026, 2017"}, "publication": "Informatics for Health: Connected Citizen-Led Wellness and Population Health \u2026, 2017", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&cstart=100&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:5qfkUJPXOUwC"}, {"title": "Monitoring activities related to medication adherence in ambient assisted living environments", "authors": "PC Roy, SR Abidi, SSR Abidi", "year": 2017, "citation_id": "fzr2PUYAAAAJ:hCrLmN-GePgC", "result_id": "fzr2PUYAAAAJ:hCrLmN-GePgC", "source": "scholar", "publication_info": {"summary": "Informatics for Health: Connected Citizen-Led Wellness and Population Health \u2026, 2017"}, "publication": "Informatics for Health: Connected Citizen-Led Wellness and Population Health \u2026, 2017", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&cstart=100&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:hCrLmN-GePgC"}, {"title": "A digital framework to support providers and patients in diabetes related behavior modification", "authors": "S Abidi, M Vallis, H Piccinini-Vallis, SA Imran, SSR Abidi", "year": 2017, "citation_id": "fzr2PUYAAAAJ:FPJr55Dyh1AC", "result_id": "fzr2PUYAAAAJ:FPJr55Dyh1AC", "source": "scholar", "publication_info": {"summary": "Informatics for Health: Connected Citizen-Led Wellness and Population Health \u2026, 2017"}, "publication": "Informatics for Health: Connected Citizen-Led Wellness and Population Health \u2026, 2017", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&cstart=100&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:FPJr55Dyh1AC"}, {"title": "SmartRL: a context-sensitive, ontology-based rule language for assisted living in smart environments", "authors": "W Van Woensel, PC Roy, SSR Abidi", "year": 2016, "citation_id": "fzr2PUYAAAAJ:LI9QrySNdTsC", "result_id": "fzr2PUYAAAAJ:LI9QrySNdTsC", "source": "scholar", "publication_info": {"summary": "International Symposium on Rules and Rule Markup Languages for the Semantic \u2026, 2016"}, "publication": "International Symposium on Rules and Rule Markup Languages for the Semantic \u2026, 2016", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&cstart=100&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:LI9QrySNdTsC"}, {"title": "A semantic web-based approach to plausible reasoning for improving clinical knowledge engineering", "authors": "H Mohammadhassanzadeh, W Van Woensel, SR Abidi, SSR Abidi", "year": 2016, "citation_id": "fzr2PUYAAAAJ:MLfJN-KU85MC", "result_id": "fzr2PUYAAAAJ:MLfJN-KU85MC", "source": "scholar", "publication_info": {"summary": "2016 IEEE-EMBS International Conference on Biomedical and Health Informatics \u2026, 2016"}, "publication": "2016 IEEE-EMBS International Conference on Biomedical and Health Informatics \u2026, 2016", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&cstart=100&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:MLfJN-KU85MC"}, {"title": "A digital health system to assist family physicians to safely prescribe NOAC medications", "authors": "SR Abidi, J Cox, A Abusharekh, N Hashemian, SSR Abidi", "year": 2016, "citation_id": "fzr2PUYAAAAJ:kz9GbA2Ns4gC", "result_id": "fzr2PUYAAAAJ:kz9GbA2Ns4gC", "source": "scholar", "publication_info": {"summary": "Exploring Complexity in Health: An Interdisciplinary Systems Approach, 519-523, 2016"}, "publication": "Exploring Complexity in Health: An Interdisciplinary Systems Approach, 519-523, 2016", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&cstart=100&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:kz9GbA2Ns4gC"}, {"title": "An Ontological Model of Behaviour Theory to Generate Personalized Action Plans to Modify Behaviours.", "authors": "W Baig, SR Abidi, SSR Abidi", "year": 2016, "citation_id": "fzr2PUYAAAAJ:k8Z6L05lTy4C", "result_id": "fzr2PUYAAAAJ:k8Z6L05lTy4C", "source": "scholar", "publication_info": {"summary": "MIE, 399-403, 2016"}, "publication": "MIE, 399-403, 2016", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&cstart=100&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:k8Z6L05lTy4C"}, {"title": "Transcription of Case Report Forms from Unstructured Referral Letters: A Semantic Text Analytics Approach.", "authors": "SSR Abidi, AK Singh, S Christie", "year": 2016, "citation_id": "fzr2PUYAAAAJ:VaXvl8Fpj5cC", "result_id": "fzr2PUYAAAAJ:VaXvl8Fpj5cC", "source": "scholar", "publication_info": {"summary": "MIE, 322-326, 2016"}, "publication": "MIE, 322-326, 2016", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&cstart=100&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:VaXvl8Fpj5cC"}, {"title": "Multi-Strategy Semantic Web Reasoning for Medical Knowledge Bases.", "authors": "W Van Woensel, H Mohammadhassanzadeh, SR Abidi, SSR Abidi", "year": 2015, "citation_id": "fzr2PUYAAAAJ:tYavs44e6CUC", "result_id": "fzr2PUYAAAAJ:tYavs44e6CUC", "source": "scholar", "publication_info": {"summary": "BDM2I@ ISWC, 2015"}, "publication": "BDM2I@ ISWC, 2015", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&cstart=100&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:tYavs44e6CUC"}, {"title": "INITIATE: An Intelligent Adaptive Alert Environment.", "authors": "B Jafarpour, SR Abidi, AM Ahmad, SSR Abidi", "year": 2015, "citation_id": "fzr2PUYAAAAJ:BUYA1_V_uYcC", "result_id": "fzr2PUYAAAAJ:BUYA1_V_uYcC", "source": "scholar", "publication_info": {"summary": "MedInfo, 285-289, 2015"}, "publication": "MedInfo, 285-289, 2015", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&cstart=100&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:BUYA1_V_uYcC"}, {"title": "A Mobile and Intelligent Patient Diary for Chronic Disease Self-Management.", "authors": "W Van Woensel, PC Roy, SR Abidi, SSR Abidi", "year": 2015, "citation_id": "fzr2PUYAAAAJ:URolC5Kub84C", "result_id": "fzr2PUYAAAAJ:URolC5Kub84C", "source": "scholar", "publication_info": {"summary": "MedInfo, 118-122, 2015"}, "publication": "MedInfo, 118-122, 2015", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&cstart=100&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:URolC5Kub84C"}, {"title": "H-DRIVE: A big health data analytics platform for evidence-informed decision making", "authors": "A Abusharekh, SA Stewart, N Hashemian, SSR Abidi", "year": 2015, "citation_id": "fzr2PUYAAAAJ:ML0RJ9NH7IQC", "result_id": "fzr2PUYAAAAJ:ML0RJ9NH7IQC", "source": "scholar", "publication_info": {"summary": "2015 IEEE International Congress on Big Data, 416-423, 2015"}, "publication": "2015 IEEE International Congress on Big Data, 416-423, 2015", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&cstart=100&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:ML0RJ9NH7IQC"}, {"title": "Towards a'Big'Health Data Analytics Platform", "authors": "S Cha, A Abusharekh, SSR Abidi", "year": 2015, "citation_id": "fzr2PUYAAAAJ:Z5m8FVwuT1cC", "result_id": "fzr2PUYAAAAJ:Z5m8FVwuT1cC", "source": "scholar", "publication_info": {"summary": "2015 IEEE First International Conference on Big Data Computing Service and \u2026, 2015"}, "publication": "2015 IEEE First International Conference on Big Data Computing Service and \u2026, 2015", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&cstart=100&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:Z5m8FVwuT1cC"}, {"title": "Exploiting semantic web technologies to develop OWL-based clinical practice guideline execution engines", "authors": "B Jafarpour, SR Abidi, SSR Abidi", "year": 2014, "citation_id": "fzr2PUYAAAAJ:9Nmd_mFXekcC", "result_id": "fzr2PUYAAAAJ:9Nmd_mFXekcC", "source": "scholar", "publication_info": {"summary": "IEEE journal of biomedical and health informatics 20 (1), 388-398, 2014"}, "publication": "IEEE journal of biomedical and health informatics 20 (1), 388-398, 2014", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&cstart=100&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:9Nmd_mFXekcC"}, {"title": "A predictive model for personalized therapeutic interventions in non-small cell lung cancer", "authors": "N Kureshi, SSR Abidi, C Blouin", "year": 2014, "citation_id": "fzr2PUYAAAAJ:fQNAKQ3IYiAC", "result_id": "fzr2PUYAAAAJ:fQNAKQ3IYiAC", "source": "scholar", "publication_info": {"summary": "IEEE journal of biomedical and health informatics 20 (1), 424-431, 2014"}, "publication": "IEEE journal of biomedical and health informatics 20 (1), 424-431, 2014", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&cstart=100&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:fQNAKQ3IYiAC"}, {"title": "An E-health Based Integrated Management Program Advancing Community Treatment Of Atrial Fibrillation (IMPACT-AF)", "authors": "SSR Abidi, J Cox, S Abidi, A Abusharekh, J Nemis-white", "year": 2014, "citation_id": "fzr2PUYAAAAJ:BJbdYPG6LGMC", "result_id": "fzr2PUYAAAAJ:BJbdYPG6LGMC", "source": "scholar", "publication_info": {"summary": "Qatar Foundation Annual Research Conference Proceedings Volume 2014 Issue 1 \u2026, 2014"}, "publication": "Qatar Foundation Annual Research Conference Proceedings Volume 2014 Issue 1 \u2026, 2014", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&cstart=100&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:BJbdYPG6LGMC"}, {"title": "Using Social Computing For Knowledge Translation: Exploiting Social Network And Semantic Content Analyses To Facilitate Online Knowledge Translation Within An Online Social \u2026", "authors": "S Stewart, SSR Abidi", "year": 2014, "citation_id": "fzr2PUYAAAAJ:5MTHONV0fEkC", "result_id": "fzr2PUYAAAAJ:5MTHONV0fEkC", "source": "scholar", "publication_info": {"summary": "Qatar Foundation Annual Research Conference Proceedings Volume 2014 Issue 1 \u2026, 2014"}, "publication": "Qatar Foundation Annual Research Conference Proceedings Volume 2014 Issue 1 \u2026, 2014", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&cstart=100&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:5MTHONV0fEkC"}, {"title": "Integrating existing large scale medical laboratory data into the semantic web framework", "authors": "N Al Haider, S Abidi, W Van Woensel, SSR Abidi", "year": 2014, "citation_id": "fzr2PUYAAAAJ:2KloaMYe4IUC", "result_id": "fzr2PUYAAAAJ:2KloaMYe4IUC", "source": "scholar", "publication_info": {"summary": "2014 IEEE International Conference on Big Data (Big Data), 1040-1048, 2014"}, "publication": "2014 IEEE International Conference on Big Data (Big Data), 1040-1048, 2014", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&cstart=100&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:2KloaMYe4IUC"}, {"title": "A cross-platform benchmark framework for mobile semantic web reasoning engines", "authors": "W Van Woensel, N Al Haider, A Ahmad, SSR Abidi", "year": 2014, "citation_id": "fzr2PUYAAAAJ:tzM49s52ZIMC", "result_id": "fzr2PUYAAAAJ:tzM49s52ZIMC", "source": "scholar", "publication_info": {"summary": "International Semantic Web Conference, 389-408, 2014"}, "publication": "International Semantic Web Conference, 389-408, 2014", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&cstart=100&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:tzM49s52ZIMC"}, {"title": "A comparison of mobile rule engines for reasoning on semantic web based health data", "authors": "W Van Woensel, N Al Haider, PC Roy, AM Ahmad, SSR Abidi", "year": 2014, "citation_id": "fzr2PUYAAAAJ:fEOibwPWpKIC", "result_id": "fzr2PUYAAAAJ:fEOibwPWpKIC", "source": "scholar", "publication_info": {"summary": "2014 IEEE/WIC/ACM International Joint Conferences on Web Intelligence (WI \u2026, 2014"}, "publication": "2014 IEEE/WIC/ACM International Joint Conferences on Web Intelligence (WI \u2026, 2014", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&cstart=100&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:fEOibwPWpKIC"}, {"title": "Web service matchmaking using a hybrid of signature and specification matching methods", "authors": "SSR Abidi, A Daniyal, SF Mehdi", "year": 2014, "citation_id": "fzr2PUYAAAAJ:4fKUyHm3Qg0C", "result_id": "fzr2PUYAAAAJ:4fKUyHm3Qg0C", "source": "scholar", "publication_info": {"summary": "2014 IEEE/WIC/ACM International Joint Conferences on Web Intelligence (WI \u2026, 2014"}, "publication": "2014 IEEE/WIC/ACM International Joint Conferences on Web Intelligence (WI \u2026, 2014", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&cstart=100&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:4fKUyHm3Qg0C"}, {"title": "D-WISE: Diabetes Web-Centric Information and Support Environment: conceptual specification and proposed evaluation", "authors": "S Abidi, M Vallis, SSR Abidi, H Piccinini-Vallis, SA Imran", "year": 2014, "citation_id": "fzr2PUYAAAAJ:u9iWguZQMMsC", "result_id": "fzr2PUYAAAAJ:u9iWguZQMMsC", "source": "scholar", "publication_info": {"summary": "Canadian Journal of Diabetes 38 (3), 205-211, 2014"}, "publication": "Canadian Journal of Diabetes 38 (3), 205-211, 2014", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&cstart=100&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:u9iWguZQMMsC"}, {"title": "Providing psychosocial support to young cancer patients through an online virtual world", "authors": "S Mahajan, SSR Abidi, D Reilly", "year": 2014, "citation_id": "fzr2PUYAAAAJ:eflP2zaiRacC", "result_id": "fzr2PUYAAAAJ:eflP2zaiRacC", "source": "scholar", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&cstart=100&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:eflP2zaiRacC"}, {"title": "Higher incidence of thromboembolic events with the use of recombinant activated factor VII during placement of left ventricular assist device", "authors": "A Sultan, S Abidi, Y Hellman, A Hadi, IW Wang, A Malik", "year": 2014, "citation_id": "fzr2PUYAAAAJ:IsPWOBWtZBwC", "result_id": "fzr2PUYAAAAJ:IsPWOBWtZBwC", "source": "scholar", "publication_info": {"summary": "Journal of the American College of Cardiology 63 (12S), A864-A864, 2014"}, "publication": "Journal of the American College of Cardiology 63 (12S), A864-A864, 2014", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&cstart=100&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:IsPWOBWtZBwC"}, {"title": "A multi-phase correlation search framework for mining non-taxonomic relations from unstructured text", "authors": "MK Wong, SSR Abidi, ID Jonsen", "year": 2014, "citation_id": "fzr2PUYAAAAJ:9vf0nzSNQJEC", "result_id": "fzr2PUYAAAAJ:9vf0nzSNQJEC", "source": "scholar", "publication_info": {"summary": "Knowledge and information systems 38 (3), 641-667, 2014"}, "publication": "Knowledge and information systems 38 (3), 641-667, 2014", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&cstart=100&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:9vf0nzSNQJEC"}, {"title": "Shared decision making: using theories and technology to engage the patient in their health journey.", "authors": "A Russell, SR Abidi, SSR Abidi", "year": 2014, "citation_id": "fzr2PUYAAAAJ:1yQoGdGgb4wC", "result_id": "fzr2PUYAAAAJ:1yQoGdGgb4wC", "source": "scholar", "publication_info": {"summary": "MIE, 303-307, 2014"}, "publication": "MIE, 303-307, 2014", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&cstart=100&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:1yQoGdGgb4wC"}, {"title": "Towards guideline compliant clinical decision support system integration in smart and mobile environments: Formalizing and using clinical guidelines for diagnosing sleep apnea", "authors": "PC Roy, N Al Haider, W Van Woensel, AM Ahmad, SSR Abidi", "year": 2014, "citation_id": "fzr2PUYAAAAJ:dTyEYWd-f8wC", "result_id": "fzr2PUYAAAAJ:dTyEYWd-f8wC", "source": "scholar", "publication_info": {"summary": "28th AAAI conference on artificial intelligence, AAAI 2014, 38-43, 2014"}, "publication": "28th AAAI conference on artificial intelligence, AAAI 2014, 38-43, 2014", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&cstart=100&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:dTyEYWd-f8wC"}, {"title": "Clinical guideline-driven personalized self-management diary for paediatric cancer survivors.", "authors": "SA Stewart, SR Abidi, L Parker, M Bernstein, SSR Abidi", "year": 2014, "citation_id": "fzr2PUYAAAAJ:l7t_Zn2s7bgC", "result_id": "fzr2PUYAAAAJ:l7t_Zn2s7bgC", "source": "scholar", "publication_info": {"summary": "MIE, 18-22, 2014"}, "publication": "MIE, 18-22, 2014", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&cstart=100&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:l7t_Zn2s7bgC"}, {"title": "Canadian Spine Society abstracts: Thirteenth Annual Scientific Conference: Fairmont Tremblant, Mont-Tremblant, Quebec, Wednesday, Feb. 27 to Saturday, Mar. 2, 2013", "authors": "R El-Hawary, J Jarvis, S Alsayegh, A Raizah, A Harroud, Z Sardar, ...", "year": 2013, "citation_id": "fzr2PUYAAAAJ:wvYxNZNCP7wC", "result_id": "fzr2PUYAAAAJ:wvYxNZNCP7wC", "source": "scholar", "publication_info": {"summary": "Canadian Journal of Surgery 56 (4 Suppl 2), S54-S78, 2013"}, "publication": "Canadian Journal of Surgery 56 (4 Suppl 2), S54-S78, 2013", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&cstart=100&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:wvYxNZNCP7wC"}, {"title": "A Semantic Web Based Ontology Mapping and Instance Transformation Framework.", "authors": "B Jafarpour, SSR Abidi", "year": 2013, "citation_id": "fzr2PUYAAAAJ:PELIpwtuRlgC", "result_id": "fzr2PUYAAAAJ:PELIpwtuRlgC", "source": "scholar", "publication_info": {"summary": "CSWS, 5-11, 2013"}, "publication": "CSWS, 5-11, 2013", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&cstart=100&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:PELIpwtuRlgC"}, {"title": "An ontology-driven personalization framework for designing theory-driven self-management interventions", "authors": "SSR Abidi, S Abidi", "year": 2013, "citation_id": "fzr2PUYAAAAJ:JQOojiI6XY0C", "result_id": "fzr2PUYAAAAJ:JQOojiI6XY0C", "source": "scholar", "publication_info": {"summary": "International Workshop on Process-oriented Information Systems in Healthcare \u2026, 2013"}, "publication": "International Workshop on Process-oriented Information Systems in Healthcare \u2026, 2013", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&cstart=100&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:JQOojiI6XY0C"}, {"title": "Merging disease-specific clinical guidelines to handle comorbidities in a clinical decision support setting", "authors": "B Jafarpour, SSR Abidi", "year": 2013, "citation_id": "fzr2PUYAAAAJ:RGFaLdJalmkC", "result_id": "fzr2PUYAAAAJ:RGFaLdJalmkC", "source": "scholar", "publication_info": {"summary": "Conference on Artificial Intelligence in Medicine in Europe, 28-32, 2013"}, "publication": "Conference on Artificial Intelligence in Medicine in Europe, 28-32, 2013", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&cstart=100&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:RGFaLdJalmkC"}, {"title": "Dataflow oriented similarity matching for scientific workflows", "authors": "P Yeo, SSR Abidi", "year": 2013, "citation_id": "fzr2PUYAAAAJ:LPZeul_q3PIC", "result_id": "fzr2PUYAAAAJ:LPZeul_q3PIC", "source": "scholar", "publication_info": {"summary": "2013 IEEE International Symposium on Parallel & Distributed Processing \u2026, 2013"}, "publication": "2013 IEEE International Symposium on Parallel & Distributed Processing \u2026, 2013", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&cstart=100&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:LPZeul_q3PIC"}, {"title": "Usability evaluation of family physicians' interaction with the Comorbidity Ontological Modeling and ExecuTion System (COMET)", "authors": "SR Abidi, S Stewart, M Shepherd, SSR Abidi", "year": 2013, "citation_id": "fzr2PUYAAAAJ:ZuybSZzF8UAC", "result_id": "fzr2PUYAAAAJ:ZuybSZzF8UAC", "source": "scholar", "publication_info": {"summary": "MEDINFO 2013, 447-451, 2013"}, "publication": "MEDINFO 2013, 447-451, 2013", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&cstart=100&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:ZuybSZzF8UAC"}, {"title": "A semantic web based mobile framework for designing personalized patient self-management interventions", "authors": "SR Abidi, SSR Abidi, A Abusharek", "year": 2013, "citation_id": "fzr2PUYAAAAJ:HoB7MX3m0LUC", "result_id": "fzr2PUYAAAAJ:HoB7MX3m0LUC", "source": "scholar", "publication_info": {"summary": "Proceedings of the 1st Conference on Mobile and Information Technologies in \u2026, 2013"}, "publication": "Proceedings of the 1st Conference on Mobile and Information Technologies in \u2026, 2013", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&cstart=100&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:HoB7MX3m0LUC"}, {"title": "Applying social network analysis to understand the knowledge sharing behaviour of practitioners in a clinical online discussion forum", "authors": "SA Stewart, SSR Abidi", "year": 2012, "citation_id": "fzr2PUYAAAAJ:L8Ckcad2t8MC", "result_id": "fzr2PUYAAAAJ:L8Ckcad2t8MC", "source": "scholar", "publication_info": {"summary": "Journal of medical Internet research 14 (6), e1982, 2012"}, "publication": "Journal of medical Internet research 14 (6), e1982, 2012", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&cstart=100&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:L8Ckcad2t8MC"}, {"title": "Comparing Metamap to MGrep as a Tool for Mapping Free Text to Formal Medical Lexions.", "authors": "SA Stewart, ME Von Maltzahn, SSR Abidi", "year": 2012, "citation_id": "fzr2PUYAAAAJ:6ZxmRoH8BuwC", "result_id": "fzr2PUYAAAAJ:6ZxmRoH8BuwC", "source": "scholar", "publication_info": {"summary": "KECSM@ ISWC, 63-77, 2012"}, "publication": "KECSM@ ISWC, 63-77, 2012", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&cstart=100&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:6ZxmRoH8BuwC"}, {"title": "An ontological modeling approach to align institution-specific Clinical Pathways: Towards inter-institution care standardization", "authors": "SR Abidi, SSR Abidi", "year": 2012, "citation_id": "fzr2PUYAAAAJ:5awf1xo2G04C", "result_id": "fzr2PUYAAAAJ:5awf1xo2G04C", "source": "scholar", "publication_info": {"summary": "2012 25th IEEE International Symposium on Computer-Based Medical Systems \u2026, 2012"}, "publication": "2012 25th IEEE International Symposium on Computer-Based Medical Systems \u2026, 2012", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&cstart=100&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:5awf1xo2G04C"}, {"title": "Modeling clinical workflows using business process modeling notation", "authors": "N Hashemian, SSR Abidi", "year": 2012, "citation_id": "fzr2PUYAAAAJ:BqipwSGYUEgC", "result_id": "fzr2PUYAAAAJ:BqipwSGYUEgC", "source": "scholar", "publication_info": {"summary": "2012 25th IEEE International Symposium on Computer-Based Medical Systems \u2026, 2012"}, "publication": "2012 25th IEEE International Symposium on Computer-Based Medical Systems \u2026, 2012", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&cstart=100&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:BqipwSGYUEgC"}, {"title": "Using OWL ontologies for clinical guidelines based comorbid decision support", "authors": "S Abidi, J Cox, M Shepherd, SSR Abidi", "year": 2012, "citation_id": "fzr2PUYAAAAJ:ns9cj8rnVeAC", "result_id": "fzr2PUYAAAAJ:ns9cj8rnVeAC", "source": "scholar", "publication_info": {"summary": "2012 45th Hawaii International Conference on System Sciences, 3030-3038, 2012"}, "publication": "2012 45th Hawaii International Conference on System Sciences, 3030-3038, 2012", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&cstart=100&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:ns9cj8rnVeAC"}, {"title": "Hemi Transurethral Resection of Prostate: A Safe and Effective Method of Treating Huge Benign Prostatic Hyperplasia\u201d by Syed", "authors": "S Abidi, I Feroz, M Aslam, A Fawad, AB Fistein, ZA Sobani, M Baqir, ...", "year": 2012, "citation_id": "fzr2PUYAAAAJ:Xl6nMSl579sC", "result_id": "fzr2PUYAAAAJ:Xl6nMSl579sC", "source": "scholar", "publication_info": {"summary": "Journal of The College of Physicians and Surgeons Pakistan 22 (3), 198, 2012"}, "publication": "Journal of The College of Physicians and Surgeons Pakistan 22 (3), 198, 2012", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&cstart=100&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:Xl6nMSl579sC"}, {"title": "Applying social network analysis to understand the knowledge sharing behaviour of practitioners in a clinical discussion forum", "authors": "SA Stewart, SS Abidi", "year": 2012, "citation_id": "fzr2PUYAAAAJ:PVjk1bu6vJQC", "result_id": "fzr2PUYAAAAJ:PVjk1bu6vJQC", "source": "scholar", "publication_info": {"summary": "PubMed, 2012"}, "publication": "PubMed, 2012", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&cstart=100&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:PVjk1bu6vJQC"}, {"title": "An ontology framework for modeling ocean data and E-science semantic web services", "authors": "SR Abidi, SS Abidi, M Kwan, A Daniyal", "year": 2012, "citation_id": "fzr2PUYAAAAJ:-_dYPAW6P2MC", "result_id": "fzr2PUYAAAAJ:-_dYPAW6P2MC", "source": "scholar", "publication_info": {"summary": "Int. J. Adv. Comput. Sci 2 (8), 280-286, 2012"}, "publication": "Int. J. Adv. Comput. Sci 2 (8), 280-286, 2012", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&cstart=100&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:-_dYPAW6P2MC"}, {"title": "Ontology-based computerization of acute coronary syndrome clinical guideline for decision support in the emergency department", "authors": "M Omaish, S Abidi, S Abidi", "year": 2012, "citation_id": "fzr2PUYAAAAJ:nb7KW1ujOQ8C", "result_id": "fzr2PUYAAAAJ:nb7KW1ujOQ8C", "source": "scholar", "publication_info": {"summary": "Stud Health Technol Inform 180, 437-41, 2012"}, "publication": "Stud Health Technol Inform 180, 437-41, 2012", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&cstart=100&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:nb7KW1ujOQ8C"}, {"title": "An Infobutton for Web 2.0 clinical discussions: the knowledge linkage framework", "authors": "SA Stewart, SSR Abidi", "year": 2011, "citation_id": "fzr2PUYAAAAJ:a0OBvERweLwC", "result_id": "fzr2PUYAAAAJ:a0OBvERweLwC", "source": "scholar", "publication_info": {"summary": "IEEE Transactions on Information Technology in Biomedicine 16 (1), 129-135, 2011"}, "publication": "IEEE Transactions on Information Technology in Biomedicine 16 (1), 129-135, 2011", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&cstart=100&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:a0OBvERweLwC"}, {"title": "Ontology modeling for oceans knowledge and data management", "authors": "SR Abidi, SS Abidi, M Kwan, A Daniyal", "year": 2011, "citation_id": "fzr2PUYAAAAJ:0izLItjtcgwC", "result_id": "fzr2PUYAAAAJ:0izLItjtcgwC", "source": "scholar", "publication_info": {"summary": "International Conference on Intelligent Computational Systems, 2011"}, "publication": "International Conference on Intelligent Computational Systems, 2011", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&cstart=100&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:0izLItjtcgwC"}, {"title": "Detecting and resolving inconsistencies in ontologies using contradiction derivations", "authors": "S Hussain, J De Roo, A Daniyal, SSR Abidi", "year": 2011, "citation_id": "fzr2PUYAAAAJ:70eg2SAEIzsC", "result_id": "fzr2PUYAAAAJ:70eg2SAEIzsC", "source": "scholar", "publication_info": {"summary": "2011 IEEE 35th Annual Computer Software and Applications Conference, 556-561, 2011"}, "publication": "2011 IEEE 35th Annual Computer Software and Applications Conference, 556-561, 2011", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&cstart=100&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:70eg2SAEIzsC"}, {"title": "A Semantic Web based E-Science Framework for Ocean Knowledge Management", "authors": "SSR Abidi, A Daniyal, A Abusharekh, SR Abidi, P Yeo, F Khan, M Kwan, ...", "year": 2011, "citation_id": "fzr2PUYAAAAJ:_Re3VWB3Y0AC", "result_id": "fzr2PUYAAAAJ:_Re3VWB3Y0AC", "source": "scholar", "publication_info": {"summary": "Intl. Conf. on Innovation and Management, Kuala Lumpur, 2011"}, "publication": "Intl. Conf. on Innovation and Management, Kuala Lumpur, 2011", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&cstart=100&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:_Re3VWB3Y0AC"}, {"title": "Exploiting OWL reasoning services to execute ontologically-modeled clinical practice guidelines", "authors": "B Jafarpour, SR Abidi, SSR Abidi", "year": 2011, "citation_id": "fzr2PUYAAAAJ:R3hNpaxXUhUC", "result_id": "fzr2PUYAAAAJ:R3hNpaxXUhUC", "source": "scholar", "publication_info": {"summary": "Conference on Artificial Intelligence in Medicine in Europe, 307-311, 2011"}, "publication": "Conference on Artificial Intelligence in Medicine in Europe, 307-311, 2011", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&cstart=100&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:R3hNpaxXUhUC"}, {"title": "MINING NON-TAXONOMIC CONCEPT PAIRS FROM UNSTRUCTURED TEXT-A Concept Correlation Search Framework", "authors": "MK Wong, SSR Abidi, ID Jonsen", "year": 2011, "citation_id": "fzr2PUYAAAAJ:M7yex6snE4oC", "result_id": "fzr2PUYAAAAJ:M7yex6snE4oC", "source": "scholar", "publication_info": {"summary": "Special Session on Web and Text Mining 2, 707-716, 2011"}, "publication": "Special Session on Web and Text Mining 2, 707-716, 2011", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&cstart=100&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:M7yex6snE4oC"}, {"title": "Using social network analysis to study the knowledge sharing patterns of health professionals using web 2.0 tools", "authors": "SA Stewart, SSR Abidi", "year": 2011, "citation_id": "fzr2PUYAAAAJ:b0M2c_1WBrUC", "result_id": "fzr2PUYAAAAJ:b0M2c_1WBrUC", "source": "scholar", "publication_info": {"summary": "International Joint Conference on Biomedical Engineering Systems and \u2026, 2011"}, "publication": "International Joint Conference on Biomedical Engineering Systems and \u2026, 2011", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&cstart=100&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:b0M2c_1WBrUC"}, {"title": "An ontology-based electronic medical record for chronic disease management", "authors": "AM Iqbal, M Shepherd, SSR Abidi", "year": 2011, "citation_id": "fzr2PUYAAAAJ:XvxMoLDsR5gC", "result_id": "fzr2PUYAAAAJ:XvxMoLDsR5gC", "source": "scholar", "publication_info": {"summary": "2011 44th Hawaii International Conference on System Sciences, 1-10, 2011"}, "publication": "2011 44th Hawaii International Conference on System Sciences, 1-10, 2011", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&cstart=100&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:XvxMoLDsR5gC"}, {"title": "UNDERSTANDING MEDICINE 2.0", "authors": "S Stewart, SSR Abidi", "year": 2011, "citation_id": "fzr2PUYAAAAJ:ce2CqMG-AY4C", "result_id": "fzr2PUYAAAAJ:ce2CqMG-AY4C", "source": "scholar", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&cstart=100&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:ce2CqMG-AY4C"}, {"title": "Canadian Spine Society", "authors": "FC Frontenac, FLC Frontenac", "year": 2011, "citation_id": "fzr2PUYAAAAJ:-jrNzM816MMC", "result_id": "fzr2PUYAAAAJ:-jrNzM816MMC", "source": "scholar", "publication_info": {"summary": "Sleep 1, 01, 2011"}, "publication": "Sleep 1, 01, 2011", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&cstart=100&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:-jrNzM816MMC"}, {"title": "Understanding Medicine 2.0-Social Network Analysis and the VECoN System.", "authors": "SA Stewart, SSR Abidi, V Traver, ALN Fred, J Filipe, H Gamboa", "year": 2011, "citation_id": "fzr2PUYAAAAJ:a9-T7VOCCH8C", "result_id": "fzr2PUYAAAAJ:a9-T7VOCCH8C", "source": "scholar", "publication_info": {"summary": "HEALTHINF, 70-79, 2011"}, "publication": "HEALTHINF, 70-79, 2011", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&cstart=100&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:a9-T7VOCCH8C"}, {"title": "A Knowledge-centric e-Research Platform for Marine Life and Oceanographic Research.", "authors": "A Daniyal, SR Abidi, A AbuSharekh, MK Wong, SSR Abidi", "year": 2010, "citation_id": "fzr2PUYAAAAJ:2VqYfGB8ITEC", "result_id": "fzr2PUYAAAAJ:2VqYfGB8ITEC", "source": "scholar", "publication_info": {"summary": "KMIS, 363-366, 2010"}, "publication": "KMIS, 363-366, 2010", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&cstart=100&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:2VqYfGB8ITEC"}, {"title": "A service oriented e-research platform for ocean knowledge management", "authors": "SSR Abidi, A Abusharek, A Daniyal, M Kuan, F Mehdi, S Abidi, F Abbas, ...", "year": 2010, "citation_id": "fzr2PUYAAAAJ:tKAzc9rXhukC", "result_id": "fzr2PUYAAAAJ:tKAzc9rXhukC", "source": "scholar", "publication_info": {"summary": "2010 6th World Congress on Services, 32-39, 2010"}, "publication": "2010 6th World Congress on Services, 32-39, 2010", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&cstart=100&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:tKAzc9rXhukC"}, {"title": "Linking Specialized Online Medical Discussions to Online Medical Literature", "authors": "S Stewart, SSR Abidi, A Finley", "year": 2010, "citation_id": "fzr2PUYAAAAJ:L7CI7m0gUJcC", "result_id": "fzr2PUYAAAAJ:L7CI7m0gUJcC", "source": "scholar", "publication_info": {"summary": "Using Web Data in the Medical Do-main, 35, 2010"}, "publication": "Using Web Data in the Medical Do-main, 35, 2010", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&cstart=100&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:L7CI7m0gUJcC"}, {"title": "Extracting and Merging Contextualized Ontology Modules.", "authors": "S Hussain, SSR Abidi", "year": 2010, "citation_id": "fzr2PUYAAAAJ:2P1L_qKh6hAC", "result_id": "fzr2PUYAAAAJ:2P1L_qKh6hAC", "source": "scholar", "publication_info": {"summary": "WoMO, 25-40, 2010"}, "publication": "WoMO, 25-40, 2010", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&cstart=100&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:2P1L_qKh6hAC"}, {"title": "Semantic Web Services for Ocean Knowledge Management", "authors": "SSR Abidi, A Daniyal, A Abusharek, SR Abidi", "year": 2010, "citation_id": "fzr2PUYAAAAJ:z_wVstp3MssC", "result_id": "fzr2PUYAAAAJ:z_wVstp3MssC", "source": "scholar", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&cstart=100&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:z_wVstp3MssC"}, {"title": "Pediatric pain management knowledge linkages: mapping experiential knowledge to explicit knowledge", "authors": "S Stewart, SSR Abidi, A Finley", "year": 2010, "citation_id": "fzr2PUYAAAAJ:VLnqNzywnoUC", "result_id": "fzr2PUYAAAAJ:VLnqNzywnoUC", "source": "scholar", "publication_info": {"summary": "MEDINFO 2010, 1184-1188, 2010"}, "publication": "MEDINFO 2010, 1184-1188, 2010", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&cstart=100&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:VLnqNzywnoUC"}, {"title": "A compositional personalization approach for designing personalized patient educational interventions for cardiovascular risk management.", "authors": "S Davis, SSR Abidi, SA Stewart", "year": 2010, "citation_id": "fzr2PUYAAAAJ:yD5IFk8b50cC", "result_id": "fzr2PUYAAAAJ:yD5IFk8b50cC", "source": "scholar", "publication_info": {"summary": "MedInfo, 629-633, 2010"}, "publication": "MedInfo, 629-633, 2010", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&cstart=100&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:yD5IFk8b50cC"}, {"title": "Ontology based modeling and execution of Nursing Care Plans and Practice Guidelines.", "authors": "MA Din, SSR Abidi, B Jafarpour", "year": 2010, "citation_id": "fzr2PUYAAAAJ:Wp0gIr-vW9MC", "result_id": "fzr2PUYAAAAJ:Wp0gIr-vW9MC", "source": "scholar", "publication_info": {"summary": "MedInfo, 1104-1108, 2010"}, "publication": "MedInfo, 1104-1108, 2010", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&cstart=100&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:Wp0gIr-vW9MC"}, {"title": "A web recommender system for recommending, predicting and personalizing music playlists", "authors": "Z Chedrawy, SSR Abidi", "year": 2009, "citation_id": "fzr2PUYAAAAJ:JV2RwH3_ST0C", "result_id": "fzr2PUYAAAAJ:JV2RwH3_ST0C", "source": "scholar", "publication_info": {"summary": "International Conference on Web Information Systems Engineering, 335-342, 2009"}, "publication": "International Conference on Web Information Systems Engineering, 335-342, 2009", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&cstart=100&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:JV2RwH3_ST0C"}, {"title": "Bridging the gap: knowledge seeking and sharing in a virtual community of emergency practice", "authors": "JA Curran, AL Murphy, SSR Abidi, D Sinclair, PJ McGrath", "year": 2009, "citation_id": "fzr2PUYAAAAJ:UeHWp8X0CEIC", "result_id": "fzr2PUYAAAAJ:UeHWp8X0CEIC", "source": "scholar", "publication_info": {"summary": "Evaluation & the health professions 32 (3), 314-327, 2009"}, "publication": "Evaluation & the health professions 32 (3), 314-327, 2009", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&cstart=100&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:UeHWp8X0CEIC"}, {"title": "Knowledge sharing for pediatric pain management via a Web 2.0 framework", "authors": "KP Adlassnig", "year": 2009, "citation_id": "fzr2PUYAAAAJ:ULOm3_A8WrAC", "result_id": "fzr2PUYAAAAJ:ULOm3_A8WrAC", "source": "scholar", "publication_info": {"summary": "Medical Informatics in a United and Healthy Europe: Proceedings of MIE 2009 \u2026, 2009"}, "publication": "Medical Informatics in a United and Healthy Europe: Proceedings of MIE 2009 \u2026, 2009", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&cstart=100&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:ULOm3_A8WrAC"}, {"title": "Semantic Web-based modeling of Clinical Pathways using the UML Activity Diagrams and OWL-S", "authors": "A Daniyal, SSR Abidi", "year": 2009, "citation_id": "fzr2PUYAAAAJ:4JMBOYKVnBMC", "result_id": "fzr2PUYAAAAJ:4JMBOYKVnBMC", "source": "scholar", "publication_info": {"summary": "International Workshop on Knowledge Representation for Health Care, 88-99, 2009"}, "publication": "International Workshop on Knowledge Representation for Health Care, 88-99, 2009", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&cstart=100&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:4JMBOYKVnBMC"}, {"title": "Integrating healthcare knowledge artifacts for clinical decision support: towards semantic web based healthcare knowledge morphing", "authors": "S Hussain, SSR Abidi", "year": 2009, "citation_id": "fzr2PUYAAAAJ:RHpTSmoSYBkC", "result_id": "fzr2PUYAAAAJ:RHpTSmoSYBkC", "source": "scholar", "publication_info": {"summary": "Conference on Artificial Intelligence in Medicine in Europe, 171-175, 2009"}, "publication": "Conference on Artificial Intelligence in Medicine in Europe, 171-175, 2009", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&cstart=100&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:RHpTSmoSYBkC"}, {"title": "Towards the merging of multiple clinical protocols and guidelines via ontology-driven modeling", "authors": "SR Abidi, SSR Abidi", "year": 2009, "citation_id": "fzr2PUYAAAAJ:8k81kl-MbHgC", "result_id": "fzr2PUYAAAAJ:8k81kl-MbHgC", "source": "scholar", "publication_info": {"summary": "Conference on Artificial Intelligence in Medicine in Europe, 81-85, 2009"}, "publication": "Conference on Artificial Intelligence in Medicine in Europe, 81-85, 2009", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&cstart=100&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:8k81kl-MbHgC"}, {"title": "Intelligent Information personalization: From issues to strategies", "authors": "SSR Abidi", "year": 2009, "citation_id": "fzr2PUYAAAAJ:M3NEmzRMIkIC", "result_id": "fzr2PUYAAAAJ:M3NEmzRMIkIC", "source": "scholar", "publication_info": {"summary": "Intelligent User Interfaces: Adaptation and Personalization Systems and \u2026, 2009"}, "publication": "Intelligent User Interfaces: Adaptation and Personalization Systems and \u2026, 2009", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&cstart=100&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:M3NEmzRMIkIC"}, {"title": "Computerizing clinical pathways: ontology-based modeling and execution.", "authors": "A Daniyal, SR Abidi, SSR Abidi", "year": 2009, "citation_id": "fzr2PUYAAAAJ:UebtZRa9Y70C", "result_id": "fzr2PUYAAAAJ:UebtZRa9Y70C", "source": "scholar", "publication_info": {"summary": "MIE, 643-647, 2009"}, "publication": "MIE, 643-647, 2009", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&cstart=100&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:UebtZRa9Y70C"}, {"title": "Operationalizing prostate cancer clinical pathways: An ontological model to computerize, merge and execute institution-specific clinical pathways", "authors": "SR Abidi, SSR Abidi, L Butler, S Hussain", "year": 2008, "citation_id": "fzr2PUYAAAAJ:HtEfBTGE9r8C", "result_id": "fzr2PUYAAAAJ:HtEfBTGE9r8C", "source": "scholar", "publication_info": {"summary": "Workshop on Knowledge Management for Health Care Procedures, 1-12, 2008"}, "publication": "Workshop on Knowledge Management for Health Care Procedures, 1-12, 2008", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&cstart=100&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:HtEfBTGE9r8C"}, {"title": "Modeling the form and function of clinical practice guidelines: An ontological model to computerize clinical practice guidelines", "authors": "SSR Abidi, S Shayegani", "year": 2008, "citation_id": "fzr2PUYAAAAJ:mVmsd5A6BfQC", "result_id": "fzr2PUYAAAAJ:mVmsd5A6BfQC", "source": "scholar", "publication_info": {"summary": "Workshop on Knowledge Management for Health Care Procedures, 81-91, 2008"}, "publication": "Workshop on Knowledge Management for Health Care Procedures, 81-91, 2008", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&cstart=100&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:mVmsd5A6BfQC"}, {"title": "Ontology-based modeling and merging of institution-specific prostate cancer clinical pathways", "authors": "S Abidi, R Abidi, S Hussain, L Butler", "year": 2008, "citation_id": "fzr2PUYAAAAJ:TIZ-Mc8IlK0C", "result_id": "fzr2PUYAAAAJ:TIZ-Mc8IlK0C", "source": "scholar", "publication_info": {"summary": "Knowledge Management for Healthcare Processes Workshop at ECAI, 21-25, 2008"}, "publication": "Knowledge Management for Healthcare Processes Workshop at ECAI, 21-25, 2008", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&cstart=100&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:TIZ-Mc8IlK0C"}, {"title": "Knowledge Management for Health Care Procedures: From Knowledge to Global Care, AIME 2007 Workshop K4CARE 2007, Amsterdam, The Netherlands, July 7, 2007, Revised Selected Papers", "authors": "D Ria\u00f1o", "year": 2008, "citation_id": "fzr2PUYAAAAJ:ALROH1vI_8AC", "result_id": "fzr2PUYAAAAJ:ALROH1vI_8AC", "source": "scholar", "publication_info": {"summary": "Springer, 2008"}, "publication": "Springer, 2008", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&cstart=100&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:ALROH1vI_8AC"}, {"title": "Knowledge management for health care procedures", "authors": "SSR Abidi, D RIA\u00d1O", "year": 2008, "citation_id": "fzr2PUYAAAAJ:ZzlSgRqYykMC", "result_id": "fzr2PUYAAAAJ:ZzlSgRqYykMC", "source": "scholar", "publication_info": {"summary": "New York: Springer London, Limited, 5-6, 2008"}, "publication": "New York: Springer London, Limited, 5-6, 2008", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&cstart=100&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:ZzlSgRqYykMC"}, {"title": "A clinical practice guideline-based ontology driven clinical decision support system for breast cancer follow-up", "authors": "SR Abidi, M Shepherd", "year": 2008, "citation_id": "fzr2PUYAAAAJ:yFnVuubrUp4C", "result_id": "fzr2PUYAAAAJ:yFnVuubrUp4C", "source": "scholar", "publication_info": {"summary": "Journal on Information Technology in Healthcare 6 (1), 23-32, 2008"}, "publication": "Journal on Information Technology in Healthcare 6 (1), 23-32, 2008", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&cstart=100&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:yFnVuubrUp4C"}, {"title": "Generating customized yet factually consistent information: a constraint satisfaction approach", "authors": "SSR Abidi, YH Chong, Y Zeng", "year": 2008, "citation_id": "fzr2PUYAAAAJ:uLbwQdceFCQC", "result_id": "fzr2PUYAAAAJ:uLbwQdceFCQC", "source": "scholar", "publication_info": {"summary": "International Journal on Digital Libraries 8 (3), 247, 2008"}, "publication": "International Journal on Digital Libraries 8 (3), 247, 2008", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&cstart=100&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:uLbwQdceFCQC"}, {"title": "Generating personalised cardiovascular risk management educational interventions linking SCORE and behaviour change", "authors": "S Davis, S Abidi, J Cox", "year": 2008, "citation_id": "fzr2PUYAAAAJ:SeFeTyx0c_EC", "result_id": "fzr2PUYAAAAJ:SeFeTyx0c_EC", "source": "scholar", "publication_info": {"summary": "J Inf Technol Healthcare 6, 73-82, 2008"}, "publication": "J Inf Technol Healthcare 6, 73-82, 2008", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&cstart=100&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:SeFeTyx0c_EC"}, {"title": "An ontology-based framework for authoring and executing clinical practice guidelines for clinical decision support systems", "authors": "S Hussain, SSR Abidi", "year": 2008, "citation_id": "fzr2PUYAAAAJ:RYcK_YlVTxYC", "result_id": "fzr2PUYAAAAJ:RYcK_YlVTxYC", "source": "scholar", "publication_info": {"summary": "J. Inf. Technol. Healthc 6 (1), 8-22, 2008"}, "publication": "J. Inf. Technol. Healthc 6 (1), 8-22, 2008", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&cstart=100&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:RYcK_YlVTxYC"}, {"title": "Evaluation of an online discussion forum for emergency practitioners", "authors": "JA Curran, S Sibte Raza Abidi", "year": 2007, "citation_id": "fzr2PUYAAAAJ:_FxGoFyzp5QC", "result_id": "fzr2PUYAAAAJ:_FxGoFyzp5QC", "source": "scholar", "publication_info": {"summary": "Health Informatics Journal 13 (4), 255-266, 2007"}, "publication": "Health Informatics Journal 13 (4), 255-266, 2007", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&cstart=100&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:_FxGoFyzp5QC"}, {"title": "Semantic web framework for knowledge-centric clinical decision support systems", "authors": "S Hussain, S Raza Abidi, SS Raza Abidi", "year": 2007, "citation_id": "fzr2PUYAAAAJ:IjCSPb-OGe4C", "result_id": "fzr2PUYAAAAJ:IjCSPb-OGe4C", "source": "scholar", "publication_info": {"summary": "Conference on Artificial Intelligence in Medicine in Europe, 451-455, 2007"}, "publication": "Conference on Artificial Intelligence in Medicine in Europe, 451-455, 2007", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&cstart=100&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:IjCSPb-OGe4C"}, {"title": "Healthcare knowledge management: The art of the possible", "authors": "SSR Abidi", "year": 2007, "citation_id": "fzr2PUYAAAAJ:d1gkVwhDpl0C", "result_id": "fzr2PUYAAAAJ:d1gkVwhDpl0C", "source": "scholar", "publication_info": {"summary": "AIME workshop on knowledge management for health care procedures, 1-20, 2007"}, "publication": "AIME workshop on knowledge management for health care procedures, 1-20, 2007", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&cstart=100&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:d1gkVwhDpl0C"}, {"title": "Medical knowledge morphing via a semantic web framework", "authors": "SSR Abidi, S Hussain", "year": 2007, "citation_id": "fzr2PUYAAAAJ:qxL8FJ1GzNcC", "result_id": "fzr2PUYAAAAJ:qxL8FJ1GzNcC", "source": "scholar", "publication_info": {"summary": "Twentieth IEEE International Symposium on Computer-Based Medical Systems \u2026, 2007"}, "publication": "Twentieth IEEE International Symposium on Computer-Based Medical Systems \u2026, 2007", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&cstart=100&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:qxL8FJ1GzNcC"}, {"title": "Ontology engineering to model clinical pathways: Towards the computerization and execution of clinical pathways", "authors": "KF Hurley, SSR Abidi", "year": 2007, "citation_id": "fzr2PUYAAAAJ:2osOgNQ5qMEC", "result_id": "fzr2PUYAAAAJ:2osOgNQ5qMEC", "source": "scholar", "publication_info": {"summary": "Twentieth IEEE International Symposium on Computer-Based Medical Systems \u2026, 2007"}, "publication": "Twentieth IEEE International Symposium on Computer-Based Medical Systems \u2026, 2007", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&cstart=100&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:2osOgNQ5qMEC"}, {"title": "Ontology driven CPG authoring and execution via a Semantic Web framework", "authors": "S Hussain, SSR Abidi", "year": 2007, "citation_id": "fzr2PUYAAAAJ:kNdYIx-mwKoC", "result_id": "fzr2PUYAAAAJ:kNdYIx-mwKoC", "source": "scholar", "publication_info": {"summary": "2007 40th Annual Hawaii International Conference on System Sciences (HICSS \u2026, 2007"}, "publication": "2007 40th Annual Hawaii International Conference on System Sciences (HICSS \u2026, 2007", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&cstart=100&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:kNdYIx-mwKoC"}, {"title": "Pursuing Information Personalization as a Constraint Satisfaction Problem", "authors": "Y Zeng, SSR Abidi", "year": 2007, "citation_id": "fzr2PUYAAAAJ:1yWc8FF-_SYC", "result_id": "fzr2PUYAAAAJ:1yWc8FF-_SYC", "source": "scholar", "publication_info": {"summary": "Library and Archives Canada= Bibliothe\u0300que et Archives Canada, Ottawa, 2007"}, "publication": "Library and Archives Canada= Bibliothe\u0300que et Archives Canada, Ottawa, 2007", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&cstart=100&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:1yWc8FF-_SYC"}, {"title": "A Semantic Web Based Framework for Modelling Clinical Practice Guidelines to Develop Clinical Decision Support Systems", "authors": "S Hussain, SSR Abidi", "year": 2007, "citation_id": "fzr2PUYAAAAJ:ZfRJV9d4-WMC", "result_id": "fzr2PUYAAAAJ:ZfRJV9d4-WMC", "source": "scholar", "publication_info": {"summary": "Medinfo 2007: Proceedings of the 12th World Congress on Health (Medical \u2026, 2007"}, "publication": "Medinfo 2007: Proceedings of the 12th World Congress on Health (Medical \u2026, 2007", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&cstart=100&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:ZfRJV9d4-WMC"}, {"title": "Personalized Patient Education for Cardiovascular Risk Management: A Synergy of Behavioural Modelling, SCORE and Compositional Information Personalization Methods", "authors": "S Davis, SSR Abidi", "year": 2007, "citation_id": "fzr2PUYAAAAJ:VL0QpB8kHFEC", "result_id": "fzr2PUYAAAAJ:VL0QpB8kHFEC", "source": "scholar", "publication_info": {"summary": "Medinfo 2007: Proceedings of the 12th World Congress on Health (Medical \u2026, 2007"}, "publication": "Medinfo 2007: Proceedings of the 12th World Congress on Health (Medical \u2026, 2007", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&cstart=100&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:VL0QpB8kHFEC"}, {"title": "Context-aware and ontology-driven knowledge sharing in P2P communities", "authors": "P O'Brien, SSR Abidi", "year": 2007, "citation_id": "fzr2PUYAAAAJ:Tiz5es2fbqcC", "result_id": "fzr2PUYAAAAJ:Tiz5es2fbqcC", "source": "scholar", "publication_info": {"summary": "Creating Collaborative Advantage Through Knowledge And Innovation, 155-174, 2007"}, "publication": "Creating Collaborative Advantage Through Knowledge And Innovation, 155-174, 2007", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&cstart=100&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:Tiz5es2fbqcC"}, {"title": "Automated interpretation of optic nerve images: a data mining framework for glaucoma diagnostic support", "authors": "SSR Abidi, PH Artes, S Yun, J Yu", "year": 2007, "citation_id": "fzr2PUYAAAAJ:P5F9QuxV20EC", "result_id": "fzr2PUYAAAAJ:P5F9QuxV20EC", "source": "scholar", "publication_info": {"summary": "MEDINFO 2007, 1309-1313, 2007"}, "publication": "MEDINFO 2007, 1309-1313, 2007", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&cstart=100&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:P5F9QuxV20EC"}, {"title": "Healthcare knowledge sharing: purpose, practices, and prospects", "authors": "SSR Abidi", "year": 2007, "citation_id": "fzr2PUYAAAAJ:W7OEmFMy1HYC", "result_id": "fzr2PUYAAAAJ:W7OEmFMy1HYC", "source": "scholar", "publication_info": {"summary": "Healthcare knowledge management: Issues, advances, and successes, 67-86, 2007"}, "publication": "Healthcare knowledge management: Issues, advances, and successes, 67-86, 2007", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&cstart=100&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:W7OEmFMy1HYC"}, {"title": "Ontology-based modeling of clinical practice guidelines: a clinical decision support system for breast cancer follow-up interventions at primary care settings.", "authors": "SR Abidi, SSR Abidi, S Hussain, M Shepherd", "year": 2007, "citation_id": "fzr2PUYAAAAJ:Y0pCki6q_DkC", "result_id": "fzr2PUYAAAAJ:Y0pCki6q_DkC", "source": "scholar", "publication_info": {"summary": "Studies in health technology and informatics 129 (2), 845, 2007"}, "publication": "Studies in health technology and informatics 129 (2), 845, 2007", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&cstart=100&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:Y0pCki6q_DkC"}, {"title": "Adaptable personalized care planning via a semantic web framework", "authors": "SSR Abidi, H Chen", "year": 2006, "citation_id": "fzr2PUYAAAAJ:7T2F9Uy0os0C", "result_id": "fzr2PUYAAAAJ:7T2F9Uy0os0C", "source": "scholar", "publication_info": {"summary": "20th International Congress of the European Federation for Medical \u2026, 2006"}, "publication": "20th International Congress of the European Federation for Medical \u2026, 2006", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&cstart=100&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:7T2F9Uy0os0C"}, {"title": "An adaptive hypermedia system using a constraint satisfaction approach for information personalization", "authors": "SSR Abidi, Y Zeng", "year": 2006, "citation_id": "fzr2PUYAAAAJ:XiVPGOgt02cC", "result_id": "fzr2PUYAAAAJ:XiVPGOgt02cC", "source": "scholar", "publication_info": {"summary": "International Conference on Adaptive Hypermedia and Adaptive Web-Based \u2026, 2006"}, "publication": "International Conference on Adaptive Hypermedia and Adaptive Web-Based \u2026, 2006", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&cstart=100&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:XiVPGOgt02cC"}, {"title": "Adaptive patient education framework featuring personalized cardiovascular risk management interventions", "authors": "S Davis, SSR Abidi", "year": 2006, "citation_id": "fzr2PUYAAAAJ:k_IJM867U9cC", "result_id": "fzr2PUYAAAAJ:k_IJM867U9cC", "source": "scholar", "publication_info": {"summary": "International Conference on Adaptive Hypermedia and Adaptive Web-Based \u2026, 2006"}, "publication": "International Conference on Adaptive Hypermedia and Adaptive Web-Based \u2026, 2006", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&cstart=100&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:k_IJM867U9cC"}, {"title": "An adaptive personalized recommendation strategy featuring context sensitive content adaptation", "authors": "Z Chedrawy, SSR Abidi", "year": 2006, "citation_id": "fzr2PUYAAAAJ:WF5omc3nYNoC", "result_id": "fzr2PUYAAAAJ:WF5omc3nYNoC", "source": "scholar", "publication_info": {"summary": "International Conference on Adaptive Hypermedia and Adaptive Web-Based \u2026, 2006"}, "publication": "International Conference on Adaptive Hypermedia and Adaptive Web-Based \u2026, 2006", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&cstart=100&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:WF5omc3nYNoC"}, {"title": "Intelligent information personalization leveraging constraint satisfaction and association rule methods", "authors": "SSR Abidi, Y Zeng", "year": 2006, "citation_id": "fzr2PUYAAAAJ:zA6iFVUQeVQC", "result_id": "fzr2PUYAAAAJ:zA6iFVUQeVQC", "source": "scholar", "publication_info": {"summary": "Conference of the Canadian Society for Computational Studies of Intelligence \u2026, 2006"}, "publication": "Conference of the Canadian Society for Computational Studies of Intelligence \u2026, 2006", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=fzr2PUYAAAAJ&cstart=100&pagesize=100&sortby=pubdate&citation_for_view=fzr2PUYAAAAJ:zA6iFVUQeVQC"}], "search_metadata": {"status": "Success", "source": "serpapi"}}} \ No newline at end of file diff --git a/data/api_cache/serpapi_publications/99833ee2f00f3a940dffaf9f01e8986dafda4753d5fb10a4ad8d1991c714bdb1.json b/data/api_cache/serpapi_publications/99833ee2f00f3a940dffaf9f01e8986dafda4753d5fb10a4ad8d1991c714bdb1.json index ed63f4ef..b66a1e80 100644 --- a/data/api_cache/serpapi_publications/99833ee2f00f3a940dffaf9f01e8986dafda4753d5fb10a4ad8d1991c714bdb1.json +++ b/data/api_cache/serpapi_publications/99833ee2f00f3a940dffaf9f01e8986dafda4753d5fb10a4ad8d1991c714bdb1.json @@ -1 +1 @@ -{"timestamp": 1772377433.0250514, "ttl_days": 60, "data": {"articles": [{"title": "International AI Safety Report 2026", "authors": "Y Bengio, S Clare, C Prunkl, M Andriushchenko, B Bucknall, M Murray, ...", "year": 2026, "citation_id": "JicYPdAAAAAJ:yY8dUDjMDt8C", "result_id": "JicYPdAAAAAJ:yY8dUDjMDt8C", "source": "scholar", "publication_info": {"summary": "arXiv preprint arXiv:2602.21012, 2026"}, "publication": "arXiv preprint arXiv:2602.21012, 2026", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=JicYPdAAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=JicYPdAAAAAJ:yY8dUDjMDt8C"}, {"title": "Using Artificial Intelligence to Optimize Sustainable Branding and Digital Green Advertising", "authors": "G Hinton, Y LeCun, Y Bengio, A Ng, FF Li, I Goodfellow, F Chollet", "year": 2026, "citation_id": "JicYPdAAAAAJ:GpOSJs1ZbLkC", "result_id": "JicYPdAAAAAJ:GpOSJs1ZbLkC", "source": "scholar", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=JicYPdAAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=JicYPdAAAAAJ:GpOSJs1ZbLkC"}, {"title": "Training distilled machine learning models", "authors": "O Vinyals, JA Dean, GE Hinton", "year": 2026, "citation_id": "JicYPdAAAAAJ:b9WrW9Envh0C", "result_id": "JicYPdAAAAAJ:b9WrW9Envh0C", "source": "scholar", "publication_info": {"summary": "US Patent 12,536,478, 2026"}, "publication": "US Patent 12,536,478, 2026", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=JicYPdAAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=JicYPdAAAAAJ:b9WrW9Envh0C"}, {"title": "International ai safety report 2025: Second key update: Technical safeguards and risk management", "authors": "Y Bengio, S Clare, C Prunkl, M Andriushchenko, B Bucknall, P Fox, ...", "year": 2025, "citation_id": "JicYPdAAAAAJ:W2VW_RKN1OwC", "result_id": "JicYPdAAAAAJ:W2VW_RKN1OwC", "source": "scholar", "publication_info": {"summary": "arXiv preprint arXiv:2511.19863, 2025"}, "publication": "arXiv preprint arXiv:2511.19863, 2025", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=JicYPdAAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=JicYPdAAAAAJ:W2VW_RKN1OwC"}, {"title": "International AI Safety Report 2025: First Key Update: Capabilities and Risk Implications", "authors": "Y Bengio, S Clare, C Prunkl, S Rismani, M Andriushchenko, B Bucknall, ...", "year": 2025, "citation_id": "JicYPdAAAAAJ:8NHCvSvNRCIC", "result_id": "JicYPdAAAAAJ:8NHCvSvNRCIC", "source": "scholar", "publication_info": {"summary": "arXiv preprint arXiv:2510.13653, 2025"}, "publication": "arXiv preprint arXiv:2510.13653, 2025", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=JicYPdAAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=JicYPdAAAAAJ:8NHCvSvNRCIC"}, {"title": "Performing computer vision tasks by generating sequences of tokens", "authors": "T Chen, DJ FLEET, GE Hinton, Y Li, S SAXENA, TY Lin", "year": 2025, "citation_id": "JicYPdAAAAAJ:WD7AgJrCjNIC", "result_id": "JicYPdAAAAAJ:WD7AgJrCjNIC", "source": "scholar", "publication_info": {"summary": "US Patent App. 18/867,142, 2025"}, "publication": "US Patent App. 18/867,142, 2025", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=JicYPdAAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=JicYPdAAAAAJ:WD7AgJrCjNIC"}, {"title": "Nobel lecture: Boltzmann machines", "authors": "G Hinton", "year": 2025, "citation_id": "JicYPdAAAAAJ:PPAp3RzCAaIC", "result_id": "JicYPdAAAAAJ:PPAp3RzCAaIC", "source": "scholar", "publication_info": {"summary": "Reviews of Modern Physics 97 (3), 030502, 2025"}, "publication": "Reviews of Modern Physics 97 (3), 030502, 2025", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=JicYPdAAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=JicYPdAAAAAJ:PPAp3RzCAaIC"}, {"title": "Detecting objects in images by generating sequences of tokens", "authors": "T Chen, S SAXENA, Y Li, GE Hinton, DJ FLEET", "year": 2025, "citation_id": "JicYPdAAAAAJ:2BeMVx_SZpEC", "result_id": "JicYPdAAAAAJ:2BeMVx_SZpEC", "source": "scholar", "publication_info": {"summary": "US Patent App. 18/690,550, 2025"}, "publication": "US Patent App. 18/690,550, 2025", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=JicYPdAAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=JicYPdAAAAAJ:2BeMVx_SZpEC"}, {"title": "Systems and methods for contrastive learning of visual representations", "authors": "T Chen, S Komblith, M Norouzi, GE Hinton, KJ Swersky", "year": 2025, "citation_id": "JicYPdAAAAAJ:-rwTIRUNLawC", "result_id": "JicYPdAAAAAJ:-rwTIRUNLawC", "source": "scholar", "publication_info": {"summary": "US Patent 12,254,413, 2025"}, "publication": "US Patent 12,254,413, 2025", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=JicYPdAAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=JicYPdAAAAAJ:-rwTIRUNLawC"}, {"title": "Systems and Methods for Contrastive Learning of Visual Representations", "authors": "T Chen, S Komblith, M Norouzi, GE Hinton, KJ Swersky", "year": 2025, "citation_id": "JicYPdAAAAAJ:twffdjNOitAC", "result_id": "JicYPdAAAAAJ:twffdjNOitAC", "source": "scholar", "publication_info": {"summary": "US Patent App. 18/960,623, 2025"}, "publication": "US Patent App. 18/960,623, 2025", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=JicYPdAAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=JicYPdAAAAAJ:twffdjNOitAC"}, {"title": "Sequence modeling using imputation", "authors": "W Chan, C Saharia, GE Hinton, M Norouzi, N Jaitly", "year": 2025, "citation_id": "JicYPdAAAAAJ:LZ55yeyZZb4C", "result_id": "JicYPdAAAAAJ:LZ55yeyZZb4C", "source": "scholar", "publication_info": {"summary": "US Patent 12,242,818, 2025"}, "publication": "US Patent 12,242,818, 2025", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=JicYPdAAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=JicYPdAAAAAJ:LZ55yeyZZb4C"}, {"title": "Generating discrete data using diffusion neural networks", "authors": "T Chen, R Zhang, GE Hinton", "year": 2025, "citation_id": "JicYPdAAAAAJ:Huv_iBJ06lEC", "result_id": "JicYPdAAAAAJ:Huv_iBJ06lEC", "source": "scholar", "publication_info": {"summary": "US Patent App. 18/366,638, 2025"}, "publication": "US Patent App. 18/366,638, 2025", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=JicYPdAAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=JicYPdAAAAAJ:Huv_iBJ06lEC"}, {"title": "International ai safety report", "authors": "Y Bengio, S Mindermann, D Privitera, T Besiroglu, R Bommasani, ...", "year": 2025, "citation_id": "JicYPdAAAAAJ:VDARjI3xf8gC", "result_id": "JicYPdAAAAAJ:VDARjI3xf8gC", "source": "scholar", "publication_info": {"summary": "arXiv preprint arXiv:2501.17805, 2025"}, "publication": "arXiv preprint arXiv:2501.17805, 2025", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=JicYPdAAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=JicYPdAAAAAJ:VDARjI3xf8gC"}, {"title": "System and method for parallelizing convolutional neural networks", "authors": "A Krizhevsky, I Sutskever, GE Hinton", "year": 2024, "citation_id": "JicYPdAAAAAJ:UO6ax3c-pNsC", "result_id": "JicYPdAAAAAJ:UO6ax3c-pNsC", "source": "scholar", "publication_info": {"summary": "US Patent App. 18/438,368, 2024"}, "publication": "US Patent App. 18/438,368, 2024", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=JicYPdAAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=JicYPdAAAAAJ:UO6ax3c-pNsC"}, {"title": "Object discovery in images through categorizing object parts", "authors": "AR Kosiorek, GE Hinton, SSR Aghdam, YW Teh", "year": 2024, "citation_id": "JicYPdAAAAAJ:AOwgc6nnr1EC", "result_id": "JicYPdAAAAAJ:AOwgc6nnr1EC", "source": "scholar", "publication_info": {"summary": "US Patent 12,067,758, 2024"}, "publication": "US Patent 12,067,758, 2024", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=JicYPdAAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=JicYPdAAAAAJ:AOwgc6nnr1EC"}, {"title": "Managing extreme AI risks amid rapid progress", "authors": "Y Bengio, G Hinton, A Yao, D Song, P Abbeel, T Darrell, YN Harari, ...", "year": 2024, "citation_id": "JicYPdAAAAAJ:2C0LhDdYSbcC", "result_id": "JicYPdAAAAAJ:2C0LhDdYSbcC", "source": "scholar", "publication_info": {"summary": "Science 384 (6698), 842-845, 2024"}, "publication": "Science 384 (6698), 842-845, 2024", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=JicYPdAAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=JicYPdAAAAAJ:2C0LhDdYSbcC"}, {"title": "Convex representation of objects using neural network", "authors": "B Deng, K Genova, S Yazdani, S Bouaziz, GE Hinton, A TAGLIASACCHI", "year": 2024, "citation_id": "JicYPdAAAAAJ:MaiMEk8tZqMC", "result_id": "JicYPdAAAAAJ:MaiMEk8tZqMC", "source": "scholar", "publication_info": {"summary": "US Patent 11,978,268, 2024"}, "publication": "US Patent 11,978,268, 2024", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=JicYPdAAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=JicYPdAAAAAJ:MaiMEk8tZqMC"}, {"title": "Neural network training using the soft nearest neighbor loss", "authors": "GE Hinton, NMW Frosst, NGR Papernot", "year": 2024, "citation_id": "JicYPdAAAAAJ:-0tLmPFCw2kC", "result_id": "JicYPdAAAAAJ:-0tLmPFCw2kC", "source": "scholar", "publication_info": {"summary": "US Patent 11,941,867, 2024"}, "publication": "US Patent 11,941,867, 2024", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=JicYPdAAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=JicYPdAAAAAJ:-0tLmPFCw2kC"}, {"title": "System and method for parallelizing convolutional neural networks", "authors": "A Krizhevsky, I Sutskever, GE Hinton", "year": 2024, "citation_id": "JicYPdAAAAAJ:H-3wYkpcA84C", "result_id": "JicYPdAAAAAJ:H-3wYkpcA84C", "source": "scholar", "publication_info": {"summary": "US Patent 11,928,577, 2024"}, "publication": "US Patent 11,928,577, 2024", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=JicYPdAAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=JicYPdAAAAAJ:H-3wYkpcA84C"}, {"title": "Training distilled machine learning models", "authors": "O Vinyals, JA Dean, GE Hinton", "year": 2024, "citation_id": "JicYPdAAAAAJ:vkDViGfkvYEC", "result_id": "JicYPdAAAAAJ:vkDViGfkvYEC", "source": "scholar", "publication_info": {"summary": "US Patent 11,900,232, 2024"}, "publication": "US Patent 11,900,232, 2024", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=JicYPdAAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=JicYPdAAAAAJ:vkDViGfkvYEC"}, {"title": "Will digital intelligence replace biological intelligence", "authors": "G Hinton", "year": 2024, "citation_id": "JicYPdAAAAAJ:nOKOSwxqtg8C", "result_id": "JicYPdAAAAAJ:nOKOSwxqtg8C", "source": "scholar", "publication_info": {"summary": "Romanes Lecture, Oxford, UK 19, 2024"}, "publication": "Romanes Lecture, Oxford, UK 19, 2024", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=JicYPdAAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=JicYPdAAAAAJ:nOKOSwxqtg8C"}, {"title": "Systems and methods for contrastive learning of visual representations", "authors": "T Chen, GE Hinton, S Kornblith, M Norouzi", "year": 2023, "citation_id": "JicYPdAAAAAJ:X41XOdD1uaEC", "result_id": "JicYPdAAAAAJ:X41XOdD1uaEC", "source": "scholar", "publication_info": {"summary": "US Patent 11,847,571, 2023"}, "publication": "US Patent 11,847,571, 2023", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=JicYPdAAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=JicYPdAAAAAJ:X41XOdD1uaEC"}, {"title": "System and method for addressing overfitting in a neural network", "authors": "GE Hinton, A Krizhevsky, I Sutskever, N Srivastava", "year": 2023, "citation_id": "JicYPdAAAAAJ:WsFh9Szeq2wC", "result_id": "JicYPdAAAAAJ:WsFh9Szeq2wC", "source": "scholar", "publication_info": {"summary": "US Patent 11,829,882, 2023"}, "publication": "US Patent 11,829,882, 2023", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=JicYPdAAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=JicYPdAAAAAJ:WsFh9Szeq2wC"}, {"title": "Managing ai risks in an era of rapid progress", "authors": "Y Bengio, G Hinton, A Yao, D Song, P Abbeel, YN Harari, YQ Zhang, ...", "year": 2023, "citation_id": "JicYPdAAAAAJ:8s22W2WWFy4C", "result_id": "JicYPdAAAAAJ:8s22W2WWFy4C", "source": "scholar", "publication_info": {"summary": "arXiv preprint arXiv:2310.17688, 18, 2023"}, "publication": "arXiv preprint arXiv:2310.17688, 18, 2023", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=JicYPdAAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=JicYPdAAAAAJ:8s22W2WWFy4C"}, {"title": "Capsule neural networks", "authors": "GE Hinton, NMW Frosst, SSR Aghdam", "year": 2023, "citation_id": "JicYPdAAAAAJ:4p3FJGzxjgAC", "result_id": "JicYPdAAAAAJ:4p3FJGzxjgAC", "source": "scholar", "publication_info": {"summary": "US Patent 11,694,060, 2023"}, "publication": "US Patent 11,694,060, 2023", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=JicYPdAAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=JicYPdAAAAAJ:4p3FJGzxjgAC"}, {"title": "Robust and data-efficient generalization of self-supervised machine learning for diagnostic imaging", "authors": "S Azizi, L Culp, J Freyberg, B Mustafa, S Baur, S Kornblith, T Chen, ...", "year": 2023, "citation_id": "JicYPdAAAAAJ:aJ-3-MYELVsC", "result_id": "JicYPdAAAAAJ:aJ-3-MYELVsC", "source": "scholar", "publication_info": {"summary": "Nature Biomedical Engineering 7 (6), 756-779, 2023"}, "publication": "Nature Biomedical Engineering 7 (6), 756-779, 2023", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=JicYPdAAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=JicYPdAAAAAJ:aJ-3-MYELVsC"}, {"title": "Statement on AI risk", "authors": "G Hinton, Y Bengio, D Hassabis, S Altman, D Amodei, D Song, T Lieu, ...", "year": 2023, "citation_id": "JicYPdAAAAAJ:Y0agIcFmOsQC", "result_id": "JicYPdAAAAAJ:Y0agIcFmOsQC", "source": "scholar", "publication_info": {"summary": "Center for AI safety 31 (5), 2023, 2023"}, "publication": "Center for AI safety 31 (5), 2023, 2023", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=JicYPdAAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=JicYPdAAAAAJ:Y0agIcFmOsQC"}, {"title": "How to represent part-whole hierarchies in a neural network", "authors": "G Hinton", "year": 2023, "citation_id": "JicYPdAAAAAJ:OkrdTXRNpVkC", "result_id": "JicYPdAAAAAJ:OkrdTXRNpVkC", "source": "scholar", "publication_info": {"summary": "Neural Computation 35 (3), 413-452, 2023"}, "publication": "Neural Computation 35 (3), 413-452, 2023", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=JicYPdAAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=JicYPdAAAAAJ:OkrdTXRNpVkC"}, {"title": "International conference on machine learning", "authors": "W Li, C Wang, G Cheng, Q Song", "year": 2023, "citation_id": "JicYPdAAAAAJ:9mnZQYLiiboC", "result_id": "JicYPdAAAAAJ:9mnZQYLiiboC", "source": "scholar", "publication_info": {"summary": "Transactions on machine learning research, 2023"}, "publication": "Transactions on machine learning research, 2023", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=JicYPdAAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=JicYPdAAAAAJ:9mnZQYLiiboC"}, {"title": "A generalist framework for panoptic segmentation of images and videos", "authors": "T Chen, L Li, S Saxena, G Hinton, DJ Fleet", "year": 2023, "citation_id": "JicYPdAAAAAJ:yRRszJvrVdAC", "result_id": "JicYPdAAAAAJ:yRRszJvrVdAC", "source": "scholar", "publication_info": {"summary": "Proceedings of the IEEE/CVF international conference on computer vision, 909-919, 2023"}, "publication": "Proceedings of the IEEE/CVF international conference on computer vision, 909-919, 2023", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=JicYPdAAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=JicYPdAAAAAJ:yRRszJvrVdAC"}, {"title": "ImageNet classification with deep convolutional neural networks (AlexNet) ImageNet classification with deep convolutional neural networks (AlexNet)", "authors": "A Krizhevsky, I Sutskever, G Hinton", "year": 2023, "citation_id": "JicYPdAAAAAJ:EmjvLWWcsQIC", "result_id": "JicYPdAAAAAJ:EmjvLWWcsQIC", "source": "scholar", "publication_info": {"summary": "Actorsfit. Com, 2023"}, "publication": "Actorsfit. Com, 2023", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=JicYPdAAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=JicYPdAAAAAJ:EmjvLWWcsQIC"}, {"title": "The forward-forward algorithm: Some preliminary investigations", "authors": "G Hinton", "year": 2022, "citation_id": "JicYPdAAAAAJ:2hlgnPHlchoC", "result_id": "JicYPdAAAAAJ:2hlgnPHlchoC", "source": "scholar", "publication_info": {"summary": "arXiv preprint arXiv:2212.13345 2 (3), 5, 2022"}, "publication": "arXiv preprint arXiv:2212.13345 2 (3), 5, 2022", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=JicYPdAAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=JicYPdAAAAAJ:2hlgnPHlchoC"}, {"title": "A unified sequence interface for vision tasks", "authors": "T Chen, S Saxena, L Li, TY Lin, DJ Fleet, GE Hinton", "year": 2022, "citation_id": "JicYPdAAAAAJ:0dtNEdnCFDAC", "result_id": "JicYPdAAAAAJ:0dtNEdnCFDAC", "source": "scholar", "publication_info": {"summary": "Advances in Neural Information Processing Systems 35, 31333-31346, 2022"}, "publication": "Advances in Neural Information Processing Systems 35, 31333-31346, 2022", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=JicYPdAAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=JicYPdAAAAAJ:0dtNEdnCFDAC"}, {"title": "Meta-learning fast weight language models", "authors": "K Clark, K Guu, MW Chang, P Pasupat, G Hinton, M Norouzi", "year": 2022, "citation_id": "JicYPdAAAAAJ:yqZeyBDMhiUC", "result_id": "JicYPdAAAAAJ:yqZeyBDMhiUC", "source": "scholar", "publication_info": {"summary": "Proceedings of the 2022 Conference on Empirical Methods in Natural Language \u2026, 2022"}, "publication": "Proceedings of the 2022 Conference on Empirical Methods in Natural Language \u2026, 2022", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=JicYPdAAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=JicYPdAAAAAJ:yqZeyBDMhiUC"}, {"title": "Testing GLOM's ability to infer wholes from ambiguous parts", "authors": "L Culp, S Sabour, GE Hinton", "year": 2022, "citation_id": "JicYPdAAAAAJ:6_6x9JMR98MC", "result_id": "JicYPdAAAAAJ:6_6x9JMR98MC", "source": "scholar", "publication_info": {"summary": "arXiv preprint arXiv:2211.16564, 2022"}, "publication": "arXiv preprint arXiv:2211.16564, 2022", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=JicYPdAAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=JicYPdAAAAAJ:6_6x9JMR98MC"}, {"title": "Convex representation of objects using neural network", "authors": "B Deng, K Genova, S Yazdani, S Bouaziz, GE Hinton, A TAGLIASACCHI", "year": 2022, "citation_id": "JicYPdAAAAAJ:E10ZYwHxBI8C", "result_id": "JicYPdAAAAAJ:E10ZYwHxBI8C", "source": "scholar", "publication_info": {"summary": "US Patent 11,508,167, 2022"}, "publication": "US Patent 11,508,167, 2022", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=JicYPdAAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=JicYPdAAAAAJ:E10ZYwHxBI8C"}, {"title": "Capsule neural networks", "authors": "GE Hinton, NMW Frosst, SSR Aghdam", "year": 2022, "citation_id": "JicYPdAAAAAJ:1l3MdapXzAoC", "result_id": "JicYPdAAAAAJ:1l3MdapXzAoC", "source": "scholar", "publication_info": {"summary": "US Patent 11,494,609, 2022"}, "publication": "US Patent 11,494,609, 2022", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=JicYPdAAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=JicYPdAAAAAJ:1l3MdapXzAoC"}, {"title": "Gaussian-bernoulli rbms without tears", "authors": "R Liao, S Kornblith, M Ren, DJ Fleet, G Hinton", "year": 2022, "citation_id": "JicYPdAAAAAJ:-Z8x4v2cOtkC", "result_id": "JicYPdAAAAAJ:-Z8x4v2cOtkC", "source": "scholar", "publication_info": {"summary": "arXiv preprint arXiv:2210.10318, 2022"}, "publication": "arXiv preprint arXiv:2210.10318, 2022", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=JicYPdAAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=JicYPdAAAAAJ:-Z8x4v2cOtkC"}, {"title": "Scaling forward gradient with local losses", "authors": "M Ren, S Kornblith, R Liao, G Hinton", "year": 2022, "citation_id": "JicYPdAAAAAJ:8EvVLpklxGMC", "result_id": "JicYPdAAAAAJ:8EvVLpklxGMC", "source": "scholar", "publication_info": {"summary": "arXiv preprint arXiv:2210.03310, 2022"}, "publication": "arXiv preprint arXiv:2210.03310, 2022", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=JicYPdAAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=JicYPdAAAAAJ:8EvVLpklxGMC"}, {"title": "Training distilled machine learning models", "authors": "O Vinyals, JA Dean, GE Hinton", "year": 2022, "citation_id": "JicYPdAAAAAJ:CmbFvBriOyMC", "result_id": "JicYPdAAAAAJ:CmbFvBriOyMC", "source": "scholar", "publication_info": {"summary": "US Patent 11,423,337, 2022"}, "publication": "US Patent 11,423,337, 2022", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=JicYPdAAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=JicYPdAAAAAJ:CmbFvBriOyMC"}, {"title": "Analog bits: Generating discrete data using diffusion models with self-conditioning", "authors": "T Chen, R Zhang, G Hinton", "year": 2022, "citation_id": "JicYPdAAAAAJ:ExBYd_ZNEOYC", "result_id": "JicYPdAAAAAJ:ExBYd_ZNEOYC", "source": "scholar", "publication_info": {"summary": "arXiv preprint arXiv:2208.04202, 2022"}, "publication": "arXiv preprint arXiv:2208.04202, 2022", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=JicYPdAAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=JicYPdAAAAAJ:ExBYd_ZNEOYC"}, {"title": "Systems and methods for contrastive learning of visual representations", "authors": "T Chen, S Kornblith, M Norouzi, GE Hinton, KJ Swersky", "year": 2022, "citation_id": "JicYPdAAAAAJ:-TLX1-BxFiYC", "result_id": "JicYPdAAAAAJ:-TLX1-BxFiYC", "source": "scholar", "publication_info": {"summary": "US Patent 11,386,302, 2022"}, "publication": "US Patent 11,386,302, 2022", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=JicYPdAAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=JicYPdAAAAAJ:-TLX1-BxFiYC"}, {"title": "Systems and methods for contrastive learning of visual representations", "authors": "T Chen, S Kornblith, M Norouzi, GE Hinton", "year": 2022, "citation_id": "JicYPdAAAAAJ:Ltc9rfRcsxEC", "result_id": "JicYPdAAAAAJ:Ltc9rfRcsxEC", "source": "scholar", "publication_info": {"summary": "US Patent 11,354,778, 2022"}, "publication": "US Patent 11,354,778, 2022", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=JicYPdAAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=JicYPdAAAAAJ:Ltc9rfRcsxEC"}, {"title": "Robust and efficient medical imaging with self-supervision", "authors": "S Azizi, L Culp, J Freyberg, B Mustafa, S Baur, S Kornblith, T Chen, ...", "year": 2022, "citation_id": "JicYPdAAAAAJ:H0nRGT7Dr7IC", "result_id": "JicYPdAAAAAJ:H0nRGT7Dr7IC", "source": "scholar", "publication_info": {"summary": "arXiv preprint arXiv:2205.09723, 2022"}, "publication": "arXiv preprint arXiv:2205.09723, 2022", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=JicYPdAAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=JicYPdAAAAAJ:H0nRGT7Dr7IC"}, {"title": "Deep learning. nature, 521 (7553): 436\u2013444, 2015", "authors": "Y LeCun, Y Bengio, G Hinton", "year": 2022, "citation_id": "JicYPdAAAAAJ:lLPirIASiZEC", "result_id": "JicYPdAAAAAJ:lLPirIASiZEC", "source": "scholar", "publication_info": {"summary": "Cited on, 2, 2022"}, "publication": "Cited on, 2, 2022", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=JicYPdAAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=JicYPdAAAAAJ:lLPirIASiZEC"}, {"title": "Canonical capsules: Self-supervised capsules in canonical pose", "authors": "W Sun, A Tagliasacchi, B Deng, S Sabour, S Yazdani, GE Hinton, KM Yi", "year": 2021, "citation_id": "JicYPdAAAAAJ:f13iAvnbnnYC", "result_id": "JicYPdAAAAAJ:f13iAvnbnnYC", "source": "scholar", "publication_info": {"summary": "Advances in Neural information processing systems 34, 24993-25005, 2021"}, "publication": "Advances in Neural information processing systems 34, 24993-25005, 2021", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=JicYPdAAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=JicYPdAAAAAJ:f13iAvnbnnYC"}, {"title": "Neural additive models: Interpretable machine learning with neural nets", "authors": "R Agarwal, L Melnick, N Frosst, X Zhang, B Lengerich, R Caruana, ...", "year": 2021, "citation_id": "JicYPdAAAAAJ:MSzX15-gZgkC", "result_id": "JicYPdAAAAAJ:MSzX15-gZgkC", "source": "scholar", "publication_info": {"summary": "Advances in neural information processing systems 34, 4699-4711, 2021"}, "publication": "Advances in neural information processing systems 34, 4699-4711, 2021", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=JicYPdAAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=JicYPdAAAAAJ:MSzX15-gZgkC"}, {"title": "Pix2seq: A language modeling framework for object detection", "authors": "T Chen, S Saxena, L Li, DJ Fleet, G Hinton", "year": 2021, "citation_id": "JicYPdAAAAAJ:6YFk0eKgftsC", "result_id": "JicYPdAAAAAJ:6YFk0eKgftsC", "source": "scholar", "publication_info": {"summary": "arXiv preprint arXiv:2109.10852, 2021"}, "publication": "arXiv preprint arXiv:2109.10852, 2021", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=JicYPdAAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=JicYPdAAAAAJ:6YFk0eKgftsC"}, {"title": "Unsupervised part representation by flow capsules", "authors": "S Sabour, A Tagliasacchi, S Yazdani, G Hinton, DJ Fleet", "year": 2021, "citation_id": "JicYPdAAAAAJ:RZBefGmQYygC", "result_id": "JicYPdAAAAAJ:RZBefGmQYygC", "source": "scholar", "publication_info": {"summary": "International Conference on Machine Learning, 9213-9223, 2021"}, "publication": "International Conference on Machine Learning, 9213-9223, 2021", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=JicYPdAAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=JicYPdAAAAAJ:RZBefGmQYygC"}, {"title": "Deep learning for AI", "authors": "Y Bengio, Y Lecun, G Hinton", "year": 2021, "citation_id": "JicYPdAAAAAJ:YXPZ0dOdYS4C", "result_id": "JicYPdAAAAAJ:YXPZ0dOdYS4C", "source": "scholar", "publication_info": {"summary": "Communications of the ACM 64 (7), 58-65, 2021"}, "publication": "Communications of the ACM 64 (7), 58-65, 2021", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=JicYPdAAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=JicYPdAAAAAJ:YXPZ0dOdYS4C"}, {"title": "Processing text using neural networks", "authors": "JR Kiros, W Chan, GE Hinton", "year": 2021, "citation_id": "JicYPdAAAAAJ:oE_QS-WwsdAC", "result_id": "JicYPdAAAAAJ:oE_QS-WwsdAC", "source": "scholar", "publication_info": {"summary": "US Patent 11,003,856, 2021"}, "publication": "US Patent 11,003,856, 2021", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=JicYPdAAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=JicYPdAAAAAJ:oE_QS-WwsdAC"}, {"title": "System and method for addressing overfitting in a neural network", "authors": "GE Hinton, A Krizhevsky, I Sutskever, N Srivastava", "year": 2021, "citation_id": "JicYPdAAAAAJ:jtOrAYjvdewC", "result_id": "JicYPdAAAAAJ:jtOrAYjvdewC", "source": "scholar", "publication_info": {"summary": "US Patent 10,977,557, 2021"}, "publication": "US Patent 10,977,557, 2021", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=JicYPdAAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=JicYPdAAAAAJ:jtOrAYjvdewC"}, {"title": "Deep learning for AI", "authors": "H Geoffrey, LC Yann", "year": 2021, "citation_id": "JicYPdAAAAAJ:AU0JsVlt-AkC", "result_id": "JicYPdAAAAAJ:AU0JsVlt-AkC", "source": "scholar", "publication_info": {"summary": "Communications of the ACM 64 (7), 58-65, 2021"}, "publication": "Communications of the ACM 64 (7), 58-65, 2021", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=JicYPdAAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=JicYPdAAAAAJ:AU0JsVlt-AkC"}, {"title": "Neural Additive Models: Interpretable Machine Learning with Neural Networks", "authors": "R Agarwal, L Melnick, N Frosst, B Lengerich, X Zhang, R Caruana, ...", "year": 2021, "citation_id": "JicYPdAAAAAJ:m03se8k-GH0C", "result_id": "JicYPdAAAAAJ:m03se8k-GH0C", "source": "scholar", "publication_info": {"summary": "arXiv, 2021"}, "publication": "arXiv, 2021", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=JicYPdAAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=JicYPdAAAAAJ:m03se8k-GH0C"}, {"title": "Imputer: Sequence modelling via imputation and dynamic programming", "authors": "W Chan, C Saharia, G Hinton, M Norouzi, N Jaitly", "year": 2020, "citation_id": "JicYPdAAAAAJ:-w1eE4La9_EC", "result_id": "JicYPdAAAAAJ:-w1eE4La9_EC", "source": "scholar", "publication_info": {"summary": "International Conference on Machine Learning, 1403-1413, 2020"}, "publication": "International Conference on Machine Learning, 1403-1413, 2020", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=JicYPdAAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=JicYPdAAAAAJ:-w1eE4La9_EC"}, {"title": "A simple framework for contrastive learning of visual representations", "authors": "T Chen, S Kornblith, M Norouzi, G Hinton", "year": 2020, "citation_id": "JicYPdAAAAAJ:G7txJ4jiatkC", "result_id": "JicYPdAAAAAJ:G7txJ4jiatkC", "source": "scholar", "publication_info": {"summary": "International conference on machine learning, 1597-1607, 2020"}, "publication": "International conference on machine learning, 1597-1607, 2020", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=JicYPdAAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=JicYPdAAAAAJ:G7txJ4jiatkC"}, {"title": "Teaching with commentaries", "authors": "A Raghu, M Raghu, S Kornblith, D Duvenaud, G Hinton", "year": 2020, "citation_id": "JicYPdAAAAAJ:v7SMsomtfXcC", "result_id": "JicYPdAAAAAJ:v7SMsomtfXcC", "source": "scholar", "publication_info": {"summary": "arXiv preprint arXiv:2011.03037, 2020"}, "publication": "arXiv preprint arXiv:2011.03037, 2020", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=JicYPdAAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=JicYPdAAAAAJ:v7SMsomtfXcC"}, {"title": "Nasa neural articulated shape approximation", "authors": "B Deng, JP Lewis, T Jeruzalski, G Pons-Moll, G Hinton, M Norouzi, ...", "year": 2020, "citation_id": "JicYPdAAAAAJ:VBDT71xRUdcC", "result_id": "JicYPdAAAAAJ:VBDT71xRUdcC", "source": "scholar", "publication_info": {"summary": "European Conference on Computer Vision, 612-628, 2020"}, "publication": "European Conference on Computer Vision, 612-628, 2020", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=JicYPdAAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=JicYPdAAAAAJ:VBDT71xRUdcC"}, {"title": "The next generation of neural networks", "authors": "G Hinton", "year": 2020, "citation_id": "JicYPdAAAAAJ:h168fVGZblEC", "result_id": "JicYPdAAAAAJ:h168fVGZblEC", "source": "scholar", "publication_info": {"summary": "Proceedings of the 43rd International ACM SIGIR Conference on Research and \u2026, 2020"}, "publication": "Proceedings of the 43rd International ACM SIGIR Conference on Research and \u2026, 2020", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=JicYPdAAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=JicYPdAAAAAJ:h168fVGZblEC"}, {"title": "Backpropagation and the brain", "authors": "TP Lillicrap, A Santoro, L Marris, CJ Akerman, G Hinton", "year": 2020, "citation_id": "JicYPdAAAAAJ:O0MA3yP7Y3UC", "result_id": "JicYPdAAAAAJ:O0MA3yP7Y3UC", "source": "scholar", "publication_info": {"summary": "Nature Reviews Neuroscience 21 (6), 335-346, 2020"}, "publication": "Nature Reviews Neuroscience 21 (6), 335-346, 2020", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=JicYPdAAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=JicYPdAAAAAJ:O0MA3yP7Y3UC"}, {"title": "Training distilled machine learning models", "authors": "O Vinyals, JA Dean, GE Hinton", "year": 2020, "citation_id": "JicYPdAAAAAJ:Dmoar05iI2YC", "result_id": "JicYPdAAAAAJ:Dmoar05iI2YC", "source": "scholar", "publication_info": {"summary": "US Patent 10,650,328, 2020"}, "publication": "US Patent 10,650,328, 2020", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=JicYPdAAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=JicYPdAAAAAJ:Dmoar05iI2YC"}, {"title": "Recurrent neural networks with rectified linear units", "authors": "QV Le, GE Hinton, N Jaitly", "year": 2020, "citation_id": "JicYPdAAAAAJ:lOG7zRu2uA8C", "result_id": "JicYPdAAAAAJ:lOG7zRu2uA8C", "source": "scholar", "publication_info": {"summary": "US Patent 10,635,972, 2020"}, "publication": "US Patent 10,635,972, 2020", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=JicYPdAAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=JicYPdAAAAAJ:lOG7zRu2uA8C"}, {"title": "System and method for parallelizing convolutional neural networks", "authors": "A Krizhevsky, I Sutskever, GE Hinton", "year": 2020, "citation_id": "JicYPdAAAAAJ:GiYFt9mpioMC", "result_id": "JicYPdAAAAAJ:GiYFt9mpioMC", "source": "scholar", "publication_info": {"summary": "US Patent 10,635,966, 2020"}, "publication": "US Patent 10,635,966, 2020", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=JicYPdAAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=JicYPdAAAAAJ:GiYFt9mpioMC"}, {"title": "Deflecting adversarial attacks", "authors": "Y Qin, N Frosst, C Raffel, G Cottrell, G Hinton", "year": 2020, "citation_id": "JicYPdAAAAAJ:TY5xIG7f_2sC", "result_id": "JicYPdAAAAAJ:TY5xIG7f_2sC", "source": "scholar", "publication_info": {"summary": "arXiv preprint arXiv:2002.07405, 2020"}, "publication": "arXiv preprint arXiv:2002.07405, 2020", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=JicYPdAAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=JicYPdAAAAAJ:TY5xIG7f_2sC"}, {"title": "Subclass distillation", "authors": "R M\u00fcller, S Kornblith, G Hinton", "year": 2020, "citation_id": "JicYPdAAAAAJ:beqBT5984LEC", "result_id": "JicYPdAAAAAJ:beqBT5984LEC", "source": "scholar", "publication_info": {"summary": "arXiv preprint arXiv:2002.03936, 2020"}, "publication": "arXiv preprint arXiv:2002.03936, 2020", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=JicYPdAAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=JicYPdAAAAAJ:beqBT5984LEC"}, {"title": "A Simple Framework for Contrastive Learning of Visual Representations. arXiv e-prints, art", "authors": "T Chen, S Kornblith, M Norouzi, G Hinton", "year": 2020, "citation_id": "JicYPdAAAAAJ:tDdgxD0hSQMC", "result_id": "JicYPdAAAAAJ:tDdgxD0hSQMC", "source": "scholar", "publication_info": {"summary": "arXiv preprint arXiv:2002.05709, 2020"}, "publication": "arXiv preprint arXiv:2002.05709, 2020", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=JicYPdAAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=JicYPdAAAAAJ:tDdgxD0hSQMC"}, {"title": "January 13-18). A simple framework for contrastive learning of visual representations. Proceedings of the International Conference on Machine Learning, PMLR, Virtual", "authors": "T Chen, S Kornblith, M Norouzi, G Hinton", "year": 2020, "citation_id": "JicYPdAAAAAJ:6Dd5luMImnEC", "result_id": "JicYPdAAAAAJ:6Dd5luMImnEC", "source": "scholar", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=JicYPdAAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=JicYPdAAAAAJ:6Dd5luMImnEC"}, {"title": "A simple framework for contrastive learning of visual representations. ICML", "authors": "T Chen, S Kornblith, M Norouzi, G Hinton", "year": 2020, "citation_id": "JicYPdAAAAAJ:8LfMcXwVQboC", "result_id": "JicYPdAAAAAJ:8LfMcXwVQboC", "source": "scholar", "publication_info": {"summary": "arXiv preprint arXiv:2002.05709, 2020"}, "publication": "arXiv preprint arXiv:2002.05709, 2020", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=JicYPdAAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=JicYPdAAAAAJ:8LfMcXwVQboC"}, {"title": "Simclr: A simple framework for contrastive learning of visual representations [C]", "authors": "T Chen, S Kornblith, M Norouzi, G Hinton", "year": 2020, "citation_id": "JicYPdAAAAAJ:5Y7y0xowK3MC", "result_id": "JicYPdAAAAAJ:5Y7y0xowK3MC", "source": "scholar", "publication_info": {"summary": "International Con-ference on Learning Representations 2, 2020"}, "publication": "International Con-ference on Learning Representations 2, 2020", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=JicYPdAAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=JicYPdAAAAAJ:5Y7y0xowK3MC"}, {"title": "ICML", "authors": "T Chen, S Kornblith, M Norouzi, G Hinton", "year": 2020, "citation_id": "JicYPdAAAAAJ:njp6nI0QjqAC", "result_id": "JicYPdAAAAAJ:njp6nI0QjqAC", "source": "scholar", "publication_info": {"summary": "ICML, 2020"}, "publication": "ICML, 2020", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=JicYPdAAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=JicYPdAAAAAJ:njp6nI0QjqAC"}, {"title": "A Simple Framework for Contrastive Learning of Visual Representations. arXiv. org", "authors": "T Chen, S Kornblith, M Norouzi, G Hinton", "year": 2020, "citation_id": "JicYPdAAAAAJ:6TexfgwXQfYC", "result_id": "JicYPdAAAAAJ:6TexfgwXQfYC", "source": "scholar", "publication_info": {"summary": "February, 2020"}, "publication": "February, 2020", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=JicYPdAAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=JicYPdAAAAAJ:6TexfgwXQfYC"}, {"title": "Scaling RBMs to High Dimensional Data with Invertible Neural Networks", "authors": "W Grathwohl, X Li, K Swersky, M Hashemi, JH Jacobsen, M Norouzi, ...", "year": 2020, "citation_id": "JicYPdAAAAAJ:QndmRo8phpgC", "result_id": "JicYPdAAAAAJ:QndmRo8phpgC", "source": "scholar", "publication_info": {"summary": "ICML Workshop on Invertible Neural Networks, Normalizing Flows, and Explicit \u2026, 2020"}, "publication": "ICML Workshop on Invertible Neural Networks, Normalizing Flows, and Explicit \u2026, 2020", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=JicYPdAAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=JicYPdAAAAAJ:QndmRo8phpgC"}, {"title": "Rmsprop gradient optimization (2014)", "authors": "T Tieleman, G Hinton", "year": 2020, "citation_id": "JicYPdAAAAAJ:uqZYSrDi9MMC", "result_id": "JicYPdAAAAAJ:uqZYSrDi9MMC", "source": "scholar", "publication_info": {"summary": "URL http://www. cs. toronto. edu/~ tijmen/csc321/slides/lecture_slides_lec6. pdf, 2020"}, "publication": "URL http://www. cs. toronto. edu/~ tijmen/csc321/slides/lecture_slides_lec6. pdf, 2020", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=JicYPdAAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=JicYPdAAAAAJ:uqZYSrDi9MMC"}, {"title": "The CIFAR-10 dataset (2014)", "authors": "A Krizhevsky, V Nair, G Hinton", "year": 2020, "citation_id": "JicYPdAAAAAJ:kcGNQN_anIUC", "result_id": "JicYPdAAAAAJ:kcGNQN_anIUC", "source": "scholar", "publication_info": {"summary": "Online: http://www. cs. toronto. edu/kriz/cifar. html 55, 2020"}, "publication": "Online: http://www. cs. toronto. edu/kriz/cifar. html 55, 2020", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=JicYPdAAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=JicYPdAAAAAJ:kcGNQN_anIUC"}, {"title": "Big self-supervised models are strong semi-supervised learners", "authors": "T Chen, S Kornblith, K Swersky, M Norouzi, GE Hinton", "year": 2020, "citation_id": "JicYPdAAAAAJ:pwA0zy_liR0C", "result_id": "JicYPdAAAAAJ:pwA0zy_liR0C", "source": "scholar", "publication_info": {"summary": "Advances in neural information processing systems 33, 22243-22255, 2020"}, "publication": "Advances in neural information processing systems 33, 22243-22255, 2020", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=JicYPdAAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=JicYPdAAAAAJ:pwA0zy_liR0C"}, {"title": "Cvxnet: Learnable convex decomposition", "authors": "B Deng, K Genova, S Yazdani, S Bouaziz, G Hinton, A Tagliasacchi", "year": 2020, "citation_id": "JicYPdAAAAAJ:WTQy_8Ay2UsC", "result_id": "JicYPdAAAAAJ:WTQy_8Ay2UsC", "source": "scholar", "publication_info": {"summary": "Proceedings of the IEEE/CVF conference on computer vision and pattern \u2026, 2020"}, "publication": "Proceedings of the IEEE/CVF conference on computer vision and pattern \u2026, 2020", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=JicYPdAAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=JicYPdAAAAAJ:WTQy_8Ay2UsC"}, {"title": "When does label smoothing help", "authors": "M Rafael, K Simon, H Geoffrey", "year": 2019, "citation_id": "JicYPdAAAAAJ:5AlGpL-oHpAC", "result_id": "JicYPdAAAAAJ:5AlGpL-oHpAC", "source": "scholar", "publication_info": {"summary": "Advances in neural information processing systems 32, 2019"}, "publication": "Advances in neural information processing systems 32, 2019", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=JicYPdAAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=JicYPdAAAAAJ:5AlGpL-oHpAC"}, {"title": "Prediction of postoperative length of hospital stay based on differences in nursing narratives in elderly patients with epithelial ovarian cancer", "authors": "K Kim, Y Han, S Jeong, K Doh, HA Park, K Lee, M Cho, S Ahn", "year": 2019, "citation_id": "JicYPdAAAAAJ:WMj-6b1RDO4C", "result_id": "JicYPdAAAAAJ:WMj-6b1RDO4C", "source": "scholar", "publication_info": {"summary": "Methods of Information in Medicine 58 (06), 222-228, 2019"}, "publication": "Methods of Information in Medicine 58 (06), 222-228, 2019", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=JicYPdAAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=JicYPdAAAAAJ:WMj-6b1RDO4C"}, {"title": "From Photographic Image to Computer Vision", "authors": "SA Krizhevsky, I Sutskever, GE Hinton", "year": 2019, "citation_id": "JicYPdAAAAAJ:Pm-n7EBaiV4C", "result_id": "JicYPdAAAAAJ:Pm-n7EBaiV4C", "source": "scholar", "publication_info": {"summary": "Cambridge University Press, 2019"}, "publication": "Cambridge University Press, 2019", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=JicYPdAAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=JicYPdAAAAAJ:Pm-n7EBaiV4C"}, {"title": "Separation of HCM and LQT cardiac diseases with machine learning of Ca2+ transient profiles", "authors": "H Joutsijoki, K Penttinen, M Juhola, K Aalto-Set\u00e4l\u00e4", "year": 2019, "citation_id": "JicYPdAAAAAJ:OP2qWFMeUpEC", "result_id": "JicYPdAAAAAJ:OP2qWFMeUpEC", "source": "scholar", "publication_info": {"summary": "Methods of Information in Medicine 58 (04/05), 167-178, 2019"}, "publication": "Methods of Information in Medicine 58 (04/05), 167-178, 2019", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=JicYPdAAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=JicYPdAAAAAJ:OP2qWFMeUpEC"}, {"title": "Representing part-whole hierarchies in connectionist networks", "authors": "GE Hinton", "year": 2019, "citation_id": "JicYPdAAAAAJ:lvd772isFD0C", "result_id": "JicYPdAAAAAJ:lvd772isFD0C", "source": "scholar", "publication_info": {"summary": "10th Annual Conference Cognitive Science Society Pod, 48-54, 2019"}, "publication": "10th Annual Conference Cognitive Science Society Pod, 48-54, 2019", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=JicYPdAAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=JicYPdAAAAAJ:lvd772isFD0C"}, {"title": "System and method for addressing overfitting in a neural network", "authors": "GE Hinton, A Krizhevsky, I Sutskever, N Srivastava", "year": 2019, "citation_id": "JicYPdAAAAAJ:Oo1CbQkBAzEC", "result_id": "JicYPdAAAAAJ:Oo1CbQkBAzEC", "source": "scholar", "publication_info": {"summary": "US Patent 10,366,329, 2019"}, "publication": "US Patent 10,366,329, 2019", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=JicYPdAAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=JicYPdAAAAAJ:Oo1CbQkBAzEC"}, {"title": "Detecting and diagnosing adversarial images with class-conditional capsule reconstructions", "authors": "Y Qin, N Frosst, S Sabour, C Raffel, G Cottrell, G Hinton", "year": 2019, "citation_id": "JicYPdAAAAAJ:p-HGrieyzrAC", "result_id": "JicYPdAAAAAJ:p-HGrieyzrAC", "source": "scholar", "publication_info": {"summary": "arXiv preprint arXiv:1907.02957, 2019"}, "publication": "arXiv preprint arXiv:1907.02957, 2019", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=JicYPdAAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=JicYPdAAAAAJ:p-HGrieyzrAC"}, {"title": "Learning sparse networks using targeted dropout", "authors": "AN Gomez, I Zhang, SR Kamalakara, D Madaan, K Swersky, Y Gal, ...", "year": 2019, "citation_id": "JicYPdAAAAAJ:3WNXLiBY60kC", "result_id": "JicYPdAAAAAJ:3WNXLiBY60kC", "source": "scholar", "publication_info": {"summary": "arXiv preprint arXiv:1905.13678, 2019"}, "publication": "arXiv preprint arXiv:1905.13678, 2019", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=JicYPdAAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=JicYPdAAAAAJ:3WNXLiBY60kC"}, {"title": "Cerberus: A multi-headed derenderer", "authors": "B Deng, S Kornblith, G Hinton", "year": 2019, "citation_id": "JicYPdAAAAAJ:WGv8Og3F3KgC", "result_id": "JicYPdAAAAAJ:WGv8Og3F3KgC", "source": "scholar", "publication_info": {"summary": "arXiv preprint arXiv:1905.11940, 2019"}, "publication": "arXiv preprint arXiv:1905.11940, 2019", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=JicYPdAAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=JicYPdAAAAAJ:WGv8Og3F3KgC"}, {"title": "Similarity of neural network representations revisited", "authors": "S Kornblith, M Norouzi, H Lee, G Hinton", "year": 2019, "citation_id": "JicYPdAAAAAJ:E2bRg1zSkIsC", "result_id": "JicYPdAAAAAJ:E2bRg1zSkIsC", "source": "scholar", "publication_info": {"summary": "International conference on machine learning, 3519-3529, 2019"}, "publication": "International conference on machine learning, 3519-3529, 2019", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=JicYPdAAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=JicYPdAAAAAJ:E2bRg1zSkIsC"}, {"title": "Analyzing and improving representations with the soft nearest neighbor loss", "authors": "N Frosst, N Papernot, G Hinton", "year": 2019, "citation_id": "JicYPdAAAAAJ:fF_gHTpLxhAC", "result_id": "JicYPdAAAAAJ:fF_gHTpLxhAC", "source": "scholar", "publication_info": {"summary": "International conference on machine learning, 2012-2020, 2019"}, "publication": "International conference on machine learning, 2012-2020, 2019", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=JicYPdAAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=JicYPdAAAAAJ:fF_gHTpLxhAC"}, {"title": "Training distilled machine learning models", "authors": "O Vinyals, JA Dean, GE Hinton", "year": 2019, "citation_id": "JicYPdAAAAAJ:ibZ2AwG9z6wC", "result_id": "JicYPdAAAAAJ:ibZ2AwG9z6wC", "source": "scholar", "publication_info": {"summary": "US Patent 10,289,962, 2019"}, "publication": "US Patent 10,289,962, 2019", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=JicYPdAAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=JicYPdAAAAAJ:ibZ2AwG9z6wC"}, {"title": "Imagenet classification with deep convolutional neural networks, 2012", "authors": "A Krizhevsky, I Sutskever, GE Hinton", "year": 2019, "citation_id": "JicYPdAAAAAJ:SFOYbPikdlgC", "result_id": "JicYPdAAAAAJ:SFOYbPikdlgC", "source": "scholar", "publication_info": {"summary": "Advances in neural information processing systems 25 (13), 770-778, 2019"}, "publication": "Advances in neural information processing systems 25 (13), 770-778, 2019", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=JicYPdAAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=JicYPdAAAAAJ:SFOYbPikdlgC"}, {"title": "When does label smoothing help? arXiv preprint", "authors": "R M\u00fcller, S Kornblith, G Hinton", "year": 2019, "citation_id": "JicYPdAAAAAJ:5Klqo5HVOaoC", "result_id": "JicYPdAAAAAJ:5Klqo5HVOaoC", "source": "scholar", "publication_info": {"summary": "arXiv preprint arXiv:1906.02629, 2019"}, "publication": "arXiv preprint arXiv:1906.02629, 2019", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=JicYPdAAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=JicYPdAAAAAJ:5Klqo5HVOaoC"}, {"title": "ImageNet classification with deep convolutional neural networks. 2012: 1097\u20131105", "authors": "A Krizhevsky, I Sutskever, GE Hinton", "year": 2019, "citation_id": "JicYPdAAAAAJ:GjXqcohcbckC", "result_id": "JicYPdAAAAAJ:GjXqcohcbckC", "source": "scholar", "publication_info": {"summary": "Last accessed Oct 1, 2019"}, "publication": "Last accessed Oct 1, 2019", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=JicYPdAAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=JicYPdAAAAAJ:GjXqcohcbckC"}, {"title": "Lookahead Optimizer: k steps forward, 1 step back. arXiv", "authors": "MR Zhang, J Lucas, G Hinton, J Ba", "year": 2019, "citation_id": "JicYPdAAAAAJ:j33aPA1ap8EC", "result_id": "JicYPdAAAAAJ:j33aPA1ap8EC", "source": "scholar", "publication_info": {"summary": "arXiv preprint arXiv:1907.08610, 2019"}, "publication": "arXiv preprint arXiv:1907.08610, 2019", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=JicYPdAAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=JicYPdAAAAAJ:j33aPA1ap8EC"}, {"title": "The deep learning revolution", "authors": "G Hinton, Y LeCun", "year": 2019, "citation_id": "JicYPdAAAAAJ:lL5f5cZgq8MC", "result_id": "JicYPdAAAAAJ:lL5f5cZgq8MC", "source": "scholar", "publication_info": {"summary": "Turing Lecture at FCRC, 2019"}, "publication": "Turing Lecture at FCRC, 2019", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=JicYPdAAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=JicYPdAAAAAJ:lL5f5cZgq8MC"}, {"title": "Lookahead optimizer: k steps forward, 1 step back", "authors": "M Zhang, J Lucas, J Ba, GE Hinton", "year": 2019, "citation_id": "JicYPdAAAAAJ:zfsRRabFVBUC", "result_id": "JicYPdAAAAAJ:zfsRRabFVBUC", "source": "scholar", "publication_info": {"summary": "Advances in neural information processing systems 32, 2019"}, "publication": "Advances in neural information processing systems 32, 2019", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=JicYPdAAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=JicYPdAAAAAJ:zfsRRabFVBUC"}, {"title": "Stacked capsule autoencoders", "authors": "A Kosiorek, S Sabour, YW Teh, GE Hinton", "year": 2019, "citation_id": "JicYPdAAAAAJ:WHBERAHVdrEC", "result_id": "JicYPdAAAAAJ:WHBERAHVdrEC", "source": "scholar", "publication_info": {"summary": "Advances in neural information processing systems 32, 2019"}, "publication": "Advances in neural information processing systems 32, 2019", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=JicYPdAAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=JicYPdAAAAAJ:WHBERAHVdrEC"}, {"title": "When does label smoothing help?", "authors": "R M\u00fcller, S Kornblith, GE Hinton", "year": 2019, "citation_id": "JicYPdAAAAAJ:Kv9jytqXTosC", "result_id": "JicYPdAAAAAJ:Kv9jytqXTosC", "source": "scholar", "publication_info": {"summary": "Advances in neural information processing systems 32, 2019"}, "publication": "Advances in neural information processing systems 32, 2019", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=JicYPdAAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=JicYPdAAAAAJ:Kv9jytqXTosC"}, {"title": "Neural Networks for Machine Learning, Lecture 15a", "authors": "G Hinton", "year": 2019, "citation_id": "JicYPdAAAAAJ:9tXw7Op4-u0C", "result_id": "JicYPdAAAAAJ:9tXw7Op4-u0C", "source": "scholar", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=JicYPdAAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=JicYPdAAAAAJ:9tXw7Op4-u0C"}, {"title": "Targeted dropout", "authors": "AN Gomez, I Zhang, K Swersky, Y Gal, GE Hinton", "year": 2018, "citation_id": "JicYPdAAAAAJ:-mAZECE-jN4C", "result_id": "JicYPdAAAAAJ:-mAZECE-jN4C", "source": "scholar", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=JicYPdAAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=JicYPdAAAAAJ:-mAZECE-jN4C"}, {"title": "Darccc: Detecting adversaries by reconstruction from class conditional capsules", "authors": "N Frosst, S Sabour, G Hinton", "year": 2018, "citation_id": "JicYPdAAAAAJ:bbjcffOLshcC", "result_id": "JicYPdAAAAAJ:bbjcffOLshcC", "source": "scholar", "publication_info": {"summary": "arXiv preprint arXiv:1811.06969, 2018"}, "publication": "arXiv preprint arXiv:1811.06969, 2018", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=JicYPdAAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=JicYPdAAAAAJ:bbjcffOLshcC"}, {"title": "Deep learning\u2014a technology with the potential to transform health care", "authors": "G Hinton", "year": 2018, "citation_id": "JicYPdAAAAAJ:oXKBmVzQOggC", "result_id": "JicYPdAAAAAJ:oXKBmVzQOggC", "source": "scholar", "publication_info": {"summary": "Jama 320 (11), 1101-1102, 2018"}, "publication": "Jama 320 (11), 1101-1102, 2018", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=JicYPdAAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=JicYPdAAAAAJ:oXKBmVzQOggC"}], "search_metadata": {"status": "Success", "source": "serpapi"}}} \ No newline at end of file +{"timestamp": 1782987677.5504565, "data": {"articles": [{"title": "Artificial intelligence as the fourth decentering revolution: From cosmic, biological, and psychological displacement to cognitive decentering", "authors": "E Cambria, R Mao, N Bianchi, A Hussain, K Oatley, G Hinton", "year": 2026, "citation_id": "JicYPdAAAAAJ:h7-KW5G1enMC", "result_id": "JicYPdAAAAAJ:h7-KW5G1enMC", "source": "scholar", "publication_info": {"summary": "Cognitive Computation 18 (1), 20, 2026"}, "publication": "Cognitive Computation 18 (1), 20, 2026", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=JicYPdAAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=JicYPdAAAAAJ:h7-KW5G1enMC"}, {"title": "Training distilled machine learning models", "authors": "O Vinyals, JA Dean, GE Hinton", "year": 2026, "citation_id": "JicYPdAAAAAJ:QppYajJO_VYC", "result_id": "JicYPdAAAAAJ:QppYajJO_VYC", "source": "scholar", "publication_info": {"summary": "US Patent App. 19/438,515, 2026"}, "publication": "US Patent App. 19/438,515, 2026", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=JicYPdAAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=JicYPdAAAAAJ:QppYajJO_VYC"}, {"title": "Training distilled machine learning models", "authors": "O Vinyals, JA Dean, GE Hinton", "year": 2026, "citation_id": "JicYPdAAAAAJ:E8M3ZPqbjf0C", "result_id": "JicYPdAAAAAJ:E8M3ZPqbjf0C", "source": "scholar", "publication_info": {"summary": "US Patent App. 19/438,522, 2026"}, "publication": "US Patent App. 19/438,522, 2026", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=JicYPdAAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=JicYPdAAAAAJ:E8M3ZPqbjf0C"}, {"title": "Training distilled machine learning models", "authors": "O Vinyals, JA Dean, GE Hinton", "year": 2026, "citation_id": "JicYPdAAAAAJ:aXQ7jtEqGowC", "result_id": "JicYPdAAAAAJ:aXQ7jtEqGowC", "source": "scholar", "publication_info": {"summary": "US Patent App. 19/438,532, 2026"}, "publication": "US Patent App. 19/438,532, 2026", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=JicYPdAAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=JicYPdAAAAAJ:aXQ7jtEqGowC"}, {"title": "Scaling Forward Gradient with Local Optimization", "authors": "S Kornblith, GE Hinton, M Ren, R Liao", "year": 2026, "citation_id": "JicYPdAAAAAJ:eiwtZcG9oBcC", "result_id": "JicYPdAAAAAJ:eiwtZcG9oBcC", "source": "scholar", "publication_info": {"summary": "US Patent App. 19/115,699, 2026"}, "publication": "US Patent App. 19/115,699, 2026", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=JicYPdAAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=JicYPdAAAAAJ:eiwtZcG9oBcC"}, {"title": "International ai safety report 2026", "authors": "Y Bengio, S Clare, C Prunkl, M Andriushchenko, B Bucknall, M Murray, ...", "year": 2026, "citation_id": "JicYPdAAAAAJ:yY8dUDjMDt8C", "result_id": "JicYPdAAAAAJ:yY8dUDjMDt8C", "source": "scholar", "publication_info": {"summary": "arXiv preprint arXiv:2602.21012, 2026"}, "publication": "arXiv preprint arXiv:2602.21012, 2026", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=JicYPdAAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=JicYPdAAAAAJ:yY8dUDjMDt8C"}, {"title": "Using Artificial Intelligence to Optimize Sustainable Branding and Digital Green Advertising", "authors": "G Hinton, Y LeCun, Y Bengio, A Ng, FF Li, I Goodfellow, F Chollet", "year": 2026, "citation_id": "JicYPdAAAAAJ:GpOSJs1ZbLkC", "result_id": "JicYPdAAAAAJ:GpOSJs1ZbLkC", "source": "scholar", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=JicYPdAAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=JicYPdAAAAAJ:GpOSJs1ZbLkC"}, {"title": "Training distilled machine learning models", "authors": "O Vinyals, JA Dean, GE Hinton", "year": 2026, "citation_id": "JicYPdAAAAAJ:b9WrW9Envh0C", "result_id": "JicYPdAAAAAJ:b9WrW9Envh0C", "source": "scholar", "publication_info": {"summary": "US Patent 12,536,478, 2026"}, "publication": "US Patent 12,536,478, 2026", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=JicYPdAAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=JicYPdAAAAAJ:b9WrW9Envh0C"}, {"title": "International ai safety report 2025: Second key update: Technical safeguards and risk management", "authors": "Y Bengio, S Clare, C Prunkl, M Andriushchenko, B Bucknall, P Fox, ...", "year": 2025, "citation_id": "JicYPdAAAAAJ:W2VW_RKN1OwC", "result_id": "JicYPdAAAAAJ:W2VW_RKN1OwC", "source": "scholar", "publication_info": {"summary": "arXiv preprint arXiv:2511.19863, 2025"}, "publication": "arXiv preprint arXiv:2511.19863, 2025", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=JicYPdAAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=JicYPdAAAAAJ:W2VW_RKN1OwC"}, {"title": "Balancing Accuracy, Transparency, and Efficiency in AI-Based Intrusion Detection Systems", "authors": "GE Hinton, RR Salakhutdinov, I Goodfellow, Y Bengio, A Courville, ...", "year": 2025, "citation_id": "JicYPdAAAAAJ:E9iozgzfyhkC", "result_id": "JicYPdAAAAAJ:E9iozgzfyhkC", "source": "scholar", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=JicYPdAAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=JicYPdAAAAAJ:E9iozgzfyhkC"}, {"title": "International AI Safety Report 2025: First Key Update: Capabilities and Risk Implications", "authors": "Y Bengio, S Clare, C Prunkl, S Rismani, M Andriushchenko, B Bucknall, ...", "year": 2025, "citation_id": "JicYPdAAAAAJ:8NHCvSvNRCIC", "result_id": "JicYPdAAAAAJ:8NHCvSvNRCIC", "source": "scholar", "publication_info": {"summary": "arXiv preprint arXiv:2510.13653, 2025"}, "publication": "arXiv preprint arXiv:2510.13653, 2025", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=JicYPdAAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=JicYPdAAAAAJ:8NHCvSvNRCIC"}, {"title": "Performing computer vision tasks by generating sequences of tokens", "authors": "T Chen, DJ FLEET, GE Hinton, Y Li, S SAXENA, TY Lin", "year": 2025, "citation_id": "JicYPdAAAAAJ:WD7AgJrCjNIC", "result_id": "JicYPdAAAAAJ:WD7AgJrCjNIC", "source": "scholar", "publication_info": {"summary": "US Patent App. 18/867,142, 2025"}, "publication": "US Patent App. 18/867,142, 2025", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=JicYPdAAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=JicYPdAAAAAJ:WD7AgJrCjNIC"}, {"title": "Nobel lecture: Boltzmann machines", "authors": "G Hinton", "year": 2025, "citation_id": "JicYPdAAAAAJ:PPAp3RzCAaIC", "result_id": "JicYPdAAAAAJ:PPAp3RzCAaIC", "source": "scholar", "publication_info": {"summary": "Reviews of Modern Physics 97 (3), 030502, 2025"}, "publication": "Reviews of Modern Physics 97 (3), 030502, 2025", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=JicYPdAAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=JicYPdAAAAAJ:PPAp3RzCAaIC"}, {"title": "Augmented Reality as Techno Scenography in Nigerian Theatre: Exploring Artistic Innovation, Audience Immersion, and Performance Transformation under Digital Constraints", "authors": "Y Bengio, G Hinton, Y LeCun, A Ng, IG Li, S Russell", "year": 2025, "citation_id": "JicYPdAAAAAJ:5qu0sgD3nvwC", "result_id": "JicYPdAAAAAJ:5qu0sgD3nvwC", "source": "scholar", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=JicYPdAAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=JicYPdAAAAAJ:5qu0sgD3nvwC"}, {"title": "Detecting objects in images by generating sequences of tokens", "authors": "T Chen, S SAXENA, Y Li, GE Hinton, DJ FLEET", "year": 2025, "citation_id": "JicYPdAAAAAJ:2BeMVx_SZpEC", "result_id": "JicYPdAAAAAJ:2BeMVx_SZpEC", "source": "scholar", "publication_info": {"summary": "US Patent App. 18/690,550, 2025"}, "publication": "US Patent App. 18/690,550, 2025", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=JicYPdAAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=JicYPdAAAAAJ:2BeMVx_SZpEC"}, {"title": "Systems and methods for contrastive learning of visual representations", "authors": "T Chen, S Komblith, M Norouzi, GE Hinton, KJ Swersky", "year": 2025, "citation_id": "JicYPdAAAAAJ:-rwTIRUNLawC", "result_id": "JicYPdAAAAAJ:-rwTIRUNLawC", "source": "scholar", "publication_info": {"summary": "US Patent 12,254,413, 2025"}, "publication": "US Patent 12,254,413, 2025", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=JicYPdAAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=JicYPdAAAAAJ:-rwTIRUNLawC"}, {"title": "Systems and Methods for Contrastive Learning of Visual Representations", "authors": "T Chen, S Komblith, M Norouzi, GE Hinton, KJ Swersky", "year": 2025, "citation_id": "JicYPdAAAAAJ:twffdjNOitAC", "result_id": "JicYPdAAAAAJ:twffdjNOitAC", "source": "scholar", "publication_info": {"summary": "US Patent App. 18/960,623, 2025"}, "publication": "US Patent App. 18/960,623, 2025", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=JicYPdAAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=JicYPdAAAAAJ:twffdjNOitAC"}, {"title": "Sequence modeling using imputation", "authors": "W Chan, C Saharia, GE Hinton, M Norouzi, N Jaitly", "year": 2025, "citation_id": "JicYPdAAAAAJ:LZ55yeyZZb4C", "result_id": "JicYPdAAAAAJ:LZ55yeyZZb4C", "source": "scholar", "publication_info": {"summary": "US Patent 12,242,818, 2025"}, "publication": "US Patent 12,242,818, 2025", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=JicYPdAAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=JicYPdAAAAAJ:LZ55yeyZZb4C"}, {"title": "Generating discrete data using diffusion neural networks", "authors": "T Chen, R Zhang, GE Hinton", "year": 2025, "citation_id": "JicYPdAAAAAJ:Huv_iBJ06lEC", "result_id": "JicYPdAAAAAJ:Huv_iBJ06lEC", "source": "scholar", "publication_info": {"summary": "US Patent App. 18/366,638, 2025"}, "publication": "US Patent App. 18/366,638, 2025", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=JicYPdAAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=JicYPdAAAAAJ:Huv_iBJ06lEC"}, {"title": "International ai safety report", "authors": "Y Bengio, S Mindermann, D Privitera, T Besiroglu, R Bommasani, ...", "year": 2025, "citation_id": "JicYPdAAAAAJ:VDARjI3xf8gC", "result_id": "JicYPdAAAAAJ:VDARjI3xf8gC", "source": "scholar", "publication_info": {"summary": "arXiv preprint arXiv:2501.17805, 2025"}, "publication": "arXiv preprint arXiv:2501.17805, 2025", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=JicYPdAAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=JicYPdAAAAAJ:VDARjI3xf8gC"}, {"title": "System and method for parallelizing convolutional neural networks", "authors": "A Krizhevsky, I Sutskever, GE Hinton", "year": 2024, "citation_id": "JicYPdAAAAAJ:UO6ax3c-pNsC", "result_id": "JicYPdAAAAAJ:UO6ax3c-pNsC", "source": "scholar", "publication_info": {"summary": "US Patent App. 18/438,368, 2024"}, "publication": "US Patent App. 18/438,368, 2024", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=JicYPdAAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=JicYPdAAAAAJ:UO6ax3c-pNsC"}, {"title": "Object discovery in images through categorizing object parts", "authors": "AR Kosiorek, GE Hinton, SSR Aghdam, YW Teh", "year": 2024, "citation_id": "JicYPdAAAAAJ:AOwgc6nnr1EC", "result_id": "JicYPdAAAAAJ:AOwgc6nnr1EC", "source": "scholar", "publication_info": {"summary": "US Patent 12,067,758, 2024"}, "publication": "US Patent 12,067,758, 2024", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=JicYPdAAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=JicYPdAAAAAJ:AOwgc6nnr1EC"}, {"title": "Managing extreme AI risks amid rapid progress", "authors": "Y Bengio, G Hinton, A Yao, D Song, P Abbeel, T Darrell, YN Harari, ...", "year": 2024, "citation_id": "JicYPdAAAAAJ:2C0LhDdYSbcC", "result_id": "JicYPdAAAAAJ:2C0LhDdYSbcC", "source": "scholar", "publication_info": {"summary": "Science 384 (6698), 842-845, 2024"}, "publication": "Science 384 (6698), 842-845, 2024", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=JicYPdAAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=JicYPdAAAAAJ:2C0LhDdYSbcC"}, {"title": "Convex representation of objects using neural network", "authors": "B Deng, K Genova, S Yazdani, S Bouaziz, GE Hinton, A TAGLIASACCHI", "year": 2024, "citation_id": "JicYPdAAAAAJ:MaiMEk8tZqMC", "result_id": "JicYPdAAAAAJ:MaiMEk8tZqMC", "source": "scholar", "publication_info": {"summary": "US Patent 11,978,268, 2024"}, "publication": "US Patent 11,978,268, 2024", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=JicYPdAAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=JicYPdAAAAAJ:MaiMEk8tZqMC"}, {"title": "Neural network training using the soft nearest neighbor loss", "authors": "GE Hinton, NMW Frosst, NGR Papernot", "year": 2024, "citation_id": "JicYPdAAAAAJ:-0tLmPFCw2kC", "result_id": "JicYPdAAAAAJ:-0tLmPFCw2kC", "source": "scholar", "publication_info": {"summary": "US Patent 11,941,867, 2024"}, "publication": "US Patent 11,941,867, 2024", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=JicYPdAAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=JicYPdAAAAAJ:-0tLmPFCw2kC"}, {"title": "System and method for parallelizing convolutional neural networks", "authors": "A Krizhevsky, I Sutskever, GE Hinton", "year": 2024, "citation_id": "JicYPdAAAAAJ:H-3wYkpcA84C", "result_id": "JicYPdAAAAAJ:H-3wYkpcA84C", "source": "scholar", "publication_info": {"summary": "US Patent 11,928,577, 2024"}, "publication": "US Patent 11,928,577, 2024", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=JicYPdAAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=JicYPdAAAAAJ:H-3wYkpcA84C"}, {"title": "Explainable and Secure Ensemble Learning Framework for Quantitative Risk Prediction Benchmarking in US Regulated Decision Support Systems Using AUC/F1 Performance and \u2026", "authors": "G Hinton, Y LeCun", "year": 2024, "citation_id": "JicYPdAAAAAJ:N4e_798Z1OgC", "result_id": "JicYPdAAAAAJ:N4e_798Z1OgC", "source": "scholar", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=JicYPdAAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=JicYPdAAAAAJ:N4e_798Z1OgC"}, {"title": "Training distilled machine learning models", "authors": "O Vinyals, JA Dean, GE Hinton", "year": 2024, "citation_id": "JicYPdAAAAAJ:vkDViGfkvYEC", "result_id": "JicYPdAAAAAJ:vkDViGfkvYEC", "source": "scholar", "publication_info": {"summary": "US Patent 11,900,232, 2024"}, "publication": "US Patent 11,900,232, 2024", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=JicYPdAAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=JicYPdAAAAAJ:vkDViGfkvYEC"}, {"title": "Will digital intelligence replace biological intelligence", "authors": "G Hinton", "year": 2024, "citation_id": "JicYPdAAAAAJ:nOKOSwxqtg8C", "result_id": "JicYPdAAAAAJ:nOKOSwxqtg8C", "source": "scholar", "publication_info": {"summary": "Romanes Lecture, Oxford, UK 19, 2024"}, "publication": "Romanes Lecture, Oxford, UK 19, 2024", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=JicYPdAAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=JicYPdAAAAAJ:nOKOSwxqtg8C"}, {"title": "Systems and methods for contrastive learning of visual representations", "authors": "T Chen, GE Hinton, S Kornblith, M Norouzi", "year": 2023, "citation_id": "JicYPdAAAAAJ:X41XOdD1uaEC", "result_id": "JicYPdAAAAAJ:X41XOdD1uaEC", "source": "scholar", "publication_info": {"summary": "US Patent 11,847,571, 2023"}, "publication": "US Patent 11,847,571, 2023", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=JicYPdAAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=JicYPdAAAAAJ:X41XOdD1uaEC"}, {"title": "System and method for addressing overfitting in a neural network", "authors": "GE Hinton, A Krizhevsky, I Sutskever, N Srivastava", "year": 2023, "citation_id": "JicYPdAAAAAJ:WsFh9Szeq2wC", "result_id": "JicYPdAAAAAJ:WsFh9Szeq2wC", "source": "scholar", "publication_info": {"summary": "US Patent 11,829,882, 2023"}, "publication": "US Patent 11,829,882, 2023", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=JicYPdAAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=JicYPdAAAAAJ:WsFh9Szeq2wC"}, {"title": "Managing ai risks in an era of rapid progress", "authors": "Y Bengio, G Hinton, A Yao, D Song, P Abbeel, YN Harari, YQ Zhang, ...", "year": 2023, "citation_id": "JicYPdAAAAAJ:8s22W2WWFy4C", "result_id": "JicYPdAAAAAJ:8s22W2WWFy4C", "source": "scholar", "publication_info": {"summary": "arXiv preprint arXiv:2310.17688, 18, 2023"}, "publication": "arXiv preprint arXiv:2310.17688, 18, 2023", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=JicYPdAAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=JicYPdAAAAAJ:8s22W2WWFy4C"}, {"title": "Capsule neural networks", "authors": "GE Hinton, NMW Frosst, SSR Aghdam", "year": 2023, "citation_id": "JicYPdAAAAAJ:4p3FJGzxjgAC", "result_id": "JicYPdAAAAAJ:4p3FJGzxjgAC", "source": "scholar", "publication_info": {"summary": "US Patent 11,694,060, 2023"}, "publication": "US Patent 11,694,060, 2023", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=JicYPdAAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=JicYPdAAAAAJ:4p3FJGzxjgAC"}, {"title": "Robust and data-efficient generalization of self-supervised machine learning for diagnostic imaging", "authors": "S Azizi, L Culp, J Freyberg, B Mustafa, S Baur, S Kornblith, T Chen, ...", "year": 2023, "citation_id": "JicYPdAAAAAJ:aJ-3-MYELVsC", "result_id": "JicYPdAAAAAJ:aJ-3-MYELVsC", "source": "scholar", "publication_info": {"summary": "Nature Biomedical Engineering 7 (6), 756-779, 2023"}, "publication": "Nature Biomedical Engineering 7 (6), 756-779, 2023", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=JicYPdAAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=JicYPdAAAAAJ:aJ-3-MYELVsC"}, {"title": "Statement on AI risk", "authors": "G Hinton, Y Bengio, D Hassabis, S Altman, D Amodei, D Song, T Lieu, ...", "year": 2023, "citation_id": "JicYPdAAAAAJ:Y0agIcFmOsQC", "result_id": "JicYPdAAAAAJ:Y0agIcFmOsQC", "source": "scholar", "publication_info": {"summary": "Center for AI safety 31 (5), 2023, 2023"}, "publication": "Center for AI safety 31 (5), 2023, 2023", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=JicYPdAAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=JicYPdAAAAAJ:Y0agIcFmOsQC"}, {"title": "How to represent part-whole hierarchies in a neural network", "authors": "G Hinton", "year": 2023, "citation_id": "JicYPdAAAAAJ:OkrdTXRNpVkC", "result_id": "JicYPdAAAAAJ:OkrdTXRNpVkC", "source": "scholar", "publication_info": {"summary": "Neural Computation 35 (3), 413-452, 2023"}, "publication": "Neural Computation 35 (3), 413-452, 2023", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=JicYPdAAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=JicYPdAAAAAJ:OkrdTXRNpVkC"}, {"title": "International conference on machine learning", "authors": "W Li, C Wang, G Cheng, Q Song", "year": 2023, "citation_id": "JicYPdAAAAAJ:9mnZQYLiiboC", "result_id": "JicYPdAAAAAJ:9mnZQYLiiboC", "source": "scholar", "publication_info": {"summary": "Transactions on machine learning research, 2023"}, "publication": "Transactions on machine learning research, 2023", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=JicYPdAAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=JicYPdAAAAAJ:9mnZQYLiiboC"}, {"title": "A generalist framework for panoptic segmentation of images and videos", "authors": "T Chen, L Li, S Saxena, G Hinton, DJ Fleet", "year": 2023, "citation_id": "JicYPdAAAAAJ:yRRszJvrVdAC", "result_id": "JicYPdAAAAAJ:yRRszJvrVdAC", "source": "scholar", "publication_info": {"summary": "Proceedings of the IEEE/CVF international conference on computer vision, 909-919, 2023"}, "publication": "Proceedings of the IEEE/CVF international conference on computer vision, 909-919, 2023", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=JicYPdAAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=JicYPdAAAAAJ:yRRszJvrVdAC"}, {"title": "ImageNet classification with deep convolutional neural networks (AlexNet) ImageNet classification with deep convolutional neural networks (AlexNet)", "authors": "A Krizhevsky, I Sutskever, G Hinton", "year": 2023, "citation_id": "JicYPdAAAAAJ:EmjvLWWcsQIC", "result_id": "JicYPdAAAAAJ:EmjvLWWcsQIC", "source": "scholar", "publication_info": {"summary": "Actorsfit. Com, 2023"}, "publication": "Actorsfit. Com, 2023", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=JicYPdAAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=JicYPdAAAAAJ:EmjvLWWcsQIC"}, {"title": "The forward-forward algorithm: Some preliminary investigations", "authors": "G Hinton", "year": 2022, "citation_id": "JicYPdAAAAAJ:2hlgnPHlchoC", "result_id": "JicYPdAAAAAJ:2hlgnPHlchoC", "source": "scholar", "publication_info": {"summary": "arXiv preprint arXiv:2212.13345 2 (3), 5, 2022"}, "publication": "arXiv preprint arXiv:2212.13345 2 (3), 5, 2022", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=JicYPdAAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=JicYPdAAAAAJ:2hlgnPHlchoC"}, {"title": "A unified sequence interface for vision tasks", "authors": "T Chen, S Saxena, L Li, TY Lin, DJ Fleet, GE Hinton", "year": 2022, "citation_id": "JicYPdAAAAAJ:0dtNEdnCFDAC", "result_id": "JicYPdAAAAAJ:0dtNEdnCFDAC", "source": "scholar", "publication_info": {"summary": "Advances in Neural Information Processing Systems 35, 31333-31346, 2022"}, "publication": "Advances in Neural Information Processing Systems 35, 31333-31346, 2022", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=JicYPdAAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=JicYPdAAAAAJ:0dtNEdnCFDAC"}, {"title": "Meta-learning fast weight language models", "authors": "K Clark, K Guu, MW Chang, P Pasupat, G Hinton, M Norouzi", "year": 2022, "citation_id": "JicYPdAAAAAJ:yqZeyBDMhiUC", "result_id": "JicYPdAAAAAJ:yqZeyBDMhiUC", "source": "scholar", "publication_info": {"summary": "Proceedings of the 2022 Conference on Empirical Methods in Natural Language \u2026, 2022"}, "publication": "Proceedings of the 2022 Conference on Empirical Methods in Natural Language \u2026, 2022", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=JicYPdAAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=JicYPdAAAAAJ:yqZeyBDMhiUC"}, {"title": "Testing GLOM's ability to infer wholes from ambiguous parts", "authors": "L Culp, S Sabour, GE Hinton", "year": 2022, "citation_id": "JicYPdAAAAAJ:6_6x9JMR98MC", "result_id": "JicYPdAAAAAJ:6_6x9JMR98MC", "source": "scholar", "publication_info": {"summary": "arXiv preprint arXiv:2211.16564, 2022"}, "publication": "arXiv preprint arXiv:2211.16564, 2022", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=JicYPdAAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=JicYPdAAAAAJ:6_6x9JMR98MC"}, {"title": "Convex representation of objects using neural network", "authors": "B Deng, K Genova, S Yazdani, S Bouaziz, GE Hinton, A TAGLIASACCHI", "year": 2022, "citation_id": "JicYPdAAAAAJ:E10ZYwHxBI8C", "result_id": "JicYPdAAAAAJ:E10ZYwHxBI8C", "source": "scholar", "publication_info": {"summary": "US Patent 11,508,167, 2022"}, "publication": "US Patent 11,508,167, 2022", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=JicYPdAAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=JicYPdAAAAAJ:E10ZYwHxBI8C"}, {"title": "Capsule neural networks", "authors": "GE Hinton, NMW Frosst, SSR Aghdam", "year": 2022, "citation_id": "JicYPdAAAAAJ:1l3MdapXzAoC", "result_id": "JicYPdAAAAAJ:1l3MdapXzAoC", "source": "scholar", "publication_info": {"summary": "US Patent 11,494,609, 2022"}, "publication": "US Patent 11,494,609, 2022", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=JicYPdAAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=JicYPdAAAAAJ:1l3MdapXzAoC"}, {"title": "Gaussian-bernoulli rbms without tears", "authors": "R Liao, S Kornblith, M Ren, DJ Fleet, G Hinton", "year": 2022, "citation_id": "JicYPdAAAAAJ:-Z8x4v2cOtkC", "result_id": "JicYPdAAAAAJ:-Z8x4v2cOtkC", "source": "scholar", "publication_info": {"summary": "arXiv preprint arXiv:2210.10318, 2022"}, "publication": "arXiv preprint arXiv:2210.10318, 2022", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=JicYPdAAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=JicYPdAAAAAJ:-Z8x4v2cOtkC"}, {"title": "Scaling forward gradient with local losses", "authors": "M Ren, S Kornblith, R Liao, G Hinton", "year": 2022, "citation_id": "JicYPdAAAAAJ:8EvVLpklxGMC", "result_id": "JicYPdAAAAAJ:8EvVLpklxGMC", "source": "scholar", "publication_info": {"summary": "arXiv preprint arXiv:2210.03310, 2022"}, "publication": "arXiv preprint arXiv:2210.03310, 2022", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=JicYPdAAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=JicYPdAAAAAJ:8EvVLpklxGMC"}, {"title": "Training distilled machine learning models", "authors": "O Vinyals, JA Dean, GE Hinton", "year": 2022, "citation_id": "JicYPdAAAAAJ:CmbFvBriOyMC", "result_id": "JicYPdAAAAAJ:CmbFvBriOyMC", "source": "scholar", "publication_info": {"summary": "US Patent 11,423,337, 2022"}, "publication": "US Patent 11,423,337, 2022", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=JicYPdAAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=JicYPdAAAAAJ:CmbFvBriOyMC"}, {"title": "Analog bits: Generating discrete data using diffusion models with self-conditioning", "authors": "T Chen, R Zhang, G Hinton", "year": 2022, "citation_id": "JicYPdAAAAAJ:ExBYd_ZNEOYC", "result_id": "JicYPdAAAAAJ:ExBYd_ZNEOYC", "source": "scholar", "publication_info": {"summary": "arXiv preprint arXiv:2208.04202, 2022"}, "publication": "arXiv preprint arXiv:2208.04202, 2022", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=JicYPdAAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=JicYPdAAAAAJ:ExBYd_ZNEOYC"}, {"title": "Systems and methods for contrastive learning of visual representations", "authors": "T Chen, S Kornblith, M Norouzi, GE Hinton, KJ Swersky", "year": 2022, "citation_id": "JicYPdAAAAAJ:-TLX1-BxFiYC", "result_id": "JicYPdAAAAAJ:-TLX1-BxFiYC", "source": "scholar", "publication_info": {"summary": "US Patent 11,386,302, 2022"}, "publication": "US Patent 11,386,302, 2022", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=JicYPdAAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=JicYPdAAAAAJ:-TLX1-BxFiYC"}, {"title": "Systems and methods for contrastive learning of visual representations", "authors": "T Chen, S Kornblith, M Norouzi, GE Hinton", "year": 2022, "citation_id": "JicYPdAAAAAJ:Ltc9rfRcsxEC", "result_id": "JicYPdAAAAAJ:Ltc9rfRcsxEC", "source": "scholar", "publication_info": {"summary": "US Patent 11,354,778, 2022"}, "publication": "US Patent 11,354,778, 2022", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=JicYPdAAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=JicYPdAAAAAJ:Ltc9rfRcsxEC"}, {"title": "Robust and efficient medical imaging with self-supervision", "authors": "S Azizi, L Culp, J Freyberg, B Mustafa, S Baur, S Kornblith, T Chen, ...", "year": 2022, "citation_id": "JicYPdAAAAAJ:H0nRGT7Dr7IC", "result_id": "JicYPdAAAAAJ:H0nRGT7Dr7IC", "source": "scholar", "publication_info": {"summary": "arXiv preprint arXiv:2205.09723, 2022"}, "publication": "arXiv preprint arXiv:2205.09723, 2022", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=JicYPdAAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=JicYPdAAAAAJ:H0nRGT7Dr7IC"}, {"title": "Deep learning. nature, 521 (7553): 436\u2013444, 2015", "authors": "Y LeCun, Y Bengio, G Hinton", "year": 2022, "citation_id": "JicYPdAAAAAJ:lLPirIASiZEC", "result_id": "JicYPdAAAAAJ:lLPirIASiZEC", "source": "scholar", "publication_info": {"summary": "Cited on, 2, 2022"}, "publication": "Cited on, 2, 2022", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=JicYPdAAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=JicYPdAAAAAJ:lLPirIASiZEC"}, {"title": "Canonical capsules: Self-supervised capsules in canonical pose", "authors": "W Sun, A Tagliasacchi, B Deng, S Sabour, S Yazdani, GE Hinton, KM Yi", "year": 2021, "citation_id": "JicYPdAAAAAJ:f13iAvnbnnYC", "result_id": "JicYPdAAAAAJ:f13iAvnbnnYC", "source": "scholar", "publication_info": {"summary": "Advances in Neural information processing systems 34, 24993-25005, 2021"}, "publication": "Advances in Neural information processing systems 34, 24993-25005, 2021", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=JicYPdAAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=JicYPdAAAAAJ:f13iAvnbnnYC"}, {"title": "Neural additive models: Interpretable machine learning with neural nets", "authors": "R Agarwal, L Melnick, N Frosst, X Zhang, B Lengerich, R Caruana, ...", "year": 2021, "citation_id": "JicYPdAAAAAJ:MSzX15-gZgkC", "result_id": "JicYPdAAAAAJ:MSzX15-gZgkC", "source": "scholar", "publication_info": {"summary": "Advances in neural information processing systems 34, 4699-4711, 2021"}, "publication": "Advances in neural information processing systems 34, 4699-4711, 2021", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=JicYPdAAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=JicYPdAAAAAJ:MSzX15-gZgkC"}, {"title": "Pix2seq: A language modeling framework for object detection", "authors": "T Chen, S Saxena, L Li, DJ Fleet, G Hinton", "year": 2021, "citation_id": "JicYPdAAAAAJ:6YFk0eKgftsC", "result_id": "JicYPdAAAAAJ:6YFk0eKgftsC", "source": "scholar", "publication_info": {"summary": "arXiv preprint arXiv:2109.10852, 2021"}, "publication": "arXiv preprint arXiv:2109.10852, 2021", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=JicYPdAAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=JicYPdAAAAAJ:6YFk0eKgftsC"}, {"title": "Unsupervised part representation by flow capsules", "authors": "S Sabour, A Tagliasacchi, S Yazdani, G Hinton, DJ Fleet", "year": 2021, "citation_id": "JicYPdAAAAAJ:RZBefGmQYygC", "result_id": "JicYPdAAAAAJ:RZBefGmQYygC", "source": "scholar", "publication_info": {"summary": "International Conference on Machine Learning, 9213-9223, 2021"}, "publication": "International Conference on Machine Learning, 9213-9223, 2021", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=JicYPdAAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=JicYPdAAAAAJ:RZBefGmQYygC"}, {"title": "Deep learning for AI", "authors": "Y Bengio, Y Lecun, G Hinton", "year": 2021, "citation_id": "JicYPdAAAAAJ:YXPZ0dOdYS4C", "result_id": "JicYPdAAAAAJ:YXPZ0dOdYS4C", "source": "scholar", "publication_info": {"summary": "Communications of the ACM 64 (7), 58-65, 2021"}, "publication": "Communications of the ACM 64 (7), 58-65, 2021", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=JicYPdAAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=JicYPdAAAAAJ:YXPZ0dOdYS4C"}, {"title": "Processing text using neural networks", "authors": "JR Kiros, W Chan, GE Hinton", "year": 2021, "citation_id": "JicYPdAAAAAJ:oE_QS-WwsdAC", "result_id": "JicYPdAAAAAJ:oE_QS-WwsdAC", "source": "scholar", "publication_info": {"summary": "US Patent 11,003,856, 2021"}, "publication": "US Patent 11,003,856, 2021", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=JicYPdAAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=JicYPdAAAAAJ:oE_QS-WwsdAC"}, {"title": "System and method for addressing overfitting in a neural network", "authors": "GE Hinton, A Krizhevsky, I Sutskever, N Srivastava", "year": 2021, "citation_id": "JicYPdAAAAAJ:jtOrAYjvdewC", "result_id": "JicYPdAAAAAJ:jtOrAYjvdewC", "source": "scholar", "publication_info": {"summary": "US Patent 10,977,557, 2021"}, "publication": "US Patent 10,977,557, 2021", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=JicYPdAAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=JicYPdAAAAAJ:jtOrAYjvdewC"}, {"title": "Deep learning for AI", "authors": "H Geoffrey, LC Yann", "year": 2021, "citation_id": "JicYPdAAAAAJ:AU0JsVlt-AkC", "result_id": "JicYPdAAAAAJ:AU0JsVlt-AkC", "source": "scholar", "publication_info": {"summary": "Communications of the ACM 64 (7), 58-65, 2021"}, "publication": "Communications of the ACM 64 (7), 58-65, 2021", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=JicYPdAAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=JicYPdAAAAAJ:AU0JsVlt-AkC"}, {"title": "Neural Additive Models: Interpretable Machine Learning with Neural Networks", "authors": "R Agarwal, L Melnick, N Frosst, B Lengerich, X Zhang, R Caruana, ...", "year": 2021, "citation_id": "JicYPdAAAAAJ:m03se8k-GH0C", "result_id": "JicYPdAAAAAJ:m03se8k-GH0C", "source": "scholar", "publication_info": {"summary": "arXiv, 2021"}, "publication": "arXiv, 2021", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=JicYPdAAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=JicYPdAAAAAJ:m03se8k-GH0C"}, {"title": "Imputer: Sequence modelling via imputation and dynamic programming", "authors": "W Chan, C Saharia, G Hinton, M Norouzi, N Jaitly", "year": 2020, "citation_id": "JicYPdAAAAAJ:-w1eE4La9_EC", "result_id": "JicYPdAAAAAJ:-w1eE4La9_EC", "source": "scholar", "publication_info": {"summary": "International Conference on Machine Learning, 1403-1413, 2020"}, "publication": "International Conference on Machine Learning, 1403-1413, 2020", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=JicYPdAAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=JicYPdAAAAAJ:-w1eE4La9_EC"}, {"title": "A simple framework for contrastive learning of visual representations", "authors": "T Chen, S Kornblith, M Norouzi, G Hinton", "year": 2020, "citation_id": "JicYPdAAAAAJ:G7txJ4jiatkC", "result_id": "JicYPdAAAAAJ:G7txJ4jiatkC", "source": "scholar", "publication_info": {"summary": "International conference on machine learning, 1597-1607, 2020"}, "publication": "International conference on machine learning, 1597-1607, 2020", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=JicYPdAAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=JicYPdAAAAAJ:G7txJ4jiatkC"}, {"title": "Teaching with commentaries", "authors": "A Raghu, M Raghu, S Kornblith, D Duvenaud, G Hinton", "year": 2020, "citation_id": "JicYPdAAAAAJ:v7SMsomtfXcC", "result_id": "JicYPdAAAAAJ:v7SMsomtfXcC", "source": "scholar", "publication_info": {"summary": "arXiv preprint arXiv:2011.03037, 2020"}, "publication": "arXiv preprint arXiv:2011.03037, 2020", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=JicYPdAAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=JicYPdAAAAAJ:v7SMsomtfXcC"}, {"title": "Nasa neural articulated shape approximation", "authors": "B Deng, JP Lewis, T Jeruzalski, G Pons-Moll, G Hinton, M Norouzi, ...", "year": 2020, "citation_id": "JicYPdAAAAAJ:VBDT71xRUdcC", "result_id": "JicYPdAAAAAJ:VBDT71xRUdcC", "source": "scholar", "publication_info": {"summary": "European Conference on Computer Vision, 612-628, 2020"}, "publication": "European Conference on Computer Vision, 612-628, 2020", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=JicYPdAAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=JicYPdAAAAAJ:VBDT71xRUdcC"}, {"title": "The next generation of neural networks", "authors": "G Hinton", "year": 2020, "citation_id": "JicYPdAAAAAJ:h168fVGZblEC", "result_id": "JicYPdAAAAAJ:h168fVGZblEC", "source": "scholar", "publication_info": {"summary": "Proceedings of the 43rd International ACM SIGIR Conference on Research and \u2026, 2020"}, "publication": "Proceedings of the 43rd International ACM SIGIR Conference on Research and \u2026, 2020", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=JicYPdAAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=JicYPdAAAAAJ:h168fVGZblEC"}, {"title": "Backpropagation and the brain", "authors": "TP Lillicrap, A Santoro, L Marris, CJ Akerman, G Hinton", "year": 2020, "citation_id": "JicYPdAAAAAJ:O0MA3yP7Y3UC", "result_id": "JicYPdAAAAAJ:O0MA3yP7Y3UC", "source": "scholar", "publication_info": {"summary": "Nature Reviews Neuroscience 21 (6), 335-346, 2020"}, "publication": "Nature Reviews Neuroscience 21 (6), 335-346, 2020", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=JicYPdAAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=JicYPdAAAAAJ:O0MA3yP7Y3UC"}, {"title": "Training distilled machine learning models", "authors": "O Vinyals, JA Dean, GE Hinton", "year": 2020, "citation_id": "JicYPdAAAAAJ:Dmoar05iI2YC", "result_id": "JicYPdAAAAAJ:Dmoar05iI2YC", "source": "scholar", "publication_info": {"summary": "US Patent 10,650,328, 2020"}, "publication": "US Patent 10,650,328, 2020", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=JicYPdAAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=JicYPdAAAAAJ:Dmoar05iI2YC"}, {"title": "Recurrent neural networks with rectified linear units", "authors": "QV Le, GE Hinton, N Jaitly", "year": 2020, "citation_id": "JicYPdAAAAAJ:lOG7zRu2uA8C", "result_id": "JicYPdAAAAAJ:lOG7zRu2uA8C", "source": "scholar", "publication_info": {"summary": "US Patent 10,635,972, 2020"}, "publication": "US Patent 10,635,972, 2020", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=JicYPdAAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=JicYPdAAAAAJ:lOG7zRu2uA8C"}, {"title": "System and method for parallelizing convolutional neural networks", "authors": "A Krizhevsky, I Sutskever, GE Hinton", "year": 2020, "citation_id": "JicYPdAAAAAJ:GiYFt9mpioMC", "result_id": "JicYPdAAAAAJ:GiYFt9mpioMC", "source": "scholar", "publication_info": {"summary": "US Patent 10,635,966, 2020"}, "publication": "US Patent 10,635,966, 2020", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=JicYPdAAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=JicYPdAAAAAJ:GiYFt9mpioMC"}, {"title": "Deflecting adversarial attacks", "authors": "Y Qin, N Frosst, C Raffel, G Cottrell, G Hinton", "year": 2020, "citation_id": "JicYPdAAAAAJ:TY5xIG7f_2sC", "result_id": "JicYPdAAAAAJ:TY5xIG7f_2sC", "source": "scholar", "publication_info": {"summary": "arXiv preprint arXiv:2002.07405, 2020"}, "publication": "arXiv preprint arXiv:2002.07405, 2020", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=JicYPdAAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=JicYPdAAAAAJ:TY5xIG7f_2sC"}, {"title": "Subclass distillation", "authors": "R M\u00fcller, S Kornblith, G Hinton", "year": 2020, "citation_id": "JicYPdAAAAAJ:beqBT5984LEC", "result_id": "JicYPdAAAAAJ:beqBT5984LEC", "source": "scholar", "publication_info": {"summary": "arXiv preprint arXiv:2002.03936, 2020"}, "publication": "arXiv preprint arXiv:2002.03936, 2020", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=JicYPdAAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=JicYPdAAAAAJ:beqBT5984LEC"}, {"title": "A Simple Framework for Contrastive Learning of Visual Representations. arXiv e-prints, art", "authors": "T Chen, S Kornblith, M Norouzi, G Hinton", "year": 2020, "citation_id": "JicYPdAAAAAJ:tDdgxD0hSQMC", "result_id": "JicYPdAAAAAJ:tDdgxD0hSQMC", "source": "scholar", "publication_info": {"summary": "arXiv preprint arXiv:2002.05709, 2020"}, "publication": "arXiv preprint arXiv:2002.05709, 2020", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=JicYPdAAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=JicYPdAAAAAJ:tDdgxD0hSQMC"}, {"title": "January 13-18). A simple framework for contrastive learning of visual representations. Proceedings of the International Conference on Machine Learning, PMLR, Virtual", "authors": "T Chen, S Kornblith, M Norouzi, G Hinton", "year": 2020, "citation_id": "JicYPdAAAAAJ:6Dd5luMImnEC", "result_id": "JicYPdAAAAAJ:6Dd5luMImnEC", "source": "scholar", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=JicYPdAAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=JicYPdAAAAAJ:6Dd5luMImnEC"}, {"title": "A simple framework for contrastive learning of visual representations. ICML", "authors": "T Chen, S Kornblith, M Norouzi, G Hinton", "year": 2020, "citation_id": "JicYPdAAAAAJ:8LfMcXwVQboC", "result_id": "JicYPdAAAAAJ:8LfMcXwVQboC", "source": "scholar", "publication_info": {"summary": "arXiv preprint arXiv:2002.05709, 2020"}, "publication": "arXiv preprint arXiv:2002.05709, 2020", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=JicYPdAAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=JicYPdAAAAAJ:8LfMcXwVQboC"}, {"title": "Simclr: A simple framework for contrastive learning of visual representations [C]", "authors": "T Chen, S Kornblith, M Norouzi, G Hinton", "year": 2020, "citation_id": "JicYPdAAAAAJ:5Y7y0xowK3MC", "result_id": "JicYPdAAAAAJ:5Y7y0xowK3MC", "source": "scholar", "publication_info": {"summary": "International Con-ference on Learning Representations 2, 2020"}, "publication": "International Con-ference on Learning Representations 2, 2020", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=JicYPdAAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=JicYPdAAAAAJ:5Y7y0xowK3MC"}, {"title": "ICML", "authors": "T Chen, S Kornblith, M Norouzi, G Hinton", "year": 2020, "citation_id": "JicYPdAAAAAJ:njp6nI0QjqAC", "result_id": "JicYPdAAAAAJ:njp6nI0QjqAC", "source": "scholar", "publication_info": {"summary": "ICML, 2020"}, "publication": "ICML, 2020", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=JicYPdAAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=JicYPdAAAAAJ:njp6nI0QjqAC"}, {"title": "A Simple Framework for Contrastive Learning of Visual Representations. arXiv. org", "authors": "T Chen, S Kornblith, M Norouzi, G Hinton", "year": 2020, "citation_id": "JicYPdAAAAAJ:6TexfgwXQfYC", "result_id": "JicYPdAAAAAJ:6TexfgwXQfYC", "source": "scholar", "publication_info": {"summary": "February, 2020"}, "publication": "February, 2020", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=JicYPdAAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=JicYPdAAAAAJ:6TexfgwXQfYC"}, {"title": "Scaling RBMs to High Dimensional Data with Invertible Neural Networks", "authors": "W Grathwohl, X Li, K Swersky, M Hashemi, JH Jacobsen, M Norouzi, ...", "year": 2020, "citation_id": "JicYPdAAAAAJ:QndmRo8phpgC", "result_id": "JicYPdAAAAAJ:QndmRo8phpgC", "source": "scholar", "publication_info": {"summary": "ICML Workshop on Invertible Neural Networks, Normalizing Flows, and Explicit \u2026, 2020"}, "publication": "ICML Workshop on Invertible Neural Networks, Normalizing Flows, and Explicit \u2026, 2020", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=JicYPdAAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=JicYPdAAAAAJ:QndmRo8phpgC"}, {"title": "Rmsprop gradient optimization (2014)", "authors": "T Tieleman, G Hinton", "year": 2020, "citation_id": "JicYPdAAAAAJ:uqZYSrDi9MMC", "result_id": "JicYPdAAAAAJ:uqZYSrDi9MMC", "source": "scholar", "publication_info": {"summary": "URL http://www. cs. toronto. edu/~ tijmen/csc321/slides/lecture_slides_lec6. pdf, 2020"}, "publication": "URL http://www. cs. toronto. edu/~ tijmen/csc321/slides/lecture_slides_lec6. pdf, 2020", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=JicYPdAAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=JicYPdAAAAAJ:uqZYSrDi9MMC"}, {"title": "The CIFAR-10 dataset (2014)", "authors": "A Krizhevsky, V Nair, G Hinton", "year": 2020, "citation_id": "JicYPdAAAAAJ:kcGNQN_anIUC", "result_id": "JicYPdAAAAAJ:kcGNQN_anIUC", "source": "scholar", "publication_info": {"summary": "Online: http://www. cs. toronto. edu/kriz/cifar. html 55, 2020"}, "publication": "Online: http://www. cs. toronto. edu/kriz/cifar. html 55, 2020", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=JicYPdAAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=JicYPdAAAAAJ:kcGNQN_anIUC"}, {"title": "Big self-supervised models are strong semi-supervised learners", "authors": "T Chen, S Kornblith, K Swersky, M Norouzi, GE Hinton", "year": 2020, "citation_id": "JicYPdAAAAAJ:pwA0zy_liR0C", "result_id": "JicYPdAAAAAJ:pwA0zy_liR0C", "source": "scholar", "publication_info": {"summary": "Advances in neural information processing systems 33, 22243-22255, 2020"}, "publication": "Advances in neural information processing systems 33, 22243-22255, 2020", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=JicYPdAAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=JicYPdAAAAAJ:pwA0zy_liR0C"}, {"title": "Cvxnet: Learnable convex decomposition", "authors": "B Deng, K Genova, S Yazdani, S Bouaziz, G Hinton, A Tagliasacchi", "year": 2020, "citation_id": "JicYPdAAAAAJ:WTQy_8Ay2UsC", "result_id": "JicYPdAAAAAJ:WTQy_8Ay2UsC", "source": "scholar", "publication_info": {"summary": "Proceedings of the IEEE/CVF conference on computer vision and pattern \u2026, 2020"}, "publication": "Proceedings of the IEEE/CVF conference on computer vision and pattern \u2026, 2020", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=JicYPdAAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=JicYPdAAAAAJ:WTQy_8Ay2UsC"}, {"title": "When does label smoothing help", "authors": "M Rafael, K Simon, H Geoffrey", "year": 2019, "citation_id": "JicYPdAAAAAJ:5AlGpL-oHpAC", "result_id": "JicYPdAAAAAJ:5AlGpL-oHpAC", "source": "scholar", "publication_info": {"summary": "Advances in neural information processing systems 32, 2019"}, "publication": "Advances in neural information processing systems 32, 2019", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=JicYPdAAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=JicYPdAAAAAJ:5AlGpL-oHpAC"}, {"title": "Prediction of postoperative length of hospital stay based on differences in nursing narratives in elderly patients with epithelial ovarian cancer", "authors": "K Kim, Y Han, S Jeong, K Doh, HA Park, K Lee, M Cho, S Ahn", "year": 2019, "citation_id": "JicYPdAAAAAJ:WMj-6b1RDO4C", "result_id": "JicYPdAAAAAJ:WMj-6b1RDO4C", "source": "scholar", "publication_info": {"summary": "Methods of Information in Medicine 58 (06), 222-228, 2019"}, "publication": "Methods of Information in Medicine 58 (06), 222-228, 2019", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=JicYPdAAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=JicYPdAAAAAJ:WMj-6b1RDO4C"}, {"title": "From Photographic Image to Computer Vision", "authors": "SA Krizhevsky, I Sutskever, GE Hinton", "year": 2019, "citation_id": "JicYPdAAAAAJ:Pm-n7EBaiV4C", "result_id": "JicYPdAAAAAJ:Pm-n7EBaiV4C", "source": "scholar", "publication_info": {"summary": "Cambridge University Press, 2019"}, "publication": "Cambridge University Press, 2019", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=JicYPdAAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=JicYPdAAAAAJ:Pm-n7EBaiV4C"}, {"title": "Separation of HCM and LQT cardiac diseases with machine learning of Ca2+ transient profiles", "authors": "H Joutsijoki, K Penttinen, M Juhola, K Aalto-Set\u00e4l\u00e4", "year": 2019, "citation_id": "JicYPdAAAAAJ:OP2qWFMeUpEC", "result_id": "JicYPdAAAAAJ:OP2qWFMeUpEC", "source": "scholar", "publication_info": {"summary": "Methods of Information in Medicine 58 (04/05), 167-178, 2019"}, "publication": "Methods of Information in Medicine 58 (04/05), 167-178, 2019", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=JicYPdAAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=JicYPdAAAAAJ:OP2qWFMeUpEC"}, {"title": "Representing part-whole hierarchies in connectionist networks", "authors": "GE Hinton", "year": 2019, "citation_id": "JicYPdAAAAAJ:lvd772isFD0C", "result_id": "JicYPdAAAAAJ:lvd772isFD0C", "source": "scholar", "publication_info": {"summary": "10th Annual Conference Cognitive Science Society Pod, 48-54, 2019"}, "publication": "10th Annual Conference Cognitive Science Society Pod, 48-54, 2019", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=JicYPdAAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=JicYPdAAAAAJ:lvd772isFD0C"}, {"title": "System and method for addressing overfitting in a neural network", "authors": "GE Hinton, A Krizhevsky, I Sutskever, N Srivastava", "year": 2019, "citation_id": "JicYPdAAAAAJ:Oo1CbQkBAzEC", "result_id": "JicYPdAAAAAJ:Oo1CbQkBAzEC", "source": "scholar", "publication_info": {"summary": "US Patent 10,366,329, 2019"}, "publication": "US Patent 10,366,329, 2019", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=JicYPdAAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=JicYPdAAAAAJ:Oo1CbQkBAzEC"}, {"title": "Detecting and diagnosing adversarial images with class-conditional capsule reconstructions", "authors": "Y Qin, N Frosst, S Sabour, C Raffel, G Cottrell, G Hinton", "year": 2019, "citation_id": "JicYPdAAAAAJ:p-HGrieyzrAC", "result_id": "JicYPdAAAAAJ:p-HGrieyzrAC", "source": "scholar", "publication_info": {"summary": "arXiv preprint arXiv:1907.02957, 2019"}, "publication": "arXiv preprint arXiv:1907.02957, 2019", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=JicYPdAAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=JicYPdAAAAAJ:p-HGrieyzrAC"}, {"title": "Learning sparse networks using targeted dropout", "authors": "AN Gomez, I Zhang, SR Kamalakara, D Madaan, K Swersky, Y Gal, ...", "year": 2019, "citation_id": "JicYPdAAAAAJ:3WNXLiBY60kC", "result_id": "JicYPdAAAAAJ:3WNXLiBY60kC", "source": "scholar", "publication_info": {"summary": "arXiv preprint arXiv:1905.13678, 2019"}, "publication": "arXiv preprint arXiv:1905.13678, 2019", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=JicYPdAAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=JicYPdAAAAAJ:3WNXLiBY60kC"}, {"title": "Cerberus: A multi-headed derenderer", "authors": "B Deng, S Kornblith, G Hinton", "year": 2019, "citation_id": "JicYPdAAAAAJ:WGv8Og3F3KgC", "result_id": "JicYPdAAAAAJ:WGv8Og3F3KgC", "source": "scholar", "publication_info": {"summary": "arXiv preprint arXiv:1905.11940, 2019"}, "publication": "arXiv preprint arXiv:1905.11940, 2019", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=JicYPdAAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=JicYPdAAAAAJ:WGv8Og3F3KgC"}, {"title": "Similarity of neural network representations revisited", "authors": "S Kornblith, M Norouzi, H Lee, G Hinton", "year": 2019, "citation_id": "JicYPdAAAAAJ:E2bRg1zSkIsC", "result_id": "JicYPdAAAAAJ:E2bRg1zSkIsC", "source": "scholar", "publication_info": {"summary": "International conference on machine learning, 3519-3529, 2019"}, "publication": "International conference on machine learning, 3519-3529, 2019", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=JicYPdAAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=JicYPdAAAAAJ:E2bRg1zSkIsC"}, {"title": "Analyzing and improving representations with the soft nearest neighbor loss", "authors": "N Frosst, N Papernot, G Hinton", "year": 2019, "citation_id": "JicYPdAAAAAJ:fF_gHTpLxhAC", "result_id": "JicYPdAAAAAJ:fF_gHTpLxhAC", "source": "scholar", "publication_info": {"summary": "International conference on machine learning, 2012-2020, 2019"}, "publication": "International conference on machine learning, 2012-2020, 2019", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=JicYPdAAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=JicYPdAAAAAJ:fF_gHTpLxhAC"}, {"title": "Training distilled machine learning models", "authors": "O Vinyals, JA Dean, GE Hinton", "year": 2019, "citation_id": "JicYPdAAAAAJ:ibZ2AwG9z6wC", "result_id": "JicYPdAAAAAJ:ibZ2AwG9z6wC", "source": "scholar", "publication_info": {"summary": "US Patent 10,289,962, 2019"}, "publication": "US Patent 10,289,962, 2019", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=JicYPdAAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=JicYPdAAAAAJ:ibZ2AwG9z6wC"}, {"title": "Imagenet classification with deep convolutional neural networks, 2012", "authors": "A Krizhevsky, I Sutskever, GE Hinton", "year": 2019, "citation_id": "JicYPdAAAAAJ:SFOYbPikdlgC", "result_id": "JicYPdAAAAAJ:SFOYbPikdlgC", "source": "scholar", "publication_info": {"summary": "Advances in neural information processing systems 25 (13), 770-778, 2019"}, "publication": "Advances in neural information processing systems 25 (13), 770-778, 2019", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=JicYPdAAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=JicYPdAAAAAJ:SFOYbPikdlgC"}, {"title": "When does label smoothing help? arXiv preprint", "authors": "R M\u00fcller, S Kornblith, G Hinton", "year": 2019, "citation_id": "JicYPdAAAAAJ:5Klqo5HVOaoC", "result_id": "JicYPdAAAAAJ:5Klqo5HVOaoC", "source": "scholar", "publication_info": {"summary": "arXiv preprint arXiv:1906.02629, 2019"}, "publication": "arXiv preprint arXiv:1906.02629, 2019", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=JicYPdAAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=JicYPdAAAAAJ:5Klqo5HVOaoC"}, {"title": "ImageNet classification with deep convolutional neural networks. 2012: 1097\u20131105", "authors": "A Krizhevsky, I Sutskever, GE Hinton", "year": 2019, "citation_id": "JicYPdAAAAAJ:GjXqcohcbckC", "result_id": "JicYPdAAAAAJ:GjXqcohcbckC", "source": "scholar", "publication_info": {"summary": "Last accessed Oct 1, 2019"}, "publication": "Last accessed Oct 1, 2019", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=JicYPdAAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=JicYPdAAAAAJ:GjXqcohcbckC"}, {"title": "Lookahead Optimizer: k steps forward, 1 step back. arXiv", "authors": "MR Zhang, J Lucas, G Hinton, J Ba", "year": 2019, "citation_id": "JicYPdAAAAAJ:j33aPA1ap8EC", "result_id": "JicYPdAAAAAJ:j33aPA1ap8EC", "source": "scholar", "publication_info": {"summary": "arXiv preprint arXiv:1907.08610, 2019"}, "publication": "arXiv preprint arXiv:1907.08610, 2019", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=JicYPdAAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=JicYPdAAAAAJ:j33aPA1ap8EC"}], "search_metadata": {"status": "Success", "source": "serpapi"}}} \ No newline at end of file diff --git a/data/api_cache/serpapi_publications/d9a88c4713d555d4fa32d7a17e6060db53cd36f3b1b31b2a12367dbe588e8f7f.json b/data/api_cache/serpapi_publications/d9a88c4713d555d4fa32d7a17e6060db53cd36f3b1b31b2a12367dbe588e8f7f.json index 0cb92c70..85a2a1c2 100644 --- a/data/api_cache/serpapi_publications/d9a88c4713d555d4fa32d7a17e6060db53cd36f3b1b31b2a12367dbe588e8f7f.json +++ b/data/api_cache/serpapi_publications/d9a88c4713d555d4fa32d7a17e6060db53cd36f3b1b31b2a12367dbe588e8f7f.json @@ -1 +1 @@ -{"timestamp": 1772379968.9378192, "ttl_days": 60, "data": {"articles": [{"title": "REINSURANCE ANALYTICS USING SERIAL AND PARALLEL COMPUTATION ON THE MULTIOBJECTIVE EVOLUTIONARY ALGORITHM SPEA2", "authors": "OA CARMONA, OAC CORTES", "year": 2019, "citation_id": "-PvfVhgAAAAJ:ML0RJ9NH7IQC", "result_id": "-PvfVhgAAAAJ:ML0RJ9NH7IQC", "source": "scholar", "publication_info": {"summary": "Congresso Brasileiro de Autom\u00e1tica-CBA 1 (1), 2019"}, "publication": "Congresso Brasileiro de Autom\u00e1tica-CBA 1 (1), 2019", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=-PvfVhgAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=-PvfVhgAAAAJ:ML0RJ9NH7IQC"}, {"title": "Tackling Reinsurance Contract Optimization by Means of Evolutionary Algorithms and HPC", "authors": "OAC Cortes, A Rau-Chaplin", "year": 2018, "citation_id": "-PvfVhgAAAAJ:tuHXwOkdijsC", "result_id": "-PvfVhgAAAAJ:tuHXwOkdijsC", "source": "scholar", "publication_info": {"summary": "High-Performance Computing in Finance, 371-390, 2018"}, "publication": "High-Performance Computing in Finance, 371-390, 2018", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=-PvfVhgAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=-PvfVhgAAAAJ:tuHXwOkdijsC"}, {"title": "VOLAP: A scalable distributed real-time OLAP system for high-velocity data", "authors": "F Dehne, DE Robillard, A Rau-Chaplin, N Burke", "year": 2017, "citation_id": "-PvfVhgAAAAJ:0KyAp5RtaNEC", "result_id": "-PvfVhgAAAAJ:0KyAp5RtaNEC", "source": "scholar", "publication_info": {"summary": "IEEE Transactions on Parallel and Distributed Systems 29 (1), 226-239, 2017"}, "publication": "IEEE Transactions on Parallel and Distributed Systems 29 (1), 226-239, 2017", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=-PvfVhgAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=-PvfVhgAAAAJ:0KyAp5RtaNEC"}, {"title": "Quantifying eventual consistency for aggregate queries", "authors": "N Burke, F Dehne, A Rau-Chaplin, D Robillard", "year": 2017, "citation_id": "-PvfVhgAAAAJ:yB1At4FlUx8C", "result_id": "-PvfVhgAAAAJ:yB1At4FlUx8C", "source": "scholar", "publication_info": {"summary": "Proceedings of the 21st International Database Engineering & Applications \u2026, 2017"}, "publication": "Proceedings of the 21st International Database Engineering & Applications \u2026, 2017", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=-PvfVhgAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=-PvfVhgAAAAJ:yB1At4FlUx8C"}, {"title": "A Survey on Reinsurrance Contract Optimization Using Evolutionary and Swarm Computation", "authors": "OAC Cortes, A Rau-Chaplin, RF Lopes", "year": 2016, "citation_id": "-PvfVhgAAAAJ:XD-gHx7UXLsC", "result_id": "-PvfVhgAAAAJ:XD-gHx7UXLsC", "source": "scholar", "publication_info": {"summary": "IEEE Latin America Transactions 14 (10), 4334-4344, 2016"}, "publication": "IEEE Latin America Transactions 14 (10), 4334-4344, 2016", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=-PvfVhgAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=-PvfVhgAAAAJ:XD-gHx7UXLsC"}, {"title": "Enhanced multiobjective population-based incremental learning with applications in risk treaty optimization", "authors": "OA Carmona Cortes, A Rau-Chaplin", "year": 2016, "citation_id": "-PvfVhgAAAAJ:evX43VCCuoAC", "result_id": "-PvfVhgAAAAJ:evX43VCCuoAC", "source": "scholar", "publication_info": {"summary": "Evolutionary Intelligence 9 (4), 153-165, 2016"}, "publication": "Evolutionary Intelligence 9 (4), 153-165, 2016", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=-PvfVhgAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=-PvfVhgAAAAJ:evX43VCCuoAC"}, {"title": "VOLAP: A scalable distributed system for real-time OLAP with high velocity data", "authors": "F Dehne, D Robillard, A Rau-Chaplin, N Burke", "year": 2016, "citation_id": "-PvfVhgAAAAJ:t7zJ5fGR-2UC", "result_id": "-PvfVhgAAAAJ:t7zJ5fGR-2UC", "source": "scholar", "publication_info": {"summary": "2016 IEEE international conference on cluster computing (CLUSTER), 354-363, 2016"}, "publication": "2016 IEEE international conference on cluster computing (CLUSTER), 354-363, 2016", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=-PvfVhgAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=-PvfVhgAAAAJ:t7zJ5fGR-2UC"}, {"title": "The Hilbert PDC-tree: A high-velocity structure for many-dimensional data", "authors": "D Robillard, F Dehne, A Rau-Chaplin, N Burke", "year": 2016, "citation_id": "-PvfVhgAAAAJ:j8SEvjWlNXcC", "result_id": "-PvfVhgAAAAJ:j8SEvjWlNXcC", "source": "scholar", "publication_info": {"summary": "Proceedings of the 20th International Database Engineering & Applications \u2026, 2016"}, "publication": "Proceedings of the 20th International Database Engineering & Applications \u2026, 2016", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=-PvfVhgAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=-PvfVhgAAAAJ:j8SEvjWlNXcC"}, {"title": "A stochastic adaptive genetic algorithm for solving unconstrained multimodal numerical problems", "authors": "E Carvalho, OAC Cortes, JP Costa, A Rau-Chaplin", "year": 2016, "citation_id": "-PvfVhgAAAAJ:35r97b3x0nAC", "result_id": "-PvfVhgAAAAJ:35r97b3x0nAC", "source": "scholar", "publication_info": {"summary": "2016 IEEE Conference on Evolving and Adaptive Intelligent Systems (EAIS \u2026, 2016"}, "publication": "2016 IEEE Conference on Evolving and Adaptive Intelligent Systems (EAIS \u2026, 2016", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=-PvfVhgAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=-PvfVhgAAAAJ:35r97b3x0nAC"}, {"title": "Accelerating R\u2010based analytics on the cloud", "authors": "I Patel, A Rau\u2010Chaplin, B Varghese", "year": 2016, "citation_id": "-PvfVhgAAAAJ:XiSMed-E-HIC", "result_id": "-PvfVhgAAAAJ:XiSMed-E-HIC", "source": "scholar", "publication_info": {"summary": "Concurrency and Computation: Practice and Experience 28 (4), 977-994, 2016"}, "publication": "Concurrency and Computation: Practice and Experience 28 (4), 977-994, 2016", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=-PvfVhgAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=-PvfVhgAAAAJ:XiSMed-E-HIC"}, {"title": "Computing probable maximum loss in catastrophe reinsurance portfolios on multi\u2010core and many\u2010core architectures", "authors": "N Burke, A Rau\u2010Chaplin, B Varghese", "year": 2016, "citation_id": "-PvfVhgAAAAJ:1yQoGdGgb4wC", "result_id": "-PvfVhgAAAAJ:1yQoGdGgb4wC", "source": "scholar", "publication_info": {"summary": "Concurrency and Computation: Practice and Experience 28 (3), 836-847, 2016"}, "publication": "Concurrency and Computation: Practice and Experience 28 (3), 836-847, 2016", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=-PvfVhgAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=-PvfVhgAAAAJ:1yQoGdGgb4wC"}, {"title": "Industrial-Scale Ad Hoc Risk Analytics Using MapReduce", "authors": "A Rau-Chaplin, Z Yao, N Zeh", "year": 2015, "citation_id": "-PvfVhgAAAAJ:UHK10RUVsp4C", "result_id": "-PvfVhgAAAAJ:UHK10RUVsp4C", "source": "scholar", "publication_info": {"summary": "Big Data Analysis: New Algorithms for a New Society, 177-206, 2015"}, "publication": "Big Data Analysis: New Algorithms for a New Society, 177-206, 2015", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=-PvfVhgAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=-PvfVhgAAAAJ:UHK10RUVsp4C"}, {"title": "A new vector evaluated PBIL algorithm for reinsurance analytics", "authors": "OAC Cortes, A Rau-Chaplin, PF do Prado", "year": 2015, "citation_id": "-PvfVhgAAAAJ:hkOj_22Ku90C", "result_id": "-PvfVhgAAAAJ:hkOj_22Ku90C", "source": "scholar", "publication_info": {"summary": "2015 Latin America Congress on Computational Intelligence (LA-CCI), 1-6, 2015"}, "publication": "2015 Latin America Congress on Computational Intelligence (LA-CCI), 1-6, 2015", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=-PvfVhgAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=-PvfVhgAAAAJ:hkOj_22Ku90C"}, {"title": "Efficient computation of co-occurrence based word relatedness", "authors": "J Mei, X Kou, Z Yao, A Rau-Chaplin, A Islam, A Moh'd, EE Milios", "year": 2015, "citation_id": "-PvfVhgAAAAJ:ye4kPcJQO24C", "result_id": "-PvfVhgAAAAJ:ye4kPcJQO24C", "source": "scholar", "publication_info": {"summary": "Proceedings of the 2015 ACM Symposium on Document Engineering, 43-46, 2015"}, "publication": "Proceedings of the 2015 ACM Symposium on Document Engineering, 43-46, 2015", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=-PvfVhgAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=-PvfVhgAAAAJ:ye4kPcJQO24C"}, {"title": "Efficient Parallelization of the Google Trigram Method for Document Relatedness Computation", "authors": "X Kou, J Mei, Z Yao, A Rau-Chaplin, A Islam, A Moh'd, E Milios", "year": 2015, "citation_id": "-PvfVhgAAAAJ:uLbwQdceFCQC", "result_id": "-PvfVhgAAAAJ:uLbwQdceFCQC", "source": "scholar", "publication_info": {"summary": "2015 44th International Conference on Parallel Processing Workshops, 98-104, 2015"}, "publication": "2015 44th International Conference on Parallel Processing Workshops, 98-104, 2015", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=-PvfVhgAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=-PvfVhgAAAAJ:uLbwQdceFCQC"}, {"title": "An Automatic Code Generator for Parallel Evolutionary Algorithms: Achieving Speedup and Reducing the Programming Efforts", "authors": "OAC Cortes, VS Eveline de Jesus, JA da Silva, A Rau-Chaplin", "year": 2015, "citation_id": "-PvfVhgAAAAJ:N5tVd3kTz84C", "result_id": "-PvfVhgAAAAJ:N5tVd3kTz84C", "source": "scholar", "publication_info": {"summary": "ADVCOMP 2015, 48, 2015"}, "publication": "ADVCOMP 2015, 48, 2015", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=-PvfVhgAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=-PvfVhgAAAAJ:N5tVd3kTz84C"}, {"title": "Scaling Up to Big Data: Algorithmic Engineering+ HPC", "authors": "A Rau Chaplin", "year": 2015, "citation_id": "-PvfVhgAAAAJ:ipzZ9siozwsC", "result_id": "-PvfVhgAAAAJ:ipzZ9siozwsC", "source": "scholar", "publication_info": {"summary": "Statistical and Computational Analytics for Big Data Conference presentation \u2026, 2015"}, "publication": "Statistical and Computational Analytics for Big Data Conference presentation \u2026, 2015", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=-PvfVhgAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=-PvfVhgAAAAJ:ipzZ9siozwsC"}, {"title": "Differential evolution on a gpgpu: The influence of parameters on speedup and the quality of solutions", "authors": "OAC Cortes, MS Pais, FN M\u00f3r, A Rau-Chaplin, CAM Marcon", "year": 2015, "citation_id": "-PvfVhgAAAAJ:5awf1xo2G04C", "result_id": "-PvfVhgAAAAJ:5awf1xo2G04C", "source": "scholar", "publication_info": {"summary": "2015 IEEE International Parallel and Distributed Processing Symposium \u2026, 2015"}, "publication": "2015 IEEE International Parallel and Distributed Processing Symposium \u2026, 2015", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=-PvfVhgAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=-PvfVhgAAAAJ:5awf1xo2G04C"}, {"title": "Scalable real-time OLAP on cloud architectures", "authors": "F Dehne, Q Kong, A Rau-Chaplin, H Zaboli, R Zhou", "year": 2015, "citation_id": "-PvfVhgAAAAJ:dTyEYWd-f8wC", "result_id": "-PvfVhgAAAAJ:dTyEYWd-f8wC", "source": "scholar", "publication_info": {"summary": "Journal of Parallel and Distributed Computing 79, 31-41, 2015"}, "publication": "Journal of Parallel and Distributed Computing 79, 31-41, 2015", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=-PvfVhgAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=-PvfVhgAAAAJ:dTyEYWd-f8wC"}, {"title": "Dynamic optimization of multi-layered reinsurance treaties", "authors": "H Wang, OAC Cortes, A Rau-Chaplin", "year": 2015, "citation_id": "-PvfVhgAAAAJ:eq2jaN3J8jMC", "result_id": "-PvfVhgAAAAJ:eq2jaN3J8jMC", "source": "scholar", "publication_info": {"summary": "Proceedings of the 30th Annual ACM Symposium on Applied Computing, 125-132, 2015"}, "publication": "Proceedings of the 30th Annual ACM Symposium on Applied Computing, 125-132, 2015", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=-PvfVhgAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=-PvfVhgAAAAJ:eq2jaN3J8jMC"}, {"title": "A Modified Multi-objective Differential Evolution Algorithm with Application in Reinsurance Analytics", "authors": "OAC Cortes", "year": 2015, "citation_id": "-PvfVhgAAAAJ:PR6Y55bgFSsC", "result_id": "-PvfVhgAAAAJ:PR6Y55bgFSsC", "source": "scholar", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=-PvfVhgAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=-PvfVhgAAAAJ:PR6Y55bgFSsC"}, {"title": "On VEPSO and VEDE for solving a treaty optimization problem", "authors": "OAC Cortes, A Rau-Chaplin, PF do Prado", "year": 2014, "citation_id": "-PvfVhgAAAAJ:_B80troHkn4C", "result_id": "-PvfVhgAAAAJ:_B80troHkn4C", "source": "scholar", "publication_info": {"summary": "2014 IEEE International Conference on Systems, Man, and Cybernetics (SMC \u2026, 2014"}, "publication": "2014 IEEE International Conference on Systems, Man, and Cybernetics (SMC \u2026, 2014", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=-PvfVhgAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=-PvfVhgAAAAJ:_B80troHkn4C"}, {"title": "EXsight: An analytical framework for quantifying financial loss in the aftermath of catastrophic events", "authors": "M Coelho, A Rau-Chaplin", "year": 2014, "citation_id": "-PvfVhgAAAAJ:WA5NYHcadZ8C", "result_id": "-PvfVhgAAAAJ:WA5NYHcadZ8C", "source": "scholar", "publication_info": {"summary": "2014 25th International Workshop on Database and Expert Systems Applications \u2026, 2014"}, "publication": "2014 25th International Workshop on Database and Expert Systems Applications \u2026, 2014", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=-PvfVhgAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=-PvfVhgAAAAJ:WA5NYHcadZ8C"}, {"title": "A study of VEPSO approaches for multiobjective real world applications", "authors": "OAC Cortes, A Rau-Chaplin, D Wilson, J Gaiser-Porter", "year": 2014, "citation_id": "-PvfVhgAAAAJ:Y5dfb0dijaUC", "result_id": "-PvfVhgAAAAJ:Y5dfb0dijaUC", "source": "scholar", "publication_info": {"summary": "Proceedings of The Third International Conference on Data Analytics, 42-48, 2014"}, "publication": "Proceedings of The Third International Conference on Data Analytics, 42-48, 2014", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=-PvfVhgAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=-PvfVhgAAAAJ:Y5dfb0dijaUC"}, {"title": "Parallel MO-PBIL: Computing pareto optimal frontiers efficiently with applications in reinsurance analytics", "authors": "L Brown, AA Beria, OAC Cortes, A Rau-Chaplin, D Wilson, N Burke, ...", "year": 2014, "citation_id": "-PvfVhgAAAAJ:HE397vMXCloC", "result_id": "-PvfVhgAAAAJ:HE397vMXCloC", "source": "scholar", "publication_info": {"summary": "2014 International Conference on High Performance Computing & Simulation \u2026, 2014"}, "publication": "2014 International Conference on High Performance Computing & Simulation \u2026, 2014", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=-PvfVhgAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=-PvfVhgAAAAJ:HE397vMXCloC"}, {"title": "On PBIL, DE and PSO for optimization of reinsurance contracts", "authors": "OAC Cortes, A Rau-Chaplin, D Wilson, J Gaiser-Porter", "year": 2014, "citation_id": "-PvfVhgAAAAJ:Mojj43d5GZwC", "result_id": "-PvfVhgAAAAJ:Mojj43d5GZwC", "source": "scholar", "publication_info": {"summary": "European Conference on the Applications of Evolutionary Computation, 227-238, 2014"}, "publication": "European Conference on the Applications of Evolutionary Computation, 227-238, 2014", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=-PvfVhgAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=-PvfVhgAAAAJ:Mojj43d5GZwC"}, {"title": "Efficient data structures for risk modelling in portfolios of catastrophic risk using mapreduce", "authors": "A Rau-Chaplin, Z Yao, N Zeh", "year": 2014, "citation_id": "-PvfVhgAAAAJ:eMMeJKvmdy0C", "result_id": "-PvfVhgAAAAJ:eMMeJKvmdy0C", "source": "scholar", "publication_info": {"summary": "Procedia Computer Science 29, 1557-1568, 2014"}, "publication": "Procedia Computer Science 29, 1557-1568, 2014", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=-PvfVhgAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=-PvfVhgAAAAJ:eMMeJKvmdy0C"}, {"title": "Developing and testing the automated post-event earthquake loss estimation and visualisation (APE-ELEV) technique", "authors": "A Astoul, C Filliter, E Mason, A Rau-Chaplin, K Shridhar, B Varghese, ...", "year": 2013, "citation_id": "-PvfVhgAAAAJ:kRWSkSYxWN8C", "result_id": "-PvfVhgAAAAJ:kRWSkSYxWN8C", "source": "scholar", "publication_info": {"summary": "Bulletin of Earthquake Engineering 11 (6), 1973-2005, 2013"}, "publication": "Bulletin of Earthquake Engineering 11 (6), 1973-2005, 2013", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=-PvfVhgAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=-PvfVhgAAAAJ:kRWSkSYxWN8C"}, {"title": "Accounting for secondary uncertainty: efficient computation of portfolio risk measures on multi and many core architectures", "authors": "B Varghese, A Rau-Chaplin", "year": 2013, "citation_id": "-PvfVhgAAAAJ:olpn-zPbct0C", "result_id": "-PvfVhgAAAAJ:olpn-zPbct0C", "source": "scholar", "publication_info": {"summary": "Proceedings of the 6th Workshop on High Performance Computational Finance, 1-10, 2013"}, "publication": "Proceedings of the 6th Workshop on High Performance Computational Finance, 1-10, 2013", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=-PvfVhgAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=-PvfVhgAAAAJ:olpn-zPbct0C"}, {"title": "A distributed tree data structure for real-time OLAP on cloud architectures", "authors": "F Dehne, Q Kong, A Rau-Chaplin, H Zaboli, R Zhou", "year": 2013, "citation_id": "-PvfVhgAAAAJ:wbdj-CoPYUoC", "result_id": "-PvfVhgAAAAJ:wbdj-CoPYUoC", "source": "scholar", "publication_info": {"summary": "2013 IEEE International Conference on Big Data, 499-505, 2013"}, "publication": "2013 IEEE International Conference on Big Data, 499-505, 2013", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=-PvfVhgAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=-PvfVhgAAAAJ:wbdj-CoPYUoC"}, {"title": "QuPARA: Query-driven large-scale portfolio aggregate risk analysis on MapReduce", "authors": "A Rau-Chaplin, B Varghese, D Wilson, Z Yao, N Zeh", "year": 2013, "citation_id": "-PvfVhgAAAAJ:J-pR_7NvFogC", "result_id": "-PvfVhgAAAAJ:J-pR_7NvFogC", "source": "scholar", "publication_info": {"summary": "2013 IEEE International Conference on Big Data, 703-709, 2013"}, "publication": "2013 IEEE International Conference on Big Data, 703-709, 2013", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=-PvfVhgAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=-PvfVhgAAAAJ:J-pR_7NvFogC"}, {"title": "Achieving speedup in aggregate risk analysis using multiple GPUs", "authors": "AK Bahl, O Baltzer, A Rau-Chaplin, B Varghese, A Whiteway", "year": 2013, "citation_id": "-PvfVhgAAAAJ:1qzjygNMrQYC", "result_id": "-PvfVhgAAAAJ:1qzjygNMrQYC", "source": "scholar", "publication_info": {"summary": "2013 42nd International Conference on Parallel Processing, 909-916, 2013"}, "publication": "2013 42nd International Conference on Parallel Processing, 909-916, 2013", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=-PvfVhgAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=-PvfVhgAAAAJ:1qzjygNMrQYC"}, {"title": "Efficient optimization of reinsurance contracts using discretized PBIL", "authors": "OAC Cortes, A Rau-Chaplin, D Wilson, I Cook, J Gaiser-Porter", "year": 2013, "citation_id": "-PvfVhgAAAAJ:5ugPr518TE4C", "result_id": "-PvfVhgAAAAJ:5ugPr518TE4C", "source": "scholar", "publication_info": {"summary": "Data Analytics, Porto, 2013"}, "publication": "Data Analytics, Porto, 2013", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=-PvfVhgAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=-PvfVhgAAAAJ:5ugPr518TE4C"}, {"title": "Risk analytics for estimating and validating magnitude of earthquake losses", "authors": "A Astoul, C Filliter, A Rau-Chaplin, K Shridhar, B Varghese, N Varshney", "year": 2013, "citation_id": "-PvfVhgAAAAJ:bnK-pcrLprsC", "result_id": "-PvfVhgAAAAJ:bnK-pcrLprsC", "source": "scholar", "publication_info": {"summary": "2013 24th International Workshop on Database and Expert Systems Applications \u2026, 2013"}, "publication": "2013 24th International Workshop on Database and Expert Systems Applications \u2026, 2013", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=-PvfVhgAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=-PvfVhgAAAAJ:bnK-pcrLprsC"}, {"title": "High performance risk aggregation: addressing the data processing challenge the hadoop mapreduce way", "authors": "Z Yao, B Varghese, A Rau-Chaplin", "year": 2013, "citation_id": "-PvfVhgAAAAJ:q3oQSFYPqjQC", "result_id": "-PvfVhgAAAAJ:q3oQSFYPqjQC", "source": "scholar", "publication_info": {"summary": "Proceedings of the 4th ACM workshop on Scientific cloud computing, 53-60, 2013"}, "publication": "Proceedings of the 4th ACM workshop on Scientific cloud computing, 53-60, 2013", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=-PvfVhgAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=-PvfVhgAAAAJ:q3oQSFYPqjQC"}, {"title": "Building a scalable spatial OLAP system", "authors": "O Baltzer, A Rau-Chaplin, N Zeh", "year": 2013, "citation_id": "-PvfVhgAAAAJ:geHnlv5EZngC", "result_id": "-PvfVhgAAAAJ:geHnlv5EZngC", "source": "scholar", "publication_info": {"summary": "Proceedings of the 28th Annual ACM Symposium on Applied Computing, 13-15, 2013"}, "publication": "Proceedings of the 28th Annual ACM Symposium on Applied Computing, 13-15, 2013", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=-PvfVhgAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=-PvfVhgAAAAJ:geHnlv5EZngC"}, {"title": "Multi-GPU computing for achieving speedup in real-time aggregate risk analysis", "authors": "AK Bahl, O Baltzer, A Rau-Chaplin, B Varghese, A Whiteway", "year": 2013, "citation_id": "-PvfVhgAAAAJ:tS2w5q8j5-wC", "result_id": "-PvfVhgAAAAJ:tS2w5q8j5-wC", "source": "scholar", "publication_info": {"summary": "High Performance Computing on Graphics Processing Units (hgpu. org), 2013"}, "publication": "High Performance Computing on Graphics Processing Units (hgpu. org), 2013", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=-PvfVhgAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=-PvfVhgAAAAJ:tS2w5q8j5-wC"}, {"title": "A MapReduce framework for analysing portfolios of catastrophic risk with secondary uncertainty", "authors": "A Rau-Chaplin, B Varghese, Z Yao", "year": 2013, "citation_id": "-PvfVhgAAAAJ:5Ul4iDaHHb8C", "result_id": "-PvfVhgAAAAJ:5Ul4iDaHHb8C", "source": "scholar", "publication_info": {"summary": "Procedia Computer Science 18, 2317-2326, 2013"}, "publication": "Procedia Computer Science 18, 2317-2326, 2013", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=-PvfVhgAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=-PvfVhgAAAAJ:5Ul4iDaHHb8C"}, {"title": "OLAP for moving object data", "authors": "O Baltzer, F Dehne, A Rau-Chaplin", "year": 2013, "citation_id": "-PvfVhgAAAAJ:K3LRdlH-MEoC", "result_id": "-PvfVhgAAAAJ:K3LRdlH-MEoC", "source": "scholar", "publication_info": {"summary": "International Journal of Intelligent Information and Database Systems 7 (1 \u2026, 2013"}, "publication": "International Journal of Intelligent Information and Database Systems 7 (1 \u2026, 2013", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=-PvfVhgAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=-PvfVhgAAAAJ:K3LRdlH-MEoC"}, {"title": "Data Challenges in High-Performance Risk Analytics", "authors": "B Varghese, A Rau-Chaplin", "year": 2012, "citation_id": "-PvfVhgAAAAJ:tOudhMTPpwUC", "result_id": "-PvfVhgAAAAJ:tOudhMTPpwUC", "source": "scholar", "publication_info": {"summary": "2012 SC Companion: High Performance Computing, Networking Storage and \u2026, 2012"}, "publication": "2012 SC Companion: High Performance Computing, Networking Storage and \u2026, 2012", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=-PvfVhgAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=-PvfVhgAAAAJ:tOudhMTPpwUC"}, {"title": "Parallel simulations for analysing portfolios of catastrophic event risk", "authors": "AK Bahl, O Baltzer, A Rau-Chaplin, B Varghese", "year": 2012, "citation_id": "-PvfVhgAAAAJ:u9iWguZQMMsC", "result_id": "-PvfVhgAAAAJ:u9iWguZQMMsC", "source": "scholar", "publication_info": {"summary": "2012 SC Companion: High Performance Computing, Networking Storage and \u2026, 2012"}, "publication": "2012 SC Companion: High Performance Computing, Networking Storage and \u2026, 2012", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=-PvfVhgAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=-PvfVhgAAAAJ:u9iWguZQMMsC"}, {"title": "A pso-based algorithm with local search for multimodal optimization without constraints", "authors": "OAC Cortes, A Rau-Chaplin, RF Lopes", "year": 2012, "citation_id": "-PvfVhgAAAAJ:08ZZubdj9fEC", "result_id": "-PvfVhgAAAAJ:08ZZubdj9fEC", "source": "scholar", "publication_info": {"summary": "2012 XXXVIII Conferencia Latinoamericana En Informatica (CLEI), 1-7, 2012"}, "publication": "2012 XXXVIII Conferencia Latinoamericana En Informatica (CLEI), 1-7, 2012", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=-PvfVhgAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=-PvfVhgAAAAJ:08ZZubdj9fEC"}, {"title": "A platform for parallel R-based analytics on cloud infrastructure", "authors": "I Patel, A Rau-Chaplin, B Varghese", "year": 2012, "citation_id": "-PvfVhgAAAAJ:p2g8aNsByqUC", "result_id": "-PvfVhgAAAAJ:p2g8aNsByqUC", "source": "scholar", "publication_info": {"summary": "2012 41st International Conference on Parallel Processing Workshops, 188-193, 2012"}, "publication": "2012 41st International Conference on Parallel Processing Workshops, 188-193, 2012", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=-PvfVhgAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=-PvfVhgAAAAJ:p2g8aNsByqUC"}, {"title": "Rapid post-event catastrophe modelling and visualization", "authors": "E Mason, A Rau-Chaplin, K Shridhar, B Varghese, N Varshney", "year": 2012, "citation_id": "-PvfVhgAAAAJ:uWQEDVKXjbEC", "result_id": "-PvfVhgAAAAJ:uWQEDVKXjbEC", "source": "scholar", "publication_info": {"summary": "2012 23rd International Workshop on Database and Expert Systems Applications \u2026, 2012"}, "publication": "2012 23rd International Workshop on Database and Expert Systems Applications \u2026, 2012", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=-PvfVhgAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=-PvfVhgAAAAJ:uWQEDVKXjbEC"}, {"title": "High-performance grid and cloud computing workshop-HPGC", "authors": "E Aubanel, VC Bhavsar, MA Frumkin, A Aggarwal, D Bacigalupo, ...", "year": 2011, "citation_id": "-PvfVhgAAAAJ:xtoqd-5pKcoC", "result_id": "-PvfVhgAAAAJ:xtoqd-5pKcoC", "source": "scholar", "publication_info": {"summary": "High-performance grid and cloud computing workshop-HPGC, 880, 2011"}, "publication": "High-performance grid and cloud computing workshop-HPGC, 880, 2011", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=-PvfVhgAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=-PvfVhgAAAAJ:xtoqd-5pKcoC"}, {"title": "Parallel catastrophe modelling on a Cell/BE", "authors": "F Dehne, G Hickey, A Rau-Chaplin, M Byrne", "year": 2010, "citation_id": "-PvfVhgAAAAJ:NMxIlDl6LWMC", "result_id": "-PvfVhgAAAAJ:NMxIlDl6LWMC", "source": "scholar", "publication_info": {"summary": "International Journal of Parallel, Emergent and Distributed Systems 25 (5 \u2026, 2010"}, "publication": "International Journal of Parallel, Emergent and Distributed Systems 25 (5 \u2026, 2010", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=-PvfVhgAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=-PvfVhgAAAAJ:NMxIlDl6LWMC"}, {"title": "Parallel catastrophe modelling on a cell processor", "authors": "F Dehne, G Hickey, A Rau-Chaplin, M Byrne", "year": 2009, "citation_id": "-PvfVhgAAAAJ:hMod-77fHWUC", "result_id": "-PvfVhgAAAAJ:hMod-77fHWUC", "source": "scholar", "publication_info": {"summary": "Proceedings of the 2009 Conference of the Center for Advanced Studies on \u2026, 2009"}, "publication": "Proceedings of the 2009 Conference of the Center for Advanced Studies on \u2026, 2009", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=-PvfVhgAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=-PvfVhgAAAAJ:hMod-77fHWUC"}, {"title": "Cooperative caching for grid-enabled OLAP", "authors": "F Dehne, M Lawrence, A Rau-Chaplin", "year": 2009, "citation_id": "-PvfVhgAAAAJ:bEWYMUwI8FkC", "result_id": "-PvfVhgAAAAJ:bEWYMUwI8FkC", "source": "scholar", "publication_info": {"summary": "International Journal of Grid and Utility Computing 1 (2), 169-181, 2009"}, "publication": "International Journal of Grid and Utility Computing 1 (2), 169-181, 2009", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=-PvfVhgAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=-PvfVhgAAAAJ:bEWYMUwI8FkC"}, {"title": "OLAP for Trajectories", "authors": "O Baltzer, F Dehne, S Hambrusch, A Rau-Chaplin", "year": 2008, "citation_id": "-PvfVhgAAAAJ:dhFuZR0502QC", "result_id": "-PvfVhgAAAAJ:dhFuZR0502QC", "source": "scholar", "publication_info": {"summary": "International Conference on Database and Expert Systems Applications, 340-347, 2008"}, "publication": "International Conference on Database and Expert Systems Applications, 340-347, 2008", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=-PvfVhgAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=-PvfVhgAAAAJ:dhFuZR0502QC"}, {"title": "RCUBE: parallel multi-dimensional ROLAP indexing", "authors": "F Dehne, T Eavis, A Rau-Chaplin", "year": 2008, "citation_id": "-PvfVhgAAAAJ:R3hNpaxXUhUC", "result_id": "-PvfVhgAAAAJ:R3hNpaxXUhUC", "source": "scholar", "publication_info": {"summary": "International Journal of Data Warehousing and Mining (IJDWM) 4 (3), 1-14, 2008"}, "publication": "International Journal of Data Warehousing and Mining (IJDWM) 4 (3), 1-14, 2008", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=-PvfVhgAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=-PvfVhgAAAAJ:R3hNpaxXUhUC"}, {"title": "PnP: sequential, external memory, and parallel iceberg cube computation", "authors": "Y Chen, F Dehne, T Eavis, A Rau-Chaplin", "year": 2008, "citation_id": "-PvfVhgAAAAJ:RHpTSmoSYBkC", "result_id": "-PvfVhgAAAAJ:RHpTSmoSYBkC", "source": "scholar", "publication_info": {"summary": "Distributed and Parallel Databases 23 (2), 99-126, 2008"}, "publication": "Distributed and Parallel Databases 23 (2), 99-126, 2008", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=-PvfVhgAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=-PvfVhgAAAAJ:RHpTSmoSYBkC"}, {"title": "Compact Hilbert indices: Space-filling curves for domains with unequal side lengths", "authors": "CH Hamilton, A Rau-Chaplin", "year": 2008, "citation_id": "-PvfVhgAAAAJ:qUcmZB5y_30C", "result_id": "-PvfVhgAAAAJ:qUcmZB5y_30C", "source": "scholar", "publication_info": {"summary": "Information Processing Letters 105 (5), 155-163, 2008"}, "publication": "Information Processing Letters 105 (5), 155-163, 2008", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=-PvfVhgAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=-PvfVhgAAAAJ:qUcmZB5y_30C"}, {"title": "SPR Distance Computation for Unrooted Trees", "authors": "G Hickey, F Dehne, A Rau-Chaplin, C Blouin", "year": 2008, "citation_id": "-PvfVhgAAAAJ:YsMSGLbcyi4C", "result_id": "-PvfVhgAAAAJ:YsMSGLbcyi4C", "source": "scholar", "publication_info": {"summary": "Evolutionary Bioinformatics 4, EBO. S419, 2008"}, "publication": "Evolutionary Bioinformatics 4, EBO. S419, 2008", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=-PvfVhgAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=-PvfVhgAAAAJ:YsMSGLbcyi4C"}, {"title": "Efficient computation of view subsets", "authors": "F Dehne, T Eavis, A Rau-Chaplin", "year": 2007, "citation_id": "-PvfVhgAAAAJ:_Qo2XoVZTnwC", "result_id": "-PvfVhgAAAAJ:_Qo2XoVZTnwC", "source": "scholar", "publication_info": {"summary": "Proceedings of the ACM tenth international workshop on Data warehousing and \u2026, 2007"}, "publication": "Proceedings of the ACM tenth international workshop on Data warehousing and \u2026, 2007", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=-PvfVhgAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=-PvfVhgAAAAJ:_Qo2XoVZTnwC"}, {"title": "Adaptive tuple differential coding", "authors": "JP Deveaux, A Rau-Chaplin, N Zeh", "year": 2007, "citation_id": "-PvfVhgAAAAJ:dfsIfKJdRG4C", "result_id": "-PvfVhgAAAAJ:dfsIfKJdRG4C", "source": "scholar", "publication_info": {"summary": "International Conference on Database and Expert Systems Applications, 109-119, 2007"}, "publication": "International Conference on Database and Expert Systems Applications, 109-119, 2007", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=-PvfVhgAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=-PvfVhgAAAAJ:dfsIfKJdRG4C"}, {"title": "Storage and indexing of relational OLAP views with mixed categorical and continuous dimensions", "authors": "O Baltzer, A Rau-Chaplin, N Zeh", "year": 2007, "citation_id": "-PvfVhgAAAAJ:GnPB-g6toBAC", "result_id": "-PvfVhgAAAAJ:GnPB-g6toBAC", "source": "scholar", "publication_info": {"summary": "Journal of Digital Information Management 5 (4), 180, 2007"}, "publication": "Journal of Digital Information Management 5 (4), 180, 2007", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=-PvfVhgAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=-PvfVhgAAAAJ:GnPB-g6toBAC"}, {"title": "Cooperative caching for grid based datawarehouses", "authors": "F Dehne, M Lawrence, A Rau-Chaplin", "year": 2007, "citation_id": "-PvfVhgAAAAJ:HDshCWvjkbEC", "result_id": "-PvfVhgAAAAJ:HDshCWvjkbEC", "source": "scholar", "publication_info": {"summary": "Seventh IEEE International Symposium on Cluster Computing and the Grid \u2026, 2007"}, "publication": "Seventh IEEE International Symposium on Cluster Computing and the Grid \u2026, 2007", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=-PvfVhgAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=-PvfVhgAAAAJ:HDshCWvjkbEC"}, {"title": "Parallel computation of skyline queries", "authors": "A Cosgaya-Lozano, A Rau-Chaplin, N Zeh", "year": 2007, "citation_id": "-PvfVhgAAAAJ:8k81kl-MbHgC", "result_id": "-PvfVhgAAAAJ:8k81kl-MbHgC", "source": "scholar", "publication_info": {"summary": "21st International Symposium on High Performance Computing Systems and \u2026, 2007"}, "publication": "21st International Symposium on High Performance Computing Systems and \u2026, 2007", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=-PvfVhgAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=-PvfVhgAAAAJ:8k81kl-MbHgC"}, {"title": "Compact Hilbert indices for multi-dimensional data", "authors": "CH Hamilton, A Rau-Chaplin", "year": 2007, "citation_id": "-PvfVhgAAAAJ:hFOr9nPyWt4C", "result_id": "-PvfVhgAAAAJ:hFOr9nPyWt4C", "source": "scholar", "publication_info": {"summary": "First International Conference on Complex, Intelligent and Software \u2026, 2007"}, "publication": "First International Conference on Complex, Intelligent and Software \u2026, 2007", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=-PvfVhgAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=-PvfVhgAAAAJ:hFOr9nPyWt4C"}, {"title": "Implementing OLAP query fragment aggregation and recombination for the OLAP enabled grid", "authors": "M Lawrence, F Dehne, A Rau-Chaplin", "year": 2007, "citation_id": "-PvfVhgAAAAJ:4DMP91E08xMC", "result_id": "-PvfVhgAAAAJ:4DMP91E08xMC", "source": "scholar", "publication_info": {"summary": "2007 IEEE International Parallel and Distributed Processing Symposium, 1-8, 2007"}, "publication": "2007 IEEE International Parallel and Distributed Processing Symposium, 1-8, 2007", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=-PvfVhgAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=-PvfVhgAAAAJ:4DMP91E08xMC"}, {"title": "Dynamic view selection for OLAP", "authors": "M Lawrence, A Rau-Chaplin", "year": 2006, "citation_id": "-PvfVhgAAAAJ:MXK_kJrjxJIC", "result_id": "-PvfVhgAAAAJ:MXK_kJrjxJIC", "source": "scholar", "publication_info": {"summary": "International Conference on Data Warehousing and Knowledge Discovery, 33-44, 2006"}, "publication": "International Conference on Data Warehousing and Knowledge Discovery, 33-44, 2006", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=-PvfVhgAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=-PvfVhgAAAAJ:MXK_kJrjxJIC"}, {"title": "The computational complexity of the unrooted subtree prune and regraft distance", "authors": "G Hickey, F Dehne, A Rau-Chaplin, C Blouin", "year": 2006, "citation_id": "-PvfVhgAAAAJ:e5wmG9Sq2KIC", "result_id": "-PvfVhgAAAAJ:e5wmG9Sq2KIC", "source": "scholar", "publication_info": {"summary": "Technical Report CS-2006-06, Faculty of Computer Science, Dalhousie University, 2006"}, "publication": "Technical Report CS-2006-06, Faculty of Computer Science, Dalhousie University, 2006", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=-PvfVhgAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=-PvfVhgAAAAJ:e5wmG9Sq2KIC"}, {"title": "The OLAP-enabled grid: Model and query processing algorithms", "authors": "M Lawrence, A Rau-Chaplin", "year": 2006, "citation_id": "-PvfVhgAAAAJ:UebtZRa9Y70C", "result_id": "-PvfVhgAAAAJ:UebtZRa9Y70C", "source": "scholar", "publication_info": {"summary": "20th International Symposium on High-Performance Computing in an Advanced \u2026, 2006"}, "publication": "20th International Symposium on High-Performance Computing in an Advanced \u2026, 2006", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=-PvfVhgAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=-PvfVhgAAAAJ:UebtZRa9Y70C"}, {"title": "cgmOLAP: Efficient parallel generation and querying of terabyte size ROLAP data cubes", "authors": "Y Chen, A Rau-Chaplin, F Dehne, T Eavis, D Green, E Sithirasenan", "year": 2006, "citation_id": "-PvfVhgAAAAJ:ULOm3_A8WrAC", "result_id": "-PvfVhgAAAAJ:ULOm3_A8WrAC", "source": "scholar", "publication_info": {"summary": "22nd International Conference on Data Engineering (ICDE'06), 164-164, 2006"}, "publication": "22nd International Conference on Data Engineering (ICDE'06), 164-164, 2006", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=-PvfVhgAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=-PvfVhgAAAAJ:ULOm3_A8WrAC"}, {"title": "Improved data partitioning for building large ROLAP data cubes in parallel", "authors": "Y Chen, F Dehne, T Eavis, A Rau-Chaplin", "year": 2006, "citation_id": "-PvfVhgAAAAJ:9ZlFYXVOiuMC", "result_id": "-PvfVhgAAAAJ:9ZlFYXVOiuMC", "source": "scholar", "publication_info": {"summary": "International Journal of Data Warehousing and Mining (IJDWM) 2 (1), 1-26, 2006"}, "publication": "International Journal of Data Warehousing and Mining (IJDWM) 2 (1), 1-26, 2006", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=-PvfVhgAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=-PvfVhgAAAAJ:9ZlFYXVOiuMC"}, {"title": "The cgmCUBE project: Optimizing parallel data cube generation for ROLAP", "authors": "F Dehne, T Eavis, A Rau-Chaplin", "year": 2006, "citation_id": "-PvfVhgAAAAJ:IjCSPb-OGe4C", "result_id": "-PvfVhgAAAAJ:IjCSPb-OGe4C", "source": "scholar", "publication_info": {"summary": "Distributed and Parallel Databases 19 (1), 29-62, 2006"}, "publication": "Distributed and Parallel Databases 19 (1), 29-62, 2006", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=-PvfVhgAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=-PvfVhgAAAAJ:IjCSPb-OGe4C"}, {"title": "Parallel querying of ROLAP cubes in the presence of hierarchies", "authors": "F Dehne, T Eavis, A Rau-Chaplin", "year": 2005, "citation_id": "-PvfVhgAAAAJ:ZeXyd9-uunAC", "result_id": "-PvfVhgAAAAJ:ZeXyd9-uunAC", "source": "scholar", "publication_info": {"summary": "Proceedings of the 8th ACM International Workshop on Data Warehousing and \u2026, 2005"}, "publication": "Proceedings of the 8th ACM International Workshop on Data Warehousing and \u2026, 2005", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=-PvfVhgAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=-PvfVhgAAAAJ:ZeXyd9-uunAC"}, {"title": "A coarse grained parallel algorithm for closest larger ancestors in trees with applications to single link clustering", "authors": "A Chan, C Gao, A Rau-Chaplin", "year": 2005, "citation_id": "-PvfVhgAAAAJ:blknAaTinKkC", "result_id": "-PvfVhgAAAAJ:blknAaTinKkC", "source": "scholar", "publication_info": {"summary": "International Conference on High Performance Computing and Communications \u2026, 2005"}, "publication": "International Conference on High Performance Computing and Communications \u2026, 2005", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=-PvfVhgAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=-PvfVhgAAAAJ:blknAaTinKkC"}, {"title": "Fast Parallel Maximum Likelihood-Based Protein Phylogeny.", "authors": "C Blouin, D Butt, G Hickey, A Rau-Chaplin", "year": 2005, "citation_id": "-PvfVhgAAAAJ:k_IJM867U9cC", "result_id": "-PvfVhgAAAAJ:k_IJM867U9cC", "source": "scholar", "publication_info": {"summary": "PDCS, 281-287, 2005"}, "publication": "PDCS, 281-287, 2005", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=-PvfVhgAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=-PvfVhgAAAAJ:k_IJM867U9cC"}, {"title": "Adding parallelism to visual data flow programs", "authors": "P Cox, S Gauvin, A Rau-Chaplin", "year": 2005, "citation_id": "-PvfVhgAAAAJ:aqlVkmm33-oC", "result_id": "-PvfVhgAAAAJ:aqlVkmm33-oC", "source": "scholar", "publication_info": {"summary": "Proceedings of the 2005 ACM symposium on Software visualization, 135-144, 2005"}, "publication": "Proceedings of the 2005 ACM symposium on Software visualization, 135-144, 2005", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=-PvfVhgAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=-PvfVhgAAAAJ:aqlVkmm33-oC"}, {"title": "PnP: Parallel and external memory iceberg cube computation", "authors": "Y Chen, F Dehne, T Eavis, A Rau-Chaplin", "year": 2005, "citation_id": "-PvfVhgAAAAJ:qxL8FJ1GzNcC", "result_id": "-PvfVhgAAAAJ:qxL8FJ1GzNcC", "source": "scholar", "publication_info": {"summary": "21st International Conference on Data Engineering (ICDE'05), 576-577, 2005"}, "publication": "21st International Conference on Data Engineering (ICDE'05), 576-577, 2005", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=-PvfVhgAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=-PvfVhgAAAAJ:qxL8FJ1GzNcC"}, {"title": "Track 15-Database Applications and Data Mining-A Coarse Grained Parallel Algorithm for Closest Larger Ancestors in Trees with Applications to Single Link Clustering", "authors": "A Chan, C Gao, A Rau-Chaplin", "year": 2005, "citation_id": "-PvfVhgAAAAJ:O3NaXMp0MMsC", "result_id": "-PvfVhgAAAAJ:O3NaXMp0MMsC", "source": "scholar", "publication_info": {"summary": "Lecture Notes in Computer Science 3726, 856-865, 2005"}, "publication": "Lecture Notes in Computer Science 3726, 856-865, 2005", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=-PvfVhgAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=-PvfVhgAAAAJ:O3NaXMp0MMsC"}, {"title": "Building large ROLAP data cubes in parallel", "authors": "Y Chen, F Dehne, T Eavis, A Rau-Chaplin", "year": 2004, "citation_id": "-PvfVhgAAAAJ:Se3iqnhoufwC", "result_id": "-PvfVhgAAAAJ:Se3iqnhoufwC", "source": "scholar", "publication_info": {"summary": "Proceedings. International Database Engineering and Applications Symposium \u2026, 2004"}, "publication": "Proceedings. International Database Engineering and Applications Symposium \u2026, 2004", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=-PvfVhgAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=-PvfVhgAAAAJ:Se3iqnhoufwC"}, {"title": "Top-down computation of partial ROLAP data cubes", "authors": "F Dehne, T Eavis, A Rau-Chaplin", "year": 2004, "citation_id": "-PvfVhgAAAAJ:7PzlFSSx8tAC", "result_id": "-PvfVhgAAAAJ:7PzlFSSx8tAC", "source": "scholar", "publication_info": {"summary": "37th Annual Hawaii International Conference on System Sciences, 2004 \u2026, 2004"}, "publication": "37th Annual Hawaii International Conference on System Sciences, 2004 \u2026, 2004", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=-PvfVhgAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=-PvfVhgAAAAJ:7PzlFSSx8tAC"}, {"title": "Building Large ROLAP Data Cubes in Parallel\u00b9", "authors": "A Rau-Chaplin", "year": 2004, "citation_id": "-PvfVhgAAAAJ:XoXfffV-tXoC", "result_id": "-PvfVhgAAAAJ:XoXfffV-tXoC", "source": "scholar", "publication_info": {"summary": "International Database Engineering and Applications Symposium:(IDEAS'04 \u2026, 2004"}, "publication": "International Database Engineering and Applications Symposium:(IDEAS'04 \u2026, 2004", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=-PvfVhgAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=-PvfVhgAAAAJ:XoXfffV-tXoC"}, {"title": "Computing partial data cubes", "authors": "F Dehne, T Eavis, A Rau-Chaplin", "year": 2004, "citation_id": "-PvfVhgAAAAJ:Zph67rFs4hoC", "result_id": "-PvfVhgAAAAJ:Zph67rFs4hoC", "source": "scholar", "publication_info": {"summary": "Proc. HICSS-37, January, 2-30, 2004"}, "publication": "Proc. HICSS-37, January, 2-30, 2004", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=-PvfVhgAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=-PvfVhgAAAAJ:Zph67rFs4hoC"}, {"title": "Solving large FPT problems on coarse-grained parallel machines", "authors": "J Cheetham, F Dehne, A Rau-Chaplin, U Stege, PJ Taillon", "year": 2003, "citation_id": "-PvfVhgAAAAJ:d1gkVwhDpl0C", "result_id": "-PvfVhgAAAAJ:d1gkVwhDpl0C", "source": "scholar", "publication_info": {"summary": "Journal of Computer and System Sciences 67 (4), 691-706, 2003"}, "publication": "Journal of Computer and System Sciences 67 (4), 691-706, 2003", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=-PvfVhgAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=-PvfVhgAAAAJ:d1gkVwhDpl0C"}, {"title": "Parallel CLUSTAL W for PC Clusters", "authors": "J Cheetham, F Dehne, S Pitre, A Rau-Chaplin, PJ Taillon", "year": 2003, "citation_id": "-PvfVhgAAAAJ:WF5omc3nYNoC", "result_id": "-PvfVhgAAAAJ:WF5omc3nYNoC", "source": "scholar", "publication_info": {"summary": "International Conference on Computational Science and Its Applications, 300-309, 2003"}, "publication": "International Conference on Computational Science and Its Applications, 300-309, 2003", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=-PvfVhgAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=-PvfVhgAAAAJ:WF5omc3nYNoC"}, {"title": "A parallel FPT application for clusters", "authors": "J Cheetham, F Dehne, A Rau-Chaplin, U Stege, PJ Taillon", "year": 2003, "citation_id": "-PvfVhgAAAAJ:Wp0gIr-vW9MC", "result_id": "-PvfVhgAAAAJ:Wp0gIr-vW9MC", "source": "scholar", "publication_info": {"summary": "CCGrid 2003. 3rd IEEE/ACM International Symposium on Cluster Computing and \u2026, 2003"}, "publication": "CCGrid 2003. 3rd IEEE/ACM International Symposium on Cluster Computing and \u2026, 2003", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=-PvfVhgAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=-PvfVhgAAAAJ:Wp0gIr-vW9MC"}, {"title": "Parallel multi-dimensional ROLAP indexing", "authors": "F Dehne, T Eavis, A Rau-Chaplin", "year": 2003, "citation_id": "-PvfVhgAAAAJ:UeHWp8X0CEIC", "result_id": "-PvfVhgAAAAJ:UeHWp8X0CEIC", "source": "scholar", "publication_info": {"summary": "CCGrid 2003. 3rd IEEE/ACM International Symposium on Cluster Computing and \u2026, 2003"}, "publication": "CCGrid 2003. 3rd IEEE/ACM International Symposium on Cluster Computing and \u2026, 2003", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=-PvfVhgAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=-PvfVhgAAAAJ:UeHWp8X0CEIC"}, {"title": "Parallel ROLAP data cube construction on shared-nothing multiprocessors", "authors": "Y Chen, F Dehne, T Eavis, A Rau-Chaplin", "year": 2003, "citation_id": "-PvfVhgAAAAJ:9yKSN-GCB0IC", "result_id": "-PvfVhgAAAAJ:9yKSN-GCB0IC", "source": "scholar", "publication_info": {"summary": "Proceedings International Parallel and Distributed Processing Symposium, 10 pp., 2003"}, "publication": "Proceedings International Parallel and Distributed Processing Symposium, 10 pp., 2003", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=-PvfVhgAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=-PvfVhgAAAAJ:9yKSN-GCB0IC"}, {"title": "A Parallel FPT Application For Clusters", "authors": "A Rau-Chaplin", "year": 2003, "citation_id": "-PvfVhgAAAAJ:foquWX3nUaYC", "result_id": "-PvfVhgAAAAJ:foquWX3nUaYC", "source": "scholar", "publication_info": {"summary": "Proceedings 3, 70, 2003"}, "publication": "Proceedings 3, 70, 2003", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=-PvfVhgAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=-PvfVhgAAAAJ:foquWX3nUaYC"}, {"title": "Parallel Multi-Dimensional ROLAP Indexing", "authors": "A Rau-Chaplin", "year": 2003, "citation_id": "-PvfVhgAAAAJ:HbR8gkJAVGIC", "result_id": "-PvfVhgAAAAJ:HbR8gkJAVGIC", "source": "scholar", "publication_info": {"summary": "Proceedings 3, 86, 2003"}, "publication": "Proceedings 3, 86, 2003", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=-PvfVhgAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=-PvfVhgAAAAJ:HbR8gkJAVGIC"}, {"title": "Computational Science and Its Applications\u2014ICCSA 2003", "authors": "TA Tr\u1ecbnh", "year": 2003, "citation_id": "-PvfVhgAAAAJ:lmc2jWPfTJgC", "result_id": "-PvfVhgAAAAJ:lmc2jWPfTJgC", "source": "scholar", "publication_info": {"summary": "Lecture Notes in Computer Science, 2003"}, "publication": "Lecture Notes in Computer Science, 2003", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=-PvfVhgAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=-PvfVhgAAAAJ:lmc2jWPfTJgC"}, {"title": "Jochen Alber, Henning Fernau, and Rolf Niedermeier. Graph separators: a parameterized view", "authors": "J Cheetham, F Dehne, A Rau-Chaplin, U Stege", "year": 2003, "citation_id": "-PvfVhgAAAAJ:fQNAKQ3IYiAC", "result_id": "-PvfVhgAAAAJ:fQNAKQ3IYiAC", "source": "scholar", "publication_info": {"summary": "Journal of Computer and System Sciences 67, 472, 2003"}, "publication": "Journal of Computer and System Sciences 67, 472, 2003", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=-PvfVhgAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=-PvfVhgAAAAJ:fQNAKQ3IYiAC"}, {"title": "Parallel computation on interval graphs: algorithms and experiments", "authors": "A Ferreira, I Gu\u00e9rin Lassous, K Marcus, A Rau\u2010Chaplin", "year": 2002, "citation_id": "-PvfVhgAAAAJ:hC7cP41nSMkC", "result_id": "-PvfVhgAAAAJ:hC7cP41nSMkC", "source": "scholar", "publication_info": {"summary": "Concurrency and Computation: Practice and Experience 14 (11), 885-910, 2002"}, "publication": "Concurrency and Computation: Practice and Experience 14 (11), 885-910, 2002", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=-PvfVhgAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=-PvfVhgAAAAJ:hC7cP41nSMkC"}, {"title": "Parallelizing the data cube", "authors": "F Dehne, T Eavis, S Hambrusch, A Rau-Chaplin", "year": 2002, "citation_id": "-PvfVhgAAAAJ:qjMakFHDy7sC", "result_id": "-PvfVhgAAAAJ:qjMakFHDy7sC", "source": "scholar", "publication_info": {"summary": "Distributed and Parallel Databases 11 (2), 181-201, 2002"}, "publication": "Distributed and Parallel Databases 11 (2), 181-201, 2002", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=-PvfVhgAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=-PvfVhgAAAAJ:qjMakFHDy7sC"}, {"title": "Computing partial data cubes for parallel data warehousing applications", "authors": "F Dehne, T Eavis, A Rau-Chaplin", "year": 2001, "citation_id": "-PvfVhgAAAAJ:5nxA0vEk-isC", "result_id": "-PvfVhgAAAAJ:5nxA0vEk-isC", "source": "scholar", "publication_info": {"summary": "European Parallel Virtual Machine/Message Passing Interface Users\u2019 Group \u2026, 2001"}, "publication": "European Parallel Virtual Machine/Message Passing Interface Users\u2019 Group \u2026, 2001", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=-PvfVhgAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=-PvfVhgAAAAJ:5nxA0vEk-isC"}, {"title": "Coarse grained parallel on-line analytical processing (OLAP) for data mining", "authors": "F Dehne, T Eavis, A Rau-Chaplin", "year": 2001, "citation_id": "-PvfVhgAAAAJ:QIV2ME_5wuYC", "result_id": "-PvfVhgAAAAJ:QIV2ME_5wuYC", "source": "scholar", "publication_info": {"summary": "International Conference on Computational Science, 589-598, 2001"}, "publication": "International Conference on Computational Science, 589-598, 2001", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=-PvfVhgAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=-PvfVhgAAAAJ:QIV2ME_5wuYC"}, {"title": "A cluster architecture for parallel data warehousing", "authors": "F Dehne, T Eavis, A Rau-Chaplin", "year": 2001, "citation_id": "-PvfVhgAAAAJ:eQOLeE2rZwMC", "result_id": "-PvfVhgAAAAJ:eQOLeE2rZwMC", "source": "scholar", "publication_info": {"summary": "Proceedings First IEEE/ACM International Symposium on Cluster Computing and \u2026, 2001"}, "publication": "Proceedings First IEEE/ACM International Symposium on Cluster Computing and \u2026, 2001", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=-PvfVhgAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=-PvfVhgAAAAJ:eQOLeE2rZwMC"}, {"title": "Parallelizing the Data Cube", "authors": "F Dehne\u00b9, T Eavis, S Hambrusch, A Rau-Chaplin", "year": 2001, "citation_id": "-PvfVhgAAAAJ:FPJr55Dyh1AC", "result_id": "-PvfVhgAAAAJ:FPJr55Dyh1AC", "source": "scholar", "publication_info": {"summary": "Database Theory-ICDT 2001: 8th International Conference London, UK, January \u2026, 2001"}, "publication": "Database Theory-ICDT 2001: 8th International Conference London, UK, January \u2026, 2001", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=-PvfVhgAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=-PvfVhgAAAAJ:FPJr55Dyh1AC"}, {"title": "Parallelizing the data cube", "authors": "F Dehne, T Eavis, S Hambrusch, A Rau-Chaplin", "year": 2001, "citation_id": "-PvfVhgAAAAJ:W7OEmFMy1HYC", "result_id": "-PvfVhgAAAAJ:W7OEmFMy1HYC", "source": "scholar", "publication_info": {"summary": "International Conference on Database Theory, 129-143, 2001"}, "publication": "International Conference on Database Theory, 129-143, 2001", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=-PvfVhgAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=-PvfVhgAAAAJ:W7OEmFMy1HYC"}, {"title": "A Cluster Architecture for Parallel Data Warehousing", "authors": "A Rau-Chaplin", "year": 2001, "citation_id": "-PvfVhgAAAAJ:q3CdL3IzO_QC", "result_id": "-PvfVhgAAAAJ:q3CdL3IzO_QC", "source": "scholar", "publication_info": {"summary": "First IEEE/ACM International Symposium on Cluster Computing and the Grid \u2026, 2001"}, "publication": "First IEEE/ACM International Symposium on Cluster Computing and the Grid \u2026, 2001", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=-PvfVhgAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=-PvfVhgAAAAJ:q3CdL3IzO_QC"}, {"title": "Coarse-Grained Parallel Fixed-Parameter Tractable Algorithms,\"", "authors": "F Dehne, A Rau-Chaplin, U Stege, P Taillon", "year": 2001, "citation_id": "-PvfVhgAAAAJ:iH-uZ7U-co4C", "result_id": "-PvfVhgAAAAJ:iH-uZ7U-co4C", "source": "scholar", "publication_info": {"summary": "manuscript, 2001"}, "publication": "manuscript, 2001", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=-PvfVhgAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=-PvfVhgAAAAJ:iH-uZ7U-co4C"}, {"title": "A note on communication-efficient deterministic parallel algorithms for planar point location and 2D Voronoi diagram", "authors": "M Diallo, A Ferreira, A Rau-Chaplin", "year": 2001, "citation_id": "-PvfVhgAAAAJ:M3ejUd6NZC8C", "result_id": "-PvfVhgAAAAJ:M3ejUd6NZC8C", "source": "scholar", "publication_info": {"summary": "Parallel Processing Letters 11 (02n03), 327-340, 2001"}, "publication": "Parallel Processing Letters 11 (02n03), 327-340, 2001", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=-PvfVhgAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=-PvfVhgAAAAJ:M3ejUd6NZC8C"}, {"title": "Load Balanced and Communication Efficient Partitioning Strategies for Parallel Data Cube Generation", "authors": "Z Chen, F Dehne, S Hambrusch, A Rau-Chaplin", "year": 1999, "citation_id": "-PvfVhgAAAAJ:vV6vV6tmYwMC", "result_id": "-PvfVhgAAAAJ:vV6vV6tmYwMC", "source": "scholar", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=-PvfVhgAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=-PvfVhgAAAAJ:vV6vV6tmYwMC"}, {"title": "Scalable parallel algorithms for geometric pattern recognition", "authors": "L Boxer, R Miller, A Rau-Chaplin", "year": 1999, "citation_id": "-PvfVhgAAAAJ:3fE2CSJIrl8C", "result_id": "-PvfVhgAAAAJ:3fE2CSJIrl8C", "source": "scholar", "publication_info": {"summary": "Journal of Parallel and Distributed Computing 58 (3), 466-486, 1999"}, "publication": "Journal of Parallel and Distributed Computing 58 (3), 466-486, 1999", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=-PvfVhgAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=-PvfVhgAAAAJ:3fE2CSJIrl8C"}, {"title": "Parallel algorithms for grounded range search and applications", "authors": "MG Lamoureux, A Rau-Chaplin", "year": 1999, "citation_id": "-PvfVhgAAAAJ:rO6llkc54NcC", "result_id": "-PvfVhgAAAAJ:rO6llkc54NcC", "source": "scholar", "publication_info": {"summary": "European Conference on Parallel Processing, 525-532, 1999"}, "publication": "European Conference on Parallel Processing, 525-532, 1999", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=-PvfVhgAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=-PvfVhgAAAAJ:rO6llkc54NcC"}, {"title": "d-Dimensional Range Search on Multicomputers", "authors": "A Ferreira, C Kenyon, A Rau-Chaplin, S Ub\u00e9da", "year": 1999, "citation_id": "-PvfVhgAAAAJ:r0BpntZqJG4C", "result_id": "-PvfVhgAAAAJ:r0BpntZqJG4C", "source": "scholar", "publication_info": {"summary": "Algorithmica 24 (3), 195-208, 1999"}, "publication": "Algorithmica 24 (3), 195-208, 1999", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=-PvfVhgAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=-PvfVhgAAAAJ:r0BpntZqJG4C"}, {"title": "Coarse-grained parallel geometric search", "authors": "A Chan, F Dehne, A Rau-Chaplin", "year": 1999, "citation_id": "-PvfVhgAAAAJ:KlAtU1dfN6UC", "result_id": "-PvfVhgAAAAJ:KlAtU1dfN6UC", "source": "scholar", "publication_info": {"summary": "Journal of Parallel and Distributed Computing 57 (2), 224-235, 1999"}, "publication": "Journal of Parallel and Distributed Computing 57 (2), 224-235, 1999", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=-PvfVhgAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=-PvfVhgAAAAJ:KlAtU1dfN6UC"}, {"title": "Article ID jpdc. 1999.1588, available online at http: \u0422\u0422www. idealibrary. com on", "authors": "DA Bader, T Bali, P Banerjee, K Blathras, L Boxer, H Casanova, AA Chien, ...", "year": 1999, "citation_id": "-PvfVhgAAAAJ:BrmTIyaxlBUC", "result_id": "-PvfVhgAAAAJ:BrmTIyaxlBUC", "source": "scholar", "publication_info": {"summary": "Journal of Parallel and Distributed Computing 58, 548, 1999"}, "publication": "Journal of Parallel and Distributed Computing 58, 548, 1999", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=-PvfVhgAAAAJ&cstart=100&pagesize=100&sortby=pubdate&citation_for_view=-PvfVhgAAAAJ:BrmTIyaxlBUC"}, {"title": "Article ID jpdc. 1999.1535, available online at http: \u0422\u0422www. idealibrary. com on", "authors": "AK Agrawala, HM Chen, SS Chen, Z Chen, AG Constantinidis, ...", "year": 1999, "citation_id": "-PvfVhgAAAAJ:eJXPG6dFmWUC", "result_id": "-PvfVhgAAAAJ:eJXPG6dFmWUC", "source": "scholar", "publication_info": {"summary": "Journal of Parallel and Distributed Computing 56, 296, 1999"}, "publication": "Journal of Parallel and Distributed Computing 56, 296, 1999", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=-PvfVhgAAAAJ&cstart=100&pagesize=100&sortby=pubdate&citation_for_view=-PvfVhgAAAAJ:eJXPG6dFmWUC"}, {"title": "Scalable 2d convex hull and triangulation algorithms for coarse grained multicomputers", "authors": "M Diallo, A Ferreira, A Rau-Chaplin, S Ub\u00e9da", "year": 1999, "citation_id": "-PvfVhgAAAAJ:roLk4NBRz8UC", "result_id": "-PvfVhgAAAAJ:roLk4NBRz8UC", "source": "scholar", "publication_info": {"summary": "Journal of Parallel and Distributed Computing 56 (1), 47-70, 1999"}, "publication": "Journal of Parallel and Distributed Computing 56 (1), 47-70, 1999", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=-PvfVhgAAAAJ&cstart=100&pagesize=100&sortby=pubdate&citation_for_view=-PvfVhgAAAAJ:roLk4NBRz8UC"}, {"title": "Scaleable parallel algorithms for lower envelopes with applications", "authors": "L Boxer, R Miller, A Rau-Chaplin", "year": 1998, "citation_id": "-PvfVhgAAAAJ:TQgYirikUcIC", "result_id": "-PvfVhgAAAAJ:TQgYirikUcIC", "source": "scholar", "publication_info": {"summary": "journal of parallel and distributed computing 53 (2), 91-118, 1998"}, "publication": "journal of parallel and distributed computing 53 (2), 91-118, 1998", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=-PvfVhgAAAAJ&cstart=100&pagesize=100&sortby=pubdate&citation_for_view=-PvfVhgAAAAJ:TQgYirikUcIC"}, {"title": "Coarse grained parallel Monte Carlo algorithms for solving SLAE using PVM", "authors": "V Alexandrov, F Dehne, A Rau-Chaplin, K Taft", "year": 1998, "citation_id": "-PvfVhgAAAAJ:4JMBOYKVnBMC", "result_id": "-PvfVhgAAAAJ:4JMBOYKVnBMC", "source": "scholar", "publication_info": {"summary": "European Parallel Virtual Machine/Message Passing Interface Users\u2019 Group \u2026, 1998"}, "publication": "European Parallel Virtual Machine/Message Passing Interface Users\u2019 Group \u2026, 1998", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=-PvfVhgAAAAJ&cstart=100&pagesize=100&sortby=pubdate&citation_for_view=-PvfVhgAAAAJ:4JMBOYKVnBMC"}, {"title": "Parallel computation on interval graphs using PC clusters: Algorithms and experiments", "authors": "A Ferreira, IG Lassous, K Marcus, A Rau-Chaplin", "year": 1998, "citation_id": "-PvfVhgAAAAJ:mVmsd5A6BfQC", "result_id": "-PvfVhgAAAAJ:mVmsd5A6BfQC", "source": "scholar", "publication_info": {"summary": "European Conference on Parallel Processing, 875-886, 1998"}, "publication": "European Conference on Parallel Processing, 875-886, 1998", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=-PvfVhgAAAAJ&cstart=100&pagesize=100&sortby=pubdate&citation_for_view=-PvfVhgAAAAJ:mVmsd5A6BfQC"}, {"title": "Algorithms for Solving SLAE using PVM", "authors": "V Alexandrov, F Dehne, A Rau-Chaplin, K Taft\u00b9", "year": 1998, "citation_id": "-PvfVhgAAAAJ:ClCfbGk0d_YC", "result_id": "-PvfVhgAAAAJ:ClCfbGk0d_YC", "source": "scholar", "publication_info": {"summary": "Recent Advances in Parallel Virtual Machine and Message Passing Interface \u2026, 1998"}, "publication": "Recent Advances in Parallel Virtual Machine and Message Passing Interface \u2026, 1998", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=-PvfVhgAAAAJ&cstart=100&pagesize=100&sortby=pubdate&citation_for_view=-PvfVhgAAAAJ:ClCfbGk0d_YC"}, {"title": "Communication-efficient deterministic parallel algorithms for planar point location and 2d Voronoi diagram", "authors": "M Diallol, A Ferreira, A Rau-Chaplin", "year": 1998, "citation_id": "-PvfVhgAAAAJ:-f6ydRqryjwC", "result_id": "-PvfVhgAAAAJ:-f6ydRqryjwC", "source": "scholar", "publication_info": {"summary": "Annual Symposium on Theoretical Aspects of Computer Science, 399-409, 1998"}, "publication": "Annual Symposium on Theoretical Aspects of Computer Science, 399-409, 1998", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=-PvfVhgAAAAJ&cstart=100&pagesize=100&sortby=pubdate&citation_for_view=-PvfVhgAAAAJ:-f6ydRqryjwC"}, {"title": "Algorithms for Solving SLAE using PVM", "authors": "V Alexandrov\u00b9, F Dehne, A Rau-Chaplin, K Taft\u00b9", "year": 1998, "citation_id": "-PvfVhgAAAAJ:0N-VGjzr574C", "result_id": "-PvfVhgAAAAJ:0N-VGjzr574C", "source": "scholar", "publication_info": {"summary": "Recent Advances in Parallel Virtual Machine and Message Passing Interface \u2026, 1998"}, "publication": "Recent Advances in Parallel Virtual Machine and Message Passing Interface \u2026, 1998", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=-PvfVhgAAAAJ&cstart=100&pagesize=100&sortby=pubdate&citation_for_view=-PvfVhgAAAAJ:0N-VGjzr574C"}, {"title": "article no. PC981496", "authors": "L Boxer, MP Connolly, P Fitzpatrick, E Fleury, P Fraigniaud, ...", "year": 1998, "citation_id": "-PvfVhgAAAAJ:VOx2b1Wkg3QC", "result_id": "-PvfVhgAAAAJ:VOx2b1Wkg3QC", "source": "scholar", "publication_info": {"summary": "journal of parallel and distributed computing 53, 174, 1998"}, "publication": "journal of parallel and distributed computing 53, 174, 1998", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=-PvfVhgAAAAJ&cstart=100&pagesize=100&sortby=pubdate&citation_for_view=-PvfVhgAAAAJ:VOx2b1Wkg3QC"}, {"title": "Graphics support for a World-Wide-Web based architectural design service", "authors": "A Rau-Chaplin, B MacKay-Lyons, T Doucette, J Gajewski, X Hu, ...", "year": 1997, "citation_id": "-PvfVhgAAAAJ:YOwf2qJgpHMC", "result_id": "-PvfVhgAAAAJ:YOwf2qJgpHMC", "source": "scholar", "publication_info": {"summary": "Computer networks and ISDN systems 29 (14), 1611-1623, 1997"}, "publication": "Computer networks and ISDN systems 29 (14), 1611-1623, 1997", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=-PvfVhgAAAAJ&cstart=100&pagesize=100&sortby=pubdate&citation_for_view=-PvfVhgAAAAJ:YOwf2qJgpHMC"}, {"title": "A graphical language for generating architectural forms", "authors": "A Rau-Chaplin, TJ Smedley", "year": 1997, "citation_id": "-PvfVhgAAAAJ:IWHjjKOFINEC", "result_id": "-PvfVhgAAAAJ:IWHjjKOFINEC", "source": "scholar", "publication_info": {"summary": "Proceedings. 1997 IEEE Symposium on Visual Languages (Cat. No. 97TB100180 \u2026, 1997"}, "publication": "Proceedings. 1997 IEEE Symposium on Visual Languages (Cat. No. 97TB100180 \u2026, 1997", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=-PvfVhgAAAAJ&cstart=100&pagesize=100&sortby=pubdate&citation_for_view=-PvfVhgAAAAJ:IWHjjKOFINEC"}, {"title": "Coarse grained parallel next element search", "authors": "A Chan, F Dehne, A Rau-Chaplin", "year": 1997, "citation_id": "-PvfVhgAAAAJ:_kc_bZDykSQC", "result_id": "-PvfVhgAAAAJ:_kc_bZDykSQC", "source": "scholar", "publication_info": {"summary": "Proceedings 11th International Parallel Processing Symposium, 320-325, 1997"}, "publication": "Proceedings 11th International Parallel Processing Symposium, 320-325, 1997", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=-PvfVhgAAAAJ&cstart=100&pagesize=100&sortby=pubdate&citation_for_view=-PvfVhgAAAAJ:_kc_bZDykSQC"}, {"title": "Coarse Grained Parallel Next Element Search", "authors": "A Rau-Chaplin", "year": 1997, "citation_id": "-PvfVhgAAAAJ:hCrLmN-GePgC", "result_id": "-PvfVhgAAAAJ:hCrLmN-GePgC", "source": "scholar", "publication_info": {"summary": "Eleventh International Parallel Processing Symposium, 320, 1997"}, "publication": "Eleventh International Parallel Processing Symposium, 320, 1997", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=-PvfVhgAAAAJ&cstart=100&pagesize=100&sortby=pubdate&citation_for_view=-PvfVhgAAAAJ:hCrLmN-GePgC"}, {"title": "D-dimensional range search on multicomputers", "authors": "S Ub\u00e9da, A Rau-Chaplin, A Ferreira", "year": 1997, "citation_id": "-PvfVhgAAAAJ:fEOibwPWpKIC", "result_id": "-PvfVhgAAAAJ:fEOibwPWpKIC", "source": "scholar", "publication_info": {"summary": "International Parallel Processing Symposium, 1997"}, "publication": "International Parallel Processing Symposium, 1997", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=-PvfVhgAAAAJ&cstart=100&pagesize=100&sortby=pubdate&citation_for_view=-PvfVhgAAAAJ:fEOibwPWpKIC"}, {"title": "Some scalable parallel algorithms for geometric problems", "authors": "L Boxer, R Miller, A Rau-Chaplin", "year": 1996, "citation_id": "-PvfVhgAAAAJ:4TOpqqG69KYC", "result_id": "-PvfVhgAAAAJ:4TOpqqG69KYC", "source": "scholar", "publication_info": {"summary": "Department of Computer Science, University at Buffalo, State University of \u2026, 1996"}, "publication": "Department of Computer Science, University at Buffalo, State University of \u2026, 1996", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=-PvfVhgAAAAJ&cstart=100&pagesize=100&sortby=pubdate&citation_for_view=-PvfVhgAAAAJ:4TOpqqG69KYC"}, {"title": "The LaHave House Project: Towards an automated architectural design service", "authors": "A Rau-Chaplin, B MacKay-Lyons, P Spierenburg", "year": 1996, "citation_id": "-PvfVhgAAAAJ:zYLM7Y9cAGgC", "result_id": "-PvfVhgAAAAJ:zYLM7Y9cAGgC", "source": "scholar", "publication_info": {"summary": "Cadex 96, 24-31, 1996"}, "publication": "Cadex 96, 24-31, 1996", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=-PvfVhgAAAAJ&cstart=100&pagesize=100&sortby=pubdate&citation_for_view=-PvfVhgAAAAJ:zYLM7Y9cAGgC"}, {"title": "Scalable algorithmic techniques for discrete problems that lack obvious structure", "authors": "A RAU-CHAPLIN", "year": 1996, "citation_id": "-PvfVhgAAAAJ:4OULZ7Gr8RgC", "result_id": "-PvfVhgAAAAJ:4OULZ7Gr8RgC", "source": "scholar", "publication_info": {"summary": "Symposium on parallel computing for solving large scale and irregular \u2026, 1996"}, "publication": "Symposium on parallel computing for solving large scale and irregular \u2026, 1996", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=-PvfVhgAAAAJ&cstart=100&pagesize=100&sortby=pubdate&citation_for_view=-PvfVhgAAAAJ:4OULZ7Gr8RgC"}, {"title": "Scalable 2d convex hull and triangulation algorithms for coarse grained multicomputers", "authors": "A Ferreira, A Rau-Chaplin, S Ueda", "year": 1995, "citation_id": "-PvfVhgAAAAJ:Tyk-4Ss8FVUC", "result_id": "-PvfVhgAAAAJ:Tyk-4Ss8FVUC", "source": "scholar", "publication_info": {"summary": "Proceedings. Seventh IEEE Symposium on Parallel and Distributed Processing \u2026, 1995"}, "publication": "Proceedings. Seventh IEEE Symposium on Parallel and Distributed Processing \u2026, 1995", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=-PvfVhgAAAAJ&cstart=100&pagesize=100&sortby=pubdate&citation_for_view=-PvfVhgAAAAJ:Tyk-4Ss8FVUC"}, {"title": "Hypercube algorithms for parallel processing of pointer-based quadtrees", "authors": "F Dehne, A Rau-Chaplin, AG Ferreira", "year": 1995, "citation_id": "-PvfVhgAAAAJ:L8Ckcad2t8MC", "result_id": "-PvfVhgAAAAJ:L8Ckcad2t8MC", "source": "scholar", "publication_info": {"summary": "Computer Vision and Image Understanding 62 (1), 1-10, 1995"}, "publication": "Computer Vision and Image Understanding 62 (1), 1-10, 1995", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=-PvfVhgAAAAJ&cstart=100&pagesize=100&sortby=pubdate&citation_for_view=-PvfVhgAAAAJ:L8Ckcad2t8MC"}, {"title": "Construction of d-Dimensional Hyperoctrees on a Hypercube Multiprocessor", "authors": "F Dehne, A Fabri, M Nassar, A Rauchaplin, R Valiveti", "year": 1994, "citation_id": "-PvfVhgAAAAJ:3s1wT3WcHBgC", "result_id": "-PvfVhgAAAAJ:3s1wT3WcHBgC", "source": "scholar", "publication_info": {"summary": "Journal of Parallel and Distributed Computing 23 (2), 256-261, 1994"}, "publication": "Journal of Parallel and Distributed Computing 23 (2), 256-261, 1994", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=-PvfVhgAAAAJ&cstart=100&pagesize=100&sortby=pubdate&citation_for_view=-PvfVhgAAAAJ:3s1wT3WcHBgC"}, {"title": "A massively parallel knowledge-base server using a hypercube multiprocessor", "authors": "F Dehne, A Ferreira, A Rau-Chaplin", "year": 1994, "citation_id": "-PvfVhgAAAAJ:JV2RwH3_ST0C", "result_id": "-PvfVhgAAAAJ:JV2RwH3_ST0C", "source": "scholar", "publication_info": {"summary": "Parallel Computing 20 (9), 1369-1382, 1994"}, "publication": "Parallel Computing 20 (9), 1369-1382, 1994", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=-PvfVhgAAAAJ&cstart=100&pagesize=100&sortby=pubdate&citation_for_view=-PvfVhgAAAAJ:JV2RwH3_ST0C"}, {"title": "Multisearch techniques: parallel data structures on mesh-connected computers", "authors": "MJ Atallah, F Dehne, R Miller, A Rauchaplin, JJ Tsay", "year": 1994, "citation_id": "-PvfVhgAAAAJ:hqOjcs7Dif8C", "result_id": "-PvfVhgAAAAJ:hqOjcs7Dif8C", "source": "scholar", "publication_info": {"summary": "Journal of Parallel and Distributed Computing 20 (1), 1-13, 1994"}, "publication": "Journal of Parallel and Distributed Computing 20 (1), 1-13, 1994", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=-PvfVhgAAAAJ&cstart=100&pagesize=100&sortby=pubdate&citation_for_view=-PvfVhgAAAAJ:hqOjcs7Dif8C"}, {"title": "Scalable parallel geometric algorithms for coarse grained multicomputers", "authors": "F Dehne, A Fabri, A Rau-Chaplin", "year": 1993, "citation_id": "-PvfVhgAAAAJ:u5HHmVD_uO8C", "result_id": "-PvfVhgAAAAJ:u5HHmVD_uO8C", "source": "scholar", "publication_info": {"summary": "Proceedings of the ninth annual symposium on Computational geometry, 298-307, 1993"}, "publication": "Proceedings of the ninth annual symposium on Computational geometry, 298-307, 1993", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=-PvfVhgAAAAJ&cstart=100&pagesize=100&sortby=pubdate&citation_for_view=-PvfVhgAAAAJ:u5HHmVD_uO8C"}, {"title": "Polygonal approximation by boundary reduction", "authors": "L Boxer, CS Chang, R Miller, A Rau-Chaplin", "year": 1993, "citation_id": "-PvfVhgAAAAJ:Y0pCki6q_DkC", "result_id": "-PvfVhgAAAAJ:Y0pCki6q_DkC", "source": "scholar", "publication_info": {"summary": "Pattern Recognition Letters 14 (2), 111-119, 1993"}, "publication": "Pattern Recognition Letters 14 (2), 111-119, 1993", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=-PvfVhgAAAAJ&cstart=100&pagesize=100&sortby=pubdate&citation_for_view=-PvfVhgAAAAJ:Y0pCki6q_DkC"}, {"title": "On parallel data structures and parallel geometric applications for multicomputers", "authors": "A Rau-Chaplin", "year": 1993, "citation_id": "-PvfVhgAAAAJ:TFP_iSt0sucC", "result_id": "-PvfVhgAAAAJ:TFP_iSt0sucC", "source": "scholar", "publication_info": {"summary": "Carleton University, 1993"}, "publication": "Carleton University, 1993", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=-PvfVhgAAAAJ&cstart=100&pagesize=100&sortby=pubdate&citation_for_view=-PvfVhgAAAAJ:TFP_iSt0sucC"}, {"title": "Scalable parallel geometric algorithms for coarse grainned multicomputers", "authors": "F Dehne, A Fabri, A Rau-Chaplin", "year": 1993, "citation_id": "-PvfVhgAAAAJ:BUYA1_V_uYcC", "result_id": "-PvfVhgAAAAJ:BUYA1_V_uYcC", "source": "scholar", "publication_info": {"summary": "Rapports de recherche- INRIA, 1993"}, "publication": "Rapports de recherche- INRIA, 1993", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=-PvfVhgAAAAJ&cstart=100&pagesize=100&sortby=pubdate&citation_for_view=-PvfVhgAAAAJ:BUYA1_V_uYcC"}, {"title": "Scalable Parallel Geometric Algorithms for Coarse Grained Multicomputers Algorithmes g eom etriques parall eles multi-echelles pour machines multi-processeurs a gros grain", "authors": "F Dehne, A Fabri, A Rau-Chaplin", "year": 1992, "citation_id": "-PvfVhgAAAAJ:BqipwSGYUEgC", "result_id": "-PvfVhgAAAAJ:BqipwSGYUEgC", "source": "scholar", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=-PvfVhgAAAAJ&cstart=100&pagesize=100&sortby=pubdate&citation_for_view=-PvfVhgAAAAJ:BqipwSGYUEgC"}, {"title": "Parallel fractional cascading on hypercube multiprocessors", "authors": "F Dehne, A Ferreira, A Rau-Chaplin", "year": 1992, "citation_id": "-PvfVhgAAAAJ:ufrVoPGSRksC", "result_id": "-PvfVhgAAAAJ:ufrVoPGSRksC", "source": "scholar", "publication_info": {"summary": "Computational Geometry 2 (3), 141-167, 1992"}, "publication": "Computational Geometry 2 (3), 141-167, 1992", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=-PvfVhgAAAAJ&cstart=100&pagesize=100&sortby=pubdate&citation_for_view=-PvfVhgAAAAJ:ufrVoPGSRksC"}, {"title": "UNIT E DE RECHERCHE INRIA-SOPHIA ANTIPOLIS", "authors": "F Dehne, A Fabri, M Nassar, A Rau-Chaplin, R Valiveti", "year": 1992, "citation_id": "-PvfVhgAAAAJ:M05iB0D1s5AC", "result_id": "-PvfVhgAAAAJ:M05iB0D1s5AC", "source": "scholar", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=-PvfVhgAAAAJ&cstart=100&pagesize=100&sortby=pubdate&citation_for_view=-PvfVhgAAAAJ:M05iB0D1s5AC"}, {"title": "Construction of d-Dimensional Hyperoctrees on a Hypercube Multiprocessor", "authors": "A Rau-Chaplin", "year": 1992, "citation_id": "-PvfVhgAAAAJ:epqYDVWIO7EC", "result_id": "-PvfVhgAAAAJ:epqYDVWIO7EC", "source": "scholar", "publication_info": {"summary": "Proceedings, 373, 1992"}, "publication": "Proceedings, 373, 1992", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=-PvfVhgAAAAJ&cstart=100&pagesize=100&sortby=pubdate&citation_for_view=-PvfVhgAAAAJ:epqYDVWIO7EC"}, {"title": "Construction of d-dimensional hyperoctrees on a hypercube multiprocessor", "authors": "F Dehne, A Fabri, M Nassar, A Rau-Chaplin, R Valiveti", "year": 1992, "citation_id": "-PvfVhgAAAAJ:NJ774b8OgUMC", "result_id": "-PvfVhgAAAAJ:NJ774b8OgUMC", "source": "scholar", "publication_info": {"summary": "INRIA, 1992"}, "publication": "INRIA, 1992", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=-PvfVhgAAAAJ&cstart=100&pagesize=100&sortby=pubdate&citation_for_view=-PvfVhgAAAAJ:NJ774b8OgUMC"}, {"title": "Efficient parallel data structures for fine-grained hypercube multiprocessors.", "authors": "A Rau-Chaplin", "year": 1992, "citation_id": "-PvfVhgAAAAJ:ns9cj8rnVeAC", "result_id": "-PvfVhgAAAAJ:ns9cj8rnVeAC", "source": "scholar", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=-PvfVhgAAAAJ&cstart=100&pagesize=100&sortby=pubdate&citation_for_view=-PvfVhgAAAAJ:ns9cj8rnVeAC"}, {"title": "Optical clustering on a mesh-connected computer", "authors": "F Dehne, R Miller, A Rau-Chaplin", "year": 1991, "citation_id": "-PvfVhgAAAAJ:isC4tDSrTZIC", "result_id": "-PvfVhgAAAAJ:isC4tDSrTZIC", "source": "scholar", "publication_info": {"summary": "International journal of parallel programming 20 (6), 475-486, 1991"}, "publication": "International journal of parallel programming 20 (6), 475-486, 1991", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=-PvfVhgAAAAJ&cstart=100&pagesize=100&sortby=pubdate&citation_for_view=-PvfVhgAAAAJ:isC4tDSrTZIC"}, {"title": "Multisearch techniques for implementing data structures on a mesh-connected computer (preliminary version)", "authors": "MJ Atallah, F Dehne, R Miller, A Rau-Chaplin, JJ Tsay", "year": 1991, "citation_id": "-PvfVhgAAAAJ:LkGwnXOMwfcC", "result_id": "-PvfVhgAAAAJ:LkGwnXOMwfcC", "source": "scholar", "publication_info": {"summary": "Proceedings of the third annual ACM symposium on Parallel algorithms and \u2026, 1991"}, "publication": "Proceedings of the third annual ACM symposium on Parallel algorithms and \u2026, 1991", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=-PvfVhgAAAAJ&cstart=100&pagesize=100&sortby=pubdate&citation_for_view=-PvfVhgAAAAJ:LkGwnXOMwfcC"}, {"title": "Efficient Parallel Construction and Manipulation of Quadtrees.", "authors": "FKHA Dehne, A Ferreira, A Rau-Chaplin", "year": 1991, "citation_id": "-PvfVhgAAAAJ:_xSYboBqXhAC", "result_id": "-PvfVhgAAAAJ:_xSYboBqXhAC", "source": "scholar", "publication_info": {"summary": "ICPP (3), 255-262, 1991"}, "publication": "ICPP (3), 255-262, 1991", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=-PvfVhgAAAAJ&cstart=100&pagesize=100&sortby=pubdate&citation_for_view=-PvfVhgAAAAJ:_xSYboBqXhAC"}, {"title": "Parallel algorithms for color image quantization on hypercubes and meshes.", "authors": "FKHA Dehne, A Rau-Chaplin", "year": 1991, "citation_id": "-PvfVhgAAAAJ:ZHo1McVdvXMC", "result_id": "-PvfVhgAAAAJ:ZHo1McVdvXMC", "source": "scholar", "publication_info": {"summary": "Algorithms and Parallel VLSI Architectures, 91-96, 1991"}, "publication": "Algorithms and Parallel VLSI Architectures, 91-96, 1991", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=-PvfVhgAAAAJ&cstart=100&pagesize=100&sortby=pubdate&citation_for_view=-PvfVhgAAAAJ:ZHo1McVdvXMC"}, {"title": "Parallel processing of pointer based quadtrees on hypercube multiprocessors", "authors": "F Dehne, AG Ferreira, A Rau-Chaplin", "year": 1991, "citation_id": "-PvfVhgAAAAJ:mB3voiENLucC", "result_id": "-PvfVhgAAAAJ:mB3voiENLucC", "source": "scholar", "publication_info": {"summary": "Proc. International Conference on Parallel Processing, 1991"}, "publication": "Proc. International Conference on Parallel Processing, 1991", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=-PvfVhgAAAAJ&cstart=100&pagesize=100&sortby=pubdate&citation_for_view=-PvfVhgAAAAJ:mB3voiENLucC"}, {"title": "A massively parallel knowledge-base server using a hypercube multiprocessor", "authors": "F Dehne, AG Ferreira, A Rau-Chaplin", "year": 1990, "citation_id": "-PvfVhgAAAAJ:kNdYIx-mwKoC", "result_id": "-PvfVhgAAAAJ:kNdYIx-mwKoC", "source": "scholar", "publication_info": {"summary": "[1990] Proceedings of the 2nd International IEEE Conference on Tools for \u2026, 1990"}, "publication": "[1990] Proceedings of the 2nd International IEEE Conference on Tools for \u2026, 1990", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=-PvfVhgAAAAJ&cstart=100&pagesize=100&sortby=pubdate&citation_for_view=-PvfVhgAAAAJ:kNdYIx-mwKoC"}, {"title": "Parallel branch and bound on fine-grained hypercube multiprocessors", "authors": "F Dehne, AG Ferreira, A Rau-Chaplin", "year": 1990, "citation_id": "-PvfVhgAAAAJ:0EnyYjriUFMC", "result_id": "-PvfVhgAAAAJ:0EnyYjriUFMC", "source": "scholar", "publication_info": {"summary": "Parallel computing 15 (1-3), 201-209, 1990"}, "publication": "Parallel computing 15 (1-3), 201-209, 1990", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=-PvfVhgAAAAJ&cstart=100&pagesize=100&sortby=pubdate&citation_for_view=-PvfVhgAAAAJ:0EnyYjriUFMC"}, {"title": "fine-grained hypercube multiprocessors", "authors": "F Dehne, AG Ferreira, A Rau-Chaplin, C Parallel", "year": 1990, "citation_id": "-PvfVhgAAAAJ:-_dYPAW6P2MC", "result_id": "-PvfVhgAAAAJ:-_dYPAW6P2MC", "source": "scholar", "publication_info": {"summary": "Parcella'90 2, 51, 1990"}, "publication": "Parcella'90 2, 51, 1990", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=-PvfVhgAAAAJ&cstart=100&pagesize=100&sortby=pubdate&citation_for_view=-PvfVhgAAAAJ:-_dYPAW6P2MC"}, {"title": "Parallel Processing of Quad Trees on the Hypercube (and PRAM)", "authors": "F Dehne, AG Ferreira, A Rau-Chaplin", "year": 1990, "citation_id": "-PvfVhgAAAAJ:EUQCXRtRnyEC", "result_id": "-PvfVhgAAAAJ:EUQCXRtRnyEC", "source": "scholar", "publication_info": {"summary": "Carleton University, School of Computer Science, 1990"}, "publication": "Carleton University, School of Computer Science, 1990", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=-PvfVhgAAAAJ&cstart=100&pagesize=100&sortby=pubdate&citation_for_view=-PvfVhgAAAAJ:EUQCXRtRnyEC"}, {"title": "Parallel AI algorithms for fine-granind hypercube multiprocessors", "authors": "F Dehne, AG Ferreira, A Rau-Chaplin", "year": 1990, "citation_id": "-PvfVhgAAAAJ:M3NEmzRMIkIC", "result_id": "-PvfVhgAAAAJ:M3NEmzRMIkIC", "source": "scholar", "publication_info": {"summary": "Proc. V. Int. Ws. on Parallel Processing by Cellular Automata and Arrays \u2026, 1990"}, "publication": "Proc. V. Int. Ws. on Parallel Processing by Cellular Automata and Arrays \u2026, 1990", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=-PvfVhgAAAAJ&cstart=100&pagesize=100&sortby=pubdate&citation_for_view=-PvfVhgAAAAJ:M3NEmzRMIkIC"}, {"title": "Implementing data structures on a hypercube multiprocessor, and applications in parallel computational geometry", "authors": "F Dehne, A Rau-Chaplin", "year": 1989, "citation_id": "-PvfVhgAAAAJ:2osOgNQ5qMEC", "result_id": "-PvfVhgAAAAJ:2osOgNQ5qMEC", "source": "scholar", "publication_info": {"summary": "International Workshop on Graph-Theoretic Concepts in Computer Science, 316-329, 1989"}, "publication": "International Workshop on Graph-Theoretic Concepts in Computer Science, 316-329, 1989", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=-PvfVhgAAAAJ&cstart=100&pagesize=100&sortby=pubdate&citation_for_view=-PvfVhgAAAAJ:2osOgNQ5qMEC"}, {"title": "Centerfor Parallel and Distributed Computing, School of Computer Science", "authors": "F DEHNE, A FERREIRA, A RAU-CHAPLIN", "year": 1989, "citation_id": "-PvfVhgAAAAJ:edDO8Oi4QzsC", "result_id": "-PvfVhgAAAAJ:edDO8Oi4QzsC", "source": "scholar", "publication_info": {"summary": "Computing, 1084-1093, 1989"}, "publication": "Computing, 1084-1093, 1989", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=-PvfVhgAAAAJ&cstart=100&pagesize=100&sortby=pubdate&citation_for_view=-PvfVhgAAAAJ:edDO8Oi4QzsC"}, {"title": "DAD: a real-time expert system for monitoring of data packet networks", "authors": "S Rabie, A Rau-Chaplin, T Shibahara", "year": 1988, "citation_id": "-PvfVhgAAAAJ:D03iK_w7-QYC", "result_id": "-PvfVhgAAAAJ:D03iK_w7-QYC", "source": "scholar", "publication_info": {"summary": "IEEE Network 2 (5), 29-34, 1988"}, "publication": "IEEE Network 2 (5), 29-34, 1988", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=-PvfVhgAAAAJ&cstart=100&pagesize=100&sortby=pubdate&citation_for_view=-PvfVhgAAAAJ:D03iK_w7-QYC"}, {"title": "A Massively Parallel Knowledge-Base Server Using a Hypercube Multiprocessor", "authors": "A Rau-Chaplin", "year": "", "citation_id": "-PvfVhgAAAAJ:Ug5p-4gJ2f0C", "result_id": "-PvfVhgAAAAJ:Ug5p-4gJ2f0C", "source": "scholar", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=-PvfVhgAAAAJ&cstart=100&pagesize=100&sortby=pubdate&citation_for_view=-PvfVhgAAAAJ:Ug5p-4gJ2f0C"}, {"title": "Algorithms and Data Structures [electronic resource]: 5th International Workshop, WADS'97 Halifax, Nova Scotia, Canada August 6\u20138, 1997 Proceedings", "authors": "F Dehne, A Rau-Chaplin, R Tamassia", "year": "", "citation_id": "-PvfVhgAAAAJ:Dip1O2bNi0gC", "result_id": "-PvfVhgAAAAJ:Dip1O2bNi0gC", "source": "scholar", "publication_info": {"summary": "Berlin, Heidelberg: Springer Berlin Heidelberg,, 0"}, "publication": "Berlin, Heidelberg: Springer Berlin Heidelberg,, 0", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=-PvfVhgAAAAJ&cstart=100&pagesize=100&sortby=pubdate&citation_for_view=-PvfVhgAAAAJ:Dip1O2bNi0gC"}, {"title": "Multisearch Techniques for Implementing Data Structures on a Mesh-Connected Computer", "authors": "R Miller, A Rau-Chaplin, JJ Tsayf", "year": "", "citation_id": "-PvfVhgAAAAJ:MLfJN-KU85MC", "result_id": "-PvfVhgAAAAJ:MLfJN-KU85MC", "source": "scholar", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=-PvfVhgAAAAJ&cstart=100&pagesize=100&sortby=pubdate&citation_for_view=-PvfVhgAAAAJ:MLfJN-KU85MC"}, {"title": "Message from the CIT-2018 General Chairs", "authors": "W Pedrycz, VCM Leung, A Rau-Chaplin", "year": "", "citation_id": "-PvfVhgAAAAJ:Z5m8FVwuT1cC", "result_id": "-PvfVhgAAAAJ:Z5m8FVwuT1cC", "source": "scholar", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=-PvfVhgAAAAJ&cstart=100&pagesize=100&sortby=pubdate&citation_for_view=-PvfVhgAAAAJ:Z5m8FVwuT1cC"}, {"title": "A PSO-Based Algorithm With Local Search for Multimodal Optimization Without Constraints", "authors": "A Rau-Chaplin, RF Lopes", "year": "", "citation_id": "-PvfVhgAAAAJ:VLnqNzywnoUC", "result_id": "-PvfVhgAAAAJ:VLnqNzywnoUC", "source": "scholar", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=-PvfVhgAAAAJ&cstart=100&pagesize=100&sortby=pubdate&citation_for_view=-PvfVhgAAAAJ:VLnqNzywnoUC"}, {"title": "ISSASiM 2015 Workshop Program Committee", "authors": "B Freudenthaler, R Stumptner, N Bicocchi, K Kawagoe, B Magoutas, ...", "year": "", "citation_id": "-PvfVhgAAAAJ:_Re3VWB3Y0AC", "result_id": "-PvfVhgAAAAJ:_Re3VWB3Y0AC", "source": "scholar", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=-PvfVhgAAAAJ&cstart=100&pagesize=100&sortby=pubdate&citation_for_view=-PvfVhgAAAAJ:_Re3VWB3Y0AC"}, {"title": "WHPCF\u201914 Program Committee Members", "authors": "C Albanese, J Ashley, D Cohen, M Di Pierro, P Flannery, D Kalamkar, ...", "year": "", "citation_id": "-PvfVhgAAAAJ:SdhP9T11ey4C", "result_id": "-PvfVhgAAAAJ:SdhP9T11ey4C", "source": "scholar", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=-PvfVhgAAAAJ&cstart=100&pagesize=100&sortby=pubdate&citation_for_view=-PvfVhgAAAAJ:SdhP9T11ey4C"}, {"title": "ISSASiM 2014 Workshop Committee", "authors": "N Bicocchi, K Delic, P Derler, J K\u00fcng, B Magoutas, K Matou\u0161ek, ...", "year": "", "citation_id": "-PvfVhgAAAAJ:tkaPQYYpVKoC", "result_id": "-PvfVhgAAAAJ:tkaPQYYpVKoC", "source": "scholar", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=-PvfVhgAAAAJ&cstart=100&pagesize=100&sortby=pubdate&citation_for_view=-PvfVhgAAAAJ:tkaPQYYpVKoC"}, {"title": "ISSASim 2013", "authors": "B Freudenthaler, R Stumptner, P Derler, E Forstner, J K\u00fcng, D Leber, ...", "year": "", "citation_id": "-PvfVhgAAAAJ:XiVPGOgt02cC", "result_id": "-PvfVhgAAAAJ:XiVPGOgt02cC", "source": "scholar", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=-PvfVhgAAAAJ&cstart=100&pagesize=100&sortby=pubdate&citation_for_view=-PvfVhgAAAAJ:XiVPGOgt02cC"}, {"title": "High Performance Risk Aggregation: Addressing the Data Processing Challenge the Hadoop MapReduce Way", "authors": "A Rau-Chaplin, B Varghese, Z Yao", "year": "", "citation_id": "-PvfVhgAAAAJ:vRqMK49ujn8C", "result_id": "-PvfVhgAAAAJ:vRqMK49ujn8C", "source": "scholar", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=-PvfVhgAAAAJ&cstart=100&pagesize=100&sortby=pubdate&citation_for_view=-PvfVhgAAAAJ:vRqMK49ujn8C"}, {"title": "Parallel fractional cascading on hypercube multiprocessors", "authors": "A Rau-Chaplin", "year": "", "citation_id": "-PvfVhgAAAAJ:f2IySw72cVMC", "result_id": "-PvfVhgAAAAJ:f2IySw72cVMC", "source": "scholar", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=-PvfVhgAAAAJ&cstart=100&pagesize=100&sortby=pubdate&citation_for_view=-PvfVhgAAAAJ:f2IySw72cVMC"}, {"title": "Algorithms and data structures (Halifax NS, August 6-8, 1997)", "authors": "F Dehne, A Rau-Chaplin, JR Sack, R Tamassia", "year": "", "citation_id": "-PvfVhgAAAAJ:pyW8ca7W8N0C", "result_id": "-PvfVhgAAAAJ:pyW8ca7W8N0C", "source": "scholar", "publication_info": {"summary": "Lecture notes in computer science, 0"}, "publication": "Lecture notes in computer science, 0", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=-PvfVhgAAAAJ&cstart=100&pagesize=100&sortby=pubdate&citation_for_view=-PvfVhgAAAAJ:pyW8ca7W8N0C"}, {"title": "Fifth High-Performance Grid Computing Workshop (HPGC 2008)", "authors": "E Aubanel, VBMA Frumkin, F Dehne, W Du, W Gentzsch, D German, ...", "year": "", "citation_id": "-PvfVhgAAAAJ:fPk4N6BV_jEC", "result_id": "-PvfVhgAAAAJ:fPk4N6BV_jEC", "source": "scholar", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=-PvfVhgAAAAJ&cstart=100&pagesize=100&sortby=pubdate&citation_for_view=-PvfVhgAAAAJ:fPk4N6BV_jEC"}, {"title": "Frank Dehne Todd Eavis Susanne Hambrusch n", "authors": "A Rau-Chaplin", "year": "", "citation_id": "-PvfVhgAAAAJ:u_35RYKgDlwC", "result_id": "-PvfVhgAAAAJ:u_35RYKgDlwC", "source": "scholar", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=-PvfVhgAAAAJ&cstart=100&pagesize=100&sortby=pubdate&citation_for_view=-PvfVhgAAAAJ:u_35RYKgDlwC"}, {"title": "Frank Dehne", "authors": "A Rau-Chaplin", "year": "", "citation_id": "-PvfVhgAAAAJ:zA6iFVUQeVQC", "result_id": "-PvfVhgAAAAJ:zA6iFVUQeVQC", "source": "scholar", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=-PvfVhgAAAAJ&cstart=100&pagesize=100&sortby=pubdate&citation_for_view=-PvfVhgAAAAJ:zA6iFVUQeVQC"}, {"title": "Scalable Algorithm Design Techniques for Discrete Problems that Lack Obvious Structure", "authors": "A Rau-Chaplin", "year": "", "citation_id": "-PvfVhgAAAAJ:SeFeTyx0c_EC", "result_id": "-PvfVhgAAAAJ:SeFeTyx0c_EC", "source": "scholar", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=-PvfVhgAAAAJ&cstart=100&pagesize=100&sortby=pubdate&citation_for_view=-PvfVhgAAAAJ:SeFeTyx0c_EC"}, {"title": "46, allee d'Italie PO Box 1000, Halifax 69364 Lyon Cedex 07, France Nova Scotia, Canada B3J 2X4 Firstname. Name@ lip. ens-lyon. fr arc@ tuns. ca", "authors": "A Ferreira, C Kenyon, A Rau-Chaplin, S Ubeda", "year": "", "citation_id": "-PvfVhgAAAAJ:ldfaerwXgEUC", "result_id": "-PvfVhgAAAAJ:ldfaerwXgEUC", "source": "scholar", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=-PvfVhgAAAAJ&cstart=100&pagesize=100&sortby=pubdate&citation_for_view=-PvfVhgAAAAJ:ldfaerwXgEUC"}, {"title": "Communication-E cient Deterministic Parallel Algorithms for Planar Point Location and 2d Voronoi Diagram?", "authors": "M Diallo, A Ferreira, A Rau-Chaplin", "year": "", "citation_id": "-PvfVhgAAAAJ:2P1L_qKh6hAC", "result_id": "-PvfVhgAAAAJ:2P1L_qKh6hAC", "source": "scholar", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=-PvfVhgAAAAJ&cstart=100&pagesize=100&sortby=pubdate&citation_for_view=-PvfVhgAAAAJ:2P1L_qKh6hAC"}, {"title": "Workshop on High Performance Grid Computing", "authors": "RF Van Der Wijngaart, M Frumkin, W Gentzsch, D German, G Initiative, ...", "year": "", "citation_id": "-PvfVhgAAAAJ:70eg2SAEIzsC", "result_id": "-PvfVhgAAAAJ:70eg2SAEIzsC", "source": "scholar", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=-PvfVhgAAAAJ&cstart=100&pagesize=100&sortby=pubdate&citation_for_view=-PvfVhgAAAAJ:70eg2SAEIzsC"}, {"title": "Seventh IEEE International Symposium on Cluster Computing and the Grid", "authors": "F Cappello, H Bal, C Williams, P Huibonhoa, JA Holliday, A Hospodor, ...", "year": "", "citation_id": "-PvfVhgAAAAJ:35N4QoGY0k4C", "result_id": "-PvfVhgAAAAJ:35N4QoGY0k4C", "source": "scholar", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=-PvfVhgAAAAJ&cstart=100&pagesize=100&sortby=pubdate&citation_for_view=-PvfVhgAAAAJ:35N4QoGY0k4C"}, {"title": "CLUSTER 2010", "authors": "F Dehne, D Abramson, CH Bischof, EN Caceres, A Cuzzocrea, ...", "year": "", "citation_id": "-PvfVhgAAAAJ:RYcK_YlVTxYC", "result_id": "-PvfVhgAAAAJ:RYcK_YlVTxYC", "source": "scholar", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=-PvfVhgAAAAJ&cstart=100&pagesize=100&sortby=pubdate&citation_for_view=-PvfVhgAAAAJ:RYcK_YlVTxYC"}, {"title": "4 HIPS-HPGC", "authors": "M Frumkin, T Kielmann, RF Van Der Wijngaart, RE Purdue, MS CASC, ...", "year": "", "citation_id": "-PvfVhgAAAAJ:J_g5lzvAfSwC", "result_id": "-PvfVhgAAAAJ:J_g5lzvAfSwC", "source": "scholar", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=-PvfVhgAAAAJ&cstart=100&pagesize=100&sortby=pubdate&citation_for_view=-PvfVhgAAAAJ:J_g5lzvAfSwC"}, {"title": "High Performance Grid Computing\u2013HPGC", "authors": "E Aubanel, VC Bhavsar, MA Frumkin, BJ d'Auriol, W Du, E Huedo, ...", "year": "", "citation_id": "-PvfVhgAAAAJ:RGFaLdJalmkC", "result_id": "-PvfVhgAAAAJ:RGFaLdJalmkC", "source": "scholar", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=-PvfVhgAAAAJ&cstart=100&pagesize=100&sortby=pubdate&citation_for_view=-PvfVhgAAAAJ:RGFaLdJalmkC"}], "search_metadata": {"status": "Success", "source": "serpapi"}}} \ No newline at end of file +{"timestamp": 1783002039.1332471, "data": {"articles": [{"title": "A Novel Enhanced Multiobjective PSO Algorithm for Reinsurance Analytics", "authors": "OAC Cortes, BF de Souza, A Rau-Chaplin", "year": 2026, "citation_id": "-PvfVhgAAAAJ:5qfkUJPXOUwC", "result_id": "-PvfVhgAAAAJ:5qfkUJPXOUwC", "source": "scholar", "publication_info": {"summary": "SN Computer Science 7 (6), 608, 2026"}, "publication": "SN Computer Science 7 (6), 608, 2026", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=-PvfVhgAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=-PvfVhgAAAAJ:5qfkUJPXOUwC"}, {"title": "REINSURANCE ANALYTICS USING SERIAL AND PARALLEL COMPUTATION ON THE MULTIOBJECTIVE EVOLUTIONARY ALGORITHM SPEA2", "authors": "OA CARMONA, OAC CORTES", "year": 2019, "citation_id": "-PvfVhgAAAAJ:ML0RJ9NH7IQC", "result_id": "-PvfVhgAAAAJ:ML0RJ9NH7IQC", "source": "scholar", "publication_info": {"summary": "Congresso Brasileiro de Autom\u00e1tica-CBA 1 (1), 2019"}, "publication": "Congresso Brasileiro de Autom\u00e1tica-CBA 1 (1), 2019", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=-PvfVhgAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=-PvfVhgAAAAJ:ML0RJ9NH7IQC"}, {"title": "Tackling Reinsurance Contract Optimization by Means of Evolutionary Algorithms and HPC", "authors": "OAC Cortes, A Rau-Chaplin", "year": 2018, "citation_id": "-PvfVhgAAAAJ:tuHXwOkdijsC", "result_id": "-PvfVhgAAAAJ:tuHXwOkdijsC", "source": "scholar", "publication_info": {"summary": "High-Performance Computing in Finance, 371-390, 2018"}, "publication": "High-Performance Computing in Finance, 371-390, 2018", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=-PvfVhgAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=-PvfVhgAAAAJ:tuHXwOkdijsC"}, {"title": "VOLAP: A scalable distributed real-time OLAP system for high-velocity data", "authors": "F Dehne, DE Robillard, A Rau-Chaplin, N Burke", "year": 2017, "citation_id": "-PvfVhgAAAAJ:0KyAp5RtaNEC", "result_id": "-PvfVhgAAAAJ:0KyAp5RtaNEC", "source": "scholar", "publication_info": {"summary": "IEEE Transactions on Parallel and Distributed Systems 29 (1), 226-239, 2017"}, "publication": "IEEE Transactions on Parallel and Distributed Systems 29 (1), 226-239, 2017", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=-PvfVhgAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=-PvfVhgAAAAJ:0KyAp5RtaNEC"}, {"title": "Quantifying eventual consistency for aggregate queries", "authors": "N Burke, F Dehne, A Rau-Chaplin, D Robillard", "year": 2017, "citation_id": "-PvfVhgAAAAJ:yB1At4FlUx8C", "result_id": "-PvfVhgAAAAJ:yB1At4FlUx8C", "source": "scholar", "publication_info": {"summary": "Proceedings of the 21st International Database Engineering & Applications \u2026, 2017"}, "publication": "Proceedings of the 21st International Database Engineering & Applications \u2026, 2017", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=-PvfVhgAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=-PvfVhgAAAAJ:yB1At4FlUx8C"}, {"title": "A Survey on Reinsurrance Contract Optimization Using Evolutionary and Swarm Computation", "authors": "OAC Cortes, A Rau-Chaplin, RF Lopes", "year": 2016, "citation_id": "-PvfVhgAAAAJ:XD-gHx7UXLsC", "result_id": "-PvfVhgAAAAJ:XD-gHx7UXLsC", "source": "scholar", "publication_info": {"summary": "IEEE Latin America Transactions 14 (10), 4334-4344, 2016"}, "publication": "IEEE Latin America Transactions 14 (10), 4334-4344, 2016", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=-PvfVhgAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=-PvfVhgAAAAJ:XD-gHx7UXLsC"}, {"title": "Enhanced multiobjective population-based incremental learning with applications in risk treaty optimization", "authors": "OA Carmona Cortes, A Rau-Chaplin", "year": 2016, "citation_id": "-PvfVhgAAAAJ:evX43VCCuoAC", "result_id": "-PvfVhgAAAAJ:evX43VCCuoAC", "source": "scholar", "publication_info": {"summary": "Evolutionary Intelligence 9 (4), 153-165, 2016"}, "publication": "Evolutionary Intelligence 9 (4), 153-165, 2016", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=-PvfVhgAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=-PvfVhgAAAAJ:evX43VCCuoAC"}, {"title": "VOLAP: A scalable distributed system for real-time OLAP with high velocity data", "authors": "F Dehne, D Robillard, A Rau-Chaplin, N Burke", "year": 2016, "citation_id": "-PvfVhgAAAAJ:t7zJ5fGR-2UC", "result_id": "-PvfVhgAAAAJ:t7zJ5fGR-2UC", "source": "scholar", "publication_info": {"summary": "2016 IEEE international conference on cluster computing (CLUSTER), 354-363, 2016"}, "publication": "2016 IEEE international conference on cluster computing (CLUSTER), 354-363, 2016", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=-PvfVhgAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=-PvfVhgAAAAJ:t7zJ5fGR-2UC"}, {"title": "The Hilbert PDC-tree: A high-velocity structure for many-dimensional data", "authors": "D Robillard, F Dehne, A Rau-Chaplin, N Burke", "year": 2016, "citation_id": "-PvfVhgAAAAJ:j8SEvjWlNXcC", "result_id": "-PvfVhgAAAAJ:j8SEvjWlNXcC", "source": "scholar", "publication_info": {"summary": "Proceedings of the 20th International Database Engineering & Applications \u2026, 2016"}, "publication": "Proceedings of the 20th International Database Engineering & Applications \u2026, 2016", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=-PvfVhgAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=-PvfVhgAAAAJ:j8SEvjWlNXcC"}, {"title": "A stochastic adaptive genetic algorithm for solving unconstrained multimodal numerical problems", "authors": "E Carvalho, OAC Cortes, JP Costa, A Rau-Chaplin", "year": 2016, "citation_id": "-PvfVhgAAAAJ:35r97b3x0nAC", "result_id": "-PvfVhgAAAAJ:35r97b3x0nAC", "source": "scholar", "publication_info": {"summary": "2016 IEEE Conference on Evolving and Adaptive Intelligent Systems (EAIS \u2026, 2016"}, "publication": "2016 IEEE Conference on Evolving and Adaptive Intelligent Systems (EAIS \u2026, 2016", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=-PvfVhgAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=-PvfVhgAAAAJ:35r97b3x0nAC"}, {"title": "Accelerating R\u2010based analytics on the cloud", "authors": "I Patel, A Rau\u2010Chaplin, B Varghese", "year": 2016, "citation_id": "-PvfVhgAAAAJ:XiSMed-E-HIC", "result_id": "-PvfVhgAAAAJ:XiSMed-E-HIC", "source": "scholar", "publication_info": {"summary": "Concurrency and Computation: Practice and Experience 28 (4), 977-994, 2016"}, "publication": "Concurrency and Computation: Practice and Experience 28 (4), 977-994, 2016", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=-PvfVhgAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=-PvfVhgAAAAJ:XiSMed-E-HIC"}, {"title": "Computing probable maximum loss in catastrophe reinsurance portfolios on multi\u2010core and many\u2010core architectures", "authors": "N Burke, A Rau\u2010Chaplin, B Varghese", "year": 2016, "citation_id": "-PvfVhgAAAAJ:1yQoGdGgb4wC", "result_id": "-PvfVhgAAAAJ:1yQoGdGgb4wC", "source": "scholar", "publication_info": {"summary": "Concurrency and Computation: Practice and Experience 28 (3), 836-847, 2016"}, "publication": "Concurrency and Computation: Practice and Experience 28 (3), 836-847, 2016", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=-PvfVhgAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=-PvfVhgAAAAJ:1yQoGdGgb4wC"}, {"title": "Industrial-Scale Ad Hoc Risk Analytics Using MapReduce", "authors": "A Rau-Chaplin, Z Yao, N Zeh", "year": 2015, "citation_id": "-PvfVhgAAAAJ:UHK10RUVsp4C", "result_id": "-PvfVhgAAAAJ:UHK10RUVsp4C", "source": "scholar", "publication_info": {"summary": "Big Data Analysis: New Algorithms for a New Society, 177-206, 2015"}, "publication": "Big Data Analysis: New Algorithms for a New Society, 177-206, 2015", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=-PvfVhgAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=-PvfVhgAAAAJ:UHK10RUVsp4C"}, {"title": "A new vector evaluated PBIL algorithm for reinsurance analytics", "authors": "OAC Cortes, A Rau-Chaplin, PF do Prado", "year": 2015, "citation_id": "-PvfVhgAAAAJ:hkOj_22Ku90C", "result_id": "-PvfVhgAAAAJ:hkOj_22Ku90C", "source": "scholar", "publication_info": {"summary": "2015 Latin America Congress on Computational Intelligence (LA-CCI), 1-6, 2015"}, "publication": "2015 Latin America Congress on Computational Intelligence (LA-CCI), 1-6, 2015", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=-PvfVhgAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=-PvfVhgAAAAJ:hkOj_22Ku90C"}, {"title": "Efficient computation of co-occurrence based word relatedness", "authors": "J Mei, X Kou, Z Yao, A Rau-Chaplin, A Islam, A Moh'd, EE Milios", "year": 2015, "citation_id": "-PvfVhgAAAAJ:ye4kPcJQO24C", "result_id": "-PvfVhgAAAAJ:ye4kPcJQO24C", "source": "scholar", "publication_info": {"summary": "Proceedings of the 2015 ACM Symposium on Document Engineering, 43-46, 2015"}, "publication": "Proceedings of the 2015 ACM Symposium on Document Engineering, 43-46, 2015", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=-PvfVhgAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=-PvfVhgAAAAJ:ye4kPcJQO24C"}, {"title": "Efficient Parallelization of the Google Trigram Method for Document Relatedness Computation", "authors": "X Kou, J Mei, Z Yao, A Rau-Chaplin, A Islam, A Moh'd, E Milios", "year": 2015, "citation_id": "-PvfVhgAAAAJ:uLbwQdceFCQC", "result_id": "-PvfVhgAAAAJ:uLbwQdceFCQC", "source": "scholar", "publication_info": {"summary": "2015 44th International Conference on Parallel Processing Workshops, 98-104, 2015"}, "publication": "2015 44th International Conference on Parallel Processing Workshops, 98-104, 2015", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=-PvfVhgAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=-PvfVhgAAAAJ:uLbwQdceFCQC"}, {"title": "An Automatic Code Generator for Parallel Evolutionary Algorithms: Achieving Speedup and Reducing the Programming Efforts", "authors": "OAC Cortes, VS Eveline de Jesus, JA da Silva, A Rau-Chaplin", "year": 2015, "citation_id": "-PvfVhgAAAAJ:N5tVd3kTz84C", "result_id": "-PvfVhgAAAAJ:N5tVd3kTz84C", "source": "scholar", "publication_info": {"summary": "ADVCOMP 2015, 48, 2015"}, "publication": "ADVCOMP 2015, 48, 2015", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=-PvfVhgAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=-PvfVhgAAAAJ:N5tVd3kTz84C"}, {"title": "Scaling Up to Big Data: Algorithmic Engineering+ HPC", "authors": "A Rau Chaplin", "year": 2015, "citation_id": "-PvfVhgAAAAJ:ipzZ9siozwsC", "result_id": "-PvfVhgAAAAJ:ipzZ9siozwsC", "source": "scholar", "publication_info": {"summary": "Statistical and Computational Analytics for Big Data Conference presentation \u2026, 2015"}, "publication": "Statistical and Computational Analytics for Big Data Conference presentation \u2026, 2015", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=-PvfVhgAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=-PvfVhgAAAAJ:ipzZ9siozwsC"}, {"title": "Differential evolution on a gpgpu: The influence of parameters on speedup and the quality of solutions", "authors": "OAC Cortes, MS Pais, FN M\u00f3r, A Rau-Chaplin, CAM Marcon", "year": 2015, "citation_id": "-PvfVhgAAAAJ:5awf1xo2G04C", "result_id": "-PvfVhgAAAAJ:5awf1xo2G04C", "source": "scholar", "publication_info": {"summary": "2015 IEEE International Parallel and Distributed Processing Symposium \u2026, 2015"}, "publication": "2015 IEEE International Parallel and Distributed Processing Symposium \u2026, 2015", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=-PvfVhgAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=-PvfVhgAAAAJ:5awf1xo2G04C"}, {"title": "Scalable real-time OLAP on cloud architectures", "authors": "F Dehne, Q Kong, A Rau-Chaplin, H Zaboli, R Zhou", "year": 2015, "citation_id": "-PvfVhgAAAAJ:dTyEYWd-f8wC", "result_id": "-PvfVhgAAAAJ:dTyEYWd-f8wC", "source": "scholar", "publication_info": {"summary": "Journal of Parallel and Distributed Computing 79, 31-41, 2015"}, "publication": "Journal of Parallel and Distributed Computing 79, 31-41, 2015", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=-PvfVhgAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=-PvfVhgAAAAJ:dTyEYWd-f8wC"}, {"title": "Dynamic optimization of multi-layered reinsurance treaties", "authors": "H Wang, OAC Cortes, A Rau-Chaplin", "year": 2015, "citation_id": "-PvfVhgAAAAJ:eq2jaN3J8jMC", "result_id": "-PvfVhgAAAAJ:eq2jaN3J8jMC", "source": "scholar", "publication_info": {"summary": "Proceedings of the 30th Annual ACM Symposium on Applied Computing, 125-132, 2015"}, "publication": "Proceedings of the 30th Annual ACM Symposium on Applied Computing, 125-132, 2015", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=-PvfVhgAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=-PvfVhgAAAAJ:eq2jaN3J8jMC"}, {"title": "A Modified Multi-objective Differential Evolution Algorithm with Application in Reinsurance Analytics", "authors": "OAC Cortes", "year": 2015, "citation_id": "-PvfVhgAAAAJ:PR6Y55bgFSsC", "result_id": "-PvfVhgAAAAJ:PR6Y55bgFSsC", "source": "scholar", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=-PvfVhgAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=-PvfVhgAAAAJ:PR6Y55bgFSsC"}, {"title": "On VEPSO and VEDE for solving a treaty optimization problem", "authors": "OAC Cortes, A Rau-Chaplin, PF do Prado", "year": 2014, "citation_id": "-PvfVhgAAAAJ:_B80troHkn4C", "result_id": "-PvfVhgAAAAJ:_B80troHkn4C", "source": "scholar", "publication_info": {"summary": "2014 IEEE International Conference on Systems, Man, and Cybernetics (SMC \u2026, 2014"}, "publication": "2014 IEEE International Conference on Systems, Man, and Cybernetics (SMC \u2026, 2014", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=-PvfVhgAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=-PvfVhgAAAAJ:_B80troHkn4C"}, {"title": "EXsight: An analytical framework for quantifying financial loss in the aftermath of catastrophic events", "authors": "M Coelho, A Rau-Chaplin", "year": 2014, "citation_id": "-PvfVhgAAAAJ:WA5NYHcadZ8C", "result_id": "-PvfVhgAAAAJ:WA5NYHcadZ8C", "source": "scholar", "publication_info": {"summary": "2014 25th International Workshop on Database and Expert Systems Applications \u2026, 2014"}, "publication": "2014 25th International Workshop on Database and Expert Systems Applications \u2026, 2014", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=-PvfVhgAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=-PvfVhgAAAAJ:WA5NYHcadZ8C"}, {"title": "A study of VEPSO approaches for multiobjective real world applications", "authors": "OAC Cortes, A Rau-Chaplin, D Wilson, J Gaiser-Porter", "year": 2014, "citation_id": "-PvfVhgAAAAJ:Y5dfb0dijaUC", "result_id": "-PvfVhgAAAAJ:Y5dfb0dijaUC", "source": "scholar", "publication_info": {"summary": "Proceedings of The Third International Conference on Data Analytics, 42-48, 2014"}, "publication": "Proceedings of The Third International Conference on Data Analytics, 42-48, 2014", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=-PvfVhgAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=-PvfVhgAAAAJ:Y5dfb0dijaUC"}, {"title": "Parallel MO-PBIL: Computing pareto optimal frontiers efficiently with applications in reinsurance analytics", "authors": "L Brown, AA Beria, OAC Cortes, A Rau-Chaplin, D Wilson, N Burke, ...", "year": 2014, "citation_id": "-PvfVhgAAAAJ:HE397vMXCloC", "result_id": "-PvfVhgAAAAJ:HE397vMXCloC", "source": "scholar", "publication_info": {"summary": "2014 International Conference on High Performance Computing & Simulation \u2026, 2014"}, "publication": "2014 International Conference on High Performance Computing & Simulation \u2026, 2014", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=-PvfVhgAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=-PvfVhgAAAAJ:HE397vMXCloC"}, {"title": "On PBIL, DE and PSO for optimization of reinsurance contracts", "authors": "OAC Cortes, A Rau-Chaplin, D Wilson, J Gaiser-Porter", "year": 2014, "citation_id": "-PvfVhgAAAAJ:Mojj43d5GZwC", "result_id": "-PvfVhgAAAAJ:Mojj43d5GZwC", "source": "scholar", "publication_info": {"summary": "European Conference on the Applications of Evolutionary Computation, 227-238, 2014"}, "publication": "European Conference on the Applications of Evolutionary Computation, 227-238, 2014", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=-PvfVhgAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=-PvfVhgAAAAJ:Mojj43d5GZwC"}, {"title": "Efficient data structures for risk modelling in portfolios of catastrophic risk using mapreduce", "authors": "A Rau-Chaplin, Z Yao, N Zeh", "year": 2014, "citation_id": "-PvfVhgAAAAJ:eMMeJKvmdy0C", "result_id": "-PvfVhgAAAAJ:eMMeJKvmdy0C", "source": "scholar", "publication_info": {"summary": "Procedia Computer Science 29, 1557-1568, 2014"}, "publication": "Procedia Computer Science 29, 1557-1568, 2014", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=-PvfVhgAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=-PvfVhgAAAAJ:eMMeJKvmdy0C"}, {"title": "Developing and testing the automated post-event earthquake loss estimation and visualisation (APE-ELEV) technique", "authors": "A Astoul, C Filliter, E Mason, A Rau-Chaplin, K Shridhar, B Varghese, ...", "year": 2013, "citation_id": "-PvfVhgAAAAJ:kRWSkSYxWN8C", "result_id": "-PvfVhgAAAAJ:kRWSkSYxWN8C", "source": "scholar", "publication_info": {"summary": "Bulletin of Earthquake Engineering 11 (6), 1973-2005, 2013"}, "publication": "Bulletin of Earthquake Engineering 11 (6), 1973-2005, 2013", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=-PvfVhgAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=-PvfVhgAAAAJ:kRWSkSYxWN8C"}, {"title": "Accounting for secondary uncertainty: efficient computation of portfolio risk measures on multi and many core architectures", "authors": "B Varghese, A Rau-Chaplin", "year": 2013, "citation_id": "-PvfVhgAAAAJ:olpn-zPbct0C", "result_id": "-PvfVhgAAAAJ:olpn-zPbct0C", "source": "scholar", "publication_info": {"summary": "Proceedings of the 6th Workshop on High Performance Computational Finance, 1-10, 2013"}, "publication": "Proceedings of the 6th Workshop on High Performance Computational Finance, 1-10, 2013", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=-PvfVhgAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=-PvfVhgAAAAJ:olpn-zPbct0C"}, {"title": "A distributed tree data structure for real-time OLAP on cloud architectures", "authors": "F Dehne, Q Kong, A Rau-Chaplin, H Zaboli, R Zhou", "year": 2013, "citation_id": "-PvfVhgAAAAJ:wbdj-CoPYUoC", "result_id": "-PvfVhgAAAAJ:wbdj-CoPYUoC", "source": "scholar", "publication_info": {"summary": "2013 IEEE International Conference on Big Data, 499-505, 2013"}, "publication": "2013 IEEE International Conference on Big Data, 499-505, 2013", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=-PvfVhgAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=-PvfVhgAAAAJ:wbdj-CoPYUoC"}, {"title": "QuPARA: Query-driven large-scale portfolio aggregate risk analysis on MapReduce", "authors": "A Rau-Chaplin, B Varghese, D Wilson, Z Yao, N Zeh", "year": 2013, "citation_id": "-PvfVhgAAAAJ:J-pR_7NvFogC", "result_id": "-PvfVhgAAAAJ:J-pR_7NvFogC", "source": "scholar", "publication_info": {"summary": "2013 IEEE International Conference on Big Data, 703-709, 2013"}, "publication": "2013 IEEE International Conference on Big Data, 703-709, 2013", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=-PvfVhgAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=-PvfVhgAAAAJ:J-pR_7NvFogC"}, {"title": "Achieving speedup in aggregate risk analysis using multiple GPUs", "authors": "AK Bahl, O Baltzer, A Rau-Chaplin, B Varghese, A Whiteway", "year": 2013, "citation_id": "-PvfVhgAAAAJ:1qzjygNMrQYC", "result_id": "-PvfVhgAAAAJ:1qzjygNMrQYC", "source": "scholar", "publication_info": {"summary": "2013 42nd International Conference on Parallel Processing, 909-916, 2013"}, "publication": "2013 42nd International Conference on Parallel Processing, 909-916, 2013", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=-PvfVhgAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=-PvfVhgAAAAJ:1qzjygNMrQYC"}, {"title": "Efficient optimization of reinsurance contracts using discretized PBIL", "authors": "OAC Cortes, A Rau-Chaplin, D Wilson, I Cook, J Gaiser-Porter", "year": 2013, "citation_id": "-PvfVhgAAAAJ:5ugPr518TE4C", "result_id": "-PvfVhgAAAAJ:5ugPr518TE4C", "source": "scholar", "publication_info": {"summary": "Data Analytics, Porto, 2013"}, "publication": "Data Analytics, Porto, 2013", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=-PvfVhgAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=-PvfVhgAAAAJ:5ugPr518TE4C"}, {"title": "Risk analytics for estimating and validating magnitude of earthquake losses", "authors": "A Astoul, C Filliter, A Rau-Chaplin, K Shridhar, B Varghese, N Varshney", "year": 2013, "citation_id": "-PvfVhgAAAAJ:bnK-pcrLprsC", "result_id": "-PvfVhgAAAAJ:bnK-pcrLprsC", "source": "scholar", "publication_info": {"summary": "2013 24th International Workshop on Database and Expert Systems Applications \u2026, 2013"}, "publication": "2013 24th International Workshop on Database and Expert Systems Applications \u2026, 2013", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=-PvfVhgAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=-PvfVhgAAAAJ:bnK-pcrLprsC"}, {"title": "High performance risk aggregation: addressing the data processing challenge the hadoop mapreduce way", "authors": "Z Yao, B Varghese, A Rau-Chaplin", "year": 2013, "citation_id": "-PvfVhgAAAAJ:q3oQSFYPqjQC", "result_id": "-PvfVhgAAAAJ:q3oQSFYPqjQC", "source": "scholar", "publication_info": {"summary": "Proceedings of the 4th ACM workshop on Scientific cloud computing, 53-60, 2013"}, "publication": "Proceedings of the 4th ACM workshop on Scientific cloud computing, 53-60, 2013", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=-PvfVhgAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=-PvfVhgAAAAJ:q3oQSFYPqjQC"}, {"title": "Building a scalable spatial OLAP system", "authors": "O Baltzer, A Rau-Chaplin, N Zeh", "year": 2013, "citation_id": "-PvfVhgAAAAJ:geHnlv5EZngC", "result_id": "-PvfVhgAAAAJ:geHnlv5EZngC", "source": "scholar", "publication_info": {"summary": "Proceedings of the 28th Annual ACM Symposium on Applied Computing, 13-15, 2013"}, "publication": "Proceedings of the 28th Annual ACM Symposium on Applied Computing, 13-15, 2013", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=-PvfVhgAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=-PvfVhgAAAAJ:geHnlv5EZngC"}, {"title": "Multi-GPU computing for achieving speedup in real-time aggregate risk analysis", "authors": "AK Bahl, O Baltzer, A Rau-Chaplin, B Varghese, A Whiteway", "year": 2013, "citation_id": "-PvfVhgAAAAJ:tS2w5q8j5-wC", "result_id": "-PvfVhgAAAAJ:tS2w5q8j5-wC", "source": "scholar", "publication_info": {"summary": "High Performance Computing on Graphics Processing Units (hgpu. org), 2013"}, "publication": "High Performance Computing on Graphics Processing Units (hgpu. org), 2013", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=-PvfVhgAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=-PvfVhgAAAAJ:tS2w5q8j5-wC"}, {"title": "A MapReduce framework for analysing portfolios of catastrophic risk with secondary uncertainty", "authors": "A Rau-Chaplin, B Varghese, Z Yao", "year": 2013, "citation_id": "-PvfVhgAAAAJ:5Ul4iDaHHb8C", "result_id": "-PvfVhgAAAAJ:5Ul4iDaHHb8C", "source": "scholar", "publication_info": {"summary": "Procedia Computer Science 18, 2317-2326, 2013"}, "publication": "Procedia Computer Science 18, 2317-2326, 2013", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=-PvfVhgAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=-PvfVhgAAAAJ:5Ul4iDaHHb8C"}, {"title": "OLAP for moving object data", "authors": "O Baltzer, F Dehne, A Rau-Chaplin", "year": 2013, "citation_id": "-PvfVhgAAAAJ:K3LRdlH-MEoC", "result_id": "-PvfVhgAAAAJ:K3LRdlH-MEoC", "source": "scholar", "publication_info": {"summary": "International Journal of Intelligent Information and Database Systems 7 (1 \u2026, 2013"}, "publication": "International Journal of Intelligent Information and Database Systems 7 (1 \u2026, 2013", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=-PvfVhgAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=-PvfVhgAAAAJ:K3LRdlH-MEoC"}, {"title": "Data Challenges in High-Performance Risk Analytics", "authors": "B Varghese, A Rau-Chaplin", "year": 2012, "citation_id": "-PvfVhgAAAAJ:tOudhMTPpwUC", "result_id": "-PvfVhgAAAAJ:tOudhMTPpwUC", "source": "scholar", "publication_info": {"summary": "2012 SC Companion: High Performance Computing, Networking Storage and \u2026, 2012"}, "publication": "2012 SC Companion: High Performance Computing, Networking Storage and \u2026, 2012", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=-PvfVhgAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=-PvfVhgAAAAJ:tOudhMTPpwUC"}, {"title": "Parallel simulations for analysing portfolios of catastrophic event risk", "authors": "AK Bahl, O Baltzer, A Rau-Chaplin, B Varghese", "year": 2012, "citation_id": "-PvfVhgAAAAJ:u9iWguZQMMsC", "result_id": "-PvfVhgAAAAJ:u9iWguZQMMsC", "source": "scholar", "publication_info": {"summary": "2012 SC Companion: High Performance Computing, Networking Storage and \u2026, 2012"}, "publication": "2012 SC Companion: High Performance Computing, Networking Storage and \u2026, 2012", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=-PvfVhgAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=-PvfVhgAAAAJ:u9iWguZQMMsC"}, {"title": "A pso-based algorithm with local search for multimodal optimization without constraints", "authors": "OAC Cortes, A Rau-Chaplin, RF Lopes", "year": 2012, "citation_id": "-PvfVhgAAAAJ:08ZZubdj9fEC", "result_id": "-PvfVhgAAAAJ:08ZZubdj9fEC", "source": "scholar", "publication_info": {"summary": "2012 XXXVIII Conferencia Latinoamericana En Informatica (CLEI), 1-7, 2012"}, "publication": "2012 XXXVIII Conferencia Latinoamericana En Informatica (CLEI), 1-7, 2012", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=-PvfVhgAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=-PvfVhgAAAAJ:08ZZubdj9fEC"}, {"title": "A platform for parallel R-based analytics on cloud infrastructure", "authors": "I Patel, A Rau-Chaplin, B Varghese", "year": 2012, "citation_id": "-PvfVhgAAAAJ:p2g8aNsByqUC", "result_id": "-PvfVhgAAAAJ:p2g8aNsByqUC", "source": "scholar", "publication_info": {"summary": "2012 41st International Conference on Parallel Processing Workshops, 188-193, 2012"}, "publication": "2012 41st International Conference on Parallel Processing Workshops, 188-193, 2012", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=-PvfVhgAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=-PvfVhgAAAAJ:p2g8aNsByqUC"}, {"title": "Rapid post-event catastrophe modelling and visualization", "authors": "E Mason, A Rau-Chaplin, K Shridhar, B Varghese, N Varshney", "year": 2012, "citation_id": "-PvfVhgAAAAJ:uWQEDVKXjbEC", "result_id": "-PvfVhgAAAAJ:uWQEDVKXjbEC", "source": "scholar", "publication_info": {"summary": "2012 23rd International Workshop on Database and Expert Systems Applications \u2026, 2012"}, "publication": "2012 23rd International Workshop on Database and Expert Systems Applications \u2026, 2012", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=-PvfVhgAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=-PvfVhgAAAAJ:uWQEDVKXjbEC"}, {"title": "High-performance grid and cloud computing workshop-HPGC", "authors": "E Aubanel, VC Bhavsar, MA Frumkin, A Aggarwal, D Bacigalupo, ...", "year": 2011, "citation_id": "-PvfVhgAAAAJ:xtoqd-5pKcoC", "result_id": "-PvfVhgAAAAJ:xtoqd-5pKcoC", "source": "scholar", "publication_info": {"summary": "High-performance grid and cloud computing workshop-HPGC, 880, 2011"}, "publication": "High-performance grid and cloud computing workshop-HPGC, 880, 2011", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=-PvfVhgAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=-PvfVhgAAAAJ:xtoqd-5pKcoC"}, {"title": "Parallel catastrophe modelling on a Cell/BE", "authors": "F Dehne, G Hickey, A Rau-Chaplin, M Byrne", "year": 2010, "citation_id": "-PvfVhgAAAAJ:NMxIlDl6LWMC", "result_id": "-PvfVhgAAAAJ:NMxIlDl6LWMC", "source": "scholar", "publication_info": {"summary": "International Journal of Parallel, Emergent and Distributed Systems 25 (5 \u2026, 2010"}, "publication": "International Journal of Parallel, Emergent and Distributed Systems 25 (5 \u2026, 2010", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=-PvfVhgAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=-PvfVhgAAAAJ:NMxIlDl6LWMC"}, {"title": "Parallel catastrophe modelling on a cell processor", "authors": "F Dehne, G Hickey, A Rau-Chaplin, M Byrne", "year": 2009, "citation_id": "-PvfVhgAAAAJ:hMod-77fHWUC", "result_id": "-PvfVhgAAAAJ:hMod-77fHWUC", "source": "scholar", "publication_info": {"summary": "Proceedings of the 2009 Conference of the Center for Advanced Studies on \u2026, 2009"}, "publication": "Proceedings of the 2009 Conference of the Center for Advanced Studies on \u2026, 2009", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=-PvfVhgAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=-PvfVhgAAAAJ:hMod-77fHWUC"}, {"title": "Cooperative caching for grid-enabled OLAP", "authors": "F Dehne, M Lawrence, A Rau-Chaplin", "year": 2009, "citation_id": "-PvfVhgAAAAJ:bEWYMUwI8FkC", "result_id": "-PvfVhgAAAAJ:bEWYMUwI8FkC", "source": "scholar", "publication_info": {"summary": "International Journal of Grid and Utility Computing 1 (2), 169-181, 2009"}, "publication": "International Journal of Grid and Utility Computing 1 (2), 169-181, 2009", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=-PvfVhgAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=-PvfVhgAAAAJ:bEWYMUwI8FkC"}, {"title": "OLAP for Trajectories", "authors": "O Baltzer, F Dehne, S Hambrusch, A Rau-Chaplin", "year": 2008, "citation_id": "-PvfVhgAAAAJ:dhFuZR0502QC", "result_id": "-PvfVhgAAAAJ:dhFuZR0502QC", "source": "scholar", "publication_info": {"summary": "International Conference on Database and Expert Systems Applications, 340-347, 2008"}, "publication": "International Conference on Database and Expert Systems Applications, 340-347, 2008", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=-PvfVhgAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=-PvfVhgAAAAJ:dhFuZR0502QC"}, {"title": "RCUBE: parallel multi-dimensional ROLAP indexing", "authors": "F Dehne, T Eavis, A Rau-Chaplin", "year": 2008, "citation_id": "-PvfVhgAAAAJ:R3hNpaxXUhUC", "result_id": "-PvfVhgAAAAJ:R3hNpaxXUhUC", "source": "scholar", "publication_info": {"summary": "International Journal of Data Warehousing and Mining (IJDWM) 4 (3), 1-14, 2008"}, "publication": "International Journal of Data Warehousing and Mining (IJDWM) 4 (3), 1-14, 2008", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=-PvfVhgAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=-PvfVhgAAAAJ:R3hNpaxXUhUC"}, {"title": "PnP: sequential, external memory, and parallel iceberg cube computation", "authors": "Y Chen, F Dehne, T Eavis, A Rau-Chaplin", "year": 2008, "citation_id": "-PvfVhgAAAAJ:RHpTSmoSYBkC", "result_id": "-PvfVhgAAAAJ:RHpTSmoSYBkC", "source": "scholar", "publication_info": {"summary": "Distributed and Parallel Databases 23 (2), 99-126, 2008"}, "publication": "Distributed and Parallel Databases 23 (2), 99-126, 2008", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=-PvfVhgAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=-PvfVhgAAAAJ:RHpTSmoSYBkC"}, {"title": "Compact Hilbert indices: Space-filling curves for domains with unequal side lengths", "authors": "CH Hamilton, A Rau-Chaplin", "year": 2008, "citation_id": "-PvfVhgAAAAJ:qUcmZB5y_30C", "result_id": "-PvfVhgAAAAJ:qUcmZB5y_30C", "source": "scholar", "publication_info": {"summary": "Information Processing Letters 105 (5), 155-163, 2008"}, "publication": "Information Processing Letters 105 (5), 155-163, 2008", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=-PvfVhgAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=-PvfVhgAAAAJ:qUcmZB5y_30C"}, {"title": "SPR Distance Computation for Unrooted Trees", "authors": "G Hickey, F Dehne, A Rau-Chaplin, C Blouin", "year": 2008, "citation_id": "-PvfVhgAAAAJ:YsMSGLbcyi4C", "result_id": "-PvfVhgAAAAJ:YsMSGLbcyi4C", "source": "scholar", "publication_info": {"summary": "Evolutionary Bioinformatics 4, EBO. S419, 2008"}, "publication": "Evolutionary Bioinformatics 4, EBO. S419, 2008", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=-PvfVhgAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=-PvfVhgAAAAJ:YsMSGLbcyi4C"}, {"title": "Efficient computation of view subsets", "authors": "F Dehne, T Eavis, A Rau-Chaplin", "year": 2007, "citation_id": "-PvfVhgAAAAJ:_Qo2XoVZTnwC", "result_id": "-PvfVhgAAAAJ:_Qo2XoVZTnwC", "source": "scholar", "publication_info": {"summary": "Proceedings of the ACM tenth international workshop on Data warehousing and \u2026, 2007"}, "publication": "Proceedings of the ACM tenth international workshop on Data warehousing and \u2026, 2007", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=-PvfVhgAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=-PvfVhgAAAAJ:_Qo2XoVZTnwC"}, {"title": "Adaptive tuple differential coding", "authors": "JP Deveaux, A Rau-Chaplin, N Zeh", "year": 2007, "citation_id": "-PvfVhgAAAAJ:dfsIfKJdRG4C", "result_id": "-PvfVhgAAAAJ:dfsIfKJdRG4C", "source": "scholar", "publication_info": {"summary": "International Conference on Database and Expert Systems Applications, 109-119, 2007"}, "publication": "International Conference on Database and Expert Systems Applications, 109-119, 2007", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=-PvfVhgAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=-PvfVhgAAAAJ:dfsIfKJdRG4C"}, {"title": "Storage and indexing of relational OLAP views with mixed categorical and continuous dimensions", "authors": "O Baltzer, A Rau-Chaplin, N Zeh", "year": 2007, "citation_id": "-PvfVhgAAAAJ:GnPB-g6toBAC", "result_id": "-PvfVhgAAAAJ:GnPB-g6toBAC", "source": "scholar", "publication_info": {"summary": "Journal of Digital Information Management 5 (4), 180, 2007"}, "publication": "Journal of Digital Information Management 5 (4), 180, 2007", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=-PvfVhgAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=-PvfVhgAAAAJ:GnPB-g6toBAC"}, {"title": "Cooperative caching for grid based datawarehouses", "authors": "F Dehne, M Lawrence, A Rau-Chaplin", "year": 2007, "citation_id": "-PvfVhgAAAAJ:HDshCWvjkbEC", "result_id": "-PvfVhgAAAAJ:HDshCWvjkbEC", "source": "scholar", "publication_info": {"summary": "Seventh IEEE International Symposium on Cluster Computing and the Grid \u2026, 2007"}, "publication": "Seventh IEEE International Symposium on Cluster Computing and the Grid \u2026, 2007", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=-PvfVhgAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=-PvfVhgAAAAJ:HDshCWvjkbEC"}, {"title": "Parallel computation of skyline queries", "authors": "A Cosgaya-Lozano, A Rau-Chaplin, N Zeh", "year": 2007, "citation_id": "-PvfVhgAAAAJ:8k81kl-MbHgC", "result_id": "-PvfVhgAAAAJ:8k81kl-MbHgC", "source": "scholar", "publication_info": {"summary": "21st International Symposium on High Performance Computing Systems and \u2026, 2007"}, "publication": "21st International Symposium on High Performance Computing Systems and \u2026, 2007", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=-PvfVhgAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=-PvfVhgAAAAJ:8k81kl-MbHgC"}, {"title": "Compact Hilbert indices for multi-dimensional data", "authors": "CH Hamilton, A Rau-Chaplin", "year": 2007, "citation_id": "-PvfVhgAAAAJ:hFOr9nPyWt4C", "result_id": "-PvfVhgAAAAJ:hFOr9nPyWt4C", "source": "scholar", "publication_info": {"summary": "First International Conference on Complex, Intelligent and Software \u2026, 2007"}, "publication": "First International Conference on Complex, Intelligent and Software \u2026, 2007", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=-PvfVhgAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=-PvfVhgAAAAJ:hFOr9nPyWt4C"}, {"title": "Implementing OLAP query fragment aggregation and recombination for the OLAP enabled grid", "authors": "M Lawrence, F Dehne, A Rau-Chaplin", "year": 2007, "citation_id": "-PvfVhgAAAAJ:4DMP91E08xMC", "result_id": "-PvfVhgAAAAJ:4DMP91E08xMC", "source": "scholar", "publication_info": {"summary": "2007 IEEE International Parallel and Distributed Processing Symposium, 1-8, 2007"}, "publication": "2007 IEEE International Parallel and Distributed Processing Symposium, 1-8, 2007", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=-PvfVhgAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=-PvfVhgAAAAJ:4DMP91E08xMC"}, {"title": "Dynamic view selection for OLAP", "authors": "M Lawrence, A Rau-Chaplin", "year": 2006, "citation_id": "-PvfVhgAAAAJ:MXK_kJrjxJIC", "result_id": "-PvfVhgAAAAJ:MXK_kJrjxJIC", "source": "scholar", "publication_info": {"summary": "International Conference on Data Warehousing and Knowledge Discovery, 33-44, 2006"}, "publication": "International Conference on Data Warehousing and Knowledge Discovery, 33-44, 2006", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=-PvfVhgAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=-PvfVhgAAAAJ:MXK_kJrjxJIC"}, {"title": "The computational complexity of the unrooted subtree prune and regraft distance", "authors": "G Hickey, F Dehne, A Rau-Chaplin, C Blouin", "year": 2006, "citation_id": "-PvfVhgAAAAJ:e5wmG9Sq2KIC", "result_id": "-PvfVhgAAAAJ:e5wmG9Sq2KIC", "source": "scholar", "publication_info": {"summary": "Technical Report CS-2006-06, Faculty of Computer Science, Dalhousie University, 2006"}, "publication": "Technical Report CS-2006-06, Faculty of Computer Science, Dalhousie University, 2006", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=-PvfVhgAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=-PvfVhgAAAAJ:e5wmG9Sq2KIC"}, {"title": "The OLAP-enabled grid: Model and query processing algorithms", "authors": "M Lawrence, A Rau-Chaplin", "year": 2006, "citation_id": "-PvfVhgAAAAJ:UebtZRa9Y70C", "result_id": "-PvfVhgAAAAJ:UebtZRa9Y70C", "source": "scholar", "publication_info": {"summary": "20th International Symposium on High-Performance Computing in an Advanced \u2026, 2006"}, "publication": "20th International Symposium on High-Performance Computing in an Advanced \u2026, 2006", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=-PvfVhgAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=-PvfVhgAAAAJ:UebtZRa9Y70C"}, {"title": "cgmOLAP: Efficient parallel generation and querying of terabyte size ROLAP data cubes", "authors": "Y Chen, A Rau-Chaplin, F Dehne, T Eavis, D Green, E Sithirasenan", "year": 2006, "citation_id": "-PvfVhgAAAAJ:ULOm3_A8WrAC", "result_id": "-PvfVhgAAAAJ:ULOm3_A8WrAC", "source": "scholar", "publication_info": {"summary": "22nd International Conference on Data Engineering (ICDE'06), 164-164, 2006"}, "publication": "22nd International Conference on Data Engineering (ICDE'06), 164-164, 2006", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=-PvfVhgAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=-PvfVhgAAAAJ:ULOm3_A8WrAC"}, {"title": "Improved data partitioning for building large ROLAP data cubes in parallel", "authors": "Y Chen, F Dehne, T Eavis, A Rau-Chaplin", "year": 2006, "citation_id": "-PvfVhgAAAAJ:9ZlFYXVOiuMC", "result_id": "-PvfVhgAAAAJ:9ZlFYXVOiuMC", "source": "scholar", "publication_info": {"summary": "International Journal of Data Warehousing and Mining (IJDWM) 2 (1), 1-26, 2006"}, "publication": "International Journal of Data Warehousing and Mining (IJDWM) 2 (1), 1-26, 2006", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=-PvfVhgAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=-PvfVhgAAAAJ:9ZlFYXVOiuMC"}, {"title": "The cgmCUBE project: Optimizing parallel data cube generation for ROLAP", "authors": "F Dehne, T Eavis, A Rau-Chaplin", "year": 2006, "citation_id": "-PvfVhgAAAAJ:IjCSPb-OGe4C", "result_id": "-PvfVhgAAAAJ:IjCSPb-OGe4C", "source": "scholar", "publication_info": {"summary": "Distributed and Parallel Databases 19 (1), 29-62, 2006"}, "publication": "Distributed and Parallel Databases 19 (1), 29-62, 2006", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=-PvfVhgAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=-PvfVhgAAAAJ:IjCSPb-OGe4C"}, {"title": "Parallel querying of ROLAP cubes in the presence of hierarchies", "authors": "F Dehne, T Eavis, A Rau-Chaplin", "year": 2005, "citation_id": "-PvfVhgAAAAJ:ZeXyd9-uunAC", "result_id": "-PvfVhgAAAAJ:ZeXyd9-uunAC", "source": "scholar", "publication_info": {"summary": "Proceedings of the 8th ACM International Workshop on Data Warehousing and \u2026, 2005"}, "publication": "Proceedings of the 8th ACM International Workshop on Data Warehousing and \u2026, 2005", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=-PvfVhgAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=-PvfVhgAAAAJ:ZeXyd9-uunAC"}, {"title": "A coarse grained parallel algorithm for closest larger ancestors in trees with applications to single link clustering", "authors": "A Chan, C Gao, A Rau-Chaplin", "year": 2005, "citation_id": "-PvfVhgAAAAJ:blknAaTinKkC", "result_id": "-PvfVhgAAAAJ:blknAaTinKkC", "source": "scholar", "publication_info": {"summary": "International Conference on High Performance Computing and Communications \u2026, 2005"}, "publication": "International Conference on High Performance Computing and Communications \u2026, 2005", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=-PvfVhgAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=-PvfVhgAAAAJ:blknAaTinKkC"}, {"title": "Fast Parallel Maximum Likelihood-Based Protein Phylogeny.", "authors": "C Blouin, D Butt, G Hickey, A Rau-Chaplin", "year": 2005, "citation_id": "-PvfVhgAAAAJ:k_IJM867U9cC", "result_id": "-PvfVhgAAAAJ:k_IJM867U9cC", "source": "scholar", "publication_info": {"summary": "PDCS, 281-287, 2005"}, "publication": "PDCS, 281-287, 2005", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=-PvfVhgAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=-PvfVhgAAAAJ:k_IJM867U9cC"}, {"title": "Adding parallelism to visual data flow programs", "authors": "P Cox, S Gauvin, A Rau-Chaplin", "year": 2005, "citation_id": "-PvfVhgAAAAJ:aqlVkmm33-oC", "result_id": "-PvfVhgAAAAJ:aqlVkmm33-oC", "source": "scholar", "publication_info": {"summary": "Proceedings of the 2005 ACM symposium on Software visualization, 135-144, 2005"}, "publication": "Proceedings of the 2005 ACM symposium on Software visualization, 135-144, 2005", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=-PvfVhgAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=-PvfVhgAAAAJ:aqlVkmm33-oC"}, {"title": "PnP: Parallel and external memory iceberg cube computation", "authors": "Y Chen, F Dehne, T Eavis, A Rau-Chaplin", "year": 2005, "citation_id": "-PvfVhgAAAAJ:qxL8FJ1GzNcC", "result_id": "-PvfVhgAAAAJ:qxL8FJ1GzNcC", "source": "scholar", "publication_info": {"summary": "21st International Conference on Data Engineering (ICDE'05), 576-577, 2005"}, "publication": "21st International Conference on Data Engineering (ICDE'05), 576-577, 2005", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=-PvfVhgAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=-PvfVhgAAAAJ:qxL8FJ1GzNcC"}, {"title": "Track 15-Database Applications and Data Mining-A Coarse Grained Parallel Algorithm for Closest Larger Ancestors in Trees with Applications to Single Link Clustering", "authors": "A Chan, C Gao, A Rau-Chaplin", "year": 2005, "citation_id": "-PvfVhgAAAAJ:O3NaXMp0MMsC", "result_id": "-PvfVhgAAAAJ:O3NaXMp0MMsC", "source": "scholar", "publication_info": {"summary": "Lecture Notes in Computer Science 3726, 856-865, 2005"}, "publication": "Lecture Notes in Computer Science 3726, 856-865, 2005", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=-PvfVhgAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=-PvfVhgAAAAJ:O3NaXMp0MMsC"}, {"title": "Building large ROLAP data cubes in parallel", "authors": "Y Chen, F Dehne, T Eavis, A Rau-Chaplin", "year": 2004, "citation_id": "-PvfVhgAAAAJ:Se3iqnhoufwC", "result_id": "-PvfVhgAAAAJ:Se3iqnhoufwC", "source": "scholar", "publication_info": {"summary": "Proceedings. International Database Engineering and Applications Symposium \u2026, 2004"}, "publication": "Proceedings. International Database Engineering and Applications Symposium \u2026, 2004", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=-PvfVhgAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=-PvfVhgAAAAJ:Se3iqnhoufwC"}, {"title": "Top-down computation of partial ROLAP data cubes", "authors": "F Dehne, T Eavis, A Rau-Chaplin", "year": 2004, "citation_id": "-PvfVhgAAAAJ:7PzlFSSx8tAC", "result_id": "-PvfVhgAAAAJ:7PzlFSSx8tAC", "source": "scholar", "publication_info": {"summary": "37th Annual Hawaii International Conference on System Sciences, 2004 \u2026, 2004"}, "publication": "37th Annual Hawaii International Conference on System Sciences, 2004 \u2026, 2004", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=-PvfVhgAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=-PvfVhgAAAAJ:7PzlFSSx8tAC"}, {"title": "Building Large ROLAP Data Cubes in Parallel\u00b9", "authors": "A Rau-Chaplin", "year": 2004, "citation_id": "-PvfVhgAAAAJ:XoXfffV-tXoC", "result_id": "-PvfVhgAAAAJ:XoXfffV-tXoC", "source": "scholar", "publication_info": {"summary": "International Database Engineering and Applications Symposium:(IDEAS'04 \u2026, 2004"}, "publication": "International Database Engineering and Applications Symposium:(IDEAS'04 \u2026, 2004", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=-PvfVhgAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=-PvfVhgAAAAJ:XoXfffV-tXoC"}, {"title": "Computing partial data cubes", "authors": "F Dehne, T Eavis, A Rau-Chaplin", "year": 2004, "citation_id": "-PvfVhgAAAAJ:Zph67rFs4hoC", "result_id": "-PvfVhgAAAAJ:Zph67rFs4hoC", "source": "scholar", "publication_info": {"summary": "Proc. HICSS-37, January, 2-30, 2004"}, "publication": "Proc. HICSS-37, January, 2-30, 2004", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=-PvfVhgAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=-PvfVhgAAAAJ:Zph67rFs4hoC"}, {"title": "Solving large FPT problems on coarse-grained parallel machines", "authors": "J Cheetham, F Dehne, A Rau-Chaplin, U Stege, PJ Taillon", "year": 2003, "citation_id": "-PvfVhgAAAAJ:d1gkVwhDpl0C", "result_id": "-PvfVhgAAAAJ:d1gkVwhDpl0C", "source": "scholar", "publication_info": {"summary": "Journal of Computer and System Sciences 67 (4), 691-706, 2003"}, "publication": "Journal of Computer and System Sciences 67 (4), 691-706, 2003", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=-PvfVhgAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=-PvfVhgAAAAJ:d1gkVwhDpl0C"}, {"title": "Parallel CLUSTAL W for PC Clusters", "authors": "J Cheetham, F Dehne, S Pitre, A Rau-Chaplin, PJ Taillon", "year": 2003, "citation_id": "-PvfVhgAAAAJ:WF5omc3nYNoC", "result_id": "-PvfVhgAAAAJ:WF5omc3nYNoC", "source": "scholar", "publication_info": {"summary": "International Conference on Computational Science and Its Applications, 300-309, 2003"}, "publication": "International Conference on Computational Science and Its Applications, 300-309, 2003", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=-PvfVhgAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=-PvfVhgAAAAJ:WF5omc3nYNoC"}, {"title": "A parallel FPT application for clusters", "authors": "J Cheetham, F Dehne, A Rau-Chaplin, U Stege, PJ Taillon", "year": 2003, "citation_id": "-PvfVhgAAAAJ:Wp0gIr-vW9MC", "result_id": "-PvfVhgAAAAJ:Wp0gIr-vW9MC", "source": "scholar", "publication_info": {"summary": "CCGrid 2003. 3rd IEEE/ACM International Symposium on Cluster Computing and \u2026, 2003"}, "publication": "CCGrid 2003. 3rd IEEE/ACM International Symposium on Cluster Computing and \u2026, 2003", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=-PvfVhgAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=-PvfVhgAAAAJ:Wp0gIr-vW9MC"}, {"title": "Parallel multi-dimensional ROLAP indexing", "authors": "F Dehne, T Eavis, A Rau-Chaplin", "year": 2003, "citation_id": "-PvfVhgAAAAJ:UeHWp8X0CEIC", "result_id": "-PvfVhgAAAAJ:UeHWp8X0CEIC", "source": "scholar", "publication_info": {"summary": "CCGrid 2003. 3rd IEEE/ACM International Symposium on Cluster Computing and \u2026, 2003"}, "publication": "CCGrid 2003. 3rd IEEE/ACM International Symposium on Cluster Computing and \u2026, 2003", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=-PvfVhgAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=-PvfVhgAAAAJ:UeHWp8X0CEIC"}, {"title": "Parallel ROLAP data cube construction on shared-nothing multiprocessors", "authors": "Y Chen, F Dehne, T Eavis, A Rau-Chaplin", "year": 2003, "citation_id": "-PvfVhgAAAAJ:9yKSN-GCB0IC", "result_id": "-PvfVhgAAAAJ:9yKSN-GCB0IC", "source": "scholar", "publication_info": {"summary": "Proceedings International Parallel and Distributed Processing Symposium, 10 pp., 2003"}, "publication": "Proceedings International Parallel and Distributed Processing Symposium, 10 pp., 2003", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=-PvfVhgAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=-PvfVhgAAAAJ:9yKSN-GCB0IC"}, {"title": "A Parallel FPT Application For Clusters", "authors": "A Rau-Chaplin", "year": 2003, "citation_id": "-PvfVhgAAAAJ:foquWX3nUaYC", "result_id": "-PvfVhgAAAAJ:foquWX3nUaYC", "source": "scholar", "publication_info": {"summary": "Proceedings 3, 70, 2003"}, "publication": "Proceedings 3, 70, 2003", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=-PvfVhgAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=-PvfVhgAAAAJ:foquWX3nUaYC"}, {"title": "Parallel Multi-Dimensional ROLAP Indexing", "authors": "A Rau-Chaplin", "year": 2003, "citation_id": "-PvfVhgAAAAJ:HbR8gkJAVGIC", "result_id": "-PvfVhgAAAAJ:HbR8gkJAVGIC", "source": "scholar", "publication_info": {"summary": "Proceedings 3, 86, 2003"}, "publication": "Proceedings 3, 86, 2003", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=-PvfVhgAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=-PvfVhgAAAAJ:HbR8gkJAVGIC"}, {"title": "Computational Science and Its Applications\u2014ICCSA 2003", "authors": "TA Tr\u1ecbnh", "year": 2003, "citation_id": "-PvfVhgAAAAJ:lmc2jWPfTJgC", "result_id": "-PvfVhgAAAAJ:lmc2jWPfTJgC", "source": "scholar", "publication_info": {"summary": "Lecture Notes in Computer Science, 2003"}, "publication": "Lecture Notes in Computer Science, 2003", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=-PvfVhgAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=-PvfVhgAAAAJ:lmc2jWPfTJgC"}, {"title": "Jochen Alber, Henning Fernau, and Rolf Niedermeier. Graph separators: a parameterized view", "authors": "J Cheetham, F Dehne, A Rau-Chaplin, U Stege", "year": 2003, "citation_id": "-PvfVhgAAAAJ:fQNAKQ3IYiAC", "result_id": "-PvfVhgAAAAJ:fQNAKQ3IYiAC", "source": "scholar", "publication_info": {"summary": "Journal of Computer and System Sciences 67, 472, 2003"}, "publication": "Journal of Computer and System Sciences 67, 472, 2003", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=-PvfVhgAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=-PvfVhgAAAAJ:fQNAKQ3IYiAC"}, {"title": "Parallel computation on interval graphs: algorithms and experiments", "authors": "A Ferreira, I Gu\u00e9rin Lassous, K Marcus, A Rau\u2010Chaplin", "year": 2002, "citation_id": "-PvfVhgAAAAJ:hC7cP41nSMkC", "result_id": "-PvfVhgAAAAJ:hC7cP41nSMkC", "source": "scholar", "publication_info": {"summary": "Concurrency and Computation: Practice and Experience 14 (11), 885-910, 2002"}, "publication": "Concurrency and Computation: Practice and Experience 14 (11), 885-910, 2002", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=-PvfVhgAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=-PvfVhgAAAAJ:hC7cP41nSMkC"}, {"title": "Parallelizing the data cube", "authors": "F Dehne, T Eavis, S Hambrusch, A Rau-Chaplin", "year": 2002, "citation_id": "-PvfVhgAAAAJ:qjMakFHDy7sC", "result_id": "-PvfVhgAAAAJ:qjMakFHDy7sC", "source": "scholar", "publication_info": {"summary": "Distributed and Parallel Databases 11 (2), 181-201, 2002"}, "publication": "Distributed and Parallel Databases 11 (2), 181-201, 2002", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=-PvfVhgAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=-PvfVhgAAAAJ:qjMakFHDy7sC"}, {"title": "Computing partial data cubes for parallel data warehousing applications", "authors": "F Dehne, T Eavis, A Rau-Chaplin", "year": 2001, "citation_id": "-PvfVhgAAAAJ:5nxA0vEk-isC", "result_id": "-PvfVhgAAAAJ:5nxA0vEk-isC", "source": "scholar", "publication_info": {"summary": "European Parallel Virtual Machine/Message Passing Interface Users\u2019 Group \u2026, 2001"}, "publication": "European Parallel Virtual Machine/Message Passing Interface Users\u2019 Group \u2026, 2001", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=-PvfVhgAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=-PvfVhgAAAAJ:5nxA0vEk-isC"}, {"title": "Coarse grained parallel on-line analytical processing (OLAP) for data mining", "authors": "F Dehne, T Eavis, A Rau-Chaplin", "year": 2001, "citation_id": "-PvfVhgAAAAJ:QIV2ME_5wuYC", "result_id": "-PvfVhgAAAAJ:QIV2ME_5wuYC", "source": "scholar", "publication_info": {"summary": "International Conference on Computational Science, 589-598, 2001"}, "publication": "International Conference on Computational Science, 589-598, 2001", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=-PvfVhgAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=-PvfVhgAAAAJ:QIV2ME_5wuYC"}, {"title": "A cluster architecture for parallel data warehousing", "authors": "F Dehne, T Eavis, A Rau-Chaplin", "year": 2001, "citation_id": "-PvfVhgAAAAJ:eQOLeE2rZwMC", "result_id": "-PvfVhgAAAAJ:eQOLeE2rZwMC", "source": "scholar", "publication_info": {"summary": "Proceedings First IEEE/ACM International Symposium on Cluster Computing and \u2026, 2001"}, "publication": "Proceedings First IEEE/ACM International Symposium on Cluster Computing and \u2026, 2001", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=-PvfVhgAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=-PvfVhgAAAAJ:eQOLeE2rZwMC"}, {"title": "Parallelizing the Data Cube", "authors": "F Dehne\u00b9, T Eavis, S Hambrusch, A Rau-Chaplin", "year": 2001, "citation_id": "-PvfVhgAAAAJ:FPJr55Dyh1AC", "result_id": "-PvfVhgAAAAJ:FPJr55Dyh1AC", "source": "scholar", "publication_info": {"summary": "Database Theory-ICDT 2001: 8th International Conference London, UK, January \u2026, 2001"}, "publication": "Database Theory-ICDT 2001: 8th International Conference London, UK, January \u2026, 2001", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=-PvfVhgAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=-PvfVhgAAAAJ:FPJr55Dyh1AC"}, {"title": "Parallelizing the data cube", "authors": "F Dehne, T Eavis, S Hambrusch, A Rau-Chaplin", "year": 2001, "citation_id": "-PvfVhgAAAAJ:W7OEmFMy1HYC", "result_id": "-PvfVhgAAAAJ:W7OEmFMy1HYC", "source": "scholar", "publication_info": {"summary": "International Conference on Database Theory, 129-143, 2001"}, "publication": "International Conference on Database Theory, 129-143, 2001", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=-PvfVhgAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=-PvfVhgAAAAJ:W7OEmFMy1HYC"}, {"title": "A Cluster Architecture for Parallel Data Warehousing", "authors": "A Rau-Chaplin", "year": 2001, "citation_id": "-PvfVhgAAAAJ:q3CdL3IzO_QC", "result_id": "-PvfVhgAAAAJ:q3CdL3IzO_QC", "source": "scholar", "publication_info": {"summary": "First IEEE/ACM International Symposium on Cluster Computing and the Grid \u2026, 2001"}, "publication": "First IEEE/ACM International Symposium on Cluster Computing and the Grid \u2026, 2001", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=-PvfVhgAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=-PvfVhgAAAAJ:q3CdL3IzO_QC"}, {"title": "Coarse-Grained Parallel Fixed-Parameter Tractable Algorithms,\"", "authors": "F Dehne, A Rau-Chaplin, U Stege, P Taillon", "year": 2001, "citation_id": "-PvfVhgAAAAJ:iH-uZ7U-co4C", "result_id": "-PvfVhgAAAAJ:iH-uZ7U-co4C", "source": "scholar", "publication_info": {"summary": "manuscript, 2001"}, "publication": "manuscript, 2001", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=-PvfVhgAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=-PvfVhgAAAAJ:iH-uZ7U-co4C"}, {"title": "A note on communication-efficient deterministic parallel algorithms for planar point location and 2D Voronoi diagram", "authors": "M Diallo, A Ferreira, A Rau-Chaplin", "year": 2001, "citation_id": "-PvfVhgAAAAJ:M3ejUd6NZC8C", "result_id": "-PvfVhgAAAAJ:M3ejUd6NZC8C", "source": "scholar", "publication_info": {"summary": "Parallel Processing Letters 11 (02n03), 327-340, 2001"}, "publication": "Parallel Processing Letters 11 (02n03), 327-340, 2001", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=-PvfVhgAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=-PvfVhgAAAAJ:M3ejUd6NZC8C"}, {"title": "Load Balanced and Communication Efficient Partitioning Strategies for Parallel Data Cube Generation", "authors": "Z Chen, F Dehne, S Hambrusch, A Rau-Chaplin", "year": 1999, "citation_id": "-PvfVhgAAAAJ:vV6vV6tmYwMC", "result_id": "-PvfVhgAAAAJ:vV6vV6tmYwMC", "source": "scholar", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=-PvfVhgAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=-PvfVhgAAAAJ:vV6vV6tmYwMC"}, {"title": "Scalable parallel algorithms for geometric pattern recognition", "authors": "L Boxer, R Miller, A Rau-Chaplin", "year": 1999, "citation_id": "-PvfVhgAAAAJ:3fE2CSJIrl8C", "result_id": "-PvfVhgAAAAJ:3fE2CSJIrl8C", "source": "scholar", "publication_info": {"summary": "Journal of Parallel and Distributed Computing 58 (3), 466-486, 1999"}, "publication": "Journal of Parallel and Distributed Computing 58 (3), 466-486, 1999", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=-PvfVhgAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=-PvfVhgAAAAJ:3fE2CSJIrl8C"}, {"title": "Parallel algorithms for grounded range search and applications", "authors": "MG Lamoureux, A Rau-Chaplin", "year": 1999, "citation_id": "-PvfVhgAAAAJ:rO6llkc54NcC", "result_id": "-PvfVhgAAAAJ:rO6llkc54NcC", "source": "scholar", "publication_info": {"summary": "European Conference on Parallel Processing, 525-532, 1999"}, "publication": "European Conference on Parallel Processing, 525-532, 1999", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=-PvfVhgAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=-PvfVhgAAAAJ:rO6llkc54NcC"}, {"title": "d-Dimensional Range Search on Multicomputers", "authors": "A Ferreira, C Kenyon, A Rau-Chaplin, S Ub\u00e9da", "year": 1999, "citation_id": "-PvfVhgAAAAJ:r0BpntZqJG4C", "result_id": "-PvfVhgAAAAJ:r0BpntZqJG4C", "source": "scholar", "publication_info": {"summary": "Algorithmica 24 (3), 195-208, 1999"}, "publication": "Algorithmica 24 (3), 195-208, 1999", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=-PvfVhgAAAAJ&pagesize=100&sortby=pubdate&citation_for_view=-PvfVhgAAAAJ:r0BpntZqJG4C"}, {"title": "Coarse-grained parallel geometric search", "authors": "A Chan, F Dehne, A Rau-Chaplin", "year": 1999, "citation_id": "-PvfVhgAAAAJ:KlAtU1dfN6UC", "result_id": "-PvfVhgAAAAJ:KlAtU1dfN6UC", "source": "scholar", "publication_info": {"summary": "Journal of Parallel and Distributed Computing 57 (2), 224-235, 1999"}, "publication": "Journal of Parallel and Distributed Computing 57 (2), 224-235, 1999", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=-PvfVhgAAAAJ&cstart=100&pagesize=100&sortby=pubdate&citation_for_view=-PvfVhgAAAAJ:KlAtU1dfN6UC"}, {"title": "Article ID jpdc. 1999.1588, available online at http: \u0422\u0422www. idealibrary. com on", "authors": "DA Bader, T Bali, P Banerjee, K Blathras, L Boxer, H Casanova, AA Chien, ...", "year": 1999, "citation_id": "-PvfVhgAAAAJ:BrmTIyaxlBUC", "result_id": "-PvfVhgAAAAJ:BrmTIyaxlBUC", "source": "scholar", "publication_info": {"summary": "Journal of Parallel and Distributed Computing 58, 548, 1999"}, "publication": "Journal of Parallel and Distributed Computing 58, 548, 1999", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=-PvfVhgAAAAJ&cstart=100&pagesize=100&sortby=pubdate&citation_for_view=-PvfVhgAAAAJ:BrmTIyaxlBUC"}, {"title": "Article ID jpdc. 1999.1535, available online at http: \u0422\u0422www. idealibrary. com on", "authors": "AK Agrawala, HM Chen, SS Chen, Z Chen, AG Constantinidis, ...", "year": 1999, "citation_id": "-PvfVhgAAAAJ:eJXPG6dFmWUC", "result_id": "-PvfVhgAAAAJ:eJXPG6dFmWUC", "source": "scholar", "publication_info": {"summary": "Journal of Parallel and Distributed Computing 56, 296, 1999"}, "publication": "Journal of Parallel and Distributed Computing 56, 296, 1999", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=-PvfVhgAAAAJ&cstart=100&pagesize=100&sortby=pubdate&citation_for_view=-PvfVhgAAAAJ:eJXPG6dFmWUC"}, {"title": "Scalable 2d convex hull and triangulation algorithms for coarse grained multicomputers", "authors": "M Diallo, A Ferreira, A Rau-Chaplin, S Ub\u00e9da", "year": 1999, "citation_id": "-PvfVhgAAAAJ:roLk4NBRz8UC", "result_id": "-PvfVhgAAAAJ:roLk4NBRz8UC", "source": "scholar", "publication_info": {"summary": "Journal of Parallel and Distributed Computing 56 (1), 47-70, 1999"}, "publication": "Journal of Parallel and Distributed Computing 56 (1), 47-70, 1999", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=-PvfVhgAAAAJ&cstart=100&pagesize=100&sortby=pubdate&citation_for_view=-PvfVhgAAAAJ:roLk4NBRz8UC"}, {"title": "Scaleable parallel algorithms for lower envelopes with applications", "authors": "L Boxer, R Miller, A Rau-Chaplin", "year": 1998, "citation_id": "-PvfVhgAAAAJ:TQgYirikUcIC", "result_id": "-PvfVhgAAAAJ:TQgYirikUcIC", "source": "scholar", "publication_info": {"summary": "journal of parallel and distributed computing 53 (2), 91-118, 1998"}, "publication": "journal of parallel and distributed computing 53 (2), 91-118, 1998", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=-PvfVhgAAAAJ&cstart=100&pagesize=100&sortby=pubdate&citation_for_view=-PvfVhgAAAAJ:TQgYirikUcIC"}, {"title": "Parallel computation on interval graphs using PC clusters: Algorithms and experiments", "authors": "A Ferreira, IG Lassous, K Marcus, A Rau-Chaplin", "year": 1998, "citation_id": "-PvfVhgAAAAJ:mVmsd5A6BfQC", "result_id": "-PvfVhgAAAAJ:mVmsd5A6BfQC", "source": "scholar", "publication_info": {"summary": "European Conference on Parallel Processing, 875-886, 1998"}, "publication": "European Conference on Parallel Processing, 875-886, 1998", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=-PvfVhgAAAAJ&cstart=100&pagesize=100&sortby=pubdate&citation_for_view=-PvfVhgAAAAJ:mVmsd5A6BfQC"}, {"title": "Algorithms for Solving SLAE using PVM", "authors": "V Alexandrov, F Dehne, A Rau-Chaplin, K Taft\u00b9", "year": 1998, "citation_id": "-PvfVhgAAAAJ:ClCfbGk0d_YC", "result_id": "-PvfVhgAAAAJ:ClCfbGk0d_YC", "source": "scholar", "publication_info": {"summary": "Recent Advances in Parallel Virtual Machine and Message Passing Interface \u2026, 1998"}, "publication": "Recent Advances in Parallel Virtual Machine and Message Passing Interface \u2026, 1998", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=-PvfVhgAAAAJ&cstart=100&pagesize=100&sortby=pubdate&citation_for_view=-PvfVhgAAAAJ:ClCfbGk0d_YC"}, {"title": "Communication-efficient deterministic parallel algorithms for planar point location and 2d Voronoi diagram", "authors": "M Diallol, A Ferreira, A Rau-Chaplin", "year": 1998, "citation_id": "-PvfVhgAAAAJ:-f6ydRqryjwC", "result_id": "-PvfVhgAAAAJ:-f6ydRqryjwC", "source": "scholar", "publication_info": {"summary": "Annual Symposium on Theoretical Aspects of Computer Science, 399-409, 1998"}, "publication": "Annual Symposium on Theoretical Aspects of Computer Science, 399-409, 1998", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=-PvfVhgAAAAJ&cstart=100&pagesize=100&sortby=pubdate&citation_for_view=-PvfVhgAAAAJ:-f6ydRqryjwC"}, {"title": "Algorithms for Solving SLAE using PVM", "authors": "V Alexandrov\u00b9, F Dehne, A Rau-Chaplin, K Taft\u00b9", "year": 1998, "citation_id": "-PvfVhgAAAAJ:0N-VGjzr574C", "result_id": "-PvfVhgAAAAJ:0N-VGjzr574C", "source": "scholar", "publication_info": {"summary": "Recent Advances in Parallel Virtual Machine and Message Passing Interface \u2026, 1998"}, "publication": "Recent Advances in Parallel Virtual Machine and Message Passing Interface \u2026, 1998", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=-PvfVhgAAAAJ&cstart=100&pagesize=100&sortby=pubdate&citation_for_view=-PvfVhgAAAAJ:0N-VGjzr574C"}, {"title": "article no. PC981496", "authors": "L Boxer, MP Connolly, P Fitzpatrick, E Fleury, P Fraigniaud, ...", "year": 1998, "citation_id": "-PvfVhgAAAAJ:VOx2b1Wkg3QC", "result_id": "-PvfVhgAAAAJ:VOx2b1Wkg3QC", "source": "scholar", "publication_info": {"summary": "journal of parallel and distributed computing 53, 174, 1998"}, "publication": "journal of parallel and distributed computing 53, 174, 1998", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=-PvfVhgAAAAJ&cstart=100&pagesize=100&sortby=pubdate&citation_for_view=-PvfVhgAAAAJ:VOx2b1Wkg3QC"}, {"title": "Graphics support for a World-Wide-Web based architectural design service", "authors": "A Rau-Chaplin, B MacKay-Lyons, T Doucette, J Gajewski, X Hu, ...", "year": 1997, "citation_id": "-PvfVhgAAAAJ:YOwf2qJgpHMC", "result_id": "-PvfVhgAAAAJ:YOwf2qJgpHMC", "source": "scholar", "publication_info": {"summary": "Computer networks and ISDN systems 29 (14), 1611-1623, 1997"}, "publication": "Computer networks and ISDN systems 29 (14), 1611-1623, 1997", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=-PvfVhgAAAAJ&cstart=100&pagesize=100&sortby=pubdate&citation_for_view=-PvfVhgAAAAJ:YOwf2qJgpHMC"}, {"title": "A graphical language for generating architectural forms", "authors": "A Rau-Chaplin, TJ Smedley", "year": 1997, "citation_id": "-PvfVhgAAAAJ:IWHjjKOFINEC", "result_id": "-PvfVhgAAAAJ:IWHjjKOFINEC", "source": "scholar", "publication_info": {"summary": "Proceedings. 1997 IEEE Symposium on Visual Languages (Cat. No. 97TB100180 \u2026, 1997"}, "publication": "Proceedings. 1997 IEEE Symposium on Visual Languages (Cat. No. 97TB100180 \u2026, 1997", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=-PvfVhgAAAAJ&cstart=100&pagesize=100&sortby=pubdate&citation_for_view=-PvfVhgAAAAJ:IWHjjKOFINEC"}, {"title": "Coarse grained parallel next element search", "authors": "A Chan, F Dehne, A Rau-Chaplin", "year": 1997, "citation_id": "-PvfVhgAAAAJ:_kc_bZDykSQC", "result_id": "-PvfVhgAAAAJ:_kc_bZDykSQC", "source": "scholar", "publication_info": {"summary": "Proceedings 11th International Parallel Processing Symposium, 320-325, 1997"}, "publication": "Proceedings 11th International Parallel Processing Symposium, 320-325, 1997", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=-PvfVhgAAAAJ&cstart=100&pagesize=100&sortby=pubdate&citation_for_view=-PvfVhgAAAAJ:_kc_bZDykSQC"}, {"title": "Coarse Grained Parallel Next Element Search", "authors": "A Rau-Chaplin", "year": 1997, "citation_id": "-PvfVhgAAAAJ:hCrLmN-GePgC", "result_id": "-PvfVhgAAAAJ:hCrLmN-GePgC", "source": "scholar", "publication_info": {"summary": "Eleventh International Parallel Processing Symposium, 320, 1997"}, "publication": "Eleventh International Parallel Processing Symposium, 320, 1997", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=-PvfVhgAAAAJ&cstart=100&pagesize=100&sortby=pubdate&citation_for_view=-PvfVhgAAAAJ:hCrLmN-GePgC"}, {"title": "D-dimensional range search on multicomputers", "authors": "S Ub\u00e9da, A Rau-Chaplin, A Ferreira", "year": 1997, "citation_id": "-PvfVhgAAAAJ:fEOibwPWpKIC", "result_id": "-PvfVhgAAAAJ:fEOibwPWpKIC", "source": "scholar", "publication_info": {"summary": "International Parallel Processing Symposium, 1997"}, "publication": "International Parallel Processing Symposium, 1997", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=-PvfVhgAAAAJ&cstart=100&pagesize=100&sortby=pubdate&citation_for_view=-PvfVhgAAAAJ:fEOibwPWpKIC"}, {"title": "Some scalable parallel algorithms for geometric problems", "authors": "L Boxer, R Miller, A Rau-Chaplin", "year": 1996, "citation_id": "-PvfVhgAAAAJ:4TOpqqG69KYC", "result_id": "-PvfVhgAAAAJ:4TOpqqG69KYC", "source": "scholar", "publication_info": {"summary": "Department of Computer Science, University at Buffalo, State University of \u2026, 1996"}, "publication": "Department of Computer Science, University at Buffalo, State University of \u2026, 1996", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=-PvfVhgAAAAJ&cstart=100&pagesize=100&sortby=pubdate&citation_for_view=-PvfVhgAAAAJ:4TOpqqG69KYC"}, {"title": "The LaHave House Project: Towards an automated architectural design service", "authors": "A Rau-Chaplin, B MacKay-Lyons, P Spierenburg", "year": 1996, "citation_id": "-PvfVhgAAAAJ:zYLM7Y9cAGgC", "result_id": "-PvfVhgAAAAJ:zYLM7Y9cAGgC", "source": "scholar", "publication_info": {"summary": "Cadex 96, 24-31, 1996"}, "publication": "Cadex 96, 24-31, 1996", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=-PvfVhgAAAAJ&cstart=100&pagesize=100&sortby=pubdate&citation_for_view=-PvfVhgAAAAJ:zYLM7Y9cAGgC"}, {"title": "Scalable algorithmic techniques for discrete problems that lack obvious structure", "authors": "A RAU-CHAPLIN", "year": 1996, "citation_id": "-PvfVhgAAAAJ:4OULZ7Gr8RgC", "result_id": "-PvfVhgAAAAJ:4OULZ7Gr8RgC", "source": "scholar", "publication_info": {"summary": "Symposium on parallel computing for solving large scale and irregular \u2026, 1996"}, "publication": "Symposium on parallel computing for solving large scale and irregular \u2026, 1996", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=-PvfVhgAAAAJ&cstart=100&pagesize=100&sortby=pubdate&citation_for_view=-PvfVhgAAAAJ:4OULZ7Gr8RgC"}, {"title": "Scalable 2d convex hull and triangulation algorithms for coarse grained multicomputers", "authors": "A Ferreira, A Rau-Chaplin, S Ueda", "year": 1995, "citation_id": "-PvfVhgAAAAJ:Tyk-4Ss8FVUC", "result_id": "-PvfVhgAAAAJ:Tyk-4Ss8FVUC", "source": "scholar", "publication_info": {"summary": "Proceedings. Seventh IEEE Symposium on Parallel and Distributed Processing \u2026, 1995"}, "publication": "Proceedings. Seventh IEEE Symposium on Parallel and Distributed Processing \u2026, 1995", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=-PvfVhgAAAAJ&cstart=100&pagesize=100&sortby=pubdate&citation_for_view=-PvfVhgAAAAJ:Tyk-4Ss8FVUC"}, {"title": "Hypercube algorithms for parallel processing of pointer-based quadtrees", "authors": "F Dehne, A Rau-Chaplin, AG Ferreira", "year": 1995, "citation_id": "-PvfVhgAAAAJ:L8Ckcad2t8MC", "result_id": "-PvfVhgAAAAJ:L8Ckcad2t8MC", "source": "scholar", "publication_info": {"summary": "Computer Vision and Image Understanding 62 (1), 1-10, 1995"}, "publication": "Computer Vision and Image Understanding 62 (1), 1-10, 1995", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=-PvfVhgAAAAJ&cstart=100&pagesize=100&sortby=pubdate&citation_for_view=-PvfVhgAAAAJ:L8Ckcad2t8MC"}, {"title": "Construction of d-Dimensional Hyperoctrees on a Hypercube Multiprocessor", "authors": "F Dehne, A Fabri, M Nassar, A Rauchaplin, R Valiveti", "year": 1994, "citation_id": "-PvfVhgAAAAJ:3s1wT3WcHBgC", "result_id": "-PvfVhgAAAAJ:3s1wT3WcHBgC", "source": "scholar", "publication_info": {"summary": "Journal of Parallel and Distributed Computing 23 (2), 256-261, 1994"}, "publication": "Journal of Parallel and Distributed Computing 23 (2), 256-261, 1994", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=-PvfVhgAAAAJ&cstart=100&pagesize=100&sortby=pubdate&citation_for_view=-PvfVhgAAAAJ:3s1wT3WcHBgC"}, {"title": "A massively parallel knowledge-base server using a hypercube multiprocessor", "authors": "F Dehne, A Ferreira, A Rau-Chaplin", "year": 1994, "citation_id": "-PvfVhgAAAAJ:JV2RwH3_ST0C", "result_id": "-PvfVhgAAAAJ:JV2RwH3_ST0C", "source": "scholar", "publication_info": {"summary": "Parallel Computing 20 (9), 1369-1382, 1994"}, "publication": "Parallel Computing 20 (9), 1369-1382, 1994", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=-PvfVhgAAAAJ&cstart=100&pagesize=100&sortby=pubdate&citation_for_view=-PvfVhgAAAAJ:JV2RwH3_ST0C"}, {"title": "Multisearch techniques: parallel data structures on mesh-connected computers", "authors": "MJ Atallah, F Dehne, R Miller, A Rauchaplin, JJ Tsay", "year": 1994, "citation_id": "-PvfVhgAAAAJ:hqOjcs7Dif8C", "result_id": "-PvfVhgAAAAJ:hqOjcs7Dif8C", "source": "scholar", "publication_info": {"summary": "Journal of Parallel and Distributed Computing 20 (1), 1-13, 1994"}, "publication": "Journal of Parallel and Distributed Computing 20 (1), 1-13, 1994", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=-PvfVhgAAAAJ&cstart=100&pagesize=100&sortby=pubdate&citation_for_view=-PvfVhgAAAAJ:hqOjcs7Dif8C"}, {"title": "Scalable parallel geometric algorithms for coarse grained multicomputers", "authors": "F Dehne, A Fabri, A Rau-Chaplin", "year": 1993, "citation_id": "-PvfVhgAAAAJ:u5HHmVD_uO8C", "result_id": "-PvfVhgAAAAJ:u5HHmVD_uO8C", "source": "scholar", "publication_info": {"summary": "Proceedings of the ninth annual symposium on Computational geometry, 298-307, 1993"}, "publication": "Proceedings of the ninth annual symposium on Computational geometry, 298-307, 1993", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=-PvfVhgAAAAJ&cstart=100&pagesize=100&sortby=pubdate&citation_for_view=-PvfVhgAAAAJ:u5HHmVD_uO8C"}, {"title": "Polygonal approximation by boundary reduction", "authors": "L Boxer, CS Chang, R Miller, A Rau-Chaplin", "year": 1993, "citation_id": "-PvfVhgAAAAJ:Y0pCki6q_DkC", "result_id": "-PvfVhgAAAAJ:Y0pCki6q_DkC", "source": "scholar", "publication_info": {"summary": "Pattern Recognition Letters 14 (2), 111-119, 1993"}, "publication": "Pattern Recognition Letters 14 (2), 111-119, 1993", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=-PvfVhgAAAAJ&cstart=100&pagesize=100&sortby=pubdate&citation_for_view=-PvfVhgAAAAJ:Y0pCki6q_DkC"}, {"title": "On parallel data structures and parallel geometric applications for multicomputers", "authors": "A Rau-Chaplin", "year": 1993, "citation_id": "-PvfVhgAAAAJ:TFP_iSt0sucC", "result_id": "-PvfVhgAAAAJ:TFP_iSt0sucC", "source": "scholar", "publication_info": {"summary": "Carleton University, 1993"}, "publication": "Carleton University, 1993", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=-PvfVhgAAAAJ&cstart=100&pagesize=100&sortby=pubdate&citation_for_view=-PvfVhgAAAAJ:TFP_iSt0sucC"}, {"title": "Scalable parallel geometric algorithms for coarse grainned multicomputers", "authors": "F Dehne, A Fabri, A Rau-Chaplin", "year": 1993, "citation_id": "-PvfVhgAAAAJ:BUYA1_V_uYcC", "result_id": "-PvfVhgAAAAJ:BUYA1_V_uYcC", "source": "scholar", "publication_info": {"summary": "Rapports de recherche- INRIA, 1993"}, "publication": "Rapports de recherche- INRIA, 1993", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=-PvfVhgAAAAJ&cstart=100&pagesize=100&sortby=pubdate&citation_for_view=-PvfVhgAAAAJ:BUYA1_V_uYcC"}, {"title": "Scalable Parallel Geometric Algorithms for Coarse Grained Multicomputers Algorithmes g eom etriques parall eles multi-echelles pour machines multi-processeurs a gros grain", "authors": "F Dehne, A Fabri, A Rau-Chaplin", "year": 1992, "citation_id": "-PvfVhgAAAAJ:BqipwSGYUEgC", "result_id": "-PvfVhgAAAAJ:BqipwSGYUEgC", "source": "scholar", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=-PvfVhgAAAAJ&cstart=100&pagesize=100&sortby=pubdate&citation_for_view=-PvfVhgAAAAJ:BqipwSGYUEgC"}, {"title": "Parallel fractional cascading on hypercube multiprocessors", "authors": "F Dehne, A Ferreira, A Rau-Chaplin", "year": 1992, "citation_id": "-PvfVhgAAAAJ:ufrVoPGSRksC", "result_id": "-PvfVhgAAAAJ:ufrVoPGSRksC", "source": "scholar", "publication_info": {"summary": "Computational Geometry 2 (3), 141-167, 1992"}, "publication": "Computational Geometry 2 (3), 141-167, 1992", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=-PvfVhgAAAAJ&cstart=100&pagesize=100&sortby=pubdate&citation_for_view=-PvfVhgAAAAJ:ufrVoPGSRksC"}, {"title": "UNIT E DE RECHERCHE INRIA-SOPHIA ANTIPOLIS", "authors": "F Dehne, A Fabri, M Nassar, A Rau-Chaplin, R Valiveti", "year": 1992, "citation_id": "-PvfVhgAAAAJ:M05iB0D1s5AC", "result_id": "-PvfVhgAAAAJ:M05iB0D1s5AC", "source": "scholar", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=-PvfVhgAAAAJ&cstart=100&pagesize=100&sortby=pubdate&citation_for_view=-PvfVhgAAAAJ:M05iB0D1s5AC"}, {"title": "Construction of d-Dimensional Hyperoctrees on a Hypercube Multiprocessor", "authors": "A Rau-Chaplin", "year": 1992, "citation_id": "-PvfVhgAAAAJ:epqYDVWIO7EC", "result_id": "-PvfVhgAAAAJ:epqYDVWIO7EC", "source": "scholar", "publication_info": {"summary": "Proceedings, 373, 1992"}, "publication": "Proceedings, 373, 1992", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=-PvfVhgAAAAJ&cstart=100&pagesize=100&sortby=pubdate&citation_for_view=-PvfVhgAAAAJ:epqYDVWIO7EC"}, {"title": "Construction of d-dimensional hyperoctrees on a hypercube multiprocessor", "authors": "F Dehne, A Fabri, M Nassar, A Rau-Chaplin, R Valiveti", "year": 1992, "citation_id": "-PvfVhgAAAAJ:NJ774b8OgUMC", "result_id": "-PvfVhgAAAAJ:NJ774b8OgUMC", "source": "scholar", "publication_info": {"summary": "INRIA, 1992"}, "publication": "INRIA, 1992", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=-PvfVhgAAAAJ&cstart=100&pagesize=100&sortby=pubdate&citation_for_view=-PvfVhgAAAAJ:NJ774b8OgUMC"}, {"title": "Efficient parallel data structures for fine-grained hypercube multiprocessors.", "authors": "A Rau-Chaplin", "year": 1992, "citation_id": "-PvfVhgAAAAJ:ns9cj8rnVeAC", "result_id": "-PvfVhgAAAAJ:ns9cj8rnVeAC", "source": "scholar", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=-PvfVhgAAAAJ&cstart=100&pagesize=100&sortby=pubdate&citation_for_view=-PvfVhgAAAAJ:ns9cj8rnVeAC"}, {"title": "Optical clustering on a mesh-connected computer", "authors": "F Dehne, R Miller, A Rau-Chaplin", "year": 1991, "citation_id": "-PvfVhgAAAAJ:isC4tDSrTZIC", "result_id": "-PvfVhgAAAAJ:isC4tDSrTZIC", "source": "scholar", "publication_info": {"summary": "International journal of parallel programming 20 (6), 475-486, 1991"}, "publication": "International journal of parallel programming 20 (6), 475-486, 1991", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=-PvfVhgAAAAJ&cstart=100&pagesize=100&sortby=pubdate&citation_for_view=-PvfVhgAAAAJ:isC4tDSrTZIC"}, {"title": "Multisearch techniques for implementing data structures on a mesh-connected computer (preliminary version)", "authors": "MJ Atallah, F Dehne, R Miller, A Rau-Chaplin, JJ Tsay", "year": 1991, "citation_id": "-PvfVhgAAAAJ:LkGwnXOMwfcC", "result_id": "-PvfVhgAAAAJ:LkGwnXOMwfcC", "source": "scholar", "publication_info": {"summary": "Proceedings of the third annual ACM symposium on Parallel algorithms and \u2026, 1991"}, "publication": "Proceedings of the third annual ACM symposium on Parallel algorithms and \u2026, 1991", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=-PvfVhgAAAAJ&cstart=100&pagesize=100&sortby=pubdate&citation_for_view=-PvfVhgAAAAJ:LkGwnXOMwfcC"}, {"title": "Efficient Parallel Construction and Manipulation of Quadtrees.", "authors": "FKHA Dehne, A Ferreira, A Rau-Chaplin", "year": 1991, "citation_id": "-PvfVhgAAAAJ:_xSYboBqXhAC", "result_id": "-PvfVhgAAAAJ:_xSYboBqXhAC", "source": "scholar", "publication_info": {"summary": "ICPP (3), 255-262, 1991"}, "publication": "ICPP (3), 255-262, 1991", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=-PvfVhgAAAAJ&cstart=100&pagesize=100&sortby=pubdate&citation_for_view=-PvfVhgAAAAJ:_xSYboBqXhAC"}, {"title": "Parallel algorithms for color image quantization on hypercubes and meshes.", "authors": "FKHA Dehne, A Rau-Chaplin", "year": 1991, "citation_id": "-PvfVhgAAAAJ:ZHo1McVdvXMC", "result_id": "-PvfVhgAAAAJ:ZHo1McVdvXMC", "source": "scholar", "publication_info": {"summary": "Algorithms and Parallel VLSI Architectures, 91-96, 1991"}, "publication": "Algorithms and Parallel VLSI Architectures, 91-96, 1991", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=-PvfVhgAAAAJ&cstart=100&pagesize=100&sortby=pubdate&citation_for_view=-PvfVhgAAAAJ:ZHo1McVdvXMC"}, {"title": "Parallel processing of pointer based quadtrees on hypercube multiprocessors", "authors": "F Dehne, AG Ferreira, A Rau-Chaplin", "year": 1991, "citation_id": "-PvfVhgAAAAJ:mB3voiENLucC", "result_id": "-PvfVhgAAAAJ:mB3voiENLucC", "source": "scholar", "publication_info": {"summary": "Proc. International Conference on Parallel Processing, 1991"}, "publication": "Proc. International Conference on Parallel Processing, 1991", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=-PvfVhgAAAAJ&cstart=100&pagesize=100&sortby=pubdate&citation_for_view=-PvfVhgAAAAJ:mB3voiENLucC"}, {"title": "A massively parallel knowledge-base server using a hypercube multiprocessor", "authors": "F Dehne, AG Ferreira, A Rau-Chaplin", "year": 1990, "citation_id": "-PvfVhgAAAAJ:kNdYIx-mwKoC", "result_id": "-PvfVhgAAAAJ:kNdYIx-mwKoC", "source": "scholar", "publication_info": {"summary": "[1990] Proceedings of the 2nd International IEEE Conference on Tools for \u2026, 1990"}, "publication": "[1990] Proceedings of the 2nd International IEEE Conference on Tools for \u2026, 1990", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=-PvfVhgAAAAJ&cstart=100&pagesize=100&sortby=pubdate&citation_for_view=-PvfVhgAAAAJ:kNdYIx-mwKoC"}, {"title": "Parallel branch and bound on fine-grained hypercube multiprocessors", "authors": "F Dehne, AG Ferreira, A Rau-Chaplin", "year": 1990, "citation_id": "-PvfVhgAAAAJ:0EnyYjriUFMC", "result_id": "-PvfVhgAAAAJ:0EnyYjriUFMC", "source": "scholar", "publication_info": {"summary": "Parallel computing 15 (1-3), 201-209, 1990"}, "publication": "Parallel computing 15 (1-3), 201-209, 1990", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=-PvfVhgAAAAJ&cstart=100&pagesize=100&sortby=pubdate&citation_for_view=-PvfVhgAAAAJ:0EnyYjriUFMC"}, {"title": "fine-grained hypercube multiprocessors", "authors": "F Dehne, AG Ferreira, A Rau-Chaplin, C Parallel", "year": 1990, "citation_id": "-PvfVhgAAAAJ:-_dYPAW6P2MC", "result_id": "-PvfVhgAAAAJ:-_dYPAW6P2MC", "source": "scholar", "publication_info": {"summary": "Parcella'90 2, 51, 1990"}, "publication": "Parcella'90 2, 51, 1990", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=-PvfVhgAAAAJ&cstart=100&pagesize=100&sortby=pubdate&citation_for_view=-PvfVhgAAAAJ:-_dYPAW6P2MC"}, {"title": "Parallel Processing of Quad Trees on the Hypercube (and PRAM)", "authors": "F Dehne, AG Ferreira, A Rau-Chaplin", "year": 1990, "citation_id": "-PvfVhgAAAAJ:EUQCXRtRnyEC", "result_id": "-PvfVhgAAAAJ:EUQCXRtRnyEC", "source": "scholar", "publication_info": {"summary": "Carleton University, School of Computer Science, 1990"}, "publication": "Carleton University, School of Computer Science, 1990", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=-PvfVhgAAAAJ&cstart=100&pagesize=100&sortby=pubdate&citation_for_view=-PvfVhgAAAAJ:EUQCXRtRnyEC"}, {"title": "Parallel AI algorithms for fine-granind hypercube multiprocessors", "authors": "F Dehne, AG Ferreira, A Rau-Chaplin", "year": 1990, "citation_id": "-PvfVhgAAAAJ:M3NEmzRMIkIC", "result_id": "-PvfVhgAAAAJ:M3NEmzRMIkIC", "source": "scholar", "publication_info": {"summary": "Proc. V. Int. Ws. on Parallel Processing by Cellular Automata and Arrays \u2026, 1990"}, "publication": "Proc. V. Int. Ws. on Parallel Processing by Cellular Automata and Arrays \u2026, 1990", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=-PvfVhgAAAAJ&cstart=100&pagesize=100&sortby=pubdate&citation_for_view=-PvfVhgAAAAJ:M3NEmzRMIkIC"}, {"title": "Implementing data structures on a hypercube multiprocessor, and applications in parallel computational geometry", "authors": "F Dehne, A Rau-Chaplin", "year": 1989, "citation_id": "-PvfVhgAAAAJ:2osOgNQ5qMEC", "result_id": "-PvfVhgAAAAJ:2osOgNQ5qMEC", "source": "scholar", "publication_info": {"summary": "International Workshop on Graph-Theoretic Concepts in Computer Science, 316-329, 1989"}, "publication": "International Workshop on Graph-Theoretic Concepts in Computer Science, 316-329, 1989", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=-PvfVhgAAAAJ&cstart=100&pagesize=100&sortby=pubdate&citation_for_view=-PvfVhgAAAAJ:2osOgNQ5qMEC"}, {"title": "Centerfor Parallel and Distributed Computing, School of Computer Science", "authors": "F DEHNE, A FERREIRA, A RAU-CHAPLIN", "year": 1989, "citation_id": "-PvfVhgAAAAJ:edDO8Oi4QzsC", "result_id": "-PvfVhgAAAAJ:edDO8Oi4QzsC", "source": "scholar", "publication_info": {"summary": "Computing, 1084-1093, 1989"}, "publication": "Computing, 1084-1093, 1989", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=-PvfVhgAAAAJ&cstart=100&pagesize=100&sortby=pubdate&citation_for_view=-PvfVhgAAAAJ:edDO8Oi4QzsC"}, {"title": "DAD: a real-time expert system for monitoring of data packet networks", "authors": "S Rabie, A Rau-Chaplin, T Shibahara", "year": 1988, "citation_id": "-PvfVhgAAAAJ:D03iK_w7-QYC", "result_id": "-PvfVhgAAAAJ:D03iK_w7-QYC", "source": "scholar", "publication_info": {"summary": "IEEE Network 2 (5), 29-34, 1988"}, "publication": "IEEE Network 2 (5), 29-34, 1988", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=-PvfVhgAAAAJ&cstart=100&pagesize=100&sortby=pubdate&citation_for_view=-PvfVhgAAAAJ:D03iK_w7-QYC"}, {"title": "A Massively Parallel Knowledge-Base Server Using a Hypercube Multiprocessor", "authors": "A Rau-Chaplin", "year": "", "citation_id": "-PvfVhgAAAAJ:Ug5p-4gJ2f0C", "result_id": "-PvfVhgAAAAJ:Ug5p-4gJ2f0C", "source": "scholar", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=-PvfVhgAAAAJ&cstart=100&pagesize=100&sortby=pubdate&citation_for_view=-PvfVhgAAAAJ:Ug5p-4gJ2f0C"}, {"title": "Algorithms and Data Structures [electronic resource]: 5th International Workshop, WADS'97 Halifax, Nova Scotia, Canada August 6\u20138, 1997 Proceedings", "authors": "F Dehne, A Rau-Chaplin, R Tamassia", "year": "", "citation_id": "-PvfVhgAAAAJ:Dip1O2bNi0gC", "result_id": "-PvfVhgAAAAJ:Dip1O2bNi0gC", "source": "scholar", "publication_info": {"summary": "Berlin, Heidelberg: Springer Berlin Heidelberg,, 0"}, "publication": "Berlin, Heidelberg: Springer Berlin Heidelberg,, 0", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=-PvfVhgAAAAJ&cstart=100&pagesize=100&sortby=pubdate&citation_for_view=-PvfVhgAAAAJ:Dip1O2bNi0gC"}, {"title": "Multisearch Techniques for Implementing Data Structures on a Mesh-Connected Computer", "authors": "R Miller, A Rau-Chaplin, JJ Tsayf", "year": "", "citation_id": "-PvfVhgAAAAJ:MLfJN-KU85MC", "result_id": "-PvfVhgAAAAJ:MLfJN-KU85MC", "source": "scholar", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=-PvfVhgAAAAJ&cstart=100&pagesize=100&sortby=pubdate&citation_for_view=-PvfVhgAAAAJ:MLfJN-KU85MC"}, {"title": "Message from the CIT-2018 General Chairs", "authors": "W Pedrycz, VCM Leung, A Rau-Chaplin", "year": "", "citation_id": "-PvfVhgAAAAJ:Z5m8FVwuT1cC", "result_id": "-PvfVhgAAAAJ:Z5m8FVwuT1cC", "source": "scholar", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=-PvfVhgAAAAJ&cstart=100&pagesize=100&sortby=pubdate&citation_for_view=-PvfVhgAAAAJ:Z5m8FVwuT1cC"}, {"title": "A PSO-Based Algorithm With Local Search for Multimodal Optimization Without Constraints", "authors": "A Rau-Chaplin, RF Lopes", "year": "", "citation_id": "-PvfVhgAAAAJ:VLnqNzywnoUC", "result_id": "-PvfVhgAAAAJ:VLnqNzywnoUC", "source": "scholar", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=-PvfVhgAAAAJ&cstart=100&pagesize=100&sortby=pubdate&citation_for_view=-PvfVhgAAAAJ:VLnqNzywnoUC"}, {"title": "ISSASiM 2015 Workshop Program Committee", "authors": "B Freudenthaler, R Stumptner, N Bicocchi, K Kawagoe, B Magoutas, ...", "year": "", "citation_id": "-PvfVhgAAAAJ:_Re3VWB3Y0AC", "result_id": "-PvfVhgAAAAJ:_Re3VWB3Y0AC", "source": "scholar", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=-PvfVhgAAAAJ&cstart=100&pagesize=100&sortby=pubdate&citation_for_view=-PvfVhgAAAAJ:_Re3VWB3Y0AC"}, {"title": "WHPCF\u201914 Program Committee Members", "authors": "C Albanese, J Ashley, D Cohen, M Di Pierro, P Flannery, D Kalamkar, ...", "year": "", "citation_id": "-PvfVhgAAAAJ:SdhP9T11ey4C", "result_id": "-PvfVhgAAAAJ:SdhP9T11ey4C", "source": "scholar", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=-PvfVhgAAAAJ&cstart=100&pagesize=100&sortby=pubdate&citation_for_view=-PvfVhgAAAAJ:SdhP9T11ey4C"}, {"title": "ISSASiM 2014 Workshop Committee", "authors": "N Bicocchi, K Delic, P Derler, J K\u00fcng, B Magoutas, K Matou\u0161ek, ...", "year": "", "citation_id": "-PvfVhgAAAAJ:tkaPQYYpVKoC", "result_id": "-PvfVhgAAAAJ:tkaPQYYpVKoC", "source": "scholar", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=-PvfVhgAAAAJ&cstart=100&pagesize=100&sortby=pubdate&citation_for_view=-PvfVhgAAAAJ:tkaPQYYpVKoC"}, {"title": "ISSASim 2013", "authors": "B Freudenthaler, R Stumptner, P Derler, E Forstner, J K\u00fcng, D Leber, ...", "year": "", "citation_id": "-PvfVhgAAAAJ:XiVPGOgt02cC", "result_id": "-PvfVhgAAAAJ:XiVPGOgt02cC", "source": "scholar", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=-PvfVhgAAAAJ&cstart=100&pagesize=100&sortby=pubdate&citation_for_view=-PvfVhgAAAAJ:XiVPGOgt02cC"}, {"title": "High Performance Risk Aggregation: Addressing the Data Processing Challenge the Hadoop MapReduce Way", "authors": "A Rau-Chaplin, B Varghese, Z Yao", "year": "", "citation_id": "-PvfVhgAAAAJ:vRqMK49ujn8C", "result_id": "-PvfVhgAAAAJ:vRqMK49ujn8C", "source": "scholar", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=-PvfVhgAAAAJ&cstart=100&pagesize=100&sortby=pubdate&citation_for_view=-PvfVhgAAAAJ:vRqMK49ujn8C"}, {"title": "Parallel fractional cascading on hypercube multiprocessors", "authors": "A Rau-Chaplin", "year": "", "citation_id": "-PvfVhgAAAAJ:f2IySw72cVMC", "result_id": "-PvfVhgAAAAJ:f2IySw72cVMC", "source": "scholar", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=-PvfVhgAAAAJ&cstart=100&pagesize=100&sortby=pubdate&citation_for_view=-PvfVhgAAAAJ:f2IySw72cVMC"}, {"title": "Algorithms and data structures (Halifax NS, August 6-8, 1997)", "authors": "F Dehne, A Rau-Chaplin, JR Sack, R Tamassia", "year": "", "citation_id": "-PvfVhgAAAAJ:pyW8ca7W8N0C", "result_id": "-PvfVhgAAAAJ:pyW8ca7W8N0C", "source": "scholar", "publication_info": {"summary": "Lecture notes in computer science, 0"}, "publication": "Lecture notes in computer science, 0", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=-PvfVhgAAAAJ&cstart=100&pagesize=100&sortby=pubdate&citation_for_view=-PvfVhgAAAAJ:pyW8ca7W8N0C"}, {"title": "Fifth High-Performance Grid Computing Workshop (HPGC 2008)", "authors": "E Aubanel, VBMA Frumkin, F Dehne, W Du, W Gentzsch, D German, ...", "year": "", "citation_id": "-PvfVhgAAAAJ:fPk4N6BV_jEC", "result_id": "-PvfVhgAAAAJ:fPk4N6BV_jEC", "source": "scholar", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=-PvfVhgAAAAJ&cstart=100&pagesize=100&sortby=pubdate&citation_for_view=-PvfVhgAAAAJ:fPk4N6BV_jEC"}, {"title": "Frank Dehne Todd Eavis Susanne Hambrusch n", "authors": "A Rau-Chaplin", "year": "", "citation_id": "-PvfVhgAAAAJ:u_35RYKgDlwC", "result_id": "-PvfVhgAAAAJ:u_35RYKgDlwC", "source": "scholar", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=-PvfVhgAAAAJ&cstart=100&pagesize=100&sortby=pubdate&citation_for_view=-PvfVhgAAAAJ:u_35RYKgDlwC"}, {"title": "Frank Dehne", "authors": "A Rau-Chaplin", "year": "", "citation_id": "-PvfVhgAAAAJ:zA6iFVUQeVQC", "result_id": "-PvfVhgAAAAJ:zA6iFVUQeVQC", "source": "scholar", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=-PvfVhgAAAAJ&cstart=100&pagesize=100&sortby=pubdate&citation_for_view=-PvfVhgAAAAJ:zA6iFVUQeVQC"}, {"title": "Scalable Algorithm Design Techniques for Discrete Problems that Lack Obvious Structure", "authors": "A Rau-Chaplin", "year": "", "citation_id": "-PvfVhgAAAAJ:SeFeTyx0c_EC", "result_id": "-PvfVhgAAAAJ:SeFeTyx0c_EC", "source": "scholar", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=-PvfVhgAAAAJ&cstart=100&pagesize=100&sortby=pubdate&citation_for_view=-PvfVhgAAAAJ:SeFeTyx0c_EC"}, {"title": "46, allee d'Italie PO Box 1000, Halifax 69364 Lyon Cedex 07, France Nova Scotia, Canada B3J 2X4 Firstname. Name@ lip. ens-lyon. fr arc@ tuns. ca", "authors": "A Ferreira, C Kenyon, A Rau-Chaplin, S Ubeda", "year": "", "citation_id": "-PvfVhgAAAAJ:ldfaerwXgEUC", "result_id": "-PvfVhgAAAAJ:ldfaerwXgEUC", "source": "scholar", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=-PvfVhgAAAAJ&cstart=100&pagesize=100&sortby=pubdate&citation_for_view=-PvfVhgAAAAJ:ldfaerwXgEUC"}, {"title": "Communication-E cient Deterministic Parallel Algorithms for Planar Point Location and 2d Voronoi Diagram?", "authors": "M Diallo, A Ferreira, A Rau-Chaplin", "year": "", "citation_id": "-PvfVhgAAAAJ:2P1L_qKh6hAC", "result_id": "-PvfVhgAAAAJ:2P1L_qKh6hAC", "source": "scholar", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=-PvfVhgAAAAJ&cstart=100&pagesize=100&sortby=pubdate&citation_for_view=-PvfVhgAAAAJ:2P1L_qKh6hAC"}, {"title": "Workshop on High Performance Grid Computing", "authors": "RF Van Der Wijngaart, M Frumkin, W Gentzsch, D German, G Initiative, ...", "year": "", "citation_id": "-PvfVhgAAAAJ:70eg2SAEIzsC", "result_id": "-PvfVhgAAAAJ:70eg2SAEIzsC", "source": "scholar", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=-PvfVhgAAAAJ&cstart=100&pagesize=100&sortby=pubdate&citation_for_view=-PvfVhgAAAAJ:70eg2SAEIzsC"}, {"title": "Seventh IEEE International Symposium on Cluster Computing and the Grid", "authors": "F Cappello, H Bal, C Williams, P Huibonhoa, JA Holliday, A Hospodor, ...", "year": "", "citation_id": "-PvfVhgAAAAJ:35N4QoGY0k4C", "result_id": "-PvfVhgAAAAJ:35N4QoGY0k4C", "source": "scholar", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=-PvfVhgAAAAJ&cstart=100&pagesize=100&sortby=pubdate&citation_for_view=-PvfVhgAAAAJ:35N4QoGY0k4C"}, {"title": "CLUSTER 2010", "authors": "F Dehne, D Abramson, CH Bischof, EN Caceres, A Cuzzocrea, ...", "year": "", "citation_id": "-PvfVhgAAAAJ:RYcK_YlVTxYC", "result_id": "-PvfVhgAAAAJ:RYcK_YlVTxYC", "source": "scholar", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=-PvfVhgAAAAJ&cstart=100&pagesize=100&sortby=pubdate&citation_for_view=-PvfVhgAAAAJ:RYcK_YlVTxYC"}, {"title": "4 HIPS-HPGC", "authors": "M Frumkin, T Kielmann, RF Van Der Wijngaart, RE Purdue, MS CASC, ...", "year": "", "citation_id": "-PvfVhgAAAAJ:J_g5lzvAfSwC", "result_id": "-PvfVhgAAAAJ:J_g5lzvAfSwC", "source": "scholar", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=-PvfVhgAAAAJ&cstart=100&pagesize=100&sortby=pubdate&citation_for_view=-PvfVhgAAAAJ:J_g5lzvAfSwC"}, {"title": "High Performance Grid Computing\u2013HPGC", "authors": "E Aubanel, VC Bhavsar, MA Frumkin, BJ d'Auriol, W Du, E Huedo, ...", "year": "", "citation_id": "-PvfVhgAAAAJ:RGFaLdJalmkC", "result_id": "-PvfVhgAAAAJ:RGFaLdJalmkC", "source": "scholar", "url": "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=-PvfVhgAAAAJ&cstart=100&pagesize=100&sortby=pubdate&citation_for_view=-PvfVhgAAAAJ:RGFaLdJalmkC"}], "search_metadata": {"status": "Success", "source": "serpapi"}}} \ No newline at end of file diff --git a/data/api_cache/serply_citation/2ab5e4d70ffa0a796441dd166131a3ce4bd0556a455387cb50e70a9ae1063bb8.json b/data/api_cache/serply_citation/2ab5e4d70ffa0a796441dd166131a3ce4bd0556a455387cb50e70a9ae1063bb8.json index 71d2d6ef..354a6a70 100644 --- a/data/api_cache/serply_citation/2ab5e4d70ffa0a796441dd166131a3ce4bd0556a455387cb50e70a9ae1063bb8.json +++ b/data/api_cache/serply_citation/2ab5e4d70ffa0a796441dd166131a3ce4bd0556a455387cb50e70a9ae1063bb8.json @@ -1 +1 @@ -{"timestamp": 1772377732.6335285, "ttl_days": 60, "data": {"title": "Comparison of closure versus non-closure of buccal mucosal graft harvest site outcomes in urethroplasty", "authors": "MMH Abdallah", "publication date": "2021", "journal": "The Egyptian Journal \u2026", "description": "MMH Abdallah, AM Maarouf\u2026\u00a0- The Egyptian Journal\u00a0\u2026, 2021 - ejhm.journals.ekb.eg", "url": "https://ejhm.journals.ekb.eg/article_209414.html"}} \ No newline at end of file +{"timestamp": 1782998834.6901045, "data": {"title": "Comparison of closure versus non-closure of buccal mucosal graft harvest site outcomes in urethroplasty", "authors": "MMH Abdallah and AM Maarouf", "publication date": "2021", "journal": "The Egyptian Journal \u2026", "description": "MMH Abdallah, AM Maarouf\u2026\u00a0- The Egyptian Journal\u00a0\u2026, 2021 - ejhm.journals.ekb.eg", "url": "https://ejhm.journals.ekb.eg/article_209414.html"}} \ No newline at end of file diff --git a/data/api_cache/serply_citation/362595e0756b31c0d4b603d6c320a815cddab7582149a4b5ed9577e98eacf7d2.json b/data/api_cache/serply_citation/362595e0756b31c0d4b603d6c320a815cddab7582149a4b5ed9577e98eacf7d2.json index edff2059..2672fc60 100644 --- a/data/api_cache/serply_citation/362595e0756b31c0d4b603d6c320a815cddab7582149a4b5ed9577e98eacf7d2.json +++ b/data/api_cache/serply_citation/362595e0756b31c0d4b603d6c320a815cddab7582149a4b5ed9577e98eacf7d2.json @@ -1 +1 @@ -{"timestamp": 1772378084.0431757, "ttl_days": 60, "data": {"_negative": true}} \ No newline at end of file +{"timestamp": 1782999272.2274597, "data": {"title": "Four decades of urolithiasis: What has changed in our practice?", "authors": "S Abidi", "publication date": "2022", "journal": "JPMA. The Journal of the Pakistan \u2026", "description": "M Hussain, S Abidi\u00a0- JPMA. The Journal of the Pakistan\u00a0\u2026, 2022 - pubmed.ncbi.nlm.nih.gov", "url": "https://pubmed.ncbi.nlm.nih.gov/35614584/"}} \ No newline at end of file diff --git a/data/api_cache/serply_citation/5159489f80529f59f5590e04bb9b742716ecc01cab8c33562f344158b8c0fb35.json b/data/api_cache/serply_citation/5159489f80529f59f5590e04bb9b742716ecc01cab8c33562f344158b8c0fb35.json index 5bc439b8..113c58ad 100644 --- a/data/api_cache/serply_citation/5159489f80529f59f5590e04bb9b742716ecc01cab8c33562f344158b8c0fb35.json +++ b/data/api_cache/serply_citation/5159489f80529f59f5590e04bb9b742716ecc01cab8c33562f344158b8c0fb35.json @@ -1 +1 @@ -{"timestamp": 1772379754.5563285, "ttl_days": 60, "data": {"title": "Unfolding ais transmission behavior for vessel movement modeling on noisy data leveraging machine learning", "authors": "G Spadon and MD Ferreira and A Soares and S Matwin", "publication date": "2022", "journal": "IEEE Access", "description": "G Spadon, MD Ferreira, A Soares, S Matwin\u00a0- IEEE Access, 2022 - ieeexplore.ieee.org", "url": "https://ieeexplore.ieee.org/abstract/document/9852238/"}} \ No newline at end of file +{"timestamp": 1783001234.3471775, "data": {"title": "Unfolding ais transmission behavior for vessel movement modeling on noisy data leveraging machine learning", "authors": "G Spadon and MD Ferreira and A Soares and S Matwin", "publication date": "2022", "journal": "IEEE Access", "description": "G Spadon, MD Ferreira, A Soares, S Matwin\u00a0- IEEE Access, 2022 - ieeexplore.ieee.org", "url": "https://ieeexplore.ieee.org/abstract/document/9852238/"}} \ No newline at end of file diff --git a/data/api_cache/serply_citation/8733e8e075cba6c8e6e1d3ddf67551fbe4350070cda1e1442fde23cd93c35785.json b/data/api_cache/serply_citation/8733e8e075cba6c8e6e1d3ddf67551fbe4350070cda1e1442fde23cd93c35785.json index 382510e2..5d895cd1 100644 --- a/data/api_cache/serply_citation/8733e8e075cba6c8e6e1d3ddf67551fbe4350070cda1e1442fde23cd93c35785.json +++ b/data/api_cache/serply_citation/8733e8e075cba6c8e6e1d3ddf67551fbe4350070cda1e1442fde23cd93c35785.json @@ -1 +1 @@ -{"timestamp": 1772379723.9416788, "ttl_days": 60, "data": {"authors": "G Spadon and S Vela and R Gehrmann", "publication date": "2023", "journal": "arXiv e-prints", "description": "G Spadon, J Kumar, M Smith, S Vela, R Gehrmann\u2026\u00a0- arXiv e-prints, 2023"}} \ No newline at end of file +{"timestamp": 1783010258.7485175, "data": {"authors": "G Spadon and S Vela and R Gehrmann", "publication date": "2023", "journal": "arXiv e-prints", "description": "G Spadon, J Kumar, M Smith, S Vela, R Gehrmann\u2026\u00a0- arXiv e-prints, 2023"}} \ No newline at end of file diff --git a/data/api_cache/serply_citation/a04a2a6633337f98cf1f588e20ba39a1e15675ab71ff4de92a2425e7f691cfa0.json b/data/api_cache/serply_citation/a04a2a6633337f98cf1f588e20ba39a1e15675ab71ff4de92a2425e7f691cfa0.json index 2e4323b9..b454f08d 100644 --- a/data/api_cache/serply_citation/a04a2a6633337f98cf1f588e20ba39a1e15675ab71ff4de92a2425e7f691cfa0.json +++ b/data/api_cache/serply_citation/a04a2a6633337f98cf1f588e20ba39a1e15675ab71ff4de92a2425e7f691cfa0.json @@ -1 +1 @@ -{"timestamp": 1772377436.2357643, "ttl_days": 60, "data": {"title": "Attention is all you need", "authors": "V Ashish - Advances in neural information processing systems, 2017", "publication date": "2017", "journal": "Advances in neural information processing systems", "description": "V Ashish\u00a0- Advances in neural information processing systems, 2017 - cir.nii.ac.jp", "url": "https://cir.nii.ac.jp/crid/1370849946232757637"}} \ No newline at end of file +{"timestamp": 1782990160.6702116, "data": {"title": "Attention is all you need", "authors": "V Ashish - Advances in neural information processing systems, 2017", "publication date": "2017", "journal": "Advances in neural information processing systems", "description": "V Ashish\u00a0- Advances in neural information processing systems, 2017 - cir.nii.ac.jp", "url": "https://cir.nii.ac.jp/crid/1370849946232757637"}} \ No newline at end of file diff --git a/data/api_cache/serply_citation/b7cff1893a7753a94249d079981e5a76ed55c855aa3c39bd43434c7155f6571b.json b/data/api_cache/serply_citation/b7cff1893a7753a94249d079981e5a76ed55c855aa3c39bd43434c7155f6571b.json index deca33ba..f809586a 100644 --- a/data/api_cache/serply_citation/b7cff1893a7753a94249d079981e5a76ed55c855aa3c39bd43434c7155f6571b.json +++ b/data/api_cache/serply_citation/b7cff1893a7753a94249d079981e5a76ed55c855aa3c39bd43434c7155f6571b.json @@ -1 +1 @@ -{"timestamp": 1772379695.051847, "ttl_days": 60, "data": {"title": "Gravity-Informed Deep Learning Framework for Predicting Ship Traffic Flow and Invasion Risk of Non-Indigenous Species via Ballast Water Discharge", "authors": "G Spadon and R Pelot and S Matwin and A Soares", "publication date": "2024", "description": "G Spadon, R Song, R Pelot, S Matwin, A Soares - 2024 - assets-eu.researchsquare.com", "url": "https://assets-eu.researchsquare.com/files/rs-3917933/v1_covered_17d366d1-c85b-48c8-8ebf-3bc5bc76bfdd.pdf"}} \ No newline at end of file +{"timestamp": 1783001050.1246717, "data": {"title": "Gravity-Informed Deep Learning Framework for Predicting Ship Traffic Flow and Invasion Risk of Non-Indigenous Species via Ballast Water Discharge", "authors": "G Spadon and R Pelot and S Matwin and A Soares", "publication date": "2024", "description": "G Spadon, R Song, R Pelot, S Matwin, A Soares - 2024 - assets-eu.researchsquare.com", "url": "https://assets-eu.researchsquare.com/files/rs-3917933/v1_covered_17d366d1-c85b-48c8-8ebf-3bc5bc76bfdd.pdf"}} \ No newline at end of file diff --git a/output/Abidi (fzr2PUYAAAAJ)/Youngshand2020-CharacterizationTotal.bib b/output/Abidi (fzr2PUYAAAAJ)/Youngshand2020-CharacterizationTotal.bib index d9cdda50..8516324d 100644 --- a/output/Abidi (fzr2PUYAAAAJ)/Youngshand2020-CharacterizationTotal.bib +++ b/output/Abidi (fzr2PUYAAAAJ)/Youngshand2020-CharacterizationTotal.bib @@ -1,5 +1,8 @@ -@misc{Youngshand2020:KneeArthroplastyVariability, +@inproceedings{Youngshand2020:KneeArthroplastyVariability, title = {Characterization of Total Knee Arthroplasty Patient: Clinical and Biomechanical Variability by Cluster Analysis}, author = {Kathryn L. Young-Shand and Peter Van Roy and Abidi S.s.r. and Michael Dunbar and Wilson J. Astephen}, - year = {2020} + year = {2020}, + booktitle = {Orthopaedic Proceedings 102 (SUPP_1)}, + pages = {141-141}, + note = {Venue from SerpAPI publication string (unverified)} } diff --git a/output/Beiko (OmUy3vUAAAAJ)/Barawi2026-EvolutionaryDynamics.bib b/output/Beiko (OmUy3vUAAAAJ)/Barawi2026-EvolutionaryDynamics.bib new file mode 100644 index 00000000..f746e53b --- /dev/null +++ b/output/Beiko (OmUy3vUAAAAJ)/Barawi2026-EvolutionaryDynamics.bib @@ -0,0 +1,7 @@ +@inproceedings{Barawi2026:EvolutionaryDynamicsNitrogenFixation, + title = {Evolutionary Dynamics of Nitrogen Fixation in Marine Thalassolituus}, + author = {SS Barawi and J LaRoche and R Beiko}, + year = {2026}, + booktitle = {2026 Ocean Sciences Meeting}, + note = {Venue from SerpAPI publication string (unverified)} +} diff --git a/output/Beiko (OmUy3vUAAAAJ)/Beiko2025-AutomatedEDNA.bib b/output/Beiko (OmUy3vUAAAAJ)/Beiko2025-AutomatedEDNA.bib index 9fed4edb..8e308ecf 100644 --- a/output/Beiko (OmUy3vUAAAAJ)/Beiko2025-AutomatedEDNA.bib +++ b/output/Beiko (OmUy3vUAAAAJ)/Beiko2025-AutomatedEDNA.bib @@ -1,9 +1,8 @@ -@misc{Beiko2025:EcoregionProfiling, +@article{Beiko2025:EcoregionProfiling, title = {Automated eDNA and eRNA Profiling for Biodiversity Monitoring in Marine and Freshwater Ecosystems}, author = {Robert G. Beiko and Jennifer Tolman and Soma Sardar Barawi and Mohamed Fares and Sneha Surya Narayana Murthy and Tom Knox and Connor M. Mackie and Iain Grundke and Nicholas W. Jeffery and Ryan R. E. Stanley and Vincent Sieben and Julie LaRoche}, year = {2025}, - howpublished = {bioRxiv}, - publisher = {openRxiv}, - doi = {10.1101/2025.10.30.685529}, + journal = {Scientific Reports}, + doi = {10.1038/s41598-026-58421-1}, url = {https://doi.org/10.1101/2025.10.30.685529} } diff --git a/output/Beiko (OmUy3vUAAAAJ)/Odoherty2026-MicrobiomeStewardship.bib b/output/Beiko (OmUy3vUAAAAJ)/Odoherty2026-MicrobiomeStewardship.bib new file mode 100644 index 00000000..262fda30 --- /dev/null +++ b/output/Beiko (OmUy3vUAAAAJ)/Odoherty2026-MicrobiomeStewardship.bib @@ -0,0 +1,9 @@ +@article{Odoherty2026:MicrobiomeStewardshipPrinciples, + title = {Microbiome Stewardship: Definition and Guiding Principles for Implementation}, + author = {Kieran C O'Doherty and Mikaela Beijbom and Emma Allen-Vercoe and Mallory J Choudoir and Diego S Silva and Carla Bonilla and Justine Debelius and Sarah Elton and Aviaja Lyberth Hauptmann and Andreas Heyland and Nicolae Morar and Derek Skillings and Zhongzhi Sun and Patricia G Wolf and Robert G Beiko and Suzanne Lynn Ishaq}, + year = {2026}, + journal = {Sustainable Microbiology}, + publisher = {Oxford University Press (OUP)}, + doi = {10.1093/sumbio/qvag028}, + url = {https://doi.org/10.1093/sumbio/qvag028} +} diff --git a/output/Brandt (OMA_KjcAAAAJ)/Brandt2023-DynamicallyFinding.bib b/output/Brandt (OMA_KjcAAAAJ)/Brandt2023-DynamicallyFinding.bib new file mode 100644 index 00000000..e23451a7 --- /dev/null +++ b/output/Brandt (OMA_KjcAAAAJ)/Brandt2023-DynamicallyFinding.bib @@ -0,0 +1,7 @@ +@inproceedings{Brandt2023:OptimalKernelLaunch, + title = {Dynamically finding optimal kernel launch parameters for cuda programs}, + author = {A Brandt and M Moreno Maza and T Jeshani and L Wang and D Mohajerani and J Paudel}, + year = {2023}, + booktitle = {Proceedings of the 33rd Annual International Conference on Computer Science}, + note = {Venue from SerpAPI publication string (unverified)} +} diff --git a/output/Brooks (42-3005)/Brooks2023-HigherOrder.bib b/output/Brooks (42-3005)/Brooks2023-HigherOrder.bib index cfdcb395..0cc1c0e6 100644 --- a/output/Brooks (42-3005)/Brooks2023-HigherOrder.bib +++ b/output/Brooks (42-3005)/Brooks2023-HigherOrder.bib @@ -5,5 +5,7 @@ @misc{Brooks2023:NewtonHigherOrderCorrections howpublished = {arXiv}, publisher = {Office of Scientific and Technical Information (OSTI)}, doi = {10.2172/1991087}, - url = {https://doi.org/10.2172/1991087} + url = {https://doi.org/10.2172/1991087}, + eprint = {2307.03820}, + archiveprefix = {arXiv} } diff --git a/output/Escobedo (lPSfdqAAAAAJ)/Ansari2026-ParticipatoryDesign.bib b/output/Escobedo (lPSfdqAAAAAJ)/Ansari2026-ParticipatoryDesign.bib new file mode 100644 index 00000000..1b981315 --- /dev/null +++ b/output/Escobedo (lPSfdqAAAAAJ)/Ansari2026-ParticipatoryDesign.bib @@ -0,0 +1,11 @@ +@inproceedings{Ansari2026:ParticipatoryTechReview, + title = {Using Participatory Design to Develop Communication-Supporting Technology: A Scoping Review}, + author = {R Ansari and S Anvari and L Escobedo and RR Wehbe}, + year = {2026}, + booktitle = {Anais da XII Conferencia Latino-Americana de Interacao Humano-Computador (CLIHC 2026)}, + publisher = {Sociedade Brasileira de Computacao}, + pages = {136-150}, + doi = {10.5753/clihc.2026.20411}, + url = {https://doi.org/10.5753/clihc.2026.20411}, + note = {Unenriched: no enrichment sources matched} +} diff --git a/output/Escobedo (lPSfdqAAAAAJ)/Wiafe2026-DesigningAI.bib b/output/Escobedo (lPSfdqAAAAAJ)/Wiafe2026-DesigningAI.bib new file mode 100644 index 00000000..9c6a1e43 --- /dev/null +++ b/output/Escobedo (lPSfdqAAAAAJ)/Wiafe2026-DesigningAI.bib @@ -0,0 +1,10 @@ +@inproceedings{Wiafe2026:DesigningAIAssistedSpeech, + title = {Designing an AI-Assisted Speech-Based Interactive System for Home-Based Sentence Practice for Children}, + author = {Elizabeth Wiafe and Frank Rudzicz and Lizbeth Escobedo}, + year = {2026}, + booktitle = {Anais da XII Conferencia Latino-Americana de Interacao Humano-Computador (CLIHC 2026)}, + publisher = {Sociedade Brasileira de Computacao}, + pages = {156-160}, + doi = {10.5753/clihc.2026.21174}, + url = {https://doi.org/10.5753/clihc.2026.21174} +} diff --git a/output/Gagie (aFCoq2YAAAAJ)/Gagie2021-CompactEuler.bib b/output/Gagie (aFCoq2YAAAAJ)/Gagie2021-CompactEuler.bib new file mode 100644 index 00000000..4c0bc191 --- /dev/null +++ b/output/Gagie (aFCoq2YAAAAJ)/Gagie2021-CompactEuler.bib @@ -0,0 +1,10 @@ +@misc{Gagie2021:CompactEulerTours, + title = {Compact Euler Tours of Trees with Small Maximum Degree}, + author = {Travis Gagie}, + year = {2021}, + howpublished = {arXiv}, + url = {https://arxiv.org/abs/2105.04965}, + eprint = {2105.04965}, + archiveprefix = {arXiv}, + note = {Unenriched: no enrichment sources matched} +} diff --git a/output/Gagie (aFCoq2YAAAAJ)/Gagie2024-MoveletTrees.bib b/output/Gagie (aFCoq2YAAAAJ)/Gagie2024-MoveletTrees.bib new file mode 100644 index 00000000..2528bcdf --- /dev/null +++ b/output/Gagie (aFCoq2YAAAAJ)/Gagie2024-MoveletTrees.bib @@ -0,0 +1,6 @@ +@misc{Gagie2024:MoveletTrees, + title = {Movelet Trees}, + author = {T Gagie and G Manzini and G Navarro and M Sciortino}, + year = {2024}, + howpublished = {arXiv e-prints, arXiv: 2408.04537} +} diff --git a/output/Gagie (aFCoq2YAAAAJ)/Gagie2026-ParseIndexing.bib b/output/Gagie (aFCoq2YAAAAJ)/Gagie2026-ParseIndexing.bib index 95ebf34f..376b5278 100644 --- a/output/Gagie (aFCoq2YAAAAJ)/Gagie2026-ParseIndexing.bib +++ b/output/Gagie (aFCoq2YAAAAJ)/Gagie2026-ParseIndexing.bib @@ -1,5 +1,11 @@ @misc{Gagie2026:PseudoMemIndexing, - title = {Parse indexing for choosing pseudo-MEMs}, + title = {Parse indexing for discarding short pseudo-MEMs safely}, author = {Travis Gagie}, - year = {2026} + year = {2026}, + howpublished = {arXiv}, + doi = {10.48550/arxiv.2605.17574}, + url = {https://arxiv.org/abs/2605.17574}, + eprint = {2605.17574}, + archiveprefix = {arXiv}, + primaryclass = {cs.DS} } diff --git a/output/Haque (PMTOOSQAAAAJ)/Boeira2026-PerformanceCharacterization.bib b/output/Haque (PMTOOSQAAAAJ)/Boeira2026-PerformanceCharacterization.bib index ba4bd4d7..0e002c4c 100644 --- a/output/Haque (PMTOOSQAAAAJ)/Boeira2026-PerformanceCharacterization.bib +++ b/output/Haque (PMTOOSQAAAAJ)/Boeira2026-PerformanceCharacterization.bib @@ -1,5 +1,10 @@ @misc{Boeira2026:PerformanceCharacterizationDAppsOpen, title = {Performance Characterization of dApps in Open Radio Access Networks}, author = {Conrado Boeira and Eduardo Baena and Andrea Lacava and Tommaso Melodia and Dimitrios Koutsonikolas and Israat Haque}, - year = {2026} + year = {2026}, + howpublished = {arXiv}, + doi = {10.48550/arxiv.2605.05426}, + url = {https://arxiv.org/abs/2605.05426}, + eprint = {2605.05426}, + archiveprefix = {arXiv} } diff --git a/output/Haque (PMTOOSQAAAAJ)/Parizotto2024-AraucariaSimplifying.bib b/output/Haque (PMTOOSQAAAAJ)/Parizotto2024-AraucariaSimplifying.bib new file mode 100644 index 00000000..93b5c3cf --- /dev/null +++ b/output/Haque (PMTOOSQAAAAJ)/Parizotto2024-AraucariaSimplifying.bib @@ -0,0 +1,6 @@ +@misc{Parizotto2024:AraucariaFaultTolerance, + title = {Araucaria: Simplifying INC Fault Tolerance with High-Level Intents}, + author = {R Parizotto and I Haque and A Schaeffer-Filho}, + year = {2024}, + note = {Unenriched: no enrichment sources matched} +} diff --git a/output/He (4yj_9skAAAAJ)/He2020-BreadthFirst.bib b/output/He (4yj_9skAAAAJ)/He2020-BreadthFirst.bib index 566bfb00..81354c93 100644 --- a/output/He (4yj_9skAAAAJ)/He2020-BreadthFirst.bib +++ b/output/He (4yj_9skAAAAJ)/He2020-BreadthFirst.bib @@ -1,6 +1,9 @@ -@misc{He2020:BreadthFirstRankSelect, - title = {Breadth-First Rank/Select in Succinct Trees and Distance Oracles for Interval Graphs}, - author = {Meng He and J. Ian Munro and Yakov Nekrich and Sebastian Wild and Kaiyu Wu}, +@misc{He2020:SuccinctRankSelect, + title = {Breadth-first rank/select in succinct trees and distance oracles for interval graphs}, + author = {M He and JI Munro and Y Nekrich and S Wild and K Wu}, year = {2020}, - howpublished = {arXiv} + howpublished = {arXiv}, + url = {https://arxiv.org/abs/2005.07644}, + eprint = {2005.07644}, + archiveprefix = {arXiv} } diff --git a/output/He (4yj_9skAAAAJ)/Lyu2022-RectangularRuler.bib b/output/He (4yj_9skAAAAJ)/Lyu2022-RectangularRuler.bib new file mode 100644 index 00000000..d4640718 --- /dev/null +++ b/output/He (4yj_9skAAAAJ)/Lyu2022-RectangularRuler.bib @@ -0,0 +1,9 @@ +@misc{Lyu2022:RectangularRulerWrapping, + title = {Rectangular Ruler Wrapping}, + author = {X Lyu and T Gagie and M He}, + year = {2022}, + howpublished = {arXiv}, + url = {https://arxiv.org/abs/2210.01954}, + eprint = {2210.01954}, + archiveprefix = {arXiv} +} diff --git a/output/Hernandez-Castillo (rSrWYaIAAAAJ)/Robertson2026-BrainAtrophy.bib b/output/Hernandez-Castillo (rSrWYaIAAAAJ)/Robertson2026-BrainAtrophy.bib index cba419b6..37b29c64 100644 --- a/output/Hernandez-Castillo (rSrWYaIAAAAJ)/Robertson2026-BrainAtrophy.bib +++ b/output/Hernandez-Castillo (rSrWYaIAAAAJ)/Robertson2026-BrainAtrophy.bib @@ -3,7 +3,7 @@ @misc{Robertson2026:BrainAtrophySpinocerebellarAtaxia author = {Jason W. Robertson and Isaac Adanyeguh and Tetsuo Ashizawa and Benjamin Bender and Fernando Cendes and Giulia Coarelli and Andreas Deistung and Stefano Diciotti and Alexandra Durr and Jennifer Faber and Marcondes C. Franca and Sophia L Goricke and Marina Grisoli and James M. Joers and Thomas Klockgether and Christophe Lenglet and Caterina Mariotti and Alberto R. M. Martinez and Chiara Marzi and Mario Mascalchi and Anna Nigri and Gulin Oz and Henry Paulson and Maria J. Rakowicz and Kathrin Reetz and Thiago JR Rezende and Lidia Sarro and Ludger Schols and Matthis Synofzik and Dagmar Timmann and Sophia I Thomopoulos and Paul M Thompson and Bart Van De Warrenburg and Carlos R. Hernandez-Castillo and Ian H. Harding}, year = {2026}, howpublished = {medRxiv}, - publisher = {Cold Spring Harbor Laboratory}, + publisher = {openRxiv}, doi = {10.64898/2026.04.22.26351550}, url = {https://doi.org/10.64898/2026.04.22.26351550} } diff --git a/output/Keselj (uDKsmuIAAAAJ)/Keselj2020-StarfishPrototype.bib b/output/Keselj (uDKsmuIAAAAJ)/Keselj2020-StarfishPrototype.bib new file mode 100644 index 00000000..e04beab8 --- /dev/null +++ b/output/Keselj (uDKsmuIAAAAJ)/Keselj2020-StarfishPrototype.bib @@ -0,0 +1,12 @@ +@misc{Keselj2020:StarfishPreprocessEmbed, + title = {Starfish: A Prototype for Universal Preprocessing and Text-Embedded Programming}, + author = {Vlado Keselj}, + year = {2020}, + howpublished = {arXiv}, + doi = {10.48550/arxiv.2007.02366}, + url = {https://arxiv.org/abs/2007.02366}, + eprint = {2007.02366}, + archiveprefix = {arXiv}, + primaryclass = {cs.PL}, + note = {Unenriched: no enrichment sources matched} +} diff --git a/output/Kryven (5ogGlooAAAAJ)/Cano2026-ProspectiveCompression.bib b/output/Kryven (5ogGlooAAAAJ)/Cano2026-ProspectiveCompression.bib index 592966fb..658f56ce 100644 --- a/output/Kryven (5ogGlooAAAAJ)/Cano2026-ProspectiveCompression.bib +++ b/output/Kryven (5ogGlooAAAAJ)/Cano2026-ProspectiveCompression.bib @@ -6,5 +6,6 @@ @misc{Cano2026:CompressionLearning doi = {10.48550/arxiv.2605.09985}, url = {https://arxiv.org/abs/2605.09985}, eprint = {2605.09985}, - archiveprefix = {arXiv} + archiveprefix = {arXiv}, + primaryclass = {cs.AI} } diff --git a/output/Kryven (5ogGlooAAAAJ)/Qin2026-HypothesisGeneration.bib b/output/Kryven (5ogGlooAAAAJ)/Qin2026-HypothesisGeneration.bib index 67515d43..239bac3a 100644 --- a/output/Kryven (5ogGlooAAAAJ)/Qin2026-HypothesisGeneration.bib +++ b/output/Kryven (5ogGlooAAAAJ)/Qin2026-HypothesisGeneration.bib @@ -1,6 +1,11 @@ @misc{Qin2026:HypothesisInferenceModels, title = {Hypothesis Generation and Inductive Inference in Children and Language Models}, - author = {Jeffrey Qin and Wasu Top Piriyakulki and Zhuangfei Gao and Mia Radovanovic and Jessica Sommerville and Kevin Ellis and Marta Kryven}, + author = {Jeffrey Qin and Wasu Top Piriyakulkij and Zhuangfei Gao and Mia Radovanovic and Jessica Sommerville and Kevin Ellis and Marta Kryven}, year = {2026}, - howpublished = {arXiv} + howpublished = {arXiv}, + doi = {10.48550/arxiv.2605.24528}, + url = {https://arxiv.org/abs/2605.24528}, + eprint = {2605.24528}, + archiveprefix = {arXiv}, + primaryclass = {cs.AI} } diff --git a/output/Kryven (5ogGlooAAAAJ)/Shu2020-AdventuresFlatland.bib b/output/Kryven (5ogGlooAAAAJ)/Shu2020-AdventuresFlatland.bib index 20d19e6f..bf51dd66 100644 --- a/output/Kryven (5ogGlooAAAAJ)/Shu2020-AdventuresFlatland.bib +++ b/output/Kryven (5ogGlooAAAAJ)/Shu2020-AdventuresFlatland.bib @@ -1,5 +1,7 @@ -@misc{Shu2020:SocialDynamicsPerception, +@inproceedings{Shu2020:SocialDynamicsPerception, title = {Adventures in Flatland: Perceiving Social Interactions Under Physical Dynamics}, author = {Tianmin Shu and Marta Kryven and Tomer Ullman and Josh Tenenbaum}, - year = {2020} + year = {2020}, + booktitle = {Proceedings of the Annual Meeting of the Cognitive Science Society 42}, + note = {Venue from SerpAPI publication string (unverified)} } diff --git a/output/Kryven (5ogGlooAAAAJ)/Yu2021-UnpackingComputations.bib b/output/Kryven (5ogGlooAAAAJ)/Yu2021-UnpackingComputations.bib index 457be780..9fef4b18 100644 --- a/output/Kryven (5ogGlooAAAAJ)/Yu2021-UnpackingComputations.bib +++ b/output/Kryven (5ogGlooAAAAJ)/Yu2021-UnpackingComputations.bib @@ -1,5 +1,6 @@ @misc{Yu2021:SpatialSearchUncertainty, title = {Unpacking the computations of human spatial search under uncertainty: noisy utility maximization, discounting, and probability warping}, author = {Suhyoun Yu and Marta Kryven and Josh Tenenbaum and Max Kleiman-Weiner}, - year = {2021} + year = {2021}, + note = {Unenriched: no enrichment sources matched} } diff --git a/output/Lahoud (Fnkc3a4AAAAJ)/Delplace2026-TowardsRealistic.bib b/output/Lahoud (Fnkc3a4AAAAJ)/Delplace2026-TowardsRealistic.bib index ce7b12e6..7e9f6a45 100644 --- a/output/Lahoud (Fnkc3a4AAAAJ)/Delplace2026-TowardsRealistic.bib +++ b/output/Lahoud (Fnkc3a4AAAAJ)/Delplace2026-TowardsRealistic.bib @@ -1,10 +1,10 @@ -@misc{Delplace2026:TowardsRealisticWaveformLevel, +@inproceedings{Delplace2026:TowardsRealisticWaveformLevel, title = {Towards Realistic Waveform-Level IoT Network Simulation via IQ Mixing}, author = {Alexis Delplace and Samer Lahoud and Kinda Khawam and Dominique Quadri}, year = {2026}, - howpublished = {arXiv}, - doi = {10.48550/arxiv.2604.06408}, - url = {https://arxiv.org/abs/2604.06408}, - eprint = {2604.06408}, - archiveprefix = {arXiv} + booktitle = {2026 IEEE International Symposium on Spectrum Innovation (DySPAN)}, + publisher = {IEEE}, + pages = {1-5}, + doi = {10.1109/dyspan69846.2026.11571124}, + url = {https://doi.org/10.1109/dyspan69846.2026.11571124} } diff --git a/output/Maguire (rHFCtWwAAAAJ)/Long2026-GenomicAntigenic.bib b/output/Maguire (rHFCtWwAAAAJ)/Long2026-GenomicAntigenic.bib index 6070318e..9e69c164 100644 --- a/output/Maguire (rHFCtWwAAAAJ)/Long2026-GenomicAntigenic.bib +++ b/output/Maguire (rHFCtWwAAAAJ)/Long2026-GenomicAntigenic.bib @@ -3,7 +3,7 @@ @misc{Long2026:H3N2CanadaDynamics author = {George S. Long and Thomas W.a. Braukmann and Nicholas Waglechner and Patryk Aftanas and Alex Marchand-Austin and Julianne V. Kus and Shawn T. Clark and Kevin Katz and Maan Hasso and Finlay Maguire and Samir N. Patel and Samira Mubareka and Venkata R. Duvvuri}, year = {2026}, howpublished = {medRxiv}, - publisher = {Cold Spring Harbor Laboratory}, + publisher = {openRxiv}, doi = {10.64898/2026.02.10.26345998}, url = {https://doi.org/10.64898/2026.02.10.26345998} } diff --git a/output/Maguire (rHFCtWwAAAAJ)/Martinez2026-CladePredictorMPXV.bib b/output/Maguire (rHFCtWwAAAAJ)/Martinez2026-CladePredictorMPXV.bib index f7d1bf2b..53549c25 100644 --- a/output/Maguire (rHFCtWwAAAAJ)/Martinez2026-CladePredictorMPXV.bib +++ b/output/Maguire (rHFCtWwAAAAJ)/Martinez2026-CladePredictorMPXV.bib @@ -3,7 +3,7 @@ @misc{Martinez2026:CladePredictorMPXVAlignmentFree author = {Gustavo Sganzerla Martinez and Ali Toloue Ostadgavahi and Mansi Dutt and Finlay Maguire and Lourdes Pena-Castillo and David J Kelvin and Anuj Kumar}, year = {2026}, howpublished = {medRxiv}, - publisher = {Cold Spring Harbor Laboratory}, + publisher = {openRxiv}, doi = {10.64898/2026.04.27.26351821}, url = {https://doi.org/10.64898/2026.04.27.26351821} } diff --git a/output/Mattheisen (uhlDFm4AAAAJ)/Giannakopoulou2021-GeneticArchitecture.bib b/output/Mattheisen (uhlDFm4AAAAJ)/Giannakopoulou2021-GeneticArchitecture.bib new file mode 100644 index 00000000..c82dd49f --- /dev/null +++ b/output/Mattheisen (uhlDFm4AAAAJ)/Giannakopoulou2021-GeneticArchitecture.bib @@ -0,0 +1,12 @@ +@article{Giannakopoulou2021:GeneticArchitectureDepressionIndividuals, + title = {The Genetic Architecture of Depression in Individuals of East Asian Ancestry: A Genome-Wide Association Study}, + author = {Olga Giannakopoulou and Kuang Lin and Xiangrui Meng and Mei-Hsin Su and Po-Hsiu Kuo and Roseann E. Peterson and Swapnil Awasthi and Arden Moscati and Jonathan R. I. Coleman and Nick Bass and Iona Y. Millwood and Yiping Chen and Zhengming Chen and Hsi-Chung Chen and Mong-Liang Lu and Ming-Chyi Huang and Chun-Hsin Chen and Eli A. Stahl and Ruth J. F. Loos and Niamh Mullins and Robert J. Ursano and Ronald C. Kessler and Murray B. Stein and Srijan Sen and Laura J. Scott and Margit Burmeister and Yu Fang and Jess Tyrrell and Yunxuan Jiang and Chao Tian and Andrew M. McIntosh and Stephan Ripke and Erin C. Dunn and Kenneth S. Kendler and Robin G. Walters and Cathryn M. Lewis and Karoline Kuchenbaecker and 23andMe Research Team, China Kadoorie Biobank Collaborative Group, and Major Depressive Disorder Working Group Of The Psychiatric Genomics Consortium and Naomi R. Wray and Stephan Ripke and Manuel Mattheisen and Maciej Trzaskowski and Enda M. Byrne and Abdel Abdellaoui and Mark J. Adams and Esben Agerbo and Tracy M. Air and Till F. M. Andlauer and Silviu-Alin Bacanu and Marie Baekvad-Hansen and Aartjan T. F. Beekman and Tim B. Bigdeli and Elisabeth B. Binder and Julien Bryois and Henriette N. Buttenschon and Jonas Bybjerg-Grauholm and Na Cai and Enrique Castelao and Jane Hvarregaard Christensen and Toni-Kim Clarke and Jonathan R. I. Coleman and Lucia Colodro-Conde and Hilary Coon and Baptiste Couvy-Duchesne and Nick Craddock and Gregory E. Crawford and Gail Davies and Ian J. Deary and Franziska Degenhardt and Eske M. Derks and Nese Direk and Conor V. Dolan and Erin C. Dunn and Thalia C. Eley and Valentina Escott-Price and Farnush Farhadi Hassan Kiadeh and Hilary K. Finucane and Jerome C. Foo and Andreas J. Forstner and Josef Frank and Helena A. Gaspar and Michael Gill and Fernando S. Goes and Scott D. Gordon and Jakob Grove and Lynsey S. Hall and Christine Soholm Hansen and Thomas F. Hansen and Stefan Herms and Ian B. Hickie and Per Hoffmann and Georg Homuth and Carsten Horn and Jouke-Jan Hottenga and David M. Howard and David M. Hougaard and Marcus Ising and Rick Jansen and Ian Jones and Lisa A. Jones and Eric Jorgenson and James A. Knowles and Isaac S. Kohane and Julia Kraft and Warren W. Kretzschmar and Zoltan Kutalik and Yihan Li and Penelope A. Lind and Jurjen J. Luykx and Donald J. MacIntyre and Dean F. MacKinnon and Robert M. Maier and Wolfgang Maier and Jonathan Marchini and Hamdi Mbarek and Patrick McGrath and Peter McGuffin and Sarah E. Medland and Divya Mehta and Christel M. Middeldorp and Evelin Mihailov and Yuri Milaneschi and Lili Milani and Francis M. Mondimore and Grant W. Montgomery and Sara Mostafavi and Niamh Mullins and Matthias Nauck and Bernard Ng and Michel G. Nivard and Dale R. Nyholt and Paul F. O'Reilly and Hogni Oskarsson and Michael J. Owen and Jodie N. Painter and Carsten Bocker Pedersen and Marianne Giortz Pedersen and Roseann E. Peterson and Erik Pettersson and Wouter J. Peyrot and Giorgio Pistis and Danielle Posthuma and Jorge A. Quiroz and Per Qvist and John P. Rice and Brien P. Riley and Margarita Rivera and Saira Saeed Mirza and Robert Schoevers and Eva C. Schulte and Ling Shen and Jianxin Shi and Stanley I. Shyn and Engilbert Sigurdsson and Grant C. B. Sinnamon and Johannes H. Smit and Daniel J. Smith and Hreinn Stefansson and Stacy Steinberg and Fabian Streit and Jana Strohmaier and Katherine E. Tansey and Henning Teismann and Alexander Teumer and Wesley Thompson and Pippa A. Thompson and Thorgeir E. Thorgeirsson and Matthew Traylor and Jens Treutlein and Vassily Trubetskoy and Andre G. Uitterlinden and Daniel Umbricht and Sandra Van Der Auwera and Albert M. Van Hemert and Alexander Viktorin and Peter M. Visscher and Yunpeng Wang and Bradley T. Webb and Shantel Marie Weinsheimer and Jurgen Wellmann and Gonneke Willemsen and Stephanie H. Witt and Yang Wu and Hualin S. Xi and Jian Yang and Futao Zhang and Volker Arolt and Bernhard T Baune and Klaus Berger and Dorret I. Boomsma and Sven Cichon and Udo Dannlowski and Ejc De Geus and J. Raymond DePaulo and Enrico Domenici and Katharina Domschke and Tonu Esko and Hans J. Grabe and Steven P. Hamilton and Caroline Hayward and Andrew C. Heath and Kenneth S. Kendler and Stefan Kloiber and Glyn Lewis and Qingqin S. Li and Susanne Lucae and Pamela AF Madden and Patrik K. Magnusson and Nicholas G. Martin and Andrew M. McIntosh and Andres Metspalu and Ole Mors and Preben Bo Mortensen and Bertram Muller-Myhsok and Merete Nordentoft and Markus M. Nothen and Michael C. O'Donovan and Sara A. Paciga and Nancy L. Pedersen and Brenda Wjh Penninx and Roy H. Perlis and David J. Porteous and James B. Potash and Martin Preisig and Marcella Rietschel and Catherine Schaefer and Thomas G. Schulze and Jordan W. Smoller and Kari Stefansson and Henning Tiemeier and Rudolf Uher and Henry Volzke and Myrna M. Weissman and Thomas Werge and Cathryn M. Lewis and Douglas F. Levinson and Gerome Breen and Anders D. Borglum and Patrick F. Sullivan and Michelle Agee and Stella Aslibekyan and Adam Auton and Elizabeth Babalola and Robert K. Bell and Jessica Bielenberg and Katarzyna Bryc and Emily Bullis and Briana Cameron and Daniella Coker and Gabriel Cuellar Partida and Devika Dhamija and Sayantan Das and Sarah L. Elson and Teresa Filshtein and Kipper Fletez-Brant and Pierre Fontanillas and Will Freyman and Pooja M. Gandhi and Karl Heilbron and Barry Hicks and David A. Hinds and Karen E. Huber and Ethan M. Jewett and Yunxuan Jiang and Aaron Kleinman and Katelyn Kukar and Vanessa Lane and Keng-Han Lin and Maya Lowe and Marie K. Luff and Jennifer C. McCreight and Matthew H. McIntyre and Kimberly F. McManus and Steven J. Micheletti and Meghan E. Moreno and Joanna L. Mountain and Sahar V. Mozaffari and Priyanka Nandakumar and Elizabeth S. Noblin and Jared O'Connell and Aaron A. Petrakovitz and G. David Poznik and Morgan Schumacher and Anjali J. Shastri and Janie F. Shelton and Jingchunzi Shi and Suyash Shringarpure and Chao Tian and Vinh Tran and Joyce Y. Tung and Xin Wang and Wei Wang and Catherine H. Weldon and Peter Wilton and Daniel Avery and Derrick Bennett and Zheng Bian and Ruth Boxall and Fiona Bragg and Ka Hung Chan and Liang Chang and Yumei Chang and Biyun Chen and Jinyan Chen and Junshi Chen and Naying Chen and Ningyu Chen and Xiaofang Chen and Yiping Chen and Zhengming Chen and Liang Cheng and Johnathan Clarke and Robert Clarke and Rory Collins and Caixia Dong and Huaidong Du and Ranran Du and Zammy Fairhurst-Hunter and Lei Fan and Shixian Feng and Zhongxi Fu and Wei Gan and Ruqin Gao and Yulian Gao and Pengfei Ge and Simon Gilbert and Weiwei Gong and Qijun Gu and Yu Guo and Zhendong Guo and Ziyan Guo and Alex Hacker and Xiao Han and Parisa Hariri and Pan He and Tianyou He and Mike Hill and Michael Holmes and Can Hou and Wei Hou and Chen Hu and Ruying Hu and Ximin Hu and Yihe Hu and Hua Hua and Yujie Hua and Yuelong Huang and Pek Kei Im and Andri Iona and Qilian Jiang and Jianrong Jin and Maria Kakkoura and Quan Kang and Christiana Kartsonaki and Rene Kerosi and Ling Kong and Jian Lan and Garry Lancaster and Feifei Li and Huimei Li and Jianguo Li and Liming Li and Mingqiang Li and Shanpeng Li and Yanjie Li and Yilei Li and Zhongxiao Li and Kuang Lin and Lingli Lingli and Chao Liu and Depei Liu and Duo Liu and Fang Liu and Huilin Liu and Jiaqiu Liu and Jingchao Liu and Yongmei Liu and Yun Liu and Huajun Long and Yan Lu and Guojin Luo and Jun Lv and Silu Lv and Liangcai Ma and Enke Mao and John McDonnell and Fanwen Meng and Jinhuai Meng and Iona Millwood and Qunhua Nie and Feng Ning and Dongxia Pan and Rong Pan and Zengchang Pang and Pei Pei and Richard Peto and Alfred Pozarickij and Yijian Qian and Yulu Qin and Chan Qu and Xiaolan Ren and Paul Ryder and Sam Sansome and Dan Schmidt and Paul Sherliker and Rajani Sohoni and Becky Stevens and Jian Su and Huarong Sun and Qiang Sun and Xiaohui Sun and Aiyu Tang and Zhenzhu Tang and Ran Tao and Xiaocao Tian and Iain Turnbull and Robin Walters and Meng Wan and Chunmei Wang and Chen Wang and Hao Wang and Junzheng Wang and Lin Wang and Ping Wang and Tao Wang and Shaojie Wang and Sisi Wang and Xiaohuan Wang and Liuping Wei and Min Weng and Neil Wright and Ming Wu and Xianping Wu and Shukuan Wu and Kaixu Xie and Qiaohua Xu and Qinai Xu and Xin Xu and Shichun Yan and Ling Yang and Xiaoming Yang and Jie Yang and Pang Yao and Li Yin and Bo Yu and Canqing Yu and Min Yu and Yaoming Zhai and Hao Zhang and Hui Zhang and Jun Zhang and Libo Zhang and Ningmei Zhang and Xi Zhang and Xiaoyi Zhang and Xukui Zhang and Xunfu Zhong and Ding Zhang Zhou and Gang Zhou and Jinyi Zhou and Liyuan Zhou and Weiwei Zhou and Xue Zhou and Yonglin Zhou and Mingyuan Zou}, + year = {2021}, + journal = {JAMA Psychiatry}, + publisher = {American Medical Association (AMA)}, + volume = {78}, + number = {11}, + pages = {1258}, + doi = {10.1001/jamapsychiatry.2021.2099}, + url = {https://doi.org/10.1001/jamapsychiatry.2021.2099} +} diff --git a/output/Mattheisen (uhlDFm4AAAAJ)/Grotzinger2025-LandscapeShared.bib b/output/Mattheisen (uhlDFm4AAAAJ)/Grotzinger2025-LandscapeShared.bib index 8da7e224..c95d601a 100644 --- a/output/Mattheisen (uhlDFm4AAAAJ)/Grotzinger2025-LandscapeShared.bib +++ b/output/Mattheisen (uhlDFm4AAAAJ)/Grotzinger2025-LandscapeShared.bib @@ -5,5 +5,6 @@ @misc{Grotzinger2025:GeneticPsychiatricDisorders howpublished = {medRxiv}, publisher = {Cold Spring Harbor Laboratory}, doi = {10.1101/2025.01.14.25320574}, - url = {https://doi.org/10.1101/2025.01.14.25320574} + url = {https://doi.org/10.1101/2025.01.14.25320574}, + month = {Jan} } diff --git a/output/Mattheisen (uhlDFm4AAAAJ)/H2026-ValidatingField.bib b/output/Mattheisen (uhlDFm4AAAAJ)/H2026-ValidatingField.bib new file mode 100644 index 00000000..a9b4fd32 --- /dev/null +++ b/output/Mattheisen (uhlDFm4AAAAJ)/H2026-ValidatingField.bib @@ -0,0 +1,9 @@ +@misc{H2026:ValidatingFieldFeasibleMeasures, + title = {Validating Field-Feasible Measures of Recent Khat Use: A Diagnostic Accuracy Study Comparing Amphetamine Immunoassay and Assisted Self-Report Against HPLC in an Ethiopian Male Cohort}, + author = {Atkinson H and Mekonnen Z and Suleman S and Oetzel L and Soboka M and Widmann M and Toennes Sw and Tesfaye M and Stewart Sa and Muller-Bamouh V and Schulze Tg and Asbridge M and Mattheisen M and Adorjan K and Odenwald M.}, + year = {2026}, + howpublished = {openRxiv}, + publisher = {openRxiv}, + doi = {10.64898/2026.06.14.26355466}, + url = {https://doi.org/10.64898/2026.06.14.26355466} +} diff --git a/output/Mattheisen (uhlDFm4AAAAJ)/Naamanka2025-GenomeWide.bib b/output/Mattheisen (uhlDFm4AAAAJ)/Naamanka2025-GenomeWide.bib new file mode 100644 index 00000000..0aca2268 --- /dev/null +++ b/output/Mattheisen (uhlDFm4AAAAJ)/Naamanka2025-GenomeWide.bib @@ -0,0 +1,9 @@ +@misc{Naamanka2025:Sorcs3PanicLocus, + title = {Genome-wide Association Study Identifies SORCS3 as a Novel Susceptibility Locus for Panic Disorder in the FinnGen Study}, + author = {Joonas Naamanka and Elisa Tasanko and Kalevi Trontti and Bozidar Novak and Veijo Kinnunen and Jaana Suvisaari and Tiina Paunio and Mariliis Vaht and Wei Zhou and Mitja Kurki and Jessica Reinhart and Juliane Boschet-Lange and Roxana Pittig and Andre Pittig and Zuzanna Misiewicz and Manuel Mattheisen and Sandra Meier and Elisabeth B. Binder and Andres Metspalu and Mark Daly and FinnGen and Christoph W. Turck and Angelika Erhardt-Lehmann and Jaana A. Hartiala and Iiris Hovatta}, + year = {2025}, + howpublished = {bioRxiv}, + publisher = {openRxiv}, + doi = {10.1101/2025.07.03.25330813}, + url = {https://doi.org/10.1101/2025.07.03.25330813} +} diff --git a/output/Mattheisen (uhlDFm4AAAAJ)/Strom2021-GenomeWide.bib b/output/Mattheisen (uhlDFm4AAAAJ)/Strom2021-GenomeWide.bib new file mode 100644 index 00000000..29d3d22d --- /dev/null +++ b/output/Mattheisen (uhlDFm4AAAAJ)/Strom2021-GenomeWide.bib @@ -0,0 +1,9 @@ +@misc{Strom2021:GenomeWideAssociationStudy, + title = {Genome-wide association study identifies new locus associated with OCD}, + author = {Nora I. Strom and Dongmei Yu and Zachary F. Gerring and Matthew W. Halvorsen and Abdel Abdellaoui and Cristina Rodriguez-Fontenla and Julia M. Sealock and Tim Bigdeli and Jonathan R. I. Coleman and Behrang Mahjani and Jackson G. Thorp and Katharina Bey and Christie L. Burton and Jurjen J. Luykx and Gwyneth Zai and Kathleen D. Askland and Cristina Barlassina and Judith Becker Nissen and Laura Bellodi and O. Joseph Bienvenu and Donald Black and Michael Bloch and Julia Boberg and Rosa Bosch and Michael Breen and Brian P. Brennan and Helena Brentani and Joseph D. Buxbaum and Jonas Bybjerg-Grauholm and Enda M. Byrne and Beatriz Camarena and Adrian Camarena and Carolina Cappi and Angel Carracedo and Miguel Casas and Maria C. Cavallini and Valentina Ciullo and Edwin H. Cook and Vladimir Coric and Bernadette A. Cullen and Elles J. De Schipper and Bernie Devlin and Srdjan Djurovic and Jason A. Elias and Lauren Erdman and Xavier Estivil and Martha J. Falkenstein and Bengt T. Fundin and Maiken E. Gabrielsen and Fernando S. Goes and Marco A. Grados and Jakob Grove and Wei Guo and Jan Haavik and Kristen Hagen and Alexandra Havdahl and Ana G. Hounie and Donald Hucks and Christina Hultman and Magdalena Janecka and Michael Jenike and Elinor K. Karlsson and Julia Klawohn and Lambertus Klei and Janice Krasnow and Kristi Krebs and Jason Krompinger and Nuria Lanzagorta and Fabio Macciardi and Brion Maher and Evonne McArthur and Nathaniel McGregor and Nicole C. McLaughlin and Sandra Meier and Euripedes C. Miguel and Maureen Mulhern and Paul S. Nestadt and Erika L. Nurmi and Kevin S. O'Connell and Lisa Osiecki and Teemu Palviainen and Fabrizio Piras and Federica Piras and Ann E. Pulver and Raquel Rabionet and Alfredo Ramirez and Scott Rauch and Abraham Reichenberg and Jennifer Reichert and Mark A. Riddle and Stephan Ripke and Aline S. Sampaio and Miriam A. Schiele and Laura G. Sloofman and Jan Smit and Janet L. Sobell and Maria Soler Artigas and Laurent F. Thomas and Homero Vallada and Jeremy Veenstra-VanderWeele and Nienke N. C. C. Vulink and Christopher P. Walker and Ying Wang and Jens R. Wendland and Bendik S. Winsvold and Yin Yao and Pino Alonso and Gotz Berberich and Cynthia M. Bulik and Danielle Cath and Daniele Cusi and Richard Delorme and Damiaan Denys and Valsamma Eapen and Peter Falkai and Thomas V. Fernandez and Abby J. Fyer and Daniel A. Geller and Hans J. Grabe and Benjamin D. Greenberg and Gregory L. Hanna and Ian M. Hickie and David M. Hougaard and Norbert Kathmann and James Kennedy and Liang Kung-Yee and Mikael Landen and Stephanie Le Hellard and Marion Leboyer and Christine Lochner and James T. McCracken and Sarah E. Medland and Preben B. Mortensen and Benjamin Neale and Humberto Nicolini and Merete Nordentoft and Michele Pato and Carlos Pato and David L. Pauls and Nancy L. Pedersen and John Piacentini and Christopher Pittenger and Danielle Posthuma and Josep A Ramos-Quiroga and Steven A. Rasmussen and Kerry J. Ressler and Margaret A. Richter and Maria C. Rosario and David R. Rosenberg and Stephan Ruhrmann and Jack F. Samuels and Sven Sandin and Paul Sandor and Gianfranco Spalletta and Dan J. Stein and S. Evelyn Stewart and Eric A. Storch and Barbara E. Stranger and Maurizio Turiel and Thomas Werge and Ole A. Andreassen and Anders D. Borglum and Susanne Walitza and Bjarne K. A. Hansen and Christian P. Ruck and Nicholas G. Martin and Lili Milani and Ole Mors and Ted Reichborn-Kjennerud and Marta Ribases and Gerd Kvale and David Mataix-Cols and Katharina Domschke and Edna Grunblatt and Michael Wagner and John-Anker Zwart and Gerome Breen and Gerald Nestadt and Andres Metspalu and Jaakko Kaprio and Paul D. Arnold and Dorothy E. Grice and James A. Knowles and Helga Ask and Karin J. H. Verweij and Lea K. Davis and Dirk J. A. Smit and James J. Crowley and Carol A. Mathews and Eske M. Derks and Jeremiah M. Scharf and Manuel Mattheisen}, + year = {2021}, + howpublished = {bioRxiv}, + publisher = {openRxiv}, + doi = {10.1101/2021.10.13.21261078}, + url = {https://doi.org/10.1101/2021.10.13.21261078} +} diff --git a/output/Mattheisen (uhlDFm4AAAAJ)/Y2026-AlteredNeurodevelopmental.bib b/output/Mattheisen (uhlDFm4AAAAJ)/Y2026-AlteredNeurodevelopmental.bib index 87724e96..c73d6dcd 100644 --- a/output/Mattheisen (uhlDFm4AAAAJ)/Y2026-AlteredNeurodevelopmental.bib +++ b/output/Mattheisen (uhlDFm4AAAAJ)/Y2026-AlteredNeurodevelopmental.bib @@ -1,6 +1,6 @@ @misc{Y2026:NeuroTicTrajectories, title = {Altered neurodevelopmental trajectories of brain structure in Tourette syndrome and Chronic Tic Disorders}, - author = {Jin Y and Guo Y and Koller Jm and Grossen Sc and Uhlmann A and Forde Nj and Zouki J and Torrecuso R and Mueller K and Martin-Rodriguez JF and Franco-Rosado P and Grothe M and Cramer C and Buning Ak and Eichele H and Palmucci S and Prato A and Saia F and Tommasin S and Conte G and Schindlbeck Ka and Ganos C and Zimmermann S and Veselinovic T and Worbe Y and Hartmann A and Topaloudi A and Kaka M and Chen G and Zhong Q and Zhang Y and Szejko N and Janik P and Debes Nm and Tumer Z and Wolanczyk T and Heiman Ga and Stefansson H and Ask H and Andreassen O and Borglum Ad and Buxbaum Jd and Corfield Ec and Daly M and Grice De and Mataix-Cols D and Palotie A and Ruck C and Halvorsen Mw and Davis Lk and Crowley Jj and Mattheisen M and Yu D and Mathews Ca and Scharf Jm and The Members Of The Tourette International TS-EUROTRAIN/TSGeneSEE and Taa Neuroimaging Consortium and Collaborative Genetics Consortium and TAAICG and EMTICS and Enigma-ts Working Group and Stein Dj and Neuner I and Musil R and Cardona F and Cath D and Veltman Dj and Silk Tj and Munchau A and Verrel J and Brandt Vc and Hershey T and Greene Dj and Schlaggar Bl and Buitelaar J and Franke B and Thomopoulos S and Rizzo R and Dietrich A and Hoekstra Pj and Mir P and Roessner V and Van Den Heuvel Oa and Mueller-Vahl K and Moller H and Jahanshad N and Thompson Pm and Black Kj and Paschou P.}, + author = {Jin Y and Guo Y and Koller Jm and Grossen Sc and Uhlmann A and Forde Nj and Zouki Jj and Torrecuso R and Mueller K and Martin-Rodriguez JF and Franco-Rosado P and Grothe M and Cramer C and Buning Ak and Eichele H and Palmucci S and Prato A and Saia F and Tommasin S and Conte G and Schindlbeck Ka and Ganos C and Zimmermann S and Veselinovic T and Worbe Y and Hartmann A and Topaloudi A and Kaka M and Chen G and Zhong Q and Zhang Y and Szejko N and Janik P and Debes Nm and Tumer Z and Wolanczyk T and Heiman Ga and Stefansson H and Ask H and Andreassen O and Borglum Ad and Buxbaum Jd and Corfield Ec and Daly M and Grice De and Mataix-Cols D and Palotie A and Ruck C and Halvorsen Mw and Davis Lk and Crowley Jj and Mattheisen M and Yu D and Mathews Ca and Scharf Jm and Members Of The Tourette International TS-EUROTRAIN/TSGeneSEE and Taa Neuroimaging Consortium and Collaborative Genetics Consortium and TAAICG and EMTICS and Enigma-ts Working Group and Stein Dj and Neuner I and Musil R and Cardona F and Cath D and Veltman Dj and Silk Tj and Munchau A and Verrel J and Brandt Vc and Hershey T and Greene Dj and Schlaggar Bl and Buitelaar J and Franke B and Thomopoulos S and Rizzo R and Dietrich A and Hoekstra Pj and Mir P and Roessner V and Van Den Heuvel Oa and Mueller-Vahl K and Moller H and Jahanshad N and Thompson Pm and Black Kj and Paschou P}, year = {2026}, howpublished = {medRxiv}, publisher = {Cold Spring Harbor Laboratory}, diff --git a/output/Matwin (rCoJeuYAAAAJ)/Eljabu2021-DestinationPort.bib b/output/Matwin (rCoJeuYAAAAJ)/Eljabu2021-DestinationPort.bib index b8c07d8e..20a65c6b 100644 --- a/output/Matwin (rCoJeuYAAAAJ)/Eljabu2021-DestinationPort.bib +++ b/output/Matwin (rCoJeuYAAAAJ)/Eljabu2021-DestinationPort.bib @@ -1,5 +1,6 @@ @misc{Eljabu2021:PortResourceOptimization, title = {Destination Port Detection for Vessels: An Analytic Tool for Optimizing Port Authorities Resources}, author = {Lubna Eljabu and Mohammad Etemad and Stan Matwin}, - year = {2021} + year = {2021}, + note = {Unenriched: no enrichment sources matched} } diff --git a/output/Matwin (rCoJeuYAAAAJ)/Naderi2026-BeyondFeature.bib b/output/Matwin (rCoJeuYAAAAJ)/Naderi2026-BeyondFeature.bib index c126e68c..e922d44c 100644 --- a/output/Matwin (rCoJeuYAAAAJ)/Naderi2026-BeyondFeature.bib +++ b/output/Matwin (rCoJeuYAAAAJ)/Naderi2026-BeyondFeature.bib @@ -1,5 +1,10 @@ @misc{Naderi2026:BeyondFeatureFusionContextual, title = {Beyond Feature Fusion: Contextual Bayesian PEFT for Multi-Modal Uncertainty Estimation}, author = {Habibeh Naderi and Behrouz Haji Soleimani and Stan Matwin}, - year = {2026} + year = {2026}, + howpublished = {arXiv}, + doi = {10.48550/arxiv.2604.16615}, + url = {https://arxiv.org/abs/2604.16615}, + eprint = {2604.16615}, + archiveprefix = {arXiv} } diff --git a/output/Matwin (rCoJeuYAAAAJ)/Naderi2026-CrossModal.bib b/output/Matwin (rCoJeuYAAAAJ)/Naderi2026-CrossModal.bib index 978baa7e..074d2270 100644 --- a/output/Matwin (rCoJeuYAAAAJ)/Naderi2026-CrossModal.bib +++ b/output/Matwin (rCoJeuYAAAAJ)/Naderi2026-CrossModal.bib @@ -1,5 +1,10 @@ @misc{Naderi2026:BayesianLowRankAdaptation, title = {Cross-Modal Bayesian Low-Rank Adaptation for Uncertainty-Aware Multi-Modal Learning}, author = {Habibeh Naderi and Behrouz Haji Soleimani and Stan Matwin}, - year = {2026} + year = {2026}, + howpublished = {arXiv}, + doi = {10.48550/arxiv.2604.16657}, + url = {https://arxiv.org/abs/2604.16657}, + eprint = {2604.16657}, + archiveprefix = {arXiv} } diff --git a/output/Matwin (rCoJeuYAAAAJ)/Naderi2026-TokenImbalance.bib b/output/Matwin (rCoJeuYAAAAJ)/Naderi2026-TokenImbalance.bib new file mode 100644 index 00000000..055f94b8 --- /dev/null +++ b/output/Matwin (rCoJeuYAAAAJ)/Naderi2026-TokenImbalance.bib @@ -0,0 +1,7 @@ +@inproceedings{Naderi2026:ElboContrastiveRouting, + title = {From token imbalance to balanced routing: An elbo-regularized probabilistic framework for contrastive Multi-Modal learning}, + author = {H Naderi and BH Soleimani and S Matwin}, + year = {2026}, + booktitle = {The 29th International Conference on Artificial Intelligence and Statistics}, + note = {Venue from SerpAPI publication string (unverified)} +} diff --git a/output/Matwin (rCoJeuYAAAAJ)/Sadeghi2024-ReviewGlobal.bib b/output/Matwin (rCoJeuYAAAAJ)/Sadeghi2024-ReviewGlobal.bib new file mode 100644 index 00000000..c12c88bb --- /dev/null +++ b/output/Matwin (rCoJeuYAAAAJ)/Sadeghi2024-ReviewGlobal.bib @@ -0,0 +1,10 @@ +@misc{Sadeghi2024:GlobalSensitivityClassification, + title = {A Review of Global Sensitivity Analysis Methods and a comparative case study on Digit Classification}, + author = {Zahra Sadeghi and Stan Matwin}, + year = {2024}, + howpublished = {arXiv}, + doi = {10.48550/arxiv.2406.16975}, + url = {https://arxiv.org/abs/2406.16975}, + eprint = {2406.16975}, + archiveprefix = {arXiv} +} diff --git a/output/Milios (ME8aQywAAAAJ)/Maisonnave2020-ImprovingEvent.bib b/output/Milios (ME8aQywAAAAJ)/Maisonnave2020-ImprovingEvent.bib deleted file mode 100644 index 0a1a2377..00000000 --- a/output/Milios (ME8aQywAAAAJ)/Maisonnave2020-ImprovingEvent.bib +++ /dev/null @@ -1,6 +0,0 @@ -@misc{Maisonnave2020:ContextualEmbeddings, - title = {Improving Event Detection using Contextual Word and Sentence Embeddings}, - author = {Mariano Maisonnave and Fernando Delbianco and Fernando Tohme and Ana Gabriela Maguitman and Evangelos Milios}, - year = {2020}, - howpublished = {arXiv} -} diff --git a/output/Neethirajan (8VZwF0sAAAAJ)/Dhaliwal2026-HenTwinMulti.bib b/output/Neethirajan (8VZwF0sAAAAJ)/Dhaliwal2026-HenTwinMulti.bib new file mode 100644 index 00000000..531883fb --- /dev/null +++ b/output/Neethirajan (8VZwF0sAAAAJ)/Dhaliwal2026-HenTwinMulti.bib @@ -0,0 +1,7 @@ +@inproceedings{Dhaliwal2026:HenTwinMultiModalDigital, + title = {HenTwin: A Multi-Modal Digital Twin Framework for Longitudinal Welfare Monitoring in Early-Life Laying Hens}, + author = {Y Dhaliwal and S Neethirajan}, + year = {2026}, + booktitle = {Proceedings of the 39th IEEE Canadian Conference on Electrical and Computer}, + note = {Venue from SerpAPI publication string (unverified)} +} diff --git a/output/Neethirajan (8VZwF0sAAAAJ)/Essien2026-ComparativeAnalysis.bib b/output/Neethirajan (8VZwF0sAAAAJ)/Essien2026-ComparativeAnalysis.bib new file mode 100644 index 00000000..64b7801e --- /dev/null +++ b/output/Neethirajan (8VZwF0sAAAAJ)/Essien2026-ComparativeAnalysis.bib @@ -0,0 +1,7 @@ +@inproceedings{Essien2026:DeepPoultryClassification, + title = {Comparative Analysis of Deep Temporal Models for Poultry Behaviour Classification}, + author = {D Essien and S Neethirajan}, + year = {2026}, + booktitle = {39th IEEE Canadian Conference on Electrical and Computer Engineering (CCECE}, + note = {Venue from SerpAPI publication string (unverified)} +} diff --git a/output/Neethirajan (8VZwF0sAAAAJ)/Kate2026-BeyondAccuracy.bib b/output/Neethirajan (8VZwF0sAAAAJ)/Kate2026-BeyondAccuracy.bib new file mode 100644 index 00000000..b840cdf5 --- /dev/null +++ b/output/Neethirajan (8VZwF0sAAAAJ)/Kate2026-BeyondAccuracy.bib @@ -0,0 +1,9 @@ +@misc{Kate2026:ReliabilityCrossFarmEvaluation, + title = {Beyond Accuracy: Reliability-Aware Cross-Farm Evaluation of Dairy Cow Vocalization Models}, + author = {Mayuri Kate and Suresh Raja Neethirajan}, + year = {2026}, + howpublished = {openRxiv}, + publisher = {openRxiv}, + doi = {10.64898/2026.06.17.732832}, + url = {https://doi.org/10.64898/2026.06.17.732832} +} diff --git a/output/Neethirajan (8VZwF0sAAAAJ)/Kate2026-MultiExpert.bib b/output/Neethirajan (8VZwF0sAAAAJ)/Kate2026-MultiExpert.bib new file mode 100644 index 00000000..b8290ad4 --- /dev/null +++ b/output/Neethirajan (8VZwF0sAAAAJ)/Kate2026-MultiExpert.bib @@ -0,0 +1,7 @@ +@inproceedings{Kate2026:ExpertFusionAbstention, + title = {Multi-Expert Fusion with Confidence-Aware Abstention for Macro-Behavior Classification of Cow Vocalizations}, + author = {M Kate and S Neethirajan}, + year = {2026}, + booktitle = {39th IEEE Canadian Conference on Electrical and Computer Engineering (CCECE}, + note = {Venue from SerpAPI publication string (unverified)} +} diff --git a/output/Neethirajan (8VZwF0sAAAAJ)/Mahato2024-DairyDigiD.bib b/output/Neethirajan (8VZwF0sAAAAJ)/Mahato2024-DairyDigiD.bib new file mode 100644 index 00000000..224a8754 --- /dev/null +++ b/output/Neethirajan (8VZwF0sAAAAJ)/Mahato2024-DairyDigiD.bib @@ -0,0 +1,9 @@ +@misc{Mahato2024:DairyBiometricID, + title = {Dairy DigiD A Deep Learning-Based, Non-Invasive Biometric Identification System for Dairy Cattle Using Detectron2}, + author = {Shubhangi Mahato and Hanqing Bi and Suresh Neethirajan}, + year = {2024}, + howpublished = {bioRxiv}, + publisher = {openRxiv}, + doi = {10.1101/2024.12.14.628477}, + url = {https://doi.org/10.1101/2024.12.14.628477} +} diff --git a/output/Neethirajan (8VZwF0sAAAAJ)/Neethirajan2021-SocialNetwork.bib b/output/Neethirajan (8VZwF0sAAAAJ)/Neethirajan2021-SocialNetwork.bib index 0fc44287..eb2be5a1 100644 --- a/output/Neethirajan (8VZwF0sAAAAJ)/Neethirajan2021-SocialNetwork.bib +++ b/output/Neethirajan (8VZwF0sAAAAJ)/Neethirajan2021-SocialNetwork.bib @@ -1,6 +1,13 @@ -@misc{Neethirajan2021:FarmAnimalSocialNetwork, - title = {Social Network Analysis in Farm Animals: Sensor-Based Approaches. Animals 2021, 11, 434}, - author = {S Neethirajan and B Kemp}, +@article{Neethirajan2021:FarmAnimalSocialNetwork, + title = {Social Network Analysis in Farm Animals: Sensor-Based Approaches}, + author = {Suresh Neethirajan and Bas Kemp}, year = {2021}, + journal = {Animals}, + publisher = {MDPI AG}, + volume = {11}, + number = {2}, + pages = {434}, + doi = {10.3390/ani11020434}, + url = {https://doi.org/10.3390/ani11020434}, note = {Unenriched: no enrichment sources matched} } diff --git a/output/Neethirajan (8VZwF0sAAAAJ)/Neethirajan2023-DecodingDigital.bib b/output/Neethirajan (8VZwF0sAAAAJ)/Neethirajan2023-DecodingDigital.bib new file mode 100644 index 00000000..80959719 --- /dev/null +++ b/output/Neethirajan (8VZwF0sAAAAJ)/Neethirajan2023-DecodingDigital.bib @@ -0,0 +1,9 @@ +@misc{Neethirajan2023:FarmAnimalCognition, + title = {Decoding the Digital Barnyard - Cognitive Computing in Farm Animal Emotions and Welfare}, + author = {Suresh Neethirajan}, + year = {2023}, + howpublished = {Preprints.org}, + publisher = {MDPI AG}, + doi = {10.20944/preprints202309.1714.v1}, + url = {https://doi.org/10.20944/preprints202309.1714.v1} +} diff --git a/output/Neethirajan (8VZwF0sAAAAJ)/Neethirajan2024-DecodingLanguage.bib b/output/Neethirajan (8VZwF0sAAAAJ)/Neethirajan2024-DecodingLanguage.bib new file mode 100644 index 00000000..c201b42a --- /dev/null +++ b/output/Neethirajan (8VZwF0sAAAAJ)/Neethirajan2024-DecodingLanguage.bib @@ -0,0 +1,9 @@ +@misc{Neethirajan2024:DecodingLanguageChickensInnovative, + title = {Decoding the Language of Chickens - An Innovative NLP Approach to Enhance Poultry Welfare}, + author = {Suresh Neethirajan}, + year = {2024}, + howpublished = {bioRxiv}, + publisher = {openRxiv}, + doi = {10.1101/2024.04.29.591707}, + url = {https://doi.org/10.1101/2024.04.29.591707} +} diff --git a/output/Neethirajan (8VZwF0sAAAAJ)/Neethirajan2026-DigitalisationHealth.bib b/output/Neethirajan (8VZwF0sAAAAJ)/Neethirajan2026-DigitalisationHealth.bib new file mode 100644 index 00000000..33392143 --- /dev/null +++ b/output/Neethirajan (8VZwF0sAAAAJ)/Neethirajan2026-DigitalisationHealth.bib @@ -0,0 +1,7 @@ +@inproceedings{Neethirajan2026:PoultryDigitalHealth, + title = {Digitalisation and Health in Poultry Production: From Precision Animal Husbandry to Smart Systems}, + author = {S Neethirajan}, + year = {2026}, + booktitle = {The 6th International Poultry Congress (Digitalisation and Health in Poultry}, + note = {Venue from SerpAPI publication string (unverified)} +} diff --git a/output/Neethirajan (8VZwF0sAAAAJ)/Padmanabhan2026-SatelliteConstrained.bib b/output/Neethirajan (8VZwF0sAAAAJ)/Padmanabhan2026-SatelliteConstrained.bib new file mode 100644 index 00000000..55c0922f --- /dev/null +++ b/output/Neethirajan (8VZwF0sAAAAJ)/Padmanabhan2026-SatelliteConstrained.bib @@ -0,0 +1,7 @@ +@inproceedings{Padmanabhan2026:SatelliteN2OInference, + title = {Satellite-Constrained Spatial Inference Framework for Livestock N2O Emission Estimation}, + author = {P Padmanabhan and K Ragunath and S Neethirajan}, + year = {2026}, + booktitle = {Proceedings of the 39th IEEE Canadian Conference on Electrical and Computer}, + note = {Venue from SerpAPI publication string (unverified)} +} diff --git a/output/a2i2/Parivendan2025-BeyondProximity.bib b/output/Neethirajan (8VZwF0sAAAAJ)/Parivendan2026-BeyondProximityKeypoint.bib similarity index 55% rename from output/a2i2/Parivendan2025-BeyondProximity.bib rename to output/Neethirajan (8VZwF0sAAAAJ)/Parivendan2026-BeyondProximityKeypoint.bib index 364f4164..7284ff93 100644 --- a/output/a2i2/Parivendan2025-BeyondProximity.bib +++ b/output/Neethirajan (8VZwF0sAAAAJ)/Parivendan2026-BeyondProximityKeypoint.bib @@ -1,9 +1,12 @@ -@misc{Parivendan2025:KeypointTrajectoryClassification, +@misc{Parivendan2026:KeypointTrajectoryClassification, title = {Beyond Proximity: A Keypoint-Trajectory Framework for Classifying Affiliative and Agonistic Social Networks in Dairy Cattle}, author = {Sibi Parivendan and Kashfia Sailunaz and Suresh Neethirajan}, - year = {2025}, - howpublished = {Zenodo (CERN European Organization for Nuclear Research)}, + year = {2026}, + howpublished = {Zenodo}, publisher = {Zenodo}, doi = {10.5281/zenodo.18418182}, - url = {https://doi.org/10.5281/zenodo.18418182} + url = {https://arxiv.org/abs/2512.14998}, + eprint = {2512.14998}, + archiveprefix = {arXiv}, + primaryclass = {cs.CV} } diff --git a/output/Neethirajan (8VZwF0sAAAAJ)/Parivendan2026-TemporalModeling.bib b/output/Neethirajan (8VZwF0sAAAAJ)/Parivendan2026-TemporalModeling.bib new file mode 100644 index 00000000..82358df7 --- /dev/null +++ b/output/Neethirajan (8VZwF0sAAAAJ)/Parivendan2026-TemporalModeling.bib @@ -0,0 +1,7 @@ +@inproceedings{Parivendan2026:CowKeypointTrajectoryModeling, + title = {Temporal Modeling of Keypoint-Trajectory Interactions of Dairy Cows under Data and Compute Constraints}, + author = {K Parivendan and S. and Sailunaz and S Neethirajan}, + year = {2026}, + booktitle = {39th IEEE Canadian Conference on Electrical and Computer Engineering (CCECE}, + note = {Venue from SerpAPI publication string (unverified)} +} diff --git a/output/Neethirajan (8VZwF0sAAAAJ)/Patel2026-CowPainCheckTemporal.bib b/output/Neethirajan (8VZwF0sAAAAJ)/Patel2026-CowPainCheckTemporal.bib new file mode 100644 index 00000000..28bcbf0d --- /dev/null +++ b/output/Neethirajan (8VZwF0sAAAAJ)/Patel2026-CowPainCheckTemporal.bib @@ -0,0 +1,7 @@ +@inproceedings{Patel2026:CowPainCheckTemporalDeepLearning, + title = {CowPainCheck: Temporal Deep Learning for Postoperative Pain Detection in Cattle with Edge-Fog-Cloud Deployment Considerations}, + author = {S Patel and Spl Luna and S Neethirajan}, + year = {2026}, + booktitle = {Proceedings of the 39th IEEE Canadian Conference on Electrical and Computer}, + note = {Venue from SerpAPI publication string (unverified)} +} diff --git a/output/Neethirajan (8VZwF0sAAAAJ)/Patel2026-ProtocolGuided.bib b/output/Neethirajan (8VZwF0sAAAAJ)/Patel2026-ProtocolGuided.bib new file mode 100644 index 00000000..15e75544 --- /dev/null +++ b/output/Neethirajan (8VZwF0sAAAAJ)/Patel2026-ProtocolGuided.bib @@ -0,0 +1,9 @@ +@misc{Patel2026:BovinePainTransferLearning, + title = {Protocol-Guided Cross-Domain Transfer Learning for Bovine Facial Pain Recognition under Weak Dairy-Farm Labels}, + author = {Shivam Patel and Suresh Neethirajan}, + year = {2026}, + howpublished = {openRxiv}, + publisher = {openRxiv}, + doi = {10.64898/2026.06.18.733162}, + url = {https://doi.org/10.64898/2026.06.18.733162} +} diff --git a/output/Neethirajan (8VZwF0sAAAAJ)/Rao2026-RealTime.bib b/output/Neethirajan (8VZwF0sAAAAJ)/Rao2026-RealTime.bib new file mode 100644 index 00000000..ba2d2df5 --- /dev/null +++ b/output/Neethirajan (8VZwF0sAAAAJ)/Rao2026-RealTime.bib @@ -0,0 +1,7 @@ +@inproceedings{Rao2026:DairyActivityTwin, + title = {Real-Time Identity-Preserving Dairy Cow Activity Recognition for Nutritional Digital Twin Inference}, + author = {S Rao and S Neethirajan}, + year = {2026}, + booktitle = {Proceedings of the 39th IEEE Canadian Conference on Electrical and Computer}, + note = {Venue from SerpAPI publication string (unverified)} +} diff --git a/output/Neethirajan (8VZwF0sAAAAJ)/Senthilkumar2025-IlluminatingBovine.bib b/output/Neethirajan (8VZwF0sAAAAJ)/Senthilkumar2025-IlluminatingBovine.bib index 091a7a0f..477dd0dc 100644 --- a/output/Neethirajan (8VZwF0sAAAAJ)/Senthilkumar2025-IlluminatingBovine.bib +++ b/output/Neethirajan (8VZwF0sAAAAJ)/Senthilkumar2025-IlluminatingBovine.bib @@ -1,9 +1,10 @@ @misc{Senthilkumar2025:BovineCardioImaging, title = {Illuminating Bovine Cardiovascular Risks: A Hybrid Deep Learning and Biomarker Framework Using Retinal Imaging}, - author = {Chamirti Senthilkumar and Nikeeta Ramkumar and Sindhu C and G Vadivu and Suresh Neethirajan}, + author = {Senthilkumar, Chamirti and Ramkumar, Nikeeta and C, Sindhu and Vadivu, G and Neethirajan, Suresh}, year = {2025}, howpublished = {Preprints.org}, publisher = {MDPI AG}, doi = {10.20944/preprints202505.1847.v1}, - url = {https://doi.org/10.20944/preprints202505.1847.v1} + url = {https://doi.org/10.20944/preprints202505.1847.v1}, + month = {May} } diff --git a/output/Oore (cI0dYX4AAAAJ)/Lowe2026-BridgingGenerative.bib b/output/Oore (cI0dYX4AAAAJ)/Lowe2026-BridgingGenerative.bib new file mode 100644 index 00000000..5885366c --- /dev/null +++ b/output/Oore (cI0dYX4AAAAJ)/Lowe2026-BridgingGenerative.bib @@ -0,0 +1,7 @@ +@inproceedings{Lowe2026:HiddenSelfDistillation, + title = {Bridging Generative and Predictive Paradigms Via Hidden-Self-Distillation}, + author = {SC Lowe and A Fuller and S Oore and E Shelhamer and GW Taylor}, + year = {2026}, + booktitle = {ICLR 2026 Workshop on Multimodal Intelligence}, + note = {Venue from SerpAPI publication string (unverified)} +} diff --git a/output/Oore (cI0dYX4AAAAJ)/Lowe2026-HiddenLayer.bib b/output/Oore (cI0dYX4AAAAJ)/Lowe2026-HiddenLayer.bib new file mode 100644 index 00000000..f67c901f --- /dev/null +++ b/output/Oore (cI0dYX4AAAAJ)/Lowe2026-HiddenLayer.bib @@ -0,0 +1,7 @@ +@inproceedings{Lowe2026:DriftResilientVisuals, + title = {Hidden-Layer Self-Distillation Yields Drift-Resilient Visual Representations}, + author = {SC Lowe and A Fuller and S Oore and GW Taylor and E Shelhamer}, + year = {2026}, + booktitle = {Catch, Adapt, and Operate: Monitoring ML Models Under Drift ICLR Workshop}, + note = {Venue from SerpAPI publication string (unverified)} +} diff --git a/output/Oore (cI0dYX4AAAAJ)/Oore2024-ExplicitSolutions.bib b/output/Oore (cI0dYX4AAAAJ)/Oore2024-ExplicitSolutions.bib new file mode 100644 index 00000000..487ac480 --- /dev/null +++ b/output/Oore (cI0dYX4AAAAJ)/Oore2024-ExplicitSolutions.bib @@ -0,0 +1,12 @@ +@article{Oore2024:EllipticHoleCartesianSolution, + title = {Explicit solutions in Cartesian coordinates for an elliptic hole in an infinite elastic plate}, + author = {Mordecai Oore and Sageev Oore}, + year = {2024}, + journal = {Mathematics and Mechanics of Solids}, + publisher = {SAGE Publications}, + volume = {30}, + number = {3}, + pages = {765-791}, + doi = {10.1177/10812865241249751}, + url = {https://doi.org/10.1177/10812865241249751} +} diff --git a/output/Oore (cI0dYX4AAAAJ)/Oore2025-LoopyFramework.bib b/output/Oore (cI0dYX4AAAAJ)/Oore2025-LoopyFramework.bib new file mode 100644 index 00000000..4d11d081 --- /dev/null +++ b/output/Oore (cI0dYX4AAAAJ)/Oore2025-LoopyFramework.bib @@ -0,0 +1,7 @@ +@inproceedings{Oore2025:RealtimeAICollaboration, + title = {A Loopy Framework and Tool for Real-time Human-AI Music Collaboration}, + author = {S Oore and F Miller and CS Sastry and SH Dumpala and MF Da Silva and D Oore and SC Lowe}, + year = {2025}, + booktitle = {NeurIPS Workshop on AI for Music}, + note = {Venue from SerpAPI publication string (unverified)} +} diff --git a/output/Oore (cI0dYX4AAAAJ)/Oore2025-RobustPersonalized.bib b/output/Oore (cI0dYX4AAAAJ)/Oore2025-RobustPersonalized.bib new file mode 100644 index 00000000..0436afb0 --- /dev/null +++ b/output/Oore (cI0dYX4AAAAJ)/Oore2025-RobustPersonalized.bib @@ -0,0 +1,7 @@ +@inproceedings{Oore2025:SmartLooperCollaboration, + title = {Robust Personalized Human-AI Collaboration with SmartLooper}, + author = {S Oore and F Miller and CS Sastry and SH Dumpala and MF Da Silva and D Oore and SC Lowe}, + year = {2025}, + booktitle = {NeurIPS Workshop on AI for Music}, + note = {Venue from SerpAPI publication string (unverified)} +} diff --git a/output/Oore (cI0dYX4AAAAJ)/Sastry2020-ZeroShot.bib b/output/Oore (cI0dYX4AAAAJ)/Sastry2020-ZeroShot.bib new file mode 100644 index 00000000..44dc3aaf --- /dev/null +++ b/output/Oore (cI0dYX4AAAAJ)/Sastry2020-ZeroShot.bib @@ -0,0 +1,6 @@ +@misc{Sastry2020:ZeroShotOutDistribution, + title = {Zero-shot out-of-distribution detection with feature correlations}, + author = {CS Sastry and S Oore}, + year = {2020}, + note = {Unenriched: no enrichment sources matched} +} diff --git a/output/Oore (cI0dYX4AAAAJ)/Silva2026-GeneralizingGeometry.bib b/output/Oore (cI0dYX4AAAAJ)/Silva2026-GeneralizingGeometry.bib deleted file mode 100644 index 2b5b6abc..00000000 --- a/output/Oore (cI0dYX4AAAAJ)/Silva2026-GeneralizingGeometry.bib +++ /dev/null @@ -1,5 +0,0 @@ -@misc{Silva2026:FrechetGeometryMerge, - title = {Generalizing the Geometry of Model Merging Through Frechet Averages}, - author = {MF Da Silva and M Adnan and F Dangel and S Oore}, - year = {2026} -} diff --git a/output/Oore (cI0dYX4AAAAJ)/Silva2026-GeometricView.bib b/output/Oore (cI0dYX4AAAAJ)/Silva2026-GeometricView.bib new file mode 100644 index 00000000..8ed969fc --- /dev/null +++ b/output/Oore (cI0dYX4AAAAJ)/Silva2026-GeometricView.bib @@ -0,0 +1,10 @@ +@misc{Silva2026:ModelGeometryFrechet, + title = {Generalizing the Geometry of Model Merging Through Frechet Averages}, + author = {MF Da Silva and M Adnan and F Dangel and S Oore}, + year = {2026}, + howpublished = {arXiv}, + doi = {10.48550/arxiv.2604.27155}, + url = {https://arxiv.org/abs/2604.27155}, + eprint = {2604.27155}, + archiveprefix = {arXiv} +} diff --git a/output/Orji (-1cHtBQAAAAJ)/Alhasani2026-StateArt.bib b/output/Orji (-1cHtBQAAAAJ)/Alhasani2026-StateArt.bib new file mode 100644 index 00000000..b82bface --- /dev/null +++ b/output/Orji (-1cHtBQAAAAJ)/Alhasani2026-StateArt.bib @@ -0,0 +1,10 @@ +@article{Alhasani2026:DigitalBehaviorChangeRoadmap, + title = {State-of-the-Art and Emerging Trends in Digital Behavior Change Interventions for Stress Management: A Roadmap for Future Research}, + author = {Mona Alhasani and Rita Orji}, + year = {2026}, + journal = {International Journal of Human-Computer Interaction}, + publisher = {Informa UK Limited}, + pages = {1-48}, + doi = {10.1080/10447318.2026.2659301}, + url = {https://doi.org/10.1080/10447318.2026.2659301} +} diff --git a/output/Orji (-1cHtBQAAAAJ)/Duke2026-PROTOCOLLife.bib b/output/Orji (-1cHtBQAAAAJ)/Duke2026-PROTOCOLLife.bib index 605bed7f..1fdbed97 100644 --- a/output/Orji (-1cHtBQAAAAJ)/Duke2026-PROTOCOLLife.bib +++ b/output/Orji (-1cHtBQAAAAJ)/Duke2026-PROTOCOLLife.bib @@ -1,10 +1,11 @@ @article{Duke2026:DisplacedAnxietyReview, title = {PROTOCOL: Life Skills Education and Psychosocial Interventions for Anxiety and Depression in Forcibly Displaced Persons in LMICs: A Systematic Review}, - author = {Aee Duke and BI Harri and R Crider and L Liebenberg and R Orji and E Eboreime}, + author = {Andem Effiong Etim Duke and Bala Isa Harri and Raquel Crider and Linda Liebenberg and Rita Orji and Ejemai Eboreime}, year = {2026}, - journal = {Campbell Systematic Reviews}, + journal = {Campbell Systematic Reviews: Better Evidence for a Better World}, + publisher = {SAGE Publications}, volume = {22}, number = {2}, - pages = {18911803261442234}, - note = {Venue from SerpAPI publication string (unverified)} + doi = {10.1177/18911803261442234}, + url = {https://doi.org/10.1177/18911803261442234} } diff --git a/output/Orji (-1cHtBQAAAAJ)/Kaura2026-NutriPalPersuasive.bib b/output/Orji (-1cHtBQAAAAJ)/Kaura2026-NutriPalPersuasive.bib new file mode 100644 index 00000000..9eb1ab57 --- /dev/null +++ b/output/Orji (-1cHtBQAAAAJ)/Kaura2026-NutriPalPersuasive.bib @@ -0,0 +1,10 @@ +@incollection{Kaura2026:NutriPalAI, + title = {NutriPal: A Persuasive System for Promoting Healthy Eating Using Eye-Gaze Detection Technology and Artificial Intelligence}, + author = {Tushant Kaura and Edward Addo and Gladwin Irudayaraj and Josteve Adekanbi and Rita Orji and Oladapo Oyebode}, + year = {2026}, + booktitle = {Digital Human Modeling and Applications in Health, Safety, Ergonomics and Risk Management}, + publisher = {Springer Nature Switzerland}, + pages = {177-194}, + doi = {10.1007/978-3-032-29842-3_13}, + url = {https://doi.org/10.1007/978-3-032-29842-3_13} +} diff --git a/output/Orji (-1cHtBQAAAAJ)/Kimeu2026-CalmMindAI.bib b/output/Orji (-1cHtBQAAAAJ)/Kimeu2026-CalmMindAI.bib new file mode 100644 index 00000000..78e72e21 --- /dev/null +++ b/output/Orji (-1cHtBQAAAAJ)/Kimeu2026-CalmMindAI.bib @@ -0,0 +1,10 @@ +@incollection{Kimeu2026:CalmMindAI, + title = {CalmMind: AI-Driven, Multi-sense, and Adaptive Technology for Managing Mental Fatigue}, + author = {Japheth Mumo Kimeu and Rita Orji and Oladapo Oyebode}, + year = {2026}, + booktitle = {Digital Human Modeling and Applications in Health, Safety, Ergonomics and Risk Management}, + publisher = {Springer Nature Switzerland}, + pages = {195-214}, + doi = {10.1007/978-3-032-29842-3_14}, + url = {https://doi.org/10.1007/978-3-032-29842-3_14} +} diff --git a/output/Orji (-1cHtBQAAAAJ)/Nwokolo2026-HydrogenStorage.bib b/output/Orji (-1cHtBQAAAAJ)/Nwokolo2026-HydrogenStorage.bib new file mode 100644 index 00000000..63dea24c --- /dev/null +++ b/output/Orji (-1cHtBQAAAAJ)/Nwokolo2026-HydrogenStorage.bib @@ -0,0 +1,11 @@ +@article{Nwokolo2026:HydrogenStorageDemand, + title = {Hydrogen storage and enabling materials beyond capacity: digital MRV, safety-by-design, climate resilience, and thermal management demand}, + author = {Samuel Chukwujindu Nwokolo and Sunday O. Udo and Ebong Dickson Ebong and Paul C. Okonkwo and Rita Orji and Chukwuka Orji and Edson L. Meyer and Chinedu Christian Ahia}, + year = {2026}, + journal = {Energy Conversion and Management: X}, + publisher = {Elsevier BV}, + volume = {31}, + pages = {102039}, + doi = {10.1016/j.ecmx.2026.102039}, + url = {https://doi.org/10.1016/j.ecmx.2026.102039} +} diff --git a/output/Orji (-1cHtBQAAAAJ)/Olatinwo2026-ExploringEffectiveness.bib b/output/Orji (-1cHtBQAAAAJ)/Olatinwo2026-ExploringEffectiveness.bib new file mode 100644 index 00000000..1d80c601 --- /dev/null +++ b/output/Orji (-1cHtBQAAAAJ)/Olatinwo2026-ExploringEffectiveness.bib @@ -0,0 +1,10 @@ +@incollection{Olatinwo2026:StorytellingMotivationAdherence, + title = {Exploring the Effectiveness of Storytelling as a Persuasive Strategy for Fostering Motivation and Adherence in Online Weight-Loss Communities}, + author = {Segun Olatinwo and Grace Ataguba and Fidelia Orji and Rita Orji}, + year = {2026}, + booktitle = {Digital Human Modeling and Applications in Health, Safety, Ergonomics and Risk Management}, + publisher = {Springer Nature Switzerland}, + pages = {215-234}, + doi = {10.1007/978-3-032-29842-3_15}, + url = {https://doi.org/10.1007/978-3-032-29842-3_15} +} diff --git a/output/Orji (-1cHtBQAAAAJ)/Oyebode2020-PersuasiveStrategies.bib b/output/Orji (-1cHtBQAAAAJ)/Oyebode2020-PersuasiveStrategies.bib index 78b39b76..9e4a1fb0 100644 --- a/output/Orji (-1cHtBQAAAAJ)/Oyebode2020-PersuasiveStrategies.bib +++ b/output/Orji (-1cHtBQAAAAJ)/Oyebode2020-PersuasiveStrategies.bib @@ -1,6 +1,9 @@ -@inproceedings{Oyebode2020:PersuasiveStrategiesMentalHealth, - title = {Persuasive Strategies in Mental Health Apps: A Natural Language Processing Approach}, - author = {Oladapo Oyebode and Rita Orji}, +@article{Oyebode2020:PersuasiveStrategiesMentalHealth, + title = {Deconstructing Persuasive Strategies in Mental Health Apps Based on User Reviews using Natural Language Processing}, + author = {O Oyebode and R Orji}, year = {2020}, - booktitle = {International Conference on Persuasive Technology} + journal = {Persuasive Technology, BCSS}, + volume = {2020}, + pages = {1-12}, + note = {Venue from SerpAPI publication string (unverified)} } diff --git a/output/Orji (-1cHtBQAAAAJ)/Skov2020-Persuasive2020.bib b/output/Orji (-1cHtBQAAAAJ)/Skov2020-Persuasive2020.bib new file mode 100644 index 00000000..cdc22a5d --- /dev/null +++ b/output/Orji (-1cHtBQAAAAJ)/Skov2020-Persuasive2020.bib @@ -0,0 +1,6 @@ +@misc{Skov2020:PersuasiveTechAdjunct2020, + title = {Persuasive 2020 Adjunct Proceedings: 15th International Conference on Persuasive Technology, Adjunct Proceedings (PERSUASIVE 2020)}, + author = {M Skov and LB Bertel and SB Gram-Hansen and R Orji}, + year = {2020}, + note = {Unenriched: no enrichment sources matched} +} diff --git a/output/Orji (-1cHtBQAAAAJ)/Vitale2026-PersonalisedAI.bib b/output/Orji (-1cHtBQAAAAJ)/Vitale2026-PersonalisedAI.bib new file mode 100644 index 00000000..6c699347 --- /dev/null +++ b/output/Orji (-1cHtBQAAAAJ)/Vitale2026-PersonalisedAI.bib @@ -0,0 +1,9 @@ +@article{Vitale2026:AIcoachingReview, + title = {Personalised AI Coaching Technology: A Systematic Mapping Review}, + author = {Jonathan Vitale and Filippo Cenacchi and Matthias Kraus and Fidelia Orji and Deborah Richards and Rita Orji and Cristina Conati and Shlomo Berkovsky}, + year = {2026}, + journal = {ACM Transactions on Interactive Intelligent Systems}, + publisher = {Association for Computing Machinery (ACM)}, + doi = {10.1145/3820900}, + url = {https://doi.org/10.1145/3820900} +} diff --git a/output/Oyebode (-6DsTnMAAAAJ)/Kaura2026-NutriPalPersuasive.bib b/output/Oyebode (-6DsTnMAAAAJ)/Kaura2026-NutriPalPersuasive.bib new file mode 100644 index 00000000..9eb1ab57 --- /dev/null +++ b/output/Oyebode (-6DsTnMAAAAJ)/Kaura2026-NutriPalPersuasive.bib @@ -0,0 +1,10 @@ +@incollection{Kaura2026:NutriPalAI, + title = {NutriPal: A Persuasive System for Promoting Healthy Eating Using Eye-Gaze Detection Technology and Artificial Intelligence}, + author = {Tushant Kaura and Edward Addo and Gladwin Irudayaraj and Josteve Adekanbi and Rita Orji and Oladapo Oyebode}, + year = {2026}, + booktitle = {Digital Human Modeling and Applications in Health, Safety, Ergonomics and Risk Management}, + publisher = {Springer Nature Switzerland}, + pages = {177-194}, + doi = {10.1007/978-3-032-29842-3_13}, + url = {https://doi.org/10.1007/978-3-032-29842-3_13} +} diff --git a/output/Oyebode (-6DsTnMAAAAJ)/Kimeu2026-CalmMindAI.bib b/output/Oyebode (-6DsTnMAAAAJ)/Kimeu2026-CalmMindAI.bib new file mode 100644 index 00000000..78e72e21 --- /dev/null +++ b/output/Oyebode (-6DsTnMAAAAJ)/Kimeu2026-CalmMindAI.bib @@ -0,0 +1,10 @@ +@incollection{Kimeu2026:CalmMindAI, + title = {CalmMind: AI-Driven, Multi-sense, and Adaptive Technology for Managing Mental Fatigue}, + author = {Japheth Mumo Kimeu and Rita Orji and Oladapo Oyebode}, + year = {2026}, + booktitle = {Digital Human Modeling and Applications in Health, Safety, Ergonomics and Risk Management}, + publisher = {Springer Nature Switzerland}, + pages = {195-214}, + doi = {10.1007/978-3-032-29842-3_14}, + url = {https://doi.org/10.1007/978-3-032-29842-3_14} +} diff --git a/output/Oyebode (-6DsTnMAAAAJ)/Oyebode2020-DeconstructingPersuasive.bib b/output/Oyebode (-6DsTnMAAAAJ)/Oyebode2020-DeconstructingPersuasive.bib index ddfd1cbe..34818e5c 100644 --- a/output/Oyebode (-6DsTnMAAAAJ)/Oyebode2020-DeconstructingPersuasive.bib +++ b/output/Oyebode (-6DsTnMAAAAJ)/Oyebode2020-DeconstructingPersuasive.bib @@ -1,6 +1,7 @@ @inproceedings{Oyebode2020:DeconstructingPersuasiveStrategiesMental, title = {Deconstructing Persuasive Strategies in Mental Health Apps Based on User Reviews using Natural Language Processing}, - author = {Oladapo Oyebode and Rita Orji}, + author = {O Oyebode and R Orji}, year = {2020}, - booktitle = {Behavior Change Support Systems Workshop} + booktitle = {8th International Workshop on Behavior Change Support Systems organized}, + note = {Venue from SerpAPI publication string (unverified)} } diff --git a/output/Poitras (TNaVSQwAAAAJ)/Huang2020-ExploringAssociations.bib b/output/Poitras (TNaVSQwAAAAJ)/Huang2020-ExploringAssociations.bib index 709289b0..16042355 100644 --- a/output/Poitras (TNaVSQwAAAAJ)/Huang2020-ExploringAssociations.bib +++ b/output/Poitras (TNaVSQwAAAAJ)/Huang2020-ExploringAssociations.bib @@ -1,5 +1,5 @@ @misc{Huang2020:ExploringAssociationsBetweenTeachers, title = {Exploring the associations between teachers' self-regulation and their technological pedagogical content knowledge (TPACK) proficiency using a data}, - author = {L Huang and EG Poitras}, + author = {L Huang and EG Poitras and Y Zhang and SP Lajoie}, year = {2020} } diff --git a/output/Poitras (TNaVSQwAAAAJ)/Huang2021-DataVisualizations.bib b/output/Poitras (TNaVSQwAAAAJ)/Huang2021-DataVisualizations.bib index a22f2288..1c9fd8b7 100644 --- a/output/Poitras (TNaVSQwAAAAJ)/Huang2021-DataVisualizations.bib +++ b/output/Poitras (TNaVSQwAAAAJ)/Huang2021-DataVisualizations.bib @@ -1,6 +1,11 @@ -@misc{Huang2021:DataLearningFramework, +@incollection{Huang2021:DataLearningFramework, title = {Data Visualizations to Foster Self-regulated Learning with Intelligent Programming Tutors: Towards an Instructional Design Framework}, author = {L Huang and E Poitras and A Siegel and RV Sampangi and F Paulovich}, year = {2021}, + booktitle = {Advances in Analytics for Learning and Teaching}, + publisher = {Springer International Publishing}, + pages = {69-92}, + doi = {10.1007/978-3-030-81222-5_4}, + url = {https://doi.org/10.1007/978-3-030-81222-5_4}, note = {Unenriched: no enrichment sources matched} } diff --git a/output/Rahman (9SrqOewAAAAJ)/Rahman2021-SystematicLiterature.bib b/output/Rahman (9SrqOewAAAAJ)/Rahman2021-SystematicLiterature.bib deleted file mode 100644 index 01363625..00000000 --- a/output/Rahman (9SrqOewAAAAJ)/Rahman2021-SystematicLiterature.bib +++ /dev/null @@ -1,6 +0,0 @@ -@misc{Rahman2021:CodeSearchReformulation, - title = {A Systematic Literature Review of Automated Query Reformulations in Source Code Search}, - author = {MM Rahman and CK Roy}, - year = {2021}, - howpublished = {arXiv} -} diff --git a/output/Rahman (9SrqOewAAAAJ)/Rahman2026-BePartner.bib b/output/Rahman (9SrqOewAAAAJ)/Rahman2026-BePartner.bib index 835750fb..27ac0414 100644 --- a/output/Rahman (9SrqOewAAAAJ)/Rahman2026-BePartner.bib +++ b/output/Rahman (9SrqOewAAAAJ)/Rahman2026-BePartner.bib @@ -3,6 +3,7 @@ @misc{Rahman2026:AcademiaIndustryBridge author = {Mohammad Masudur Rahman and Mehil B. Shah}, year = {2026}, howpublished = {arXiv}, + doi = {10.48550/arxiv.2604.16315}, url = {https://arxiv.org/abs/2604.16315}, eprint = {2604.16315}, archiveprefix = {arXiv} diff --git a/output/Ralph (oRBuFa0AAAAJ)/Ayoola2026-AdvancingEvidence.bib b/output/Ralph (oRBuFa0AAAAJ)/Ayoola2026-AdvancingEvidence.bib index fbccc9db..088ea3ed 100644 --- a/output/Ralph (oRBuFa0AAAAJ)/Ayoola2026-AdvancingEvidence.bib +++ b/output/Ralph (oRBuFa0AAAAJ)/Ayoola2026-AdvancingEvidence.bib @@ -2,5 +2,9 @@ @misc{Ayoola2026:AdvancingEvidenceBasedSocial title = {Advancing Evidence-Based Social Sustainability in Software Engineering: A Research Roadmap}, author = {Bimpe Ayoola and Anielle Andrade and Ronnie De Souza Santos and Paul Ralph}, year = {2026}, - howpublished = {arXiv} + howpublished = {arXiv}, + doi = {10.48550/arxiv.2603.27735}, + url = {https://arxiv.org/abs/2603.27735}, + eprint = {2603.27735}, + archiveprefix = {arXiv} } diff --git a/output/Ralph (oRBuFa0AAAAJ)/Jackson2024-CreativityGenerative.bib b/output/Ralph (oRBuFa0AAAAJ)/Jackson2024-CreativityGenerative.bib new file mode 100644 index 00000000..9264e740 --- /dev/null +++ b/output/Ralph (oRBuFa0AAAAJ)/Jackson2024-CreativityGenerative.bib @@ -0,0 +1,7 @@ +@inproceedings{Jackson2024:CreativityGenerativeAISoftware, + title = {Creativity, Generative AI, and Software Development: A Research Agenda}, + author = {V Jackson and B Vasilescu and D Russo and P Ralph and M Izadi and R Prikladnicki}, + year = {2024}, + booktitle = {The 2030 Software Engineering Workshop, ACM International Conference on}, + note = {Venue from SerpAPI publication string (unverified)} +} diff --git a/output/Ralph (oRBuFa0AAAAJ)/Kuutila2025-SoftwareInfrastructure.bib b/output/Ralph (oRBuFa0AAAAJ)/Kuutila2025-SoftwareInfrastructure.bib index b1cd0faf..31697750 100644 --- a/output/Ralph (oRBuFa0AAAAJ)/Kuutila2025-SoftwareInfrastructure.bib +++ b/output/Ralph (oRBuFa0AAAAJ)/Kuutila2025-SoftwareInfrastructure.bib @@ -3,6 +3,7 @@ @misc{Kuutila2025:SoftwareInfrastructureAttitude author = {Miikka Kuutila and Paul Ralph and Huilian Sophie Qiu and Ronnie De Souza Santos and Morakot Choetkiertikul and Amin Milani Fard and Rana Alkadhi and Xavier Devroey and Gregorio Robles and Hideaki Hata and Sebastian Baltes and Vladimir Kovalenko and Shalini Chakraborty and Eray Tuzun and Hera Arif and Gianisa Adisaputri and Kelly Garc'es and Anielle Andrade and Eyram Amedzor and Bimpe Ayoola and Keisha Gaspard-Chickoree and Arazoo Hoseyni}, year = {2025}, howpublished = {arXiv}, + doi = {10.48550/arxiv.2512.00855}, url = {https://arxiv.org/abs/2512.00855}, eprint = {2512.00855}, archiveprefix = {arXiv} diff --git a/output/Ralph (oRBuFa0AAAAJ)/Santos2022-PracticesImprove.bib b/output/Ralph (oRBuFa0AAAAJ)/Santos2022-PracticesImprove.bib index fa1f967e..743d4c2f 100644 --- a/output/Ralph (oRBuFa0AAAAJ)/Santos2022-PracticesImprove.bib +++ b/output/Ralph (oRBuFa0AAAAJ)/Santos2022-PracticesImprove.bib @@ -2,9 +2,9 @@ @inproceedings{Santos2022:PracticesImproveTeamworkSoftware title = {Practices to Improve Teamwork in Software Development During the COVID-19 Pandemic: An Ethnographic Study}, author = {Ronnie E. De Souza Santos and Paul Ralph}, year = {2022}, - booktitle = {IEEE/ACM International Conference on Connected Health: Applications, Systems and Engineering Technologies}, - doi = {10.48550/arxiv.2203.09626}, - url = {https://arxiv.org/abs/2203.09626}, - eprint = {2203.09626}, - archiveprefix = {arXiv} + booktitle = {Proceedings of the 15th International Conference on Cooperative and Human Aspects of Software Engineering}, + publisher = {ACM}, + pages = {81-85}, + doi = {10.1145/3528579.3529174}, + url = {https://doi.org/10.1145/3528579.3529174} } diff --git a/output/Ralph (oRBuFa0AAAAJ)/Tempero2026-MakingSoftware.bib b/output/Ralph (oRBuFa0AAAAJ)/Tempero2026-MakingSoftware.bib index aaca21c9..8368055e 100644 --- a/output/Ralph (oRBuFa0AAAAJ)/Tempero2026-MakingSoftware.bib +++ b/output/Ralph (oRBuFa0AAAAJ)/Tempero2026-MakingSoftware.bib @@ -1,5 +1,10 @@ @misc{Tempero2026:SoftwareMetricsUseful, title = {Making Software Metrics Useful}, author = {Ewan Tempero and Paul Ralph}, - year = {2026} + year = {2026}, + howpublished = {arXiv}, + doi = {10.48550/arxiv.2603.16012}, + url = {https://arxiv.org/abs/2603.16012}, + eprint = {2603.16012}, + archiveprefix = {arXiv} } diff --git a/output/Rau-Chaplin (-PvfVhgAAAAJ)/Cortes2026-NovelEnhanced.bib b/output/Rau-Chaplin (-PvfVhgAAAAJ)/Cortes2026-NovelEnhanced.bib new file mode 100644 index 00000000..8724cd6d --- /dev/null +++ b/output/Rau-Chaplin (-PvfVhgAAAAJ)/Cortes2026-NovelEnhanced.bib @@ -0,0 +1,11 @@ +@article{Cortes2026:NovelEnhancedMultiObjective, + title = {A Novel Enhanced Multi-Objective PSO Algorithm for Reinsurance Analytics}, + author = {Omar Andres Carmona Cortes and Bruno Feres De Souza and Andrew Rau-Chaplin}, + year = {2026}, + journal = {SN Computer Science}, + publisher = {Springer Science and Business Media LLC}, + volume = {7}, + number = {6}, + doi = {10.1007/s42979-026-05187-y}, + url = {https://doi.org/10.1007/s42979-026-05187-y} +} diff --git a/output/Reilly (fZ56s2EAAAAJ)/Amirkandeh2025-ComparativeEvaluation.bib b/output/Reilly (fZ56s2EAAAAJ)/Amirkandeh2025-ComparativeEvaluation.bib new file mode 100644 index 00000000..749feece --- /dev/null +++ b/output/Reilly (fZ56s2EAAAAJ)/Amirkandeh2025-ComparativeEvaluation.bib @@ -0,0 +1,6 @@ +@misc{Amirkandeh2025:DataMonitorInterfaces, + title = {A Comparative Evaluation of Natural Language and Dashboard Visualization Interfaces for Data Monitoring Tasks}, + author = {MB Amirkandeh and D Reilly}, + year = {2025}, + note = {Unenriched: no enrichment sources matched} +} diff --git a/output/Reilly (fZ56s2EAAAAJ)/Bravo2024-AdvancingPrecision.bib b/output/Reilly (fZ56s2EAAAAJ)/Bravo2024-AdvancingPrecision.bib new file mode 100644 index 00000000..fc1e1d1f --- /dev/null +++ b/output/Reilly (fZ56s2EAAAAJ)/Bravo2024-AdvancingPrecision.bib @@ -0,0 +1,10 @@ +@inproceedings{Bravo2024:PrecisionAquacultureAnalytics, + title = {Advancing Precision Aquaculture Through Big Data Analytics and Machine Learning in Canadian Fish Farming}, + author = {Francisco Bravo and Joana Amorim and Melika Besharati Amirkandeh and Peter Bodorik and Vitor Cerqueira and Nuno R.c. Gomes and Jennie Korus and Mariana Oliveira and Marianne Parent and Joao Pimentel and Derek Reilly and Tyler Sclodnick and Jon Grant and Ramon Filgueira and Christopher Whidden and Luis Torgo}, + year = {2024}, + booktitle = {OCEANS 2024 - Halifax}, + publisher = {IEEE}, + pages = {1-6}, + doi = {10.1109/oceans55160.2024.10754571}, + url = {https://doi.org/10.1109/oceans55160.2024.10754571} +} diff --git a/output/Rosborough (kG4oQmsAAAAJ)/Rosborough2025-OurOwn.bib b/output/Rosborough (kG4oQmsAAAAJ)/Rosborough2025-OurOwn.bib new file mode 100644 index 00000000..209bc633 --- /dev/null +++ b/output/Rosborough (kG4oQmsAAAAJ)/Rosborough2025-OurOwn.bib @@ -0,0 +1,6 @@ +@misc{Rosborough2025:RightToRepairAgency, + title = {Our own devices: recovering human agency through the right to repair}, + author = {AD Rosborough}, + year = {2025}, + note = {Unenriched: no enrichment sources matched} +} diff --git a/output/Rudzicz (elXOB1sAAAAJ)/Azad2026-SurgiDiffContext.bib b/output/Rudzicz (elXOB1sAAAAJ)/Azad2026-SurgiDiffContext.bib new file mode 100644 index 00000000..a602d740 --- /dev/null +++ b/output/Rudzicz (elXOB1sAAAAJ)/Azad2026-SurgiDiffContext.bib @@ -0,0 +1,10 @@ +@inproceedings{Azad2026:SurgiDiffRecommender, + title = {SurgiDiff: A Context-Aware Diffusion Recommender for Safe Surgical Autonomy}, + author = {Bita Azad and Sadra Zargarzadeh and Frank Rudzicz}, + year = {2026}, + booktitle = {2026 International Symposium on Medical Robotics (ISMR)}, + publisher = {IEEE}, + pages = {143-149}, + doi = {10.1109/ismr69606.2026.11536208}, + url = {https://doi.org/10.1109/ismr69606.2026.11536208} +} diff --git a/output/Rudzicz (elXOB1sAAAAJ)/Badawi2026-TowardsUnderstanding.bib b/output/Rudzicz (elXOB1sAAAAJ)/Badawi2026-TowardsUnderstanding.bib new file mode 100644 index 00000000..55ea7c5b --- /dev/null +++ b/output/Rudzicz (elXOB1sAAAAJ)/Badawi2026-TowardsUnderstanding.bib @@ -0,0 +1,10 @@ +@misc{Badawi2026:TowardsUnderstandingMeasuringCOGNITIVE, + title = {Towards Understanding and Measuring COGNITIVE ATROPHY in LLM Behaviour}, + author = {Abeer Badawi and Moyosoreoluwa Olatosi and Negin Baghbanzadeh and Laleh Seyyed-Kalantari and Frank Rudzicz and R. Shayna Rosenbaum and Sara Pishdadian and Elham Dolatabadi}, + year = {2026}, + howpublished = {arXiv}, + doi = {10.48550/arxiv.2606.18129}, + url = {https://arxiv.org/abs/2606.18129}, + eprint = {2606.18129}, + archiveprefix = {arXiv} +} diff --git a/output/Rudzicz (elXOB1sAAAAJ)/Ge2024-WhatDo.bib b/output/Rudzicz (elXOB1sAAAAJ)/Ge2024-WhatDo.bib new file mode 100644 index 00000000..a06a7967 --- /dev/null +++ b/output/Rudzicz (elXOB1sAAAAJ)/Ge2024-WhatDo.bib @@ -0,0 +1,9 @@ +@misc{Ge2024:CircuitKnowledgeEdit, + title = {What do the circuits mean? a knowledge edit view}, + author = {H Ge and F Rudzicz and Z Zhu}, + year = {2024}, + howpublished = {arXiv}, + url = {https://arxiv.org/abs/2406.17241}, + eprint = {2406.17241}, + archiveprefix = {arXiv} +} diff --git a/output/Rudzicz (elXOB1sAAAAJ)/Mianroodi2025-MedSynthRealistic.bib b/output/Rudzicz (elXOB1sAAAAJ)/Mianroodi2025-MedSynthRealistic.bib index 117a6a72..af11ecb1 100644 --- a/output/Rudzicz (elXOB1sAAAAJ)/Mianroodi2025-MedSynthRealistic.bib +++ b/output/Rudzicz (elXOB1sAAAAJ)/Mianroodi2025-MedSynthRealistic.bib @@ -1,6 +1,6 @@ @misc{Mianroodi2025:MedSynthDialogueNotes, title = {MedSynth: Realistic, Synthetic Medical Dialogue-Note Pairs}, - author = {Ahmad Rezaie Mianroodi and Amirali Rezaie and Niko Grisel Todorov and Cyril Rakovski and Frank Rudzicz}, + author = {Ahmad Rezaie Mianroodi and Amirali Rezaie and Niko Grisel Todorov and Nadine A. Friedrich and Maria P Mogollon and Alexander Hernandez-Tirado and Guillermo Lopez Garcia and Cyril Rakovski and Frank Rudzicz}, year = {2025}, howpublished = {arXiv}, doi = {10.48550/arxiv.2508.01401}, diff --git a/output/Rudzicz (elXOB1sAAAAJ)/Novikova2022-SystemMethod.bib b/output/Rudzicz (elXOB1sAAAAJ)/Novikova2022-SystemMethod.bib new file mode 100644 index 00000000..80fd3bff --- /dev/null +++ b/output/Rudzicz (elXOB1sAAAAJ)/Novikova2022-SystemMethod.bib @@ -0,0 +1,6 @@ +@misc{Novikova2022:SpeechAlzheimerDetection, + title = {System and method for alzheimer's disease detection from speech}, + author = {J Novikova and A Balagopalan and J Robin and F Rudzicz}, + year = {2022}, + note = {US Patent 17/320,992} +} diff --git a/output/Rudzicz (elXOB1sAAAAJ)/Oore2025-MeasurementPersonal.bib b/output/Rudzicz (elXOB1sAAAAJ)/Oore2025-MeasurementPersonal.bib new file mode 100644 index 00000000..9d848ec7 --- /dev/null +++ b/output/Rudzicz (elXOB1sAAAAJ)/Oore2025-MeasurementPersonal.bib @@ -0,0 +1,13 @@ +@article{Oore2025:SpeechMovementRhythm, + title = {Measurement of Personal Rhythm From Speech and Movement}, + author = {Oore, Sageev and D'eon, Jason and Ramchandani, Mayank and Dumpala, Sri Harsha and Sastry, Chandramouli and Foster, Jane and Frey, Benicio and Harkness, Kate and Kennedy, Sidney and Lam, Raymond W. and Li, Qingqin and Milev, Roumen and Nunes, Abraham and Quilty, Lena and Rotzinger, Susan and Rudzicz, Frank and Soares, Claudio and Taylor, Valerie H. and Turecki, Gustavo and Uher, Rudolf}, + year = {2025}, + journal = {Biological Psychiatry}, + publisher = {Elsevier BV}, + volume = {97}, + number = {9}, + doi = {10.1016/j.biopsych.2025.02.114}, + url = {https://doi.org/10.1016/j.biopsych.2025.02.114}, + issn = {0006-3223}, + month = {May} +} diff --git a/output/Rudzicz (elXOB1sAAAAJ)/Saqur2024-FilteredNot.bib b/output/Rudzicz (elXOB1sAAAAJ)/Saqur2024-FilteredNot.bib new file mode 100644 index 00000000..6c8950e7 --- /dev/null +++ b/output/Rudzicz (elXOB1sAAAAJ)/Saqur2024-FilteredNot.bib @@ -0,0 +1,9 @@ +@inproceedings{Saqur2024:FilteredNotMixedStochastic, + title = {Filtered not Mixed: Stochastic Filtering-Based Online Gating for Mixture of Large Language Models}, + author = {Raeid Saqur and Anastasis Kratsios and Blanka Horvath and Jacob-Junqi Tian and John Willes and Florian Krach and Yannick Limmer and Frank Rudzicz}, + year = {2024}, + booktitle = {International Conference on Learning Representations}, + publisher = {Elsevier BV}, + doi = {10.2139/ssrn.4856254}, + url = {https://doi.org/10.2139/ssrn.4856254} +} diff --git a/output/Rudzicz (elXOB1sAAAAJ)/Saqur2025-FilteredNot.bib b/output/Rudzicz (elXOB1sAAAAJ)/Saqur2025-FilteredNot.bib deleted file mode 100644 index 833d1b5c..00000000 --- a/output/Rudzicz (elXOB1sAAAAJ)/Saqur2025-FilteredNot.bib +++ /dev/null @@ -1,6 +0,0 @@ -@inproceedings{Saqur2025:FilteredNotMixedFiltering, - title = {Filtered not Mixed: Filtering-Based Online Gating for Mixture of Large Language Models}, - author = {Raeid Saqur and Anastasis Kratsios and Florian Krach and Yannick Limmer and Blanka Horvath and Frank Rudzicz}, - year = {2025}, - booktitle = {International Conference on Learning Representations} -} diff --git a/output/Rudzicz (elXOB1sAAAAJ)/Saqur2026-SeekingSOTA.bib b/output/Rudzicz (elXOB1sAAAAJ)/Saqur2026-SeekingSOTA.bib index eea63a8f..8e29c865 100644 --- a/output/Rudzicz (elXOB1sAAAAJ)/Saqur2026-SeekingSOTA.bib +++ b/output/Rudzicz (elXOB1sAAAAJ)/Saqur2026-SeekingSOTA.bib @@ -2,5 +2,9 @@ @misc{Saqur2026:TaxonomyForecastingEvaluation title = {Seeking SOTA: Time-Series Forecasting Must Adopt Taxonomy-Specific Evaluation to Dispel Illusory Gains}, author = {Raeid Saqur and Christoph Bergmeir and Blanka Horvath and Daniel Erwin Schmidt and Frank Rudzicz and Terry Lyons}, year = {2026}, - howpublished = {arXiv} + howpublished = {arXiv}, + doi = {10.48550/arxiv.2603.15506}, + url = {https://arxiv.org/abs/2603.15506}, + eprint = {2603.15506}, + archiveprefix = {arXiv} } diff --git a/output/Rudzicz (elXOB1sAAAAJ)/Wiafe2026-DesigningAI.bib b/output/Rudzicz (elXOB1sAAAAJ)/Wiafe2026-DesigningAI.bib new file mode 100644 index 00000000..9c6a1e43 --- /dev/null +++ b/output/Rudzicz (elXOB1sAAAAJ)/Wiafe2026-DesigningAI.bib @@ -0,0 +1,10 @@ +@inproceedings{Wiafe2026:DesigningAIAssistedSpeech, + title = {Designing an AI-Assisted Speech-Based Interactive System for Home-Based Sentence Practice for Children}, + author = {Elizabeth Wiafe and Frank Rudzicz and Lizbeth Escobedo}, + year = {2026}, + booktitle = {Anais da XII Conferencia Latino-Americana de Interacao Humano-Computador (CLIHC 2026)}, + publisher = {Sociedade Brasileira de Computacao}, + pages = {156-160}, + doi = {10.5753/clihc.2026.21174}, + url = {https://doi.org/10.5753/clihc.2026.21174} +} diff --git a/output/Rudzicz (elXOB1sAAAAJ)/Zhu2023-SituatedNatural.bib b/output/Rudzicz (elXOB1sAAAAJ)/Zhu2023-SituatedNatural.bib index 6af8d867..518f9fa8 100644 --- a/output/Rudzicz (elXOB1sAAAAJ)/Zhu2023-SituatedNatural.bib +++ b/output/Rudzicz (elXOB1sAAAAJ)/Zhu2023-SituatedNatural.bib @@ -6,5 +6,6 @@ @misc{Zhu2023:SituatedNLExplanations doi = {10.48550/arxiv.2308.14115}, url = {https://arxiv.org/abs/2308.14115}, eprint = {2308.14115}, - archiveprefix = {arXiv} + archiveprefix = {arXiv}, + primaryclass = {cs.CL} } diff --git a/output/Sajjad (t3BH6NkAAAAJ)/Adeeba2025-UrBLiMPBenchmark.bib b/output/Sajjad (t3BH6NkAAAAJ)/Adeeba2025-UrBLiMPBenchmark.bib index 5e6690f9..3ead78fd 100644 --- a/output/Sajjad (t3BH6NkAAAAJ)/Adeeba2025-UrBLiMPBenchmark.bib +++ b/output/Sajjad (t3BH6NkAAAAJ)/Adeeba2025-UrBLiMPBenchmark.bib @@ -1,11 +1,10 @@ -@misc{Adeeba2025:UrBLiMPBenchmarkEvaluatingLinguistic, +@inproceedings{Adeeba2025:UrBLiMPBenchmarkEvaluatingLinguistic, title = {UrBLiMP: A Benchmark for Evaluating the Linguistic Competence of Large Language Models in Urdu}, author = {Farah Adeeba and Brian Dillon and Hassan Sajjad and Rajesh Bhatt}, year = {2025}, - howpublished = {arXiv}, - doi = {10.48550/arxiv.2508.01006}, - url = {https://arxiv.org/abs/2508.01006}, - eprint = {2508.01006}, - archiveprefix = {arXiv}, - primaryclass = {cs.CL} + booktitle = {Findings of the Association for Computational Linguistics: ACL 2026}, + publisher = {Association for Computational Linguistics}, + pages = {602-617}, + doi = {10.18653/v1/2026.findings-acl.29}, + url = {https://doi.org/10.18653/v1/2026.findings-acl.29} } diff --git a/output/Sajjad (t3BH6NkAAAAJ)/Badshah2025-CLEVLLM.bib b/output/Sajjad (t3BH6NkAAAAJ)/Badshah2025-DAFELLM.bib similarity index 69% rename from output/Sajjad (t3BH6NkAAAAJ)/Badshah2025-CLEVLLM.bib rename to output/Sajjad (t3BH6NkAAAAJ)/Badshah2025-DAFELLM.bib index 1dac7e97..41266327 100644 --- a/output/Sajjad (t3BH6NkAAAAJ)/Badshah2025-CLEVLLM.bib +++ b/output/Sajjad (t3BH6NkAAAAJ)/Badshah2025-DAFELLM.bib @@ -1,9 +1,10 @@ @misc{Badshah2025:DAFELLMBasedEvaluation, title = {DAFE: LLM-Based Evaluation Through Dynamic Arbitration for Free-Form Question-Answering}, - author = {Sher Badshah and Hassan Sajjad}, + author = {Badshah, Sher and Sajjad, Hassan}, year = {2025}, howpublished = {Qeios}, publisher = {Qeios Ltd}, doi = {10.32388/b69sky}, - url = {https://doi.org/10.32388/b69sky} + url = {https://doi.org/10.32388/b69sky}, + month = {Mar} } diff --git a/output/Sajjad (t3BH6NkAAAAJ)/Badshah2025-TALETool.bib b/output/Sajjad (t3BH6NkAAAAJ)/Badshah2025-TALETool.bib deleted file mode 100644 index 0fb0f94e..00000000 --- a/output/Sajjad (t3BH6NkAAAAJ)/Badshah2025-TALETool.bib +++ /dev/null @@ -1,10 +0,0 @@ -@misc{Badshah2025:TALEToolAugmentedFramework, - title = {TALE: A Tool-Augmented Framework for Reference-Free Evaluation of Large Language Models}, - author = {Sher Badshah and Ali Emami and Hassan Sajjad}, - year = {2025}, - howpublished = {arXiv}, - doi = {10.48550/arxiv.2504.07385}, - url = {https://arxiv.org/abs/2504.07385}, - eprint = {2504.07385}, - archiveprefix = {arXiv} -} diff --git a/output/Sajjad (t3BH6NkAAAAJ)/Badshah2026-SAGESearch.bib b/output/Sajjad (t3BH6NkAAAAJ)/Badshah2026-SAGESearch.bib new file mode 100644 index 00000000..5988e4d3 --- /dev/null +++ b/output/Sajjad (t3BH6NkAAAAJ)/Badshah2026-SAGESearch.bib @@ -0,0 +1,10 @@ +@inproceedings{Badshah2026:SAGESearchAuGmentedEvaluation, + title = {SAGE: A Search-AuGmented Evaluation of Large Language Models on Free-Form QA}, + author = {Sher Badshah and Ali Emami and Hassan Sajjad}, + year = {2026}, + booktitle = {Proceedings of the 64th Annual Meeting of the Association for Computational Linguistics (Volume 1: Long Papers)}, + publisher = {Association for Computational Linguistics}, + pages = {1466-1491}, + doi = {10.18653/v1/2026.acl-long.66}, + url = {https://doi.org/10.18653/v1/2026.acl-long.66} +} diff --git a/output/Sajjad (t3BH6NkAAAAJ)/Dalvi2023-NxPlainWeb.bib b/output/Sajjad (t3BH6NkAAAAJ)/Dalvi2023-NxPlainWeb.bib index 973795ba..f583867b 100644 --- a/output/Sajjad (t3BH6NkAAAAJ)/Dalvi2023-NxPlainWeb.bib +++ b/output/Sajjad (t3BH6NkAAAAJ)/Dalvi2023-NxPlainWeb.bib @@ -2,10 +2,9 @@ @inproceedings{Dalvi2023:NxPlainConceptDiscovery title = {NxPlain: Web-based Tool for Discovery of Latent Concepts}, author = {Fahim Dalvi and Nadir Durrani and Hassan Sajjad and Tamim Jaban and Musab Husaini and Ummar Abbas}, year = {2023}, - booktitle = {Conference of the European Chapter of the Association for Computational Linguistics}, - doi = {10.48550/arxiv.2303.03019}, - url = {https://arxiv.org/abs/2303.03019}, - eprint = {2303.03019}, - archiveprefix = {arXiv}, - primaryclass = {cs.CL} + booktitle = {Proceedings of the 17th Conference of the European Chapter of the Association for Computational Linguistics: System Demonstrations}, + publisher = {Association for Computational Linguistics}, + pages = {75-83}, + doi = {10.18653/v1/2023.eacl-demo.10}, + url = {https://doi.org/10.18653/v1/2023.eacl-demo.10} } diff --git a/output/Sajjad (t3BH6NkAAAAJ)/Dumpala2024-VISLABenchmark.bib b/output/Sajjad (t3BH6NkAAAAJ)/Dumpala2024-VISLABenchmark.bib new file mode 100644 index 00000000..94893c28 --- /dev/null +++ b/output/Sajjad (t3BH6NkAAAAJ)/Dumpala2024-VISLABenchmark.bib @@ -0,0 +1,10 @@ +@misc{Dumpala2024:VislaEmbeddingSensitivity, + title = {VISLA Benchmark: Evaluating Embedding Sensitivity to Semantic and Lexical Alterations}, + author = {Sri Harsha Dumpala and Aman Jaiswal and Chandramouli Sastry and Evangelos Milios and Sageev Oore and Hassan Sajjad}, + year = {2024}, + howpublished = {arXiv}, + doi = {10.48550/arxiv.2404.16365}, + url = {https://arxiv.org/abs/2404.16365}, + eprint = {2404.16365}, + archiveprefix = {arXiv} +} diff --git a/output/Sajjad (t3BH6NkAAAAJ)/Durrani2022-DiscoveringSalientNeurons.bib b/output/Sajjad (t3BH6NkAAAAJ)/Durrani2022-DiscoveringSalientNeurons.bib new file mode 100644 index 00000000..bbe5490b --- /dev/null +++ b/output/Sajjad (t3BH6NkAAAAJ)/Durrani2022-DiscoveringSalientNeurons.bib @@ -0,0 +1,10 @@ +@misc{Durrani2022:SalientNeuronDiscovery, + title = {Discovering Salient Neurons in Deep NLP Models}, + author = {Nadir Durrani and Fahim Dalvi and Hassan Sajjad}, + year = {2022}, + howpublished = {arXiv}, + doi = {10.48550/arxiv.2206.13288}, + url = {https://arxiv.org/abs/2206.13288}, + eprint = {2206.13288}, + archiveprefix = {arXiv} +} diff --git a/output/Sajjad (t3BH6NkAAAAJ)/Gajo2026-LLMsUnderperform.bib b/output/Sajjad (t3BH6NkAAAAJ)/Gajo2026-LLMsUnderperform.bib index 665c9cb8..449cec94 100644 --- a/output/Sajjad (t3BH6NkAAAAJ)/Gajo2026-LLMsUnderperform.bib +++ b/output/Sajjad (t3BH6NkAAAAJ)/Gajo2026-LLMsUnderperform.bib @@ -1,5 +1,10 @@ -@misc{Gajo2026:LLMsUnderperformGraphBased, +@inproceedings{Gajo2026:LLMsUnderperformGraphBased, title = {LLMs Underperform Graph-Based Parsers on Supervised Relation Extraction for Complex Graphs}, author = {Paolo Gajo and Domenic Rosati and Hassan Sajjad and Alberto Barron-Cedeno}, - year = {2026} + year = {2026}, + booktitle = {Proceedings of the 64th Annual Meeting of the Association for Computational Linguistics (Volume 2: Short Papers)}, + publisher = {Association for Computational Linguistics}, + pages = {181-193}, + doi = {10.18653/v1/2026.acl-short.17}, + url = {https://doi.org/10.18653/v1/2026.acl-short.17} } diff --git a/output/Sajjad (t3BH6NkAAAAJ)/Rizwan2026-PersistentEffects.bib b/output/Sajjad (t3BH6NkAAAAJ)/Rizwan2026-PersistentEffects.bib new file mode 100644 index 00000000..fc8053ad --- /dev/null +++ b/output/Sajjad (t3BH6NkAAAAJ)/Rizwan2026-PersistentEffects.bib @@ -0,0 +1,10 @@ +@misc{Rizwan2026:PersistentEffectsLexicalityLarge, + title = {On the Persistent Effects of Lexicality in Large Language Models}, + author = {H Rizwan and MU Haider and N Subramani and MT Diab and AB Siddique and H Sajjad}, + year = {2026}, + howpublished = {arXiv}, + doi = {10.48550/arxiv.2606.02750}, + url = {https://arxiv.org/abs/2606.02750}, + eprint = {2606.02750}, + archiveprefix = {arXiv} +} diff --git a/output/Sajjad (t3BH6NkAAAAJ)/Sajjad2020-PoorMan.bib b/output/Sajjad (t3BH6NkAAAAJ)/Sajjad2020-PoorMan.bib index 6f9efc12..35f09143 100644 --- a/output/Sajjad (t3BH6NkAAAAJ)/Sajjad2020-PoorMan.bib +++ b/output/Sajjad (t3BH6NkAAAAJ)/Sajjad2020-PoorMan.bib @@ -1,7 +1,6 @@ -@misc{Sajjad2020:LeanTransformers, +@misc{Sajjad2020:SmallerFasterTransformers, title = {Poor Man's BERT: Smaller and Faster Transformer Models}, author = {Hassan Sajjad and Fahim Dalvi and Nadir Durrani and Preslav Nakov}, year = {2020}, - howpublished = {arXiv}, - note = {Unenriched: no enrichment sources matched} + howpublished = {arXiv} } diff --git a/output/Sajjad (t3BH6NkAAAAJ)/Sajjad2025-InterpretingEffects.bib b/output/Sajjad (t3BH6NkAAAAJ)/Sajjad2025-InterpretingEffects.bib index 1dfa122a..8f708ca6 100644 --- a/output/Sajjad (t3BH6NkAAAAJ)/Sajjad2025-InterpretingEffects.bib +++ b/output/Sajjad (t3BH6NkAAAAJ)/Sajjad2025-InterpretingEffects.bib @@ -1,9 +1,10 @@ -@misc{Sajjad2025:InterpretingEffectsQuantizationLLMs, +@inproceedings{Sajjad2025:InterpretingEffectsQuantizationLLMs, title = {Interpreting the Effects of Quantization on LLMs}, author = {Hassan Sajjad and Manpreet Singh}, year = {2025}, - howpublished = {Underline Science}, + booktitle = {Proceedings of the 14th International Joint Conference on Natural Language Processing and the 4th Conference of the Asia-Pacific Chapter of the Association for Computational Linguistics}, publisher = {Underline Science Inc.}, - doi = {10.48448/1vag-qn48}, - url = {https://doi.org/10.48448/1vag-qn48} + pages = {2267-2281}, + doi = {10.18653/v1/2025.ijcnlp-long.123}, + url = {https://doi.org/10.18653/v1/2025.ijcnlp-long.123} } diff --git a/output/Sajjad (t3BH6NkAAAAJ)/Wong2026-LangFIRDiscovering.bib b/output/Sajjad (t3BH6NkAAAAJ)/Wong2026-LangFIRDiscovering.bib index cb267a82..cf7ece3f 100644 --- a/output/Sajjad (t3BH6NkAAAAJ)/Wong2026-LangFIRDiscovering.bib +++ b/output/Sajjad (t3BH6NkAAAAJ)/Wong2026-LangFIRDiscovering.bib @@ -2,5 +2,9 @@ @misc{Wong2026:LangFIRDiscoveringSparseLanguage title = {LangFIR: Discovering Sparse Language-Specific Features from Monolingual Data for Language Steering}, author = {SH Wong and H Sajjad and AB Siddique}, year = {2026}, - howpublished = {arXiv} + howpublished = {arXiv}, + doi = {10.48550/arxiv.2604.03532}, + url = {https://arxiv.org/abs/2604.03532}, + eprint = {2604.03532}, + archiveprefix = {arXiv} } diff --git a/output/Sampalli (UCVetfAAAAAJ)/Steeves2026-CorrectionEngaging.bib b/output/Sampalli (UCVetfAAAAAJ)/Steeves2026-CorrectionEngaging.bib new file mode 100644 index 00000000..c8ee5540 --- /dev/null +++ b/output/Sampalli (UCVetfAAAAAJ)/Steeves2026-CorrectionEngaging.bib @@ -0,0 +1,12 @@ +@article{Steeves2026:ImplementationScienceGuide, + title = {Correction: Engaging patients throughout the continuum of implementation science and practice: adapted evidence mapping review and practical guide for clinicians and researchers}, + author = {Lauren Steeves and Srinivas Sampalli and Robin Urquhart}, + year = {2026}, + journal = {Health Research Policy and Systems}, + publisher = {Springer Science and Business Media LLC}, + volume = {24}, + number = {1}, + pages = {52}, + doi = {10.1186/s12961-026-01497-y}, + url = {https://doi.org/10.1186/s12961-026-01497-y} +} diff --git a/output/Sharma (VHjAIe8AAAAJ)/Jahan2025-TaxonomyFaults.bib b/output/Sharma (VHjAIe8AAAAJ)/Jahan2025-TaxonomyFaults.bib deleted file mode 100644 index 85c5cdde..00000000 --- a/output/Sharma (VHjAIe8AAAAJ)/Jahan2025-TaxonomyFaults.bib +++ /dev/null @@ -1,6 +0,0 @@ -@misc{Jahan2025:FaultTaxonomyAttentionNetworks, - title = {Taxonomy of Faults in Attention-Based Neural Networks}, - author = {Sigma Jahan and Shalini Singh Rajput and Tushar Sharma and Mohammad Masudur Rahman}, - year = {2025}, - howpublished = {arXiv} -} diff --git a/output/Sharma (VHjAIe8AAAAJ)/Jahan2025-WhyAttention.bib b/output/Sharma (VHjAIe8AAAAJ)/Jahan2025-WhyAttention.bib new file mode 100644 index 00000000..27ed1513 --- /dev/null +++ b/output/Sharma (VHjAIe8AAAAJ)/Jahan2025-WhyAttention.bib @@ -0,0 +1,10 @@ +@misc{Jahan2025:AttentionFaults, + title = {Why Attention Fails: A Taxonomy of Faults in Attention-Based Neural Networks}, + author = {Sigma Jahan and Saurabh Singh Rajput and Tushar Sharma and Mohammad Masudur Rahman}, + year = {2025}, + howpublished = {arXiv}, + doi = {10.48550/arxiv.2508.04925}, + url = {https://arxiv.org/abs/2508.04925}, + eprint = {2508.04925}, + archiveprefix = {arXiv} +} diff --git a/output/Sharma (VHjAIe8AAAAJ)/Mehditabar2026-ValidatedTaxonomy.bib b/output/Sharma (VHjAIe8AAAAJ)/Mehditabar2026-ValidatedTaxonomy.bib index 0a9ca9d9..6b35241b 100644 --- a/output/Sharma (VHjAIe8AAAAJ)/Mehditabar2026-ValidatedTaxonomy.bib +++ b/output/Sharma (VHjAIe8AAAAJ)/Mehditabar2026-ValidatedTaxonomy.bib @@ -1,6 +1,10 @@ -@misc{Mehditabar2026:ValidatedTaxonomySoftwareEnergy, +@misc{Mehditabar2026:SoftwareEnergySmellsTaxonomy, title = {A Validated Taxonomy on Software Energy Smells}, author = {Mohammadjavad Mehditabar and Saurabhsingh Rajput and Tushar Sharma}, year = {2026}, - howpublished = {arXiv} + howpublished = {arXiv}, + doi = {10.48550/arxiv.2604.04809}, + url = {https://arxiv.org/abs/2604.04809}, + eprint = {2604.04809}, + archiveprefix = {arXiv} } diff --git a/output/Sharma (VHjAIe8AAAAJ)/Rajput2023-FECoMStep.bib b/output/Sharma (VHjAIe8AAAAJ)/Rajput2023-FECoMStep.bib new file mode 100644 index 00000000..501ba36f --- /dev/null +++ b/output/Sharma (VHjAIe8AAAAJ)/Rajput2023-FECoMStep.bib @@ -0,0 +1,9 @@ +@misc{Rajput2023:FineGrainedEnergyMeasurement, + title = {FECoM: A Step towards Fine-Grained Energy Measurement for Deep Learning}, + author = {S Rajput and T Widmayer and Z Shang and M Kechagia and F Sarro and T Sharma}, + year = {2023}, + howpublished = {arXiv}, + url = {https://arxiv.org/abs/2308.12264}, + eprint = {2308.12264}, + archiveprefix = {arXiv} +} diff --git a/output/Sharma (VHjAIe8AAAAJ)/Rajput2026-CodeGreenTowards.bib b/output/Sharma (VHjAIe8AAAAJ)/Rajput2026-CodeGreenTowards.bib index 0b7a4899..876579e0 100644 --- a/output/Sharma (VHjAIe8AAAAJ)/Rajput2026-CodeGreenTowards.bib +++ b/output/Sharma (VHjAIe8AAAAJ)/Rajput2026-CodeGreenTowards.bib @@ -3,6 +3,7 @@ @misc{Rajput2026:CodeGreenTowardsImprovingPrecision author = {Saurabhsingh Rajput and Tushar Sharma}, year = {2026}, howpublished = {arXiv}, + publisher = {Zenodo}, doi = {10.48550/arxiv.2603.17924}, url = {https://arxiv.org/abs/2603.17924}, eprint = {2603.17924}, diff --git a/output/Sharma (VHjAIe8AAAAJ)/Saad2025-HierarchicalEvaluationSoftware.bib b/output/Sharma (VHjAIe8AAAAJ)/Saad2025-HierarchicalEvaluationSoftware.bib new file mode 100644 index 00000000..32d3e5a2 --- /dev/null +++ b/output/Sharma (VHjAIe8AAAAJ)/Saad2025-HierarchicalEvaluationSoftware.bib @@ -0,0 +1,10 @@ +@misc{Saad2025:HierarchicalEvaluationSoftwareDesign, + title = {Hierarchical Evaluation of Software Design Capabilities of Large Language Models of Code}, + author = {Mootez Saad and Boqi Chen and Jose Antonio Hernandez Lopez and Daniel Varro and Tushar Sharma}, + year = {2025}, + howpublished = {arXiv}, + doi = {10.48550/arxiv.2511.20933}, + url = {https://arxiv.org/abs/2511.20933}, + eprint = {2511.20933}, + archiveprefix = {arXiv} +} diff --git a/output/Siegel (joV1qkYAAAAJ)/Huang2021-DataVisualizations.bib b/output/Siegel (joV1qkYAAAAJ)/Huang2021-DataVisualizations.bib index a22f2288..1c9fd8b7 100644 --- a/output/Siegel (joV1qkYAAAAJ)/Huang2021-DataVisualizations.bib +++ b/output/Siegel (joV1qkYAAAAJ)/Huang2021-DataVisualizations.bib @@ -1,6 +1,11 @@ -@misc{Huang2021:DataLearningFramework, +@incollection{Huang2021:DataLearningFramework, title = {Data Visualizations to Foster Self-regulated Learning with Intelligent Programming Tutors: Towards an Instructional Design Framework}, author = {L Huang and E Poitras and A Siegel and RV Sampangi and F Paulovich}, year = {2021}, + booktitle = {Advances in Analytics for Learning and Teaching}, + publisher = {Springer International Publishing}, + pages = {69-92}, + doi = {10.1007/978-3-030-81222-5_4}, + url = {https://doi.org/10.1007/978-3-030-81222-5_4}, note = {Unenriched: no enrichment sources matched} } diff --git a/output/Spadon (bfdGsGUAAAAJ)/Mayette2026-AssessmentVessel.bib b/output/Spadon (bfdGsGUAAAAJ)/Mayette2026-AssessmentVessel.bib new file mode 100644 index 00000000..114be5ef --- /dev/null +++ b/output/Spadon (bfdGsGUAAAAJ)/Mayette2026-AssessmentVessel.bib @@ -0,0 +1,9 @@ +@article{Mayette2026:WhaleStrikeRisk, + title = {Assessment of vessel strike risk and performance of the Canadian protection measures for North Atlantic right whales in the Gulf of St. Lawrence}, + author = {Alexandra Mayette and Alexandra Krystal Cole and Shiva Jian-Javdan and Gabriel Spadon and Ronald P Pelot and Sean W Brillant}, + year = {2026}, + journal = {Endangered Species Research}, + publisher = {Inter-Research Science Center}, + doi = {10.3354/esr01528}, + url = {https://doi.org/10.3354/esr01528} +} diff --git a/output/Spadon (bfdGsGUAAAAJ)/Song2026-MoCoAIS.bib b/output/Spadon (bfdGsGUAAAAJ)/Song2026-MoCoAIS.bib new file mode 100644 index 00000000..ab190285 --- /dev/null +++ b/output/Spadon (bfdGsGUAAAAJ)/Song2026-MoCoAIS.bib @@ -0,0 +1,11 @@ +@misc{Song2026:MoCoAISContrastiveLearning, + title = {MoCo-AIS: A Contrastive Learning Framework for Similarity Computation of Vessel Trajectories}, + author = {R Song and MM Alam and Z Sadeghi and A Soares and JF Rodrigues-Jr and G Spadon}, + year = {2026}, + howpublished = {arXiv}, + doi = {10.48550/arxiv.2606.17978}, + url = {https://arxiv.org/abs/2606.17978}, + eprint = {2606.17978}, + archiveprefix = {arXiv}, + primaryclass = {cs.AI} +} diff --git a/output/Spadon (bfdGsGUAAAAJ)/Spadon2023-BuildingSafer.bib b/output/Spadon (bfdGsGUAAAAJ)/Spadon2023-BuildingSafer.bib new file mode 100644 index 00000000..58c82880 --- /dev/null +++ b/output/Spadon (bfdGsGUAAAAJ)/Spadon2023-BuildingSafer.bib @@ -0,0 +1,10 @@ +@misc{Spadon2023:MaritimeTrajectoryForecasting, + title = {Building a Safer Maritime Environment Through Multi-Path Long-Term Vessel Trajectory Forecasting}, + author = {Gabriel Spadon and Jay Kumar and Matthew Smith and Sarah Vela and Romina Gehrmann and Derek Eden and Joshua Van Berkel and Amilcar Soares and Ronan Fablet and Ronald Pelot and Stan Matwin}, + year = {2023}, + howpublished = {arXiv}, + url = {https://arxiv.org/abs/2310.18948}, + eprint = {2310.18948}, + archiveprefix = {arXiv}, + note = {Unenriched: no enrichment sources matched} +} diff --git a/output/Spadon (bfdGsGUAAAAJ)/Spadon2024-GravityInformed.bib b/output/Spadon (bfdGsGUAAAAJ)/Spadon2024-GravityInformed.bib new file mode 100644 index 00000000..0264fcb9 --- /dev/null +++ b/output/Spadon (bfdGsGUAAAAJ)/Spadon2024-GravityInformed.bib @@ -0,0 +1,11 @@ +@misc{Spadon2024:GravityShipInvasionRisk, + title = {Gravity-Informed Deep Learning Framework for Predicting Ship Traffic Flow and Invasion Risk of Non-Indigenous Species via Ballast Water Discharge}, + author = {Gabriel Spadon and Ruixin Song and Ronald Pelot and Stan Matwin and Amilcar Soares}, + year = {2024}, + howpublished = {Research Square}, + publisher = {Springer Science and Business Media LLC}, + doi = {10.21203/rs.3.rs-3917933/v1}, + url = {https://doi.org/10.21203/rs.3.rs-3917933/v1}, + eprint = {2401.13098}, + archiveprefix = {arXiv} +} diff --git a/output/Trappenberg (EwkaTYEAAAAJ)/Hasan2024-GeneralizedTransformer.bib b/output/Trappenberg (EwkaTYEAAAAJ)/Hasan2024-GeneralizedTransformer.bib index 31153b95..1ddb0fd2 100644 --- a/output/Trappenberg (EwkaTYEAAAAJ)/Hasan2024-GeneralizedTransformer.bib +++ b/output/Trappenberg (EwkaTYEAAAAJ)/Hasan2024-GeneralizedTransformer.bib @@ -1,11 +1,11 @@ -@misc{Hasan2024:RadioLinkFailurePrediction, +@article{Hasan2024:RadioLinkFailurePrediction, title = {A Generalized Transformer-based Radio Link Failure Prediction Framework in 5G RANs}, author = {Kazi Hasan and Thomas Trappenberg and Israat Haque}, year = {2024}, - howpublished = {arXiv}, - doi = {10.48550/arxiv.2407.05197}, - url = {https://arxiv.org/abs/2407.05197}, - eprint = {2407.05197}, - archiveprefix = {arXiv}, - primaryclass = {cs.AI} + journal = {IEEE Transactions on Machine Learning in Communications and Networking}, + publisher = {Institute of Electrical and Electronics Engineers (IEEE)}, + volume = {3}, + pages = {710-724}, + doi = {10.1109/tmlcn.2025.3575368}, + url = {https://doi.org/10.1109/tmlcn.2025.3575368} } diff --git a/output/Trappenberg (EwkaTYEAAAAJ)/Lowe2021-LogicalActivation.bib b/output/Trappenberg (EwkaTYEAAAAJ)/Lowe2021-LogicalActivation.bib deleted file mode 100644 index d1c67b90..00000000 --- a/output/Trappenberg (EwkaTYEAAAAJ)/Lowe2021-LogicalActivation.bib +++ /dev/null @@ -1,6 +0,0 @@ -@misc{Lowe2021:LogitBooleanOperators, - title = {Logical Activation Functions: Logit-space equivalents of Boolean Operators}, - author = {Scott Lowe and Robert Earle and Jason D'eon and Thomas Trappenberg and Sageev Oore}, - year = {2021}, - howpublished = {arXiv} -} diff --git a/output/Trappenberg (EwkaTYEAAAAJ)/Lowe2022-LogicalActivation.bib b/output/Trappenberg (EwkaTYEAAAAJ)/Lowe2022-LogicalActivation.bib new file mode 100644 index 00000000..7392927f --- /dev/null +++ b/output/Trappenberg (EwkaTYEAAAAJ)/Lowe2022-LogicalActivation.bib @@ -0,0 +1,11 @@ +@inproceedings{Lowe2022:LogitBooleanOperators, + title = {Logical Activation Functions: Logit-Space Equivalents of Probabilistic Boolean Operators}, + author = {Scott Lowe and Robert Earle and Jason D'Eon and Thomas Trappenberg and Sageev Oore}, + year = {2022}, + booktitle = {Advances in Neural Information Processing Systems 35}, + publisher = {Neural Information Processing Systems Foundation, Inc. (NeurIPS)}, + pages = {29733-29747}, + doi = {10.52202/068431-2156}, + url = {https://doi.org/10.52202/068431-2156}, + note = {Unenriched: no enrichment sources matched} +} diff --git a/output/Wehbe (UrFw3XEAAAAJ)/Ansari2026-ParticipatoryDesign.bib b/output/Wehbe (UrFw3XEAAAAJ)/Ansari2026-ParticipatoryDesign.bib new file mode 100644 index 00000000..0bbcb1da --- /dev/null +++ b/output/Wehbe (UrFw3XEAAAAJ)/Ansari2026-ParticipatoryDesign.bib @@ -0,0 +1,10 @@ +@inproceedings{Ansari2026:ParticipatoryTechReview, + title = {Using Participatory Design to Develop Communication-Supporting Technology: A Scoping Review}, + author = {R Ansari and S Anvari and L Escobedo and RR Wehbe}, + year = {2026}, + booktitle = {Anais da XII Conferencia Latino-Americana de Interacao Humano-Computador (CLIHC 2026)}, + publisher = {Sociedade Brasileira de Computacao}, + pages = {136-150}, + doi = {10.5753/clihc.2026.20411}, + url = {https://doi.org/10.5753/clihc.2026.20411} +} diff --git a/output/Whidden (itc4x9kAAAAJ)/F2026-AdvancingPassive.bib b/output/Whidden (itc4x9kAAAAJ)/F2026-AdvancingPassive.bib new file mode 100644 index 00000000..693d44bf --- /dev/null +++ b/output/Whidden (itc4x9kAAAAJ)/F2026-AdvancingPassive.bib @@ -0,0 +1,12 @@ +@article{F2026:ArcticShipDetection, + title = {Advancing passive acoustic ship detection in the Western Canadian Arctic: Signal processing and deep learning approaches}, + author = {Jedari-Eyvazi F and Frazao Fs and Halliday Wd and Gehrmann R and Menelon L and Dingwall Jt and Whidden C and Dowd M}, + year = {2026}, + journal = {The Journal of the Acoustical Society of America}, + publisher = {Acoustical Society of America (ASA)}, + volume = {159}, + number = {6}, + pages = {4843-4861}, + doi = {10.1121/10.0043937}, + url = {https://doi.org/10.1121/10.0043937} +} diff --git a/output/Whidden (itc4x9kAAAAJ)/Whidden2020-SystematicExploration.bib b/output/Whidden (itc4x9kAAAAJ)/Whidden2020-SystematicExploration.bib new file mode 100644 index 00000000..211e789e --- /dev/null +++ b/output/Whidden (itc4x9kAAAAJ)/Whidden2020-SystematicExploration.bib @@ -0,0 +1,12 @@ +@article{Whidden2020:HighLikelihoodPhylogeny, + title = {Systematic Exploration of the High Likelihood Set of Phylogenetic Tree Topologies}, + author = {Chris Whidden and Brian C Claywell and Thayer Fisher and Andrew F Magee and Mathieu Fourment and Frederick A Matsen}, + year = {2020}, + journal = {Systematic biology}, + publisher = {Oxford University Press (OUP)}, + volume = {69}, + number = {2}, + pages = {280-293}, + doi = {10.1093/sysbio/syz047}, + url = {https://doi.org/10.1093/sysbio/syz047} +} diff --git a/output/Wilde (lkAmFEEAAAAJ)/Lodel2026-LearningSemantic.bib b/output/Wilde (lkAmFEEAAAAJ)/Lodel2026-LearningSemantic.bib index 6fdb125d..e743779d 100644 --- a/output/Wilde (lkAmFEEAAAAJ)/Lodel2026-LearningSemantic.bib +++ b/output/Wilde (lkAmFEEAAAAJ)/Lodel2026-LearningSemantic.bib @@ -2,5 +2,9 @@ @misc{Lodel2026:SemanticTargetSearch title = {Learning Semantic Priorities for Autonomous Target Search}, author = {Max Lodel and Nils Wilde and Robert Babuvska and Javier Alonso-Mora}, year = {2026}, - howpublished = {arXiv} + howpublished = {arXiv}, + doi = {10.48550/arxiv.2603.29391}, + url = {https://arxiv.org/abs/2603.29391}, + eprint = {2603.29391}, + archiveprefix = {arXiv} } diff --git a/output/Wilde (lkAmFEEAAAAJ)/Wilde2020-SpecifyingUser.bib b/output/Wilde (lkAmFEEAAAAJ)/Wilde2020-SpecifyingUser.bib index 02512974..0bc8ee28 100644 --- a/output/Wilde (lkAmFEEAAAAJ)/Wilde2020-SpecifyingUser.bib +++ b/output/Wilde (lkAmFEEAAAAJ)/Wilde2020-SpecifyingUser.bib @@ -3,5 +3,6 @@ @phdthesis{Wilde2020:UserPreferenceLearningSpecifying author = {Nils Wilde}, year = {2020}, howpublished = {UWSpace (University of Waterloo)}, + note = {Unenriched: no enrichment sources matched}, school = {UWSpace (University of Waterloo)} } diff --git a/output/Ye (4OQaVGUAAAAJ)/Jia2026-SynergizingDigital.bib b/output/Ye (4OQaVGUAAAAJ)/Jia2026-SynergizingDigital.bib new file mode 100644 index 00000000..fca10580 --- /dev/null +++ b/output/Ye (4OQaVGUAAAAJ)/Jia2026-SynergizingDigital.bib @@ -0,0 +1,11 @@ +@article{Jia2026:SynergizingDigitalTwinUAV, + title = {Synergizing Digital Twin and UAV for Intelligent Network Recovery and Management in Smart Cities}, + author = {Jia, Dong and Ye, Qiang}, + year = {2026}, + journal = {IEEE Network}, + publisher = {Institute of Electrical and Electronics Engineers (IEEE)}, + pages = {1-10}, + doi = {10.1109/mnet.2026.3695428}, + url = {https://doi.org/10.1109/mnet.2026.3695428}, + issn = {1558-156X} +} diff --git a/output/Ye (4OQaVGUAAAAJ)/Lv2020-IntelligentInterference.bib b/output/Ye (4OQaVGUAAAAJ)/Lv2020-IntelligentInterference.bib index cc7d5e78..6c2aa660 100644 --- a/output/Ye (4OQaVGUAAAAJ)/Lv2020-IntelligentInterference.bib +++ b/output/Ye (4OQaVGUAAAAJ)/Lv2020-IntelligentInterference.bib @@ -1,6 +1,9 @@ @misc{Lv2020:IntelligentInterferenceEngineering, - title = {Intelligent Interference Engineering for Secure Non-Orthogonal Multiple Access}, - author = {Lu Lv and Hai Jiang and Zhiguo Ding and Qiang Ye and Naofal Al-Dhahir and Jian Chen}, + title = {Intelligent interference engineering for secure non-orthogonal multiple access}, + author = {L Lv and H Jiang and Z Ding and Q Ye and N Al-Dhahir and J Chen}, year = {2020}, - howpublished = {arXiv} + howpublished = {arXiv}, + url = {https://arxiv.org/abs/2003.13488}, + eprint = {2003.13488}, + archiveprefix = {arXiv} } diff --git a/output/Ye (4OQaVGUAAAAJ)/Wang2026-DOCAttackData.bib b/output/Ye (4OQaVGUAAAAJ)/Wang2026-DOCAttackData.bib new file mode 100644 index 00000000..c8ea27d9 --- /dev/null +++ b/output/Ye (4OQaVGUAAAAJ)/Wang2026-DOCAttackData.bib @@ -0,0 +1,10 @@ +@article{Wang2026:DOCAttack, + title = {DOCAttack: Data-Oriented Community Attack in Decentralized Federated Learning}, + author = {X Wang and Y Chen and Q Ye and J Son and OA Dobre}, + year = {2026}, + journal = {IEEE Transactions on Network Science and Engineering}, + publisher = {Institute of Electrical and Electronics Engineers (IEEE)}, + pages = {1-18}, + doi = {10.1109/tnse.2026.3702609}, + url = {https://doi.org/10.1109/tnse.2026.3702609} +} diff --git a/output/Zincir-Heywood (F9nG0F4AAAAJ)/Baharlouei2024-ADVENTAttackAnomaly.bib b/output/Zincir-Heywood (F9nG0F4AAAAJ)/Baharlouei2024-ADVENTAttackAnomaly.bib new file mode 100644 index 00000000..3c141ca0 --- /dev/null +++ b/output/Zincir-Heywood (F9nG0F4AAAAJ)/Baharlouei2024-ADVENTAttackAnomaly.bib @@ -0,0 +1,10 @@ +@misc{Baharlouei2024:VanetAttackDetection, + title = {ADVENT: Attack/Anomaly Detection in VANETs}, + author = {Hamideh Baharlouei and Adetokunbo Makanju and Nur Zincir-Heywood}, + year = {2024}, + howpublished = {arXiv}, + doi = {10.48550/arxiv.2401.08564}, + url = {https://arxiv.org/abs/2401.08564}, + eprint = {2401.08564}, + archiveprefix = {arXiv} +} diff --git a/output/a2i2/Adeeba2025-UrBLiMPBenchmark.bib b/output/a2i2/Adeeba2025-UrBLiMPBenchmark.bib index 5e6690f9..3ead78fd 100644 --- a/output/a2i2/Adeeba2025-UrBLiMPBenchmark.bib +++ b/output/a2i2/Adeeba2025-UrBLiMPBenchmark.bib @@ -1,11 +1,10 @@ -@misc{Adeeba2025:UrBLiMPBenchmarkEvaluatingLinguistic, +@inproceedings{Adeeba2025:UrBLiMPBenchmarkEvaluatingLinguistic, title = {UrBLiMP: A Benchmark for Evaluating the Linguistic Competence of Large Language Models in Urdu}, author = {Farah Adeeba and Brian Dillon and Hassan Sajjad and Rajesh Bhatt}, year = {2025}, - howpublished = {arXiv}, - doi = {10.48550/arxiv.2508.01006}, - url = {https://arxiv.org/abs/2508.01006}, - eprint = {2508.01006}, - archiveprefix = {arXiv}, - primaryclass = {cs.CL} + booktitle = {Findings of the Association for Computational Linguistics: ACL 2026}, + publisher = {Association for Computational Linguistics}, + pages = {602-617}, + doi = {10.18653/v1/2026.findings-acl.29}, + url = {https://doi.org/10.18653/v1/2026.findings-acl.29} } diff --git a/output/a2i2/Azad2026-SurgiDiffContext.bib b/output/a2i2/Azad2026-SurgiDiffContext.bib new file mode 100644 index 00000000..a602d740 --- /dev/null +++ b/output/a2i2/Azad2026-SurgiDiffContext.bib @@ -0,0 +1,10 @@ +@inproceedings{Azad2026:SurgiDiffRecommender, + title = {SurgiDiff: A Context-Aware Diffusion Recommender for Safe Surgical Autonomy}, + author = {Bita Azad and Sadra Zargarzadeh and Frank Rudzicz}, + year = {2026}, + booktitle = {2026 International Symposium on Medical Robotics (ISMR)}, + publisher = {IEEE}, + pages = {143-149}, + doi = {10.1109/ismr69606.2026.11536208}, + url = {https://doi.org/10.1109/ismr69606.2026.11536208} +} diff --git a/output/a2i2/Badawi2026-TowardsUnderstanding.bib b/output/a2i2/Badawi2026-TowardsUnderstanding.bib new file mode 100644 index 00000000..55ea7c5b --- /dev/null +++ b/output/a2i2/Badawi2026-TowardsUnderstanding.bib @@ -0,0 +1,10 @@ +@misc{Badawi2026:TowardsUnderstandingMeasuringCOGNITIVE, + title = {Towards Understanding and Measuring COGNITIVE ATROPHY in LLM Behaviour}, + author = {Abeer Badawi and Moyosoreoluwa Olatosi and Negin Baghbanzadeh and Laleh Seyyed-Kalantari and Frank Rudzicz and R. Shayna Rosenbaum and Sara Pishdadian and Elham Dolatabadi}, + year = {2026}, + howpublished = {arXiv}, + doi = {10.48550/arxiv.2606.18129}, + url = {https://arxiv.org/abs/2606.18129}, + eprint = {2606.18129}, + archiveprefix = {arXiv} +} diff --git a/output/a2i2/Badshah2025-CLEVLLM.bib b/output/a2i2/Badshah2025-DAFELLM.bib similarity index 69% rename from output/a2i2/Badshah2025-CLEVLLM.bib rename to output/a2i2/Badshah2025-DAFELLM.bib index 1dac7e97..41266327 100644 --- a/output/a2i2/Badshah2025-CLEVLLM.bib +++ b/output/a2i2/Badshah2025-DAFELLM.bib @@ -1,9 +1,10 @@ @misc{Badshah2025:DAFELLMBasedEvaluation, title = {DAFE: LLM-Based Evaluation Through Dynamic Arbitration for Free-Form Question-Answering}, - author = {Sher Badshah and Hassan Sajjad}, + author = {Badshah, Sher and Sajjad, Hassan}, year = {2025}, howpublished = {Qeios}, publisher = {Qeios Ltd}, doi = {10.32388/b69sky}, - url = {https://doi.org/10.32388/b69sky} + url = {https://doi.org/10.32388/b69sky}, + month = {Mar} } diff --git a/output/a2i2/Badshah2025-TALETool.bib b/output/a2i2/Badshah2025-TALETool.bib deleted file mode 100644 index 0fb0f94e..00000000 --- a/output/a2i2/Badshah2025-TALETool.bib +++ /dev/null @@ -1,10 +0,0 @@ -@misc{Badshah2025:TALEToolAugmentedFramework, - title = {TALE: A Tool-Augmented Framework for Reference-Free Evaluation of Large Language Models}, - author = {Sher Badshah and Ali Emami and Hassan Sajjad}, - year = {2025}, - howpublished = {arXiv}, - doi = {10.48550/arxiv.2504.07385}, - url = {https://arxiv.org/abs/2504.07385}, - eprint = {2504.07385}, - archiveprefix = {arXiv} -} diff --git a/output/a2i2/Badshah2026-SAGESearch.bib b/output/a2i2/Badshah2026-SAGESearch.bib new file mode 100644 index 00000000..5988e4d3 --- /dev/null +++ b/output/a2i2/Badshah2026-SAGESearch.bib @@ -0,0 +1,10 @@ +@inproceedings{Badshah2026:SAGESearchAuGmentedEvaluation, + title = {SAGE: A Search-AuGmented Evaluation of Large Language Models on Free-Form QA}, + author = {Sher Badshah and Ali Emami and Hassan Sajjad}, + year = {2026}, + booktitle = {Proceedings of the 64th Annual Meeting of the Association for Computational Linguistics (Volume 1: Long Papers)}, + publisher = {Association for Computational Linguistics}, + pages = {1466-1491}, + doi = {10.18653/v1/2026.acl-long.66}, + url = {https://doi.org/10.18653/v1/2026.acl-long.66} +} diff --git a/output/a2i2/Baharlouei2024-ADVENTAttackAnomaly.bib b/output/a2i2/Baharlouei2024-ADVENTAttackAnomaly.bib new file mode 100644 index 00000000..3c141ca0 --- /dev/null +++ b/output/a2i2/Baharlouei2024-ADVENTAttackAnomaly.bib @@ -0,0 +1,10 @@ +@misc{Baharlouei2024:VanetAttackDetection, + title = {ADVENT: Attack/Anomaly Detection in VANETs}, + author = {Hamideh Baharlouei and Adetokunbo Makanju and Nur Zincir-Heywood}, + year = {2024}, + howpublished = {arXiv}, + doi = {10.48550/arxiv.2401.08564}, + url = {https://arxiv.org/abs/2401.08564}, + eprint = {2401.08564}, + archiveprefix = {arXiv} +} diff --git a/output/a2i2/Cano2026-ProspectiveCompression.bib b/output/a2i2/Cano2026-ProspectiveCompression.bib index 592966fb..658f56ce 100644 --- a/output/a2i2/Cano2026-ProspectiveCompression.bib +++ b/output/a2i2/Cano2026-ProspectiveCompression.bib @@ -6,5 +6,6 @@ @misc{Cano2026:CompressionLearning doi = {10.48550/arxiv.2605.09985}, url = {https://arxiv.org/abs/2605.09985}, eprint = {2605.09985}, - archiveprefix = {arXiv} + archiveprefix = {arXiv}, + primaryclass = {cs.AI} } diff --git a/output/a2i2/Dalvi2023-NxPlainWeb.bib b/output/a2i2/Dalvi2023-NxPlainWeb.bib index 973795ba..f583867b 100644 --- a/output/a2i2/Dalvi2023-NxPlainWeb.bib +++ b/output/a2i2/Dalvi2023-NxPlainWeb.bib @@ -2,10 +2,9 @@ @inproceedings{Dalvi2023:NxPlainConceptDiscovery title = {NxPlain: Web-based Tool for Discovery of Latent Concepts}, author = {Fahim Dalvi and Nadir Durrani and Hassan Sajjad and Tamim Jaban and Musab Husaini and Ummar Abbas}, year = {2023}, - booktitle = {Conference of the European Chapter of the Association for Computational Linguistics}, - doi = {10.48550/arxiv.2303.03019}, - url = {https://arxiv.org/abs/2303.03019}, - eprint = {2303.03019}, - archiveprefix = {arXiv}, - primaryclass = {cs.CL} + booktitle = {Proceedings of the 17th Conference of the European Chapter of the Association for Computational Linguistics: System Demonstrations}, + publisher = {Association for Computational Linguistics}, + pages = {75-83}, + doi = {10.18653/v1/2023.eacl-demo.10}, + url = {https://doi.org/10.18653/v1/2023.eacl-demo.10} } diff --git a/output/a2i2/Dhaliwal2026-HenTwinMulti.bib b/output/a2i2/Dhaliwal2026-HenTwinMulti.bib new file mode 100644 index 00000000..531883fb --- /dev/null +++ b/output/a2i2/Dhaliwal2026-HenTwinMulti.bib @@ -0,0 +1,7 @@ +@inproceedings{Dhaliwal2026:HenTwinMultiModalDigital, + title = {HenTwin: A Multi-Modal Digital Twin Framework for Longitudinal Welfare Monitoring in Early-Life Laying Hens}, + author = {Y Dhaliwal and S Neethirajan}, + year = {2026}, + booktitle = {Proceedings of the 39th IEEE Canadian Conference on Electrical and Computer}, + note = {Venue from SerpAPI publication string (unverified)} +} diff --git a/output/a2i2/Durrani2022-DiscoveringSalientNeurons.bib b/output/a2i2/Durrani2022-DiscoveringSalientNeurons.bib new file mode 100644 index 00000000..bbe5490b --- /dev/null +++ b/output/a2i2/Durrani2022-DiscoveringSalientNeurons.bib @@ -0,0 +1,10 @@ +@misc{Durrani2022:SalientNeuronDiscovery, + title = {Discovering Salient Neurons in Deep NLP Models}, + author = {Nadir Durrani and Fahim Dalvi and Hassan Sajjad}, + year = {2022}, + howpublished = {arXiv}, + doi = {10.48550/arxiv.2206.13288}, + url = {https://arxiv.org/abs/2206.13288}, + eprint = {2206.13288}, + archiveprefix = {arXiv} +} diff --git a/output/a2i2/Essien2026-ComparativeAnalysis.bib b/output/a2i2/Essien2026-ComparativeAnalysis.bib new file mode 100644 index 00000000..64b7801e --- /dev/null +++ b/output/a2i2/Essien2026-ComparativeAnalysis.bib @@ -0,0 +1,7 @@ +@inproceedings{Essien2026:DeepPoultryClassification, + title = {Comparative Analysis of Deep Temporal Models for Poultry Behaviour Classification}, + author = {D Essien and S Neethirajan}, + year = {2026}, + booktitle = {39th IEEE Canadian Conference on Electrical and Computer Engineering (CCECE}, + note = {Venue from SerpAPI publication string (unverified)} +} diff --git a/output/a2i2/Gajo2026-LLMsUnderperform.bib b/output/a2i2/Gajo2026-LLMsUnderperform.bib index 665c9cb8..449cec94 100644 --- a/output/a2i2/Gajo2026-LLMsUnderperform.bib +++ b/output/a2i2/Gajo2026-LLMsUnderperform.bib @@ -1,5 +1,10 @@ -@misc{Gajo2026:LLMsUnderperformGraphBased, +@inproceedings{Gajo2026:LLMsUnderperformGraphBased, title = {LLMs Underperform Graph-Based Parsers on Supervised Relation Extraction for Complex Graphs}, author = {Paolo Gajo and Domenic Rosati and Hassan Sajjad and Alberto Barron-Cedeno}, - year = {2026} + year = {2026}, + booktitle = {Proceedings of the 64th Annual Meeting of the Association for Computational Linguistics (Volume 2: Short Papers)}, + publisher = {Association for Computational Linguistics}, + pages = {181-193}, + doi = {10.18653/v1/2026.acl-short.17}, + url = {https://doi.org/10.18653/v1/2026.acl-short.17} } diff --git a/output/a2i2/Ge2024-WhatDo.bib b/output/a2i2/Ge2024-WhatDo.bib new file mode 100644 index 00000000..a06a7967 --- /dev/null +++ b/output/a2i2/Ge2024-WhatDo.bib @@ -0,0 +1,9 @@ +@misc{Ge2024:CircuitKnowledgeEdit, + title = {What do the circuits mean? a knowledge edit view}, + author = {H Ge and F Rudzicz and Z Zhu}, + year = {2024}, + howpublished = {arXiv}, + url = {https://arxiv.org/abs/2406.17241}, + eprint = {2406.17241}, + archiveprefix = {arXiv} +} diff --git a/output/a2i2/Hasan2024-GeneralizedTransformer.bib b/output/a2i2/Hasan2024-GeneralizedTransformer.bib index 31153b95..1ddb0fd2 100644 --- a/output/a2i2/Hasan2024-GeneralizedTransformer.bib +++ b/output/a2i2/Hasan2024-GeneralizedTransformer.bib @@ -1,11 +1,11 @@ -@misc{Hasan2024:RadioLinkFailurePrediction, +@article{Hasan2024:RadioLinkFailurePrediction, title = {A Generalized Transformer-based Radio Link Failure Prediction Framework in 5G RANs}, author = {Kazi Hasan and Thomas Trappenberg and Israat Haque}, year = {2024}, - howpublished = {arXiv}, - doi = {10.48550/arxiv.2407.05197}, - url = {https://arxiv.org/abs/2407.05197}, - eprint = {2407.05197}, - archiveprefix = {arXiv}, - primaryclass = {cs.AI} + journal = {IEEE Transactions on Machine Learning in Communications and Networking}, + publisher = {Institute of Electrical and Electronics Engineers (IEEE)}, + volume = {3}, + pages = {710-724}, + doi = {10.1109/tmlcn.2025.3575368}, + url = {https://doi.org/10.1109/tmlcn.2025.3575368} } diff --git a/output/a2i2/Jahan2025-TaxonomyFaults.bib b/output/a2i2/Jahan2025-TaxonomyFaults.bib deleted file mode 100644 index 85c5cdde..00000000 --- a/output/a2i2/Jahan2025-TaxonomyFaults.bib +++ /dev/null @@ -1,6 +0,0 @@ -@misc{Jahan2025:FaultTaxonomyAttentionNetworks, - title = {Taxonomy of Faults in Attention-Based Neural Networks}, - author = {Sigma Jahan and Shalini Singh Rajput and Tushar Sharma and Mohammad Masudur Rahman}, - year = {2025}, - howpublished = {arXiv} -} diff --git a/output/a2i2/Jia2026-SynergizingDigital.bib b/output/a2i2/Jia2026-SynergizingDigital.bib new file mode 100644 index 00000000..fca10580 --- /dev/null +++ b/output/a2i2/Jia2026-SynergizingDigital.bib @@ -0,0 +1,11 @@ +@article{Jia2026:SynergizingDigitalTwinUAV, + title = {Synergizing Digital Twin and UAV for Intelligent Network Recovery and Management in Smart Cities}, + author = {Jia, Dong and Ye, Qiang}, + year = {2026}, + journal = {IEEE Network}, + publisher = {Institute of Electrical and Electronics Engineers (IEEE)}, + pages = {1-10}, + doi = {10.1109/mnet.2026.3695428}, + url = {https://doi.org/10.1109/mnet.2026.3695428}, + issn = {1558-156X} +} diff --git a/output/a2i2/Kate2026-BeyondAccuracy.bib b/output/a2i2/Kate2026-BeyondAccuracy.bib new file mode 100644 index 00000000..b840cdf5 --- /dev/null +++ b/output/a2i2/Kate2026-BeyondAccuracy.bib @@ -0,0 +1,9 @@ +@misc{Kate2026:ReliabilityCrossFarmEvaluation, + title = {Beyond Accuracy: Reliability-Aware Cross-Farm Evaluation of Dairy Cow Vocalization Models}, + author = {Mayuri Kate and Suresh Raja Neethirajan}, + year = {2026}, + howpublished = {openRxiv}, + publisher = {openRxiv}, + doi = {10.64898/2026.06.17.732832}, + url = {https://doi.org/10.64898/2026.06.17.732832} +} diff --git a/output/a2i2/Kate2026-MultiExpert.bib b/output/a2i2/Kate2026-MultiExpert.bib new file mode 100644 index 00000000..b8290ad4 --- /dev/null +++ b/output/a2i2/Kate2026-MultiExpert.bib @@ -0,0 +1,7 @@ +@inproceedings{Kate2026:ExpertFusionAbstention, + title = {Multi-Expert Fusion with Confidence-Aware Abstention for Macro-Behavior Classification of Cow Vocalizations}, + author = {M Kate and S Neethirajan}, + year = {2026}, + booktitle = {39th IEEE Canadian Conference on Electrical and Computer Engineering (CCECE}, + note = {Venue from SerpAPI publication string (unverified)} +} diff --git a/output/a2i2/Kaura2026-NutriPalPersuasive.bib b/output/a2i2/Kaura2026-NutriPalPersuasive.bib new file mode 100644 index 00000000..9eb1ab57 --- /dev/null +++ b/output/a2i2/Kaura2026-NutriPalPersuasive.bib @@ -0,0 +1,10 @@ +@incollection{Kaura2026:NutriPalAI, + title = {NutriPal: A Persuasive System for Promoting Healthy Eating Using Eye-Gaze Detection Technology and Artificial Intelligence}, + author = {Tushant Kaura and Edward Addo and Gladwin Irudayaraj and Josteve Adekanbi and Rita Orji and Oladapo Oyebode}, + year = {2026}, + booktitle = {Digital Human Modeling and Applications in Health, Safety, Ergonomics and Risk Management}, + publisher = {Springer Nature Switzerland}, + pages = {177-194}, + doi = {10.1007/978-3-032-29842-3_13}, + url = {https://doi.org/10.1007/978-3-032-29842-3_13} +} diff --git a/output/a2i2/Keselj2020-StarfishPrototype.bib b/output/a2i2/Keselj2020-StarfishPrototype.bib new file mode 100644 index 00000000..e04beab8 --- /dev/null +++ b/output/a2i2/Keselj2020-StarfishPrototype.bib @@ -0,0 +1,12 @@ +@misc{Keselj2020:StarfishPreprocessEmbed, + title = {Starfish: A Prototype for Universal Preprocessing and Text-Embedded Programming}, + author = {Vlado Keselj}, + year = {2020}, + howpublished = {arXiv}, + doi = {10.48550/arxiv.2007.02366}, + url = {https://arxiv.org/abs/2007.02366}, + eprint = {2007.02366}, + archiveprefix = {arXiv}, + primaryclass = {cs.PL}, + note = {Unenriched: no enrichment sources matched} +} diff --git a/output/a2i2/Kimeu2026-CalmMindAI.bib b/output/a2i2/Kimeu2026-CalmMindAI.bib new file mode 100644 index 00000000..78e72e21 --- /dev/null +++ b/output/a2i2/Kimeu2026-CalmMindAI.bib @@ -0,0 +1,10 @@ +@incollection{Kimeu2026:CalmMindAI, + title = {CalmMind: AI-Driven, Multi-sense, and Adaptive Technology for Managing Mental Fatigue}, + author = {Japheth Mumo Kimeu and Rita Orji and Oladapo Oyebode}, + year = {2026}, + booktitle = {Digital Human Modeling and Applications in Health, Safety, Ergonomics and Risk Management}, + publisher = {Springer Nature Switzerland}, + pages = {195-214}, + doi = {10.1007/978-3-032-29842-3_14}, + url = {https://doi.org/10.1007/978-3-032-29842-3_14} +} diff --git a/output/a2i2/Lodel2026-LearningSemantic.bib b/output/a2i2/Lodel2026-LearningSemantic.bib index 6fdb125d..e743779d 100644 --- a/output/a2i2/Lodel2026-LearningSemantic.bib +++ b/output/a2i2/Lodel2026-LearningSemantic.bib @@ -2,5 +2,9 @@ @misc{Lodel2026:SemanticTargetSearch title = {Learning Semantic Priorities for Autonomous Target Search}, author = {Max Lodel and Nils Wilde and Robert Babuvska and Javier Alonso-Mora}, year = {2026}, - howpublished = {arXiv} + howpublished = {arXiv}, + doi = {10.48550/arxiv.2603.29391}, + url = {https://arxiv.org/abs/2603.29391}, + eprint = {2603.29391}, + archiveprefix = {arXiv} } diff --git a/output/a2i2/Lowe2021-LogicalActivation.bib b/output/a2i2/Lowe2021-LogicalActivation.bib deleted file mode 100644 index 90dabc20..00000000 --- a/output/a2i2/Lowe2021-LogicalActivation.bib +++ /dev/null @@ -1,10 +0,0 @@ -@inproceedings{Lowe2021:LogitBooleanOperators, - title = {Logical Activation Functions: Logit-space equivalents of Probabilistic Boolean Operators}, - author = {Scott C. Lowe and Robert Earle and Jason D'eon and Thomas Trappenberg and Sageev Oore}, - year = {2021}, - booktitle = {Advances in Neural Information Processing Systems 35}, - publisher = {Neural Information Processing Systems Foundation, Inc. (NeurIPS)}, - pages = {29733-29747}, - doi = {10.52202/068431-2156}, - url = {https://doi.org/10.52202/068431-2156} -} diff --git a/output/a2i2/Lowe2021-LogicalActivation_2.bib b/output/a2i2/Lowe2021-LogicalActivation_2.bib deleted file mode 100644 index d1c67b90..00000000 --- a/output/a2i2/Lowe2021-LogicalActivation_2.bib +++ /dev/null @@ -1,6 +0,0 @@ -@misc{Lowe2021:LogitBooleanOperators, - title = {Logical Activation Functions: Logit-space equivalents of Boolean Operators}, - author = {Scott Lowe and Robert Earle and Jason D'eon and Thomas Trappenberg and Sageev Oore}, - year = {2021}, - howpublished = {arXiv} -} diff --git a/output/a2i2/Lowe2022-LogicalActivation.bib b/output/a2i2/Lowe2022-LogicalActivation.bib new file mode 100644 index 00000000..7392927f --- /dev/null +++ b/output/a2i2/Lowe2022-LogicalActivation.bib @@ -0,0 +1,11 @@ +@inproceedings{Lowe2022:LogitBooleanOperators, + title = {Logical Activation Functions: Logit-Space Equivalents of Probabilistic Boolean Operators}, + author = {Scott Lowe and Robert Earle and Jason D'Eon and Thomas Trappenberg and Sageev Oore}, + year = {2022}, + booktitle = {Advances in Neural Information Processing Systems 35}, + publisher = {Neural Information Processing Systems Foundation, Inc. (NeurIPS)}, + pages = {29733-29747}, + doi = {10.52202/068431-2156}, + url = {https://doi.org/10.52202/068431-2156}, + note = {Unenriched: no enrichment sources matched} +} diff --git a/output/a2i2/Lowe2026-BridgingGenerative.bib b/output/a2i2/Lowe2026-BridgingGenerative.bib new file mode 100644 index 00000000..5885366c --- /dev/null +++ b/output/a2i2/Lowe2026-BridgingGenerative.bib @@ -0,0 +1,7 @@ +@inproceedings{Lowe2026:HiddenSelfDistillation, + title = {Bridging Generative and Predictive Paradigms Via Hidden-Self-Distillation}, + author = {SC Lowe and A Fuller and S Oore and E Shelhamer and GW Taylor}, + year = {2026}, + booktitle = {ICLR 2026 Workshop on Multimodal Intelligence}, + note = {Venue from SerpAPI publication string (unverified)} +} diff --git a/output/a2i2/Lowe2026-HiddenLayer.bib b/output/a2i2/Lowe2026-HiddenLayer.bib new file mode 100644 index 00000000..f67c901f --- /dev/null +++ b/output/a2i2/Lowe2026-HiddenLayer.bib @@ -0,0 +1,7 @@ +@inproceedings{Lowe2026:DriftResilientVisuals, + title = {Hidden-Layer Self-Distillation Yields Drift-Resilient Visual Representations}, + author = {SC Lowe and A Fuller and S Oore and GW Taylor and E Shelhamer}, + year = {2026}, + booktitle = {Catch, Adapt, and Operate: Monitoring ML Models Under Drift ICLR Workshop}, + note = {Venue from SerpAPI publication string (unverified)} +} diff --git a/output/a2i2/Lv2020-IntelligentInterference.bib b/output/a2i2/Lv2020-IntelligentInterference.bib index cc7d5e78..6c2aa660 100644 --- a/output/a2i2/Lv2020-IntelligentInterference.bib +++ b/output/a2i2/Lv2020-IntelligentInterference.bib @@ -1,6 +1,9 @@ @misc{Lv2020:IntelligentInterferenceEngineering, - title = {Intelligent Interference Engineering for Secure Non-Orthogonal Multiple Access}, - author = {Lu Lv and Hai Jiang and Zhiguo Ding and Qiang Ye and Naofal Al-Dhahir and Jian Chen}, + title = {Intelligent interference engineering for secure non-orthogonal multiple access}, + author = {L Lv and H Jiang and Z Ding and Q Ye and N Al-Dhahir and J Chen}, year = {2020}, - howpublished = {arXiv} + howpublished = {arXiv}, + url = {https://arxiv.org/abs/2003.13488}, + eprint = {2003.13488}, + archiveprefix = {arXiv} } diff --git a/output/a2i2/Mahato2024-DairyDigiD.bib b/output/a2i2/Mahato2024-DairyDigiD.bib new file mode 100644 index 00000000..224a8754 --- /dev/null +++ b/output/a2i2/Mahato2024-DairyDigiD.bib @@ -0,0 +1,9 @@ +@misc{Mahato2024:DairyBiometricID, + title = {Dairy DigiD A Deep Learning-Based, Non-Invasive Biometric Identification System for Dairy Cattle Using Detectron2}, + author = {Shubhangi Mahato and Hanqing Bi and Suresh Neethirajan}, + year = {2024}, + howpublished = {bioRxiv}, + publisher = {openRxiv}, + doi = {10.1101/2024.12.14.628477}, + url = {https://doi.org/10.1101/2024.12.14.628477} +} diff --git a/output/a2i2/Mayette2026-AssessmentVessel.bib b/output/a2i2/Mayette2026-AssessmentVessel.bib new file mode 100644 index 00000000..114be5ef --- /dev/null +++ b/output/a2i2/Mayette2026-AssessmentVessel.bib @@ -0,0 +1,9 @@ +@article{Mayette2026:WhaleStrikeRisk, + title = {Assessment of vessel strike risk and performance of the Canadian protection measures for North Atlantic right whales in the Gulf of St. Lawrence}, + author = {Alexandra Mayette and Alexandra Krystal Cole and Shiva Jian-Javdan and Gabriel Spadon and Ronald P Pelot and Sean W Brillant}, + year = {2026}, + journal = {Endangered Species Research}, + publisher = {Inter-Research Science Center}, + doi = {10.3354/esr01528}, + url = {https://doi.org/10.3354/esr01528} +} diff --git a/output/a2i2/Mehditabar2026-ValidatedTaxonomy.bib b/output/a2i2/Mehditabar2026-ValidatedTaxonomy.bib index 0a9ca9d9..6b35241b 100644 --- a/output/a2i2/Mehditabar2026-ValidatedTaxonomy.bib +++ b/output/a2i2/Mehditabar2026-ValidatedTaxonomy.bib @@ -1,6 +1,10 @@ -@misc{Mehditabar2026:ValidatedTaxonomySoftwareEnergy, +@misc{Mehditabar2026:SoftwareEnergySmellsTaxonomy, title = {A Validated Taxonomy on Software Energy Smells}, author = {Mohammadjavad Mehditabar and Saurabhsingh Rajput and Tushar Sharma}, year = {2026}, - howpublished = {arXiv} + howpublished = {arXiv}, + doi = {10.48550/arxiv.2604.04809}, + url = {https://arxiv.org/abs/2604.04809}, + eprint = {2604.04809}, + archiveprefix = {arXiv} } diff --git a/output/a2i2/Mianroodi2025-MedSynthRealistic.bib b/output/a2i2/Mianroodi2025-MedSynthRealistic.bib index 117a6a72..af11ecb1 100644 --- a/output/a2i2/Mianroodi2025-MedSynthRealistic.bib +++ b/output/a2i2/Mianroodi2025-MedSynthRealistic.bib @@ -1,6 +1,6 @@ @misc{Mianroodi2025:MedSynthDialogueNotes, title = {MedSynth: Realistic, Synthetic Medical Dialogue-Note Pairs}, - author = {Ahmad Rezaie Mianroodi and Amirali Rezaie and Niko Grisel Todorov and Cyril Rakovski and Frank Rudzicz}, + author = {Ahmad Rezaie Mianroodi and Amirali Rezaie and Niko Grisel Todorov and Nadine A. Friedrich and Maria P Mogollon and Alexander Hernandez-Tirado and Guillermo Lopez Garcia and Cyril Rakovski and Frank Rudzicz}, year = {2025}, howpublished = {arXiv}, doi = {10.48550/arxiv.2508.01401}, diff --git a/output/a2i2/Neethirajan2021-SocialNetwork.bib b/output/a2i2/Neethirajan2021-SocialNetwork.bib index 0fc44287..eb2be5a1 100644 --- a/output/a2i2/Neethirajan2021-SocialNetwork.bib +++ b/output/a2i2/Neethirajan2021-SocialNetwork.bib @@ -1,6 +1,13 @@ -@misc{Neethirajan2021:FarmAnimalSocialNetwork, - title = {Social Network Analysis in Farm Animals: Sensor-Based Approaches. Animals 2021, 11, 434}, - author = {S Neethirajan and B Kemp}, +@article{Neethirajan2021:FarmAnimalSocialNetwork, + title = {Social Network Analysis in Farm Animals: Sensor-Based Approaches}, + author = {Suresh Neethirajan and Bas Kemp}, year = {2021}, + journal = {Animals}, + publisher = {MDPI AG}, + volume = {11}, + number = {2}, + pages = {434}, + doi = {10.3390/ani11020434}, + url = {https://doi.org/10.3390/ani11020434}, note = {Unenriched: no enrichment sources matched} } diff --git a/output/a2i2/Neethirajan2023-DecodingDigital.bib b/output/a2i2/Neethirajan2023-DecodingDigital.bib new file mode 100644 index 00000000..80959719 --- /dev/null +++ b/output/a2i2/Neethirajan2023-DecodingDigital.bib @@ -0,0 +1,9 @@ +@misc{Neethirajan2023:FarmAnimalCognition, + title = {Decoding the Digital Barnyard - Cognitive Computing in Farm Animal Emotions and Welfare}, + author = {Suresh Neethirajan}, + year = {2023}, + howpublished = {Preprints.org}, + publisher = {MDPI AG}, + doi = {10.20944/preprints202309.1714.v1}, + url = {https://doi.org/10.20944/preprints202309.1714.v1} +} diff --git a/output/a2i2/Neethirajan2024-DecodingLanguage.bib b/output/a2i2/Neethirajan2024-DecodingLanguage.bib new file mode 100644 index 00000000..c201b42a --- /dev/null +++ b/output/a2i2/Neethirajan2024-DecodingLanguage.bib @@ -0,0 +1,9 @@ +@misc{Neethirajan2024:DecodingLanguageChickensInnovative, + title = {Decoding the Language of Chickens - An Innovative NLP Approach to Enhance Poultry Welfare}, + author = {Suresh Neethirajan}, + year = {2024}, + howpublished = {bioRxiv}, + publisher = {openRxiv}, + doi = {10.1101/2024.04.29.591707}, + url = {https://doi.org/10.1101/2024.04.29.591707} +} diff --git a/output/a2i2/Neethirajan2026-DigitalisationHealth.bib b/output/a2i2/Neethirajan2026-DigitalisationHealth.bib new file mode 100644 index 00000000..33392143 --- /dev/null +++ b/output/a2i2/Neethirajan2026-DigitalisationHealth.bib @@ -0,0 +1,7 @@ +@inproceedings{Neethirajan2026:PoultryDigitalHealth, + title = {Digitalisation and Health in Poultry Production: From Precision Animal Husbandry to Smart Systems}, + author = {S Neethirajan}, + year = {2026}, + booktitle = {The 6th International Poultry Congress (Digitalisation and Health in Poultry}, + note = {Venue from SerpAPI publication string (unverified)} +} diff --git a/output/a2i2/Novikova2022-SystemMethod.bib b/output/a2i2/Novikova2022-SystemMethod.bib new file mode 100644 index 00000000..80fd3bff --- /dev/null +++ b/output/a2i2/Novikova2022-SystemMethod.bib @@ -0,0 +1,6 @@ +@misc{Novikova2022:SpeechAlzheimerDetection, + title = {System and method for alzheimer's disease detection from speech}, + author = {J Novikova and A Balagopalan and J Robin and F Rudzicz}, + year = {2022}, + note = {US Patent 17/320,992} +} diff --git a/output/a2i2/Oore2024-ExplicitSolutions.bib b/output/a2i2/Oore2024-ExplicitSolutions.bib new file mode 100644 index 00000000..487ac480 --- /dev/null +++ b/output/a2i2/Oore2024-ExplicitSolutions.bib @@ -0,0 +1,12 @@ +@article{Oore2024:EllipticHoleCartesianSolution, + title = {Explicit solutions in Cartesian coordinates for an elliptic hole in an infinite elastic plate}, + author = {Mordecai Oore and Sageev Oore}, + year = {2024}, + journal = {Mathematics and Mechanics of Solids}, + publisher = {SAGE Publications}, + volume = {30}, + number = {3}, + pages = {765-791}, + doi = {10.1177/10812865241249751}, + url = {https://doi.org/10.1177/10812865241249751} +} diff --git a/output/a2i2/Oore2025-LoopyFramework.bib b/output/a2i2/Oore2025-LoopyFramework.bib new file mode 100644 index 00000000..4d11d081 --- /dev/null +++ b/output/a2i2/Oore2025-LoopyFramework.bib @@ -0,0 +1,7 @@ +@inproceedings{Oore2025:RealtimeAICollaboration, + title = {A Loopy Framework and Tool for Real-time Human-AI Music Collaboration}, + author = {S Oore and F Miller and CS Sastry and SH Dumpala and MF Da Silva and D Oore and SC Lowe}, + year = {2025}, + booktitle = {NeurIPS Workshop on AI for Music}, + note = {Venue from SerpAPI publication string (unverified)} +} diff --git a/output/a2i2/Oore2025-MeasurementPersonal.bib b/output/a2i2/Oore2025-MeasurementPersonal.bib index a514d32f..9d848ec7 100644 --- a/output/a2i2/Oore2025-MeasurementPersonal.bib +++ b/output/a2i2/Oore2025-MeasurementPersonal.bib @@ -1,11 +1,13 @@ @article{Oore2025:SpeechMovementRhythm, title = {Measurement of Personal Rhythm From Speech and Movement}, - author = {Sageev Oore and Jason D'eon and Mayank Ramchandani and Sri Harsha Dumpala and Chandramouli Sastry and Jane Foster and Benicio Frey and Kate Harkness and Sidney Kennedy and Raymond W. Lam and Qingqin Li and Roumen Milev and Abraham Nunes and Lena Quilty and Susan Rotzinger and Frank Rudzicz and Claudio Soares and Valerie H. Taylor and Gustavo Turecki and Rudolf Uher}, + author = {Oore, Sageev and D'eon, Jason and Ramchandani, Mayank and Dumpala, Sri Harsha and Sastry, Chandramouli and Foster, Jane and Frey, Benicio and Harkness, Kate and Kennedy, Sidney and Lam, Raymond W. and Li, Qingqin and Milev, Roumen and Nunes, Abraham and Quilty, Lena and Rotzinger, Susan and Rudzicz, Frank and Soares, Claudio and Taylor, Valerie H. and Turecki, Gustavo and Uher, Rudolf}, year = {2025}, journal = {Biological Psychiatry}, publisher = {Elsevier BV}, volume = {97}, number = {9}, doi = {10.1016/j.biopsych.2025.02.114}, - url = {https://doi.org/10.1016/j.biopsych.2025.02.114} + url = {https://doi.org/10.1016/j.biopsych.2025.02.114}, + issn = {0006-3223}, + month = {May} } diff --git a/output/a2i2/Oore2025-RobustPersonalized.bib b/output/a2i2/Oore2025-RobustPersonalized.bib new file mode 100644 index 00000000..0436afb0 --- /dev/null +++ b/output/a2i2/Oore2025-RobustPersonalized.bib @@ -0,0 +1,7 @@ +@inproceedings{Oore2025:SmartLooperCollaboration, + title = {Robust Personalized Human-AI Collaboration with SmartLooper}, + author = {S Oore and F Miller and CS Sastry and SH Dumpala and MF Da Silva and D Oore and SC Lowe}, + year = {2025}, + booktitle = {NeurIPS Workshop on AI for Music}, + note = {Venue from SerpAPI publication string (unverified)} +} diff --git a/output/a2i2/Oyebode2020-DeconstructingPersuasive.bib b/output/a2i2/Oyebode2020-DeconstructingPersuasive.bib index ddfd1cbe..34818e5c 100644 --- a/output/a2i2/Oyebode2020-DeconstructingPersuasive.bib +++ b/output/a2i2/Oyebode2020-DeconstructingPersuasive.bib @@ -1,6 +1,7 @@ @inproceedings{Oyebode2020:DeconstructingPersuasiveStrategiesMental, title = {Deconstructing Persuasive Strategies in Mental Health Apps Based on User Reviews using Natural Language Processing}, - author = {Oladapo Oyebode and Rita Orji}, + author = {O Oyebode and R Orji}, year = {2020}, - booktitle = {Behavior Change Support Systems Workshop} + booktitle = {8th International Workshop on Behavior Change Support Systems organized}, + note = {Venue from SerpAPI publication string (unverified)} } diff --git a/output/a2i2/Padmanabhan2026-SatelliteConstrained.bib b/output/a2i2/Padmanabhan2026-SatelliteConstrained.bib new file mode 100644 index 00000000..55c0922f --- /dev/null +++ b/output/a2i2/Padmanabhan2026-SatelliteConstrained.bib @@ -0,0 +1,7 @@ +@inproceedings{Padmanabhan2026:SatelliteN2OInference, + title = {Satellite-Constrained Spatial Inference Framework for Livestock N2O Emission Estimation}, + author = {P Padmanabhan and K Ragunath and S Neethirajan}, + year = {2026}, + booktitle = {Proceedings of the 39th IEEE Canadian Conference on Electrical and Computer}, + note = {Venue from SerpAPI publication string (unverified)} +} diff --git a/output/Neethirajan (8VZwF0sAAAAJ)/Parivendan2025-BeyondProximity.bib b/output/a2i2/Parivendan2026-BeyondProximityKeypoint.bib similarity index 55% rename from output/Neethirajan (8VZwF0sAAAAJ)/Parivendan2025-BeyondProximity.bib rename to output/a2i2/Parivendan2026-BeyondProximityKeypoint.bib index 364f4164..7284ff93 100644 --- a/output/Neethirajan (8VZwF0sAAAAJ)/Parivendan2025-BeyondProximity.bib +++ b/output/a2i2/Parivendan2026-BeyondProximityKeypoint.bib @@ -1,9 +1,12 @@ -@misc{Parivendan2025:KeypointTrajectoryClassification, +@misc{Parivendan2026:KeypointTrajectoryClassification, title = {Beyond Proximity: A Keypoint-Trajectory Framework for Classifying Affiliative and Agonistic Social Networks in Dairy Cattle}, author = {Sibi Parivendan and Kashfia Sailunaz and Suresh Neethirajan}, - year = {2025}, - howpublished = {Zenodo (CERN European Organization for Nuclear Research)}, + year = {2026}, + howpublished = {Zenodo}, publisher = {Zenodo}, doi = {10.5281/zenodo.18418182}, - url = {https://doi.org/10.5281/zenodo.18418182} + url = {https://arxiv.org/abs/2512.14998}, + eprint = {2512.14998}, + archiveprefix = {arXiv}, + primaryclass = {cs.CV} } diff --git a/output/a2i2/Parivendan2026-TemporalModeling.bib b/output/a2i2/Parivendan2026-TemporalModeling.bib new file mode 100644 index 00000000..82358df7 --- /dev/null +++ b/output/a2i2/Parivendan2026-TemporalModeling.bib @@ -0,0 +1,7 @@ +@inproceedings{Parivendan2026:CowKeypointTrajectoryModeling, + title = {Temporal Modeling of Keypoint-Trajectory Interactions of Dairy Cows under Data and Compute Constraints}, + author = {K Parivendan and S. and Sailunaz and S Neethirajan}, + year = {2026}, + booktitle = {39th IEEE Canadian Conference on Electrical and Computer Engineering (CCECE}, + note = {Venue from SerpAPI publication string (unverified)} +} diff --git a/output/a2i2/Patel2026-CowPainCheckTemporal.bib b/output/a2i2/Patel2026-CowPainCheckTemporal.bib new file mode 100644 index 00000000..28bcbf0d --- /dev/null +++ b/output/a2i2/Patel2026-CowPainCheckTemporal.bib @@ -0,0 +1,7 @@ +@inproceedings{Patel2026:CowPainCheckTemporalDeepLearning, + title = {CowPainCheck: Temporal Deep Learning for Postoperative Pain Detection in Cattle with Edge-Fog-Cloud Deployment Considerations}, + author = {S Patel and Spl Luna and S Neethirajan}, + year = {2026}, + booktitle = {Proceedings of the 39th IEEE Canadian Conference on Electrical and Computer}, + note = {Venue from SerpAPI publication string (unverified)} +} diff --git a/output/a2i2/Patel2026-ProtocolGuided.bib b/output/a2i2/Patel2026-ProtocolGuided.bib new file mode 100644 index 00000000..15e75544 --- /dev/null +++ b/output/a2i2/Patel2026-ProtocolGuided.bib @@ -0,0 +1,9 @@ +@misc{Patel2026:BovinePainTransferLearning, + title = {Protocol-Guided Cross-Domain Transfer Learning for Bovine Facial Pain Recognition under Weak Dairy-Farm Labels}, + author = {Shivam Patel and Suresh Neethirajan}, + year = {2026}, + howpublished = {openRxiv}, + publisher = {openRxiv}, + doi = {10.64898/2026.06.18.733162}, + url = {https://doi.org/10.64898/2026.06.18.733162} +} diff --git a/output/a2i2/Qin2026-HypothesisGeneration.bib b/output/a2i2/Qin2026-HypothesisGeneration.bib index 67515d43..239bac3a 100644 --- a/output/a2i2/Qin2026-HypothesisGeneration.bib +++ b/output/a2i2/Qin2026-HypothesisGeneration.bib @@ -1,6 +1,11 @@ @misc{Qin2026:HypothesisInferenceModels, title = {Hypothesis Generation and Inductive Inference in Children and Language Models}, - author = {Jeffrey Qin and Wasu Top Piriyakulki and Zhuangfei Gao and Mia Radovanovic and Jessica Sommerville and Kevin Ellis and Marta Kryven}, + author = {Jeffrey Qin and Wasu Top Piriyakulkij and Zhuangfei Gao and Mia Radovanovic and Jessica Sommerville and Kevin Ellis and Marta Kryven}, year = {2026}, - howpublished = {arXiv} + howpublished = {arXiv}, + doi = {10.48550/arxiv.2605.24528}, + url = {https://arxiv.org/abs/2605.24528}, + eprint = {2605.24528}, + archiveprefix = {arXiv}, + primaryclass = {cs.AI} } diff --git a/output/a2i2/Rahman2021-SystematicLiterature.bib b/output/a2i2/Rahman2021-SystematicLiterature.bib deleted file mode 100644 index 01363625..00000000 --- a/output/a2i2/Rahman2021-SystematicLiterature.bib +++ /dev/null @@ -1,6 +0,0 @@ -@misc{Rahman2021:CodeSearchReformulation, - title = {A Systematic Literature Review of Automated Query Reformulations in Source Code Search}, - author = {MM Rahman and CK Roy}, - year = {2021}, - howpublished = {arXiv} -} diff --git a/output/a2i2/Rahman2026-BePartner.bib b/output/a2i2/Rahman2026-BePartner.bib index 835750fb..27ac0414 100644 --- a/output/a2i2/Rahman2026-BePartner.bib +++ b/output/a2i2/Rahman2026-BePartner.bib @@ -3,6 +3,7 @@ @misc{Rahman2026:AcademiaIndustryBridge author = {Mohammad Masudur Rahman and Mehil B. Shah}, year = {2026}, howpublished = {arXiv}, + doi = {10.48550/arxiv.2604.16315}, url = {https://arxiv.org/abs/2604.16315}, eprint = {2604.16315}, archiveprefix = {arXiv} diff --git a/output/a2i2/Rajput2023-FECoMStep.bib b/output/a2i2/Rajput2023-FECoMStep.bib new file mode 100644 index 00000000..501ba36f --- /dev/null +++ b/output/a2i2/Rajput2023-FECoMStep.bib @@ -0,0 +1,9 @@ +@misc{Rajput2023:FineGrainedEnergyMeasurement, + title = {FECoM: A Step towards Fine-Grained Energy Measurement for Deep Learning}, + author = {S Rajput and T Widmayer and Z Shang and M Kechagia and F Sarro and T Sharma}, + year = {2023}, + howpublished = {arXiv}, + url = {https://arxiv.org/abs/2308.12264}, + eprint = {2308.12264}, + archiveprefix = {arXiv} +} diff --git a/output/a2i2/Rajput2026-CodeGreenTowards.bib b/output/a2i2/Rajput2026-CodeGreenTowards.bib index 0b7a4899..876579e0 100644 --- a/output/a2i2/Rajput2026-CodeGreenTowards.bib +++ b/output/a2i2/Rajput2026-CodeGreenTowards.bib @@ -3,6 +3,7 @@ @misc{Rajput2026:CodeGreenTowardsImprovingPrecision author = {Saurabhsingh Rajput and Tushar Sharma}, year = {2026}, howpublished = {arXiv}, + publisher = {Zenodo}, doi = {10.48550/arxiv.2603.17924}, url = {https://arxiv.org/abs/2603.17924}, eprint = {2603.17924}, diff --git a/output/a2i2/Rao2026-RealTime.bib b/output/a2i2/Rao2026-RealTime.bib new file mode 100644 index 00000000..ba2d2df5 --- /dev/null +++ b/output/a2i2/Rao2026-RealTime.bib @@ -0,0 +1,7 @@ +@inproceedings{Rao2026:DairyActivityTwin, + title = {Real-Time Identity-Preserving Dairy Cow Activity Recognition for Nutritional Digital Twin Inference}, + author = {S Rao and S Neethirajan}, + year = {2026}, + booktitle = {Proceedings of the 39th IEEE Canadian Conference on Electrical and Computer}, + note = {Venue from SerpAPI publication string (unverified)} +} diff --git a/output/a2i2/Rizwan2026-PersistentEffects.bib b/output/a2i2/Rizwan2026-PersistentEffects.bib new file mode 100644 index 00000000..fc8053ad --- /dev/null +++ b/output/a2i2/Rizwan2026-PersistentEffects.bib @@ -0,0 +1,10 @@ +@misc{Rizwan2026:PersistentEffectsLexicalityLarge, + title = {On the Persistent Effects of Lexicality in Large Language Models}, + author = {H Rizwan and MU Haider and N Subramani and MT Diab and AB Siddique and H Sajjad}, + year = {2026}, + howpublished = {arXiv}, + doi = {10.48550/arxiv.2606.02750}, + url = {https://arxiv.org/abs/2606.02750}, + eprint = {2606.02750}, + archiveprefix = {arXiv} +} diff --git a/output/a2i2/Robertson2026-BrainAtrophy.bib b/output/a2i2/Robertson2026-BrainAtrophy.bib index cba419b6..37b29c64 100644 --- a/output/a2i2/Robertson2026-BrainAtrophy.bib +++ b/output/a2i2/Robertson2026-BrainAtrophy.bib @@ -3,7 +3,7 @@ @misc{Robertson2026:BrainAtrophySpinocerebellarAtaxia author = {Jason W. Robertson and Isaac Adanyeguh and Tetsuo Ashizawa and Benjamin Bender and Fernando Cendes and Giulia Coarelli and Andreas Deistung and Stefano Diciotti and Alexandra Durr and Jennifer Faber and Marcondes C. Franca and Sophia L Goricke and Marina Grisoli and James M. Joers and Thomas Klockgether and Christophe Lenglet and Caterina Mariotti and Alberto R. M. Martinez and Chiara Marzi and Mario Mascalchi and Anna Nigri and Gulin Oz and Henry Paulson and Maria J. Rakowicz and Kathrin Reetz and Thiago JR Rezende and Lidia Sarro and Ludger Schols and Matthis Synofzik and Dagmar Timmann and Sophia I Thomopoulos and Paul M Thompson and Bart Van De Warrenburg and Carlos R. Hernandez-Castillo and Ian H. Harding}, year = {2026}, howpublished = {medRxiv}, - publisher = {Cold Spring Harbor Laboratory}, + publisher = {openRxiv}, doi = {10.64898/2026.04.22.26351550}, url = {https://doi.org/10.64898/2026.04.22.26351550} } diff --git a/output/a2i2/Saad2025-HierarchicalEvaluationSoftware.bib b/output/a2i2/Saad2025-HierarchicalEvaluationSoftware.bib new file mode 100644 index 00000000..32d3e5a2 --- /dev/null +++ b/output/a2i2/Saad2025-HierarchicalEvaluationSoftware.bib @@ -0,0 +1,10 @@ +@misc{Saad2025:HierarchicalEvaluationSoftwareDesign, + title = {Hierarchical Evaluation of Software Design Capabilities of Large Language Models of Code}, + author = {Mootez Saad and Boqi Chen and Jose Antonio Hernandez Lopez and Daniel Varro and Tushar Sharma}, + year = {2025}, + howpublished = {arXiv}, + doi = {10.48550/arxiv.2511.20933}, + url = {https://arxiv.org/abs/2511.20933}, + eprint = {2511.20933}, + archiveprefix = {arXiv} +} diff --git a/output/a2i2/Sajjad2020-PoorMan.bib b/output/a2i2/Sajjad2020-PoorMan.bib index 6f9efc12..35f09143 100644 --- a/output/a2i2/Sajjad2020-PoorMan.bib +++ b/output/a2i2/Sajjad2020-PoorMan.bib @@ -1,7 +1,6 @@ -@misc{Sajjad2020:LeanTransformers, +@misc{Sajjad2020:SmallerFasterTransformers, title = {Poor Man's BERT: Smaller and Faster Transformer Models}, author = {Hassan Sajjad and Fahim Dalvi and Nadir Durrani and Preslav Nakov}, year = {2020}, - howpublished = {arXiv}, - note = {Unenriched: no enrichment sources matched} + howpublished = {arXiv} } diff --git a/output/a2i2/Sajjad2025-InterpretingEffects.bib b/output/a2i2/Sajjad2025-InterpretingEffects.bib index 1dfa122a..8f708ca6 100644 --- a/output/a2i2/Sajjad2025-InterpretingEffects.bib +++ b/output/a2i2/Sajjad2025-InterpretingEffects.bib @@ -1,9 +1,10 @@ -@misc{Sajjad2025:InterpretingEffectsQuantizationLLMs, +@inproceedings{Sajjad2025:InterpretingEffectsQuantizationLLMs, title = {Interpreting the Effects of Quantization on LLMs}, author = {Hassan Sajjad and Manpreet Singh}, year = {2025}, - howpublished = {Underline Science}, + booktitle = {Proceedings of the 14th International Joint Conference on Natural Language Processing and the 4th Conference of the Asia-Pacific Chapter of the Association for Computational Linguistics}, publisher = {Underline Science Inc.}, - doi = {10.48448/1vag-qn48}, - url = {https://doi.org/10.48448/1vag-qn48} + pages = {2267-2281}, + doi = {10.18653/v1/2025.ijcnlp-long.123}, + url = {https://doi.org/10.18653/v1/2025.ijcnlp-long.123} } diff --git a/output/a2i2/Saqur2024-FilteredNot.bib b/output/a2i2/Saqur2024-FilteredNot.bib new file mode 100644 index 00000000..6c8950e7 --- /dev/null +++ b/output/a2i2/Saqur2024-FilteredNot.bib @@ -0,0 +1,9 @@ +@inproceedings{Saqur2024:FilteredNotMixedStochastic, + title = {Filtered not Mixed: Stochastic Filtering-Based Online Gating for Mixture of Large Language Models}, + author = {Raeid Saqur and Anastasis Kratsios and Blanka Horvath and Jacob-Junqi Tian and John Willes and Florian Krach and Yannick Limmer and Frank Rudzicz}, + year = {2024}, + booktitle = {International Conference on Learning Representations}, + publisher = {Elsevier BV}, + doi = {10.2139/ssrn.4856254}, + url = {https://doi.org/10.2139/ssrn.4856254} +} diff --git a/output/a2i2/Saqur2025-FilteredNot.bib b/output/a2i2/Saqur2025-FilteredNot.bib deleted file mode 100644 index 833d1b5c..00000000 --- a/output/a2i2/Saqur2025-FilteredNot.bib +++ /dev/null @@ -1,6 +0,0 @@ -@inproceedings{Saqur2025:FilteredNotMixedFiltering, - title = {Filtered not Mixed: Filtering-Based Online Gating for Mixture of Large Language Models}, - author = {Raeid Saqur and Anastasis Kratsios and Florian Krach and Yannick Limmer and Blanka Horvath and Frank Rudzicz}, - year = {2025}, - booktitle = {International Conference on Learning Representations} -} diff --git a/output/a2i2/Saqur2026-SeekingSOTA.bib b/output/a2i2/Saqur2026-SeekingSOTA.bib index eea63a8f..8e29c865 100644 --- a/output/a2i2/Saqur2026-SeekingSOTA.bib +++ b/output/a2i2/Saqur2026-SeekingSOTA.bib @@ -2,5 +2,9 @@ @misc{Saqur2026:TaxonomyForecastingEvaluation title = {Seeking SOTA: Time-Series Forecasting Must Adopt Taxonomy-Specific Evaluation to Dispel Illusory Gains}, author = {Raeid Saqur and Christoph Bergmeir and Blanka Horvath and Daniel Erwin Schmidt and Frank Rudzicz and Terry Lyons}, year = {2026}, - howpublished = {arXiv} + howpublished = {arXiv}, + doi = {10.48550/arxiv.2603.15506}, + url = {https://arxiv.org/abs/2603.15506}, + eprint = {2603.15506}, + archiveprefix = {arXiv} } diff --git a/output/a2i2/Sastry2020-ZeroShot.bib b/output/a2i2/Sastry2020-ZeroShot.bib new file mode 100644 index 00000000..44dc3aaf --- /dev/null +++ b/output/a2i2/Sastry2020-ZeroShot.bib @@ -0,0 +1,6 @@ +@misc{Sastry2020:ZeroShotOutDistribution, + title = {Zero-shot out-of-distribution detection with feature correlations}, + author = {CS Sastry and S Oore}, + year = {2020}, + note = {Unenriched: no enrichment sources matched} +} diff --git a/output/a2i2/Senthilkumar2025-IlluminatingBovine.bib b/output/a2i2/Senthilkumar2025-IlluminatingBovine.bib index 091a7a0f..477dd0dc 100644 --- a/output/a2i2/Senthilkumar2025-IlluminatingBovine.bib +++ b/output/a2i2/Senthilkumar2025-IlluminatingBovine.bib @@ -1,9 +1,10 @@ @misc{Senthilkumar2025:BovineCardioImaging, title = {Illuminating Bovine Cardiovascular Risks: A Hybrid Deep Learning and Biomarker Framework Using Retinal Imaging}, - author = {Chamirti Senthilkumar and Nikeeta Ramkumar and Sindhu C and G Vadivu and Suresh Neethirajan}, + author = {Senthilkumar, Chamirti and Ramkumar, Nikeeta and C, Sindhu and Vadivu, G and Neethirajan, Suresh}, year = {2025}, howpublished = {Preprints.org}, publisher = {MDPI AG}, doi = {10.20944/preprints202505.1847.v1}, - url = {https://doi.org/10.20944/preprints202505.1847.v1} + url = {https://doi.org/10.20944/preprints202505.1847.v1}, + month = {May} } diff --git a/output/a2i2/Shu2020-AdventuresFlatland.bib b/output/a2i2/Shu2020-AdventuresFlatland.bib index 20d19e6f..bf51dd66 100644 --- a/output/a2i2/Shu2020-AdventuresFlatland.bib +++ b/output/a2i2/Shu2020-AdventuresFlatland.bib @@ -1,5 +1,7 @@ -@misc{Shu2020:SocialDynamicsPerception, +@inproceedings{Shu2020:SocialDynamicsPerception, title = {Adventures in Flatland: Perceiving Social Interactions Under Physical Dynamics}, author = {Tianmin Shu and Marta Kryven and Tomer Ullman and Josh Tenenbaum}, - year = {2020} + year = {2020}, + booktitle = {Proceedings of the Annual Meeting of the Cognitive Science Society 42}, + note = {Venue from SerpAPI publication string (unverified)} } diff --git a/output/a2i2/Silva2026-GeneralizingGeometry.bib b/output/a2i2/Silva2026-GeneralizingGeometry.bib deleted file mode 100644 index 2b5b6abc..00000000 --- a/output/a2i2/Silva2026-GeneralizingGeometry.bib +++ /dev/null @@ -1,5 +0,0 @@ -@misc{Silva2026:FrechetGeometryMerge, - title = {Generalizing the Geometry of Model Merging Through Frechet Averages}, - author = {MF Da Silva and M Adnan and F Dangel and S Oore}, - year = {2026} -} diff --git a/output/a2i2/Silva2026-GeometricView.bib b/output/a2i2/Silva2026-GeometricView.bib new file mode 100644 index 00000000..8ed969fc --- /dev/null +++ b/output/a2i2/Silva2026-GeometricView.bib @@ -0,0 +1,10 @@ +@misc{Silva2026:ModelGeometryFrechet, + title = {Generalizing the Geometry of Model Merging Through Frechet Averages}, + author = {MF Da Silva and M Adnan and F Dangel and S Oore}, + year = {2026}, + howpublished = {arXiv}, + doi = {10.48550/arxiv.2604.27155}, + url = {https://arxiv.org/abs/2604.27155}, + eprint = {2604.27155}, + archiveprefix = {arXiv} +} diff --git a/output/a2i2/Song2026-MoCoAIS.bib b/output/a2i2/Song2026-MoCoAIS.bib new file mode 100644 index 00000000..ab190285 --- /dev/null +++ b/output/a2i2/Song2026-MoCoAIS.bib @@ -0,0 +1,11 @@ +@misc{Song2026:MoCoAISContrastiveLearning, + title = {MoCo-AIS: A Contrastive Learning Framework for Similarity Computation of Vessel Trajectories}, + author = {R Song and MM Alam and Z Sadeghi and A Soares and JF Rodrigues-Jr and G Spadon}, + year = {2026}, + howpublished = {arXiv}, + doi = {10.48550/arxiv.2606.17978}, + url = {https://arxiv.org/abs/2606.17978}, + eprint = {2606.17978}, + archiveprefix = {arXiv}, + primaryclass = {cs.AI} +} diff --git a/output/a2i2/Spadon2023-BuildingSafer.bib b/output/a2i2/Spadon2023-BuildingSafer.bib new file mode 100644 index 00000000..58c82880 --- /dev/null +++ b/output/a2i2/Spadon2023-BuildingSafer.bib @@ -0,0 +1,10 @@ +@misc{Spadon2023:MaritimeTrajectoryForecasting, + title = {Building a Safer Maritime Environment Through Multi-Path Long-Term Vessel Trajectory Forecasting}, + author = {Gabriel Spadon and Jay Kumar and Matthew Smith and Sarah Vela and Romina Gehrmann and Derek Eden and Joshua Van Berkel and Amilcar Soares and Ronan Fablet and Ronald Pelot and Stan Matwin}, + year = {2023}, + howpublished = {arXiv}, + url = {https://arxiv.org/abs/2310.18948}, + eprint = {2310.18948}, + archiveprefix = {arXiv}, + note = {Unenriched: no enrichment sources matched} +} diff --git a/output/a2i2/Spadon2024-GravityInformed.bib b/output/a2i2/Spadon2024-GravityInformed.bib new file mode 100644 index 00000000..0264fcb9 --- /dev/null +++ b/output/a2i2/Spadon2024-GravityInformed.bib @@ -0,0 +1,11 @@ +@misc{Spadon2024:GravityShipInvasionRisk, + title = {Gravity-Informed Deep Learning Framework for Predicting Ship Traffic Flow and Invasion Risk of Non-Indigenous Species via Ballast Water Discharge}, + author = {Gabriel Spadon and Ruixin Song and Ronald Pelot and Stan Matwin and Amilcar Soares}, + year = {2024}, + howpublished = {Research Square}, + publisher = {Springer Science and Business Media LLC}, + doi = {10.21203/rs.3.rs-3917933/v1}, + url = {https://doi.org/10.21203/rs.3.rs-3917933/v1}, + eprint = {2401.13098}, + archiveprefix = {arXiv} +} diff --git a/output/a2i2/Wang2026-DOCAttackData.bib b/output/a2i2/Wang2026-DOCAttackData.bib new file mode 100644 index 00000000..c8ea27d9 --- /dev/null +++ b/output/a2i2/Wang2026-DOCAttackData.bib @@ -0,0 +1,10 @@ +@article{Wang2026:DOCAttack, + title = {DOCAttack: Data-Oriented Community Attack in Decentralized Federated Learning}, + author = {X Wang and Y Chen and Q Ye and J Son and OA Dobre}, + year = {2026}, + journal = {IEEE Transactions on Network Science and Engineering}, + publisher = {Institute of Electrical and Electronics Engineers (IEEE)}, + pages = {1-18}, + doi = {10.1109/tnse.2026.3702609}, + url = {https://doi.org/10.1109/tnse.2026.3702609} +} diff --git a/output/a2i2/Wiafe2026-DesigningAI.bib b/output/a2i2/Wiafe2026-DesigningAI.bib new file mode 100644 index 00000000..9c6a1e43 --- /dev/null +++ b/output/a2i2/Wiafe2026-DesigningAI.bib @@ -0,0 +1,10 @@ +@inproceedings{Wiafe2026:DesigningAIAssistedSpeech, + title = {Designing an AI-Assisted Speech-Based Interactive System for Home-Based Sentence Practice for Children}, + author = {Elizabeth Wiafe and Frank Rudzicz and Lizbeth Escobedo}, + year = {2026}, + booktitle = {Anais da XII Conferencia Latino-Americana de Interacao Humano-Computador (CLIHC 2026)}, + publisher = {Sociedade Brasileira de Computacao}, + pages = {156-160}, + doi = {10.5753/clihc.2026.21174}, + url = {https://doi.org/10.5753/clihc.2026.21174} +} diff --git a/output/a2i2/Wilde2020-SpecifyingUser.bib b/output/a2i2/Wilde2020-SpecifyingUser.bib index 02512974..0bc8ee28 100644 --- a/output/a2i2/Wilde2020-SpecifyingUser.bib +++ b/output/a2i2/Wilde2020-SpecifyingUser.bib @@ -3,5 +3,6 @@ @phdthesis{Wilde2020:UserPreferenceLearningSpecifying author = {Nils Wilde}, year = {2020}, howpublished = {UWSpace (University of Waterloo)}, + note = {Unenriched: no enrichment sources matched}, school = {UWSpace (University of Waterloo)} } diff --git a/output/a2i2/Wong2026-LangFIRDiscovering.bib b/output/a2i2/Wong2026-LangFIRDiscovering.bib index cb267a82..cf7ece3f 100644 --- a/output/a2i2/Wong2026-LangFIRDiscovering.bib +++ b/output/a2i2/Wong2026-LangFIRDiscovering.bib @@ -2,5 +2,9 @@ @misc{Wong2026:LangFIRDiscoveringSparseLanguage title = {LangFIR: Discovering Sparse Language-Specific Features from Monolingual Data for Language Steering}, author = {SH Wong and H Sajjad and AB Siddique}, year = {2026}, - howpublished = {arXiv} + howpublished = {arXiv}, + doi = {10.48550/arxiv.2604.03532}, + url = {https://arxiv.org/abs/2604.03532}, + eprint = {2604.03532}, + archiveprefix = {arXiv} } diff --git a/output/a2i2/Youngshand2020-CharacterizationTotal.bib b/output/a2i2/Youngshand2020-CharacterizationTotal.bib index d9cdda50..8516324d 100644 --- a/output/a2i2/Youngshand2020-CharacterizationTotal.bib +++ b/output/a2i2/Youngshand2020-CharacterizationTotal.bib @@ -1,5 +1,8 @@ -@misc{Youngshand2020:KneeArthroplastyVariability, +@inproceedings{Youngshand2020:KneeArthroplastyVariability, title = {Characterization of Total Knee Arthroplasty Patient: Clinical and Biomechanical Variability by Cluster Analysis}, author = {Kathryn L. Young-Shand and Peter Van Roy and Abidi S.s.r. and Michael Dunbar and Wilson J. Astephen}, - year = {2020} + year = {2020}, + booktitle = {Orthopaedic Proceedings 102 (SUPP_1)}, + pages = {141-141}, + note = {Venue from SerpAPI publication string (unverified)} } diff --git a/output/a2i2/Yu2021-UnpackingComputations.bib b/output/a2i2/Yu2021-UnpackingComputations.bib index 457be780..9fef4b18 100644 --- a/output/a2i2/Yu2021-UnpackingComputations.bib +++ b/output/a2i2/Yu2021-UnpackingComputations.bib @@ -1,5 +1,6 @@ @misc{Yu2021:SpatialSearchUncertainty, title = {Unpacking the computations of human spatial search under uncertainty: noisy utility maximization, discounting, and probability warping}, author = {Suhyoun Yu and Marta Kryven and Josh Tenenbaum and Max Kleiman-Weiner}, - year = {2021} + year = {2021}, + note = {Unenriched: no enrichment sources matched} } diff --git a/output/a2i2/Zhu2023-SituatedNatural.bib b/output/a2i2/Zhu2023-SituatedNatural.bib index 6af8d867..518f9fa8 100644 --- a/output/a2i2/Zhu2023-SituatedNatural.bib +++ b/output/a2i2/Zhu2023-SituatedNatural.bib @@ -6,5 +6,6 @@ @misc{Zhu2023:SituatedNLExplanations doi = {10.48550/arxiv.2308.14115}, url = {https://arxiv.org/abs/2308.14115}, eprint = {2308.14115}, - archiveprefix = {arXiv} + archiveprefix = {arXiv}, + primaryclass = {cs.CL} } diff --git a/output/badges.json b/output/badges.json index a72a3f13..20800818 100644 --- a/output/badges.json +++ b/output/badges.json @@ -1,8 +1,8 @@ { - "last_updated": "2026-06", - "cache_positive_hits": 3299, - "cache_negative_hits": 3368, - "cache_misses": 1779, - "total_queries": 8446, - "hit_rate": 78.9 + "last_updated": "2026-07", + "cache_positive_hits": 3489, + "cache_negative_hits": 3067, + "cache_misses": 2159, + "total_queries": 8715, + "hit_rate": 75.2 } \ No newline at end of file diff --git a/output/baseline.json b/output/baseline.json index c1b10aa3..7104c65d 100644 --- a/output/baseline.json +++ b/output/baseline.json @@ -1,70 +1,70 @@ { - "total": 3565, + "total": 3669, "authors": { "Abidi (fzr2PUYAAAAJ)": 59, "Arnold (NsIbm80AAAAJ)": 11, "Aziz (45cx9u8AAAAJ)": 0, - "Beiko (OmUy3vUAAAAJ)": 32, + "Beiko (OmUy3vUAAAAJ)": 34, "Blustein (7g6iU9QAAAAJ)": 12, "Bodorik (wBYq09wAAAAJ)": 16, "Bordeleau (8Bug6mIAAAAJ)": 8, - "Brandt (OMA_KjcAAAAJ)": 21, + "Brandt (OMA_KjcAAAAJ)": 22, "Brodsky (b-AlexBrodsky)": 1, "Brooks (42-3005)": 10, "Cochran (IpmBO6AAAAAJ)": 0, "DeGagne (245-3040)": 2, "Dey (hwV2P4EAAAAJ)": 0, - "Escobedo (lPSfdqAAAAAJ)": 18, + "Escobedo (lPSfdqAAAAAJ)": 20, "Evans (NqlOPkMAAAAJ)": 135, "Farion (0rINg7EAAAAJ)": 1, - "Gagie (aFCoq2YAAAAJ)": 99, - "Haque (PMTOOSQAAAAJ)": 53, - "He (4yj_9skAAAAJ)": 27, + "Gagie (aFCoq2YAAAAJ)": 101, + "Haque (PMTOOSQAAAAJ)": 54, + "He (4yj_9skAAAAJ)": 28, "Hernandez-Castillo (rSrWYaIAAAAJ)": 24, "Heywood (_d-AGjUAAAAJ)": 39, "Kalyaniwalla (QffVmMIAAAAJ)": 2, - "Keselj (uDKsmuIAAAAJ)": 22, + "Keselj (uDKsmuIAAAAJ)": 23, "Kryven (5ogGlooAAAAJ)": 25, "Lahoud (Fnkc3a4AAAAJ)": 48, "MacKay (fqtL2yMAAAAJ)": 1, "Maguire (rHFCtWwAAAAJ)": 59, "Malloch (iQa0leoAAAAJ)": 21, "Marchand (17-4063)": 0, - "Mattheisen (uhlDFm4AAAAJ)": 102, - "Matwin (rCoJeuYAAAAJ)": 100, + "Mattheisen (uhlDFm4AAAAJ)": 106, + "Matwin (rCoJeuYAAAAJ)": 102, "McAllister (80-1712)": 0, - "Milios (ME8aQywAAAAJ)": 60, - "Neethirajan (8VZwF0sAAAAJ)": 143, - "Oore (cI0dYX4AAAAJ)": 54, - "Orji (-1cHtBQAAAAJ)": 260, - "Oyebode (-6DsTnMAAAAJ)": 62, + "Milios (ME8aQywAAAAJ)": 59, + "Neethirajan (8VZwF0sAAAAJ)": 156, + "Oore (cI0dYX4AAAAJ)": 60, + "Orji (-1cHtBQAAAAJ)": 267, + "Oyebode (-6DsTnMAAAAJ)": 64, "Poitras (TNaVSQwAAAAJ)": 31, - "Rahman (9SrqOewAAAAJ)": 37, + "Rahman (9SrqOewAAAAJ)": 36, "Rajendran (-novlhIAAAAJ)": 25, - "Ralph (oRBuFa0AAAAJ)": 39, - "Rau-Chaplin (-PvfVhgAAAAJ)": 0, - "Reilly (fZ56s2EAAAAJ)": 27, - "Rosborough (kG4oQmsAAAAJ)": 25, - "Rudzicz (elXOB1sAAAAJ)": 164, - "Sajjad (t3BH6NkAAAAJ)": 78, - "Sampalli (UCVetfAAAAAJ)": 69, + "Ralph (oRBuFa0AAAAJ)": 40, + "Rau-Chaplin (-PvfVhgAAAAJ)": 1, + "Reilly (fZ56s2EAAAAJ)": 29, + "Rosborough (kG4oQmsAAAAJ)": 26, + "Rudzicz (elXOB1sAAAAJ)": 170, + "Sajjad (t3BH6NkAAAAJ)": 81, + "Sampalli (UCVetfAAAAAJ)": 70, "Sampangi (x_Cy69EAAAAJ)": 11, "Shakeri (iriAIgsAAAAJ)": 14, - "Sharma (VHjAIe8AAAAJ)": 52, + "Sharma (VHjAIe8AAAAJ)": 54, "Shepherd (77-2373)": 0, "Siegel (joV1qkYAAAAJ)": 25, "Slonim (25-2958)": 0, - "Spadon (bfdGsGUAAAAJ)": 26, + "Spadon (bfdGsGUAAAAJ)": 30, "Tang (VhWYfm8AAAAJ)": 19, "Trappenberg (EwkaTYEAAAAJ)": 37, "Watters (P02fwREAAAAJ)": 2, - "Wehbe (UrFw3XEAAAAJ)": 21, - "Whidden (itc4x9kAAAAJ)": 29, + "Wehbe (UrFw3XEAAAAJ)": 22, + "Whidden (itc4x9kAAAAJ)": 31, "Wilde (lkAmFEEAAAAJ)": 23, "Wu (IdBlVPUAAAAJ)": 33, - "Ye (4OQaVGUAAAAJ)": 91, + "Ye (4OQaVGUAAAAJ)": 93, "Zeh (GoTWlmgAAAAJ)": 23, - "Zincir-Heywood (F9nG0F4AAAAJ)": 78, - "a2i2": 1059 + "Zincir-Heywood (F9nG0F4AAAAJ)": 79, + "a2i2": 1094 } } \ No newline at end of file diff --git a/output/summary.csv b/output/summary.csv index 434e1f4a..b0d49df0 100644 --- a/output/summary.csv +++ b/output/summary.csv @@ -1,27 +1,27 @@ file_path,trust_hits,scholar_bib,scholar_page,s2,crossref,openreview,arxiv,openalex,pubmed,europepmc,doi_csl,doi_bibtex output/Farion (0rINg7EAAAAJ)/Farion2022-UltimateGuide.bib,0,0,0,0,0,0,0,0,0,0,0,0 output/Whidden (itc4x9kAAAAJ)/Molloy2026-DataAcquisition.bib,0,0,0,0,0,0,0,0,0,0,0,0 -output/Rosborough (kG4oQmsAAAAJ)/Rosborough2025-ConceptualMap.bib,3,0,0,0,1,0,0,1,0,0,1,0 +output/Rosborough (kG4oQmsAAAAJ)/Rosborough2025-ConceptualMap.bib,2,0,0,0,1,0,0,0,0,0,1,0 output/Watters (P02fwREAAAAJ)/Watters2024-NextGeneration.bib,4,0,0,1,1,0,0,1,0,0,1,0 output/Hernandez-Castillo (rSrWYaIAAAAJ)/Padronrivera2026-FunctionalConnectivity.bib,4,0,0,1,1,0,0,1,0,0,1,0 -output/Brandt (OMA_KjcAAAAJ)/Rajput2026-FlipFlopStatic.bib,2,0,0,0,0,0,0,1,0,0,1,0 +output/Brandt (OMA_KjcAAAAJ)/Rajput2026-FlipFlopStatic.bib,1,0,0,0,0,0,0,0,0,0,1,0 output/Brandt (OMA_KjcAAAAJ)/Brandt2025-DSGVOCompliance.bib,4,0,0,1,1,0,0,1,0,0,1,0 -output/Rosborough (kG4oQmsAAAAJ)/Rosborough2025-CompetitionLegal.bib,3,0,0,0,1,0,0,1,0,0,1,0 +output/Rosborough (kG4oQmsAAAAJ)/Rosborough2025-CompetitionLegal.bib,2,0,0,0,1,0,0,0,0,0,1,0 output/Siegel (joV1qkYAAAAJ)/Poitras2024-ProgrammingLanguage.bib,3,0,0,0,1,0,0,1,0,0,1,0 -output/Hernandez-Castillo (rSrWYaIAAAAJ)/Robertson2025-CorePattern.bib,2,0,0,0,0,0,0,0,0,1,1,0 +output/Hernandez-Castillo (rSrWYaIAAAAJ)/Robertson2025-CorePattern.bib,3,0,0,0,1,0,0,0,0,1,1,0 output/Poitras (TNaVSQwAAAAJ)/Poitras2025-DataInformed.bib,3,0,0,0,1,0,0,1,0,0,1,0 output/Brandt (OMA_KjcAAAAJ)/Solisreyes2025-ParallelComputation.bib,4,0,0,1,1,0,0,1,0,0,1,0 output/Hernandez-Castillo (rSrWYaIAAAAJ)/Lopez2025-BiomarkersMyotonic.bib,0,0,0,0,0,0,0,0,0,0,0,0 -output/Rosborough (kG4oQmsAAAAJ)/Reynolds2025-IntellectualProperty.bib,3,0,0,0,1,0,0,1,0,0,1,0 +output/Rosborough (kG4oQmsAAAAJ)/Reynolds2025-IntellectualProperty.bib,2,0,0,0,1,0,0,0,0,0,1,0 output/Brandt (OMA_KjcAAAAJ)/Trochez2025-MultivariatePower.bib,4,0,0,1,1,0,0,1,0,0,1,0 output/Siegel (joV1qkYAAAAJ)/Schulte2025-WhatWe.bib,4,0,0,1,1,0,0,1,0,0,1,0 output/Rosborough (kG4oQmsAAAAJ)/Rosborough2025-LockedOut.bib,0,0,0,0,0,0,0,0,0,0,0,0 output/Brandt (OMA_KjcAAAAJ)/Brandt2023-ModularAlgorithm.bib,4,0,0,1,1,0,0,1,0,0,1,0 output/Siegel (joV1qkYAAAAJ)/Poitras2024-CognitiveApprenticeship.bib,3,0,0,0,1,0,0,1,0,0,1,0 -output/Rosborough (kG4oQmsAAAAJ)/Rosborough2025-SourceCode.bib,1,0,0,0,0,0,0,1,0,0,0,0 +output/Rosborough (kG4oQmsAAAAJ)/Rosborough2025-SourceCode.bib,0,0,0,0,0,0,0,0,0,0,0,0 output/Siegel (joV1qkYAAAAJ)/Poitras2024-GenerativeAI.bib,4,0,0,1,1,0,0,1,0,0,1,0 output/Brandt (OMA_KjcAAAAJ)/Asadi2023-ParallelizationTriangular.bib,4,0,0,1,1,0,0,1,0,0,1,0 -output/Rosborough (kG4oQmsAAAAJ)/Rosborough2025-InvisibilityTPMs.bib,1,0,0,0,0,0,0,1,0,0,0,0 +output/Rosborough (kG4oQmsAAAAJ)/Rosborough2025-InvisibilityTPMs.bib,0,0,0,0,0,0,0,0,0,0,0,0 output/Brandt (OMA_KjcAAAAJ)/Brandt2022-DistributedGravitational.bib,3,0,0,1,0,0,0,1,0,0,1,0 output/Watters (P02fwREAAAAJ)/Amoudi2022-TweetHelp.bib,4,0,0,1,1,0,0,1,0,0,1,0 output/Bordeleau (8Bug6mIAAAAJ)/Bordeleau2025-AvoidingDigital.bib,0,0,0,0,0,0,0,0,0,0,0,0 @@ -61,7 +61,7 @@ output/Arnold (NsIbm80AAAAJ)/Spettel2022-ActiveSets.bib,6,0,0,1,1,0,0,1,1,1,1,0 output/DeGagne (245-3040)/Brown2020-RationalRoots.bib,3,0,0,0,1,0,0,1,0,0,1,0 output/Arnold (NsIbm80AAAAJ)/Abbasnejad2022-AdaptiveFunction.bib,4,0,0,1,1,0,0,1,0,0,1,0 output/Hernandez-Castillo (rSrWYaIAAAAJ)/Tikoo2025-EvolvingCerebellar.bib,5,0,0,1,1,0,0,0,1,1,1,0 -output/Arnold (NsIbm80AAAAJ)/Nersesian2021-CD16aHigh.bib,1,0,0,0,0,0,0,0,0,0,1,0 +output/Arnold (NsIbm80AAAAJ)/Nersesian2021-CD16aHigh.bib,2,0,0,0,1,0,0,0,0,0,1,0 output/Poitras (TNaVSQwAAAAJ)/Poitras2025-ClusteringProfiling.bib,4,0,0,1,1,0,0,1,0,0,1,0 output/Poitras (TNaVSQwAAAAJ)/Lin2026-MappingOpen.bib,3,0,0,1,1,0,0,0,0,0,1,0 output/Siegel (joV1qkYAAAAJ)/Schulte2024-ValuesBeliefs.bib,3,0,0,1,1,0,0,0,0,0,1,0 @@ -74,17 +74,17 @@ output/Milios (ME8aQywAAAAJ)/Dumpala2024-SensitivityGenerative.bib,5,0,1,1,1,0,0 output/Maguire (rHFCtWwAAAAJ)/Hall2025-EvaluationPhenotypic.bib,4,0,0,1,0,0,0,0,1,1,1,0 output/Hernandez-Castillo (rSrWYaIAAAAJ)/Rezende2024-GenotypeSpecific.bib,5,0,0,1,1,0,0,0,1,1,1,0 output/Milios (ME8aQywAAAAJ)/Taranukhin2024-StanceReasoner.bib,3,0,0,1,1,0,0,0,0,0,1,0 -output/Maguire (rHFCtWwAAAAJ)/Long2026-GenomicAntigenic.bib,3,0,0,0,1,0,0,1,0,0,1,0 +output/Maguire (rHFCtWwAAAAJ)/Long2026-GenomicAntigenic.bib,3,0,0,0,1,0,0,0,0,1,1,0 output/Maguire (rHFCtWwAAAAJ)/Perovic2025-ArgNormNormalization.bib,5,0,0,1,1,0,0,1,0,1,1,0 output/Whidden (itc4x9kAAAAJ)/Ayyagari2025-DatasetSelection.bib,2,0,0,0,1,0,0,0,0,0,1,0 -output/Maguire (rHFCtWwAAAAJ)/Mahoney2025-BestBoth.bib,4,0,0,0,1,0,0,1,0,1,1,0 +output/Maguire (rHFCtWwAAAAJ)/Mahoney2025-BestBoth.bib,3,0,0,0,1,0,0,0,0,1,1,0 output/Poitras (TNaVSQwAAAAJ)/Poitras2024-CognitiveApprenticeship.bib,3,0,0,0,1,0,0,1,0,0,1,0 output/Whidden (itc4x9kAAAAJ)/Bravo2025-ModelingDynamics.bib,4,0,0,1,1,0,0,1,0,0,1,0 output/Maguire (rHFCtWwAAAAJ)/Guerin2026-BeyondWomen.bib,5,0,1,1,1,0,0,1,0,0,1,0 -output/Bordeleau (8Bug6mIAAAAJ)/Bordeleau2021-HowInfluence.bib,1,0,0,0,0,0,0,1,0,0,0,0 +output/Bordeleau (8Bug6mIAAAAJ)/Bordeleau2021-HowInfluence.bib,0,0,0,0,0,0,0,0,0,0,0,0 output/Brodsky (b-AlexBrodsky)/Siegel2021-ExploringUse.bib,4,0,0,1,1,0,0,1,0,0,1,0 -output/Maguire (rHFCtWwAAAAJ)/Wlodarski2025-CARDK.bib,4,0,0,0,1,0,0,1,0,1,1,0 -output/Rudzicz (elXOB1sAAAAJ)/Badawi2026-AssessingQuality.bib,2,0,0,0,0,0,0,1,0,0,1,0 +output/Maguire (rHFCtWwAAAAJ)/Wlodarski2025-CARDK.bib,3,0,0,0,1,0,0,0,0,1,1,0 +output/Rudzicz (elXOB1sAAAAJ)/Badawi2026-AssessingQuality.bib,1,0,0,0,0,0,0,0,0,0,1,0 output/Poitras (TNaVSQwAAAAJ)/Poitras2024-GenerativeAI.bib,3,0,0,1,1,0,0,0,0,0,1,0 output/Maguire (rHFCtWwAAAAJ)/Zeppa2025-ComparisonPharyngeal.bib,4,0,0,1,0,0,0,0,1,1,1,0 output/Poitras (TNaVSQwAAAAJ)/Sampangi2024-ProgrammingAssignment.bib,5,0,1,1,1,0,0,1,0,0,1,0 @@ -94,45 +94,44 @@ output/Rudzicz (elXOB1sAAAAJ)/Roewerdespres2025-ACCORDClosing.bib,4,0,0,1,1,0,0, output/Rudzicz (elXOB1sAAAAJ)/Feng2025-CausalLinkInteractive.bib,4,0,0,1,1,0,0,1,0,0,1,0 output/Maguire (rHFCtWwAAAAJ)/Scott2025-EpisiotomyTikTok.bib,6,0,0,1,1,0,0,1,1,1,1,0 output/Arnold (NsIbm80AAAAJ)/Toal2020-SimpleSurrogate.bib,3,0,0,0,1,0,0,1,0,0,1,0 -output/Maguire (rHFCtWwAAAAJ)/Paull2025-FixingPlumbing.bib,3,0,0,0,1,0,0,1,0,0,1,0 -output/Rudzicz (elXOB1sAAAAJ)/Vinden2025-ContrastiveSimilarity.bib,2,0,0,0,0,0,0,1,0,0,1,0 +output/Maguire (rHFCtWwAAAAJ)/Paull2025-FixingPlumbing.bib,2,0,0,0,1,0,0,0,0,0,1,0 +output/Rudzicz (elXOB1sAAAAJ)/Vinden2025-ContrastiveSimilarity.bib,1,0,0,0,0,0,0,0,0,0,1,0 output/Maguire (rHFCtWwAAAAJ)/Deschenes2025-FunctionalStructural.bib,2,0,0,0,0,0,0,0,0,1,1,0 output/Whidden (itc4x9kAAAAJ)/Evans2025-MonitoringHarmful.bib,4,0,0,1,1,0,0,1,0,0,1,0 output/Maguire (rHFCtWwAAAAJ)/Kotwa2025-HighHost.bib,5,0,0,1,1,0,0,1,0,1,1,0 output/Whidden (itc4x9kAAAAJ)/Ayyagari2025-NewfoundlandMarine.bib,0,0,0,0,0,0,0,0,0,0,0,0 -output/Rudzicz (elXOB1sAAAAJ)/Sadeghi2025-ExploringFeatures.bib,2,0,0,0,0,0,0,1,0,0,1,0 +output/Rudzicz (elXOB1sAAAAJ)/Sadeghi2025-ExploringFeatures.bib,1,0,0,0,0,0,0,0,0,0,1,0 output/Whidden (itc4x9kAAAAJ)/Peachey2024-MachineLearning.bib,4,0,0,1,1,0,0,1,0,0,1,0 output/Rudzicz (elXOB1sAAAAJ)/Pimentel2024-FeatureExtraction.bib,4,0,0,1,1,0,0,1,0,0,1,0 output/Milios (ME8aQywAAAAJ)/Chaudhary2024-Top2LabelExplainable.bib,4,0,0,1,1,0,0,1,0,0,1,0 output/Whidden (itc4x9kAAAAJ)/Bravo2024-AdvancingPrecision.bib,4,0,0,1,1,0,0,1,0,0,1,0 output/Rosborough (kG4oQmsAAAAJ)/Rosborough2023-AchievingCopy.bib,4,0,0,1,1,0,0,1,0,0,1,0 -output/Rudzicz (elXOB1sAAAAJ)/Saqur2025-FilteredNot.bib,0,0,0,0,0,0,0,0,0,0,0,0 output/Rosborough (kG4oQmsAAAAJ)/Guibault2023-CanadianIntellectual.bib,0,0,0,0,0,0,0,0,0,0,0,0 output/Rudzicz (elXOB1sAAAAJ)/Zeng2025-HowRecover.bib,4,0,0,1,1,0,0,1,0,0,1,0 output/Rosborough (kG4oQmsAAAAJ)/Rosborough2023-LawBytes.bib,0,0,0,0,0,0,0,0,0,0,0,0 output/Milios (ME8aQywAAAAJ)/Cabral2023-AddressingGap.bib,4,0,0,1,1,0,0,1,0,0,1,0 output/Rosborough (kG4oQmsAAAAJ)/Rosborough2023-RightRepair.bib,0,0,0,0,0,0,0,0,0,0,0,0 -output/Rudzicz (elXOB1sAAAAJ)/Berlotattwell2025-LLMLibrary.bib,2,0,0,0,0,0,0,1,0,0,1,0 +output/Rudzicz (elXOB1sAAAAJ)/Berlotattwell2025-LLMLibrary.bib,1,0,0,0,0,0,0,0,0,0,1,0 output/Rudzicz (elXOB1sAAAAJ)/Rosati2025-LockingOpen.bib,0,0,0,0,0,0,0,0,0,0,0,0 output/Whidden (itc4x9kAAAAJ)/Khan2024-ApplyingDeep.bib,3,0,0,1,1,0,0,0,0,0,1,0 output/Milios (ME8aQywAAAAJ)/Rezaeipourfarsangi2023-AIPowered.bib,2,0,0,1,0,0,0,0,0,0,1,0 -output/Rosborough (kG4oQmsAAAAJ)/Craig2021-ModernCopyright.bib,3,0,0,0,1,0,0,1,0,0,1,0 -output/Rudzicz (elXOB1sAAAAJ)/Mianroodi2025-MedSynthRealistic.bib,2,0,0,0,0,0,0,1,0,0,1,0 +output/Rosborough (kG4oQmsAAAAJ)/Craig2021-ModernCopyright.bib,2,0,0,0,1,0,0,0,0,0,1,0 +output/Rudzicz (elXOB1sAAAAJ)/Mianroodi2025-MedSynthRealistic.bib,1,0,0,0,0,0,0,0,0,0,1,0 output/Whidden (itc4x9kAAAAJ)/Ayyagari2024-DetectingUnexpected.bib,4,0,0,1,1,0,0,1,0,0,1,0 output/Rosborough (kG4oQmsAAAAJ)/Rosborough2022-IntangibleJustice.bib,0,0,0,0,0,0,0,0,0,0,0,0 output/Rudzicz (elXOB1sAAAAJ)/Rahimi2025-NotLost.bib,4,0,0,1,1,0,0,1,0,0,1,0 -output/Milios (ME8aQywAAAAJ)/Jaiswal2023-BreakingToken.bib,2,0,0,0,0,0,0,1,0,0,1,0 +output/Milios (ME8aQywAAAAJ)/Jaiswal2023-BreakingToken.bib,1,0,0,0,0,0,0,0,0,0,1,0 output/Hernandez-Castillo (rSrWYaIAAAAJ)/Moradi2024-PairwiseFunctional.bib,4,0,0,1,1,0,0,1,0,0,1,0 output/Milios (ME8aQywAAAAJ)/Saeidi2023-ContextEnhanced.bib,4,0,0,1,1,0,0,1,0,0,1,0 -output/Rudzicz (elXOB1sAAAAJ)/Casper2025-OpenTechnical.bib,3,0,0,0,1,0,0,1,0,0,1,0 +output/Rudzicz (elXOB1sAAAAJ)/Casper2025-OpenTechnical.bib,2,0,0,0,1,0,0,0,0,0,1,0 output/Rosborough (kG4oQmsAAAAJ)/Rosborough2022-TechnologiesServitude.bib,0,0,0,0,0,0,0,0,0,0,0,0 output/Rudzicz (elXOB1sAAAAJ)/Dadsetan2025-SampleEfficient.bib,3,0,0,1,0,0,0,1,0,0,1,0 output/Rosborough (kG4oQmsAAAAJ)/Rosborough2022-TowardCanadian.bib,2,0,0,1,0,0,0,0,0,0,1,0 output/Rudzicz (elXOB1sAAAAJ)/Latypov2024-SignaturesChronic.bib,6,0,0,1,1,0,0,1,1,1,1,0 output/Milios (ME8aQywAAAAJ)/Silva2023-EvaluatingVisual.bib,4,0,0,1,1,0,0,1,0,0,1,0 output/Whidden (itc4x9kAAAAJ)/Kaikkonen2024-FosteringDiversity.bib,4,0,0,1,1,0,0,1,0,0,1,0 -output/Rosborough (kG4oQmsAAAAJ)/Rosborough2022-ZenArt.bib,3,0,0,0,1,0,0,1,0,0,1,0 -output/Rudzicz (elXOB1sAAAAJ)/Soleymani2025-SoftAdaClipSmooth.bib,2,0,0,0,0,0,0,1,0,0,1,0 +output/Rosborough (kG4oQmsAAAAJ)/Rosborough2022-ZenArt.bib,2,0,0,0,1,0,0,0,0,0,1,0 +output/Rudzicz (elXOB1sAAAAJ)/Soleymani2025-SoftAdaClipSmooth.bib,1,0,0,0,0,0,0,0,0,0,1,0 output/Hernandez-Castillo (rSrWYaIAAAAJ)/Romeromolina2024-SARSCoV.bib,3,0,0,1,1,0,0,0,0,0,1,0 output/Whidden (itc4x9kAAAAJ)/Collienne2024-RankedSubtree.bib,2,0,0,1,0,0,0,0,0,0,1,0 output/Rudzicz (elXOB1sAAAAJ)/Latypov2025-StratificationSurgical.bib,6,0,0,1,1,0,0,1,1,1,1,0 @@ -142,15 +141,15 @@ output/Rudzicz (elXOB1sAAAAJ)/Khattak2025-SystemsMethods.bib,0,0,0,0,0,0,0,0,0,0 output/Milios (ME8aQywAAAAJ)/Saeidi2023-MALNISEMA3.bib,0,0,0,0,0,0,0,0,0,0,0,0 output/Siegel (joV1qkYAAAAJ)/Scott2023-ManagingGroup.bib,4,0,0,1,1,0,0,1,0,0,1,0 output/Rudzicz (elXOB1sAAAAJ)/Wang2025-TrustworthyMedical.bib,4,0,0,1,1,0,0,1,0,0,1,0 -output/Milios (ME8aQywAAAAJ)/Zhang2023-MPTopicImproving.bib,2,0,0,0,0,0,0,1,0,0,1,0 +output/Milios (ME8aQywAAAAJ)/Zhang2023-MPTopicImproving.bib,1,0,0,0,0,0,0,0,0,0,1,0 output/Bordeleau (8Bug6mIAAAAJ)/Bordeleau2020-RelevanceSuccess.bib,3,0,0,1,1,0,0,0,0,0,1,0 output/Rudzicz (elXOB1sAAAAJ)/Badawi2025-WhenCan.bib,4,0,0,1,1,0,0,1,0,0,1,0 output/Milios (ME8aQywAAAAJ)/Ramirezorta2023-QuOTeSQuery.bib,4,0,0,1,1,0,0,1,0,0,1,0 output/Rudzicz (elXOB1sAAAAJ)/Gonzales2024-RetrievalAugmented.bib,0,0,0,0,0,0,0,0,0,0,0,0 output/Rudzicz (elXOB1sAAAAJ)/Wang2024-AuxiliaryKnowledge.bib,4,0,0,1,1,0,0,1,0,0,1,0 -output/Milios (ME8aQywAAAAJ)/Gonzalezpizarro2023-SupportingUsers.bib,3,0,0,0,1,0,0,1,0,0,1,0 +output/Milios (ME8aQywAAAAJ)/Gonzalezpizarro2023-SupportingUsers.bib,2,0,0,0,1,0,0,0,0,0,1,0 output/Hernandez-Castillo (rSrWYaIAAAAJ)/Kerestes2022-StandardizedPipeline.bib,6,0,0,1,1,0,0,1,1,1,1,0 -output/Rudzicz (elXOB1sAAAAJ)/Dadsetan2024-CanLarge.bib,2,0,0,0,0,0,0,1,0,0,1,0 +output/Rudzicz (elXOB1sAAAAJ)/Dadsetan2024-CanLarge.bib,1,0,0,0,0,0,0,0,0,0,1,0 output/Milios (ME8aQywAAAAJ)/Christino2022-TheoreticalApproach.bib,1,0,0,0,0,0,0,0,0,0,1,0 output/Siegel (joV1qkYAAAAJ)/Poitras2023-ApplicationsLearning.bib,3,0,0,0,1,0,0,1,0,0,1,0 output/Milios (ME8aQywAAAAJ)/Saeidi2022-BiomedicalWord.bib,4,0,0,1,1,0,0,1,0,0,1,0 @@ -160,7 +159,7 @@ output/Siegel (joV1qkYAAAAJ)/Shah2022-AreYour.bib,4,0,0,1,1,0,0,1,0,0,1,0 output/Milios (ME8aQywAAAAJ)/Oyebode2022-COVID19.bib,5,0,0,1,1,0,0,0,1,1,1,0 output/Milios (ME8aQywAAAAJ)/Maisonnave2022-DetectingOngoing.bib,4,0,0,1,1,0,0,1,0,0,1,0 output/Hernandez-Castillo (rSrWYaIAAAAJ)/Chirinoperez2021-MappingCerebellar.bib,5,0,1,1,1,0,0,1,0,0,1,0 -output/Rosborough (kG4oQmsAAAAJ)/Rosborough2021-IfMachine.bib,1,0,0,0,0,0,0,1,0,0,0,0 +output/Rosborough (kG4oQmsAAAAJ)/Rosborough2021-IfMachine.bib,0,0,0,0,0,0,0,0,0,0,0,0 output/Rudzicz (elXOB1sAAAAJ)/Taghibeyglou2024-ContextIs.bib,4,0,0,1,1,0,0,1,0,0,1,0 output/Milios (ME8aQywAAAAJ)/Rezaeipourfarsangi2022-InteractiveClustering.bib,4,0,0,1,1,0,0,1,0,0,1,0 output/Milios (ME8aQywAAAAJ)/Ramirezorta2022-MALNISIberLEF.bib,0,0,0,0,0,0,0,0,0,0,0,0 @@ -171,27 +170,27 @@ output/Milios (ME8aQywAAAAJ)/Trust2022-SNLPTextGraphs.bib,0,0,0,0,0,0,0,0,0,0,0, output/Whidden (itc4x9kAAAAJ)/Kandimalla2022-AutomatedDetection.bib,4,0,0,1,1,0,0,1,0,0,1,0 output/Hernandez-Castillo (rSrWYaIAAAAJ)/Branscheidt2022-NoEvidence.bib,6,0,1,1,1,0,0,0,1,1,1,0 output/Brandt (OMA_KjcAAAAJ)/Brandt2021-ComplexityParallel.bib,3,0,0,1,1,0,0,0,0,0,1,0 -output/Wu (IdBlVPUAAAAJ)/Sarvmaili2024-DataCentric.bib,2,0,0,0,0,0,0,1,0,0,1,0 +output/Wu (IdBlVPUAAAAJ)/Sarvmaili2024-DataCentric.bib,1,0,0,0,0,0,0,0,0,0,1,0 output/Wu (IdBlVPUAAAAJ)/Rizwan2025-ResolvingLexical.bib,3,0,0,1,0,0,0,1,0,0,1,0 output/Reilly (fZ56s2EAAAAJ)/Hu2024-GanderPreliminary.bib,3,0,0,1,1,0,0,0,0,0,1,0 output/Siegel (joV1qkYAAAAJ)/Siegel2022-CapturingLessons.bib,2,0,0,1,0,0,0,0,0,0,1,0 -output/Rudzicz (elXOB1sAAAAJ)/Rosati2024-EvaluatingDefences.bib,2,0,0,0,0,0,0,1,0,0,1,0 +output/Rudzicz (elXOB1sAAAAJ)/Rosati2024-EvaluatingDefences.bib,1,0,0,0,0,0,0,0,0,0,1,0 output/Wu (IdBlVPUAAAAJ)/Feng2025-ResponseQuality.bib,4,0,0,1,1,0,0,1,0,0,1,0 output/Rudzicz (elXOB1sAAAAJ)/Damours2024-GeneticsNavigator.bib,6,0,0,1,1,0,0,1,1,1,1,0 -output/Wu (IdBlVPUAAAAJ)/Sabby2025-SelfSupervised.bib,2,0,0,0,0,0,0,1,0,0,1,0 +output/Wu (IdBlVPUAAAAJ)/Sabby2025-SelfSupervised.bib,1,0,0,0,0,0,0,0,0,0,1,0 output/Rudzicz (elXOB1sAAAAJ)/Lee2024-GeneticsProviders.bib,6,0,1,1,1,0,0,1,0,1,1,0 -output/Wu (IdBlVPUAAAAJ)/Rizwan2024-InstanceLevel.bib,2,0,0,0,0,0,0,1,0,0,1,0 +output/Wu (IdBlVPUAAAAJ)/Rizwan2024-InstanceLevel.bib,1,0,0,0,0,0,0,0,0,0,1,0 output/Wu (IdBlVPUAAAAJ)/Wu2024-RecommendingContent.bib,0,0,0,0,0,0,0,0,0,0,0,0 output/Milios (ME8aQywAAAAJ)/Sabando2021-MolecularEmbeddings.bib,5,0,0,1,1,0,0,1,0,1,1,0 -output/Wu (IdBlVPUAAAAJ)/Sui2023-SelfSupervised.bib,2,0,0,0,0,0,0,1,0,0,1,0 +output/Wu (IdBlVPUAAAAJ)/Sui2023-SelfSupervised.bib,1,0,0,0,0,0,0,0,0,0,1,0 output/Rudzicz (elXOB1sAAAAJ)/Roy2024-GraphTree.bib,5,0,1,1,1,0,0,1,0,0,1,0 -output/Rudzicz (elXOB1sAAAAJ)/Ge2024-HowWell.bib,2,0,0,0,0,0,0,1,0,0,1,0 +output/Rudzicz (elXOB1sAAAAJ)/Ge2024-HowWell.bib,1,0,0,0,0,0,0,0,0,0,1,0 output/Brandt (OMA_KjcAAAAJ)/Paudel2021-OptimizingProgram.bib,0,0,0,0,0,0,0,0,0,0,0,0 -output/Wu (IdBlVPUAAAAJ)/Shah2024-TowardsUnderstanding.bib,2,0,0,0,0,0,0,1,0,0,1,0 +output/Wu (IdBlVPUAAAAJ)/Shah2024-TowardsUnderstanding.bib,1,0,0,0,0,0,0,0,0,0,1,0 output/Siegel (joV1qkYAAAAJ)/Siegel2022-COVID19.bib,4,0,0,1,1,0,0,1,0,0,1,0 output/Wu (IdBlVPUAAAAJ)/Sarvmaili2024-TowardsUnderstanding.bib,0,0,0,0,0,0,0,0,0,0,0,0 output/Rudzicz (elXOB1sAAAAJ)/Rosati2024-ImmunizationAgainst.bib,3,0,0,1,1,0,0,0,0,0,1,0 -output/Wu (IdBlVPUAAAAJ)/Luo2024-WithinBasket.bib,2,0,0,0,0,0,0,1,0,0,1,0 +output/Wu (IdBlVPUAAAAJ)/Luo2024-WithinBasket.bib,1,0,0,0,0,0,0,0,0,0,1,0 output/Poitras (TNaVSQwAAAAJ)/Lajoie2023-TechnologyRich.bib,0,0,0,0,0,0,0,0,0,0,0,0 output/Wu (IdBlVPUAAAAJ)/Bouadjenek2023-UserCentric.bib,4,0,0,1,1,0,0,1,0,0,1,0 output/Poitras (TNaVSQwAAAAJ)/Poitras2023-ApplicationsLearning.bib,3,0,0,0,1,0,0,1,0,0,1,0 @@ -213,12 +212,12 @@ output/Wu (IdBlVPUAAAAJ)/Wu2022-ArbitraryConditional.bib,3,0,0,1,1,0,0,0,0,0,1,0 output/Maguire (rHFCtWwAAAAJ)/Alhaboub2025-SomeAssembly.bib,6,0,0,1,1,0,0,1,1,1,1,0 output/Poitras (TNaVSQwAAAAJ)/Poitras2021-TimeDriven.bib,3,0,0,1,1,0,0,0,0,0,1,0 output/Maguire (rHFCtWwAAAAJ)/Gosse2024-StochasticGender.bib,6,0,0,1,1,0,0,1,1,1,1,0 -output/Maguire (rHFCtWwAAAAJ)/Crawshaw2025-TestingWildlife.bib,4,0,0,0,1,0,0,1,0,1,1,0 +output/Maguire (rHFCtWwAAAAJ)/Crawshaw2025-TestingWildlife.bib,3,0,0,0,1,0,0,0,0,1,1,0 output/Poitras (TNaVSQwAAAAJ)/Lajoie2022-TimeVarious.bib,4,0,0,1,1,0,0,1,0,0,1,0 output/Maguire (rHFCtWwAAAAJ)/Halpin2025-WhenHelp.bib,6,0,0,1,1,0,0,1,1,1,1,0 output/Maguire (rHFCtWwAAAAJ)/Halpin2024-SoldierVictim.bib,5,0,0,1,1,0,0,1,0,1,1,0 output/Rudzicz (elXOB1sAAAAJ)/Lia2023-ItS.bib,5,0,0,1,1,0,0,1,1,0,1,0 -output/Maguire (rHFCtWwAAAAJ)/Mendes2024-HAMRonizationEnhancing.bib,4,0,0,0,1,0,0,1,0,1,1,0 +output/Maguire (rHFCtWwAAAAJ)/Mendes2024-HAMRonizationEnhancing.bib,3,0,0,0,1,0,0,0,0,1,1,0 output/Poitras (TNaVSQwAAAAJ)/Nelson2022-InsightsMaking.bib,4,0,0,1,1,0,0,1,0,0,1,0 output/Rudzicz (elXOB1sAAAAJ)/A2024-LengthStay.bib,3,0,0,1,0,0,0,0,1,1,0,0 output/Maguire (rHFCtWwAAAAJ)/Kim2024-IdentificationKey.bib,3,0,0,1,0,0,0,0,1,0,1,0 @@ -226,7 +225,7 @@ output/Maguire (rHFCtWwAAAAJ)/Griffiths2024-PHA4GEQuality.bib,6,0,0,1,1,0,0,1,1, output/Maguire (rHFCtWwAAAAJ)/Nasir2024-SARSCoV.bib,4,0,0,1,1,0,0,1,0,0,1,0 output/Wu (IdBlVPUAAAAJ)/Shen2022-DistributionalContrastive.bib,3,0,0,1,1,0,0,0,0,0,1,0 output/Maguire (rHFCtWwAAAAJ)/Lockyer2024-EmergenceIncel.bib,4,0,0,1,1,0,0,1,0,0,1,0 -output/Wu (IdBlVPUAAAAJ)/Castiglione2022-FAuxTesting.bib,2,0,0,0,0,0,0,1,0,0,1,0 +output/Wu (IdBlVPUAAAAJ)/Castiglione2022-FAuxTesting.bib,1,0,0,0,0,0,0,0,0,0,1,0 output/Maguire (rHFCtWwAAAAJ)/Mahoney2024-UtilityHybrid.bib,6,0,0,1,1,0,0,1,1,1,1,0 output/Siegel (joV1qkYAAAAJ)/Blouin2022-MetacognitiveProcesses.bib,4,0,0,1,1,0,0,1,0,0,1,0 output/Wu (IdBlVPUAAAAJ)/Wu2022-NoiseContrastive.bib,0,0,0,0,0,0,0,0,0,0,0,0 @@ -234,8 +233,8 @@ output/Maguire (rHFCtWwAAAAJ)/Kotwa2023-GenomicTranscriptomic.bib,6,0,0,1,1,0,0, output/Poitras (TNaVSQwAAAAJ)/Blouin2022-MetacognitiveProcesses.bib,4,0,0,1,1,0,0,1,0,0,1,0 output/Milios (ME8aQywAAAAJ)/Carnevali2021-GraphBased.bib,4,0,0,1,1,0,0,1,0,0,1,0 output/Wu (IdBlVPUAAAAJ)/Wu2022-PUMAPerformance.bib,3,0,0,1,1,0,0,0,0,0,1,0 -output/Rudzicz (elXOB1sAAAAJ)/Berlotattwell2024-LibraryLearning.bib,2,0,0,0,0,0,0,1,0,0,1,0 -output/Milios (ME8aQywAAAAJ)/Ferreira2021-ActiveLearning.bib,2,0,0,0,0,0,0,1,0,0,1,0 +output/Rudzicz (elXOB1sAAAAJ)/Berlotattwell2024-LibraryLearning.bib,1,0,0,0,0,0,0,0,0,0,1,0 +output/Milios (ME8aQywAAAAJ)/Ferreira2021-ActiveLearning.bib,1,0,0,0,0,0,0,0,0,0,1,0 output/Wu (IdBlVPUAAAAJ)/Castiglione2022-ScalableWhitebox.bib,3,0,0,1,0,0,0,1,0,0,1,0 output/Rudzicz (elXOB1sAAAAJ)/Ajwani2024-LLMGenerated.bib,2,0,0,0,0,0,0,1,0,0,1,0 output/Wu (IdBlVPUAAAAJ)/Wu2022-SystemMethod.bib,0,0,0,0,0,0,0,0,0,0,0,0 @@ -250,7 +249,7 @@ output/Maguire (rHFCtWwAAAAJ)/Sjaarda2023-PrevalenceLow.bib,7,0,1,1,1,0,0,1,1,1, output/Rudzicz (elXOB1sAAAAJ)/Wang2024-MultiStage.bib,4,0,0,1,1,0,0,1,0,0,1,0 output/Rudzicz (elXOB1sAAAAJ)/Saqur2024-NIFTYFinancial.bib,2,0,0,0,0,0,0,1,0,0,1,0 output/Maguire (rHFCtWwAAAAJ)/Timme2023-PuttingEverything.bib,6,0,0,1,1,0,0,1,1,1,1,0 -output/Maguire (rHFCtWwAAAAJ)/Kafaie2023-SarandExploring.bib,4,0,0,0,1,0,0,1,0,1,1,0 +output/Maguire (rHFCtWwAAAAJ)/Kafaie2023-SarandExploring.bib,3,0,0,0,1,0,0,0,0,1,1,0 output/Milios (ME8aQywAAAAJ)/Saeidi2021-ContextualizedKnowledge.bib,4,0,0,1,1,0,0,1,0,0,1,0 output/Maguire (rHFCtWwAAAAJ)/Nirmalarajah2023-UseWhole.bib,7,0,1,1,1,0,0,1,1,1,1,0 output/Rudzicz (elXOB1sAAAAJ)/Lia2024-NoOne.bib,4,0,0,1,1,0,0,1,0,0,1,0 @@ -259,7 +258,7 @@ output/Siegel (joV1qkYAAAAJ)/Siegel2022-StrategicInitiatives.bib,4,0,0,1,1,0,0,1 output/Rudzicz (elXOB1sAAAAJ)/Chanlatte2024-ProceedingsWorkshop.bib,4,0,0,1,1,0,0,1,0,0,1,0 output/Rudzicz (elXOB1sAAAAJ)/Atanasov2024-RepresentationNoising.bib,4,0,0,1,1,0,0,1,0,0,1,0 output/Hernandez-Castillo (rSrWYaIAAAAJ)/Hernandezcastillo2021-CervicalSpinal.bib,4,0,0,1,1,0,0,1,0,0,1,0 -output/Rudzicz (elXOB1sAAAAJ)/Qiu2024-ScenariosApproaches.bib,2,0,0,0,0,0,0,1,0,0,1,0 +output/Rudzicz (elXOB1sAAAAJ)/Qiu2024-ScenariosApproaches.bib,1,0,0,0,0,0,0,0,0,0,1,0 output/Poitras (TNaVSQwAAAAJ)/Huang2022-RoleSelf.bib,6,0,0,1,1,0,0,1,1,1,1,0 output/Rudzicz (elXOB1sAAAAJ)/Dumpala2024-SelfSupervised.bib,5,0,1,1,1,0,0,1,0,0,1,0 output/Maguire (rHFCtWwAAAAJ)/Alcock2022-CARD2023.bib,6,0,0,1,1,0,0,1,1,1,1,0 @@ -275,7 +274,7 @@ output/Maguire (rHFCtWwAAAAJ)/Pickering2022-DivergentSARS.bib,6,0,0,1,1,0,0,1,1, output/Siegel (joV1qkYAAAAJ)/Siegel2022-ImpactCOVID.bib,2,0,0,1,0,0,0,0,0,0,1,0 output/Maguire (rHFCtWwAAAAJ)/Sanderson2022-ExploringMobilome.bib,5,0,0,1,1,0,0,1,0,1,1,0 output/Maguire (rHFCtWwAAAAJ)/Griffiths2022-FutureProofing.bib,6,0,1,1,1,0,0,0,1,1,1,0 -output/Rudzicz (elXOB1sAAAAJ)/Ge2024-UnderstandingLanguage.bib,2,0,0,0,0,0,0,1,0,0,1,0 +output/Rudzicz (elXOB1sAAAAJ)/Ge2024-UnderstandingLanguage.bib,1,0,0,0,0,0,0,0,0,0,1,0 output/Reilly (fZ56s2EAAAAJ)/Haltner2023-ComparativeEvaluation.bib,3,0,0,1,1,0,0,0,0,0,1,0 output/Rudzicz (elXOB1sAAAAJ)/Changawala2024-WhisterWhisper.bib,3,0,0,1,1,0,0,0,0,0,1,0 output/Maguire (rHFCtWwAAAAJ)/Banerjee2022-ImmunogenicityConvalescent.bib,6,0,0,1,1,0,0,1,1,1,1,0 @@ -289,7 +288,7 @@ output/Maguire (rHFCtWwAAAAJ)/Chan2023-SurvivalBased.bib,6,0,0,1,1,0,0,1,1,1,1,0 output/Rosborough (kG4oQmsAAAAJ)/Rosborough2020-UnscrewingFuture.bib,0,0,0,0,0,0,0,0,0,0,0,0 output/Maguire (rHFCtWwAAAAJ)/Lee2022-TenQuick.bib,6,0,0,1,1,0,0,1,1,1,1,0 output/Rudzicz (elXOB1sAAAAJ)/Lia2023-ContextualizingTone.bib,6,0,0,1,1,0,0,1,1,1,1,0 -output/Spadon (bfdGsGUAAAAJ)/Spadon2025-TheoreticalFramework.bib,2,0,0,0,0,0,0,1,0,0,1,0 +output/Spadon (bfdGsGUAAAAJ)/Spadon2025-TheoreticalFramework.bib,2,0,0,0,0,0,1,0,0,0,1,0 output/Rudzicz (elXOB1sAAAAJ)/Siddiqui2023-DeepLearning.bib,6,0,0,1,1,0,0,1,1,1,1,0 output/Spadon (bfdGsGUAAAAJ)/Silva2025-AIDriven.bib,4,0,0,1,1,0,0,1,0,0,1,0 output/Rudzicz (elXOB1sAAAAJ)/Mcburney2023-DevelopingReference.bib,7,0,1,1,1,0,0,1,1,1,1,0 @@ -305,13 +304,13 @@ output/Shakeri (iriAIgsAAAAJ)/Shakeri2024-DesigningSmart.bib,4,0,0,1,1,0,0,1,0,0 output/Spadon (bfdGsGUAAAAJ)/Spadon2025-ModelingMaritime.bib,5,0,0,1,1,0,1,1,0,0,1,0 output/Shakeri (iriAIgsAAAAJ)/Shakeri2024-PassiveCo.bib,2,0,0,1,0,0,0,0,0,0,1,0 output/Rudzicz (elXOB1sAAAAJ)/Wang2023-InvestigatingLearning.bib,4,0,0,1,1,0,0,1,0,0,1,0 -output/Rudzicz (elXOB1sAAAAJ)/Zhu2023-MeasuringInformation.bib,2,0,0,0,0,0,0,1,0,0,1,0 -output/Poitras (TNaVSQwAAAAJ)/Huang2021-DataVisualizations.bib,0,0,0,0,0,0,0,0,0,0,0,0 -output/Spadon (bfdGsGUAAAAJ)/Alam2025-MultiVessel.bib,2,0,0,0,0,0,0,1,0,0,1,0 +output/Rudzicz (elXOB1sAAAAJ)/Zhu2023-MeasuringInformation.bib,1,0,0,0,0,0,0,0,0,0,1,0 +output/Poitras (TNaVSQwAAAAJ)/Huang2021-DataVisualizations.bib,2,0,0,0,1,0,0,0,0,0,1,0 +output/Spadon (bfdGsGUAAAAJ)/Alam2025-MultiVessel.bib,2,0,0,0,0,0,1,0,0,0,1,0 output/Spadon (bfdGsGUAAAAJ)/Alam2025-PhysicsInformed.bib,5,0,0,1,1,0,1,1,0,0,1,0 -output/Rudzicz (elXOB1sAAAAJ)/Khalid2023-RefiNeRFModelling.bib,2,0,0,0,0,0,0,1,0,0,1,0 +output/Rudzicz (elXOB1sAAAAJ)/Khalid2023-RefiNeRFModelling.bib,1,0,0,0,0,0,0,0,0,0,1,0 output/Shakeri (iriAIgsAAAAJ)/Shakeri2023-SensingTheir.bib,4,0,0,1,1,0,0,1,0,0,1,0 -output/Rudzicz (elXOB1sAAAAJ)/Khalid2023-SurGNNExplainable.bib,2,0,0,0,0,0,0,1,0,0,1,0 +output/Rudzicz (elXOB1sAAAAJ)/Khalid2023-SurGNNExplainable.bib,1,0,0,0,0,0,0,0,0,0,1,0 output/Spadon (bfdGsGUAAAAJ)/Song2024-EnhancingGlobal.bib,7,0,0,1,1,0,1,1,1,1,1,0 output/Spadon (bfdGsGUAAAAJ)/Alam2024-EnhancingShort.bib,4,0,0,1,1,0,0,1,0,0,1,0 output/Rudzicz (elXOB1sAAAAJ)/Liaqat2023-SystemMethod.bib,0,0,0,0,0,0,0,0,0,0,0,0 @@ -329,8 +328,8 @@ output/Spadon (bfdGsGUAAAAJ)/Rodrigues2022-CPAPAdherence.bib,4,0,0,1,1,0,0,1,0,0 output/Brandt (OMA_KjcAAAAJ)/Asadi2020-ParallelizationTriangular.bib,2,0,0,0,1,0,0,0,0,0,1,0 output/Spadon (bfdGsGUAAAAJ)/Spadon2023-UnfoldingAIS.bib,5,0,0,1,1,0,1,1,0,0,1,0 output/Rudzicz (elXOB1sAAAAJ)/Taghibeyglou2023-WhoNeeds.bib,3,0,0,1,1,0,0,0,0,0,1,0 -output/Rudzicz (elXOB1sAAAAJ)/Khalid2023-WildNeRFNovel.bib,4,0,0,0,1,0,0,1,0,1,1,0 -output/Wu (IdBlVPUAAAAJ)/Sui2021-MultiAxis.bib,2,0,0,0,0,0,0,1,0,0,1,0 +output/Rudzicz (elXOB1sAAAAJ)/Khalid2023-WildNeRFNovel.bib,3,0,0,0,1,0,0,0,0,1,1,0 +output/Wu (IdBlVPUAAAAJ)/Sui2021-MultiAxis.bib,1,0,0,0,0,0,0,0,0,0,1,0 output/Rudzicz (elXOB1sAAAAJ)/Lam2022-DelphiConsensus.bib,6,0,0,1,1,0,0,1,1,1,1,0 output/Rudzicz (elXOB1sAAAAJ)/Gagnonaudet2022-RemedyDistributional.bib,4,0,0,1,1,0,0,1,0,0,1,0 output/Rudzicz (elXOB1sAAAAJ)/Balachandar2022-AreSmartphones.bib,5,0,0,1,1,0,0,0,1,1,1,0 @@ -340,12 +339,12 @@ output/Rudzicz (elXOB1sAAAAJ)/Rudzicz2022-AutomaticSpeech.bib,0,0,0,0,0,0,0,0,0, output/Rudzicz (elXOB1sAAAAJ)/Kostas2021-BENDRTransformers.bib,3,0,0,1,0,0,0,0,0,1,1,0 output/Rudzicz (elXOB1sAAAAJ)/Obadinma2022-BringingState.bib,4,0,0,1,1,0,0,1,0,0,1,0 output/Rudzicz (elXOB1sAAAAJ)/Kainth2022-ConformalMirror.bib,8,0,1,1,1,0,1,1,1,1,1,0 -output/Rudzicz (elXOB1sAAAAJ)/Ehghaghi2022-DataDriven.bib,2,0,0,0,0,0,0,1,0,0,1,0 +output/Rudzicz (elXOB1sAAAAJ)/Ehghaghi2022-DataDriven.bib,1,0,0,0,0,0,0,0,0,0,1,0 output/Rudzicz (elXOB1sAAAAJ)/Rudzicz2022-DementiaAphasia.bib,0,0,0,0,0,0,0,0,0,0,0,0 output/Rudzicz (elXOB1sAAAAJ)/Park2022-DetoxifyingLanguage.bib,3,0,0,1,1,0,0,0,0,0,1,0 output/Rudzicz (elXOB1sAAAAJ)/Hung2022-DifferentialExpression.bib,6,0,0,1,1,0,0,1,1,1,1,0 output/Rudzicz (elXOB1sAAAAJ)/Ngai2022-DoctorXAvIer.bib,4,0,0,1,1,0,0,1,0,0,1,0 -output/Rudzicz (elXOB1sAAAAJ)/Li2022-ImprovingGreedy.bib,2,0,0,0,0,0,0,1,0,0,1,0 +output/Rudzicz (elXOB1sAAAAJ)/Li2022-ImprovingGreedy.bib,2,0,0,0,0,0,1,0,0,0,1,0 output/Rudzicz (elXOB1sAAAAJ)/Wang2022-KenMeSHKnowledge.bib,5,0,0,1,1,0,1,1,0,0,1,0 output/Rudzicz (elXOB1sAAAAJ)/Frydenlund2022-LanguageModelling.bib,5,0,0,1,1,0,1,1,0,0,1,0 output/Whidden (itc4x9kAAAAJ)/Kandimalla2021-ApplyingDeep.bib,3,0,0,0,1,0,0,1,0,0,1,0 @@ -354,10 +353,10 @@ output/Rudzicz (elXOB1sAAAAJ)/Wang2022-MeSHupCorpus.bib,3,0,0,0,1,0,0,1,0,0,1,0 output/Rudzicz (elXOB1sAAAAJ)/Li2022-NeuralReality.bib,5,0,0,1,1,0,1,1,0,0,1,0 output/Reilly (fZ56s2EAAAAJ)/Hu2023-ComparativeGlyph.bib,2,0,0,1,0,0,0,0,0,0,1,0 output/Rudzicz (elXOB1sAAAAJ)/Zhu2022-DataRequirements.bib,4,0,0,0,1,0,1,1,0,0,1,0 -output/Rudzicz (elXOB1sAAAAJ)/Zhu2022-OODProbe.bib,2,0,0,0,0,0,0,1,0,0,1,0 +output/Rudzicz (elXOB1sAAAAJ)/Zhu2022-OODProbe.bib,1,0,0,0,0,0,0,0,0,0,1,0 output/Reilly (fZ56s2EAAAAJ)/Hu2023-ParallaxBased.bib,3,0,1,1,0,0,0,0,0,0,1,0 output/Reilly (fZ56s2EAAAAJ)/Porcino2022-GuidelineProposal.bib,4,0,0,1,1,0,0,1,0,0,1,0 -output/Rudzicz (elXOB1sAAAAJ)/Khalid2022-ORVision.bib,4,0,0,0,1,0,0,1,0,1,1,0 +output/Rudzicz (elXOB1sAAAAJ)/Khalid2022-ORVision.bib,3,0,0,0,1,0,0,0,0,1,1,0 output/Rudzicz (elXOB1sAAAAJ)/Shahtalebi2022-OutDistribution.bib,0,0,0,0,0,0,0,0,0,0,0,0 output/Reilly (fZ56s2EAAAAJ)/Raza2022-ActiveVisualization.bib,4,0,0,1,1,0,0,1,0,0,1,0 output/Rudzicz (elXOB1sAAAAJ)/Rudzicz2022-PhysicalCognitive.bib,0,0,0,0,0,0,0,0,0,0,0,0 @@ -375,8 +374,8 @@ output/Rudzicz (elXOB1sAAAAJ)/Rudzicz2022-SpeechSynthesis.bib,0,0,0,0,0,0,0,0,0, output/Reilly (fZ56s2EAAAAJ)/Singh2022-SupportingSpatial.bib,4,0,0,1,1,0,0,1,0,0,1,0 output/Rudzicz (elXOB1sAAAAJ)/Rudzicz2022-SupportingDaily.bib,0,0,0,0,0,0,0,0,0,0,0,0 output/Rudzicz (elXOB1sAAAAJ)/Balagopalan2022-RoadExplainability.bib,4,0,0,1,1,0,0,1,0,0,1,0 -output/Rudzicz (elXOB1sAAAAJ)/Mcburney2022-ElectronicMedical.bib,3,0,0,0,1,0,0,1,0,0,1,0 -output/Siegel (joV1qkYAAAAJ)/Huang2021-DataVisualizations.bib,0,0,0,0,0,0,0,0,0,0,0,0 +output/Rudzicz (elXOB1sAAAAJ)/Mcburney2022-ElectronicMedical.bib,2,0,0,0,1,0,0,0,0,0,1,0 +output/Siegel (joV1qkYAAAAJ)/Huang2021-DataVisualizations.bib,2,0,0,0,1,0,0,0,0,0,1,0 output/Reilly (fZ56s2EAAAAJ)/Hu2021-ComparativeEvaluation.bib,3,0,0,1,0,0,0,1,0,0,1,0 output/Siegel (joV1qkYAAAAJ)/Siegel2021-EducationalLandscapes.bib,4,0,0,1,1,0,0,1,0,0,1,0 output/Poitras (TNaVSQwAAAAJ)/Siegel2021-ExploringUse.bib,4,0,0,1,1,0,0,1,0,0,1,0 @@ -393,7 +392,7 @@ output/Poitras (TNaVSQwAAAAJ)/Poitras2021-OnlineEducation.bib,3,0,0,1,1,0,0,0,0, output/Reilly (fZ56s2EAAAAJ)/Singh2021-StoryCreatAR.bib,4,0,0,1,1,0,0,1,0,0,1,0 output/Milios (ME8aQywAAAAJ)/Silva2021-EvaluatingVisual.bib,4,0,0,1,1,0,0,1,0,0,1,0 output/Siegel (joV1qkYAAAAJ)/Siegel2021-LearningCOVID.bib,4,0,1,1,1,0,0,0,0,0,1,0 -output/Wu (IdBlVPUAAAAJ)/Sui2021-RepresenterPoint.bib,1,0,0,0,0,0,0,1,0,0,0,0 +output/Wu (IdBlVPUAAAAJ)/Sui2021-RepresenterPoint.bib,0,0,0,0,0,0,0,0,0,0,0,0 output/Siegel (joV1qkYAAAAJ)/Siegel2021-TeachingGlobal.bib,2,0,0,1,0,0,0,0,0,0,1,0 output/Shakeri (iriAIgsAAAAJ)/Shakeri2021-FoldMoldAutomating.bib,2,0,0,0,0,0,0,1,0,0,1,0 output/Siegel (joV1qkYAAAAJ)/Siegel2021-OneSemicolon.bib,4,0,0,1,1,0,0,1,0,0,1,0 @@ -407,46 +406,45 @@ output/Milios (ME8aQywAAAAJ)/Glowacka2021-FourthWorkshop.bib,2,0,0,1,0,0,0,0,0,0 output/Poitras (TNaVSQwAAAAJ)/Lohani2020-FrameworkHuman.bib,0,0,0,0,0,0,0,0,0,0,0,0 output/Rudzicz (elXOB1sAAAAJ)/Vishnubhotla2021-EvaluationDisentangled.bib,3,0,0,0,1,0,0,1,0,0,1,0 output/Rudzicz (elXOB1sAAAAJ)/Ramezani2021-UnsupervisedFramework.bib,5,0,0,1,1,0,0,1,0,1,1,0 -output/Rudzicz (elXOB1sAAAAJ)/Riachi2021-ChallengesReinforcement.bib,2,0,0,0,0,0,0,1,0,0,1,0 +output/Rudzicz (elXOB1sAAAAJ)/Riachi2021-ChallengesReinforcement.bib,1,0,0,0,0,0,0,0,0,0,1,0 output/Reilly (fZ56s2EAAAAJ)/Franz2020-CompensatingPerspective.bib,4,0,0,1,1,0,0,1,0,0,1,0 output/Spadon (bfdGsGUAAAAJ)/Brandoli2021-DropLeafPrecision.bib,4,0,0,0,1,0,0,1,0,1,1,0 -output/Spadon (bfdGsGUAAAAJ)/Spadon2022-CitiesSeries.bib,2,0,0,0,0,0,0,1,0,0,1,0 -output/Sajjad (t3BH6NkAAAAJ)/Badshah2026-SCOPESelective.bib,2,0,0,0,0,0,0,1,0,0,1,0 -output/Sajjad (t3BH6NkAAAAJ)/Yu2026-VectorQuantized.bib,2,0,0,0,0,0,0,1,0,0,1,0 +output/Spadon (bfdGsGUAAAAJ)/Spadon2022-CitiesSeries.bib,2,0,0,0,0,0,1,0,0,0,1,0 +output/Sajjad (t3BH6NkAAAAJ)/Badshah2026-SCOPESelective.bib,1,0,0,0,0,0,0,0,0,0,1,0 +output/Sajjad (t3BH6NkAAAAJ)/Yu2026-VectorQuantized.bib,1,0,0,0,0,0,0,0,0,0,1,0 output/Sajjad (t3BH6NkAAAAJ)/Liaqat2025-ChameleonMultimodal.bib,4,0,0,1,1,0,0,1,0,0,1,0 output/Poitras (TNaVSQwAAAAJ)/Harley2020-BeyondHistorical.bib,4,0,0,1,1,0,0,1,0,0,1,0 -output/Sajjad (t3BH6NkAAAAJ)/Garg2025-CrossLayer.bib,2,0,0,0,0,0,0,1,0,0,1,0 -output/Sajjad (t3BH6NkAAAAJ)/Gajo2025-DependencyParsing.bib,2,0,0,0,0,0,0,1,0,0,1,0 -output/Sajjad (t3BH6NkAAAAJ)/Sajjad2025-InterpretingEffects.bib,2,0,0,0,0,0,0,1,0,0,1,0 +output/Sajjad (t3BH6NkAAAAJ)/Garg2025-CrossLayer.bib,1,0,0,0,0,0,0,0,0,0,1,0 +output/Sajjad (t3BH6NkAAAAJ)/Gajo2025-DependencyParsing.bib,1,0,0,0,0,0,0,0,0,0,1,0 +output/Sajjad (t3BH6NkAAAAJ)/Sajjad2025-InterpretingEffects.bib,2,0,0,0,1,0,0,0,0,0,1,0 output/Sajjad (t3BH6NkAAAAJ)/Rosati2025-LockingOpen.bib,0,0,0,0,0,0,0,0,0,0,0,0 output/Hernandez-Castillo (rSrWYaIAAAAJ)/Lopeztitla2020-CognitiveDecline.bib,5,0,0,1,1,0,0,0,1,1,1,0 output/Sajjad (t3BH6NkAAAAJ)/Haider2025-MultiGranular.bib,2,0,0,0,0,0,0,1,0,0,1,0 -output/Sajjad (t3BH6NkAAAAJ)/Haider2025-NeuronsSpeak.bib,3,0,0,0,0,0,1,1,0,0,1,0 +output/Sajjad (t3BH6NkAAAAJ)/Haider2025-NeuronsSpeak.bib,2,0,0,0,0,0,1,0,0,0,1,0 output/Sajjad (t3BH6NkAAAAJ)/Rahimi2025-NotLost.bib,4,0,0,1,1,0,0,1,0,0,1,0 output/Poitras (TNaVSQwAAAAJ)/Ranellucci2020-ExploringPre.bib,5,0,1,1,1,0,0,1,0,0,1,0 output/Sajjad (t3BH6NkAAAAJ)/Badshah2025-ReferenceGuided.bib,5,0,1,1,1,0,0,1,0,0,1,0 -output/Sajjad (t3BH6NkAAAAJ)/Rizwan2024-ResolvingLexical.bib,2,0,0,0,0,0,0,1,0,0,1,0 -output/Sajjad (t3BH6NkAAAAJ)/Badshah2025-TALETool.bib,1,0,0,0,0,0,0,0,0,0,1,0 +output/Sajjad (t3BH6NkAAAAJ)/Rizwan2024-ResolvingLexical.bib,1,0,0,0,0,0,0,0,0,0,1,0 output/Hernandez-Castillo (rSrWYaIAAAAJ)/Chirinoperez2021-CognitiveImpairments.bib,6,0,0,1,1,0,0,1,1,1,1,0 -output/Sajjad (t3BH6NkAAAAJ)/Arps2025-UnderstandingSyntactic.bib,2,0,0,0,0,0,0,1,0,0,1,0 +output/Sajjad (t3BH6NkAAAAJ)/Arps2025-UnderstandingSyntactic.bib,1,0,0,0,0,0,0,0,0,0,1,0 output/Sajjad (t3BH6NkAAAAJ)/Dionicio2025-UndistillableOpen.bib,0,0,0,0,0,0,0,0,0,0,0,0 -output/Sajjad (t3BH6NkAAAAJ)/Adeeba2025-UrBLiMPBenchmark.bib,3,0,0,0,0,0,1,1,0,0,1,0 -output/Sajjad (t3BH6NkAAAAJ)/Sadr2025-WhichWords.bib,2,0,0,0,0,0,0,1,0,0,1,0 -output/Sajjad (t3BH6NkAAAAJ)/Sarvmaili2024-DataCentric.bib,2,0,0,0,0,0,0,1,0,0,1,0 +output/Sajjad (t3BH6NkAAAAJ)/Adeeba2025-UrBLiMPBenchmark.bib,2,0,0,0,1,0,0,0,0,0,1,0 +output/Sajjad (t3BH6NkAAAAJ)/Sadr2025-WhichWords.bib,1,0,0,0,0,0,0,0,0,0,1,0 +output/Sajjad (t3BH6NkAAAAJ)/Sarvmaili2024-DataCentric.bib,1,0,0,0,0,0,0,0,0,0,1,0 output/Sajjad (t3BH6NkAAAAJ)/Idris2023-DynamicsSerum.bib,0,0,0,0,0,0,0,0,0,0,0,0 output/Hernandez-Castillo (rSrWYaIAAAAJ)/Contreras2020-LongitudinalAnalysis.bib,6,0,0,1,1,0,0,1,1,1,1,0 -output/Sajjad (t3BH6NkAAAAJ)/Rosati2024-EvaluatingDefences.bib,2,0,0,0,0,0,0,1,0,0,1,0 +output/Sajjad (t3BH6NkAAAAJ)/Rosati2024-EvaluatingDefences.bib,1,0,0,0,0,0,0,0,0,0,1,0 output/Shakeri (iriAIgsAAAAJ)/Shakeri2021-PaintingPortals.bib,3,0,0,1,1,0,0,0,0,0,1,0 -output/Sajjad (t3BH6NkAAAAJ)/Altinisik2024-ExplainingRole.bib,2,0,0,0,0,0,0,1,0,0,1,0 +output/Sajjad (t3BH6NkAAAAJ)/Altinisik2024-ExplainingRole.bib,1,0,0,0,0,0,0,0,0,0,1,0 output/Sajjad (t3BH6NkAAAAJ)/Rosati2024-ImmunizationAgainst.bib,4,0,0,1,1,0,0,1,0,0,1,0 output/Whidden (itc4x9kAAAAJ)/Morris2021-MachineLearning.bib,0,0,0,0,0,0,0,0,0,0,0,0 output/Sajjad (t3BH6NkAAAAJ)/Yu2024-LatentConcept.bib,3,0,0,1,1,0,0,0,0,0,1,0 output/Sajjad (t3BH6NkAAAAJ)/Rosati2024-LongForm.bib,4,0,0,1,1,0,0,1,0,0,1,0 output/Sajjad (t3BH6NkAAAAJ)/Arps2024-MultilingualNonce.bib,5,0,0,1,1,0,1,1,0,0,1,0 -output/Sajjad (t3BH6NkAAAAJ)/Badshah2024-QuantifyingCapabilities.bib,2,0,0,0,0,0,0,1,0,0,1,0 +output/Sajjad (t3BH6NkAAAAJ)/Badshah2024-QuantifyingCapabilities.bib,1,0,0,0,0,0,0,0,0,0,1,0 output/Sajjad (t3BH6NkAAAAJ)/Atanasov2024-RepresentationNoising.bib,4,0,0,1,1,0,0,1,0,0,1,0 output/Spadon (bfdGsGUAAAAJ)/Rodriguesjr2021-LIGDoctor.bib,3,0,0,1,1,0,0,0,0,0,1,0 -output/Sajjad (t3BH6NkAAAAJ)/Dumpala2024-SeeingSyntax.bib,2,0,0,0,0,0,0,1,0,0,1,0 +output/Sajjad (t3BH6NkAAAAJ)/Dumpala2024-SeeingSyntax.bib,1,0,0,0,0,0,0,0,0,0,1,0 output/Reilly (fZ56s2EAAAAJ)/Alshammari2020-MARStudy.bib,3,0,0,0,1,0,0,1,0,0,1,0 output/Sajjad (t3BH6NkAAAAJ)/Dumpala2024-SensitivityGenerative.bib,5,0,1,1,1,0,0,1,0,0,1,0 output/Sajjad (t3BH6NkAAAAJ)/Sarvmaili2024-TowardsUnderstanding.bib,0,0,0,0,0,0,0,0,0,0,0,0 @@ -470,14 +468,14 @@ output/Milios (ME8aQywAAAAJ)/Saeidi2021-GraphRepresentation.bib,4,0,0,1,1,0,0,1, output/Whidden (itc4x9kAAAAJ)/Fasuyi2020-MachineLearning.bib,0,0,0,0,0,0,0,0,0,0,0,0 output/Milios (ME8aQywAAAAJ)/Rahimi2021-MTLVLibrary.bib,2,0,0,1,0,0,0,0,0,0,1,0 output/Milios (ME8aQywAAAAJ)/Tampe2021-NeuralAbstractive.bib,4,0,0,1,1,0,0,1,0,0,1,0 -output/Spadon (bfdGsGUAAAAJ)/Oishi2021-NeuralNetworks.bib,3,0,0,0,1,0,0,1,0,0,1,0 +output/Spadon (bfdGsGUAAAAJ)/Oishi2021-NeuralNetworks.bib,2,0,0,0,1,0,0,0,0,0,1,0 output/Spadon (bfdGsGUAAAAJ)/Spadon2022-PayAttention.bib,7,0,0,1,1,0,1,1,1,1,1,0 output/Milios (ME8aQywAAAAJ)/Wang2020-NonuniformLanguage.bib,4,0,0,1,1,0,0,1,0,0,1,0 output/Maguire (rHFCtWwAAAAJ)/Tsang2021-IdentifyingNovel.bib,6,0,0,1,1,0,0,1,1,1,1,0 output/Milios (ME8aQywAAAAJ)/Weiss2021-TimeSeries.bib,4,0,0,1,1,0,0,1,0,0,1,0 output/Reilly (fZ56s2EAAAAJ)/Reilly2020-SpaceSyntax.bib,3,0,0,0,1,0,0,1,0,0,1,0 output/Wu (IdBlVPUAAAAJ)/Luo2020-DeepCritiquing.bib,4,0,0,1,1,0,0,1,0,0,1,0 -output/Haque (PMTOOSQAAAAJ)/Papry2026-ExplainableFailure.bib,2,0,0,0,0,0,0,1,0,0,1,0 +output/Haque (PMTOOSQAAAAJ)/Papry2026-ExplainableFailure.bib,1,0,0,0,0,0,0,0,0,0,1,0 output/Haque (PMTOOSQAAAAJ)/Baena2025-ComprehensiveSurvey.bib,2,0,0,0,0,0,1,0,0,0,1,0 output/Haque (PMTOOSQAAAAJ)/Ahmed2025-FairScheduling.bib,3,0,0,1,1,0,0,0,0,0,1,0 output/Haque (PMTOOSQAAAAJ)/Hasan2025-GeneralizedGNN.bib,5,0,1,1,1,0,0,1,0,0,1,0 @@ -493,7 +491,7 @@ output/Haque (PMTOOSQAAAAJ)/Kuzniar2025-SpotlightShining.bib,3,0,0,0,1,0,0,1,0,0 output/Haque (PMTOOSQAAAAJ)/Ifath2025-MathsfStreamline.bib,2,0,0,1,0,0,0,0,0,0,1,0 output/Haque (PMTOOSQAAAAJ)/Wang2023-TowardsFair.bib,3,0,0,1,0,0,0,1,0,0,1,0 output/Haque (PMTOOSQAAAAJ)/Boeira2024-CalibratedAutomated.bib,4,0,0,1,1,0,0,1,0,0,1,0 -output/Haque (PMTOOSQAAAAJ)/Ifath2024-AreData.bib,3,0,0,0,1,0,0,1,0,0,1,0 +output/Haque (PMTOOSQAAAAJ)/Ifath2024-AreData.bib,2,0,0,0,1,0,0,0,0,0,1,0 output/Milios (ME8aQywAAAAJ)/Ramirezorta2021-UnsupervisedDocument.bib,3,0,0,0,1,0,0,1,0,0,1,0 output/Haque (PMTOOSQAAAAJ)/Yang2024-CharacterizingSecurity.bib,4,0,0,1,1,0,0,1,0,0,1,0 output/Haque (PMTOOSQAAAAJ)/Chen2024-SeriesEditorial.bib,3,0,0,1,1,0,0,0,0,0,1,0 @@ -528,34 +526,34 @@ output/Blustein (7g6iU9QAAAAJ)/Alhejaili2022-StudyHow.bib,3,0,0,0,1,0,0,1,0,0,1, output/Blustein (7g6iU9QAAAAJ)/Allam2022-FactorsAffecting.bib,4,0,0,1,1,0,0,1,0,0,1,0 output/Milios (ME8aQywAAAAJ)/Rakib2020-EnhancementShort.bib,5,0,0,1,1,0,0,1,0,1,1,0 output/Rudzicz (elXOB1sAAAAJ)/Y2021-DeepLearning.bib,2,0,0,0,0,0,0,0,1,1,0,0 -output/Haque (PMTOOSQAAAAJ)/Tang2021-ACEAccurate.bib,2,0,0,0,0,0,0,1,0,0,1,0 +output/Haque (PMTOOSQAAAAJ)/Tang2021-ACEAccurate.bib,3,0,0,0,0,0,1,1,0,0,1,0 output/Rudzicz (elXOB1sAAAAJ)/Rudzicz2021-Medicine3.bib,0,0,0,0,0,0,0,0,0,0,0,0 -output/Rudzicz (elXOB1sAAAAJ)/Wang2022-Grad2TaskImproved.bib,2,0,0,0,0,0,0,1,0,0,1,0 +output/Rudzicz (elXOB1sAAAAJ)/Wang2022-Grad2TaskImproved.bib,2,0,0,0,0,0,1,0,0,0,1,0 output/Rudzicz (elXOB1sAAAAJ)/Shaib2021-HierarchicalCnn.bib,0,0,0,0,0,0,0,0,0,0,0,0 -output/Rajendran (-novlhIAAAAJ)/Sudhakar2025-GeneralistHanabi.bib,2,0,0,0,0,0,0,1,0,0,1,0 -output/Rajendran (-novlhIAAAAJ)/Thibodeau2025-BalancingProfit.bib,2,0,0,0,0,0,0,1,0,0,1,0 -output/Rajendran (-novlhIAAAAJ)/Rosati2024-EvaluatingDefences.bib,2,0,0,0,0,0,0,1,0,0,1,0 +output/Rajendran (-novlhIAAAAJ)/Sudhakar2025-GeneralistHanabi.bib,1,0,0,0,0,0,0,0,0,0,1,0 +output/Rajendran (-novlhIAAAAJ)/Thibodeau2025-BalancingProfit.bib,1,0,0,0,0,0,0,0,0,0,1,0 +output/Rajendran (-novlhIAAAAJ)/Rosati2024-EvaluatingDefences.bib,1,0,0,0,0,0,0,0,0,0,1,0 output/Spadon (bfdGsGUAAAAJ)/Scabora2020-EnhancingRecursive.bib,4,0,0,1,1,0,0,1,0,0,1,0 output/Rajendran (-novlhIAAAAJ)/Chandar2024-BalancingContext.bib,4,0,0,1,1,0,0,1,0,0,1,0 -output/Rajendran (-novlhIAAAAJ)/Thibodeau2024-FairnessIncentives.bib,2,0,0,0,0,0,0,1,0,0,1,0 -output/Rajendran (-novlhIAAAAJ)/Patil2024-IntelligentSwitching.bib,2,0,0,0,0,0,0,1,0,0,1,0 +output/Rajendran (-novlhIAAAAJ)/Thibodeau2024-FairnessIncentives.bib,1,0,0,0,0,0,0,0,0,0,1,0 +output/Rajendran (-novlhIAAAAJ)/Patil2024-IntelligentSwitching.bib,1,0,0,0,0,0,0,0,0,0,1,0 output/Rajendran (-novlhIAAAAJ)/Sudhakar2023-LanguageModel.bib,3,0,1,1,0,0,0,0,0,0,1,0 output/Rajendran (-novlhIAAAAJ)/Govindarajan2024-LearningConditional.bib,3,0,0,1,1,0,0,0,0,0,1,0 -output/Rajendran (-novlhIAAAAJ)/Samsami2024-MasteringMemory.bib,2,0,0,0,0,0,0,1,0,0,1,0 +output/Rajendran (-novlhIAAAAJ)/Samsami2024-MasteringMemory.bib,1,0,0,0,0,0,0,0,0,0,1,0 output/Rajendran (-novlhIAAAAJ)/Bouchoucha2024-TowardDebugging.bib,4,0,0,1,1,0,0,1,0,0,1,0 -output/Sajjad (t3BH6NkAAAAJ)/Dalvi2023-NxPlainWeb.bib,2,0,0,0,0,0,0,1,0,0,1,0 +output/Sajjad (t3BH6NkAAAAJ)/Dalvi2023-NxPlainWeb.bib,3,0,0,0,1,0,1,0,0,0,1,0 output/Rajendran (-novlhIAAAAJ)/Govindarajan2023-BehavioralCloning.bib,0,0,0,0,0,0,0,0,0,0,0,0 -output/Rajendran (-novlhIAAAAJ)/Zhao2023-ConditionallyOptimistic.bib,2,0,0,0,0,0,0,1,0,0,1,0 +output/Rajendran (-novlhIAAAAJ)/Zhao2023-ConditionallyOptimistic.bib,2,0,0,0,0,0,1,0,0,0,1,0 output/Sajjad (t3BH6NkAAAAJ)/Sajjad2023-EffectDropping.bib,6,0,1,1,1,0,1,1,0,0,1,0 -output/Rajendran (-novlhIAAAAJ)/Nekoei2023-DealingNon.bib,2,0,0,0,0,0,0,1,0,0,1,0 -output/Rajendran (-novlhIAAAAJ)/Rahimikalahroudi2023-ReplayBuffer.bib,2,0,0,0,0,0,0,1,0,0,1,0 +output/Rajendran (-novlhIAAAAJ)/Nekoei2023-DealingNon.bib,1,0,0,0,0,0,0,0,0,0,1,0 +output/Rajendran (-novlhIAAAAJ)/Rahimikalahroudi2023-ReplayBuffer.bib,2,0,0,0,0,0,1,0,0,0,1,0 output/Sajjad (t3BH6NkAAAAJ)/Khan2020-ClusteringFramework.bib,5,0,1,1,1,0,0,1,0,0,1,0 -output/Rajendran (-novlhIAAAAJ)/Nekoei2023-TowardsFew.bib,2,0,0,0,0,0,0,1,0,0,1,0 +output/Rajendran (-novlhIAAAAJ)/Nekoei2023-TowardsFew.bib,1,0,0,0,0,0,0,0,0,0,1,0 output/Sajjad (t3BH6NkAAAAJ)/Iqbal2022-AlleviatingDeleterious.bib,4,0,0,1,1,0,0,1,0,0,1,0 output/Haque (PMTOOSQAAAAJ)/Zhao2021-AnalyzingImpact.bib,0,0,0,0,0,0,0,0,0,0,0,0 -output/Rajendran (-novlhIAAAAJ)/Prato2022-PatchBlenderMotion.bib,2,0,0,0,0,0,0,1,0,0,1,0 +output/Rajendran (-novlhIAAAAJ)/Prato2022-PatchBlenderMotion.bib,1,0,0,0,0,0,0,0,0,0,1,0 output/Sajjad (t3BH6NkAAAAJ)/Sajjad2022-AnalyzingEncoded.bib,5,0,0,1,1,0,1,1,0,0,1,0 -output/Rajendran (-novlhIAAAAJ)/Wan2022-TowardsEvaluating.bib,2,0,0,0,0,0,0,1,0,0,1,0 +output/Rajendran (-novlhIAAAAJ)/Wan2022-TowardsEvaluating.bib,1,0,0,0,0,0,0,0,0,0,1,0 output/Sajjad (t3BH6NkAAAAJ)/Poncelas2022-ClusterBased.bib,0,0,0,0,0,0,0,0,0,0,0,0 output/Sajjad (t3BH6NkAAAAJ)/Dalvi2022-DiscoveringLatent.bib,2,0,0,0,0,0,0,1,0,0,1,0 output/Sajjad (t3BH6NkAAAAJ)/Sajjad2021-EffectPost.bib,2,0,0,0,0,0,0,1,0,0,1,0 @@ -576,10 +574,10 @@ output/Blustein (7g6iU9QAAAAJ)/Matteo2020-FrameworkEvaluate.bib,3,0,0,1,1,0,0,0, output/Milios (ME8aQywAAAAJ)/Cabral2020-VisualAnalysis.bib,4,0,0,1,1,0,0,1,0,0,1,0 output/Milios (ME8aQywAAAAJ)/Sousa2020-WordSense.bib,4,0,0,1,1,0,0,1,0,0,1,0 output/Blustein (7g6iU9QAAAAJ)/Allam2020-IfYou.bib,4,0,0,1,1,0,0,1,0,0,1,0 -output/Rajendran (-novlhIAAAAJ)/Brooks2021-ReinforcementLearning.bib,2,0,0,0,0,0,0,1,0,0,1,0 +output/Rajendran (-novlhIAAAAJ)/Brooks2021-ReinforcementLearning.bib,2,0,0,0,0,0,1,0,0,0,1,0 output/Blustein (7g6iU9QAAAAJ)/Revere2020-TranshierarchyStable.bib,2,0,0,1,0,0,0,0,0,0,1,0 output/Hernandez-Castillo (rSrWYaIAAAAJ)/Hernandezcastillo2020-CerebellarThalamic.bib,5,0,0,0,1,0,0,1,1,1,1,0 -output/Wu (IdBlVPUAAAAJ)/Wu2020-OneClass.bib,1,0,0,0,0,0,0,1,0,0,0,0 +output/Wu (IdBlVPUAAAAJ)/Wu2020-OneClass.bib,0,0,0,0,0,0,0,0,0,0,0,0 output/Hernandez-Castillo (rSrWYaIAAAAJ)/Hernandezcastillo2020-SensoryInformation.bib,6,0,0,1,1,0,0,1,1,1,1,0 output/Rajendran (-novlhIAAAAJ)/Biester2021-UnderstandingImpact.bib,4,0,0,1,1,0,0,1,0,0,1,0 output/Malloch (iQa0leoAAAAJ)/Homami2025-DoVirtual.bib,4,0,0,1,1,0,0,1,0,0,1,0 @@ -603,7 +601,7 @@ output/Rajendran (-novlhIAAAAJ)/Rajendran2020-HowShould.bib,4,0,0,1,1,0,0,1,0,0, output/Escobedo (lPSfdqAAAAAJ)/Beltran2026-ExploringManifold.bib,3,0,0,0,1,0,0,1,0,0,1,0 output/Escobedo (lPSfdqAAAAAJ)/Lepesalazar2025-NoviceFriendly.bib,4,0,0,1,1,0,0,1,0,0,1,0 output/Escobedo (lPSfdqAAAAAJ)/Cibrian2025-OpticalCharacter.bib,4,0,0,1,1,0,0,1,0,0,1,0 -output/Rajendran (-novlhIAAAAJ)/Rajendran2020-MetaLearning.bib,2,0,0,0,0,0,0,1,0,0,1,0 +output/Rajendran (-novlhIAAAAJ)/Rajendran2020-MetaLearning.bib,2,0,0,0,0,0,1,0,0,0,1,0 output/Escobedo (lPSfdqAAAAAJ)/Contreras2024-AICompanions.bib,4,0,0,1,1,0,0,1,0,0,1,0 output/Escobedo (lPSfdqAAAAAJ)/Cibrian2024-AnalyzingHandwriting.bib,4,0,0,1,1,0,0,1,0,0,1,0 output/Escobedo (lPSfdqAAAAAJ)/Espinosa2023-DesigningStress.bib,4,0,0,1,1,0,0,1,0,0,1,0 @@ -664,23 +662,23 @@ output/Malloch (iQa0leoAAAAJ)/Hu2021-ComparativeEvaluation.bib,3,0,0,1,0,0,0,1,0 output/Mattheisen (uhlDFm4AAAAJ)/Oconnell2025-GenomicsYields.bib,5,0,0,1,1,0,0,0,1,1,1,0 output/Haque (PMTOOSQAAAAJ)/Ifath2021-RaptorRapid.bib,2,0,0,1,0,0,0,0,0,0,1,0 output/Mattheisen (uhlDFm4AAAAJ)/Grotzinger2025-MappingGenetic.bib,5,0,0,1,1,0,0,1,1,0,1,0 -output/Mattheisen (uhlDFm4AAAAJ)/Halvorsen2025-PersistentTic.bib,5,0,0,0,1,0,0,1,1,1,1,0 +output/Mattheisen (uhlDFm4AAAAJ)/Halvorsen2025-PersistentTic.bib,4,0,0,0,1,0,0,0,1,1,1,0 output/Mattheisen (uhlDFm4AAAAJ)/Smit2025-PolygenicPrediction.bib,4,0,0,1,1,0,0,0,1,0,1,0 output/Mattheisen (uhlDFm4AAAAJ)/Storch2026-PredictiveValidity.bib,4,0,0,1,1,0,0,0,0,1,1,0 output/Mattheisen (uhlDFm4AAAAJ)/Zhu2025-PredictorsAnorexia.bib,5,0,0,1,1,0,0,1,0,1,1,0 output/Mattheisen (uhlDFm4AAAAJ)/Storch2025-PsychometricProperties.bib,4,0,0,1,1,0,0,0,0,1,1,0 output/Mattheisen (uhlDFm4AAAAJ)/Desroches2023-ImpactParental.bib,5,0,0,1,1,0,0,1,1,0,1,0 -output/Mattheisen (uhlDFm4AAAAJ)/Grotzinger2025-LandscapeShared.bib,5,0,0,0,1,0,0,1,1,1,1,0 +output/Mattheisen (uhlDFm4AAAAJ)/Grotzinger2025-LandscapeShared.bib,4,0,0,0,1,0,0,0,1,1,1,0 output/Mattheisen (uhlDFm4AAAAJ)/Wagner2025-TransdiagnosticLinks.bib,4,0,0,1,1,0,0,0,0,1,1,0 output/Mattheisen (uhlDFm4AAAAJ)/Strom2025-W25Checking.bib,4,0,0,1,1,0,0,1,0,0,1,0 output/Heywood (_d-AGjUAAAAJ)/Kelly2021-EmergentTangled.bib,4,0,0,1,1,0,0,1,0,0,1,0 output/Mattheisen (uhlDFm4AAAAJ)/Yu2024-79Deciphering.bib,4,0,0,1,1,0,0,1,0,0,1,0 -output/Mattheisen (uhlDFm4AAAAJ)/Holla2024-CrossAncestry.bib,5,0,0,0,1,0,0,1,1,1,1,0 +output/Mattheisen (uhlDFm4AAAAJ)/Holla2024-CrossAncestry.bib,4,0,0,0,1,0,0,0,1,1,1,0 output/Mattheisen (uhlDFm4AAAAJ)/Hess2023-PolygenicResilience.bib,6,0,1,1,1,0,0,1,0,1,1,0 output/Haque (PMTOOSQAAAAJ)/Haque2021-SoftIoTResource.bib,4,0,0,1,1,0,0,1,0,0,1,0 output/Mattheisen (uhlDFm4AAAAJ)/Kim2024-ContributionCommon.bib,4,0,1,1,1,0,0,0,0,0,1,0 output/Mattheisen (uhlDFm4AAAAJ)/Kohshour2024-GeneticsPsychiatric.bib,3,0,0,0,1,0,0,1,0,0,1,0 -output/Mattheisen (uhlDFm4AAAAJ)/Strom2024-GenomeWide.bib,5,0,0,0,1,0,0,1,1,1,1,0 +output/Mattheisen (uhlDFm4AAAAJ)/Strom2024-GenomeWide.bib,4,0,0,0,1,0,0,0,1,1,1,0 output/Sajjad (t3BH6NkAAAAJ)/Sajjad2021-FineGrained.bib,5,0,1,1,1,0,0,1,0,0,1,0 output/Mattheisen (uhlDFm4AAAAJ)/Strom2024-GenomeWideAssociation.bib,6,0,1,1,1,0,0,1,0,1,1,0 output/Mattheisen (uhlDFm4AAAAJ)/Crowley2023-LatinAmerican.bib,4,0,0,1,1,0,0,0,0,1,1,0 @@ -689,8 +687,8 @@ output/Mattheisen (uhlDFm4AAAAJ)/Ou2024-LithiumResponse.bib,6,0,1,1,1,0,0,0,1,1, output/Mattheisen (uhlDFm4AAAAJ)/Mcausland2024-GeneticArchitecture.bib,6,0,0,1,1,0,0,1,1,1,1,0 output/Mattheisen (uhlDFm4AAAAJ)/Als2023-DepressionPathophysiology.bib,6,0,0,1,1,0,0,1,1,1,1,0 output/Mattheisen (uhlDFm4AAAAJ)/Shekhar2023-F50Integrative.bib,3,0,0,1,1,0,0,0,0,0,1,0 -output/Kryven (5ogGlooAAAAJ)/Kryven2025-CognitiveMaps.bib,2,0,0,0,0,0,0,1,0,0,1,0 -output/Kryven (5ogGlooAAAAJ)/Gevasagiv2025-FrontoHippocampal.bib,4,0,0,0,1,0,0,1,0,1,1,0 +output/Kryven (5ogGlooAAAAJ)/Kryven2025-CognitiveMaps.bib,2,0,0,0,0,0,1,0,0,0,1,0 +output/Kryven (5ogGlooAAAAJ)/Gevasagiv2025-FrontoHippocampal.bib,3,0,0,0,1,0,0,0,0,1,1,0 output/Mattheisen (uhlDFm4AAAAJ)/Wang2023-PolygenicRisk.bib,3,0,0,1,1,0,0,0,0,0,1,0 output/Kryven (5ogGlooAAAAJ)/Piriyakulkij2025-PoEWorld.bib,1,0,0,0,0,0,0,0,0,0,1,0 output/Kryven (5ogGlooAAAAJ)/Zeng2025-SocialBehaviour.bib,0,0,0,0,0,0,0,0,0,0,0,0 @@ -723,13 +721,13 @@ output/Mattheisen (uhlDFm4AAAAJ)/Morrill2022-CrossSpecies.bib,3,0,0,1,1,0,0,0,0, output/Mattheisen (uhlDFm4AAAAJ)/Mullins2022-DissectingShared.bib,5,0,1,1,1,0,0,0,0,1,1,0 output/Mattheisen (uhlDFm4AAAAJ)/Grotzinger2022-GeneticArchitecture.bib,5,0,0,1,1,0,0,1,1,0,1,0 output/Mattheisen (uhlDFm4AAAAJ)/Naamanka2022-GenomeWide.bib,4,0,1,1,1,0,0,0,0,0,1,0 -output/Mattheisen (uhlDFm4AAAAJ)/Als2022-Identification64.bib,4,0,0,0,1,0,0,1,0,1,1,0 +output/Mattheisen (uhlDFm4AAAAJ)/Als2022-Identification64.bib,3,0,0,0,1,0,0,0,0,1,1,0 output/Mattheisen (uhlDFm4AAAAJ)/Mattheisen2022-IdentificationShared.bib,5,0,0,1,1,0,0,0,1,1,1,0 output/Mattheisen (uhlDFm4AAAAJ)/Pain2022-IdentifyingCommon.bib,4,0,0,1,1,0,0,0,0,1,1,0 output/Mattheisen (uhlDFm4AAAAJ)/Pardinas2022-InteractionTesting.bib,4,0,1,1,1,0,0,0,0,0,1,0 output/Mattheisen (uhlDFm4AAAAJ)/Trubetskoy2022-MappingGenomic.bib,5,0,0,1,1,0,0,0,1,1,1,0 output/Mattheisen (uhlDFm4AAAAJ)/Wallert2022-MultiPsych.bib,4,0,1,1,1,0,0,0,0,0,1,0 -output/Rudzicz (elXOB1sAAAAJ)/Berlotattwell2021-UseLinguistic.bib,2,0,0,0,0,0,0,1,0,0,1,0 +output/Rudzicz (elXOB1sAAAAJ)/Berlotattwell2021-UseLinguistic.bib,1,0,0,0,0,0,0,0,0,0,1,0 output/Mattheisen (uhlDFm4AAAAJ)/Adepalli2022-P283Developmental.bib,5,0,1,1,1,0,0,1,0,0,1,0 output/Mattheisen (uhlDFm4AAAAJ)/Strom2022-P462Genome.bib,4,0,0,1,1,0,0,1,0,0,1,0 output/Mattheisen (uhlDFm4AAAAJ)/Bigdeli2022-PenetrancePleiotropy.bib,5,0,0,1,1,0,0,1,1,0,1,0 @@ -739,20 +737,20 @@ output/Sajjad (t3BH6NkAAAAJ)/Seyffarth2021-ImplicitRepresentations.bib,0,0,0,0,0 output/Mattheisen (uhlDFm4AAAAJ)/Mahjani2022-GeneticArchitecture.bib,6,0,0,1,1,0,0,1,1,1,1,0 output/Mattheisen (uhlDFm4AAAAJ)/Yilmaz2022-RoleEarly.bib,5,0,0,1,1,0,0,1,0,1,1,0 output/Haque (PMTOOSQAAAAJ)/Siddique2021-TowardsNetwork.bib,4,0,0,1,1,0,0,1,0,0,1,0 -output/Kryven (5ogGlooAAAAJ)/Ecanow2021-CoreKnowledge.bib,1,0,0,0,0,0,0,1,0,0,0,0 -output/Kryven (5ogGlooAAAAJ)/Sharma2021-MapInduction.bib,2,0,0,0,0,0,0,1,0,0,1,0 +output/Kryven (5ogGlooAAAAJ)/Ecanow2021-CoreKnowledge.bib,0,0,0,0,0,0,0,0,0,0,0,0 +output/Kryven (5ogGlooAAAAJ)/Sharma2021-MapInduction.bib,1,0,0,0,0,0,0,0,0,0,1,0 output/Mattheisen (uhlDFm4AAAAJ)/Hettema2021-65Updated.bib,4,0,0,1,1,0,0,1,0,0,1,0 output/Malloch (iQa0leoAAAAJ)/Singh2021-StoryCreatAR.bib,4,0,0,1,1,0,0,1,0,0,1,0 output/Rudzicz (elXOB1sAAAAJ)/Nasreen2021-PopulationBased.bib,5,0,0,1,1,0,0,1,0,1,1,0 output/Malloch (iQa0leoAAAAJ)/Franz2020-CompensatingPerspective.bib,4,0,0,1,1,0,0,1,0,0,1,0 -output/Kryven (5ogGlooAAAAJ)/Qian2021-ModelingHuman.bib,2,0,0,0,0,0,0,1,0,0,1,0 +output/Kryven (5ogGlooAAAAJ)/Qian2021-ModelingHuman.bib,1,0,0,0,0,0,0,0,0,0,1,0 output/Sajjad (t3BH6NkAAAAJ)/Durrani2020-AnalyzingIndividual.bib,4,0,0,1,1,0,0,1,0,0,1,0 output/Rahman (9SrqOewAAAAJ)/Samir2026-ImprovedBug.bib,3,0,0,1,1,0,0,0,0,0,1,0 output/Rahman (9SrqOewAAAAJ)/Mukherjee2026-BugMentorGenerating.bib,4,0,0,1,1,0,0,1,0,0,1,0 output/Rahman (9SrqOewAAAAJ)/Jahan2025-CanHessian.bib,3,0,0,1,1,0,0,0,0,0,1,0 output/Rahman (9SrqOewAAAAJ)/Shah2025-ImitationGame.bib,4,0,0,1,1,0,0,1,0,0,1,0 output/Rahman (9SrqOewAAAAJ)/Jahan2025-ImprovedDetection.bib,4,0,0,1,1,0,0,1,0,0,1,0 -output/Kryven (5ogGlooAAAAJ)/Yang2021-ModelingHuman.bib,1,0,0,0,0,0,0,1,0,0,0,0 +output/Kryven (5ogGlooAAAAJ)/Yang2021-ModelingHuman.bib,0,0,0,0,0,0,0,0,0,0,0,0 output/Rahman (9SrqOewAAAAJ)/Yeasmin2025-TowardsEnhancing.bib,5,0,1,1,1,0,0,1,0,0,1,0 output/Mattheisen (uhlDFm4AAAAJ)/Ni2021-ComparisonTen.bib,4,0,0,1,1,0,0,0,0,1,1,0 output/Rahman (9SrqOewAAAAJ)/Jahan2025-TowardsUnderstanding.bib,4,0,0,1,1,0,0,1,0,0,1,0 @@ -774,17 +772,17 @@ output/Rahman (9SrqOewAAAAJ)/Muse2020-PrevalenceImpact.bib,5,0,1,1,1,0,0,1,0,0,1 output/Heywood (_d-AGjUAAAAJ)/Copstein2021-LogAbstraction.bib,4,0,0,1,1,0,0,1,0,0,1,0 output/Rahman (9SrqOewAAAAJ)/Mondal2022-ReproducibilityProgramming.bib,4,0,0,1,1,0,0,1,0,0,1,0 output/Rahman (9SrqOewAAAAJ)/Rahman2022-WorksMe.bib,4,0,0,1,1,0,0,1,0,0,1,0 -output/He (4yj_9skAAAAJ)/Gagie2026-CompressedSet.bib,2,0,0,0,0,0,0,1,0,0,1,0 +output/He (4yj_9skAAAAJ)/Gagie2026-CompressedSet.bib,1,0,0,0,0,0,0,0,0,0,1,0 output/He (4yj_9skAAAAJ)/He2025-PathAncestor.bib,1,0,0,0,0,0,0,0,0,0,1,0 output/He (4yj_9skAAAAJ)/He2025-SuccinctData.bib,2,0,0,1,0,0,0,0,0,0,1,0 output/Sajjad (t3BH6NkAAAAJ)/Dalvi2020-AnalyzingRedundancy.bib,5,0,1,1,1,0,0,1,0,0,1,0 output/He (4yj_9skAAAAJ)/He2024-ClosingGap.bib,0,0,0,0,0,0,0,0,0,0,0,0 output/He (4yj_9skAAAAJ)/Chen2023-DistanceQueries.bib,4,0,0,1,1,0,0,1,0,0,1,0 -output/Kalyaniwalla (QffVmMIAAAAJ)/Beck2023-SignalProcessing.bib,2,0,0,0,0,0,0,1,0,0,1,0 +output/Kalyaniwalla (QffVmMIAAAAJ)/Beck2023-SignalProcessing.bib,1,0,0,0,0,0,0,0,0,0,1,0 output/Kalyaniwalla (QffVmMIAAAAJ)/Ghandehari2022-NoncommutativeApproach.bib,2,0,0,0,1,0,0,0,0,0,1,0 output/Wilde (lkAmFEEAAAAJ)/Gimenez2025-CrossEntropy.bib,4,0,0,1,1,0,0,1,0,0,1,0 output/He (4yj_9skAAAAJ)/He2024-GuestEditorial.bib,5,0,1,1,1,0,0,1,0,0,1,0 -output/Kryven (5ogGlooAAAAJ)/Yu2021-UnpackingComputations.bib,1,0,0,0,0,0,0,1,0,0,0,0 +output/Kryven (5ogGlooAAAAJ)/Yu2021-UnpackingComputations.bib,0,0,0,0,0,0,0,0,0,0,0,0 output/Wilde (lkAmFEEAAAAJ)/Dutta2025-InformativePath.bib,4,0,0,1,1,0,0,1,0,0,1,0 output/He (4yj_9skAAAAJ)/Gao2024-ApproximateColored.bib,4,0,0,1,1,0,0,1,0,0,1,0 output/Wilde (lkAmFEEAAAAJ)/Botros2024-RegretBased.bib,4,0,0,1,1,0,0,1,0,0,1,0 @@ -808,37 +806,36 @@ output/Wilde (lkAmFEEAAAAJ)/Dutta2023-ApproximationAlgorithms.bib,4,0,0,1,1,0,0, output/Wilde (lkAmFEEAAAAJ)/Wilde2022-DoWe.bib,0,0,0,0,0,0,0,0,0,0,0,0 output/Mattheisen (uhlDFm4AAAAJ)/Macleod2021-MobileSensing.bib,6,0,0,1,1,0,0,1,1,1,1,0 output/Wilde (lkAmFEEAAAAJ)/Botros2022-ErrorBounded.bib,4,0,0,1,1,0,1,0,0,0,1,0 -output/Wilde (lkAmFEEAAAAJ)/Wilde2021-LearningReward.bib,2,0,0,0,0,0,0,1,0,0,1,0 +output/Wilde (lkAmFEEAAAAJ)/Wilde2021-LearningReward.bib,1,0,0,0,0,0,0,0,0,0,1,0 output/He (4yj_9skAAAAJ)/He2022-DataStructures.bib,3,0,0,1,1,0,0,0,0,0,1,0 output/Kryven (5ogGlooAAAAJ)/Bongiorno2021-VectorBased.bib,5,0,0,1,1,0,0,0,1,1,1,0 output/Sajjad (t3BH6NkAAAAJ)/Suwaileh2020-AreWe.bib,4,0,0,1,1,0,0,1,0,0,1,0 output/He (4yj_9skAAAAJ)/Gao2022-FasterPath.bib,2,0,0,1,0,0,0,0,0,0,1,0 output/He (4yj_9skAAAAJ)/Das2022-InternalMasked.bib,4,0,0,1,1,0,0,1,0,0,1,0 output/Wilde (lkAmFEEAAAAJ)/Wilde2022-OnlineMulti.bib,4,0,0,1,1,0,0,1,0,0,1,0 -output/He (4yj_9skAAAAJ)/Lyu2022-RulerRolling.bib,2,0,0,0,0,0,0,1,0,0,1,0 +output/He (4yj_9skAAAAJ)/Lyu2022-RulerRolling.bib,1,0,0,0,0,0,0,0,0,0,1,0 output/Wilde (lkAmFEEAAAAJ)/Cai2022-SchedulingOperator.bib,5,0,0,1,1,0,1,1,0,0,1,0 output/He (4yj_9skAAAAJ)/Das2022-ShortestBeer.bib,3,0,0,1,0,0,0,1,0,0,1,0 output/Wilde (lkAmFEEAAAAJ)/Wilde2022-LearningSubmodular.bib,4,0,0,1,1,0,1,0,0,0,1,0 -output/Kryven (5ogGlooAAAAJ)/Shu2020-AdventuresFlatland.bib,1,0,0,0,0,0,0,1,0,0,0,0 +output/Kryven (5ogGlooAAAAJ)/Shu2020-AdventuresFlatland.bib,0,0,0,0,0,0,0,0,0,0,0,0 output/Sajjad (t3BH6NkAAAAJ)/Specia2020-FindingsWMT.bib,4,0,0,1,1,0,0,1,0,0,1,0 -output/Kryven (5ogGlooAAAAJ)/Tian2020-LearningAbstract.bib,2,0,0,0,0,0,0,1,0,0,1,0 -output/Rudzicz (elXOB1sAAAAJ)/Zhu2021-QuantifyingTask.bib,2,0,0,0,0,0,0,1,0,0,1,0 +output/Kryven (5ogGlooAAAAJ)/Tian2020-LearningAbstract.bib,1,0,0,0,0,0,0,0,0,0,1,0 +output/Rudzicz (elXOB1sAAAAJ)/Zhu2021-QuantifyingTask.bib,2,0,0,0,0,0,1,0,0,0,1,0 output/Haque (PMTOOSQAAAAJ)/Shojaee2020-SafeGuardCongestion.bib,4,0,0,1,1,0,0,1,0,0,1,0 output/He (4yj_9skAAAAJ)/Gao2021-SpaceEfficient.bib,2,0,0,1,0,0,0,0,0,0,1,0 output/Haque (PMTOOSQAAAAJ)/Bradai2020-SoftwareDefined.bib,4,0,1,0,1,0,0,1,0,0,1,0 output/Rahman (9SrqOewAAAAJ)/Mondal2021-EarlyDetection.bib,4,0,0,1,1,0,0,1,0,0,1,0 output/Wilde (lkAmFEEAAAAJ)/Wilde2020-ActivePreference.bib,4,0,0,1,1,0,0,1,0,0,1,0 output/Sajjad (t3BH6NkAAAAJ)/Belinkov2020-LinguisticRepresentational.bib,3,0,0,0,1,0,0,1,0,0,1,0 -output/Sajjad (t3BH6NkAAAAJ)/Sajjad2020-PoorMan.bib,1,0,0,0,0,0,0,1,0,0,0,0 output/Sajjad (t3BH6NkAAAAJ)/Alishahi2020-ProceedingsThird.bib,1,0,0,0,0,0,0,1,0,0,0,0 output/Sajjad (t3BH6NkAAAAJ)/Wu2020-SimilarityAnalysis.bib,4,0,0,1,1,0,0,1,0,0,1,0 -output/Zeh (GoTWlmgAAAAJ)/Holtgrefe2026-LimitsKernelization.bib,2,0,0,0,0,0,0,1,0,0,1,0 -output/Zeh (GoTWlmgAAAAJ)/Schestag2026-FirstKnown.bib,2,0,0,0,0,0,0,1,0,0,1,0 +output/Zeh (GoTWlmgAAAAJ)/Holtgrefe2026-LimitsKernelization.bib,1,0,0,0,0,0,0,0,0,0,1,0 +output/Zeh (GoTWlmgAAAAJ)/Schestag2026-FirstKnown.bib,1,0,0,0,0,0,0,0,0,0,1,0 output/Zeh (GoTWlmgAAAAJ)/Dempsey2025-Simple4.bib,5,0,1,1,1,0,0,1,0,0,1,0 output/Zeh (GoTWlmgAAAAJ)/Weller2025-WhenMany.bib,3,0,0,0,1,0,0,1,0,0,1,0 output/Zeh (GoTWlmgAAAAJ)/Deen2024-NearLinear.bib,4,0,0,1,1,0,0,1,0,0,1,0 output/He (4yj_9skAAAAJ)/Gagie2020-CompressedDynamic.bib,4,0,0,1,1,0,0,1,0,0,1,0 -output/Zeh (GoTWlmgAAAAJ)/Dempsey2024-WildSheep.bib,2,0,0,0,0,0,0,1,0,0,1,0 +output/Zeh (GoTWlmgAAAAJ)/Dempsey2024-WildSheep.bib,1,0,0,0,0,0,0,0,0,0,1,0 output/Zeh (GoTWlmgAAAAJ)/Hong2024-AnotherVirtue.bib,5,0,1,1,1,0,0,1,0,0,1,0 output/Zeh (GoTWlmgAAAAJ)/Saeidi2023-ContextEnhanced.bib,4,0,0,1,1,0,0,1,0,0,1,0 output/Zeh (GoTWlmgAAAAJ)/Lyu2023-SumLocal.bib,4,0,0,1,1,0,0,1,0,0,1,0 @@ -896,7 +893,7 @@ output/Wilde (lkAmFEEAAAAJ)/Wilde2020-ImprovingUser.bib,4,0,0,1,1,0,0,1,0,0,1,0 output/Heywood (_d-AGjUAAAAJ)/Loginov2020-StockSelection.bib,4,0,0,1,1,0,0,1,0,0,1,0 output/Rudzicz (elXOB1sAAAAJ)/Sinclair2021-MachineLearning.bib,4,0,0,1,1,0,0,1,0,0,1,0 output/Heywood (_d-AGjUAAAAJ)/Le2021-TrainingRegime.bib,3,0,0,1,1,0,0,0,0,0,1,0 -output/Rudzicz (elXOB1sAAAAJ)/Zhu2021-WhatDo.bib,2,0,0,0,0,0,0,1,0,0,1,0 +output/Rudzicz (elXOB1sAAAAJ)/Zhu2021-WhatDo.bib,2,0,0,0,0,0,1,0,0,0,1,0 output/Heywood (_d-AGjUAAAAJ)/Le2020-AnalyzingData.bib,4,0,0,1,1,0,0,1,0,0,1,0 output/Rudzicz (elXOB1sAAAAJ)/Pouprom2020-ConversationalRobot.bib,4,0,0,1,1,0,0,1,0,0,1,0 output/Heywood (_d-AGjUAAAAJ)/Smith2020-EvolvingDota.bib,4,0,0,1,1,0,0,1,0,0,1,0 @@ -907,9 +904,9 @@ output/Heywood (_d-AGjUAAAAJ)/Loginov2020-DifferentImpacts.bib,3,0,0,1,1,0,0,0,0 output/Zeh (GoTWlmgAAAAJ)/Saeidi2021-GraphRepresentation.bib,3,0,0,0,1,0,0,1,0,0,1,0 output/Ralph (oRBuFa0AAAAJ)/Baltes2025-GuidelinesEmpirical.bib,1,0,0,0,0,0,0,0,0,0,1,0 output/Ralph (oRBuFa0AAAAJ)/Kuutila2025-MethodologicalPractical.bib,4,0,0,1,1,0,0,1,0,0,1,0 -output/Ralph (oRBuFa0AAAAJ)/Kuutila2025-StayingOr.bib,2,0,0,0,0,0,0,1,0,0,1,0 +output/Ralph (oRBuFa0AAAAJ)/Kuutila2025-StayingOr.bib,1,0,0,0,0,0,0,0,0,0,1,0 output/Ralph (oRBuFa0AAAAJ)/Jackson2025-ImpactGenerative.bib,3,0,0,1,1,0,0,0,0,0,1,0 -output/Ralph (oRBuFa0AAAAJ)/Kuutila2025-SoftwareInfrastructure.bib,2,0,0,0,0,0,0,1,0,0,1,0 +output/Ralph (oRBuFa0AAAAJ)/Kuutila2025-SoftwareInfrastructure.bib,1,0,0,0,0,0,0,0,0,0,1,0 output/Wilde (lkAmFEEAAAAJ)/Wilde2020-LearningUser.bib,4,0,0,1,1,0,0,1,0,0,1,0 output/Ralph (oRBuFa0AAAAJ)/Ayoola2025-UserPersonas.bib,3,0,0,1,1,0,0,0,0,0,1,0 output/Ralph (oRBuFa0AAAAJ)/Russo2024-GenerativeAI.bib,4,0,0,1,1,0,0,1,0,0,1,0 @@ -929,7 +926,7 @@ output/Ralph (oRBuFa0AAAAJ)/Chatterjee2022-EmpiricalStandards.bib,3,0,0,0,1,0,0, output/Rahman (9SrqOewAAAAJ)/Jebnoun2020-ScentDeep.bib,2,0,0,1,0,0,0,0,0,0,1,0 output/Ralph (oRBuFa0AAAAJ)/Ralph2022-PavingWay.bib,4,0,0,1,1,0,0,1,0,0,1,0 output/Ralph (oRBuFa0AAAAJ)/Sturdee2022-PersonalityTraits.bib,4,0,0,1,1,0,0,1,0,0,1,0 -output/Ralph (oRBuFa0AAAAJ)/Santos2022-PracticesImprove.bib,3,0,0,0,0,0,0,1,0,1,1,0 +output/Ralph (oRBuFa0AAAAJ)/Santos2022-PracticesImprove.bib,3,0,0,0,1,0,0,0,0,1,1,0 output/Mattheisen (uhlDFm4AAAAJ)/Mattheisen2021-WhatHave.bib,6,0,0,1,1,0,0,1,1,1,1,0 output/Ralph (oRBuFa0AAAAJ)/Baltes2022-SamplingSoftware.bib,4,0,0,1,1,0,0,1,0,0,1,0 output/Ralph (oRBuFa0AAAAJ)/Gren2022-WhatMakes.bib,3,0,0,1,1,0,0,0,0,0,1,0 @@ -944,7 +941,7 @@ output/Bodorik (wBYq09wAAAAJ)/Liu2024-TransformingAutomatically.bib,4,0,0,1,1,0, output/Bodorik (wBYq09wAAAAJ)/Liu2023-LongTerm.bib,3,0,0,0,1,0,0,1,0,0,1,0 output/Bodorik (wBYq09wAAAAJ)/Bodorik2023-TABSTransforming.bib,4,0,0,1,1,0,0,1,0,0,1,0 output/Bodorik (wBYq09wAAAAJ)/Liu2022-AutomatingSmart.bib,3,0,0,1,1,0,0,0,0,0,1,0 -output/Kryven (5ogGlooAAAAJ)/Pu2020-ProgramSynthesis.bib,2,0,0,0,0,0,0,1,0,0,1,0 +output/Kryven (5ogGlooAAAAJ)/Pu2020-ProgramSynthesis.bib,1,0,0,0,0,0,0,0,0,0,1,0 output/Bodorik (wBYq09wAAAAJ)/Liu2022-SupportingLong.bib,4,0,0,1,1,0,0,1,0,0,1,0 output/Bodorik (wBYq09wAAAAJ)/Liu2021-ToolMoving.bib,3,0,0,1,1,0,0,0,0,0,1,0 output/Ye (4OQaVGUAAAAJ)/Li2026-DelayTrajectory.bib,4,0,0,1,1,0,0,1,0,0,1,0 @@ -1036,7 +1033,7 @@ output/Bodorik (wBYq09wAAAAJ)/Bodorik2021-FSMsFind.bib,2,0,0,1,0,0,0,0,0,0,1,0 output/Evans (NqlOPkMAAAAJ)/Shahzad2025-DevelopingInnovation.bib,4,0,0,1,1,0,0,1,0,0,1,0 output/Evans (NqlOPkMAAAAJ)/Mubarak2025-DrivingNew.bib,3,0,0,1,1,0,0,0,0,0,1,0 output/Evans (NqlOPkMAAAAJ)/Shan2025-EditorialExploration.bib,5,0,0,1,1,0,0,0,1,1,1,0 -output/Rudzicz (elXOB1sAAAAJ)/Kostas2020-DN3Open.bib,4,0,0,0,1,0,0,1,0,1,1,0 +output/Rudzicz (elXOB1sAAAAJ)/Kostas2020-DN3Open.bib,3,0,0,0,1,0,0,0,0,1,1,0 output/Evans (NqlOPkMAAAAJ)/Zhang2025-ExaminingHealthcare.bib,6,0,0,1,1,0,0,1,1,1,1,0 output/Evans (NqlOPkMAAAAJ)/Forward2025-ExploringDifferences.bib,5,0,0,1,1,0,0,1,0,1,1,0 output/Evans (NqlOPkMAAAAJ)/Dzandu2025-ExploringDigital.bib,4,0,0,1,1,0,0,1,0,0,1,0 @@ -1126,7 +1123,7 @@ output/Orji (-1cHtBQAAAAJ)/Nwagu2026-InsightsTrends.bib,4,0,0,1,1,0,0,1,0,0,1,0 output/Zeh (GoTWlmgAAAAJ)/Iersel2020-PolynomialTime.bib,7,0,1,1,1,0,0,1,1,1,1,0 output/Evans (NqlOPkMAAAAJ)/Ahumadatello2023-ImpactAI.bib,4,0,0,1,1,0,0,1,0,0,1,0 output/Orji (-1cHtBQAAAAJ)/Olatinwo2026-InterpretableEEG.bib,3,0,0,1,1,0,0,0,0,0,1,0 -output/Orji (-1cHtBQAAAAJ)/Riyadh2026-LOCASAI.bib,3,0,0,0,1,0,0,1,0,0,1,0 +output/Orji (-1cHtBQAAAAJ)/Riyadh2026-LOCASAI.bib,2,0,0,0,1,0,0,0,0,0,1,0 output/Ralph (oRBuFa0AAAAJ)/Sedano2020-DualTrack.bib,4,0,0,1,1,0,0,1,0,0,1,0 output/Orji (-1cHtBQAAAAJ)/Chan2024-PanoramicView.bib,4,0,0,1,1,0,0,1,0,0,1,0 output/Evans (NqlOPkMAAAAJ)/Li2023-NavigatingEnvironmental.bib,4,0,0,1,1,0,0,1,0,0,1,0 @@ -1178,7 +1175,7 @@ output/Oyebode (-6DsTnMAAAAJ)/Oyebode2021-SleepFitPersuasive.bib,4,0,0,1,1,0,0,1 output/Evans (NqlOPkMAAAAJ)/Zhang2022-DoesCitizen.bib,6,0,0,1,1,0,0,1,1,1,1,0 output/Orji (-1cHtBQAAAAJ)/Ataguba2025-ExploringPersuasive.bib,4,0,0,1,1,0,0,1,0,0,1,0 output/Orji (-1cHtBQAAAAJ)/Iyer2025-ExploringPlayability.bib,4,0,0,1,1,0,0,1,0,0,1,0 -output/Evans (NqlOPkMAAAAJ)/Ye2022-EvaluationConvergence.bib,4,0,0,0,1,0,0,1,0,1,1,0 +output/Evans (NqlOPkMAAAAJ)/Ye2022-EvaluationConvergence.bib,3,0,0,0,1,0,0,0,0,1,1,0 output/Evans (NqlOPkMAAAAJ)/Evans2022-GuestEditorial.bib,4,0,0,1,1,0,0,1,0,0,1,0 output/Orji (-1cHtBQAAAAJ)/Ndulue2024-ExploringImpact.bib,4,0,0,1,1,0,0,1,0,0,1,0 output/Orji (-1cHtBQAAAAJ)/Alhasani2024-ExploringTrends.bib,4,0,0,1,1,0,0,1,0,0,1,0 @@ -1193,7 +1190,7 @@ output/Evans (NqlOPkMAAAAJ)/Yao2022-InequitiesHealth.bib,6,0,0,1,1,0,0,1,1,1,1,0 output/Orji (-1cHtBQAAAAJ)/Okenyi2025-GoingVegan.bib,4,0,0,1,1,0,0,1,0,0,1,0 output/Beiko (OmUy3vUAAAAJ)/Haider2026-ComparisonSpatio.bib,6,0,0,1,1,0,0,1,1,1,1,0 output/Orji (-1cHtBQAAAAJ)/Reen2024-ICareInsights.bib,3,0,0,1,1,0,0,0,0,0,1,0 -output/Beiko (OmUy3vUAAAAJ)/Beiko2025-AutomatedEDNA.bib,4,0,0,0,1,0,0,1,0,1,1,0 +output/Beiko (OmUy3vUAAAAJ)/Beiko2025-AutomatedEDNA.bib,4,0,0,0,1,0,0,0,1,1,1,0 output/Evans (NqlOPkMAAAAJ)/Sahli2022-KnowledgeVisualization.bib,3,0,0,1,1,0,0,0,0,0,1,0 output/Orji (-1cHtBQAAAAJ)/Nwagu2024-InsightsEvaluation.bib,4,0,0,1,1,0,0,1,0,0,1,0 output/Orji (-1cHtBQAAAAJ)/Okuboyejo2025-InsightsUser.bib,4,0,0,1,1,0,0,1,0,0,1,0 @@ -1223,7 +1220,7 @@ output/Evans (NqlOPkMAAAAJ)/Zhang2021-DesignCommunication.bib,3,0,0,1,1,0,0,0,0, output/Beiko (OmUy3vUAAAAJ)/Haider2023-MockMicrobial.bib,6,0,0,1,1,0,0,1,1,1,1,0 output/Beiko (OmUy3vUAAAAJ)/Mane2024-PlasevalFramework.bib,6,0,0,1,1,0,0,1,1,1,1,0 output/Orji (-1cHtBQAAAAJ)/Srivastava2025-MotivatingPhysical.bib,4,0,0,1,1,0,0,1,0,0,1,0 -output/Orji (-1cHtBQAAAAJ)/Ezembu2025-MultiModal.bib,4,0,0,0,1,0,0,1,0,1,1,0 +output/Orji (-1cHtBQAAAAJ)/Ezembu2025-MultiModal.bib,3,0,0,0,1,0,0,0,0,1,1,0 output/Beiko (OmUy3vUAAAAJ)/Sonnichsen2024-TowardsAutomated.bib,3,0,0,1,1,0,0,0,0,0,1,0 output/Beiko (OmUy3vUAAAAJ)/Alcock2022-CARD2023.bib,6,0,0,1,1,0,0,1,1,1,1,0 output/Orji (-1cHtBQAAAAJ)/Musumbulwa2025-MyHealthCoreTowards.bib,3,0,0,1,1,0,0,0,0,0,1,0 @@ -1232,7 +1229,7 @@ output/Orji (-1cHtBQAAAAJ)/Ataguba2025-MyShoppingBuddyExploring.bib,4,0,0,1,1,0, output/Beiko (OmUy3vUAAAAJ)/Hendricks2023-CompactAutomated.bib,6,0,0,1,1,0,0,1,1,1,1,0 output/Beiko (OmUy3vUAAAAJ)/Hall2023-CorrectionSuspension.bib,6,0,0,1,1,0,0,1,1,1,1,0 output/Orji (-1cHtBQAAAAJ)/Aremu2025-ReliabilityLarge.bib,5,0,0,1,1,0,0,1,0,1,1,0 -output/Orji (-1cHtBQAAAAJ)/Ahmad2025-OpioidNamed.bib,2,0,0,0,0,0,0,1,0,0,1,0 +output/Orji (-1cHtBQAAAAJ)/Ahmad2025-OpioidNamed.bib,1,0,0,0,0,0,0,0,0,0,1,0 output/Orji (-1cHtBQAAAAJ)/Burns2025-PandemicRelated.bib,4,0,0,1,1,0,0,1,0,0,1,0 output/Ralph (oRBuFa0AAAAJ)/Ralph2020-PandemicProgramming.bib,7,0,1,1,1,0,0,1,1,1,1,0 output/Abidi (fzr2PUYAAAAJ)/Singh2025-UnsupervisedClustering.bib,4,0,0,1,1,0,0,1,0,0,1,0 @@ -1240,7 +1237,7 @@ output/Beiko (OmUy3vUAAAAJ)/Wilcox2023-IntegratingSeascape.bib,5,0,0,1,1,0,0,1,0 output/Orji (-1cHtBQAAAAJ)/Ataguba2025-PersuasionBehavior.bib,4,0,0,1,1,0,0,1,0,0,1,0 output/Orji (-1cHtBQAAAAJ)/Srivastava2025-PetBuddyExamination.bib,4,0,0,1,1,0,0,1,0,0,1,0 output/Ralph (oRBuFa0AAAAJ)/Ralph2020-ACMSIGSOFT.bib,1,0,0,0,1,0,0,0,0,0,0,0 -output/Beiko (OmUy3vUAAAAJ)/Kafaie2023-SarandExploring.bib,4,0,0,0,1,0,0,1,0,1,1,0 +output/Beiko (OmUy3vUAAAAJ)/Kafaie2023-SarandExploring.bib,3,0,0,0,1,0,0,0,0,1,1,0 output/Orji (-1cHtBQAAAAJ)/Osho2025-PiracyPerspective.bib,3,0,0,1,1,0,0,0,0,0,1,0 output/Orji (-1cHtBQAAAAJ)/Alhasani2024-PromotingStress.bib,4,0,0,1,1,0,0,1,0,0,1,0 output/Orji (-1cHtBQAAAAJ)/Ibitoye2025-RethinkingResponsible.bib,4,0,0,1,1,0,0,1,0,0,1,0 @@ -1248,7 +1245,7 @@ output/Beiko (OmUy3vUAAAAJ)/Liu2022-CommunityCoevolution.bib,4,0,0,1,1,0,0,0,0,1 output/Orji (-1cHtBQAAAAJ)/Orji2025-RevitalizingWellbeing.bib,4,0,0,1,1,0,0,1,0,0,1,0 output/Beiko (OmUy3vUAAAAJ)/Hendricks2022-MiniaturizedAutomated.bib,4,0,0,1,1,0,0,1,0,0,1,0 output/Orji (-1cHtBQAAAAJ)/Desai2025-SANSTRACAS.bib,3,0,0,1,1,0,0,0,0,0,1,0 -output/Beiko (OmUy3vUAAAAJ)/Hall2022-SearchPerio.bib,4,0,0,0,1,0,0,1,0,1,1,0 +output/Beiko (OmUy3vUAAAAJ)/Hall2022-SearchPerio.bib,3,0,0,0,1,0,0,0,0,1,1,0 output/Beiko (OmUy3vUAAAAJ)/Pesaranghader2022-DeepSimDEFDeep.bib,6,0,0,1,1,0,0,1,1,1,1,0 output/Orji (-1cHtBQAAAAJ)/Patel2025-SerencoachAi.bib,4,0,0,1,1,0,0,1,0,0,1,0 output/Orji (-1cHtBQAAAAJ)/Bhattacharya2025-SexEducated.bib,3,0,0,1,1,0,0,0,0,0,1,0 @@ -1256,7 +1253,7 @@ output/Beiko (OmUy3vUAAAAJ)/Sanderson2022-ExploringMobilome.bib,5,0,0,1,1,0,0,1, output/Beiko (OmUy3vUAAAAJ)/Bernardino2021-GenomeScale.bib,5,0,0,1,1,0,0,0,1,1,1,0 output/Beiko (OmUy3vUAAAAJ)/Kim2022-MachineLearning.bib,6,0,0,1,1,0,0,1,1,1,1,0 output/Beiko (OmUy3vUAAAAJ)/Gulavi2022-VaginalMicrobiota.bib,6,0,0,1,1,0,0,1,1,1,1,0 -output/Rudzicz (elXOB1sAAAAJ)/Rudzicz2020-EthicsArtificial.bib,2,0,0,0,0,0,0,1,0,0,1,0 +output/Rudzicz (elXOB1sAAAAJ)/Rudzicz2020-EthicsArtificial.bib,2,0,0,0,0,0,1,0,0,0,1,0 output/Orji (-1cHtBQAAAAJ)/Iyer2024-SmartphoneGames.bib,4,0,0,1,1,0,0,1,0,0,1,0 output/Orji (-1cHtBQAAAAJ)/Chan2024-SocialExergames.bib,4,0,0,1,1,0,0,1,0,0,1,0 output/Orji (-1cHtBQAAAAJ)/Almutari2024-StepsBoosterS.bib,4,0,0,1,1,0,0,1,0,0,1,0 @@ -1268,12 +1265,12 @@ output/Orji (-1cHtBQAAAAJ)/Ndulue2025-MotivationalAppeal.bib,4,0,0,1,1,0,0,1,0,0 output/Orji (-1cHtBQAAAAJ)/Chan2024-ShapeMobile.bib,4,0,0,1,1,0,0,1,0,0,1,0 output/Orji (-1cHtBQAAAAJ)/Yisa2025-WhoWants.bib,5,0,1,1,1,0,0,1,0,0,1,0 output/Orji (-1cHtBQAAAAJ)/Ataguba2024-AfricanFoods.bib,6,0,0,1,1,0,0,1,1,1,1,0 -output/Orji (-1cHtBQAAAAJ)/Hakim2024-OnlineApplication.bib,5,0,0,0,1,0,0,1,1,1,1,0 +output/Orji (-1cHtBQAAAAJ)/Hakim2024-OnlineApplication.bib,4,0,0,0,1,0,0,0,1,1,1,0 output/Orji (-1cHtBQAAAAJ)/Lomotey2024-AutomaticDetection.bib,4,0,0,1,1,0,0,1,0,0,1,0 output/Orji (-1cHtBQAAAAJ)/Yisa2024-BridgingPrivacy.bib,4,0,0,1,1,0,0,1,0,0,1,0 output/Orji (-1cHtBQAAAAJ)/Adu2024-CenteringEquity.bib,6,0,0,1,1,0,0,1,1,1,1,0 output/Orji (-1cHtBQAAAAJ)/Anukem2024-DROPDASH.bib,4,0,0,1,1,0,0,1,0,0,1,0 -output/Orji (-1cHtBQAAAAJ)/Aremu2024-EdgeTomorrow.bib,3,0,0,0,1,0,0,1,0,0,1,0 +output/Orji (-1cHtBQAAAAJ)/Aremu2024-EdgeTomorrow.bib,2,0,0,0,1,0,0,0,0,0,1,0 output/Oore (cI0dYX4AAAAJ)/Peachey2025-EvaluatingLow.bib,2,0,0,1,0,0,0,0,0,0,1,0 output/Orji (-1cHtBQAAAAJ)/Ataguba2024-EthicalPractices.bib,4,0,0,1,1,0,0,1,0,0,1,0 output/Oore (cI0dYX4AAAAJ)/Silva2025-HideSeek.bib,2,0,0,0,0,0,1,0,0,0,1,0 @@ -1284,14 +1281,14 @@ output/Oore (cI0dYX4AAAAJ)/Tonon2025-ObjectiveAssessment.bib,4,0,0,1,1,0,0,1,0,0 output/Oore (cI0dYX4AAAAJ)/Dikaios2026-SamplingNatural.bib,4,0,0,1,1,0,0,1,0,0,1,0 output/Oore (cI0dYX4AAAAJ)/Dumpala2025-TestTime.bib,4,0,0,1,1,0,0,1,0,0,1,0 output/Orji (-1cHtBQAAAAJ)/Ndulue2024-ExploringInfluence.bib,3,0,0,1,1,0,0,0,0,0,1,0 -output/Oore (cI0dYX4AAAAJ)/Lowe2024-EmpiricalStudy.bib,2,0,0,0,0,0,0,1,0,0,1,0 +output/Oore (cI0dYX4AAAAJ)/Lowe2024-EmpiricalStudy.bib,1,0,0,0,0,0,0,0,0,0,1,0 output/Oore (cI0dYX4AAAAJ)/Dumpala2024-DiffAugDiffuse.bib,5,0,0,1,1,0,1,1,0,0,1,0 output/Abidi (fzr2PUYAAAAJ)/Woensel2025-WordEmbeddings.bib,4,0,0,1,1,0,0,1,0,0,1,0 -output/Oore (cI0dYX4AAAAJ)/Dumpala2024-SeeingSyntax.bib,3,0,0,0,0,0,1,1,0,0,1,0 +output/Oore (cI0dYX4AAAAJ)/Dumpala2024-SeeingSyntax.bib,2,0,0,0,0,0,1,0,0,0,1,0 output/Oore (cI0dYX4AAAAJ)/Dumpala2024-SelfSupervised.bib,5,0,1,1,1,0,0,1,0,0,1,0 output/Oore (cI0dYX4AAAAJ)/Dumpala2024-SensitivityGenerative.bib,4,0,0,1,1,0,0,1,0,0,1,0 output/Ye (4OQaVGUAAAAJ)/Wang2021-HTRJoint.bib,4,0,0,1,1,0,0,1,0,0,1,0 -output/Oore (cI0dYX4AAAAJ)/Huang2024-SymbolicMusic.bib,3,0,0,0,0,0,1,1,0,0,1,0 +output/Oore (cI0dYX4AAAAJ)/Huang2024-SymbolicMusic.bib,2,0,0,0,0,0,1,0,0,0,1,0 output/Orji (-1cHtBQAAAAJ)/Omisore2024-ExtendedReality.bib,6,0,0,1,1,0,0,1,1,1,1,0 output/Oore (cI0dYX4AAAAJ)/Brade2024-SynthScribeDeep.bib,5,0,0,1,1,0,1,1,0,0,1,0 output/Orji (-1cHtBQAAAAJ)/Chan2023-FeelingMoodie.bib,4,0,0,1,1,0,0,1,0,0,1,0 @@ -1394,7 +1391,7 @@ output/Orji (-1cHtBQAAAAJ)/Oyebode2023-PersuasiveStrategies.bib,3,0,0,1,1,0,0,0, output/Lahoud (Fnkc3a4AAAAJ)/Taleb2022-PilotContamination.bib,4,0,0,1,1,0,0,1,0,0,1,0 output/Orji (-1cHtBQAAAAJ)/Aldenaini2022-PersuasiveStrategies.bib,4,0,0,1,1,0,0,1,0,0,1,0 output/Orji (-1cHtBQAAAAJ)/Adib2023-PersuasiveSystem.bib,4,0,0,1,1,0,0,1,0,0,1,0 -output/Lahoud (Fnkc3a4AAAAJ)/Cornou2022-SeismicAir.bib,4,0,1,0,1,0,0,1,0,0,1,0 +output/Lahoud (Fnkc3a4AAAAJ)/Cornou2022-SeismicAir.bib,3,0,0,0,1,0,0,1,0,0,1,0 output/Orji (-1cHtBQAAAAJ)/Banire2023-PhenomenologicalCharacteristics.bib,3,0,0,1,1,0,0,0,0,0,1,0 output/Lahoud (Fnkc3a4AAAAJ)/Khawam2022-SmartResource.bib,3,0,0,0,1,0,0,1,0,0,1,0 output/Orji (-1cHtBQAAAAJ)/Rapp2023-PrefaceOpportunities.bib,0,0,0,0,0,0,0,0,0,0,0,0 @@ -1468,7 +1465,7 @@ output/Orji (-1cHtBQAAAAJ)/Oyibo2022-PrefaceAdjunct.bib,0,0,0,0,0,0,0,0,0,0,0,0 output/Matwin (rCoJeuYAAAAJ)/Song2024-EnhancingGlobal.bib,6,0,0,1,1,0,0,1,1,1,1,0 output/Oore (cI0dYX4AAAAJ)/Deon2021-ABCDBach.bib,0,0,0,0,0,0,0,0,0,0,0,0 output/Sampalli (UCVetfAAAAAJ)/Purcell2024-IoTSensor.bib,4,0,0,1,1,0,0,1,0,0,1,0 -output/Matwin (rCoJeuYAAAAJ)/Spadon2024-GravityInformed.bib,4,0,0,0,1,0,0,1,0,1,1,0 +output/Matwin (rCoJeuYAAAAJ)/Spadon2024-GravityInformed.bib,3,0,0,0,1,0,0,0,0,1,1,0 output/Matwin (rCoJeuYAAAAJ)/Zare2024-ImprovingDribbling.bib,4,0,0,1,1,0,0,1,0,0,1,0 output/Sampalli (UCVetfAAAAAJ)/Ghosh2024-MultiPhase.bib,4,0,0,1,1,0,0,1,0,0,1,0 output/Matwin (rCoJeuYAAAAJ)/Towarek2024-MachineLearning.bib,4,0,0,1,1,0,0,1,0,0,1,0 @@ -1494,7 +1491,7 @@ output/Brooks (42-3005)/Islam2024-VisualizingUncertainty.bib,4,0,0,1,1,0,0,1,0,0 output/Matwin (rCoJeuYAAAAJ)/Looby2023-FishSoundsVersion.bib,5,0,1,1,1,0,0,1,0,0,1,0 output/Rudzicz (elXOB1sAAAAJ)/Zhu2020-ExaminingRhetorical.bib,4,0,0,1,1,0,0,1,0,0,1,0 output/Matwin (rCoJeuYAAAAJ)/Cox2023-FishSoundsVersion.bib,3,0,0,0,1,0,0,1,0,0,1,0 -output/Brooks (42-3005)/Brooks2023-HigherOrder.bib,3,0,0,0,1,0,0,1,0,0,1,0 +output/Brooks (42-3005)/Brooks2023-HigherOrder.bib,2,0,0,0,1,0,0,0,0,0,1,0 output/Sampalli (UCVetfAAAAAJ)/Purcell2023-FrameworkFederated.bib,3,0,0,1,1,0,0,0,0,0,1,0 output/Brooks (42-3005)/Jafarzadeh2021-WearableSensor.bib,3,0,0,1,1,0,0,0,0,0,1,0 output/Matwin (rCoJeuYAAAAJ)/Zhao2023-LocalDifferentially.bib,1,0,0,0,1,0,0,0,0,0,0,0 @@ -1504,7 +1501,7 @@ output/Matwin (rCoJeuYAAAAJ)/Matwin2023-MethodsText.bib,3,0,0,0,1,0,0,1,0,0,1,0 output/Matwin (rCoJeuYAAAAJ)/Matwin2023-MiningModelling.bib,2,0,0,0,1,0,0,0,0,0,1,0 output/Oore (cI0dYX4AAAAJ)/Hebert2021-ArtBeatDeep.bib,3,0,0,0,1,0,0,1,0,0,1,0 output/Beiko (OmUy3vUAAAAJ)/Tsang2021-IdentifyingNovel.bib,6,0,0,1,1,0,0,1,1,1,1,0 -output/Matwin (rCoJeuYAAAAJ)/Sayareh2023-ObservationDenoising.bib,2,0,0,0,0,0,0,1,0,0,1,0 +output/Matwin (rCoJeuYAAAAJ)/Sayareh2023-ObservationDenoising.bib,1,0,0,0,0,0,0,0,0,0,1,0 output/Sampalli (UCVetfAAAAAJ)/Fei2023-SystematicReview.bib,4,0,0,1,1,0,0,1,0,0,1,0 output/Matwin (rCoJeuYAAAAJ)/Matwin2023-OntologiesData.bib,3,0,0,0,1,0,0,1,0,0,1,0 output/Orji (-1cHtBQAAAAJ)/Mulchandani2022-SociallyOriented.bib,4,0,0,1,1,0,0,1,0,0,1,0 @@ -1534,7 +1531,7 @@ output/Matwin (rCoJeuYAAAAJ)/Varno2022-AdaBestMinimizing.bib,4,0,0,1,1,0,0,1,0,0 output/Sampalli (UCVetfAAAAAJ)/Aldenaini2022-PersuasiveStrategies.bib,4,0,0,1,1,0,0,1,0,0,1,0 output/Abidi (fzr2PUYAAAAJ)/Kureshi2024-InvestigatingInfluence.bib,4,0,0,1,1,0,0,1,0,0,1,0 output/Matwin (rCoJeuYAAAAJ)/Oyebode2022-COVID19.bib,5,0,0,1,1,0,0,0,1,1,1,0 -output/Matwin (rCoJeuYAAAAJ)/Zare2022-CYRUSSoccer.bib,2,0,0,0,0,0,0,1,0,0,1,0 +output/Matwin (rCoJeuYAAAAJ)/Zare2022-CYRUSSoccer.bib,1,0,0,0,0,0,0,0,0,0,1,0 output/Orji (-1cHtBQAAAAJ)/Omisore2023-WeightingBased.bib,3,0,0,1,1,0,0,0,0,0,1,0 output/Matwin (rCoJeuYAAAAJ)/Pesaranghader2022-DeepSimDEFDeep.bib,6,0,0,1,1,0,0,1,1,1,1,0 output/Sampalli (UCVetfAAAAAJ)/Loginov2023-PreliminaryResults.bib,4,0,0,1,1,0,0,1,0,0,1,0 @@ -1597,7 +1594,6 @@ output/Neethirajan (8VZwF0sAAAAJ)/Neethirajan2025-AgencyLivestock.bib,5,0,0,1,1, output/Neethirajan (8VZwF0sAAAAJ)/Manikandan2025-AIDriven.bib,6,0,0,1,1,0,0,1,1,1,1,0 output/Neethirajan (8VZwF0sAAAAJ)/Prajesh2025-AIDriven.bib,4,0,0,1,1,0,1,0,0,0,1,0 output/Orji (-1cHtBQAAAAJ)/Nkwo2021-MixedMethod.bib,4,0,0,1,1,0,0,1,0,0,1,0 -output/Neethirajan (8VZwF0sAAAAJ)/Parivendan2025-BeyondProximity.bib,4,0,0,1,0,0,1,1,0,0,1,0 output/Neethirajan (8VZwF0sAAAAJ)/Kate2026-BigData.bib,6,0,0,1,1,0,1,0,1,1,1,0 output/Neethirajan (8VZwF0sAAAAJ)/Dhaliwal2025-BimodalData.bib,4,0,0,1,1,0,0,1,0,0,1,0 output/Abidi (fzr2PUYAAAAJ)/Kureshi2024-RiskStratification.bib,5,0,1,1,1,0,0,1,0,0,1,0 @@ -1607,14 +1603,14 @@ output/Matwin (rCoJeuYAAAAJ)/Abreu2021-TrajectoryScoring.bib,4,0,0,1,1,0,0,1,0,0 output/Neethirajan (8VZwF0sAAAAJ)/Tapp2025-CrossSpecies.bib,2,0,0,0,0,0,1,0,0,0,1,0 output/Neethirajan (8VZwF0sAAAAJ)/Mahato2025-DairyDigiD.bib,6,0,0,1,1,0,0,1,1,1,1,0 output/Neethirajan (8VZwF0sAAAAJ)/Mahato2025-DairyDigiDEdge.bib,5,0,0,1,1,0,0,1,0,1,1,0 -output/Neethirajan (8VZwF0sAAAAJ)/Kate2025-DecodingBovine.bib,4,0,0,0,1,0,0,1,0,1,1,0 +output/Neethirajan (8VZwF0sAAAAJ)/Kate2025-DecodingBovine.bib,3,0,0,0,1,0,0,0,0,1,1,0 output/Neethirajan (8VZwF0sAAAAJ)/Manikandan2025-DecodingPoultry.bib,6,0,0,1,1,0,0,1,1,1,1,0 output/Ye (4OQaVGUAAAAJ)/Ye2020-AdaptiveMedium.bib,4,0,0,1,1,0,0,1,0,0,1,0 output/Neethirajan (8VZwF0sAAAAJ)/Neethirajan2025-DecodingVocal.bib,4,0,0,1,1,0,0,1,0,0,1,0 output/Neethirajan (8VZwF0sAAAAJ)/Kate2025-GivingCows.bib,5,0,0,1,1,0,0,1,0,1,1,0 -output/Neethirajan (8VZwF0sAAAAJ)/Neethirajan2025-GreenAI.bib,3,0,0,0,1,0,0,1,0,0,1,0 -output/Trappenberg (EwkaTYEAAAAJ)/Xu2026-ImprovingDetection.bib,2,0,0,0,0,0,0,1,0,0,1,0 -output/Neethirajan (8VZwF0sAAAAJ)/Senthilkumar2025-IlluminatingBovine.bib,4,0,0,0,1,0,0,1,0,1,1,0 +output/Neethirajan (8VZwF0sAAAAJ)/Neethirajan2025-GreenAI.bib,2,0,0,0,1,0,0,0,0,0,1,0 +output/Trappenberg (EwkaTYEAAAAJ)/Xu2026-ImprovingDetection.bib,1,0,0,0,0,0,0,0,0,0,1,0 +output/Neethirajan (8VZwF0sAAAAJ)/Senthilkumar2025-IlluminatingBovine.bib,3,0,0,0,1,0,0,0,0,1,1,0 output/Trappenberg (EwkaTYEAAAAJ)/Gillis2026-VarianceGated.bib,2,0,0,0,0,0,0,1,0,0,1,0 output/Neethirajan (8VZwF0sAAAAJ)/Jobarteh2025-IntegratingMulti.bib,6,0,0,1,1,0,0,1,1,1,1,0 output/Trappenberg (EwkaTYEAAAAJ)/Leger2025-NewMeasure.bib,6,0,0,1,1,0,0,1,1,1,1,0 @@ -1625,21 +1621,21 @@ output/Neethirajan (8VZwF0sAAAAJ)/Jobarteh2025-LeveragingSatellite.bib,4,0,1,1,1 output/Neethirajan (8VZwF0sAAAAJ)/Neethirajan2025-MeasuringWhat.bib,3,0,0,0,1,0,0,1,0,0,1,0 output/Trappenberg (EwkaTYEAAAAJ)/Gillis2025-MaskedStrategies.bib,5,0,0,1,1,0,1,1,0,0,1,0 output/Neethirajan (8VZwF0sAAAAJ)/Zhang2025-MicroExpression.bib,6,0,1,1,1,0,0,1,0,1,1,0 -output/Trappenberg (EwkaTYEAAAAJ)/Gillis2025-PlateletEnumeration.bib,3,0,0,0,0,0,1,1,0,0,1,0 +output/Trappenberg (EwkaTYEAAAAJ)/Gillis2025-PlateletEnumeration.bib,2,0,0,0,0,0,1,0,0,0,1,0 output/Trappenberg (EwkaTYEAAAAJ)/Trappenberg2025-PositionPaper.bib,3,0,0,0,1,0,0,1,0,0,1,0 output/Neethirajan (8VZwF0sAAAAJ)/Essien2025-MultimodalAI.bib,5,0,1,0,1,0,1,1,0,0,1,0 output/Neethirajan (8VZwF0sAAAAJ)/Neethirajan2025-ProjectMooLogue.bib,0,0,0,0,0,0,0,0,0,0,0,0 output/Trappenberg (EwkaTYEAAAAJ)/Forbrigger2025-PupillometryArm.bib,6,0,0,1,1,0,0,1,1,1,1,0 output/Abidi (fzr2PUYAAAAJ)/Kureshi2024-SpatialHotspots.bib,4,0,0,1,1,0,0,1,0,0,1,0 output/Trappenberg (EwkaTYEAAAAJ)/Singh2025-EffectsBipolar.bib,6,0,1,1,1,0,0,1,0,1,1,0 -output/Neethirajan (8VZwF0sAAAAJ)/Neethirajan2025-ResilienceAs.bib,3,0,0,0,1,0,0,1,0,0,1,0 +output/Neethirajan (8VZwF0sAAAAJ)/Neethirajan2025-ResilienceAs.bib,2,0,0,0,1,0,0,0,0,0,1,0 output/Abidi (fzr2PUYAAAAJ)/Kureshi2024-UtilizingTopological.bib,4,0,0,1,1,0,0,1,0,0,1,0 output/Trappenberg (EwkaTYEAAAAJ)/Nunes2025-ImpactElectrophysiological.bib,6,0,0,1,1,0,0,1,1,1,1,0 output/Neethirajan (8VZwF0sAAAAJ)/Neethirajan2025-RethinkingPoultry.bib,3,0,0,1,1,0,0,0,0,0,1,0 output/Trappenberg (EwkaTYEAAAAJ)/Gillis2025-UncertaintyEstimation.bib,1,0,0,0,0,0,0,0,0,0,1,0 output/Neethirajan (8VZwF0sAAAAJ)/Neethirajan2025-SafeguardingDigital.bib,5,0,0,0,1,0,0,1,1,1,1,0 output/Lahoud (Fnkc3a4AAAAJ)/Fawaz2020-QueueAware.bib,3,0,0,1,1,0,0,0,0,0,1,0 -output/Trappenberg (EwkaTYEAAAAJ)/Hasan2024-GeneralizedTransformer.bib,3,0,0,0,0,0,1,1,0,0,1,0 +output/Trappenberg (EwkaTYEAAAAJ)/Hasan2024-GeneralizedTransformer.bib,3,0,0,0,1,0,1,0,0,0,1,0 output/Neethirajan (8VZwF0sAAAAJ)/Prajesh2025-SatelliteBased.bib,4,0,0,1,1,0,1,0,0,0,1,0 output/Trappenberg (EwkaTYEAAAAJ)/Madanlal2024-PilotStudy.bib,6,0,0,1,1,0,0,1,1,1,1,0 output/Evans (NqlOPkMAAAAJ)/Chen2020-UnpackingBlack.bib,6,0,0,1,1,0,0,1,1,1,1,0 @@ -1666,30 +1662,30 @@ output/Neethirajan (8VZwF0sAAAAJ)/Mehta2024-ArtificialIntelligence.bib,0,0,0,0,0 output/Neethirajan (8VZwF0sAAAAJ)/Gonzalez2024-ArtificialIntelligence.bib,0,0,0,0,0,0,0,0,0,0,0,0 output/Oore (cI0dYX4AAAAJ)/Dumpala2021-LearningModel.bib,4,0,0,1,1,0,0,1,0,0,1,0 output/Neethirajan (8VZwF0sAAAAJ)/Parmar2024-ArtificialIntelligence.bib,4,0,1,1,1,0,0,0,0,0,1,0 -output/Neethirajan (8VZwF0sAAAAJ)/Manikandan2024-DecodingPoultry.bib,4,0,0,0,1,0,0,1,0,1,1,0 +output/Neethirajan (8VZwF0sAAAAJ)/Manikandan2024-DecodingPoultry.bib,4,0,0,0,1,0,1,0,0,1,1,0 output/Sampalli (UCVetfAAAAAJ)/Zhao2021-IEEEAccess.bib,4,0,0,1,1,0,0,1,0,0,1,0 output/Neethirajan (8VZwF0sAAAAJ)/Bhaskaran2024-DevelopmentCloud.bib,5,0,0,1,1,0,0,1,0,1,1,0 output/Neethirajan (8VZwF0sAAAAJ)/Neethirajan2024-DigitalTwins.bib,0,0,0,0,0,0,0,0,0,0,0,0 output/Neethirajan (8VZwF0sAAAAJ)/Senthilkumar2024-EarlyDetection.bib,6,0,0,1,1,0,0,1,1,1,1,0 -output/Oore (cI0dYX4AAAAJ)/Lowe2021-LogAvgExpProvides.bib,2,0,0,0,0,0,0,1,0,0,1,0 +output/Oore (cI0dYX4AAAAJ)/Lowe2021-LogAvgExpProvides.bib,3,0,0,0,0,0,1,1,0,0,1,0 output/Neethirajan (8VZwF0sAAAAJ)/Neethirajan2024-PredictiveAnalytics.bib,3,0,0,1,1,0,0,0,0,0,1,0 -output/Neethirajan (8VZwF0sAAAAJ)/Neethirajan2025-GreenArtificial.bib,3,0,0,0,1,0,0,1,0,0,1,0 +output/Neethirajan (8VZwF0sAAAAJ)/Neethirajan2025-GreenArtificial.bib,2,0,0,0,1,0,0,0,0,0,1,0 output/Neethirajan (8VZwF0sAAAAJ)/Neethirajan2024-GreenHorizons.bib,0,0,0,0,0,0,0,0,0,0,0,0 output/Orji (-1cHtBQAAAAJ)/Macleod2021-MobileSensing.bib,6,0,0,1,1,0,0,1,1,1,1,0 output/Neethirajan (8VZwF0sAAAAJ)/Neethirajan2024-HumanComputer.bib,6,0,0,1,1,0,0,1,1,1,1,0 output/Neethirajan (8VZwF0sAAAAJ)/Mahato2025-IntegratingArtificial.bib,5,0,0,1,1,0,0,1,0,1,1,0 -output/Oyebode (-6DsTnMAAAAJ)/Orji2020-PersonalizingPersuasive.bib,1,0,0,0,0,0,0,1,0,0,0,0 +output/Oyebode (-6DsTnMAAAAJ)/Orji2020-PersonalizingPersuasive.bib,0,0,0,0,0,0,0,0,0,0,0,0 output/Neethirajan (8VZwF0sAAAAJ)/Neethirajan2024-ListeningCows.bib,0,0,0,0,0,0,0,0,0,0,0,0 output/Neethirajan (8VZwF0sAAAAJ)/Bi2024-MappingMethane.bib,5,0,0,1,1,0,1,1,0,0,1,0 output/Neethirajan (8VZwF0sAAAAJ)/Neethirajan2024-MetaverseEnhancing.bib,3,0,0,1,1,0,0,0,0,0,1,0 -output/Neethirajan (8VZwF0sAAAAJ)/Jobarteh2024-MultiModal.bib,2,0,0,0,0,0,0,1,0,0,1,0 +output/Neethirajan (8VZwF0sAAAAJ)/Jobarteh2024-MultiModal.bib,2,0,0,0,0,0,1,0,0,0,1,0 output/Orji (-1cHtBQAAAAJ)/Mulchandani2021-PersuasiveGame.bib,3,0,0,0,1,0,0,1,0,0,1,0 output/Neethirajan (8VZwF0sAAAAJ)/Neethirajan2024-NetZero.bib,4,0,0,1,1,0,0,1,0,0,1,0 output/Neethirajan (8VZwF0sAAAAJ)/Neethirajan2024-TwinFarms.bib,4,0,0,1,1,0,0,1,0,0,1,0 output/Ye (4OQaVGUAAAAJ)/Du2021-FASTODT.bib,4,0,0,1,1,0,0,1,0,0,1,0 output/Neethirajan (8VZwF0sAAAAJ)/Neethirajan2023-NewEra.bib,0,0,0,0,0,0,0,0,0,0,0,0 -output/Neethirajan (8VZwF0sAAAAJ)/Kim2023-AdvancingPig.bib,4,0,0,0,1,0,0,1,0,1,1,0 -output/Neethirajan (8VZwF0sAAAAJ)/Neethirajan2023-AIDriven.bib,3,0,0,0,1,0,0,1,0,0,1,0 +output/Neethirajan (8VZwF0sAAAAJ)/Kim2023-AdvancingPig.bib,3,0,0,0,1,0,0,0,0,1,1,0 +output/Neethirajan (8VZwF0sAAAAJ)/Neethirajan2023-AIDriven.bib,2,0,0,0,1,0,0,0,0,0,1,0 output/Oore (cI0dYX4AAAAJ)/Oore2021-MusicSpeech.bib,0,0,0,0,0,0,0,0,0,0,0,0 output/Neethirajan (8VZwF0sAAAAJ)/Neethirajan2023-AISustainable.bib,4,0,0,1,1,0,0,0,0,1,1,0 output/Neethirajan (8VZwF0sAAAAJ)/Neethirajan2023-ArtificialIntelligence.bib,4,0,0,1,1,0,0,1,0,0,1,0 @@ -1699,7 +1695,6 @@ output/Ye (4OQaVGUAAAAJ)/Ye2020-GuestEditorial.bib,0,0,0,0,0,0,0,0,0,0,0,0 output/Oore (cI0dYX4AAAAJ)/Dumpala2021-SignificanceSpeaker.bib,3,0,0,1,1,0,0,0,0,0,1,0 output/Sampalli (UCVetfAAAAAJ)/Upadhyay2021-IntrusionDetection.bib,5,0,1,1,1,0,0,1,0,0,1,0 output/Trappenberg (EwkaTYEAAAAJ)/Nunes2021-ExemplarScoring.bib,5,0,0,0,1,0,0,1,1,1,1,0 -output/Ye (4OQaVGUAAAAJ)/Lv2020-IntelligentInterference.bib,1,0,0,0,0,0,0,1,0,0,0,0 output/Abidi (fzr2PUYAAAAJ)/Woensel2023-CommunityPractice.bib,4,0,0,1,1,0,0,1,0,0,1,0 output/Sampalli (UCVetfAAAAAJ)/Allahem2020-AutomatedUterine.bib,5,0,1,1,1,0,0,1,0,0,1,0 output/Matwin (rCoJeuYAAAAJ)/Bappee2021-AnalyzingImpact.bib,4,0,1,0,1,0,0,1,0,0,1,0 @@ -1707,38 +1702,37 @@ output/Rudzicz (elXOB1sAAAAJ)/Rudzicz2020-ExplainableAI.bib,4,0,0,1,1,0,0,1,0,0, output/Neethirajan (8VZwF0sAAAAJ)/Neethirajan2024-DigitalLivestock.bib,3,0,0,1,1,0,0,0,0,0,1,0 output/Abidi (fzr2PUYAAAAJ)/Woensel2023-DecentralizedWeb.bib,4,0,0,1,1,0,0,1,0,0,1,0 output/Sampalli (UCVetfAAAAAJ)/Upadhyay2021-GradientBoosting.bib,4,0,0,1,1,0,0,1,0,0,1,0 -output/Sampalli (UCVetfAAAAAJ)/Aldenaini2020-HowEffective.bib,1,0,0,0,0,0,0,1,0,0,0,0 +output/Sampalli (UCVetfAAAAAJ)/Aldenaini2020-HowEffective.bib,0,0,0,0,0,0,0,0,0,0,0,0 output/Sampalli (UCVetfAAAAAJ)/Aldenaini2020-MobilePhone.bib,1,0,0,0,1,0,0,0,0,0,0,0 output/Orji (-1cHtBQAAAAJ)/Adib2021-SystematicReview.bib,4,0,0,1,1,0,0,1,0,0,1,0 -output/Trappenberg (EwkaTYEAAAAJ)/Lowe2021-LogAvgExpProvides.bib,2,0,0,0,0,0,0,1,0,0,1,0 +output/Trappenberg (EwkaTYEAAAAJ)/Lowe2021-LogAvgExpProvides.bib,2,0,0,0,0,0,1,0,0,0,1,0 output/Abidi (fzr2PUYAAAAJ)/Agyapong2023-ImprovingMental.bib,2,0,0,1,0,0,0,0,0,0,1,0 output/Matwin (rCoJeuYAAAAJ)/Eljabu2021-AnomalyDetection.bib,3,0,0,1,1,0,0,0,0,0,1,0 -output/Matwin (rCoJeuYAAAAJ)/Jelodar2021-ArtificialIntelligence.bib,4,0,0,0,1,0,0,1,0,1,1,0 +output/Matwin (rCoJeuYAAAAJ)/Jelodar2021-ArtificialIntelligence.bib,3,0,0,0,1,0,0,0,0,1,1,0 output/Abidi (fzr2PUYAAAAJ)/Abidi2023-MultiviewClustering.bib,6,0,0,1,1,0,0,1,1,1,1,0 output/Abidi (fzr2PUYAAAAJ)/Eastwood2023-NeedsExpectations.bib,4,0,0,1,1,0,0,1,0,0,1,0 output/Neethirajan (8VZwF0sAAAAJ)/Neethirajan2023-DigitalPhenotyping.bib,5,0,0,1,1,0,0,0,1,1,1,0 output/Oyebode (-6DsTnMAAAAJ)/Oyebode2020-PersuasiveMobileApps.bib,3,0,0,1,1,0,0,0,0,0,1,0 -output/Trappenberg (EwkaTYEAAAAJ)/Lowe2021-LogicalActivation.bib,1,0,0,0,0,0,0,1,0,0,0,0 output/Sampalli (UCVetfAAAAAJ)/Upadhyay2020-SCADASupervisory.bib,2,0,0,0,1,0,0,0,0,0,1,0 output/Oyebode (-6DsTnMAAAAJ)/Ndulue2020-PHISHERCRUSH.bib,4,0,0,1,1,0,0,1,0,0,1,0 output/Rudzicz (elXOB1sAAAAJ)/Feng2020-ExplainableClinical.bib,3,0,0,1,1,0,0,0,0,0,1,0 output/Ye (4OQaVGUAAAAJ)/Chen2021-LearningBased.bib,4,0,1,0,1,0,0,1,0,0,1,0 output/Neethirajan (8VZwF0sAAAAJ)/Colaco2023-DISubNetDepthwise.bib,5,0,0,1,1,0,0,0,1,1,1,0 -output/Oore (cI0dYX4AAAAJ)/Deon2021-MusicalSpeech.bib,2,0,0,0,0,0,0,1,0,0,1,0 +output/Oore (cI0dYX4AAAAJ)/Deon2021-MusicalSpeech.bib,2,0,0,0,0,0,1,0,0,0,1,0 output/Orji (-1cHtBQAAAAJ)/Oyibo2021-AdaptivePersonalized.bib,3,0,0,1,1,0,0,0,0,0,1,0 output/Sampalli (UCVetfAAAAAJ)/Zhao2020-SensingSignal.bib,3,0,0,1,1,0,0,0,0,0,1,0 output/Orji (-1cHtBQAAAAJ)/Sakpere2021-AgeDifferences.bib,4,0,0,1,1,0,0,1,0,0,1,0 output/Oyebode (-6DsTnMAAAAJ)/Oyebode2020-MachineLearning.bib,3,0,0,1,1,0,0,0,0,0,1,0 output/Abidi (fzr2PUYAAAAJ)/Daowd2022-KnowledgeGraph.bib,4,0,0,1,1,0,0,1,0,0,1,0 output/Sampalli (UCVetfAAAAAJ)/Upadhyay2020-VulnerabilitiesAssessment.bib,4,0,0,1,1,0,0,1,0,0,1,0 -output/Gagie (aFCoq2YAAAAJ)/Gagie2026-CompressedSet.bib,3,0,0,0,0,0,1,1,0,0,1,0 -output/Gagie (aFCoq2YAAAAJ)/Cicalese2026-IncongruitySensitive.bib,2,0,0,0,0,0,0,1,0,0,1,0 +output/Gagie (aFCoq2YAAAAJ)/Gagie2026-CompressedSet.bib,2,0,0,0,0,0,1,0,0,0,1,0 +output/Gagie (aFCoq2YAAAAJ)/Cicalese2026-IncongruitySensitive.bib,1,0,0,0,0,0,0,0,0,0,1,0 output/Gagie (aFCoq2YAAAAJ)/Depuydt2025-BMove.bib,5,0,0,1,1,0,0,1,0,1,1,0 output/Gagie (aFCoq2YAAAAJ)/Renders2025-ColumbaFast.bib,6,0,0,1,1,0,0,1,1,1,1,0 output/Abidi (fzr2PUYAAAAJ)/Barrett2022-KnowledgeGraph.bib,5,0,1,1,1,0,0,1,0,0,1,0 output/Trappenberg (EwkaTYEAAAAJ)/Macneil2021-PlanktonClassification.bib,5,0,0,1,1,0,0,0,1,1,1,0 -output/Gagie (aFCoq2YAAAAJ)/Becker2025-CompressingSuffix.bib,2,0,0,0,0,0,0,1,0,0,1,0 -output/Gagie (aFCoq2YAAAAJ)/Varki2025-EfficientGrammar.bib,5,0,0,0,1,0,0,1,1,1,1,0 +output/Gagie (aFCoq2YAAAAJ)/Becker2025-CompressingSuffix.bib,1,0,0,0,0,0,0,0,0,0,1,0 +output/Gagie (aFCoq2YAAAAJ)/Varki2025-EfficientGrammar.bib,4,0,0,0,1,0,0,0,1,1,1,0 output/Gagie (aFCoq2YAAAAJ)/Cobas2025-FastSmall.bib,4,0,0,1,1,0,0,1,0,0,1,0 output/Matwin (rCoJeuYAAAAJ)/Varlamis2020-BuildingNavigation.bib,3,0,0,1,1,0,0,0,0,0,1,0 output/Matwin (rCoJeuYAAAAJ)/Zare2021-ContinuousControl.bib,3,0,0,0,1,0,0,1,0,0,1,0 @@ -1749,7 +1743,7 @@ output/Neethirajan (8VZwF0sAAAAJ)/Neethirajan2023-FacesFeelings.bib,0,0,0,0,0,0, output/Neethirajan (8VZwF0sAAAAJ)/Neethirajan2023-HerdsInsights.bib,0,0,0,0,0,0,0,0,0,0,0,0 output/Abidi (fzr2PUYAAAAJ)/Woensel2022-ClinicalGuidelines.bib,4,0,0,1,1,0,0,1,0,0,1,0 output/Matwin (rCoJeuYAAAAJ)/Padovese2021-DataAugmentation.bib,6,0,0,1,1,0,0,1,1,1,1,0 -output/Matwin (rCoJeuYAAAAJ)/Eljabu2021-DestinationPort.bib,1,0,0,0,0,0,0,1,0,0,0,0 +output/Matwin (rCoJeuYAAAAJ)/Eljabu2021-DestinationPort.bib,0,0,0,0,0,0,0,0,0,0,0,0 output/Abidi (fzr2PUYAAAAJ)/Woensel2022-ExplainableDecision.bib,4,0,0,1,1,0,0,1,0,0,1,0 output/Neethirajan (8VZwF0sAAAAJ)/Neethirajan2023-HarnessingArtificial.bib,0,0,0,0,0,0,0,0,0,0,0,0 output/Matwin (rCoJeuYAAAAJ)/Zare2022-EngineeringFeatures.bib,4,0,0,1,1,0,0,1,0,0,1,0 @@ -1757,7 +1751,7 @@ output/Neethirajan (8VZwF0sAAAAJ)/Neethirajan2023-InnovativeStrategies.bib,4,0,0 output/Abidi (fzr2PUYAAAAJ)/Rad2022-ExtractingSurrogate.bib,4,0,0,1,1,0,0,1,0,0,1,0 output/Neethirajan (8VZwF0sAAAAJ)/Neethirajan2023-MonitoringNutritional.bib,0,0,0,0,0,0,0,0,0,0,0,0 output/Trappenberg (EwkaTYEAAAAJ)/Stone2021-PredictionLithium.bib,6,0,0,1,1,0,0,1,1,1,1,0 -output/Neethirajan (8VZwF0sAAAAJ)/Neethirajan2023-NavigatingNet.bib,4,0,0,0,1,0,0,1,0,1,1,0 +output/Neethirajan (8VZwF0sAAAAJ)/Neethirajan2023-NavigatingNet.bib,3,0,0,0,1,0,0,0,0,1,1,0 output/Neethirajan (8VZwF0sAAAAJ)/Kim2023-PigEmotion.bib,0,0,0,0,0,0,0,0,0,0,0,0 output/Oore (cI0dYX4AAAAJ)/Pacheco2020-OutDistribution.bib,2,0,0,0,1,0,0,0,0,0,1,0 output/Ye (4OQaVGUAAAAJ)/Aldubaikhy2020-LowComplexity.bib,3,0,0,1,1,0,0,0,0,0,1,0 @@ -1765,7 +1759,7 @@ output/Matwin (rCoJeuYAAAAJ)/Bappee2021-ExaminingImpact.bib,6,0,0,1,1,0,0,1,1,1, output/Orji (-1cHtBQAAAAJ)/Grahamkalio2021-AnalyzingCOVID.bib,4,0,0,1,1,0,0,1,0,0,1,0 output/Orji (-1cHtBQAAAAJ)/Jelodar2021-ArtificialIntelligence.bib,4,0,0,0,1,0,0,1,0,1,1,0 output/Gagie (aFCoq2YAAAAJ)/Brown2025-KeBaBK.bib,5,0,0,1,1,0,1,0,1,0,1,0 -output/Gagie (aFCoq2YAAAAJ)/Gagie2025-MergingRLBWTs.bib,3,0,0,0,0,0,1,1,0,0,1,0 +output/Gagie (aFCoq2YAAAAJ)/Gagie2025-MergingRLBWTs.bib,2,0,0,0,0,0,1,0,0,0,1,0 output/Gagie (aFCoq2YAAAAJ)/Zakeri2025-Movi2.bib,5,0,0,1,1,0,0,0,1,1,1,0 output/Gagie (aFCoq2YAAAAJ)/Gagie2025-PrefaceComputation.bib,4,0,0,1,1,0,0,1,0,0,1,0 output/Gagie (aFCoq2YAAAAJ)/Diazdominguez2025-PrefixFree.bib,7,0,0,1,1,0,1,1,1,1,1,0 @@ -1781,7 +1775,7 @@ output/Neethirajan (8VZwF0sAAAAJ)/Neethirajan2023-SOLARIASensOr.bib,4,0,0,1,1,0, output/Neethirajan (8VZwF0sAAAAJ)/Neethirajan2023-EthicalFrontier.bib,2,0,0,0,1,0,0,0,0,0,1,0 output/Neethirajan (8VZwF0sAAAAJ)/Neethirajan2023-SignificanceEthics.bib,4,0,0,0,1,0,0,1,0,1,1,0 output/Neethirajan (8VZwF0sAAAAJ)/Neethirajan2023-UncoveringHidden.bib,0,0,0,0,0,0,0,0,0,0,0,0 -output/Neethirajan (8VZwF0sAAAAJ)/Neethirajan2023-VocalizationPatterns.bib,4,0,0,0,1,0,0,1,0,1,1,0 +output/Neethirajan (8VZwF0sAAAAJ)/Neethirajan2023-VocalizationPatterns.bib,3,0,0,0,1,0,0,0,0,1,1,0 output/Neethirajan (8VZwF0sAAAAJ)/Neethirajan2022-BehindScenes.bib,0,0,0,0,0,0,0,0,0,0,0,0 output/Orji (-1cHtBQAAAAJ)/Alqahtani2021-CoDesigning.bib,6,0,0,1,1,0,0,1,1,1,1,0 output/Trappenberg (EwkaTYEAAAAJ)/Nunes2020-AsymmetricalReliability.bib,5,0,0,1,1,0,0,0,1,1,1,0 @@ -1811,7 +1805,7 @@ output/Orji (-1cHtBQAAAAJ)/Nkwo2021-DesignOpportunities.bib,3,0,0,0,1,0,0,1,0,0, output/Gagie (aFCoq2YAAAAJ)/Brown2025-FasterRun.bib,2,0,0,1,0,0,0,0,0,0,1,0 output/Neethirajan (8VZwF0sAAAAJ)/Jacobs2022-ASASNANP.bib,5,0,0,1,1,0,0,0,1,1,1,0 output/Trappenberg (EwkaTYEAAAAJ)/Pacheco2020-LearningDynamic.bib,2,0,0,0,1,0,0,0,0,0,1,0 -output/Neethirajan (8VZwF0sAAAAJ)/Neethirajan2022-BigData.bib,4,0,0,0,1,0,0,1,0,1,1,0 +output/Neethirajan (8VZwF0sAAAAJ)/Neethirajan2022-BigData.bib,3,0,0,0,1,0,0,0,0,1,1,0 output/Ye (4OQaVGUAAAAJ)/Yang2020-OpportunisticAdaptive.bib,4,0,0,1,1,0,0,1,0,0,1,0 output/Keselj (uDKsmuIAAAAJ)/Taylor2025-HeyChatGPT.bib,4,0,0,1,1,0,0,1,0,0,1,0 output/Keselj (uDKsmuIAAAAJ)/Keselj2025-SingleSource.bib,4,0,0,1,1,0,0,1,0,0,1,0 @@ -1820,30 +1814,29 @@ output/Keselj (uDKsmuIAAAAJ)/Charlebois2024-ImplicationsCarbon.bib,4,0,0,1,1,0,0 output/Sharma (VHjAIe8AAAAJ)/Shetty2025-MappingCode.bib,3,0,0,1,1,0,0,0,0,0,1,0 output/Sharma (VHjAIe8AAAAJ)/Nunes2025-MaRVManually.bib,4,0,0,1,1,0,0,1,0,0,1,0 output/Trappenberg (EwkaTYEAAAAJ)/Nunes2020-MeasuringHeterogeneity.bib,5,0,0,1,1,0,0,1,0,1,1,0 -output/Sharma (VHjAIe8AAAAJ)/Saad2025-EffectToken.bib,2,0,0,0,0,0,0,1,0,0,1,0 +output/Sharma (VHjAIe8AAAAJ)/Saad2025-EffectToken.bib,1,0,0,0,0,0,0,0,0,0,1,0 output/Sharma (VHjAIe8AAAAJ)/Palit2025-ReinforcementLearning.bib,4,0,0,1,1,0,0,1,0,0,1,0 -output/Sharma (VHjAIe8AAAAJ)/Saad2025-SENAITowards.bib,2,0,0,0,0,0,0,1,0,0,1,0 -output/Sharma (VHjAIe8AAAAJ)/Mehditabar2025-SmartBut.bib,2,0,0,0,0,0,0,1,0,0,1,0 +output/Sharma (VHjAIe8AAAAJ)/Saad2025-SENAITowards.bib,1,0,0,0,0,0,0,0,0,0,1,0 +output/Sharma (VHjAIe8AAAAJ)/Mehditabar2025-SmartBut.bib,1,0,0,0,0,0,0,0,0,0,1,0 output/Rudzicz (elXOB1sAAAAJ)/Smith2020-FourEquity.bib,5,0,0,1,1,0,0,0,1,1,1,0 -output/Sharma (VHjAIe8AAAAJ)/Jahan2025-TaxonomyFaults.bib,1,0,0,0,0,0,0,1,0,0,0,0 output/Sharma (VHjAIe8AAAAJ)/Rahman2025-TSDetector.bib,4,0,0,1,1,0,0,1,0,0,1,0 output/Sharma (VHjAIe8AAAAJ)/Rajput2025-TuR.bib,4,0,0,1,1,0,0,1,0,0,1,0 output/Sharma (VHjAIe8AAAAJ)/Rajput2024-BenchmarkingEmerging.bib,4,0,0,1,1,0,0,1,0,0,1,0 output/Sharma (VHjAIe8AAAAJ)/Spinellis2024-BrokenWindows.bib,4,0,0,1,1,0,0,1,0,0,1,0 output/Trappenberg (EwkaTYEAAAAJ)/Nunes2020-MultiplicativeDecomposition.bib,6,0,0,1,1,0,0,1,1,1,1,0 output/Sharma (VHjAIe8AAAAJ)/Mandli2025-COMETGenerating.bib,4,0,0,1,1,0,0,1,0,0,1,0 -output/Sharma (VHjAIe8AAAAJ)/Saad2024-CONCORDTowards.bib,2,0,0,0,0,0,0,1,0,0,1,0 -output/Rudzicz (elXOB1sAAAAJ)/Riad2020-IdentificationPrimary.bib,2,0,0,0,0,0,0,1,0,0,1,0 +output/Sharma (VHjAIe8AAAAJ)/Saad2024-CONCORDTowards.bib,1,0,0,0,0,0,0,0,0,0,1,0 +output/Rudzicz (elXOB1sAAAAJ)/Riad2020-IdentificationPrimary.bib,1,0,0,0,0,0,0,0,0,0,1,0 output/Abidi (fzr2PUYAAAAJ)/Daowd2021-FrameworkBuild.bib,3,0,0,1,1,0,0,0,0,0,1,0 output/Gagie (aFCoq2YAAAAJ)/Gagie2024-HowFind.bib,6,0,0,1,1,0,1,0,1,1,1,0 output/Trappenberg (EwkaTYEAAAAJ)/Pacheco2020-OutDistribution.bib,4,0,0,1,1,0,0,1,0,0,1,0 output/Matwin (rCoJeuYAAAAJ)/Renso2021-MultipleAspect.bib,3,0,0,1,1,0,0,0,0,0,1,0 output/Gagie (aFCoq2YAAAAJ)/Brejova2024-MaximumScoring.bib,6,0,0,1,1,0,0,1,1,1,1,0 -output/Gagie (aFCoq2YAAAAJ)/Peresini2024-MIOVReordering.bib,3,0,0,0,0,0,1,1,0,0,1,0 +output/Gagie (aFCoq2YAAAAJ)/Peresini2024-MIOVReordering.bib,2,0,0,0,0,0,1,0,0,0,1,0 output/Abidi (fzr2PUYAAAAJ)/Naqvi2021-AnalyzingAssociation.bib,4,0,0,1,1,0,0,1,0,0,1,0 output/Neethirajan (8VZwF0sAAAAJ)/Neethirajan2022-BiologicalChemical.bib,2,0,0,0,1,0,0,0,0,0,1,0 output/Neethirajan (8VZwF0sAAAAJ)/Neethirajan2022-ChickTrackQuantitative.bib,4,0,0,1,1,0,0,1,0,0,1,0 -output/Neethirajan (8VZwF0sAAAAJ)/Azizat2022-LayingHen.bib,4,0,0,0,1,0,0,1,0,1,1,0 +output/Neethirajan (8VZwF0sAAAAJ)/Azizat2022-LayingHen.bib,3,0,0,0,1,0,0,0,0,1,1,0 output/Neethirajan (8VZwF0sAAAAJ)/Tweel2022-NonInvasive.bib,0,0,0,0,0,0,0,0,0,0,0,0 output/Abidi (fzr2PUYAAAAJ)/Daowd2021-BuildingKnowledge.bib,4,0,0,1,1,0,0,1,0,0,1,0 output/Keselj (uDKsmuIAAAAJ)/Charlebois2024-ImplicationsCarbonTaxing.bib,3,0,0,1,1,0,0,0,0,0,1,0 @@ -1858,17 +1851,17 @@ output/Abidi (fzr2PUYAAAAJ)/Nair2021-OntologyBased.bib,4,0,0,1,1,0,0,1,0,0,1,0 output/Sharma (VHjAIe8AAAAJ)/Rajput2024-EnhancingEnergy.bib,3,0,0,1,1,0,0,0,0,0,1,0 output/Sharma (VHjAIe8AAAAJ)/Vijayvargiya2024-EnhancingIdentifier.bib,4,0,0,1,1,0,0,1,0,0,1,0 output/Sharma (VHjAIe8AAAAJ)/Rahman2024-ExploringInfluence.bib,4,0,0,1,1,0,0,1,0,0,1,0 -output/Sharma (VHjAIe8AAAAJ)/Palit2024-GeneratingRefactored.bib,2,0,0,0,0,0,0,1,0,0,1,0 +output/Sharma (VHjAIe8AAAAJ)/Palit2024-GeneratingRefactored.bib,1,0,0,0,0,0,0,0,0,0,1,0 output/Ye (4OQaVGUAAAAJ)/Lv2021-SecureNon.bib,4,0,0,1,1,0,0,1,0,0,1,0 output/Matwin (rCoJeuYAAAAJ)/Spadon2022-PayAttention.bib,5,0,0,1,1,0,0,0,1,1,1,0 output/Orji (-1cHtBQAAAAJ)/Ndulue2021-GenderEffectiveness.bib,3,0,0,1,1,0,0,0,0,0,1,0 output/Neethirajan (8VZwF0sAAAAJ)/Colaco2022-PigTreatment.bib,3,0,0,1,1,0,0,0,0,0,1,0 -output/Neethirajan (8VZwF0sAAAAJ)/Heuvel2022-QuantifyingEffect.bib,4,0,0,0,1,0,0,1,0,1,1,0 +output/Neethirajan (8VZwF0sAAAAJ)/Heuvel2022-QuantifyingEffect.bib,3,0,0,0,1,0,0,0,0,1,1,0 output/Orji (-1cHtBQAAAAJ)/Oyebode2021-HealthPsychosocial.bib,7,0,1,1,1,0,0,1,1,1,1,0 output/Neethirajan (8VZwF0sAAAAJ)/Neethirajan2022-SensorsMonitoring.bib,0,0,0,0,0,0,0,0,0,0,0,0 output/Neethirajan (8VZwF0sAAAAJ)/Youssef2022-SoftSensing.bib,0,0,0,0,0,0,0,0,0,0,0,0 output/Neethirajan (8VZwF0sAAAAJ)/Llonch2022-EditorialUnderstanding.bib,2,0,0,1,0,0,0,0,0,0,1,0 -output/Neethirajan (8VZwF0sAAAAJ)/Pijpers2022-UnderstandingChicks.bib,4,0,0,0,1,0,0,1,0,1,1,0 +output/Neethirajan (8VZwF0sAAAAJ)/Pijpers2022-UnderstandingChicks.bib,3,0,0,0,1,0,0,0,0,1,1,0 output/Trappenberg (EwkaTYEAAAAJ)/Nunes2020-RepresentationalRenyi.bib,6,0,0,1,1,0,0,1,1,1,1,0 output/Keselj (uDKsmuIAAAAJ)/Taylor2022-DonT.bib,3,0,0,1,1,0,0,0,0,0,1,0 output/Keselj (uDKsmuIAAAAJ)/Gawai2022-ItS.bib,0,0,0,0,0,0,0,0,0,0,0,0 @@ -1880,7 +1873,7 @@ output/Sharma (VHjAIe8AAAAJ)/Sharma2024-LLMsCode.bib,3,0,0,0,1,0,0,1,0,0,1,0 output/Gagie (aFCoq2YAAAAJ)/Hong2024-PfpFm.bib,5,0,0,1,1,0,0,0,1,1,1,0 output/Gagie (aFCoq2YAAAAJ)/Bonizzoni2024-SolvingMinimal.bib,2,0,0,1,0,0,0,0,0,0,1,0 output/Gagie (aFCoq2YAAAAJ)/Gagie2024-SpaceEfficient.bib,4,0,0,1,1,0,0,1,0,0,1,0 -output/Gagie (aFCoq2YAAAAJ)/Cenzato2024-SuffixientArrays.bib,2,0,0,0,0,0,0,1,0,0,1,0 +output/Gagie (aFCoq2YAAAAJ)/Cenzato2024-SuffixientArrays.bib,1,0,0,0,0,0,0,0,0,0,1,0 output/Abidi (fzr2PUYAAAAJ)/Woensel2021-SemanticWeb.bib,4,0,0,1,1,0,0,1,0,0,1,0 output/Ye (4OQaVGUAAAAJ)/Zhang2020-UtilizingCooperative.bib,3,0,0,1,1,0,0,0,0,0,1,0 output/Gagie (aFCoq2YAAAAJ)/Gagie2024-TagArrays.bib,1,0,0,0,0,0,0,0,0,0,1,0 @@ -1900,10 +1893,10 @@ output/Gagie (aFCoq2YAAAAJ)/Hong2023-AccelerationFM.bib,5,0,0,1,0,0,0,1,1,1,1,0 output/Gagie (aFCoq2YAAAAJ)/Martinezguardiola2023-AugmentedThresholds.bib,6,0,0,1,1,0,0,1,1,1,1,0 output/Gagie (aFCoq2YAAAAJ)/Conte2023-ComputingMatching.bib,6,0,0,1,1,0,0,1,1,1,1,0 output/Abidi (fzr2PUYAAAAJ)/Woensel2021-StagedReflexive.bib,4,0,0,1,1,0,0,1,0,0,1,0 -output/Rudzicz (elXOB1sAAAAJ)/Zhu2020-SemanticCoordinates.bib,2,0,0,0,0,0,0,1,0,0,1,0 +output/Rudzicz (elXOB1sAAAAJ)/Zhu2020-SemanticCoordinates.bib,2,0,0,0,0,0,1,0,0,0,1,0 output/Tang (VhWYfm8AAAAJ)/Khawam2025-FederatedNon.bib,3,0,0,1,1,0,0,0,0,0,1,0 output/Ye (4OQaVGUAAAAJ)/Qu2020-DynamicFlow.bib,4,0,0,1,1,0,0,1,0,0,1,0 -output/Rudzicz (elXOB1sAAAAJ)/Yeung2020-SequentialExplanations.bib,2,0,0,0,0,0,0,1,0,0,1,0 +output/Rudzicz (elXOB1sAAAAJ)/Yeung2020-SequentialExplanations.bib,1,0,0,0,0,0,0,0,0,0,1,0 output/Sharma (VHjAIe8AAAAJ)/Sharma2024-SurveyMachine.bib,3,0,0,1,1,0,0,0,0,0,1,0 output/Sharma (VHjAIe8AAAAJ)/Palit2023-AutomaticRefactoring.bib,4,0,0,1,1,0,0,1,0,0,1,0 output/Sharma (VHjAIe8AAAAJ)/Nanadani2023-CalibratingDeep.bib,4,0,0,1,1,0,0,1,0,0,1,0 @@ -1917,7 +1910,7 @@ output/Tang (VhWYfm8AAAAJ)/Wang2026-IEDLIDS.bib,3,0,0,1,1,0,0,0,0,0,1,0 output/Neethirajan (8VZwF0sAAAAJ)/Neethirajan2021-BeyondDeepfake.bib,6,0,0,1,1,0,0,1,1,1,1,0 output/Rudzicz (elXOB1sAAAAJ)/Rudzicz2020-SystemMethod.bib,0,0,0,0,0,0,0,0,0,0,0,0 output/Sharma (VHjAIe8AAAAJ)/Nandani2023-DACOSManually.bib,3,0,0,1,1,0,0,0,0,0,1,0 -output/Rudzicz (elXOB1sAAAAJ)/Liaqat2020-GroundTruth.bib,2,0,0,0,0,0,0,1,0,0,1,0 +output/Rudzicz (elXOB1sAAAAJ)/Liaqat2020-GroundTruth.bib,1,0,0,0,0,0,0,0,0,0,1,0 output/Matwin (rCoJeuYAAAAJ)/Etemad2020-SWSUnsupervised.bib,2,0,0,0,1,0,0,0,0,0,1,0 output/Gagie (aFCoq2YAAAAJ)/Cozzi2023-MPBWT.bib,5,0,0,1,1,0,0,0,1,1,1,0 output/Gagie (aFCoq2YAAAAJ)/Gagie2023-PangenomicAlignment.bib,0,0,0,0,0,0,0,0,0,0,0,0 @@ -1955,7 +1948,7 @@ output/Matwin (rCoJeuYAAAAJ)/Ghazizadeh2020-CBDBSCAN.bib,4,0,0,1,1,0,0,1,0,0,1,0 output/Orji (-1cHtBQAAAAJ)/Chan2021-PersonalizingGameful.bib,3,0,0,0,1,0,0,1,0,0,1,0 output/Gagie (aFCoq2YAAAAJ)/Lyu2023-SumLocal.bib,3,0,0,1,1,0,0,0,0,0,1,0 output/Gagie (aFCoq2YAAAAJ)/Gagie2022-RepresentingDegree.bib,4,0,0,1,1,0,1,0,0,0,1,0 -output/Gagie (aFCoq2YAAAAJ)/Bonizzoni2022-CompressedData.bib,4,0,0,0,1,0,0,1,0,1,1,0 +output/Gagie (aFCoq2YAAAAJ)/Bonizzoni2022-CompressedData.bib,3,0,0,0,1,0,0,0,0,1,1,0 output/Abidi (fzr2PUYAAAAJ)/Rad2020-AIDriven.bib,3,0,0,1,1,0,0,0,0,0,1,0 output/Matwin (rCoJeuYAAAAJ)/Petry2020-ChallengesVessel.bib,4,0,0,1,1,0,0,1,0,0,1,0 output/Tang (VhWYfm8AAAAJ)/Jia2024-CuriosityDriven.bib,3,0,0,1,1,0,0,0,0,0,1,0 @@ -1967,7 +1960,7 @@ output/Rudzicz (elXOB1sAAAAJ)/Li2020-WordClass.bib,4,0,0,1,1,0,0,1,0,0,1,0 output/Gagie (aFCoq2YAAAAJ)/Oliva2022-CSTsTerabyte.bib,5,0,0,1,1,0,0,0,1,1,1,0 output/Matwin (rCoJeuYAAAAJ)/Appice2020-DiscoveryScience.bib,0,0,0,0,0,0,0,0,0,0,0,0 output/Tang (VhWYfm8AAAAJ)/Liu2025-MVSTGHAT.bib,3,0,0,1,1,0,0,0,0,0,1,0 -output/Tang (VhWYfm8AAAAJ)/Wu2023-BeefUp.bib,2,0,0,0,0,0,0,1,0,0,1,0 +output/Tang (VhWYfm8AAAAJ)/Wu2023-BeefUp.bib,1,0,0,0,0,0,0,0,0,0,1,0 output/Sharma (VHjAIe8AAAAJ)/Sharma2021-CodeSmell.bib,2,0,0,0,1,0,0,0,0,0,1,0 output/Orji (-1cHtBQAAAAJ)/Nkwo2021-PersuasiveApps.bib,5,0,0,1,1,0,0,0,1,1,1,0 output/Keselj (uDKsmuIAAAAJ)/Kosmajac2020-TwitterUser.bib,2,0,0,1,0,0,0,0,0,0,1,0 @@ -1981,12 +1974,12 @@ output/Neethirajan (8VZwF0sAAAAJ)/Neethirajan2021-HappyCowOr.bib,6,0,1,1,1,0,0,1 output/Tang (VhWYfm8AAAAJ)/Xu2023-RLCReinforcement.bib,3,0,0,1,1,0,0,0,0,0,1,0 output/Sharma (VHjAIe8AAAAJ)/Sharma2020-EmpiricalInvestigation.bib,2,0,0,0,1,0,0,0,0,0,1,0 output/Neethirajan (8VZwF0sAAAAJ)/Neethirajan2021-MakingSense.bib,0,0,0,0,0,0,0,0,0,0,0,0 -output/Sharma (VHjAIe8AAAAJ)/Sharma2020-DoWe.bib,2,0,0,0,0,0,0,1,0,0,1,0 +output/Sharma (VHjAIe8AAAAJ)/Sharma2020-DoWe.bib,2,0,0,0,0,0,1,0,0,0,1,0 output/Orji (-1cHtBQAAAAJ)/Mulchandani2021-PersuasivenessGame.bib,2,0,0,0,1,0,0,0,0,0,1,0 output/Neethirajan (8VZwF0sAAAAJ)/Neethirajan2021-83Mapping.bib,2,0,0,1,0,0,0,0,0,0,1,0 output/Orji (-1cHtBQAAAAJ)/Oyebode2021-SleepFitPersuasive.bib,4,0,0,1,1,0,0,1,0,0,1,0 output/Ye (4OQaVGUAAAAJ)/Chen2020-SDATPSDN.bib,3,0,0,1,1,0,0,0,0,0,1,0 -output/Neethirajan (8VZwF0sAAAAJ)/Neethirajan2021-MeasuringAnimal.bib,1,0,0,0,0,0,0,1,0,0,0,0 +output/Neethirajan (8VZwF0sAAAAJ)/Neethirajan2021-MeasuringAnimal.bib,0,0,0,0,0,0,0,0,0,0,0,0 output/Orji (-1cHtBQAAAAJ)/Ndulue2021-STDPONG.bib,4,0,0,1,1,0,0,1,0,0,1,0 output/Gagie (aFCoq2YAAAAJ)/Ferragina2022-ImprovingMatrix.bib,3,0,0,1,1,0,0,0,0,0,1,0 output/Sharma (VHjAIe8AAAAJ)/Thakur2020-QScoredOpen.bib,4,0,0,1,1,0,0,1,0,0,1,0 @@ -2000,32 +1993,32 @@ output/Matwin (rCoJeuYAAAAJ)/Jiang2020-ImplicitClass.bib,2,0,0,0,0,0,0,1,0,0,1,0 output/Tang (VhWYfm8AAAAJ)/Tang2022-RoutingAlgorithms.bib,2,0,0,0,1,0,0,0,0,0,1,0 output/Neethirajan (8VZwF0sAAAAJ)/Pennings2021-SensorData.bib,3,0,0,0,1,0,0,1,0,0,1,0 output/Matwin (rCoJeuYAAAAJ)/Varno2020-LearnFaster.bib,2,0,0,0,0,0,0,1,0,0,1,0 -output/Tang (VhWYfm8AAAAJ)/Su2021-LearningBased.bib,1,0,0,0,0,0,0,1,0,0,0,0 +output/Tang (VhWYfm8AAAAJ)/Su2021-LearningBased.bib,0,0,0,0,0,0,0,0,0,0,0,0 output/Matwin (rCoJeuYAAAAJ)/Alyami2020-MiningSaudi.bib,4,0,0,1,1,0,0,1,0,0,1,0 output/Abidi (fzr2PUYAAAAJ)/Naseem2020-FactorsEnabling.bib,3,0,0,1,1,0,0,0,0,0,1,0 output/Abidi (fzr2PUYAAAAJ)/Woensel2020-IndoorLocation.bib,5,0,1,1,1,0,0,1,0,0,1,0 output/Gagie (aFCoq2YAAAAJ)/Rossi2022-MONIPangenomic.bib,4,0,0,1,1,0,0,0,0,1,1,0 output/Tang (VhWYfm8AAAAJ)/Fu2021-EnergyEfficient.bib,2,0,0,0,1,0,0,0,0,0,1,0 -output/Neethirajan (8VZwF0sAAAAJ)/Neethirajan2021-SocialNetwork.bib,0,0,0,0,0,0,0,0,0,0,0,0 +output/Neethirajan (8VZwF0sAAAAJ)/Neethirajan2021-SocialNetwork.bib,2,0,0,0,1,0,0,0,0,0,1,0 output/Gagie (aFCoq2YAAAAJ)/Tatarnikov2023-MONICan.bib,3,0,0,1,0,0,1,0,0,0,1,0 -output/Gagie (aFCoq2YAAAAJ)/Gagie2022-MONIK.bib,1,0,0,0,0,0,0,0,0,0,1,0 +output/Gagie (aFCoq2YAAAAJ)/Gagie2022-MONIK.bib,2,0,0,0,1,0,0,0,0,0,1,0 output/Matwin (rCoJeuYAAAAJ)/Kirsebom2020-PerformanceDeep.bib,5,0,0,0,1,0,0,1,1,1,1,0 output/Orji (-1cHtBQAAAAJ)/Oyebode2021-TreeCareDevelopment.bib,2,0,0,0,1,0,0,0,0,0,1,0 output/Matwin (rCoJeuYAAAAJ)/Zhao2021-RiskAware.bib,4,0,0,1,1,0,0,1,0,0,1,0 output/Neethirajan (8VZwF0sAAAAJ)/Neethirajan2021-UseArtificial.bib,5,0,0,1,1,0,0,0,1,1,1,0 output/Tang (VhWYfm8AAAAJ)/Fu2020-JointUnmanned.bib,3,0,0,1,1,0,0,0,0,0,1,0 -output/Neethirajan (8VZwF0sAAAAJ)/Neethirajan2021-UseBiosensors.bib,1,0,0,0,0,0,0,1,0,0,0,0 +output/Neethirajan (8VZwF0sAAAAJ)/Neethirajan2021-UseBiosensors.bib,0,0,0,0,0,0,0,0,0,0,0,0 output/Orji (-1cHtBQAAAAJ)/Oyebode2020-HybridRecommender.bib,3,0,0,1,1,0,0,0,0,0,1,0 output/Gagie (aFCoq2YAAAAJ)/Gagie2022-PrefaceSpecial.bib,3,0,0,1,1,0,0,0,0,0,1,0 output/Orji (-1cHtBQAAAAJ)/Oyebode2020-PersuasiveMobile.bib,1,0,0,0,0,0,0,1,0,0,0,0 output/Matwin (rCoJeuYAAAAJ)/Yang2020-SemEval2020.bib,3,0,0,1,1,0,0,0,0,0,1,0 output/Gagie (aFCoq2YAAAAJ)/Brown2022-RLBWTTricks.bib,5,0,0,1,1,0,0,0,1,1,1,0 -output/Gagie (aFCoq2YAAAAJ)/Gagie2022-SpaceEfficient.bib,2,0,0,0,0,0,0,1,0,0,1,0 +output/Gagie (aFCoq2YAAAAJ)/Gagie2022-SpaceEfficient.bib,3,0,0,0,0,0,1,1,0,0,1,0 output/Matwin (rCoJeuYAAAAJ)/Carlini2020-UncoveringVessel.bib,3,0,0,1,0,0,0,1,0,0,1,0 output/Tang (VhWYfm8AAAAJ)/Fu2020-CooperativeComputing.bib,3,0,0,1,1,0,0,0,0,0,1,0 output/Orji (-1cHtBQAAAAJ)/Hakim2020-WebApplication.bib,5,0,0,1,1,0,0,0,1,1,1,0 output/Gagie (aFCoq2YAAAAJ)/Alanko2022-SyottiScalable.bib,5,0,0,1,1,0,0,0,1,1,1,0 -output/Gagie (aFCoq2YAAAAJ)/Gagie2022-TeachingBurrows.bib,2,0,0,0,0,0,0,1,0,0,1,0 +output/Gagie (aFCoq2YAAAAJ)/Gagie2022-TeachingBurrows.bib,2,0,0,0,0,0,1,0,0,0,1,0 output/Matwin (rCoJeuYAAAAJ)/Etemad2020-WiseSliding.bib,4,0,0,1,1,0,0,1,0,0,1,0 output/Orji (-1cHtBQAAAAJ)/Suruliraj2020-BotaPersonalized.bib,1,0,0,0,0,0,0,1,0,0,0,0 output/Orji (-1cHtBQAAAAJ)/Iyer2020-CognitiveLoad.bib,3,0,0,0,1,0,0,1,0,0,1,0 @@ -2048,8 +2041,8 @@ output/Orji (-1cHtBQAAAAJ)/Oyebode2020-NourishYour.bib,4,0,0,1,1,0,0,1,0,0,1,0 output/Orji (-1cHtBQAAAAJ)/Abdullahi2020-PersonalitySubjective.bib,6,0,0,1,1,0,0,1,1,1,1,0 output/Gagie (aFCoq2YAAAAJ)/Cording2021-MaximalUnbordered.bib,2,0,0,0,1,0,0,0,0,0,1,0 output/Gagie (aFCoq2YAAAAJ)/Ahmed2021-PanGenomic.bib,6,0,0,1,1,0,0,1,1,1,1,0 -output/Orji (-1cHtBQAAAAJ)/Mbanusi2020-PersonalizedPersuasive.bib,1,0,0,0,0,0,0,1,0,0,0,0 -output/Orji (-1cHtBQAAAAJ)/Orji2020-PersonalizingPersuasive.bib,1,0,0,0,0,0,0,1,0,0,0,0 +output/Orji (-1cHtBQAAAAJ)/Mbanusi2020-PersonalizedPersuasive.bib,0,0,0,0,0,0,0,0,0,0,0,0 +output/Orji (-1cHtBQAAAAJ)/Orji2020-PersonalizingPersuasive.bib,0,0,0,0,0,0,0,0,0,0,0,0 output/Gagie (aFCoq2YAAAAJ)/Boucher2021-PFPCompressed.bib,4,0,0,1,0,0,0,0,1,1,1,0 output/Gagie (aFCoq2YAAAAJ)/Boucher2021-PHONIStreamed.bib,6,0,0,1,1,0,0,1,1,1,1,0 output/Gagie (aFCoq2YAAAAJ)/Belazzougui2021-RangeMajorities.bib,3,0,0,0,1,0,0,1,0,0,1,0 @@ -2060,41 +2053,40 @@ output/Matwin (rCoJeuYAAAAJ)/Adibi2020-PredictingFishing.bib,4,0,0,1,1,0,0,1,0,0 output/Gagie (aFCoq2YAAAAJ)/Gagie2022-SimpleWorst.bib,2,0,0,0,1,0,0,0,0,0,1,0 output/Orji (-1cHtBQAAAAJ)/Ndulue2020-PHISHERCRUSH.bib,4,0,0,1,1,0,0,1,0,0,1,0 output/Orji (-1cHtBQAAAAJ)/Zhao2020-PhysicalActivity.bib,3,0,0,0,1,0,0,1,0,0,1,0 -output/Gagie (aFCoq2YAAAAJ)/Gagie2021-SuccinctEuler.bib,2,0,0,0,0,0,0,1,0,0,1,0 +output/Gagie (aFCoq2YAAAAJ)/Gagie2021-SuccinctEuler.bib,2,0,0,0,0,0,1,0,0,0,1,0 output/Orji (-1cHtBQAAAAJ)/Chan2020-PlayerMatching.bib,2,0,0,1,0,0,0,0,0,0,1,0 output/Gagie (aFCoq2YAAAAJ)/Gagie2020-CompressedDynamic.bib,3,0,0,1,1,0,0,0,0,0,1,0 output/Gagie (aFCoq2YAAAAJ)/Bille2020-DecompressingLempel.bib,4,0,0,1,1,0,0,1,0,0,1,0 output/Gagie (aFCoq2YAAAAJ)/Kuhnle2020-EfficientConstruction.bib,6,0,0,1,1,0,0,1,1,1,1,0 output/Orji (-1cHtBQAAAAJ)/Nkwo2020-PublicPerception.bib,3,0,0,1,1,0,0,0,0,0,1,0 output/Gagie (aFCoq2YAAAAJ)/Gagie2020-FullyFunctional.bib,4,0,0,1,1,0,0,1,0,0,1,0 -output/Orji (-1cHtBQAAAAJ)/Nkwo2020-SociallyOriented.bib,1,0,0,0,0,0,0,1,0,0,0,0 +output/Orji (-1cHtBQAAAAJ)/Nkwo2020-SociallyOriented.bib,0,0,0,0,0,0,0,0,0,0,0,0 output/Orji (-1cHtBQAAAAJ)/Ragab2020-AssessmentAccuracy.bib,4,0,0,1,1,0,0,1,0,0,1,0 output/Orji (-1cHtBQAAAAJ)/Alkhalifah2020-TowardsMobile.bib,4,0,0,1,1,0,0,1,0,0,1,0 output/Gagie (aFCoq2YAAAAJ)/Mun2020-MatchingReads.bib,4,0,0,1,0,0,0,0,1,1,1,0 output/Gagie (aFCoq2YAAAAJ)/Bannai2020-MoreTime.bib,4,0,0,1,1,0,0,1,0,0,1,0 -output/Gagie (aFCoq2YAAAAJ)/Boucher2020-PFPData.bib,2,0,0,0,0,0,0,1,0,0,1,0 +output/Gagie (aFCoq2YAAAAJ)/Boucher2020-PFPData.bib,1,0,0,0,0,0,0,0,0,0,1,0 output/Orji (-1cHtBQAAAAJ)/Aldenaini2020-TrendsPersuasive.bib,6,0,1,1,1,0,0,0,1,1,1,0 output/Gagie (aFCoq2YAAAAJ)/Gagie2020-PracticalRandom.bib,5,0,1,1,1,0,0,1,0,0,1,0 output/Orji (-1cHtBQAAAAJ)/Oyebode2020-MachineLearning.bib,3,0,0,1,1,0,0,0,0,0,1,0 output/Gagie (aFCoq2YAAAAJ)/Bannai2020-RefiningR.bib,3,0,0,1,1,0,0,0,0,0,1,0 output/Gagie (aFCoq2YAAAAJ)/Gagie2020-TreePath.bib,4,0,0,1,1,0,0,1,0,0,1,0 -output/Sajjad (t3BH6NkAAAAJ)/Badshah2025-CLEVLLM.bib,5,0,1,0,1,0,0,1,0,1,1,0 output/Abidi (fzr2PUYAAAAJ)/Youngshand2020-CharacterizationTotal.bib,1,0,0,0,0,0,0,1,0,0,0,0 output/Neethirajan (8VZwF0sAAAAJ)/Rao2025-AdvancingDairy.bib,0,0,0,0,0,0,0,0,0,0,0,0 output/Evans (NqlOPkMAAAAJ)/Mubarak2024-CollaborativeInnovation.bib,0,0,0,0,0,0,0,0,0,0,0,0 output/Neethirajan (8VZwF0sAAAAJ)/Zhang2025-ReimaginingDairy.bib,0,0,0,0,0,0,0,0,0,0,0,0 output/Gagie (aFCoq2YAAAAJ)/Bonizzoni2023-DataStructures.bib,4,0,0,1,0,0,0,0,1,1,1,0 output/Neethirajan (8VZwF0sAAAAJ)/Sivakumar2024-AdvancingDairy.bib,0,0,0,0,0,0,0,0,0,0,0,0 -output/Gagie (aFCoq2YAAAAJ)/Depuydt2023-SuffixientSets.bib,2,0,0,0,0,0,0,1,0,0,1,0 +output/Gagie (aFCoq2YAAAAJ)/Depuydt2023-SuffixientSets.bib,1,0,0,0,0,0,0,0,0,0,1,0 output/Ye (4OQaVGUAAAAJ)/Ye2021-DynamicResource.bib,3,0,0,0,1,0,0,1,0,0,1,0 output/Neethirajan (8VZwF0sAAAAJ)/Neethirajan2024-EnhancingAnimal.bib,0,0,0,0,0,0,0,0,0,0,0,0 output/Neethirajan (8VZwF0sAAAAJ)/Mahato2024-InformationProcessing.bib,0,0,0,0,0,0,0,0,0,0,0,0 output/Gagie (aFCoq2YAAAAJ)/Gagie2022-StringProcessing.bib,0,0,0,0,0,0,0,0,0,0,0,0 -output/Gagie (aFCoq2YAAAAJ)/Gagie2021-RIndexing.bib,1,0,0,0,0,0,0,0,0,0,1,0 +output/Gagie (aFCoq2YAAAAJ)/Gagie2021-RIndexing.bib,2,0,0,0,0,0,1,0,0,0,1,0 output/Milios (ME8aQywAAAAJ)/Carenini2022-InformationVisualization.bib,0,0,0,0,0,0,0,0,0,0,0,0 output/Rudzicz (elXOB1sAAAAJ)/Rudzicz2022-FinalToughts.bib,0,0,0,0,0,0,0,0,0,0,0,0 output/Orji (-1cHtBQAAAAJ)/Orji2024-PersuasiveInterfaces.bib,2,0,0,0,1,0,0,0,0,0,1,0 -output/Oyebode (-6DsTnMAAAAJ)/Ezembu2025-MultiModal.bib,4,0,0,0,1,0,0,1,0,1,1,0 +output/Oyebode (-6DsTnMAAAAJ)/Ezembu2025-MultiModal.bib,3,0,0,0,1,0,0,0,0,1,1,0 output/Oyebode (-6DsTnMAAAAJ)/Orji2024-PersuasiveInterfaces.bib,2,0,0,0,1,0,0,0,0,0,1,0 output/Oyebode (-6DsTnMAAAAJ)/Oyebode2024-TowardsAI.bib,0,0,0,0,0,0,0,0,0,0,0,0 output/Neethirajan (8VZwF0sAAAAJ)/Neethirajan2022-DigitalizationLivestock.bib,0,0,0,0,0,0,0,0,0,0,0,0 @@ -2103,9 +2095,9 @@ output/Neethirajan (8VZwF0sAAAAJ)/Neethirajan2022-SensorsAI.bib,0,0,0,0,0,0,0,0, output/Oyebode (-6DsTnMAAAAJ)/Alslaity2022-MobileApplications.bib,4,0,0,1,1,0,0,1,0,0,1,0 output/Oyebode (-6DsTnMAAAAJ)/Oyebode2022-PlayerMatching.bib,4,0,0,1,1,0,0,1,0,0,1,0 output/Oyebode (-6DsTnMAAAAJ)/Adaji2022-Preface6th.bib,0,0,0,0,0,0,0,0,0,0,0,0 -output/Oyebode (-6DsTnMAAAAJ)/Jelodar2021-ArtificialIntelligence.bib,4,0,0,0,1,0,0,1,0,1,1,0 +output/Oyebode (-6DsTnMAAAAJ)/Jelodar2021-ArtificialIntelligence.bib,3,0,0,0,1,0,0,0,0,1,1,0 output/Oore (cI0dYX4AAAAJ)/Sastry2023-TrainingDiffusion.bib,0,0,0,0,0,0,0,0,0,0,0,0 -output/Oyebode (-6DsTnMAAAAJ)/Oyebode2020-PersuasiveMobile.bib,1,0,0,0,0,0,0,1,0,0,0,0 +output/Oyebode (-6DsTnMAAAAJ)/Oyebode2020-PersuasiveMobile.bib,0,0,0,0,0,0,0,0,0,0,0,0 output/Heywood (_d-AGjUAAAAJ)/Heywood2023-EvolutionaryEnsemble.bib,3,0,0,0,1,0,0,1,0,0,1,0 output/Reilly (fZ56s2EAAAAJ)/Hu2025-AugmentedReality.bib,0,0,0,0,0,0,0,0,0,0,0,0 output/Rosborough (kG4oQmsAAAAJ)/Rosborough2024-AnthonyRosborough.bib,0,0,0,0,0,0,0,0,0,0,0,0 @@ -2114,11 +2106,11 @@ output/Keselj (uDKsmuIAAAAJ)/Charlebois2020-CanadaS.bib,0,0,0,0,0,0,0,0,0,0,0,0 output/Kryven (5ogGlooAAAAJ)/Kryven2021-PlansOr.bib,6,0,0,1,1,0,0,1,1,1,1,0 output/Neethirajan (8VZwF0sAAAAJ)/Neethirajan2021-SensorsAnimals.bib,0,0,0,0,0,0,0,0,0,0,0,0 output/Brandt (OMA_KjcAAAAJ)/Asadi2020-BasicPolynomial.bib,0,0,0,0,0,0,0,0,0,0,0,0 -output/Wehbe (UrFw3XEAAAAJ)/Wehbe2021-DesigningPersuasively.bib,1,0,0,0,0,0,0,1,0,0,0,0 +output/Wehbe (UrFw3XEAAAAJ)/Wehbe2021-DesigningPersuasively.bib,0,0,0,0,0,0,0,0,0,0,0,0 output/Brandt (OMA_KjcAAAAJ)/Asadi2020-WhatS.bib,0,0,0,0,0,0,0,0,0,0,0,0 -output/Oyebode (-6DsTnMAAAAJ)/Oyebode2020-DeconstructingPersuasive.bib,1,0,0,0,0,0,0,1,0,0,0,0 -output/Neethirajan (8VZwF0sAAAAJ)/Neethirajan2021-DoFarm.bib,1,0,0,0,0,0,0,1,0,0,0,0 -output/Neethirajan (8VZwF0sAAAAJ)/Senthilkumar2024-ComparativeAnalysis.bib,3,0,0,0,1,0,0,1,0,0,1,0 +output/Oyebode (-6DsTnMAAAAJ)/Oyebode2020-DeconstructingPersuasive.bib,0,0,0,0,0,0,0,0,0,0,0,0 +output/Neethirajan (8VZwF0sAAAAJ)/Neethirajan2021-DoFarm.bib,0,0,0,0,0,0,0,0,0,0,0,0 +output/Neethirajan (8VZwF0sAAAAJ)/Senthilkumar2024-ComparativeAnalysis.bib,2,0,0,0,1,0,0,0,0,0,1,0 output/Zincir-Heywood (F9nG0F4AAAAJ)/Adjei2025-CanFlow.bib,4,0,0,1,1,0,0,1,0,0,1,0 output/Zincir-Heywood (F9nG0F4AAAAJ)/Wang2025-DiscoveringBlue.bib,4,0,0,1,1,0,0,1,0,0,1,0 output/Zincir-Heywood (F9nG0F4AAAAJ)/Weber2025-EncryptedNetwork.bib,4,0,0,1,1,0,0,1,0,0,1,0 @@ -2207,7 +2199,6 @@ output/Orji (-1cHtBQAAAAJ)/Oyebode2025-IntuitiveInterfaces.bib,6,0,0,1,1,0,0,1,1 output/Oyebode (-6DsTnMAAAAJ)/Oyebode2025-IntuitiveInterfaces.bib,5,0,0,1,1,0,0,0,1,1,1,0 output/Orji (-1cHtBQAAAAJ)/Alqahtani2024-ExploringEffect.bib,3,0,0,1,1,0,0,0,0,0,1,0 output/Milios (ME8aQywAAAAJ)/Way2021-EmergingTrends.bib,0,0,0,0,0,0,0,0,0,0,0,0 -output/Milios (ME8aQywAAAAJ)/Maisonnave2020-ImprovingEvent.bib,1,0,0,0,0,0,0,1,0,0,0,0 output/Orji (-1cHtBQAAAAJ)/Adaji2022-Preface6th.bib,1,0,0,1,0,0,0,0,0,0,0,0 output/Orji (-1cHtBQAAAAJ)/Oyebode2021-TailoringPersuasive.bib,4,0,0,1,1,0,0,1,0,0,1,0 output/Sharma (VHjAIe8AAAAJ)/Afrin2026-NotAll.bib,2,0,0,0,0,0,0,1,0,0,1,0 @@ -2238,24 +2229,24 @@ output/Sampangi (x_Cy69EAAAAJ)/Poitras2025-ClusteringProfiling.bib,3,0,0,1,1,0,0 output/Mattheisen (uhlDFm4AAAAJ)/Hj2020-GenomeWide.bib,5,0,0,1,1,0,0,0,1,1,1,0 output/Sampalli (UCVetfAAAAAJ)/Zhang2026-LightweightIoT.bib,3,0,0,1,1,0,0,0,0,0,1,0 output/Sampalli (UCVetfAAAAAJ)/Mutakabbir2023-SpatioTemporal.bib,3,0,0,1,1,0,0,0,0,0,1,0 -output/Milios (ME8aQywAAAAJ)/Dumpala2024-SensitivityGenerativeVLMs.bib,2,0,0,0,0,0,0,1,0,0,1,0 +output/Milios (ME8aQywAAAAJ)/Dumpala2024-SensitivityGenerativeVLMs.bib,1,0,0,0,0,0,0,0,0,0,1,0 output/Sajjad (t3BH6NkAAAAJ)/Liaqat2024-ChameleonImages.bib,1,0,0,0,0,0,0,0,0,0,1,0 -output/Orji (-1cHtBQAAAAJ)/Duke2025-MobileLife.bib,2,0,0,0,0,0,0,0,0,1,1,0 -output/Sajjad (t3BH6NkAAAAJ)/Saeed2024-ModalityInvariant.bib,2,0,0,0,0,0,0,1,0,0,1,0 -output/Sajjad (t3BH6NkAAAAJ)/Dumpala2024-SensitivityGenerativeVLMs.bib,2,0,0,0,0,0,0,1,0,0,1,0 +output/Orji (-1cHtBQAAAAJ)/Duke2025-MobileLife.bib,3,0,0,0,1,0,0,0,0,1,1,0 +output/Sajjad (t3BH6NkAAAAJ)/Saeed2024-ModalityInvariant.bib,1,0,0,0,0,0,0,0,0,0,1,0 +output/Sajjad (t3BH6NkAAAAJ)/Dumpala2024-SensitivityGenerativeVLMs.bib,1,0,0,0,0,0,0,0,0,0,1,0 output/Sajjad (t3BH6NkAAAAJ)/Fan2023-EvaluatingNeuronInterpretation.bib,5,0,0,1,1,0,1,1,0,0,1,0 -output/Matwin (rCoJeuYAAAAJ)/Zare2021-ContinuousControlDeep.bib,2,0,0,0,0,0,0,1,0,0,1,0 +output/Matwin (rCoJeuYAAAAJ)/Zare2021-ContinuousControlDeep.bib,1,0,0,0,0,0,0,0,0,0,1,0 output/Gagie (aFCoq2YAAAAJ)/Lyu2022-RulerRolling.bib,2,0,0,0,0,0,0,1,0,0,1,0 -output/Matwin (rCoJeuYAAAAJ)/Matwin2021-SurveyGenerative.bib,2,0,0,0,0,0,0,1,0,0,1,0 -output/Neethirajan (8VZwF0sAAAAJ)/Neethirajan2025-SustainableComputingDigital.bib,4,0,0,0,1,0,0,1,0,1,1,0 -output/Oore (cI0dYX4AAAAJ)/Rodriguez2024-PredictingIndividual.bib,2,0,0,0,0,0,0,1,0,0,1,0 -output/Oore (cI0dYX4AAAAJ)/Dumpala2024-SensitivityGenerativeVLMs.bib,2,0,0,0,0,0,0,1,0,0,1,0 -output/Neethirajan (8VZwF0sAAAAJ)/Parmar2024-ArtificialIntelligenceDriven.bib,4,0,0,0,1,0,0,1,0,1,1,0 +output/Matwin (rCoJeuYAAAAJ)/Matwin2021-SurveyGenerative.bib,1,0,0,0,0,0,0,0,0,0,1,0 +output/Neethirajan (8VZwF0sAAAAJ)/Neethirajan2025-SustainableComputingDigital.bib,3,0,0,0,1,0,0,0,0,1,1,0 +output/Oore (cI0dYX4AAAAJ)/Rodriguez2024-PredictingIndividual.bib,1,0,0,0,0,0,0,0,0,0,1,0 +output/Oore (cI0dYX4AAAAJ)/Dumpala2024-SensitivityGenerativeVLMs.bib,1,0,0,0,0,0,0,0,0,0,1,0 +output/Neethirajan (8VZwF0sAAAAJ)/Parmar2024-ArtificialIntelligenceDriven.bib,3,0,0,0,1,0,0,0,0,1,1,0 output/Rahman (9SrqOewAAAAJ)/Shah2025-ImitationGameReproducing.bib,2,0,0,0,0,0,0,1,0,0,1,0 -output/Oore (cI0dYX4AAAAJ)/Dumpala2021-SignificanceSpeakerEmbeddings.bib,2,0,0,0,0,0,0,1,0,0,1,0 -output/Wu (IdBlVPUAAAAJ)/Zhou2020-NoiseContrastive.bib,2,0,0,0,0,0,0,1,0,0,1,0 -output/Neethirajan (8VZwF0sAAAAJ)/Neethirajan2023-EthicalFrontierNavigating.bib,3,0,0,0,1,0,0,1,0,0,1,0 -output/Neethirajan (8VZwF0sAAAAJ)/Neethirajan2021-EthicsDigital.bib,4,0,0,0,1,0,0,1,0,1,1,0 +output/Oore (cI0dYX4AAAAJ)/Dumpala2021-SignificanceSpeakerEmbeddings.bib,2,0,0,0,0,0,1,0,0,0,1,0 +output/Wu (IdBlVPUAAAAJ)/Zhou2020-NoiseContrastive.bib,1,0,0,0,0,0,0,0,0,0,1,0 +output/Neethirajan (8VZwF0sAAAAJ)/Neethirajan2023-EthicalFrontierNavigating.bib,2,0,0,0,1,0,0,0,0,0,1,0 +output/Neethirajan (8VZwF0sAAAAJ)/Neethirajan2021-EthicsDigital.bib,3,0,0,0,1,0,0,0,0,1,1,0 output/Abidi (fzr2PUYAAAAJ)/Young2020-ClinicalBiomechanical.bib,1,0,0,0,0,0,0,1,0,0,0,0 output/Matwin (rCoJeuYAAAAJ)/Matwin2020-DebunkingSome.bib,0,0,0,0,0,0,0,0,0,0,0,0 output/Rudzicz (elXOB1sAAAAJ)/Konate2025-ReliableCompositional.bib,0,0,0,0,0,0,0,0,0,0,0,0 @@ -2263,7 +2254,7 @@ output/Rudzicz (elXOB1sAAAAJ)/Zeng2025-SocialBehaviour.bib,1,0,0,1,0,0,0,0,0,0,0 output/Evans (NqlOPkMAAAAJ)/Zhu2021-CyberbullyingAmong.bib,5,0,0,1,1,0,0,0,1,1,1,0 output/Heywood (_d-AGjUAAAAJ)/Krawiec2020-SolvingComplex.bib,3,0,0,1,1,0,0,0,0,0,1,0 output/Evans (NqlOPkMAAAAJ)/Lee2021-DigitalTransformation.bib,3,0,0,1,1,0,0,0,0,0,1,0 -output/Oore (cI0dYX4AAAAJ)/Sastry2020-DetectingOut.bib,1,0,0,0,0,0,0,1,0,0,0,0 +output/Oore (cI0dYX4AAAAJ)/Sastry2020-DetectingOut.bib,0,0,0,0,0,0,0,0,0,0,0,0 output/Evans (NqlOPkMAAAAJ)/Shen2021-EmotionalAttitudes.bib,6,0,1,1,1,0,0,0,1,1,1,0 output/Evans (NqlOPkMAAAAJ)/Chen2021-FactorsDriving.bib,5,0,0,1,1,0,0,0,1,1,1,0 output/Evans (NqlOPkMAAAAJ)/Zhang2021-KnowledgeDriven.bib,5,0,0,1,1,0,0,0,1,1,1,0 @@ -2284,7 +2275,7 @@ output/Evans (NqlOPkMAAAAJ)/Cuvero2020-KnowledgeSpillovers.bib,3,0,0,1,1,0,0,0,0 output/Evans (NqlOPkMAAAAJ)/Hong2020-PatientQuestions.bib,4,0,0,1,1,0,0,0,0,1,1,0 output/Evans (NqlOPkMAAAAJ)/Kungwengwe2020-SanaGamified.bib,3,0,0,1,1,0,0,0,0,0,1,0 output/Evans (NqlOPkMAAAAJ)/Lamlam2020-RoleCompassion.bib,2,0,0,0,1,0,0,0,0,0,1,0 -output/Orji (-1cHtBQAAAAJ)/Skov2020-PrefaceAdjunct.bib,1,0,0,0,0,0,0,1,0,0,0,0 +output/Orji (-1cHtBQAAAAJ)/Skov2020-PrefaceAdjunct.bib,0,0,0,0,0,0,0,0,0,0,0,0 output/Neethirajan (8VZwF0sAAAAJ)/Neethirajan2021-WURWolf.bib,0,0,0,0,0,0,0,0,0,0,0,0 output/Rudzicz (elXOB1sAAAAJ)/Nassiri2025-GrporadGroup.bib,0,0,0,0,0,0,0,0,0,0,0,0 output/Maguire (rHFCtWwAAAAJ)/Jamin2021-AMRhackathon2021.bib,0,0,0,0,0,0,0,0,0,0,0,0 @@ -2296,7 +2287,6 @@ output/Haque (PMTOOSQAAAAJ)/Ifath2026-CharacterizingPerformance.bib,4,0,0,1,1,0, output/Gagie (aFCoq2YAAAAJ)/Slizovskiy2021-TargetEnriched.bib,0,0,0,0,0,0,0,0,0,0,0,0 output/Haque (PMTOOSQAAAAJ)/Saha2020-EnergyAware.bib,3,0,0,1,1,0,0,0,0,0,1,0 output/Orji (-1cHtBQAAAAJ)/Ndulue2024-InvestigatingGender.bib,0,0,0,0,0,0,0,0,0,0,0,0 -output/He (4yj_9skAAAAJ)/He2020-BreadthFirst.bib,1,0,0,0,0,0,0,1,0,0,0,0 output/Arnold (NsIbm80AAAAJ)/Arnold2024-FirstOrder.bib,0,0,0,0,0,0,0,0,0,0,0,0 output/Neethirajan (8VZwF0sAAAAJ)/Neethirajan2024-NextGeneration.bib,0,0,0,0,0,0,0,0,0,0,0,0 output/Sampalli (UCVetfAAAAAJ)/Ghosh2023-QuantumSafe.bib,0,0,0,0,0,0,0,0,0,0,0,0 @@ -2304,34 +2294,33 @@ output/Ralph (oRBuFa0AAAAJ)/Sedano2026-SustainableDual.bib,0,0,0,0,0,0,0,0,0,0,0 output/Neethirajan (8VZwF0sAAAAJ)/Mahato2024-CuttingEdge.bib,0,0,0,0,0,0,0,0,0,0,0,0 output/Orji (-1cHtBQAAAAJ)/Ogbaga2022-CoDesigning.bib,0,0,0,0,0,0,0,0,0,0,0,0 output/Matwin (rCoJeuYAAAAJ)/Tserpes2020-MultipleAspect.bib,0,0,0,0,0,0,0,0,0,0,0,0 -output/Sajjad (t3BH6NkAAAAJ)/Rosati2026-LimitsConvergence.bib,3,0,0,0,1,0,0,1,0,0,1,0 -output/Rudzicz (elXOB1sAAAAJ)/Rosati2026-LimitsConvergence.bib,3,0,0,0,1,0,0,1,0,0,1,0 +output/Sajjad (t3BH6NkAAAAJ)/Rosati2026-LimitsConvergence.bib,2,0,0,0,1,0,0,0,0,0,1,0 +output/Rudzicz (elXOB1sAAAAJ)/Rosati2026-LimitsConvergence.bib,2,0,0,0,1,0,0,0,0,0,1,0 output/Neethirajan (8VZwF0sAAAAJ)/Neethirajan2023-ClimateSmart.bib,0,0,0,0,0,0,0,0,0,0,0,0 output/Zincir-Heywood (F9nG0F4AAAAJ)/Adjei2025-DalhousieNIMS.bib,0,0,0,0,0,0,0,0,0,0,0,0 output/Milios (ME8aQywAAAAJ)/Ramirezorta2025-ROUGESciQFS.bib,0,0,0,0,0,0,0,0,0,0,0,0 -output/Keselj (uDKsmuIAAAAJ)/Taylor2021-ExtractiveLexicon.bib,1,0,0,1,0,0,0,0,0,0,0,0 +output/Keselj (uDKsmuIAAAAJ)/Taylor2021-ExtractiveLexicon.bib,0,0,0,0,0,0,0,0,0,0,0,0 output/Abidi (fzr2PUYAAAAJ)/Woensel2021-TowardsModel.bib,0,0,0,0,0,0,0,0,0,0,0,0 output/Gagie (aFCoq2YAAAAJ)/M2025-Movi2.bib,5,0,0,0,1,0,0,1,1,1,1,0 output/Wu (IdBlVPUAAAAJ)/Rosati2024-ResolvingLexical.bib,0,0,0,0,0,0,0,0,0,0,0,0 -output/Rahman (9SrqOewAAAAJ)/Rahman2021-SystematicLiterature.bib,1,0,0,0,0,0,0,1,0,0,0,0 -output/Beiko (OmUy3vUAAAAJ)/Ty2023-ProfilingNovel.bib,5,0,0,0,1,0,0,1,1,1,1,0 -output/Matwin (rCoJeuYAAAAJ)/Carlini2022-TopologicalPerspective.bib,1,0,0,0,0,0,0,1,0,0,0,0 -output/Oore (cI0dYX4AAAAJ)/Dumpala2024-VISLABenchmark.bib,2,0,0,0,0,0,0,1,0,0,1,0 -output/Milios (ME8aQywAAAAJ)/Dumpala2024-VISLABenchmark.bib,2,0,0,0,0,0,0,1,0,0,1,0 +output/Beiko (OmUy3vUAAAAJ)/Ty2023-ProfilingNovel.bib,4,0,0,0,1,0,0,0,1,1,1,0 +output/Matwin (rCoJeuYAAAAJ)/Carlini2022-TopologicalPerspective.bib,0,0,0,0,0,0,0,0,0,0,0,0 +output/Oore (cI0dYX4AAAAJ)/Dumpala2024-VISLABenchmark.bib,1,0,0,0,0,0,0,0,0,0,1,0 +output/Milios (ME8aQywAAAAJ)/Dumpala2024-VISLABenchmark.bib,1,0,0,0,0,0,0,0,0,0,1,0 output/Mattheisen (uhlDFm4AAAAJ)/Erhardt2022-GenomicsEpigenomics.bib,3,0,0,0,1,0,0,1,0,0,1,0 output/Rudzicz (elXOB1sAAAAJ)/Haiqi2023-SystemMethod.bib,0,0,0,0,0,0,0,0,0,0,0,0 -output/Neethirajan (8VZwF0sAAAAJ)/Neethirajan2020-DigitalizationAnimal.bib,4,0,0,0,1,0,0,1,0,1,1,0 +output/Neethirajan (8VZwF0sAAAAJ)/Neethirajan2020-DigitalizationAnimal.bib,3,0,0,0,1,0,0,0,0,1,1,0 output/Abidi (fzr2PUYAAAAJ)/Youngshand2022-GaitBiomechanics.bib,4,0,1,1,0,0,0,1,0,0,1,0 output/Whidden (itc4x9kAAAAJ)/Ayyagari2022-TowardsLow.bib,0,0,0,0,0,0,0,0,0,0,0,0 output/Sajjad (t3BH6NkAAAAJ)/Badshah2025-CLEVLLMBased.bib,5,0,1,1,1,0,0,1,0,0,1,0 -output/Milios (ME8aQywAAAAJ)/Taranukhin2026-InfoGathererPrincipled.bib,2,0,0,0,0,0,0,1,0,0,1,0 +output/Milios (ME8aQywAAAAJ)/Taranukhin2026-InfoGathererPrincipled.bib,1,0,0,0,0,0,0,0,0,0,1,0 output/Sajjad (t3BH6NkAAAAJ)/Abudalfa2026-AbjadAuthorIDAuthorship.bib,3,0,0,0,1,0,0,1,0,0,1,0 output/Sajjad (t3BH6NkAAAAJ)/Ezzini2026-AbjadGenEvalAbjad.bib,4,0,1,0,1,0,0,1,0,0,1,0 output/Neethirajan (8VZwF0sAAAAJ)/Tapp2026-EvaluatingCross.bib,4,0,0,1,1,0,0,1,0,0,1,0 output/Rudzicz (elXOB1sAAAAJ)/Berlotattwell2026-IsThis.bib,4,0,1,0,1,0,0,1,0,0,1,0 output/Ye (4OQaVGUAAAAJ)/Sadik2026-UtilizingMachine.bib,4,0,0,1,1,0,0,1,0,0,1,0 -output/Rudzicz (elXOB1sAAAAJ)/Saqur2026-SeekingSOTA.bib,1,0,0,0,0,0,0,1,0,0,0,0 -output/Maguire (rHFCtWwAAAAJ)/Jia2026-AnalysingAntimicrobial.bib,4,0,0,0,1,0,0,1,0,1,1,0 +output/Rudzicz (elXOB1sAAAAJ)/Saqur2026-SeekingSOTA.bib,1,0,0,0,0,0,0,0,0,0,1,0 +output/Maguire (rHFCtWwAAAAJ)/Jia2026-AnalysingAntimicrobial.bib,3,0,0,0,1,0,0,0,0,1,1,0 output/Sajjad (t3BH6NkAAAAJ)/Abudalfa2026-AbjadStyleTransferAuthorship.bib,3,0,0,0,1,0,0,1,0,0,1,0 output/Oyebode (-6DsTnMAAAAJ)/Adekanbi2026-HyperCareAI.bib,3,0,0,0,1,0,0,1,0,0,1,0 output/Oyebode (-6DsTnMAAAAJ)/Imran2026-KosmoWalkerDesigning.bib,3,0,0,0,1,0,0,1,0,0,1,0 @@ -2351,51 +2340,51 @@ output/Beiko (OmUy3vUAAAAJ)/Jia2026-AnalysingAntimicrobial.bib,4,0,0,0,1,0,0,1,0 output/Orji (-1cHtBQAAAAJ)/M2026-ScreenUsage.bib,6,0,0,1,1,0,0,1,1,1,1,0 output/Orji (-1cHtBQAAAAJ)/Kimeu2026-Story2ChangeTowards.bib,3,0,0,0,1,0,0,1,0,0,1,0 output/Orji (-1cHtBQAAAAJ)/Chan2026-WellnifyAI.bib,3,0,1,0,1,0,0,0,0,0,1,0 -output/Zeh (GoTWlmgAAAAJ)/Iersel2026-ClassUnrooted.bib,2,0,0,0,0,0,0,1,0,0,1,0 -output/Keselj (uDKsmuIAAAAJ)/Chen2026-IMay.bib,2,0,0,0,0,0,0,1,0,0,1,0 +output/Zeh (GoTWlmgAAAAJ)/Iersel2026-ClassUnrooted.bib,1,0,0,0,0,0,0,0,0,0,1,0 +output/Keselj (uDKsmuIAAAAJ)/Chen2026-IMay.bib,1,0,0,0,0,0,0,0,0,0,1,0 output/Bordeleau (8Bug6mIAAAAJ)/Bordeleau2026-SurvivingDisruptions.bib,4,0,0,1,1,0,0,1,0,0,1,0 -output/Abidi (fzr2PUYAAAAJ)/Naqvi2026-CounterfactualAnalysis.bib,3,0,0,0,1,0,0,1,0,0,1,0 +output/Abidi (fzr2PUYAAAAJ)/Naqvi2026-CounterfactualAnalysis.bib,2,0,0,0,1,0,0,0,0,0,1,0 output/Neethirajan (8VZwF0sAAAAJ)/Dhaliwal2026-MultiModal.bib,4,0,0,1,1,0,0,1,0,0,1,0 output/Mattheisen (uhlDFm4AAAAJ)/Mccarty2026-MentalHealth.bib,3,0,0,1,1,0,0,0,0,0,1,0 output/Sampalli (UCVetfAAAAAJ)/Phutela2026-CBARCooperative.bib,4,0,0,1,1,0,0,1,0,0,1,0 output/Neethirajan (8VZwF0sAAAAJ)/Prajesh2026-ObservationGeoinformation.bib,0,0,0,0,0,0,0,0,0,0,0,0 -output/Ralph (oRBuFa0AAAAJ)/Tempero2026-MakingSoftware.bib,1,0,0,0,0,0,0,1,0,0,0,0 +output/Ralph (oRBuFa0AAAAJ)/Tempero2026-MakingSoftware.bib,1,0,0,0,0,0,0,0,0,0,1,0 output/Sharma (VHjAIe8AAAAJ)/Sobhani2025-SustainabilityAI.bib,1,0,0,0,0,0,0,0,0,0,1,0 -output/Kryven (5ogGlooAAAAJ)/Zhao2026-OnlineLibrary.bib,2,0,0,0,0,0,0,1,0,0,1,0 +output/Kryven (5ogGlooAAAAJ)/Zhao2026-OnlineLibrary.bib,2,0,0,0,0,0,1,0,0,0,1,0 output/Mattheisen (uhlDFm4AAAAJ)/Pinciotti2026-ClinicalPresentation.bib,4,0,1,1,1,0,0,0,0,0,1,0 output/Sampalli (UCVetfAAAAAJ)/Ny2026-HybridFramework.bib,7,0,1,1,1,0,0,1,1,1,1,0 output/Rudzicz (elXOB1sAAAAJ)/Pimentel2026-StraightforwardApproach.bib,4,0,1,1,1,0,0,0,0,0,1,0 -output/Sajjad (t3BH6NkAAAAJ)/Wong2026-LangFIRDiscovering.bib,1,0,0,0,0,0,0,1,0,0,0,0 -output/Mattheisen (uhlDFm4AAAAJ)/Yu2026-GenomeWide.bib,2,0,0,0,1,0,0,0,0,0,1,0 +output/Sajjad (t3BH6NkAAAAJ)/Wong2026-LangFIRDiscovering.bib,1,0,0,0,0,0,0,0,0,0,1,0 +output/Mattheisen (uhlDFm4AAAAJ)/Yu2026-GenomeWide.bib,3,0,0,0,1,0,0,0,0,1,1,0 output/Sampalli (UCVetfAAAAAJ)/Nasirinejad2026-AdoptionDigital.bib,5,0,1,1,1,0,0,1,0,0,1,0 output/Mattheisen (uhlDFm4AAAAJ)/Hoffler2026-MethylomeWide.bib,4,0,1,1,1,0,0,0,0,0,1,0 output/Neethirajan (8VZwF0sAAAAJ)/Kate2026-MooLogueCross.bib,4,0,0,1,1,0,0,1,0,0,1,0 -output/Oore (cI0dYX4AAAAJ)/Lowe2026-SelfDistillation.bib,3,0,0,0,0,0,1,1,0,0,1,0 -output/Sharma (VHjAIe8AAAAJ)/Mehditabar2026-ValidatedTaxonomy.bib,1,0,0,0,0,0,0,1,0,0,0,0 +output/Oore (cI0dYX4AAAAJ)/Lowe2026-SelfDistillation.bib,2,0,0,0,0,0,1,0,0,0,1,0 +output/Sharma (VHjAIe8AAAAJ)/Mehditabar2026-ValidatedTaxonomy.bib,1,0,0,0,0,0,0,0,0,0,1,0 output/Sharma (VHjAIe8AAAAJ)/Rajput2026-CodeGreenTowards.bib,2,0,0,0,0,0,0,1,0,0,1,0 -output/Lahoud (Fnkc3a4AAAAJ)/Huang2026-DesignAnalysis.bib,2,0,0,0,0,0,0,1,0,0,1,0 -output/Sharma (VHjAIe8AAAAJ)/Rajput2026-EnergyFlow.bib,2,0,0,0,0,0,0,1,0,0,1,0 -output/Ralph (oRBuFa0AAAAJ)/Ayoola2026-AdvancingEvidence.bib,1,0,0,0,0,0,0,1,0,0,0,0 -output/Lahoud (Fnkc3a4AAAAJ)/Delplace2026-TowardsRealistic.bib,2,0,0,0,0,0,0,1,0,0,1,0 +output/Lahoud (Fnkc3a4AAAAJ)/Huang2026-DesignAnalysis.bib,1,0,0,0,0,0,0,0,0,0,1,0 +output/Sharma (VHjAIe8AAAAJ)/Rajput2026-EnergyFlow.bib,1,0,0,0,0,0,0,0,0,0,1,0 +output/Ralph (oRBuFa0AAAAJ)/Ayoola2026-AdvancingEvidence.bib,1,0,0,0,0,0,0,0,0,0,1,0 +output/Lahoud (Fnkc3a4AAAAJ)/Delplace2026-TowardsRealistic.bib,2,0,0,0,1,0,0,0,0,0,1,0 output/Rahman (9SrqOewAAAAJ)/Shah2026-CharacterizingFaults.bib,2,0,0,0,0,0,0,1,0,0,1,0 output/Milios (ME8aQywAAAAJ)/Jaiswal2022-ChunkSummExtending.bib,0,0,0,0,0,0,0,0,0,0,0,0 output/Poitras (TNaVSQwAAAAJ)/Lin2026-AmplifierOr.bib,0,0,0,0,0,0,0,0,0,0,0,0 output/Gagie (aFCoq2YAAAAJ)/Bernardo2023-FasterCompressed.bib,3,0,0,0,1,0,0,1,0,0,1,0 -output/Hernandez-Castillo (rSrWYaIAAAAJ)/Chavanne2026-DissectingHeterogeneous.bib,4,0,0,0,1,0,0,1,0,1,1,0 -output/Wilde (lkAmFEEAAAAJ)/Lodel2026-LearningSemantic.bib,1,0,0,0,0,0,0,1,0,0,0,0 +output/Hernandez-Castillo (rSrWYaIAAAAJ)/Chavanne2026-DissectingHeterogeneous.bib,3,0,0,0,1,0,0,0,0,1,1,0 +output/Wilde (lkAmFEEAAAAJ)/Lodel2026-LearningSemantic.bib,1,0,0,0,0,0,0,0,0,0,1,0 output/Escobedo (lPSfdqAAAAAJ)/Sanchezjimenez2026-IntegrationApproach.bib,3,0,0,0,1,0,0,1,0,0,1,0 output/Bordeleau (8Bug6mIAAAAJ)/Bordeleau2024-PlanningTransforming.bib,0,0,0,0,0,0,0,0,0,0,0,0 output/Ye (4OQaVGUAAAAJ)/Li2026-CoverageOptimization.bib,5,0,1,1,1,0,0,1,0,0,1,0 -output/Matwin (rCoJeuYAAAAJ)/Naderi2026-BeyondFeature.bib,1,0,0,0,0,0,0,1,0,0,0,0 +output/Matwin (rCoJeuYAAAAJ)/Naderi2026-BeyondFeature.bib,1,0,0,0,0,0,0,0,0,0,1,0 output/Ye (4OQaVGUAAAAJ)/Li2025-DigitalTwinEnabled.bib,4,0,0,1,1,0,0,1,0,0,1,0 -output/Sajjad (t3BH6NkAAAAJ)/Gajo2026-LLMsUnderperform.bib,1,0,0,0,0,0,0,1,0,0,0,0 -output/Matwin (rCoJeuYAAAAJ)/Naderi2026-CrossModal.bib,1,0,0,0,0,0,0,1,0,0,0,0 -output/Matwin (rCoJeuYAAAAJ)/Naderi2026-JointCentric.bib,2,0,0,0,0,0,0,1,0,0,1,0 +output/Sajjad (t3BH6NkAAAAJ)/Gajo2026-LLMsUnderperform.bib,2,0,0,0,1,0,0,0,0,0,1,0 +output/Matwin (rCoJeuYAAAAJ)/Naderi2026-CrossModal.bib,1,0,0,0,0,0,0,0,0,0,1,0 +output/Matwin (rCoJeuYAAAAJ)/Naderi2026-JointCentric.bib,1,0,0,0,0,0,0,0,0,0,1,0 output/Ye (4OQaVGUAAAAJ)/Chen2025-RealizingSustainable.bib,4,0,0,1,1,0,0,1,0,0,1,0 output/Neethirajan (8VZwF0sAAAAJ)/Neethirajan2026-GreenAI.bib,4,0,0,1,1,0,0,1,0,0,1,0 output/Orji (-1cHtBQAAAAJ)/Suruliraj2026-MobileSensing.bib,4,0,0,1,1,0,0,1,0,0,1,0 output/Haque (PMTOOSQAAAAJ)/Singh2025-PerformanceHash.bib,4,0,0,1,1,0,0,1,0,0,1,0 -output/Orji (-1cHtBQAAAAJ)/D2025-DevelopingInteractive.bib,4,0,0,0,1,0,0,1,0,1,1,0 +output/Orji (-1cHtBQAAAAJ)/D2025-DevelopingInteractive.bib,3,0,0,0,1,0,0,0,0,1,1,0 output/Neethirajan (8VZwF0sAAAAJ)/Neethirajan2024-AdvancingClimate.bib,0,0,0,0,0,0,0,0,0,0,0,0 output/Trappenberg (EwkaTYEAAAAJ)/Regio2026-BeyondBlack.bib,4,0,0,1,1,0,0,1,0,0,1,0 output/Ralph (oRBuFa0AAAAJ)/Duchowski2026-DoesPeer.bib,4,0,0,1,1,0,0,1,0,0,1,0 @@ -2403,7 +2392,7 @@ output/Ralph (oRBuFa0AAAAJ)/Ralph2022-RevolutionizingPeer.bib,0,0,0,0,0,0,0,0,0, output/Reilly (fZ56s2EAAAAJ)/Raza2026-ScopingSurvey.bib,4,0,0,1,1,0,0,1,0,0,1,0 output/Wu (IdBlVPUAAAAJ)/Sandhu2026-AligningDense.bib,1,0,0,0,0,0,0,0,0,0,1,0 output/Whidden (itc4x9kAAAAJ)/Odonncha2026-MachineLearning.bib,3,0,0,0,1,0,0,1,0,0,1,0 -output/Hernandez-Castillo (rSrWYaIAAAAJ)/Robertson2026-BrainAtrophy.bib,3,0,0,0,1,0,0,1,0,0,1,0 +output/Hernandez-Castillo (rSrWYaIAAAAJ)/Robertson2026-BrainAtrophy.bib,2,0,0,0,1,0,0,0,0,0,1,0 output/Wehbe (UrFw3XEAAAAJ)/Duchowski2026-DoesPeer.bib,4,0,0,1,1,0,0,1,0,0,1,0 output/Wehbe (UrFw3XEAAAAJ)/Miao2026-EmojiFanDesigning.bib,4,0,0,1,1,0,0,1,0,0,1,0 output/Wehbe (UrFw3XEAAAAJ)/Anvari2026-WhenYour.bib,4,0,0,1,1,0,0,1,0,0,1,0 @@ -2412,30 +2401,29 @@ output/Brooks (42-3005)/Lee2026-AdaptiveMeshes.bib,4,0,0,1,1,0,0,1,0,0,1,0 output/Brooks (42-3005)/Lee2026-EncodingFunctionality.bib,4,0,0,1,1,0,0,1,0,0,1,0 output/Neethirajan (8VZwF0sAAAAJ)/Neethirajan2021-DATAMATIONDigitAl.bib,0,0,0,0,0,0,0,0,0,0,0,0 output/Neethirajan (8VZwF0sAAAAJ)/Essien2026-LongitudinalMulti.bib,5,0,0,0,1,0,0,1,1,1,1,0 -output/Mattheisen (uhlDFm4AAAAJ)/Y2026-AlteredNeurodevelopmental.bib,4,0,0,0,1,0,0,1,0,1,1,0 +output/Mattheisen (uhlDFm4AAAAJ)/Y2026-AlteredNeurodevelopmental.bib,4,0,0,0,1,0,0,0,1,1,1,0 output/Abidi (fzr2PUYAAAAJ)/Calagari2026-KnowledgeGraph.bib,3,0,0,0,1,0,0,1,0,0,1,0 output/Ye (4OQaVGUAAAAJ)/Yuan2026-DiffusionDDPG.bib,3,0,0,0,1,0,0,1,0,0,1,0 output/Neethirajan (8VZwF0sAAAAJ)/Parivendan2026-BeyondProximity.bib,3,0,0,0,1,0,0,1,0,0,1,0 output/MacKay (fqtL2yMAAAAJ)/Reilly2026-ThreadingNeedle.bib,3,0,0,0,1,0,0,1,0,0,1,0 output/Evans (NqlOPkMAAAAJ)/Mubarak2026-ChallengesAdoption.bib,3,0,0,0,1,0,0,1,0,0,1,0 -output/Maguire (rHFCtWwAAAAJ)/Martinez2026-CladePredictorMPXV.bib,3,0,0,0,1,0,0,1,0,0,1,0 +output/Maguire (rHFCtWwAAAAJ)/Martinez2026-CladePredictorMPXV.bib,2,0,0,0,1,0,0,0,0,0,1,0 output/Gagie (aFCoq2YAAAAJ)/Bonizzoni2026-FasterIterative.bib,1,0,0,0,0,0,0,0,0,0,1,0 output/Evans (NqlOPkMAAAAJ)/Wei2026-InterorganizationalHeterogeneity.bib,3,0,0,0,1,0,0,1,0,0,1,0 output/Abidi (fzr2PUYAAAAJ)/Choubineh2026-FindingAssociative.bib,3,0,0,0,1,0,0,1,0,0,1,0 -output/Rudzicz (elXOB1sAAAAJ)/Zeng2026-VoluntaryCollusion.bib,3,0,0,0,0,0,1,1,0,0,1,0 +output/Rudzicz (elXOB1sAAAAJ)/Zeng2026-VoluntaryCollusion.bib,2,0,0,0,0,0,1,0,0,0,1,0 output/Abidi (fzr2PUYAAAAJ)/Quach2026-MachineLearning.bib,3,0,0,0,1,0,0,1,0,0,1,0 output/Sampalli (UCVetfAAAAAJ)/Sharma2026-OptimizingIDS.bib,3,0,0,0,1,0,0,1,0,0,1,0 output/Oyebode (-6DsTnMAAAAJ)/Reilly2026-ThreadingNeedle.bib,3,0,0,0,1,0,0,1,0,0,1,0 output/Abidi (fzr2PUYAAAAJ)/Baratnezhad2026-XAIDriven.bib,3,0,0,0,1,0,0,1,0,0,1,0 -output/Gagie (aFCoq2YAAAAJ)/Gagie2026-FasterPBWT.bib,2,0,0,0,0,0,0,1,0,0,1,0 -output/Gagie (aFCoq2YAAAAJ)/Gagie2026-ParseIndexing.bib,1,0,0,0,0,0,0,1,0,0,0,0 +output/Gagie (aFCoq2YAAAAJ)/Gagie2026-FasterPBWT.bib,1,0,0,0,0,0,0,0,0,0,1,0 +output/Gagie (aFCoq2YAAAAJ)/Gagie2026-ParseIndexing.bib,2,0,0,0,0,0,1,0,0,0,1,0 output/Zincir-Heywood (F9nG0F4AAAAJ)/Baharlouei2026-ComprehensiveHost.bib,3,0,0,0,1,0,0,1,0,0,1,0 -output/Haque (PMTOOSQAAAAJ)/Boeira2026-PerformanceCharacterization.bib,1,0,0,0,0,0,0,1,0,0,0,0 +output/Haque (PMTOOSQAAAAJ)/Boeira2026-PerformanceCharacterization.bib,1,0,0,0,0,0,0,0,0,0,1,0 output/Zincir-Heywood (F9nG0F4AAAAJ)/Oneill2026-PrivacyPreserving.bib,3,0,0,0,1,0,0,1,0,0,1,0 -output/Neethirajan (8VZwF0sAAAAJ)/Tapp2025-AdaptingCoolFarm.bib,0,0,0,0,0,0,0,0,0,0,0,0 output/Ye (4OQaVGUAAAAJ)/Ye2021-JointRAN.bib,1,0,0,0,1,0,0,0,0,0,0,0 output/Oyebode (-6DsTnMAAAAJ)/Ataguba2026-TowardsSocial.bib,2,0,0,0,1,0,0,0,0,0,1,0 -output/Orji (-1cHtBQAAAAJ)/Duke2026-PROTOCOLLife.bib,0,0,0,0,0,0,0,0,0,0,0,0 +output/Orji (-1cHtBQAAAAJ)/Duke2026-PROTOCOLLife.bib,4,0,0,0,1,0,0,0,1,1,1,0 output/Neethirajan (8VZwF0sAAAAJ)/Neethirajan2025-AnimalAgency.bib,0,0,0,0,0,0,0,0,0,0,0,0 output/Orji (-1cHtBQAAAAJ)/Aee2026-PsychometricValidation.bib,3,0,1,0,0,0,0,0,1,0,1,0 output/Haque (PMTOOSQAAAAJ)/Rabbani2025-BenefitTransfer.bib,3,0,0,0,1,0,0,1,0,0,1,0 @@ -2445,17 +2433,16 @@ output/Orji (-1cHtBQAAAAJ)/Reilly2026-ThreadingNeedle.bib,3,0,0,0,1,0,0,1,0,0,1, output/Sharma (VHjAIe8AAAAJ)/Mehditabar2026-BRACEUnified.bib,0,0,0,0,0,0,0,0,0,0,0,0 output/Sharma (VHjAIe8AAAAJ)/Jahan2026-DEFaultAutomated.bib,2,0,0,0,0,0,0,1,0,0,1,0 output/Orji (-1cHtBQAAAAJ)/Ataguba2026-TowardsSocial.bib,2,0,0,0,1,0,0,0,0,0,1,0 -output/Matwin (rCoJeuYAAAAJ)/Zhao2022-EfficiencyOptimized.bib,4,0,0,0,1,0,0,1,0,1,1,0 +output/Matwin (rCoJeuYAAAAJ)/Zhao2022-EfficiencyOptimized.bib,3,0,0,0,1,0,0,0,0,1,1,0 output/Oore (cI0dYX4AAAAJ)/Uher2026-472Assessing.bib,4,0,1,0,1,0,0,1,0,0,1,0 output/Oore (cI0dYX4AAAAJ)/Dumpala2026-AcousticsDepression.bib,5,0,0,0,1,0,0,1,1,1,1,0 -output/Oore (cI0dYX4AAAAJ)/Silva2026-GeneralizingGeometry.bib,1,0,0,0,0,0,0,1,0,0,0,0 output/Oore (cI0dYX4AAAAJ)/Munn2025-GenerativeAI.bib,0,0,0,0,0,0,0,0,0,0,0,0 -output/Matwin (rCoJeuYAAAAJ)/Zhao2022-RestrictivelySelf.bib,4,0,0,0,1,0,0,1,0,1,1,0 +output/Matwin (rCoJeuYAAAAJ)/Zhao2022-RestrictivelySelf.bib,3,0,0,0,1,0,0,0,0,1,1,0 output/Oore (cI0dYX4AAAAJ)/Sastry2024-TrainingRobust.bib,0,0,0,0,0,0,0,0,0,0,0,0 output/Gagie (aFCoq2YAAAAJ)/Ferragina2025-ExpandingWorld.bib,0,0,0,0,0,0,0,0,0,0,0,0 output/Heywood (_d-AGjUAAAAJ)/Smith2026-QuantifyingDota.bib,3,0,0,0,1,0,0,1,0,0,1,0 -output/Oore (cI0dYX4AAAAJ)/Dumpala2023-TestTime.bib,3,0,0,0,0,0,1,1,0,0,1,0 -output/Maguire (rHFCtWwAAAAJ)/Sivakumar2022-NewcomerWell.bib,4,0,0,0,1,0,0,1,0,1,1,0 +output/Oore (cI0dYX4AAAAJ)/Dumpala2023-TestTime.bib,2,0,0,0,0,0,1,0,0,0,1,0 +output/Maguire (rHFCtWwAAAAJ)/Sivakumar2022-NewcomerWell.bib,3,0,0,0,1,0,0,0,0,1,1,0 output/Rahman (9SrqOewAAAAJ)/Rahman2026-BePartner.bib,2,0,0,0,0,0,0,1,0,0,1,0 output/Rahman (9SrqOewAAAAJ)/Jahan2026-DEFaultAutomated.bib,2,0,0,0,0,0,0,1,0,0,1,0 output/Wu (IdBlVPUAAAAJ)/Feng2026-ConformalAgent.bib,1,0,0,0,0,0,0,0,0,0,1,0 @@ -2466,19 +2453,19 @@ output/Ralph (oRBuFa0AAAAJ)/Lorey2022-SocialScience.bib,1,0,0,0,1,0,0,0,0,0,0,0 output/Orji (-1cHtBQAAAAJ)/O2022-ExtendedReality.bib,1,0,0,0,0,0,0,0,0,1,0,0 output/Poitras (TNaVSQwAAAAJ)/Huang2020-ExploringAssociations.bib,1,0,1,0,0,0,0,0,0,0,0,0 output/Poitras (TNaVSQwAAAAJ)/Huang2020-RoleSelf.bib,0,0,0,0,0,0,0,0,0,0,0,0 -output/Orji (-1cHtBQAAAAJ)/Ie2022-LocationBased.bib,4,0,0,0,1,0,0,1,0,1,1,0 -output/Mattheisen (uhlDFm4AAAAJ)/Z2020-PredictingEating.bib,4,0,0,0,1,0,0,1,0,1,1,0 +output/Orji (-1cHtBQAAAAJ)/Ie2022-LocationBased.bib,3,0,0,0,1,0,0,0,0,1,1,0 +output/Mattheisen (uhlDFm4AAAAJ)/Z2020-PredictingEating.bib,3,0,0,0,1,0,0,0,0,1,1,0 output/Neethirajan (8VZwF0sAAAAJ)/Manikandan2024-DecodingPoultryVocalizations.bib,0,0,0,0,0,0,0,0,0,0,0,0 -output/Spadon (bfdGsGUAAAAJ)/Jpd2026-StateBrazilian.bib,4,0,0,0,1,0,0,1,0,1,1,0 +output/Spadon (bfdGsGUAAAAJ)/Jpd2026-StateBrazilian.bib,3,0,0,0,1,0,0,0,0,1,1,0 output/Whidden (itc4x9kAAAAJ)/Beaulieu2026-SelfSupervised.bib,2,0,0,0,1,0,0,0,0,0,1,0 -output/Ralph (oRBuFa0AAAAJ)/Ralph2020-EmpiricalStandards.bib,2,0,0,0,0,0,0,1,0,0,1,0 +output/Ralph (oRBuFa0AAAAJ)/Ralph2020-EmpiricalStandards.bib,1,0,0,0,0,0,0,0,0,0,1,0 output/Orji (-1cHtBQAAAAJ)/Desai2022-SansTracas.bib,3,0,0,0,1,0,0,1,0,0,1,0 -output/Kryven (5ogGlooAAAAJ)/Qin2026-HypothesisGeneration.bib,1,0,0,0,0,0,0,1,0,0,0,0 -output/Kryven (5ogGlooAAAAJ)/Cano2026-ProspectiveCompression.bib,2,0,0,0,0,0,0,1,0,0,1,0 +output/Kryven (5ogGlooAAAAJ)/Qin2026-HypothesisGeneration.bib,2,0,0,0,0,0,1,0,0,0,1,0 +output/Kryven (5ogGlooAAAAJ)/Cano2026-ProspectiveCompression.bib,2,0,0,0,0,0,1,0,0,0,1,0 output/Malloch (iQa0leoAAAAJ)/Reilly2026-ThreadingNeedle.bib,3,0,0,0,1,0,0,1,0,0,1,0 output/Whidden (itc4x9kAAAAJ)/Cong2026-AdaptingCOASTGUARD.bib,3,0,0,0,1,0,0,1,0,0,1,0 output/Whidden (itc4x9kAAAAJ)/Lafond2026-CherryPicking.bib,3,0,0,0,1,0,0,1,0,0,1,0 -output/Wilde (lkAmFEEAAAAJ)/Wilde2020-SpecifyingUser.bib,1,0,0,0,0,0,0,1,0,0,0,0 +output/Wilde (lkAmFEEAAAAJ)/Wilde2020-SpecifyingUser.bib,0,0,0,0,0,0,0,0,0,0,0,0 output/Brandt (OMA_KjcAAAAJ)/Brandt2026-HybridogenesisAs.bib,4,0,0,0,1,0,0,1,0,1,1,0 output/Sajjad (t3BH6NkAAAAJ)/Sajjad2023-LatentConcept.bib,0,0,0,0,0,0,0,0,0,0,0,0 output/Zeh (GoTWlmgAAAAJ)/Lafond2026-CherryPicking.bib,3,0,0,0,1,0,0,1,0,0,1,0 @@ -2498,9 +2485,92 @@ output/Shakeri (iriAIgsAAAAJ)/Reilly2026-ThreadingNeedle.bib,3,0,0,0,1,0,0,1,0,0 output/Shakeri (iriAIgsAAAAJ)/Falahat2024-DesigningImpact.bib,0,0,0,0,0,0,0,0,0,0,0,0 output/Shakeri (iriAIgsAAAAJ)/Falahat2024-KnowledgeGeneration.bib,0,0,0,0,0,0,0,0,0,0,0,0 output/Shakeri (iriAIgsAAAAJ)/Shakeri2024-PassiveCoPresence.bib,0,0,0,0,0,0,0,0,0,0,0,0 -output/Rudzicz (elXOB1sAAAAJ)/Zhu2023-SituatedNatural.bib,2,0,0,0,0,0,0,1,0,0,1,0 +output/Rudzicz (elXOB1sAAAAJ)/Zhu2023-SituatedNatural.bib,2,0,0,0,0,0,1,0,0,0,1,0 output/Whidden (itc4x9kAAAAJ)/Kirsebom2021-AdvancingAcoustic.bib,0,0,0,0,0,0,0,0,0,0,0,0 output/Brandt (OMA_KjcAAAAJ)/Brandt2020-ParallelProgramming.bib,0,0,0,0,0,0,0,0,0,0,0,0 -output/Orji (-1cHtBQAAAAJ)/Oyebode2020-PersuasiveStrategies.bib,1,0,0,0,0,0,0,1,0,0,0,0 +output/Orji (-1cHtBQAAAAJ)/Oyebode2020-PersuasiveStrategies.bib,0,0,0,0,0,0,0,0,0,0,0,0 output/Neethirajan (8VZwF0sAAAAJ)/Neethirajan2021-ArtificialIntelligence.bib,0,0,0,0,0,0,0,0,0,0,0,0 output/He (4yj_9skAAAAJ)/Das2022-ConnectionFully.bib,0,0,0,0,0,0,0,0,0,0,0,0 +output/Ye (4OQaVGUAAAAJ)/Wang2026-DOCAttackData.bib,2,0,0,0,1,0,0,0,0,0,1,0 +output/Sampalli (UCVetfAAAAAJ)/Steeves2026-CorrectionEngaging.bib,4,0,0,0,1,0,0,0,1,1,1,0 +output/Oyebode (-6DsTnMAAAAJ)/Kimeu2026-CalmMindAI.bib,3,0,1,0,1,0,0,0,0,0,1,0 +output/Ye (4OQaVGUAAAAJ)/Jia2026-SynergizingDigital.bib,2,0,0,0,1,0,0,0,0,0,0,1 +output/Rudzicz (elXOB1sAAAAJ)/Wiafe2026-DesigningAI.bib,2,0,0,0,1,0,0,0,0,0,1,0 +output/Oyebode (-6DsTnMAAAAJ)/Kaura2026-NutriPalPersuasive.bib,2,0,0,0,1,0,0,0,0,0,1,0 +output/Neethirajan (8VZwF0sAAAAJ)/Essien2026-ComparativeAnalysis.bib,0,0,0,0,0,0,0,0,0,0,0,0 +output/Orji (-1cHtBQAAAAJ)/Kimeu2026-CalmMindAI.bib,3,0,1,0,1,0,0,0,0,0,1,0 +output/Matwin (rCoJeuYAAAAJ)/Naderi2026-TokenImbalance.bib,0,0,0,0,0,0,0,0,0,0,0,0 +output/Mattheisen (uhlDFm4AAAAJ)/H2026-ValidatingField.bib,3,0,0,0,1,0,0,0,0,1,1,0 +output/Zincir-Heywood (F9nG0F4AAAAJ)/Baharlouei2024-ADVENTAttackAnomaly.bib,1,0,0,0,0,0,0,0,0,0,1,0 +output/Rudzicz (elXOB1sAAAAJ)/Azad2026-SurgiDiffContext.bib,2,0,0,0,1,0,0,0,0,0,1,0 +output/Neethirajan (8VZwF0sAAAAJ)/Patel2026-CowPainCheckTemporal.bib,0,0,0,0,0,0,0,0,0,0,0,0 +output/Orji (-1cHtBQAAAAJ)/Olatinwo2026-ExploringEffectiveness.bib,2,0,0,0,1,0,0,0,0,0,1,0 +output/Sajjad (t3BH6NkAAAAJ)/Rizwan2026-PersistentEffects.bib,1,0,0,0,0,0,0,0,0,0,1,0 +output/Matwin (rCoJeuYAAAAJ)/Sadeghi2024-ReviewGlobal.bib,1,0,0,0,0,0,0,0,0,0,1,0 +output/Orji (-1cHtBQAAAAJ)/Nwokolo2026-HydrogenStorage.bib,2,0,0,0,1,0,0,0,0,0,1,0 +output/Sajjad (t3BH6NkAAAAJ)/Badshah2026-SAGESearch.bib,2,0,0,0,1,0,0,0,0,0,1,0 +output/Neethirajan (8VZwF0sAAAAJ)/Neethirajan2026-DigitalisationHealth.bib,0,0,0,0,0,0,0,0,0,0,0,0 +output/Rudzicz (elXOB1sAAAAJ)/Badawi2026-TowardsUnderstanding.bib,1,0,0,0,0,0,0,0,0,0,1,0 +output/Orji (-1cHtBQAAAAJ)/Kaura2026-NutriPalPersuasive.bib,2,0,0,0,1,0,0,0,0,0,1,0 +output/Neethirajan (8VZwF0sAAAAJ)/Dhaliwal2026-HenTwinMulti.bib,0,0,0,0,0,0,0,0,0,0,0,0 +output/Orji (-1cHtBQAAAAJ)/Vitale2026-PersonalisedAI.bib,2,0,0,0,1,0,0,0,0,0,1,0 +output/Neethirajan (8VZwF0sAAAAJ)/Kate2026-MultiExpert.bib,0,0,0,0,0,0,0,0,0,0,0,0 +output/Neethirajan (8VZwF0sAAAAJ)/Patel2026-ProtocolGuided.bib,3,0,0,0,1,0,0,0,0,1,1,0 +output/Orji (-1cHtBQAAAAJ)/Alhasani2026-StateArt.bib,2,0,0,0,1,0,0,0,0,0,1,0 +output/Sajjad (t3BH6NkAAAAJ)/Badshah2025-DAFELLM.bib,3,0,0,0,1,0,0,0,0,1,1,0 +output/Neethirajan (8VZwF0sAAAAJ)/Rao2026-RealTime.bib,0,0,0,0,0,0,0,0,0,0,0,0 +output/Oore (cI0dYX4AAAAJ)/Silva2026-GeometricView.bib,1,0,0,0,0,0,0,0,0,0,1,0 +output/Oore (cI0dYX4AAAAJ)/Lowe2026-BridgingGenerative.bib,0,0,0,0,0,0,0,0,0,0,0,0 +output/Neethirajan (8VZwF0sAAAAJ)/Padmanabhan2026-SatelliteConstrained.bib,0,0,0,0,0,0,0,0,0,0,0,0 +output/Neethirajan (8VZwF0sAAAAJ)/Parivendan2026-TemporalModeling.bib,0,0,0,0,0,0,0,0,0,0,0,0 +output/Oore (cI0dYX4AAAAJ)/Lowe2026-HiddenLayer.bib,0,0,0,0,0,0,0,0,0,0,0,0 +output/Rudzicz (elXOB1sAAAAJ)/Oore2025-MeasurementPersonal.bib,3,0,1,0,1,0,0,0,0,0,0,1 +output/Oore (cI0dYX4AAAAJ)/Oore2025-LoopyFramework.bib,0,0,0,0,0,0,0,0,0,0,0,0 +output/Oore (cI0dYX4AAAAJ)/Oore2024-ExplicitSolutions.bib,2,0,0,0,1,0,0,0,0,0,1,0 +output/Oore (cI0dYX4AAAAJ)/Oore2025-RobustPersonalized.bib,0,0,0,0,0,0,0,0,0,0,0,0 +output/Haque (PMTOOSQAAAAJ)/Parizotto2024-AraucariaSimplifying.bib,0,0,0,0,0,0,0,0,0,0,0,0 +output/Sajjad (t3BH6NkAAAAJ)/Dumpala2024-VISLABenchmark.bib,2,0,0,0,0,0,0,1,0,0,1,0 +output/Sharma (VHjAIe8AAAAJ)/Saad2025-HierarchicalEvaluationSoftware.bib,1,0,0,0,0,0,0,0,0,0,1,0 +output/Ralph (oRBuFa0AAAAJ)/Jackson2024-CreativityGenerative.bib,0,0,0,0,0,0,0,0,0,0,0,0 +output/Beiko (OmUy3vUAAAAJ)/Barawi2026-EvolutionaryDynamics.bib,0,0,0,0,0,0,0,0,0,0,0,0 +output/Beiko (OmUy3vUAAAAJ)/Odoherty2026-MicrobiomeStewardship.bib,2,0,0,0,1,0,0,0,0,0,1,0 +output/Whidden (itc4x9kAAAAJ)/F2026-AdvancingPassive.bib,5,0,1,0,1,0,0,0,1,1,1,0 +output/Sajjad (t3BH6NkAAAAJ)/Durrani2022-DiscoveringSalientNeurons.bib,2,0,0,0,0,0,0,1,0,0,1,0 +output/Reilly (fZ56s2EAAAAJ)/Amirkandeh2025-ComparativeEvaluation.bib,0,0,0,0,0,0,0,0,0,0,0,0 +output/Reilly (fZ56s2EAAAAJ)/Bravo2024-AdvancingPrecision.bib,2,0,0,0,1,0,0,0,0,0,1,0 +output/Neethirajan (8VZwF0sAAAAJ)/Mahato2024-DairyDigiD.bib,3,0,0,0,1,0,0,0,0,1,1,0 +output/Spadon (bfdGsGUAAAAJ)/Mayette2026-AssessmentVessel.bib,2,0,0,0,1,0,0,0,0,0,1,0 +output/Spadon (bfdGsGUAAAAJ)/Song2026-MoCoAIS.bib,2,0,0,0,0,0,1,0,0,0,1,0 +output/Neethirajan (8VZwF0sAAAAJ)/Neethirajan2024-DecodingLanguage.bib,3,0,0,0,1,0,0,0,0,1,1,0 +output/Oore (cI0dYX4AAAAJ)/Sastry2020-ZeroShot.bib,0,0,0,0,0,0,0,0,0,0,0,0 +output/Rosborough (kG4oQmsAAAAJ)/Rosborough2025-OurOwn.bib,0,0,0,0,0,0,0,0,0,0,0,0 +output/Orji (-1cHtBQAAAAJ)/Skov2020-Persuasive2020.bib,0,0,0,0,0,0,0,0,0,0,0,0 +output/Keselj (uDKsmuIAAAAJ)/Keselj2020-StarfishPrototype.bib,2,0,0,0,0,0,1,0,0,0,1,0 +output/Brandt (OMA_KjcAAAAJ)/Brandt2023-DynamicallyFinding.bib,0,0,0,0,0,0,0,0,0,0,0,0 +output/Wehbe (UrFw3XEAAAAJ)/Ansari2026-ParticipatoryDesign.bib,1,0,0,0,1,0,0,0,0,0,0,0 +output/Escobedo (lPSfdqAAAAAJ)/Wiafe2026-DesigningAI.bib,2,0,0,0,1,0,0,0,0,0,1,0 +output/Whidden (itc4x9kAAAAJ)/Whidden2020-SystematicExploration.bib,3,0,0,0,1,0,0,0,1,1,0,0 +output/Neethirajan (8VZwF0sAAAAJ)/Neethirajan2023-DecodingDigital.bib,3,0,0,0,1,0,0,0,0,1,1,0 +output/Escobedo (lPSfdqAAAAAJ)/Ansari2026-ParticipatoryDesign.bib,2,0,0,0,1,0,0,0,0,0,1,0 +output/Rudzicz (elXOB1sAAAAJ)/Novikova2022-SystemMethod.bib,0,0,0,0,0,0,0,0,0,0,0,0 +output/Rau-Chaplin (-PvfVhgAAAAJ)/Cortes2026-NovelEnhanced.bib,2,0,0,0,1,0,0,0,0,0,1,0 +output/Neethirajan (8VZwF0sAAAAJ)/Kate2026-BeyondAccuracy.bib,3,0,0,0,1,0,0,0,0,1,1,0 +output/Mattheisen (uhlDFm4AAAAJ)/Naamanka2025-GenomeWide.bib,2,0,0,0,1,0,0,0,0,0,1,0 +output/Rudzicz (elXOB1sAAAAJ)/Saqur2024-FilteredNot.bib,2,0,0,0,1,0,0,0,0,0,1,0 +output/Neethirajan (8VZwF0sAAAAJ)/Tapp2025-AdaptingCoolFarm.bib,0,0,0,0,0,0,0,0,0,0,0,0 +output/Mattheisen (uhlDFm4AAAAJ)/Strom2021-GenomeWide.bib,2,0,0,0,1,0,0,0,0,0,1,0 +output/Mattheisen (uhlDFm4AAAAJ)/Giannakopoulou2021-GeneticArchitecture.bib,3,0,1,0,1,0,0,0,0,0,1,0 +output/Neethirajan (8VZwF0sAAAAJ)/Parivendan2026-BeyondProximityKeypoint.bib,2,0,0,0,0,0,1,0,0,0,1,0 +output/Sharma (VHjAIe8AAAAJ)/Jahan2025-WhyAttention.bib,1,0,0,0,0,0,0,0,0,0,1,0 +output/Trappenberg (EwkaTYEAAAAJ)/Lowe2022-LogicalActivation.bib,1,0,0,0,1,0,0,0,0,0,0,0 +output/Sajjad (t3BH6NkAAAAJ)/Sajjad2020-PoorMan.bib,1,0,0,0,0,0,0,1,0,0,0,0 +output/Ye (4OQaVGUAAAAJ)/Lv2020-IntelligentInterference.bib,0,0,0,0,0,0,0,0,0,0,0,0 +output/Gagie (aFCoq2YAAAAJ)/Gagie2024-MoveletTrees.bib,0,0,0,0,0,0,0,0,0,0,0,0 +output/Rudzicz (elXOB1sAAAAJ)/Ge2024-WhatDo.bib,0,0,0,0,0,0,0,0,0,0,0,0 +output/Gagie (aFCoq2YAAAAJ)/Gagie2021-CompactEuler.bib,0,0,0,0,0,0,0,0,0,0,0,0 +output/Sharma (VHjAIe8AAAAJ)/Rajput2023-FECoMStep.bib,0,0,0,0,0,0,0,0,0,0,0,0 +output/Spadon (bfdGsGUAAAAJ)/Spadon2024-GravityInformed.bib,4,0,1,0,1,0,0,0,0,1,1,0 +output/Spadon (bfdGsGUAAAAJ)/Spadon2023-BuildingSafer.bib,0,0,0,0,0,0,0,0,0,0,0,0 +output/He (4yj_9skAAAAJ)/Lyu2022-RectangularRuler.bib,0,0,0,0,0,0,0,0,0,0,0,0 +output/He (4yj_9skAAAAJ)/He2020-BreadthFirst.bib,0,0,0,0,0,0,0,0,0,0,0,0 +output/Sajjad (t3BH6NkAAAAJ)/Haider2026-MultiGranular.bib,1,0,1,0,0,0,0,0,0,0,0,0 From bcc86283c45a9c866bdc3464b528965a58d3f8dc Mon Sep 17 00:00:00 2001 From: Gabriel Spadon Date: Thu, 2 Jul 2026 21:10:58 -0300 Subject: [PATCH 54/54] chore(audit): update summary and badge stats from verified campaign run --- ...54126f0cb05f3b3aea913566d1c025e3c7843db74af.json | 2 +- output/badges.json | 10 +++++----- output/summary.csv | 13 ++++++------- 3 files changed, 12 insertions(+), 13 deletions(-) diff --git a/data/api_cache/openalex/2b79c6b40a6cf28f8ab2854126f0cb05f3b3aea913566d1c025e3c7843db74af.json b/data/api_cache/openalex/2b79c6b40a6cf28f8ab2854126f0cb05f3b3aea913566d1c025e3c7843db74af.json index f3546f93..e4bd9c20 100644 --- a/data/api_cache/openalex/2b79c6b40a6cf28f8ab2854126f0cb05f3b3aea913566d1c025e3c7843db74af.json +++ b/data/api_cache/openalex/2b79c6b40a6cf28f8ab2854126f0cb05f3b3aea913566d1c025e3c7843db74af.json @@ -1 +1 @@ -{"timestamp": 1772378385.8156376, "ttl_days": 60, "data": {"id": "https://openalex.org/W2626778328", "doi": "https://doi.org/10.65215/2q58a426", "title": "Attention Is All You Need", "display_name": "Attention Is All You Need", "relevance_score": 12961.284, "publication_year": 2025, "publication_date": "2025-08-23", "ids": {"openalex": "https://openalex.org/W2626778328", "doi": "https://doi.org/10.48550/arxiv.1706.03762", "mag": "2626778328"}, "language": "en", "primary_location": {"id": "doi:10.65215/2q58a426", "is_oa": false, "landing_page_url": "https://doi.org/10.65215/2q58a426", "pdf_url": null, "source": null, "license": null, "license_id": null, "version": "acceptedVersion", "is_accepted": true, "is_published": false, "raw_source_name": null, "raw_type": "posted-content"}, "type": "preprint", "indexed_in": ["arxiv", "crossref", "datacite"], "open_access": {"is_oa": true, "oa_status": "gold", "oa_url": "https://langtaosha.org.cn/index.php/lts/preprint/download/10/108", "any_repository_has_fulltext": true}, "authorships": [{"author_position": "first", "author": {"id": "https://openalex.org/A5103024730", "display_name": "Ashish Vaswani", "orcid": "https://orcid.org/0000-0002-7794-2085"}, "institutions": [{"id": "https://openalex.org/I1291425158", "display_name": "Google (United States)", "ror": "https://ror.org/00njsd438", "country_code": "US", "type": "company", "lineage": ["https://openalex.org/I1291425158", "https://openalex.org/I4210128969"]}], "countries": ["US"], "is_corresponding": true, "raw_author_name": "Ashish Vaswani", "raw_affiliation_strings": ["Google Brain", "Google (United States), Mountain View, United States"], "affiliations": [{"raw_affiliation_string": "Google Brain", "institution_ids": ["https://openalex.org/I1291425158"]}, {"raw_affiliation_string": "Google (United States), Mountain View, United States", "institution_ids": ["https://openalex.org/I1291425158"]}]}, {"author_position": "middle", "author": {"id": "https://openalex.org/A5021878400", "display_name": "Noam Shazeer", "orcid": null}, "institutions": [{"id": "https://openalex.org/I1291425158", "display_name": "Google (United States)", "ror": "https://ror.org/00njsd438", "country_code": "US", "type": "company", "lineage": ["https://openalex.org/I1291425158", "https://openalex.org/I4210128969"]}], "countries": ["US"], "is_corresponding": false, "raw_author_name": "Noam Shazeer", "raw_affiliation_strings": ["Google Brain", "Google (United States), Mountain View, United States"], "affiliations": [{"raw_affiliation_string": "Google Brain", "institution_ids": ["https://openalex.org/I1291425158"]}, {"raw_affiliation_string": "Google (United States), Mountain View, United States", "institution_ids": ["https://openalex.org/I1291425158"]}]}, {"author_position": "middle", "author": {"id": "https://openalex.org/A5005777963", "display_name": "Niki Parmar", "orcid": null}, "institutions": [{"id": "https://openalex.org/I1291425158", "display_name": "Google (United States)", "ror": "https://ror.org/00njsd438", "country_code": "US", "type": "company", "lineage": ["https://openalex.org/I1291425158", "https://openalex.org/I4210128969"]}, {"id": "https://openalex.org/I1174212", "display_name": "University of Southern California", "ror": "https://ror.org/03taz7m60", "country_code": "US", "type": "education", "lineage": ["https://openalex.org/I1174212"]}], "countries": ["US"], "is_corresponding": false, "raw_author_name": "Niki Parmar", "raw_affiliation_strings": ["Google Research", "University of Southern California, Los Angeles, United States"], "affiliations": [{"raw_affiliation_string": "Google Research", "institution_ids": ["https://openalex.org/I1291425158"]}, {"raw_affiliation_string": "University of Southern California, Los Angeles, United States", "institution_ids": ["https://openalex.org/I1174212"]}]}, {"author_position": "middle", "author": {"id": "https://openalex.org/A5022416424", "display_name": "Jakob Uszkoreit", "orcid": "https://orcid.org/0000-0001-5066-7530"}, "institutions": [{"id": "https://openalex.org/I1291425158", "display_name": "Google (United States)", "ror": "https://ror.org/00njsd438", "country_code": "US", "type": "company", "lineage": ["https://openalex.org/I1291425158", "https://openalex.org/I4210128969"]}], "countries": ["US"], "is_corresponding": false, "raw_author_name": "Jakob Uszkoreit", "raw_affiliation_strings": ["Google Research", "Google (United States), Mountain View, United States"], "affiliations": [{"raw_affiliation_string": "Google Research", "institution_ids": ["https://openalex.org/I1291425158"]}, {"raw_affiliation_string": "Google (United States), Mountain View, United States", "institution_ids": ["https://openalex.org/I1291425158"]}]}, {"author_position": "middle", "author": {"id": "https://openalex.org/A5023448834", "display_name": "Llion Jones", "orcid": null}, "institutions": [{"id": "https://openalex.org/I1291425158", "display_name": "Google (United States)", "ror": "https://ror.org/00njsd438", "country_code": "US", "type": "company", "lineage": ["https://openalex.org/I1291425158", "https://openalex.org/I4210128969"]}], "countries": ["US"], "is_corresponding": false, "raw_author_name": "Llion Jones", "raw_affiliation_strings": ["Google Research", "Google (United States), Mountain View, United States"], "affiliations": [{"raw_affiliation_string": "Google Research", "institution_ids": ["https://openalex.org/I1291425158"]}, {"raw_affiliation_string": "Google (United States), Mountain View, United States", "institution_ids": ["https://openalex.org/I1291425158"]}]}, {"author_position": "middle", "author": {"id": "https://openalex.org/A5079288315", "display_name": "Aidan N. Gomez", "orcid": "https://orcid.org/0000-0001-5601-5437"}, "institutions": [{"id": "https://openalex.org/I185261750", "display_name": "University of Toronto", "ror": "https://ror.org/03dbr7087", "country_code": "CA", "type": "education", "lineage": ["https://openalex.org/I185261750"]}, {"id": "https://openalex.org/I1291425158", "display_name": "Google (United States)", "ror": "https://ror.org/00njsd438", "country_code": "US", "type": "company", "lineage": ["https://openalex.org/I1291425158", "https://openalex.org/I4210128969"]}], "countries": ["CA", "US"], "is_corresponding": false, "raw_author_name": "Aidan N.Gomez", "raw_affiliation_strings": ["University of Toronto", "Google (United States), Mountain View, United States"], "affiliations": [{"raw_affiliation_string": "University of Toronto", "institution_ids": ["https://openalex.org/I185261750"]}, {"raw_affiliation_string": "Google (United States), Mountain View, United States", "institution_ids": ["https://openalex.org/I1291425158"]}]}, {"author_position": "middle", "author": {"id": "https://openalex.org/A5031789995", "display_name": "\u0141ukasz Kaiser", "orcid": "https://orcid.org/0000-0003-1092-6010"}, "institutions": [{"id": "https://openalex.org/I1291425158", "display_name": "Google (United States)", "ror": "https://ror.org/00njsd438", "country_code": "US", "type": "company", "lineage": ["https://openalex.org/I1291425158", "https://openalex.org/I4210128969"]}], "countries": ["US"], "is_corresponding": false, "raw_author_name": "Lukasz Kaiser", "raw_affiliation_strings": ["Google Brain", "Google (United States), Mountain View, United States"], "affiliations": [{"raw_affiliation_string": "Google Brain", "institution_ids": ["https://openalex.org/I1291425158"]}, {"raw_affiliation_string": "Google (United States), Mountain View, United States", "institution_ids": ["https://openalex.org/I1291425158"]}]}, {"author_position": "last", "author": {"id": "https://openalex.org/A5045719436", "display_name": "Illia Polosukhin", "orcid": null}, "institutions": [{"id": "https://openalex.org/I1291425158", "display_name": "Google (United States)", "ror": "https://ror.org/00njsd438", "country_code": "US", "type": "company", "lineage": ["https://openalex.org/I1291425158", "https://openalex.org/I4210128969"]}], "countries": ["US"], "is_corresponding": false, "raw_author_name": "Illia Polosukhin", "raw_affiliation_strings": ["Google (United States), Mountain View, United States"], "affiliations": [{"raw_affiliation_string": "Google (United States), Mountain View, United States", "institution_ids": ["https://openalex.org/I1291425158"]}]}], "institutions": [], "countries_distinct_count": 2, "institutions_distinct_count": 8, "corresponding_author_ids": ["https://openalex.org/A5103024730"], "corresponding_institution_ids": ["https://openalex.org/I1291425158"], "apc_list": null, "apc_paid": null, "fwci": 106.5485, "has_fulltext": false, "cited_by_count": 6494, "citation_normalized_percentile": {"value": 0.99956967, "is_in_top_1_percent": true, "is_in_top_10_percent": true}, "cited_by_percentile_year": {"min": 89, "max": 100}, "biblio": {"volume": "30", "issue": null, "first_page": "5998", "last_page": "6008"}, "is_retracted": false, "is_paratext": false, "is_xpac": false, "primary_topic": {"id": "https://openalex.org/T10181", "display_name": "Natural Language Processing Techniques", "score": 0.9993000030517578, "subfield": {"id": "https://openalex.org/subfields/1702", "display_name": "Artificial Intelligence"}, "field": {"id": "https://openalex.org/fields/17", "display_name": "Computer Science"}, "domain": {"id": "https://openalex.org/domains/3", "display_name": "Physical Sciences"}}, "topics": [{"id": "https://openalex.org/T10181", "display_name": "Natural Language Processing Techniques", "score": 0.9993000030517578, "subfield": {"id": "https://openalex.org/subfields/1702", "display_name": "Artificial Intelligence"}, "field": {"id": "https://openalex.org/fields/17", "display_name": "Computer Science"}, "domain": {"id": "https://openalex.org/domains/3", "display_name": "Physical Sciences"}}, {"id": "https://openalex.org/T10028", "display_name": "Topic Modeling", "score": 0.993399977684021, "subfield": {"id": "https://openalex.org/subfields/1702", "display_name": "Artificial Intelligence"}, "field": {"id": "https://openalex.org/fields/17", "display_name": "Computer Science"}, "domain": {"id": "https://openalex.org/domains/3", "display_name": "Physical Sciences"}}, {"id": "https://openalex.org/T11714", "display_name": "Multimodal Machine Learning Applications", "score": 0.9887999892234802, "subfield": {"id": "https://openalex.org/subfields/1707", "display_name": "Computer Vision and Pattern Recognition"}, "field": {"id": "https://openalex.org/fields/17", "display_name": "Computer Science"}, "domain": {"id": "https://openalex.org/domains/3", "display_name": "Physical Sciences"}}], "keywords": [{"id": "https://openalex.org/keywords/computer-science", "display_name": "Computer science", "score": 0.8567242622375488}, {"id": "https://openalex.org/keywords/machine-translation", "display_name": "Machine translation", "score": 0.8367122411727905}, {"id": "https://openalex.org/keywords/transformer", "display_name": "Transformer", "score": 0.7707333564758301}, {"id": "https://openalex.org/keywords/bleu", "display_name": "BLEU", "score": 0.7233442068099976}, {"id": "https://openalex.org/keywords/encoder", "display_name": "Encoder", "score": 0.6436600685119629}, {"id": "https://openalex.org/keywords/artificial-intelligence", "display_name": "Artificial intelligence", "score": 0.6131019592285156}, {"id": "https://openalex.org/keywords/parallelizable-manifold", "display_name": "Parallelizable manifold", "score": 0.5284521579742432}, {"id": "https://openalex.org/keywords/parsing", "display_name": "Parsing", "score": 0.5106223225593567}, {"id": "https://openalex.org/keywords/language-model", "display_name": "Language model", "score": 0.4961920380592346}, {"id": "https://openalex.org/keywords/natural-language-processing", "display_name": "Natural language processing", "score": 0.49199363589286804}, {"id": "https://openalex.org/keywords/decoding-methods", "display_name": "Decoding methods", "score": 0.4886353611946106}, {"id": "https://openalex.org/keywords/task", "display_name": "Task (project management)", "score": 0.48495081067085266}, {"id": "https://openalex.org/keywords/convolutional-neural-network", "display_name": "Convolutional neural network", "score": 0.42289119958877563}, {"id": "https://openalex.org/keywords/speech-recognition", "display_name": "Speech recognition", "score": 0.3937355577945709}, {"id": "https://openalex.org/keywords/machine-learning", "display_name": "Machine learning", "score": 0.3607896566390991}, {"id": "https://openalex.org/keywords/algorithm", "display_name": "Algorithm", "score": 0.14444169402122498}], "concepts": [{"id": "https://openalex.org/C41008148", "wikidata": "https://www.wikidata.org/wiki/Q21198", "display_name": "Computer science", "level": 0, "score": 0.8567242622375488}, {"id": "https://openalex.org/C203005215", "wikidata": "https://www.wikidata.org/wiki/Q79798", "display_name": "Machine translation", "level": 2, "score": 0.8367122411727905}, {"id": "https://openalex.org/C66322947", "wikidata": "https://www.wikidata.org/wiki/Q11658", "display_name": "Transformer", "level": 3, "score": 0.7707333564758301}, {"id": "https://openalex.org/C622187", "wikidata": "https://www.wikidata.org/wiki/Q3500773", "display_name": "BLEU", "level": 3, "score": 0.7233442068099976}, {"id": "https://openalex.org/C118505674", "wikidata": "https://www.wikidata.org/wiki/Q42586063", "display_name": "Encoder", "level": 2, "score": 0.6436600685119629}, {"id": "https://openalex.org/C154945302", "wikidata": "https://www.wikidata.org/wiki/Q11660", "display_name": "Artificial intelligence", "level": 1, "score": 0.6131019592285156}, {"id": "https://openalex.org/C148047603", "wikidata": "https://www.wikidata.org/wiki/Q1014612", "display_name": "Parallelizable manifold", "level": 2, "score": 0.5284521579742432}, {"id": "https://openalex.org/C186644900", "wikidata": "https://www.wikidata.org/wiki/Q194152", "display_name": "Parsing", "level": 2, "score": 0.5106223225593567}, {"id": "https://openalex.org/C137293760", "wikidata": "https://www.wikidata.org/wiki/Q3621696", "display_name": "Language model", "level": 2, "score": 0.4961920380592346}, {"id": "https://openalex.org/C204321447", "wikidata": "https://www.wikidata.org/wiki/Q30642", "display_name": "Natural language processing", "level": 1, "score": 0.49199363589286804}, {"id": "https://openalex.org/C57273362", "wikidata": "https://www.wikidata.org/wiki/Q576722", "display_name": "Decoding methods", "level": 2, "score": 0.4886353611946106}, {"id": "https://openalex.org/C2780451532", "wikidata": "https://www.wikidata.org/wiki/Q759676", "display_name": "Task (project management)", "level": 2, "score": 0.48495081067085266}, {"id": "https://openalex.org/C81363708", "wikidata": "https://www.wikidata.org/wiki/Q17084460", "display_name": "Convolutional neural network", "level": 2, "score": 0.42289119958877563}, {"id": "https://openalex.org/C28490314", "wikidata": "https://www.wikidata.org/wiki/Q189436", "display_name": "Speech recognition", "level": 1, "score": 0.3937355577945709}, {"id": "https://openalex.org/C119857082", "wikidata": "https://www.wikidata.org/wiki/Q2539", "display_name": "Machine learning", "level": 1, "score": 0.3607896566390991}, {"id": "https://openalex.org/C11413529", "wikidata": "https://www.wikidata.org/wiki/Q8366", "display_name": "Algorithm", "level": 1, "score": 0.14444169402122498}, {"id": "https://openalex.org/C165801399", "wikidata": "https://www.wikidata.org/wiki/Q25428", "display_name": "Voltage", "level": 2, "score": 0.0}, {"id": "https://openalex.org/C121332964", "wikidata": "https://www.wikidata.org/wiki/Q413", "display_name": "Physics", "level": 0, "score": 0.0}, {"id": "https://openalex.org/C162324750", "wikidata": "https://www.wikidata.org/wiki/Q8134", "display_name": "Economics", "level": 0, "score": 0.0}, {"id": "https://openalex.org/C187736073", "wikidata": "https://www.wikidata.org/wiki/Q2920921", "display_name": "Management", "level": 1, "score": 0.0}, {"id": "https://openalex.org/C62520636", "wikidata": "https://www.wikidata.org/wiki/Q944", "display_name": "Quantum mechanics", "level": 1, "score": 0.0}, {"id": "https://openalex.org/C111919701", "wikidata": "https://www.wikidata.org/wiki/Q9135", "display_name": "Operating system", "level": 1, "score": 0.0}], "mesh": [], "locations_count": 11, "locations": [{"id": "doi:10.65215/2q58a426", "is_oa": false, "landing_page_url": "https://doi.org/10.65215/2q58a426", "pdf_url": null, "source": null, "license": null, "license_id": null, "version": "acceptedVersion", "is_accepted": true, "is_published": false, "raw_source_name": null, "raw_type": "posted-content"}, {"id": "doi:10.65215/ctdc8e75", "is_oa": false, "landing_page_url": "https://doi.org/10.65215/ctdc8e75", "pdf_url": null, "source": null, "license": null, "license_id": null, "version": "acceptedVersion", "is_accepted": true, "is_published": false, "raw_source_name": null, "raw_type": "posted-content"}, {"id": "doi:10.65215/mdcm8z23", "is_oa": false, "landing_page_url": "https://doi.org/10.65215/mdcm8z23", "pdf_url": null, "source": null, "license": null, "license_id": null, "version": "acceptedVersion", "is_accepted": true, "is_published": false, "raw_source_name": null, "raw_type": "posted-content"}, {"id": "doi:10.65215/ne77pf66", "is_oa": false, "landing_page_url": "https://doi.org/10.65215/ne77pf66", "pdf_url": null, "source": null, "license": null, "license_id": null, "version": "acceptedVersion", "is_accepted": true, "is_published": false, "raw_source_name": null, "raw_type": "posted-content"}, {"id": "doi:10.65215/nxvz2v36", "is_oa": false, "landing_page_url": "https://doi.org/10.65215/nxvz2v36", "pdf_url": null, "source": null, "license": null, "license_id": null, "version": "acceptedVersion", "is_accepted": true, "is_published": false, "raw_source_name": null, "raw_type": "posted-content"}, {"id": "doi:10.65215/pc26a033", "is_oa": false, "landing_page_url": "https://doi.org/10.65215/pc26a033", "pdf_url": null, "source": null, "license": null, "license_id": null, "version": "acceptedVersion", "is_accepted": true, "is_published": false, "raw_source_name": null, "raw_type": "posted-content"}, {"id": "doi:10.65215/r5bs2d54", "is_oa": true, "landing_page_url": "https://doi.org/10.65215/r5bs2d54", "pdf_url": "https://langtaosha.org.cn/index.php/lts/preprint/download/10/108", "source": null, "license": null, "license_id": null, "version": "acceptedVersion", "is_accepted": true, "is_published": false, "raw_source_name": null, "raw_type": "posted-content"}, {"id": "doi:10.65215/ysbyhc05", "is_oa": false, "landing_page_url": "https://doi.org/10.65215/ysbyhc05", "pdf_url": null, "source": null, "license": null, "license_id": null, "version": "acceptedVersion", "is_accepted": true, "is_published": false, "raw_source_name": null, "raw_type": "posted-content"}, {"id": "pmh:oai:arXiv.org:1706.03762", "is_oa": true, "landing_page_url": "http://arxiv.org/abs/1706.03762", "pdf_url": "https://arxiv.org/pdf/1706.03762", "source": {"id": "https://openalex.org/S4306400194", "display_name": "arXiv (Cornell University)", "issn_l": null, "issn": null, "is_oa": true, "is_in_doaj": false, "is_core": false, "host_organization": "https://openalex.org/I205783295", "host_organization_name": "Cornell University", "host_organization_lineage": ["https://openalex.org/I205783295"], "host_organization_lineage_names": [], "type": "repository"}, "license": null, "license_id": null, "version": "submittedVersion", "is_accepted": false, "is_published": false, "raw_source_name": "", "raw_type": "text"}, {"id": "doi:10.48550/arxiv.1706.03762", "is_oa": true, "landing_page_url": "https://doi.org/10.48550/arxiv.1706.03762", "pdf_url": null, "source": {"id": "https://openalex.org/S4306400194", "display_name": "arXiv (Cornell University)", "issn_l": null, "issn": null, "is_oa": true, "is_in_doaj": false, "is_core": false, "host_organization": "https://openalex.org/I205783295", "host_organization_name": "Cornell University", "host_organization_lineage": ["https://openalex.org/I205783295"], "host_organization_lineage_names": [], "type": "repository"}, "license": null, "license_id": null, "version": null, "is_accepted": false, "is_published": null, "raw_source_name": null, "raw_type": "article"}, {"id": "mag:2963403868", "is_oa": true, "landing_page_url": "https://arxiv.org/pdf/1706.03762v5", "pdf_url": null, "source": {"id": "https://openalex.org/S4306400194", "display_name": "arXiv (Cornell University)", "issn_l": null, "issn": null, "is_oa": true, "is_in_doaj": false, "is_core": false, "host_organization": "https://openalex.org/I205783295", "host_organization_name": "Cornell University", "host_organization_lineage": ["https://openalex.org/I205783295"], "host_organization_lineage_names": [], "type": "repository"}, "license": null, "license_id": null, "version": null, "is_accepted": false, "is_published": null, "raw_source_name": "arXiv (Cornell University)", "raw_type": null}], "best_oa_location": {"id": "doi:10.65215/r5bs2d54", "is_oa": true, "landing_page_url": "https://doi.org/10.65215/r5bs2d54", "pdf_url": "https://langtaosha.org.cn/index.php/lts/preprint/download/10/108", "source": null, "license": null, "license_id": null, "version": "acceptedVersion", "is_accepted": true, "is_published": false, "raw_source_name": null, "raw_type": "posted-content"}, "sustainable_development_goals": [{"id": "https://metadata.un.org/sdg/4", "score": 0.550000011920929, "display_name": "Quality Education"}], "awards": [], "funders": [], "has_content": {"pdf": true, "grobid_xml": false}, "content_urls": {"pdf": "https://content.openalex.org/works/W2626778328.pdf"}, "referenced_works_count": 28, "referenced_works": ["https://openalex.org/W1632114991", "https://openalex.org/W1810943226", "https://openalex.org/W1902237438", "https://openalex.org/W2113691817", "https://openalex.org/W2126433015", "https://openalex.org/W2139621418", "https://openalex.org/W2163568299", "https://openalex.org/W2194775991", "https://openalex.org/W2259472270", "https://openalex.org/W2289899728", "https://openalex.org/W2514713644", "https://openalex.org/W2525778437", "https://openalex.org/W2545625743", "https://openalex.org/W2594990650", "https://openalex.org/W2605203995", "https://openalex.org/W2612675303", "https://openalex.org/W2613904329", "https://openalex.org/W2949847915", "https://openalex.org/W2951008357", "https://openalex.org/W2951583185", "https://openalex.org/W2952191002", "https://openalex.org/W2952339051", "https://openalex.org/W2962784628", "https://openalex.org/W2963069010", "https://openalex.org/W2963187627", "https://openalex.org/W2963991316", "https://openalex.org/W2964121744", "https://openalex.org/W2964308564"], "related_works": ["https://openalex.org/W2965373594", "https://openalex.org/W2964308564", "https://openalex.org/W2964121744", "https://openalex.org/W2963341956", "https://openalex.org/W2963091558", "https://openalex.org/W2962784628", "https://openalex.org/W2950577311", "https://openalex.org/W2950133940", "https://openalex.org/W2949888546", "https://openalex.org/W2787560479", "https://openalex.org/W2525778437", "https://openalex.org/W2250539671", "https://openalex.org/W2194775991", "https://openalex.org/W2163605009", "https://openalex.org/W2157331557", "https://openalex.org/W2108598243", "https://openalex.org/W2101105183", "https://openalex.org/W2095705004", "https://openalex.org/W2064675550", "https://openalex.org/W1902237438"], "abstract_inverted_index": {"The": [0, 18], "dominant": [1], "sequence": [2], "transduction": [3], "models": [4, 21, 60, 137], "are": [5], "based": [6, 41], "on": [7, 43, 53, 82, 124], "complex": [8], "recurrent": [9], "or": [10], "convolutional": [11], "neural": [12], "networks": [13], "in": [14, 64], "an": [15, 29], "encoder-decoder": [16], "configuration.": [17], "best": [19, 93, 136], "performing": [20], "also": [22], "connect": [23], "the": [24, 39, 83, 91, 102, 131, 135, 139, 144], "encoder": [25], "and": [26, 49, 70, 162], "decoder": [27], "through": [28], "attention": [30, 44], "mechanism.": [31], "We": [32, 141], "propose": [33], "a": [34, 111, 127], "new": [35, 112], "simple": [36], "network": [37], "architecture,": [38], "Transformer,": [40], "solely": [42], "mechanisms,": [45], "dispensing": [46], "with": [47, 160], "recurrence": [48], "convolutions": [50], "entirely.": [51], "Experiments": [52], "two": [54], "machine": [55], "translation": [56, 87, 106], "tasks": [57, 150], "show": [58, 142], "these": [59], "to": [61, 75, 148, 155], "be": [62], "superior": [63], "quality": [65], "while": [66], "being": [67], "more": [68], "parallelizable": [69], "requiring": [71], "significantly": [72], "less": [73], "time": [74], "train.": [76], "Our": [77], "model": [78, 109], "achieves": [79], "28.4": [80], "BLEU": [81, 115], "WMT": [84, 103], "2014": [85, 104], "English-to-German": [86], "task,": [88, 107], "improving": [89], "over": [90, 98], "existing": [92], "results,": [94], "including": [95], "ensembles": [96], "by": [97, 151], "2": [99], "BLEU.": [100], "On": [101], "English-to-French": [105], "our": [108], "establishes": [110], "single-model": [113], "state-of-the-art": [114], "score": [116], "of": [117, 130, 134], "41.8": [118], "after": [119], "training": [120, 132, 164], "for": [121], "3.5": [122], "days": [123], "eight": [125], "GPUs,": [126], "small": [128], "fraction": [129], "costs": [133], "from": [138], "literature.": [140], "that": [143], "Transformer": [145], "generalizes": [146], "well": [147], "other": [149], "applying": [152], "it": [153], "successfully": [154], "English": [156], "constituency": [157], "parsing": [158], "both": [159], "large": [161], "limited": [163], "data.": [165]}, "counts_by_year": [{"year": 2026, "cited_by_count": 19}, {"year": 2025, "cited_by_count": 18}, {"year": 2024, "cited_by_count": 4}, {"year": 2023, "cited_by_count": 18}, {"year": 2022, "cited_by_count": 176}, {"year": 2021, "cited_by_count": 2997}, {"year": 2020, "cited_by_count": 1813}, {"year": 2019, "cited_by_count": 952}, {"year": 2018, "cited_by_count": 447}, {"year": 2017, "cited_by_count": 49}, {"year": 2012, "cited_by_count": 1}], "updated_date": "2026-02-28T09:26:25.869077", "created_date": "2017-06-23T00:00:00"}} \ No newline at end of file +{"timestamp": 1783037329.304395, "data": {"id": "https://openalex.org/W2626778328", "doi": "https://doi.org/10.65215/2q58a426", "title": "Attention Is All You Need", "display_name": "Attention Is All You Need", "relevance_score": 15347.007, "publication_year": 2025, "publication_date": "2025-08-23", "ids": {"openalex": "https://openalex.org/W2626778328", "doi": "https://doi.org/10.65215/2q58a426", "mag": "2626778328"}, "language": "en", "primary_location": {"id": "doi:10.65215/2q58a426", "is_oa": false, "landing_page_url": "https://doi.org/10.65215/2q58a426", "pdf_url": null, "source": null, "license": null, "license_id": null, "version": "acceptedVersion", "is_accepted": true, "is_published": false, "raw_source_name": null, "raw_type": "posted-content"}, "type": "preprint", "indexed_in": ["arxiv", "crossref", "datacite"], "open_access": {"is_oa": true, "oa_status": "gold", "oa_url": "https://langtaosha.org.cn/index.php/lts/preprint/download/10/108", "any_repository_has_fulltext": true}, "authorships": [{"author_position": "first", "author": {"id": "https://openalex.org/A5103024730", "display_name": "Ashish Vaswani", "orcid": "https://orcid.org/0000-0002-7794-2085"}, "institutions": [{"id": "https://openalex.org/I1291425158", "display_name": "Google (United States)", "ror": "https://ror.org/00njsd438", "country_code": "US", "type": "company", "lineage": ["https://openalex.org/I1291425158", "https://openalex.org/I4210128969"]}], "countries": ["US"], "is_corresponding": false, "raw_author_name": "Ashish Vaswani", "raw_affiliation_strings": ["Google Brain", "Google (United States), Mountain View, United States"], "raw_orcid": null, "affiliations": [{"raw_affiliation_string": "Google Brain", "institution_ids": ["https://openalex.org/I1291425158"]}, {"raw_affiliation_string": "Google (United States), Mountain View, United States", "institution_ids": ["https://openalex.org/I1291425158"]}]}, {"author_position": "middle", "author": {"id": "https://openalex.org/A5021878400", "display_name": "Noam Shazeer", "orcid": null}, "institutions": [{"id": "https://openalex.org/I1291425158", "display_name": "Google (United States)", "ror": "https://ror.org/00njsd438", "country_code": "US", "type": "company", "lineage": ["https://openalex.org/I1291425158", "https://openalex.org/I4210128969"]}], "countries": ["US"], "is_corresponding": false, "raw_author_name": "Noam Shazeer", "raw_affiliation_strings": ["Google Brain", "Google (United States), Mountain View, United States"], "raw_orcid": null, "affiliations": [{"raw_affiliation_string": "Google Brain", "institution_ids": ["https://openalex.org/I1291425158"]}, {"raw_affiliation_string": "Google (United States), Mountain View, United States", "institution_ids": ["https://openalex.org/I1291425158"]}]}, {"author_position": "middle", "author": {"id": "https://openalex.org/A5005777963", "display_name": "Niki Parmar", "orcid": null}, "institutions": [{"id": "https://openalex.org/I1174212", "display_name": "University of Southern California", "ror": "https://ror.org/03taz7m60", "country_code": "US", "type": "education", "lineage": ["https://openalex.org/I1174212"]}, {"id": "https://openalex.org/I1291425158", "display_name": "Google (United States)", "ror": "https://ror.org/00njsd438", "country_code": "US", "type": "company", "lineage": ["https://openalex.org/I1291425158", "https://openalex.org/I4210128969"]}], "countries": ["US"], "is_corresponding": false, "raw_author_name": "Niki Parmar", "raw_affiliation_strings": ["Google Research", "University of Southern California, Los Angeles, United States"], "raw_orcid": null, "affiliations": [{"raw_affiliation_string": "Google Research", "institution_ids": ["https://openalex.org/I1291425158"]}, {"raw_affiliation_string": "University of Southern California, Los Angeles, United States", "institution_ids": ["https://openalex.org/I1174212"]}]}, {"author_position": "middle", "author": {"id": "https://openalex.org/A5022416424", "display_name": "Jakob Uszkoreit", "orcid": "https://orcid.org/0000-0001-5066-7530"}, "institutions": [{"id": "https://openalex.org/I1291425158", "display_name": "Google (United States)", "ror": "https://ror.org/00njsd438", "country_code": "US", "type": "company", "lineage": ["https://openalex.org/I1291425158", "https://openalex.org/I4210128969"]}], "countries": ["US"], "is_corresponding": false, "raw_author_name": "Jakob Uszkoreit", "raw_affiliation_strings": ["Google Research", "Google (United States), Mountain View, United States"], "raw_orcid": null, "affiliations": [{"raw_affiliation_string": "Google Research", "institution_ids": ["https://openalex.org/I1291425158"]}, {"raw_affiliation_string": "Google (United States), Mountain View, United States", "institution_ids": ["https://openalex.org/I1291425158"]}]}, {"author_position": "middle", "author": {"id": "https://openalex.org/A5023448834", "display_name": "Llion Jones", "orcid": null}, "institutions": [{"id": "https://openalex.org/I1291425158", "display_name": "Google (United States)", "ror": "https://ror.org/00njsd438", "country_code": "US", "type": "company", "lineage": ["https://openalex.org/I1291425158", "https://openalex.org/I4210128969"]}], "countries": ["US"], "is_corresponding": false, "raw_author_name": "Llion Jones", "raw_affiliation_strings": ["Google Research", "Google (United States), Mountain View, United States"], "raw_orcid": null, "affiliations": [{"raw_affiliation_string": "Google Research", "institution_ids": ["https://openalex.org/I1291425158"]}, {"raw_affiliation_string": "Google (United States), Mountain View, United States", "institution_ids": ["https://openalex.org/I1291425158"]}]}, {"author_position": "middle", "author": {"id": "https://openalex.org/A5079288315", "display_name": "Aidan N. Gomez", "orcid": "https://orcid.org/0000-0001-5601-5437"}, "institutions": [{"id": "https://openalex.org/I1291425158", "display_name": "Google (United States)", "ror": "https://ror.org/00njsd438", "country_code": "US", "type": "company", "lineage": ["https://openalex.org/I1291425158", "https://openalex.org/I4210128969"]}, {"id": "https://openalex.org/I185261750", "display_name": "University of Toronto", "ror": "https://ror.org/03dbr7087", "country_code": "CA", "type": "education", "lineage": ["https://openalex.org/I185261750"]}], "countries": ["CA", "US"], "is_corresponding": false, "raw_author_name": "Aidan N.Gomez", "raw_affiliation_strings": ["University of Toronto", "Google (United States), Mountain View, United States"], "raw_orcid": null, "affiliations": [{"raw_affiliation_string": "University of Toronto", "institution_ids": ["https://openalex.org/I185261750"]}, {"raw_affiliation_string": "Google (United States), Mountain View, United States", "institution_ids": ["https://openalex.org/I1291425158"]}]}, {"author_position": "middle", "author": {"id": "https://openalex.org/A5031789995", "display_name": "\u0141ukasz Kaiser", "orcid": "https://orcid.org/0000-0003-1092-6010"}, "institutions": [{"id": "https://openalex.org/I1291425158", "display_name": "Google (United States)", "ror": "https://ror.org/00njsd438", "country_code": "US", "type": "company", "lineage": ["https://openalex.org/I1291425158", "https://openalex.org/I4210128969"]}], "countries": ["US"], "is_corresponding": false, "raw_author_name": "Lukasz Kaiser", "raw_affiliation_strings": ["Google Brain", "Google (United States), Mountain View, United States"], "raw_orcid": null, "affiliations": [{"raw_affiliation_string": "Google Brain", "institution_ids": ["https://openalex.org/I1291425158"]}, {"raw_affiliation_string": "Google (United States), Mountain View, United States", "institution_ids": ["https://openalex.org/I1291425158"]}]}, {"author_position": "last", "author": {"id": "https://openalex.org/A5045719436", "display_name": "Illia Polosukhin", "orcid": null}, "institutions": [{"id": "https://openalex.org/I1291425158", "display_name": "Google (United States)", "ror": "https://ror.org/00njsd438", "country_code": "US", "type": "company", "lineage": ["https://openalex.org/I1291425158", "https://openalex.org/I4210128969"]}], "countries": ["US"], "is_corresponding": false, "raw_author_name": "Illia Polosukhin", "raw_affiliation_strings": ["Google (United States), Mountain View, United States"], "raw_orcid": null, "affiliations": [{"raw_affiliation_string": "Google (United States), Mountain View, United States", "institution_ids": ["https://openalex.org/I1291425158"]}]}], "institutions": [], "countries_distinct_count": 2, "institutions_distinct_count": 3, "corresponding_author_ids": [], "corresponding_institution_ids": [], "apc_list": null, "apc_paid": null, "fwci": 161.5838, "has_fulltext": false, "cited_by_count": 6578, "citation_normalized_percentile": {"value": 0.9998687, "is_in_top_1_percent": true, "is_in_top_10_percent": true}, "cited_by_percentile_year": {"min": 89, "max": 100}, "biblio": {"volume": "30", "issue": null, "first_page": "5998", "last_page": "6008"}, "is_retracted": false, "is_paratext": false, "is_xpac": false, "primary_topic": {"id": "https://openalex.org/T10181", "display_name": "Natural Language Processing Techniques", "score": 0.9993000030517578, "subfield": {"id": "https://openalex.org/subfields/1702", "display_name": "Artificial Intelligence"}, "field": {"id": "https://openalex.org/fields/17", "display_name": "Computer Science"}, "domain": {"id": "https://openalex.org/domains/3", "display_name": "Physical Sciences"}}, "topics": [{"id": "https://openalex.org/T10181", "display_name": "Natural Language Processing Techniques", "score": 0.9993000030517578, "subfield": {"id": "https://openalex.org/subfields/1702", "display_name": "Artificial Intelligence"}, "field": {"id": "https://openalex.org/fields/17", "display_name": "Computer Science"}, "domain": {"id": "https://openalex.org/domains/3", "display_name": "Physical Sciences"}}, {"id": "https://openalex.org/T10028", "display_name": "Topic Modeling", "score": 0.993399977684021, "subfield": {"id": "https://openalex.org/subfields/1702", "display_name": "Artificial Intelligence"}, "field": {"id": "https://openalex.org/fields/17", "display_name": "Computer Science"}, "domain": {"id": "https://openalex.org/domains/3", "display_name": "Physical Sciences"}}, {"id": "https://openalex.org/T11714", "display_name": "Multimodal Machine Learning Applications", "score": 0.9887999892234802, "subfield": {"id": "https://openalex.org/subfields/1707", "display_name": "Computer Vision and Pattern Recognition"}, "field": {"id": "https://openalex.org/fields/17", "display_name": "Computer Science"}, "domain": {"id": "https://openalex.org/domains/3", "display_name": "Physical Sciences"}}], "keywords": [{"id": "https://openalex.org/keywords/computer-science", "display_name": "Computer science", "score": 0.8567242622375488}, {"id": "https://openalex.org/keywords/machine-translation", "display_name": "Machine translation", "score": 0.8367122411727905}, {"id": "https://openalex.org/keywords/transformer", "display_name": "Transformer", "score": 0.7707333564758301}, {"id": "https://openalex.org/keywords/bleu", "display_name": "BLEU", "score": 0.7233442068099976}, {"id": "https://openalex.org/keywords/encoder", "display_name": "Encoder", "score": 0.6436600685119629}, {"id": "https://openalex.org/keywords/artificial-intelligence", "display_name": "Artificial intelligence", "score": 0.6131019592285156}, {"id": "https://openalex.org/keywords/parallelizable-manifold", "display_name": "Parallelizable manifold", "score": 0.5284521579742432}, {"id": "https://openalex.org/keywords/parsing", "display_name": "Parsing", "score": 0.5106223225593567}, {"id": "https://openalex.org/keywords/language-model", "display_name": "Language model", "score": 0.4961920380592346}, {"id": "https://openalex.org/keywords/natural-language-processing", "display_name": "Natural language processing", "score": 0.49199363589286804}, {"id": "https://openalex.org/keywords/decoding-methods", "display_name": "Decoding methods", "score": 0.4886353611946106}, {"id": "https://openalex.org/keywords/task", "display_name": "Task (project management)", "score": 0.48495081067085266}, {"id": "https://openalex.org/keywords/convolutional-neural-network", "display_name": "Convolutional neural network", "score": 0.42289119958877563}, {"id": "https://openalex.org/keywords/speech-recognition", "display_name": "Speech recognition", "score": 0.3937355577945709}, {"id": "https://openalex.org/keywords/machine-learning", "display_name": "Machine learning", "score": 0.3607896566390991}, {"id": "https://openalex.org/keywords/algorithm", "display_name": "Algorithm", "score": 0.14444169402122498}], "concepts": [{"id": "https://openalex.org/C41008148", "wikidata": "https://www.wikidata.org/wiki/Q21198", "display_name": "Computer science", "level": 0, "score": 0.8567242622375488}, {"id": "https://openalex.org/C203005215", "wikidata": "https://www.wikidata.org/wiki/Q79798", "display_name": "Machine translation", "level": 2, "score": 0.8367122411727905}, {"id": "https://openalex.org/C66322947", "wikidata": "https://www.wikidata.org/wiki/Q11658", "display_name": "Transformer", "level": 3, "score": 0.7707333564758301}, {"id": "https://openalex.org/C622187", "wikidata": "https://www.wikidata.org/wiki/Q3500773", "display_name": "BLEU", "level": 3, "score": 0.7233442068099976}, {"id": "https://openalex.org/C118505674", "wikidata": "https://www.wikidata.org/wiki/Q42586063", "display_name": "Encoder", "level": 2, "score": 0.6436600685119629}, {"id": "https://openalex.org/C154945302", "wikidata": "https://www.wikidata.org/wiki/Q11660", "display_name": "Artificial intelligence", "level": 1, "score": 0.6131019592285156}, {"id": "https://openalex.org/C148047603", "wikidata": "https://www.wikidata.org/wiki/Q1014612", "display_name": "Parallelizable manifold", "level": 2, "score": 0.5284521579742432}, {"id": "https://openalex.org/C186644900", "wikidata": "https://www.wikidata.org/wiki/Q194152", "display_name": "Parsing", "level": 2, "score": 0.5106223225593567}, {"id": "https://openalex.org/C137293760", "wikidata": "https://www.wikidata.org/wiki/Q3621696", "display_name": "Language model", "level": 2, "score": 0.4961920380592346}, {"id": "https://openalex.org/C204321447", "wikidata": "https://www.wikidata.org/wiki/Q30642", "display_name": "Natural language processing", "level": 1, "score": 0.49199363589286804}, {"id": "https://openalex.org/C57273362", "wikidata": "https://www.wikidata.org/wiki/Q576722", "display_name": "Decoding methods", "level": 2, "score": 0.4886353611946106}, {"id": "https://openalex.org/C2780451532", "wikidata": "https://www.wikidata.org/wiki/Q759676", "display_name": "Task (project management)", "level": 2, "score": 0.48495081067085266}, {"id": "https://openalex.org/C81363708", "wikidata": "https://www.wikidata.org/wiki/Q17084460", "display_name": "Convolutional neural network", "level": 2, "score": 0.42289119958877563}, {"id": "https://openalex.org/C28490314", "wikidata": "https://www.wikidata.org/wiki/Q189436", "display_name": "Speech recognition", "level": 1, "score": 0.3937355577945709}, {"id": "https://openalex.org/C119857082", "wikidata": "https://www.wikidata.org/wiki/Q2539", "display_name": "Machine learning", "level": 1, "score": 0.3607896566390991}, {"id": "https://openalex.org/C11413529", "wikidata": "https://www.wikidata.org/wiki/Q8366", "display_name": "Algorithm", "level": 1, "score": 0.14444169402122498}, {"id": "https://openalex.org/C165801399", "wikidata": "https://www.wikidata.org/wiki/Q25428", "display_name": "Voltage", "level": 2, "score": 0.0}, {"id": "https://openalex.org/C121332964", "wikidata": "https://www.wikidata.org/wiki/Q413", "display_name": "Physics", "level": 0, "score": 0.0}, {"id": "https://openalex.org/C162324750", "wikidata": "https://www.wikidata.org/wiki/Q8134", "display_name": "Economics", "level": 0, "score": 0.0}, {"id": "https://openalex.org/C187736073", "wikidata": "https://www.wikidata.org/wiki/Q2920921", "display_name": "Management", "level": 1, "score": 0.0}, {"id": "https://openalex.org/C62520636", "wikidata": "https://www.wikidata.org/wiki/Q944", "display_name": "Quantum mechanics", "level": 1, "score": 0.0}, {"id": "https://openalex.org/C111919701", "wikidata": "https://www.wikidata.org/wiki/Q9135", "display_name": "Operating system", "level": 1, "score": 0.0}], "mesh": [], "locations_count": 11, "locations": [{"id": "doi:10.65215/2q58a426", "is_oa": false, "landing_page_url": "https://doi.org/10.65215/2q58a426", "pdf_url": null, "source": null, "license": null, "license_id": null, "version": "acceptedVersion", "is_accepted": true, "is_published": false, "raw_source_name": null, "raw_type": "posted-content"}, {"id": "doi:10.65215/ctdc8e75", "is_oa": false, "landing_page_url": "https://doi.org/10.65215/ctdc8e75", "pdf_url": null, "source": null, "license": null, "license_id": null, "version": "acceptedVersion", "is_accepted": true, "is_published": false, "raw_source_name": null, "raw_type": "posted-content"}, {"id": "doi:10.65215/mdcm8z23", "is_oa": false, "landing_page_url": "https://doi.org/10.65215/mdcm8z23", "pdf_url": null, "source": null, "license": null, "license_id": null, "version": "acceptedVersion", "is_accepted": true, "is_published": false, "raw_source_name": null, "raw_type": "posted-content"}, {"id": "doi:10.65215/ne77pf66", "is_oa": false, "landing_page_url": "https://doi.org/10.65215/ne77pf66", "pdf_url": null, "source": null, "license": null, "license_id": null, "version": "acceptedVersion", "is_accepted": true, "is_published": false, "raw_source_name": null, "raw_type": "posted-content"}, {"id": "doi:10.65215/nxvz2v36", "is_oa": false, "landing_page_url": "https://doi.org/10.65215/nxvz2v36", "pdf_url": null, "source": null, "license": null, "license_id": null, "version": "acceptedVersion", "is_accepted": true, "is_published": false, "raw_source_name": null, "raw_type": "posted-content"}, {"id": "doi:10.65215/pc26a033", "is_oa": false, "landing_page_url": "https://doi.org/10.65215/pc26a033", "pdf_url": null, "source": null, "license": null, "license_id": null, "version": "acceptedVersion", "is_accepted": true, "is_published": false, "raw_source_name": null, "raw_type": "posted-content"}, {"id": "doi:10.65215/r5bs2d54", "is_oa": true, "landing_page_url": "https://doi.org/10.65215/r5bs2d54", "pdf_url": "https://langtaosha.org.cn/index.php/lts/preprint/download/10/108", "source": null, "license": null, "license_id": null, "version": "acceptedVersion", "is_accepted": true, "is_published": false, "raw_source_name": null, "raw_type": "posted-content"}, {"id": "doi:10.65215/ysbyhc05", "is_oa": false, "landing_page_url": "https://doi.org/10.65215/ysbyhc05", "pdf_url": null, "source": null, "license": null, "license_id": null, "version": "acceptedVersion", "is_accepted": true, "is_published": false, "raw_source_name": null, "raw_type": "posted-content"}, {"id": "pmh:oai:arXiv.org:1706.03762", "is_oa": true, "landing_page_url": "http://arxiv.org/abs/1706.03762", "pdf_url": "https://arxiv.org/pdf/1706.03762", "source": {"id": "https://openalex.org/S4306400194", "display_name": "arXiv (Cornell University)", "issn_l": null, "issn": null, "is_oa": true, "is_in_doaj": false, "is_core": false, "host_organization": "https://openalex.org/I205783295", "host_organization_name": "Cornell University", "host_organization_lineage": ["https://openalex.org/I205783295"], "host_organization_lineage_names": [], "type": "repository"}, "license": null, "license_id": null, "version": "submittedVersion", "is_accepted": false, "is_published": false, "raw_source_name": "", "raw_type": "text"}, {"id": "doi:10.48550/arxiv.1706.03762", "is_oa": true, "landing_page_url": "https://doi.org/10.48550/arxiv.1706.03762", "pdf_url": null, "source": {"id": "https://openalex.org/S4306400194", "display_name": "arXiv (Cornell University)", "issn_l": null, "issn": null, "is_oa": true, "is_in_doaj": false, "is_core": false, "host_organization": "https://openalex.org/I205783295", "host_organization_name": "Cornell University", "host_organization_lineage": ["https://openalex.org/I205783295"], "host_organization_lineage_names": [], "type": "repository"}, "license": null, "license_id": null, "version": null, "is_accepted": false, "is_published": null, "raw_source_name": null, "raw_type": "Preprint"}, {"id": "mag:2963403868", "is_oa": true, "landing_page_url": "https://arxiv.org/pdf/1706.03762v5", "pdf_url": null, "source": {"id": "https://openalex.org/S4306400194", "display_name": "arXiv (Cornell University)", "issn_l": null, "issn": null, "is_oa": true, "is_in_doaj": false, "is_core": false, "host_organization": "https://openalex.org/I205783295", "host_organization_name": "Cornell University", "host_organization_lineage": ["https://openalex.org/I205783295"], "host_organization_lineage_names": [], "type": "repository"}, "license": null, "license_id": null, "version": null, "is_accepted": false, "is_published": null, "raw_source_name": "arXiv (Cornell University)", "raw_type": null}], "best_oa_location": {"id": "doi:10.65215/r5bs2d54", "is_oa": true, "landing_page_url": "https://doi.org/10.65215/r5bs2d54", "pdf_url": "https://langtaosha.org.cn/index.php/lts/preprint/download/10/108", "source": null, "license": null, "license_id": null, "version": "acceptedVersion", "is_accepted": true, "is_published": false, "raw_source_name": null, "raw_type": "posted-content"}, "sustainable_development_goals": [{"id": "https://metadata.un.org/sdg/4", "display_name": "Quality Education", "score": 0.550000011920929}], "awards": [], "funders": [], "has_content": {"pdf": true, "grobid_xml": true}, "content_urls": {"pdf": "https://content.openalex.org/works/W2626778328.pdf", "grobid_xml": "https://content.openalex.org/works/W2626778328.grobid-xml"}, "referenced_works_count": 28, "referenced_works": ["https://openalex.org/W1632114991", "https://openalex.org/W1810943226", "https://openalex.org/W1902237438", "https://openalex.org/W2113691817", "https://openalex.org/W2126433015", "https://openalex.org/W2139621418", "https://openalex.org/W2163568299", "https://openalex.org/W2194775991", "https://openalex.org/W2259472270", "https://openalex.org/W2289899728", "https://openalex.org/W2514713644", "https://openalex.org/W2525778437", "https://openalex.org/W2545625743", "https://openalex.org/W2594990650", "https://openalex.org/W2605203995", "https://openalex.org/W2612675303", "https://openalex.org/W2613904329", "https://openalex.org/W2949847915", "https://openalex.org/W2951008357", "https://openalex.org/W2951583185", "https://openalex.org/W2952191002", "https://openalex.org/W2952339051", "https://openalex.org/W2962784628", "https://openalex.org/W2963069010", "https://openalex.org/W2963187627", "https://openalex.org/W2963991316", "https://openalex.org/W2964121744", "https://openalex.org/W2964308564"], "related_works": ["https://openalex.org/W2965373594", "https://openalex.org/W2964308564", "https://openalex.org/W2964121744", "https://openalex.org/W2963341956", "https://openalex.org/W2963091558", "https://openalex.org/W2962784628", "https://openalex.org/W2950577311", "https://openalex.org/W2950133940", "https://openalex.org/W2949888546", "https://openalex.org/W2787560479", "https://openalex.org/W2525778437", "https://openalex.org/W2250539671", "https://openalex.org/W2194775991", "https://openalex.org/W2163605009", "https://openalex.org/W2157331557", "https://openalex.org/W2108598243", "https://openalex.org/W2101105183", "https://openalex.org/W2095705004", "https://openalex.org/W2064675550", "https://openalex.org/W1902237438"], "abstract_inverted_index": {"The": [0, 18], "dominant": [1], "sequence": [2], "transduction": [3], "models": [4, 21, 60, 137], "are": [5], "based": [6, 41], "on": [7, 43, 53, 82, 124], "complex": [8], "recurrent": [9], "or": [10], "convolutional": [11], "neural": [12], "networks": [13], "in": [14, 64], "an": [15, 29], "encoder-decoder": [16], "configuration.": [17], "best": [19, 93, 136], "performing": [20], "also": [22], "connect": [23], "the": [24, 39, 83, 91, 102, 131, 135, 139, 144], "encoder": [25], "and": [26, 49, 70, 162], "decoder": [27], "through": [28], "attention": [30, 44], "mechanism.": [31], "We": [32, 141], "propose": [33], "a": [34, 111, 127], "new": [35, 112], "simple": [36], "network": [37], "architecture,": [38], "Transformer,": [40], "solely": [42], "mechanisms,": [45], "dispensing": [46], "with": [47, 160], "recurrence": [48], "convolutions": [50], "entirely.": [51], "Experiments": [52], "two": [54], "machine": [55], "translation": [56, 87, 106], "tasks": [57, 150], "show": [58, 142], "these": [59], "to": [61, 75, 148, 155], "be": [62], "superior": [63], "quality": [65], "while": [66], "being": [67], "more": [68], "parallelizable": [69], "requiring": [71], "significantly": [72], "less": [73], "time": [74], "train.": [76], "Our": [77], "model": [78, 109], "achieves": [79], "28.4": [80], "BLEU": [81, 115], "WMT": [84, 103], "2014": [85, 104], "English-to-German": [86], "task,": [88, 107], "improving": [89], "over": [90, 98], "existing": [92], "results,": [94], "including": [95], "ensembles": [96], "by": [97, 151], "2": [99], "BLEU.": [100], "On": [101], "English-to-French": [105], "our": [108], "establishes": [110], "single-model": [113], "state-of-the-art": [114], "score": [116], "of": [117, 130, 134], "41.8": [118], "after": [119], "training": [120, 132, 164], "for": [121], "3.5": [122], "days": [123], "eight": [125], "GPUs,": [126], "small": [128], "fraction": [129], "costs": [133], "from": [138], "literature.": [140], "that": [143], "Transformer": [145], "generalizes": [146], "well": [147], "other": [149], "applying": [152], "it": [153], "successfully": [154], "English": [156], "constituency": [157], "parsing": [158], "both": [159], "large": [161], "limited": [163], "data.": [165]}, "counts_by_year": [{"year": 2026, "cited_by_count": 86}, {"year": 2025, "cited_by_count": 24}, {"year": 2024, "cited_by_count": 5}, {"year": 2023, "cited_by_count": 18}, {"year": 2022, "cited_by_count": 176}, {"year": 2021, "cited_by_count": 2997}, {"year": 2020, "cited_by_count": 1820}, {"year": 2019, "cited_by_count": 955}, {"year": 2018, "cited_by_count": 447}, {"year": 2017, "cited_by_count": 49}, {"year": 2012, "cited_by_count": 1}], "updated_date": "2026-07-02T09:51:11.867554", "created_date": "2017-06-23T00:00:00"}} \ No newline at end of file diff --git a/output/badges.json b/output/badges.json index 20800818..82a811de 100644 --- a/output/badges.json +++ b/output/badges.json @@ -1,8 +1,8 @@ { "last_updated": "2026-07", - "cache_positive_hits": 3489, - "cache_negative_hits": 3067, - "cache_misses": 2159, - "total_queries": 8715, - "hit_rate": 75.2 + "cache_positive_hits": 3508, + "cache_negative_hits": 3076, + "cache_misses": 2124, + "total_queries": 8708, + "hit_rate": 75.6 } \ No newline at end of file diff --git a/output/summary.csv b/output/summary.csv index b0d49df0..80070c48 100644 --- a/output/summary.csv +++ b/output/summary.csv @@ -1805,7 +1805,7 @@ output/Orji (-1cHtBQAAAAJ)/Nkwo2021-DesignOpportunities.bib,3,0,0,0,1,0,0,1,0,0, output/Gagie (aFCoq2YAAAAJ)/Brown2025-FasterRun.bib,2,0,0,1,0,0,0,0,0,0,1,0 output/Neethirajan (8VZwF0sAAAAJ)/Jacobs2022-ASASNANP.bib,5,0,0,1,1,0,0,0,1,1,1,0 output/Trappenberg (EwkaTYEAAAAJ)/Pacheco2020-LearningDynamic.bib,2,0,0,0,1,0,0,0,0,0,1,0 -output/Neethirajan (8VZwF0sAAAAJ)/Neethirajan2022-BigData.bib,3,0,0,0,1,0,0,0,0,1,1,0 +output/Neethirajan (8VZwF0sAAAAJ)/Neethirajan2022-BigData.bib,4,0,0,0,1,0,0,1,0,1,1,0 output/Ye (4OQaVGUAAAAJ)/Yang2020-OpportunisticAdaptive.bib,4,0,0,1,1,0,0,1,0,0,1,0 output/Keselj (uDKsmuIAAAAJ)/Taylor2025-HeyChatGPT.bib,4,0,0,1,1,0,0,1,0,0,1,0 output/Keselj (uDKsmuIAAAAJ)/Keselj2025-SingleSource.bib,4,0,0,1,1,0,0,1,0,0,1,0 @@ -1836,7 +1836,7 @@ output/Gagie (aFCoq2YAAAAJ)/Peresini2024-MIOVReordering.bib,2,0,0,0,0,0,1,0,0,0, output/Abidi (fzr2PUYAAAAJ)/Naqvi2021-AnalyzingAssociation.bib,4,0,0,1,1,0,0,1,0,0,1,0 output/Neethirajan (8VZwF0sAAAAJ)/Neethirajan2022-BiologicalChemical.bib,2,0,0,0,1,0,0,0,0,0,1,0 output/Neethirajan (8VZwF0sAAAAJ)/Neethirajan2022-ChickTrackQuantitative.bib,4,0,0,1,1,0,0,1,0,0,1,0 -output/Neethirajan (8VZwF0sAAAAJ)/Azizat2022-LayingHen.bib,3,0,0,0,1,0,0,0,0,1,1,0 +output/Neethirajan (8VZwF0sAAAAJ)/Azizat2022-LayingHen.bib,4,0,0,0,1,0,0,1,0,1,1,0 output/Neethirajan (8VZwF0sAAAAJ)/Tweel2022-NonInvasive.bib,0,0,0,0,0,0,0,0,0,0,0,0 output/Abidi (fzr2PUYAAAAJ)/Daowd2021-BuildingKnowledge.bib,4,0,0,1,1,0,0,1,0,0,1,0 output/Keselj (uDKsmuIAAAAJ)/Charlebois2024-ImplicationsCarbonTaxing.bib,3,0,0,1,1,0,0,0,0,0,1,0 @@ -1979,7 +1979,7 @@ output/Orji (-1cHtBQAAAAJ)/Mulchandani2021-PersuasivenessGame.bib,2,0,0,0,1,0,0, output/Neethirajan (8VZwF0sAAAAJ)/Neethirajan2021-83Mapping.bib,2,0,0,1,0,0,0,0,0,0,1,0 output/Orji (-1cHtBQAAAAJ)/Oyebode2021-SleepFitPersuasive.bib,4,0,0,1,1,0,0,1,0,0,1,0 output/Ye (4OQaVGUAAAAJ)/Chen2020-SDATPSDN.bib,3,0,0,1,1,0,0,0,0,0,1,0 -output/Neethirajan (8VZwF0sAAAAJ)/Neethirajan2021-MeasuringAnimal.bib,0,0,0,0,0,0,0,0,0,0,0,0 +output/Neethirajan (8VZwF0sAAAAJ)/Neethirajan2021-MeasuringAnimal.bib,1,0,0,0,0,0,0,1,0,0,0,0 output/Orji (-1cHtBQAAAAJ)/Ndulue2021-STDPONG.bib,4,0,0,1,1,0,0,1,0,0,1,0 output/Gagie (aFCoq2YAAAAJ)/Ferragina2022-ImprovingMatrix.bib,3,0,0,1,1,0,0,0,0,0,1,0 output/Sharma (VHjAIe8AAAAJ)/Thakur2020-QScoredOpen.bib,4,0,0,1,1,0,0,1,0,0,1,0 @@ -2246,7 +2246,7 @@ output/Rahman (9SrqOewAAAAJ)/Shah2025-ImitationGameReproducing.bib,2,0,0,0,0,0,0 output/Oore (cI0dYX4AAAAJ)/Dumpala2021-SignificanceSpeakerEmbeddings.bib,2,0,0,0,0,0,1,0,0,0,1,0 output/Wu (IdBlVPUAAAAJ)/Zhou2020-NoiseContrastive.bib,1,0,0,0,0,0,0,0,0,0,1,0 output/Neethirajan (8VZwF0sAAAAJ)/Neethirajan2023-EthicalFrontierNavigating.bib,2,0,0,0,1,0,0,0,0,0,1,0 -output/Neethirajan (8VZwF0sAAAAJ)/Neethirajan2021-EthicsDigital.bib,3,0,0,0,1,0,0,0,0,1,1,0 +output/Neethirajan (8VZwF0sAAAAJ)/Neethirajan2021-EthicsDigital.bib,4,0,0,0,1,0,0,1,0,1,1,0 output/Abidi (fzr2PUYAAAAJ)/Young2020-ClinicalBiomechanical.bib,1,0,0,0,0,0,0,1,0,0,0,0 output/Matwin (rCoJeuYAAAAJ)/Matwin2020-DebunkingSome.bib,0,0,0,0,0,0,0,0,0,0,0,0 output/Rudzicz (elXOB1sAAAAJ)/Konate2025-ReliableCompositional.bib,0,0,0,0,0,0,0,0,0,0,0,0 @@ -2309,7 +2309,7 @@ output/Oore (cI0dYX4AAAAJ)/Dumpala2024-VISLABenchmark.bib,1,0,0,0,0,0,0,0,0,0,1, output/Milios (ME8aQywAAAAJ)/Dumpala2024-VISLABenchmark.bib,1,0,0,0,0,0,0,0,0,0,1,0 output/Mattheisen (uhlDFm4AAAAJ)/Erhardt2022-GenomicsEpigenomics.bib,3,0,0,0,1,0,0,1,0,0,1,0 output/Rudzicz (elXOB1sAAAAJ)/Haiqi2023-SystemMethod.bib,0,0,0,0,0,0,0,0,0,0,0,0 -output/Neethirajan (8VZwF0sAAAAJ)/Neethirajan2020-DigitalizationAnimal.bib,3,0,0,0,1,0,0,0,0,1,1,0 +output/Neethirajan (8VZwF0sAAAAJ)/Neethirajan2020-DigitalizationAnimal.bib,4,0,0,0,1,0,0,1,0,1,1,0 output/Abidi (fzr2PUYAAAAJ)/Youngshand2022-GaitBiomechanics.bib,4,0,1,1,0,0,0,1,0,0,1,0 output/Whidden (itc4x9kAAAAJ)/Ayyagari2022-TowardsLow.bib,0,0,0,0,0,0,0,0,0,0,0,0 output/Sajjad (t3BH6NkAAAAJ)/Badshah2025-CLEVLLMBased.bib,5,0,1,1,1,0,0,1,0,0,1,0 @@ -2569,8 +2569,7 @@ output/Gagie (aFCoq2YAAAAJ)/Gagie2024-MoveletTrees.bib,0,0,0,0,0,0,0,0,0,0,0,0 output/Rudzicz (elXOB1sAAAAJ)/Ge2024-WhatDo.bib,0,0,0,0,0,0,0,0,0,0,0,0 output/Gagie (aFCoq2YAAAAJ)/Gagie2021-CompactEuler.bib,0,0,0,0,0,0,0,0,0,0,0,0 output/Sharma (VHjAIe8AAAAJ)/Rajput2023-FECoMStep.bib,0,0,0,0,0,0,0,0,0,0,0,0 -output/Spadon (bfdGsGUAAAAJ)/Spadon2024-GravityInformed.bib,4,0,1,0,1,0,0,0,0,1,1,0 +output/Spadon (bfdGsGUAAAAJ)/Spadon2024-GravityInformed.bib,3,0,0,0,1,0,0,0,0,1,1,0 output/Spadon (bfdGsGUAAAAJ)/Spadon2023-BuildingSafer.bib,0,0,0,0,0,0,0,0,0,0,0,0 output/He (4yj_9skAAAAJ)/Lyu2022-RectangularRuler.bib,0,0,0,0,0,0,0,0,0,0,0,0 output/He (4yj_9skAAAAJ)/He2020-BreadthFirst.bib,0,0,0,0,0,0,0,0,0,0,0,0 -output/Sajjad (t3BH6NkAAAAJ)/Haider2026-MultiGranular.bib,1,0,1,0,0,0,0,0,0,0,0,0