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

edu.cmu.tetrad.graph.Graph Maven / Gradle / Ivy

There is a newer version: 7.6.4
Show 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.tetrad.graph;

import edu.cmu.tetrad.util.TetradSerializable;

import java.beans.PropertyChangeListener;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.Set;

/**
 * Implements a graph capable of storing edges of type N1 *-# N2 where * and # are endpoints of type Endpoint.

We * stipulate by extending TetradSerializable that all graphs implementing this interface are serializable. This is * because for Tetrad they must be serializable. (For randomUtil, in order to be able to cancelAll operations, they must * be serializable.) * * @author josephramsey * @see Endpoint */ public interface Graph extends TetradSerializable { long serialVersionUID = 23L; /** * Adds a bidirected edges <-> to the graph. */ boolean addBidirectedEdge(Node node1, Node node2); /** * Adds a directed edge --> to the graph. */ boolean addDirectedEdge(Node node1, Node node2); /** * Adds an undirected edge --- to the graph. */ boolean addUndirectedEdge(Node node1, Node node2); /** * Adds a nondirected edges o-o to the graph. */ boolean addNondirectedEdge(Node node1, Node node2); /** * Adds a partially oriented edge o-> to the graph. */ boolean addPartiallyOrientedEdge(Node node1, Node node2); /** * Adds the specified edge to the graph, provided it is not already in the graph. * * @return true if the edge was added, false if not. */ boolean addEdge(Edge edge); /** * Adds a node to the graph. Precondition: The proposed name of the node cannot already be used by any other node in * the same graph. * * @return true if nodes were added, false if not. */ boolean addNode(Node node); /** * Adds a PropertyChangeListener to the graph. */ void addPropertyChangeListener(PropertyChangeListener e); /** * Removes all nodes (and therefore all edges) from the graph. */ void clear(); /** * Determines whether this graph contains the given edge. * * @return true iff the graph contain 'edge'. */ boolean containsEdge(Edge edge); /** * Determines whether this graph contains the given node. * * @return true iff the graph contains 'node'. */ boolean containsNode(Node node); /** * Determines whether this graph is equal to some other graph, in the sense that they contain the same nodes and the * sets of edges defined over these nodes in the two graphs are isomorphic typewise. That is, if node A and B exist * in both graphs, and if there are, e.g., three edges between A and B in the first graph, two of which are directed * edges and one of which is an undirected edge, then in the second graph there must also be two directed edges and * one undirected edge between nodes A and B. */ boolean equals(Object o); /** * Removes all edges from the graph and fully connects it using #-# edges, where # is the given endpoint. */ void fullyConnect(Endpoint endpoint); /** * Reorients all edges in the graph with the given endpoint. */ void reorientAllWith(Endpoint endpoint); /** * @return a mutable list of nodes adjacent to the given node. */ List getAdjacentNodes(Node node); /** * @return a mutable list of children for a node. */ List getChildren(Node node); /** * @return the connectivity of the graph. */ int getDegree(); /** * @return the edge connecting node1 and node2, provided a unique such edge exists. * @throws UnsupportedOperationException if the graph allows multiple edges between node pairs. */ Edge getEdge(Node node1, Node node2); /** * @return the directed edge from node1 to node2, if there is one. * @throws UnsupportedOperationException if the graph allows multiple edges between node pairs. */ Edge getDirectedEdge(Node node1, Node node2); /** * @return the list of edges connected to a particular node. No particular ordering of the edges in the list is * guaranteed. */ List getEdges(Node node); /** * @return the edges connecting node1 and node2. */ List getEdges(Node node1, Node node2); /** * @return the set of edges in the graph. No particular ordering of the edges in the list is guaranteed. */ Set getEdges(); /** * @return the endpoint along the edge from node to node2 at the node2 end. */ Endpoint getEndpoint(Node node1, Node node2); /** * @return the number of arrow endpoints adjacent to a node. */ int getIndegree(Node node); /** * @return the number of arrow endpoints adjacent to a node. */ int getDegree(Node node); /** * @return the node with the given string name. In case of accidental duplicates, the first node encountered with * the given name is returned. In case no node exists with the given name, null is returned. */ Node getNode(String name); /** * @return the list of nodes for the graph. */ List getNodes(); void setNodes(List nodes); /** * @return the names of the nodes, in the order of getNodes. */ List getNodeNames(); /** * @return the number of edges in the (entire) graph. */ int getNumEdges(); /** * @return the number of edges in the graph which are connected to a particular node. */ int getNumEdges(Node node); /** * @return the number of nodes in the graph. */ int getNumNodes(); /** * @return the number of null endpoints adjacent to an edge. */ int getOutdegree(Node node); /** * @return the list of parents for a node. */ List getParents(Node node); /** * @return true iff node1 is adjacent to node2 in the graph. */ boolean isAdjacentTo(Node node1, Node node2); /** * @return true iff node1 is a child of node2 in the graph. */ boolean isChildOf(Node node1, Node node2); /** * Determines whether node1 is a parent of node2. */ boolean isParentOf(Node node1, Node node2); /** * Added by ekorber, 2004/6/9. * * @return true if node 2 is a definite noncollider between 1 and 3 */ boolean isDefNoncollider(Node node1, Node node2, Node node3); /** * Added by ekorber, 2004/6/9. * * @return true if node 2 is a definite collider between 1 and 3 */ boolean isDefCollider(Node node1, Node node2, Node node3); /** * @return true iff the given node is exogenous in the graph. */ boolean isExogenous(Node node); /** * Nodes adjacent to the given node with the given proximal endpoint. */ List getNodesInTo(Node node, Endpoint n); /** * Nodes adjacent to the given node with the given distal endpoint. */ List getNodesOutTo(Node node, Endpoint n); /** * Removes the given edge from the graph. * * @return true if the edge was removed, false if not. */ boolean removeEdge(Edge edge); /** * Removes the edge connecting the two given nodes, provided there is exactly one such edge. * * @throws UnsupportedOperationException if multiple edges between node pairs are not supported. */ boolean removeEdge(Node node1, Node node2); /** * Removes all edges connecting node A to node B. In most cases, this will remove at most one edge, but since * multiple edges are permitted in some graph implementations, the number will in some cases be greater than one. * * @return true if edges were removed, false if not. */ boolean removeEdges(Node node1, Node node2); /** * Iterates through the list and removes any permissible edges found. The order in which edges are added is the * order in which they are presented in the iterator. * * @return true if edges were added, false if not. */ boolean removeEdges(Collection edges); /** * Removes a node from the graph. * * @return true if the node was removed, false if not. */ boolean removeNode(Node node); /** * Iterates through the list and removes any permissible nodes found. The order in which nodes are removed is the * order in which they are presented in the iterator. * * @return true if nodes were added, false if not. */ boolean removeNodes(List nodes); /** * Sets the endpoint type at the 'to' end of the edge from 'from' to 'to' to the given endpoint. Note: NOT * CONSTRAINT SAFE */ boolean setEndpoint(Node from, Node to, Endpoint endPoint); /** * Constructs and returns a subgraph consisting of a given subset of the nodes of this graph together with the edges * between them. */ Graph subgraph(List nodes); /** * @return a string representation of the graph. */ String toString(); /** * Transfers nodes and edges from one graph to another. One way this is used is to change graph types. One * constructs a new graph based on the old graph, and this method is called to transfer the nodes and edges of the * old graph to the new graph. * * @param graph the graph from which nodes and edges are to be pilfered. * @throws java.lang.IllegalArgumentException This exception is thrown if adding some node. */ void transferNodesAndEdges(Graph graph) throws IllegalArgumentException; void transferAttributes(Graph graph) throws IllegalArgumentException; Paths paths(); /** * @return true if the given node is parameterizable. */ boolean isParameterizable(Node node); /** * @return true if this is a time lag model, in which case getTimeLagGraph() returns the graph. */ boolean isTimeLagModel(); /** * @return the underlying time lag model, if there is one; otherwise, returns null. */ TimeLagGraph getTimeLagGraph(); Set getSepset(Node n1, Node n2); Map getAllAttributes(); Object getAttribute(String key); void removeAttribute(String key); void addAttribute(String key, Object value); Set getUnderLines(); Set getDottedUnderlines(); Set getAmbiguousTriples(); void setAmbiguousTriples(Set triples); /** * States whether r-s-r is an underline triple or not. */ boolean isAmbiguousTriple(Node x, Node y, Node z); /** * States whether r-s-r is an underline triple or not. */ boolean isUnderlineTriple(Node x, Node y, Node z); void addAmbiguousTriple(Node x, Node y, Node z); void addUnderlineTriple(Node x, Node y, Node z); void addDottedUnderlineTriple(Node x, Node y, Node z); void removeAmbiguousTriple(Node x, Node y, Node z); void removeUnderlineTriple(Node x, Node y, Node z); void removeDottedUnderlineTriple(Node x, Node y, Node z); void setUnderLineTriples(Set triples); void setDottedUnderLineTriples(Set triples); void removeTriplesNotInGraph(); }





© 2015 - 2024 Weber Informatics LLC | Privacy Policy