def test_plot_lsa(self): figure_name = "LSAPlot" hypo_builder = HypothesisBuilder(config=self.config).set_name(figure_name) lsa_hypothesis = hypo_builder.build_lsa_hypothesis() mc = ModelConfigurationBuilder().build_model_from_E_hypothesis(lsa_hypothesis, numpy.array([1])) figure_file = os.path.join(self.config.out.FOLDER_FIGURES, figure_name + ".png") assert not os.path.exists(figure_file) self.plotter.plot_lsa(lsa_hypothesis, mc, True, None, region_labels=numpy.array(["a"]), title="") assert not os.path.exists(figure_file)
def run_lsa(self, disease_hypothesis, model_configuration): jacobian = self._compute_jacobian(model_configuration) # Perform eigenvalue decomposition eigen_values, eigen_vectors = numpy.linalg.eig(jacobian) sorted_indices = numpy.argsort(eigen_values, kind='mergesort') self.eigen_values = eigen_values[sorted_indices] self.eigen_vectors = eigen_vectors[:, sorted_indices] self._ensure_eigen_vectors_number( self.eigen_values, model_configuration.e_values, model_configuration.x0_values, disease_hypothesis.get_all_disease_indices()) if self.eigen_vectors_number == disease_hypothesis.number_of_regions: # Calculate the propagation strength index by summing all eigenvectors lsa_propagation_strength = numpy.abs( numpy.sum(self.eigen_vectors, axis=1)) else: sorted_indices = max(self.eigen_vectors_number, 1) # Calculate the propagation strength index by summing the first n eigenvectors (minimum 1) if self.weighted_eigenvector_sum: lsa_propagation_strength = numpy.abs( weighted_vector_sum(self.eigen_values[:sorted_indices], self.eigen_vectors[:, :sorted_indices], normalize=True)) else: lsa_propagation_strength = numpy.abs( numpy.sum(self.eigen_vectors[:, :sorted_indices], axis=1)) if self.normalize_propagation_strength: # Normalize by the maximum lsa_propagation_strength /= numpy.max(lsa_propagation_strength) # # TODO: this has to be corrected # if self.eigen_vectors_number < 0.2 * disease_hypothesis.number_of_regions: # propagation_strength_elbow = numpy.max([self.get_curve_elbow_point(lsa_propagation_strength), # self.eigen_vectors_number]) # else: propagation_strength_elbow = self.get_curve_elbow_point( lsa_propagation_strength) propagation_indices = lsa_propagation_strength.argsort( )[-propagation_strength_elbow:] hypothesis_builder = HypothesisBuilder(disease_hypothesis.number_of_regions).\ set_attributes_based_on_hypothesis(disease_hypothesis). \ set_lsa_propagation(propagation_indices, lsa_propagation_strength) return hypothesis_builder.build_lsa_hypothesis()
def run_lsa(self, disease_hypothesis, model_configuration): if self.lsa_method == "auto": if numpy.any(model_configuration.x1eq > X1EQ_CR_DEF): self.lsa_method = "2D" else: self.lsa_method = "1D" if self.lsa_method == "2D" and numpy.all(model_configuration.x1eq <= X1EQ_CR_DEF): warning("LSA with the '2D' method (on the 2D Epileptor model) will not produce interpretable results when" " the equilibrium point of the system is not supercritical (unstable)!") jacobian = self._compute_jacobian(model_configuration) # Perform eigenvalue decomposition eigen_values, eigen_vectors = numpy.linalg.eig(jacobian) eigen_values = numpy.real(eigen_values) eigen_vectors = numpy.real(eigen_vectors) sorted_indices = numpy.argsort(eigen_values, kind='mergesort') if self.lsa_method == "2D": sorted_indices = sorted_indices[::-1] self.eigen_vectors = eigen_vectors[:, sorted_indices] self.eigen_values = eigen_values[sorted_indices] self._ensure_eigen_vectors_number(self.eigen_values[:disease_hypothesis.number_of_regions], model_configuration.e_values, model_configuration.x0_values, disease_hypothesis.regions_disease_indices) if self.eigen_vectors_number == disease_hypothesis.number_of_regions: # Calculate the propagation strength index by summing all eigenvectors lsa_propagation_strength = numpy.abs(numpy.sum(self.eigen_vectors, axis=1)) else: sorted_indices = max(self.eigen_vectors_number, 1) # Calculate the propagation strength index by summing the first n eigenvectors (minimum 1) if self.weighted_eigenvector_sum: lsa_propagation_strength = \ numpy.abs(weighted_vector_sum(numpy.array(self.eigen_values[:self.eigen_vectors_number]), numpy.array(self.eigen_vectors[:, :self.eigen_vectors_number]), normalize=True)) else: lsa_propagation_strength = \ numpy.abs(numpy.sum(self.eigen_vectors[:, :self.eigen_vectors_number], axis=1)) if self.lsa_method == "2D": # lsa_propagation_strength = lsa_propagation_strength[:disease_hypothesis.number_of_regions] # or # lsa_propagation_strength = numpy.where(lsa_propagation_strength[:disease_hypothesis.number_of_regions] >= # lsa_propagation_strength[disease_hypothesis.number_of_regions:], # lsa_propagation_strength[:disease_hypothesis.number_of_regions], # lsa_propagation_strength[disease_hypothesis.number_of_regions:]) # or lsa_propagation_strength = numpy.sqrt(lsa_propagation_strength[:disease_hypothesis.number_of_regions]**2 + lsa_propagation_strength[disease_hypothesis.number_of_regions:]**2) lsa_propagation_strength = numpy.log10(lsa_propagation_strength) lsa_propagation_strength -= lsa_propagation_strength.min() if self.normalize_propagation_strength: # Normalize by the maximum lsa_propagation_strength /= numpy.max(lsa_propagation_strength) # # TODO: this has to be corrected # if self.eigen_vectors_number < 0.2 * disease_hypothesis.number_of_regions: # propagation_strength_elbow = numpy.max([self.get_curve_elbow_point(lsa_propagation_strength), # self.eigen_vectors_number]) # else: propagation_strength_elbow = self.get_curve_elbow_point(lsa_propagation_strength) propagation_indices = lsa_propagation_strength.argsort()[-propagation_strength_elbow:] hypothesis_builder = HypothesisBuilder(disease_hypothesis.number_of_regions). \ set_attributes_based_on_hypothesis(disease_hypothesis). \ set_name(disease_hypothesis.name + "_LSA"). \ set_lsa_propagation(propagation_indices, lsa_propagation_strength) return hypothesis_builder.build_lsa_hypothesis()