All the examples provided here are from the country package template.
When running a simulation on a specific situation (e.g. using the /calculate endpoint), you might want to understand the calculation. The /trace endpoint is here to help analyse the simulation calculation step by step.
Let’s say that you want to calculate the disposable_income for one person earning a salary in a specific period. You start with the following JSON situation description:
{
"households": {
"_": {
"parents": ["Alicia"]
}
},
"persons": {
"Alicia": {
"birth": {
"ETERNITY": "1980-01-01"
},
"disposable_income": {
"2017-01": null
},
"salary": {
"2017-01": 4000
}
}
}
}
If this situation to is sent to the country-template model web API or the /trace endpoint in the Swagger interface, it will return the following response composed of three sections:
entitiesDescription: lists the persons and how they belong to the model group entities,
requestedCalculations: lists the requested calculations (i.e. variables with values at null),
trace: lists the calculation steps.
{
"entitiesDescription": {
"households": [
"_"
],
"persons": [
"Alicia"
]
},
"requestedCalculations": [
"disposable_income<2017-01>"
],
"trace": {
"age<2017-01>": {
"dependencies": [
"birth<2017-01>"
],
"parameters": {},
"value": [
37
]
},
"basic_income<2017-01>": {
"dependencies": [
"age<2017-01>"
],
"parameters": {
"benefits.basic_income<2017-01-01>": 600,
"general.age_of_majority<2017-01-01>": 18
},
"value": [
600
]
},
"birth<2017-01>": {
"dependencies": [],
"parameters": {},
"value": [
"Tue, 01 Jan 1980 00:00:00 GMT"
]
},
"disposable_income<2017-01>": {
"dependencies": [
"salary<2017-01>",
"basic_income<2017-01>",
"income_tax<2017-01>",
"social_security_contribution<2017-01>"
],
"parameters": {},
"value": [
3920
]
},
"income_tax<2017-01>": {
"dependencies": [
"salary<2017-01>"
],
"parameters": {
"taxes.income_tax_rate<2017-01-01>": 0.15
},
"value": [
600
]
},
"salary<2017-01>": {
"dependencies": [],
"parameters": {},
"value": [
4000
]
},
"social_security_contribution<2017-01>": {
"dependencies": [
"salary<2017-01>"
],
"parameters": {},
"value": [
80
]
}
}
}
As we calculated the disposable_income for 2017-01, let’s see how the trace section describes it:
{
"disposable_income<2017-01>": {
"dependencies": [
"salary<2017-01>",
"basic_income<2017-01>",
"income_tax<2017-01>",
"social_security_contribution<2017-01>"
],
"parameters": {},
"value": [
3920
]
}
}
It contains these sub-sections:
value: the calculated disposable_income on 2017-01 period,
dependencies: the variables called by disposable_income formula and their calculation periods,
parameters: the parameters called by disposable_income formula and their periods.
These variables and parameters are visible in the disposable_income definition.
Following the full dependencies list, we can see that:
OpenFisca didn’t need to calculate the salary value as it was supplied in situation inputs; thus the /trace doesn’t evaluate its dependencies and parameters:
{
"salary<2017-01>": {
"dependencies": [],
"parameters": {},
"value": [
4000
]
}
}
OpenFisca needed to calculate the next variable, basic_income, before disposable_income was calculated:
{
"basic_income<2017-01>": {
"dependencies": [
"age<2017-01>"
],
"parameters": {
"benefits.basic_income<2017-01-01>": 600,
"general.age_of_majority<2017-01-01>": 18
},
"value": [
600
]
}
}
Note: as a parameter depends only on its validity period, its period and value are described in one line.
With the /trace endpoint, you can trace the calculation steps by following the variable names and periods in its response trace section.
Try it out on the Swagger interface of the
country-templatemodel.