class Policies(Form): estimate_emr_from_prevalence: OptionField = OptionField( [0, 1], constructor=int, default=0, display="Estimate EMR from prevalance", nullable=True) use_weighted_age_group_midpoints: OptionField = OptionField( [1, 0], default=1, constructor=int, nullable=True) number_of_fixed_effect_samples: IntField = IntField(default=30, nullable=True) with_hiv: BoolField = BoolField( default=True, nullable=True, display="Whether to get ASDR with HIV deaths.") age_group_set_id: IntField = IntField( default=12, nullable=True, display="Age groups for analysis work.") exclude_relative_risk: OptionField = OptionField([1, 0], default=1, constructor=int, nullable=True) meas_noise_effect: OptionField = OptionField( [ "add_std_scale_all", "add_std_scale_log", "add_var_scale_all", "add_var_scale_log" ], default="add_var_scale_log", display="Measurement standard deviation effect", nullable=True) limited_memory_max_history_fixed: IntField = IntField( default=30, nullable=True, display=("number of most recent iterations taken into account " "for quasi-Newton")) gbd_round_id: IntField = IntField(nullable=True, default=6)
class SettingsConfig(Form): """ The root Form of the whole settings inputs tree. This collects all settings from EpiViz-AT and adds default values when they are missing. A representation of the configuration form we expect to receive from EpiViz. The hope is that this form will do as much validation and precondition checking as is feasible within the constraint that it must be able to validate a full EpiViz parameter document in significantly less than one second. This is because it will be used as part of a web service which gates EpiViz submissions and must return in near real time. The Configuration class is the root of the form. Example ------- >>> import json >>> input_data = json.loads(json_blob) >>> form = SettingsConfig(input_data) >>> errors = form.validate_and_normalize() """ model: Model = Model(display="Model", validation_priority=5) policies: Policies = Policies(display="Policies") gbd_round_id: IntField = IntField(display="GBD Round ID") random_effect: FormList = FormList(Smoothing, nullable=True, display="Random effects") rate: FormList = FormList(Smoothing, display="Rates") country_covariate: FormList = FormList(CountryCovariate, display="Country covariates") study_covariate: FormList = FormList(StudyCovariate, display="Study covariates", nullable=True) eta: Eta = Eta(validation_priority=5) students_dof: StudentsDOF = StudentsDOF(validation_priority=5) log_students_dof: StudentsDOF = StudentsDOF(validation_priority=5) location_set_version_id: IntField = IntField(default=429, nullable=True) csmr_cod_output_version_id: IntField = IntField() csmr_mortality_output_version_id: Dummy = Dummy() min_cv: FormList = FormList(MinCV, display="Minimum coefficient of variation", nullable=False) min_cv_by_rate: FormList = FormList( MinCVRate, display="Minimum coefficient of variation by rate", nullable=True) re_bound_location: FormList = FormList(RandomEffectBound) derivative_test: DerivativeTest = DerivativeTest(display="Derivative test") max_num_iter: FixedRandomInt = FixedRandomInt( display="Max ipopt iterations") print_level: FixedRandomInt = FixedRandomInt(display="Print level") accept_after_max_steps: FixedRandomInt = FixedRandomInt( display="Max backtracking") tolerance: FixedRandomFloat = FixedRandomFloat( display="Desired relative convergence tolerance") data_cv_by_integrand: FormList = FormList(DataCV) data_eta_by_integrand: FormList = FormList(DataEta) data_density_by_integrand: FormList = FormList(DataDensity) config_version: StrField = StrField(nullable=True, display="Settings version")
class SettingsConfig(Form): """ The root Form of the whole settings inputs tree. Example: >>> import json >>> input_data = json.loads(json_blob) >>> form = SettingsConfig(input_data) >>> errors = form.validate_and_normalize() """ model = Model(display="Model", validation_priority=5) policies = Policies(display="Policies") gbd_round_id = IntField(display="GBD Round ID") random_effect = FormList(Smoothing, nullable=True, display="Random effects") rate = FormList(Smoothing, display="Rates") country_covariate = FormList(CountryCovariate, display="Country covariates") study_covariate = FormList(StudyCovariate, display="Study covariates", nullable=True) eta = Eta(validation_priority=5) students_dof = StudentsDOF(validation_priority=5) log_students_dof = StudentsDOF(validation_priority=5) location_set_version_id = IntField(default=429, nullable=True) csmr_cod_output_version_id = IntField() csmr_mortality_output_version_id = Dummy() min_cv = FormList(MinCV, display="Minimum coefficient of variation", nullable=False) min_cv_by_rate = FormList( MinCVRate, display="Minimum coefficient of variation by rate", nullable=True) re_bound_location = FormList(RandomEffectBound) derivative_test = DerivativeTest(display="Derivative test") max_num_iter = FixedRandomInt(display="Max ipopt iterations") print_level = FixedRandomInt(display="Print level") accept_after_max_steps = FixedRandomInt(display="Max backtracking") tolerance = FixedRandomFloat( display="Desired relative convergence tolerance") data_cv_by_integrand = FormList(DataCV) data_eta_by_integrand = FormList(DataEta) data_density_by_integrand = FormList(DataDensity) config_version = StrField(nullable=True, display="Settings version")
class CountryCovariate(Form): country_covariate_id = IntField(display="Covariate") measure_id = IntField(display="Measure") mulcov_type = OptionField(["rate_value", "meas_value", "meas_std"], display="Multiplier type") transformation = IntField(display="Transformation") age_time_specific = IntField(display="Age and Time specific") age_grid = StringListField(constructor=float, nullable=True, display="Age grid") time_grid = StringListField(constructor=float, nullable=True, display="Time grid") default = SmoothingPriorGroup(display="Defaults") mulstd = SmoothingPriorGroup(nullable=True, display="MulStd") detail = FormList(SmoothingPrior, nullable=True, display="Detail") custom_age_grid = Dummy() custom_time_grid = Dummy()
class StudyCovariate(Form): study_covariate_id: IntField = IntField(display="Covariate") measure_id: StrField = StrField(display="Measure") mulcov_type: OptionField = OptionField( ["rate_value", "meas_value", "meas_noise"], display="Multiplier type") transformation: IntField = IntField(display="Transformation") age_time_specific: IntField = IntField(display="Age and Time specific") age_grid: StringListField = StringListField(constructor=float, nullable=True, display="Age grid") time_grid: StringListField = StringListField(constructor=float, nullable=True, display="Time grid") default: SmoothingPriorGroup = SmoothingPriorGroup(display="Defaults") mulstd: SmoothingPriorGroup = SmoothingPriorGroup(nullable=True, display="MulStd") detail: FormList = FormList(SmoothingPrior, nullable=True, display="Detail") custom_age_grid: Dummy = Dummy() custom_time_grid: Dummy = Dummy()
class RandomEffectBound(Form): location = IntField(nullable=True) value = FloatField(nullable=True)
class FixedRandomInt(Form): fixed = IntField(nullable=True) random = IntField(nullable=True)
class DataDensity(Form): value = StrField(nullable=True) integrand_measure_id = IntField(nullable=True)
class DataEta(Form): integrand_measure_id = IntField(nullable=True) value = FloatField(nullable=True)
class Model(Form): modelable_entity_id = IntField() decomp_step_id = IntField() model_version_id = IntField(nullable=True) random_seed = IntField() minimum_meas_cv = FloatField(nullable=True, display="Data CV floor") add_csmr_cause = IntField(nullable=True, display="CSMR cause") title = StrField(nullable=True, display="Title") description = StrField(nullable=True, display="Description") crosswalk_version_id = IntField(nullable=False, display="Crosswalk version ID") bundle_id = IntField(nullable=True, display="Data bundle") drill = OptionField(["cascade", "drill"], display="Drill") drill_location = IntField(display="Drill location", nullable=True) drill_location_start = IntField(display="Drill location start", nullable=True) drill_location_end = NativeListField(display="Drill location end", nullable=True) drill_sex = OptionField([1, 2], constructor=int, nullable=True, display="Drill sex") birth_prev = OptionField([0, 1], constructor=int, nullable=True, default=0, display="Prevalence at birth") default_age_grid = StringListField(constructor=float, display="(Cascade) Age grid") default_time_grid = StringListField(constructor=float, display="(Cascade) Time grid") constrain_omega = OptionField([0, 1], constructor=int, nullable=False, display="Constrain other cause mortality") exclude_data_for_param = ListField(constructor=int, nullable=True, display="Exclude data for parameter") ode_step_size = FloatField(display="ODE step size") addl_ode_stpes = StringListField(constructor=float, nullable=True, display="Advanced additional ODE steps") split_sex = OptionField(["most_detailed", "1", "2", "3", "4", "5"], display="Split sex (Being used as Drill Start)") quasi_fixed = OptionField([0, 1], default=0, constructor=int, nullable=True) zero_sum_random = ListField(nullable=True, display="Zero-sum random effects") bound_frac_fixed = FloatField( default=1e-2, nullable=True, display="allowed modification to point to move it within bounds") bound_random = FloatField( nullable=True, display="allowed modification to point to move it within bounds") rate_case = StrField(nullable=False, display="The rate case") data_density = StrField(nullable=True, display="Data density") relabel_incidence = IntField(nullable=False, display="Relabel incidence") def _full_form_validation(self, root): errors = [] if self.drill == "drill": if self.is_field_unset("drill_sex"): errors.append("For a drill, please specify Drill sex.") return errors
class Smoothing(Form): rate = OptionField(["pini", "iota", "rho", "chi", "omega"], "Rate") location = IntField(nullable=True) age_grid = StringListField(constructor=float, nullable=True, display="Age grid") time_grid = StringListField(constructor=float, nullable=True, display="Time grid") default = SmoothingPriorGroup(display="Defaults") mulstd = SmoothingPriorGroup(nullable=True, display="MulStd") detail = FormList(SmoothingPrior, nullable=True, display="Detail") age_time_specific = IntField(display="Age and Time specific", nullable=True) custom_age_grid = Dummy() custom_time_grid = Dummy() def _full_form_validation(self, root): errors = [] if self.rate == "pini": if not self.is_field_unset("age_grid") and len(self.age_grid) != 1: errors.append("Pini must have exactly one age point") else: age_grid = self.age_grid or root.model.default_age_grid if len(age_grid) > 1 and self.default.is_field_unset("dage"): errors.append( "You must supply a default age diff prior if the " "smoothing has extent over age") time_grid = self.time_grid or root.model.default_time_grid if len(time_grid) > 1 and self.default.is_field_unset("dtime"): errors.append( "You must supply a default time diff prior if the smoothing " "has extent over time") if self._container._name == "rate": # This validation only makes sense for Fixed Effects not # Random Effects # TODO This repeats validation logic in cascade.model.rates but I # don't see a good way to bring that in here is_negative = True is_positive = True for prior in ( [self.default.value] + [p for p in self.detail or [] if p.prior_type == "value"]): is_negative = is_negative and prior.min == 0 and prior.max == 0 is_positive = is_positive and prior.min > 0 if prior.min < 0: errors.append( "Rates must be constrained to be >= 0 at all points. " "Add or correct the lower bound") break if self.rate in ["iota", "rho"]: if not (is_negative or is_positive): errors.append( f"Rate {self.rate} must be either fully positive or " f"constrained to zero") return errors
class DataCV(Form): integrand_measure_id: IntField = IntField(nullable=True) value: FloatField = FloatField(nullable=True)
class MyInnerForm(Form): int_field = IntField()
class MyInnerSanctum(Form): int_field = IntField() float_list_field = StringListField(separator=" ", constructor=float) further_in = FormList(EvenMoreInner)