diff --git a/online-workflow/src/main/java/eu/itesla_project/online/LocalOnlineApplication.java b/online-workflow/src/main/java/eu/itesla_project/online/LocalOnlineApplication.java index 638a8cca..b690c795 100644 --- a/online-workflow/src/main/java/eu/itesla_project/online/LocalOnlineApplication.java +++ b/online-workflow/src/main/java/eu/itesla_project/online/LocalOnlineApplication.java @@ -59,49 +59,48 @@ import java.util.concurrent.locks.ReentrantLock; /** - * * @author Quinary */ -public class LocalOnlineApplication extends NotificationBroadcasterSupport implements OnlineApplication, OnlineApplicationListener, LocalOnlineApplicationMBean { +public class LocalOnlineApplication extends NotificationBroadcasterSupport implements OnlineApplication, OnlineApplicationListener, LocalOnlineApplicationMBean { private static final Logger LOGGER = LoggerFactory.getLogger(LocalOnlineApplication.class); private static final int BUSY_CORES_HISTORY_SIZE = 20; - private OnlineConfig config; + private OnlineConfig config; private final ComputationManager computationManager; private final boolean enableJmx; - - private OnlineWorkflow workflow ; - private HistoDbClient histoDbClient; + private OnlineWorkflow workflow; - private ContingenciesAndActionsDatabaseClient cadbClient; + private HistoDbClient histoDbClient; - private RulesDbClient rulesDb; + private ContingenciesAndActionsDatabaseClient cadbClient; - private WCAFactory wcaFactory; + private RulesDbClient rulesDb; - private LoadFlowFactory loadFlowFactory; + private WCAFactory wcaFactory; - private ForecastErrorsDataStorage feDataStorage; - - private OnlineDb onlineDb; + private LoadFlowFactory loadFlowFactory; - private UncertaintiesAnalyserFactory uncertaintiesAnalyserFactory; - - private CorrectiveControlOptimizerFactory correctiveControlOptimizerFactory; - - private CaseRepository caseRepository; + private ForecastErrorsDataStorage feDataStorage; - private SimulatorFactory simulatorFactory; + private OnlineDb onlineDb; + + private UncertaintiesAnalyserFactory uncertaintiesAnalyserFactory; + + private CorrectiveControlOptimizerFactory correctiveControlOptimizerFactory; + + private CaseRepository caseRepository; + + private SimulatorFactory simulatorFactory; + + private MontecarloSamplerFactory montecarloSamplerFactory; - private MontecarloSamplerFactory montecarloSamplerFactory; - private MergeOptimizerFactory mergeOptimizerFactory; - + private RulesFacadeFactory rulesFacadeFactory; private final ScheduledFuture future; @@ -125,11 +124,11 @@ public LocalOnlineApplication(OnlineConfig config, this.computationManager = computationManager; LOGGER.info("Version: {}", Version.VERSION); - - init(); - + + init(); + this.enableJmx = enableJmx; - + busyCores = new TIntArrayList(); ComputationResourcesStatus status = computationManager.getResourcesStatus(); @@ -152,27 +151,26 @@ public LocalOnlineApplication(OnlineConfig config, } }, 0, 20, TimeUnit.SECONDS); } - - - - private void init() throws InstantiationException, IllegalAccessException{ - - histoDbClient = config.getHistoDbClientFactoryClass().newInstance().create(); - cadbClient = config.getContingencyDbClientFactoryClass().newInstance().create(); - rulesDb = config.getRulesDbClientFactoryClass().newInstance().create("rulesdb"); - wcaFactory = config.getWcaFactoryClass().newInstance(); - loadFlowFactory = config.getLoadFlowFactoryClass().newInstance(); - onlineDb = config.getOnlineDbFactoryClass().newInstance().create(); - uncertaintiesAnalyserFactory = config.getUncertaintiesAnalyserFactoryClass().newInstance(); - correctiveControlOptimizerFactory = config.getCorrectiveControlOptimizerFactoryClass().newInstance(); - simulatorFactory = config.getSimulatorFactoryClass().newInstance(); - montecarloSamplerFactory = config.getMontecarloSamplerFactory().newInstance(); - caseRepository = config.getCaseRepositoryFactoryClass().newInstance().create(computationManager); - mergeOptimizerFactory = config.getMergeOptimizerFactory().newInstance(); - rulesFacadeFactory = config.getRulesFacadeFactory().newInstance(); - - this.feDataStorage = new ForecastErrorsDataStorageImpl(); //TODO ... - + + + private void init() throws InstantiationException, IllegalAccessException { + + histoDbClient = config.getHistoDbClientFactoryClass().newInstance().create(); + cadbClient = config.getContingencyDbClientFactoryClass().newInstance().create(); + rulesDb = config.getRulesDbClientFactoryClass().newInstance().create("rulesdb"); + wcaFactory = config.getWcaFactoryClass().newInstance(); + loadFlowFactory = config.getLoadFlowFactoryClass().newInstance(); + onlineDb = config.getOnlineDbFactoryClass().newInstance().create(); + uncertaintiesAnalyserFactory = config.getUncertaintiesAnalyserFactoryClass().newInstance(); + correctiveControlOptimizerFactory = config.getCorrectiveControlOptimizerFactoryClass().newInstance(); + simulatorFactory = config.getSimulatorFactoryClass().newInstance(); + montecarloSamplerFactory = config.getMontecarloSamplerFactory().newInstance(); + caseRepository = config.getCaseRepositoryFactoryClass().newInstance().create(computationManager); + mergeOptimizerFactory = config.getMergeOptimizerFactory().newInstance(); + rulesFacadeFactory = config.getRulesFacadeFactory().newInstance(); + + this.feDataStorage = new ForecastErrorsDataStorageImpl(); //TODO ... + } @Override @@ -182,7 +180,7 @@ public int[] getBusyCores() { @Override public void notifyListeners() { - notifyBusyCoresUpdate(true); + notifyBusyCoresUpdate(true); } private void notifyBusyCoresUpdate(boolean force) { @@ -191,25 +189,25 @@ private void notifyBusyCoresUpdate(boolean force) { // busy cores if (!force) { - long tim=System.currentTimeMillis(); - if (tim % 2==0) - busyCores.insert(0, computationManager.getResourcesStatus().getBusyCores()); - else - busyCores.insert(0, 1); + long tim = System.currentTimeMillis(); + if (tim % 2 == 0) + busyCores.insert(0, computationManager.getResourcesStatus().getBusyCores()); + else + busyCores.insert(0, 1); - busyCores.removeAt(busyCores.size()-1); // remove the older one + busyCores.removeAt(busyCores.size() - 1); // remove the older one } if (enableJmx) { sendNotification(new AttributeChangeNotification(this, - notificationIndex.getAndIncrement(), - System.currentTimeMillis(), - "Busy cores has changed", - BUSY_CORES_ATTRIBUTE, - "int[]", - null, - busyCores.toArray())); + notificationIndex.getAndIncrement(), + System.currentTimeMillis(), + "Busy cores has changed", + BUSY_CORES_ATTRIBUTE, + "int[]", + null, + busyCores.toArray())); } - + } finally { listenersLock.unlock(); } @@ -222,43 +220,42 @@ public int getAvailableCores() { @Override - public void startWorkflow( OnlineWorkflowStartParameters start, OnlineWorkflowParameters params) { - - try { - config=OnlineConfig.load(); - init(); - } catch (ClassNotFoundException | IOException | ParseException | InstantiationException | IllegalAccessException e1) { - - e1.printStackTrace(); - throw new RuntimeException(e1.getMessage()); - } - - + public void startWorkflow(OnlineWorkflowStartParameters start, OnlineWorkflowParameters params) { + + try { + config = OnlineConfig.load(); + init(); + } catch (ClassNotFoundException | IOException | ParseException | InstantiationException | IllegalAccessException e1) { + + e1.printStackTrace(); + throw new RuntimeException(e1.getMessage()); + } + + OnlineWorkflowContext oCtx = new OnlineWorkflowContext(); - OnlineWorkflowStartParameters startParams= start!=null ? start : OnlineWorkflowStartParameters.loadDefault(); - OnlineWorkflowParameters onlineParams = params !=null ? params : OnlineWorkflowParameters.loadDefault(); - - - LOGGER.info("Starting workflow: "+startParams.toString()+"\n"+onlineParams.toString()); - - if(!workflowLock.tryLock()) - { - throw new RuntimeException("Already running"); + OnlineWorkflowStartParameters startParams = start != null ? start : OnlineWorkflowStartParameters.loadDefault(); + OnlineWorkflowParameters onlineParams = params != null ? params : OnlineWorkflowParameters.loadDefault(); + + + LOGGER.info("Starting workflow: " + startParams.toString() + "\n" + onlineParams.toString()); + + if (!workflowLock.tryLock()) { + throw new RuntimeException("Already running"); } - + try { - workflow =startParams.getOnlineWorkflowFactoryClass().newInstance().create(computationManager, cadbClient, histoDbClient, rulesDb, wcaFactory, loadFlowFactory, feDataStorage, - onlineDb, uncertaintiesAnalyserFactory, correctiveControlOptimizerFactory, simulatorFactory, caseRepository, - montecarloSamplerFactory, mergeOptimizerFactory, rulesFacadeFactory, onlineParams, startParams); - } catch (InstantiationException | IllegalAccessException e1 ) { - e1.printStackTrace(); - throw new RuntimeException(e1.getMessage()); - } - + workflow = startParams.getOnlineWorkflowFactoryClass().newInstance().create(computationManager, cadbClient, histoDbClient, rulesDb, wcaFactory, loadFlowFactory, feDataStorage, + onlineDb, uncertaintiesAnalyserFactory, correctiveControlOptimizerFactory, simulatorFactory, caseRepository, + montecarloSamplerFactory, mergeOptimizerFactory, rulesFacadeFactory, onlineParams, startParams); + } catch (InstantiationException | IllegalAccessException e1) { + e1.printStackTrace(); + throw new RuntimeException(e1.getMessage()); + } + workflow.addOnlineApplicationListener(this); - for (OnlineApplicationListener l : listeners) - workflow.addOnlineApplicationListener(l); + for (OnlineApplicationListener l : listeners) + workflow.addOnlineApplicationListener(l); try { @@ -274,20 +271,18 @@ public void startWorkflow( OnlineWorkflowStartParameters start, OnlineWorkflowPa workflow.start(oCtx); } catch (Exception e) { throw new RuntimeException(e); - } - finally - { + } finally { workflowLock.unlock(); - workflow=null; + workflow = null; } } @Override public void stopWorkflow() { - - // workflow.stop(); + + // workflow.stop(); } - + @Override public void addListener(OnlineApplicationListener l) { listeners.add(l); @@ -297,30 +292,29 @@ public void addListener(OnlineApplicationListener l) { public void removeListener(OnlineApplicationListener l) { listeners.remove(l); } - + @Override public void close() throws Exception { future.cancel(true); - // histoDbClient.close(); + // histoDbClient.close(); if (enableJmx) { // unregister application mbean ManagementFactory.getPlatformMBeanServer().unregisterMBean(new ObjectName(BEAN_NAME)); } - synchronized(this) - { - this.notifyAll(); + synchronized (this) { + this.notifyAll(); } } - @Override - public void onBusyCoresUpdate(int[] busyCores) { - - - } + @Override + public void onBusyCoresUpdate(int[] busyCores) { - @Override + + } + + @Override public void onWorkflowStateUpdate(WorkSynthesis status) { if (enableJmx) { sendNotification(new AttributeChangeNotification(this, @@ -335,7 +329,7 @@ public void onWorkflowStateUpdate(WorkSynthesis status) { } - @Override + @Override public void onWorkflowUpdate(StatusSynthesis status) { if (enableJmx) { sendNotification(new AttributeChangeNotification(this, @@ -350,7 +344,7 @@ public void onWorkflowUpdate(StatusSynthesis status) { } - @Override + @Override public void onWcaUpdate(RunningSynthesis wcaRunning) { LOGGER.info("SEND onWcaUpdate" + wcaRunning); if (enableJmx) { @@ -366,7 +360,7 @@ public void onWcaUpdate(RunningSynthesis wcaRunning) { } - @Override + @Override public void onStatesWithActionsUpdate(ContingencyStatesActionsSynthesis statesActions) { LOGGER.info("onStatesWithActionsUpdate received " + statesActions.getClass().getName()); @@ -383,14 +377,14 @@ public void onStatesWithActionsUpdate(ContingencyStatesActionsSynthesis statesAc } - @Override + @Override public void onStatesWithIndexesUpdate(ContingencyStatesIndexesSynthesis indexeActions) { LOGGER.info("onStatesWithIndexesUpdate received " + indexeActions.getClass().getName()); if (enableJmx) { sendNotification(new AttributeChangeNotification(this, notificationIndex.getAndIncrement(), System.currentTimeMillis(), - // "StateActions", + // "StateActions", "StatesIndexes", STATES_INDEXES_ATTRIBUTE, indexeActions.getClass().getName(), @@ -400,8 +394,8 @@ public void onStatesWithIndexesUpdate(ContingencyStatesIndexesSynthesis indexeAc } - @Override - public void onStatesWithSecurityRulesResultsUpdate(IndexSecurityRulesResultsSynthesis indexesResults) { + @Override + public void onStatesWithSecurityRulesResultsUpdate(IndexSecurityRulesResultsSynthesis indexesResults) { LOGGER.info("onStatesWithSecurityRulesResultsUpdate received " + indexesResults.getClass().getName()); if (enableJmx) { sendNotification(new AttributeChangeNotification(this, @@ -441,55 +435,54 @@ public void onUnstableContingencies(UnstableContingenciesSynthesis unstableConti unstableContingencies)); }*/ - - @Override - public void onWcaContingencies(WcaContingenciesSynthesis wcaContingencies) { - sendNotification(new AttributeChangeNotification(this, - notificationIndex.getAndIncrement(), - System.currentTimeMillis(), - "WcaContingencies", - WCA_CONTINGENCIES_ATTRIBUTE, - wcaContingencies.getClass().getName(), - null, - wcaContingencies)); - - } - - @Override - public void ping() { - - } - @Override - public void onDisconnection() { - // TODO Auto-generated method stub - - } + @Override + public void onWcaContingencies(WcaContingenciesSynthesis wcaContingencies) { + sendNotification(new AttributeChangeNotification(this, + notificationIndex.getAndIncrement(), + System.currentTimeMillis(), + "WcaContingencies", + WCA_CONTINGENCIES_ATTRIBUTE, + wcaContingencies.getClass().getName(), + null, + wcaContingencies)); - @Override - public void onConnection() { - // TODO Auto-generated method stub - - } + } - @Override - public void shutdown() { - System.out.println("Shutdown !!!"); - try { - close(); - } catch (Exception e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } - - } + @Override + public void ping() { + + } + + @Override + public void onDisconnection() { + // TODO Auto-generated method stub + + } + + @Override + public void onConnection() { + // TODO Auto-generated method stub + + } + + @Override + public void shutdown() { + System.out.println("Shutdown !!!"); + try { + close(); + } catch (Exception e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + + } @Override public void runFeaAnalysis(OnlineWorkflowStartParameters startconfig, ForecastErrorsAnalysisParameters parameters, String timeHorizonS) { - LOGGER.info("Starting fea analysis: "+parameters.toString()+"\n"+timeHorizonS); + LOGGER.info("Starting fea analysis: " + parameters.toString() + "\n" + timeHorizonS); - if(!workflowLock.tryLock()) - { + if (!workflowLock.tryLock()) { throw new RuntimeException("a computation is already running."); } @@ -505,27 +498,27 @@ public void runFeaAnalysis(OnlineWorkflowStartParameters startconfig, ForecastEr } catch (Exception e) { e.printStackTrace(); throw new RuntimeException(e); - } finally { + } finally { workflowLock.unlock(); - workflow=null; + workflow = null; } } @Override - public void onWorkflowEnd(OnlineWorkflowContext context, OnlineDb onlineDb, ContingenciesAndActionsDatabaseClient cadbClient, OnlineWorkflowParameters parameters) { - System.out.println("LocalOnlineApplicationListener onWorkFlowEnd"); - } + public void onWorkflowEnd(OnlineWorkflowContext context, OnlineDb onlineDb, ContingenciesAndActionsDatabaseClient cadbClient, OnlineWorkflowParameters parameters) { + System.out.println("LocalOnlineApplicationListener onWorkFlowEnd"); + } // start td simulations private Path getFile(Path folder, String filename) { - if ( folder != null ) + if (folder != null) return Paths.get(folder.toString(), filename); return Paths.get(filename); } - + private void writeCsvViolations(String basecase, List networkViolations, CsvWriter cvsWriter) throws IOException { - for(LimitViolation violation : networkViolations) { + for (LimitViolation violation : networkViolations) { String[] values = new String[]{basecase, violation.getSubject().getId(), violation.getLimitType().name(), @@ -533,28 +526,28 @@ private void writeCsvViolations(String basecase, List networkVio Float.toString(violation.getLimit())}; cvsWriter.writeRecord(values); } - cvsWriter.flush(); + cvsWriter.flush(); } - - private void writeCsvTDResults(String basecase, Set securityIndexIds, Map tdSimulationResults, - boolean writeHeaders, CsvWriter cvsWriter) throws IOException { - String[] indexIds = securityIndexIds.toArray(new String[securityIndexIds.size()]); + + private void writeCsvTDResults(String basecase, Set securityIndexIds, Map tdSimulationResults, + boolean writeHeaders, CsvWriter cvsWriter) throws IOException { + String[] indexIds = securityIndexIds.toArray(new String[securityIndexIds.size()]); Arrays.sort(indexIds); - if ( writeHeaders ) { - String[] resultsHeaders = new String[indexIds.length+1]; + if (writeHeaders) { + String[] resultsHeaders = new String[indexIds.length + 1]; resultsHeaders[0] = "Basecase"; int i = 1; - for(String securityIndexId : indexIds) - resultsHeaders[i++] = securityIndexId; + for (String securityIndexId : indexIds) + resultsHeaders[i++] = securityIndexId; cvsWriter.writeRecord(resultsHeaders); cvsWriter.flush(); } - String[] values = new String[indexIds.length+1]; + String[] values = new String[indexIds.length + 1]; values[0] = basecase; int i = 1; - for(String securityIndexId : indexIds) { + for (String securityIndexId : indexIds) { String result = "NA"; - if ( tdSimulationResults.containsKey(securityIndexId) ) + if (tdSimulationResults.containsKey(securityIndexId)) result = tdSimulationResults.get(securityIndexId) ? "OK" : "KO"; values[i++] = result; } @@ -565,22 +558,22 @@ private void writeCsvTDResults(String basecase, Set securityIndexIds, Ma private void runTDSimulations(Path caseFile, String contingenciesIds, Boolean emptyContingency, Path outputFolder) throws Exception { //TODO check nulls //in contingenciesIds, we assume a comma separated list of ids ... - Set contingencyIds = (contingenciesIds != null) ? Sets.newHashSet(contingenciesIds.split(",")) : null; + Set contingencyIds = (contingenciesIds != null) ? Sets.newHashSet(contingenciesIds.split(",")) : null; Path metricsFile = getFile(outputFolder, "metrics.log"); Path violationsFile = getFile(outputFolder, "networks-violations.csv"); Path resultsFile = getFile(outputFolder, "simulation-results.csv"); try (FileWriter metricsContent = new FileWriter(metricsFile.toFile()); - FileWriter violationsContent = new FileWriter(violationsFile.toFile()); - FileWriter resultsContent = new FileWriter(resultsFile.toFile())) { - CsvWriter violationsCvsWriter = new CsvWriter(violationsContent, ','); - CsvWriter resultsCvsWriter = new CsvWriter(resultsContent, ','); - Set securityIndexIds = new LinkedHashSet<>(); - try { - String[] violationsHeaders = new String[]{"Basecase", "Equipment", "Type", "Value", "Limit"}; - violationsCvsWriter.writeRecord(violationsHeaders); - violationsCvsWriter.flush(); - - if (Files.isRegularFile(caseFile)) { + FileWriter violationsContent = new FileWriter(violationsFile.toFile()); + FileWriter resultsContent = new FileWriter(resultsFile.toFile())) { + CsvWriter violationsCvsWriter = new CsvWriter(violationsContent, ','); + CsvWriter resultsCvsWriter = new CsvWriter(resultsContent, ','); + Set securityIndexIds = new LinkedHashSet<>(); + try { + String[] violationsHeaders = new String[]{"Basecase", "Equipment", "Type", "Value", "Limit"}; + violationsCvsWriter.writeRecord(violationsHeaders); + violationsCvsWriter.flush(); + + if (Files.isRegularFile(caseFile)) { // load the network Network network = Importers.loadNetwork(caseFile); @@ -589,55 +582,54 @@ private void runTDSimulations(Path caseFile, String contingenciesIds, Boolean em } network.getStateManager().allowStateMultiThreadAccess(true); - List networkViolations = Security.checkLimits(network); - writeCsvViolations(network.getId(), networkViolations, violationsCvsWriter); - Map tdSimulationResults = Utils.runTDSimulation(network, - contingencyIds, - emptyContingency, - computationManager, - simulatorFactory, - cadbClient, - metricsContent); - securityIndexIds.addAll(tdSimulationResults.keySet()); - writeCsvTDResults(network.getId(), securityIndexIds, tdSimulationResults, true, resultsCvsWriter); - } else if (Files.isDirectory(caseFile)){ - Importers.loadNetworks(caseFile, false, network -> { - try { - List networkViolations = Security.checkLimits(network); - writeCsvViolations(network.getId(), networkViolations, violationsCvsWriter); - Map tdSimulationResults = Utils.runTDSimulation(network, - contingencyIds, - emptyContingency, - computationManager, - simulatorFactory, - cadbClient, - metricsContent); - boolean writeHeaders = false; - if ( securityIndexIds.isEmpty() ) { - securityIndexIds.addAll(tdSimulationResults.keySet()); - writeHeaders = true; - } - writeCsvTDResults(network.getId(), securityIndexIds, tdSimulationResults, writeHeaders, resultsCvsWriter); - } catch (Exception e) { - e.printStackTrace(); - } - }, dataSource -> System.out.println("loading case " + dataSource.getBaseName())); - } - } catch (IOException ioxcp) { - ioxcp.printStackTrace(); - } finally { - violationsCvsWriter.close(); - resultsCvsWriter.close(); - } + List networkViolations = Security.checkLimits(network); + writeCsvViolations(network.getId(), networkViolations, violationsCvsWriter); + Map tdSimulationResults = Utils.runTDSimulation(network, + contingencyIds, + emptyContingency, + computationManager, + simulatorFactory, + cadbClient, + metricsContent); + securityIndexIds.addAll(tdSimulationResults.keySet()); + writeCsvTDResults(network.getId(), securityIndexIds, tdSimulationResults, true, resultsCvsWriter); + } else if (Files.isDirectory(caseFile)) { + Importers.loadNetworks(caseFile, false, network -> { + try { + List networkViolations = Security.checkLimits(network); + writeCsvViolations(network.getId(), networkViolations, violationsCvsWriter); + Map tdSimulationResults = Utils.runTDSimulation(network, + contingencyIds, + emptyContingency, + computationManager, + simulatorFactory, + cadbClient, + metricsContent); + boolean writeHeaders = false; + if (securityIndexIds.isEmpty()) { + securityIndexIds.addAll(tdSimulationResults.keySet()); + writeHeaders = true; + } + writeCsvTDResults(network.getId(), securityIndexIds, tdSimulationResults, writeHeaders, resultsCvsWriter); + } catch (Exception e) { + e.printStackTrace(); + } + }, dataSource -> System.out.println("loading case " + dataSource.getBaseName())); + } + } catch (IOException ioxcp) { + ioxcp.printStackTrace(); + } finally { + violationsCvsWriter.close(); + resultsCvsWriter.close(); + } } } @Override public void runTDSimulations(OnlineWorkflowStartParameters startconfig, String caseFile, String contingenciesIds, String emptyContingencyS, String outputFolderS) { - LOGGER.info("Starting td simulations: "+startconfig.toString()+"\n"); + LOGGER.info("Starting td simulations: " + startconfig.toString() + "\n"); - if(!workflowLock.tryLock()) - { + if (!workflowLock.tryLock()) { throw new RuntimeException("a computation is already running."); } @@ -650,9 +642,9 @@ public void runTDSimulations(OnlineWorkflowStartParameters startconfig, String c } catch (Exception e) { e.printStackTrace(); throw new RuntimeException(e); - } finally { + } finally { workflowLock.unlock(); - workflow=null; + workflow = null; } } diff --git a/online-workflow/src/main/java/eu/itesla_project/online/LocalOnlineApplicationMBean.java b/online-workflow/src/main/java/eu/itesla_project/online/LocalOnlineApplicationMBean.java index c22014f0..d215074c 100644 --- a/online-workflow/src/main/java/eu/itesla_project/online/LocalOnlineApplicationMBean.java +++ b/online-workflow/src/main/java/eu/itesla_project/online/LocalOnlineApplicationMBean.java @@ -10,42 +10,41 @@ import eu.itesla_project.offline.forecast_errors.ForecastErrorsAnalysisParameters; /** - * * @author Quinary */ public interface LocalOnlineApplicationMBean { String BEAN_NAME = "eu.itesla_project.online:type=LocalOnlineApplicationMBean"; - + String BUSY_CORES_ATTRIBUTE = "BusyCores"; - + String WORK_STATES_ATTRIBUTE = "WorkflowStates"; - + String RUNNING_ATTRIBUTE = "Running"; - + String WCA_RUNNING_ATTRIBUTE = "WcaRunning"; - + String STATES_ACTIONS_ATTRIBUTE = "StateActions"; - - // String STABLE_CONTINGENCIES_ATTRIBUTE = "StableContingencies"; - - String STATES_INDEXES_ATTRIBUTE = "StatesIndexes"; - - String INDEXES_SECURITY_RULES_ATTRIBUTE ="IndexSecurityRulesResults"; - - // String UNSTABLE_CONTINGENCIES_ATTRIBUTE = "UnstableContingencies"; - - String WCA_CONTINGENCIES_ATTRIBUTE = "WcaContingencies"; - - //Apogee - // String GENERATE_CARD_ATTRIBUTE = "Card"; - - void ping(); + + // String STABLE_CONTINGENCIES_ATTRIBUTE = "StableContingencies"; + + String STATES_INDEXES_ATTRIBUTE = "StatesIndexes"; + + String INDEXES_SECURITY_RULES_ATTRIBUTE = "IndexSecurityRulesResults"; + + // String UNSTABLE_CONTINGENCIES_ATTRIBUTE = "UnstableContingencies"; + + String WCA_CONTINGENCIES_ATTRIBUTE = "WcaContingencies"; + + //Apogee + // String GENERATE_CARD_ATTRIBUTE = "Card"; + + void ping(); int getAvailableCores(); int[] getBusyCores(); - + void startWorkflow(OnlineWorkflowStartParameters start, OnlineWorkflowParameters params); void stopWorkflow(); diff --git a/online-workflow/src/main/java/eu/itesla_project/online/Utils.java b/online-workflow/src/main/java/eu/itesla_project/online/Utils.java index d73da005..06b58c61 100644 --- a/online-workflow/src/main/java/eu/itesla_project/online/Utils.java +++ b/online-workflow/src/main/java/eu/itesla_project/online/Utils.java @@ -19,139 +19,137 @@ import eu.itesla_project.modules.online.OnlineWorkflowResults; /** - * * @author Quinary */ public class Utils { - private static final String EMPTY_CONTINGENCY_ID = "Empty-Contingency"; + private static final String EMPTY_CONTINGENCY_ID = "Empty-Contingency"; - public static String actionsToJson(OnlineWorkflowResults wfResults, String contingencyId, Integer stateId) { - Map actionInfo = new HashMap<>(); - actionInfo.put("actions_found", wfResults.getUnsafeStatesWithActions(contingencyId).get(stateId)); - actionInfo.put("status", wfResults.getStateStatus(contingencyId, stateId)); - List actions = new ArrayList<>(); - for (String actionId : wfResults.getActionsIds(contingencyId, stateId)) { - if ( wfResults.getEquipmentsIds(contingencyId, stateId, actionId) != null - && !wfResults.getEquipmentsIds(contingencyId, stateId, actionId).isEmpty() ) { - Map action = new HashMap<>(); - List equipments = new ArrayList<>(); - for (String equipmentId : wfResults.getEquipmentsIds(contingencyId, stateId, actionId)) { - ActionParameters actionParameters = wfResults.getParameters(contingencyId, stateId, actionId, equipmentId); - if ( actionParameters != null && !actionParameters.getNames().isEmpty() ) { - Map> equipment = new HashMap<>(); - Map params = new HashMap<>(); - for(String param : actionParameters.getNames()) { - params.put(param, actionParameters.getValue(param)); - } - equipment.put(equipmentId, params); - equipments.add(equipment); - } else - equipments.add(equipmentId); - } - action.put(actionId, equipments); - actions.add(action); - } else - actions.add(actionId); - } - if ( wfResults.getActionPlan(contingencyId, stateId) != null ) { - actionInfo.put(wfResults.getActionPlan(contingencyId, stateId), actions); - } else { - if ( !actions.isEmpty() ) - actionInfo.put("actions", actions); - } - return JSONSerializer.toJSON(actionInfo).toString(); - } - - public static String actionsToJsonExtended(OnlineWorkflowResults wfResults, String contingencyId, Integer stateId) { - Map actionInfo = new HashMap<>(); - actionInfo.put("actions_found", wfResults.getUnsafeStatesWithActions(contingencyId).get(stateId)); - actionInfo.put("status", wfResults.getStateStatus(contingencyId, stateId)); - String cause = wfResults.getCause(contingencyId, stateId); - if ( cause != null ) - actionInfo.put("cause", cause); - if ( wfResults.getActionsIds(contingencyId, stateId) != null && !wfResults.getActionsIds(contingencyId, stateId).isEmpty() ) { - List actions = new ArrayList<>(); - for (String actionId : wfResults.getActionsIds(contingencyId, stateId)) { - Map action = new HashMap<>(); - action.put("action_id", actionId); - if ( wfResults.getEquipmentsIds(contingencyId, stateId, actionId) != null - && !wfResults.getEquipmentsIds(contingencyId, stateId, actionId).isEmpty() ) { - List equipments = new ArrayList<>(); - for (String equipmentId : wfResults.getEquipmentsIds(contingencyId, stateId, actionId)) { - Map equipment = new HashMap<>(); - equipment.put("equipment_id", equipmentId); - ActionParameters actionParameters = wfResults.getParameters(contingencyId, stateId, actionId, equipmentId); - if ( actionParameters != null && !actionParameters.getNames().isEmpty() ) { - Map params = new HashMap<>(); - for(String param : actionParameters.getNames()) { - params.put(param, actionParameters.getValue(param)); - } - equipment.put("parameters", params); - } - equipments.add(equipment); - } - action.put("equipments", equipments); - } - actions.add(action); - } - actionInfo.put("actions", actions); - } - if ( wfResults.getActionPlan(contingencyId, stateId) != null ) { - actionInfo.put("action_plan", wfResults.getActionPlan(contingencyId, stateId)); - } - return JSONSerializer.toJSON(actionInfo).toString(); - } + public static String actionsToJson(OnlineWorkflowResults wfResults, String contingencyId, Integer stateId) { + Map actionInfo = new HashMap<>(); + actionInfo.put("actions_found", wfResults.getUnsafeStatesWithActions(contingencyId).get(stateId)); + actionInfo.put("status", wfResults.getStateStatus(contingencyId, stateId)); + List actions = new ArrayList<>(); + for (String actionId : wfResults.getActionsIds(contingencyId, stateId)) { + if (wfResults.getEquipmentsIds(contingencyId, stateId, actionId) != null + && !wfResults.getEquipmentsIds(contingencyId, stateId, actionId).isEmpty()) { + Map action = new HashMap<>(); + List equipments = new ArrayList<>(); + for (String equipmentId : wfResults.getEquipmentsIds(contingencyId, stateId, actionId)) { + ActionParameters actionParameters = wfResults.getParameters(contingencyId, stateId, actionId, equipmentId); + if (actionParameters != null && !actionParameters.getNames().isEmpty()) { + Map> equipment = new HashMap<>(); + Map params = new HashMap<>(); + for (String param : actionParameters.getNames()) { + params.put(param, actionParameters.getValue(param)); + } + equipment.put(equipmentId, params); + equipments.add(equipment); + } else + equipments.add(equipmentId); + } + action.put(actionId, equipments); + actions.add(action); + } else + actions.add(actionId); + } + if (wfResults.getActionPlan(contingencyId, stateId) != null) { + actionInfo.put(wfResults.getActionPlan(contingencyId, stateId), actions); + } else { + if (!actions.isEmpty()) + actionInfo.put("actions", actions); + } + return JSONSerializer.toJSON(actionInfo).toString(); + } + public static String actionsToJsonExtended(OnlineWorkflowResults wfResults, String contingencyId, Integer stateId) { + Map actionInfo = new HashMap<>(); + actionInfo.put("actions_found", wfResults.getUnsafeStatesWithActions(contingencyId).get(stateId)); + actionInfo.put("status", wfResults.getStateStatus(contingencyId, stateId)); + String cause = wfResults.getCause(contingencyId, stateId); + if (cause != null) + actionInfo.put("cause", cause); + if (wfResults.getActionsIds(contingencyId, stateId) != null && !wfResults.getActionsIds(contingencyId, stateId).isEmpty()) { + List actions = new ArrayList<>(); + for (String actionId : wfResults.getActionsIds(contingencyId, stateId)) { + Map action = new HashMap<>(); + action.put("action_id", actionId); + if (wfResults.getEquipmentsIds(contingencyId, stateId, actionId) != null + && !wfResults.getEquipmentsIds(contingencyId, stateId, actionId).isEmpty()) { + List equipments = new ArrayList<>(); + for (String equipmentId : wfResults.getEquipmentsIds(contingencyId, stateId, actionId)) { + Map equipment = new HashMap<>(); + equipment.put("equipment_id", equipmentId); + ActionParameters actionParameters = wfResults.getParameters(contingencyId, stateId, actionId, equipmentId); + if (actionParameters != null && !actionParameters.getNames().isEmpty()) { + Map params = new HashMap<>(); + for (String param : actionParameters.getNames()) { + params.put(param, actionParameters.getValue(param)); + } + equipment.put("parameters", params); + } + equipments.add(equipment); + } + action.put("equipments", equipments); + } + actions.add(action); + } + actionInfo.put("actions", actions); + } + if (wfResults.getActionPlan(contingencyId, stateId) != null) { + actionInfo.put("action_plan", wfResults.getActionPlan(contingencyId, stateId)); + } + return JSONSerializer.toJSON(actionInfo).toString(); + } - public static Map runTDSimulation(Network network, Set contingencyIds, boolean emptyContingency, - ComputationManager computationManager, SimulatorFactory simulatorFactory, - ContingenciesAndActionsDatabaseClient contingencyDb, - Writer metricsContent) throws Exception { - Map tdSimulationResults = new HashMap<>(); - Map initContext = new HashMap<>(); - SimulationParameters simulationParameters = SimulationParameters.load(); - // run stabilization - Stabilization stabilization = simulatorFactory.createStabilization(network, computationManager, 0); - stabilization.init(simulationParameters, initContext); - System.out.println("running stabilization on network " + network.getId()); - StabilizationResult stabilizationResults = stabilization.run(); - metricsContent.write("****** BASECASE " + network.getId()+"\n"); - metricsContent.write("*** Stabilization Metrics ***\n"); - Map stabilizationMetrics = stabilizationResults.getMetrics(); - if ( stabilizationMetrics!=null && !stabilizationMetrics.isEmpty()) { - for(String parameter : stabilizationMetrics.keySet()) - metricsContent.write(parameter + " = " + stabilizationMetrics.get(parameter)+"\n"); - } - metricsContent.flush(); - if (stabilizationResults.getStatus() == StabilizationStatus.COMPLETED) { - if ( emptyContingency ) // store data for t-d simulation on empty contingency, i.e. stabilization - tdSimulationResults.put(EMPTY_CONTINGENCY_ID, true); - // check if there are contingencies to run impact analysis - if ( contingencyIds==null && contingencyDb.getContingencies(network).size()==0 ) - contingencyIds = new HashSet<>(); - if ( contingencyIds==null || !contingencyIds.isEmpty() ) { - // run impact analysis + public static Map runTDSimulation(Network network, Set contingencyIds, boolean emptyContingency, + ComputationManager computationManager, SimulatorFactory simulatorFactory, + ContingenciesAndActionsDatabaseClient contingencyDb, + Writer metricsContent) throws Exception { + Map tdSimulationResults = new HashMap<>(); + Map initContext = new HashMap<>(); + SimulationParameters simulationParameters = SimulationParameters.load(); + // run stabilization + Stabilization stabilization = simulatorFactory.createStabilization(network, computationManager, 0); + stabilization.init(simulationParameters, initContext); + System.out.println("running stabilization on network " + network.getId()); + StabilizationResult stabilizationResults = stabilization.run(); + metricsContent.write("****** BASECASE " + network.getId() + "\n"); + metricsContent.write("*** Stabilization Metrics ***\n"); + Map stabilizationMetrics = stabilizationResults.getMetrics(); + if (stabilizationMetrics != null && !stabilizationMetrics.isEmpty()) { + for (String parameter : stabilizationMetrics.keySet()) + metricsContent.write(parameter + " = " + stabilizationMetrics.get(parameter) + "\n"); + } + metricsContent.flush(); + if (stabilizationResults.getStatus() == StabilizationStatus.COMPLETED) { + if (emptyContingency) // store data for t-d simulation on empty contingency, i.e. stabilization + tdSimulationResults.put(EMPTY_CONTINGENCY_ID, true); + // check if there are contingencies to run impact analysis + if (contingencyIds == null && contingencyDb.getContingencies(network).size() == 0) + contingencyIds = new HashSet<>(); + if (contingencyIds == null || !contingencyIds.isEmpty()) { + // run impact analysis ImpactAnalysis impactAnalysis = simulatorFactory.createImpactAnalysis(network, computationManager, 0, contingencyDb); - impactAnalysis.init(simulationParameters, initContext); - System.out.println("running impact analysis on network " + network.getId()); - ImpactAnalysisResult impactAnalisResults = impactAnalysis.run(stabilizationResults.getState(), contingencyIds); - for(SecurityIndex index : impactAnalisResults.getSecurityIndexes() ) { - tdSimulationResults.put(index.getId().toString(), index.isOk()); - } - metricsContent.write("*** Impact Analysis Metrics ***\n"); - Map impactAnalysisMetrics = impactAnalisResults.getMetrics(); - if ( impactAnalysisMetrics!=null && !impactAnalysisMetrics.isEmpty()) { - for(String parameter : impactAnalysisMetrics.keySet()) - metricsContent.write(parameter + " = " + impactAnalysisMetrics.get(parameter)+"\n"); - } - metricsContent.flush(); - } - } else { - if ( emptyContingency ) // store data for t-d simulation on empty contingency, i.e. stabilization - tdSimulationResults.put(EMPTY_CONTINGENCY_ID, false); - } - return tdSimulationResults; - } + impactAnalysis.init(simulationParameters, initContext); + System.out.println("running impact analysis on network " + network.getId()); + ImpactAnalysisResult impactAnalisResults = impactAnalysis.run(stabilizationResults.getState(), contingencyIds); + for (SecurityIndex index : impactAnalisResults.getSecurityIndexes()) { + tdSimulationResults.put(index.getId().toString(), index.isOk()); + } + metricsContent.write("*** Impact Analysis Metrics ***\n"); + Map impactAnalysisMetrics = impactAnalisResults.getMetrics(); + if (impactAnalysisMetrics != null && !impactAnalysisMetrics.isEmpty()) { + for (String parameter : impactAnalysisMetrics.keySet()) + metricsContent.write(parameter + " = " + impactAnalysisMetrics.get(parameter) + "\n"); + } + metricsContent.flush(); + } + } else { + if (emptyContingency) // store data for t-d simulation on empty contingency, i.e. stabilization + tdSimulationResults.put(EMPTY_CONTINGENCY_ID, false); + } + return tdSimulationResults; + } } diff --git a/online-workflow/src/main/java/eu/itesla_project/online/tools/RunTDSimulation.java b/online-workflow/src/main/java/eu/itesla_project/online/tools/RunTDSimulation.java index 430974fb..7ef47064 100644 --- a/online-workflow/src/main/java/eu/itesla_project/online/tools/RunTDSimulation.java +++ b/online-workflow/src/main/java/eu/itesla_project/online/tools/RunTDSimulation.java @@ -32,183 +32,182 @@ import java.util.*; /** - * * @author Quinary */ //@AutoService(Tool.class) public class RunTDSimulation implements Tool { - private static Command COMMAND = new Command() { - - @Override - public String getName() { - return "run-td-simulation"; - } - - @Override - public String getTheme() { - return Themes.ONLINE_WORKFLOW; - } - - @Override - public String getDescription() { - return "Run time-domain simulation"; - } - - @Override - public Options getOptions() { - Options options = new Options(); - options.addOption(Option.builder().longOpt("case-file") - .desc("the case path") - .hasArg() - .argName("FILE") - .required() - .build()); - options.addOption(Option.builder().longOpt("contingencies") - .desc("contingencies to test separated by , (all the db in not set)") - .hasArg() - .argName("LIST") - .build()); - options.addOption(Option.builder().longOpt("empty-contingency") - .desc("include the empty contingency among the contingencies") - .build()); - options.addOption(Option.builder().longOpt("output-folder") - .desc("the folder where to store the data") - .hasArg() - .argName("FOLDER") - .build()); - return options; - } - - @Override - public String getUsageFooter() { - return null; - } - - }; - - @Override - public Command getCommand() { - return COMMAND; - } - - private Path getFile(Path folder, String filename) { - if ( folder != null ) - return Paths.get(folder.toString(), filename); - return Paths.get(filename); - } - - private void writeCsvViolations(Path folder, Map> networksViolations) throws IOException { - Path csvFile = getFile(folder, "networks-violations.csv"); - System.out.println("writing pre-contingency network violations to file " + csvFile.toString()); - try (FileWriter content = new FileWriter(csvFile.toFile())) { - CsvWriter cvsWriter = null; - try { - cvsWriter = new CsvWriter(content, ','); - String[] headers = new String[]{"Basecase", "Equipment", "Type", "Value", "Limit"}; - cvsWriter.writeRecord(headers); - for(String caseBasename : networksViolations.keySet()) { - for(LimitViolation violation : networksViolations.get(caseBasename)) { - String[] values = new String[]{caseBasename, - violation.getSubject().getId(), - violation.getLimitType().name(), - Float.toString(violation.getValue()), - Float.toString(violation.getLimit())}; - cvsWriter.writeRecord(values); - } - } - cvsWriter.flush(); - } finally { - if ( cvsWriter!=null ) - cvsWriter.close(); - } - } - } - - private void writeCsvTDResults(Path folder, Map> tdSimulationsResults) throws IOException { - Path csvFile = getFile(folder, "simulation-results.csv"); - System.out.println("writing simulation results to file " + csvFile.toString()); - Set securityIndexIds = new LinkedHashSet<>(); + private static Command COMMAND = new Command() { + + @Override + public String getName() { + return "run-td-simulation"; + } + + @Override + public String getTheme() { + return Themes.ONLINE_WORKFLOW; + } + + @Override + public String getDescription() { + return "Run time-domain simulation"; + } + + @Override + public Options getOptions() { + Options options = new Options(); + options.addOption(Option.builder().longOpt("case-file") + .desc("the case path") + .hasArg() + .argName("FILE") + .required() + .build()); + options.addOption(Option.builder().longOpt("contingencies") + .desc("contingencies to test separated by , (all the db in not set)") + .hasArg() + .argName("LIST") + .build()); + options.addOption(Option.builder().longOpt("empty-contingency") + .desc("include the empty contingency among the contingencies") + .build()); + options.addOption(Option.builder().longOpt("output-folder") + .desc("the folder where to store the data") + .hasArg() + .argName("FOLDER") + .build()); + return options; + } + + @Override + public String getUsageFooter() { + return null; + } + + }; + + @Override + public Command getCommand() { + return COMMAND; + } + + private Path getFile(Path folder, String filename) { + if (folder != null) + return Paths.get(folder.toString(), filename); + return Paths.get(filename); + } + + private void writeCsvViolations(Path folder, Map> networksViolations) throws IOException { + Path csvFile = getFile(folder, "networks-violations.csv"); + System.out.println("writing pre-contingency network violations to file " + csvFile.toString()); + try (FileWriter content = new FileWriter(csvFile.toFile())) { + CsvWriter cvsWriter = null; + try { + cvsWriter = new CsvWriter(content, ','); + String[] headers = new String[]{"Basecase", "Equipment", "Type", "Value", "Limit"}; + cvsWriter.writeRecord(headers); + for (String caseBasename : networksViolations.keySet()) { + for (LimitViolation violation : networksViolations.get(caseBasename)) { + String[] values = new String[]{caseBasename, + violation.getSubject().getId(), + violation.getLimitType().name(), + Float.toString(violation.getValue()), + Float.toString(violation.getLimit())}; + cvsWriter.writeRecord(values); + } + } + cvsWriter.flush(); + } finally { + if (cvsWriter != null) + cvsWriter.close(); + } + } + } + + private void writeCsvTDResults(Path folder, Map> tdSimulationsResults) throws IOException { + Path csvFile = getFile(folder, "simulation-results.csv"); + System.out.println("writing simulation results to file " + csvFile.toString()); + Set securityIndexIds = new LinkedHashSet<>(); tdSimulationsResults.values().stream().filter(m -> m != null).forEach(m -> securityIndexIds.addAll(m.keySet())); String[] indexIds = securityIndexIds.toArray(new String[securityIndexIds.size()]); Arrays.sort(indexIds); - try (FileWriter content = new FileWriter(csvFile.toFile())) { - CsvWriter cvsWriter = null; - try { - cvsWriter = new CsvWriter(content, ','); - String[] headers = new String[indexIds.length+1]; - headers[0] = "Basecase"; - int i = 1; - for(String securityIndexId : indexIds) - headers[i++] = securityIndexId; - cvsWriter.writeRecord(headers); - for(String caseBasename : tdSimulationsResults.keySet()) { - String[] values = new String[indexIds.length+1]; - values[0] = caseBasename; - i = 1; - for(String securityIndexId : indexIds) { - String result = "NA"; - if ( tdSimulationsResults.get(caseBasename).containsKey(securityIndexId) ) - result = tdSimulationsResults.get(caseBasename).get(securityIndexId) ? "OK" : "KO"; - values[i++] = result; - } - cvsWriter.writeRecord(values); - } - cvsWriter.flush(); - } finally { - if ( cvsWriter!=null ) - cvsWriter.close(); - } - } - } + try (FileWriter content = new FileWriter(csvFile.toFile())) { + CsvWriter cvsWriter = null; + try { + cvsWriter = new CsvWriter(content, ','); + String[] headers = new String[indexIds.length + 1]; + headers[0] = "Basecase"; + int i = 1; + for (String securityIndexId : indexIds) + headers[i++] = securityIndexId; + cvsWriter.writeRecord(headers); + for (String caseBasename : tdSimulationsResults.keySet()) { + String[] values = new String[indexIds.length + 1]; + values[0] = caseBasename; + i = 1; + for (String securityIndexId : indexIds) { + String result = "NA"; + if (tdSimulationsResults.get(caseBasename).containsKey(securityIndexId)) + result = tdSimulationsResults.get(caseBasename).get(securityIndexId) ? "OK" : "KO"; + values[i++] = result; + } + cvsWriter.writeRecord(values); + } + cvsWriter.flush(); + } finally { + if (cvsWriter != null) + cvsWriter.close(); + } + } + } @Override public void run(CommandLine line) throws Exception { - Path caseFile = Paths.get(line.getOptionValue("case-file")); - Set contingencyIds = line.hasOption("contingencies") ? Sets.newHashSet(line.getOptionValue("contingencies").split(",")) : null; + Path caseFile = Paths.get(line.getOptionValue("case-file")); + Set contingencyIds = line.hasOption("contingencies") ? Sets.newHashSet(line.getOptionValue("contingencies").split(",")) : null; boolean emptyContingency = line.hasOption("empty-contingency"); Path outputFolder = line.hasOption("output-folder") ? Paths.get(line.getOptionValue("output-folder")) : null; - + Map> networksViolations = new HashMap<>(); Map> tdSimulationsResults = new HashMap<>(); Path metricsFile = getFile(outputFolder, "metrics.log"); try (ComputationManager computationManager = new LocalComputationManager(); FileWriter metricsContent = new FileWriter(metricsFile.toFile())) { - OnlineConfig config = OnlineConfig.load(); + OnlineConfig config = OnlineConfig.load(); ContingenciesAndActionsDatabaseClient contingencyDb = config.getContingencyDbClientFactoryClass().newInstance().create(); SimulatorFactory simulatorFactory = config.getSimulatorFactoryClass().newInstance(); if (Files.isRegularFile(caseFile)) { - // load the network - Network network = Importers.loadNetwork(caseFile); - if (network == null) { - throw new RuntimeException("Case '" + caseFile + "' not found"); - } - - List networkViolations = Security.checkLimits(network); - networksViolations.put(network.getId(), networkViolations); - Map tdSimulationResults = Utils.runTDSimulation(network, - contingencyIds, - emptyContingency, - computationManager, - simulatorFactory, - contingencyDb, - metricsContent); - tdSimulationsResults.put(network.getId(), tdSimulationResults); - } else if (Files.isDirectory(caseFile)){ + // load the network + Network network = Importers.loadNetwork(caseFile); + if (network == null) { + throw new RuntimeException("Case '" + caseFile + "' not found"); + } + + List networkViolations = Security.checkLimits(network); + networksViolations.put(network.getId(), networkViolations); + Map tdSimulationResults = Utils.runTDSimulation(network, + contingencyIds, + emptyContingency, + computationManager, + simulatorFactory, + contingencyDb, + metricsContent); + tdSimulationsResults.put(network.getId(), tdSimulationResults); + } else if (Files.isDirectory(caseFile)) { Importers.loadNetworks(caseFile, false, network -> { try { - List networkViolations = Security.checkLimits(network); - networksViolations.put(network.getId(), networkViolations); - Map tdSimulationResults = Utils.runTDSimulation(network, - contingencyIds, - emptyContingency, - computationManager, - simulatorFactory, - contingencyDb, - metricsContent); - tdSimulationsResults.put(network.getId(), tdSimulationResults); + List networkViolations = Security.checkLimits(network); + networksViolations.put(network.getId(), networkViolations); + Map tdSimulationResults = Utils.runTDSimulation(network, + contingencyIds, + emptyContingency, + computationManager, + simulatorFactory, + contingencyDb, + metricsContent); + tdSimulationsResults.put(network.getId(), tdSimulationResults); } catch (Exception e) { e.printStackTrace(); } @@ -216,15 +215,15 @@ public void run(CommandLine line) throws Exception { } } try { - writeCsvViolations(outputFolder, networksViolations); - } catch (IOException e) { - e.printStackTrace(); - } + writeCsvViolations(outputFolder, networksViolations); + } catch (IOException e) { + e.printStackTrace(); + } try { - writeCsvTDResults(outputFolder, tdSimulationsResults); - } catch (IOException e) { - e.printStackTrace(); - } + writeCsvTDResults(outputFolder, tdSimulationsResults); + } catch (IOException e) { + e.printStackTrace(); + } } }