diff --git a/deploy/taxbrain_server/celery_tasks.py b/deploy/taxbrain_server/celery_tasks.py
index 140a3309..9720edd9 100644
--- a/deploy/taxbrain_server/celery_tasks.py
+++ b/deploy/taxbrain_server/celery_tasks.py
@@ -127,14 +127,15 @@ def elasticity_gdp_task_async(year_n, user_mods, first_budget_year,
@celery_app.task
-def ogusa_async(user_mods, ogusa_params, guid):
+def ogusa_async(start_year, user_mods, ogusa_params, guid):
print("user mods: ", user_mods)
user_mods = convert_int_key(user_mods)
user_reform = {'policy': user_mods}
for key in EXPECTED_KEYS:
if key not in user_reform:
user_reform[key] = {}
- diff_data = run_ogusa.run_micro_macro(reform=user_reform,
+ diff_data = run_ogusa.run_micro_macro(start_year=start_year,
+ reform=user_reform,
user_params=ogusa_params,
guid=guid)
diff --git a/deploy/taxbrain_server/flask_server.py b/deploy/taxbrain_server/flask_server.py
index e4165bb3..7c78ab0c 100644
--- a/deploy/taxbrain_server/flask_server.py
+++ b/deploy/taxbrain_server/flask_server.py
@@ -171,6 +171,7 @@ def example():
@app.route('/ogusa_start_job', methods=['POST'])
def ogusa_start_job():
+ start_year = int(request.form["start_year"])
user_mods = json.loads(request.form['user_mods'])
ogusa_params = json.loads(request.form['ogusa_params'])
@@ -178,7 +179,12 @@ def ogusa_start_job():
with ticket_lock_context():
guid = uuid.uuid1().hex
- job = ogusa_async.delay(user_mods=user_mods, ogusa_params=ogusa_params, guid=guid)
+ job = ogusa_async.delay(
+ start_year=start_year,
+ user_mods=user_mods,
+ ogusa_params=ogusa_params,
+ guid=guid
+ )
RUNNING_JOBS[job.id] = job
print('job_id', job)
print('GUID IS ', guid)
diff --git a/deploy/taxbrain_server/run_ogusa.py b/deploy/taxbrain_server/run_ogusa.py
index e673dde3..cc59952c 100644
--- a/deploy/taxbrain_server/run_ogusa.py
+++ b/deploy/taxbrain_server/run_ogusa.py
@@ -13,20 +13,13 @@
from ogusa.scripts.execute import runner
-def run_micro_macro(reform, user_params, guid):
+def run_micro_macro(start_year, reform, user_params, guid):
start_time = time.time()
REFORM_DIR = "./OUTPUT_REFORM_" + guid
BASELINE_DIR = "./OUTPUT_BASELINE_" + guid
- # Add start year from reform to user parameters
- if isinstance(reform, tuple):
- start_year = sorted(reform[0].keys())[0]
- else:
- start_year = sorted(reform.keys())[0]
- user_params['start_year'] = start_year
-
with open("log_{}.log".format(guid), 'w') as f:
f.write("guid: {}\n".format(guid))
f.write("reform: {}\n".format(reform))
@@ -37,6 +30,8 @@ def run_micro_macro(reform, user_params, guid):
Run baseline
------------------------------------------------------------------------
'''
+
+ user_params["start_year"] = start_year
output_base = BASELINE_DIR
kwargs={'output_base':output_base, 'baseline_dir':BASELINE_DIR,
'test':False, 'time_path':True, 'baseline':True,
@@ -75,13 +70,25 @@ def run_micro_macro(reform, user_params, guid):
if __name__ == "__main__":
reform = {
- 2017: {
- '_II_rt1': [.09],
- '_II_rt2': [.135],
- '_II_rt3': [.225],
- '_II_rt4': [.252],
- '_II_rt5': [.297],
- '_II_rt6': [.315],
- '_II_rt7': [0.3564],
- }, }
- run_micro_macro(reform=reform, user_params={'frisch': 0.44}, guid='abc')
+ u'growdiff_response': {},
+ u'consumption': {},
+ u'growdiff_baseline': {},
+ u'behavior': {},
+ u'policy': {
+ 2017: {
+ u'_II_no_em_nu18': [False],
+ u'_NIIT_PT_taxed': [False],
+ u'_FICA_ss_trt': [0.1],
+ u'_ID_BenefitCap_Switch': [[1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0]],
+ u'_ALD_InvInc_ec_base_RyanBrady': [False],
+ u'_EITC_indiv': [False],
+ u'_ID_BenefitSurtax_Switch': [[1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0]],
+ u'_CTC_new_refund_limited': [False],
+ u'_CG_nodiff': [False]
+ }
+ },
+ u'gdp_elasticity': {}
+ }
+ user_params = {u'g_y_annual': 0.04, u'frisch': 0.3}
+
+ run_micro_macro(start_year=2017, reform=reform, user_params=user_params, guid='abc')
diff --git a/templates/dynamic/dynamic_input_form.html b/templates/dynamic/dynamic_input_form.html
index c95e45a2..e9e48c9c 100644
--- a/templates/dynamic/dynamic_input_form.html
+++ b/templates/dynamic/dynamic_input_form.html
@@ -137,11 +137,6 @@
Tax-Calculator Code Build
diff --git a/templates/dynamic/landing.html b/templates/dynamic/landing.html
index 480df2ba..17dc603f 100644
--- a/templates/dynamic/landing.html
+++ b/templates/dynamic/landing.html
@@ -156,22 +156,14 @@ Choose a Dynamic Simulation Type
This approach answers the question, "how would taxpayer behavior (income and deductions) affect revenue if all other prices in the economy could stay the same?"
- {% if include_ogusa %}
|
- Overlapping Generations Simulation
+ Overlapping Generations Simulation
|
-
- DISABLED WHILE UNDERGOING MAINTENANCE
This approach answers the question, "how does tax policy affect macroeconomic aggregates and prices?"
|
- {% endif %}
|
Macro Elasticity Simulation
diff --git a/webapp/apps/dynamic/compute.py b/webapp/apps/dynamic/compute.py
index f05133e8..44aaf0fb 100644
--- a/webapp/apps/dynamic/compute.py
+++ b/webapp/apps/dynamic/compute.py
@@ -7,7 +7,6 @@
import taxcalc
from ..taxbrain.compute import DropqCompute, MockCompute
from .models import OGUSAWorkerNodesCounter
-from .helpers import filter_ogusa_only
from ..constants import START_YEAR
dqversion_info = taxcalc._version.get_versions()
@@ -33,27 +32,8 @@ def remote_register_job(self, theurl, data, timeout=TIMEOUT_IN_SECONDS):
response = requests.post(theurl, data=data, timeout=timeout)
return response
- def submit_json_ogusa_calculation(self, ogusa_mods, first_budget_year,
- microsim_data, pack_up_user_mods):
- return self.submit_ogusa_calculation(ogusa_mods, first_budget_year,
- microsim_data, pack_up_user_mods=False)
-
- def submit_ogusa_calculation(self, ogusa_mods, first_budget_year, microsim_data,
- pack_up_user_mods=True):
-
- print "mods is ", ogusa_mods
- ogusa_params = filter_ogusa_only(ogusa_mods)
- data = {}
- if pack_up_user_mods:
- microsim_params = package_up_vars(microsim_data, first_budget_year)
- microsim_params = {first_budget_year:microsim_params}
- print "microsim data is", microsim_params
- else:
- data['taxio_format'] = True
- data['first_budget_year'] = first_budget_year
- microsim_params = microsim_data
-
-
+ def submit_ogusa_calculation(self, data):
+ print "mods is ", data
print "submit dynamic work"
hostnames = OGUSA_WORKERS
@@ -62,9 +42,6 @@ def submit_ogusa_calculation(self, ogusa_mods, first_budget_year, microsim_data,
'callback': "http://{}/dynamic/dynamic_finished".format(CALLBACK_HOSTNAME),
}
- data['ogusa_params'] = json.dumps(ogusa_params)
- data['user_mods'] = json.dumps(microsim_params)
- data['first_year'] = first_budget_year
job_ids = []
guids = []
diff --git a/webapp/apps/dynamic/helpers.py b/webapp/apps/dynamic/helpers.py
index 87ecbd52..1bad730b 100644
--- a/webapp/apps/dynamic/helpers.py
+++ b/webapp/apps/dynamic/helpers.py
@@ -209,7 +209,7 @@ def filter_ogusa_only(user_values):
print "Removing ", k, v
del user_values[k]
else:
- user_values[k] = float(v)
+ user_values[k] = float(v[0]) if isinstance(v, list) else float(v)
return user_values
diff --git a/webapp/apps/dynamic/views.py b/webapp/apps/dynamic/views.py
index 0f58de81..7a1bc751 100644
--- a/webapp/apps/dynamic/views.py
+++ b/webapp/apps/dynamic/views.py
@@ -45,7 +45,8 @@
failure_text, normalize, denormalize, strip_empty_lists,
cc_text_finished, cc_text_failure, dynamic_params_from_model,
send_cc_email, default_behavior_parameters,
- elast_results_to_tables, default_elasticity_parameters)
+ elast_results_to_tables, default_elasticity_parameters,
+ filter_ogusa_only)
from .compute import DynamicCompute, NUM_BUDGET_YEARS
@@ -88,17 +89,15 @@ def dynamic_input(request, pk):
if dyn_mod_form.is_valid():
model = dyn_mod_form.save()
- #Can't proceed if there is no email address
+ # Can't proceed if there is no email address
if not (request.user.is_authenticated() or model.user_email):
- msg = 'Dynamic simulation must have an email address to send notification to!'
- return HttpResponse(msg, status=403)
-
- curr_dict = dict(model.__dict__)
- for key, value in curr_dict.items():
- print "got this ", key, value
+ msg = ("Dynamic simulation must have an email "
+ "address to send notification to!")
+ return HttpResponse(msg, status=403)
# get macrosim data from form
- worker_data = {k:v for k, v in curr_dict.items() if v not in (u'', None, [])}
+ curr_dict = dict(model.__dict__)
+ worker_data = parse_fields(curr_dict)
#get microsim data
outputsurl = OutputUrl.objects.get(pk=pk)
@@ -106,36 +105,31 @@ def dynamic_input(request, pk):
taxbrain_model = outputsurl.unique_inputs
submitted_ids = None
+ # necessary for simulations before PR 641
if not taxbrain_model.json_text:
- taxbrain_dict = dict(taxbrain_model.__dict__)
- growth_fixup(taxbrain_dict)
- for key, value in taxbrain_dict.items():
- if type(value) == type(unicode()):
- try:
- taxbrain_dict[key] = [float(x) for x in value.split(',') if x]
- except ValueError:
- taxbrain_dict[key] = [make_bool(x) for x in value.split(',') if x]
- else:
- print "missing this: ", key
-
-
- microsim_data = {k:v for k, v in taxbrain_dict.items() if not (v == [] or v == None)}
+ (reform_dict, _, _, _,
+ errors_warnings) = get_reform_from_gui(
+ request,
+ taxbrain_model=taxbrain_model,
+ behavior_model=None
+ )
- #Don't need to pass around the microsim results
- if 'tax_result' in microsim_data:
- del microsim_data['tax_result']
+ else:
+ reform_dict = json.loads(taxbrain_model.json_text.reform_text)
- benefit_switch_fixup(request.REQUEST, microsim_data, taxbrain_model)
+ # package up variables
+ ogusa_params = filter_ogusa_only(worker_data)
+ data = {
+ 'taxio_format': True,
+ 'ogusa_params': json.dumps(ogusa_params),
+ 'user_mods': json.dumps(reform_dict),
+ 'start_year': int(start_year)
+ }
+ # start model run
+ submitted_ids, guids = dynamic_compute.submit_ogusa_calculation(
+ data
+ )
- # start calc job
- submitted_ids, guids = dynamic_compute.submit_ogusa_calculation(worker_data, int(start_year), microsim_data)
- else:
- microsim_data = {"reform": taxbrain_model.json_text.reform_text, "assumptions": taxbrain_model.json_text.assumption_text}
- # start calc job
- submitted_ids, guids = dynamic_compute.submit_json_ogusa_calculation(worker_data,
- int(start_year),
- microsim_data,
- pack_up_user_mods=False)
# TODO: use OutputUrl class
if submitted_ids:
model.job_ids = denormalize(submitted_ids)
|