Skip to content

Defining constraints examples

Example: fully random example

OSC2 code: fully random
import "$FTX_BASIC/exe_platforms/sumo_ssp/config/sumo_config.osc"

extend test_config:
    set map = "$FTX_PACKAGES/maps/hooder.xodr"

extend top.main:
    do sut.car.drive(duration: 5s)


extend top.main:
    tolerance: int

Example: fully directed example

OSC2 code: fully directed
import "$FTX_BASIC/exe_platforms/sumo_ssp/config/sumo_config.osc"

extend test_config:
    set map = "$FTX_PACKAGES/maps/hooder.xodr"

extend top.main:
    do sut.car.drive(duration: 5s)

scenario sut.scenario1:
    my_speed: speed


    keep(my_speed == 50kph) # my_speed is set to 50 kph

Example: constrained random example

OSC2 code: constrained random
import "$FTX_BASIC/exe_platforms/sumo_ssp/config/sumo_config.osc"

extend test_config:
    set map = "$FTX_PACKAGES/maps/hooder.xodr"

extend top.main:
    do sut.car.drive(duration: 5s)

scenario sut.scenario1:
    my_speed: speed


    keep(my_speed in [30..80]kph) # my_speed is restricted to a range

Example: simple Boolean constraint

OSC2 code: simple Boolean constraint
import "$FTX_BASIC/exe_platforms/sumo_ssp/config/sumo_config.osc"

extend test_config:
    set map = "$FTX_PACKAGES/maps/hooder.xodr"

extend top.main:
    do sut.car.drive(duration: 5s)

scenario sut.scenario1:


    my_speed: speed with:
        keep(it in [30..80]kph)

Example: simple Boolean constraint with 'in'

OSC2 code: simple Boolean constraint with 'in'
import "$FTX_BASIC/exe_platforms/sumo_ssp/config/sumo_config.osc"

extend test_config:
    set map = "$FTX_PACKAGES/maps/hooder.xodr"

extend top.main:
    do sut.car.drive(duration: 5s)


enum my_driving_style: [aggressive, assertive, normal, timid]

struct misc:
    dist: length with:
        keep(it in [2..4]m)
    i: int with:
        keep(it in [-1..1])

    ms: my_driving_style with:
        keep(it in [assertive, timid])

Example: compound Boolean constraint example 1

OSC2 code: compound Boolean constraint example 1
import "$FTX_BASIC/exe_platforms/sumo_ssp/config/sumo_config.osc"

extend test_config:
    set map = "$FTX_PACKAGES/maps/hooder.xodr"

extend top.main:
    do sut.car.drive(duration: 5s)

scenario sut.scenario1:
    lawful_driver: bool
    legal_speed: speed
    current_speed: speed


    keep(lawful_driver => (current_speed <= legal_speed))

Example: compound Boolean constraint example 2

OSC2 code: compound Boolean constraint example 2
import "$FTX_BASIC/exe_platforms/sumo_ssp/config/sumo_config.osc"

extend test_config:
    set map = "$FTX_PACKAGES/maps/hooder.xodr"

extend top.main:
    do sut.car.drive(duration: 5s)

scenario sut.scenario1:
    x: uint
    y: uint


    # both constraint expressions must evaluate to true
    keep(x <= 3 and x > y)

    # at least one constraint expression must evaluate to true
    keep(x <= 3 or x > y)

    # if the first expression evaluates to true, the second one must
    # also evaluate to true
    keep((x <= 3) => (x > y))

Example: list constraint

OSC2 code: list constraint
import "$FTX_BASIC/exe_platforms/sumo_ssp/config/sumo_config.osc"

extend test_config:
    set map = "$FTX_PACKAGES/maps/hooder.xodr"

extend top.main:
    do sut.car.drive(duration: 5s)


actor my_car_convoy:
    first_car: vehicle
    cars: list of vehicle

    # the list will have between 2 and 10 items
    # the first item is first_car
    keep(soft cars.size() <= 10)
    keep(soft cars.size() >=  2)
    keep(cars[0] == first_car) # list indexing

Example: hard constraint

OSC2 code: hard constraint
import "$FTX_BASIC/exe_platforms/sumo_ssp/config/sumo_config.osc"

extend test_config:
    set map = "$FTX_PACKAGES/maps/hooder.xodr"

extend top.main:
    do sut.car.drive(duration: 5s)

scenario sut.scenario1:


    current_speed: speed with:
        keep(it == 25kph)

Example: soft constraint example 1

OSC2 code: soft constraint example 1
import "$FTX_BASIC/exe_platforms/sumo_ssp/config/sumo_config.osc"

extend test_config:
    set map = "$FTX_PACKAGES/maps/hooder.xodr"

extend top.main:
    do sut.car.drive(duration: 5s)

scenario sut.scenario1:


    color: car_color with:
        keep(soft it!= green)

Example: soft with compound constraints

OSC2 code: soft with compound constraints
import "$FTX_BASIC/exe_platforms/sumo_ssp/config/sumo_config.osc"

extend test_config:
    set map = "$FTX_PACKAGES/maps/hooder.xodr"

