use of edu.cmu.tetradapp.ui.model.ScoreModel in project tetrad by cmu-phil.
the class GeneralAlgorithmEditor method initComponents.
private void initComponents() {
algoDescTextArea.setWrapStyleWord(true);
algoDescTextArea.setLineWrap(true);
algoDescTextArea.setEditable(false);
populateAlgoTypeOptions(algoTypeOpts);
knowledgeChkBox.addActionListener((e) -> {
refreshAlgorithmList();
});
linearVarChkBox.addActionListener((ActionEvent e) -> {
refreshTestAndScoreList();
});
gaussianVarChkBox.addActionListener((ActionEvent e) -> {
refreshTestAndScoreList();
});
algorithmList.addListSelectionListener((e) -> {
if (!(e.getValueIsAdjusting() || algorithmList.isSelectionEmpty())) {
setAlgorithmDescription();
refreshTestAndScoreList();
validateAlgorithmOption();
}
});
paramSetFwdBtn.addActionListener((e) -> {
AlgorithmModel algoModel = algorithmList.getSelectedValue();
IndependenceTestModel indTestModel = indTestComboBox.getItemAt(indTestComboBox.getSelectedIndex());
ScoreModel scoreModel = scoreComboBox.getItemAt(scoreComboBox.getSelectedIndex());
if (isValid(algoModel, indTestModel, scoreModel)) {
setParameterPanel(algoModel, indTestModel, scoreModel);
changeCard(PARAMETER_CARD);
}
});
indTestComboBox.addActionListener((e) -> {
if (!updatingTestModels && indTestComboBox.getSelectedIndex() >= 0) {
AlgorithmModel algoModel = algorithmList.getSelectedValue();
Map<DataType, IndependenceTestModel> map = defaultIndTestModels.get(algoModel);
if (map == null) {
map = new EnumMap<>(DataType.class);
defaultIndTestModels.put(algoModel, map);
}
map.put(dataType, indTestComboBox.getItemAt(indTestComboBox.getSelectedIndex()));
}
});
scoreComboBox.addActionListener((e) -> {
if (!updatingScoreModels && scoreComboBox.getSelectedIndex() >= 0) {
AlgorithmModel algoModel = algorithmList.getSelectedValue();
Map<DataType, ScoreModel> map = defaultScoreModels.get(algoModel);
if (map == null) {
map = new EnumMap<>(DataType.class);
defaultScoreModels.put(algoModel, map);
}
map.put(dataType, scoreComboBox.getItemAt(scoreComboBox.getSelectedIndex()));
}
});
mainPanel.add(new AlgorithmCard(), ALGORITHM_CARD);
mainPanel.add(new ParameterCard(), PARAMETER_CARD);
mainPanel.add(new GraphCard(), GRAPH_CARD);
mainPanel.setPreferredSize(new Dimension(940, 640));
setLayout(new BorderLayout());
add(mainPanel, BorderLayout.CENTER);
// add(new JScrollPane(mainPanel), BorderLayout.CENTER);
}
use of edu.cmu.tetradapp.ui.model.ScoreModel in project tetrad by cmu-phil.
the class GeneralAlgorithmEditor method restorePreviousState.
private void restorePreviousState(Map<String, Object> models) {
Object obj = models.get(LINEAR_PARAM);
if ((obj != null) && (obj instanceof Boolean)) {
linearVarChkBox.setSelected((Boolean) obj);
}
obj = models.get(GAUSSIAN_PARAM);
if ((obj != null) && (obj instanceof Boolean)) {
gaussianVarChkBox.setSelected((Boolean) obj);
}
obj = models.get(KNOWLEDGE_PARAM);
if ((obj != null) && (obj instanceof Boolean)) {
knowledgeChkBox.setSelected((Boolean) obj);
}
obj = models.get(ALGO_TYPE_PARAM);
if ((obj != null) && (obj instanceof String)) {
String actCmd = String.valueOf(obj);
Optional<JRadioButton> opt = algoTypeOpts.stream().filter(e -> e.getActionCommand().equals(actCmd)).findFirst();
if (opt.isPresent()) {
opt.get().setSelected(true);
}
}
refreshAlgorithmList();
refreshTestAndScoreList();
obj = models.get(ALGO_PARAM);
if ((obj != null) && (obj instanceof AlgorithmModel)) {
String value = ((AlgorithmModel) obj).toString();
Enumeration<AlgorithmModel> enums = algoModels.elements();
while (enums.hasMoreElements()) {
AlgorithmModel model = enums.nextElement();
if (model.toString().equals(value)) {
models.put(ALGO_PARAM, model);
algorithmList.setSelectedValue(model, true);
String title = String.format("Algorithm: %s", model.getAlgorithm().getAnnotation().name());
algorithmGraphTitle.setText(title);
break;
}
}
}
obj = models.get(IND_TEST_PARAM);
if ((obj != null) && (obj instanceof IndependenceTestModel)) {
String value = ((IndependenceTestModel) obj).toString();
ComboBoxModel<IndependenceTestModel> comboBoxModels = indTestComboBox.getModel();
int size = comboBoxModels.getSize();
for (int i = 0; i < size; i++) {
IndependenceTestModel model = comboBoxModels.getElementAt(i);
if (model.toString().equals(value)) {
models.put(IND_TEST_PARAM, model);
indTestComboBox.getModel().setSelectedItem(model);
break;
}
}
}
obj = models.get(SCORE_PARAM);
if ((obj != null) && (obj instanceof ScoreModel)) {
String value = ((ScoreModel) obj).toString();
ComboBoxModel<ScoreModel> comboBoxModels = scoreComboBox.getModel();
int size = comboBoxModels.getSize();
for (int i = 0; i < size; i++) {
ScoreModel model = comboBoxModels.getElementAt(i);
if (model.toString().equals(value)) {
models.put(SCORE_PARAM, model);
scoreComboBox.getModel().setSelectedItem(model);
break;
}
}
}
}
use of edu.cmu.tetradapp.ui.model.ScoreModel in project tetrad by cmu-phil.
the class GeneralAlgorithmEditor method refreshScoreList.
private void refreshScoreList() {
updatingScoreModels = true;
scoreComboBox.removeAllItems();
AlgorithmModel algoModel = algorithmList.getSelectedValue();
if (algoModel != null && algoModel.isRequiredScore()) {
boolean linear = linearVarChkBox.isSelected();
boolean gaussian = gaussianVarChkBox.isSelected();
List<ScoreModel> models = ScoreModels.getInstance().getModels(dataType);
List<ScoreModel> scoreModels = new LinkedList<>();
if (linear && gaussian) {
models.stream().filter(e -> e.getScore().getClazz().isAnnotationPresent(Linear.class)).filter(e -> e.getScore().getClazz().isAnnotationPresent(Gaussian.class)).forEach(e -> scoreModels.add(e));
} else if (linear) {
models.stream().filter(e -> e.getScore().getClazz().isAnnotationPresent(Linear.class)).filter(e -> !e.getScore().getClazz().isAnnotationPresent(Gaussian.class)).forEach(e -> scoreModels.add(e));
} else if (gaussian) {
models.stream().filter(e -> !e.getScore().getClazz().isAnnotationPresent(Linear.class)).filter(e -> e.getScore().getClazz().isAnnotationPresent(Gaussian.class)).forEach(e -> scoreModels.add(e));
} else {
models.stream().forEach(e -> scoreModels.add(e));
}
// or BDeu score for discrete data
if (TsImages.class.equals(algoModel.getAlgorithm().getClazz())) {
switch(dataType) {
case Continuous:
scoreModels.stream().filter(e -> e.getScore().getClazz().equals(SemBicScore.class)).forEach(e -> scoreComboBox.addItem(e));
break;
case Discrete:
scoreModels.stream().filter(e -> e.getScore().getClazz().equals(BdeuScore.class)).forEach(e -> scoreComboBox.addItem(e));
break;
}
} else {
scoreModels.forEach(e -> scoreComboBox.addItem(e));
}
}
updatingScoreModels = false;
if (scoreComboBox.getItemCount() > 0) {
scoreComboBox.setEnabled(true);
Map<DataType, ScoreModel> map = defaultScoreModels.get(algoModel);
if (map == null) {
map = new EnumMap<>(DataType.class);
defaultScoreModels.put(algoModel, map);
}
ScoreModel scoreModel = map.get(dataType);
if (scoreModel == null) {
scoreModel = ScoreModels.getInstance().getDefaultModel(dataType);
if (scoreModel == null) {
scoreModel = scoreComboBox.getItemAt(0);
}
}
scoreComboBox.setSelectedItem(scoreModel);
} else {
scoreComboBox.setEnabled(false);
}
}
use of edu.cmu.tetradapp.ui.model.ScoreModel in project tetrad by cmu-phil.
the class GeneralAlgorithmEditor method doRemoteCompute.
private void doRemoteCompute(final GeneralAlgorithmRunner runner, final HpcAccount hpcAccount) throws Exception {
// **********************
// Show progress panel *
// **********************
Frame ancestor = (Frame) JOptionUtils.centeringComp().getTopLevelAncestor();
final JDialog progressDialog = new JDialog(ancestor, "HPC Job Submission's Progress...", false);
Dimension progressDim = new Dimension(500, 150);
JTextArea progressTextArea = new JTextArea();
progressTextArea.setPreferredSize(progressDim);
progressTextArea.setEditable(false);
JScrollPane progressScroller = new JScrollPane(progressTextArea);
progressScroller.setAlignmentX(LEFT_ALIGNMENT);
progressDialog.setLayout(new BorderLayout());
progressDialog.getContentPane().add(progressScroller, BorderLayout.CENTER);
progressDialog.pack();
Dimension screenDim = Toolkit.getDefaultToolkit().getScreenSize();
progressDialog.setLocation((screenDim.width - progressDim.width) / 2, (screenDim.height - progressDim.height) / 2);
progressDialog.setVisible(true);
int totalProcesses = 4;
String newline = "\n";
String tab = "\t";
int progressTextLength = 0;
DataModel dataModel = runner.getDataModel();
// 1. Generate temp file
Path file = null;
Path prior = null;
try {
// ****************************
// Data Preparation Progress *
// ****************************
String dataMessage = String.format("1/%1$d Data Preparation", totalProcesses);
progressTextArea.append(dataMessage);
progressTextArea.append(tab);
progressTextLength = progressTextArea.getText().length();
progressTextArea.append("Preparing...");
progressTextArea.updateUI();
file = Files.createTempFile("Tetrad-data-", ".txt");
// LOGGER.info(file.toAbsolutePath().toString());
List<String> tempLine = new ArrayList<>();
// Header
List<Node> variables = dataModel.getVariables();
if ((variables == null || variables.isEmpty()) && runner.getSourceGraph() != null) {
variables = runner.getSourceGraph().getNodes();
}
String vars = StringUtils.join(variables.toArray(), tab);
tempLine.add(vars);
// Data
DataSet dataSet = (DataSet) dataModel;
for (int i = 0; i < dataSet.getNumRows(); i++) {
String line = null;
for (int j = 0; j < dataSet.getNumColumns(); j++) {
String cell = null;
if (dataSet.isContinuous()) {
cell = String.valueOf(dataSet.getDouble(i, j));
} else {
cell = String.valueOf(dataSet.getInt(i, j));
}
if (line == null) {
line = cell;
} else {
line = line + "\t" + cell;
}
}
tempLine.add(line);
}
// for (String line : tempLine) {
// LOGGER.info(line);
// }
Files.write(file, tempLine);
// Get file's MD5 hash and use it as its identifier
String datasetMd5 = MessageDigestHash.computeMD5Hash(file);
progressTextArea.replaceRange("Done", progressTextLength, progressTextArea.getText().length());
progressTextArea.append(newline);
progressTextArea.updateUI();
// ***************************************
// Prior Knowledge Preparation Progress *
// ***************************************
String priorMessage = String.format("2/%1$d Prior Knowledge Preparation", totalProcesses);
progressTextArea.append(priorMessage);
progressTextArea.append(tab);
progressTextLength = progressTextArea.getText().length();
progressTextArea.append("Preparing...");
progressTextArea.updateUI();
// 2. Generate temp prior knowledge file
Knowledge2 knowledge = (Knowledge2) dataModel.getKnowledge();
if (knowledge != null && !knowledge.isEmpty()) {
prior = Files.createTempFile(file.getFileName().toString(), ".prior");
knowledge.saveKnowledge(Files.newBufferedWriter(prior));
progressTextArea.replaceRange("Done", progressTextLength, progressTextArea.getText().length());
progressTextArea.append(newline);
progressTextArea.updateUI();
} else {
progressTextArea.replaceRange("Skipped", progressTextLength, progressTextArea.getText().length());
progressTextArea.append(newline);
progressTextArea.updateUI();
}
// Get knowledge file's MD5 hash and use it as its identifier
String priorKnowledgeMd5 = null;
if (prior != null) {
priorKnowledgeMd5 = MessageDigestHash.computeMD5Hash(prior);
}
// *******************************************
// Algorithm Parameter Preparation Progress *
// *******************************************
String algorMessage = String.format("3/%1$d Algorithm Preparation", totalProcesses);
progressTextArea.append(algorMessage);
progressTextArea.append(tab);
progressTextLength = progressTextArea.getText().length();
progressTextArea.append("Preparing...");
progressTextArea.updateUI();
// 3.1 Algorithm Id, Independent Test Id, Score Id
AlgorithmModel algoModel = algorithmList.getSelectedValue();
String algoId = algoModel.getAlgorithm().getAnnotation().command();
// Test
String testId = null;
if (indTestComboBox.isEnabled()) {
IndependenceTestModel indTestModel = indTestComboBox.getItemAt(indTestComboBox.getSelectedIndex());
testId = indTestModel.getIndependenceTest().getAnnotation().command();
}
// Score
String scoreId = null;
if (scoreComboBox.isEnabled()) {
ScoreModel scoreModel = scoreComboBox.getItemAt(scoreComboBox.getSelectedIndex());
scoreId = scoreModel.getScore().getAnnotation().command();
}
// 3.2 Parameters
AlgorithmParamRequest algorithmParamRequest = new AlgorithmParamRequest();
// Test and score
algorithmParamRequest.setTestId(testId);
algorithmParamRequest.setScoreId(scoreId);
// Dataset and Prior paths
String datasetPath = file.toAbsolutePath().toString();
LOGGER.info(datasetPath);
algorithmParamRequest.setDatasetPath(datasetPath);
algorithmParamRequest.setDatasetMd5(datasetMd5);
if (prior != null) {
String priorKnowledgePath = prior.toAbsolutePath().toString();
LOGGER.info(priorKnowledgePath);
algorithmParamRequest.setPriorKnowledgePath(priorKnowledgePath);
algorithmParamRequest.setPriorKnowledgeMd5(priorKnowledgeMd5);
}
// VariableType
if (dataModel.isContinuous()) {
algorithmParamRequest.setVariableType("continuous");
} else if (dataModel.isDiscrete()) {
algorithmParamRequest.setVariableType("discrete");
} else {
algorithmParamRequest.setVariableType("mixed");
}
// FileDelimiter
// Pre-determined
String fileDelimiter = "tab";
algorithmParamRequest.setFileDelimiter(fileDelimiter);
Set<AlgorithmParameter> AlgorithmParameters = new HashSet<>();
Parameters parameters = runner.getParameters();
List<String> parameterNames = runner.getAlgorithm().getParameters();
for (String parameter : parameterNames) {
String value = parameters.get(parameter).toString();
LOGGER.info("parameter: " + parameter + "\tvalue: " + value);
if (value != null) {
AlgorithmParameter algorParam = new AlgorithmParameter();
algorParam.setParameter(parameter);
algorParam.setValue(value);
AlgorithmParameters.add(algorParam);
}
}
algorithmParamRequest.setAlgorithmParameters(AlgorithmParameters);
String maxHeapSize = null;
do {
maxHeapSize = JOptionPane.showInputDialog(progressDialog, "Enter Your Request Java Max Heap Size (GB):", "5");
} while (maxHeapSize != null && !StringUtils.isNumeric(maxHeapSize));
if (maxHeapSize != null) {
JvmOptions jvmOptions = new JvmOptions();
jvmOptions.setMaxHeapSize(Integer.parseInt(maxHeapSize));
algorithmParamRequest.setJvmOptions(jvmOptions);
}
// Hpc parameters
final HpcAccountManager hpcAccountManager = desktop.getHpcAccountManager();
JsonWebToken jsonWebToken = HpcAccountUtils.getJsonWebToken(hpcAccountManager, hpcAccount);
if (jsonWebToken.getWallTime() != null) {
// User allowed to customize the job's wall time
String[] wallTime = jsonWebToken.getWallTime();
Object userwallTime = JOptionPane.showInputDialog(progressDialog, "Wall Time:", "Choose Your Wall Time (in Hour)", JOptionPane.QUESTION_MESSAGE, null, wallTime, wallTime[0]);
if (wallTime != null && userwallTime != null) {
HpcParameter hpcParameter = new HpcParameter();
hpcParameter.setKey("walltime");
hpcParameter.setValue(userwallTime.toString());
LOGGER.info("walltime: " + userwallTime.toString());
Set<HpcParameter> hpcParameters = new HashSet<>();
hpcParameters.add(hpcParameter);
algorithmParamRequest.setHpcParameters(hpcParameters);
}
}
progressTextArea.replaceRange("Done", progressTextLength, progressTextArea.getText().length());
progressTextArea.append(newline);
progressTextArea.updateUI();
// ********************************
// Adding HPC Job Queue Progress *
// ********************************
String dbMessage = String.format("4/%1$d HPC Job Queue Submission", totalProcesses);
progressTextArea.append(dbMessage);
progressTextArea.append(tab);
progressTextLength = progressTextArea.getText().length();
progressTextArea.append("Preparing...");
progressTextArea.updateUI();
HpcJobManager hpcJobManager = desktop.getHpcJobManager();
// 4.1 Save HpcJobInfo
hpcJobInfo = new HpcJobInfo();
hpcJobInfo.setAlgoId(algoId);
hpcJobInfo.setAlgorithmParamRequest(algorithmParamRequest);
hpcJobInfo.setStatus(-1);
hpcJobInfo.setHpcAccount(hpcAccount);
hpcJobManager.submitNewHpcJobToQueue(hpcJobInfo, this);
progressTextArea.replaceRange("Done", progressTextLength, progressTextArea.getText().length());
progressTextArea.append(newline);
progressTextArea.updateUI();
this.jsonResult = null;
JOptionPane.showMessageDialog(ancestor, "The " + hpcJobInfo.getAlgoId() + " job on the " + hpcJobInfo.getHpcAccount().getConnectionName() + " node is in the queue successfully!");
} catch (IOException exception) {
LOGGER.error("", exception);
} finally {
progressDialog.setVisible(false);
progressDialog.dispose();
}
(new HpcJobActivityAction("")).actionPerformed(null);
}
Aggregations