Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Setup publiopti #1697

Merged
merged 25 commits into from
Feb 27, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
25 commits
Select commit Hold shift + click to select a range
ddead8a
fix(pkg): upgrade to publiopti@0.1.18
EmileRolley Feb 2, 2023
38eab87
fix: remove targets from modelOptim.js
EmileRolley Feb 2, 2023
fc67833
fix(optim): use the publiopti@0.1.20 with a hack to avoid compressing…
EmileRolley Feb 2, 2023
abcfd8a
test(optim): migrate the publiopti source code inside the model repo
EmileRolley Feb 6, 2023
66c64e6
test(optim): add optimizedTargets
EmileRolley Feb 7, 2023
62d3ca7
fix(optim): using the latest version of both publiopti and publicodes
EmileRolley Feb 13, 2023
dafeff1
fix(optim): remove legacy test with local publiopti scripting files
EmileRolley Feb 13, 2023
088dd34
fix(optim): add optimized targets: 'logement . gaz' and 'pétrole . vo…
EmileRolley Feb 14, 2023
25c1cd6
fix(data): icone -> icônes
EmileRolley Feb 14, 2023
d9cc8d3
feat(optim): use a predicate instead of a list of rule's name
EmileRolley Feb 14, 2023
6f89a70
feat(optim): publiopti@0.1.23
EmileRolley Feb 14, 2023
7bd5841
fix(data): no standalone 'somme' in 'empreinte nationale.yaml'
EmileRolley Feb 15, 2023
647eb59
refactor(data/i18n): add region code for all localized models
EmileRolley Feb 15, 2023
633dcd8
refactor(scripts/optim): support model optimisation in rulesToJSON + …
EmileRolley Feb 15, 2023
c7c8a08
refactor(scripts): one more pass of refactoring for rulesToJSON
EmileRolley Feb 16, 2023
f089c44
pkg: publiopti@0.1.24
EmileRolley Feb 20, 2023
d3e93db
fix: add regionCode in the CI report
EmileRolley Feb 20, 2023
a6d6ee4
fix(optim): keep the 'logement . gaz . biogaz' rule from optim
EmileRolley Feb 21, 2023
14061c9
docs(optim): add an explanation for rulesToKeep
EmileRolley Feb 21, 2023
3c26686
refactor(test): split testPersonas into two separate files
EmileRolley Feb 27, 2023
ed8f56a
refactor(test): switch to JS files instead of TS
EmileRolley Feb 27, 2023
d259a2c
feat(test): add regression test on optimisation
EmileRolley Feb 27, 2023
757882e
ci: fix the optim test uploading result
EmileRolley Feb 27, 2023
a8ea65a
typo(test/optim): more precise title
EmileRolley Feb 27, 2023
dbbfe1d
pkg(publiopti): upgrade to 0.1.25
EmileRolley Feb 27, 2023
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 12 additions & 1 deletion .github/workflows/upload-compilation-result.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ jobs:
check-translation-result: ${{ steps.check-translation.outputs.result }}
check-personas-result: ${{ steps.check-personas.outputs.result }}
test-personas-result: ${{ steps.test-personas.outputs.result }}
test-optim-result: ${{ steps.test-optim.outputs.result }}
test-url: ${{ steps.set-test-url.outputs.fr }}
steps:
- uses: actions/checkout@v3
Expand Down Expand Up @@ -53,7 +54,15 @@ jobs:
- id: test-personas
run: |
# Test the personas bilans against production
body="$(yarn test:md 2> /dev/null| tail --lines=+3 | head --lines=-1)"
body="$(yarn test:personas --markdown 2> /dev/null| tail --lines=+3 | head --lines=-1)"
body="${body//'%'/'%25'}"
body="${body//$'\n'/'%0A'}"
body="${body//$'\r'/'%0D'}"
echo "::set-output name=result::${body}"
- id: test-optim
run: |
# Test the personas bilans against production
body="$(yarn test:optim --markdown 2> /dev/null| tail --lines=+3 | head --lines=-1)"
body="${body//'%'/'%25'}"
body="${body//$'\n'/'%0A'}"
body="${body//$'\r'/'%0D'}"
Expand Down Expand Up @@ -100,6 +109,8 @@ jobs:

