Created
August 15, 2022 02:10
-
-
Save evanthebouncy/ffa855eac2caa38716b3bc8d8b62645a to your computer and use it in GitHub Desktop.
rectangle synthesis
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
from rectangle import is_inside, is_correct, inside, outside, W | |
import random | |
def random_writer(spec): | |
# ignores the spec | |
T, D, L, R = random.randint(0,W), random.randint(0,W), random.randint(0,W), random.randint(0,W) | |
return [T, D, L, R] | |
def better_writer(spec): | |
# get the coordinates of spec that are inside | |
inside_coords = [coord for coord,bool in spec if bool] | |
if inside_coords == []: | |
# if there are no inside coordinates, default to a random | |
return random_writer(spec) | |
# otherwise, use the inside coords to suggest parameters of the rectangle | |
row_coords = [coord[0] for coord in inside_coords] | |
col_coords = [coord[1] for coord in inside_coords] | |
T, D = random.choice(row_coords), random.choice(row_coords) | |
L, R = random.choice(col_coords), random.choice(col_coords) | |
return [T, D, L, R] | |
def program_cheker(prog, spec): | |
return is_correct(prog, spec) | |
# a synthesizer that returns both a working program | |
# and the number of samples it took to find it | |
def get_synthesizer(writer, checker, budget): | |
def synthesizer(spec): | |
prog = writer(spec) | |
for i in range(budget): | |
prog = writer(spec) | |
if checker(prog, spec): | |
return (i, prog) | |
return None | |
return synthesizer | |
if __name__ == '__main__': | |
synthesizer = get_synthesizer(random_writer, program_cheker, 1000) | |
spec1 = [( (0,4), outside), ( (4,1), outside), ( (1,1), inside), ( (3,3), inside)] | |
n_tries, prog = synthesizer(spec1) | |
print (n_tries, prog) | |
synthesizer2 = get_synthesizer(better_writer, program_cheker, 1000) | |
n_tries, prog = synthesizer2(spec1) | |
print (n_tries, prog) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment