def test_equation_scaling(self): """ test if user can set variable scaling. """ self.model.set('_residual_equation_scaling', 1) self.model.initialize() extract_jmi_log('test_KINsolver_log.xml', self.log_file_name) log = parse_jmi_log(self.log_file_name) solves = gather_solves(log) nose.tools.assert_false( N.array_equal( solves[0].block_solves[0].iterations[0].residual_scaling, N.array([1., 1.]))) # self.setUp() # self.model.set('_residual_equation_scaling',2) # self.model.initialize() # extract_jmi_log('test_KINsolver_log.xml', self.log_file_name) # log = parse_jmi_log(self.log_file_name) # solves = gather_solves(log) # nose.tools.assert_true(N.array_equal(solves[0].block_solves[0].iterations[0].residual_scaling, # N.array([1., 3.]))) self.setUp() self.model.set('_residual_equation_scaling', 0) self.model.initialize() extract_jmi_log('test_KINsolver_log.xml', self.log_file_name) log = parse_jmi_log(self.log_file_name) solves = gather_solves(log) #residual scaling is not logged when turned off. nose.tools.assert_false( 'residual_scaling' in solves[0].block_solves[0].iterations[0])
def test_debbug_solution(self): """ That the correct solution is stored in the debug file. """ self.model.initialize() extract_jmi_log('test_KINsolver_log.xml', self.log_file_name) log = parse_jmi_log(self.log_file_name) solves = gather_solves(log) N.testing.assert_array_almost_equal(solves[0].block_solves[0].iterations[-1].ivs, N.array([N.sqrt(11), 5. ]))
def test_variable_scaling(self): """ test if user can set variable scaling. """ self.model.set('_iteration_variable_scaling', 0) self.model.initialize() extract_jmi_log('test_KINsolver_log.xml', self.log_file_name) log = parse_jmi_log(self.log_file_name) solves = gather_solves(log) nose.tools.assert_true(N.array_equal(solves[0].block_solves[0].nominal, N.array([1.,1.])))
def test_variable_scaling(self): """ test if user can set variable scaling. """ self.model.set('_iteration_variable_scaling', 0) self.model.initialize() extract_jmi_log('test_KINsolver_log.xml', self.log_file_name) log = parse_jmi_log(self.log_file_name) solves = gather_solves(log) nose.tools.assert_true( N.array_equal(solves[0].block_solves[0].nominal, N.array([1., 1.])))
def test_debug_solution(self): """ That the correct solution is stored in the debug file. """ self.model.initialize() extract_jmi_log('test_KINsolver_log.xml', self.log_file_name) log = parse_jmi_log(self.log_file_name) solves = gather_solves(log) N.testing.assert_array_almost_equal( solves[0].block_solves[0].iterations[-1].ivs, N.array([N.sqrt(11), 5.]))
def test_debug_solution(self): """ That the correct solution is stored in the debug file. """ self.setUp() self.model.initialize() extract_jmi_log('test_KINsolver_log.xml', self.log_file_name) log = parse_jmi_log(self.log_file_name) solves = gather_solves(log) result = solves[0].block_solves[0].iterations[-1].ivs expected = N.array([N.sqrt(11), 5. ]) err_msg = "Arrays are not almost equal:\nEXPECTED: {}\nACTUAL: {}".format(expected, result) N.testing.assert_array_almost_equal(result, expected, err_msg=err_msg)
def test_debug_solution(self): """ That the correct solution is stored in the debug file. """ self.setUp() self.model.initialize() extract_jmi_log('test_KINsolver_log.xml', self.log_file_name) log = parse_jmi_log(self.log_file_name) solves = gather_solves(log) result = solves[0].block_solves[0].iterations[-1].ivs expected = N.array([N.sqrt(11), 5. ]) err_msg = "Arrays not equal, expected {} but got {}".format(expected, result) assert N.allclose(result, expected), err_msg
def test_variable_scaling(self): """ test if user can set variable scaling. """ self.setUp() self.model.set('_iteration_variable_scaling', 0) self.model.initialize() extract_jmi_log('test_KINsolver_log.xml', self.log_file_name) log = parse_jmi_log(self.log_file_name) solves = gather_solves(log) result = solves[0].block_solves[0].nominal expected = N.array([1.,1.]) err_msg = "Arrays not equal, expected {} but got {}".format(expected, result) assert N.allclose(result, expected), err_msg
def test_equation_scaling(self): """ test if user can set variable scaling. """ self.model.set('_residual_equation_scaling',1) self.model.initialize() extract_jmi_log('test_KINsolver_log.xml', self.log_file_name) log = parse_jmi_log(self.log_file_name) solves = gather_solves(log) nose.tools.assert_false(N.array_equal(solves[0].block_solves[0].iterations[0].residual_scaling, N.array([1., 1.]))) self.setUp() self.model.set('_residual_equation_scaling',2) self.model.initialize() extract_jmi_log('test_KINsolver_log.xml', self.log_file_name) log = parse_jmi_log(self.log_file_name) solves = gather_solves(log) nose.tools.assert_true(N.array_equal(solves[0].block_solves[0].iterations[0].residual_scaling, N.array([1., 3.]))) self.setUp() self.model.set('_residual_equation_scaling',0) self.model.initialize() extract_jmi_log('test_KINsolver_log.xml', self.log_file_name) log = parse_jmi_log(self.log_file_name) solves = gather_solves(log) #residual scaling is not loged when turned off. nose.tools.assert_false('residual_scaling' in solves[0].block_solves[0].iterations[0])
def test_debbug_file(self): """ That the correct amount of debug info is created. """ self.model.set_debug_logging(True) self.model.set('_log_level', 1) self.model.initialize() extract_jmi_log('test_KINsolver_log.xml', self.log_file_name) log = parse_jmi_log(self.log_file_name) solves = gather_solves(log) nose.tools.assert_equals(solves, []) self.setUp() self.model.set('_log_level', 2) self.model.initialize() extract_jmi_log('test_KINsolver_log.xml', self.log_file_name) log = parse_jmi_log(self.log_file_name) solves = gather_solves(log) nose.tools.assert_equals(solves, []) self.setUp() self.model.set('_log_level', 3) self.model.initialize() extract_jmi_log('test_KINsolver_log.xml', self.log_file_name) log = parse_jmi_log(self.log_file_name) solves = gather_solves(log) nose.tools.assert_equals(solves, []) self.setUp() self.model.set('_log_level', 4) self.model.initialize() extract_jmi_log('test_KINsolver_log.xml', self.log_file_name) log = parse_jmi_log(self.log_file_name) solves = gather_solves(log) nose.tools.assert_equals(solves, []) self.setUp() self.model.set('_log_level', 5) self.model.initialize() extract_jmi_log('test_KINsolver_log.xml', self.log_file_name) log = parse_jmi_log(self.log_file_name) solves = gather_solves(log) nose.tools.assert_equals(len(solves), 4) self.setUp() self.model.set('_log_level', 6) self.model.initialize() extract_jmi_log('test_KINsolver_log.xml', self.log_file_name) log = parse_jmi_log(self.log_file_name) solves = gather_solves(log) nose.tools.assert_equals(len(solves), 4)
def run_demo(): """ Demonstrate how to parse a log file from a JModelica FMU. """ curr_dir = os.path.dirname(os.path.abspath(__file__)) file_name = os.path.join(curr_dir, 'files', 'LoggerTest.mo') fmu_name = compile_fmu( 'LoggerTest', file_name, compiler_log_level='i', compiler_options={'generate_only_initial_system': True}) log_file_name = 'LoggerTest_log.txt' m = load_fmu(fmu_name, log_file_name=log_file_name) m.set_debug_logging(True) m.set('_log_level', 6) m.set_fmil_log_level(5) # Play around with the model m.set('u1', 3) print('u1' + str(m.get('u1'))) print('x1' + str(m.get('x1'))) print('y1' + str(m.get('y1'))) print('z1' + str(m.get('z1'))) m.set('y1', 0.) m.initialize() print("model initialized") print('u1' + str(m.get('u1'))) print('x1' + str(m.get('x1'))) print('y1' + str(m.get('y1'))) print('z1' + str(m.get('z1'))) m.set('u1', 4) print("Input set") print('u1' + str(m.get('u1'))) print('x1' + str(m.get('x1'))) print('y1' + str(m.get('y1'))) print('z1' + str(m.get('z1'))) m.get_derivatives() m.set('y1', 0.5) print("Set initial value of y1") print('x1' + str(m.get('x1'))) print('y1' + str(m.get('y1'))) print('z1' + str(m.get('z1'))) m.set('p', 0.5) print("Set initial value of p") print('x1' + str(m.get('x1'))) print('y1' + str(m.get('y1'))) print('z1' + str(m.get('z1'))) # Parse the log file and print some of its contents # Extract the log file XML contents into a pure XML file dest_xml_file_name = 'LoggerTest_log.xml' extract_jmi_log(dest_xml_file_name, log_file_name) # Parse the entire XML log log = parse_jmi_log(log_file_name) print() print('Top log node: log =', log) print('Unnamed sub nodes: log.nodes = [') for node in log.nodes: print(' ', node, ',') print(']') # Gather information pertaining to equation solves solves = gather_solves(log) print() print('Number of solver invocations:', len(solves)) print('Time of first solve:', solves[0].t) print('Number of block solves in first solver invocation:', len(solves[0].block_solves)) print('Names of iteration variables in first block solve:', solves[0].block_solves[0].variables) print('Min bounds in first block solve:', solves[0].block_solves[0].min) print('Max bounds in first block solve:', solves[0].block_solves[0].max) print('Initial residual scaling in first block solve:', solves[0].block_solves[0].initial_residual_scaling) print('Number of iterations in first block solve:', len(solves[0].block_solves[0].iterations)) print() print('First iteration in first block solve: ') print(' Iteration variables:', solves[0].block_solves[0].iterations[0].ivs) print(' Scaled residuals:', solves[0].block_solves[0].iterations[0].scaled_residuals) print(' Jacobian:\n', solves[0].block_solves[0].iterations[0].jacobian) print(' Jacobian updated in iteration:', solves[0].block_solves[0].iterations[0].jacobian_updated) print(' Residual scaling factors:', solves[0].block_solves[0].iterations[0].residual_scaling) print(' Residual scaling factors_updated:', solves[0].block_solves[0].iterations[0].residual_scaling_updated) print(' Scaled residual norm:', solves[0].block_solves[0].iterations[0].scaled_residual_norm)
def test_debug_file(self): """ That the correct amount of debug info is created. """ self.setUp() self.model.set_debug_logging(True) self.model.set('_log_level',1) self.model.initialize() extract_jmi_log('test_KINsolver_log.xml', self.log_file_name) log = parse_jmi_log(self.log_file_name) solves = gather_solves(log) assert not solves, "Failed in assert (1/6) because list is not empty, got solves={}".format(solves) self.setUp() self.model.set('_log_level',2) self.model.initialize() extract_jmi_log('test_KINsolver_log.xml', self.log_file_name) log = parse_jmi_log(self.log_file_name) solves = gather_solves(log) assert not solves, "Failed in assert (2/6) because list is not empty, got solves={}".format(solves) self.setUp() self.model.set('_log_level',3) self.model.initialize() extract_jmi_log('test_KINsolver_log.xml', self.log_file_name) log = parse_jmi_log(self.log_file_name) solves = gather_solves(log) assert not solves, "Failed in assert (3/6) because list is not empty, got solves={}".format(solves) self.setUp() self.model.set('_log_level',4) self.model.initialize() extract_jmi_log('test_KINsolver_log.xml', self.log_file_name) log = parse_jmi_log(self.log_file_name) solves = gather_solves(log) assert not solves, "Failed in assert (4/6) because list is not empty, got solves={}".format(solves) self.setUp() self.model.set('_log_level',5) self.model.initialize() extract_jmi_log('test_KINsolver_log.xml', self.log_file_name) log = parse_jmi_log(self.log_file_name) solves = gather_solves(log) assert len(solves) == 4, "Failed in assert (5/6) because result is not of length 4, got solves={}, with length {}".format(solves, len(solves)) self.setUp() self.model.set('_log_level',6) self.model.initialize() extract_jmi_log('test_KINsolver_log.xml', self.log_file_name) log = parse_jmi_log(self.log_file_name) solves = gather_solves(log) assert len(solves) == 4, "Failed in assert (6/6) because result is not of length 4, got solves={}, with length {}".format(solves, len(solves))
def test_debbug_file(self): """ That the correct amount of debug info is created. """ self.model.set_debug_logging(True) self.model.set('_log_level',1) self.model.initialize() extract_jmi_log('test_KINsolver_log.xml', self.log_file_name) log = parse_jmi_log(self.log_file_name) solves = gather_solves(log) nose.tools.assert_equals(solves, []) self.setUp() self.model.set('_log_level',2) self.model.initialize() extract_jmi_log('test_KINsolver_log.xml', self.log_file_name) log = parse_jmi_log(self.log_file_name) solves = gather_solves(log) nose.tools.assert_equals(solves, []) self.setUp() self.model.set('_log_level',3) self.model.initialize() extract_jmi_log('test_KINsolver_log.xml', self.log_file_name) log = parse_jmi_log(self.log_file_name) solves = gather_solves(log) nose.tools.assert_equals(solves, []) self.setUp() self.model.set('_log_level',4) self.model.initialize() extract_jmi_log('test_KINsolver_log.xml', self.log_file_name) log = parse_jmi_log(self.log_file_name) solves = gather_solves(log) nose.tools.assert_equals(solves, []) self.setUp() self.model.set('_log_level',5) self.model.initialize() extract_jmi_log('test_KINsolver_log.xml', self.log_file_name) log = parse_jmi_log(self.log_file_name) solves = gather_solves(log) nose.tools.assert_equals(len(solves), 3) self.setUp() self.model.set('_log_level',6) self.model.initialize() extract_jmi_log('test_KINsolver_log.xml', self.log_file_name) log = parse_jmi_log(self.log_file_name) solves = gather_solves(log) nose.tools.assert_equals(len(solves), 3)
def run_demo(): """ Demonstrate how to parse a log file from a JModelica FMU. """ curr_dir = os.path.dirname(os.path.abspath(__file__)); file_name = os.path.join(curr_dir, 'files', 'LoggerTest.mo') fmu_name = compile_fmu('LoggerTest', file_name, compiler_log_level='i', compiler_options={'generate_only_initial_system':True}) log_file_name='LoggerTest_log.txt' m = load_fmu(fmu_name, log_file_name=log_file_name) m.set_debug_logging(True) m.set('_log_level', 6) m.set_fmil_log_level(5) # Play around with the model m.set('u1',3) print 'u1' + str(m.get('u1')) print 'x1' + str(m.get('x1')) print 'y1' + str(m.get('y1')) print 'z1' + str(m.get('z1')) m.set('y1',0.) m.initialize() print "model initialized" print 'u1' + str(m.get('u1')) print 'x1' + str(m.get('x1')) print 'y1' + str(m.get('y1')) print 'z1' + str(m.get('z1')) m.set('u1',4) print "Input set" print 'u1' + str(m.get('u1')) print 'x1' + str(m.get('x1')) print 'y1' + str(m.get('y1')) print 'z1' + str(m.get('z1')) m.get_derivatives() m.set('y1',0.5) print "Set initial value of y1" print 'x1' + str(m.get('x1')) print 'y1' + str(m.get('y1')) print 'z1' + str(m.get('z1')) m.set('p',0.5) print "Set initial value of p" print 'x1' + str(m.get('x1')) print 'y1' + str(m.get('y1')) print 'z1' + str(m.get('z1')) # Parse the log file and print some of its contents # Extract the log file XML contents into a pure XML file dest_xml_file_name = 'LoggerTest_log.xml' extract_jmi_log(dest_xml_file_name, log_file_name) # Parse the entire XML log log = parse_jmi_log(log_file_name) print print 'Top log node: log =', log print 'Unnamed sub nodes: log.nodes = [' for node in log.nodes: print ' ', node, ',' print ']' print 'Time of first solve: log.nodes[0].t =', log.nodes[0].t # Gather information pertaining to equation solves solves = gather_solves(log) print print 'Number of solver invocations:', len(solves) print 'Time of first solve:', solves[0].t print 'Number of block solves in first solver invocation:', len(solves[0].block_solves) print 'Names of iteration variables in first block solve:', solves[0].block_solves[0].variables print 'Min bounds in first block solve:', solves[0].block_solves[0].min print 'Max bounds in first block solve:', solves[0].block_solves[0].max print 'Initial residual scaling in first block solve:', solves[0].block_solves[0].initial_residual_scaling print 'Number of iterations in first block solve:', len(solves[0].block_solves[0].iterations) print print 'First iteration in first block solve: ' print ' Iteration variables:', solves[0].block_solves[0].iterations[0].ivs print ' Scaled residuals:', solves[0].block_solves[0].iterations[0].residuals print ' Jacobian:\n', solves[0].block_solves[0].iterations[0].jacobian print ' Jacobian updated in iteration:', solves[0].block_solves[0].iterations[0].jacobian_updated print ' Residual scaling factors:', solves[0].block_solves[0].iterations[0].residual_scaling print ' Residual scaling factors_updated:', solves[0].block_solves[0].iterations[0].residual_scaling_updated print ' Scaled residual norm:', solves[0].block_solves[0].iterations[0].scaled_residual_norm