${{ needs.compile.outputs.test-personas-result }}

${{ needs.compile.outputs.test-optim-result }}

" > artifacts/result.md
- name: Upload artifact
uses: actions/upload-artifact@v1
Expand Down
4 changes: 2 additions & 2 deletions data/alimentation/alimentation.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -563,7 +563,7 @@ alimentation . petit déjeuner . type . aucun:
Vous ne mangez rien au petit déjeuner (mais vous pouvez boire un café, un thé ou un chocolat chaud pris en compte dans une autre question).

alimentation . local:
icone: 🍅🇫🇷
icônes: 🍅🇫🇷

alimentation . local . empreinte:
titre: Bonus régime local
Expand Down Expand Up @@ -640,7 +640,7 @@ alimentation . local . part locale:
🧮 Le calcul détaillé est [disponible ici](<https://github.com/datagir/nosgestesclimat/blob/master/data/alimentation/alimentation . local.ods>) sous forme de tableur.

alimentation . de saison:
icone: 🍅🌞
icônes: 🍅🌞

alimentation . de saison . empreinte:
titre: Bonus régime de saison
Expand Down
196 changes: 99 additions & 97 deletions data/empreinte SDES/empreinte nationale.yaml
Original file line number Diff line number Diff line change
@@ -1,20 +1,21 @@
empreinte SDES:
titre: Empreinte carbone par français estimée par le SDES
description: |
Le calcul de l'empreinte carbone individuelle française proposé ici est issu des travaux du SDES pour l'année **2017**.
Le calcul de l'empreinte carbone individuelle française proposé ici est issu des travaux du SDES pour l'année **2017**.
Les émissions GES sont estimées à partir de chaque euro de demande finale pour chacune des grandes catégories de produits (biens et services) identifiés par la comptabilité nationale.

L’empreinte carbone calculée ici est donc composée des émissions directes des ménages (issues des carburants consommés par les véhicules
individuels et des combustibles fossiles utilisés dans les chaudières des logements) et des émissions associées aux biens
L’empreinte carbone calculée ici est donc composée des émissions directes des ménages (issues des carburants consommés par les véhicules
individuels et des combustibles fossiles utilisés dans les chaudières des logements) et des émissions associées aux biens
et services adressés à la demande finale. L’origine des émissions de ces biens et services est identifiée et permet de
distinguer les émissions de la production intérieure et celles associées aux importations. Les importations peuvent être adressées
à la demande finale ou consommées par les activités économiques (matières premières, produits semi-finis).
réfrence:
- https://www.statistiques.developpement-durable.gouv.fr/lempreinte-carbone-de-la-france-de-1995-2021
- https://www.statistiques.developpement-durable.gouv.fr/sites/default/files/2022-07/document_travail_59_decomposition_empreinte_carbone_juillet2022.pdf
somme:
- émissions direct ménages par hab
- émissions hors direct ménages par hab
formule:
somme:
- émissions direct ménages par hab
- émissions hors direct ménages par hab

population:
formule: 66774482
Expand All @@ -39,97 +40,98 @@ population:
émissions hors direct ménages par hab:
titre: Emissions hors direct ménages par habitant
description: Correspond aux émissions associées aux biens et services adressés à la demande finale
somme:
- empreinte branche . A01 par hab
- empreinte branche . A02 par hab
- empreinte branche . A03 par hab
- empreinte branche . B05 par hab
- empreinte branche . B06 par hab
- empreinte branche . B07 par hab
- empreinte branche . B08 par hab
- empreinte branche . B09 par hab
- empreinte branche . C10 par hab
- empreinte branche . C11 par hab
- empreinte branche . C12 par hab
- empreinte branche . C13 par hab
- empreinte branche . C14 par hab
- empreinte branche . C15 par hab
- empreinte branche . C16 par hab
- empreinte branche . C17 par hab
- empreinte branche . C18 par hab
- empreinte branche . C19 par hab
- empreinte branche . C20 par hab
- empreinte branche . C21 par hab
- empreinte branche . C22 par hab
- empreinte branche . C23 par hab
- empreinte branche . C24 par hab
- empreinte branche . C25 par hab
- empreinte branche . C26 par hab
- empreinte branche . C27 par hab
- empreinte branche . C28 par hab
- empreinte branche . C29 par hab
- empreinte branche . C30 par hab
- empreinte branche . C31 par hab
- empreinte branche . C32 par hab
- empreinte branche . C33 par hab
- empreinte branche . D35 par hab
- empreinte branche . E36 par hab
- empreinte branche . E37 par hab
- empreinte branche . E38 par hab
- empreinte branche . E39 par hab
- empreinte branche . F41 par hab
- empreinte branche . F42 par hab
- empreinte branche . F43 par hab
- empreinte branche . G45 par hab
- empreinte branche . G46 par hab
- empreinte branche . G47 par hab
- empreinte branche . H49 par hab
- empreinte branche . H50 par hab
- empreinte branche . H51 par hab
- empreinte branche . H52 par hab
- empreinte branche . H53 par hab
- empreinte branche . I55 par hab
- empreinte branche . I56 par hab
- empreinte branche . J58 par hab
- empreinte branche . J59 par hab
- empreinte branche . J60 par hab
- empreinte branche . J61 par hab
- empreinte branche . J62 par hab
- empreinte branche . J63 par hab
- empreinte branche . K64 par hab
- empreinte branche . K65 par hab
- empreinte branche . K66 par hab
# Pour le code NAF est L68, le SDES propose une précision plus détaillée sur ce poste.
- empreinte branche . L68A par hab
- empreinte branche . L68B par hab
- empreinte branche . M69 par hab
- empreinte branche . M70 par hab
- empreinte branche . M71 par hab
- empreinte branche . M72 par hab
- empreinte branche . M73 par hab
- empreinte branche . M74 par hab
- empreinte branche . M75 par hab
- empreinte branche . N77 par hab
- empreinte branche . N78 par hab
- empreinte branche . N79 par hab
- empreinte branche . N80 par hab
- empreinte branche . N81 par hab
- empreinte branche . N82 par hab
- empreinte branche . O84 par hab
- empreinte branche . P85 par hab
- empreinte branche . Q86 par hab
- empreinte branche . Q87 par hab
- empreinte branche . Q88 par hab
- empreinte branche . R90 par hab
- empreinte branche . R91 par hab
- empreinte branche . R92 par hab
- empreinte branche . R93 par hab
- empreinte branche . S94 par hab
- empreinte branche . S95 par hab
- empreinte branche . S96 par hab
- empreinte branche . T97 par hab
- empreinte branche . T98 par hab
# - empreinte branche . U99 non pris en compte dans les données calculées par SDES
formule:
somme:
- empreinte branche . A01 par hab
- empreinte branche . A02 par hab
- empreinte branche . A03 par hab
- empreinte branche . B05 par hab
- empreinte branche . B06 par hab
- empreinte branche . B07 par hab
- empreinte branche . B08 par hab
- empreinte branche . B09 par hab
- empreinte branche . C10 par hab
- empreinte branche . C11 par hab
- empreinte branche . C12 par hab
- empreinte branche . C13 par hab
- empreinte branche . C14 par hab
- empreinte branche . C15 par hab
- empreinte branche . C16 par hab
- empreinte branche . C17 par hab
- empreinte branche . C18 par hab
- empreinte branche . C19 par hab
- empreinte branche . C20 par hab
- empreinte branche . C21 par hab
- empreinte branche . C22 par hab
- empreinte branche . C23 par hab
- empreinte branche . C24 par hab
- empreinte branche . C25 par hab
- empreinte branche . C26 par hab
- empreinte branche . C27 par hab
- empreinte branche . C28 par hab
- empreinte branche . C29 par hab
- empreinte branche . C30 par hab
- empreinte branche . C31 par hab
- empreinte branche . C32 par hab
- empreinte branche . C33 par hab
- empreinte branche . D35 par hab
- empreinte branche . E36 par hab
- empreinte branche . E37 par hab
- empreinte branche . E38 par hab
- empreinte branche . E39 par hab
- empreinte branche . F41 par hab
- empreinte branche . F42 par hab
- empreinte branche . F43 par hab
- empreinte branche . G45 par hab
- empreinte branche . G46 par hab
- empreinte branche . G47 par hab
- empreinte branche . H49 par hab
- empreinte branche . H50 par hab
- empreinte branche . H51 par hab
- empreinte branche . H52 par hab
- empreinte branche . H53 par hab
- empreinte branche . I55 par hab
- empreinte branche . I56 par hab
- empreinte branche . J58 par hab
- empreinte branche . J59 par hab
- empreinte branche . J60 par hab
- empreinte branche . J61 par hab
- empreinte branche . J62 par hab
- empreinte branche . J63 par hab
- empreinte branche . K64 par hab
- empreinte branche . K65 par hab
- empreinte branche . K66 par hab
# Pour le code NAF est L68, le SDES propose une précision plus détaillée sur ce poste.
- empreinte branche . L68A par hab
- empreinte branche . L68B par hab
- empreinte branche . M69 par hab
- empreinte branche . M70 par hab
- empreinte branche . M71 par hab
- empreinte branche . M72 par hab
- empreinte branche . M73 par hab
- empreinte branche . M74 par hab
- empreinte branche . M75 par hab
- empreinte branche . N77 par hab
- empreinte branche . N78 par hab
- empreinte branche . N79 par hab
- empreinte branche . N80 par hab
- empreinte branche . N81 par hab
- empreinte branche . N82 par hab
- empreinte branche . O84 par hab
- empreinte branche . P85 par hab
- empreinte branche . Q86 par hab
- empreinte branche . Q87 par hab
- empreinte branche . Q88 par hab
- empreinte branche . R90 par hab
- empreinte branche . R91 par hab
- empreinte branche . R92 par hab
- empreinte branche . R93 par hab
- empreinte branche . S94 par hab
- empreinte branche . S95 par hab
- empreinte branche . S96 par hab
- empreinte branche . T97 par hab
- empreinte branche . T98 par hab
# - empreinte branche . U99 non pris en compte dans les données calculées par SDES

empreinte branche:
titre: Intensité carbone par branche NAF
Expand Down
File renamed without changes.
File renamed without changes.
8 changes: 4 additions & 4 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -11,8 +11,8 @@
"compile:personas": "node scripts/personasToJSON.js",
"compile:rules": "node scripts/rulesToJSON.mjs",
"compile-watch": "nodemon -e yaml --watch data/ scripts/rulesToJSON.mjs & nodemon -e yaml --watch personas/ scripts/personasToJSON.js & nodemon -e md --watch contenu-ecrit/ scripts/documentationToJSON.js ",
"test": "yarn compile:personas && node tests/testPersonas.js",
"test:md": "node tests/testPersonas.js --markdown",
"test:personas": "node tests/testPersonas.js",
"test:optim": "node tests/testOptim.js",
"translate": "node scripts/i18n/translate-rules.js && node scripts/i18n/translate-personas.js",
"check:personas": "node scripts/i18n/check-personas.js ",
"translate:personas": "node scripts/i18n/translate-personas.js",
Expand All @@ -36,15 +36,15 @@
"inquirer": "^8.2.5",
"nodemon": "^2.0.20",
"prettier": "^2.7.1",
"publicodes": "^1.0.0-beta.47",
"publicodes": "^1.0.0-beta.66",
"publiopti": "^0.1.25",
"yaml": "^2.1.1"
},
"devDependencies": {
"cli-progress": "^3.11.2",
"deepl-node": "^1.7.0",
"dotenv": "^16.0.3",
"isomorphic-fetch": "^3.0.0",
"publiopti": "^0.1.21",
"ramda": "^0.28.0",
"yargs": "^17.6.0"
}
Expand Down
2 changes: 2 additions & 0 deletions scripts/i18n/addRegionToBaseRules.js
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,8 @@ const addRegionToBaseRules = (baseRules, newRegionalRules) => {
}
Object.entries(newRegionalRules).forEach(([rule, attrs]) => {
if (!Object.keys(baseRules).includes(rule)) {
// TODO: to discuss about the wanted behavior.
// Should we throw an error or just ignore the rule?
return baseRules
}
Object.entries(attrs).forEach(([attr, transVal]) => {
Expand Down
63 changes: 60 additions & 3 deletions scripts/modelOptim.mjs
Original file line number Diff line number Diff line change
@@ -1,15 +1,72 @@
// Description: contains wrappers around the constant folding optimization pass from
// [publiopti] to be used in the build scripts: rulesToJSON.
//
// [publiopti]: https:github.com/datagir/publiopti

import Engine from 'publicodes'
import path from 'path'
import { readFileSync, writeFileSync } from 'fs'
import { constantFolding, disabledLogger, getRawNodes } from 'publiopti'

// Rule names which should be kept in the optimized model.
EmileRolley marked this conversation as resolved.
Show resolved Hide resolved
//
// We need to keep the rules below because they are used in the simulation
// (e.g. 'bilan' or 'actions' are used to compute the total CO2 emissions).
// We also need to keep rules which are used in the UI (e.g. 'pétrole . pleins'
// and 'pétrole . volume plein' are used to compute the total volume of fuel), and
// rules that contain the 'icônes' key.
const rulesToKeep = [
'actions',
'bilan',
'logement . gaz',
'logement . gaz . biogaz',
'pétrole . pleins',
'pétrole . volume plein',
'transport . voiture . thermique',
]

export function compressRules(
jsonPathWithoutExtension,
destLang,
markdown,
regionCode
) {
const destPath = `${jsonPathWithoutExtension}-opti.json`
const err = constantFoldingFromJSONFile(
jsonPathWithoutExtension + '.json',
destPath,
['**/translated-*.yaml'],
([ruleName, ruleNode]) => {
return rulesToKeep.includes(ruleName) || 'icônes' in ruleNode.rawNode
}
)

if (err) {
if (markdown) {
console.log(
`| Rules compression for the region ${regionCode} in _${destLang}_ | ❌ | <details><summary>See error:</summary><br /><br /><code>${err}</code></details> |`
)
} else {
console.log(' ❌ An error occured while compressing rules in:', destPath)
console.log(err)
}
exit(-1)
} else {
console.log(
markdown
? `| Rules compression for the region ${regionCode} in _${destLang}_ | :heavy_check_mark: | Ø |`
: ` ✅ The rules have been correctly compressed in: ${destPath}`
)
}
}

/**
* Applies a constant folding optimization pass to the parsed rules from the [model] path.
*
* @param model Path to the folder containing the Publicodes files or to a JSON file (the extension must be '.json' then).
* @param json Path to the JSON file target.
* @param ignore Regexp matching files to ignore from the model tree.
* @param targets List of rules to target for the optimization pass.
* @param toKeep Predicate function to determine which rule should be kept.
* @param verbose Whether to log the optimization pass.
*
* @returns An error message if the optimization pass failed, undefined otherwise.
Expand All @@ -18,7 +75,7 @@ export function constantFoldingFromJSONFile(
model,
jsonDestPath,
ignore,
targets,
toKeep,
verbose = false
) {
const log = verbose ? console.log : function (_) {}
Expand All @@ -37,7 +94,7 @@ export function constantFoldingFromJSONFile(
const engine = new Engine(rules, { logger: disabledLogger })

log('Constant folding pass...')
const foldedRules = constantFolding(engine, targets)
const foldedRules = constantFolding(engine, toKeep)

log(`Writing in '${jsonDestPath}'...`)
writeFileSync(jsonDestPath, JSON.stringify(getRawNodes(foldedRules)))
Expand Down
Loading