diff --git a/examples/scripts/ssbj_mdo.py b/examples/scripts/ssbj_mdo.py index 02ce14331b3db12ccfb08fa3815ccd3df800e778..f8e8cabcca7740844ee74d5a8501ca3d569e3905 100644 --- a/examples/scripts/ssbj_mdo.py +++ b/examples/scripts/ssbj_mdo.py @@ -5,6 +5,8 @@ import logging from kadmos.graph import FundamentalProblemGraph, load # Settings for logging +from kadmos.graph.mixin_vistoms import vistoms_start + logging.basicConfig(format='%(levelname)s: %(message)s', level=logging.DEBUG) # List of MDAO definitions that can be wrapped around the problem @@ -13,10 +15,12 @@ mdao_definitions = ['MDF-GS', # 0 'IDF', # 2 'CO', # 3 'BLISS-2000'] # 4 +all_graphs = [] # Settings for scripting mdao_definitions_loop_all = True # Option for looping through all MDAO definitions mdao_definition_id = 2 # Option for selecting a MDAO definition (in case mdao_definitions_loop_all=False) +start_interactive_vistoms = True # Option to start an interactive VISTOMS at the end # Settings for loading and saving kb_dir = os.path.join(os.path.dirname(os.path.realpath(__file__)), '../knowledgebases') @@ -95,8 +99,7 @@ rcg.add_contact_roles('lmuller', roles='integrator') # Create a DSM and a VISTOMS visualization of the RCG rcg.create_dsm('RCG_extended', include_system_vars=True, destination_folder=pdf_dir, function_order=function_order) -# rcg.vistoms_create(vistoms_dir, function_order=function_order) -rcg.vistoms_start(vistoms_dir) +rcg.vistoms_create(vistoms_dir, function_order=function_order) # Save CMDOWS and KDMS file rcg.save('RCG', destination_folder=kdms_dir) @@ -108,6 +111,7 @@ rcg.save('RCG', destination_folder=cmdows_dir, pretty_print=True, integrity=True) +all_graphs.append(rcg) # On to the wrapping of the MDAO architectures # Get iterator (all or single one) @@ -186,6 +190,7 @@ for mdao_definition in mdao_definitions: fpg.add_problem_formulation(mdao_definition, function_order, doe_settings=None if mdao_definition is not 'BLISS-2000' else {'doe_method': 'Latin hypercube design', 'doe_seed': 5, 'doe_runs': 50}) + all_graphs.append(fpg) # Get Mdao graphs mdg, mpg = fpg.impose_mdao_architecture() @@ -214,5 +219,9 @@ for mdao_definition in mdao_definitions: version='0.1', pretty_print=True, integrity=True) + all_graphs.append((mdg,mpg)) logging.info('Done!') + +if start_interactive_vistoms: + vistoms_start(all_graphs, file_dir='ssbj/VISTOMStest') diff --git a/kadmos/graph/mixin_vistoms.py b/kadmos/graph/mixin_vistoms.py index 9b8c5c23f84d2299d20bc8d0f3bccaf59f58a09e..f5b0c54e893fde761dd34447aa6efdc2458202d8 100644 --- a/kadmos/graph/mixin_vistoms.py +++ b/kadmos/graph/mixin_vistoms.py @@ -55,7 +55,7 @@ class VistomsMixin(object): """ # Logging - logger.info('Creating the VISTOMS instance (this might take a while)...') + logger.info('Creating the VISTOMS instance...') # If destination folder is given, create + use that if file_dir is not None: @@ -919,6 +919,51 @@ class VistomsMixin(object): return variable_tree_categorized_function_level +def vistoms_start(graphs, file_dir=None): + """Function to open an interactive VISTOMS based on a list of data and (optionally) process graphs. If file_dir is + not provided then the files are stored in a temp directory. + + :param graphs: list or tuple with graphs. For pure data graphs, provide the graph object directly in the list. For + data+process graphs, provide them as a list or tuple pair with first the data graph and then process graph. + :type graphs: list or tuple + :param file_dir: folder name or path where the graphs used in the interactive VISTOMS will be stored. + :type file_dir: path + :param mpg: MDAO process graph to be used in combination with the data graph. + :type mpg: MdaoProcessGraph + :return: interactive VISTOMS + :rtype: file + """ + + # Logging + logger.info('Creating the VISTOMS instance...') + + # Assert input + assert isinstance(graphs, (list, tuple)), 'Input should be of type list or tuple, now: {}.'.format(type(graphs)) + + # If destination folder is given, create + use that + if file_dir is not None: + if os.path.isdir(file_dir): + shutil.rmtree(file_dir) + os.mkdir(file_dir) + vistoms_dir = os.path.abspath(file_dir) + # Else create temporary directory + else: + temp_dir = tempfile.mkdtemp() + vistoms_dir = os.path.abspath(temp_dir) + + # Save the graphs in the folder + for i, graph in enumerate(graphs): + i_str = format(len(graphs)-i, '02d') + if isinstance(graph, (list, tuple)): + graph[0].save('tmp_{}.kdms'.format(i_str), destination_folder=vistoms_dir, mpg=graph[1]) + else: + graph.save('tmp_{}.kdms'.format(i_str), destination_folder=vistoms_dir) + + # Then run interactive VISTOMS + from kadmos.vistoms.vistoms import run_vistoms + run_vistoms(folder=vistoms_dir) + + def vistoms_remove(graph_id, vistoms_dir, compress=False, remove_after_compress=True): """ Function to remove a graph from a VISTOMS instance.