/** * Creates the "file" menu, which allows the user to load, save, and post workbench models. * * @return this menu. */ private JMenu createEditMenu() { JMenu edit = new JMenu("Edit"); // JMenuItem copy = new JMenuItem(new CopySubgraphAction(this)); // JMenuItem paste = new JMenuItem(new PasteSubgraphAction(this)); // // copy.setAccelerator( // KeyStroke.getKeyStroke(KeyEvent.VK_C, ActionEvent.CTRL_MASK)); // paste.setAccelerator( // KeyStroke.getKeyStroke(KeyEvent.VK_V, ActionEvent.CTRL_MASK)); // // edit.add(copy); // edit.add(paste); edit.addSeparator(); JMenuItem configuration = new JMenuItem("Configuration..."); edit.add(configuration); configuration.addActionListener( new ActionListener() { public void actionPerformed(ActionEvent e) { final TimeLagGraph graph = (TimeLagGraph) getLayoutEditable().getGraph(); class ConfigurationEditor extends JPanel { private int maxLag; private int numInitialLags; public ConfigurationEditor(final TimeLagGraph graph) { maxLag = graph.getMaxLag(); numInitialLags = graph.getNumInitialLags(); final SpinnerModel maxLagSpinnerModel = new SpinnerNumberModel(graph.getMaxLag(), 0, 300, 1); JSpinner maxLagSpinner = new JSpinner(maxLagSpinnerModel); maxLagSpinner.addChangeListener( new ChangeListener() { public void stateChanged(ChangeEvent e) { JSpinner spinner = (JSpinner) e.getSource(); SpinnerNumberModel model = (SpinnerNumberModel) spinner.getModel(); int value = (Integer) model.getValue(); setMaxLag(value); } }); final SpinnerModel initialLagsSpinnerModel = new SpinnerNumberModel(graph.getNumInitialLags(), 1, 300, 1); JSpinner initialLagsSpinner = new JSpinner(initialLagsSpinnerModel); initialLagsSpinner.addChangeListener( new ChangeListener() { public void stateChanged(ChangeEvent e) { JSpinner spinner = (JSpinner) e.getSource(); SpinnerNumberModel model = (SpinnerNumberModel) spinner.getModel(); int value = (Integer) model.getValue(); setNumInitialLags(value); } }); setLayout(new BorderLayout()); Box box = Box.createVerticalBox(); Box b1 = Box.createHorizontalBox(); b1.add(new JLabel("Time lag graph configuration:")); b1.add(Box.createHorizontalGlue()); box.add(b1); Box b2 = Box.createHorizontalBox(); b2.add(new JLabel("Maximum Lag = ")); b2.add(Box.createHorizontalGlue()); b2.add(maxLagSpinner); box.add(b2); Box b3 = Box.createHorizontalBox(); b3.add(new JLabel("# Initial Lags = ")); b3.add(Box.createHorizontalGlue()); b3.add(initialLagsSpinner); box.add(b3); box.setBorder(new EmptyBorder(10, 10, 10, 10)); add(box, BorderLayout.CENTER); } public int getMaxLag() { return maxLag; } public void setMaxLag(int maxLag) { this.maxLag = maxLag; } public int getNumInitialLags() { return numInitialLags; } public void setNumInitialLags(int numInitialLags) { this.numInitialLags = numInitialLags; } } final ConfigurationEditor editor = new ConfigurationEditor((TimeLagGraph) getGraph()); EditorWindow editorWindow = new EditorWindow(editor, "Configuration...", "Save", true, TimeLagGraphEditor.this); DesktopController.getInstance() .addEditorWindow(editorWindow, JLayeredPane.PALETTE_LAYER); editorWindow.pack(); editorWindow.setVisible(true); editorWindow.addInternalFrameListener( new InternalFrameAdapter() { public void internalFrameClosed(InternalFrameEvent e) { EditorWindow window = (EditorWindow) e.getSource(); if (window.isCanceled()) { return; } graph.setMaxLag(editor.getMaxLag()); graph.setNumInitialLags(editor.getNumInitialLags()); LayoutUtils.lastLayout(getLayoutEditable()); } }); } }); return edit; }
private JMenu createGraphMenu() { JMenu graph = new JMenu("Graph"); graph.add(new GraphPropertiesAction(getWorkbench())); graph.add(new PathsAction(getWorkbench())); // graph.add(new DirectedPathsAction(getWorkbench())); // graph.add(new TreksAction(getWorkbench())); // graph.add(new AllPathsAction(getWorkbench())); // graph.add(new NeighborhoodsAction(getWorkbench())); graph.addSeparator(); JMenuItem correlateExogenous = new JMenuItem("Correlate Exogenous Variables"); JMenuItem uncorrelateExogenous = new JMenuItem("Uncorrelate Exogenous Variables"); graph.add(correlateExogenous); graph.add(uncorrelateExogenous); graph.addSeparator(); correlateExogenous.addActionListener( new ActionListener() { public void actionPerformed(ActionEvent e) { correlateExogenousVariables(); getWorkbench().invalidate(); getWorkbench().repaint(); } }); uncorrelateExogenous.addActionListener( new ActionListener() { public void actionPerformed(ActionEvent e) { uncorrelationExogenousVariables(); getWorkbench().invalidate(); getWorkbench().repaint(); } }); JMenuItem randomGraph = new JMenuItem("Random Graph"); graph.add(randomGraph); randomGraph.addActionListener( new ActionListener() { public void actionPerformed(ActionEvent e) { RandomGraphEditor editor = new RandomGraphEditor(workbench.getGraph(), true); int ret = JOptionPane.showConfirmDialog( TimeLagGraphEditor.this, editor, "Edit Random DAG Parameters", JOptionPane.PLAIN_MESSAGE); if (ret == JOptionPane.OK_OPTION) { Graph graph = null; Graph dag = new Dag(); int numTrials = 0; while (graph == null && ++numTrials < 100) { if (editor.isRandomForward()) { dag = GraphUtils.randomGraphRandomForwardEdges( getGraph().getNodes(), editor.getNumLatents(), editor.getMaxEdges()); GraphUtils.arrangeBySourceGraph(dag, getWorkbench().getGraph()); HashMap<String, PointXy> layout = GraphUtils.grabLayout(workbench.getGraph().getNodes()); GraphUtils.arrangeByLayout(dag, layout); } else if (editor.isUniformlySelected()) { if (getGraph().getNumNodes() == editor.getNumNodes()) { HashMap<String, PointXy> layout = GraphUtils.grabLayout(workbench.getGraph().getNodes()); dag = GraphUtils.randomGraph( getGraph().getNodes(), editor.getNumLatents(), editor.getMaxEdges(), editor.getMaxDegree(), editor.getMaxIndegree(), editor.getMaxOutdegree(), editor.isConnected()); GraphUtils.arrangeBySourceGraph(dag, getWorkbench().getGraph()); GraphUtils.arrangeByLayout(dag, layout); } else { dag = GraphUtils.randomGraph( editor.getNumNodes(), editor.getNumLatents(), editor.getMaxEdges(), editor.getMaxDegree(), editor.getMaxIndegree(), editor.getMaxOutdegree(), editor.isConnected()); } } else { do { if (getGraph().getNumNodes() == editor.getNumNodes()) { HashMap<String, PointXy> layout = GraphUtils.grabLayout(workbench.getGraph().getNodes()); dag = GraphUtils.randomDag( getGraph().getNodes(), editor.getNumLatents(), editor.getMaxEdges(), 30, 15, 15, editor.isConnected()); GraphUtils.arrangeByLayout(dag, layout); } else { dag = GraphUtils.randomGraph( editor.getNumNodes(), editor.getNumLatents(), editor.getMaxEdges(), 30, 15, 15, editor.isConnected()); } } while (dag.getNumEdges() < editor.getMaxEdges()); } boolean addCycles = editor.isAddCycles(); if (addCycles) { int minNumCycles = editor.getMinNumCycles(); int minCycleLength = editor.getMinCycleLength(); // graph = DataGraphUtils.addCycles2(dag, minNumCycles, // minCycleLength); graph = GraphUtils.cyclicGraph4(editor.getNumNodes(), editor.getMaxEdges()); GraphUtils.addTwoCycles(graph, editor.getMinNumCycles()); } else { graph = new EdgeListGraph(dag); } } if (graph == null) { JOptionPane.showMessageDialog( TimeLagGraphEditor.this, "Could not find a graph that fits those constrains."); getWorkbench().setGraph(new EdgeListGraph(dag)); } else { getWorkbench().setGraph(graph); } // getWorkbench().setGraph(new EdgeListGraph(dag)); // getWorkbench().setGraph(graph); } } }); JMenuItem randomIndicatorModel = new JMenuItem("Random Multiple Indicator Model"); graph.add(randomIndicatorModel); randomIndicatorModel.addActionListener( new ActionListener() { public void actionPerformed(ActionEvent e) { RandomMimParamsEditor editor = new RandomMimParamsEditor(); int ret = JOptionPane.showConfirmDialog( JOptionUtils.centeringComp(), editor, "Edit Random MIM Parameters", JOptionPane.OK_CANCEL_OPTION, JOptionPane.PLAIN_MESSAGE); if (ret == JOptionPane.OK_OPTION) { int numStructuralNodes = Preferences.userRoot().getInt("numStructuralNodes", 3); int maxStructuralEdges = Preferences.userRoot().getInt("numStructuralEdges", 3); int measurementModelDegree = Preferences.userRoot().getInt("measurementModelDegree", 3); int numLatentMeasuredImpureParents = Preferences.userRoot().getInt("latentMeasuredImpureParents", 0); int numMeasuredMeasuredImpureParents = Preferences.userRoot().getInt("measuredMeasuredImpureParents", 0); int numMeasuredMeasuredImpureAssociations = Preferences.userRoot().getInt("measuredMeasuredImpureAssociations", 0); Graph graph = DataGraphUtils.randomSingleFactorModel( numStructuralNodes, maxStructuralEdges, measurementModelDegree, numLatentMeasuredImpureParents, numMeasuredMeasuredImpureParents, numMeasuredMeasuredImpureAssociations); getWorkbench().setGraph(graph); } } }); graph.addSeparator(); graph.add(new JMenuItem(new SelectBidirectedAction(getWorkbench()))); graph.add(new JMenuItem(new SelectUndirectedAction(getWorkbench()))); // graph.addSeparator(); // IndependenceFactsAction action = new IndependenceFactsAction( // JOptionUtils.centeringComp(), this, "D Separation Facts..."); // graph.add(action); return graph; }
protected void addSpecialMenus(JMenuBar menuBar) { if (!(getAlgorithmRunner() instanceof IGesRunner)) { JMenu test = new JMenu("Independence"); menuBar.add(test); IndTestMenuItems.addIndependenceTestChoices(test, this); // test.addSeparator(); // // AlgorithmRunner algorithmRunner = getAlgorithmRunner(); // if (algorithmRunner instanceof IndTestProducer) { // IndTestProducer p = (IndTestProducer) algorithmRunner; // IndependenceFactsAction action = // new IndependenceFactsAction(this, p, "Independence Facts..."); // test.add(action); // } } JMenu graph = new JMenu("Graph"); JMenuItem showDags = new JMenuItem("Show DAGs in Pattern"); JMenuItem meekOrient = new JMenuItem("Meek Orientation"); JMenuItem dagInPattern = new JMenuItem("Choose DAG in Pattern"); JMenuItem gesOrient = new JMenuItem("Global Score-based Reorientation"); JMenuItem nextGraph = new JMenuItem("Next Graph"); JMenuItem previousGraph = new JMenuItem("Previous Graph"); graph.add(new GraphPropertiesAction(getWorkbench())); graph.add(new PathsAction(getWorkbench())); // graph.add(new DirectedPathsAction(getWorkbench())); // graph.add(new TreksAction(getWorkbench())); // graph.add(new AllPathsAction(getWorkbench())); // graph.add(new NeighborhoodsAction(getWorkbench())); graph.add(new TriplesAction(getWorkbench(), getAlgorithmRunner())); graph.addSeparator(); graph.add(meekOrient); graph.add(dagInPattern); graph.add(gesOrient); graph.addSeparator(); graph.add(previousGraph); graph.add(nextGraph); graph.addSeparator(); graph.add(showDags); graph.addSeparator(); graph.add(new JMenuItem(new SelectBidirectedAction(getWorkbench()))); graph.add(new JMenuItem(new SelectUndirectedAction(getWorkbench()))); menuBar.add(graph); showDags.addActionListener( new ActionListener() { public void actionPerformed(ActionEvent e) { Window owner = (Window) getTopLevelAncestor(); new WatchedProcess(owner) { public void watch() { // Needs to be a pattern search; this isn't checked // before running the algorithm because of allowable // "slop"--e.g. bidirected edges. AlgorithmRunner runner = getAlgorithmRunner(); Graph graph = runner.getResultGraph(); if (graph == null) { JOptionPane.showMessageDialog(JOptionUtils.centeringComp(), "No result gaph."); return; } if (runner instanceof GesRunner) { GraphScorer scorer = ((GesRunner) runner).getGraphScorer(); Graph _graph = ((GesRunner) runner).getTopGraphs().get(getIndex()).getGraph(); ScoredGraphsDisplay display = new ScoredGraphsDisplay(_graph, scorer); GraphWorkbench workbench = getWorkbench(); EditorWindow editorWindow = new EditorWindow(display, "Independence Facts", "Close", false, workbench); DesktopController.getInstance() .addEditorWindow(editorWindow, JLayeredPane.PALETTE_LAYER); editorWindow.setVisible(true); } else { PatternDisplay display = new PatternDisplay(graph); GraphWorkbench workbench = getWorkbench(); EditorWindow editorWindow = new EditorWindow(display, "Independence Facts", "Close", false, workbench); DesktopController.getInstance() .addEditorWindow(editorWindow, JLayeredPane.PALETTE_LAYER); editorWindow.setVisible(true); } } }; } }); meekOrient.addActionListener( new ActionListener() { public void actionPerformed(ActionEvent e) { ImpliedOrientation rules = getAlgorithmRunner().getMeekRules(); rules.setKnowledge(getAlgorithmRunner().getParams().getKnowledge()); rules.orientImplied(getGraph()); getGraphHistory().add(getGraph()); getWorkbench().setGraph(getGraph()); firePropertyChange("modelChanged", null, null); } }); dagInPattern.addActionListener( new ActionListener() { public void actionPerformed(ActionEvent e) { Graph graph = new EdgeListGraph(getGraph()); // Removing bidirected edges from the pattern before selecting a DAG. // 4 for (Edge edge : graph.getEdges()) { if (Edges.isBidirectedEdge(edge)) { graph.removeEdge(edge); } } PatternToDag search = new PatternToDag(new Pattern(graph)); Graph dag = search.patternToDagMeekRules(); getGraphHistory().add(dag); getWorkbench().setGraph(dag); ((AbstractAlgorithmRunner) getAlgorithmRunner()).setResultGraph(dag); firePropertyChange("modelChanged", null, null); } }); gesOrient.addActionListener( new ActionListener() { public void actionPerformed(ActionEvent e) { DataModel dataModel = getAlgorithmRunner().getDataModel(); final Graph graph = SearchGraphUtils.reorient(getGraph(), dataModel, getKnowledge()); getGraphHistory().add(graph); getWorkbench().setGraph(graph); firePropertyChange("modelChanged", null, null); } }); nextGraph.addActionListener( new ActionListener() { public void actionPerformed(ActionEvent e) { Graph next = getGraphHistory().next(); getWorkbench().setGraph(next); ((AbstractAlgorithmRunner) getAlgorithmRunner()).setResultGraph(next); firePropertyChange("modelChanged", null, null); } }); previousGraph.addActionListener( new ActionListener() { public void actionPerformed(ActionEvent e) { Graph previous = getGraphHistory().previous(); getWorkbench().setGraph(previous); ((AbstractAlgorithmRunner) getAlgorithmRunner()).setResultGraph(previous); firePropertyChange("modelChanged", null, null); } }); menuBar.add(new LayoutMenu(this)); }