Most of our work has resulted in scholarly publications. On this page you can review our publications to get an idea about our work.
Rendements et réserve en Champagne, 2000-2026. Série annuelle des décisions de l'interprofession et des textes qui les encadrent
November, 2026 • Dataset
Petit, Philippe
En Champagne, la quantité de raisins qu'un exploitant peut commercialiser chaque année n'est pas le rendement de l'appellation inscrit au cahier des charges (12 400 kg/ha), mais un volum…
En Champagne, la quantité de raisins qu'un exploitant peut commercialiser chaque année n'est pas le rendement de l'appellation inscrit au cahier des charges (12 400 kg/ha), mais un volume fixé chaque année, en général en été, par l'interprofession, réunie au sein du Comité interprofessionnel du vin de Champagne. La part récoltée au-delà de ce volume peut être mise en réserve, dans la limite d'un rendement butoir et d'un plafond par hectare, puis libérée les années suivantes. Cette fiche rassemble, vendange par vendange de 2000 à 2026, le volume commercialisable ou le seuil de mise en réserve, les plafonds et les sorties de réserve, chaque valeur étant rattachée à sa source. Elle distingue deux régimes : la réserve qualitative jusqu'en 2006, puis la réserve individuelle à partir de la récolte 2007. Le volume commercialisable varie entre 8 000 kg/ha (2020) et 12 400 kg/ha (2007 et 2008) ; il baisse chaque année depuis 2023 pour atteindre 8 800 kg/ha en 2026.
In Champagne, the quantity of grapes a grower may market each year is not the appellation yield written in the product specification (12,400 kg/ha) but a volume set each year, usually in summer, by the interprofessional body, the Comité interprofessionnel du vin de Champagne. Grapes harvested above that volume may be placed in a reserve, within a maximum yield and a per-hectare ceiling, and released in later years. This data sheet compiles, harvest by harvest from 2000 to 2026, the marketable volume or reserve threshold, the ceilings and the releases from reserve, each value linked to its source. It distinguishes two regimes: the qualitative reserve until 2006 and the individual reserve from the 2007 harvest. The marketable volume ranges from 8,000 kg/ha (2020) to 12,400 kg/ha (2007 and 2008); it has fallen every year since 2023, to 8,800 kg/ha in 2026.
Version 1.0 du 10 novembre 2026. Fiche de données n° 2 de l'Observatoire VITACEAE. Travail documentaire fondé exclusivement sur des sources publiques ; ni conseil juridique, ni conseil fiscal, ni conseil patrimonial. Page Observatoire : https://vitaceae.fr/observatoire/rendement-et-reserve-champagne/
Added
Added pyproject.toml, replacing setup.py, setup.cfg, pytest.ini and .bumpversion.cfg.
Added mkdocs.yml and a mkdocs-material documentation site.
Added .github/workflows/pr-checks.yml.
Added reg…
Added
Added pyproject.toml, replacing setup.py, setup.cfg, pytest.ini and .bumpversion.cfg.
Added mkdocs.yml and a mkdocs-material documentation site.
Added .github/workflows/pr-checks.yml.
Added regression baselines for every example under tests/baseline, captured from 0.8.6 behaviour.
Added regression tests that add_node and add_edge accept both vocabularies, reject a mismatched element, and survive a JSON round trip and a copy().
Added Diagram.node_connected_edges, which returns the edges incident to a node.
Added TopologyDiagram.__from_data__, which restores the integer keys of the trail bookkeeping after a round trip.
Added regression tests that trails and auxiliary trails survive a JSON round trip.
Added plotters/scene_objects.py and viewers/scene_objects.py, replacing the artist and object modules of both visualization backends.
Added tests/baseline/render.py, which renders every example headless for visual review of the plotters.
Added ghpython/scene_objects.py, replacing ghpython/artists.py with compas.scene scene objects that register themselves in the Grasshopper context.
Added src/compas_cem/ghpython/yak_template/, holding the manifest.yml and the package icon that yakerize wraps the built components with.
Added the build_cpython_ghuser_components, update_gh_header, yakerize and publish_yak tasks to tasks.py, together with the ghuser_cpython and yak configuration blocks they read.
Added a static instanceGuid to all 39 component metadata.json files. The componentizer mints a fresh random GUID whenever the field is absent, so every build emitted different GUIDs and broke the components already placed in a .gh file.
Added a dev-docs job that publishes the documentation built from main as the dev version. compas-actions.docs deploys mkdocs on a version tag only, so between releases the site would otherwise show the last release and nothing newer.
Added a concurrency group to the build, docs and pull request workflows, so pushing to a pull request cancels its own in-flight run instead of queueing a second one. Pushes and tags keep a run-unique group, so a stuck run cannot hold up a deploy.
Added workflow_dispatch to the build and docs workflows, so either can be run by hand.
Added the yak publish to the release workflow. After the PyPI upload, which the components' # r: header installs from, it packages the components with invoke yakerize and pushes them with invoke publish-yak, authenticated by the YAK_TOKEN secret. compas-actions.publish only builds the components, so no release had reached the Rhino package server. The push cannot be rehearsed on the test server: it is wiped each night and keeps its own records, so it rejects the API key that yak login --ci issues on the production server. A manual run that pushed there built and packaged the components on Windows, then failed with a 401.
Added a viz extra, read from requirements-viz.txt, holding compas_plotter>=1.0.1 and compas_viewer>=2.0, the backends of compas_cem.plotters and compas_cem.viewers. They stay out of the core install so that compas_cem stays lean inside Rhino 8, where the viewer would otherwise pull in PySide6 and PyOpenGL for nothing. The dev extra includes them. Importing either module without them raises an ImportError that names the extra.
Added a Made with COMPAS badge and a badge linking to the Computer-Aided Design article underpinning the framework to README.md.
Added a pre-commit configuration with ruff check and format, whitespace, end-of-file, YAML, TOML, JSON and merge-conflict checks, and a check that fails when a personal name appears in project prose outside the authorship files, or in a commit message. invoke lint runs ruff check --fix on src and tests only and never checks formatting, so the hook is the only check on formatting, examples and tasks.py. A pre-commit job in the pull request checks runs every hook on every file, so these checks also gate merges; commit messages are checked locally only.
Changed
Migrated from COMPAS 1.17.10 to compas>=2.15,<3.0.
Rewrote the installation instructions around pip and venv. conda is being phased out across the COMPAS ecosystem, and compas no longer needs installing separately because compas_cem declares it.
Marked the Grasshopper plugin as not installable in this release. It linked into Rhino 6 and 7 through compas_rhino.install, which COMPAS 2 removed.
Renamed Constraint to Goal throughout, a clean break with no deprecation aliases. The nine concrete classes, the VectorConstraint and FloatConstraint bases, the constraints module, Optimizer.add_constraint and remove_constraint, and the eight Grasshopper component directories all follow. This frees the name Constraint for genuine hard constraints, which nlopt supports and the package does not yet use.
Made Diagram.add_node and Diagram.add_edge accept either a node or edge element, or a key with attributes. COMPAS 2 deserializes a graph by replaying add_node(key=, attr_dict=) and add_edge(u, v, attr_dict=), which the object-taking overrides shadowed, breaking copy() and from_json(). Both entry points now dispatch on the argument, so the authoring API is unchanged and deserialization reaches the base graph.
Made the entry points reject a mismatched element rather than silently treating it as a node key: add_node refuses an edge element, add_edge refuses a node element, and a key given both positionally and by name raises.
Folded NodeMixins and EdgeMixins into Diagram and dropped compas_cem.data.Data from its bases. Datastructure.__inheritance__ walks the MRO up to Datastructure calling __clstype__() on every class in between, so a plain object mixin made to_json() raise.
Changed the tol diagram attribute from a format string to an integer count of decimal places, following compas.tolerance.TOL.geometric_key.
Ported serialization from the data property pair to __data__ and __from_data__ on goals and on edge and node parameters.
Gave Goal, Parameter, EdgeParameter and NodeParameter default constructor arguments, so __from_data__ can build one without knowing the concrete signature.
Regenerated examples/03_bridge_2d.json, which was COMPAS 1.7.1 JSON and unreadable by COMPAS 2. Node and edge insertion order is preserved, because it sets the order of the optimizer's parameter vector.
Changed requires-python from >=3.8 to >=3.9,<3.14, and both CI matrices to 3.9 through 3.13, now that the distutils ceiling is gone. The floor is 3.9 because Rhino 8 runs CPython 3.9 and every Grasshopper component installs this package into it; a 3.10 floor made that install fail. The macOS cell for 3.9 is left out because compas-actions.build skips it without running anything.
Replaced the reStructuredText module docstrings and inline markup with Markdown, and moved parameter and return types out of docstrings and into the signature position that mkdocstrings renders.
Migrated the plotters from compas_plotters artists to compas_plotter>=1.0.1 scene objects, and the viewers from compas_view2 objects to compas_viewer>=2.0 scene objects. Both register through compas.scene.register on import, because compas discovers scene object plugins in compas* packages only.
Pinned the plotter node size policy to relative. The upstream scene object defaults to absolute, which divides the node size by the plotter resolution instead of the node count and draws markers two orders of magnitude smaller.
Drew the topology load crosses straight onto the canvas. A line scene object fixes its own stacking order in its constructor, which put the crosses underneath the opaque node markers.
Fixed state_format in both visualization backends reading an undefined edge instead of the edge it was passed.
Fixed DiagramObject referring to self.topology, which it never defined.
Fixed a show_nodes setter that assigned to _show_edges.
Fixed DiagramArtist.draw_reactions documenting a min_load parameter that its signature calls min_force, and TopologyDiagramObject documenting its argument as form_diagram.
Renamed ghpython/components/ to ghpython/components_cpython/, matching compas_fab and the CPython-only component format that Rhino 8 loads.
Named every Grasshopper component <name> (COMPAS CEM) instead of COMPAS CEM: <name>. The componentizer only knows a prefix, so the suffix lives in each metadata.json name and the prefix settings in tasks.py and release.yml are gone. The instance GUIDs are unchanged, so components already placed in a definition still resolve.
Renamed the Form Artist and Topology Artist components to Draw Form and Draw Topology, and the 08_Artists subcategory to 08_Visualization. Their directories are now CompasCem_DrawForm, CompasCem_DrawTopology and CompasCem_Colors. COMPAS 2 replaced artists with scene objects, so the artist vocabulary was legacy. The instance GUIDs are unchanged. A plotter docstring and the quick start example drop the word too.
Made the Constrained Form-Finding component solve in-process. It solved through compas.rpc.Proxy, which finds its interpreter through the compas_bootstrapper module that the COMPAS 1 Rhino installer wrote, so under COMPAS 2 it launched whatever python was on Rhino's path, without compas_cem. Rhino 8 runs CPython, so nlopt and autograd run inside Rhino and the component drives Optimizer directly, as the Python examples do.
Ported all 39 Grasshopper components to Rhino 8 CPython: a # r: compas_cem>=0.9.0 requirements header, Grasshopper.Kernel.GH_ScriptInstance in place of ghpythonlib.componentbase.executingcomponent, PEP 484 annotations on RunScript, and the injected ghenv.Component in place of self, which is no longer the component.
Ported the 13 components that read Rhino geometry from the removed compas_rhino.geometry.Rhino* wrappers to the compas_rhino.conversions functions that replaced them.
Annotated component inputs as optional where Grasshopper passes None for an unconnected input, under from __future__ import annotations so that Rhino 8, which is CPython 3.9, does not evaluate the unions at definition time.
Read node positions in the Grasshopper scene objects from the scene object rather than from the diagram, so a transformation set on the object applies to everything it draws.
Built the documentation on Python 3.12 instead of the compas-actions.docs default of 3.10. On 3.10 the resolver pairs pymdown-extensions 12, whose highlighter gained a required argument, with mkdocstrings 1.0.6, the last release for 3.10, which does not pass it, so every API page fails to render.
Moved the release publish job from ubuntu-latest to windows-latest and gave it the component-building inputs, because the componentizer loads GH_IO.dll.
Fixed _draw_forces normalizing a force vector before testing its magnitude, which divided by a zero length at a node carrying no load or reaction.
Fixed the Draw Form and Draw Topology components passing their diagram positionally to the scene object. The first parameter of a COMPAS 2 graph scene object is show_nodes, so the diagram never reached the object and every draw failed on a None graph. Both now pass it as item.
Fixed the Export Diagram component returning diagram.data, which COMPAS 2 replaced with __data__, so it raised after writing the file. It now returns the JSON string it wrote, from to_jsonstring, which from_jsonstring can read back.
Fixed draw_reactions raising on a node with no connected edge, where it searched an empty sequence for the strongest edge force.
Fixed the topology JSON import component declaring a class named FormDiagramFromJSON and documenting itself as importing a form diagram.
Fixed a typeHinID misspelling in the Draw Topology component's metadata.json, which left two of its inputs without a type hint.
Replaced rs.AddPoint in the support node results component with point_to_rhino. The rhinoscriptsyntax call bakes a point into the Rhino document instead of returning geometry to the component output.
Returned an empty list rather than None from the topology draw methods when a selection is empty.
Fixed the five Python example pages showing --8 < --"examples/…" instead of the example source. A pymdownx snippet marker is valid python, so ruff format reformatted it as an expression inside the fenced block and the include stopped resolving. Markdown is now excluded from the formatter.
Moved the documentation from Sphinx and reStructuredText to mkdocs-material with mkdocstrings.
Converted README, CHANGELOG and AUTHORS from reStructuredText to Markdown.
Replaced the abandoned pytest-lazy-fixture with pytest-lazy-fixtures, which lifts the pytest<8 ceiling.
Rewrote tasks.py to compose compas_invocations2 tasks.
Updated CI to compas-actions.build@v5, compas-actions.docs@v5 and compas-actions.publish@v3.
Replaced the Zenodo badge in README.md with a static shields.io badge on the concept DOI 10.5281/zenodo.5705740, which always resolves to the latest deposit. The badge Zenodo generates is rendered on request and frequently times out behind the GitHub image proxy, so it showed up broken.
Fixed the badges and links in README.md. The Python badge read the classifiers of the latest PyPI release, so it showed 3.8 and 3.9; it now reads requires-python from pyproject.toml on main. The documentation links pointed at Sphinx pages the mkdocs site does not have, and the COMPAS tutorial and API links at pages COMPAS 2 moved. The build badge uses the current workflow badge URL.
Shrank the header animation from 3200 by 1800 pixels and 76.5 MB to 1280 by 720 pixels and 13.5 MB, renamed it staircase.gif, and linked it from README.md by absolute URL. PyPI does not host the repository's files, so the relative path showed as a broken image on the package page.
Replaced flake8, isort, doc8 and pydocstyle with ruff, and reformatted the code base to 88 columns.
Loosened dependency version from numpy<2 to numpy>=1.26. The upper bound was never necessary; the test suite passes on numpy 2.
Pinned ruff to 0.16.1 in requirements-dev.txt, matching the pre-commit hook, so the hook, invoke lint and CI run the same ruff.
Replaced the stale master branch with main in CONTRIBUTING.md and dropped it from the pull request checks trigger.
Removed
Removed the dependency on trimesh. It was never imported: its only reference is optimization/goals/mesh.py, which is commented out of the package.
Removed .travis.yml, which targeted Python 2.7.
Removed the compas_cem.diagrams.mixins package, folded into Diagram.
Removed Diagram.connected_edges, superseded by node_connected_edges. COMPAS 2 gives the inherited name a different meaning: it takes no node and returns edge groups per connected component.
Removed plotters/proxy.py. It was dead code calling a FormPlotter and a TopologyPlotter that no longer exist.
Removed the FormArtist, TopologyArtist and DiagramArtist plotter classes and the register_artists plugin, superseded by the plotter scene objects.
Removed ghpython/install.py and ghpython/uninstall.py, and with them the installable_rhino_packages and after_rhino_install plugin hooks. Grasshopper components ship through yak only.
Removed ghpython/artists.py and ghpython/register.py, superseded by the Grasshopper scene objects, which register on import as the plotter and viewer ones do.
Removed the __all_plugins__ declaration from compas_cem/__init__.py, which named the three deleted modules.
Removed the Proxy Server Grasshopper component. It only started and stopped the RPC server that the Constrained Form-Finding component no longer uses.
Removed optimization.solve_proxy and the compas_cem.PROXY_PORT constant. They existed only for the RPC call that the Constrained Form-Finding component no longer makes. A solver that cannot run inside Rhino, such as a JAX backend on Rhino 8's Python 3.9, would need its own entry point, not this nlopt wrapper.
Removed isAdvancedMode from all 39 component metadata.json files. It only meant anything to the Rhino 7 IronPython component format.
citesync generates and synchronizes software citation metadata across CITATION.cff, CodeMeta, Zenodo and package files using CodeMeta crosswalks. Use the CLI or pre-commit hook to keep repository meta…
citesync generates and synchronizes software citation metadata across CITATION.cff, CodeMeta, Zenodo and package files using CodeMeta crosswalks. Use the CLI or pre-commit hook to keep repository metadata consistent, or generate citation files in the browser playground. It also checks and updates Typst and Quarto plugin manifests. Imports include Python, Rust, npm, R and Julia package metadata; the CLI and playground also export BibTeX, CSL-JSON, APA, JSON-LD, DataCite XML, RIS and EndNote citations, and the CLI prints CITATION.cff, CodeMeta and Zenodo files made from the source. It flags codemeta.json keys that are not CodeMeta terms, and checks RO-Crate and Croissant dataset files against the source.
Soil Spectral Library of Québec (SLiQ) is a three-dimensional soil spectral library with visible and near-infrared spectral data and 34 soil properties, including texture classes and subclasses…
Soil Spectral Library of Québec (SLiQ) is a three-dimensional soil spectral library with visible and near-infrared spectral data and 34 soil properties, including texture classes and subclasses, soil organic matter, various nutrients and heavy metals, as well as pH. The soil data are derived from soil analyses at the IRDA laboratory, while spectral measurements were taken at McGill University.
Proper time, the photon and quantum entanglement: clues that time is a layer over non-time
November, 2026 • Preprint
Decoppet, Guillermo Omar
This work proposes a reading of time not as one more dimension of space, but as a process with an update frequency of a substrate. Starting from the variability of time with velocity and gravity, it i…
This work proposes a reading of time not as one more dimension of space, but as a process with an update frequency of a substrate. Starting from the variability of time with velocity and gravity, it is argued that time is a process with a rate, and that the speed of light c expresses the rhythm of that refresh. From there, two cases that share the same structure are analyzed: the photon, which at speed c accumulates no temporal succession; and quantum entanglement, which shows correlations without signal transmission in temporal succession. The central thesis is that the substrate is, in its base condition, atemporal, and that temporal succession is an update layer that enables change without eliminating that base simultaneity.
proper time, update frequency, temporal substrate, speed of light, photon, quantum entanglement, simultaneity, emergence of time
Molecular Structures and Quantum Chemical Properties Across Four Charge–Spin States
November, 2026 • Dataset
Tang, Miao-Jiong, Hong, Xin
This HDF5 dataset contains molecular structures and quantum-chemical properties across four charge–spin states: 120,280 neutral singlets (charge 0, multiplicity 1), 101,772 cation singlets (char…
This HDF5 dataset contains molecular structures and quantum-chemical properties across four charge–spin states: 120,280 neutral singlets (charge 0, multiplicity 1), 101,772 cation singlets (charge +1, multiplicity 1), 101,727 anion singlets (charge −1, multiplicity 1), and 107,399 neutral doublet radicals (charge 0, multiplicity 2). In total, it provides 431,178 molecular snapshots, 427,134 associated molecule records, and 1,154 molecular formula records. The snapshot geometries contain 7,618,001 atom occurrences in total, counted across snapshots.
Each snapshot stores atomic numbers, Cartesian coordinates, bonding and formal-charge information, and available quantum-chemical properties such as energies, forces, orbital energies, vibrational data, atomic charges, and spin densities. Associated molecule records include SMILES, charge, spin multiplicity, and molecular descriptors. Records and internal links use UUIDv4 identifiers. The HDF5 file provides compressed UTF-8 JSON records, offset arrays, and lookup indices for local access without a database connection.
The Chapel programming language recently added support for the RISC-V architecture. Here we discuss what changes were needed for Chapel to work on RISC-V as well as lessons learned from the porting pr…
The Chapel programming language recently added support for the RISC-V architecture. Here we discuss what changes were needed for Chapel to work on RISC-V as well as lessons learned from the porting process. We use some of Chapel's extensive benchmark suite to gain further insight into the suitability of the RISC-V architecture for future HPC use. We compare performance on SiFive P550 and Unmatched boards and a Sophon SG2042 with a variety of other recent HPC CPU platforms. Various portability and performance anomalies arose on different architectures and are discussed. While the RISC-V machines represent smaller preliminary offerings and not HPC-class hardware, these results still provide hope that RISC-V hardware can become viable for HPC in the near future.
Approved by Los Alamos National Laboratory as LA-UR-26-30092
Preprint: https://arxiv.org/abs/2608.14799
Data: https://zenodo.org/records/23780066
Reproducibility Package for A Semantic Data Validation Method for Cross-Domain Digital Twins (ExplAI-2026, Paper 23)
November, 2026 • Software
Osolinskyi, Oleksandr, Bykovyy, Pavlo
This archive provides the experimental software, synthetic test datasets, validation results, and reproducibility materials supporting the paper "A Semantic Data Validation Method for Cross-Domain Dig…
This archive provides the experimental software, synthetic test datasets, validation results, and reproducibility materials supporting the paper "A Semantic Data Validation Method for Cross-Domain Digital Twins" (ExplAI-2026, Paper 23).
The research builds upon the open DTwin Stage1 v1.0.0 package (DOI: 10.5281/zenodo.18894841) and investigates semantic validation of telemetry data against attribute specifications, measurement dictionaries, and registered digital twin objects.
The archive includes four experimental components:- v0.4 — Attribute Specification Validation: Validation rules for 48 occurrences of key attributes across 37 entity types, evaluated using 134 synthetic test cases.- v0.5 — Telemetry Semantic Validation: Evaluation of structural, semantic, and format checks using 55 telemetry messages.- v0.6 — Entity-Instance-Aware Validation: Validation of 35 messages against a registry of 13 simulated digital twin objects, including rule-based explanations of rejected data.- v0.7 — Impact on Anomaly Detection: Evaluation of semantic data errors using 240 synthetic building-monitoring cycles and an unchanged Isolation Forest model.
The package contains Python source code, prepared experimental data, saved results, execution instructions, and integrity verification information.The experiments use controlled synthetic test cases with predefined violations. The reported results verify the operation of the implemented validation rules under these conditions and do not establish their general detection performance on independent real-world sensor streams.The materials are provided to support transparency, reproducibility, and further research on semantic validation and trustworthy digital twin systems.
Digital TwinsSemantic ValidationInternet of ThingsTelemetry DataAttribute Constraints
There is an increasing interest in upgrading the EModel, a parametric tool for speech quality estimation, to the wideband and super-wideband contexts. The
Contemporary models of Unmanned Aerial Vehicles (UAVs) are largely developed using simulators. In a typical scheme, a flight simulator is dovetailed with a
Undertaking engineering research can be compounding for beginning graduate students and thwarting even for seasoned researchers. With a wealth of academic
To provide the best experiences, we use technologies like cookies to store and/or access device information. Consenting to these technologies will allow us to process data such as browsing behavior or unique IDs on this site. Not consenting or withdrawing consent, may adversely affect certain features and functions.
Functional
Always active
The technical storage or access is strictly necessary for the legitimate purpose of enabling the use of a specific service explicitly requested by the subscriber or user, or for the sole purpose of carrying out the transmission of a communication over an electronic communications network.
Preferences
The technical storage or access is necessary for the legitimate purpose of storing preferences that are not requested by the subscriber or user.
Statistics
The technical storage or access that is used exclusively for statistical purposes.The technical storage or access that is used exclusively for anonymous statistical purposes. Without a subpoena, voluntary compliance on the part of your Internet Service Provider, or additional records from a third party, information stored or retrieved for this purpose alone cannot usually be used to identify you.
Marketing
The technical storage or access is required to create user profiles to send advertising, or to track the user on a website or across several websites for similar marketing purposes.