Repository navigation
Releases: FormalLanguageConstrainedPathQuerying/FLPQ_Data
Release list
v6.1.2
Fixed
- The reachable-pair count columns of the graph tables were inconsistently
named (e.g.grammaron the biological_uniprot page, bare grammar names
on the rdf page); they are now uniformlyReachable pairs, with the rdf
page's per-grammar columns prefixedReachable pairs / <grammar>(#169). - The field-sensitive-alias pages rendered the edge label
f_r_ias a TeX
double subscript, which MathJax rejects with "Double subscripts: use
braces to clarify" (#173); the label is nowf_{r\_i}in the ten
per-graph Edges Statistics tables and the canonical-grammar block. - Seven grammar pages used
&alignment tabs in plain display math, which
MathJax rejects with "Misplaced &" (#174); the blocks are now wrapped in
\begin{aligned} ... \end{aligned}. - The eclass graph page's Source link (and the historical old_graphs
page's Origin link) pointed to a URL the hosting university removed from
its site; they now point to the archived original (Wayback Machine
snapshot of the eClassOWL 5.1.4 ontology file the original page
redirected to).
Changed
- The math-snippet guard now validates every docs-page and package-docstring
math snippet with the MathJax engine itself (mathjax 4.1.3 on Node,
utils/check_math_snippets_node.cjs) instead of hand-crafted patterns,
reporting the engine's own error message; the browser bundle is pinned to
the same version (mathjax_jsindocs/conf.py), and the guard also runs
as a pre-commit hook.
v6.1.1
Changed
- The contribution documentation is consolidated under the Dataset section:
new "Contributing data" and "File structure" pages; both sections are
removed from the Graphs page (now a pure catalog) and from the Dataset root.
v6.1.0
Added
- The
flpq-check-archiveconsole command (installed with the package):
validates a graph archive's structure, so contributors check their
archives withpip install flpq-dataalone — no script download. utils/add_reachable_pairs.py: derives the reachable-pairs rows of one
validated archive (one row per query directory, with the declared entry
count of itsresults.mtxasnum_reachable_pairs) and inserts them into
flpq_data/dataset/reachable_pairs.csv, preserving the file's sort order
and refusing duplicate rows and category disagreements.
Changed
-
The archive structure checker moved from
utils/check_archive_structure.py
toflpq_data/tools/(console commandflpq-check-archive); the S3 client
factory and bucket constants moved toflpq_data.dataset.s3. -
Data contributions are issue-first: a single "CONTRIBUTE NEW DATA" issue
carries one or more validated archives (one graph each), the per-archive
validation output and SHA256, and the motivation; maintainers upload and
merge the data into the dataset. The Graphs page documents the flow, the
four contribution cases, and the consistency invariants — no graph without
a query, no query without reference results, no item without description
and motivation.
Removed
- The
ADD NEW GRAPH/ADD NEW GRAMMARissue templates and the
new_graph/new_grammarPR templates: data has no PR path, and a
grammar is accepted only together with the archive that instantiates it as
a query with reference results. A generic PR template covers code
contributions.
v6.0.0
Added
- Optimized WCNF grammar variants for the
java_points_toand
c_alias_analysiscategories, taken from "Optimization of the Context-Free
Language Reachability Matrix-Based Algorithm" (arXiv:2401.11029,
optimization 5): every archive of the two categories now carries
java_points_to_muravev2024.cnf/c_alias_muravev2024.cnfalongside the
original grammar. Each variant follows the label convention of its archive
(indexedload_iform or bareloadfamily form) and was verified to
return identical reachable-pair counts to the original with FastMatrixCFPQ
on small graphs. - The graph tables on the website now list the download size of every
archive in aSize (MB)column — one unit (MB) for all graphs, from the
smallest (0.002 MB) to the largest (112.65 MB) archive. utils/upload_to_s3.pyreports the verified archive size (bytes and MB)
after each upload, and the newutils/archive_sizes.pychecks or updates
theSize (MB)column of the docs graph tables against the stored
archives on Yandex S3.- The publish workflow now runs on every pull request targeting
master: it
builds the sdist and wheel and publishes them to TestPyPI (skip-existing),
validating packaging before a release tag is cut. - Ruff as the linting and formatting gate (rules
E,F,W,Iplus
ruff format), replacing black; the codebase was brought in line in a
one-time pass. - Type checking with ty for fast local checks
and Pyright in CI; the package, tests, and utility scripts are now fully
type-checked. - A math-snippet guard in the test suite (
utils/check_math_snippets.py): it
scans every docs page and rejects math that MathJax cannot render — an
unescaped underscore inside a text-mode command group (e.g.
\textit{a_b}) — which previously surfaced only as an error on the
deployed site while the Sphinx build stayed green. - The MCFG readwrite module
flpq_data/queries/mcfpq/readwrite/mcfg.py: a
data model for multiple context-free grammars, lark-based parsing of the
Datalog-like.mcfgformat specified indocs/flpq.rst, semantic
validation (start symbol, dimension and rank), andmcfg_from_text/
mcfg_to_textwith round-trip guarantees plusmcfg_from_txt/
mcfg_to_txtfor file I/O. - The
categoryandquery_classcolumns ofreachable_pairs.csvand the
matching filters and row fields of thereachable_pairs()API: reference
counts are now keyed per graph category and query class (cfpq,rpq,
mcfpq). - The transition-system description style of the
.rsmformat: a query may
be written as an explicit labelled transition system in addition to the
CFG (EBNF) style, andrsa_from_textaccepts both. - Partial graph archives:
utils/check_archive_structure.py --partial
validates an archive that carries only new queries for an existing graph,
andutils/merge_archive.pymerges such a partial archive into the
existing full one. - The reachable-pairs table is republished, versioned, on the dataset object
storage (6.0.0/reachable_pairs.csv), exposed asREACHABLE_PAIRS_URLand
fetched into the local data cache bydownload_reachable_pairs(); once
downloaded,reachable_pairs()reads it instead of the bundled copy, so an
updated table is consumed without reinstalling the package. - The per-class "Applicable graphs" lists of the new query sections: a new
utils/applicable_graphs.pyrenders each class's list from
reachable_pairs.csv, grouped by graph category and cross-linking the
shared per-graph pages, in check or--updatemode. - The end-user core rework design is documented in
docs/flpq.rst(hub
#148): the core/maintenance boundary —flpq_data/is the end-user core
for dataset utilisation (benchmarks, statistical analysis), and dataset
maintenance (archive validation, upload, merge, registry generation) stays
in repo-onlyutils/scripts that are never installed with the wheel —
plus the per-graph registry, the machine-global versioned cache, the lazy
graph_dir()accessor, and the cache manipulation API. Implementation
follows in #150–#152. - A per-graph
registry.jsonbundled with the package (and to be published
to object storage as<version>/registry.json): for every graph — its
category, node and edge counts, archive size in MB, sha256, and the query
list with representations. It is generated by the repo-only
utils/generate_registry.py. The network-free metadata API exposes it:
graph_names()(all names),graph_info(name) -> GraphInfo, and
categories() -> dict[str, list[str]]— the category of each graph
(#147). - The machine-global cache API:
cache_root()(the effective root — the
FLPQ_DATA_CACHEenvironment variable or the OS default from
platformdirs),cached_versions()(the dataset versions present in the
cache), andclear_cache(keep=None)(remove the cached version
directories, optionally keeping one). - Streaming format conversion:
convert_graph(src, dst, *, src_format, dst_format)converts betweenmtx(a directory of MatrixMarket files),
txt,rdf, and the FastMatrixCFPQ.gtext (write-only) — plus an
in-memorynx.MultiDiGraphas source — over a lazy edge stream without
materializing a graph, so converting the largest archive (fs, 3.6M edges)
from MTX to TXT or.gruns in ~0.1 GiB of RAM instead of ~4 GiB (#138).
The streaming primitives:iter_edges_from_mtx_dir/mtx_dir_from_edges,
iter_edges_from_text/iter_edges_from_txt,iter_edges_from_rdf/
rdf_from_edges,iter_edges_from_graph, andg_text_from_edges.
Changed
- Filled 56 of the 60 previously "not available" reachable-pair reference
counts inreachable_pairs.csv(issue #130): the in-archiveresults.mtx
stubs of the affected graphs now carry the full Boolean reachability matrix,
computed with FastMatrixCFPQ using the language-equivalent low-memory
grammars where they exist (c_alias_muravev2024.cnf,
java_points_to_muravev2024.cnf, and the sparse uniprot grammar of issue
#157). 48 counts match independent reference values exactly; the 8
java_points_topairs with stale references were confirmed by the dataset
maintainer. The 4 pairs that exceed the 124 GB RAM compute host (libgdx /
name_resolution, unigraph_8/9/10) remain "not available"; per-pair run data
and the infeasibility rationale are recorded in
utils/stub_results_record.json. - The
publishworkflow gives every pull request targetingmastera unique
X.Y.Z.dev<run number>version on the runner before building, so each push
publishes a distinct TestPyPI pre-release instead of being skipped as an
existing file; the commit SHA is recorded in the run's step summary. The
committed version and the tag/PyPI release path are unchanged. - Breaking: the package is renamed
cfpq_data->flpq_data(PyPI
distributionflpq-data) andgrammars/is restructured into
queries/{cfpq,rpq,mcfpq}/— the module tree gains the same query-class
level as the site, per the FLPQ design indocs/flpq.rst. The flat
top-level API is unchanged apart from the renames below; import the new
names (from flpq_data import *). download(name)becomesgraph_dir(name), which is lazy: it returns the
local graph folder from a machine-global, per-user cache (the
FLPQ_DATA_CACHEenvironment variable or the OS default from
platformdirs) keyed by dataset version, and downloads only on a cache
miss — the archive is sha256-verified against the registry before it is
installed.download_graph(name)anddownload(name)remain as deprecated
aliases. TheDATASETregistry list is replaced by thegraph_names()
function backed by the per-graphregistry.json;DATASET_URLnow serves
the6.0.0/graph/prefix.- Development tooling migrated from Poetry to uv:
PEP 621 project metadata with hatchling as the build backend, PEP 735
dependency groups (dev,test,docs) instead of Poetry groups and the
setup.pyextras, a committeduv.lock, and all CI workflows on
astral-sh/setup-uv. - The labeled graph generators type their
labelsparameter as
Sequence[str], correctly accepting both a single label string and a
sequence of labels (previously annotatedList[str]despite the string
default). - The dataset on object storage moved to the 6.0.0 self-contained archive
layout: each graph archive carries its queries under
queries/<class>/<query>/(every representation plus oneresults.mtx)
instead of a separate top-levelgrammar/directory, and the website's
download links andSize (MB)tables point at the new prefix. - The website's Dataset section is restructured into per-class query sections
(CFPQ, RPQ, MCFPQ): the flat Grammars section is replaced by one section per
class with its templates and an "Applicable graphs" list, and the "How to
add a new grammar?" pointer moves to the Dataset page. utils/merge_archive.pyrefuses to merge a partial archive whose new query
directory has no row inreachable_pairs.csv(same graph and query class,
with the query directory name as the stem of the row's grammar file), so the
registry cannot drift.- Breaking: the RDF output of
graph_to_rdfis now valid RDF 1.1 Turtle
— IRI nodesurn:flpq:node:<id>and IRI predicatesurn:flpq:label:<label>,
streamed line by line without an in-memory store; files written by older
versions (blank-node endpoints with a Literal predicate) remain readable.
RDF is a set of triples, so parallel edges with identical(u, label, v)
collapse on write — as before. graph_to_textemits one line per edge using the edge'slabelattribute
(the conventiongraph_to_mtx_diralready required) instead of one line
per value in the edge data dict.- The per-graph docs pages no longer carry a
Versionrow in their Info
...
v5.0.0
Added
- Expanded the graph dataset to 113 labeled directed graphs across eight
families: C alias analysis (from "Demand-driven Alias Analysis for C", #2),
RDF/OWL, Java points-to, field-sensitive alias, context-sensitive data-flow,
data provenance (#16), name resolution (stack graphs), and biological graphs
from UniProt for subgraph queries by context-free grammars (#26). download_grammars()to fetch per-graph and example grammars for the
c_alias,dyck,java_points_to, andnested_parenthesestemplates.download_benchmark()to fetch benchmark data (e.g.MS_Reachability).graph_to_mtx_dir(), a writer for the per-label MatrixMarket format.- A developer guide covering pre-commit, the test pipeline, docs build and
deploy, package deploy, and contribution guidelines (#76). - Release process documentation and a tag-triggered PyPI publish workflow
(Trusted Publishing) with a manual TestPyPI validation run (#75, #33). - A docs prebuild for pull requests: the no-warnings docs build and the full
link check now run in CI on every push and PR (#74). - Reference reachable-pair counts for graph × grammar pairs, computed with the
FastMatrixCFPQ reference implementation and exposed viareachable_pairs()
and a downloadable CSV (#32).
Changed
- Breaking: graph archives are now distributed in the mtx-per-label
format (one Boolean MatrixMarket file per edge label) instead of CSV.
download(name)returns a directory; load a graph with
graph_from_mtx_dir(path / "graph"). - Breaking: the minimum Python version is now 3.11 (was 3.8).
- The whole dataset is served from a single versioned prefix (
5.0.0/graph/);
indexed-label files use the bare<label>.mtxname. - Updated dependencies: networkx 3.6, pandas 2.3, rdflib 7.6, pyformlang 1.0.1,
requests 2.33.
Fixed
- Broken function documentation links on the Graphs page; unresolved
cross-references now fail the docs build (nitpicky mode, no-warnings policy),
and the full link check runs in CI and the pre-merge quality gate (#122).
Notes
- This release completes most of the long-standing "Make CFPQ_Data better"
backlog (#28): its earlier sub-items (networkx-based graph generators #27,
updated synthetic graphs #30, graph size information #20) shipped in previous
releases and remain in effect. The static-analysis data item (#2) is only
partially complete: the "Demand-driven Alias Analysis for C" graphs are now
documented with their source, while the "Batch Alias Analysis" data is still
missing.
✨ 🚀 ✨ CFPQ_Data 3.0.0
✨ 🚀 ✨ CFPQ_Data 2.0.0
✨ Move from RDF to CSV format for graphs
✨ Abandoned Python 3.7
✨ Deprecated RSM (use RSA instead)
1.0.2
- Update actions
- Update dependencies
- Use
rdflib.parseinstead ofrdflib.load - Remove
numpyfrom dependencies
1.0.1
🔧 Fixed bugs with change_edges() and graph_to_txt()
⚙️ Improved tests coverage
🚀 Added quoting, progress bar and new graph utilities
📝 Improved documentation
1.0.0
Release 1.0.0
- Website: https://jetbrains-research.github.io/CFPQ_Data
- Tutorial: https://jetbrains-research.github.io/CFPQ_Data/tutorial.html
- Documentation: https://jetbrains-research.github.io/CFPQ_Data/reference/index.html
- Source Code: https://github.com/JetBrains-Research/CFPQ_Data
- Bug Tracker: https://github.com/JetBrains-Research/CFPQ_Data/issues