extend top.main:
    a: int
    b: int


    keep(soft a == 1 and b == 0)
    keep(soft a == 10)


    do sut.car.drive(duration: 5s)

Example: using soft when passing parameters

OSC2 code: using soft when passing parameters
import "$FTX_BASIC/exe_platforms/sumo_ssp/config/sumo_config.osc"

extend test_config:
    set map = "$FTX_PACKAGES/maps/hooder.xodr"
    set min_test_time = 0second


scenario top.foo:
  a: int

extend top.main:
  do foo(a: soft 123)

  on @start:
    call logger.log_info("foo.a: $(label(foo).a)")

Example: default constraints

OSC2 code: default constraints
import "$FTX_BASIC/exe_platforms/sumo_ssp/config/sumo_config.osc"

extend test_config:
    set map = "$FTX_PACKAGES/maps/hooder.xodr"

extend top.main:

    do sut.car.drive(duration: 5s)


scenario sut.scenario1:
    b: uint
    c: uint

    keep(default b == 10)
    keep(default c == 20)

    keep(b == 1 and c == 2)      # contradiction
    keep(soft b == 1 and c == 2) # b and c get default values

    keep(b > 20) # contradiction
    keep(b > 5)  # b gets 10

    keep(b in [12..18]) # b gets 16
    keep(b == 7) # b gets 7
    keep(b == c) # b and c get 20

    do log_info("### b: $(b); c: $(c)")

Example: default constraint

OSC2 code: default constraint example
import "$FTX_BASIC/exe_platforms/sumo_ssp/config/sumo_config.osc"


scenario vehicle.foo:
    x: int with:
        keep(default it == 0)
    y: int with:
        keep(it!= x)


extend test_config:
    set map = "$FTX_PACKAGES/maps/hooder.xodr"

extend top.main:
    do sut.car.drive(duration: 5s)

Example: soft constraint example 2

OSC2 code: soft constraint example 2
import "$FTX_BASIC/exe_platforms/sumo_ssp/config/sumo_config.osc"

extend test_config:
    set map = "$FTX_PACKAGES/maps/hooder.xodr"

extend top.main:
    do sut.car.drive(duration: 5s)


scenario vehicle.foo:
    x: int with:
        keep(soft it == 0)
    y: int with:
        keep(it!= x)

Example: remove_default() constraint

OSC2 code: remove_default() constraint
import "$FTX_BASIC/exe_platforms/sumo_ssp/config/sumo_config.osc"

extend test_config:
    set map = "$FTX_PACKAGES/maps/hooder.xodr"

extend top.main:
    do sut.car.drive(duration: 5s)


scenario vehicle.foo:
    x: int with:
        keep(default it == 0)
    y: int with:
        keep(it!= x)
    do drive(duration: 5s)

extend vehicle.foo:
    remove_default(x)
    keep(y == 0)

Example: weighted distribution method example

OSC2 code: weighted distribution method example
import "$FTX_BASIC/exe_platforms/sumo_ssp/config/sumo_config.osc"

scenario top.set_values:
    def foo()-> length is empty

extend test_config:
    set map = "$FTX_PACKAGES/maps/hooder.xodr"
    set min_test_time = 0second


extend top.set_values:
    side: av_side # assign left, right in a 20 : 80 ratio
    keep(soft side == weighted(20: left, 80: right))

    top_speed: speed # assign a value from one of three buckets in a 10:30:10 ratio
    keep(soft top_speed == weighted(10: [20..30]kph,
                                    30: [30..70]kph,
                                    10: [70..120]kph))

    dist: length # assign 10m and the return value of foo() in a 50 : 50 ratio
    keep(soft dist == weighted(50: 10m, 50: foo()))

    num_of_wheels: int # assign 4 or 10 wheels in a 50 : 50 ratio
    keep(soft num_of_wheels == weighted(50: 4, 50: 10))


extend top.main:

    do top.set_values()

Example: random distribution method examples

OSC2 code: random distribution method examples
import "$FTX_BASIC/exe_platforms/sumo_ssp/config/sumo_config.osc"

extend test_config:
    set map = "$FTX_PACKAGES/maps/hooder.xodr"
    set min_test_time = 0second


extend top.main:
    top_speed: speed
    keep(soft top_speed == random.normal(55.5, 7) * 1kph)

    top_speed_truncated: speed
    keep(soft top_speed_truncated == random.truncated_normal(10, 120, 55.5, 7) * 1kph)


    dist: length
    keep(soft dist == random.uniform(20, 50.5) * 1m)

    end_speed: speed
    keep(soft end_speed == weighted(
        30: [20..30]kph,
        70: random.truncated_normal(10, 120, 55.5, 7) * 1kph))

Example: user-defined distribution method example

OSC2 code: user-defined distribution method example
import "$FTX/qa/regression/config/av_fake_ssp.osc"


extend random:
    def distribute_int(i: int, j: int) -> int is empty

scenario sut.my_scenario:
    num_of_cars: int
    keep(soft num_of_cars == random.distribute_int(1,5))


extend top.main:
    do sut.my_scenario()