diff --git a/resources/simplex/simplex.py b/resources/simplex/simplex.py index 3ff0e608b8bd49caf2036843538afd87c7f797d2..d5965e0cda5f320d21fc41798235fad671f7f25f 100644 --- a/resources/simplex/simplex.py +++ b/resources/simplex/simplex.py @@ -54,6 +54,7 @@ class Simplex(): self._obj_constant_index = None self._basic_var_indexes = None self._nonbasic_var_indexes = None + self._description = None def read_data_from_json(self, json_file_location): logger.info('') @@ -66,12 +67,16 @@ class Simplex(): json_data = json.load(json_file) logger.info('Read in JSON data: {0}'.format(json_data)) - logger.info('') + + try: + self._parse_json_data(json_data) + except (KeyError, TypeError, ValueError) as err: + logger.error('Invalid JSON data read in. {0}'.format(err)) except FileNotFoundError: logger.info('Could not locate file at location "{0}".'.format(json_file_location)) - def parse_json_data(self, json_data): + def _parse_json_data(self, json_data): """ Attempts to parse passes JSON data into simplex format. :param json_data: JSON data to attempt to parse. @@ -116,10 +121,25 @@ class Simplex(): else: non_basic_vars = None - # Data has been parsed. Now attempt to set it. - self.set_simplex_values(matrix_a, vector_b, vector_c, basic_vars=basic_vars, non_basic_vars=non_basic_vars) + # Check if "description" key exists. + if 'description' in json_data: + description = json_data['description'] + elif 'Description' in json_data: + description = json_data['Description'] + else: + description = None - def set_simplex_values(self, matrix_a, vector_b, vector_c, basic_vars=None, non_basic_vars=None): + # Data has been parsed. Now attempt to set it. + self.set_simplex_values( + matrix_a, + vector_b, + vector_c, + basic_vars=basic_vars, + non_basic_vars=non_basic_vars, + description=description, + ) + + def set_simplex_values(self, matrix_a, vector_b, vector_c, basic_vars=None, non_basic_vars=None, description=None): """ Sets values for simplex. :param matrix_a: Matrix of constraint equation coefficients. @@ -127,6 +147,7 @@ class Simplex(): :param vector_c: Vector of objective function coefficients. :param basic_vars: Optional array of basic variable column indexes. :param non_basic_vars: Optional array of non-basic variable column indexes. + :param description: Optional string to describe simplex. """ # Reset all values to None. self._matrix_a = None @@ -135,6 +156,7 @@ class Simplex(): self._obj_constant_index = None self._basic_var_indexes = None self._nonbasic_var_indexes = None + self._description = None # Check that values are of expected types. if not isinstance(matrix_a, list) or not isinstance(vector_b, list) or not isinstance(vector_c, list): @@ -192,10 +214,14 @@ class Simplex(): else: raise TypeError('The "non_basic_vars" argument is expected to be of type list.') - # Finally, determine/set basic and nonbasic variables. + # Determine/set basic and nonbasic variables. self._determine_basic_variables() self._determine_nonbasic_variables() + # Determine description. + if description is not None: + self._description = description + def _determine_basic_variables(self): """ Determines (and if needed, sets) all basic variables for given constraints. @@ -303,8 +329,10 @@ class Simplex(): logger.info('Printing Simplex Tableau.') logger.info('') - tableau_length = (len(self._obj_func) * 5) + 9 + tableau_length = (len(self._obj_func) * 5) + 4 + if self._description is not None: + logger.info('{0}'.format(self._description)) logger.info('-' * tableau_length) for row_index in range(len(self._matrix_a)): print_string = '|'