All Downloads are FREE. Search and download functionalities are using the official Maven repository.

edu.cmu.tetradapp.editor.SemUpdaterEditor Maven / Gradle / Ivy

The newest version!
///////////////////////////////////////////////////////////////////////////////
// For information as to what this class does, see the Javadoc, below.       //
// Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006,       //
// 2007, 2008, 2009, 2010, 2014, 2015, 2022 by Peter Spirtes, Richard        //
// Scheines, Joseph Ramsey, and Clark Glymour.                               //
//                                                                           //
// This program is free software; you can redistribute it and/or modify      //
// it under the terms of the GNU General Public License as published by      //
// the Free Software Foundation; either version 2 of the License, or         //
// (at your option) any later version.                                       //
//                                                                           //
// This program is distributed in the hope that it will be useful,           //
// but WITHOUT ANY WARRANTY; without even the implied warranty of            //
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the             //
// GNU General Public License for more details.                              //
//                                                                           //
// You should have received a copy of the GNU General Public License         //
// along with this program; if not, write to the Free Software               //
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA //
///////////////////////////////////////////////////////////////////////////////
package edu.cmu.tetradapp.editor;

import edu.cmu.tetrad.graph.Node;
import edu.cmu.tetrad.sem.SemEvidence;
import edu.cmu.tetrad.sem.SemIm;
import edu.cmu.tetrad.sem.SemUpdater;
import edu.cmu.tetrad.util.NumberFormatUtil;
import edu.cmu.tetradapp.model.SemImWrapper;
import edu.cmu.tetradapp.model.SemUpdaterWrapper;
import edu.cmu.tetradapp.util.DoubleTextField;

import javax.swing.*;
import javax.swing.border.EmptyBorder;
import java.awt.*;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.Map;

/**
 * Lets the user calculate updated probabilities for a SEM.
 *
 * @author josephramsey
 * @version $Id: $Id
 */
public class SemUpdaterEditor extends JPanel {

    private static final long serialVersionUID = 7548536266087867739L;

    /**
     * The SEM updater being edited.
     */
    private final SemUpdater semUpdater;

    /**
     * Maps check boxes to variables.
     */
    private final Map checkBoxesToVariables = new HashMap<>();

    /**
     * Maps variables to text fields.
     */
    private final Map variablesToTextFields = new HashMap<>();

    /**
     * The SEM IM editor.
     */
    private final SemImEditor semImEditor;

    /**
     * The focus traversal order.
     */
    private final LinkedList focusTraversalOrder = new LinkedList<>();

    /**
     * Maps text fields to labels.
     */
    private final Map labels = new HashMap<>();

    /**
     * Constructs a new instantiated model editor from a SEM Updater.
     *
     * @param semUpdater a {@link edu.cmu.tetrad.sem.SemUpdater} object
     */
    public SemUpdaterEditor(SemUpdater semUpdater) {
        if (semUpdater == null) {
            throw new NullPointerException(
                    "Bayes semUpdater must not be null.");
        }

        this.semUpdater = semUpdater;
        setLayout(new BorderLayout());
        setName("Bayes Updater Editor");

        Box b1 = Box.createHorizontalBox();

        this.semImEditor = new SemImEditor(new SemImWrapper(semUpdater.getSemIm()));
        this.semImEditor.add(getUpdatePanel(), BorderLayout.WEST);
        this.semImEditor.setEditable(false);
        b1.add(this.semImEditor);

        add(b1, BorderLayout.CENTER);
    }

    /**
     * Constructs a new instantiated model editor from a SEM IM wrapper.
     *
     * @param wrapper a {@link edu.cmu.tetradapp.model.SemUpdaterWrapper} object
     */
    public SemUpdaterEditor(SemUpdaterWrapper wrapper) {
        this(wrapper.getSemUpdater());
    }

