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

edu.cmu.tetradapp.editor.RandomDagScaleFreeEditor 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.tetradapp.util.DoubleTextField;
import edu.cmu.tetradapp.util.IntTextField;

import javax.swing.*;
import javax.swing.border.TitledBorder;
import java.awt.*;
import java.text.DecimalFormat;
import java.text.NumberFormat;
import java.util.prefs.Preferences;

/**
 * Edits the parameters for generating random graphs.
 *
 * @author josephramsey
 */
class RandomDagScaleFreeEditor extends JPanel {
    private final IntTextField numNodesField;
    private final IntTextField numLatentsField;

    private final DoubleTextField scaleFreeGammaField;

    /**
     * Constructs a dialog to edit the given workbench randomization parameters. //     * @param preferredNumNodes an
     * integer which, if greater than 1, will revise the number of nodes, //     * number of edges,a nd number of latent
     * nodes. Useful if the interface suggests a number of nodes //     * that overrides the number of nodes set in the
     * preferences.
     */
    public RandomDagScaleFreeEditor() {
        this.numNodesField = new IntTextField(getNumMeasuredNodes(), 4);
        this.numLatentsField = new IntTextField(getNumLatents(), 4);

        NumberFormat nf = new DecimalFormat("0.00");

        DoubleTextField scaleFreeAlphaField = new DoubleTextField(getScaleFreeAlpha(), 4, nf);
        DoubleTextField scaleFreeBetaField = new DoubleTextField(getScaleFreeBeta(), 4, nf);
        this.scaleFreeGammaField = new DoubleTextField(getScaleFreeGamma(), 4, nf);
        DoubleTextField scaleFreeDeltaInField = new DoubleTextField(getScaleFreeDeltaIn(), 4, nf);
        DoubleTextField scaleFreeDeltaOutField = new DoubleTextField(getScaleFreeDeltaOut(), 4, nf);

        // set up text and ties them to the parameters object being edited.
        this.numNodesField.setFilter((value, oldValue) -> {
            if (value == RandomDagScaleFreeEditor.this.numNodesField.getValue()) {
                return oldValue;
            }

            try {
                setNumMeasuredNodes(value);
            } catch (Exception e) {
                // Ignore.
            }

            return value;
        });

        this.numLatentsField.setFilter((value, oldValue) -> {
            if (value == RandomDagScaleFreeEditor.this.numLatentsField.getValue()) {
                return oldValue;
            }

            try {
                setNumLatents(value);
            } catch (Exception e) {
                // Ignore.
            }

            return value;
        });

        scaleFreeAlphaField.setFilter((value, oldValue) -> {
            RandomDagScaleFreeEditor.this.setScaleFreeAlpha(value);
            RandomDagScaleFreeEditor.this.setGamma();
            return value;
        });

        scaleFreeBetaField.setFilter((value, oldValue) -> {
            RandomDagScaleFreeEditor.this.setScaleFreeBeta(value);
            RandomDagScaleFreeEditor.this.setGamma();
            return value;
        });

        scaleFreeGammaField.setEnabled(false);
        this.setGamma();

        scaleFreeDeltaInField.setFilter((value, oldValue) -> {
            RandomDagScaleFreeEditor.this.setScaleFreeDeltaIn(value);
            return value;
        });

        scaleFreeDeltaOutField.setFilter((value, oldValue) -> {
            setScaleFreeDeltaOut(value);
            return value;
        });


        // construct the workbench.
        setLayout(new BorderLayout());

        Box b1 = Box.createVerticalBox();

        Box b2 = Box.createHorizontalBox();
        b2.add(new JLabel("Parameters for Graph:"));
        b2.add(Box.createHorizontalGlue());
        b1.add(b2);

        Box b10 = Box.createHorizontalBox();
        b10.add(new JLabel("Number of measured nodes:"));
        b10.add(Box.createHorizontalGlue());
        b10.add(this.numNodesField);
        b1.add(b10);

        Box b11 = Box.createHorizontalBox();
        b11.add(new JLabel("Number of additional latent confounders:"));
        b11.add(Box.createHorizontalGlue());
        b11.add(this.numLatentsField);
        b1.add(b11);

        Box b14 = Box.createHorizontalBox();
        b14.add(new JLabel("Alpha:"));
        b14.add(Box.createHorizontalGlue());
        b14.add(scaleFreeAlphaField);
        b1.add(b14);

        Box b15 = Box.createHorizontalBox();
        b15.add(new JLabel("Beta:"));
        b15.add(Box.createHorizontalGlue());
        b15.add(scaleFreeBetaField);
        b1.add(b15);

        Box b15a = Box.createHorizontalBox();
        b15a.add(new JLabel("Gamma:"));
        b15a.add(Box.createHorizontalGlue());
        b15a.add(this.scaleFreeGammaField);
        b1.add(b15a);

        Box b15b = Box.createHorizontalBox();
        b15b.add(new JLabel("Note: Gamma = 1 - Alpha - Beta; Alpha, Beta, Gamma > 0"));
        b1.add(b15b);

        Box b13 = Box.createHorizontalBox();
        b13.add(new JLabel("Delta In:"));
        b13.add(Box.createHorizontalGlue());
        b13.add(scaleFreeDeltaInField);
        b1.add(b13);

        Box b16 = Box.createHorizontalBox();
        b16.add(new JLabel("Delta Out:"));
        b16.add(Box.createHorizontalGlue());
        b16.add(scaleFreeDeltaOutField);
        b1.add(b16);

        Box d = Box.createVerticalBox();
        b1.setBorder(new TitledBorder(""));
        d.add(b1);

        d.add(Box.createVerticalGlue());

        add(d, BorderLayout.CENTER);
    }

