{
  "appeals": 1,
  "budgets": {
    "baseline_limit_s": 600,
    "verification_timeout_s": 600,
    "worker": {
      "max_completion_tokens": 96000,
      "max_turns": 60,
      "max_wall_seconds": 1500.0,
      "prompt_token_budget": 160000
    }
  },
  "issue": "Bug where sensitivity mapping no longer supports tuple step_size\nIn a previous issue, we made it so that the `number_of_steps` in the `Sensitivity` class could be a tuple so that different dimensions had\r\ndifferent steps:\r\n\r\n```\r\nsensitivity = af.Sensitivity(\r\n    paths=paths,\r\n    simulation_instance=simulation_instance,\r\n    base_model=base_model,\r\n    perturb_model=perturb_model,\r\n    simulate_cls=SimulateImaging(mask=mask, psf=dataset.psf),\r\n    base_fit_cls=BaseFit(adapt_result=result),\r\n    perturb_fit_cls=PerturbFit(adapt_result=result),\r\n    perturb_model_prior_func=perturb_model_prior_func,\r\n  #  number_of_steps=2,\r\n    number_of_steps=(4, 3, 2),\r\n    number_of_cores=2,\r\n)\r\n```\r\n\r\nWe have since added a function which customized the prior on sensitivity mapping:\r\n\r\n```\r\n    @property\r\n    def _perturb_models(self) -> Generator[AbstractPriorModel, None, None]:\r\n        \"\"\"\r\n        A list of models representing a perturbation at each grid square.\r\n\r\n        By default models have priors with limits at the edges of a grid square.\r\n        These limits can be scaled using the limit_scale variable. If the variable\r\n        is 2 then the priors will have width twice the step size.\r\n        \"\"\"\r\n        half_step = self.limit_scale * self.step_size / 2\r\n        for list_ in self._lists:\r\n            limits = [\r\n                (\r\n                    prior.value_for(max(0.0, centre - half_step)),\r\n                    prior.value_for(min(1.0, centre + half_step)),\r\n                )\r\n                for centre, prior in zip(list_, self.perturb_model.priors_ordered_by_id)\r\n            ]\r\n            yield self.perturb_model.with_limits(limits)\r\n```\r\n\r\nWhen a tuple is used the following error is raised:\r\n\r\n```\r\nTraceback (most recent call last):\r\n  File \"/mnt/c/Users/Jammy/Code/PyAuto/autolens_workspace/scripts/imaging/advanced/subhalo/sensitivity/start_here.py\", line 618, in <module>\r\n    sensitivity_result = sensitivity.run()\r\n  File \"/mnt/c/Users/Jammy/Code/PyAuto/PyAutoFit/autofit/non_linear/grid/sensitivity.py\", line 311, in run\r\n    for result in process_class.run_jobs(\r\n  File \"/mnt/c/Users/Jammy/Code/PyAuto/PyAutoFit/autofit/non_linear/parallel/process.py\", line 162, in run_jobs\r\n    for job in jobs:\r\n  File \"/mnt/c/Users/Jammy/Code/PyAuto/PyAutoFit/autofit/non_linear/grid/sensitivity.py\", line 430, in _make_jobs\r\n    for number, (perturb_instance, perturb_model, label) in enumerate(\r\n  File \"/mnt/c/Users/Jammy/Code/PyAuto/PyAutoFit/autofit/non_linear/grid/sensitivity.py\", line 412, in _perturb_models\r\n    half_step = self.limit_scale * self.step_size / 2\r\nTypeError: unsupported operand type(s) for /: 'tuple' and 'int'\r\n```",
  "source": {
    "image": "docker.io/swerebenchv2/rhayes777-pyautofit:888-b0ec41b",
    "platform": "linux/amd64",
    "python": "python",
    "setup": [
      "python -c 'import base64; from pathlib import Path; Path('\"'\"'/tmp/receipts-rhayes777__pyautofit-888-test.patch'\"'\"').write_bytes(base64.b64decode('\"'\"'ZGlmZiAtLWdpdCBhL3Rlc3RfYXV0b2ZpdC9ub25fbGluZWFyL2dyaWQvdGVzdF9zZW5zaXRpdml0eS90ZXN0X2Z1bmN0aW9uYWxpdHkucHkgYi90ZXN0X2F1dG9maXQvbm9uX2xpbmVhci9ncmlkL3Rlc3Rfc2Vuc2l0aXZpdHkvdGVzdF9mdW5jdGlvbmFsaXR5LnB5CmluZGV4IDVmYjQ2NzcwZC4uNGQxMzMwZDFjIDEwMDY0NAotLS0gYS90ZXN0X2F1dG9maXQvbm9uX2xpbmVhci9ncmlkL3Rlc3Rfc2Vuc2l0aXZpdHkvdGVzdF9mdW5jdGlvbmFsaXR5LnB5CisrKyBiL3Rlc3RfYXV0b2ZpdC9ub25fbGluZWFyL2dyaWQvdGVzdF9zZW5zaXRpdml0eS90ZXN0X2Z1bmN0aW9uYWxpdHkucHkKQEAgLTI4LDcgKzI4LDYgQEAgZGVmIHRlc3RfbGFiZWxzKHNlbnNpdGl2aXR5KToKICAgICBdCiAKIAotCiBkZWYgdGVzdF9wZXJmb3JtX2pvYihqb2IpOgogICAgIHJlc3VsdCA9IGpvYi5wZXJmb3JtKCkKICAgICBhc3NlcnQgaXNpbnN0YW5jZShyZXN1bHQsIHMuSm9iUmVzdWx0KQpAQCAtNDAsMjMgKzM5LDMzIEBAIGNsYXNzIFRlc3RQZXJ0dXJiYXRpb25Nb2RlbHM6CiAgICAgQHB5dGVzdC5tYXJrLnBhcmFtZXRyaXplKAogICAgICAgICAibGltaXRfc2NhbGUsIGZsLCBmdSwgc2wsIHN1IiwKICAgICAgICAgWwotICAgICAgICAgICAgKDEuMCwgMC4wLCAwLjUsIDAuNSwgMS4wLCksCi0gICAgICAgICAgICAoMi4wLCAwLjAsIDAuNzUsIDAuMjUsIDEuMCwpLAotICAgICAgICAgICAgKDQuMCwgMC4wLCAxLjAsIDAuMCwgMS4wLCksCi0gICAgICAgIF0KKyAgICAgICAgICAgICgKKyAgICAgICAgICAgICAgICAxLjAsCisgICAgICAgICAgICAgICAgMC4wLAorICAgICAgICAgICAgICAgIDAuNSwKKyAgICAgICAgICAgICAgICAwLjUsCisgICAgICAgICAgICAgICAgMS4wLAorICAgICAgICAgICAgKSwKKyAgICAgICAgICAgICgKKyAgICAgICAgICAgICAgICAyLjAsCisgICAgICAgICAgICAgICAgMC4wLAorICAgICAgICAgICAgICAgIDAuNzUsCisgICAgICAgICAgICAgICAgMC4yNSwKKyAgICAgICAgICAgICAgICAxLjAsCisgICAgICAgICAgICApLAorICAgICAgICAgICAgKAorICAgICAgICAgICAgICAgIDQuMCwKKyAgICAgICAgICAgICAgICAwLjAsCisgICAgICAgICAgICAgICAgMS4wLAorICAgICAgICAgICAgICAgIDAuMCwKKyAgICAgICAgICAgICAgICAxLjAsCisgICAgICAgICAgICApLAorICAgICAgICBdLAogICAgICkKLSAgICBkZWYgdGVzdF9wZXJ0dXJiX21vZGVscygKLSAgICAgICAgICAgIHNlbGYsCi0gICAgICAgICAgICBzZW5zaXRpdml0eSwKLSAgICAgICAgICAgIGxpbWl0X3NjYWxlLAotICAgICAgICAgICAgZmwsIGZ1LCBzbCwgc3UKLSAgICApOgorICAgIGRlZiB0ZXN0X3BlcnR1cmJfbW9kZWxzKHNlbGYsIHNlbnNpdGl2aXR5LCBsaW1pdF9zY2FsZSwgZmwsIGZ1LCBzbCwgc3UpOgogICAgICAgICBzZW5zaXRpdml0eS5saW1pdF9zY2FsZSA9IGxpbWl0X3NjYWxlCiAgICAgICAgIGpvYnMgPSBzZW5zaXRpdml0eS5fbWFrZV9qb2JzKCkKLSAgICAgICAgbW9kZWxzID0gWwotICAgICAgICAgICAgam9iLnBlcnR1cmJfbW9kZWwKLSAgICAgICAgICAgIGZvciBqb2IgaW4gam9icwotICAgICAgICBdCisgICAgICAgIG1vZGVscyA9IFtqb2IucGVydHVyYl9tb2RlbCBmb3Igam9iIGluIGpvYnNdCiAKICAgICAgICAgZmlyc3QsIHNlY29uZCwgKl8gPSBtb2RlbHMKIApAQCAtNjgsMjQgKzc3LDE3IEBAIGNsYXNzIFRlc3RQZXJ0dXJiYXRpb25Nb2RlbHM6CiAgICAgICAgIGFzc2VydCBzZWNvbmQuc2lnbWEudXBwZXJfbGltaXQgPT0gc3UKIAogICAgIGRlZiB0ZXN0X19wZXJ0dXJiX21vZGVsc19fcHJpb3Jfb3ZlcndyaXRlX3ZpYV9wZXJ0dXJiX21vZGVsX3ByaW9yX2Z1bmMoCi0gICAgICAgICAgICBzZWxmLAotICAgICAgICAgICAgc2Vuc2l0aXZpdHksCisgICAgICAgIHNlbGYsCisgICAgICAgIHNlbnNpdGl2aXR5LAogICAgICk6Ci0gICAgICAgIGRlZiBwZXJ0dXJiX21vZGVsX3ByaW9yX2Z1bmMoCi0gICAgICAgICAgICAgICAgcGVydHVyYl9pbnN0YW5jZSwKLSAgICAgICAgICAgICAgICBwZXJ0dXJiX21vZGVsCi0gICAgICAgICk6Ci0KKyAgICAgICAgZGVmIHBlcnR1cmJfbW9kZWxfcHJpb3JfZnVuYyhwZXJ0dXJiX2luc3RhbmNlLCBwZXJ0dXJiX21vZGVsKToKICAgICAgICAgICAgIHBlcnR1cmJfbW9kZWwuY2VudHJlID0gYWYuVW5pZm9ybVByaW9yKGxvd2VyX2xpbWl0PS03LjAsIHVwcGVyX2xpbWl0PTQuMCkKIAogICAgICAgICAgICAgcmV0dXJuIHBlcnR1cmJfbW9kZWwKIAogICAgICAgICBzZW5zaXRpdml0eS5wZXJ0dXJiX21vZGVsX3ByaW9yX2Z1bmMgPSBwZXJ0dXJiX21vZGVsX3ByaW9yX2Z1bmMKICAgICAgICAgam9icyA9IHNlbnNpdGl2aXR5Ll9tYWtlX2pvYnMoKQotICAgICAgICBtb2RlbHMgPSBbCi0gICAgICAgICAgICBqb2IucGVydHVyYl9tb2RlbAotICAgICAgICAgICAgZm9yIGpvYiBpbiBqb2JzCi0gICAgICAgIF0KKyAgICAgICAgbW9kZWxzID0gW2pvYi5wZXJ0dXJiX21vZGVsIGZvciBqb2IgaW4gam9ic10KIAogICAgICAgICBmaXJzdCwgc2Vjb25kLCAqXyA9IG1vZGVscwogCkBAIC05NCwyNiArOTYsMjEgQEAgY2xhc3MgVGVzdFBlcnR1cmJhdGlvbk1vZGVsczoKICAgICAgICAgYXNzZXJ0IGZpcnN0LmNlbnRyZS5sb3dlcl9saW1pdCA9PSAtNy4wCiAgICAgICAgIGFzc2VydCBmaXJzdC5jZW50cmUudXBwZXJfbGltaXQgPT0gNC4wCiAKLSAgICBkZWYgdGVzdF9waHlzaWNhbCgKLSAgICAgICAgICAgIHNlbGYsCi0gICAgICAgICAgICBzZW5zaXRpdml0eQotICAgICk6Ci0gICAgICAgIHNlbnNpdGl2aXR5LnBlcnR1cmJfbW9kZWwuc2lnbWEgPSBhZi5Vbmlmb3JtUHJpb3IoCi0gICAgICAgICAgICB1cHBlcl9saW1pdD0xMAotICAgICAgICApCi0gICAgICAgIG1vZGVsID0gbGlzdCgKLSAgICAgICAgICAgIHNlbnNpdGl2aXR5Ll9tYWtlX2pvYnMoKQotICAgICAgICApWzBdLnBlcnR1cmJfbW9kZWwKKyAgICBkZWYgdGVzdF9waHlzaWNhbChzZWxmLCBzZW5zaXRpdml0eSk6CisgICAgICAgIHNlbnNpdGl2aXR5LnBlcnR1cmJfbW9kZWwuc2lnbWEgPSBhZi5Vbmlmb3JtUHJpb3IodXBwZXJfbGltaXQ9MTApCisgICAgICAgIG1vZGVsID0gbGlzdChzZW5zaXRpdml0eS5fbWFrZV9qb2JzKCkpWzBdLnBlcnR1cmJfbW9kZWwKICAgICAgICAgYXNzZXJ0IG1vZGVsLnNpZ21hLnVwcGVyX2xpbWl0ID09IDUKIAogICAgIGRlZiB0ZXN0X21vZGVsX3dpdGhfbGltaXRzKHNlbGYpOgogICAgICAgICBtb2RlbCA9IGFmLk1vZGVsKGFmLkdhdXNzaWFuKQogCi0gICAgICAgIHdpdGhfbGltaXRzID0gbW9kZWwud2l0aF9saW1pdHMoWwotICAgICAgICAgICAgKDAuMywgMC41KSwKLSAgICAgICAgICAgICgwLjMsIDAuNSksCi0gICAgICAgICAgICAoMC4zLCAwLjUpLAotICAgICAgICBdKQorICAgICAgICB3aXRoX2xpbWl0cyA9IG1vZGVsLndpdGhfbGltaXRzKAorICAgICAgICAgICAgWworICAgICAgICAgICAgICAgICgwLjMsIDAuNSksCisgICAgICAgICAgICAgICAgKDAuMywgMC41KSwKKyAgICAgICAgICAgICAgICAoMC4zLCAwLjUpLAorICAgICAgICAgICAgXQorICAgICAgICApCiAgICAgICAgIGFzc2VydCB3aXRoX2xpbWl0cy5jZW50cmUubG93ZXJfbGltaXQgPT0gMC4zCiAgICAgICAgIGFzc2VydCB3aXRoX2xpbWl0cy5jZW50cmUudXBwZXJfbGltaXQgPT0gMC41CiAKQEAgLTEyNiw4ICsxMjMsMjEgQEAgY2xhc3MgVGVzdFBlcnR1cmJhdGlvbk1vZGVsczoKICAgICAgICAgYXNzZXJ0IHByaW9yLnVwcGVyX2xpbWl0ID09IDUKIAogICAgIGRlZiB0ZXN0X2V4aXN0aW5nX2xpbWl0cyhzZWxmKToKLSAgICAgICAgcHJpb3IgPSBhZi5Vbmlmb3JtUHJpb3IoCi0gICAgICAgICAgICAyLCA0Ci0gICAgICAgICkud2l0aF9saW1pdHMoMywgNSkKKyAgICAgICAgcHJpb3IgPSBhZi5Vbmlmb3JtUHJpb3IoMiwgNCkud2l0aF9saW1pdHMoMywgNSkKICAgICAgICAgYXNzZXJ0IHByaW9yLmxvd2VyX2xpbWl0ID09IDMKICAgICAgICAgYXNzZXJ0IHByaW9yLnVwcGVyX2xpbWl0ID09IDQKKworCitAcHl0ZXN0LmZpeHR1cmUobmFtZT0idHVwbGVfc2Vuc2l0aXZpdHkiKQorZGVmIG1ha2VfdHVwbGVfc2Vuc2l0aXZpdHkoc2Vuc2l0aXZpdHkpOgorICAgIHNlbnNpdGl2aXR5Lm51bWJlcl9vZl9zdGVwcyA9ICgyLCAyLCA0KQorICAgIHJldHVybiBzZW5zaXRpdml0eQorCisKK2RlZiB0ZXN0X21vZGVsc193aXRoX3R1cGxlX3N0ZXBzKHR1cGxlX3NlbnNpdGl2aXR5KToKKyAgICB0dXBsZV9zZW5zaXRpdml0eS5udW1iZXJfb2Zfc3RlcHMgPSAoMiwgMiwgNCkKKyAgICBhc3NlcnQgbGVuKGxpc3QodHVwbGVfc2Vuc2l0aXZpdHkuX3BlcnR1cmJfbW9kZWxzKSkgPT0gMTYKKworCitkZWYgdGVzdF9qb2JzX3dpdGhfdHVwbGVfc3RlcHModHVwbGVfc2Vuc2l0aXZpdHkpOgorICAgIGFzc2VydCBsZW4obGlzdCh0dXBsZV9zZW5zaXRpdml0eS5fbWFrZV9qb2JzKCkpKSA9PSAxNgo='\"'\"'))'",
      "git apply /tmp/receipts-rhayes777__pyautofit-888-test.patch"
    ],
    "workdir": "/PyAutoFit"
  },
  "spec_paths": [
    "test_autofit/non_linear/grid/test_sensitivity/test_functionality.py"
  ],
  "spec_tests": [
    "test_autofit/non_linear/grid/test_sensitivity/test_functionality.py::test_models_with_tuple_steps",
    "test_autofit/non_linear/grid/test_sensitivity/test_functionality.py::test_jobs_with_tuple_steps"
  ],
  "suite_scope": "--no-header -rA --tb=line --color=no -p no:cacheprovider -W ignore::DeprecationWarning test_autofit/non_linear/grid/test_sensitivity/test_functionality.py"
}
