def _turn_max_to_relu(self): new_constraints = [] for c in self.constraints: if isinstance(c, MaxConstraint): # varnew1 - varin1 + varin2 = 0 # varnew2 = relu(varnew1) # varout - varnew2 - varin2 = 0 var1in = c.var1in var2in = c.var2in varout = c.varout varnew1 = getNewVariable("max2relu") varnew2 = getNewVariable("max2relu") cnew1 = Constraint("EQUALITY") cnew1.monomials = [ Monomial(1.0, varnew1), Monomial(-1.0, var1in), Monomial(1.0, var2in) ] cnew2 = ReluConstraint(varin=varnew1, varout=varnew2) cnew3 = Constraint("EQUALITY") cnew3.monomials = [ Monomial(1.0, varout), Monomial(-1.0, var2in), Monomial(-1.0, varnew2) ] new_constraints.extend([cnew1, cnew2, cnew3]) else: new_constraints.append(c) self.constraints = new_constraints
def read_relu_equations(self): for i in range(self.n_relu): var_in = self.f['/relu/varin%d' % (i + 1)][()][0] var_out = self.f['/relu/varout%d' % (i + 1)][()][0] if var_out not in self.var_dict.keys(): self.var_dict[var_out] = getNewVariable('xd') if var_in not in self.var_dict.keys(): self.var_dict[var_in] = getNewVariable('xd') self.relu_list.append( ReluConstraint(varin=self.var_dict[var_in], varout=self.var_dict[var_out]))
def read_input_output_control_vars(self): for v in self.f['vars/states'][()]: if v not in self.var_dict: self.var_dict[v] = getNewVariable('xd') self.state_vars.append(self.var_dict[v]) for v in self.f['vars/controls'][()]: if v not in self.var_dict: self.var_dict[v] = getNewVariable('xd') self.control_vars.append(self.var_dict[v]) for v in self.f['vars/outputs'][()]: if v not in self.var_dict: self.var_dict[v] = getNewVariable('xd') self.output_vars.append(self.var_dict[v])
def read_max_equations(self): # these are all relu equations for i in range(self.n_max): vars_in = self.f['/max/varsin%d' % (i + 1)][()] var_out = self.f['/max/varout%d' % (i + 1)][()][0] var_in1 = vars_in[0] var_in2 = vars_in[1] if var_out not in self.var_dict.keys(): self.var_dict[var_out] = getNewVariable('xd') if var_in1 not in self.var_dict.keys(): self.var_dict[var_in1] = getNewVariable('xd') if var_in2 not in self.var_dict.keys(): self.var_dict[var_in2] = getNewVariable('xd') self.max_list.append( MaxConstraint( varsin=[self.var_dict[var_in1], self.var_dict[var_in2]], varout=self.var_dict[var_out]))
def read_equations(self): for i in range(self.n_eq): vars = self.f['/eq/vars%d' % (i + 1)][()] for v in vars: if v not in self.var_dict.keys(): self.var_dict[v] = getNewVariable('xd') coeffs = self.f['/eq/coeffs%d' % (i + 1)][()].astype(np.float) b = self.f['/eq/scalar%d' % (i + 1)][()].astype(np.float)[0] monomial_list = [ Monomial(c, self.var_dict[v]) for (c, v) in zip(coeffs, vars) ] self.eq_list.append( Constraint(ConstraintType('EQUALITY'), monomial_list, b))
def read_inequalities(self): for i in range(self.n_ineq): left_var = self.f['/ineq/varleft%d' % (i + 1)][()][0] rite_var = self.f['/ineq/varright%d' % (i + 1)][()][0] for v in [left_var, rite_var]: if v not in self.var_dict.keys(): self.var_dict[v] = getNewVariable('xd') # add lvar <= rvar monomial_list = [ Monomial(1, self.var_dict[left_var]), Monomial(-1, self.var_dict[rite_var]) ] self.ineq_list.append( Constraint(ConstraintType('LESS_EQ'), monomial_list, 0))