def run_community_detection()

in src/qbsolv_community.py [0:0]


    def run_community_detection(self, save=False):
        """
        Call QUBO classical/hybrid solver for community detection and save results
        
        :param save: boolean, True or False to set whether to save results locally or not
        :return: dict, two dictionaries: the first one 'results_graph' contains graph-level results about graph, qbsolv seetings, modularity values, 
        and execution time; the second one 'track' contains node-level results about graph edge connections and community assignment.
        """
        results_graph = collections.defaultdict(list)
        timenow = str(datetime.datetime.now())[:19].replace(' ', '_')
        date_today = str(datetime.date.today())
        track = {'graphs': [], 'responses': [], 'communities': []}

        output_parent = f'./output/{date_today}'
        result_file = f"result_{self.graph_name}_{timenow}_sl{self.solver_limit}_rp{self.num_repeats}_shot{self.num_reads}_seed{self.seed}.csv"

        if save and (not os.path.exists(output_parent)):
            print(f'Creating parent folder(s): {output_parent}')
            print('Will create required sub-directories quietly')
            os.makedirs(output_parent)

        # run QBSolv for community detection
        comm_results, response, time_spent = self._solve_single_graph()
        print(f"Modularity from QBSolv with {comm_results['num_comm']} communities is {round(comm_results['modularity'], 4)}")

        # Save graph information
        results_graph['graph_name'].append(self.graph_name)
        results_graph['total_nodes'].append(self.graph.number_of_nodes())
        results_graph['num_edge'].append(self.graph.number_of_edges())
        results_graph['num_comm'].append(self.num_comm)
            
        # Save results from qbsolv
        results_graph['modu_qbsolv'].append(comm_results['modularity'])
        results_graph['num_comm_qbsolv'].append(comm_results['num_comm'])
        results_graph['wall_time_s'].append(time_spent)
        results_graph['solver_limit'].append(self.solver_limit)
        results_graph['num_repeats'].append(self.num_repeats)
        results_graph['num_reads'].append(self.num_reads)
        results_graph['seed'].append(self.seed)
        results_graph['alpha'].append(self.alpha)
        results_graph['mode'].append(self.mode)
        results_graph['s3_folder'].append(self.s3_folder)

        graph_file = f"graph_{self.graph_name}_QBS_sl{self.solver_limit}_rp{self.num_repeats}_shot{self.num_reads}_seed{self.seed}.gpickle"
        response_file = f"response_{self.graph_name}_QBS_sl{self.solver_limit}_rp{self.num_repeats}_shot{self.num_reads}_seed{self.seed}.p"
        comm_file = f"modu_{self.graph_name}_QBS_sl{self.solver_limit}_rp{self.num_repeats}_shot{self.num_reads}_seed{self.seed}.p"

        track['graphs'].append((graph_file, deepcopy(self.graph)))
        track['responses'].append((response_file, deepcopy(response)))
        track['communities'].append((comm_file, deepcopy(comm_results)))

        if save:
            self._save_results(track, results_graph, output_parent, result_file)

        return results_graph, track