Esempio n. 1
0
 def test_register(self):
     Logger.cleanup()
     Logger.register_log('filename', 'log')
     self.assertEqual({'log': 'filename'}, Logger.log_file_handles)
     with self.assertRaises(ValueError):
         Logger.register_log('fname2', 'log')
     Logger.cleanup()
Esempio n. 2
0
 def test_solver_logging(self):
     Logger.cleanup()
     mock = MockFile()
     Logger.log_file_handles = {'step': mock}
     obj = EquationSolver()
     obj.TraceStep = 2
     obj.RunEquationReduction = False
     # By forcing 't' into the variable list, no automatic creation of time variables
     obj.ParseString("""
          x=t
          z=x+1
          z(0) = 2.
          exogenous
          t=[10.]*20
          MaxTime=3""")
     obj.ExtractVariableList()
     obj.SetInitialConditions()
     self.assertEqual([], mock.buffer)
     obj.SolveStep(1)
     self.assertEqual([], mock.buffer)
     obj.SolveStep(2)
     # I do not care what the contents are; I just want to validate
     # that it triggers
     self.assertTrue(len(mock.buffer) > 0)
     # Reset the buffer
     mock.buffer = []
     obj.SolveStep(3)
     self.assertEqual([], mock.buffer)
Esempio n. 3
0
 def _FinalSteps(self):  # pragma: no cover
     self.EquationSolver.ParseString(self.FinalEquations)
     self.EquationSolver.SolveEquation()
     self.LogInfo()
     self.State = 'Finished Running'
     Logger(self.EquationSolver.GenerateCSVtext(), 'timeseries')
     Logger.cleanup()
Esempio n. 4
0
 def test_empty(self):
     mock = MockFile()
     Logger.log_file_handles = {'log': mock}
     Logger('', endline=False)
     self.assertEqual([], mock.buffer)
     Logger('', endline=True)
     self.assertEqual([' \n'], mock.buffer)
     Logger.cleanup()
Esempio n. 5
0
    def main(self, base_file_name=None):  # pragma: no cover
        """
        Routine that does most of the work of model building. The model is build based upon
        the Sector objects that have been registered as children of this Model.

        The base_file_name is the base filename that is used for Logging operations; just used
        to call Logger.register_standard_logs(base_file_name). It is recommended that you call
        Logger.register_standard_logs() before main, so that Sector creation can be logged.

        The major operations:
        [1] Call GenerateEquations() on all Sectors. The fact that GenerateEquations() is only
         called now at the Sector level means that Sectors can be created independently, and the
        GenerateEquations() call which ties it to other sectors is only called after all other sectors
        are created. (There is at least one exception where Sectors have to be created in a specific
        order, which we want to avoid.)

        [2] Cleanup work: processing initial conditions, exogenous variables, replacing
            aliases in equations.

        [3] Tie the sector level equations into a single block of equations. (Currently strings, not
            Equation objects.)

        [4] The equations are passed to self.EquationSolver, and they are solved.

        The user can then use GetTimeSeries() to access the output time series (if they can be
        calculated.)

        :param base_file_name: str
        :return: None
        """
        self.State = 'Running'
        try:
            if base_file_name is not None:
                Logger.register_standard_logs(base_file_name)
            Logger('Starting Model main()')
            self._GenerateFullSectorCodes()
            self._GenerateEquations()
            self._FixAliases()
            self._GenerateRegisteredCashFlows()
            self._ProcessExogenous()
            self.FinalEquations = self._CreateFinalEquations()
            self.EquationSolver.ParseString(self.FinalEquations)
            self.EquationSolver.SolveEquation()
            self.LogInfo()
        except Warning as e:
            self.LogInfo(ex=e)
            print('Warning triggered: ' + str(e))
            return self.FinalEquations
        except Exception as e:
            self.LogInfo(ex=e)
            raise
        finally:
            self.State = 'Finished Running'
            Logger(self.EquationSolver.GenerateCSVtext(), 'timeseries')
            Logger.cleanup()
        return self.FinalEquations
Esempio n. 6
0
 def test_write_2(self):
     mock = MockFile()
     Logger.log_file_handles = {'log': mock}
     Logger('text')
     self.assertEqual(['text\n'], mock.buffer)
     Logger('text2\n', priority=0)
     self.assertEqual(['text\n', 'text2\n'], mock.buffer)
     Logger.priority_cutoff = 5
     Logger("low_priority", priority=6)
     self.assertEqual(['text\n', 'text2\n'], mock.buffer)
     Logger('higher', priority=5)
     # Low priority messages have an indent.
     self.assertEqual(['text\n', 'text2\n', (' ' * 4) + 'higher\n'],
                      mock.buffer)
     Logger.cleanup()
Esempio n. 7
0
 def OnRunModel(self):
     name = self.GetModelName()
     if name is None:
         # Not sure how we get here, but, go back to chooser frame
         self.FrameChooser.tkraise()
         return
     self.CleanupOnModelChange()
     Logger.cleanup()
     if not self.Parameters.LogDir == '':
         base_name = os.path.join(self.Parameters.LogDir, name)
         Logger.register_standard_logs(base_file_name=base_name)
     python_mod = self.Importer(name)
     try:
         self.Model = python_mod.build_model()
     except Exception as e:
         messagebox.showinfo(message=str(e), icon='error', title='Error')
         raise e
     if type(self.Model) is not Model:
         raise ValueError('Expected a Model, got {0} instead'.format(
             type(Model)))
     self.Sectors = self.Model.GetSectors()
     self.UpdateModelViewer()
     self.FrameModelViewer.tkraise()
Esempio n. 8
0
 def test_formatting(self):
     mock = MockFile()
     Logger.log_file_handles = {'log': mock}
     Logger('Format={0} {1}', data_to_format=(1, 'yay'), endline=False)
     self.assertEqual(['Format=1 yay'], mock.buffer)
     Logger.cleanup()
Esempio n. 9
0
 def test_cleanup(self):
     mock = MockFile()
     Logger.log_file_handles = {'log': mock}
     self.assertFalse(mock.is_closed)
     Logger.cleanup()
     self.assertTrue(mock.is_closed)