def run(self, debug=False, ifile=None): self.debug = debug ok = True n_fail = 0 methods = inspect.getmembers(self, inspect.ismethod) if hasattr(self, 'tests'): dmethods = {} for key, method in methods: dmethods[key] = method tests = [(ii, dmethods[ii]) for ii in self.tests] print(tests) else: tests = [ ii for ii in methods if (len(ii[0]) > 5) and ii[0][:5] == 'test_' ] orig_prefix = output.get_output_prefix() for itest, (test_name, test_method) in enumerate(tests): if len(tests) > 1 and ifile is not None: output.set_output_prefix('[%d/%d] %s'\ % (ifile, itest + 1, orig_prefix)) else: output.set_output_prefix('[%d] %s' % (ifile, orig_prefix)) aux = ' %s: ' % test_name try: ret = test_method() except: if debug: raise ret = False if not ret: aux = '---' + aux + 'failed!' n_fail += 1 ok = False else: aux = '+++' + aux + 'ok' print(aux) output.set_output_prefix(orig_prefix) return ok, n_fail, len(tests)
def run(self, debug=False, ifile=None): self.debug = debug ok = True n_fail = 0 methods = inspect.getmembers(self, inspect.ismethod) if hasattr(self, 'tests'): dmethods = {} for key, method in methods: dmethods[key] = method tests = [(ii, dmethods[ii]) for ii in self.tests] print(tests) else: tests = [ii for ii in methods if (len(ii[0]) > 5) and ii[0][:5] == 'test_'] orig_prefix = output.get_output_prefix() for itest, (test_name, test_method) in enumerate(tests): if len(tests) > 1 and ifile is not None: output.set_output_prefix('[%d/%d] %s'\ % (ifile, itest + 1, orig_prefix)) else: output.set_output_prefix('[%d] %s' % (ifile, orig_prefix)) aux = ' %s: ' % test_name try: ret = test_method() except: if debug: raise ret = False if not ret: aux = '---' + aux + 'failed!' n_fail += 1 ok = False else: aux = '+++' + aux + 'ok' print(aux) output.set_output_prefix(orig_prefix) return ok, n_fail, len(tests)
def init_subproblems(self, conf, **kwargs): from sfepy.discrete.state import State from sfepy.discrete import Problem from sfepy.base.conf import ProblemConf, get_standard_keywords from scipy.spatial import cKDTree as KDTree # init subproblems problem = self.context pb_vars = problem.get_variables() # get "master" DofInfo and last index pb_adi_indx = problem.equations.variables.adi.indx self.adi_indx = pb_adi_indx.copy() last_indx = -1 for ii in six.itervalues(self.adi_indx): last_indx = nm.max([last_indx, ii.stop]) # coupling variables self.cvars_to_pb = {} for jj in conf.coupling_variables: self.cvars_to_pb[jj] = [None, None] if jj in pb_vars.names: if pb_vars[jj].dual_var_name is not None: self.cvars_to_pb[jj][0] = -1 else: self.cvars_to_pb[jj][1] = -1 # init subproblems self.subpb = [] required, other = get_standard_keywords() master_prefix = output.get_output_prefix() for ii, ifname in enumerate(conf.others): sub_prefix = master_prefix[:-1] + '-sub%d:' % (ii + 1) output.set_output_prefix(sub_prefix) kwargs['master_problem'] = problem confi = ProblemConf.from_file(ifname, required, other, define_args=kwargs) pbi = Problem.from_conf(confi, init_equations=True) sti = State(pbi.equations.variables) pbi.equations.set_data(None, ignore_unknown=True) pbi.time_update() pbi.update_materials() sti.apply_ebc() pbi_vars = pbi.get_variables() output.set_output_prefix(master_prefix) self.subpb.append([pbi, sti, None]) # append "slave" DofInfo for jj in pbi_vars.names: if not (pbi_vars[jj].is_state()): continue didx = pbi.equations.variables.adi.indx[jj] ndof = didx.stop - didx.start if jj in self.adi_indx: if ndof != \ (self.adi_indx[jj].stop - self.adi_indx[jj].start): raise ValueError('DOFs do not match!') else: self.adi_indx.update( {jj: slice(last_indx, last_indx + ndof, None)}) last_indx += ndof for jj in conf.coupling_variables: if jj in pbi_vars.names: if pbi_vars[jj].dual_var_name is not None: self.cvars_to_pb[jj][0] = ii else: self.cvars_to_pb[jj][1] = ii self.subpb.append([problem, None, None]) self.cvars_to_pb_map = {} for varname, pbs in six.iteritems(self.cvars_to_pb): # match field nodes coors = [] for ii in pbs: pbi = self.subpb[ii][0] pbi_vars = pbi.get_variables() fcoors = pbi_vars[varname].field.coors dc = nm.abs(nm.max(fcoors, axis=0)\ - nm.min(fcoors, axis=0)) ax = nm.where(dc > 1e-9)[0] coors.append(fcoors[:, ax]) if len(coors[0]) != len(coors[1]): raise ValueError('number of nodes does not match!') kdtree = KDTree(coors[0]) map_12 = kdtree.query(coors[1])[1] pbi1 = self.subpb[pbs[0]][0] pbi1_vars = pbi1.get_variables() eq_map_1 = pbi1_vars[varname].eq_map pbi2 = self.subpb[pbs[1]][0] pbi2_vars = pbi2.get_variables() eq_map_2 = pbi2_vars[varname].eq_map dpn = eq_map_2.dpn nnd = map_12.shape[0] map_12_nd = nm.zeros((nnd * dpn, ), dtype=nm.int32) if dpn > 1: for ii in range(dpn): map_12_nd[ii::dpn] = map_12 * dpn + ii else: map_12_nd = map_12 idx = nm.where(eq_map_2.eq >= 0)[0] self.cvars_to_pb_map[varname] = eq_map_1.eq[map_12[idx]]
def __init__(self, conf, problem, **kwargs): from sfepy.discrete.state import State from sfepy.discrete import Problem from sfepy.base.conf import ProblemConf, get_standard_keywords from scipy.spatial import cKDTree as KDTree ScipyDirect.__init__(self, conf, **kwargs) # init subproblems pb_vars = problem.get_variables() # get "master" DofInfo and last index pb_adi_indx = problem.equations.variables.adi.indx self.adi_indx = pb_adi_indx.copy() last_indx = -1 for ii in self.adi_indx.itervalues(): last_indx = nm.max([last_indx, ii.stop]) # coupling variables self.cvars_to_pb = {} for jj in conf.coupling_variables: self.cvars_to_pb[jj] = [None, None] if jj in pb_vars.names: if pb_vars[jj].dual_var_name is not None: self.cvars_to_pb[jj][0] = -1 else: self.cvars_to_pb[jj][1] = -1 # init subproblems self.subpb = [] required, other = get_standard_keywords() master_prefix = output.get_output_prefix() for ii, ifname in enumerate(conf.others): sub_prefix = master_prefix[:-1] + '-sub%d:' % (ii + 1) output.set_output_prefix(sub_prefix) kwargs['master_problem'] = problem confi = ProblemConf.from_file(ifname, required, other, define_args=kwargs) pbi = Problem.from_conf(confi, init_equations=True) sti = State(pbi.equations.variables) pbi.equations.set_data(None, ignore_unknown=True) pbi.time_update() pbi.update_materials() sti.apply_ebc() pbi_vars = pbi.get_variables() output.set_output_prefix(master_prefix) self.subpb.append([pbi, sti, None]) # append "slave" DofInfo for jj in pbi_vars.names: if not(pbi_vars[jj].is_state()): continue didx = pbi.equations.variables.adi.indx[jj] ndof = didx.stop - didx.start if jj in self.adi_indx: if ndof != \ (self.adi_indx[jj].stop - self.adi_indx[jj].start): raise ValueError('DOFs do not match!') else: self.adi_indx.update({ jj: slice(last_indx, last_indx + ndof, None)}) last_indx += ndof for jj in conf.coupling_variables: if jj in pbi_vars.names: if pbi_vars[jj].dual_var_name is not None: self.cvars_to_pb[jj][0] = ii else: self.cvars_to_pb[jj][1] = ii self.subpb.append([problem, None, None]) self.cvars_to_pb_map = {} for varname, pbs in self.cvars_to_pb.iteritems(): # match field nodes coors = [] for ii in pbs: pbi = self.subpb[ii][0] pbi_vars = pbi.get_variables() fcoors = pbi_vars[varname].field.coors dc = nm.abs(nm.max(fcoors, axis=0)\ - nm.min(fcoors, axis=0)) ax = nm.where(dc > 1e-9)[0] coors.append(fcoors[:,ax]) if len(coors[0]) != len(coors[1]): raise ValueError('number of nodes does not match!') kdtree = KDTree(coors[0]) map_12 = kdtree.query(coors[1])[1] pbi1 = self.subpb[pbs[0]][0] pbi1_vars = pbi1.get_variables() eq_map_1 = pbi1_vars[varname].eq_map pbi2 = self.subpb[pbs[1]][0] pbi2_vars = pbi2.get_variables() eq_map_2 = pbi2_vars[varname].eq_map dpn = eq_map_2.dpn nnd = map_12.shape[0] map_12_nd = nm.zeros((nnd * dpn,), dtype=nm.int32) if dpn > 1: for ii in range(dpn): map_12_nd[ii::dpn] = map_12 * dpn + ii else: map_12_nd = map_12 idx = nm.where(eq_map_2.eq >= 0)[0] self.cvars_to_pb_map[varname] = eq_map_1.eq[map_12[idx]]
def run_test(conf_name, options, ifile): from sfepy.base.ioutils import ensure_path ensure_path(op.join(options.out_dir, 'any')) if options.filter_none or options.raise_on_error: of = None elif options.filter_less: of = OutputFilter(['<<<', '>>>', '...', '!!!', '+++', '---']) elif options.filter_more: of = OutputFilter(['+++', '---']) else: of = OutputFilter(['<<<', '+++', '---']) print('<<< [%d] %s' % (ifile, conf_name)) orig_prefix = output.get_output_prefix() output.set_output_prefix('[%d] %s' % (ifile, orig_prefix)) _required, other = get_standard_keywords() required = ['Test'] num = 1 timer = Timer('tests') try: conf = ProblemConf.from_file(conf_name, required, _required + other) test = conf.funmod.Test.from_conf(conf, options) num = test.get_number() ok = True print('>>> test instance prepared (%d test(s))' % num) except KeyboardInterrupt: print('>>> interrupted') sys.exit(0) except: print('--- test instance creation failed') if options.raise_on_error: raise ok, n_fail, n_total = False, num, num if ok: try: timer.start() output.set_output_prefix(orig_prefix) ok, n_fail, n_total = test.run(debug=options.raise_on_error, ifile=ifile) output.set_output_prefix('[%d] %s' % (ifile, orig_prefix)) timer.stop() except KeyboardInterrupt: print('>>> interrupted') sys.exit(0) except Exception as e: print('>>> %s' % e.__class__) if options.raise_on_error: raise ok, n_fail, n_total = False, num, num if ok: print('>>> all passed in %.2f s' % timer.total) else: print('!!! %s test failed' % n_fail) if of is not None: of.stop() output.set_output_prefix(orig_prefix) return n_fail, n_total, timer.total
def run_test(conf_name, options, ifile): from sfepy.base.ioutils import ensure_path ensure_path(op.join(options.out_dir, "any")) if options.filter_none or options.raise_on_error: of = None elif options.filter_less: of = OutputFilter(["<<<", ">>>", "...", "!!!", "+++", "---"]) elif options.filter_more: of = OutputFilter(["+++", "---"]) else: of = OutputFilter(["<<<", "+++", "---"]) print("<<< [%d] %s" % (ifile, conf_name)) orig_prefix = output.get_output_prefix() output.set_output_prefix("[%d] %s" % (ifile, orig_prefix)) _required, other = get_standard_keywords() required = ["Test"] num = 1 test_time = 0.0 try: conf = ProblemConf.from_file(conf_name, required, _required + other) test = conf.funmod.Test.from_conf(conf, options) num = test.get_number() ok = True print(">>> test instance prepared (%d test(s))" % num) except KeyboardInterrupt: print(">>> interrupted") sys.exit(0) except: print("--- test instance creation failed") if options.raise_on_error: raise ok, n_fail, n_total = False, num, num if ok: try: tt = time.clock() output.set_output_prefix(orig_prefix) ok, n_fail, n_total = test.run(debug=options.raise_on_error, ifile=ifile) output.set_output_prefix("[%d] %s" % (ifile, orig_prefix)) test_time = time.clock() - tt except KeyboardInterrupt: print(">>> interrupted") sys.exit(0) except Exception as e: print(">>> %s" % e.__class__) if options.raise_on_error: raise ok, n_fail, n_total = False, num, num if ok: print(">>> all passed in %.2f s" % test_time) else: print("!!! %s test failed" % n_fail) if of is not None: of.stop() output.set_output_prefix(orig_prefix) return n_fail, n_total, test_time