Influence Diagram¶

An influence diagram is a compact graphical and mathematical representation of a decision situation. It is a generalization of a Bayesian network, in which not only probabilistic inference problems but also decision making problems (following the maximum expected utility criterion) can be modeled and solved. It includes 3 types of nodes : action, decision and utility nodes (from wikipedia).
PyAgrum’s so-called influence diagram represents both influence diagrams and LIMIDs. The way to enforce that such a model represent an influence diagram and not a LIMID belongs to the inference engine.
Tutorial
Reference
Model for Decision in PGM¶
- class pyAgrum.InfluenceDiagram(*args)¶
InfluenceDiagram represents an Influence Diagram.
- InfluenceDiagram() -> InfluenceDiagram
default constructor
- InfluenceDiagram(source) -> InfluenceDiagram
- Parameters:
source (pyAgrum.InfluenceDiagram) – the InfluenceDiagram to copy
- add(*args)¶
Add a variable, it’s associate node and it’s CPT.
The id of the new variable is automatically generated.
- Parameters
variable (pyAgrum.DiscreteVariable) – The variable added by copy that will be a chance node.
descr (str) – the descr of the variable following fast syntax extended for
pyAgrum.fastID()
.nbr_mod_or_id (int) – if the first argument is variable, this set an optional fixed id for the node. If the first argument is descr, this gives the default number of modalities for the variable. Note that if a utility node is described in descr, this value is overriden by 1.
- Returns
the id of the added variable.
- Return type
int
- Raises
pyAgrum.DuplicateElement – If already used id or name.
- addArc(*args)¶
Add an arc in the ID, and update diagram’s potential nodes cpt if necessary.
- Parameters
tail (Union[int,str]) – a variable’s id (int) or name
head (Union[int,str]) – a variable’s id (int) or name
- Raises
pyAgrum.InvalidEdge – If arc.tail and/or arc.head are not in the ID.
pyAgrum.InvalidEdge – If tail is a utility node
- Return type
None
- addArcs(listArcs)¶
add a list of arcs in te model.
- Parameters
listArcs (List[Tuple[int,int]]) – the list of arcs
- addChanceNode(*args)¶
Add a chance variable, it’s associate node and it’s CPT.
The id of the new variable is automatically generated.
- Parameters
variable (pyAgrum.DiscreteVariable) – the variable added by copy.
id (int) – the chosen id. If 0, the NodeGraphPart will choose.
Warning
give an id (not 0) should be reserved for rare and specific situations !!!
- Returns
the id of the added variable.
- Return type
int
- Raises
pyAgrum.DuplicateElement – If id(<>0) is already used
- addDecisionNode(*args)¶
Add a decision variable.
The id of the new variable is automatically generated.
- Parameters
variable (pyAgrum.DiscreteVariable) – the variable added by copy.
id (int) – the chosen id. If 0, the NodeGraphPart will choose.
Warning
give an id (not 0) should be reserved for rare and specific situations !!!
- Returns
the id of the added variable.
- Return type
int
- Raises
pyAgrum.DuplicateElement – If id(<>0) is already used
- addStructureListener(whenNodeAdded=None, whenNodeDeleted=None, whenArcAdded=None, whenArcDeleted=None)¶
Add the listeners in parameters to the list of existing ones.
- Parameters
whenNodeAdded (lambda expression) – a function for when a node is added
whenNodeDeleted (lambda expression) – a function for when a node is removed
whenArcAdded (lambda expression) – a function for when an arc is added
whenArcDeleted (lambda expression) – a function for when an arc is removed
- addUtilityNode(*args)¶
Add a utility variable, it’s associate node and it’s UT.
The id of the new variable is automatically generated.
- Parameters
variable (pyAgrum.DiscreteVariable) – the variable added by copy
id (int) – the chosen id. If 0, the NodeGraphPart will choose
Warning
give an id (not 0) should be reserved for rare and specific situations !!!
- Returns
the id of the added variable.
- Return type
int
- Raises
pyAgrum.InvalidArgument – If variable has more than one label
pyAgrum.DuplicateElement – If id(<>0) is already used
- addVariables(listFastVariables, default_nbr_mod=2)¶
Add a list of variable in the form of ‘fast’ syntax.
- Parameters
listFastVariables (List[str]) – the list of variables following fast syntax extended for
pyAgrum.fastID()
.default_nbr_mod (int) – the number of modalities for the variable if not specified in the fast description. Note that default_nbr_mod=1 is mandatory to create variables with only one modality (for utility for instance).
- Returns
the list of created ids.
- Return type
List[int]
- ancestors(norid)¶
give the set of nodeid of ancestors of a node
- Parameters
norid (str|int) – the name or the id of the node
- Returns
the set of ids of the ancestors of node norid.
- Return type
Set[int]
- arcs()¶
- Returns
the list of all the arcs in the Influence Diagram.
- Return type
list
- chanceNodeSize()¶
- Returns
the number of chance nodes.
- Return type
int
- changeVariableName(*args)¶
- Parameters
var (Union[int,str]) – a variable’s id (int) or name
new_name (str) – the name of the variable
- Raises
pyAgrum.DuplicateLabel – If this name already exists
pyAgrum.NotFound – If no nodes matches id.
- Return type
None
- children(norid)¶
- Parameters
var (Union[int,str]) – a variable’s id (int) or name
norid (
object
) –
- Returns
the set of all the children
- Return type
Set
- clear()¶
- Return type
None
- completeInstantiation()¶
Give an instantiation over all the variables of the model
- Returns
a complete Instantiation for the model
- Return type
- connectedComponents()¶
connected components from a graph/BN
Compute the connected components of a pyAgrum’s graph or Bayesian Network (more generally an object that has nodes, children/parents or neighbours methods)
The firstly visited node for each component is called a ‘root’ and is used as a key for the component. This root has been arbitrarily chosen during the algorithm.
- Returns
dict of connected components (as set of nodeIds (int)) with a nodeId (root) of each component as key.
- Return type
dict(int,Set[int])
- cpt(*args)¶
Returns the CPT of a variable.
- Parameters
var (Union[int,str]) – a variable’s id (int) or name
- Returns
The variable’s CPT.
- Return type
- Raises
pyAgrum.NotFound – If no variable’s id matches varId.
- dag()¶
- Returns
a constant reference to the dag of this BayesNet.
- Return type
- decisionNodeSize()¶
- Returns
the number of decision nodes
- Return type
int
- decisionOrder()¶
- Return type
List
[int
]
- decisionOrderExists()¶
- Returns
True if a directed path exist with all decision node
- Return type
bool
- descendants(norid)¶
give the set of nodeid of descendants of a node
- Parameters
norid (str|int) – the name or the id of the node
- Returns
the set of ids of the descendants of node norid.
- Return type
Set[int]
- empty()¶
Check if there are some variables in the model.
- Returns
True if there is no variable in the model.
- Return type
bool
- erase(*args)¶
Erase a Variable from the network and remove the variable from all his childs.
If no variable matches the id, then nothing is done.
- Parameters
id (int) – The id of the variable to erase.
var (Union[int,str,pyAgrum.DiscreteVariable]) – a variable’s id (int) or name or th reference on the variable to remove.
- Return type
None
- eraseArc(*args)¶
Removes an arc in the ID, and update diagram’s potential nodes cpt if necessary.
If (tail, head) doesn’t exist, the nothing happens.
- Parameters
arc (pyAgrum.Arc) – The arc to be removed whn calling eraseArc(arc)
tail (Union[int,str]) – a variable’s id (int) or name when calling eraseArc(tail,head)
head (Union[int,str]) – a variable’s id (int) or name when calling eraseArc(tail,head)
- Return type
None
- exists(node)¶
Check if a node with this name or id exists
- Parameters
norid (str|int) – name or id of the searched node
node (
int
) –
- Returns
True if there is a node with such a name or id
- Return type
bool
- existsArc(*args)¶
Check if an arc exists
- Parameters
tail (str|int) – the name or id of the tail of the arc
head (str|int) – the name or the id of the head of the arc
- Returns
True if tail->head is an arc.
- Return type
bool
- existsPathBetween(*args)¶
- Returns
true if a path exists between two nodes.
- Return type
bool
- family(norid)¶
give the set of parents of a node and the node
- Parameters
norid (str|int) – the node
- Returns
the set of nodeId of the family of the node norid
- Return type
Set[int]
- static fastPrototype(dotlike, domainSize=2)¶
- Create an Influence Diagram with a dot-like syntax which specifies:
the structure ‘a->b<-c;b->d;c<-e;’.
a prefix for the type of node (chance/decision/utiliy nodes):
a : a chance node named ‘a’ (by default)
$a : a utility node named ‘a’
*a : a decision node named ‘a’
the type of the variables with different syntax as postfix:
by default, a variable is a pyAgrum.RangeVariable using the default domain size (second argument)
with ‘a[10]’, the variable is a pyAgrum.RangeVariable using 10 as domain size (from 0 to 9)
with ‘a[3,7]’, the variable is a pyAgrum.RangeVariable using a domainSize from 3 to 7
with ‘a[1,3.14,5,6.2]’, the variable is a pyAgrum.DiscretizedVariable using the given ticks (at least 3 values)
with ‘a{top|middle|bottom}’, the variable is a pyAgrum.LabelizedVariable using the given labels.
with ‘a{-1|5|0|3}’, the variable is a pyAgrum.IntegerVariable using the sorted given values.
with ‘a{-0.5|5.01|0|3.1415}’, the variable is a pyAgrum.NumericalDiscreteVariable using the sorted given values.
Note
If the dot-like string contains such a specification more than once for a variable, the first specification will be used.
the potentials (probabilities, utilities) are randomly generated.
see also pyAgrum.fastID.
Examples
>>> import pyAgrum as gum >>> bn=pyAgrum.fastID('A->B[1,3]<-*C{yes|No}->$D<-E[1,2.5,3.9]',6)
- Parameters
dotlike (str) – the string containing the specification
domainSize (int) – the default domain size for variables
- Returns
the resulting Influence Diagram
- Return type
- getDecisionGraph()¶
- Returns
the temporal Graph.
- Return type
- hasSameStructure(other)¶
- Parameters
pyAgrum.DAGmodel – a direct acyclic model
- Returns
True if all the named node are the same and all the named arcs are the same
- Return type
bool
- idFromName(name)¶
Returns a variable’s id given its name.
- Parameters
name (str) – the variable’s name from which the id is returned.
- Returns
the variable’s node id.
- Return type
int
- Raises
pyAgrum.NotFound – If no such name exists in the graph.
- ids(names)¶
List of ids for a list of names of variables in the model
- Parameters
lov (List[str]) – List of variable names
names (
List
[str
]) –
- Returns
The ids for the list of names of the graph variables
- Return type
List[int]
- isChanceNode(*args)¶
- Parameters
varId (int) – the tested node id.
- Returns
true if node is a chance node
- Return type
bool
- isDecisionNode(*args)¶
- Parameters
varId (int) – the tested node id.
- Returns
true if node is a decision node
- Return type
bool
- isIndependent(*args)¶
check if nodes X and nodes Y are independent given nodes Z
- Parameters
X (str|intList[str|int]) – a list of of nodeIds or names
Y (str|intList[str|int]) – a list of of nodeIds or names
Z (str|intList[str|int]) – a list of of nodeIds or names
- Raises
InvalidArgument – if X and Y share variables
- Returns
True if X and Y are independent given Z in the model
- Return type
bool
- isUtilityNode(*args)¶
- Parameters
varId (int) – the tested node id.
- Returns
true if node is an utility node
- Return type
bool
- loadBIFXML(*args)¶
Load a BIFXML file.
- Parameters
name (str) – the name’s file
- Raises
pyAgrum.IOError – If file not found
pyAgrum.FatalError – If file is not valid
- Return type
bool
- log10DomainSize()¶
returns the log10 of the domain size of the model defined as the product of the domain sizes of the variables in the model.
- Returns
the log10 domain size.
- Return type
float
- moralGraph()¶
Returns the moral graph of the BayesNet, formed by adding edges between all pairs of nodes that have a common child, and then making all edges in the graph undirected.
- Returns
The moral graph
- Return type
- moralizedAncestralGraph(nodes)¶
build a UndiGraph by moralizing the Ancestral Graph of a list of nodes
- Parameters
nodes (str|intList[str|int]) – the list of of nodeIds or names
Warning
gum.UndiGraph only knows NodeId. Hence the moralized ancestral graph does not include the names of the variables.graph
- Returns
the moralized ancestral graph of the nodes
- Return type
gum.UndiGraph
- names()¶
- Returns
The names of the InfluenceDiagram variables
- Return type
List[str]
- nodeId(var)¶
- Parameters
var (pyAgrum.DiscreteVariable) – a variable
- Returns
the id of the variable
- Return type
int
- Raises
pyAgrum.IndexError – If the InfluenceDiagram does not contain the variable
- nodes()¶
- Returns
the set of ids
- Return type
set
- nodeset(names)¶
Set of ids for a list of names of variables in the model
- Parameters
lov (List[str]) – List of variable names
names (
List
[str
]) –
- Returns
The set of ids for the list of names of the graph variables
- Return type
Set[int]
- parents(norid)¶
- Parameters
var (Union[int,str]) – a variable’s id (int) or name
norid (
object
) –
- Returns
the set of the parents ids.
- Return type
set
- saveBIFXML(name)¶
Save the BayesNet in a BIFXML file.
- Parameters
name (str) – the file’s name
- Return type
None
- size()¶
- Returns
the number of nodes in the graph
- Return type
int
- sizeArcs()¶
- Returns
the number of arcs in the graph
- Return type
int
- property thisown¶
The membership flag
- toDot()¶
- Returns
a friendly display of the graph in DOT format
- Return type
str
- topologicalOrder()¶
- Returns
the list of the nodes Ids in a topological order
- Return type
List
- Raises
pyAgrum.InvalidDirectedCycle – If this graph contains cycles
- utility(*args)¶
- Parameters
var (Union[int,str]) – a variable’s id (int) or name
- Returns
the utility table of the node
- Return type
- Raises
pyAgrum.IndexError – If the InfluenceDiagram does not contain the variable
- utilityNodeSize()¶
- Returns
the number of utility nodes
- Return type
int
- variable(*args)¶
- Parameters
id (int) – the node id
- Returns
a constant reference over a variabe given it’s node id
- Return type
- Raises
pyAgrum.NotFound – If no variable’s id matches the parameter
- variableFromName(name)¶
- Parameters
name (str) – a variable’s name
- Returns
the variable
- Return type
- Raises
pyAgrum.IndexError – If the InfluenceDiagram does not contain the variable
- variableNodeMap()¶
Inference for Influence Diagram¶

