BerkeleyLearnVerify / Scenic

A compiler and scenario generator for the Scenic scenario description language.
https://scenic-lang.org/
Other
256 stars 91 forks source link

oppositeLaneGroup is broken for scenic.domains.driving.model #256

Open abanuelo opened 2 months ago

abanuelo commented 2 months ago

System Details

  1. Python Version: 3.10.12
  2. Scenic Version: 3.0.0b2
  3. Operating System: Linux
  4. Simulator Version: CARLA 0.9.14

Detailed Description

  1. Scenic's oppositeLaneGroup is not working in the scenic.domains.driving.model
  2. Scenic command: scenic examples/driving/pedestrianAcrossRoad.scenic --2d --model scenic.simulators.carla.model --simulate -b
  3. Error:
    Beginning scenario construction...
    pygame 2.5.2 (SDL 2.28.2, Python 3.10.12)
    Hello from the pygame community. https://www.pygame.org/contribute.html
    Loading cached version of road network...
    Loaded cached network in 0.11 seconds.
    Traceback (most recent call last):
    File "/home/abanuelo/Scenic/venv/bin/scenic", line 5, in <module>
    from scenic.__main__ import dummy
    File "/home/abanuelo/Scenic/src/scenic/__main__.py", line 195, in <module>
    scenario = errors.callBeginningScenicTrace(
    File "/home/abanuelo/Scenic/src/scenic/core/errors.py", line 282, in callBeginningScenicTrace
    return func()
    File "/home/abanuelo/Scenic/src/scenic/__main__.py", line 196, in <lambda>
    lambda: translator.scenarioFromFile(
    File "/home/abanuelo/Scenic/src/scenic/syntax/translator.py", line 142, in scenarioFromFile
    return _scenarioFromStream(
    File "/home/abanuelo/Scenic/src/scenic/syntax/translator.py", line 172, in _scenarioFromStream
    compileStream(stream, namespace, compileOptions, filename)
    File "/home/abanuelo/Scenic/src/scenic/syntax/translator.py", line 321, in compileStream
    executeCodeIn(code, namespace)
    File "/home/abanuelo/Scenic/src/scenic/syntax/translator.py", line 560, in executeCodeIn
    exec(code, namespace)
    File "/home/abanuelo/Scenic/examples/driving/pedestrianAcrossRoad.scenic", line 12, in <module>
    new Pedestrian on visible ego.oppositeLaneGroup.sidewalk
    File "/home/abanuelo/Scenic/src/scenic/syntax/veneer.py", line 1465, in On
    if isA(target, Region) and alwaysProvidesOrientation(target):
    File "/home/abanuelo/Scenic/src/scenic/syntax/veneer.py", line 1520, in alwaysProvidesOrientation
    sample = region.sample()
    File "/home/abanuelo/Scenic/src/scenic/core/distributions.py", line 149, in sample
    subsamples[child] = child.sample(subsamples)
    File "/home/abanuelo/Scenic/src/scenic/core/distributions.py", line 149, in sample
    subsamples[child] = child.sample(subsamples)
    File "/home/abanuelo/Scenic/src/scenic/core/distributions.py", line 149, in sample
    subsamples[child] = child.sample(subsamples)
    [Previous line repeated 1 more time]
    File "/home/abanuelo/Scenic/src/scenic/core/distributions.py", line 150, in sample
    return self._conditioned.sampleGiven(subsamples)
    File "/home/abanuelo/Scenic/src/scenic/core/distributions.py", line 674, in sampleGiven
    return getattr(obj, self.attribute)
    File "/home/abanuelo/Scenic/src/scenic/domains/driving/roads.py", line 545, in opposite
    return _rejectIfNonexistent(self._opposite, "opposite lane group")
    File "/home/abanuelo/Scenic/src/scenic/domains/driving/roads.py", line 68, in _rejectIfNonexistent
    _rejectSample(f"requested {name} does not exist")
    File "/home/abanuelo/Scenic/src/scenic/domains/driving/roads.py", line 61, in _rejectSample
    raise InvalidScenarioError(message)
    scenic.core.errors.InvalidScenarioError: requested opposite lane group does not exist

Steps To Reproduce

Clone the repo and run the Scenic command mentioned above.

Issue Submission Checklist

Eric-Vin commented 3 days ago

Note: This issue is due to alwaysProvidesOrientation utilizing sampling as a heuristic. This can trigger a rejection, and because the scene is fixed, a subsequent error.

Eric-Vin commented 3 days ago

The immediate problem is an error being raised, which is done by the driving domain when it detects that a rejection is being done at compile time. This is because the driving domain thinks this scenario has inconsistent requirements, due to a rejection being raised before sampling has even been attempted.

A solution might include a new flag indicating whether or not rejections should immediately translate to errors, which alwaysProvidesOrientation (or other functions which might need to do heuristic sampling at compile time) could toggle on/off as needed and the driving domain (and other code that is seeking to detect invalid scenarios) could check before raising an invalid scenario error.

Eric-Vin commented 1 day ago

Can be reproduced with the following command: scenic examples/driving/pedestrianAcrossRoad.scenic --2d --gather-stats 1 --seed 19

Eric-Vin commented 1 day ago

In PR #287 the command no longer causes an invalid scenario error.