    private void setGamma() {
        this.scaleFreeGammaField.setValue(getScaleFreeGamma());
    }

    /**
     * 

getNumNodes.

* * @return a int */ public int getNumNodes() { return getNumMeasuredNodes() + getNumLatents(); } private int getNumMeasuredNodes() { return Preferences.userRoot().getInt("newGraphNumMeasuredNodes", 5); } private void setNumMeasuredNodes(int numMeasuredNodes) { if (numMeasuredNodes + getNumLatents() < 2) { throw new IllegalArgumentException("Number of nodes Must be greater than or equal to 2."); } Preferences.userRoot().putInt("newGraphNumMeasuredNodes", numMeasuredNodes); } /** *

getNumLatents.

* * @return a int */ public int getNumLatents() { return Preferences.userRoot().getInt("newGraphNumLatents", 0); } private void setNumLatents(int numLatentNodes) { if (numLatentNodes < 0) { throw new IllegalArgumentException( "Number of additional latent confounders must be" + " >= 0: " + numLatentNodes); } Preferences.userRoot().putInt("newGraphNumLatents", numLatentNodes); } /** *

isConnected.

* * @return a boolean */ public boolean isConnected() { return Preferences.userRoot().getBoolean("randomGraphConnected", false); } /** *

getScaleFreeAlpha.

* * @return a double */ public double getScaleFreeAlpha() { return Preferences.userRoot().getDouble("scaleFreeAlpha", 0.2); } private void setScaleFreeAlpha(double scaleFreeAlpha) { Preferences.userRoot().putDouble("scaleFreeAlpha", scaleFreeAlpha); } /** *

getScaleFreeBeta.

* * @return a double */ public double getScaleFreeBeta() { return Preferences.userRoot().getDouble("scaleFreeBeta", 0.6); } private void setScaleFreeBeta(double scaleFreeBeta) { Preferences.userRoot().putDouble("scaleFreeBeta", scaleFreeBeta); } private double getScaleFreeGamma() { return 1.0 - getScaleFreeAlpha() - getScaleFreeBeta(); } /** *

getScaleFreeDeltaIn.

* * @return a double */ public double getScaleFreeDeltaIn() { return Preferences.userRoot().getDouble("scaleFreeDeltaIn", 0.2); } private void setScaleFreeDeltaIn(double scaleFreeDeltaIn) { Preferences.userRoot().putDouble("scaleFreeDeltaIn", scaleFreeDeltaIn); } /** *

getScaleFreeDeltaOut.

* * @return a double */ public double getScaleFreeDeltaOut() { return Preferences.userRoot().getDouble("scaleFreeDeltaOut", 0.2); } private void setScaleFreeDeltaOut(double scaleFreeDeltaOut) { Preferences.userRoot().putDouble("scaleFreeDeltaOut", scaleFreeDeltaOut); } }




© 2015 - 2025 Weber Informatics LLC | Privacy Policy