- class pyAgrum.ShaferShenoyLIMIDInference(infDiag)¶
This inference considers the provided model as a LIMID rather than an influence diagram. It is an optimized implementation of the LIMID resolution algorithm. However an inference on a classical influence diagram can be performed by adding a assumption of the existence of the sequence of decision nodes to be solved, which also implies that the decision choices can have an impact on the rest of the sequence (Non Forgetting Assumption, cf. pyAgrum.ShaferShenoyLIMIDInference.addNoForgettingAssumption).
- Parameters
infDiag (
InfluenceDiagram
) –
- MEU(*args)¶
Returns maximum expected utility obtained from inference.
- Raises
pyAgrum.OperationNotAllowed – If no inference have yet been made
- Return type
object
- addEvidence(*args)¶
- Return type
None
- addNoForgettingAssumption(*args)¶
- Return type
None
- chgEvidence(*args)¶
- Return type
None
- clear()¶
- Return type
None
- eraseAllEvidence()¶
Removes all the evidence entered into the diagram.
- Return type
None
- eraseEvidence(*args)¶
- Parameters
evidence (pyAgrum.Potential) – the evidence to remove
- Raises
pyAgrum.IndexError – If the evidence does not belong to the influence diagram
- Return type
None
- hardEvidenceNodes()¶
- Return type
object
- hasEvidence(*args)¶
- Return type
bool
- hasHardEvidence(nodeName)¶
- Parameters
nodeName (
str
) –- Return type
bool
- hasNoForgettingAssumption()¶
- Return type
bool
- hasSoftEvidence(*args)¶
- Return type
bool
- influenceDiagram()¶
Returns a constant reference over the InfluenceDiagram on which this class work.
- Returns
the InfluenceDiagram on which this class work
- Return type
- isSolvable()¶
- Return type
bool
- junctionTree()¶
- makeInference()¶
Makes the inference.
- Return type
None
- meanVar(*args)¶
- Return type
object
- nbrEvidence()¶
- Return type
int
- nbrHardEvidence()¶
- Return type
int
- nbrSoftEvidence()¶
- Return type
int
- optimalDecision(*args)¶
Returns best choice for decision variable given in parameter ( based upon MEU criteria )
- Parameters
decisionId (int,str) – the id or name of the decision variable
- Raises
pyAgrum.OperationNotAllowed – If no inference have yet been made
- pyAgrum.InvalidNode
If node given in parmaeter is not a decision node
- Return type
- reducedLIMID()¶
- Return type
- reversePartialOrder()¶
- setEvidence(evidces)¶
Erase all the evidences and apply addEvidence(key,value) for every pairs in evidces.
- Parameters
evidces (dict) – a dict of evidences
- Raises
pyAgrum.InvalidArgument – If one value is not a value for the node
pyAgrum.InvalidArgument – If the size of a value is different from the domain side of the node
pyAgrum.FatalError – If one value is a vector of 0s
pyAgrum.UndefinedElement – If one node does not belong to the influence diagram
- softEvidenceNodes()¶
- Return type
object
- updateEvidence(evidces)¶
Apply chgEvidence(key,value) for every pairs in evidces (or addEvidence).
- Parameters
evidces (dict) – a dict of evidences
- Raises
pyAgrum.InvalidArgument – If one value is not a value for the node
pyAgrum.InvalidArgument – If the size of a value is different from the domain side of the node
pyAgrum.FatalError – If one value is a vector of 0s
pyAgrum.UndefinedElement – If one node does not belong to the Bayesian network