SSMT recipes#
Run analysis remotely (platform analysis)#
The following example demonstrates using the PlatformAnalysis object to run AnalyzerManager server-side. Running on the server side has the advantage of not needing to download the files required for analysis, as well as additional computational power.
In this example, we are going to run the following analyzers
import json
import os
from typing import Any, Dict, Union
from idmtools.entities.ianalyzer import IAnalyzer as BaseAnalyzer
import matplotlib as mpl
from idmtools.entities.iworkflow_item import IWorkflowItem
from idmtools.entities.simulation import Simulation
mpl.use('Agg')
class AdultVectorsAnalyzer(BaseAnalyzer):
def __init__(self, name='hi'):
super().__init__(filenames=["output\\InsetChart.json"])
print(name)
def initialize(self):
"""
Perform the Initialization of Analyzer
Here we ensure our output directory exists
Returns:
"""
if not os.path.exists(os.path.join(self.working_dir, "output")):
os.mkdir(os.path.join(self.working_dir, "output"))
def map(self, data: Dict[str, Any], item: Union[IWorkflowItem, Simulation]) -> Any:
"""
Select the Adult Vectors channel for the InsertChart
Args:
data: A dictionary that contains a mapping of filename to data
item: Item can be a Simulation or WorkItem
Returns:
"""
return data[self.filenames[0]]["Channels"]["Adult Vectors"]["Data"]
def reduce(self, all_data: Dict[Union[IWorkflowItem, Simulation], Any]) -> Any:
"""
Creates the final adult_vectors.json and Plot
Args:
all_data: Dictionary mapping our Items to the mapped data
Returns:
"""
output_dir = os.path.join(self.working_dir, "output")
with open(os.path.join(output_dir, "adult_vectors.json"), "w") as fp:
json.dump({str(s.uid): v for s, v in all_data.items()}, fp)
import matplotlib.pyplot as plt
fig = plt.figure()
ax = fig.add_subplot(111)
for pop in list(all_data.values()):
ax.plot(pop)
ax.legend([str(s.uid) for s in all_data.keys()])
fig.savefig(os.path.join(output_dir, "adult_vectors.png"))
import json
import os
from typing import Dict, Any, Union
from idmtools.entities.ianalyzer import IAnalyzer as BaseAnalyzer
import matplotlib as mpl
from idmtools.entities.iworkflow_item import IWorkflowItem
from idmtools.entities.simulation import Simulation
mpl.use('Agg')
class PopulationAnalyzer(BaseAnalyzer):
def __init__(self, title='idm'):
super().__init__(filenames=["output\\InsetChart.json"])
print(title)
def initialize(self):
"""
Initialize our Analyzer. At the moment, this just creates our output folder
Returns:
"""
if not os.path.exists(os.path.join(self.working_dir, "output")):
os.mkdir(os.path.join(self.working_dir, "output"))
def map(self, data: Dict[str, Any], item: Union[IWorkflowItem, Simulation]) -> Any:
"""
Extracts the Statistical Population, Data channel from InsetChart.
Called for Each WorkItem/Simulation.
Args:
data: Data mapping str to content of file
item: Item to Extract Data from(Usually a Simulation)
Returns:
"""
return data[self.filenames[0]]["Channels"]["Statistical Population"]["Data"]
def reduce(self, all_data: Dict[Union[IWorkflowItem, Simulation], Any]) -> Any:
"""
Create the Final Population JSON and Plot
Args:
all_data: Populate data from all the Simulations
Returns:
None
"""
output_dir = os.path.join(self.working_dir, "output")
with open(os.path.join(output_dir, "population.json"), "w") as fp:
json.dump({str(s.uid): v for s, v in all_data.items()}, fp)
import matplotlib.pyplot as plt
fig = plt.figure()
ax = fig.add_subplot(111)
for pop in list(all_data.values()):
ax.plot(pop)
ax.legend([str(s.uid) for s in all_data.keys()])
fig.savefig(os.path.join(output_dir, "population.png"))
from examples.ssmt.simple_analysis.analyzers.AdultVectorsAnalyzer import AdultVectorsAnalyzer
from examples.ssmt.simple_analysis.analyzers.PopulationAnalyzer import PopulationAnalyzer
from idmtools.core.platform_factory import Platform
from idmtools.analysis.platform_anaylsis import PlatformAnalysis
if __name__ == "__main__":
platform = Platform('CALCULON')
analysis = PlatformAnalysis(
platform=platform, experiment_ids=["b3e4fceb-bb71-ed11-aa00-b88303911bc1"],
analyzers=[PopulationAnalyzer, AdultVectorsAnalyzer], analyzers_args=[{'title': 'idm'}, {'name': 'global good'}],
analysis_name="SSMT Analysis Simple 1",
# You can pass any additional arguments needed to AnalyzerManager through the extra_args parameter
extra_args=dict(max_workers=8)
)
analysis.analyze(check_status=True)
wi = analysis.get_work_item()
print(wi)