OpenFisca is an open source software project that aims to simulate the French tax and social benefit system. It covers both taxes and benefits, allows for efficient single-family or country-wide simulations, and aims to improve understanding of the complex French system. OpenFisca is used to improve public understanding, design reforms, simulate individual situations, and understand the tax and benefit policies. It started as Python scripts in 2011 and has grown with more developers and increasing demand, releasing a tax calculator from the French tax authority through a collaborative hackathon event. The project prepares the tax rules by parsing them and representing them as a directed acyclic graph for efficient computation, and works to translate the system to other languages and simplify representations
Boost PC performance: How more available memory can improve productivity
Opening up the french tax software.
1. Opening up the French
tax software
http://www.openfisca.fr/
https://framagit.org/openfisca
https://github.com/openfisca
@OpenFisca
Michel Blancard
michel.blancard@data.gouv.fr
PyData – June 14, 2016
3. Legislation
It's growing!
In French (that most French
people don't understand),
not in python!
Notices
Bulletin Officiel des Finances
Publiques-Impôts (BOFiP)
Décrets
How to compute the French tax and benefits?
5. It's complex, because the reality is complex.
Individuals
Housing
Family
Taxation
How to compute the French tax and benefits?
6. OpenFisca aims to :
●
cover both tax and benefits policies
●
be efficient
●
one family simulation
●
simulation on the whole country
●
be understandable
What is OpenFisca?
7. OpenFisca is used for :
●
improving readability
to the public
●
designing reforms
●
simulating one's
situation
●
understanding the tax
and social system
mes-aides.gouv.fr
Why compute the French tax and benefits?
8. OpenFisca is used for :
●
improving readability
to the public
●
designing reforms
●
simulating one's
situation
●
understanding the tax
and social system
How to compute the French taxes ?
tax difference
between/after marriage
9. OpenFisca is used for :
●
improving readability
to the public
●
designing reforms
●
simulating one's
situation
●
understanding the tax
and social system
How to compute the French taxes ?
personal simulation
ui.openfisca.fr
10. OpenFisca is used for :
●
improving readability
to the public
●
designing reforms
●
simulating one's
situation
●
understanding the
tax and social system
How to compute the French taxes ?
tax percentage as a
function of income
11. The history of OpenFisca
2011 2014 2016
2 economists
python scripts
with QT frontend
2 developers
join the project
tax calculator of
the DGFiP released
increasing
demand for an
open simulator
OpenFisca
reaches the sky
and beyond...
(see later)
France Stratégie
France Stratégie
IPP
Etalab
13. ●
demande gracieuse (aug 2014)
●
6 months later : seisine of the CADA
●
2 months later : positive notice from the CADA
●
2 months later : beginning of judicial proceedings
●
10 months later : the DGFiP releases the source code !
●
10 months later + ε : the court issues a positive decision
The quest for the source code
(want to speed up the process ? → ouvre-boite.org)
14. ●
April 1-2, 2016 at the Mozilla Fundation
●
presence of 3 Ministers
●
developers, civil servants, economists,
citizens... all sitting at the same table !
A hackathon to celebrate :
CodeImpôt
16. Preparation by Etalab and DGFiP :
●
understand the Domain Specific
Language (DSL) : M
●
parse using Clean PEG (Igor
Dejanović's Arpeggio)
●
simplify the Abstract Syntax Tree
(AST)
→ Direct Acyclic Graph of trees
Preparation
comment = r'#.*'
symbol = r'w+'
symbol_enumeration = symbol
("," symbol)*
float = r'd+.d+'
integer = r'd+'
string = '"' r'[^"]*' '"'
interval = symbol ".." symbol
brackets = "[" symbol "]"
...
17. Preparation by Etalab and DGFiP :
●
understand the Domain Specific
Language (DSL) : M
●
parse using Clean PEG (Igor
Dejanović's Arpeggio)
●
simplify the Abstract Syntax Tree
(AST)
→ Direct Acyclic Graph of trees
Preparation
Python object / JSON
18. ●
Directed Acyclic Graph (DAG)
traversal (400ms)
●
Arithmetic computations at each
node (0.4ms in total for a single
simulation)
During the hackathon
Efficient computation
vs
400ms + 0.4ms = 400.4ms
for 1 simulation
400ms + 10.000x0.4ms = 4.4s
for 10.000 simulation
Long live Numpy and vectorized computations !
21. During the hackathon
Transpile to other languages
var functionsMapping = {
'+':function sumTab(tabValeurs){
return tabValeurs.reduce(function(a,b){
return a+b;
});
},
'*':function mulTab(tabValeurs){
return tabValeurs.reduce(function(a,b){
return a*b;
});
},
. . .
Step 1 : Define an implementation of the operations
22. During the hackathon
Transpile to other languages
function computeFormula(node, values){
if(node.nodetype ==='symbol'){
var value = values[node.name];
if(typeof(value)==='undefined'){
value = 0;
};
return value
}else if(node.nodetype ==='float'){
return node.value;
}else if(node.nodetype==='call'){
var name = node.name;
var func = functionsMapping[name];
var args = [];
for(i in node.args){
args.push(computeFormula(node.args[i],values));
}
return func(args);
}
}
Step 2 : Code a DAG traversal
24. II – The French tax
calculator
Tax rules vs implementation
Rule of least power
different concerns
storage
versioning
editing
speed
simplicity
(technologies
evolve fast)