Spaces:
Sleeping
Sleeping
| # Copyright (c) Meta Platforms, Inc. and affiliates. | |
| # All rights reserved. | |
| # | |
| # This source code is licensed under the BSD-style license found in the | |
| # LICENSE file in the root directory of this source tree. | |
| """ | |
| Dataset for the Constraint Environment. | |
| Three difficulty tiers (easy / medium / hard) with increasing structural | |
| complexity for translating natural-language scheduling constraints into a | |
| JSON-based AST DSL. | |
| day_names = ["Mon", "Tue", "Wed", "Thr", "Fri", "Sat"] | |
| slot_names = [ | |
| "9:00", "10:00", "11:00", "12:00", | |
| "BREAK", | |
| "2:00", "3:00", "4:00", "5:00" | |
| ] | |
| """ | |
| dataset = { | |
| # ------------------------------------------------------------------ | |
| # EASY | |
| # ------------------------------------------------------------------ | |
| "easy": [ | |
| { | |
| "prompt": "The branch CS must not have classes on Wednesday and on 12:00. ", | |
| "target_ast": | |
| { | |
| "type": "hard", | |
| "name": "cs_department_meeting", | |
| "forall": [ | |
| {"b": "branches"}, | |
| {"sub": {"subjects": "b"}}, | |
| {"d": "days"}, | |
| {"s": "slots"} | |
| ], | |
| "where": { | |
| "operator": "AND", | |
| "left": { | |
| "operator": "==", | |
| "left": {"name":"b"}, | |
| "right": "CS" | |
| }, | |
| "right": { | |
| "operator": "AND", | |
| "left": { | |
| "operator": "==", | |
| "left": "d", | |
| "right": 2 | |
| }, | |
| "right": { | |
| "operator": "==", | |
| "left": "s", | |
| "right": 3 | |
| } | |
| } | |
| }, | |
| "assert": { | |
| "operator": "==", | |
| "left": { | |
| "target": "schedule", | |
| "args": [{"name": "b"}, {"name":"sub" }, "d", "s"] | |
| }, | |
| "right": 0 | |
| } | |
| } | |
| }, | |
| { | |
| "prompt": "'Dr. smith' must not have any class on fridays", | |
| "target_ast":{ | |
| "type": "hard", | |
| "name": "dr_smith_friday_off", | |
| "forall": [ | |
| {"b": "branches"}, | |
| {"sub": {"subjects": "b"}}, | |
| {"s": "slots"} | |
| ], | |
| "where": { | |
| "operator": "in", | |
| "left": "Dr. smith", | |
| "right": {"teachers": "sub"} | |
| }, | |
| "assert": { | |
| "operator": "==", | |
| "left": { | |
| "target": "schedule", | |
| "args": [{"name": "b"}, {"name":"sub" }, 4, "s"] | |
| }, | |
| "right": 0 | |
| } | |
| } | |
| } | |
| ], | |
| # ------------------------------------------------------------------ | |
| # MEDIUM | |
| # ------------------------------------------------------------------ | |
| "medium": [ | |
| { | |
| "prompt": ( | |
| "Subjects must be equal to their defined frequency" | |
| ), | |
| "target_ast": { | |
| "type": "hard", | |
| "name": "subject_weekly_frequency", | |
| "forall": [ | |
| {"b": "branches"}, | |
| {"sub": {"subjects": "b"}} | |
| ], | |
| "assert": { | |
| "operator": "==", | |
| "left": { | |
| "operator": "sum", | |
| "over": [ | |
| {"d": "days"}, | |
| {"s": "slots"} | |
| ], | |
| "expression": { | |
| "target": "schedule", | |
| "args": [{"name": "b"}, {"name":"sub" }, "d", "s"] | |
| } | |
| }, | |
| "right": {"frequency": "sub"} | |
| } | |
| } | |
| }, | |
| { | |
| "prompt": ( | |
| "Each subject must occur at most 1 time per day. " | |
| ), | |
| "target_ast": { | |
| "type": "hard", | |
| "name": "max_one_occurrence_per_day", | |
| "forall": [ | |
| {"b": "branches"}, | |
| {"sub": {"subjects": "b"}}, | |
| {"d": "days"} | |
| ], | |
| "assert": { | |
| "operator": "<=", | |
| "left": { | |
| "operator": "sum", | |
| "over": [ | |
| {"s": "slots"} | |
| ], | |
| "expression": { | |
| "target": "schedule", | |
| "args": [{"name": "b"}, {"name":"sub" }, "d", "s"] | |
| } | |
| }, | |
| "right": 1 | |
| } | |
| } | |
| }, | |
| ], | |
| # ------------------------------------------------------------------ | |
| # HARD | |
| # ------------------------------------------------------------------ | |
| "hard": [ | |
| { | |
| "prompt": ( | |
| "No classes should be scheduled on Saturday, except for online classes." | |
| ), | |
| "target_ast":{ | |
| "type": "hard", | |
| "name": "no_classes_on_saturday", | |
| "forall": [ | |
| {"b": "branches"}, | |
| {"sub": {"subjects": "b"}}, | |
| {"d": "days"}, | |
| {"s": "slots"} | |
| ], | |
| "where": { | |
| "operator": "AND", | |
| "left": | |
| { | |
| "operator": "==", | |
| "left": "d", | |
| "right": 5 | |
| }, | |
| "right": | |
| { | |
| "operator": "!=", | |
| "left": {"type": "sub"}, | |
| "right": "online" | |
| } | |
| }, | |
| "assert": { | |
| "operator": "==", | |
| "left": { | |
| "target": "schedule", | |
| "args": [{"name": "b"}, {"name":"sub" }, "d", "s"] | |
| }, | |
| "right": 0 | |
| } | |
| } | |
| }, | |
| { | |
| "prompt": ( | |
| "Every teacher must teach one class at a time." | |
| ), | |
| "target_ast": { | |
| "type": "hard", | |
| "name": "teacher_no_double_booking", | |
| "forall": [ | |
| {"teacher": "teachers"}, | |
| {"d": "days"}, | |
| {"t": "slots"} | |
| ], | |
| "assert": { | |
| "operator": "<=", | |
| "left": { | |
| "operator": "sum", | |
| "over": [ | |
| {"b": "branches"}, | |
| {"sub": {"subjects": "b"}} | |
| ], | |
| "expression": { | |
| "target": "occupies_teacher", | |
| "args": ["b", "sub", "teacher", "d", "t"] | |
| } | |
| }, | |
| "right": 1 | |
| } | |
| }, | |
| }, | |
| ], | |
| } | |
| # dataset = { | |
| # # ------------------------------------------------------------------ | |
| # # EASY – single quantifier, no WHERE clause, direct assert | |
| # # ------------------------------------------------------------------ | |
| # "easy": [ | |
| # { | |
| # "prompt": ( | |
| # "No classes should be scheduled on Saturday." | |
| # ), | |
| # "target_ast": { | |
| # "type": "hard", | |
| # "name": "no_saturday_classes", | |
| # "forall": [ | |
| # {"var": "b", "domain": "branches"}, | |
| # {"var": "sub", "domain": "subjects"}, | |
| # {"var": "d", "domain": "days"}, | |
| # {"var": "s", "domain": "slots"}, | |
| # ], | |
| # "where": "d == 5", | |
| # "assert": "schedule(b, sub, d, s) == 0", | |
| # }, | |
| # }, | |
| # { | |
| # "prompt": ( | |
| # "Every teacher must teach at least one subject." | |
| # ), | |
| # "target_ast": { | |
| # "type": "soft", | |
| # "name": "teacher_teaches_one", | |
| # "forall": [ | |
| # {"var": "t", "domain": "teachers"}, | |
| # ], | |
| # "assert": "SUM(teaches(t, sub)) >= 1", | |
| # }, | |
| # }, | |
| # ], | |
| # # ------------------------------------------------------------------ | |
| # # MEDIUM – two quantifiers, WHERE clause, combined assert | |
| # # ------------------------------------------------------------------ | |
| # "medium": [ | |
| # { | |
| # "prompt": ( | |
| # "No non-online classes should be scheduled on Saturday." | |
| # ), | |
| # "target_ast": { | |
| # "type": "hard", | |
| # "name": "no_non_online_saturday", | |
| # "forall": [ | |
| # {"var": "b", "domain": "branches"}, | |
| # {"var": "sub", "domain": "subjects"}, | |
| # {"var": "d", "domain": "days"}, | |
| # {"var": "s", "domain": "slots"}, | |
| # ], | |
| # "where": "subject_type(b, sub) != 'online' AND d == 5", | |
| # "assert": "schedule(b, sub, d, s) == 0", | |
| # }, | |
| # }, | |
| # { | |
| # "prompt": ( | |
| # "A teacher cannot be assigned to two different slots at the same time." | |
| # ), | |
| # "target_ast": { | |
| # "type": "hard", | |
| # "name": "no_teacher_time_conflict", | |
| # "forall": [ | |
| # {"var": "t", "domain": "teachers"}, | |
| # {"var": "d", "domain": "days"}, | |
| # {"var": "s", "domain": "slots"}, | |
| # ], | |
| # "assert": "COUNT(occupies_teacher(t, d, s)) <= 1", | |
| # }, | |
| # }, | |
| # ], | |
| # # ------------------------------------------------------------------ | |
| # # HARD – multiple quantifiers, nested WHERE + AND/OR, minimize | |
| # # ------------------------------------------------------------------ | |
| # "hard": [ | |
| # { | |
| # "prompt": ( | |
| # "Minimize the number of occupied slots for each branch on any given day, " | |
| # "but only for subjects that are labelled as practical." | |
| # ), | |
| # "target_ast": { | |
| # "type": "soft", | |
| # "name": "minimize_practical_slots", | |
| # "forall": [ | |
| # {"var": "b", "domain": "branches"}, | |
| # {"var": "sub", "domain": "subjects"}, | |
| # {"var": "d", "domain": "days"}, | |
| # {"var": "s", "domain": "slots"}, | |
| # ], | |
| # "where": "subject_type(b, sub) == 'practical'", | |
| # "minimize": "SUM(occupies(b, sub, d, s))", | |
| # }, | |
| # }, | |
| # { | |
| # "prompt": ( | |
| # "No branch may have more than four scheduled slots in a single day, " | |
| # "unless a subject is online, in which case it may occupy one extra slot." | |
| # ), | |
| # "target_ast": { | |
| # "type": "hard", | |
| # "name": "daily_slot_cap", | |
| # "forall": [ | |
| # {"var": "b", "domain": "branches"}, | |
| # {"var": "d", "domain": "days"}, | |
| # {"var": "sub", "domain": "subjects"}, | |
| # {"var": "s", "domain": "slots"}, | |
| # ], | |
| # "assert": ( | |
| # "SUM(schedule(b, sub, d, s)) <= 4 OR " | |
| # "(subject_type(b, sub) == 'online' AND SUM(schedule(b, sub, d, s)) <= 5)" | |
| # ), | |
| # }, | |
| # }, | |
| # ], | |
| # } | |