def get_equality_map(constraints, var_map): equality_map = {} for component in get_components(constraints): constants = filter(is_constant, component) parameters = filter(is_parameter, component) if constants: assignment = constants[0] if any(val != assignment for val in constants): print 'Warning! Infeasible transition' return None else: assignment = component[0] dtypes = [] for param in parameters: if isinstance(param, FreeParameter): dtypes.append(param.type) if isinstance(param, VarMember): dtypes.append(var_map[var_name(param.var)].dtype) if dtypes: dtype = dtypes[0] assert all(t == dtype for t in dtypes) for param in parameters: equality_map[param] = assignment return equality_map
def get_fluent_preconditions(var_map, effect_vars, eq_map, assign_map): fluent_preconditions = [] for var in effect_vars: name, args = var_name(var), make_var_constants(var, var_map) pre_args = [assign_map.get(p, p) for p in args + [X[var]]] predicate = var_map[name].predicate fluent_preconditions.append(predicate(*pre_args)) for item in eq_map: if isinstance( item, VarMember) and item.temp == X and item.var not in effect_vars: name, args = var_name(item.var), make_var_constants( item.var, var_map) pre_args = [assign_map.get(p, p) for p in args + [X[item.var]]] fluent_preconditions.append(var_map[name].predicate(*pre_args)) return fluent_preconditions
def get_effects(var_map, effect_vars, assign_map): effects = [] for var in effect_vars: name, args = var_name(var), make_var_constants(var, var_map) pre_args = [assign_map.get(p, p) for p in args + [X[var]]] eff_args = [assign_map.get(p, p) for p in args + [nX[var]]] predicate = var_map[name].predicate effects += [predicate(*eff_args), Not(predicate(*pre_args))] return effects
def get_assignments(internal_params, var_map, eq_map): assign_map = {} for param in internal_params: if isinstance(param, FreeParameter): dtype = param.type elif isinstance(param, VarMember): dtype = var_map[var_name(param.var)].dtype else: raise ValueError(param) eq_param = eq_map.get(param, param) if not is_constant(eq_param): if eq_param not in assign_map: assign_map[eq_param] = Par('%s' % len(assign_map), dtype) assign_map[param] = assign_map[eq_param] else: assign_map[param] = dtype(eq_param) return assign_map