    private Box getUpdatePanel() {
        SemEvidence evidence = this.semUpdater.getEvidence();
        this.focusTraversalOrder.clear();

        Box b = Box.createVerticalBox();

        Box b0 = Box.createHorizontalBox();
        b0.add(new JLabel(""
                          + "In the list below, specify values for variables you have evidence "
                          + "
for. Click the 'Do Update Now' button to view updated model.")); b0.add(Box.createHorizontalGlue()); b.add(b0); b.add(Box.createVerticalStrut(10)); Box d = Box.createHorizontalBox(); d.add(new JLabel("Variable = value")); d.add(Box.createHorizontalGlue()); d.add(new JLabel("Manipulated")); b.add(d); for (int i = 0; i < evidence.getNumNodes(); i++) { Box c = Box.createHorizontalBox(); SemIm semIm = evidence.getSemIm(); Node node = semIm.getVariableNodes().get(i); String name = node.getName(); JLabel label = new JLabel(name + " = ") { private static final long serialVersionUID = 820570350956700782L; @Override public Dimension getMaximumSize() { return getPreferredSize(); } }; c.add(label); double mean = evidence.getProposition().getValue(i); DoubleTextField field = new DoubleTextField(mean, 5, NumberFormatUtil.getInstance().getNumberFormat()); field.setFilter((value, oldValue) -> { try { int nodeIndex = this.labels.get(field); if (Double.isNaN(value) && evidence.isManipulated(nodeIndex)) { throw new IllegalArgumentException(); } evidence.getProposition().setValue(nodeIndex, value); // semIm.setMean(node, value); SemIm updatedSem = this.semUpdater.getUpdatedSemIm(); this.semImEditor.displaySemIm(updatedSem, this.semImEditor.getTabSelectionIndex(), this.semImEditor.getMatrixSelection()); return value; } catch (IllegalArgumentException e) { return oldValue; } }); this.labels.put(field, i); this.variablesToTextFields.put(i, field); this.focusTraversalOrder.add(field); c.add(field); c.add(Box.createHorizontalStrut(2)); c.add(Box.createHorizontalGlue()); JCheckBox checkbox = new JCheckBox() { private static final long serialVersionUID = -3808843047563493212L; @Override public Dimension getMaximumSize() { return getPreferredSize(); } }; checkbox.setSelected(evidence.isManipulated(i)); this.checkBoxesToVariables.put(checkbox, i); checkbox.addActionListener((e) -> { JCheckBox chkbox = (JCheckBox) e.getSource(); boolean selected = chkbox.isSelected(); Integer o = this.checkBoxesToVariables.get(chkbox); // If no value has been set for this variable, set it to // the mean. double value = evidence.getProposition().getValue(o); // if (Double.isNaN(value)) { DoubleTextField dblTxtField = this.variablesToTextFields.get(o); SemIm semIM = this.semUpdater.getSemIm(); Node varNode = semIM.getVariableNodes().get(o); double semIMMean = semIM.getMean(varNode); dblTxtField.setValue(semIMMean); } this.semUpdater.getEvidence().setManipulated(o, selected); SemIm updatedSem = this.semUpdater.getUpdatedSemIm(); this.semImEditor.displaySemIm(updatedSem, this.semImEditor.getTabSelectionIndex(), this.semImEditor.getMatrixSelection()); }); checkbox.setBackground(Color.WHITE); checkbox.setBorder(null); c.add(checkbox); c.setMaximumSize(new Dimension(1000, 30)); b.add(c); } b.add(Box.createVerticalGlue()); Box b2 = Box.createHorizontalBox(); b2.add(Box.createHorizontalGlue()); JButton button = new JButton("Do Update Now"); button.addActionListener((e) -> { SemIm updatedSem = this.semUpdater.getUpdatedSemIm(); this.semImEditor.displaySemIm(updatedSem, this.semImEditor.getTabSelectionIndex(), this.semImEditor.getMatrixSelection()); // semUpdater.setEvidence(new SemEvidence(updatedSem)); }); b2.add(button); b.add(b2); b.setBorder(new EmptyBorder(5, 5, 5, 5)); setFocusTraversalPolicy(new FocusTraversalPolicy() { @Override public Component getComponentAfter(Container focusCycleRoot, Component aComponent) { int index = SemUpdaterEditor.this.focusTraversalOrder.indexOf(aComponent); int size = SemUpdaterEditor.this.focusTraversalOrder.size(); if (index != -1) { return SemUpdaterEditor.this.focusTraversalOrder.get((index + 1) % size); } else { return getFirstComponent(focusCycleRoot); } } @Override public Component getComponentBefore(Container focusCycleRoot, Component aComponent) { int index = SemUpdaterEditor.this.focusTraversalOrder.indexOf(aComponent); int size = SemUpdaterEditor.this.focusTraversalOrder.size(); if (index != -1) { return SemUpdaterEditor.this.focusTraversalOrder.get((index - 1) % size); } else { return getFirstComponent(focusCycleRoot); } } @Override public Component getFirstComponent(Container focusCycleRoot) { return SemUpdaterEditor.this.focusTraversalOrder.getFirst(); } @Override public Component getLastComponent(Container focusCycleRoot) { return SemUpdaterEditor.this.focusTraversalOrder.getLast(); } @Override public Component getDefaultComponent(Container focusCycleRoot) { return getFirstComponent(focusCycleRoot); } }); setFocusCycleRoot(true); return b; } //================================PUBLIC METHODS========================// /** * {@inheritDoc} *

* Sets the name of this editor. */ @Override public void setName(String name) { String oldName = getName(); super.setName(name); this.firePropertyChange("name", oldName, getName()); } }





© 2015 - 2025 Weber Informatics LLC | Privacy Policy