def locallyNormClean(prog, max_val): cube_count = -1 switches = [] for line in prog: if 'Cuboid' in line: if 'Program_' in line: switches.append(( f'cube{cube_count}', line.split()[0] )) cube_count += 1 for a, b in switches: prog = [line.replace(b,a) for line in prog] clines = [] P = ex.Program() for line in prog: if "Cuboid(" in line: parse = P.parseCuboid(line) name = parse[0] x = float(min(max(parse[1].item() / max_val, 0.01), 1.0)) y = float(min(max(parse[2].item() / max_val, 0.01), 1.0)) z = float(min(max(parse[3].item() / max_val, 0.01), 1.0)) clines.append("\t" + gen.assign( name, gen.make_function('Cuboid', [x,y,z]))) if "attach(" in line: parse = P.parseAttach(line) clines.append("\t" + gen.make_function( "attach", [parse[0], parse[1]] + [ torch.clamp(co, 0.0, 1.0).item() for co in parse[2:] ] )) if "reflect(" in line: parse = P.parseReflect(line) clines.append("\t" + gen.make_function( "reflect", [parse[0], parse[1]] )) if "translate(" in line: parse = P.parseTranslate(line) clines.append("\t" + gen.make_function( "translate", [ parse[0], parse[1], max(int(parse[2]), 1), float(min(max(parse[3], 0.0), 1.0)) ] )) return clines
def getHierProgLines(root): prog_count = 0 root["prog_num"] = prog_count lines = [] q = [root] P = ex.Program() while(len(q) > 0): node = q.pop(0) lines.append(f"Assembly Program_{node['prog_num']}" +" {") NAME_DICT = {} c = 0 for line in node["prog"]: if "Cuboid(" in line: parse = P.parseCuboid(line) if len(node["children"][c]) > 0: prog_count += 1 name = f"Program_{prog_count}" node["children"][c]["prog_num"] = prog_count else: name = parse[0] NAME_DICT[parse[0]] = name x = round(float(parse[1]), PREC) y = round(float(parse[2]), PREC) z = round(float(parse[3]), PREC) aligned = str(parse[4]) lines.append("\t" + gen.assign( name, gen.make_function('Cuboid', [x,y,z,aligned])) ) c += 1 if "attach(" in line: parse = P.parseAttach(line) lines.append("\t" + gen.make_function( "attach", [NAME_DICT[parse[0]], NAME_DICT[parse[1]]] + [round(co.item(), PREC) for co in parse[2:]] )) if "reflect(" in line: parse = P.parseReflect(line) lines.append("\t" + gen.make_function( "reflect", [NAME_DICT[parse[0]], parse[1]] )) if "translate(" in line: parse = P.parseTranslate(line) lines.append("\t" + gen.make_function( "translate", [NAME_DICT[parse[0]], parse[1], int(parse[2]), round(float(parse[3]), PREC)] )) if "rotate(" in line: parse = P.parseRotate(line) lines.append("\t" + gen.make_function( "rotate", [NAME_DICT[parse[0]], int(parse[1]), round(float(parse[2]), PREC)] )) if "squeeze(" in line: parse = P.parseSqueeze(line) lines.append("\t" + gen.make_function( "squeeze", [NAME_DICT[parse[0]], NAME_DICT[parse[1]], NAME_DICT[parse[2]], parse[3]] + [round(co, PREC) for co in parse[4:]] )) lines.append("}") for c in node["children"]: if c is not None and len(c) > 0: if "prog_num" in c: q.append(c) return lines