from copy import deepcopy
from collections import defaultdict
from tigramite.models import Models
+import struct
[docs] class CausalEffects ():
r """Causal effect estimation.
@@ -112,9 +125,13 @@
Source code for tigramite.causal_effects
if S is None :
S = []
- X = set ( X )
- Y = set ( Y )
- S = set ( S )
+ self . listX = list ( X )
+ self . listY = list ( Y )
+ self . listS = list ( S )
+
+ self . X = set ( X )
+ self . Y = set ( Y )
+ self . S = set ( S )
#
# Checks regarding graph type
@@ -141,12 +158,10 @@ Source code for tigramite.causal_effects
hidden_variables = []
self . hidden_variables = set ( hidden_variables )
- if len ( self . hidden_variables . intersection ( X . union ( Y ) . union ( S ))) > 0 :
+ if len ( self . hidden_variables . intersection ( self . X . union ( self . Y ) . union ( self . S ))) > 0 :
raise ValueError ( "XYS overlaps with hidden_variables!" )
- self . X = X
- self . Y = Y
- self . S = S
+
# Only needed for later extension to MAG/PAGs
if 'pag' in graph_type :
@@ -161,18 +176,21 @@ Source code for tigramite.causal_effects
# Construct internal graph from input graph depending on graph type
# and hidden variables
- ( self . graph , self . graph_type ,
- self . tau_max , self . hidden_variables ) = self . _construct_graph (
- graph = graph , graph_type = graph_type ,
- hidden_variables = hidden_variables )
+ # (self.graph, self.graph_type,
+ # self.tau_max, self.hidden_variables) =
+
+ self . _construct_graph ( graph = graph , graph_type = graph_type ,
+ hidden_variables = hidden_variables )
# print(self.graph.shape)
self . _check_graph ( self . graph )
- anc_Y = self . _get_ancestors ( Y )
+ self . ancX = self . _get_ancestors ( X )
+ self . ancY = self . _get_ancestors ( Y )
+ self . ancS = self . _get_ancestors ( S )
# If X is not in anc(Y), then no causal link exists
- if anc_Y . intersection ( set ( X )) == set ():
+ if self . ancY . intersection ( set ( X )) == set ():
self . no_causal_path = True
if self . verbosity > 0 :
print ( "No causal path from X to Y exists." )
@@ -187,14 +205,16 @@ Source code for tigramite.causal_effects
M = set ( mediators )
self . M = M
- for varlag in X . union ( Y ) . union ( S ):
+ self . listM = list ( self . M )
+
+ for varlag in self . X . union ( self . Y ) . union ( self . S ):
if abs ( varlag [ 1 ]) > self . tau_max :
raise ValueError ( "X, Y, S must have time lags inside graph." )
if len ( self . X . intersection ( self . Y )) > 0 :
raise ValueError ( "Overlap between X and Y" )
- if len ( S . intersection ( self . Y . union ( self . X ))) > 0 :
+ if len ( self . S . intersection ( self . Y . union ( self . X ))) > 0 :
raise ValueError ( "Conditions S overlap with X or Y" )
# # TODO: need to prove that this is sufficient for non-identifiability!
@@ -204,28 +224,26 @@ Source code for tigramite.causal_effects
if check_SM_overlap and len ( self . S . intersection ( self . M )) > 0 :
raise ValueError ( "Conditions S overlap with mediators M!" )
- descendants = self . _get_descendants ( self . Y . union ( self . M ))
-
+ self . desX = self . _get_descendants ( self . X )
+ self . desY = self . _get_descendants ( self . Y )
+ self . desM = self . _get_descendants ( self . M )
+ self . descendants = self . desY . union ( self . desM )
+
# Define forb as X and descendants of YM
- self . forbidden_nodes = descendants . union ( self . X ) #.union(S)
+ self . forbidden_nodes = self . descendants . union ( self . X ) #.union(S)
# Define valid ancestors
- self . vancs = self . _get_ancestors ( list ( self . X . union ( self . Y ) . union ( self . S ))) - self . forbidden_nodes
+ self . vancs = self . ancX . union ( self . ancY ) . union ( self . ancS ) - self . forbidden_nodes
- if len ( self . S . intersection ( self . _get_descendants ( self . X ))) > 0 :
- if self . verbosity > 0 :
+ if self . verbosity > 0 :
+ if len ( self . S . intersection ( self . desX )) > 0 :
print ( "Warning: Potentially outside assumptions: Conditions S overlap with des(X)" )
# Here only check if S overlaps with des(Y), leave the option that S
# contains variables in des(M) to the user
- if len ( self . S . intersection ( self . _get_descendants ( self . Y ))) > 0 :
+ if len ( self . S . intersection ( self . desY )) > 0 :
raise ValueError ( "Not identifiable: Conditions S overlap with des(Y)" )
- self . listX = list ( self . X )
- self . listY = list ( self . Y )
- self . listS = list ( self . S )
- self . listM = list ( self . M )
-
if self . verbosity > 0 :
print ( " \n ## \n ## Initializing CausalEffects class \n ##"
" \n\n Input:" )
@@ -251,20 +269,21 @@ Source code for tigramite.causal_effects
if graph_type in [ 'dag' , 'admg' ]:
- tau_max = 0
if graph . ndim != 2 :
raise ValueError ( "graph_type in ['dag', 'admg'] assumes graph.shape=(N, N)." )
# Convert to shape [N, N, 1, 1] with dummy dimension
# to process as tsg_dag or tsg_admg with potential hidden variables
self . graph = np . expand_dims ( graph , axis = ( 2 , 3 ))
+
+ # tau_max needed in _get_latent_projection_graph
self . tau_max = 0
if len ( hidden_variables ) > 0 :
- graph = self . _get_latent_projection_graph () # stationary=False)
- graph_type = "tsg_admg"
+ self . graph = self . _get_latent_projection_graph () # stationary=False)
+ self . graph_type = "tsg_admg"
else :
- graph = self . graph
- graph_type = 'tsg_' + graph_type
+ # graph = self.graph
+ self . graph_type = 'tsg_' + graph_type
elif graph_type in [ 'tsg_dag' , 'tsg_admg' ]:
if graph . ndim != 4 :
@@ -276,10 +295,10 @@ Source code for tigramite.causal_effects
self . tau_max = graph . shape [ 2 ] - 1
if len ( hidden_variables ) > 0 :
- graph = self . _get_latent_projection_graph () #, stationary=False)
- graph_type = "tsg_admg"
+ self . graph = self . _get_latent_projection_graph () #, stationary=False)
+ self . graph_type = "tsg_admg"
else :
- graph_type = graph_type
+ self . graph_type = graph_type
elif graph_type in [ 'stationary_dag' ]:
# Currently only stationary_dag without hidden variables is supported
@@ -299,16 +318,18 @@ Source code for tigramite.causal_effects
for varlag in self . X . union ( self . Y ) . union ( self . S ):
maxlag_XYS = max ( maxlag_XYS , abs ( varlag [ 1 ]))
- tau_max = maxlag_XYS + statgraph_tau_max
+ self . tau_max = maxlag_XYS + statgraph_tau_max
stat_graph = deepcopy ( graph )
+ allowed_edges = [ "-->" , "<--" ]
+
# Construct tsg_graph
- graph = np . zeros (( self . N , self . N , tau_max + 1 , tau_max + 1 ), dtype = '<U3' )
+ graph = np . zeros (( self . N , self . N , self . tau_max + 1 , self . tau_max + 1 ), dtype = '<U3' )
graph [:] = ""
for ( i , j ) in itertools . product ( range ( self . N ), range ( self . N )):
- for jt , tauj in enumerate ( range ( 0 , tau_max + 1 )):
- for it , taui in enumerate ( range ( tauj , tau_max + 1 )):
+ for jt , tauj in enumerate ( range ( 0 , self . tau_max + 1 )):
+ for it , taui in enumerate ( range ( tauj , self . tau_max + 1 )):
tau = abs ( taui - tauj )
if tau == 0 and j == i :
continue
@@ -327,14 +348,26 @@ Source code for tigramite.causal_effects
if stat_graph [ i , j , tau ] == '-->' :
graph [ i , j , taui , tauj ] = "-->"
graph [ j , i , tauj , taui ] = "<--"
+ elif stat_graph [ i , j , tau ] == '<--' :
+ pass
+ elif stat_graph [ i , j , tau ] == '' :
+ pass
+ else :
+ edge = stat_graph [ i , j , tau ]
+ raise ValueError ( "Invalid graph edge %s . " % ( edge ) +
+ "For graph_type = %s only %s are allowed." % ( graph_type , str ( allowed_edges )))
+
+
# elif stat_graph[i, j, tau] == '<--':
# graph[i, j, taui, tauj] = "<--"
# graph[j, i, tauj, taui] = "-->"
- graph_type = 'tsg_dag'
+ self . graph_type = 'tsg_dag'
+ self . graph = graph
+
- return ( graph , graph_type , tau_max , hidden_variables )
+ # return (graph, graph_type, self.tau_max, hidden_variables)
# max_lag = self._get_maximum_possible_lag(XYZ=list(X.union(Y).union(S)), graph=graph)
@@ -382,16 +415,16 @@ Source code for tigramite.causal_effects
oldX = self . X . copy ()
oldY = self . Y . copy ()
- anc_Y = self . _get_ancestors ( self . Y )
- anc_S = self . _get_ancestors ( self . S )
+ # anc_Y = self._get_ancestors(self.Y)
+ # anc_S = self._get_ancestors(self.S)
# Remove first from X those nodes with no causal path to Y or S
- X = set ([ x for x in self . X if x in anc_Y . union ( anc_S )])
+ X = set ([ x for x in self . X if x in self . ancY . union ( self . ancS )])
# Remove from Y those nodes with no causal path from X
- des_X = self . _get_descendants ( X )
+ # des_X = self._get_descendants(X)
- Y = set ([ y for y in self . Y if y in des_X ])
+ Y = set ([ y for y in self . Y if y in self . desX ])
# Also require that all x in X have proper path to Y or S,
# that is, the first link goes out of x
@@ -633,27 +666,33 @@ Source code for tigramite.causal_effects
# Find adjacencies going forward/contemp
for k , lag_ik in zip ( * np . where ( graph [ i ,:, lag_i ,:])):
# print((k, lag_ik), graph[i,k,lag_i,lag_ik])
- matches = [ self . _match_link ( patt , graph [ i , k , lag_i , lag_ik ]) for patt in patterns ]
- if np . any ( matches ):
- match = ( k , - lag_ik )
- if match not in exclude :
- if return_link :
- adj . append (( graph [ i , k , lag_i , lag_ik ], match ))
- else :
- adj . append ( match )
+ # matches = [self._match_link(patt, graph[i,k,lag_i,lag_ik]) for patt in patterns]
+ # if np.any(matches):
+ for patt in patterns :
+ if self . _match_link ( patt , graph [ i , k , lag_i , lag_ik ]):
+ match = ( k , - lag_ik )
+ if match not in exclude :
+ if return_link :
+ adj . append (( graph [ i , k , lag_i , lag_ik ], match ))
+ else :
+ adj . append ( match )
+ break
# Find adjacencies going backward/contemp
for k , lag_ki in zip ( * np . where ( graph [:, i ,:, lag_i ])):
# print((k, lag_ki), graph[k,i,lag_ki,lag_i])
- matches = [ self . _match_link ( self . _reverse_link ( patt ), graph [ k , i , lag_ki , lag_i ]) for patt in patterns ]
- if np . any ( matches ):
- match = ( k , - lag_ki )
- if match not in exclude :
- if return_link :
- adj . append (( self . _reverse_link ( graph [ k , i , lag_ki , lag_i ]), match ))
- else :
- adj . append ( match )
+ # matches = [self._match_link(self._reverse_link(patt), graph[k,i,lag_ki,lag_i]) for patt in patterns]
+ # if np.any(matches):
+ for patt in patterns :
+ if self . _match_link ( self . _reverse_link ( patt ), graph [ k , i , lag_ki , lag_i ]):
+ match = ( k , - lag_ki )
+ if match not in exclude :
+ if return_link :
+ adj . append (( self . _reverse_link ( graph [ k , i , lag_ki , lag_i ]), match ))
+ else :
+ adj . append ( match )
+ break
adj = list ( set ( adj ))
return adj
@@ -671,7 +710,7 @@ Source code for tigramite.causal_effects
return (( tauij >= 0 and self . _match_link ( pattern_ij , graph [ i , j , tauij ])) or
( tauij < 0 and self . _match_link ( self . _reverse_link ( pattern_ij ), graph [ j , i , abs ( tauij )])))
-
+ # @profile
def _get_children ( self , varlag ):
"""Returns set of children (varlag --> ...) for (lagged) varlag."""
if self . possible :
@@ -782,6 +821,7 @@ Source code for tigramite.causal_effects
return descendants
+ # @profile
def _get_descendants ( self , W ):
"""Get descendants of nodes in W up to time t.
@@ -1116,6 +1156,7 @@ Source code for tigramite.causal_effects
return aux_graph
+ # @profile
def _check_path ( self ,
# graph,
start , end ,
@@ -1317,7 +1358,7 @@ Source code for tigramite.causal_effects
# print("Separated")
return False
-
+ # @profile
[docs] def get_optimal_set ( self ,
alternative_conditions = None ,
minimize = False ,
@@ -1351,9 +1392,16 @@
Source code for tigramite.causal_effects
vancs = self . vancs . copy ()
else :
S = alternative_conditions
- vancs = self . _get_ancestors ( list ( self . X . union ( self . Y ) . union ( S ))) - self . forbidden_nodes
+ newancS = self . _get_ancestors ( S )
+ self . vancs = self . ancX . union ( self . ancY ) . union ( newancS ) - self . forbidden_nodes
- descendants = self . _get_descendants ( self . Y . union ( self . M ))
+ # vancs = self._get_ancestors(list(self.X.union(self.Y).union(S))) - self.forbidden_nodes
+
+ # descendants = self._get_descendants(self.Y.union(self.M))
+
+ # Sufficient condition for non-identifiability
+ if len ( self . X . intersection ( self . descendants )) > 0 :
+ return False # raise ValueError("Not identifiable: Overlap between X and des(M)")
##
## Construct O-set
@@ -1442,13 +1490,6 @@ Source code for tigramite.causal_effects
Oset_S = Oset . union ( S )
- # For singleton X the validity is already checked in the
- # if-statements of the construction algorithm, but for
- # multivariate X there might be further cases... Hence,
- # we here explicitely check validity
- if self . _check_validity ( list ( Oset_S )) is False :
- return False
-
if return_separate_sets :
return parents , colliders , collider_parents , S
else :
@@ -1806,7 +1847,7 @@ Source code for tigramite.causal_effects
return all_causal_paths
-
+ # @profile
[docs] def fit_total_effect ( self ,
dataframe ,
estimator ,
@@ -1863,6 +1904,9 @@
Source code for tigramite.causal_effects
if self . _check_validity ( adjustment_set ) is False :
raise ValueError ( "Chosen adjustment_set is not valid." )
+ if adjustment_set is False :
+ raise ValueError ( "Causal effect not identifiable via adjustment." )
+
self . adjustment_set = adjustment_set
# Fit model of Y on X and Z (and conditions)
@@ -1884,6 +1928,7 @@ Source code for tigramite.causal_effects
+ # @profile
[docs] def predict_total_effect ( self ,
intervention_data ,
conditions_data = None ,
@@ -1907,11 +1952,11 @@
Source code for tigramite.causal_effects
Results from prediction: an array of shape (time, len(Y)).
"""
- if intervention_data . shape [ 1 ] != len ( self . X ):
+ if intervention_data . shape [ 1 ] != len ( self . listX ):
raise ValueError ( "intervention_data.shape[1] must be len(X)." )
if conditions_data is not None :
- if conditions_data . shape [ 1 ] != len ( self . S ):
+ if conditions_data . shape [ 1 ] != len ( self . listS ):
raise ValueError ( "conditions_data.shape[1] must be len(S)." )
if conditions_data . shape [ 0 ] != intervention_data . shape [ 0 ]:
raise ValueError ( "conditions_data.shape[0] must match intervention_data.shape[0]." )
@@ -1919,7 +1964,7 @@ Source code for tigramite.causal_effects
if self . no_causal_path :
if self . verbosity > 0 :
print ( "No causal path from X to Y exists." )
- return np . zeros (( len ( intervention_data ), len ( self . Y )))
+ return np . zeros (( len ( intervention_data ), len ( self . listY )))
effect = self . model . get_general_prediction (
intervention_data = intervention_data ,
@@ -1928,6 +1973,7 @@ Source code for tigramite.causal_effects
+ # @profile
[docs] def fit_wright_effect ( self ,
dataframe ,
mediation = None ,
@@ -1986,7 +2032,7 @@
Source code for tigramite.causal_effects
mask_type = mask_type ,
verbosity = self . verbosity )
- mediators = self . get_mediators ( start = self . X , end = self . Y )
+ mediators = self . M # self.get_mediators(start=self.X, end=self.Y)
if mediation == 'direct' :
causal_paths = {}
@@ -2019,7 +2065,7 @@ Source code for tigramite.causal_effects
coeffs = {}
for medy in [ med for med in mediators ] + [ y for y in self . listY ]:
coeffs [ medy ] = {}
- mediator_parents = self . _get_all_parents ([ medy ]) . intersection ( mediators . union ( self . X )) - set ([ medy ])
+ mediator_parents = self . _get_all_parents ([ medy ]) . intersection ( mediators . union ( self . X ) . union ( self . Y )) - set ([ medy ])
all_parents = self . _get_all_parents ([ medy ]) - set ([ medy ])
for par in mediator_parents :
Sprime = set ( all_parents ) - set ([ par , medy ])
@@ -2037,6 +2083,7 @@ Source code for tigramite.causal_effects
cut_off = 'max_lag_or_tau_max' ,
return_data = False )
coeffs [ medy ][ par ] = fit_res [ medy ][ 'model' ] . coef_ [ 0 ]
+ # print(mediators, par, medy, coeffs[medy][par])
elif method == 'parents' :
if 'dag' not in self . graph_type :
@@ -2069,6 +2116,7 @@ Source code for tigramite.causal_effects
effect [( x , y )] = 0.
for causal_path in causal_paths [ x ][ y ]:
effect_here = 1.
+ # print(x, y, causal_path)
for index , node in enumerate ( causal_path [: - 1 ]):
i , taui = node
j , tauj = causal_path [ index + 1 ]
@@ -2102,7 +2150,7 @@ Source code for tigramite.causal_effects
self . model . fit_results = fit_results
return self
-
+ # @profile
[docs] def predict_wright_effect ( self ,
intervention_data ,
pred_params = None ,
@@ -2128,32 +2176,200 @@
Source code for tigramite.causal_effects
print ( "No causal path from X to Y exists." )
return np . zeros (( len ( intervention_data ), len ( self . Y )))
- effect = self . model . get_general_prediction (
- intervention_data = intervention_data ,
- conditions_data = None ,
- pred_params = pred_params )
+ intervention_T , lenX = intervention_data . shape
+
+ lenY = len ( self . listY )
+
+ predicted_array = np . zeros (( intervention_T , lenY ))
+ pred_dict = {}
+ for iy , y in enumerate ( self . listY ):
+ # Print message
+ if self . verbosity > 1 :
+ print ( " \n ## Predicting target %s " % str ( y ))
+ if pred_params is not None :
+ for key in list ( pred_params ):
+ print ( " %s = %s " % ( key , pred_params [ key ]))
+ # Default value for pred_params
+ if pred_params is None :
+ pred_params = {}
+ # Check this is a valid target
+ if y not in self . model . fit_results :
+ raise ValueError ( "y = %s not yet fitted" % str ( y ))
+
+ # Transform the data if needed
+ a_transform = self . model . fit_results [ y ][ 'data_transform' ]
+ if a_transform is not None :
+ intervention_data = a_transform . transform ( X = intervention_data )
+
+
+ # Now iterate through interventions (and potentially S)
+ for index , dox_vals in enumerate ( intervention_data ):
+ # Construct XZS-array
+ intervention_array = dox_vals . reshape ( 1 , lenX )
+ predictor_array = intervention_array
+
+ predicted_vals = self . model . fit_results [ y ][ 'model' ] . predict (
+ X = predictor_array , ** pred_params )
+ predicted_array [ index , iy ] = predicted_vals . mean ()
+
+ return predicted_array
+
+
[docs] @staticmethod
+
def get_graph_from_dict ( links , tau_max = None ):
+
"""Helper function to convert dictionary of links to graph array format.
+
+
Parameters
+
---------
+
links : dict
+
Dictionary of form {0:[((0, -1), coeff, func), ...], 1:[...], ...}.
+
Also format {0:[(0, -1), ...], 1:[...], ...} is allowed.
+
tau_max : int or None
+
Maximum lag. If None, the maximum lag in links is used.
+
+
Returns
+
-------
+
graph : array of shape (N, N, tau_max+1)
+
Matrix format of graph with 1 for true links and 0 else.
+
"""
+
+
def _get_minmax_lag ( links ):
+
"""Helper function to retrieve tau_min and tau_max from links.
+
"""
+
+
N = len ( links )
+
+
# Get maximum time lag
+
min_lag = np . inf
+
max_lag = 0
+
for j in range ( N ):
+
for link_props in links [ j ]:
+
if len ( link_props ) > 2 :
+
var , lag = link_props [ 0 ]
+
coeff = link_props [ 1 ]
+
# func = link_props[2]
+
if coeff != 0. :
+
min_lag = min ( min_lag , abs ( lag ))
+
max_lag = max ( max_lag , abs ( lag ))
+
else :
+
var , lag = link_props
+
min_lag = min ( min_lag , abs ( lag ))
+
max_lag = max ( max_lag , abs ( lag ))
-
return effect
+ return min_lag , max_lag
+
+ N = len ( links )
+
+ # Get maximum time lag
+ min_lag , max_lag = _get_minmax_lag ( links )
+
+ # Set maximum lag
+ if tau_max is None :
+ tau_max = max_lag
+ else :
+ if max_lag > tau_max :
+ raise ValueError ( "tau_max is smaller than maximum lag = %d "
+ "found in links, use tau_max=None or larger "
+ "value" % max_lag )
+
+ graph = np . zeros (( N , N , tau_max + 1 ), dtype = '<U3' )
+ for j in links . keys ():
+ for link_props in links [ j ]:
+ if len ( link_props ) > 2 :
+ var , lag = link_props [ 0 ]
+ coeff = link_props [ 1 ]
+ if coeff != 0. :
+ graph [ var , j , abs ( lag )] = "-->"
+ if lag == 0 :
+ graph [ j , var , 0 ] = "<--"
+ else :
+ var , lag = link_props
+ graph [ var , j , abs ( lag )] = "-->"
+ if lag == 0 :
+ graph [ j , var , 0 ] = "<--"
+
+ return graph
+
+if __name__ == '__main__' :
+
+ # Consider some toy data
+ import tigramite
+ import tigramite.toymodels.structural_causal_processes as toys
+ import tigramite.data_processing as pp
+
+ import sklearn
+ from sklearn.linear_model import LinearRegression
+
+ T = 1000
+ def lin_f ( x ): return x
+ auto_coeff = 0.3
+ coeff = 2.
+ links = {
+ 0 : [(( 0 , - 1 ), auto_coeff , lin_f )],
+ 1 : [(( 1 , - 1 ), auto_coeff , lin_f ), (( 0 , - 1 ), coeff , lin_f )],
+ 2 : [(( 2 , - 1 ), auto_coeff , lin_f ), (( 1 , 0 ), coeff , lin_f )],
+ }
+ data , nonstat = toys . structural_causal_process ( links , T = T ,
+ noises = None , seed = 7 )
+
+ # Create some missing values
+ data [ - 10 :,:] = 999.
+ dataframe = pp . DataFrame ( data , missing_flag = 999. )
+
+
+ # Construct expert knowledge graph from links here
+ links = { 0 : [( 0 , - 1 )],
+ 1 : [( 1 , - 1 ), ( 0 , - 1 )],
+ 2 : [( 2 , - 1 ), ( 1 , 0 ),],
+ }
+ # Use staticmethod to get graph
+ graph = CausalEffects . get_graph_from_dict ( links , tau_max = None )
+
+ # We are interested in lagged total effect of X on Y
+ X = [( 0 , - 1 )]
+ Y = [( 2 , 0 )]
+
+ # Initialize class as `stationary_dag`
+ causal_effects = CausalEffects ( graph , graph_type = 'stationary_dag' ,
+ X = X , Y = Y , S = None ,
+ hidden_variables = None ,
+ verbosity = 5 )
+
+ print ( data )
+ # Optimal adjustment set (is used by default)
+ # print(causal_effects.get_optimal_set())
+
+ # # Fit causal effect model from observational data
+ # causal_effects.fit_total_effect(
+ # dataframe=dataframe,
+ # # mask_type='y',
+ # estimator=LinearRegression(),
+ # )
+
+ # # Predict effect of interventions do(X=0.), ..., do(X=1.) in one go
+ # dox_vals = np.linspace(0., 1., 5)
+ # intervention_data = dox_vals.reshape(len(dox_vals), len(X))
+ # pred_Y = causal_effects.predict_total_effect(
+ # intervention_data=intervention_data)
+ # print(pred_Y)
+
+ # Fit causal effect model from observational data
+ causal_effects . fit_wright_effect (
+ dataframe = dataframe ,
+ # mask_type='y',
+ # estimator=LinearRegression(),
+ )
+
+ # Predict effect of interventions do(X=0.), ..., do(X=1.) in one go
+ dox_vals = np . linspace ( 0. , 1. , 5 )
+ intervention_data = dox_vals . reshape ( len ( dox_vals ), len ( X ))
+ pred_Y = causal_effects . predict_wright_effect (
+ intervention_data = intervention_data )
+ print ( pred_Y )
-
-
\ No newline at end of file
diff --git a/docs/_build/html/_modules/tigramite/data_processing.html b/docs/_build/html/_modules/tigramite/data_processing.html
index 4752cfa0..11366b61 100644
--- a/docs/_build/html/_modules/tigramite/data_processing.html
+++ b/docs/_build/html/_modules/tigramite/data_processing.html
@@ -1,10 +1,9 @@
-
+
-
tigramite.data_processing — Tigramite 5.0 documentation
@@ -26,10 +25,23 @@
Navigation
modules |
Tigramite 5.0 documentation »
-
Module code »
-
tigramite.data_processing
+
Module code »
-
+
+
@@ -56,8 +68,6 @@
Source code for tigramite.data_processing
[docs] class DataFrame ():
"""Data object containing time series array and optional mask.
-
Alternatively, a panda dataframe can be used.
-
Parameters
----------
data : array-like
@@ -81,22 +91,28 @@
Source code for tigramite.data_processing
passed, variables are enumerated as [0, 1, ...]
datatime : array-like, optional (default: None)
Timelabel array. If None, range(T) is used.
+ remove_missing_upto_maxlag : bool, optional (default: False)
+ Whether to remove not only missing samples, but also all neighboring
+ samples up to max_lag (as given by cut_off in construct_array).
"""
def __init__ ( self , data , mask = None , missing_flag = None , var_names = None ,
- datatime = None ):
+ datatime = None , remove_missing_upto_maxlag = False ):
- self . values = data
+ self . values = data . copy ()
self . mask = mask
self . missing_flag = missing_flag
if self . missing_flag is not None :
self . values [ self . values == self . missing_flag ] = np . nan
+ self . remove_missing_upto_maxlag = remove_missing_upto_maxlag
T , N = data . shape
# Set the variable names
self . var_names = var_names
# Set the default variable names if none are set
if self . var_names is None :
self . var_names = { i : i for i in range ( N )}
-
+ else :
+ if len ( self . var_names ) != N :
+ raise ValueError ( "len(var_names) != data.shape[1]." )
# Set datatime
self . datatime = datatime
if self . datatime is None :
@@ -153,6 +169,7 @@ Source code for tigramite.data_processing
% str ( _use_mask . shape ))
[docs] def construct_array ( self , X , Y , Z , tau_max ,
+
extraZ = None ,
mask = None ,
mask_type = None ,
return_cleaned_xyz = False ,
@@ -166,10 +183,10 @@
Source code for tigramite.data_processing
Parameters
----------
- X, Y, Z : list of tuples
+ X, Y, Z, extraZ : list of tuples
For a dependence measure I(X;Y|Z), X, Y, Z can be multivariate of
the form [(var1, -lag), (var2, -lag), ...]. At least one varlag in Y
- has to be at lag zero.
+ has to be at lag zero. extraZ is only used in CausalEffects class.
tau_max : int
Maximum time lag. This may be used to make sure that estimates for
different lags in X and Z all have the same sample size.
@@ -210,16 +227,20 @@ Source code for tigramite.data_processing
# Get the length in time and the number of nodes
T , N = self . values . shape
- # Remove duplicates in X, Y, Z
+ if extraZ is None :
+ extraZ = []
+ # Remove duplicates in X, Y, Z, extraZ
X = list ( OrderedDict . fromkeys ( X ))
Y = list ( OrderedDict . fromkeys ( Y ))
Z = list ( OrderedDict . fromkeys ( Z ))
+ extraZ = list ( OrderedDict . fromkeys ( extraZ ))
# If a node in Z occurs already in X or Y, remove it from Z
Z = [ node for node in Z if ( node not in X ) and ( node not in Y )]
+ extraZ = [ node for node in extraZ if ( node not in X ) and ( node not in Y ) and ( node not in Z )]
# Check that all lags are non-positive and indices are in [0,N-1]
- XYZ = X + Y + Z
+ XYZ = X + Y + Z + extraZ
dim = len ( XYZ )
# Ensure that XYZ makes sense
@@ -239,9 +260,10 @@ Source code for tigramite.data_processing
# Setup XYZ identifier
index_code = { 'x' : 0 ,
'y' : 1 ,
- 'z' : 2 }
+ 'z' : 2 ,
+ 'e' : 3 }
xyz = np . array ([ index_code [ name ]
- for var , name in zip ([ X , Y , Z ], [ 'x' , 'y' , 'z' ])
+ for var , name in zip ([ X , Y , Z , extraZ ], [ 'x' , 'y' , 'z' , 'e' ])
for _ in var ])
# Setup and fill array with lagged time series
@@ -257,15 +279,23 @@ Source code for tigramite.data_processing
# Choose which indices to use
use_indices = np . ones ( time_length , dtype = 'int' )
- # Remove all values that have missing value flag, as well as the time
+ # Remove all values that have missing value flag, and optionally as well the time
# slices that occur up to max_lag after
if self . missing_flag is not None :
- missing_anywhere = np . any ( np . isnan ( self . values ), axis = 1 )
- for tau in range ( max_lag + 1 ):
+ missing_anywhere = np . array ( np . where ( np . any ( np . isnan ( array ), axis = 0 ))[ 0 ])
+ if self . remove_missing_upto_maxlag :
+ for tau in range ( max_lag + 1 ):
+ if self . bootstrap is None :
+ delete = missing_anywhere + tau
+ delete = delete [ delete < time_length ]
+ use_indices [ delete ] = 0
+ else :
+ use_indices [ missing_anywhere [ self . bootstrap ] + tau ] = 0
+ else :
if self . bootstrap is None :
- use_indices [ missing_anywhere [ tau : T - max_lag + tau ]] = 0
+ use_indices [ missing_anywhere ] = 0
else :
- use_indices [ missing_anywhere [ self . bootstrap - max_lag + tau ]] = 0
+ use_indices [ missing_anywhere [ self . bootstrap ]] = 0
# Use the mask override if needed
_use_mask = mask
@@ -289,7 +319,7 @@ Source code for tigramite.data_processing
array_mask [ i , :] = ( _use_mask [ self . bootstrap + lag , var ] == False )
# Iterate over defined mapping from letter index to number index,
- # i.e. 'x' -> 0, 'y' -> 1, 'z'-> 2
+ # i.e. 'x' -> 0, 'y' -> 1, 'z'-> 2, 'e'-> 3
for idx , cde in index_code . items ():
# Check if the letter index is in the mask type
if ( mask_type is not None ) and ( idx in mask_type ):
@@ -307,7 +337,7 @@ Source code for tigramite.data_processing
# Print information about the constructed array
if verbosity > 2 :
- self . print_array_info ( array , X , Y , Z , self . missing_flag , mask_type )
+ self . print_array_info ( array , X , Y , Z , self . missing_flag , mask_type , extraZ )
# Return the array and xyz and optionally (X, Y, Z)
if return_cleaned_xyz :
@@ -349,7 +379,7 @@ Source code for tigramite.data_processing
# raise ValueError("Y-nodes are %s, " % str(Y) +
# "but one of the Y-nodes must have zero lag")
-[docs] def print_array_info ( self , array , X , Y , Z , missing_flag , mask_type ):
+
[docs] def print_array_info ( self , array , X , Y , Z , missing_flag , mask_type , extraZ = None ):
"""
Print info about the constructed array
@@ -357,7 +387,7 @@
Source code for tigramite.data_processing
----------
array : Data array of shape (dim, T)
Data array.
- X, Y, Z : list of tuples
+ X, Y, Z, extraZ : list of tuples
For a dependence measure I(X;Y|Z), Y is of the form [(varY, 0)],
where var specifies the variable index. X typically is of the form
[(varX, -tau)] with tau denoting the time lag and Z can be
@@ -372,11 +402,15 @@ Source code for tigramite.data_processing
measure I(X; Y | Z) the samples should be masked. If None, the mask
is not used. Explained in tutorial on masking and missing values.
"""
+ if extraZ is None :
+ extraZ = []
indt = " " * 12
print ( indt + "Constructed array of shape %s from" % str ( array . shape ) +
" \n " + indt + "X = %s " % str ( X ) +
" \n " + indt + "Y = %s " % str ( Y ) +
" \n " + indt + "Z = %s " % str ( Z ))
+ if extraZ is not None :
+ print ( indt + "extraZ = %s " % str ( extraZ ))
if self . mask is not None and mask_type is not None :
print ( indt + "with masked samples in %s removed" % mask_type )
if self . missing_flag is not None :
@@ -745,6 +779,7 @@ Source code for tigramite.data_processing
if __name__ == '__main__' :
+ from tigramite.toymodels.structural_causal_processes import structural_causal_process
## Generate some time series from a structural causal process
def lin_f ( x ): return x
def nonlin_f ( x ): return ( x + 5. * x ** 2 * np . exp ( - x ** 2 / 20. ))
@@ -757,26 +792,13 @@ Source code for tigramite.data_processing
data , nonstat = structural_causal_process ( links ,
T = 100 , noises = noises )
print ( data . shape )
+
+ frame = DataFrame ( data )
-
-
\ No newline at end of file
diff --git a/docs/_build/html/_modules/tigramite/independence_tests/cmiknn.html b/docs/_build/html/_modules/tigramite/independence_tests/cmiknn.html
index 5623a7e3..795c4796 100644
--- a/docs/_build/html/_modules/tigramite/independence_tests/cmiknn.html
+++ b/docs/_build/html/_modules/tigramite/independence_tests/cmiknn.html
@@ -1,10 +1,9 @@
-
+
-
tigramite.independence_tests.cmiknn — Tigramite 5.0 documentation
@@ -26,10 +25,23 @@
Navigation
modules |
Tigramite 5.0 documentation »
-
Module code »
-
tigramite.independence_tests.cmiknn
+
Module code »
-
+
+
@@ -48,7 +60,7 @@
Source code for tigramite.independence_tests.cmiknn import
numpy as np
from .independence_tests_base import CondIndTest
from numba import jit
-
+
import warnings
[docs] class CMIknn ( CondIndTest ):
r """Conditional mutual information test based on nearest-neighbor estimator.
@@ -201,12 +213,17 @@
Source code for tigramite.independence_tests.cmiknn # Standardize
array = array . astype ( np . float64 )
array -= array . mean ( axis = 1 ) . reshape ( dim , 1 )
-
array /= array . std ( axis = 1 ) . reshape ( dim , 1 )
+
std = array . std ( axis = 1 )
+
for i in range ( dim ):
+
if std [ i ] != 0. :
+
array [ i ] /= std [ i ]
+
# array /= array.std(axis=1).reshape(dim, 1)
# FIXME: If the time series is constant, return nan rather than
# raising Exception
-
if np . isnan ( array ) . sum () != 0 :
-
raise ValueError ( "nans after standardizing, "
-
"possibly constant array!" )
+
if np . any ( std == 0. ):
+
warnings . warn ( "Possibly constant array!" )
+
# raise ValueError("nans after standardizing, "
+
# "possibly constant array!")
elif self . transform == 'uniform' :
array = self . _trafo2uniform ( array )
elif self . transform == 'ranks' :
@@ -415,12 +432,18 @@
Source code for tigramite.independence_tests.cmiknn # Standardize
array = array . astype ( np . float64 )
array -= array . mean ( axis = 1 ) . reshape ( dim , 1 )
-
array /= array . std ( axis = 1 ) . reshape ( dim , 1 )
+
std = array . std ( axis = 1 )
+
for i in range ( dim ):
+
if std [ i ] != 0. :
+
array [ i ] /= std [ i ]
+
# array /= array.std(axis=1).reshape(dim, 1)
# FIXME: If the time series is constant, return nan rather than
# raising Exception
-
if np . isnan ( array ) . sum () != 0 :
-
raise ValueError ( "nans after standardizing, "
-
"possibly constant array!" )
+
if np . any ( std == 0. ):
+
warnings . warn ( "Possibly constant array!" )
+
# if np.isnan(array).sum() != 0:
+
# raise ValueError("nans after standardizing, "
+
# "possibly constant array!")
elif self . transform == 'uniform' :
array = self . _trafo2uniform ( array )
elif self . transform == 'ranks' :
@@ -481,24 +504,9 @@
Source code for tigramite.independence_tests.cmiknn return restricted_permutation
-
-
\ No newline at end of file
diff --git a/docs/_build/html/_modules/tigramite/independence_tests/cmisymb.html b/docs/_build/html/_modules/tigramite/independence_tests/cmisymb.html
index b08eb34a..37ad4667 100644
--- a/docs/_build/html/_modules/tigramite/independence_tests/cmisymb.html
+++ b/docs/_build/html/_modules/tigramite/independence_tests/cmisymb.html
@@ -1,10 +1,9 @@
-
+
-
tigramite.independence_tests.cmisymb — Tigramite 5.0 documentation
@@ -26,10 +25,23 @@
Navigation
modules |
Tigramite 5.0 documentation »
-
Module code »
-
tigramite.independence_tests.cmisymb
+
Module code »
-
+
+
@@ -257,24 +269,9 @@
Source code for tigramite.independence_tests.cmisymb return pval
-
-
\ No newline at end of file
diff --git a/docs/_build/html/_modules/tigramite/independence_tests/gpdc.html b/docs/_build/html/_modules/tigramite/independence_tests/gpdc.html
index aa2b1ca5..9235c461 100644
--- a/docs/_build/html/_modules/tigramite/independence_tests/gpdc.html
+++ b/docs/_build/html/_modules/tigramite/independence_tests/gpdc.html
@@ -1,10 +1,9 @@
-
+
-
tigramite.independence_tests.gpdc — Tigramite 5.0 documentation
@@ -26,10 +25,23 @@ Navigation
modules |
Tigramite 5.0 documentation »
-
Module code »
-
tigramite.independence_tests.gpdc
+
Module code »
-
+
+
@@ -44,15 +56,27 @@
Source code for tigramite.independence_tests.gpdc # License: GNU General Public License v3.0
from __future__ import print_function
+
import json , warnings
import numpy as np
-
import warnings
-
from .independence_tests_base import CondIndTest
-
+
try :
+
from importlib import metadata
+
except ImportError :
+
import importlib_metadata as metadata # python<=3.7
try :
import dcor
from sklearn import gaussian_process
+
with open ( '../versions.py' , 'r' ) as vfile :
+
packages = json . loads ( vfile . read ())[ 'all' ]
+
packages = dict ( map ( lambda s : s . split ( '>=' ), packages ))
+
if metadata . version ( 'dcor' ) < packages [ 'dcor' ]:
+
raise Exception ( 'Version mismatch. Installed version of dcor' , metadata . version ( 'dcor' ),
+
'Please install dcor>=' , packages [ 'dcor' ])
+
if metadata . version ( 'scikit-learn' ) < packages [ 'scikit-learn' ]:
+
raise Exception ( 'Version mismatch. Installed version of scikit-learn' , metadata . version ( 'scikit-learn' ),
+
'Please install scikit-learn>=' , packages [ 'scikit-learn' ])
except Exception as e :
warnings . warn ( str ( e ))
+
from .independence_tests_base import CondIndTest
class GaussProcReg ():
r """Gaussian processes abstract base class.
@@ -251,10 +275,16 @@
Source code for tigramite.independence_tests.gpdc # Standardize
if standardize :
array -= array . mean ( axis = 1 ) . reshape ( dim , 1 )
-
array /= array . std ( axis = 1 ) . reshape ( dim , 1 )
-
if np . isnan ( array ) . sum () != 0 :
-
raise ValueError ( "nans after standardizing, "
-
"possibly constant array!" )
+
std = array . std ( axis = 1 )
+
for i in range ( dim ):
+
if std [ i ] != 0. :
+
array [ i ] /= std [ i ]
+
if np . any ( std == 0. ):
+
warnings . warn ( "Possibly constant array!" )
+
# array /= array.std(axis=1).reshape(dim, 1)
+
# if np.isnan(array).sum() != 0:
+
# raise ValueError("nans after standardizing, "
+
# "possibly constant array!")
target_series = array [ target_var , :]
z = np . fastCopyAndTranspose ( array [ 2 :])
@@ -693,24 +723,9 @@
Source code for tigramite.independence_tests.gpdc
-
-
\ No newline at end of file
diff --git a/docs/_build/html/_modules/tigramite/independence_tests/gpdc_torch.html b/docs/_build/html/_modules/tigramite/independence_tests/gpdc_torch.html
index ddffaa5f..f88154fa 100644
--- a/docs/_build/html/_modules/tigramite/independence_tests/gpdc_torch.html
+++ b/docs/_build/html/_modules/tigramite/independence_tests/gpdc_torch.html
@@ -1,10 +1,9 @@
-
+
-
tigramite.independence_tests.gpdc_torch — Tigramite 5.0 documentation
@@ -26,10 +25,23 @@ Navigation
modules |
Tigramite 5.0 documentation »
-
Module code »
-
tigramite.independence_tests.gpdc_torch
+
Module code »
-
+
+
@@ -44,17 +56,33 @@
Source code for tigramite.independence_tests.gpdc_torch # License: GNU General Public License v3.0
from __future__ import print_function
-
import warnings
+
import json , warnings
import numpy as np
import gc
-
from .independence_tests_base import CondIndTest
+
try :
+
from importlib import metadata
+
except ImportError :
+
import importlib_metadata as metadata # python<=3.7
try :
import dcor
import torch
import gpytorch
from .LBFGS import FullBatchLBFGS
+
with open ( '../versions.py' , 'r' ) as vfile :
+
packages = json . loads ( vfile . read ())[ 'all' ]
+
packages = dict ( map ( lambda s : s . split ( '>=' ), packages ))
+
if metadata . version ( 'dcor' ) < packages [ 'dcor' ]:
+
raise Exception ( 'Version mismatch. Installed version of dcor' , metadata . version ( 'dcor' ),
+
'Please install dcor>=' , packages [ 'dcor' ])
+
if metadata . version ( 'torch' ) < packages [ 'pytorch' ]:
+
raise Exception ( 'Version mismatch. Installed version of pytorch' , metadata . version ( 'torch' ),
+
'Please install pytorch>=' , packages [ 'pytorch' ])
+
if metadata . version ( 'gpytorch' ) < packages [ 'gpytorch' ]:
+
raise Exception ( 'Version mismatch. Installed version of gpytorch' , metadata . version ( 'gpytorch' ),
+
'Please install gpytorch>=' , packages [ 'gpytorch' ])
except Exception as e :
warnings . warn ( str ( e ))
+
from .independence_tests_base import CondIndTest
class GaussProcRegTorch ():
r """Gaussian processes abstract base class.
@@ -256,10 +284,16 @@
Source code for tigramite.independence_tests.gpdc_torch # Standardize
if standardize :
array -= array . mean ( axis = 1 ) . reshape ( dim , 1 )
-
array /= array . std ( axis = 1 ) . reshape ( dim , 1 )
-
if np . isnan ( array ) . any ():
-
raise ValueError ( "Nans after standardizing, "
-
"possibly constant array!" )
+
std = array . std ( axis = 1 )
+
for i in range ( dim ):
+
if std [ i ] != 0. :
+
array [ i ] /= std [ i ]
+
if np . any ( std == 0. ):
+
warnings . warn ( "Possibly constant array!" )
+
# array /= array.std(axis=1).reshape(dim, 1)
+
# if np.isnan(array).any():
+
# raise ValueError("Nans after standardizing, "
+
# "possibly constant array!")
target_series = array [ target_var , :]
z = np . fastCopyAndTranspose ( array [ 2 :])
@@ -847,24 +881,9 @@
Source code for tigramite.independence_tests.gpdc_torch
-
\ No newline at end of file
diff --git a/docs/_build/html/_modules/tigramite/independence_tests/independence_tests_base.html b/docs/_build/html/_modules/tigramite/independence_tests/independence_tests_base.html
index 31a503f3..01bda2db 100644
--- a/docs/_build/html/_modules/tigramite/independence_tests/independence_tests_base.html
+++ b/docs/_build/html/_modules/tigramite/independence_tests/independence_tests_base.html
@@ -1,10 +1,9 @@
-
+
-
tigramite.independence_tests.independence_tests_base — Tigramite 5.0 documentation
@@ -26,10 +25,23 @@
Navigation
modules |
Tigramite 5.0 documentation »
-
Module code »
-
tigramite.independence_tests.independence_tests_base
+
Module code »
-
+
+
@@ -1052,24 +1064,9 @@
Source code for tigramite.independence_tests.independence_tests_base return u
-
-
\ No newline at end of file
diff --git a/docs/_build/html/_modules/tigramite/independence_tests/oracle_conditional_independence.html b/docs/_build/html/_modules/tigramite/independence_tests/oracle_conditional_independence.html
index 96ff3d7b..5fde4ff6 100644
--- a/docs/_build/html/_modules/tigramite/independence_tests/oracle_conditional_independence.html
+++ b/docs/_build/html/_modules/tigramite/independence_tests/oracle_conditional_independence.html
@@ -1,10 +1,9 @@
-
+
-
tigramite.independence_tests.oracle_conditional_independence — Tigramite 5.0 documentation
@@ -26,10 +25,23 @@ Navigation
modules |
Tigramite 5.0 documentation »
-
Module code »
-
tigramite.independence_tests.oracle_conditional_independence
+
Module code »
-
+
+
@@ -1602,24 +1614,9 @@
Source code for tigramite.independence_tests.oracle_conditional_independence
# fig.savefig("/home/rung_ja/Downloads/tsg.pdf")
-
-
\ No newline at end of file
diff --git a/docs/_build/html/_modules/tigramite/independence_tests/parcorr.html b/docs/_build/html/_modules/tigramite/independence_tests/parcorr.html
index d92a210a..64ee9151 100644
--- a/docs/_build/html/_modules/tigramite/independence_tests/parcorr.html
+++ b/docs/_build/html/_modules/tigramite/independence_tests/parcorr.html
@@ -1,10 +1,9 @@
-
+
-
tigramite.independence_tests.parcorr — Tigramite 5.0 documentation
@@ -26,10 +25,23 @@ Navigation
modules |
Tigramite 5.0 documentation »
-
Module code »
-
tigramite.independence_tests.parcorr
+
Module code »
-
+
+
@@ -47,6 +59,7 @@
Source code for tigramite.independence_tests.parcorr from
scipy import stats
import numpy as np
import sys
+
import warnings
from .independence_tests_base import CondIndTest
@@ -130,10 +143,16 @@
Source code for tigramite.independence_tests.parcorr # Standardize
if standardize :
array -= array . mean ( axis = 1 ) . reshape ( dim , 1 )
-
array /= array . std ( axis = 1 ) . reshape ( dim , 1 )
-
if np . isnan ( array ) . sum () != 0 :
-
raise ValueError ( "nans after standardizing, "
-
"possibly constant array!" )
+
std = array . std ( axis = 1 )
+
for i in range ( dim ):
+
if std [ i ] != 0. :
+
array [ i ] /= std [ i ]
+
if np . any ( std == 0. ):
+
warnings . warn ( "Possibly constant array!" )
+
# array /= array.std(axis=1).reshape(dim, 1)
+
# if np.isnan(array).sum() != 0:
+
# raise ValueError("nans after standardizing, "
+
# "possibly constant array!")
y = array [ target_var , :]
@@ -340,24 +359,9 @@
Source code for tigramite.independence_tests.parcorr return score
-
-
\ No newline at end of file
diff --git a/docs/_build/html/_modules/tigramite/lpcmci.html b/docs/_build/html/_modules/tigramite/lpcmci.html
index 7a356d35..693d9bcb 100644
--- a/docs/_build/html/_modules/tigramite/lpcmci.html
+++ b/docs/_build/html/_modules/tigramite/lpcmci.html
@@ -1,10 +1,9 @@
-
+
-
tigramite.lpcmci — Tigramite 5.0 documentation
@@ -26,10 +25,23 @@ Navigation
modules |
Tigramite 5.0 documentation »
-
Module code »
-
tigramite.lpcmci
+
Module code »
-
+
+
@@ -3451,24 +3463,9 @@
Source code for tigramite.lpcmci
-
-
\ No newline at end of file
diff --git a/docs/_build/html/_modules/tigramite/models.html b/docs/_build/html/_modules/tigramite/models.html
index bebddb92..32848d7b 100644
--- a/docs/_build/html/_modules/tigramite/models.html
+++ b/docs/_build/html/_modules/tigramite/models.html
@@ -1,10 +1,9 @@
-
+
-
tigramite.models — Tigramite 5.0 documentation
@@ -26,10 +25,23 @@ Navigation
modules |
Tigramite 5.0 documentation »
-
Module code »
-
tigramite.models
+
Module code »
-
+
+
@@ -45,23 +57,29 @@
Source code for tigramite.models
from __future__ import print_function
from copy import deepcopy
-
+import json , warnings
import numpy as np
-
-from tigramite.data_processing import DataFrame
-from tigramite.pcmci import PCMCI
-
-# try:
-import sklearn
-import sklearn.linear_model
-# except:
-# print("Could not import sklearn...")
-
try :
+ from importlib import metadata
+except ImportError :
+ import importlib_metadata as metadata # python<=3.7
+try :
+ import sklearn
+ import sklearn.linear_model
import networkx
-except :
- print ( "Could not import networkx, LinearMediation plots not possible..." )
-
+ with open ( '../versions.py' , 'r' ) as vfile :
+ packages = json . loads ( vfile . read ())[ 'all' ]
+ packages = dict ( map ( lambda s : s . split ( '>=' ), packages ))
+ if metadata . version ( 'scikit-learn' ) < packages [ 'scikit-learn' ]:
+ raise Exception ( 'Version mismatch. Installed version of scikit-learn' , metadata . version ( 'scikit-learn' ),
+ 'Please install scikit-learn>=' , packages [ 'scikit-learn' ])
+ if metadata . version ( 'networkx' ) < packages [ 'networkx' ]:
+ raise Exception ( 'Version mismatch. Installed version of networkx' , metadata . version ( 'networkx' ),
+ 'Please install networkx>=' , packages [ 'networkx' ])
+except Exception as e :
+ warnings . warn ( str ( e ))
+from tigramite.data_processing import DataFrame
+from tigramite.pcmci import PCMCI
[docs] class Models ():
"""Base class for time series models.
@@ -120,6 +138,7 @@
Source code for tigramite.models
self . tau_max = None
self . fit_results = None
+ # @profile
[docs] def get_general_fitted_model ( self ,
Y , X , Z = None ,
conditions = None ,
@@ -189,10 +208,13 @@
Source code for tigramite.models
# Initialize the fit results
fit_results = {}
for y in self . Y :
+
# Construct array of shape (var, time) with first entry being
# a dummy, second is y followed by joint X and Z (ignore the notation in construct_array)
array , xyz = \
- self . dataframe . construct_array ( X = self . X , Y = [ y ] + self . Z , Z = self . conditions ,
+ self . dataframe . construct_array ( X = self . X , Y = [ y ], # + self.Z,
+ Z = self . conditions ,
+ extraZ = self . Z ,
tau_max = self . tau_max ,
mask_type = self . mask_type ,
cut_off = self . cut_off ,
@@ -203,23 +225,23 @@ Source code for tigramite.models
if self . data_transform is not None :
array = self . data_transform . fit_transform ( X = array . T ) . T
- # Cache array for use in prediction
- self . observation_array = array
- self . xyz = xyz
# Fit the model
# Copy and fit the model
a_model = deepcopy ( self . model )
predictor_indices = list ( np . where ( xyz == 0 )[ 0 ]) \
- + list ( np . where ( xyz == 1 )[ 0 ][ 1 :]) \
- + list ( np . where ( xyz == 2 )[ 0 ])
+ + list ( np . where ( xyz == 2 )[ 0 ]) \
+ + list ( np . where ( xyz == 3 )[ 0 ])
predictor_array = array [ predictor_indices , :] . T
# Target is only first entry of Y, ie [y]
target_array = array [ np . where ( xyz == 1 )[ 0 ][ 0 ], :]
a_model . fit ( X = predictor_array , y = target_array )
+
# Cache the results
fit_results [ y ] = {}
+ fit_results [ y ][ 'observation_array' ] = array
+ fit_results [ y ][ 'xyz' ] = xyz
fit_results [ y ][ 'model' ] = a_model
# Cache the data transform
fit_results [ y ][ 'data_transform' ] = deepcopy ( self . data_transform )
@@ -231,6 +253,7 @@ Source code for tigramite.models
self . fit_results = fit_results
return fit_results
+ # @profile
[docs] def get_general_prediction ( self ,
intervention_data ,
conditions_data = None ,
@@ -293,13 +316,13 @@
Source code for tigramite.models
conditions_data = a_transform . transform ( X = conditions_data )
# Extract observational Z from stored array
- z_indices = list ( np . where ( self . xyz == 1 )[ 0 ][ 1 :])
- z_array = self . observation_array [ z_indices , :] . T
+ z_indices = list ( np . where ( self . fit_results [ y ][ 'xyz' ] == 3 )[ 0 ])
+ z_array = self . fit_results [ y ][ 'observation_array' ][ z_indices , :] . T
Tobs = len ( z_array )
if self . conditions is not None and conditions_data is not None :
- s_indices = list ( np . where ( self . xyz == 2 )[ 0 ])
- s_array = self . observation_array [ s_indices , :] . T
+ s_indices = list ( np . where ( self . fit_results [ y ][ 'xyz' ] == 2 )[ 0 ])
+ s_array = self . fit_results [ y ][ 'observation_array' ][ s_indices , :] . T
# Now iterate through interventions (and potentially S)
for index , dox_vals in enumerate ( intervention_data ):
@@ -332,133 +355,6 @@ Source code for tigramite.models
- # def get_general_prediction(self,
- # intervention_data=None,
- # conditions_data=None,
- # pred_params=None,
- # ):
- # r"""Predict effect of intervention with fitted model.
-
- # Uses the model.predict() function of the sklearn model.
-
- # Parameters
- # ----------
- # intervention_data : data object, optional
- # Tigramite dataframe object with optional new mask. Only the
- # values for X will be extracted.
- # conditions_data : data object, optional
- # Tigramite dataframe object with optional new mask. Only the
- # values for conditions will be extracted.
- # pred_params : dict, optional
- # Optional parameters passed on to sklearn prediction function.
-
- # Returns
- # -------
- # Results from prediction.
- # """
-
- # pred_dict = {}
- # for y in self.Y:
- # # Print message
- # if self.verbosity > 1:
- # print("\n## Predicting target %s" % str(y))
- # if pred_params is not None:
- # for key in list(pred_params):
- # print("%s = %s" % (key, pred_params[key]))
- # # Default value for pred_params
- # if pred_params is None:
- # pred_params = {}
- # # Check this is a valid target
- # if y not in self.fit_results:
- # raise ValueError("y = %s not yet fitted" % str(y))
- # # Construct the array form of the data
- # # Check if we've passed a new dataframe object
- # observation_array, xyz = \
- # self.dataframe.construct_array(X=self.X, Y=[y] + self.Z, Z=self.conditions,
- # tau_max=self.tau_max,
- # # mask=self.test_mask,
- # mask_type=self.mask_type,
- # cut_off=self.cut_off,
- # verbosity=self.verbosity)
-
- # intervention_array = np.copy(observation_array)
- # if intervention_data is not None:
- # tmp_array, _ = intervention_data.construct_array(X=self.X, Y=[y] + self.Z,
- # Z=self.conditions,
- # tau_max=self.tau_max,
- # mask_type=self.mask_type,
- # cut_off=self.cut_off,
- # verbosity=self.verbosity)
-
- # # Only replace X-variables in intervention_array (necessary if lags of
- # # X are in Z...)
- # for index in np.where(xyz==0)[0]:
- # intervention_array[index] = tmp_array[index]
-
- # if self.conditions is not None and conditions_data is not None:
- # tmp_array, _ = conditions_data.construct_array(X=self.X, Y=[y] + self.Z,
- # Z=self.conditions,
- # tau_max=self.tau_max,
- # mask_type=self.mask_type,
- # cut_off=self.cut_off,
- # verbosity=self.verbosity)
-
- # # Only replace condition-variables in intervention_array
- # # (necessary if lags of X are in Z...)
- # for index in np.where(xyz==2)[0]:
- # intervention_array[index] = tmp_array[index]
-
- # # Transform the data if needed
- # a_transform = self.fit_results[y]['data_transform']
- # if a_transform is not None:
- # intervention_array = a_transform.transform(X=intervention_array.T).T
- # # Cache the test array
- # self.intervention_array = intervention_array
- # # Run the predictor, for Y only the Z-part is used, the first index is y
- # predictor_indices = list(np.where(xyz==0)[0]) \
- # + list(np.where(xyz==1)[0][1:]) \
- # + list(np.where(xyz==2)[0])
- # predictor_array = intervention_array[predictor_indices, :].T
-
- # pred_dict[y] = self.fit_results[y]['model'].predict(
- # X=predictor_array, **pred_params)
-
- # # print(pred_dict[y])
- # if self.conditions is not None and conditions_data is not None:
-
- # a_conditional_model = deepcopy(self.conditional_model)
-
- # # Fit Y|do(X) on S
- # conditions_array = observation_array[list(np.where(xyz==2)[0])]
- # target_array = pred_dict[y] # array[np.where(xyz==1)[0][0], :]
-
- # if a_transform is not None:
- # conditions_array = a_transform.transform(X=conditions_array.T).T
- # target_array = a_transform.transform(X=target_array.T).T
-
- # a_conditional_model.fit(X=conditions_array.T, y=target_array)
- # self.fit_results[y]['conditional_model'] = a_conditional_model
-
- # # Now predict conditional causal effect for new conditions
- # tmp_array, _ = conditions_data.construct_array(X=self.X, Y=[y] + self.Z,
- # Z=self.conditions,
- # tau_max=self.tau_max,
- # mask_type=self.mask_type,
- # cut_off=self.cut_off,
- # verbosity=self.verbosity)
-
- # # Construct conditions array
- # new_conditions_array = tmp_array[list(np.where(xyz==2)[0])]
-
- # if a_transform is not None:
- # new_conditions_array = a_transform.transform(X=new_conditions_array.T).T
-
- # pred_dict[y] = a_conditional_model.predict(
- # X=new_conditions_array.T, **pred_params)
-
- # return pred_dict
-
-
[docs] def get_fit ( self , all_parents ,
selected_variables = None ,
tau_max = None ,
@@ -1650,24 +1546,9 @@
Source code for tigramite.models
-
-
\ No newline at end of file
diff --git a/docs/_build/html/_modules/tigramite/pcmci.html b/docs/_build/html/_modules/tigramite/pcmci.html
index 4bf70db3..cc3019fc 100644
--- a/docs/_build/html/_modules/tigramite/pcmci.html
+++ b/docs/_build/html/_modules/tigramite/pcmci.html
@@ -1,10 +1,9 @@
-
+
-
tigramite.pcmci — Tigramite 5.0 documentation
@@ -26,10 +25,23 @@ Navigation
modules |
Tigramite 5.0 documentation »
-
Module code »
-
tigramite.pcmci
+
Module code »
-
+
+
@@ -4155,24 +4167,9 @@
Source code for tigramite.pcmci
-
-
\ No newline at end of file
diff --git a/docs/_build/html/_modules/tigramite/plotting.html b/docs/_build/html/_modules/tigramite/plotting.html
index 6c5ec8fe..3bc18132 100644
--- a/docs/_build/html/_modules/tigramite/plotting.html
+++ b/docs/_build/html/_modules/tigramite/plotting.html
@@ -1,10 +1,9 @@
-
+
-
tigramite.plotting — Tigramite 5.0 documentation
@@ -26,10 +25,23 @@ Navigation
modules |
Tigramite 5.0 documentation »
-
Module code »
-
tigramite.plotting
+
Module code »
-
+
+
@@ -44,7 +56,26 @@
Source code for tigramite.plotting
# License: GNU General Public License v3.0
import numpy as np
-import matplotlib
+import json , warnings
+try :
+ from importlib import metadata
+except ImportError :
+ import importlib_metadata as metadata # python<=3.7
+try :
+ import matplotlib
+ import networkx as nx
+ with open ( '../versions.py' , 'r' ) as vfile :
+ packages = json . loads ( vfile . read ())[ 'all' ]
+ packages = dict ( map ( lambda s : s . split ( '>=' ), packages ))
+ if metadata . version ( 'matplotlib' ) < packages [ 'matplotlib' ]:
+ raise Exception ( 'Version mismatch. Installed version of matplotlib' , metadata . version ( 'matplotlib' ),
+ 'Please install matplotlib>=' , packages [ 'matplotlib' ])
+ if metadata . version ( 'networkx' ) < packages [ 'networkx' ]:
+ raise Exception ( 'Version mismatch. Installed version of networkx' , metadata . version ( 'networkx' ),
+ 'Please install networkx>=' , packages [ 'networkx' ])
+except Exception as e :
+ warnings . warn ( str ( e ))
+
from matplotlib.colors import ListedColormap
import matplotlib.transforms as transforms
from matplotlib import pyplot , ticker
@@ -54,7 +85,6 @@ Source code for tigramite.plotting
import sys
from operator import sub
-import networkx as nx
import tigramite.data_processing as pp
from copy import deepcopy
import matplotlib.path as mpath
@@ -1005,7 +1035,7 @@ Source code for tigramite.plotting
coor1 ,
coor2 ,
arrowstyle = arrowstyle ,
- connectionstyle = f "arc3,rad= { rad } " ,
+ connectionstyle = f "arc3,rad= {rad} " ,
mutation_scale = width ,
lw = width / 2 ,
alpha = alpha ,
@@ -2418,7 +2448,7 @@ Source code for tigramite.plotting
ax . text (
label_space_left ,
pos [ order [ i ] * max_lag ][ 1 ],
- f " { var_names [ order [ i ]] } " ,
+ f "{var_names[order[i]]}" ,
fontsize = label_fontsize ,
horizontalalignment = "left" ,
verticalalignment = "center" ,
@@ -3378,24 +3408,9 @@ Source code for tigramite.plotting
-
-
\ No newline at end of file
diff --git a/docs/_build/html/_modules/tigramite/toymodels/structural_causal_processes.html b/docs/_build/html/_modules/tigramite/toymodels/structural_causal_processes.html
index 75df6b2b..856aaab6 100644
--- a/docs/_build/html/_modules/tigramite/toymodels/structural_causal_processes.html
+++ b/docs/_build/html/_modules/tigramite/toymodels/structural_causal_processes.html
@@ -1,10 +1,9 @@
-
+
-
tigramite.toymodels.structural_causal_processes — Tigramite 5.0 documentation
@@ -26,10 +25,23 @@
Navigation
modules |
Tigramite 5.0 documentation »
-
Module code »
-
tigramite.toymodels.structural_causal_processes
+
Module code »
-
+
+
@@ -753,7 +765,7 @@
Source code for tigramite.toymodels.structural_causal_processes return data , nonstationary
def _get_minmax_lag ( links ):
-
"""Helper function to retrieve tau_min and tau_max from links
+
"""Helper function to retrieve tau_min and tau_max from links.
"""
N = len ( links )
@@ -763,12 +775,18 @@
Source code for tigramite.toymodels.structural_causal_processes max_lag
= 0
for j in range ( N ):
for link_props in links [ j ]:
-
var , lag = link_props [ 0 ]
-
coeff = link_props [ 1 ]
-
# func = link_props[2]
-
if coeff != 0. :
+
if len ( link_props ) > 2 :
+
var , lag = link_props [ 0 ]
+
coeff = link_props [ 1 ]
+
# func = link_props[2]
+
if coeff != 0. :
+
min_lag = min ( min_lag , abs ( lag ))
+
max_lag = max ( max_lag , abs ( lag ))
+
else :
+
var , lag = link_props
min_lag = min ( min_lag , abs ( lag ))
-
max_lag = max ( max_lag , abs ( lag ))
+
max_lag = max ( max_lag , abs ( lag ))
+
return min_lag , max_lag
def _get_parents ( links , exclude_contemp = False ):
@@ -806,6 +824,54 @@
Source code for tigramite.toymodels.structural_causal_processes return
children
+
[docs] def links_to_graph ( links , tau_max = None ):
+
"""Helper function to convert dictionary of links to graph array format.
+
+
Parameters
+
---------
+
links : dict
+
Dictionary of form {0:[((0, -1), coeff, func), ...], 1:[...], ...}.
+
Also format {0:[(0, -1), ...], 1:[...], ...} is allowed.
+
tau_max : int or None
+
Maximum lag. If None, the maximum lag in links is used.
+
+
Returns
+
-------
+
graph : array of shape (N, N, tau_max+1)
+
Matrix format of graph with 1 for true links and 0 else.
+
"""
+
N = len ( links )
+
+
# Get maximum time lag
+
min_lag , max_lag = _get_minmax_lag ( links )
+
+
# Set maximum lag
+
if tau_max is None :
+
tau_max = max_lag
+
else :
+
if max_lag > tau_max :
+
raise ValueError ( "tau_max is smaller than maximum lag = %d "
+
"found in links, use tau_max=None or larger "
+
"value" % max_lag )
+
+
graph = np . zeros (( N , N , tau_max + 1 ), dtype = '<U3' )
+
for j in links . keys ():
+
for link_props in links [ j ]:
+
if len ( link_props ) > 2 :
+
var , lag = link_props [ 0 ]
+
coeff = link_props [ 1 ]
+
if coeff != 0. :
+
graph [ var , j , abs ( lag )] = "-->"
+
if lag == 0 :
+
graph [ j , var , 0 ] = "<--"
+
else :
+
var , lag = link_props
+
graph [ var , j , abs ( lag )] = "-->"
+
if lag == 0 :
+
graph [ j , var , 0 ] = "<--"
+
+
return graph
+
class _Logger ( object ):
"""Class to append print output to a string which can be saved"""
def __init__ ( self ):
@@ -831,26 +897,18 @@
Source code for tigramite.toymodels.structural_causal_processes data, nonstat = structural_causal_process ( links ,
T = 100 , noises = noises )
print ( data . shape )
+
+ # Construct graph
+ # links = {0: [(0, -1)],
+ # 1: [(1, -1), (0, -1)],
+ # 2: [(2, -1), (1, 0),],
+ # }
+ print ( links_to_graph ( links ))
-
-
\ No newline at end of file
diff --git a/docs/_build/html/_static/jquery-3.4.1.js b/docs/_build/html/_static/jquery-3.4.1.js
new file mode 100644
index 00000000..773ad95c
--- /dev/null
+++ b/docs/_build/html/_static/jquery-3.4.1.js
@@ -0,0 +1,10598 @@
+/*!
+ * jQuery JavaScript Library v3.4.1
+ * https://jquery.com/
+ *
+ * Includes Sizzle.js
+ * https://sizzlejs.com/
+ *
+ * Copyright JS Foundation and other contributors
+ * Released under the MIT license
+ * https://jquery.org/license
+ *
+ * Date: 2019-05-01T21:04Z
+ */
+( function( global, factory ) {
+
+ "use strict";
+
+ if ( typeof module === "object" && typeof module.exports === "object" ) {
+
+ // For CommonJS and CommonJS-like environments where a proper `window`
+ // is present, execute the factory and get jQuery.
+ // For environments that do not have a `window` with a `document`
+ // (such as Node.js), expose a factory as module.exports.
+ // This accentuates the need for the creation of a real `window`.
+ // e.g. var jQuery = require("jquery")(window);
+ // See ticket #14549 for more info.
+ module.exports = global.document ?
+ factory( global, true ) :
+ function( w ) {
+ if ( !w.document ) {
+ throw new Error( "jQuery requires a window with a document" );
+ }
+ return factory( w );
+ };
+ } else {
+ factory( global );
+ }
+
+// Pass this if window is not defined yet
+} )( typeof window !== "undefined" ? window : this, function( window, noGlobal ) {
+
+// Edge <= 12 - 13+, Firefox <=18 - 45+, IE 10 - 11, Safari 5.1 - 9+, iOS 6 - 9.1
+// throw exceptions when non-strict code (e.g., ASP.NET 4.5) accesses strict mode
+// arguments.callee.caller (trac-13335). But as of jQuery 3.0 (2016), strict mode should be common
+// enough that all such attempts are guarded in a try block.
+"use strict";
+
+var arr = [];
+
+var document = window.document;
+
+var getProto = Object.getPrototypeOf;
+
+var slice = arr.slice;
+
+var concat = arr.concat;
+
+var push = arr.push;
+
+var indexOf = arr.indexOf;
+
+var class2type = {};
+
+var toString = class2type.toString;
+
+var hasOwn = class2type.hasOwnProperty;
+
+var fnToString = hasOwn.toString;
+
+var ObjectFunctionString = fnToString.call( Object );
+
+var support = {};
+
+var isFunction = function isFunction( obj ) {
+
+ // Support: Chrome <=57, Firefox <=52
+ // In some browsers, typeof returns "function" for HTML
elements
+ // (i.e., `typeof document.createElement( "object" ) === "function"`).
+ // We don't want to classify *any* DOM node as a function.
+ return typeof obj === "function" && typeof obj.nodeType !== "number";
+ };
+
+
+var isWindow = function isWindow( obj ) {
+ return obj != null && obj === obj.window;
+ };
+
+
+
+
+ var preservedScriptAttributes = {
+ type: true,
+ src: true,
+ nonce: true,
+ noModule: true
+ };
+
+ function DOMEval( code, node, doc ) {
+ doc = doc || document;
+
+ var i, val,
+ script = doc.createElement( "script" );
+
+ script.text = code;
+ if ( node ) {
+ for ( i in preservedScriptAttributes ) {
+
+ // Support: Firefox 64+, Edge 18+
+ // Some browsers don't support the "nonce" property on scripts.
+ // On the other hand, just using `getAttribute` is not enough as
+ // the `nonce` attribute is reset to an empty string whenever it
+ // becomes browsing-context connected.
+ // See https://github.com/whatwg/html/issues/2369
+ // See https://html.spec.whatwg.org/#nonce-attributes
+ // The `node.getAttribute` check was added for the sake of
+ // `jQuery.globalEval` so that it can fake a nonce-containing node
+ // via an object.
+ val = node[ i ] || node.getAttribute && node.getAttribute( i );
+ if ( val ) {
+ script.setAttribute( i, val );
+ }
+ }
+ }
+ doc.head.appendChild( script ).parentNode.removeChild( script );
+ }
+
+
+function toType( obj ) {
+ if ( obj == null ) {
+ return obj + "";
+ }
+
+ // Support: Android <=2.3 only (functionish RegExp)
+ return typeof obj === "object" || typeof obj === "function" ?
+ class2type[ toString.call( obj ) ] || "object" :
+ typeof obj;
+}
+/* global Symbol */
+// Defining this global in .eslintrc.json would create a danger of using the global
+// unguarded in another place, it seems safer to define global only for this module
+
+
+
+var
+ version = "3.4.1",
+
+ // Define a local copy of jQuery
+ jQuery = function( selector, context ) {
+
+ // The jQuery object is actually just the init constructor 'enhanced'
+ // Need init if jQuery is called (just allow error to be thrown if not included)
+ return new jQuery.fn.init( selector, context );
+ },
+
+ // Support: Android <=4.0 only
+ // Make sure we trim BOM and NBSP
+ rtrim = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g;
+
+jQuery.fn = jQuery.prototype = {
+
+ // The current version of jQuery being used
+ jquery: version,
+
+ constructor: jQuery,
+
+ // The default length of a jQuery object is 0
+ length: 0,
+
+ toArray: function() {
+ return slice.call( this );
+ },
+
+ // Get the Nth element in the matched element set OR
+ // Get the whole matched element set as a clean array
+ get: function( num ) {
+
+ // Return all the elements in a clean array
+ if ( num == null ) {
+ return slice.call( this );
+ }
+
+ // Return just the one element from the set
+ return num < 0 ? this[ num + this.length ] : this[ num ];
+ },
+
+ // Take an array of elements and push it onto the stack
+ // (returning the new matched element set)
+ pushStack: function( elems ) {
+
+ // Build a new jQuery matched element set
+ var ret = jQuery.merge( this.constructor(), elems );
+
+ // Add the old object onto the stack (as a reference)
+ ret.prevObject = this;
+
+ // Return the newly-formed element set
+ return ret;
+ },
+
+ // Execute a callback for every element in the matched set.
+ each: function( callback ) {
+ return jQuery.each( this, callback );
+ },
+
+ map: function( callback ) {
+ return this.pushStack( jQuery.map( this, function( elem, i ) {
+ return callback.call( elem, i, elem );
+ } ) );
+ },
+
+ slice: function() {
+ return this.pushStack( slice.apply( this, arguments ) );
+ },
+
+ first: function() {
+ return this.eq( 0 );
+ },
+
+ last: function() {
+ return this.eq( -1 );
+ },
+
+ eq: function( i ) {
+ var len = this.length,
+ j = +i + ( i < 0 ? len : 0 );
+ return this.pushStack( j >= 0 && j < len ? [ this[ j ] ] : [] );
+ },
+
+ end: function() {
+ return this.prevObject || this.constructor();
+ },
+
+ // For internal use only.
+ // Behaves like an Array's method, not like a jQuery method.
+ push: push,
+ sort: arr.sort,
+ splice: arr.splice
+};
+
+jQuery.extend = jQuery.fn.extend = function() {
+ var options, name, src, copy, copyIsArray, clone,
+ target = arguments[ 0 ] || {},
+ i = 1,
+ length = arguments.length,
+ deep = false;
+
+ // Handle a deep copy situation
+ if ( typeof target === "boolean" ) {
+ deep = target;
+
+ // Skip the boolean and the target
+ target = arguments[ i ] || {};
+ i++;
+ }
+
+ // Handle case when target is a string or something (possible in deep copy)
+ if ( typeof target !== "object" && !isFunction( target ) ) {
+ target = {};
+ }
+
+ // Extend jQuery itself if only one argument is passed
+ if ( i === length ) {
+ target = this;
+ i--;
+ }
+
+ for ( ; i < length; i++ ) {
+
+ // Only deal with non-null/undefined values
+ if ( ( options = arguments[ i ] ) != null ) {
+
+ // Extend the base object
+ for ( name in options ) {
+ copy = options[ name ];
+
+ // Prevent Object.prototype pollution
+ // Prevent never-ending loop
+ if ( name === "__proto__" || target === copy ) {
+ continue;
+ }
+
+ // Recurse if we're merging plain objects or arrays
+ if ( deep && copy && ( jQuery.isPlainObject( copy ) ||
+ ( copyIsArray = Array.isArray( copy ) ) ) ) {
+ src = target[ name ];
+
+ // Ensure proper type for the source value
+ if ( copyIsArray && !Array.isArray( src ) ) {
+ clone = [];
+ } else if ( !copyIsArray && !jQuery.isPlainObject( src ) ) {
+ clone = {};
+ } else {
+ clone = src;
+ }
+ copyIsArray = false;
+
+ // Never move original objects, clone them
+ target[ name ] = jQuery.extend( deep, clone, copy );
+
+ // Don't bring in undefined values
+ } else if ( copy !== undefined ) {
+ target[ name ] = copy;
+ }
+ }
+ }
+ }
+
+ // Return the modified object
+ return target;
+};
+
+jQuery.extend( {
+
+ // Unique for each copy of jQuery on the page
+ expando: "jQuery" + ( version + Math.random() ).replace( /\D/g, "" ),
+
+ // Assume jQuery is ready without the ready module
+ isReady: true,
+
+ error: function( msg ) {
+ throw new Error( msg );
+ },
+
+ noop: function() {},
+
+ isPlainObject: function( obj ) {
+ var proto, Ctor;
+
+ // Detect obvious negatives
+ // Use toString instead of jQuery.type to catch host objects
+ if ( !obj || toString.call( obj ) !== "[object Object]" ) {
+ return false;
+ }
+
+ proto = getProto( obj );
+
+ // Objects with no prototype (e.g., `Object.create( null )`) are plain
+ if ( !proto ) {
+ return true;
+ }
+
+ // Objects with prototype are plain iff they were constructed by a global Object function
+ Ctor = hasOwn.call( proto, "constructor" ) && proto.constructor;
+ return typeof Ctor === "function" && fnToString.call( Ctor ) === ObjectFunctionString;
+ },
+
+ isEmptyObject: function( obj ) {
+ var name;
+
+ for ( name in obj ) {
+ return false;
+ }
+ return true;
+ },
+
+ // Evaluates a script in a global context
+ globalEval: function( code, options ) {
+ DOMEval( code, { nonce: options && options.nonce } );
+ },
+
+ each: function( obj, callback ) {
+ var length, i = 0;
+
+ if ( isArrayLike( obj ) ) {
+ length = obj.length;
+ for ( ; i < length; i++ ) {
+ if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) {
+ break;
+ }
+ }
+ } else {
+ for ( i in obj ) {
+ if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) {
+ break;
+ }
+ }
+ }
+
+ return obj;
+ },
+
+ // Support: Android <=4.0 only
+ trim: function( text ) {
+ return text == null ?
+ "" :
+ ( text + "" ).replace( rtrim, "" );
+ },
+
+ // results is for internal usage only
+ makeArray: function( arr, results ) {
+ var ret = results || [];
+
+ if ( arr != null ) {
+ if ( isArrayLike( Object( arr ) ) ) {
+ jQuery.merge( ret,
+ typeof arr === "string" ?
+ [ arr ] : arr
+ );
+ } else {
+ push.call( ret, arr );
+ }
+ }
+
+ return ret;
+ },
+
+ inArray: function( elem, arr, i ) {
+ return arr == null ? -1 : indexOf.call( arr, elem, i );
+ },
+
+ // Support: Android <=4.0 only, PhantomJS 1 only
+ // push.apply(_, arraylike) throws on ancient WebKit
+ merge: function( first, second ) {
+ var len = +second.length,
+ j = 0,
+ i = first.length;
+
+ for ( ; j < len; j++ ) {
+ first[ i++ ] = second[ j ];
+ }
+
+ first.length = i;
+
+ return first;
+ },
+
+ grep: function( elems, callback, invert ) {
+ var callbackInverse,
+ matches = [],
+ i = 0,
+ length = elems.length,
+ callbackExpect = !invert;
+
+ // Go through the array, only saving the items
+ // that pass the validator function
+ for ( ; i < length; i++ ) {
+ callbackInverse = !callback( elems[ i ], i );
+ if ( callbackInverse !== callbackExpect ) {
+ matches.push( elems[ i ] );
+ }
+ }
+
+ return matches;
+ },
+
+ // arg is for internal usage only
+ map: function( elems, callback, arg ) {
+ var length, value,
+ i = 0,
+ ret = [];
+
+ // Go through the array, translating each of the items to their new values
+ if ( isArrayLike( elems ) ) {
+ length = elems.length;
+ for ( ; i < length; i++ ) {
+ value = callback( elems[ i ], i, arg );
+
+ if ( value != null ) {
+ ret.push( value );
+ }
+ }
+
+ // Go through every key on the object,
+ } else {
+ for ( i in elems ) {
+ value = callback( elems[ i ], i, arg );
+
+ if ( value != null ) {
+ ret.push( value );
+ }
+ }
+ }
+
+ // Flatten any nested arrays
+ return concat.apply( [], ret );
+ },
+
+ // A global GUID counter for objects
+ guid: 1,
+
+ // jQuery.support is not used in Core but other projects attach their
+ // properties to it so it needs to exist.
+ support: support
+} );
+
+if ( typeof Symbol === "function" ) {
+ jQuery.fn[ Symbol.iterator ] = arr[ Symbol.iterator ];
+}
+
+// Populate the class2type map
+jQuery.each( "Boolean Number String Function Array Date RegExp Object Error Symbol".split( " " ),
+function( i, name ) {
+ class2type[ "[object " + name + "]" ] = name.toLowerCase();
+} );
+
+function isArrayLike( obj ) {
+
+ // Support: real iOS 8.2 only (not reproducible in simulator)
+ // `in` check used to prevent JIT error (gh-2145)
+ // hasOwn isn't used here due to false negatives
+ // regarding Nodelist length in IE
+ var length = !!obj && "length" in obj && obj.length,
+ type = toType( obj );
+
+ if ( isFunction( obj ) || isWindow( obj ) ) {
+ return false;
+ }
+
+ return type === "array" || length === 0 ||
+ typeof length === "number" && length > 0 && ( length - 1 ) in obj;
+}
+var Sizzle =
+/*!
+ * Sizzle CSS Selector Engine v2.3.4
+ * https://sizzlejs.com/
+ *
+ * Copyright JS Foundation and other contributors
+ * Released under the MIT license
+ * https://js.foundation/
+ *
+ * Date: 2019-04-08
+ */
+(function( window ) {
+
+var i,
+ support,
+ Expr,
+ getText,
+ isXML,
+ tokenize,
+ compile,
+ select,
+ outermostContext,
+ sortInput,
+ hasDuplicate,
+
+ // Local document vars
+ setDocument,
+ document,
+ docElem,
+ documentIsHTML,
+ rbuggyQSA,
+ rbuggyMatches,
+ matches,
+ contains,
+
+ // Instance-specific data
+ expando = "sizzle" + 1 * new Date(),
+ preferredDoc = window.document,
+ dirruns = 0,
+ done = 0,
+ classCache = createCache(),
+ tokenCache = createCache(),
+ compilerCache = createCache(),
+ nonnativeSelectorCache = createCache(),
+ sortOrder = function( a, b ) {
+ if ( a === b ) {
+ hasDuplicate = true;
+ }
+ return 0;
+ },
+
+ // Instance methods
+ hasOwn = ({}).hasOwnProperty,
+ arr = [],
+ pop = arr.pop,
+ push_native = arr.push,
+ push = arr.push,
+ slice = arr.slice,
+ // Use a stripped-down indexOf as it's faster than native
+ // https://jsperf.com/thor-indexof-vs-for/5
+ indexOf = function( list, elem ) {
+ var i = 0,
+ len = list.length;
+ for ( ; i < len; i++ ) {
+ if ( list[i] === elem ) {
+ return i;
+ }
+ }
+ return -1;
+ },
+
+ booleans = "checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",
+
+ // Regular expressions
+
+ // http://www.w3.org/TR/css3-selectors/#whitespace
+ whitespace = "[\\x20\\t\\r\\n\\f]",
+
+ // http://www.w3.org/TR/CSS21/syndata.html#value-def-identifier
+ identifier = "(?:\\\\.|[\\w-]|[^\0-\\xa0])+",
+
+ // Attribute selectors: http://www.w3.org/TR/selectors/#attribute-selectors
+ attributes = "\\[" + whitespace + "*(" + identifier + ")(?:" + whitespace +
+ // Operator (capture 2)
+ "*([*^$|!~]?=)" + whitespace +
+ // "Attribute values must be CSS identifiers [capture 5] or strings [capture 3 or capture 4]"
+ "*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|(" + identifier + "))|)" + whitespace +
+ "*\\]",
+
+ pseudos = ":(" + identifier + ")(?:\\((" +
+ // To reduce the number of selectors needing tokenize in the preFilter, prefer arguments:
+ // 1. quoted (capture 3; capture 4 or capture 5)
+ "('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|" +
+ // 2. simple (capture 6)
+ "((?:\\\\.|[^\\\\()[\\]]|" + attributes + ")*)|" +
+ // 3. anything else (capture 2)
+ ".*" +
+ ")\\)|)",
+
+ // Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter
+ rwhitespace = new RegExp( whitespace + "+", "g" ),
+ rtrim = new RegExp( "^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + whitespace + "+$", "g" ),
+
+ rcomma = new RegExp( "^" + whitespace + "*," + whitespace + "*" ),
+ rcombinators = new RegExp( "^" + whitespace + "*([>+~]|" + whitespace + ")" + whitespace + "*" ),
+ rdescend = new RegExp( whitespace + "|>" ),
+
+ rpseudo = new RegExp( pseudos ),
+ ridentifier = new RegExp( "^" + identifier + "$" ),
+
+ matchExpr = {
+ "ID": new RegExp( "^#(" + identifier + ")" ),
+ "CLASS": new RegExp( "^\\.(" + identifier + ")" ),
+ "TAG": new RegExp( "^(" + identifier + "|[*])" ),
+ "ATTR": new RegExp( "^" + attributes ),
+ "PSEUDO": new RegExp( "^" + pseudos ),
+ "CHILD": new RegExp( "^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" + whitespace +
+ "*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" + whitespace +
+ "*(\\d+)|))" + whitespace + "*\\)|)", "i" ),
+ "bool": new RegExp( "^(?:" + booleans + ")$", "i" ),
+ // For use in libraries implementing .is()
+ // We use this for POS matching in `select`
+ "needsContext": new RegExp( "^" + whitespace + "*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" +
+ whitespace + "*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)", "i" )
+ },
+
+ rhtml = /HTML$/i,
+ rinputs = /^(?:input|select|textarea|button)$/i,
+ rheader = /^h\d$/i,
+
+ rnative = /^[^{]+\{\s*\[native \w/,
+
+ // Easily-parseable/retrievable ID or TAG or CLASS selectors
+ rquickExpr = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,
+
+ rsibling = /[+~]/,
+
+ // CSS escapes
+ // http://www.w3.org/TR/CSS21/syndata.html#escaped-characters
+ runescape = new RegExp( "\\\\([\\da-f]{1,6}" + whitespace + "?|(" + whitespace + ")|.)", "ig" ),
+ funescape = function( _, escaped, escapedWhitespace ) {
+ var high = "0x" + escaped - 0x10000;
+ // NaN means non-codepoint
+ // Support: Firefox<24
+ // Workaround erroneous numeric interpretation of +"0x"
+ return high !== high || escapedWhitespace ?
+ escaped :
+ high < 0 ?
+ // BMP codepoint
+ String.fromCharCode( high + 0x10000 ) :
+ // Supplemental Plane codepoint (surrogate pair)
+ String.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 );
+ },
+
+ // CSS string/identifier serialization
+ // https://drafts.csswg.org/cssom/#common-serializing-idioms
+ rcssescape = /([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,
+ fcssescape = function( ch, asCodePoint ) {
+ if ( asCodePoint ) {
+
+ // U+0000 NULL becomes U+FFFD REPLACEMENT CHARACTER
+ if ( ch === "\0" ) {
+ return "\uFFFD";
+ }
+
+ // Control characters and (dependent upon position) numbers get escaped as code points
+ return ch.slice( 0, -1 ) + "\\" + ch.charCodeAt( ch.length - 1 ).toString( 16 ) + " ";
+ }
+
+ // Other potentially-special ASCII characters get backslash-escaped
+ return "\\" + ch;
+ },
+
+ // Used for iframes
+ // See setDocument()
+ // Removing the function wrapper causes a "Permission Denied"
+ // error in IE
+ unloadHandler = function() {
+ setDocument();
+ },
+
+ inDisabledFieldset = addCombinator(
+ function( elem ) {
+ return elem.disabled === true && elem.nodeName.toLowerCase() === "fieldset";
+ },
+ { dir: "parentNode", next: "legend" }
+ );
+
+// Optimize for push.apply( _, NodeList )
+try {
+ push.apply(
+ (arr = slice.call( preferredDoc.childNodes )),
+ preferredDoc.childNodes
+ );
+ // Support: Android<4.0
+ // Detect silently failing push.apply
+ arr[ preferredDoc.childNodes.length ].nodeType;
+} catch ( e ) {
+ push = { apply: arr.length ?
+
+ // Leverage slice if possible
+ function( target, els ) {
+ push_native.apply( target, slice.call(els) );
+ } :
+
+ // Support: IE<9
+ // Otherwise append directly
+ function( target, els ) {
+ var j = target.length,
+ i = 0;
+ // Can't trust NodeList.length
+ while ( (target[j++] = els[i++]) ) {}
+ target.length = j - 1;
+ }
+ };
+}
+
+function Sizzle( selector, context, results, seed ) {
+ var m, i, elem, nid, match, groups, newSelector,
+ newContext = context && context.ownerDocument,
+
+ // nodeType defaults to 9, since context defaults to document
+ nodeType = context ? context.nodeType : 9;
+
+ results = results || [];
+
+ // Return early from calls with invalid selector or context
+ if ( typeof selector !== "string" || !selector ||
+ nodeType !== 1 && nodeType !== 9 && nodeType !== 11 ) {
+
+ return results;
+ }
+
+ // Try to shortcut find operations (as opposed to filters) in HTML documents
+ if ( !seed ) {
+
+ if ( ( context ? context.ownerDocument || context : preferredDoc ) !== document ) {
+ setDocument( context );
+ }
+ context = context || document;
+
+ if ( documentIsHTML ) {
+
+ // If the selector is sufficiently simple, try using a "get*By*" DOM method
+ // (excepting DocumentFragment context, where the methods don't exist)
+ if ( nodeType !== 11 && (match = rquickExpr.exec( selector )) ) {
+
+ // ID selector
+ if ( (m = match[1]) ) {
+
+ // Document context
+ if ( nodeType === 9 ) {
+ if ( (elem = context.getElementById( m )) ) {
+
+ // Support: IE, Opera, Webkit
+ // TODO: identify versions
+ // getElementById can match elements by name instead of ID
+ if ( elem.id === m ) {
+ results.push( elem );
+ return results;
+ }
+ } else {
+ return results;
+ }
+
+ // Element context
+ } else {
+
+ // Support: IE, Opera, Webkit
+ // TODO: identify versions
+ // getElementById can match elements by name instead of ID
+ if ( newContext && (elem = newContext.getElementById( m )) &&
+ contains( context, elem ) &&
+ elem.id === m ) {
+
+ results.push( elem );
+ return results;
+ }
+ }
+
+ // Type selector
+ } else if ( match[2] ) {
+ push.apply( results, context.getElementsByTagName( selector ) );
+ return results;
+
+ // Class selector
+ } else if ( (m = match[3]) && support.getElementsByClassName &&
+ context.getElementsByClassName ) {
+
+ push.apply( results, context.getElementsByClassName( m ) );
+ return results;
+ }
+ }
+
+ // Take advantage of querySelectorAll
+ if ( support.qsa &&
+ !nonnativeSelectorCache[ selector + " " ] &&
+ (!rbuggyQSA || !rbuggyQSA.test( selector )) &&
+
+ // Support: IE 8 only
+ // Exclude object elements
+ (nodeType !== 1 || context.nodeName.toLowerCase() !== "object") ) {
+
+ newSelector = selector;
+ newContext = context;
+
+ // qSA considers elements outside a scoping root when evaluating child or
+ // descendant combinators, which is not what we want.
+ // In such cases, we work around the behavior by prefixing every selector in the
+ // list with an ID selector referencing the scope context.
+ // Thanks to Andrew Dupont for this technique.
+ if ( nodeType === 1 && rdescend.test( selector ) ) {
+
+ // Capture the context ID, setting it first if necessary
+ if ( (nid = context.getAttribute( "id" )) ) {
+ nid = nid.replace( rcssescape, fcssescape );
+ } else {
+ context.setAttribute( "id", (nid = expando) );
+ }
+
+ // Prefix every selector in the list
+ groups = tokenize( selector );
+ i = groups.length;
+ while ( i-- ) {
+ groups[i] = "#" + nid + " " + toSelector( groups[i] );
+ }
+ newSelector = groups.join( "," );
+
+ // Expand context for sibling selectors
+ newContext = rsibling.test( selector ) && testContext( context.parentNode ) ||
+ context;
+ }
+
+ try {
+ push.apply( results,
+ newContext.querySelectorAll( newSelector )
+ );
+ return results;
+ } catch ( qsaError ) {
+ nonnativeSelectorCache( selector, true );
+ } finally {
+ if ( nid === expando ) {
+ context.removeAttribute( "id" );
+ }
+ }
+ }
+ }
+ }
+
+ // All others
+ return select( selector.replace( rtrim, "$1" ), context, results, seed );
+}
+
+/**
+ * Create key-value caches of limited size
+ * @returns {function(string, object)} Returns the Object data after storing it on itself with
+ * property name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength)
+ * deleting the oldest entry
+ */
+function createCache() {
+ var keys = [];
+
+ function cache( key, value ) {
+ // Use (key + " ") to avoid collision with native prototype properties (see Issue #157)
+ if ( keys.push( key + " " ) > Expr.cacheLength ) {
+ // Only keep the most recent entries
+ delete cache[ keys.shift() ];
+ }
+ return (cache[ key + " " ] = value);
+ }
+ return cache;
+}
+
+/**
+ * Mark a function for special use by Sizzle
+ * @param {Function} fn The function to mark
+ */
+function markFunction( fn ) {
+ fn[ expando ] = true;
+ return fn;
+}
+
+/**
+ * Support testing using an element
+ * @param {Function} fn Passed the created element and returns a boolean result
+ */
+function assert( fn ) {
+ var el = document.createElement("fieldset");
+
+ try {
+ return !!fn( el );
+ } catch (e) {
+ return false;
+ } finally {
+ // Remove from its parent by default
+ if ( el.parentNode ) {
+ el.parentNode.removeChild( el );
+ }
+ // release memory in IE
+ el = null;
+ }
+}
+
+/**
+ * Adds the same handler for all of the specified attrs
+ * @param {String} attrs Pipe-separated list of attributes
+ * @param {Function} handler The method that will be applied
+ */
+function addHandle( attrs, handler ) {
+ var arr = attrs.split("|"),
+ i = arr.length;
+
+ while ( i-- ) {
+ Expr.attrHandle[ arr[i] ] = handler;
+ }
+}
+
+/**
+ * Checks document order of two siblings
+ * @param {Element} a
+ * @param {Element} b
+ * @returns {Number} Returns less than 0 if a precedes b, greater than 0 if a follows b
+ */
+function siblingCheck( a, b ) {
+ var cur = b && a,
+ diff = cur && a.nodeType === 1 && b.nodeType === 1 &&
+ a.sourceIndex - b.sourceIndex;
+
+ // Use IE sourceIndex if available on both nodes
+ if ( diff ) {
+ return diff;
+ }
+
+ // Check if b follows a
+ if ( cur ) {
+ while ( (cur = cur.nextSibling) ) {
+ if ( cur === b ) {
+ return -1;
+ }
+ }
+ }
+
+ return a ? 1 : -1;
+}
+
+/**
+ * Returns a function to use in pseudos for input types
+ * @param {String} type
+ */
+function createInputPseudo( type ) {
+ return function( elem ) {
+ var name = elem.nodeName.toLowerCase();
+ return name === "input" && elem.type === type;
+ };
+}
+
+/**
+ * Returns a function to use in pseudos for buttons
+ * @param {String} type
+ */
+function createButtonPseudo( type ) {
+ return function( elem ) {
+ var name = elem.nodeName.toLowerCase();
+ return (name === "input" || name === "button") && elem.type === type;
+ };
+}
+
+/**
+ * Returns a function to use in pseudos for :enabled/:disabled
+ * @param {Boolean} disabled true for :disabled; false for :enabled
+ */
+function createDisabledPseudo( disabled ) {
+
+ // Known :disabled false positives: fieldset[disabled] > legend:nth-of-type(n+2) :can-disable
+ return function( elem ) {
+
+ // Only certain elements can match :enabled or :disabled
+ // https://html.spec.whatwg.org/multipage/scripting.html#selector-enabled
+ // https://html.spec.whatwg.org/multipage/scripting.html#selector-disabled
+ if ( "form" in elem ) {
+
+ // Check for inherited disabledness on relevant non-disabled elements:
+ // * listed form-associated elements in a disabled fieldset
+ // https://html.spec.whatwg.org/multipage/forms.html#category-listed
+ // https://html.spec.whatwg.org/multipage/forms.html#concept-fe-disabled
+ // * option elements in a disabled optgroup
+ // https://html.spec.whatwg.org/multipage/forms.html#concept-option-disabled
+ // All such elements have a "form" property.
+ if ( elem.parentNode && elem.disabled === false ) {
+
+ // Option elements defer to a parent optgroup if present
+ if ( "label" in elem ) {
+ if ( "label" in elem.parentNode ) {
+ return elem.parentNode.disabled === disabled;
+ } else {
+ return elem.disabled === disabled;
+ }
+ }
+
+ // Support: IE 6 - 11
+ // Use the isDisabled shortcut property to check for disabled fieldset ancestors
+ return elem.isDisabled === disabled ||
+
+ // Where there is no isDisabled, check manually
+ /* jshint -W018 */
+ elem.isDisabled !== !disabled &&
+ inDisabledFieldset( elem ) === disabled;
+ }
+
+ return elem.disabled === disabled;
+
+ // Try to winnow out elements that can't be disabled before trusting the disabled property.
+ // Some victims get caught in our net (label, legend, menu, track), but it shouldn't
+ // even exist on them, let alone have a boolean value.
+ } else if ( "label" in elem ) {
+ return elem.disabled === disabled;
+ }
+
+ // Remaining elements are neither :enabled nor :disabled
+ return false;
+ };
+}
+
+/**
+ * Returns a function to use in pseudos for positionals
+ * @param {Function} fn
+ */
+function createPositionalPseudo( fn ) {
+ return markFunction(function( argument ) {
+ argument = +argument;
+ return markFunction(function( seed, matches ) {
+ var j,
+ matchIndexes = fn( [], seed.length, argument ),
+ i = matchIndexes.length;
+
+ // Match elements found at the specified indexes
+ while ( i-- ) {
+ if ( seed[ (j = matchIndexes[i]) ] ) {
+ seed[j] = !(matches[j] = seed[j]);
+ }
+ }
+ });
+ });
+}
+
+/**
+ * Checks a node for validity as a Sizzle context
+ * @param {Element|Object=} context
+ * @returns {Element|Object|Boolean} The input node if acceptable, otherwise a falsy value
+ */
+function testContext( context ) {
+ return context && typeof context.getElementsByTagName !== "undefined" && context;
+}
+
+// Expose support vars for convenience
+support = Sizzle.support = {};
+
+/**
+ * Detects XML nodes
+ * @param {Element|Object} elem An element or a document
+ * @returns {Boolean} True iff elem is a non-HTML XML node
+ */
+isXML = Sizzle.isXML = function( elem ) {
+ var namespace = elem.namespaceURI,
+ docElem = (elem.ownerDocument || elem).documentElement;
+
+ // Support: IE <=8
+ // Assume HTML when documentElement doesn't yet exist, such as inside loading iframes
+ // https://bugs.jquery.com/ticket/4833
+ return !rhtml.test( namespace || docElem && docElem.nodeName || "HTML" );
+};
+
+/**
+ * Sets document-related variables once based on the current document
+ * @param {Element|Object} [doc] An element or document object to use to set the document
+ * @returns {Object} Returns the current document
+ */
+setDocument = Sizzle.setDocument = function( node ) {
+ var hasCompare, subWindow,
+ doc = node ? node.ownerDocument || node : preferredDoc;
+
+ // Return early if doc is invalid or already selected
+ if ( doc === document || doc.nodeType !== 9 || !doc.documentElement ) {
+ return document;
+ }
+
+ // Update global variables
+ document = doc;
+ docElem = document.documentElement;
+ documentIsHTML = !isXML( document );
+
+ // Support: IE 9-11, Edge
+ // Accessing iframe documents after unload throws "permission denied" errors (jQuery #13936)
+ if ( preferredDoc !== document &&
+ (subWindow = document.defaultView) && subWindow.top !== subWindow ) {
+
+ // Support: IE 11, Edge
+ if ( subWindow.addEventListener ) {
+ subWindow.addEventListener( "unload", unloadHandler, false );
+
+ // Support: IE 9 - 10 only
+ } else if ( subWindow.attachEvent ) {
+ subWindow.attachEvent( "onunload", unloadHandler );
+ }
+ }
+
+ /* Attributes
+ ---------------------------------------------------------------------- */
+
+ // Support: IE<8
+ // Verify that getAttribute really returns attributes and not properties
+ // (excepting IE8 booleans)
+ support.attributes = assert(function( el ) {
+ el.className = "i";
+ return !el.getAttribute("className");
+ });
+
+ /* getElement(s)By*
+ ---------------------------------------------------------------------- */
+
+ // Check if getElementsByTagName("*") returns only elements
+ support.getElementsByTagName = assert(function( el ) {
+ el.appendChild( document.createComment("") );
+ return !el.getElementsByTagName("*").length;
+ });
+
+ // Support: IE<9
+ support.getElementsByClassName = rnative.test( document.getElementsByClassName );
+
+ // Support: IE<10
+ // Check if getElementById returns elements by name
+ // The broken getElementById methods don't pick up programmatically-set names,
+ // so use a roundabout getElementsByName test
+ support.getById = assert(function( el ) {
+ docElem.appendChild( el ).id = expando;
+ return !document.getElementsByName || !document.getElementsByName( expando ).length;
+ });
+
+ // ID filter and find
+ if ( support.getById ) {
+ Expr.filter["ID"] = function( id ) {
+ var attrId = id.replace( runescape, funescape );
+ return function( elem ) {
+ return elem.getAttribute("id") === attrId;
+ };
+ };
+ Expr.find["ID"] = function( id, context ) {
+ if ( typeof context.getElementById !== "undefined" && documentIsHTML ) {
+ var elem = context.getElementById( id );
+ return elem ? [ elem ] : [];
+ }
+ };
+ } else {
+ Expr.filter["ID"] = function( id ) {
+ var attrId = id.replace( runescape, funescape );
+ return function( elem ) {
+ var node = typeof elem.getAttributeNode !== "undefined" &&
+ elem.getAttributeNode("id");
+ return node && node.value === attrId;
+ };
+ };
+
+ // Support: IE 6 - 7 only
+ // getElementById is not reliable as a find shortcut
+ Expr.find["ID"] = function( id, context ) {
+ if ( typeof context.getElementById !== "undefined" && documentIsHTML ) {
+ var node, i, elems,
+ elem = context.getElementById( id );
+
+ if ( elem ) {
+
+ // Verify the id attribute
+ node = elem.getAttributeNode("id");
+ if ( node && node.value === id ) {
+ return [ elem ];
+ }
+
+ // Fall back on getElementsByName
+ elems = context.getElementsByName( id );
+ i = 0;
+ while ( (elem = elems[i++]) ) {
+ node = elem.getAttributeNode("id");
+ if ( node && node.value === id ) {
+ return [ elem ];
+ }
+ }
+ }
+
+ return [];
+ }
+ };
+ }
+
+ // Tag
+ Expr.find["TAG"] = support.getElementsByTagName ?
+ function( tag, context ) {
+ if ( typeof context.getElementsByTagName !== "undefined" ) {
+ return context.getElementsByTagName( tag );
+
+ // DocumentFragment nodes don't have gEBTN
+ } else if ( support.qsa ) {
+ return context.querySelectorAll( tag );
+ }
+ } :
+
+ function( tag, context ) {
+ var elem,
+ tmp = [],
+ i = 0,
+ // By happy coincidence, a (broken) gEBTN appears on DocumentFragment nodes too
+ results = context.getElementsByTagName( tag );
+
+ // Filter out possible comments
+ if ( tag === "*" ) {
+ while ( (elem = results[i++]) ) {
+ if ( elem.nodeType === 1 ) {
+ tmp.push( elem );
+ }
+ }
+
+ return tmp;
+ }
+ return results;
+ };
+
+ // Class
+ Expr.find["CLASS"] = support.getElementsByClassName && function( className, context ) {
+ if ( typeof context.getElementsByClassName !== "undefined" && documentIsHTML ) {
+ return context.getElementsByClassName( className );
+ }
+ };
+
+ /* QSA/matchesSelector
+ ---------------------------------------------------------------------- */
+
+ // QSA and matchesSelector support
+
+ // matchesSelector(:active) reports false when true (IE9/Opera 11.5)
+ rbuggyMatches = [];
+
+ // qSa(:focus) reports false when true (Chrome 21)
+ // We allow this because of a bug in IE8/9 that throws an error
+ // whenever `document.activeElement` is accessed on an iframe
+ // So, we allow :focus to pass through QSA all the time to avoid the IE error
+ // See https://bugs.jquery.com/ticket/13378
+ rbuggyQSA = [];
+
+ if ( (support.qsa = rnative.test( document.querySelectorAll )) ) {
+ // Build QSA regex
+ // Regex strategy adopted from Diego Perini
+ assert(function( el ) {
+ // Select is set to empty string on purpose
+ // This is to test IE's treatment of not explicitly
+ // setting a boolean content attribute,
+ // since its presence should be enough
+ // https://bugs.jquery.com/ticket/12359
+ docElem.appendChild( el ).innerHTML = " " +
+ "" +
+ " ";
+
+ // Support: IE8, Opera 11-12.16
+ // Nothing should be selected when empty strings follow ^= or $= or *=
+ // The test attribute must be unknown in Opera but "safe" for WinRT
+ // https://msdn.microsoft.com/en-us/library/ie/hh465388.aspx#attribute_section
+ if ( el.querySelectorAll("[msallowcapture^='']").length ) {
+ rbuggyQSA.push( "[*^$]=" + whitespace + "*(?:''|\"\")" );
+ }
+
+ // Support: IE8
+ // Boolean attributes and "value" are not treated correctly
+ if ( !el.querySelectorAll("[selected]").length ) {
+ rbuggyQSA.push( "\\[" + whitespace + "*(?:value|" + booleans + ")" );
+ }
+
+ // Support: Chrome<29, Android<4.4, Safari<7.0+, iOS<7.0+, PhantomJS<1.9.8+
+ if ( !el.querySelectorAll( "[id~=" + expando + "-]" ).length ) {
+ rbuggyQSA.push("~=");
+ }
+
+ // Webkit/Opera - :checked should return selected option elements
+ // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked
+ // IE8 throws error here and will not see later tests
+ if ( !el.querySelectorAll(":checked").length ) {
+ rbuggyQSA.push(":checked");
+ }
+
+ // Support: Safari 8+, iOS 8+
+ // https://bugs.webkit.org/show_bug.cgi?id=136851
+ // In-page `selector#id sibling-combinator selector` fails
+ if ( !el.querySelectorAll( "a#" + expando + "+*" ).length ) {
+ rbuggyQSA.push(".#.+[+~]");
+ }
+ });
+
+ assert(function( el ) {
+ el.innerHTML = " " +
+ " ";
+
+ // Support: Windows 8 Native Apps
+ // The type and name attributes are restricted during .innerHTML assignment
+ var input = document.createElement("input");
+ input.setAttribute( "type", "hidden" );
+ el.appendChild( input ).setAttribute( "name", "D" );
+
+ // Support: IE8
+ // Enforce case-sensitivity of name attribute
+ if ( el.querySelectorAll("[name=d]").length ) {
+ rbuggyQSA.push( "name" + whitespace + "*[*^$|!~]?=" );
+ }
+
+ // FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled)
+ // IE8 throws error here and will not see later tests
+ if ( el.querySelectorAll(":enabled").length !== 2 ) {
+ rbuggyQSA.push( ":enabled", ":disabled" );
+ }
+
+ // Support: IE9-11+
+ // IE's :disabled selector does not pick up the children of disabled fieldsets
+ docElem.appendChild( el ).disabled = true;
+ if ( el.querySelectorAll(":disabled").length !== 2 ) {
+ rbuggyQSA.push( ":enabled", ":disabled" );
+ }
+
+ // Opera 10-11 does not throw on post-comma invalid pseudos
+ el.querySelectorAll("*,:x");
+ rbuggyQSA.push(",.*:");
+ });
+ }
+
+ if ( (support.matchesSelector = rnative.test( (matches = docElem.matches ||
+ docElem.webkitMatchesSelector ||
+ docElem.mozMatchesSelector ||
+ docElem.oMatchesSelector ||
+ docElem.msMatchesSelector) )) ) {
+
+ assert(function( el ) {
+ // Check to see if it's possible to do matchesSelector
+ // on a disconnected node (IE 9)
+ support.disconnectedMatch = matches.call( el, "*" );
+
+ // This should fail with an exception
+ // Gecko does not error, returns false instead
+ matches.call( el, "[s!='']:x" );
+ rbuggyMatches.push( "!=", pseudos );
+ });
+ }
+
+ rbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join("|") );
+ rbuggyMatches = rbuggyMatches.length && new RegExp( rbuggyMatches.join("|") );
+
+ /* Contains
+ ---------------------------------------------------------------------- */
+ hasCompare = rnative.test( docElem.compareDocumentPosition );
+
+ // Element contains another
+ // Purposefully self-exclusive
+ // As in, an element does not contain itself
+ contains = hasCompare || rnative.test( docElem.contains ) ?
+ function( a, b ) {
+ var adown = a.nodeType === 9 ? a.documentElement : a,
+ bup = b && b.parentNode;
+ return a === bup || !!( bup && bup.nodeType === 1 && (
+ adown.contains ?
+ adown.contains( bup ) :
+ a.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16
+ ));
+ } :
+ function( a, b ) {
+ if ( b ) {
+ while ( (b = b.parentNode) ) {
+ if ( b === a ) {
+ return true;
+ }
+ }
+ }
+ return false;
+ };
+
+ /* Sorting
+ ---------------------------------------------------------------------- */
+
+ // Document order sorting
+ sortOrder = hasCompare ?
+ function( a, b ) {
+
+ // Flag for duplicate removal
+ if ( a === b ) {
+ hasDuplicate = true;
+ return 0;
+ }
+
+ // Sort on method existence if only one input has compareDocumentPosition
+ var compare = !a.compareDocumentPosition - !b.compareDocumentPosition;
+ if ( compare ) {
+ return compare;
+ }
+
+ // Calculate position if both inputs belong to the same document
+ compare = ( a.ownerDocument || a ) === ( b.ownerDocument || b ) ?
+ a.compareDocumentPosition( b ) :
+
+ // Otherwise we know they are disconnected
+ 1;
+
+ // Disconnected nodes
+ if ( compare & 1 ||
+ (!support.sortDetached && b.compareDocumentPosition( a ) === compare) ) {
+
+ // Choose the first element that is related to our preferred document
+ if ( a === document || a.ownerDocument === preferredDoc && contains(preferredDoc, a) ) {
+ return -1;
+ }
+ if ( b === document || b.ownerDocument === preferredDoc && contains(preferredDoc, b) ) {
+ return 1;
+ }
+
+ // Maintain original order
+ return sortInput ?
+ ( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) :
+ 0;
+ }
+
+ return compare & 4 ? -1 : 1;
+ } :
+ function( a, b ) {
+ // Exit early if the nodes are identical
+ if ( a === b ) {
+ hasDuplicate = true;
+ return 0;
+ }
+
+ var cur,
+ i = 0,
+ aup = a.parentNode,
+ bup = b.parentNode,
+ ap = [ a ],
+ bp = [ b ];
+
+ // Parentless nodes are either documents or disconnected
+ if ( !aup || !bup ) {
+ return a === document ? -1 :
+ b === document ? 1 :
+ aup ? -1 :
+ bup ? 1 :
+ sortInput ?
+ ( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) :
+ 0;
+
+ // If the nodes are siblings, we can do a quick check
+ } else if ( aup === bup ) {
+ return siblingCheck( a, b );
+ }
+
+ // Otherwise we need full lists of their ancestors for comparison
+ cur = a;
+ while ( (cur = cur.parentNode) ) {
+ ap.unshift( cur );
+ }
+ cur = b;
+ while ( (cur = cur.parentNode) ) {
+ bp.unshift( cur );
+ }
+
+ // Walk down the tree looking for a discrepancy
+ while ( ap[i] === bp[i] ) {
+ i++;
+ }
+
+ return i ?
+ // Do a sibling check if the nodes have a common ancestor
+ siblingCheck( ap[i], bp[i] ) :
+
+ // Otherwise nodes in our document sort first
+ ap[i] === preferredDoc ? -1 :
+ bp[i] === preferredDoc ? 1 :
+ 0;
+ };
+
+ return document;
+};
+
+Sizzle.matches = function( expr, elements ) {
+ return Sizzle( expr, null, null, elements );
+};
+
+Sizzle.matchesSelector = function( elem, expr ) {
+ // Set document vars if needed
+ if ( ( elem.ownerDocument || elem ) !== document ) {
+ setDocument( elem );
+ }
+
+ if ( support.matchesSelector && documentIsHTML &&
+ !nonnativeSelectorCache[ expr + " " ] &&
+ ( !rbuggyMatches || !rbuggyMatches.test( expr ) ) &&
+ ( !rbuggyQSA || !rbuggyQSA.test( expr ) ) ) {
+
+ try {
+ var ret = matches.call( elem, expr );
+
+ // IE 9's matchesSelector returns false on disconnected nodes
+ if ( ret || support.disconnectedMatch ||
+ // As well, disconnected nodes are said to be in a document
+ // fragment in IE 9
+ elem.document && elem.document.nodeType !== 11 ) {
+ return ret;
+ }
+ } catch (e) {
+ nonnativeSelectorCache( expr, true );
+ }
+ }
+
+ return Sizzle( expr, document, null, [ elem ] ).length > 0;
+};
+
+Sizzle.contains = function( context, elem ) {
+ // Set document vars if needed
+ if ( ( context.ownerDocument || context ) !== document ) {
+ setDocument( context );
+ }
+ return contains( context, elem );
+};
+
+Sizzle.attr = function( elem, name ) {
+ // Set document vars if needed
+ if ( ( elem.ownerDocument || elem ) !== document ) {
+ setDocument( elem );
+ }
+
+ var fn = Expr.attrHandle[ name.toLowerCase() ],
+ // Don't get fooled by Object.prototype properties (jQuery #13807)
+ val = fn && hasOwn.call( Expr.attrHandle, name.toLowerCase() ) ?
+ fn( elem, name, !documentIsHTML ) :
+ undefined;
+
+ return val !== undefined ?
+ val :
+ support.attributes || !documentIsHTML ?
+ elem.getAttribute( name ) :
+ (val = elem.getAttributeNode(name)) && val.specified ?
+ val.value :
+ null;
+};
+
+Sizzle.escape = function( sel ) {
+ return (sel + "").replace( rcssescape, fcssescape );
+};
+
+Sizzle.error = function( msg ) {
+ throw new Error( "Syntax error, unrecognized expression: " + msg );
+};
+
+/**
+ * Document sorting and removing duplicates
+ * @param {ArrayLike} results
+ */
+Sizzle.uniqueSort = function( results ) {
+ var elem,
+ duplicates = [],
+ j = 0,
+ i = 0;
+
+ // Unless we *know* we can detect duplicates, assume their presence
+ hasDuplicate = !support.detectDuplicates;
+ sortInput = !support.sortStable && results.slice( 0 );
+ results.sort( sortOrder );
+
+ if ( hasDuplicate ) {
+ while ( (elem = results[i++]) ) {
+ if ( elem === results[ i ] ) {
+ j = duplicates.push( i );
+ }
+ }
+ while ( j-- ) {
+ results.splice( duplicates[ j ], 1 );
+ }
+ }
+
+ // Clear input after sorting to release objects
+ // See https://github.com/jquery/sizzle/pull/225
+ sortInput = null;
+
+ return results;
+};
+
+/**
+ * Utility function for retrieving the text value of an array of DOM nodes
+ * @param {Array|Element} elem
+ */
+getText = Sizzle.getText = function( elem ) {
+ var node,
+ ret = "",
+ i = 0,
+ nodeType = elem.nodeType;
+
+ if ( !nodeType ) {
+ // If no nodeType, this is expected to be an array
+ while ( (node = elem[i++]) ) {
+ // Do not traverse comment nodes
+ ret += getText( node );
+ }
+ } else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) {
+ // Use textContent for elements
+ // innerText usage removed for consistency of new lines (jQuery #11153)
+ if ( typeof elem.textContent === "string" ) {
+ return elem.textContent;
+ } else {
+ // Traverse its children
+ for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {
+ ret += getText( elem );
+ }
+ }
+ } else if ( nodeType === 3 || nodeType === 4 ) {
+ return elem.nodeValue;
+ }
+ // Do not include comment or processing instruction nodes
+
+ return ret;
+};
+
+Expr = Sizzle.selectors = {
+
+ // Can be adjusted by the user
+ cacheLength: 50,
+
+ createPseudo: markFunction,
+
+ match: matchExpr,
+
+ attrHandle: {},
+
+ find: {},
+
+ relative: {
+ ">": { dir: "parentNode", first: true },
+ " ": { dir: "parentNode" },
+ "+": { dir: "previousSibling", first: true },
+ "~": { dir: "previousSibling" }
+ },
+
+ preFilter: {
+ "ATTR": function( match ) {
+ match[1] = match[1].replace( runescape, funescape );
+
+ // Move the given value to match[3] whether quoted or unquoted
+ match[3] = ( match[3] || match[4] || match[5] || "" ).replace( runescape, funescape );
+
+ if ( match[2] === "~=" ) {
+ match[3] = " " + match[3] + " ";
+ }
+
+ return match.slice( 0, 4 );
+ },
+
+ "CHILD": function( match ) {
+ /* matches from matchExpr["CHILD"]
+ 1 type (only|nth|...)
+ 2 what (child|of-type)
+ 3 argument (even|odd|\d*|\d*n([+-]\d+)?|...)
+ 4 xn-component of xn+y argument ([+-]?\d*n|)
+ 5 sign of xn-component
+ 6 x of xn-component
+ 7 sign of y-component
+ 8 y of y-component
+ */
+ match[1] = match[1].toLowerCase();
+
+ if ( match[1].slice( 0, 3 ) === "nth" ) {
+ // nth-* requires argument
+ if ( !match[3] ) {
+ Sizzle.error( match[0] );
+ }
+
+ // numeric x and y parameters for Expr.filter.CHILD
+ // remember that false/true cast respectively to 0/1
+ match[4] = +( match[4] ? match[5] + (match[6] || 1) : 2 * ( match[3] === "even" || match[3] === "odd" ) );
+ match[5] = +( ( match[7] + match[8] ) || match[3] === "odd" );
+
+ // other types prohibit arguments
+ } else if ( match[3] ) {
+ Sizzle.error( match[0] );
+ }
+
+ return match;
+ },
+
+ "PSEUDO": function( match ) {
+ var excess,
+ unquoted = !match[6] && match[2];
+
+ if ( matchExpr["CHILD"].test( match[0] ) ) {
+ return null;
+ }
+
+ // Accept quoted arguments as-is
+ if ( match[3] ) {
+ match[2] = match[4] || match[5] || "";
+
+ // Strip excess characters from unquoted arguments
+ } else if ( unquoted && rpseudo.test( unquoted ) &&
+ // Get excess from tokenize (recursively)
+ (excess = tokenize( unquoted, true )) &&
+ // advance to the next closing parenthesis
+ (excess = unquoted.indexOf( ")", unquoted.length - excess ) - unquoted.length) ) {
+
+ // excess is a negative index
+ match[0] = match[0].slice( 0, excess );
+ match[2] = unquoted.slice( 0, excess );
+ }
+
+ // Return only captures needed by the pseudo filter method (type and argument)
+ return match.slice( 0, 3 );
+ }
+ },
+
+ filter: {
+
+ "TAG": function( nodeNameSelector ) {
+ var nodeName = nodeNameSelector.replace( runescape, funescape ).toLowerCase();
+ return nodeNameSelector === "*" ?
+ function() { return true; } :
+ function( elem ) {
+ return elem.nodeName && elem.nodeName.toLowerCase() === nodeName;
+ };
+ },
+
+ "CLASS": function( className ) {
+ var pattern = classCache[ className + " " ];
+
+ return pattern ||
+ (pattern = new RegExp( "(^|" + whitespace + ")" + className + "(" + whitespace + "|$)" )) &&
+ classCache( className, function( elem ) {
+ return pattern.test( typeof elem.className === "string" && elem.className || typeof elem.getAttribute !== "undefined" && elem.getAttribute("class") || "" );
+ });
+ },
+
+ "ATTR": function( name, operator, check ) {
+ return function( elem ) {
+ var result = Sizzle.attr( elem, name );
+
+ if ( result == null ) {
+ return operator === "!=";
+ }
+ if ( !operator ) {
+ return true;
+ }
+
+ result += "";
+
+ return operator === "=" ? result === check :
+ operator === "!=" ? result !== check :
+ operator === "^=" ? check && result.indexOf( check ) === 0 :
+ operator === "*=" ? check && result.indexOf( check ) > -1 :
+ operator === "$=" ? check && result.slice( -check.length ) === check :
+ operator === "~=" ? ( " " + result.replace( rwhitespace, " " ) + " " ).indexOf( check ) > -1 :
+ operator === "|=" ? result === check || result.slice( 0, check.length + 1 ) === check + "-" :
+ false;
+ };
+ },
+
+ "CHILD": function( type, what, argument, first, last ) {
+ var simple = type.slice( 0, 3 ) !== "nth",
+ forward = type.slice( -4 ) !== "last",
+ ofType = what === "of-type";
+
+ return first === 1 && last === 0 ?
+
+ // Shortcut for :nth-*(n)
+ function( elem ) {
+ return !!elem.parentNode;
+ } :
+
+ function( elem, context, xml ) {
+ var cache, uniqueCache, outerCache, node, nodeIndex, start,
+ dir = simple !== forward ? "nextSibling" : "previousSibling",
+ parent = elem.parentNode,
+ name = ofType && elem.nodeName.toLowerCase(),
+ useCache = !xml && !ofType,
+ diff = false;
+
+ if ( parent ) {
+
+ // :(first|last|only)-(child|of-type)
+ if ( simple ) {
+ while ( dir ) {
+ node = elem;
+ while ( (node = node[ dir ]) ) {
+ if ( ofType ?
+ node.nodeName.toLowerCase() === name :
+ node.nodeType === 1 ) {
+
+ return false;
+ }
+ }
+ // Reverse direction for :only-* (if we haven't yet done so)
+ start = dir = type === "only" && !start && "nextSibling";
+ }
+ return true;
+ }
+
+ start = [ forward ? parent.firstChild : parent.lastChild ];
+
+ // non-xml :nth-child(...) stores cache data on `parent`
+ if ( forward && useCache ) {
+
+ // Seek `elem` from a previously-cached index
+
+ // ...in a gzip-friendly way
+ node = parent;
+ outerCache = node[ expando ] || (node[ expando ] = {});
+
+ // Support: IE <9 only
+ // Defend against cloned attroperties (jQuery gh-1709)
+ uniqueCache = outerCache[ node.uniqueID ] ||
+ (outerCache[ node.uniqueID ] = {});
+
+ cache = uniqueCache[ type ] || [];
+ nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ];
+ diff = nodeIndex && cache[ 2 ];
+ node = nodeIndex && parent.childNodes[ nodeIndex ];
+
+ while ( (node = ++nodeIndex && node && node[ dir ] ||
+
+ // Fallback to seeking `elem` from the start
+ (diff = nodeIndex = 0) || start.pop()) ) {
+
+ // When found, cache indexes on `parent` and break
+ if ( node.nodeType === 1 && ++diff && node === elem ) {
+ uniqueCache[ type ] = [ dirruns, nodeIndex, diff ];
+ break;
+ }
+ }
+
+ } else {
+ // Use previously-cached element index if available
+ if ( useCache ) {
+ // ...in a gzip-friendly way
+ node = elem;
+ outerCache = node[ expando ] || (node[ expando ] = {});
+
+ // Support: IE <9 only
+ // Defend against cloned attroperties (jQuery gh-1709)
+ uniqueCache = outerCache[ node.uniqueID ] ||
+ (outerCache[ node.uniqueID ] = {});
+
+ cache = uniqueCache[ type ] || [];
+ nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ];
+ diff = nodeIndex;
+ }
+
+ // xml :nth-child(...)
+ // or :nth-last-child(...) or :nth(-last)?-of-type(...)
+ if ( diff === false ) {
+ // Use the same loop as above to seek `elem` from the start
+ while ( (node = ++nodeIndex && node && node[ dir ] ||
+ (diff = nodeIndex = 0) || start.pop()) ) {
+
+ if ( ( ofType ?
+ node.nodeName.toLowerCase() === name :
+ node.nodeType === 1 ) &&
+ ++diff ) {
+
+ // Cache the index of each encountered element
+ if ( useCache ) {
+ outerCache = node[ expando ] || (node[ expando ] = {});
+
+ // Support: IE <9 only
+ // Defend against cloned attroperties (jQuery gh-1709)
+ uniqueCache = outerCache[ node.uniqueID ] ||
+ (outerCache[ node.uniqueID ] = {});
+
+ uniqueCache[ type ] = [ dirruns, diff ];
+ }
+
+ if ( node === elem ) {
+ break;
+ }
+ }
+ }
+ }
+ }
+
+ // Incorporate the offset, then check against cycle size
+ diff -= last;
+ return diff === first || ( diff % first === 0 && diff / first >= 0 );
+ }
+ };
+ },
+
+ "PSEUDO": function( pseudo, argument ) {
+ // pseudo-class names are case-insensitive
+ // http://www.w3.org/TR/selectors/#pseudo-classes
+ // Prioritize by case sensitivity in case custom pseudos are added with uppercase letters
+ // Remember that setFilters inherits from pseudos
+ var args,
+ fn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] ||
+ Sizzle.error( "unsupported pseudo: " + pseudo );
+
+ // The user may use createPseudo to indicate that
+ // arguments are needed to create the filter function
+ // just as Sizzle does
+ if ( fn[ expando ] ) {
+ return fn( argument );
+ }
+
+ // But maintain support for old signatures
+ if ( fn.length > 1 ) {
+ args = [ pseudo, pseudo, "", argument ];
+ return Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ?
+ markFunction(function( seed, matches ) {
+ var idx,
+ matched = fn( seed, argument ),
+ i = matched.length;
+ while ( i-- ) {
+ idx = indexOf( seed, matched[i] );
+ seed[ idx ] = !( matches[ idx ] = matched[i] );
+ }
+ }) :
+ function( elem ) {
+ return fn( elem, 0, args );
+ };
+ }
+
+ return fn;
+ }
+ },
+
+ pseudos: {
+ // Potentially complex pseudos
+ "not": markFunction(function( selector ) {
+ // Trim the selector passed to compile
+ // to avoid treating leading and trailing
+ // spaces as combinators
+ var input = [],
+ results = [],
+ matcher = compile( selector.replace( rtrim, "$1" ) );
+
+ return matcher[ expando ] ?
+ markFunction(function( seed, matches, context, xml ) {
+ var elem,
+ unmatched = matcher( seed, null, xml, [] ),
+ i = seed.length;
+
+ // Match elements unmatched by `matcher`
+ while ( i-- ) {
+ if ( (elem = unmatched[i]) ) {
+ seed[i] = !(matches[i] = elem);
+ }
+ }
+ }) :
+ function( elem, context, xml ) {
+ input[0] = elem;
+ matcher( input, null, xml, results );
+ // Don't keep the element (issue #299)
+ input[0] = null;
+ return !results.pop();
+ };
+ }),
+
+ "has": markFunction(function( selector ) {
+ return function( elem ) {
+ return Sizzle( selector, elem ).length > 0;
+ };
+ }),
+
+ "contains": markFunction(function( text ) {
+ text = text.replace( runescape, funescape );
+ return function( elem ) {
+ return ( elem.textContent || getText( elem ) ).indexOf( text ) > -1;
+ };
+ }),
+
+ // "Whether an element is represented by a :lang() selector
+ // is based solely on the element's language value
+ // being equal to the identifier C,
+ // or beginning with the identifier C immediately followed by "-".
+ // The matching of C against the element's language value is performed case-insensitively.
+ // The identifier C does not have to be a valid language name."
+ // http://www.w3.org/TR/selectors/#lang-pseudo
+ "lang": markFunction( function( lang ) {
+ // lang value must be a valid identifier
+ if ( !ridentifier.test(lang || "") ) {
+ Sizzle.error( "unsupported lang: " + lang );
+ }
+ lang = lang.replace( runescape, funescape ).toLowerCase();
+ return function( elem ) {
+ var elemLang;
+ do {
+ if ( (elemLang = documentIsHTML ?
+ elem.lang :
+ elem.getAttribute("xml:lang") || elem.getAttribute("lang")) ) {
+
+ elemLang = elemLang.toLowerCase();
+ return elemLang === lang || elemLang.indexOf( lang + "-" ) === 0;
+ }
+ } while ( (elem = elem.parentNode) && elem.nodeType === 1 );
+ return false;
+ };
+ }),
+
+ // Miscellaneous
+ "target": function( elem ) {
+ var hash = window.location && window.location.hash;
+ return hash && hash.slice( 1 ) === elem.id;
+ },
+
+ "root": function( elem ) {
+ return elem === docElem;
+ },
+
+ "focus": function( elem ) {
+ return elem === document.activeElement && (!document.hasFocus || document.hasFocus()) && !!(elem.type || elem.href || ~elem.tabIndex);
+ },
+
+ // Boolean properties
+ "enabled": createDisabledPseudo( false ),
+ "disabled": createDisabledPseudo( true ),
+
+ "checked": function( elem ) {
+ // In CSS3, :checked should return both checked and selected elements
+ // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked
+ var nodeName = elem.nodeName.toLowerCase();
+ return (nodeName === "input" && !!elem.checked) || (nodeName === "option" && !!elem.selected);
+ },
+
+ "selected": function( elem ) {
+ // Accessing this property makes selected-by-default
+ // options in Safari work properly
+ if ( elem.parentNode ) {
+ elem.parentNode.selectedIndex;
+ }
+
+ return elem.selected === true;
+ },
+
+ // Contents
+ "empty": function( elem ) {
+ // http://www.w3.org/TR/selectors/#empty-pseudo
+ // :empty is negated by element (1) or content nodes (text: 3; cdata: 4; entity ref: 5),
+ // but not by others (comment: 8; processing instruction: 7; etc.)
+ // nodeType < 6 works because attributes (2) do not appear as children
+ for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {
+ if ( elem.nodeType < 6 ) {
+ return false;
+ }
+ }
+ return true;
+ },
+
+ "parent": function( elem ) {
+ return !Expr.pseudos["empty"]( elem );
+ },
+
+ // Element/input types
+ "header": function( elem ) {
+ return rheader.test( elem.nodeName );
+ },
+
+ "input": function( elem ) {
+ return rinputs.test( elem.nodeName );
+ },
+
+ "button": function( elem ) {
+ var name = elem.nodeName.toLowerCase();
+ return name === "input" && elem.type === "button" || name === "button";
+ },
+
+ "text": function( elem ) {
+ var attr;
+ return elem.nodeName.toLowerCase() === "input" &&
+ elem.type === "text" &&
+
+ // Support: IE<8
+ // New HTML5 attribute values (e.g., "search") appear with elem.type === "text"
+ ( (attr = elem.getAttribute("type")) == null || attr.toLowerCase() === "text" );
+ },
+
+ // Position-in-collection
+ "first": createPositionalPseudo(function() {
+ return [ 0 ];
+ }),
+
+ "last": createPositionalPseudo(function( matchIndexes, length ) {
+ return [ length - 1 ];
+ }),
+
+ "eq": createPositionalPseudo(function( matchIndexes, length, argument ) {
+ return [ argument < 0 ? argument + length : argument ];
+ }),
+
+ "even": createPositionalPseudo(function( matchIndexes, length ) {
+ var i = 0;
+ for ( ; i < length; i += 2 ) {
+ matchIndexes.push( i );
+ }
+ return matchIndexes;
+ }),
+
+ "odd": createPositionalPseudo(function( matchIndexes, length ) {
+ var i = 1;
+ for ( ; i < length; i += 2 ) {
+ matchIndexes.push( i );
+ }
+ return matchIndexes;
+ }),
+
+ "lt": createPositionalPseudo(function( matchIndexes, length, argument ) {
+ var i = argument < 0 ?
+ argument + length :
+ argument > length ?
+ length :
+ argument;
+ for ( ; --i >= 0; ) {
+ matchIndexes.push( i );
+ }
+ return matchIndexes;
+ }),
+
+ "gt": createPositionalPseudo(function( matchIndexes, length, argument ) {
+ var i = argument < 0 ? argument + length : argument;
+ for ( ; ++i < length; ) {
+ matchIndexes.push( i );
+ }
+ return matchIndexes;
+ })
+ }
+};
+
+Expr.pseudos["nth"] = Expr.pseudos["eq"];
+
+// Add button/input type pseudos
+for ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) {
+ Expr.pseudos[ i ] = createInputPseudo( i );
+}
+for ( i in { submit: true, reset: true } ) {
+ Expr.pseudos[ i ] = createButtonPseudo( i );
+}
+
+// Easy API for creating new setFilters
+function setFilters() {}
+setFilters.prototype = Expr.filters = Expr.pseudos;
+Expr.setFilters = new setFilters();
+
+tokenize = Sizzle.tokenize = function( selector, parseOnly ) {
+ var matched, match, tokens, type,
+ soFar, groups, preFilters,
+ cached = tokenCache[ selector + " " ];
+
+ if ( cached ) {
+ return parseOnly ? 0 : cached.slice( 0 );
+ }
+
+ soFar = selector;
+ groups = [];
+ preFilters = Expr.preFilter;
+
+ while ( soFar ) {
+
+ // Comma and first run
+ if ( !matched || (match = rcomma.exec( soFar )) ) {
+ if ( match ) {
+ // Don't consume trailing commas as valid
+ soFar = soFar.slice( match[0].length ) || soFar;
+ }
+ groups.push( (tokens = []) );
+ }
+
+ matched = false;
+
+ // Combinators
+ if ( (match = rcombinators.exec( soFar )) ) {
+ matched = match.shift();
+ tokens.push({
+ value: matched,
+ // Cast descendant combinators to space
+ type: match[0].replace( rtrim, " " )
+ });
+ soFar = soFar.slice( matched.length );
+ }
+
+ // Filters
+ for ( type in Expr.filter ) {
+ if ( (match = matchExpr[ type ].exec( soFar )) && (!preFilters[ type ] ||
+ (match = preFilters[ type ]( match ))) ) {
+ matched = match.shift();
+ tokens.push({
+ value: matched,
+ type: type,
+ matches: match
+ });
+ soFar = soFar.slice( matched.length );
+ }
+ }
+
+ if ( !matched ) {
+ break;
+ }
+ }
+
+ // Return the length of the invalid excess
+ // if we're just parsing
+ // Otherwise, throw an error or return tokens
+ return parseOnly ?
+ soFar.length :
+ soFar ?
+ Sizzle.error( selector ) :
+ // Cache the tokens
+ tokenCache( selector, groups ).slice( 0 );
+};
+
+function toSelector( tokens ) {
+ var i = 0,
+ len = tokens.length,
+ selector = "";
+ for ( ; i < len; i++ ) {
+ selector += tokens[i].value;
+ }
+ return selector;
+}
+
+function addCombinator( matcher, combinator, base ) {
+ var dir = combinator.dir,
+ skip = combinator.next,
+ key = skip || dir,
+ checkNonElements = base && key === "parentNode",
+ doneName = done++;
+
+ return combinator.first ?
+ // Check against closest ancestor/preceding element
+ function( elem, context, xml ) {
+ while ( (elem = elem[ dir ]) ) {
+ if ( elem.nodeType === 1 || checkNonElements ) {
+ return matcher( elem, context, xml );
+ }
+ }
+ return false;
+ } :
+
+ // Check against all ancestor/preceding elements
+ function( elem, context, xml ) {
+ var oldCache, uniqueCache, outerCache,
+ newCache = [ dirruns, doneName ];
+
+ // We can't set arbitrary data on XML nodes, so they don't benefit from combinator caching
+ if ( xml ) {
+ while ( (elem = elem[ dir ]) ) {
+ if ( elem.nodeType === 1 || checkNonElements ) {
+ if ( matcher( elem, context, xml ) ) {
+ return true;
+ }
+ }
+ }
+ } else {
+ while ( (elem = elem[ dir ]) ) {
+ if ( elem.nodeType === 1 || checkNonElements ) {
+ outerCache = elem[ expando ] || (elem[ expando ] = {});
+
+ // Support: IE <9 only
+ // Defend against cloned attroperties (jQuery gh-1709)
+ uniqueCache = outerCache[ elem.uniqueID ] || (outerCache[ elem.uniqueID ] = {});
+
+ if ( skip && skip === elem.nodeName.toLowerCase() ) {
+ elem = elem[ dir ] || elem;
+ } else if ( (oldCache = uniqueCache[ key ]) &&
+ oldCache[ 0 ] === dirruns && oldCache[ 1 ] === doneName ) {
+
+ // Assign to newCache so results back-propagate to previous elements
+ return (newCache[ 2 ] = oldCache[ 2 ]);
+ } else {
+ // Reuse newcache so results back-propagate to previous elements
+ uniqueCache[ key ] = newCache;
+
+ // A match means we're done; a fail means we have to keep checking
+ if ( (newCache[ 2 ] = matcher( elem, context, xml )) ) {
+ return true;
+ }
+ }
+ }
+ }
+ }
+ return false;
+ };
+}
+
+function elementMatcher( matchers ) {
+ return matchers.length > 1 ?
+ function( elem, context, xml ) {
+ var i = matchers.length;
+ while ( i-- ) {
+ if ( !matchers[i]( elem, context, xml ) ) {
+ return false;
+ }
+ }
+ return true;
+ } :
+ matchers[0];
+}
+
+function multipleContexts( selector, contexts, results ) {
+ var i = 0,
+ len = contexts.length;
+ for ( ; i < len; i++ ) {
+ Sizzle( selector, contexts[i], results );
+ }
+ return results;
+}
+
+function condense( unmatched, map, filter, context, xml ) {
+ var elem,
+ newUnmatched = [],
+ i = 0,
+ len = unmatched.length,
+ mapped = map != null;
+
+ for ( ; i < len; i++ ) {
+ if ( (elem = unmatched[i]) ) {
+ if ( !filter || filter( elem, context, xml ) ) {
+ newUnmatched.push( elem );
+ if ( mapped ) {
+ map.push( i );
+ }
+ }
+ }
+ }
+
+ return newUnmatched;
+}
+
+function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) {
+ if ( postFilter && !postFilter[ expando ] ) {
+ postFilter = setMatcher( postFilter );
+ }
+ if ( postFinder && !postFinder[ expando ] ) {
+ postFinder = setMatcher( postFinder, postSelector );
+ }
+ return markFunction(function( seed, results, context, xml ) {
+ var temp, i, elem,
+ preMap = [],
+ postMap = [],
+ preexisting = results.length,
+
+ // Get initial elements from seed or context
+ elems = seed || multipleContexts( selector || "*", context.nodeType ? [ context ] : context, [] ),
+
+ // Prefilter to get matcher input, preserving a map for seed-results synchronization
+ matcherIn = preFilter && ( seed || !selector ) ?
+ condense( elems, preMap, preFilter, context, xml ) :
+ elems,
+
+ matcherOut = matcher ?
+ // If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results,
+ postFinder || ( seed ? preFilter : preexisting || postFilter ) ?
+
+ // ...intermediate processing is necessary
+ [] :
+
+ // ...otherwise use results directly
+ results :
+ matcherIn;
+
+ // Find primary matches
+ if ( matcher ) {
+ matcher( matcherIn, matcherOut, context, xml );
+ }
+
+ // Apply postFilter
+ if ( postFilter ) {
+ temp = condense( matcherOut, postMap );
+ postFilter( temp, [], context, xml );
+
+ // Un-match failing elements by moving them back to matcherIn
+ i = temp.length;
+ while ( i-- ) {
+ if ( (elem = temp[i]) ) {
+ matcherOut[ postMap[i] ] = !(matcherIn[ postMap[i] ] = elem);
+ }
+ }
+ }
+
+ if ( seed ) {
+ if ( postFinder || preFilter ) {
+ if ( postFinder ) {
+ // Get the final matcherOut by condensing this intermediate into postFinder contexts
+ temp = [];
+ i = matcherOut.length;
+ while ( i-- ) {
+ if ( (elem = matcherOut[i]) ) {
+ // Restore matcherIn since elem is not yet a final match
+ temp.push( (matcherIn[i] = elem) );
+ }
+ }
+ postFinder( null, (matcherOut = []), temp, xml );
+ }
+
+ // Move matched elements from seed to results to keep them synchronized
+ i = matcherOut.length;
+ while ( i-- ) {
+ if ( (elem = matcherOut[i]) &&
+ (temp = postFinder ? indexOf( seed, elem ) : preMap[i]) > -1 ) {
+
+ seed[temp] = !(results[temp] = elem);
+ }
+ }
+ }
+
+ // Add elements to results, through postFinder if defined
+ } else {
+ matcherOut = condense(
+ matcherOut === results ?
+ matcherOut.splice( preexisting, matcherOut.length ) :
+ matcherOut
+ );
+ if ( postFinder ) {
+ postFinder( null, results, matcherOut, xml );
+ } else {
+ push.apply( results, matcherOut );
+ }
+ }
+ });
+}
+
+function matcherFromTokens( tokens ) {
+ var checkContext, matcher, j,
+ len = tokens.length,
+ leadingRelative = Expr.relative[ tokens[0].type ],
+ implicitRelative = leadingRelative || Expr.relative[" "],
+ i = leadingRelative ? 1 : 0,
+
+ // The foundational matcher ensures that elements are reachable from top-level context(s)
+ matchContext = addCombinator( function( elem ) {
+ return elem === checkContext;
+ }, implicitRelative, true ),
+ matchAnyContext = addCombinator( function( elem ) {
+ return indexOf( checkContext, elem ) > -1;
+ }, implicitRelative, true ),
+ matchers = [ function( elem, context, xml ) {
+ var ret = ( !leadingRelative && ( xml || context !== outermostContext ) ) || (
+ (checkContext = context).nodeType ?
+ matchContext( elem, context, xml ) :
+ matchAnyContext( elem, context, xml ) );
+ // Avoid hanging onto element (issue #299)
+ checkContext = null;
+ return ret;
+ } ];
+
+ for ( ; i < len; i++ ) {
+ if ( (matcher = Expr.relative[ tokens[i].type ]) ) {
+ matchers = [ addCombinator(elementMatcher( matchers ), matcher) ];
+ } else {
+ matcher = Expr.filter[ tokens[i].type ].apply( null, tokens[i].matches );
+
+ // Return special upon seeing a positional matcher
+ if ( matcher[ expando ] ) {
+ // Find the next relative operator (if any) for proper handling
+ j = ++i;
+ for ( ; j < len; j++ ) {
+ if ( Expr.relative[ tokens[j].type ] ) {
+ break;
+ }
+ }
+ return setMatcher(
+ i > 1 && elementMatcher( matchers ),
+ i > 1 && toSelector(
+ // If the preceding token was a descendant combinator, insert an implicit any-element `*`
+ tokens.slice( 0, i - 1 ).concat({ value: tokens[ i - 2 ].type === " " ? "*" : "" })
+ ).replace( rtrim, "$1" ),
+ matcher,
+ i < j && matcherFromTokens( tokens.slice( i, j ) ),
+ j < len && matcherFromTokens( (tokens = tokens.slice( j )) ),
+ j < len && toSelector( tokens )
+ );
+ }
+ matchers.push( matcher );
+ }
+ }
+
+ return elementMatcher( matchers );
+}
+
+function matcherFromGroupMatchers( elementMatchers, setMatchers ) {
+ var bySet = setMatchers.length > 0,
+ byElement = elementMatchers.length > 0,
+ superMatcher = function( seed, context, xml, results, outermost ) {
+ var elem, j, matcher,
+ matchedCount = 0,
+ i = "0",
+ unmatched = seed && [],
+ setMatched = [],
+ contextBackup = outermostContext,
+ // We must always have either seed elements or outermost context
+ elems = seed || byElement && Expr.find["TAG"]( "*", outermost ),
+ // Use integer dirruns iff this is the outermost matcher
+ dirrunsUnique = (dirruns += contextBackup == null ? 1 : Math.random() || 0.1),
+ len = elems.length;
+
+ if ( outermost ) {
+ outermostContext = context === document || context || outermost;
+ }
+
+ // Add elements passing elementMatchers directly to results
+ // Support: IE<9, Safari
+ // Tolerate NodeList properties (IE: "length"; Safari: ) matching elements by id
+ for ( ; i !== len && (elem = elems[i]) != null; i++ ) {
+ if ( byElement && elem ) {
+ j = 0;
+ if ( !context && elem.ownerDocument !== document ) {
+ setDocument( elem );
+ xml = !documentIsHTML;
+ }
+ while ( (matcher = elementMatchers[j++]) ) {
+ if ( matcher( elem, context || document, xml) ) {
+ results.push( elem );
+ break;
+ }
+ }
+ if ( outermost ) {
+ dirruns = dirrunsUnique;
+ }
+ }
+
+ // Track unmatched elements for set filters
+ if ( bySet ) {
+ // They will have gone through all possible matchers
+ if ( (elem = !matcher && elem) ) {
+ matchedCount--;
+ }
+
+ // Lengthen the array for every element, matched or not
+ if ( seed ) {
+ unmatched.push( elem );
+ }
+ }
+ }
+
+ // `i` is now the count of elements visited above, and adding it to `matchedCount`
+ // makes the latter nonnegative.
+ matchedCount += i;
+
+ // Apply set filters to unmatched elements
+ // NOTE: This can be skipped if there are no unmatched elements (i.e., `matchedCount`
+ // equals `i`), unless we didn't visit _any_ elements in the above loop because we have
+ // no element matchers and no seed.
+ // Incrementing an initially-string "0" `i` allows `i` to remain a string only in that
+ // case, which will result in a "00" `matchedCount` that differs from `i` but is also
+ // numerically zero.
+ if ( bySet && i !== matchedCount ) {
+ j = 0;
+ while ( (matcher = setMatchers[j++]) ) {
+ matcher( unmatched, setMatched, context, xml );
+ }
+
+ if ( seed ) {
+ // Reintegrate element matches to eliminate the need for sorting
+ if ( matchedCount > 0 ) {
+ while ( i-- ) {
+ if ( !(unmatched[i] || setMatched[i]) ) {
+ setMatched[i] = pop.call( results );
+ }
+ }
+ }
+
+ // Discard index placeholder values to get only actual matches
+ setMatched = condense( setMatched );
+ }
+
+ // Add matches to results
+ push.apply( results, setMatched );
+
+ // Seedless set matches succeeding multiple successful matchers stipulate sorting
+ if ( outermost && !seed && setMatched.length > 0 &&
+ ( matchedCount + setMatchers.length ) > 1 ) {
+
+ Sizzle.uniqueSort( results );
+ }
+ }
+
+ // Override manipulation of globals by nested matchers
+ if ( outermost ) {
+ dirruns = dirrunsUnique;
+ outermostContext = contextBackup;
+ }
+
+ return unmatched;
+ };
+
+ return bySet ?
+ markFunction( superMatcher ) :
+ superMatcher;
+}
+
+compile = Sizzle.compile = function( selector, match /* Internal Use Only */ ) {
+ var i,
+ setMatchers = [],
+ elementMatchers = [],
+ cached = compilerCache[ selector + " " ];
+
+ if ( !cached ) {
+ // Generate a function of recursive functions that can be used to check each element
+ if ( !match ) {
+ match = tokenize( selector );
+ }
+ i = match.length;
+ while ( i-- ) {
+ cached = matcherFromTokens( match[i] );
+ if ( cached[ expando ] ) {
+ setMatchers.push( cached );
+ } else {
+ elementMatchers.push( cached );
+ }
+ }
+
+ // Cache the compiled function
+ cached = compilerCache( selector, matcherFromGroupMatchers( elementMatchers, setMatchers ) );
+
+ // Save selector and tokenization
+ cached.selector = selector;
+ }
+ return cached;
+};
+
+/**
+ * A low-level selection function that works with Sizzle's compiled
+ * selector functions
+ * @param {String|Function} selector A selector or a pre-compiled
+ * selector function built with Sizzle.compile
+ * @param {Element} context
+ * @param {Array} [results]
+ * @param {Array} [seed] A set of elements to match against
+ */
+select = Sizzle.select = function( selector, context, results, seed ) {
+ var i, tokens, token, type, find,
+ compiled = typeof selector === "function" && selector,
+ match = !seed && tokenize( (selector = compiled.selector || selector) );
+
+ results = results || [];
+
+ // Try to minimize operations if there is only one selector in the list and no seed
+ // (the latter of which guarantees us context)
+ if ( match.length === 1 ) {
+
+ // Reduce context if the leading compound selector is an ID
+ tokens = match[0] = match[0].slice( 0 );
+ if ( tokens.length > 2 && (token = tokens[0]).type === "ID" &&
+ context.nodeType === 9 && documentIsHTML && Expr.relative[ tokens[1].type ] ) {
+
+ context = ( Expr.find["ID"]( token.matches[0].replace(runescape, funescape), context ) || [] )[0];
+ if ( !context ) {
+ return results;
+
+ // Precompiled matchers will still verify ancestry, so step up a level
+ } else if ( compiled ) {
+ context = context.parentNode;
+ }
+
+ selector = selector.slice( tokens.shift().value.length );
+ }
+
+ // Fetch a seed set for right-to-left matching
+ i = matchExpr["needsContext"].test( selector ) ? 0 : tokens.length;
+ while ( i-- ) {
+ token = tokens[i];
+
+ // Abort if we hit a combinator
+ if ( Expr.relative[ (type = token.type) ] ) {
+ break;
+ }
+ if ( (find = Expr.find[ type ]) ) {
+ // Search, expanding context for leading sibling combinators
+ if ( (seed = find(
+ token.matches[0].replace( runescape, funescape ),
+ rsibling.test( tokens[0].type ) && testContext( context.parentNode ) || context
+ )) ) {
+
+ // If seed is empty or no tokens remain, we can return early
+ tokens.splice( i, 1 );
+ selector = seed.length && toSelector( tokens );
+ if ( !selector ) {
+ push.apply( results, seed );
+ return results;
+ }
+
+ break;
+ }
+ }
+ }
+ }
+
+ // Compile and execute a filtering function if one is not provided
+ // Provide `match` to avoid retokenization if we modified the selector above
+ ( compiled || compile( selector, match ) )(
+ seed,
+ context,
+ !documentIsHTML,
+ results,
+ !context || rsibling.test( selector ) && testContext( context.parentNode ) || context
+ );
+ return results;
+};
+
+// One-time assignments
+
+// Sort stability
+support.sortStable = expando.split("").sort( sortOrder ).join("") === expando;
+
+// Support: Chrome 14-35+
+// Always assume duplicates if they aren't passed to the comparison function
+support.detectDuplicates = !!hasDuplicate;
+
+// Initialize against the default document
+setDocument();
+
+// Support: Webkit<537.32 - Safari 6.0.3/Chrome 25 (fixed in Chrome 27)
+// Detached nodes confoundingly follow *each other*
+support.sortDetached = assert(function( el ) {
+ // Should return 1, but returns 4 (following)
+ return el.compareDocumentPosition( document.createElement("fieldset") ) & 1;
+});
+
+// Support: IE<8
+// Prevent attribute/property "interpolation"
+// https://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx
+if ( !assert(function( el ) {
+ el.innerHTML = " ";
+ return el.firstChild.getAttribute("href") === "#" ;
+}) ) {
+ addHandle( "type|href|height|width", function( elem, name, isXML ) {
+ if ( !isXML ) {
+ return elem.getAttribute( name, name.toLowerCase() === "type" ? 1 : 2 );
+ }
+ });
+}
+
+// Support: IE<9
+// Use defaultValue in place of getAttribute("value")
+if ( !support.attributes || !assert(function( el ) {
+ el.innerHTML = " ";
+ el.firstChild.setAttribute( "value", "" );
+ return el.firstChild.getAttribute( "value" ) === "";
+}) ) {
+ addHandle( "value", function( elem, name, isXML ) {
+ if ( !isXML && elem.nodeName.toLowerCase() === "input" ) {
+ return elem.defaultValue;
+ }
+ });
+}
+
+// Support: IE<9
+// Use getAttributeNode to fetch booleans when getAttribute lies
+if ( !assert(function( el ) {
+ return el.getAttribute("disabled") == null;
+}) ) {
+ addHandle( booleans, function( elem, name, isXML ) {
+ var val;
+ if ( !isXML ) {
+ return elem[ name ] === true ? name.toLowerCase() :
+ (val = elem.getAttributeNode( name )) && val.specified ?
+ val.value :
+ null;
+ }
+ });
+}
+
+return Sizzle;
+
+})( window );
+
+
+
+jQuery.find = Sizzle;
+jQuery.expr = Sizzle.selectors;
+
+// Deprecated
+jQuery.expr[ ":" ] = jQuery.expr.pseudos;
+jQuery.uniqueSort = jQuery.unique = Sizzle.uniqueSort;
+jQuery.text = Sizzle.getText;
+jQuery.isXMLDoc = Sizzle.isXML;
+jQuery.contains = Sizzle.contains;
+jQuery.escapeSelector = Sizzle.escape;
+
+
+
+
+var dir = function( elem, dir, until ) {
+ var matched = [],
+ truncate = until !== undefined;
+
+ while ( ( elem = elem[ dir ] ) && elem.nodeType !== 9 ) {
+ if ( elem.nodeType === 1 ) {
+ if ( truncate && jQuery( elem ).is( until ) ) {
+ break;
+ }
+ matched.push( elem );
+ }
+ }
+ return matched;
+};
+
+
+var siblings = function( n, elem ) {
+ var matched = [];
+
+ for ( ; n; n = n.nextSibling ) {
+ if ( n.nodeType === 1 && n !== elem ) {
+ matched.push( n );
+ }
+ }
+
+ return matched;
+};
+
+
+var rneedsContext = jQuery.expr.match.needsContext;
+
+
+
+function nodeName( elem, name ) {
+
+ return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase();
+
+};
+var rsingleTag = ( /^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i );
+
+
+
+// Implement the identical functionality for filter and not
+function winnow( elements, qualifier, not ) {
+ if ( isFunction( qualifier ) ) {
+ return jQuery.grep( elements, function( elem, i ) {
+ return !!qualifier.call( elem, i, elem ) !== not;
+ } );
+ }
+
+ // Single element
+ if ( qualifier.nodeType ) {
+ return jQuery.grep( elements, function( elem ) {
+ return ( elem === qualifier ) !== not;
+ } );
+ }
+
+ // Arraylike of elements (jQuery, arguments, Array)
+ if ( typeof qualifier !== "string" ) {
+ return jQuery.grep( elements, function( elem ) {
+ return ( indexOf.call( qualifier, elem ) > -1 ) !== not;
+ } );
+ }
+
+ // Filtered directly for both simple and complex selectors
+ return jQuery.filter( qualifier, elements, not );
+}
+
+jQuery.filter = function( expr, elems, not ) {
+ var elem = elems[ 0 ];
+
+ if ( not ) {
+ expr = ":not(" + expr + ")";
+ }
+
+ if ( elems.length === 1 && elem.nodeType === 1 ) {
+ return jQuery.find.matchesSelector( elem, expr ) ? [ elem ] : [];
+ }
+
+ return jQuery.find.matches( expr, jQuery.grep( elems, function( elem ) {
+ return elem.nodeType === 1;
+ } ) );
+};
+
+jQuery.fn.extend( {
+ find: function( selector ) {
+ var i, ret,
+ len = this.length,
+ self = this;
+
+ if ( typeof selector !== "string" ) {
+ return this.pushStack( jQuery( selector ).filter( function() {
+ for ( i = 0; i < len; i++ ) {
+ if ( jQuery.contains( self[ i ], this ) ) {
+ return true;
+ }
+ }
+ } ) );
+ }
+
+ ret = this.pushStack( [] );
+
+ for ( i = 0; i < len; i++ ) {
+ jQuery.find( selector, self[ i ], ret );
+ }
+
+ return len > 1 ? jQuery.uniqueSort( ret ) : ret;
+ },
+ filter: function( selector ) {
+ return this.pushStack( winnow( this, selector || [], false ) );
+ },
+ not: function( selector ) {
+ return this.pushStack( winnow( this, selector || [], true ) );
+ },
+ is: function( selector ) {
+ return !!winnow(
+ this,
+
+ // If this is a positional/relative selector, check membership in the returned set
+ // so $("p:first").is("p:last") won't return true for a doc with two "p".
+ typeof selector === "string" && rneedsContext.test( selector ) ?
+ jQuery( selector ) :
+ selector || [],
+ false
+ ).length;
+ }
+} );
+
+
+// Initialize a jQuery object
+
+
+// A central reference to the root jQuery(document)
+var rootjQuery,
+
+ // A simple way to check for HTML strings
+ // Prioritize #id over to avoid XSS via location.hash (#9521)
+ // Strict HTML recognition (#11290: must start with <)
+ // Shortcut simple #id case for speed
+ rquickExpr = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/,
+
+ init = jQuery.fn.init = function( selector, context, root ) {
+ var match, elem;
+
+ // HANDLE: $(""), $(null), $(undefined), $(false)
+ if ( !selector ) {
+ return this;
+ }
+
+ // Method init() accepts an alternate rootjQuery
+ // so migrate can support jQuery.sub (gh-2101)
+ root = root || rootjQuery;
+
+ // Handle HTML strings
+ if ( typeof selector === "string" ) {
+ if ( selector[ 0 ] === "<" &&
+ selector[ selector.length - 1 ] === ">" &&
+ selector.length >= 3 ) {
+
+ // Assume that strings that start and end with <> are HTML and skip the regex check
+ match = [ null, selector, null ];
+
+ } else {
+ match = rquickExpr.exec( selector );
+ }
+
+ // Match html or make sure no context is specified for #id
+ if ( match && ( match[ 1 ] || !context ) ) {
+
+ // HANDLE: $(html) -> $(array)
+ if ( match[ 1 ] ) {
+ context = context instanceof jQuery ? context[ 0 ] : context;
+
+ // Option to run scripts is true for back-compat
+ // Intentionally let the error be thrown if parseHTML is not present
+ jQuery.merge( this, jQuery.parseHTML(
+ match[ 1 ],
+ context && context.nodeType ? context.ownerDocument || context : document,
+ true
+ ) );
+
+ // HANDLE: $(html, props)
+ if ( rsingleTag.test( match[ 1 ] ) && jQuery.isPlainObject( context ) ) {
+ for ( match in context ) {
+
+ // Properties of context are called as methods if possible
+ if ( isFunction( this[ match ] ) ) {
+ this[ match ]( context[ match ] );
+
+ // ...and otherwise set as attributes
+ } else {
+ this.attr( match, context[ match ] );
+ }
+ }
+ }
+
+ return this;
+
+ // HANDLE: $(#id)
+ } else {
+ elem = document.getElementById( match[ 2 ] );
+
+ if ( elem ) {
+
+ // Inject the element directly into the jQuery object
+ this[ 0 ] = elem;
+ this.length = 1;
+ }
+ return this;
+ }
+
+ // HANDLE: $(expr, $(...))
+ } else if ( !context || context.jquery ) {
+ return ( context || root ).find( selector );
+
+ // HANDLE: $(expr, context)
+ // (which is just equivalent to: $(context).find(expr)
+ } else {
+ return this.constructor( context ).find( selector );
+ }
+
+ // HANDLE: $(DOMElement)
+ } else if ( selector.nodeType ) {
+ this[ 0 ] = selector;
+ this.length = 1;
+ return this;
+
+ // HANDLE: $(function)
+ // Shortcut for document ready
+ } else if ( isFunction( selector ) ) {
+ return root.ready !== undefined ?
+ root.ready( selector ) :
+
+ // Execute immediately if ready is not present
+ selector( jQuery );
+ }
+
+ return jQuery.makeArray( selector, this );
+ };
+
+// Give the init function the jQuery prototype for later instantiation
+init.prototype = jQuery.fn;
+
+// Initialize central reference
+rootjQuery = jQuery( document );
+
+
+var rparentsprev = /^(?:parents|prev(?:Until|All))/,
+
+ // Methods guaranteed to produce a unique set when starting from a unique set
+ guaranteedUnique = {
+ children: true,
+ contents: true,
+ next: true,
+ prev: true
+ };
+
+jQuery.fn.extend( {
+ has: function( target ) {
+ var targets = jQuery( target, this ),
+ l = targets.length;
+
+ return this.filter( function() {
+ var i = 0;
+ for ( ; i < l; i++ ) {
+ if ( jQuery.contains( this, targets[ i ] ) ) {
+ return true;
+ }
+ }
+ } );
+ },
+
+ closest: function( selectors, context ) {
+ var cur,
+ i = 0,
+ l = this.length,
+ matched = [],
+ targets = typeof selectors !== "string" && jQuery( selectors );
+
+ // Positional selectors never match, since there's no _selection_ context
+ if ( !rneedsContext.test( selectors ) ) {
+ for ( ; i < l; i++ ) {
+ for ( cur = this[ i ]; cur && cur !== context; cur = cur.parentNode ) {
+
+ // Always skip document fragments
+ if ( cur.nodeType < 11 && ( targets ?
+ targets.index( cur ) > -1 :
+
+ // Don't pass non-elements to Sizzle
+ cur.nodeType === 1 &&
+ jQuery.find.matchesSelector( cur, selectors ) ) ) {
+
+ matched.push( cur );
+ break;
+ }
+ }
+ }
+ }
+
+ return this.pushStack( matched.length > 1 ? jQuery.uniqueSort( matched ) : matched );
+ },
+
+ // Determine the position of an element within the set
+ index: function( elem ) {
+
+ // No argument, return index in parent
+ if ( !elem ) {
+ return ( this[ 0 ] && this[ 0 ].parentNode ) ? this.first().prevAll().length : -1;
+ }
+
+ // Index in selector
+ if ( typeof elem === "string" ) {
+ return indexOf.call( jQuery( elem ), this[ 0 ] );
+ }
+
+ // Locate the position of the desired element
+ return indexOf.call( this,
+
+ // If it receives a jQuery object, the first element is used
+ elem.jquery ? elem[ 0 ] : elem
+ );
+ },
+
+ add: function( selector, context ) {
+ return this.pushStack(
+ jQuery.uniqueSort(
+ jQuery.merge( this.get(), jQuery( selector, context ) )
+ )
+ );
+ },
+
+ addBack: function( selector ) {
+ return this.add( selector == null ?
+ this.prevObject : this.prevObject.filter( selector )
+ );
+ }
+} );
+
+function sibling( cur, dir ) {
+ while ( ( cur = cur[ dir ] ) && cur.nodeType !== 1 ) {}
+ return cur;
+}
+
+jQuery.each( {
+ parent: function( elem ) {
+ var parent = elem.parentNode;
+ return parent && parent.nodeType !== 11 ? parent : null;
+ },
+ parents: function( elem ) {
+ return dir( elem, "parentNode" );
+ },
+ parentsUntil: function( elem, i, until ) {
+ return dir( elem, "parentNode", until );
+ },
+ next: function( elem ) {
+ return sibling( elem, "nextSibling" );
+ },
+ prev: function( elem ) {
+ return sibling( elem, "previousSibling" );
+ },
+ nextAll: function( elem ) {
+ return dir( elem, "nextSibling" );
+ },
+ prevAll: function( elem ) {
+ return dir( elem, "previousSibling" );
+ },
+ nextUntil: function( elem, i, until ) {
+ return dir( elem, "nextSibling", until );
+ },
+ prevUntil: function( elem, i, until ) {
+ return dir( elem, "previousSibling", until );
+ },
+ siblings: function( elem ) {
+ return siblings( ( elem.parentNode || {} ).firstChild, elem );
+ },
+ children: function( elem ) {
+ return siblings( elem.firstChild );
+ },
+ contents: function( elem ) {
+ if ( typeof elem.contentDocument !== "undefined" ) {
+ return elem.contentDocument;
+ }
+
+ // Support: IE 9 - 11 only, iOS 7 only, Android Browser <=4.3 only
+ // Treat the template element as a regular one in browsers that
+ // don't support it.
+ if ( nodeName( elem, "template" ) ) {
+ elem = elem.content || elem;
+ }
+
+ return jQuery.merge( [], elem.childNodes );
+ }
+}, function( name, fn ) {
+ jQuery.fn[ name ] = function( until, selector ) {
+ var matched = jQuery.map( this, fn, until );
+
+ if ( name.slice( -5 ) !== "Until" ) {
+ selector = until;
+ }
+
+ if ( selector && typeof selector === "string" ) {
+ matched = jQuery.filter( selector, matched );
+ }
+
+ if ( this.length > 1 ) {
+
+ // Remove duplicates
+ if ( !guaranteedUnique[ name ] ) {
+ jQuery.uniqueSort( matched );
+ }
+
+ // Reverse order for parents* and prev-derivatives
+ if ( rparentsprev.test( name ) ) {
+ matched.reverse();
+ }
+ }
+
+ return this.pushStack( matched );
+ };
+} );
+var rnothtmlwhite = ( /[^\x20\t\r\n\f]+/g );
+
+
+
+// Convert String-formatted options into Object-formatted ones
+function createOptions( options ) {
+ var object = {};
+ jQuery.each( options.match( rnothtmlwhite ) || [], function( _, flag ) {
+ object[ flag ] = true;
+ } );
+ return object;
+}
+
+/*
+ * Create a callback list using the following parameters:
+ *
+ * options: an optional list of space-separated options that will change how
+ * the callback list behaves or a more traditional option object
+ *
+ * By default a callback list will act like an event callback list and can be
+ * "fired" multiple times.
+ *
+ * Possible options:
+ *
+ * once: will ensure the callback list can only be fired once (like a Deferred)
+ *
+ * memory: will keep track of previous values and will call any callback added
+ * after the list has been fired right away with the latest "memorized"
+ * values (like a Deferred)
+ *
+ * unique: will ensure a callback can only be added once (no duplicate in the list)
+ *
+ * stopOnFalse: interrupt callings when a callback returns false
+ *
+ */
+jQuery.Callbacks = function( options ) {
+
+ // Convert options from String-formatted to Object-formatted if needed
+ // (we check in cache first)
+ options = typeof options === "string" ?
+ createOptions( options ) :
+ jQuery.extend( {}, options );
+
+ var // Flag to know if list is currently firing
+ firing,
+
+ // Last fire value for non-forgettable lists
+ memory,
+
+ // Flag to know if list was already fired
+ fired,
+
+ // Flag to prevent firing
+ locked,
+
+ // Actual callback list
+ list = [],
+
+ // Queue of execution data for repeatable lists
+ queue = [],
+
+ // Index of currently firing callback (modified by add/remove as needed)
+ firingIndex = -1,
+
+ // Fire callbacks
+ fire = function() {
+
+ // Enforce single-firing
+ locked = locked || options.once;
+
+ // Execute callbacks for all pending executions,
+ // respecting firingIndex overrides and runtime changes
+ fired = firing = true;
+ for ( ; queue.length; firingIndex = -1 ) {
+ memory = queue.shift();
+ while ( ++firingIndex < list.length ) {
+
+ // Run callback and check for early termination
+ if ( list[ firingIndex ].apply( memory[ 0 ], memory[ 1 ] ) === false &&
+ options.stopOnFalse ) {
+
+ // Jump to end and forget the data so .add doesn't re-fire
+ firingIndex = list.length;
+ memory = false;
+ }
+ }
+ }
+
+ // Forget the data if we're done with it
+ if ( !options.memory ) {
+ memory = false;
+ }
+
+ firing = false;
+
+ // Clean up if we're done firing for good
+ if ( locked ) {
+
+ // Keep an empty list if we have data for future add calls
+ if ( memory ) {
+ list = [];
+
+ // Otherwise, this object is spent
+ } else {
+ list = "";
+ }
+ }
+ },
+
+ // Actual Callbacks object
+ self = {
+
+ // Add a callback or a collection of callbacks to the list
+ add: function() {
+ if ( list ) {
+
+ // If we have memory from a past run, we should fire after adding
+ if ( memory && !firing ) {
+ firingIndex = list.length - 1;
+ queue.push( memory );
+ }
+
+ ( function add( args ) {
+ jQuery.each( args, function( _, arg ) {
+ if ( isFunction( arg ) ) {
+ if ( !options.unique || !self.has( arg ) ) {
+ list.push( arg );
+ }
+ } else if ( arg && arg.length && toType( arg ) !== "string" ) {
+
+ // Inspect recursively
+ add( arg );
+ }
+ } );
+ } )( arguments );
+
+ if ( memory && !firing ) {
+ fire();
+ }
+ }
+ return this;
+ },
+
+ // Remove a callback from the list
+ remove: function() {
+ jQuery.each( arguments, function( _, arg ) {
+ var index;
+ while ( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) {
+ list.splice( index, 1 );
+
+ // Handle firing indexes
+ if ( index <= firingIndex ) {
+ firingIndex--;
+ }
+ }
+ } );
+ return this;
+ },
+
+ // Check if a given callback is in the list.
+ // If no argument is given, return whether or not list has callbacks attached.
+ has: function( fn ) {
+ return fn ?
+ jQuery.inArray( fn, list ) > -1 :
+ list.length > 0;
+ },
+
+ // Remove all callbacks from the list
+ empty: function() {
+ if ( list ) {
+ list = [];
+ }
+ return this;
+ },
+
+ // Disable .fire and .add
+ // Abort any current/pending executions
+ // Clear all callbacks and values
+ disable: function() {
+ locked = queue = [];
+ list = memory = "";
+ return this;
+ },
+ disabled: function() {
+ return !list;
+ },
+
+ // Disable .fire
+ // Also disable .add unless we have memory (since it would have no effect)
+ // Abort any pending executions
+ lock: function() {
+ locked = queue = [];
+ if ( !memory && !firing ) {
+ list = memory = "";
+ }
+ return this;
+ },
+ locked: function() {
+ return !!locked;
+ },
+
+ // Call all callbacks with the given context and arguments
+ fireWith: function( context, args ) {
+ if ( !locked ) {
+ args = args || [];
+ args = [ context, args.slice ? args.slice() : args ];
+ queue.push( args );
+ if ( !firing ) {
+ fire();
+ }
+ }
+ return this;
+ },
+
+ // Call all the callbacks with the given arguments
+ fire: function() {
+ self.fireWith( this, arguments );
+ return this;
+ },
+
+ // To know if the callbacks have already been called at least once
+ fired: function() {
+ return !!fired;
+ }
+ };
+
+ return self;
+};
+
+
+function Identity( v ) {
+ return v;
+}
+function Thrower( ex ) {
+ throw ex;
+}
+
+function adoptValue( value, resolve, reject, noValue ) {
+ var method;
+
+ try {
+
+ // Check for promise aspect first to privilege synchronous behavior
+ if ( value && isFunction( ( method = value.promise ) ) ) {
+ method.call( value ).done( resolve ).fail( reject );
+
+ // Other thenables
+ } else if ( value && isFunction( ( method = value.then ) ) ) {
+ method.call( value, resolve, reject );
+
+ // Other non-thenables
+ } else {
+
+ // Control `resolve` arguments by letting Array#slice cast boolean `noValue` to integer:
+ // * false: [ value ].slice( 0 ) => resolve( value )
+ // * true: [ value ].slice( 1 ) => resolve()
+ resolve.apply( undefined, [ value ].slice( noValue ) );
+ }
+
+ // For Promises/A+, convert exceptions into rejections
+ // Since jQuery.when doesn't unwrap thenables, we can skip the extra checks appearing in
+ // Deferred#then to conditionally suppress rejection.
+ } catch ( value ) {
+
+ // Support: Android 4.0 only
+ // Strict mode functions invoked without .call/.apply get global-object context
+ reject.apply( undefined, [ value ] );
+ }
+}
+
+jQuery.extend( {
+
+ Deferred: function( func ) {
+ var tuples = [
+
+ // action, add listener, callbacks,
+ // ... .then handlers, argument index, [final state]
+ [ "notify", "progress", jQuery.Callbacks( "memory" ),
+ jQuery.Callbacks( "memory" ), 2 ],
+ [ "resolve", "done", jQuery.Callbacks( "once memory" ),
+ jQuery.Callbacks( "once memory" ), 0, "resolved" ],
+ [ "reject", "fail", jQuery.Callbacks( "once memory" ),
+ jQuery.Callbacks( "once memory" ), 1, "rejected" ]
+ ],
+ state = "pending",
+ promise = {
+ state: function() {
+ return state;
+ },
+ always: function() {
+ deferred.done( arguments ).fail( arguments );
+ return this;
+ },
+ "catch": function( fn ) {
+ return promise.then( null, fn );
+ },
+
+ // Keep pipe for back-compat
+ pipe: function( /* fnDone, fnFail, fnProgress */ ) {
+ var fns = arguments;
+
+ return jQuery.Deferred( function( newDefer ) {
+ jQuery.each( tuples, function( i, tuple ) {
+
+ // Map tuples (progress, done, fail) to arguments (done, fail, progress)
+ var fn = isFunction( fns[ tuple[ 4 ] ] ) && fns[ tuple[ 4 ] ];
+
+ // deferred.progress(function() { bind to newDefer or newDefer.notify })
+ // deferred.done(function() { bind to newDefer or newDefer.resolve })
+ // deferred.fail(function() { bind to newDefer or newDefer.reject })
+ deferred[ tuple[ 1 ] ]( function() {
+ var returned = fn && fn.apply( this, arguments );
+ if ( returned && isFunction( returned.promise ) ) {
+ returned.promise()
+ .progress( newDefer.notify )
+ .done( newDefer.resolve )
+ .fail( newDefer.reject );
+ } else {
+ newDefer[ tuple[ 0 ] + "With" ](
+ this,
+ fn ? [ returned ] : arguments
+ );
+ }
+ } );
+ } );
+ fns = null;
+ } ).promise();
+ },
+ then: function( onFulfilled, onRejected, onProgress ) {
+ var maxDepth = 0;
+ function resolve( depth, deferred, handler, special ) {
+ return function() {
+ var that = this,
+ args = arguments,
+ mightThrow = function() {
+ var returned, then;
+
+ // Support: Promises/A+ section 2.3.3.3.3
+ // https://promisesaplus.com/#point-59
+ // Ignore double-resolution attempts
+ if ( depth < maxDepth ) {
+ return;
+ }
+
+ returned = handler.apply( that, args );
+
+ // Support: Promises/A+ section 2.3.1
+ // https://promisesaplus.com/#point-48
+ if ( returned === deferred.promise() ) {
+ throw new TypeError( "Thenable self-resolution" );
+ }
+
+ // Support: Promises/A+ sections 2.3.3.1, 3.5
+ // https://promisesaplus.com/#point-54
+ // https://promisesaplus.com/#point-75
+ // Retrieve `then` only once
+ then = returned &&
+
+ // Support: Promises/A+ section 2.3.4
+ // https://promisesaplus.com/#point-64
+ // Only check objects and functions for thenability
+ ( typeof returned === "object" ||
+ typeof returned === "function" ) &&
+ returned.then;
+
+ // Handle a returned thenable
+ if ( isFunction( then ) ) {
+
+ // Special processors (notify) just wait for resolution
+ if ( special ) {
+ then.call(
+ returned,
+ resolve( maxDepth, deferred, Identity, special ),
+ resolve( maxDepth, deferred, Thrower, special )
+ );
+
+ // Normal processors (resolve) also hook into progress
+ } else {
+
+ // ...and disregard older resolution values
+ maxDepth++;
+
+ then.call(
+ returned,
+ resolve( maxDepth, deferred, Identity, special ),
+ resolve( maxDepth, deferred, Thrower, special ),
+ resolve( maxDepth, deferred, Identity,
+ deferred.notifyWith )
+ );
+ }
+
+ // Handle all other returned values
+ } else {
+
+ // Only substitute handlers pass on context
+ // and multiple values (non-spec behavior)
+ if ( handler !== Identity ) {
+ that = undefined;
+ args = [ returned ];
+ }
+
+ // Process the value(s)
+ // Default process is resolve
+ ( special || deferred.resolveWith )( that, args );
+ }
+ },
+
+ // Only normal processors (resolve) catch and reject exceptions
+ process = special ?
+ mightThrow :
+ function() {
+ try {
+ mightThrow();
+ } catch ( e ) {
+
+ if ( jQuery.Deferred.exceptionHook ) {
+ jQuery.Deferred.exceptionHook( e,
+ process.stackTrace );
+ }
+
+ // Support: Promises/A+ section 2.3.3.3.4.1
+ // https://promisesaplus.com/#point-61
+ // Ignore post-resolution exceptions
+ if ( depth + 1 >= maxDepth ) {
+
+ // Only substitute handlers pass on context
+ // and multiple values (non-spec behavior)
+ if ( handler !== Thrower ) {
+ that = undefined;
+ args = [ e ];
+ }
+
+ deferred.rejectWith( that, args );
+ }
+ }
+ };
+
+ // Support: Promises/A+ section 2.3.3.3.1
+ // https://promisesaplus.com/#point-57
+ // Re-resolve promises immediately to dodge false rejection from
+ // subsequent errors
+ if ( depth ) {
+ process();
+ } else {
+
+ // Call an optional hook to record the stack, in case of exception
+ // since it's otherwise lost when execution goes async
+ if ( jQuery.Deferred.getStackHook ) {
+ process.stackTrace = jQuery.Deferred.getStackHook();
+ }
+ window.setTimeout( process );
+ }
+ };
+ }
+
+ return jQuery.Deferred( function( newDefer ) {
+
+ // progress_handlers.add( ... )
+ tuples[ 0 ][ 3 ].add(
+ resolve(
+ 0,
+ newDefer,
+ isFunction( onProgress ) ?
+ onProgress :
+ Identity,
+ newDefer.notifyWith
+ )
+ );
+
+ // fulfilled_handlers.add( ... )
+ tuples[ 1 ][ 3 ].add(
+ resolve(
+ 0,
+ newDefer,
+ isFunction( onFulfilled ) ?
+ onFulfilled :
+ Identity
+ )
+ );
+
+ // rejected_handlers.add( ... )
+ tuples[ 2 ][ 3 ].add(
+ resolve(
+ 0,
+ newDefer,
+ isFunction( onRejected ) ?
+ onRejected :
+ Thrower
+ )
+ );
+ } ).promise();
+ },
+
+ // Get a promise for this deferred
+ // If obj is provided, the promise aspect is added to the object
+ promise: function( obj ) {
+ return obj != null ? jQuery.extend( obj, promise ) : promise;
+ }
+ },
+ deferred = {};
+
+ // Add list-specific methods
+ jQuery.each( tuples, function( i, tuple ) {
+ var list = tuple[ 2 ],
+ stateString = tuple[ 5 ];
+
+ // promise.progress = list.add
+ // promise.done = list.add
+ // promise.fail = list.add
+ promise[ tuple[ 1 ] ] = list.add;
+
+ // Handle state
+ if ( stateString ) {
+ list.add(
+ function() {
+
+ // state = "resolved" (i.e., fulfilled)
+ // state = "rejected"
+ state = stateString;
+ },
+
+ // rejected_callbacks.disable
+ // fulfilled_callbacks.disable
+ tuples[ 3 - i ][ 2 ].disable,
+
+ // rejected_handlers.disable
+ // fulfilled_handlers.disable
+ tuples[ 3 - i ][ 3 ].disable,
+
+ // progress_callbacks.lock
+ tuples[ 0 ][ 2 ].lock,
+
+ // progress_handlers.lock
+ tuples[ 0 ][ 3 ].lock
+ );
+ }
+
+ // progress_handlers.fire
+ // fulfilled_handlers.fire
+ // rejected_handlers.fire
+ list.add( tuple[ 3 ].fire );
+
+ // deferred.notify = function() { deferred.notifyWith(...) }
+ // deferred.resolve = function() { deferred.resolveWith(...) }
+ // deferred.reject = function() { deferred.rejectWith(...) }
+ deferred[ tuple[ 0 ] ] = function() {
+ deferred[ tuple[ 0 ] + "With" ]( this === deferred ? undefined : this, arguments );
+ return this;
+ };
+
+ // deferred.notifyWith = list.fireWith
+ // deferred.resolveWith = list.fireWith
+ // deferred.rejectWith = list.fireWith
+ deferred[ tuple[ 0 ] + "With" ] = list.fireWith;
+ } );
+
+ // Make the deferred a promise
+ promise.promise( deferred );
+
+ // Call given func if any
+ if ( func ) {
+ func.call( deferred, deferred );
+ }
+
+ // All done!
+ return deferred;
+ },
+
+ // Deferred helper
+ when: function( singleValue ) {
+ var
+
+ // count of uncompleted subordinates
+ remaining = arguments.length,
+
+ // count of unprocessed arguments
+ i = remaining,
+
+ // subordinate fulfillment data
+ resolveContexts = Array( i ),
+ resolveValues = slice.call( arguments ),
+
+ // the master Deferred
+ master = jQuery.Deferred(),
+
+ // subordinate callback factory
+ updateFunc = function( i ) {
+ return function( value ) {
+ resolveContexts[ i ] = this;
+ resolveValues[ i ] = arguments.length > 1 ? slice.call( arguments ) : value;
+ if ( !( --remaining ) ) {
+ master.resolveWith( resolveContexts, resolveValues );
+ }
+ };
+ };
+
+ // Single- and empty arguments are adopted like Promise.resolve
+ if ( remaining <= 1 ) {
+ adoptValue( singleValue, master.done( updateFunc( i ) ).resolve, master.reject,
+ !remaining );
+
+ // Use .then() to unwrap secondary thenables (cf. gh-3000)
+ if ( master.state() === "pending" ||
+ isFunction( resolveValues[ i ] && resolveValues[ i ].then ) ) {
+
+ return master.then();
+ }
+ }
+
+ // Multiple arguments are aggregated like Promise.all array elements
+ while ( i-- ) {
+ adoptValue( resolveValues[ i ], updateFunc( i ), master.reject );
+ }
+
+ return master.promise();
+ }
+} );
+
+
+// These usually indicate a programmer mistake during development,
+// warn about them ASAP rather than swallowing them by default.
+var rerrorNames = /^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;
+
+jQuery.Deferred.exceptionHook = function( error, stack ) {
+
+ // Support: IE 8 - 9 only
+ // Console exists when dev tools are open, which can happen at any time
+ if ( window.console && window.console.warn && error && rerrorNames.test( error.name ) ) {
+ window.console.warn( "jQuery.Deferred exception: " + error.message, error.stack, stack );
+ }
+};
+
+
+
+
+jQuery.readyException = function( error ) {
+ window.setTimeout( function() {
+ throw error;
+ } );
+};
+
+
+
+
+// The deferred used on DOM ready
+var readyList = jQuery.Deferred();
+
+jQuery.fn.ready = function( fn ) {
+
+ readyList
+ .then( fn )
+
+ // Wrap jQuery.readyException in a function so that the lookup
+ // happens at the time of error handling instead of callback
+ // registration.
+ .catch( function( error ) {
+ jQuery.readyException( error );
+ } );
+
+ return this;
+};
+
+jQuery.extend( {
+
+ // Is the DOM ready to be used? Set to true once it occurs.
+ isReady: false,
+
+ // A counter to track how many items to wait for before
+ // the ready event fires. See #6781
+ readyWait: 1,
+
+ // Handle when the DOM is ready
+ ready: function( wait ) {
+
+ // Abort if there are pending holds or we're already ready
+ if ( wait === true ? --jQuery.readyWait : jQuery.isReady ) {
+ return;
+ }
+
+ // Remember that the DOM is ready
+ jQuery.isReady = true;
+
+ // If a normal DOM Ready event fired, decrement, and wait if need be
+ if ( wait !== true && --jQuery.readyWait > 0 ) {
+ return;
+ }
+
+ // If there are functions bound, to execute
+ readyList.resolveWith( document, [ jQuery ] );
+ }
+} );
+
+jQuery.ready.then = readyList.then;
+
+// The ready event handler and self cleanup method
+function completed() {
+ document.removeEventListener( "DOMContentLoaded", completed );
+ window.removeEventListener( "load", completed );
+ jQuery.ready();
+}
+
+// Catch cases where $(document).ready() is called
+// after the browser event has already occurred.
+// Support: IE <=9 - 10 only
+// Older IE sometimes signals "interactive" too soon
+if ( document.readyState === "complete" ||
+ ( document.readyState !== "loading" && !document.documentElement.doScroll ) ) {
+
+ // Handle it asynchronously to allow scripts the opportunity to delay ready
+ window.setTimeout( jQuery.ready );
+
+} else {
+
+ // Use the handy event callback
+ document.addEventListener( "DOMContentLoaded", completed );
+
+ // A fallback to window.onload, that will always work
+ window.addEventListener( "load", completed );
+}
+
+
+
+
+// Multifunctional method to get and set values of a collection
+// The value/s can optionally be executed if it's a function
+var access = function( elems, fn, key, value, chainable, emptyGet, raw ) {
+ var i = 0,
+ len = elems.length,
+ bulk = key == null;
+
+ // Sets many values
+ if ( toType( key ) === "object" ) {
+ chainable = true;
+ for ( i in key ) {
+ access( elems, fn, i, key[ i ], true, emptyGet, raw );
+ }
+
+ // Sets one value
+ } else if ( value !== undefined ) {
+ chainable = true;
+
+ if ( !isFunction( value ) ) {
+ raw = true;
+ }
+
+ if ( bulk ) {
+
+ // Bulk operations run against the entire set
+ if ( raw ) {
+ fn.call( elems, value );
+ fn = null;
+
+ // ...except when executing function values
+ } else {
+ bulk = fn;
+ fn = function( elem, key, value ) {
+ return bulk.call( jQuery( elem ), value );
+ };
+ }
+ }
+
+ if ( fn ) {
+ for ( ; i < len; i++ ) {
+ fn(
+ elems[ i ], key, raw ?
+ value :
+ value.call( elems[ i ], i, fn( elems[ i ], key ) )
+ );
+ }
+ }
+ }
+
+ if ( chainable ) {
+ return elems;
+ }
+
+ // Gets
+ if ( bulk ) {
+ return fn.call( elems );
+ }
+
+ return len ? fn( elems[ 0 ], key ) : emptyGet;
+};
+
+
+// Matches dashed string for camelizing
+var rmsPrefix = /^-ms-/,
+ rdashAlpha = /-([a-z])/g;
+
+// Used by camelCase as callback to replace()
+function fcamelCase( all, letter ) {
+ return letter.toUpperCase();
+}
+
+// Convert dashed to camelCase; used by the css and data modules
+// Support: IE <=9 - 11, Edge 12 - 15
+// Microsoft forgot to hump their vendor prefix (#9572)
+function camelCase( string ) {
+ return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase );
+}
+var acceptData = function( owner ) {
+
+ // Accepts only:
+ // - Node
+ // - Node.ELEMENT_NODE
+ // - Node.DOCUMENT_NODE
+ // - Object
+ // - Any
+ return owner.nodeType === 1 || owner.nodeType === 9 || !( +owner.nodeType );
+};
+
+
+
+
+function Data() {
+ this.expando = jQuery.expando + Data.uid++;
+}
+
+Data.uid = 1;
+
+Data.prototype = {
+
+ cache: function( owner ) {
+
+ // Check if the owner object already has a cache
+ var value = owner[ this.expando ];
+
+ // If not, create one
+ if ( !value ) {
+ value = {};
+
+ // We can accept data for non-element nodes in modern browsers,
+ // but we should not, see #8335.
+ // Always return an empty object.
+ if ( acceptData( owner ) ) {
+
+ // If it is a node unlikely to be stringify-ed or looped over
+ // use plain assignment
+ if ( owner.nodeType ) {
+ owner[ this.expando ] = value;
+
+ // Otherwise secure it in a non-enumerable property
+ // configurable must be true to allow the property to be
+ // deleted when data is removed
+ } else {
+ Object.defineProperty( owner, this.expando, {
+ value: value,
+ configurable: true
+ } );
+ }
+ }
+ }
+
+ return value;
+ },
+ set: function( owner, data, value ) {
+ var prop,
+ cache = this.cache( owner );
+
+ // Handle: [ owner, key, value ] args
+ // Always use camelCase key (gh-2257)
+ if ( typeof data === "string" ) {
+ cache[ camelCase( data ) ] = value;
+
+ // Handle: [ owner, { properties } ] args
+ } else {
+
+ // Copy the properties one-by-one to the cache object
+ for ( prop in data ) {
+ cache[ camelCase( prop ) ] = data[ prop ];
+ }
+ }
+ return cache;
+ },
+ get: function( owner, key ) {
+ return key === undefined ?
+ this.cache( owner ) :
+
+ // Always use camelCase key (gh-2257)
+ owner[ this.expando ] && owner[ this.expando ][ camelCase( key ) ];
+ },
+ access: function( owner, key, value ) {
+
+ // In cases where either:
+ //
+ // 1. No key was specified
+ // 2. A string key was specified, but no value provided
+ //
+ // Take the "read" path and allow the get method to determine
+ // which value to return, respectively either:
+ //
+ // 1. The entire cache object
+ // 2. The data stored at the key
+ //
+ if ( key === undefined ||
+ ( ( key && typeof key === "string" ) && value === undefined ) ) {
+
+ return this.get( owner, key );
+ }
+
+ // When the key is not a string, or both a key and value
+ // are specified, set or extend (existing objects) with either:
+ //
+ // 1. An object of properties
+ // 2. A key and value
+ //
+ this.set( owner, key, value );
+
+ // Since the "set" path can have two possible entry points
+ // return the expected data based on which path was taken[*]
+ return value !== undefined ? value : key;
+ },
+ remove: function( owner, key ) {
+ var i,
+ cache = owner[ this.expando ];
+
+ if ( cache === undefined ) {
+ return;
+ }
+
+ if ( key !== undefined ) {
+
+ // Support array or space separated string of keys
+ if ( Array.isArray( key ) ) {
+
+ // If key is an array of keys...
+ // We always set camelCase keys, so remove that.
+ key = key.map( camelCase );
+ } else {
+ key = camelCase( key );
+
+ // If a key with the spaces exists, use it.
+ // Otherwise, create an array by matching non-whitespace
+ key = key in cache ?
+ [ key ] :
+ ( key.match( rnothtmlwhite ) || [] );
+ }
+
+ i = key.length;
+
+ while ( i-- ) {
+ delete cache[ key[ i ] ];
+ }
+ }
+
+ // Remove the expando if there's no more data
+ if ( key === undefined || jQuery.isEmptyObject( cache ) ) {
+
+ // Support: Chrome <=35 - 45
+ // Webkit & Blink performance suffers when deleting properties
+ // from DOM nodes, so set to undefined instead
+ // https://bugs.chromium.org/p/chromium/issues/detail?id=378607 (bug restricted)
+ if ( owner.nodeType ) {
+ owner[ this.expando ] = undefined;
+ } else {
+ delete owner[ this.expando ];
+ }
+ }
+ },
+ hasData: function( owner ) {
+ var cache = owner[ this.expando ];
+ return cache !== undefined && !jQuery.isEmptyObject( cache );
+ }
+};
+var dataPriv = new Data();
+
+var dataUser = new Data();
+
+
+
+// Implementation Summary
+//
+// 1. Enforce API surface and semantic compatibility with 1.9.x branch
+// 2. Improve the module's maintainability by reducing the storage
+// paths to a single mechanism.
+// 3. Use the same single mechanism to support "private" and "user" data.
+// 4. _Never_ expose "private" data to user code (TODO: Drop _data, _removeData)
+// 5. Avoid exposing implementation details on user objects (eg. expando properties)
+// 6. Provide a clear path for implementation upgrade to WeakMap in 2014
+
+var rbrace = /^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,
+ rmultiDash = /[A-Z]/g;
+
+function getData( data ) {
+ if ( data === "true" ) {
+ return true;
+ }
+
+ if ( data === "false" ) {
+ return false;
+ }
+
+ if ( data === "null" ) {
+ return null;
+ }
+
+ // Only convert to a number if it doesn't change the string
+ if ( data === +data + "" ) {
+ return +data;
+ }
+
+ if ( rbrace.test( data ) ) {
+ return JSON.parse( data );
+ }
+
+ return data;
+}
+
+function dataAttr( elem, key, data ) {
+ var name;
+
+ // If nothing was found internally, try to fetch any
+ // data from the HTML5 data-* attribute
+ if ( data === undefined && elem.nodeType === 1 ) {
+ name = "data-" + key.replace( rmultiDash, "-$&" ).toLowerCase();
+ data = elem.getAttribute( name );
+
+ if ( typeof data === "string" ) {
+ try {
+ data = getData( data );
+ } catch ( e ) {}
+
+ // Make sure we set the data so it isn't changed later
+ dataUser.set( elem, key, data );
+ } else {
+ data = undefined;
+ }
+ }
+ return data;
+}
+
+jQuery.extend( {
+ hasData: function( elem ) {
+ return dataUser.hasData( elem ) || dataPriv.hasData( elem );
+ },
+
+ data: function( elem, name, data ) {
+ return dataUser.access( elem, name, data );
+ },
+
+ removeData: function( elem, name ) {
+ dataUser.remove( elem, name );
+ },
+
+ // TODO: Now that all calls to _data and _removeData have been replaced
+ // with direct calls to dataPriv methods, these can be deprecated.
+ _data: function( elem, name, data ) {
+ return dataPriv.access( elem, name, data );
+ },
+
+ _removeData: function( elem, name ) {
+ dataPriv.remove( elem, name );
+ }
+} );
+
+jQuery.fn.extend( {
+ data: function( key, value ) {
+ var i, name, data,
+ elem = this[ 0 ],
+ attrs = elem && elem.attributes;
+
+ // Gets all values
+ if ( key === undefined ) {
+ if ( this.length ) {
+ data = dataUser.get( elem );
+
+ if ( elem.nodeType === 1 && !dataPriv.get( elem, "hasDataAttrs" ) ) {
+ i = attrs.length;
+ while ( i-- ) {
+
+ // Support: IE 11 only
+ // The attrs elements can be null (#14894)
+ if ( attrs[ i ] ) {
+ name = attrs[ i ].name;
+ if ( name.indexOf( "data-" ) === 0 ) {
+ name = camelCase( name.slice( 5 ) );
+ dataAttr( elem, name, data[ name ] );
+ }
+ }
+ }
+ dataPriv.set( elem, "hasDataAttrs", true );
+ }
+ }
+
+ return data;
+ }
+
+ // Sets multiple values
+ if ( typeof key === "object" ) {
+ return this.each( function() {
+ dataUser.set( this, key );
+ } );
+ }
+
+ return access( this, function( value ) {
+ var data;
+
+ // The calling jQuery object (element matches) is not empty
+ // (and therefore has an element appears at this[ 0 ]) and the
+ // `value` parameter was not undefined. An empty jQuery object
+ // will result in `undefined` for elem = this[ 0 ] which will
+ // throw an exception if an attempt to read a data cache is made.
+ if ( elem && value === undefined ) {
+
+ // Attempt to get data from the cache
+ // The key will always be camelCased in Data
+ data = dataUser.get( elem, key );
+ if ( data !== undefined ) {
+ return data;
+ }
+
+ // Attempt to "discover" the data in
+ // HTML5 custom data-* attrs
+ data = dataAttr( elem, key );
+ if ( data !== undefined ) {
+ return data;
+ }
+
+ // We tried really hard, but the data doesn't exist.
+ return;
+ }
+
+ // Set the data...
+ this.each( function() {
+
+ // We always store the camelCased key
+ dataUser.set( this, key, value );
+ } );
+ }, null, value, arguments.length > 1, null, true );
+ },
+
+ removeData: function( key ) {
+ return this.each( function() {
+ dataUser.remove( this, key );
+ } );
+ }
+} );
+
+
+jQuery.extend( {
+ queue: function( elem, type, data ) {
+ var queue;
+
+ if ( elem ) {
+ type = ( type || "fx" ) + "queue";
+ queue = dataPriv.get( elem, type );
+
+ // Speed up dequeue by getting out quickly if this is just a lookup
+ if ( data ) {
+ if ( !queue || Array.isArray( data ) ) {
+ queue = dataPriv.access( elem, type, jQuery.makeArray( data ) );
+ } else {
+ queue.push( data );
+ }
+ }
+ return queue || [];
+ }
+ },
+
+ dequeue: function( elem, type ) {
+ type = type || "fx";
+
+ var queue = jQuery.queue( elem, type ),
+ startLength = queue.length,
+ fn = queue.shift(),
+ hooks = jQuery._queueHooks( elem, type ),
+ next = function() {
+ jQuery.dequeue( elem, type );
+ };
+
+ // If the fx queue is dequeued, always remove the progress sentinel
+ if ( fn === "inprogress" ) {
+ fn = queue.shift();
+ startLength--;
+ }
+
+ if ( fn ) {
+
+ // Add a progress sentinel to prevent the fx queue from being
+ // automatically dequeued
+ if ( type === "fx" ) {
+ queue.unshift( "inprogress" );
+ }
+
+ // Clear up the last queue stop function
+ delete hooks.stop;
+ fn.call( elem, next, hooks );
+ }
+
+ if ( !startLength && hooks ) {
+ hooks.empty.fire();
+ }
+ },
+
+ // Not public - generate a queueHooks object, or return the current one
+ _queueHooks: function( elem, type ) {
+ var key = type + "queueHooks";
+ return dataPriv.get( elem, key ) || dataPriv.access( elem, key, {
+ empty: jQuery.Callbacks( "once memory" ).add( function() {
+ dataPriv.remove( elem, [ type + "queue", key ] );
+ } )
+ } );
+ }
+} );
+
+jQuery.fn.extend( {
+ queue: function( type, data ) {
+ var setter = 2;
+
+ if ( typeof type !== "string" ) {
+ data = type;
+ type = "fx";
+ setter--;
+ }
+
+ if ( arguments.length < setter ) {
+ return jQuery.queue( this[ 0 ], type );
+ }
+
+ return data === undefined ?
+ this :
+ this.each( function() {
+ var queue = jQuery.queue( this, type, data );
+
+ // Ensure a hooks for this queue
+ jQuery._queueHooks( this, type );
+
+ if ( type === "fx" && queue[ 0 ] !== "inprogress" ) {
+ jQuery.dequeue( this, type );
+ }
+ } );
+ },
+ dequeue: function( type ) {
+ return this.each( function() {
+ jQuery.dequeue( this, type );
+ } );
+ },
+ clearQueue: function( type ) {
+ return this.queue( type || "fx", [] );
+ },
+
+ // Get a promise resolved when queues of a certain type
+ // are emptied (fx is the type by default)
+ promise: function( type, obj ) {
+ var tmp,
+ count = 1,
+ defer = jQuery.Deferred(),
+ elements = this,
+ i = this.length,
+ resolve = function() {
+ if ( !( --count ) ) {
+ defer.resolveWith( elements, [ elements ] );
+ }
+ };
+
+ if ( typeof type !== "string" ) {
+ obj = type;
+ type = undefined;
+ }
+ type = type || "fx";
+
+ while ( i-- ) {
+ tmp = dataPriv.get( elements[ i ], type + "queueHooks" );
+ if ( tmp && tmp.empty ) {
+ count++;
+ tmp.empty.add( resolve );
+ }
+ }
+ resolve();
+ return defer.promise( obj );
+ }
+} );
+var pnum = ( /[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/ ).source;
+
+var rcssNum = new RegExp( "^(?:([+-])=|)(" + pnum + ")([a-z%]*)$", "i" );
+
+
+var cssExpand = [ "Top", "Right", "Bottom", "Left" ];
+
+var documentElement = document.documentElement;
+
+
+
+ var isAttached = function( elem ) {
+ return jQuery.contains( elem.ownerDocument, elem );
+ },
+ composed = { composed: true };
+
+ // Support: IE 9 - 11+, Edge 12 - 18+, iOS 10.0 - 10.2 only
+ // Check attachment across shadow DOM boundaries when possible (gh-3504)
+ // Support: iOS 10.0-10.2 only
+ // Early iOS 10 versions support `attachShadow` but not `getRootNode`,
+ // leading to errors. We need to check for `getRootNode`.
+ if ( documentElement.getRootNode ) {
+ isAttached = function( elem ) {
+ return jQuery.contains( elem.ownerDocument, elem ) ||
+ elem.getRootNode( composed ) === elem.ownerDocument;
+ };
+ }
+var isHiddenWithinTree = function( elem, el ) {
+
+ // isHiddenWithinTree might be called from jQuery#filter function;
+ // in that case, element will be second argument
+ elem = el || elem;
+
+ // Inline style trumps all
+ return elem.style.display === "none" ||
+ elem.style.display === "" &&
+
+ // Otherwise, check computed style
+ // Support: Firefox <=43 - 45
+ // Disconnected elements can have computed display: none, so first confirm that elem is
+ // in the document.
+ isAttached( elem ) &&
+
+ jQuery.css( elem, "display" ) === "none";
+ };
+
+var swap = function( elem, options, callback, args ) {
+ var ret, name,
+ old = {};
+
+ // Remember the old values, and insert the new ones
+ for ( name in options ) {
+ old[ name ] = elem.style[ name ];
+ elem.style[ name ] = options[ name ];
+ }
+
+ ret = callback.apply( elem, args || [] );
+
+ // Revert the old values
+ for ( name in options ) {
+ elem.style[ name ] = old[ name ];
+ }
+
+ return ret;
+};
+
+
+
+
+function adjustCSS( elem, prop, valueParts, tween ) {
+ var adjusted, scale,
+ maxIterations = 20,
+ currentValue = tween ?
+ function() {
+ return tween.cur();
+ } :
+ function() {
+ return jQuery.css( elem, prop, "" );
+ },
+ initial = currentValue(),
+ unit = valueParts && valueParts[ 3 ] || ( jQuery.cssNumber[ prop ] ? "" : "px" ),
+
+ // Starting value computation is required for potential unit mismatches
+ initialInUnit = elem.nodeType &&
+ ( jQuery.cssNumber[ prop ] || unit !== "px" && +initial ) &&
+ rcssNum.exec( jQuery.css( elem, prop ) );
+
+ if ( initialInUnit && initialInUnit[ 3 ] !== unit ) {
+
+ // Support: Firefox <=54
+ // Halve the iteration target value to prevent interference from CSS upper bounds (gh-2144)
+ initial = initial / 2;
+
+ // Trust units reported by jQuery.css
+ unit = unit || initialInUnit[ 3 ];
+
+ // Iteratively approximate from a nonzero starting point
+ initialInUnit = +initial || 1;
+
+ while ( maxIterations-- ) {
+
+ // Evaluate and update our best guess (doubling guesses that zero out).
+ // Finish if the scale equals or crosses 1 (making the old*new product non-positive).
+ jQuery.style( elem, prop, initialInUnit + unit );
+ if ( ( 1 - scale ) * ( 1 - ( scale = currentValue() / initial || 0.5 ) ) <= 0 ) {
+ maxIterations = 0;
+ }
+ initialInUnit = initialInUnit / scale;
+
+ }
+
+ initialInUnit = initialInUnit * 2;
+ jQuery.style( elem, prop, initialInUnit + unit );
+
+ // Make sure we update the tween properties later on
+ valueParts = valueParts || [];
+ }
+
+ if ( valueParts ) {
+ initialInUnit = +initialInUnit || +initial || 0;
+
+ // Apply relative offset (+=/-=) if specified
+ adjusted = valueParts[ 1 ] ?
+ initialInUnit + ( valueParts[ 1 ] + 1 ) * valueParts[ 2 ] :
+ +valueParts[ 2 ];
+ if ( tween ) {
+ tween.unit = unit;
+ tween.start = initialInUnit;
+ tween.end = adjusted;
+ }
+ }
+ return adjusted;
+}
+
+
+var defaultDisplayMap = {};
+
+function getDefaultDisplay( elem ) {
+ var temp,
+ doc = elem.ownerDocument,
+ nodeName = elem.nodeName,
+ display = defaultDisplayMap[ nodeName ];
+
+ if ( display ) {
+ return display;
+ }
+
+ temp = doc.body.appendChild( doc.createElement( nodeName ) );
+ display = jQuery.css( temp, "display" );
+
+ temp.parentNode.removeChild( temp );
+
+ if ( display === "none" ) {
+ display = "block";
+ }
+ defaultDisplayMap[ nodeName ] = display;
+
+ return display;
+}
+
+function showHide( elements, show ) {
+ var display, elem,
+ values = [],
+ index = 0,
+ length = elements.length;
+
+ // Determine new display value for elements that need to change
+ for ( ; index < length; index++ ) {
+ elem = elements[ index ];
+ if ( !elem.style ) {
+ continue;
+ }
+
+ display = elem.style.display;
+ if ( show ) {
+
+ // Since we force visibility upon cascade-hidden elements, an immediate (and slow)
+ // check is required in this first loop unless we have a nonempty display value (either
+ // inline or about-to-be-restored)
+ if ( display === "none" ) {
+ values[ index ] = dataPriv.get( elem, "display" ) || null;
+ if ( !values[ index ] ) {
+ elem.style.display = "";
+ }
+ }
+ if ( elem.style.display === "" && isHiddenWithinTree( elem ) ) {
+ values[ index ] = getDefaultDisplay( elem );
+ }
+ } else {
+ if ( display !== "none" ) {
+ values[ index ] = "none";
+
+ // Remember what we're overwriting
+ dataPriv.set( elem, "display", display );
+ }
+ }
+ }
+
+ // Set the display of the elements in a second loop to avoid constant reflow
+ for ( index = 0; index < length; index++ ) {
+ if ( values[ index ] != null ) {
+ elements[ index ].style.display = values[ index ];
+ }
+ }
+
+ return elements;
+}
+
+jQuery.fn.extend( {
+ show: function() {
+ return showHide( this, true );
+ },
+ hide: function() {
+ return showHide( this );
+ },
+ toggle: function( state ) {
+ if ( typeof state === "boolean" ) {
+ return state ? this.show() : this.hide();
+ }
+
+ return this.each( function() {
+ if ( isHiddenWithinTree( this ) ) {
+ jQuery( this ).show();
+ } else {
+ jQuery( this ).hide();
+ }
+ } );
+ }
+} );
+var rcheckableType = ( /^(?:checkbox|radio)$/i );
+
+var rtagName = ( /<([a-z][^\/\0>\x20\t\r\n\f]*)/i );
+
+var rscriptType = ( /^$|^module$|\/(?:java|ecma)script/i );
+
+
+
+// We have to close these tags to support XHTML (#13200)
+var wrapMap = {
+
+ // Support: IE <=9 only
+ option: [ 1, "", " " ],
+
+ // XHTML parsers do not magically insert elements in the
+ // same way that tag soup parsers do. So we cannot shorten
+ // this by omitting or other required elements.
+ thead: [ 1, "" ],
+ col: [ 2, "" ],
+ tr: [ 2, "" ],
+ td: [ 3, "" ],
+
+ _default: [ 0, "", "" ]
+};
+
+// Support: IE <=9 only
+wrapMap.optgroup = wrapMap.option;
+
+wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead;
+wrapMap.th = wrapMap.td;
+
+
+function getAll( context, tag ) {
+
+ // Support: IE <=9 - 11 only
+ // Use typeof to avoid zero-argument method invocation on host objects (#15151)
+ var ret;
+
+ if ( typeof context.getElementsByTagName !== "undefined" ) {
+ ret = context.getElementsByTagName( tag || "*" );
+
+ } else if ( typeof context.querySelectorAll !== "undefined" ) {
+ ret = context.querySelectorAll( tag || "*" );
+
+ } else {
+ ret = [];
+ }
+
+ if ( tag === undefined || tag && nodeName( context, tag ) ) {
+ return jQuery.merge( [ context ], ret );
+ }
+
+ return ret;
+}
+
+
+// Mark scripts as having already been evaluated
+function setGlobalEval( elems, refElements ) {
+ var i = 0,
+ l = elems.length;
+
+ for ( ; i < l; i++ ) {
+ dataPriv.set(
+ elems[ i ],
+ "globalEval",
+ !refElements || dataPriv.get( refElements[ i ], "globalEval" )
+ );
+ }
+}
+
+
+var rhtml = /<|?\w+;/;
+
+function buildFragment( elems, context, scripts, selection, ignored ) {
+ var elem, tmp, tag, wrap, attached, j,
+ fragment = context.createDocumentFragment(),
+ nodes = [],
+ i = 0,
+ l = elems.length;
+
+ for ( ; i < l; i++ ) {
+ elem = elems[ i ];
+
+ if ( elem || elem === 0 ) {
+
+ // Add nodes directly
+ if ( toType( elem ) === "object" ) {
+
+ // Support: Android <=4.0 only, PhantomJS 1 only
+ // push.apply(_, arraylike) throws on ancient WebKit
+ jQuery.merge( nodes, elem.nodeType ? [ elem ] : elem );
+
+ // Convert non-html into a text node
+ } else if ( !rhtml.test( elem ) ) {
+ nodes.push( context.createTextNode( elem ) );
+
+ // Convert html into DOM nodes
+ } else {
+ tmp = tmp || fragment.appendChild( context.createElement( "div" ) );
+
+ // Deserialize a standard representation
+ tag = ( rtagName.exec( elem ) || [ "", "" ] )[ 1 ].toLowerCase();
+ wrap = wrapMap[ tag ] || wrapMap._default;
+ tmp.innerHTML = wrap[ 1 ] + jQuery.htmlPrefilter( elem ) + wrap[ 2 ];
+
+ // Descend through wrappers to the right content
+ j = wrap[ 0 ];
+ while ( j-- ) {
+ tmp = tmp.lastChild;
+ }
+
+ // Support: Android <=4.0 only, PhantomJS 1 only
+ // push.apply(_, arraylike) throws on ancient WebKit
+ jQuery.merge( nodes, tmp.childNodes );
+
+ // Remember the top-level container
+ tmp = fragment.firstChild;
+
+ // Ensure the created nodes are orphaned (#12392)
+ tmp.textContent = "";
+ }
+ }
+ }
+
+ // Remove wrapper from fragment
+ fragment.textContent = "";
+
+ i = 0;
+ while ( ( elem = nodes[ i++ ] ) ) {
+
+ // Skip elements already in the context collection (trac-4087)
+ if ( selection && jQuery.inArray( elem, selection ) > -1 ) {
+ if ( ignored ) {
+ ignored.push( elem );
+ }
+ continue;
+ }
+
+ attached = isAttached( elem );
+
+ // Append to fragment
+ tmp = getAll( fragment.appendChild( elem ), "script" );
+
+ // Preserve script evaluation history
+ if ( attached ) {
+ setGlobalEval( tmp );
+ }
+
+ // Capture executables
+ if ( scripts ) {
+ j = 0;
+ while ( ( elem = tmp[ j++ ] ) ) {
+ if ( rscriptType.test( elem.type || "" ) ) {
+ scripts.push( elem );
+ }
+ }
+ }
+ }
+
+ return fragment;
+}
+
+
+( function() {
+ var fragment = document.createDocumentFragment(),
+ div = fragment.appendChild( document.createElement( "div" ) ),
+ input = document.createElement( "input" );
+
+ // Support: Android 4.0 - 4.3 only
+ // Check state lost if the name is set (#11217)
+ // Support: Windows Web Apps (WWA)
+ // `name` and `type` must use .setAttribute for WWA (#14901)
+ input.setAttribute( "type", "radio" );
+ input.setAttribute( "checked", "checked" );
+ input.setAttribute( "name", "t" );
+
+ div.appendChild( input );
+
+ // Support: Android <=4.1 only
+ // Older WebKit doesn't clone checked state correctly in fragments
+ support.checkClone = div.cloneNode( true ).cloneNode( true ).lastChild.checked;
+
+ // Support: IE <=11 only
+ // Make sure textarea (and checkbox) defaultValue is properly cloned
+ div.innerHTML = "";
+ support.noCloneChecked = !!div.cloneNode( true ).lastChild.defaultValue;
+} )();
+
+
+var
+ rkeyEvent = /^key/,
+ rmouseEvent = /^(?:mouse|pointer|contextmenu|drag|drop)|click/,
+ rtypenamespace = /^([^.]*)(?:\.(.+)|)/;
+
+function returnTrue() {
+ return true;
+}
+
+function returnFalse() {
+ return false;
+}
+
+// Support: IE <=9 - 11+
+// focus() and blur() are asynchronous, except when they are no-op.
+// So expect focus to be synchronous when the element is already active,
+// and blur to be synchronous when the element is not already active.
+// (focus and blur are always synchronous in other supported browsers,
+// this just defines when we can count on it).
+function expectSync( elem, type ) {
+ return ( elem === safeActiveElement() ) === ( type === "focus" );
+}
+
+// Support: IE <=9 only
+// Accessing document.activeElement can throw unexpectedly
+// https://bugs.jquery.com/ticket/13393
+function safeActiveElement() {
+ try {
+ return document.activeElement;
+ } catch ( err ) { }
+}
+
+function on( elem, types, selector, data, fn, one ) {
+ var origFn, type;
+
+ // Types can be a map of types/handlers
+ if ( typeof types === "object" ) {
+
+ // ( types-Object, selector, data )
+ if ( typeof selector !== "string" ) {
+
+ // ( types-Object, data )
+ data = data || selector;
+ selector = undefined;
+ }
+ for ( type in types ) {
+ on( elem, type, selector, data, types[ type ], one );
+ }
+ return elem;
+ }
+
+ if ( data == null && fn == null ) {
+
+ // ( types, fn )
+ fn = selector;
+ data = selector = undefined;
+ } else if ( fn == null ) {
+ if ( typeof selector === "string" ) {
+
+ // ( types, selector, fn )
+ fn = data;
+ data = undefined;
+ } else {
+
+ // ( types, data, fn )
+ fn = data;
+ data = selector;
+ selector = undefined;
+ }
+ }
+ if ( fn === false ) {
+ fn = returnFalse;
+ } else if ( !fn ) {
+ return elem;
+ }
+
+ if ( one === 1 ) {
+ origFn = fn;
+ fn = function( event ) {
+
+ // Can use an empty set, since event contains the info
+ jQuery().off( event );
+ return origFn.apply( this, arguments );
+ };
+
+ // Use same guid so caller can remove using origFn
+ fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ );
+ }
+ return elem.each( function() {
+ jQuery.event.add( this, types, fn, data, selector );
+ } );
+}
+
+/*
+ * Helper functions for managing events -- not part of the public interface.
+ * Props to Dean Edwards' addEvent library for many of the ideas.
+ */
+jQuery.event = {
+
+ global: {},
+
+ add: function( elem, types, handler, data, selector ) {
+
+ var handleObjIn, eventHandle, tmp,
+ events, t, handleObj,
+ special, handlers, type, namespaces, origType,
+ elemData = dataPriv.get( elem );
+
+ // Don't attach events to noData or text/comment nodes (but allow plain objects)
+ if ( !elemData ) {
+ return;
+ }
+
+ // Caller can pass in an object of custom data in lieu of the handler
+ if ( handler.handler ) {
+ handleObjIn = handler;
+ handler = handleObjIn.handler;
+ selector = handleObjIn.selector;
+ }
+
+ // Ensure that invalid selectors throw exceptions at attach time
+ // Evaluate against documentElement in case elem is a non-element node (e.g., document)
+ if ( selector ) {
+ jQuery.find.matchesSelector( documentElement, selector );
+ }
+
+ // Make sure that the handler has a unique ID, used to find/remove it later
+ if ( !handler.guid ) {
+ handler.guid = jQuery.guid++;
+ }
+
+ // Init the element's event structure and main handler, if this is the first
+ if ( !( events = elemData.events ) ) {
+ events = elemData.events = {};
+ }
+ if ( !( eventHandle = elemData.handle ) ) {
+ eventHandle = elemData.handle = function( e ) {
+
+ // Discard the second event of a jQuery.event.trigger() and
+ // when an event is called after a page has unloaded
+ return typeof jQuery !== "undefined" && jQuery.event.triggered !== e.type ?
+ jQuery.event.dispatch.apply( elem, arguments ) : undefined;
+ };
+ }
+
+ // Handle multiple events separated by a space
+ types = ( types || "" ).match( rnothtmlwhite ) || [ "" ];
+ t = types.length;
+ while ( t-- ) {
+ tmp = rtypenamespace.exec( types[ t ] ) || [];
+ type = origType = tmp[ 1 ];
+ namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort();
+
+ // There *must* be a type, no attaching namespace-only handlers
+ if ( !type ) {
+ continue;
+ }
+
+ // If event changes its type, use the special event handlers for the changed type
+ special = jQuery.event.special[ type ] || {};
+
+ // If selector defined, determine special event api type, otherwise given type
+ type = ( selector ? special.delegateType : special.bindType ) || type;
+
+ // Update special based on newly reset type
+ special = jQuery.event.special[ type ] || {};
+
+ // handleObj is passed to all event handlers
+ handleObj = jQuery.extend( {
+ type: type,
+ origType: origType,
+ data: data,
+ handler: handler,
+ guid: handler.guid,
+ selector: selector,
+ needsContext: selector && jQuery.expr.match.needsContext.test( selector ),
+ namespace: namespaces.join( "." )
+ }, handleObjIn );
+
+ // Init the event handler queue if we're the first
+ if ( !( handlers = events[ type ] ) ) {
+ handlers = events[ type ] = [];
+ handlers.delegateCount = 0;
+
+ // Only use addEventListener if the special events handler returns false
+ if ( !special.setup ||
+ special.setup.call( elem, data, namespaces, eventHandle ) === false ) {
+
+ if ( elem.addEventListener ) {
+ elem.addEventListener( type, eventHandle );
+ }
+ }
+ }
+
+ if ( special.add ) {
+ special.add.call( elem, handleObj );
+
+ if ( !handleObj.handler.guid ) {
+ handleObj.handler.guid = handler.guid;
+ }
+ }
+
+ // Add to the element's handler list, delegates in front
+ if ( selector ) {
+ handlers.splice( handlers.delegateCount++, 0, handleObj );
+ } else {
+ handlers.push( handleObj );
+ }
+
+ // Keep track of which events have ever been used, for event optimization
+ jQuery.event.global[ type ] = true;
+ }
+
+ },
+
+ // Detach an event or set of events from an element
+ remove: function( elem, types, handler, selector, mappedTypes ) {
+
+ var j, origCount, tmp,
+ events, t, handleObj,
+ special, handlers, type, namespaces, origType,
+ elemData = dataPriv.hasData( elem ) && dataPriv.get( elem );
+
+ if ( !elemData || !( events = elemData.events ) ) {
+ return;
+ }
+
+ // Once for each type.namespace in types; type may be omitted
+ types = ( types || "" ).match( rnothtmlwhite ) || [ "" ];
+ t = types.length;
+ while ( t-- ) {
+ tmp = rtypenamespace.exec( types[ t ] ) || [];
+ type = origType = tmp[ 1 ];
+ namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort();
+
+ // Unbind all events (on this namespace, if provided) for the element
+ if ( !type ) {
+ for ( type in events ) {
+ jQuery.event.remove( elem, type + types[ t ], handler, selector, true );
+ }
+ continue;
+ }
+
+ special = jQuery.event.special[ type ] || {};
+ type = ( selector ? special.delegateType : special.bindType ) || type;
+ handlers = events[ type ] || [];
+ tmp = tmp[ 2 ] &&
+ new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" );
+
+ // Remove matching events
+ origCount = j = handlers.length;
+ while ( j-- ) {
+ handleObj = handlers[ j ];
+
+ if ( ( mappedTypes || origType === handleObj.origType ) &&
+ ( !handler || handler.guid === handleObj.guid ) &&
+ ( !tmp || tmp.test( handleObj.namespace ) ) &&
+ ( !selector || selector === handleObj.selector ||
+ selector === "**" && handleObj.selector ) ) {
+ handlers.splice( j, 1 );
+
+ if ( handleObj.selector ) {
+ handlers.delegateCount--;
+ }
+ if ( special.remove ) {
+ special.remove.call( elem, handleObj );
+ }
+ }
+ }
+
+ // Remove generic event handler if we removed something and no more handlers exist
+ // (avoids potential for endless recursion during removal of special event handlers)
+ if ( origCount && !handlers.length ) {
+ if ( !special.teardown ||
+ special.teardown.call( elem, namespaces, elemData.handle ) === false ) {
+
+ jQuery.removeEvent( elem, type, elemData.handle );
+ }
+
+ delete events[ type ];
+ }
+ }
+
+ // Remove data and the expando if it's no longer used
+ if ( jQuery.isEmptyObject( events ) ) {
+ dataPriv.remove( elem, "handle events" );
+ }
+ },
+
+ dispatch: function( nativeEvent ) {
+
+ // Make a writable jQuery.Event from the native event object
+ var event = jQuery.event.fix( nativeEvent );
+
+ var i, j, ret, matched, handleObj, handlerQueue,
+ args = new Array( arguments.length ),
+ handlers = ( dataPriv.get( this, "events" ) || {} )[ event.type ] || [],
+ special = jQuery.event.special[ event.type ] || {};
+
+ // Use the fix-ed jQuery.Event rather than the (read-only) native event
+ args[ 0 ] = event;
+
+ for ( i = 1; i < arguments.length; i++ ) {
+ args[ i ] = arguments[ i ];
+ }
+
+ event.delegateTarget = this;
+
+ // Call the preDispatch hook for the mapped type, and let it bail if desired
+ if ( special.preDispatch && special.preDispatch.call( this, event ) === false ) {
+ return;
+ }
+
+ // Determine handlers
+ handlerQueue = jQuery.event.handlers.call( this, event, handlers );
+
+ // Run delegates first; they may want to stop propagation beneath us
+ i = 0;
+ while ( ( matched = handlerQueue[ i++ ] ) && !event.isPropagationStopped() ) {
+ event.currentTarget = matched.elem;
+
+ j = 0;
+ while ( ( handleObj = matched.handlers[ j++ ] ) &&
+ !event.isImmediatePropagationStopped() ) {
+
+ // If the event is namespaced, then each handler is only invoked if it is
+ // specially universal or its namespaces are a superset of the event's.
+ if ( !event.rnamespace || handleObj.namespace === false ||
+ event.rnamespace.test( handleObj.namespace ) ) {
+
+ event.handleObj = handleObj;
+ event.data = handleObj.data;
+
+ ret = ( ( jQuery.event.special[ handleObj.origType ] || {} ).handle ||
+ handleObj.handler ).apply( matched.elem, args );
+
+ if ( ret !== undefined ) {
+ if ( ( event.result = ret ) === false ) {
+ event.preventDefault();
+ event.stopPropagation();
+ }
+ }
+ }
+ }
+ }
+
+ // Call the postDispatch hook for the mapped type
+ if ( special.postDispatch ) {
+ special.postDispatch.call( this, event );
+ }
+
+ return event.result;
+ },
+
+ handlers: function( event, handlers ) {
+ var i, handleObj, sel, matchedHandlers, matchedSelectors,
+ handlerQueue = [],
+ delegateCount = handlers.delegateCount,
+ cur = event.target;
+
+ // Find delegate handlers
+ if ( delegateCount &&
+
+ // Support: IE <=9
+ // Black-hole SVG instance trees (trac-13180)
+ cur.nodeType &&
+
+ // Support: Firefox <=42
+ // Suppress spec-violating clicks indicating a non-primary pointer button (trac-3861)
+ // https://www.w3.org/TR/DOM-Level-3-Events/#event-type-click
+ // Support: IE 11 only
+ // ...but not arrow key "clicks" of radio inputs, which can have `button` -1 (gh-2343)
+ !( event.type === "click" && event.button >= 1 ) ) {
+
+ for ( ; cur !== this; cur = cur.parentNode || this ) {
+
+ // Don't check non-elements (#13208)
+ // Don't process clicks on disabled elements (#6911, #8165, #11382, #11764)
+ if ( cur.nodeType === 1 && !( event.type === "click" && cur.disabled === true ) ) {
+ matchedHandlers = [];
+ matchedSelectors = {};
+ for ( i = 0; i < delegateCount; i++ ) {
+ handleObj = handlers[ i ];
+
+ // Don't conflict with Object.prototype properties (#13203)
+ sel = handleObj.selector + " ";
+
+ if ( matchedSelectors[ sel ] === undefined ) {
+ matchedSelectors[ sel ] = handleObj.needsContext ?
+ jQuery( sel, this ).index( cur ) > -1 :
+ jQuery.find( sel, this, null, [ cur ] ).length;
+ }
+ if ( matchedSelectors[ sel ] ) {
+ matchedHandlers.push( handleObj );
+ }
+ }
+ if ( matchedHandlers.length ) {
+ handlerQueue.push( { elem: cur, handlers: matchedHandlers } );
+ }
+ }
+ }
+ }
+
+ // Add the remaining (directly-bound) handlers
+ cur = this;
+ if ( delegateCount < handlers.length ) {
+ handlerQueue.push( { elem: cur, handlers: handlers.slice( delegateCount ) } );
+ }
+
+ return handlerQueue;
+ },
+
+ addProp: function( name, hook ) {
+ Object.defineProperty( jQuery.Event.prototype, name, {
+ enumerable: true,
+ configurable: true,
+
+ get: isFunction( hook ) ?
+ function() {
+ if ( this.originalEvent ) {
+ return hook( this.originalEvent );
+ }
+ } :
+ function() {
+ if ( this.originalEvent ) {
+ return this.originalEvent[ name ];
+ }
+ },
+
+ set: function( value ) {
+ Object.defineProperty( this, name, {
+ enumerable: true,
+ configurable: true,
+ writable: true,
+ value: value
+ } );
+ }
+ } );
+ },
+
+ fix: function( originalEvent ) {
+ return originalEvent[ jQuery.expando ] ?
+ originalEvent :
+ new jQuery.Event( originalEvent );
+ },
+
+ special: {
+ load: {
+
+ // Prevent triggered image.load events from bubbling to window.load
+ noBubble: true
+ },
+ click: {
+
+ // Utilize native event to ensure correct state for checkable inputs
+ setup: function( data ) {
+
+ // For mutual compressibility with _default, replace `this` access with a local var.
+ // `|| data` is dead code meant only to preserve the variable through minification.
+ var el = this || data;
+
+ // Claim the first handler
+ if ( rcheckableType.test( el.type ) &&
+ el.click && nodeName( el, "input" ) ) {
+
+ // dataPriv.set( el, "click", ... )
+ leverageNative( el, "click", returnTrue );
+ }
+
+ // Return false to allow normal processing in the caller
+ return false;
+ },
+ trigger: function( data ) {
+
+ // For mutual compressibility with _default, replace `this` access with a local var.
+ // `|| data` is dead code meant only to preserve the variable through minification.
+ var el = this || data;
+
+ // Force setup before triggering a click
+ if ( rcheckableType.test( el.type ) &&
+ el.click && nodeName( el, "input" ) ) {
+
+ leverageNative( el, "click" );
+ }
+
+ // Return non-false to allow normal event-path propagation
+ return true;
+ },
+
+ // For cross-browser consistency, suppress native .click() on links
+ // Also prevent it if we're currently inside a leveraged native-event stack
+ _default: function( event ) {
+ var target = event.target;
+ return rcheckableType.test( target.type ) &&
+ target.click && nodeName( target, "input" ) &&
+ dataPriv.get( target, "click" ) ||
+ nodeName( target, "a" );
+ }
+ },
+
+ beforeunload: {
+ postDispatch: function( event ) {
+
+ // Support: Firefox 20+
+ // Firefox doesn't alert if the returnValue field is not set.
+ if ( event.result !== undefined && event.originalEvent ) {
+ event.originalEvent.returnValue = event.result;
+ }
+ }
+ }
+ }
+};
+
+// Ensure the presence of an event listener that handles manually-triggered
+// synthetic events by interrupting progress until reinvoked in response to
+// *native* events that it fires directly, ensuring that state changes have
+// already occurred before other listeners are invoked.
+function leverageNative( el, type, expectSync ) {
+
+ // Missing expectSync indicates a trigger call, which must force setup through jQuery.event.add
+ if ( !expectSync ) {
+ if ( dataPriv.get( el, type ) === undefined ) {
+ jQuery.event.add( el, type, returnTrue );
+ }
+ return;
+ }
+
+ // Register the controller as a special universal handler for all event namespaces
+ dataPriv.set( el, type, false );
+ jQuery.event.add( el, type, {
+ namespace: false,
+ handler: function( event ) {
+ var notAsync, result,
+ saved = dataPriv.get( this, type );
+
+ if ( ( event.isTrigger & 1 ) && this[ type ] ) {
+
+ // Interrupt processing of the outer synthetic .trigger()ed event
+ // Saved data should be false in such cases, but might be a leftover capture object
+ // from an async native handler (gh-4350)
+ if ( !saved.length ) {
+
+ // Store arguments for use when handling the inner native event
+ // There will always be at least one argument (an event object), so this array
+ // will not be confused with a leftover capture object.
+ saved = slice.call( arguments );
+ dataPriv.set( this, type, saved );
+
+ // Trigger the native event and capture its result
+ // Support: IE <=9 - 11+
+ // focus() and blur() are asynchronous
+ notAsync = expectSync( this, type );
+ this[ type ]();
+ result = dataPriv.get( this, type );
+ if ( saved !== result || notAsync ) {
+ dataPriv.set( this, type, false );
+ } else {
+ result = {};
+ }
+ if ( saved !== result ) {
+
+ // Cancel the outer synthetic event
+ event.stopImmediatePropagation();
+ event.preventDefault();
+ return result.value;
+ }
+
+ // If this is an inner synthetic event for an event with a bubbling surrogate
+ // (focus or blur), assume that the surrogate already propagated from triggering the
+ // native event and prevent that from happening again here.
+ // This technically gets the ordering wrong w.r.t. to `.trigger()` (in which the
+ // bubbling surrogate propagates *after* the non-bubbling base), but that seems
+ // less bad than duplication.
+ } else if ( ( jQuery.event.special[ type ] || {} ).delegateType ) {
+ event.stopPropagation();
+ }
+
+ // If this is a native event triggered above, everything is now in order
+ // Fire an inner synthetic event with the original arguments
+ } else if ( saved.length ) {
+
+ // ...and capture the result
+ dataPriv.set( this, type, {
+ value: jQuery.event.trigger(
+
+ // Support: IE <=9 - 11+
+ // Extend with the prototype to reset the above stopImmediatePropagation()
+ jQuery.extend( saved[ 0 ], jQuery.Event.prototype ),
+ saved.slice( 1 ),
+ this
+ )
+ } );
+
+ // Abort handling of the native event
+ event.stopImmediatePropagation();
+ }
+ }
+ } );
+}
+
+jQuery.removeEvent = function( elem, type, handle ) {
+
+ // This "if" is needed for plain objects
+ if ( elem.removeEventListener ) {
+ elem.removeEventListener( type, handle );
+ }
+};
+
+jQuery.Event = function( src, props ) {
+
+ // Allow instantiation without the 'new' keyword
+ if ( !( this instanceof jQuery.Event ) ) {
+ return new jQuery.Event( src, props );
+ }
+
+ // Event object
+ if ( src && src.type ) {
+ this.originalEvent = src;
+ this.type = src.type;
+
+ // Events bubbling up the document may have been marked as prevented
+ // by a handler lower down the tree; reflect the correct value.
+ this.isDefaultPrevented = src.defaultPrevented ||
+ src.defaultPrevented === undefined &&
+
+ // Support: Android <=2.3 only
+ src.returnValue === false ?
+ returnTrue :
+ returnFalse;
+
+ // Create target properties
+ // Support: Safari <=6 - 7 only
+ // Target should not be a text node (#504, #13143)
+ this.target = ( src.target && src.target.nodeType === 3 ) ?
+ src.target.parentNode :
+ src.target;
+
+ this.currentTarget = src.currentTarget;
+ this.relatedTarget = src.relatedTarget;
+
+ // Event type
+ } else {
+ this.type = src;
+ }
+
+ // Put explicitly provided properties onto the event object
+ if ( props ) {
+ jQuery.extend( this, props );
+ }
+
+ // Create a timestamp if incoming event doesn't have one
+ this.timeStamp = src && src.timeStamp || Date.now();
+
+ // Mark it as fixed
+ this[ jQuery.expando ] = true;
+};
+
+// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding
+// https://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html
+jQuery.Event.prototype = {
+ constructor: jQuery.Event,
+ isDefaultPrevented: returnFalse,
+ isPropagationStopped: returnFalse,
+ isImmediatePropagationStopped: returnFalse,
+ isSimulated: false,
+
+ preventDefault: function() {
+ var e = this.originalEvent;
+
+ this.isDefaultPrevented = returnTrue;
+
+ if ( e && !this.isSimulated ) {
+ e.preventDefault();
+ }
+ },
+ stopPropagation: function() {
+ var e = this.originalEvent;
+
+ this.isPropagationStopped = returnTrue;
+
+ if ( e && !this.isSimulated ) {
+ e.stopPropagation();
+ }
+ },
+ stopImmediatePropagation: function() {
+ var e = this.originalEvent;
+
+ this.isImmediatePropagationStopped = returnTrue;
+
+ if ( e && !this.isSimulated ) {
+ e.stopImmediatePropagation();
+ }
+
+ this.stopPropagation();
+ }
+};
+
+// Includes all common event props including KeyEvent and MouseEvent specific props
+jQuery.each( {
+ altKey: true,
+ bubbles: true,
+ cancelable: true,
+ changedTouches: true,
+ ctrlKey: true,
+ detail: true,
+ eventPhase: true,
+ metaKey: true,
+ pageX: true,
+ pageY: true,
+ shiftKey: true,
+ view: true,
+ "char": true,
+ code: true,
+ charCode: true,
+ key: true,
+ keyCode: true,
+ button: true,
+ buttons: true,
+ clientX: true,
+ clientY: true,
+ offsetX: true,
+ offsetY: true,
+ pointerId: true,
+ pointerType: true,
+ screenX: true,
+ screenY: true,
+ targetTouches: true,
+ toElement: true,
+ touches: true,
+
+ which: function( event ) {
+ var button = event.button;
+
+ // Add which for key events
+ if ( event.which == null && rkeyEvent.test( event.type ) ) {
+ return event.charCode != null ? event.charCode : event.keyCode;
+ }
+
+ // Add which for click: 1 === left; 2 === middle; 3 === right
+ if ( !event.which && button !== undefined && rmouseEvent.test( event.type ) ) {
+ if ( button & 1 ) {
+ return 1;
+ }
+
+ if ( button & 2 ) {
+ return 3;
+ }
+
+ if ( button & 4 ) {
+ return 2;
+ }
+
+ return 0;
+ }
+
+ return event.which;
+ }
+}, jQuery.event.addProp );
+
+jQuery.each( { focus: "focusin", blur: "focusout" }, function( type, delegateType ) {
+ jQuery.event.special[ type ] = {
+
+ // Utilize native event if possible so blur/focus sequence is correct
+ setup: function() {
+
+ // Claim the first handler
+ // dataPriv.set( this, "focus", ... )
+ // dataPriv.set( this, "blur", ... )
+ leverageNative( this, type, expectSync );
+
+ // Return false to allow normal processing in the caller
+ return false;
+ },
+ trigger: function() {
+
+ // Force setup before trigger
+ leverageNative( this, type );
+
+ // Return non-false to allow normal event-path propagation
+ return true;
+ },
+
+ delegateType: delegateType
+ };
+} );
+
+// Create mouseenter/leave events using mouseover/out and event-time checks
+// so that event delegation works in jQuery.
+// Do the same for pointerenter/pointerleave and pointerover/pointerout
+//
+// Support: Safari 7 only
+// Safari sends mouseenter too often; see:
+// https://bugs.chromium.org/p/chromium/issues/detail?id=470258
+// for the description of the bug (it existed in older Chrome versions as well).
+jQuery.each( {
+ mouseenter: "mouseover",
+ mouseleave: "mouseout",
+ pointerenter: "pointerover",
+ pointerleave: "pointerout"
+}, function( orig, fix ) {
+ jQuery.event.special[ orig ] = {
+ delegateType: fix,
+ bindType: fix,
+
+ handle: function( event ) {
+ var ret,
+ target = this,
+ related = event.relatedTarget,
+ handleObj = event.handleObj;
+
+ // For mouseenter/leave call the handler if related is outside the target.
+ // NB: No relatedTarget if the mouse left/entered the browser window
+ if ( !related || ( related !== target && !jQuery.contains( target, related ) ) ) {
+ event.type = handleObj.origType;
+ ret = handleObj.handler.apply( this, arguments );
+ event.type = fix;
+ }
+ return ret;
+ }
+ };
+} );
+
+jQuery.fn.extend( {
+
+ on: function( types, selector, data, fn ) {
+ return on( this, types, selector, data, fn );
+ },
+ one: function( types, selector, data, fn ) {
+ return on( this, types, selector, data, fn, 1 );
+ },
+ off: function( types, selector, fn ) {
+ var handleObj, type;
+ if ( types && types.preventDefault && types.handleObj ) {
+
+ // ( event ) dispatched jQuery.Event
+ handleObj = types.handleObj;
+ jQuery( types.delegateTarget ).off(
+ handleObj.namespace ?
+ handleObj.origType + "." + handleObj.namespace :
+ handleObj.origType,
+ handleObj.selector,
+ handleObj.handler
+ );
+ return this;
+ }
+ if ( typeof types === "object" ) {
+
+ // ( types-object [, selector] )
+ for ( type in types ) {
+ this.off( type, selector, types[ type ] );
+ }
+ return this;
+ }
+ if ( selector === false || typeof selector === "function" ) {
+
+ // ( types [, fn] )
+ fn = selector;
+ selector = undefined;
+ }
+ if ( fn === false ) {
+ fn = returnFalse;
+ }
+ return this.each( function() {
+ jQuery.event.remove( this, types, fn, selector );
+ } );
+ }
+} );
+
+
+var
+
+ /* eslint-disable max-len */
+
+ // See https://github.com/eslint/eslint/issues/3229
+ rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([a-z][^\/\0>\x20\t\r\n\f]*)[^>]*)\/>/gi,
+
+ /* eslint-enable */
+
+ // Support: IE <=10 - 11, Edge 12 - 13 only
+ // In IE/Edge using regex groups here causes severe slowdowns.
+ // See https://connect.microsoft.com/IE/feedback/details/1736512/
+ rnoInnerhtml = /
+
+
@@ -205,13 +218,15 @@
G
get_fit() (tigramite.models.Models method)
-
-
+
get_general_fitted_model() (tigramite.models.Models method)
get_general_prediction() (tigramite.models.Models method)
+
+ get_graph_from_dict() (tigramite.causal_effects.CausalEffects static method)
get_graph_from_links() (tigramite.independence_tests.OracleCI method)
@@ -296,6 +311,8 @@ L
@@ -426,6 +432,8 @@ Q
R
+ remove_missing_upto_maxlag (tigramite.data_processing.DataFrame attribute)
+
return_parents_dict() (tigramite.pcmci.PCMCI method)
return_significant_links() (tigramite.pcmci.PCMCI method)
@@ -498,29 +506,14 @@ T
-
+
+
@@ -111,9 +144,9 @@
TIGRAMITE
tigramite.lpcmci
: LPCMCI
-
+
-class tigramite.lpcmci.
LPCMCI
( dataframe , cond_ind_test , verbosity = 0 ) [source]
+class tigramite.lpcmci.
LPCMCI
( dataframe , cond_ind_test , verbosity=0 ) [source]
LPCMCI is an algorithm for causal discovery in large-scale times series that allows for latent confounders and learns lag-specific
causal relationships.
The algorithm is introduced and explained in:
@@ -1259,9 +1292,9 @@
A note on wildcards: The middle mark wildcard ast and the edge mark wildcard are here represented as * , the edge mark wildcard star as +
-
+
-run_lpcmci
( selected_links = None , tau_min = 0 , tau_max = 1 , pc_alpha = 0.05 , n_preliminary_iterations = 1 , max_cond_px = 0 , max_p_global = numpy.inf , max_p_non_ancestral = numpy.inf , max_q_global = numpy.inf , max_pds_set = numpy.inf , prelim_with_collider_rules = True , parents_of_lagged = True , prelim_only = False , break_once_separated = True , no_non_ancestral_phase = False , use_a_pds_t_for_majority = True , orient_contemp = 1 , update_middle_marks = True , prelim_rules = 1 , fix_all_edges_before_final_orientation = True , auto_first = True , remember_only_parents = True , no_apr = 0 ) [source]
+run_lpcmci
( selected_links=None , tau_min=0 , tau_max=1 , pc_alpha=0.05 , n_preliminary_iterations=1 , max_cond_px=0 , max_p_global=numpy.inf , max_p_non_ancestral=numpy.inf , max_q_global=numpy.inf , max_pds_set=numpy.inf , prelim_with_collider_rules=True , parents_of_lagged=True , prelim_only=False , break_once_separated=True , no_non_ancestral_phase=False , use_a_pds_t_for_majority=True , orient_contemp=1 , update_middle_marks=True , prelim_rules=1 , fix_all_edges_before_final_orientation=True , auto_first=True , remember_only_parents=True , no_apr=0 ) [source]
Run LPCMCI on the dataset and with the conditional independence test passed to the class constructor and with the
options passed to this function.
@@ -1272,9 +1305,9 @@
tigramite.independence_tests
: Conditional independence tests
Base class:
-
+
-class tigramite.independence_tests.
CondIndTest
( seed = 42 , mask_type = None , significance = 'analytic' , fixed_thres = 0.1 , sig_samples = 1000 , sig_blocklength = None , confidence = None , conf_lev = 0.9 , conf_samples = 100 , conf_blocklength = None , recycle_residuals = False , verbosity = 0 ) [source]
+class tigramite.independence_tests.
CondIndTest
( seed=42 , mask_type=None , significance='analytic' , fixed_thres=0.1 , sig_samples=1000 , sig_blocklength=None , confidence=None , conf_lev=0.9 , conf_samples=100 , conf_blocklength=None , recycle_residuals=False , verbosity=0 ) [source]
Base class of conditional independence tests.
Provides useful general functions for different independence tests such as
shuffle significance testing and bootstrap confidence estimation. Also
@@ -1308,23 +1341,23 @@
-
+
-get_analytic_confidence
( value , df , conf_lev ) [source]
+get_analytic_confidence
( value , df , conf_lev ) [source]
Base class assumption that this is not implemented. Concrete classes
should override when possible.
-
+
-get_analytic_significance
( value , T , dim ) [source]
+get_analytic_significance
( value , T , dim ) [source]
Base class assumption that this is not implemented. Concrete classes
should override when possible.
-
+
-get_bootstrap_confidence
( array , xyz , dependence_measure = None , conf_samples = 100 , conf_blocklength = None , conf_lev = 0.95 , verbosity = 0 ) [source]
+get_bootstrap_confidence
( array , xyz , dependence_measure=None , conf_samples=100 , conf_blocklength=None , conf_lev=0.95 , verbosity=0 ) [source]
Perform bootstrap confidence interval estimation.
With conf_blocklength > 1 or None a block-bootstrap is performed.
@@ -1351,9 +1384,9 @@
-
+
-get_confidence
( X , Y , Z = None , tau_max = 0 ) [source]
+get_confidence
( X , Y , Z=None , tau_max=0 ) [source]
Perform confidence interval estimation.
Calls the dependence measure and confidence test functions. The child
classes can specify a function get_dependence_measure and
@@ -1362,11 +1395,7 @@
Parameters
-X (list of tuples ) – X,Y,Z are of the form [(var, -tau)], where var specifies the
-variable index and tau the time lag.
-Y (list of tuples ) – X,Y,Z are of the form [(var, -tau)], where var specifies the
-variable index and tau the time lag.
-Z (list of tuples ) – X,Y,Z are of the form [(var, -tau)], where var specifies the
+
Y , Z (X , ) – X,Y,Z are of the form [(var, -tau)], where var specifies the
variable index and tau the time lag.
tau_max (int , optional ( default: 0 ) ) – Maximum time lag. This may be used to make sure that estimates for
different lags in X, Z, all have the same sample size.
@@ -1381,15 +1410,15 @@
-
+
-abstract get_dependence_measure
( array , xyz ) [source]
+abstract get_dependence_measure
( array , xyz ) [source]
Abstract function that all concrete classes must instantiate.
-
+
-get_fixed_thres_significance
( value , fixed_thres ) [source]
+get_fixed_thres_significance
( value , fixed_thres ) [source]
Returns signficance for thresholding test.
Returns 0 if numpy.abs(value) is smaller than fixed_thres and 1 else.
@@ -1409,20 +1438,16 @@
-
+
-get_measure
( X , Y , Z = None , tau_max = 0 ) [source]
+get_measure
( X , Y , Z=None , tau_max=0 ) [source]
Estimate dependence measure.
Calls the dependence measure function. The child classes must specify
a function get_dependence_measure.
Parameters
-X (list of tuples ) – X,Y,Z are of the form [(var, -tau)], where var specifies the
-variable index and tau the time lag.
-[ (Y ) – X,Y,Z are of the form [(var, -tau)], where var specifies the
-variable index and tau the time lag.
-Z ] (list of tuples ) – X,Y,Z are of the form [(var, -tau)], where var specifies the
+
Y [ , Z ] (X , ) – X,Y,Z are of the form [(var, -tau)], where var specifies the
variable index and tau the time lag.
tau_max (int , optional ( default: 0 ) ) – Maximum time lag. This may be used to make sure that estimates for
different lags in X, Z, all have the same sample size.
@@ -1437,23 +1462,23 @@
-
+
-get_model_selection_criterion
( j , parents , tau_max = 0 ) [source]
+get_model_selection_criterion
( j , parents , tau_max=0 ) [source]
Base class assumption that this is not implemented. Concrete classes
should override when possible.
-
+
-get_shuffle_significance
( array , xyz , value , return_null_dist = False ) [source]
+get_shuffle_significance
( array , xyz , value , return_null_dist=False ) [source]
Base class assumption that this is not implemented. Concrete classes
should override when possible.
-
+
-get_significance
( val , array , xyz , T , dim , sig_override = None ) [source]
+get_significance
( val , array , xyz , T , dim , sig_override=None ) [source]
Returns the p-value from whichever significance function is specified
for this test. If an override is used, then it will call a different
function then specified by self.significance
@@ -1477,21 +1502,21 @@
-
+
abstract property measure
Abstract property to store the type of independence test.
-
+
print_info
( ) [source]
Print information about the conditional independence test parameters
-
+
-run_test
( X , Y , Z = None , tau_max = 0 , cut_off = '2xtau_max' ) [source]
+run_test
( X , Y , Z=None , tau_max=0 , cut_off='2xtau_max' ) [source]
Perform conditional independence test.
Calls the dependence measure and signficicance test functions. The child
classes must specify a function get_dependence_measure and either or
@@ -1501,11 +1526,7 @@
Parameters
-X (list of tuples ) – X,Y,Z are of the form [(var, -tau)], where var specifies the
-variable index and tau the time lag.
-Y (list of tuples ) – X,Y,Z are of the form [(var, -tau)], where var specifies the
-variable index and tau the time lag.
-Z (list of tuples ) – X,Y,Z are of the form [(var, -tau)], where var specifies the
+
Y , Z (X , ) – X,Y,Z are of the form [(var, -tau)], where var specifies the
variable index and tau the time lag.
tau_max (int , optional ( default: 0 ) ) – Maximum time lag. This may be used to make sure that estimates for
different lags in X, Z, all have the same sample size.
@@ -1526,20 +1547,16 @@
-
+
-run_test_raw
( x , y , z = None ) [source]
+run_test_raw
( x , y , z=None ) [source]
Perform conditional independence test directly on input arrays x, y, z.
Calls the dependence measure and signficicance test functions. The child
classes must specify a function get_dependence_measure and either or
both functions get_analytic_significance and get_shuffle_significance.
Parameters
-
-x (arrays ) – x,y,z are of the form (samples, dimension).
-y (arrays ) – x,y,z are of the form (samples, dimension).
-z (arrays ) – x,y,z are of the form (samples, dimension).
-
+y , z (x , ) – x,y,z are of the form (samples, dimension).
Returns
val, pval – The test statistic value and the p-value.
@@ -1550,9 +1567,9 @@
-
+
-set_dataframe
( dataframe ) [source]
+set_dataframe
( dataframe ) [source]
Initialize and check the dataframe.
Parameters
@@ -1564,9 +1581,9 @@
-
+
-set_mask_type
( mask_type ) [source]
+set_mask_type
( mask_type ) [source]
Setter for mask type to ensure that this option does not clash with
recycle_residuals.
@@ -1582,9 +1599,9 @@
Test statistics:
-
+
-class tigramite.independence_tests.
ParCorr
( ** kwargs ) [source]
+class tigramite.independence_tests.
ParCorr
( **kwargs ) [source]
Partial correlation test.
Partial correlation is estimated through linear ordinary least squares (OLS)
regression and a test for non-zero linear Pearson correlation on the
@@ -1606,9 +1623,9 @@
**kwargs – Arguments passed on to Parent class CondIndTest.
-
+
-get_analytic_confidence
( value , df , conf_lev ) [source]
+get_analytic_confidence
( value , df , conf_lev ) [source]
Returns analytic confidence interval for correlation coefficient.
Based on Student’s t-distribution.
@@ -1628,9 +1645,9 @@
-
+
-get_analytic_significance
( value , T , dim ) [source]
+get_analytic_significance
( value , T , dim ) [source]
Returns analytic p-value from Student’s t-test for the Pearson
correlation coefficient.
Assumes two-sided correlation. If the degrees of freedom are less than
@@ -1652,9 +1669,9 @@
-
+
-get_dependence_measure
( array , xyz ) [source]
+get_dependence_measure
( array , xyz ) [source]
Return partial correlation.
Estimated as the Pearson correlation of the residuals of a linear
OLS regression.
@@ -1674,9 +1691,9 @@
-
+
-get_model_selection_criterion
( j , parents , tau_max = 0 , corrected_aic = False ) [source]
+get_model_selection_criterion
( j , parents , tau_max=0 , corrected_aic=False ) [source]
Returns Akaike’s Information criterion modulo constants.
Fits a linear model of the parents to variable j and returns the
score. Leave-one-out cross-validation is asymptotically equivalent to
@@ -1696,9 +1713,9 @@
-
+
-get_shuffle_significance
( array , xyz , value , return_null_dist = False ) [source]
+get_shuffle_significance
( array , xyz , value , return_null_dist=False ) [source]
Returns p-value for shuffle significance test.
For residual-based test statistics only the residuals are shuffled.
@@ -1718,7 +1735,7 @@
-
+
property measure
Concrete property to return the measure of the independence test
@@ -1726,9 +1743,9 @@
-
+
-class tigramite.independence_tests.
GPDC
( null_dist_filename = None , gp_params = None , ** kwargs ) [source]
+class tigramite.independence_tests.
GPDC
( null_dist_filename=None , gp_params=None , **kwargs ) [source]
GPDC conditional independence test based on Gaussian processes and distance correlation.
GPDC is based on a Gaussian process (GP) regression and a distance
correlation test on the residuals . GP is estimated with scikit-learn
@@ -1771,9 +1788,9 @@
-
+
-generate_and_save_nulldists
( sample_sizes , null_dist_filename ) [source]
+generate_and_save_nulldists
( sample_sizes , null_dist_filename ) [source]
Generates and saves null distribution for pairwise independence
tests.
Generates the null distribution for different sample sizes. Calls
@@ -1790,9 +1807,9 @@
-
+
-generate_nulldist
( df , add_to_null_dists = True ) [source]
+generate_nulldist
( df , add_to_null_dists=True ) [source]
Generates null distribution for pairwise independence tests.
Generates the null distribution for sample size df. Assumes pairwise
samples transformed to uniform marginals. Uses get_dependence_measure
@@ -1815,9 +1832,9 @@
-
+
-get_analytic_significance
( value , T , dim ) [source]
+get_analytic_significance
( value , T , dim ) [source]
Returns p-value for the distance correlation coefficient.
The null distribution for necessary degrees of freedom (df) is loaded.
If not available, the null distribution is generated with the function
@@ -1843,9 +1860,9 @@
-
+
-get_dependence_measure
( array , xyz ) [source]
+get_dependence_measure
( array , xyz ) [source]
Return GPDC measure.
Estimated as the distance correlation of the residuals of a GP
regression.
@@ -1865,9 +1882,9 @@
-
+
-get_model_selection_criterion
( j , parents , tau_max = 0 ) [source]
+get_model_selection_criterion
( j , parents , tau_max=0 ) [source]
Returns log marginal likelihood for GP regression.
Fits a GP model of the parents to variable j and returns the negative
log marginal likelihood as a model selection score. Is used to determine
@@ -1886,9 +1903,9 @@
-
+
-get_shuffle_significance
( array , xyz , value , return_null_dist = False ) [source]
+get_shuffle_significance
( array , xyz , value , return_null_dist=False ) [source]
Returns p-value for shuffle significance test.
For residual-based test statistics only the residuals are shuffled.
@@ -1908,7 +1925,7 @@
-
+
property measure
Concrete property to return the measure of the independence test
@@ -1916,9 +1933,9 @@
-
+
-class tigramite.independence_tests.
GPDCtorch
( null_dist_filename = None , ** kwargs ) [source]
+class tigramite.independence_tests.
GPDCtorch
( null_dist_filename=None , **kwargs ) [source]
GPDC conditional independence test based on Gaussian processes and distance correlation. Here with gpytorch implementation.
GPDC is based on a Gaussian process (GP) regression and a distance
correlation test on the residuals . GP is estimated with gpytorch.
@@ -1951,9 +1968,9 @@
-
+
-generate_and_save_nulldists
( sample_sizes , null_dist_filename ) [source]
+generate_and_save_nulldists
( sample_sizes , null_dist_filename ) [source]
Generates and saves null distribution for pairwise independence
tests.
Generates the null distribution for different sample sizes. Calls
@@ -1970,9 +1987,9 @@
-
+
-generate_nulldist
( df , add_to_null_dists = True ) [source]
+generate_nulldist
( df , add_to_null_dists=True ) [source]
Generates null distribution for pairwise independence tests.
Generates the null distribution for sample size df. Assumes pairwise
samples transformed to uniform marginals. Uses get_dependence_measure
@@ -1995,9 +2012,9 @@
-
+
-get_analytic_significance
( value , T , dim ) [source]
+get_analytic_significance
( value , T , dim ) [source]
Returns p-value for the distance correlation coefficient.
The null distribution for necessary degrees of freedom (df) is loaded.
If not available, the null distribution is generated with the function
@@ -2023,9 +2040,9 @@
-
+
-get_dependence_measure
( array , xyz ) [source]
+get_dependence_measure
( array , xyz ) [source]
Return GPDC measure.
Estimated as the distance correlation of the residuals of a GP
regression.
@@ -2045,9 +2062,9 @@
-
+
-get_model_selection_criterion
( j , parents , tau_max = 0 ) [source]
+get_model_selection_criterion
( j , parents , tau_max=0 ) [source]
Returns log marginal likelihood for GP regression.
Fits a GP model of the parents to variable j and returns the negative
log marginal likelihood as a model selection score. Is used to determine
@@ -2066,9 +2083,9 @@
-
+
-get_shuffle_significance
( array , xyz , value , return_null_dist = False ) [source]
+get_shuffle_significance
( array , xyz , value , return_null_dist=False ) [source]
Returns p-value for shuffle significance test.
For residual-based test statistics only the residuals are shuffled.
@@ -2088,7 +2105,7 @@
-
+
property measure
Concrete property to return the measure of the independence test
@@ -2096,9 +2113,9 @@
-
+
-class tigramite.independence_tests.
CMIknn
( knn = 0.2 , shuffle_neighbors = 5 , significance = 'shuffle_test' , transform = 'ranks' , workers = - 1 , ** kwargs ) [source]
+class tigramite.independence_tests.
CMIknn
( knn=0.2 , shuffle_neighbors=5 , significance='shuffle_test' , transform='ranks' , workers=-1 , **kwargs ) [source]
Conditional mutual information test based on nearest-neighbor estimator.
Conditional mutual information is the most general dependency measure coming
from an information-theoretic framework. It makes no assumptions about the
@@ -2160,9 +2177,9 @@
-
+
-get_conditional_entropy
( array , xyz ) [source]
+get_conditional_entropy
( array , xyz ) [source]
Returns the nearest-neighbor conditional entropy estimate of H(X|Y).
Parameters
@@ -2181,9 +2198,9 @@
-
+
-get_dependence_measure
( array , xyz ) [source]
+get_dependence_measure
( array , xyz ) [source]
Returns CMI estimate as described in Frenzel and Pompe PRL (2007).
Parameters
@@ -2201,9 +2218,9 @@
-
+
-get_shuffle_significance
( array , xyz , value , return_null_dist = False ) [source]
+get_shuffle_significance
( array , xyz , value , return_null_dist=False ) [source]
Returns p-value for nearest-neighbor shuffle significance test.
For non-empty Z, overwrites get_shuffle_significance from the parent
class which is a block shuffle test, which does not preserve
@@ -2228,7 +2245,7 @@
-
+
property measure
Concrete property to return the measure of the independence test
@@ -2236,9 +2253,9 @@
-
+
-class tigramite.independence_tests.
CMIsymb
( n_symbs = None , significance = 'shuffle_test' , sig_blocklength = 1 , conf_blocklength = 1 , ** kwargs ) [source]
+class tigramite.independence_tests.
CMIsymb
( n_symbs=None , significance='shuffle_test' , sig_blocklength=1 , conf_blocklength=1 , **kwargs ) [source]
Conditional mutual information test based on discrete estimator.
Conditional mutual information is the most general dependency measure
coming from an information-theoretic framework. It makes no assumptions
@@ -2268,9 +2285,9 @@
-
+
-get_dependence_measure
( array , xyz ) [source]
+get_dependence_measure
( array , xyz ) [source]
Returns CMI estimate based on bincount histogram.
Parameters
@@ -2288,9 +2305,9 @@
-
+
-get_shuffle_significance
( array , xyz , value , return_null_dist = False ) [source]
+get_shuffle_significance
( array , xyz , value , return_null_dist=False ) [source]
Returns p-value for shuffle significance test.
For residual-based test statistics only the residuals are shuffled.
@@ -2310,7 +2327,7 @@
-
+
property measure
Concrete property to return the measure of the independence test
@@ -2318,9 +2335,9 @@
-
+
-class tigramite.independence_tests.
OracleCI
( links = None , observed_vars = None , selection_vars = None , graph = None , graph_is_mag = False , tau_max = None , verbosity = 0 ) [source]
+class tigramite.independence_tests.
OracleCI
( links=None , observed_vars=None , selection_vars=None , graph=None , graph_is_mag=False , tau_max=None , verbosity=0 ) [source]
Oracle of conditional independence test X _|_ Y | Z given a graph.
Class around link_coeff causal ground truth. X _|_ Y | Z is based on
assessing whether X and Y are d-separated given Z in the graph.
@@ -2341,9 +2358,9 @@
-
+
-check_shortest_path
( X , Y , Z , max_lag = None , starts_with = None , ends_with = None , forbidden_nodes = None , directed = False , only_non_causal_paths = False , check_optimality_cond = False , optimality_cond_des_YM = None , optimality_cond_Y = None , return_path = False ) [source]
+check_shortest_path
( X , Y , Z , max_lag=None , starts_with=None , ends_with=None , forbidden_nodes=None , directed=False , only_non_causal_paths=False , check_optimality_cond=False , optimality_cond_des_YM=None , optimality_cond_Y=None , return_path=False ) [source]
Returns path between X and Y given Z in the graph.
X, Y, Z are of the form (var, lag) for lag <= 0. D-separation is
based on:
@@ -2363,9 +2380,7 @@
Parameters
-X (list of tuples ) – List of variables chosen for testing paths.
-Y (list of tuples ) – List of variables chosen for testing paths.
-Z (list of tuples ) – List of variables chosen for testing paths.
+Y , Z (X , ) – List of variables chosen for testing paths.
max_lag (int , optional ( default: None ) ) – Used here to constrain the has_path function to the graph
truncated at max_lag instead of identifying the max_lag from
ancestral search.
@@ -2384,9 +2399,9 @@
-
+
-get_confidence
( X , Y , Z = None , tau_max = 0 ) [source]
+get_confidence
( X , Y , Z=None , tau_max=0 ) [source]
For compatibility with PCMCI.
Returns
@@ -2398,17 +2413,17 @@
-
+
-get_graph_from_links
( tau_max = None ) [source]
+get_graph_from_links
( tau_max=None ) [source]
Constructs graph (DAG or MAG or ADMG) from links, observed_vars,
and selection_vars.
For ADMGs uses the Latent projection operation (Pearl 2009).
-
+
-get_links_from_graph
( graph ) [source]
+get_links_from_graph
( graph ) [source]
Constructs links_coeffs dictionary, observed_vars,
and selection_vars from graph array (MAG or DAG).
In the case of MAGs, for every <-> or — link further
@@ -2419,19 +2434,15 @@
Can be used to evaluate d-separation in MAG/DAGs.
-
+
-get_measure
( X , Y , Z = None , tau_max = 0 ) [source]
+get_measure
( X , Y , Z=None , tau_max=0 ) [source]
Returns dependence measure.
Returns 0 if X and Y are d-separated given Z in the graph and 1 else.
Parameters
-X (list of tuples ) – X,Y,Z are of the form [(var, -tau)], where var specifies the
-variable index in the observed_vars and tau the time lag.
-[ (Y ) – X,Y,Z are of the form [(var, -tau)], where var specifies the
-variable index in the observed_vars and tau the time lag.
-Z ] (list of tuples ) – X,Y,Z are of the form [(var, -tau)], where var specifies the
+
Y [ , Z ] (X , ) – X,Y,Z are of the form [(var, -tau)], where var specifies the
variable index in the observed_vars and tau the time lag.
tau_max (int , optional ( default: 0 ) ) – Maximum time lag. This may be used to make sure that estimates for
different lags in X, Z, all have the same sample size.
@@ -2446,32 +2457,28 @@
-
+
-get_model_selection_criterion
( j , parents , tau_max = 0 ) [source]
+get_model_selection_criterion
( j , parents , tau_max=0 ) [source]
Base class assumption that this is not implemented. Concrete classes
should override when possible.
-
+
property measure
Concrete property to return the measure of the independence test
-
+
-run_test
( X , Y , Z = None , tau_max = 0 , cut_off = '2xtau_max' , verbosity = 0 ) [source]
+run_test
( X , Y , Z=None , tau_max=0 , cut_off='2xtau_max' , verbosity=0 ) [source]
Perform oracle conditional independence test.
Calls the d-separation function.
Parameters
-X (list of tuples ) – X,Y,Z are of the form [(var, -tau)], where var specifies the
-variable index in the observed_vars and tau the time lag.
-Y (list of tuples ) – X,Y,Z are of the form [(var, -tau)], where var specifies the
-variable index in the observed_vars and tau the time lag.
-Z (list of tuples ) – X,Y,Z are of the form [(var, -tau)], where var specifies the
+
Y , Z (X , ) – X,Y,Z are of the form [(var, -tau)], where var specifies the
variable index in the observed_vars and tau the time lag.
tau_max (int , optional ( default: 0 ) ) – Not used here.
cut_off ({'2xtau_max' , 'max_lag' , 'max_lag_or_tau_max'} ) – Not used here.
@@ -2486,9 +2493,9 @@
-
+
-set_dataframe
( dataframe ) [source]
+set_dataframe
( dataframe ) [source]
Dummy function.
@@ -2497,9 +2504,9 @@
tigramite.causal_effects
: Causal Effect analysis
-
+
-class tigramite.causal_effects.
CausalEffects
( graph , graph_type , X , Y , S = None , hidden_variables = None , check_SM_overlap = True , verbosity = 0 ) [source]
+class tigramite.causal_effects.
CausalEffects
( graph , graph_type , X , Y , S=None , hidden_variables=None , check_SM_overlap=True , verbosity=0 ) [source]
Causal effect estimation.
Methods for the estimation of linear or non-parametric causal effects
between (potentially multivariate) X and Y (potentially conditional
@@ -2536,7 +2543,7 @@
-
+
check_XYS_paths
( ) [source]
Check whether one can remove nodes from X and Y with no proper causal paths.
@@ -2550,7 +2557,7 @@
-
+
check_optimality
( ) [source]
Check whether optimal adjustment set exists according to Thm. 3 in Runge NeurIPS 2021.
@@ -2564,9 +2571,9 @@
-
+
-fit_total_effect
( dataframe , estimator , adjustment_set = 'optimal' , conditional_estimator = None , data_transform = None , mask_type = None ) [source]
+fit_total_effect
( dataframe , estimator , adjustment_set='optimal' , conditional_estimator=None , data_transform=None , mask_type=None ) [source]
Returns a fitted model for the total causal effect of X on Y conditional on S.
@@ -2595,9 +2602,9 @@
-
+
-fit_wright_effect
( dataframe , mediation = None , method = 'parents' , links_coeffs = None , data_transform = None , mask_type = None ) [source]
+fit_wright_effect
( dataframe , mediation=None , method='parents' , links_coeffs=None , data_transform=None , mask_type=None ) [source]
Returns a fitted model for the total or mediated causal effect of X on Y potentially through mediator variables.
@@ -2628,9 +2635,30 @@
-
+
+
+static get_graph_from_dict
( links , tau_max=None ) [source]
+Helper function to convert dictionary of links to graph array format.
+
+Parameters
+
+links (dict ) – Dictionary of form {0:[((0, -1), coeff, func), …], 1:[…], …}.
+Also format {0:[(0, -1), …], 1:[…], …} is allowed.
+tau_max (int or None ) – Maximum lag. If None, the maximum lag in links is used.
+
+
+Returns
+graph – Matrix format of graph with 1 for true links and 0 else.
+
+Return type
+array of shape (N, N, tau_max+1)
+
+
+
+
+
-get_mediators
( start , end ) [source]
+get_mediators
( start , end ) [source]
Returns mediator variables on proper causal paths.
Parameters
@@ -2648,9 +2676,9 @@
-
+
-get_optimal_set
( alternative_conditions = None , minimize = False , return_separate_sets = False ) [source]
+get_optimal_set
( alternative_conditions=None , minimize=False , return_separate_sets=False ) [source]
Returns optimal adjustment set.
See Runge NeurIPS 2021.
@@ -2672,9 +2700,9 @@
-
+
-predict_total_effect
( intervention_data , conditions_data = None , pred_params = None ) [source]
+predict_total_effect
( intervention_data , conditions_data=None , pred_params=None ) [source]
Predict effect of intervention with fitted model.
Uses the model.predict() function of the sklearn model.
@@ -2694,9 +2722,9 @@
-
+
-predict_wright_effect
( intervention_data , pred_params = None ) [source]
+predict_wright_effect
( intervention_data , pred_params=None ) [source]
Predict linear effect of intervention with fitted Wright-model.
Parameters
@@ -2720,9 +2748,9 @@
-
\ No newline at end of file
diff --git a/docs/_build/html/objects.inv b/docs/_build/html/objects.inv
index 27a3be23..480c1c78 100644
Binary files a/docs/_build/html/objects.inv and b/docs/_build/html/objects.inv differ
diff --git a/docs/_build/html/py-modindex.html b/docs/_build/html/py-modindex.html
index 65cb7725..a7848825 100644
--- a/docs/_build/html/py-modindex.html
+++ b/docs/_build/html/py-modindex.html
@@ -1,10 +1,9 @@
-
+
-
Python Module Index — Tigramite 5.0 documentation
@@ -28,10 +27,23 @@ Navigation
modules |
- Tigramite 5.0 documentation »
- Python Module Index
+ Tigramite 5.0 documentation »
-
+
+
@@ -73,24 +85,9 @@
Python Module Index
-
-
\ No newline at end of file
diff --git a/docs/_build/html/search.html b/docs/_build/html/search.html
index 0acff014..6cdb96f2 100644
--- a/docs/_build/html/search.html
+++ b/docs/_build/html/search.html
@@ -1,10 +1,9 @@
-
+
-
Search — Tigramite 5.0 documentation
@@ -30,10 +29,13 @@ Navigation
modules |
- Tigramite 5.0 documentation »
- Search
+ Tigramite 5.0 documentation »
-
+
+
@@ -49,8 +51,10 @@
Search
- Searching for multiple words only shows matches that contain
- all words.
+ From here you can search these documents. Enter your search
+ words into the box below and click "search". Note that the search
+ function will automatically search for all of the words. Pages
+ containing fewer words won't appear in the result list.
-
-
\ No newline at end of file
diff --git a/docs/_build/html/searchindex.js b/docs/_build/html/searchindex.js
index 2113f346..6a85b8e8 100644
--- a/docs/_build/html/searchindex.js
+++ b/docs/_build/html/searchindex.js
@@ -1 +1 @@
-Search.setIndex({docnames:["index"],envversion:{"sphinx.domains.c":2,"sphinx.domains.changeset":1,"sphinx.domains.citation":1,"sphinx.domains.cpp":3,"sphinx.domains.index":1,"sphinx.domains.javascript":2,"sphinx.domains.math":2,"sphinx.domains.python":2,"sphinx.domains.rst":2,"sphinx.domains.std":1,"sphinx.ext.viewcode":1,sphinx:56},filenames:["index.rst"],objects:{"tigramite.causal_effects":{CausalEffects:[0,0,1,""]},"tigramite.causal_effects.CausalEffects":{check_XYS_paths:[0,1,1,""],check_optimality:[0,1,1,""],fit_total_effect:[0,1,1,""],fit_wright_effect:[0,1,1,""],get_mediators:[0,1,1,""],get_optimal_set:[0,1,1,""],predict_total_effect:[0,1,1,""],predict_wright_effect:[0,1,1,""]},"tigramite.data_processing":{DataFrame:[0,0,1,""],lowhighpass_filter:[0,4,1,""],ordinal_patt_array:[0,4,1,""],quantile_bin_array:[0,4,1,""],smooth:[0,4,1,""],structural_causal_process:[0,4,1,""],time_bin_with_mask:[0,4,1,""],var_process:[0,4,1,""],weighted_avg_and_std:[0,4,1,""]},"tigramite.data_processing.DataFrame":{construct_array:[0,1,1,""],data:[0,3,1,""],datatime:[0,3,1,""],mask:[0,3,1,""],missing_flag:[0,3,1,""],print_array_info:[0,1,1,""],var_names:[0,3,1,""]},"tigramite.independence_tests":{CMIknn:[0,0,1,""],CMIsymb:[0,0,1,""],CondIndTest:[0,0,1,""],GPDC:[0,0,1,""],GPDCtorch:[0,0,1,""],OracleCI:[0,0,1,""],ParCorr:[0,0,1,""]},"tigramite.independence_tests.CMIknn":{get_conditional_entropy:[0,1,1,""],get_dependence_measure:[0,1,1,""],get_shuffle_significance:[0,1,1,""],measure:[0,1,1,""]},"tigramite.independence_tests.CMIsymb":{get_dependence_measure:[0,1,1,""],get_shuffle_significance:[0,1,1,""],measure:[0,1,1,""]},"tigramite.independence_tests.CondIndTest":{get_analytic_confidence:[0,1,1,""],get_analytic_significance:[0,1,1,""],get_bootstrap_confidence:[0,1,1,""],get_confidence:[0,1,1,""],get_dependence_measure:[0,1,1,""],get_fixed_thres_significance:[0,1,1,""],get_measure:[0,1,1,""],get_model_selection_criterion:[0,1,1,""],get_shuffle_significance:[0,1,1,""],get_significance:[0,1,1,""],measure:[0,1,1,""],print_info:[0,1,1,""],run_test:[0,1,1,""],run_test_raw:[0,1,1,""],set_dataframe:[0,1,1,""],set_mask_type:[0,1,1,""]},"tigramite.independence_tests.GPDC":{generate_and_save_nulldists:[0,1,1,""],generate_nulldist:[0,1,1,""],get_analytic_significance:[0,1,1,""],get_dependence_measure:[0,1,1,""],get_model_selection_criterion:[0,1,1,""],get_shuffle_significance:[0,1,1,""],measure:[0,1,1,""]},"tigramite.independence_tests.GPDCtorch":{generate_and_save_nulldists:[0,1,1,""],generate_nulldist:[0,1,1,""],get_analytic_significance:[0,1,1,""],get_dependence_measure:[0,1,1,""],get_model_selection_criterion:[0,1,1,""],get_shuffle_significance:[0,1,1,""],measure:[0,1,1,""]},"tigramite.independence_tests.OracleCI":{check_shortest_path:[0,1,1,""],get_confidence:[0,1,1,""],get_graph_from_links:[0,1,1,""],get_links_from_graph:[0,1,1,""],get_measure:[0,1,1,""],get_model_selection_criterion:[0,1,1,""],measure:[0,1,1,""],run_test:[0,1,1,""],set_dataframe:[0,1,1,""]},"tigramite.independence_tests.ParCorr":{get_analytic_confidence:[0,1,1,""],get_analytic_significance:[0,1,1,""],get_dependence_measure:[0,1,1,""],get_model_selection_criterion:[0,1,1,""],get_shuffle_significance:[0,1,1,""],measure:[0,1,1,""]},"tigramite.lpcmci":{LPCMCI:[0,0,1,""]},"tigramite.lpcmci.LPCMCI":{run_lpcmci:[0,1,1,""]},"tigramite.models":{LinearMediation:[0,0,1,""],Models:[0,0,1,""],Prediction:[0,0,1,""]},"tigramite.models.LinearMediation":{fit_model:[0,1,1,""],get_ace:[0,1,1,""],get_acs:[0,1,1,""],get_all_ace:[0,1,1,""],get_all_acs:[0,1,1,""],get_all_amce:[0,1,1,""],get_amce:[0,1,1,""],get_ce:[0,1,1,""],get_ce_max:[0,1,1,""],get_coeff:[0,1,1,""],get_mce:[0,1,1,""],get_mediation_graph_data:[0,1,1,""],get_tsg:[0,1,1,""],get_val_matrix:[0,1,1,""],net_to_tsg:[0,1,1,""],tsg_to_net:[0,1,1,""]},"tigramite.models.Models":{get_coefs:[0,1,1,""],get_fit:[0,1,1,""],get_general_fitted_model:[0,1,1,""],get_general_prediction:[0,1,1,""],get_val_matrix:[0,1,1,""]},"tigramite.models.Prediction":{fit:[0,1,1,""],get_predictors:[0,1,1,""],get_test_array:[0,1,1,""],get_train_array:[0,1,1,""],predict:[0,1,1,""]},"tigramite.pcmci":{PCMCI:[0,0,1,""]},"tigramite.pcmci.PCMCI":{N:[0,3,1,""],T:[0,3,1,""],all_parents:[0,3,1,""],convert_to_string_graph:[0,1,1,""],get_corrected_pvalues:[0,1,1,""],get_graph_from_pmatrix:[0,1,1,""],get_lagged_dependencies:[0,1,1,""],iterations:[0,3,1,""],print_results:[0,1,1,""],print_significant_links:[0,1,1,""],pval_max:[0,3,1,""],return_parents_dict:[0,1,1,""],return_significant_links:[0,1,1,""],run_bivci:[0,1,1,""],run_fullci:[0,1,1,""],run_mci:[0,1,1,""],run_pc_stable:[0,1,1,""],run_pcalg:[0,1,1,""],run_pcalg_non_timeseries_data:[0,1,1,""],run_pcmci:[0,1,1,""],run_pcmciplus:[0,1,1,""],run_sliding_window_of:[0,1,1,""],symmetrize_p_and_val_matrix:[0,1,1,""],val_min:[0,3,1,""]},"tigramite.plotting":{plot_graph:[0,4,1,""],plot_lagfuncs:[0,4,1,""],plot_mediation_graph:[0,4,1,""],plot_mediation_time_series_graph:[0,4,1,""],plot_time_series_graph:[0,4,1,""],plot_timeseries:[0,4,1,""],plot_tsg:[0,4,1,""],setup_matrix:[0,0,1,""]},"tigramite.plotting.setup_matrix":{add_lagfuncs:[0,1,1,""],savefig:[0,1,1,""]},"tigramite.toymodels":{structural_causal_processes:[0,2,0,"-"]},"tigramite.toymodels.structural_causal_processes":{structural_causal_process:[0,4,1,""],var_process:[0,4,1,""]},tigramite:{data_processing:[0,2,0,"-"],plotting:[0,2,0,"-"]}},objnames:{"0":["py","class","Python class"],"1":["py","method","Python method"],"2":["py","module","Python module"],"3":["py","attribute","Python attribute"],"4":["py","function","Python function"]},objtypes:{"0":"py:class","1":"py:method","2":"py:module","3":"py:attribute","4":"py:function"},terms:{"00000":0,"001":0,"005":0,"019":0,"025":0,"051122":0,"062829":0,"075310":0,"0803":0,"100":0,"1000":0,"10105":0,"1038":0,"1063":0,"1103":0,"12532404":0,"2002":0,"2007":0,"2009":0,"2011":0,"2015":0,"2018":0,"2019":0,"2020":0,"2021":0,"204101":0,"21st":0,"24365041":0,"250648072987":0,"25718002":0,"2xtau_max":0,"36897445":0,"36th":0,"38250406":0,"4101":0,"447":0,"449":0,"466":0,"486":0,"499":0,"5025050":0,"524":0,"579_main_pap":0,"588":0,"599":0,"602":0,"606":0,"618":0,"62829":0,"676":0,"8485ae387a981d783f8764e508151cd9":0,"8502":0,"94e70705efae423efda1088614128d0b":0,"abstract":0,"boolean":0,"break":0,"case":0,"class":0,"default":0,"float":0,"import":0,"int":0,"long":0,"new":0,"null":0,"return":0,"true":0,"var":0,"while":0,ACE:0,ACS:0,For:0,Its:0,Not:0,OLS:0,The:0,Then:0,There:0,These:0,Used:0,Useful:0,Uses:0,Using:0,Will:0,With:0,_get_single_residu:0,_run_ancestral_removal_phas:0,_run_dsep_removal_phas:0,_run_non_ancestral_removal_phas:0,about:0,abov:0,abs:0,absent:0,absmax:0,absolut:0,accept:0,accord:0,account:0,ace:0,across:0,acs:0,act:0,actual:0,adapt:0,add:0,add_lagfunc:0,add_lagfunc_arg:0,add_to_null_dist:0,added:0,adding:0,addit:0,address:0,adj:0,adjac:0,adjust:0,adjustment_set:0,admg:0,adv:0,advanc:0,affect:0,after:0,again:0,ahead:0,aic:0,aip:0,akaik:0,algorithm:0,all:0,all_lag:0,all_par:0,all_result:0,alloc:0,allow:0,along:0,alpha:0,alpha_level:0,alreadi:0,also:0,altern:0,alternative_condit:0,although:0,alwai:0,ambigu:0,ambiguous_tripl:0,amc:0,among:0,analyt:0,analyz:0,anc_all_i:0,anc_all_x:0,anc_all_z:0,anc_i:0,anc_x:0,anc_xi:0,ancestor:0,ancestr:0,ani:0,anoth:0,apds_t:0,appli:0,applic:0,appropri:0,apr:0,arang:0,arbitrari:0,argument:0,around:0,arrai:0,array_lik:0,array_mask:0,arrohead:0,arrow:0,arrow_linewidth:0,arrowhead_s:0,articl:0,artifici:0,arxiv:0,assess:0,assign:0,associ:0,assum:0,assumpt:0,ast:0,asymptot:0,attribut:0,au_i:0,au_j:0,auai:0,auto:0,auto_first:0,autocorrel:0,autocovari:0,autodepend:0,automat:0,autoregress:0,auxadmg:0,auxiliari:0,avail:0,averag:0,avoid:0,axes:0,axi:0,backdoor:0,backward:0,bakirov:0,bandwidth:0,base:0,basemap:0,been:0,befor:0,beforehand:0,begin:0,being:0,below:0,benjamini:0,best:0,beta:0,beta_i:0,beta_x:0,better:0,between:0,bia:0,bias:0,bin:0,bincount:0,bindata:0,bivci:0,black:0,block:0,blue:0,bold:0,bool:0,bootstrap:0,both:0,bottom:0,bound:0,box:0,breadth:0,break_once_separ:0,briefli:0,butterworth:0,call:0,callabl:0,can:0,canada:0,canon:0,cardin:0,care:0,caus:0,causaleffect:0,cdot:0,certain:0,chain:0,chao:0,check:0,check_optim:0,check_optimality_cond:0,check_shortest_path:0,check_sm_overlap:0,check_xys_path:0,child:0,choic:0,chosen:0,cite:0,ckdtree:0,clash:0,clean:0,cmap_edg:0,cmap_nod:0,cmi:0,cmiknn:0,cmisymb:0,coef1:0,coef2:0,coeff:0,coeffici:0,collid:0,collider_par:0,colliders_minimized_optim:0,colliders_onli:0,color:0,colorbar:0,colormap:0,column:0,com:0,combin:0,come:0,command:0,common:0,commun:0,compar:0,comparison:0,compat:0,complex:0,comprehens:0,comput:0,compute_ancestor:0,concret:0,cond_ind_test:0,condindtest:0,conditional_estim:0,conditional_model:0,conditions_data:0,conduct:0,conf_blocklength:0,conf_lev:0,conf_low:0,conf_matrix:0,conf_sampl:0,conf_upp:0,confer:0,confid:0,conflict:0,conflict_resolut:0,confound:0,conserv:0,consid:0,consider:0,considerd:0,consist:0,constant:0,constrain:0,construct:0,construct_arrai:0,constructor:0,contain:0,contemp_collider_rul:0,contemp_cond:0,contemporan:0,content:0,continu:0,contrast:0,control:0,conveni:0,convert:0,convert_to_string_graph:0,coordin:0,correct:0,corrected_a:0,correl:0,correspond:0,cost:0,could:0,coupl:0,covari:0,creat:0,criteria:0,criterion:0,cross:0,cube:0,current:0,curv:0,curvatur:0,curved_radiu:0,cut_off:0,cutoff:0,cutperiod:0,cython:0,d_z:0,dag:0,dash:0,data_linewidth:0,data_transform:0,datafram:0,dataset:0,datatim:0,dcor:0,debug:0,decai:0,def:0,default_rng:0,defin:0,definin:0,degre:0,delai:0,denot:0,densiti:0,depend:0,dependence_measur:0,deprec:0,depth:0,deriv:0,describ:0,descript:0,detail:0,detect:0,determin:0,deviat:0,dict:0,dictionari:0,differ:0,digamma:0,digest:0,dim:0,dimens:0,dimension:0,direct:0,direction:0,directli:0,disabl:0,discov:0,discoveri:0,discret:0,discuss:0,disk:0,dismiss:0,dist:0,distanc:0,distribut:0,do_check:0,doc:0,doe:0,doi:0,dpag:0,draw:0,drawn:0,driver:0,due:0,dummi:0,duplic:0,dure:0,eaau4996:0,each:0,easi:0,edg:0,edge_tick:0,effici:0,either:0,element:0,els:0,eman:0,embed:0,empti:0,end:0,ends_with:0,ensur:0,entri:0,entropi:0,enumer:0,epsilon_:0,equal:0,equival:0,error:0,estim:0,eta:0,etc:0,evalu:0,even:0,everi:0,exampl:0,except:0,exclud:0,exclude_contemporan:0,exclude_i:0,exclude_j:0,exclude_k:0,exclude_self_effect:0,execut:0,exist:0,expect:0,experi:0,experiment:0,explain:0,extern:0,f_x:0,f_y:0,factor:0,faculti:0,faith:0,fals:0,fancyarrowpatch:0,faster:0,fdr:0,fdr_bh:0,fdr_method:0,featur:0,feedback:0,fig:0,fig_ax:0,figsiz:0,figur:0,file:0,fill:0,filter:0,fine:0,first:0,fit:0,fit_model:0,fit_result:0,fit_total_effect:0,fit_wright_effect:0,fix:0,fix_all_edges_before_final_orient:0,fixed_thr:0,flag:0,flaxman:0,flexibl:0,follow:0,fontsiz:0,forbidden_nod:0,forc:0,forecast:0,form:0,format:0,forward:0,found:0,four:0,frac:0,fraction:0,framework:0,free:0,freedom:0,frenzel:0,frequenc:0,frequent:0,friendli:0,from:0,full:0,fullci:0,fulli:0,func:0,further:0,futur:0,gabor:0,gatewai:0,gauss_pr:0,gaussian:0,gaussianprocessregressor:0,gaussprocreg:0,gaussprocregtorch:0,generate_and_save_nulldist:0,generate_nulldist:0,gerhardu:0,get:0,get_ac:0,get_all_ac:0,get_all_amc:0,get_amc:0,get_analytic_confid:0,get_analytic_signific:0,get_bootstrap_confid:0,get_c:0,get_ce_max:0,get_coef:0,get_coeff:0,get_conditional_entropi:0,get_confid:0,get_corrected_pvalu:0,get_dependence_measur:0,get_fit:0,get_fixed_thres_signific:0,get_general_fitted_model:0,get_general_predict:0,get_graph_from_link:0,get_graph_from_pmatrix:0,get_lagged_depend:0,get_links_from_graph:0,get_mc:0,get_measur:0,get_medi:0,get_mediation_graph_data:0,get_model_selection_criterion:0,get_optimal_set:0,get_predictor:0,get_shuffle_signific:0,get_signific:0,get_test_arrai:0,get_train_arrai:0,get_tsg:0,get_val_matrix:0,github:0,give:0,given:0,going:0,gp_param:0,gpdc:0,gpdctorch:0,gpytorch:0,graph:0,graph_bool:0,graph_data:0,graph_is_mag:0,graph_typ:0,graphic:0,greater:0,grei:0,grey_masked_sampl:0,grid:0,ground:0,guarante:0,guidanc:0,handl:0,hard:0,has:0,has_path:0,hash:0,have:0,head:0,heavisid:0,heigth:0,help:0,helper:0,henc:0,here:0,hidden:0,hidden_vari:0,high:0,higher:0,histogram:0,hochberg:0,horizont:0,how:0,howev:0,html:0,http:0,hyper:0,hyperparamet:0,hypothesi:0,hypothet:0,identifi:0,iint:0,implement:0,impli:0,importantli:0,improv:0,includ:0,include_lagzero_link:0,include_lagzero_par:0,include_neighbor:0,incom:0,index:0,indirect:0,individu:0,inf:0,infin:0,info:0,inform:0,inherit:0,initi:0,initial_valu:0,inner_edg:0,inner_edge_styl:0,inno_cov:0,innov:0,input:0,instanc:0,instanti:0,instead:0,instruct:0,integ:0,intellig:0,interdisciplinari:0,interest:0,intern:0,interpret:0,interv:0,interven:0,intervent:0,intervention_data:0,intervention_typ:0,introduc:0,introduct:0,inv_inno_cov:0,invalid:0,invers:0,invit:0,irrelev:0,iter:0,its:0,itself:0,j_t:0,joint:0,journal:0,just:0,kei:0,kernel:0,kind:0,knn:0,kretschmer:0,kwarg:0,label:0,label_fonts:0,label_space_left:0,label_space_top:0,lag1:0,lag2:0,lag:0,lag_arrai:0,lag_mod:0,lag_unit:0,lagfunct:0,lagged_par:0,larg:0,larger:0,last:0,latent:0,later:0,latter:0,lead:0,learn:0,least:0,leav:0,left:0,legend:0,legend_fonts:0,legend_width:0,len:0,length:0,less:0,let:0,lett:0,level:0,lightgrei:0,like:0,likelihood:0,limit:0,lin_f:0,line:0,linear:0,linear_model:0,linearmedi:0,linearregress:0,linewidth:0,link:0,link_attribut:0,link_coeff:0,link_colorbar_label:0,link_frequ:0,link_label_fonts:0,link_matrix:0,link_width:0,links_coeff:0,list:0,load:0,log:0,look:0,low:0,lower:0,lowhighpass_filt:0,made:0,mag:0,magnitud:0,mai:0,main:0,major:0,make:0,mani:0,map:0,margin:0,maria:0,mark:0,marker:0,markers:0,markov:0,mask:0,mask_typ:0,match:0,mathcal:0,matplotlib:0,matric:0,matrix:0,matter:0,max:0,max_combin:0,max_cond_px:0,max_conds_dim:0,max_conds_pi:0,max_conds_px:0,max_conds_px_lag:0,max_delai:0,max_lag:0,max_lag_or_tau_max:0,max_p_glob:0,max_p_non_ancestr:0,max_pds_set:0,max_q_glob:0,maxim:0,maximum:0,mce:0,mci:0,mean:0,measur:0,med:0,member:0,memori:0,method:0,method_arg:0,middl:0,might:0,minim:0,minimized_optim:0,minimum:0,minu:0,miss:0,missing_flag:0,mlr:0,mmr:0,mode:0,model_param:0,modul:0,modulo:0,momentari:0,more:0,most:0,most_frequent_link:0,mostli:0,motif:0,much:0,multi:0,multipl:0,multivari:0,must:0,mutual:0,n_preliminary_iter:0,n_symb:0,nail:0,name:0,nan:0,napds_t:0,natur:0,ncomms9502:0,nearest:0,necessari:0,need:0,neg:0,neighbor:0,nest:0,net_to_tsg:0,network:0,network_lower_bound:0,neural:0,neurip:0,never:0,nevertheless:0,new_data:0,niehgbor:0,no_apr:0,no_nois:0,no_non_ancestral_phas:0,node:0,node_aspect:0,node_colorbar_label:0,node_label_s:0,node_po:0,node_s:0,node_tick:0,nois:0,non:0,non_rep:0,none:0,nonlinear:0,nonstat:0,nonstationari:0,nonzero:0,normal:0,note:0,nowack:0,npz:0,null_dist:0,null_dist_filenam:0,nulldist:0,number:0,numer:0,numpi:0,object:0,observ:0,observed_var:0,occur:0,onc:0,one:0,onli:0,only_non_causal_path:0,opac:0,oper:0,opposit:0,optim:0,optimality_cond_des_ym:0,optimality_cond_i:0,optimz:0,option:0,oracl:0,oracleci:0,order:0,ordin:0,ordinal_patt_arrai:0,ordinari:0,org:0,orient:0,orient_comtemp:0,orient_contemp:0,origin:0,orrd:0,oset:0,oset_:0,other:0,otherwis:0,otion:0,ouput:0,out:0,outcom:0,output:0,over:0,overlaid:0,overlap:0,overrid:0,overwrit:0,p_matrix:0,packag:0,page:0,pair:0,pairwis:0,panda:0,panel:0,paper:0,parallel:0,paramet:0,parametr:0,parcorr:0,parent:0,parent_node_id:0,parents_dict:0,parents_neighbors_coeff:0,parents_of_lag:0,part:0,partial:0,particular:0,pass:0,pass_period:0,path:0,path_node_arrai:0,path_val_matrix:0,pathwai:0,patt:0,patt_mask:0,patt_tim:0,pattern:0,pc1:0,pc_1:0,pc_alpha:0,pcmciplu:0,pdf:0,peak:0,pearl:0,pearson:0,percentil:0,perform:0,period:0,permut:0,perp:0,perspect:0,phase:0,phi:0,phy:0,physrev:0,pip:0,plai:0,pleas:0,plot_graph:0,plot_gridlin:0,plot_lagfunc:0,plot_mediation_graph:0,plot_mediation_time_series_graph:0,plot_time_series_graph:0,plot_timeseri:0,plot_tsg:0,point:0,pomp:0,pos:0,posit:0,possibl:0,post:0,potenti:0,power:0,pq_matrix:0,practic:0,pre:0,precis:0,precomput:0,pred_param:0,predict_total_effect:0,predict_wright_effect:0,prediction_model:0,predictor:0,prelim_onli:0,prelim_rul:0,prelim_with_collider_rul:0,preliminari:0,preprocess:0,present:0,preserv:0,press:0,previou:0,prime:0,print:0,print_array_info:0,print_info:0,print_result:0,print_significant_link:0,prior:0,priorit:0,prl:0,procedur:0,proceed:0,processor:0,project:0,proper:0,properti:0,provid:0,pseudcod:0,pseudoc:0,pseudocod:0,psi:0,purpos:0,pval:0,pval_max:0,pyplot:0,python:0,q_matrix:0,qualiti:0,quantifi:0,quantil:0,quantile_bin_arrai:0,quantiti:0,r10:0,r_x:0,r_y:0,rais:0,randn:0,random:0,randomst:0,rang:0,rank:0,rate:0,rather:0,ratio:0,rdbu_r:0,recal:0,recommend:0,reconstruct:0,recycle_residu:0,red:0,reduc:0,refer:0,regard:0,regress:0,regular:0,rel:0,relat:0,relationship:0,relev:0,remain:0,remember_only_par:0,remov:0,repeat:0,replac:0,repo:0,repres:0,requir:0,reset_lagged_link:0,residu:0,respect:0,restrict:0,result:0,return_cleaned_xyz:0,return_data:0,return_dict:0,return_null_dist:0,return_parents_dict:0,return_path:0,return_separate_set:0,return_significant_link:0,rev:0,rho:0,richardson:0,right:0,rizzo:0,robust:0,role:0,row:0,rtype:0,rule:0,run:0,run_bivci:0,run_fullci:0,run_lpcmci:0,run_mci:0,run_pc_stabl:0,run_pcalg:0,run_pcalg_non_timeseries_data:0,run_pcmci:0,run_pcmciplu:0,run_sliding_window_of:0,run_test:0,run_test_raw:0,rung:0,runge18a:0,runtim:0,s41467:0,same:0,sampl:0,sample_s:0,saniti:0,save:0,save_iter:0,save_nam:0,savefig:0,scale:0,sci:0,scienc:0,sciencemag:0,scikit:0,scipi:0,scitat:0,score:0,script:0,search:0,second:0,section:0,see:0,seed:0,seen:0,sejdinov:0,select:0,selected_link:0,selected_target:0,selected_vari:0,selection_var:0,self:0,separ:0,sepset:0,set:0,set_datafram:0,set_mask_typ:0,setter:0,setup:0,setup_arg:0,setup_matrix:0,sever:0,shape:0,shorter:0,should:0,show:0,show_colorbar:0,shown:0,shuffl:0,shuffle_neighbor:0,shuffle_test:0,side:0,sig_blocklength:0,sig_overrid:0,sig_sampl:0,sig_thr:0,sigma:0,signfic:0,signficic:0,signific:0,sim:0,simpl:0,simpli:0,sinc:0,size:0,skeleton:0,skip:0,skip_ticks_data_i:0,skip_ticks_data_x:0,sklearn:0,slice:0,slide:0,slightli:0,smaller:0,smooth:0,smooth_width:0,soft:0,some:0,sort:0,sound:0,sourc:0,space:0,spatial:0,spatio:0,special:0,special_nod:0,specif:0,specifi:0,spirt:0,squar:0,stack:0,standard:0,standard_color_link:0,standard_color_nod:0,standardscal:0,star:0,start:0,starts_with:0,stationar:0,statist:0,std:0,step:0,steps_ahead:0,still:0,stop:0,store:0,str:0,straight:0,strength:0,string:0,structur:0,structural_causal_process:0,student:0,style:0,sub:0,subplot:0,subset:0,subspac:0,suffici:0,suitabl:0,sum:0,sum_:0,summar:0,summari:0,summary_result:0,superset:0,supplement:0,suppli:0,support:0,sure:0,surrog:0,suscept:0,symb_arrai:0,symbol:0,symbolifi:0,symmetr:0,symmetrize_p_and_val_matrix:0,system:0,szeke:0,tail:0,take:0,taken:0,target:0,target_predictor:0,tau:0,tau_:0,tau_max:0,tau_min:0,tau_mix:0,taumax:0,techniqu:0,tempor:0,termin:0,test_indic:0,than:0,thei:0,them:0,themselv:0,theorem:0,theoret:0,thi:0,thm:0,those:0,threshold:0,through:0,tick:0,tickmark:0,tild:0,time_bin_length:0,time_bin_with_mask:0,time_label:0,time_lag:0,timelabel:0,togeth:0,top:0,toronto:0,total:0,toward:0,train:0,train_indic:0,transfer:0,transform:0,translat:0,tripl:0,true_par:0,true_parent_neighbor:0,truncat:0,truth:0,tsg:0,tsg_path_val_matrix:0,tsg_to_net:0,tune:0,tupl:0,tutori:0,twice:0,two:0,two_sided_thr:0,type:0,typic:0,uai2020:0,uai:0,uncertainti:0,unclear:0,uncondit:0,undecid:0,under:0,underli:0,undirect:0,uniform:0,uniqu:0,unit:0,unlik:0,unori:0,unrestrict:0,unshield:0,unshuffl:0,update_middle_mark:0,upper:0,use:0,use_a_pds_t_for_major:0,use_mask:0,used:0,useful:0,user:0,uses:0,using:0,v84:0,val:0,val_matrix:0,val_matrix_interv:0,val_matrix_mean:0,val_min:0,val_onli:0,valid:0,valu:0,var1:0,var2:0,var_nam:0,var_network:0,var_process:0,var_unit:0,vari:0,variabl:0,varianc:0,variant:0,varibl:0,variou:0,varlag:0,varx:0,vector:0,verbos:0,veri:0,vertic:0,via:0,view:0,visual:0,vmax_edg:0,vmax_nod:0,vmin_edg:0,vmin_nod:0,weight:0,weighted_avg_and_std:0,well:0,when:0,where:0,whether:0,which:0,whichev:0,wide:0,widehat:0,width:0,wildcard:0,window:0,window_length:0,window_step:0,within:0,without:0,work:0,worker:0,wrapper:0,wright:0,www:0,x_base:0,x_i:0,x_j:0,x_t:0,xyz:0,y_base:0,y_t:0,yield:0,you:0,z_i:0,z_j:0,z_t:0,zero:0},titles:["TIGRAMITE"],titleterms:{"function":0,analysi:0,causal:0,causal_effect:0,condit:0,data:0,data_process:0,effect:0,gener:0,independ:0,independence_test:0,indic:0,lpcmci:0,mediat:0,model:0,pcmci:0,plot:0,predict:0,process:0,seri:0,tabl:0,test:0,tigramit:0,time:0,toi:0,toymodel:0}})
\ No newline at end of file
+Search.setIndex({docnames:["index"],envversion:{"sphinx.domains.c":1,"sphinx.domains.changeset":1,"sphinx.domains.citation":1,"sphinx.domains.cpp":1,"sphinx.domains.index":1,"sphinx.domains.javascript":1,"sphinx.domains.math":2,"sphinx.domains.python":1,"sphinx.domains.rst":1,"sphinx.domains.std":1,"sphinx.ext.viewcode":1,sphinx:56},filenames:["index.rst"],objects:{"tigramite.causal_effects":{CausalEffects:[0,0,1,""]},"tigramite.causal_effects.CausalEffects":{check_XYS_paths:[0,1,1,""],check_optimality:[0,1,1,""],fit_total_effect:[0,1,1,""],fit_wright_effect:[0,1,1,""],get_graph_from_dict:[0,1,1,""],get_mediators:[0,1,1,""],get_optimal_set:[0,1,1,""],predict_total_effect:[0,1,1,""],predict_wright_effect:[0,1,1,""]},"tigramite.data_processing":{DataFrame:[0,0,1,""],lowhighpass_filter:[0,4,1,""],ordinal_patt_array:[0,4,1,""],quantile_bin_array:[0,4,1,""],smooth:[0,4,1,""],structural_causal_process:[0,4,1,""],time_bin_with_mask:[0,4,1,""],var_process:[0,4,1,""],weighted_avg_and_std:[0,4,1,""]},"tigramite.data_processing.DataFrame":{construct_array:[0,1,1,""],data:[0,3,1,""],datatime:[0,3,1,""],mask:[0,3,1,""],missing_flag:[0,3,1,""],print_array_info:[0,1,1,""],remove_missing_upto_maxlag:[0,3,1,""],var_names:[0,3,1,""]},"tigramite.independence_tests":{CMIknn:[0,0,1,""],CMIsymb:[0,0,1,""],CondIndTest:[0,0,1,""],GPDC:[0,0,1,""],GPDCtorch:[0,0,1,""],OracleCI:[0,0,1,""],ParCorr:[0,0,1,""]},"tigramite.independence_tests.CMIknn":{get_conditional_entropy:[0,1,1,""],get_dependence_measure:[0,1,1,""],get_shuffle_significance:[0,1,1,""],measure:[0,1,1,""]},"tigramite.independence_tests.CMIsymb":{get_dependence_measure:[0,1,1,""],get_shuffle_significance:[0,1,1,""],measure:[0,1,1,""]},"tigramite.independence_tests.CondIndTest":{get_analytic_confidence:[0,1,1,""],get_analytic_significance:[0,1,1,""],get_bootstrap_confidence:[0,1,1,""],get_confidence:[0,1,1,""],get_dependence_measure:[0,1,1,""],get_fixed_thres_significance:[0,1,1,""],get_measure:[0,1,1,""],get_model_selection_criterion:[0,1,1,""],get_shuffle_significance:[0,1,1,""],get_significance:[0,1,1,""],measure:[0,1,1,""],print_info:[0,1,1,""],run_test:[0,1,1,""],run_test_raw:[0,1,1,""],set_dataframe:[0,1,1,""],set_mask_type:[0,1,1,""]},"tigramite.independence_tests.GPDC":{generate_and_save_nulldists:[0,1,1,""],generate_nulldist:[0,1,1,""],get_analytic_significance:[0,1,1,""],get_dependence_measure:[0,1,1,""],get_model_selection_criterion:[0,1,1,""],get_shuffle_significance:[0,1,1,""],measure:[0,1,1,""]},"tigramite.independence_tests.GPDCtorch":{generate_and_save_nulldists:[0,1,1,""],generate_nulldist:[0,1,1,""],get_analytic_significance:[0,1,1,""],get_dependence_measure:[0,1,1,""],get_model_selection_criterion:[0,1,1,""],get_shuffle_significance:[0,1,1,""],measure:[0,1,1,""]},"tigramite.independence_tests.OracleCI":{check_shortest_path:[0,1,1,""],get_confidence:[0,1,1,""],get_graph_from_links:[0,1,1,""],get_links_from_graph:[0,1,1,""],get_measure:[0,1,1,""],get_model_selection_criterion:[0,1,1,""],measure:[0,1,1,""],run_test:[0,1,1,""],set_dataframe:[0,1,1,""]},"tigramite.independence_tests.ParCorr":{get_analytic_confidence:[0,1,1,""],get_analytic_significance:[0,1,1,""],get_dependence_measure:[0,1,1,""],get_model_selection_criterion:[0,1,1,""],get_shuffle_significance:[0,1,1,""],measure:[0,1,1,""]},"tigramite.lpcmci":{LPCMCI:[0,0,1,""]},"tigramite.lpcmci.LPCMCI":{run_lpcmci:[0,1,1,""]},"tigramite.models":{LinearMediation:[0,0,1,""],Models:[0,0,1,""],Prediction:[0,0,1,""]},"tigramite.models.LinearMediation":{fit_model:[0,1,1,""],get_ace:[0,1,1,""],get_acs:[0,1,1,""],get_all_ace:[0,1,1,""],get_all_acs:[0,1,1,""],get_all_amce:[0,1,1,""],get_amce:[0,1,1,""],get_ce:[0,1,1,""],get_ce_max:[0,1,1,""],get_coeff:[0,1,1,""],get_mce:[0,1,1,""],get_mediation_graph_data:[0,1,1,""],get_tsg:[0,1,1,""],get_val_matrix:[0,1,1,""],net_to_tsg:[0,1,1,""],tsg_to_net:[0,1,1,""]},"tigramite.models.Models":{get_coefs:[0,1,1,""],get_fit:[0,1,1,""],get_general_fitted_model:[0,1,1,""],get_general_prediction:[0,1,1,""],get_val_matrix:[0,1,1,""]},"tigramite.models.Prediction":{fit:[0,1,1,""],get_predictors:[0,1,1,""],get_test_array:[0,1,1,""],get_train_array:[0,1,1,""],predict:[0,1,1,""]},"tigramite.pcmci":{PCMCI:[0,0,1,""]},"tigramite.pcmci.PCMCI":{N:[0,3,1,""],T:[0,3,1,""],all_parents:[0,3,1,""],convert_to_string_graph:[0,1,1,""],get_corrected_pvalues:[0,1,1,""],get_graph_from_pmatrix:[0,1,1,""],get_lagged_dependencies:[0,1,1,""],iterations:[0,3,1,""],print_results:[0,1,1,""],print_significant_links:[0,1,1,""],pval_max:[0,3,1,""],return_parents_dict:[0,1,1,""],return_significant_links:[0,1,1,""],run_bivci:[0,1,1,""],run_fullci:[0,1,1,""],run_mci:[0,1,1,""],run_pc_stable:[0,1,1,""],run_pcalg:[0,1,1,""],run_pcalg_non_timeseries_data:[0,1,1,""],run_pcmci:[0,1,1,""],run_pcmciplus:[0,1,1,""],run_sliding_window_of:[0,1,1,""],symmetrize_p_and_val_matrix:[0,1,1,""],val_min:[0,3,1,""]},"tigramite.plotting":{plot_graph:[0,4,1,""],plot_lagfuncs:[0,4,1,""],plot_mediation_graph:[0,4,1,""],plot_mediation_time_series_graph:[0,4,1,""],plot_time_series_graph:[0,4,1,""],plot_timeseries:[0,4,1,""],plot_tsg:[0,4,1,""],setup_matrix:[0,0,1,""]},"tigramite.plotting.setup_matrix":{add_lagfuncs:[0,1,1,""],savefig:[0,1,1,""]},"tigramite.toymodels":{structural_causal_processes:[0,2,0,"-"]},"tigramite.toymodels.structural_causal_processes":{links_to_graph:[0,4,1,""],structural_causal_process:[0,4,1,""],var_process:[0,4,1,""]},tigramite:{data_processing:[0,2,0,"-"],plotting:[0,2,0,"-"]}},objnames:{"0":["py","class","Python class"],"1":["py","method","Python method"],"2":["py","module","Python module"],"3":["py","attribute","Python attribute"],"4":["py","function","Python function"]},objtypes:{"0":"py:class","1":"py:method","2":"py:module","3":"py:attribute","4":"py:function"},terms:{"21st":0,"2xtau_max":0,"36th":0,"579_main_pap":0,"8485ae387a981d783f8764e508151cd9":0,"94e70705efae423efda1088614128d0b":0,"abstract":0,"boolean":0,"break":0,"case":0,"class":0,"default":0,"float":0,"import":0,"int":0,"long":0,"new":0,"null":0,"return":0,"static":0,"true":0,"var":0,"while":0,ACE:0,ACS:0,For:0,Its:0,Not:0,OLS:0,The:0,Then:0,There:0,These:0,Used:0,Useful:0,Uses:0,Using:0,Will:0,With:0,_get_single_residu:0,_run_ancestral_removal_phas:0,_run_dsep_removal_phas:0,_run_non_ancestral_removal_phas:0,about:0,abov:0,abs:0,absent:0,absmax:0,absolut:0,accept:0,accord:0,account:0,ace:0,across:0,acs:0,act:0,actual:0,adapt:0,add:0,add_lagfunc:0,add_lagfunc_arg:0,add_to_null_dist:0,added:0,adding:0,addit:0,address:0,adj:0,adjac:0,adjust:0,adjustment_set:0,admg:0,adv:0,advanc:0,affect:0,after:0,again:0,ahead:0,aic:0,aip:0,akaik:0,algorithm:0,all:0,all_lag:0,all_par:0,all_result:0,alloc:0,allow:0,along:0,alpha:0,alpha_level:0,alreadi:0,also:0,altern:0,alternative_condit:0,although:0,alwai:0,ambigu:0,ambiguous_tripl:0,amc:0,among:0,analyt:0,analyz:0,anc_all_i:0,anc_all_x:0,anc_all_z:0,anc_i:0,anc_x:0,anc_xi:0,ancestor:0,ancestr:0,ani:0,anoth:0,apds_t:0,appli:0,applic:0,appropri:0,apr:0,arang:0,arbitrari:0,argument:0,around:0,arrai:0,array_lik:0,array_mask:0,arrohead:0,arrow:0,arrow_linewidth:0,arrowhead_s:0,articl:0,artifici:0,arxiv:0,assess:0,assign:0,associ:0,assum:0,assumpt:0,ast:0,asymptot:0,attribut:0,au_i:0,au_j:0,auai:0,auto:0,auto_first:0,autocorrel:0,autocovari:0,autodepend:0,automat:0,autoregress:0,auxadmg:0,auxiliari:0,avail:0,averag:0,avoid:0,axes:0,axi:0,backdoor:0,backward:0,bakirov:0,bandwidth:0,base:0,basemap:0,been:0,befor:0,beforehand:0,begin:0,being:0,below:0,benjamini:0,best:0,beta:0,beta_i:0,beta_x:0,better:0,between:0,bia:0,bias:0,bin:0,bincount:0,bindata:0,bivci:0,black:0,block:0,blue:0,bold:0,bool:0,bootstrap:0,both:0,bottom:0,bound:0,box:0,breadth:0,break_once_separ:0,briefli:0,butterworth:0,call:0,callabl:0,can:0,canada:0,canon:0,cardin:0,care:0,caus:0,causaleffect:0,cdot:0,certain:0,chain:0,chao:0,check:0,check_optim:0,check_optimality_cond:0,check_shortest_path:0,check_sm_overlap:0,check_xys_path:0,child:0,choic:0,chosen:0,cite:0,ckdtree:0,clash:0,clean:0,cmap_edg:0,cmap_nod:0,cmi:0,cmiknn:0,cmisymb:0,coef1:0,coef2:0,coeff:0,coeffici:0,collid:0,collider_par:0,colliders_minimized_optim:0,colliders_onli:0,color:0,colorbar:0,colormap:0,column:0,com:0,combin:0,come:0,command:0,common:0,commun:0,compar:0,comparison:0,compat:0,complex:0,comprehens:0,comput:0,compute_ancestor:0,concret:0,cond_ind_test:0,condindtest:0,conditional_estim:0,conditional_model:0,conditions_data:0,conduct:0,conf_blocklength:0,conf_lev:0,conf_low:0,conf_matrix:0,conf_sampl:0,conf_upp:0,confer:0,confid:0,conflict:0,conflict_resolut:0,confound:0,conserv:0,consid:0,consider:0,considerd:0,consist:0,constant:0,constrain:0,construct:0,construct_arrai:0,constructor:0,contain:0,contemp_collider_rul:0,contemp_cond:0,contemporan:0,content:0,continu:0,contrast:0,control:0,conveni:0,convert:0,convert_to_string_graph:0,coordin:0,correct:0,corrected_a:0,correl:0,correspond:0,cost:0,could:0,coupl:0,covari:0,creat:0,criteria:0,criterion:0,cross:0,cube:0,current:0,curv:0,curvatur:0,curved_radiu:0,cut_off:0,cutoff:0,cutperiod:0,cython:0,d_z:0,dag:0,dash:0,data_linewidth:0,data_transform:0,datafram:0,dataset:0,datatim:0,dcor:0,debug:0,decai:0,def:0,default_rng:0,defin:0,definin:0,degre:0,delai:0,denot:0,densiti:0,depend:0,dependence_measur:0,deprec:0,depth:0,deriv:0,describ:0,descript:0,detail:0,detect:0,determin:0,deviat:0,dict:0,dictionari:0,differ:0,digamma:0,digest:0,dim:0,dimens:0,dimension:0,direct:0,direction:0,directli:0,disabl:0,discov:0,discoveri:0,discret:0,discuss:0,disk:0,dismiss:0,dist:0,distanc:0,distribut:0,do_check:0,doc:0,doe:0,doi:0,dpag:0,draw:0,drawn:0,driver:0,due:0,dummi:0,duplic:0,dure:0,eaau4996:0,each:0,easi:0,edg:0,edge_tick:0,effici:0,either:0,element:0,els:0,eman:0,embed:0,empti:0,end:0,ends_with:0,ensur:0,entri:0,entropi:0,enumer:0,epsilon_:0,equal:0,equival:0,error:0,estim:0,eta:0,etc:0,evalu:0,even:0,everi:0,exampl:0,except:0,exclud:0,exclude_contemporan:0,exclude_i:0,exclude_j:0,exclude_k:0,exclude_self_effect:0,execut:0,exist:0,expect:0,experi:0,experiment:0,explain:0,extern:0,extraz:0,f_x:0,f_y:0,factor:0,faculti:0,faith:0,fals:0,fancyarrowpatch:0,faster:0,fdr:0,fdr_bh:0,fdr_method:0,featur:0,feedback:0,fig:0,fig_ax:0,figsiz:0,figur:0,file:0,fill:0,filter:0,fine:0,first:0,fit:0,fit_model:0,fit_result:0,fit_total_effect:0,fit_wright_effect:0,fix:0,fix_all_edges_before_final_orient:0,fixed_thr:0,flag:0,flaxman:0,flexibl:0,follow:0,fontsiz:0,forbidden_nod:0,forc:0,forecast:0,form:0,format:0,forward:0,found:0,four:0,frac:0,fraction:0,framework:0,free:0,freedom:0,frenzel:0,frequenc:0,frequent:0,friendli:0,from:0,full:0,fullci:0,fulli:0,func:0,further:0,futur:0,gabor:0,gatewai:0,gauss_pr:0,gaussian:0,gaussianprocessregressor:0,gaussprocreg:0,gaussprocregtorch:0,generate_and_save_nulldist:0,generate_nulldist:0,gerhardu:0,get:0,get_ac:0,get_all_ac:0,get_all_amc:0,get_amc:0,get_analytic_confid:0,get_analytic_signific:0,get_bootstrap_confid:0,get_c:0,get_ce_max:0,get_coef:0,get_coeff:0,get_conditional_entropi:0,get_confid:0,get_corrected_pvalu:0,get_dependence_measur:0,get_fit:0,get_fixed_thres_signific:0,get_general_fitted_model:0,get_general_predict:0,get_graph_from_dict:0,get_graph_from_link:0,get_graph_from_pmatrix:0,get_lagged_depend:0,get_links_from_graph:0,get_mc:0,get_measur:0,get_medi:0,get_mediation_graph_data:0,get_model_selection_criterion:0,get_optimal_set:0,get_predictor:0,get_shuffle_signific:0,get_signific:0,get_test_arrai:0,get_train_arrai:0,get_tsg:0,get_val_matrix:0,github:0,give:0,given:0,going:0,gp_param:0,gpdc:0,gpdctorch:0,gpytorch:0,graph:0,graph_bool:0,graph_data:0,graph_is_mag:0,graph_typ:0,graphic:0,greater:0,grei:0,grey_masked_sampl:0,grid:0,ground:0,guarante:0,guidanc:0,handl:0,hard:0,has:0,has_path:0,hash:0,have:0,head:0,heavisid:0,heigth:0,help:0,helper:0,henc:0,here:0,hidden:0,hidden_vari:0,high:0,higher:0,histogram:0,hochberg:0,horizont:0,how:0,howev:0,html:0,http:0,hyper:0,hyperparamet:0,hypothesi:0,hypothet:0,identifi:0,iint:0,implement:0,impli:0,importantli:0,improv:0,includ:0,include_lagzero_link:0,include_lagzero_par:0,include_neighbor:0,incom:0,index:0,indirect:0,individu:0,inf:0,infin:0,info:0,inform:0,inherit:0,initi:0,initial_valu:0,inner_edg:0,inner_edge_styl:0,inno_cov:0,innov:0,input:0,instanc:0,instanti:0,instead:0,instruct:0,integ:0,intellig:0,interdisciplinari:0,interest:0,intern:0,interpret:0,interv:0,interven:0,intervent:0,intervention_data:0,intervention_typ:0,introduc:0,introduct:0,inv_inno_cov:0,invalid:0,invers:0,invit:0,irrelev:0,iter:0,its:0,itself:0,j_t:0,joint:0,journal:0,just:0,kei:0,kernel:0,kind:0,knn:0,kretschmer:0,kwarg:0,label:0,label_fonts:0,label_space_left:0,label_space_top:0,lag1:0,lag2:0,lag:0,lag_arrai:0,lag_mod:0,lag_unit:0,lagfunct:0,lagged_par:0,larg:0,larger:0,last:0,latent:0,later:0,latter:0,lead:0,learn:0,least:0,leav:0,left:0,legend:0,legend_fonts:0,legend_width:0,len:0,length:0,less:0,let:0,lett:0,level:0,lightgrei:0,like:0,likelihood:0,limit:0,lin_f:0,line:0,linear:0,linear_model:0,linearmedi:0,linearregress:0,linewidth:0,link:0,link_attribut:0,link_coeff:0,link_colorbar_label:0,link_frequ:0,link_label_fonts:0,link_matrix:0,link_width:0,links_coeff:0,links_to_graph:0,list:0,load:0,log:0,look:0,low:0,lower:0,lowhighpass_filt:0,made:0,mag:0,magnitud:0,mai:0,main:0,major:0,make:0,mani:0,map:0,margin:0,maria:0,mark:0,marker:0,markers:0,markov:0,mask:0,mask_typ:0,match:0,mathcal:0,matplotlib:0,matric:0,matrix:0,matter:0,max:0,max_combin:0,max_cond_px:0,max_conds_dim:0,max_conds_pi:0,max_conds_px:0,max_conds_px_lag:0,max_delai:0,max_lag:0,max_lag_or_tau_max:0,max_p_glob:0,max_p_non_ancestr:0,max_pds_set:0,max_q_glob:0,maxim:0,maximum:0,mce:0,mci:0,mean:0,measur:0,med:0,member:0,memori:0,method:0,method_arg:0,middl:0,might:0,minim:0,minimized_optim:0,minimum:0,minu:0,miss:0,missing_flag:0,mlr:0,mmr:0,mode:0,model_param:0,modul:0,modulo:0,momentari:0,more:0,most:0,most_frequent_link:0,mostli:0,motif:0,much:0,multi:0,multipl:0,multivari:0,must:0,mutual:0,n_preliminary_iter:0,n_symb:0,nail:0,name:0,nan:0,napds_t:0,natur:0,ncomms9502:0,nearest:0,necessari:0,need:0,neg:0,neighbor:0,nest:0,net_to_tsg:0,network:0,network_lower_bound:0,neural:0,neurip:0,never:0,nevertheless:0,new_data:0,niehgbor:0,no_apr:0,no_nois:0,no_non_ancestral_phas:0,node:0,node_aspect:0,node_colorbar_label:0,node_label_s:0,node_po:0,node_s:0,node_tick:0,nois:0,non:0,non_rep:0,none:0,nonlinear:0,nonstat:0,nonstationari:0,nonzero:0,normal:0,note:0,nowack:0,npz:0,null_dist:0,null_dist_filenam:0,nulldist:0,number:0,numer:0,numpi:0,object:0,observ:0,observed_var:0,occur:0,onc:0,one:0,onli:0,only_non_causal_path:0,opac:0,oper:0,opposit:0,optim:0,optimality_cond_des_ym:0,optimality_cond_i:0,optimz:0,option:0,oracl:0,oracleci:0,order:0,ordin:0,ordinal_patt_arrai:0,ordinari:0,org:0,orient:0,orient_comtemp:0,orient_contemp:0,origin:0,orrd:0,oset:0,oset_:0,other:0,otherwis:0,otion:0,ouput:0,out:0,outcom:0,output:0,over:0,overlaid:0,overlap:0,overrid:0,overwrit:0,p_matrix:0,packag:0,page:0,pair:0,pairwis:0,panel:0,paper:0,parallel:0,paramet:0,parametr:0,parcorr:0,parent:0,parent_node_id:0,parents_dict:0,parents_neighbors_coeff:0,parents_of_lag:0,part:0,partial:0,particular:0,pass:0,pass_period:0,path:0,path_node_arrai:0,path_val_matrix:0,pathwai:0,patt:0,patt_mask:0,patt_tim:0,pattern:0,pc1:0,pc_1:0,pc_alpha:0,pcmciplu:0,pdf:0,peak:0,pearl:0,pearson:0,percentil:0,perform:0,period:0,permut:0,perp:0,perspect:0,phase:0,phi:0,phy:0,physrev:0,pip:0,plai:0,pleas:0,plot_graph:0,plot_gridlin:0,plot_lagfunc:0,plot_mediation_graph:0,plot_mediation_time_series_graph:0,plot_time_series_graph:0,plot_timeseri:0,plot_tsg:0,point:0,pomp:0,pos:0,posit:0,possibl:0,post:0,potenti:0,power:0,pq_matrix:0,practic:0,pre:0,precis:0,precomput:0,pred_param:0,predict_total_effect:0,predict_wright_effect:0,prediction_model:0,predictor:0,prelim_onli:0,prelim_rul:0,prelim_with_collider_rul:0,preliminari:0,preprocess:0,present:0,preserv:0,press:0,previou:0,prime:0,print:0,print_array_info:0,print_info:0,print_result:0,print_significant_link:0,prior:0,priorit:0,prl:0,procedur:0,proceed:0,processor:0,project:0,proper:0,properti:0,provid:0,pseudcod:0,pseudoc:0,pseudocod:0,psi:0,purpos:0,pval:0,pval_max:0,pyplot:0,python:0,q_matrix:0,qualiti:0,quantifi:0,quantil:0,quantile_bin_arrai:0,quantiti:0,r10:0,r_x:0,r_y:0,rais:0,randn:0,random:0,randomst:0,rang:0,rank:0,rate:0,rather:0,ratio:0,rdbu_r:0,recal:0,recommend:0,reconstruct:0,recycle_residu:0,red:0,reduc:0,refer:0,regard:0,regress:0,regular:0,rel:0,relat:0,relationship:0,relev:0,remain:0,remember_only_par:0,remov:0,remove_missing_upto_maxlag:0,repeat:0,replac:0,repo:0,repres:0,requir:0,reset_lagged_link:0,residu:0,respect:0,restrict:0,result:0,return_cleaned_xyz:0,return_data:0,return_dict:0,return_null_dist:0,return_parents_dict:0,return_path:0,return_separate_set:0,return_significant_link:0,rev:0,rho:0,richardson:0,right:0,rizzo:0,robust:0,role:0,row:0,rtype:0,rule:0,run:0,run_bivci:0,run_fullci:0,run_lpcmci:0,run_mci:0,run_pc_stabl:0,run_pcalg:0,run_pcalg_non_timeseries_data:0,run_pcmci:0,run_pcmciplu:0,run_sliding_window_of:0,run_test:0,run_test_raw:0,rung:0,runge18a:0,runtim:0,s41467:0,same:0,sampl:0,sample_s:0,saniti:0,save:0,save_iter:0,save_nam:0,savefig:0,scale:0,sci:0,scienc:0,sciencemag:0,scikit:0,scipi:0,scitat:0,score:0,script:0,search:0,second:0,section:0,see:0,seed:0,seen:0,sejdinov:0,select:0,selected_link:0,selected_target:0,selected_vari:0,selection_var:0,self:0,separ:0,sepset:0,set:0,set_datafram:0,set_mask_typ:0,setter:0,setup:0,setup_arg:0,setup_matrix:0,sever:0,shape:0,shorter:0,should:0,show:0,show_colorbar:0,shown:0,shuffl:0,shuffle_neighbor:0,shuffle_test:0,side:0,sig_blocklength:0,sig_overrid:0,sig_sampl:0,sig_thr:0,sigma:0,signfic:0,signficic:0,signific:0,sim:0,simpl:0,simpli:0,sinc:0,size:0,skeleton:0,skip:0,skip_ticks_data_i:0,skip_ticks_data_x:0,sklearn:0,slice:0,slide:0,slightli:0,smaller:0,smooth:0,smooth_width:0,soft:0,some:0,sort:0,sound:0,sourc:0,space:0,spatial:0,spatio:0,special:0,special_nod:0,specif:0,specifi:0,spirt:0,squar:0,stack:0,standard:0,standard_color_link:0,standard_color_nod:0,standardscal:0,star:0,start:0,starts_with:0,stationar:0,statist:0,std:0,step:0,steps_ahead:0,still:0,stop:0,store:0,str:0,straight:0,strength:0,string:0,structur:0,structural_causal_process:0,student:0,style:0,sub:0,subplot:0,subset:0,subspac:0,suffici:0,suitabl:0,sum:0,sum_:0,summar:0,summari:0,summary_result:0,superset:0,supplement:0,suppli:0,support:0,sure:0,surrog:0,suscept:0,symb_arrai:0,symbol:0,symbolifi:0,symmetr:0,symmetrize_p_and_val_matrix:0,system:0,szeke:0,tail:0,take:0,taken:0,target:0,target_predictor:0,tau:0,tau_:0,tau_max:0,tau_min:0,tau_mix:0,taumax:0,techniqu:0,tempor:0,termin:0,test_indic:0,than:0,thei:0,them:0,themselv:0,theorem:0,theoret:0,thi:0,thm:0,those:0,threshold:0,through:0,tick:0,tickmark:0,tild:0,time_bin_length:0,time_bin_with_mask:0,time_label:0,time_lag:0,timelabel:0,togeth:0,top:0,toronto:0,total:0,toward:0,train:0,train_indic:0,transfer:0,transform:0,translat:0,tripl:0,true_par:0,true_parent_neighbor:0,truncat:0,truth:0,tsg:0,tsg_path_val_matrix:0,tsg_to_net:0,tune:0,tupl:0,tutori:0,twice:0,two:0,two_sided_thr:0,type:0,typic:0,uai2020:0,uai:0,uncertainti:0,unclear:0,uncondit:0,undecid:0,under:0,underli:0,undirect:0,uniform:0,uniqu:0,unit:0,unlik:0,unori:0,unrestrict:0,unshield:0,unshuffl:0,update_middle_mark:0,upper:0,use:0,use_a_pds_t_for_major:0,use_mask:0,used:0,useful:0,user:0,uses:0,using:0,v84:0,val:0,val_matrix:0,val_matrix_interv:0,val_matrix_mean:0,val_min:0,val_onli:0,valid:0,valu:0,var1:0,var2:0,var_nam:0,var_network:0,var_process:0,var_unit:0,vari:0,variabl:0,varianc:0,variant:0,varibl:0,variou:0,varlag:0,varx:0,vector:0,verbos:0,veri:0,vertic:0,via:0,view:0,visual:0,vmax_edg:0,vmax_nod:0,vmin_edg:0,vmin_nod:0,weight:0,weighted_avg_and_std:0,well:0,when:0,where:0,whether:0,which:0,whichev:0,wide:0,widehat:0,width:0,wildcard:0,window:0,window_length:0,window_step:0,within:0,without:0,work:0,worker:0,wrapper:0,wright:0,www:0,x_base:0,x_i:0,x_j:0,x_t:0,xyz:0,y_base:0,y_t:0,yield:0,you:0,z_i:0,z_j:0,z_t:0,zero:0},titles:["TIGRAMITE"],titleterms:{"function":0,analysi:0,causal:0,causal_effect:0,condit:0,data:0,data_process:0,effect:0,gener:0,independ:0,independence_test:0,indic:0,lpcmci:0,mediat:0,model:0,pcmci:0,plot:0,predict:0,process:0,seri:0,tabl:0,test:0,tigramit:0,time:0,toi:0,toymodel:0}})
\ No newline at end of file
diff --git a/docs/_modules/abc.html b/docs/_modules/abc.html
index c5c069e9..6a10e222 100644
--- a/docs/_modules/abc.html
+++ b/docs/_modules/abc.html
@@ -1,10 +1,9 @@
-
+
-
abc — Tigramite 5.0 documentation
@@ -26,10 +25,23 @@ Navigation
modules |
Tigramite 5.0 documentation »
- Module code »
- abc
+ Module code »
-
+
+
@@ -183,14 +195,14 @@
Source code for abc
def _dump_registry ( cls , file = None ):
"""Debug helper to print the ABC registry."""
- print ( f "Class: { cls . __module__ } . { cls . __qualname__ } " , file = file )
- print ( f "Inv. counter: { get_cache_token () } " , file = file )
+ print ( f "Class: {cls.__module__} . {cls.__qualname__} " , file = file )
+ print ( f "Inv. counter: {get_cache_token()}" , file = file )
( _abc_registry , _abc_cache , _abc_negative_cache ,
_abc_negative_cache_version ) = _get_dump ( cls )
- print ( f "_abc_registry: { _abc_registry !r} " , file = file )
- print ( f "_abc_cache: { _abc_cache !r} " , file = file )
- print ( f "_abc_negative_cache: { _abc_negative_cache !r} " , file = file )
- print ( f "_abc_negative_cache_version: { _abc_negative_cache_version !r} " ,
+ print ( f "_abc_registry: {_abc_registry!r} " , file = file )
+ print ( f "_abc_cache: {_abc_cache!r} " , file = file )
+ print ( f "_abc_negative_cache: {_abc_negative_cache!r} " , file = file )
+ print ( f "_abc_negative_cache_version: {_abc_negative_cache_version!r} " ,
file = file )
def _abc_registry_clear ( cls ):
@@ -209,24 +221,9 @@ Source code for abc
-
-
\ No newline at end of file
diff --git a/docs/_modules/index.html b/docs/_modules/index.html
index 74c97a7e..52f88b97 100644
--- a/docs/_modules/index.html
+++ b/docs/_modules/index.html
@@ -1,10 +1,9 @@
-
+
-
Overview: module code — Tigramite 5.0 documentation
@@ -25,10 +24,23 @@ Navigation
modules |
- Tigramite 5.0 documentation »
- Overview: module code
+ Tigramite 5.0 documentation »
-
+
+
-
\ No newline at end of file
diff --git a/docs/_modules/tigramite/causal_effects.html b/docs/_modules/tigramite/causal_effects.html
index e2aade7a..b88b016c 100644
--- a/docs/_modules/tigramite/causal_effects.html
+++ b/docs/_modules/tigramite/causal_effects.html
@@ -1,10 +1,9 @@
-
+
-
tigramite.causal_effects — Tigramite 5.0 documentation
@@ -26,10 +25,23 @@ Navigation
modules |
Tigramite 5.0 documentation »
- Module code »
- tigramite.causal_effects
+ Module code »
-
+
+
@@ -48,6 +60,7 @@
Source code for tigramite.causal_effects
from copy import deepcopy
from collections import defaultdict
from tigramite.models import Models
+import struct
[docs] class CausalEffects ():
r """Causal effect estimation.
@@ -112,9 +125,13 @@
Source code for tigramite.causal_effects
if S is None :
S = []
- X = set ( X )
- Y = set ( Y )
- S = set ( S )
+ self . listX = list ( X )
+ self . listY = list ( Y )
+ self . listS = list ( S )
+
+ self . X = set ( X )
+ self . Y = set ( Y )
+ self . S = set ( S )
#
# Checks regarding graph type
@@ -141,12 +158,10 @@ Source code for tigramite.causal_effects
hidden_variables = []
self . hidden_variables = set ( hidden_variables )
- if len ( self . hidden_variables . intersection ( X . union ( Y ) . union ( S ))) > 0 :
+ if len ( self . hidden_variables . intersection ( self . X . union ( self . Y ) . union ( self . S ))) > 0 :
raise ValueError ( "XYS overlaps with hidden_variables!" )
- self . X = X
- self . Y = Y
- self . S = S
+
# Only needed for later extension to MAG/PAGs
if 'pag' in graph_type :
@@ -161,18 +176,21 @@ Source code for tigramite.causal_effects
# Construct internal graph from input graph depending on graph type
# and hidden variables
- ( self . graph , self . graph_type ,
- self . tau_max , self . hidden_variables ) = self . _construct_graph (
- graph = graph , graph_type = graph_type ,
- hidden_variables = hidden_variables )
+ # (self.graph, self.graph_type,
+ # self.tau_max, self.hidden_variables) =
+
+ self . _construct_graph ( graph = graph , graph_type = graph_type ,
+ hidden_variables = hidden_variables )
# print(self.graph.shape)
self . _check_graph ( self . graph )
- anc_Y = self . _get_ancestors ( Y )
+ self . ancX = self . _get_ancestors ( X )
+ self . ancY = self . _get_ancestors ( Y )
+ self . ancS = self . _get_ancestors ( S )
# If X is not in anc(Y), then no causal link exists
- if anc_Y . intersection ( set ( X )) == set ():
+ if self . ancY . intersection ( set ( X )) == set ():
self . no_causal_path = True
if self . verbosity > 0 :
print ( "No causal path from X to Y exists." )
@@ -187,14 +205,16 @@ Source code for tigramite.causal_effects
M = set ( mediators )
self . M = M
- for varlag in X . union ( Y ) . union ( S ):
+ self . listM = list ( self . M )
+
+ for varlag in self . X . union ( self . Y ) . union ( self . S ):
if abs ( varlag [ 1 ]) > self . tau_max :
raise ValueError ( "X, Y, S must have time lags inside graph." )
if len ( self . X . intersection ( self . Y )) > 0 :
raise ValueError ( "Overlap between X and Y" )
- if len ( S . intersection ( self . Y . union ( self . X ))) > 0 :
+ if len ( self . S . intersection ( self . Y . union ( self . X ))) > 0 :
raise ValueError ( "Conditions S overlap with X or Y" )
# # TODO: need to prove that this is sufficient for non-identifiability!
@@ -204,28 +224,26 @@ Source code for tigramite.causal_effects
if check_SM_overlap and len ( self . S . intersection ( self . M )) > 0 :
raise ValueError ( "Conditions S overlap with mediators M!" )
- descendants = self . _get_descendants ( self . Y . union ( self . M ))
-
+ self . desX = self . _get_descendants ( self . X )
+ self . desY = self . _get_descendants ( self . Y )
+ self . desM = self . _get_descendants ( self . M )
+ self . descendants = self . desY . union ( self . desM )
+
# Define forb as X and descendants of YM
- self . forbidden_nodes = descendants . union ( self . X ) #.union(S)
+ self . forbidden_nodes = self . descendants . union ( self . X ) #.union(S)
# Define valid ancestors
- self . vancs = self . _get_ancestors ( list ( self . X . union ( self . Y ) . union ( self . S ))) - self . forbidden_nodes
+ self . vancs = self . ancX . union ( self . ancY ) . union ( self . ancS ) - self . forbidden_nodes
- if len ( self . S . intersection ( self . _get_descendants ( self . X ))) > 0 :
- if self . verbosity > 0 :
+ if self . verbosity > 0 :
+ if len ( self . S . intersection ( self . desX )) > 0 :
print ( "Warning: Potentially outside assumptions: Conditions S overlap with des(X)" )
# Here only check if S overlaps with des(Y), leave the option that S
# contains variables in des(M) to the user
- if len ( self . S . intersection ( self . _get_descendants ( self . Y ))) > 0 :
+ if len ( self . S . intersection ( self . desY )) > 0 :
raise ValueError ( "Not identifiable: Conditions S overlap with des(Y)" )
- self . listX = list ( self . X )
- self . listY = list ( self . Y )
- self . listS = list ( self . S )
- self . listM = list ( self . M )
-
if self . verbosity > 0 :
print ( " \n ## \n ## Initializing CausalEffects class \n ##"
" \n\n Input:" )
@@ -251,20 +269,21 @@ Source code for tigramite.causal_effects
if graph_type in [ 'dag' , 'admg' ]:
- tau_max = 0
if graph . ndim != 2 :
raise ValueError ( "graph_type in ['dag', 'admg'] assumes graph.shape=(N, N)." )
# Convert to shape [N, N, 1, 1] with dummy dimension
# to process as tsg_dag or tsg_admg with potential hidden variables
self . graph = np . expand_dims ( graph , axis = ( 2 , 3 ))
+
+ # tau_max needed in _get_latent_projection_graph
self . tau_max = 0
if len ( hidden_variables ) > 0 :
- graph = self . _get_latent_projection_graph () # stationary=False)
- graph_type = "tsg_admg"
+ self . graph = self . _get_latent_projection_graph () # stationary=False)
+ self . graph_type = "tsg_admg"
else :
- graph = self . graph
- graph_type = 'tsg_' + graph_type
+ # graph = self.graph
+ self . graph_type = 'tsg_' + graph_type
elif graph_type in [ 'tsg_dag' , 'tsg_admg' ]:
if graph . ndim != 4 :
@@ -276,10 +295,10 @@ Source code for tigramite.causal_effects
self . tau_max = graph . shape [ 2 ] - 1
if len ( hidden_variables ) > 0 :
- graph = self . _get_latent_projection_graph () #, stationary=False)
- graph_type = "tsg_admg"
+ self . graph = self . _get_latent_projection_graph () #, stationary=False)
+ self . graph_type = "tsg_admg"
else :
- graph_type = graph_type
+ self . graph_type = graph_type
elif graph_type in [ 'stationary_dag' ]:
# Currently only stationary_dag without hidden variables is supported
@@ -299,16 +318,18 @@ Source code for tigramite.causal_effects
for varlag in self . X . union ( self . Y ) . union ( self . S ):
maxlag_XYS = max ( maxlag_XYS , abs ( varlag [ 1 ]))
- tau_max = maxlag_XYS + statgraph_tau_max
+ self . tau_max = maxlag_XYS + statgraph_tau_max
stat_graph = deepcopy ( graph )
+ allowed_edges = [ "-->" , "<--" ]
+
# Construct tsg_graph
- graph = np . zeros (( self . N , self . N , tau_max + 1 , tau_max + 1 ), dtype = '<U3' )
+ graph = np . zeros (( self . N , self . N , self . tau_max + 1 , self . tau_max + 1 ), dtype = '<U3' )
graph [:] = ""
for ( i , j ) in itertools . product ( range ( self . N ), range ( self . N )):
- for jt , tauj in enumerate ( range ( 0 , tau_max + 1 )):
- for it , taui in enumerate ( range ( tauj , tau_max + 1 )):
+ for jt , tauj in enumerate ( range ( 0 , self . tau_max + 1 )):
+ for it , taui in enumerate ( range ( tauj , self . tau_max + 1 )):
tau = abs ( taui - tauj )
if tau == 0 and j == i :
continue
@@ -327,14 +348,26 @@ Source code for tigramite.causal_effects
if stat_graph [ i , j , tau ] == '-->' :
graph [ i , j , taui , tauj ] = "-->"
graph [ j , i , tauj , taui ] = "<--"
+ elif stat_graph [ i , j , tau ] == '<--' :
+ pass
+ elif stat_graph [ i , j , tau ] == '' :
+ pass
+ else :
+ edge = stat_graph [ i , j , tau ]
+ raise ValueError ( "Invalid graph edge %s . " % ( edge ) +
+ "For graph_type = %s only %s are allowed." % ( graph_type , str ( allowed_edges )))
+
+
# elif stat_graph[i, j, tau] == '<--':
# graph[i, j, taui, tauj] = "<--"
# graph[j, i, tauj, taui] = "-->"
- graph_type = 'tsg_dag'
+ self . graph_type = 'tsg_dag'
+ self . graph = graph
+
- return ( graph , graph_type , tau_max , hidden_variables )
+ # return (graph, graph_type, self.tau_max, hidden_variables)
# max_lag = self._get_maximum_possible_lag(XYZ=list(X.union(Y).union(S)), graph=graph)
@@ -382,16 +415,16 @@ Source code for tigramite.causal_effects
oldX = self . X . copy ()
oldY = self . Y . copy ()
- anc_Y = self . _get_ancestors ( self . Y )
- anc_S = self . _get_ancestors ( self . S )
+ # anc_Y = self._get_ancestors(self.Y)
+ # anc_S = self._get_ancestors(self.S)
# Remove first from X those nodes with no causal path to Y or S
- X = set ([ x for x in self . X if x in anc_Y . union ( anc_S )])
+ X = set ([ x for x in self . X if x in self . ancY . union ( self . ancS )])
# Remove from Y those nodes with no causal path from X
- des_X = self . _get_descendants ( X )
+ # des_X = self._get_descendants(X)
- Y = set ([ y for y in self . Y if y in des_X ])
+ Y = set ([ y for y in self . Y if y in self . desX ])
# Also require that all x in X have proper path to Y or S,
# that is, the first link goes out of x
@@ -633,27 +666,33 @@ Source code for tigramite.causal_effects
# Find adjacencies going forward/contemp
for k , lag_ik in zip ( * np . where ( graph [ i ,:, lag_i ,:])):
# print((k, lag_ik), graph[i,k,lag_i,lag_ik])
- matches = [ self . _match_link ( patt , graph [ i , k , lag_i , lag_ik ]) for patt in patterns ]
- if np . any ( matches ):
- match = ( k , - lag_ik )
- if match not in exclude :
- if return_link :
- adj . append (( graph [ i , k , lag_i , lag_ik ], match ))
- else :
- adj . append ( match )
+ # matches = [self._match_link(patt, graph[i,k,lag_i,lag_ik]) for patt in patterns]
+ # if np.any(matches):
+ for patt in patterns :
+ if self . _match_link ( patt , graph [ i , k , lag_i , lag_ik ]):
+ match = ( k , - lag_ik )
+ if match not in exclude :
+ if return_link :
+ adj . append (( graph [ i , k , lag_i , lag_ik ], match ))
+ else :
+ adj . append ( match )
+ break
# Find adjacencies going backward/contemp
for k , lag_ki in zip ( * np . where ( graph [:, i ,:, lag_i ])):
# print((k, lag_ki), graph[k,i,lag_ki,lag_i])
- matches = [ self . _match_link ( self . _reverse_link ( patt ), graph [ k , i , lag_ki , lag_i ]) for patt in patterns ]
- if np . any ( matches ):
- match = ( k , - lag_ki )
- if match not in exclude :
- if return_link :
- adj . append (( self . _reverse_link ( graph [ k , i , lag_ki , lag_i ]), match ))
- else :
- adj . append ( match )
+ # matches = [self._match_link(self._reverse_link(patt), graph[k,i,lag_ki,lag_i]) for patt in patterns]
+ # if np.any(matches):
+ for patt in patterns :
+ if self . _match_link ( self . _reverse_link ( patt ), graph [ k , i , lag_ki , lag_i ]):
+ match = ( k , - lag_ki )
+ if match not in exclude :
+ if return_link :
+ adj . append (( self . _reverse_link ( graph [ k , i , lag_ki , lag_i ]), match ))
+ else :
+ adj . append ( match )
+ break
adj = list ( set ( adj ))
return adj
@@ -671,7 +710,7 @@ Source code for tigramite.causal_effects
return (( tauij >= 0 and self . _match_link ( pattern_ij , graph [ i , j , tauij ])) or
( tauij < 0 and self . _match_link ( self . _reverse_link ( pattern_ij ), graph [ j , i , abs ( tauij )])))
-
+ # @profile
def _get_children ( self , varlag ):
"""Returns set of children (varlag --> ...) for (lagged) varlag."""
if self . possible :
@@ -782,6 +821,7 @@ Source code for tigramite.causal_effects
return descendants
+ # @profile
def _get_descendants ( self , W ):
"""Get descendants of nodes in W up to time t.
@@ -1116,6 +1156,7 @@ Source code for tigramite.causal_effects
return aux_graph
+ # @profile
def _check_path ( self ,
# graph,
start , end ,
@@ -1317,7 +1358,7 @@ Source code for tigramite.causal_effects
# print("Separated")
return False
-
+ # @profile
[docs] def get_optimal_set ( self ,
alternative_conditions = None ,
minimize = False ,
@@ -1351,9 +1392,16 @@
Source code for tigramite.causal_effects
vancs = self . vancs . copy ()
else :
S = alternative_conditions
- vancs = self . _get_ancestors ( list ( self . X . union ( self . Y ) . union ( S ))) - self . forbidden_nodes
+ newancS = self . _get_ancestors ( S )
+ self . vancs = self . ancX . union ( self . ancY ) . union ( newancS ) - self . forbidden_nodes
- descendants = self . _get_descendants ( self . Y . union ( self . M ))
+ # vancs = self._get_ancestors(list(self.X.union(self.Y).union(S))) - self.forbidden_nodes
+
+ # descendants = self._get_descendants(self.Y.union(self.M))
+
+ # Sufficient condition for non-identifiability
+ if len ( self . X . intersection ( self . descendants )) > 0 :
+ return False # raise ValueError("Not identifiable: Overlap between X and des(M)")
##
## Construct O-set
@@ -1442,13 +1490,6 @@ Source code for tigramite.causal_effects
Oset_S = Oset . union ( S )
- # For singleton X the validity is already checked in the
- # if-statements of the construction algorithm, but for
- # multivariate X there might be further cases... Hence,
- # we here explicitely check validity
- if self . _check_validity ( list ( Oset_S )) is False :
- return False
-
if return_separate_sets :
return parents , colliders , collider_parents , S
else :
@@ -1806,7 +1847,7 @@ Source code for tigramite.causal_effects
return all_causal_paths
-
+ # @profile
[docs] def fit_total_effect ( self ,
dataframe ,
estimator ,
@@ -1863,6 +1904,9 @@
Source code for tigramite.causal_effects
if self . _check_validity ( adjustment_set ) is False :
raise ValueError ( "Chosen adjustment_set is not valid." )
+ if adjustment_set is False :
+ raise ValueError ( "Causal effect not identifiable via adjustment." )
+
self . adjustment_set = adjustment_set
# Fit model of Y on X and Z (and conditions)
@@ -1884,6 +1928,7 @@ Source code for tigramite.causal_effects
+ # @profile
[docs] def predict_total_effect ( self ,
intervention_data ,
conditions_data = None ,
@@ -1907,11 +1952,11 @@
Source code for tigramite.causal_effects
Results from prediction: an array of shape (time, len(Y)).
"""
- if intervention_data . shape [ 1 ] != len ( self . X ):
+ if intervention_data . shape [ 1 ] != len ( self . listX ):
raise ValueError ( "intervention_data.shape[1] must be len(X)." )
if conditions_data is not None :
- if conditions_data . shape [ 1 ] != len ( self . S ):
+ if conditions_data . shape [ 1 ] != len ( self . listS ):
raise ValueError ( "conditions_data.shape[1] must be len(S)." )
if conditions_data . shape [ 0 ] != intervention_data . shape [ 0 ]:
raise ValueError ( "conditions_data.shape[0] must match intervention_data.shape[0]." )
@@ -1919,7 +1964,7 @@ Source code for tigramite.causal_effects
if self . no_causal_path :
if self . verbosity > 0 :
print ( "No causal path from X to Y exists." )
- return np . zeros (( len ( intervention_data ), len ( self . Y )))
+ return np . zeros (( len ( intervention_data ), len ( self . listY )))
effect = self . model . get_general_prediction (
intervention_data = intervention_data ,
@@ -1928,6 +1973,7 @@ Source code for tigramite.causal_effects
+ # @profile
[docs] def fit_wright_effect ( self ,
dataframe ,
mediation = None ,
@@ -1986,7 +2032,7 @@
Source code for tigramite.causal_effects
mask_type = mask_type ,
verbosity = self . verbosity )
- mediators = self . get_mediators ( start = self . X , end = self . Y )
+ mediators = self . M # self.get_mediators(start=self.X, end=self.Y)
if mediation == 'direct' :
causal_paths = {}
@@ -2019,7 +2065,7 @@ Source code for tigramite.causal_effects
coeffs = {}
for medy in [ med for med in mediators ] + [ y for y in self . listY ]:
coeffs [ medy ] = {}
- mediator_parents = self . _get_all_parents ([ medy ]) . intersection ( mediators . union ( self . X )) - set ([ medy ])
+ mediator_parents = self . _get_all_parents ([ medy ]) . intersection ( mediators . union ( self . X ) . union ( self . Y )) - set ([ medy ])
all_parents = self . _get_all_parents ([ medy ]) - set ([ medy ])
for par in mediator_parents :
Sprime = set ( all_parents ) - set ([ par , medy ])
@@ -2037,6 +2083,7 @@ Source code for tigramite.causal_effects
cut_off = 'max_lag_or_tau_max' ,
return_data = False )
coeffs [ medy ][ par ] = fit_res [ medy ][ 'model' ] . coef_ [ 0 ]
+ # print(mediators, par, medy, coeffs[medy][par])
elif method == 'parents' :
if 'dag' not in self . graph_type :
@@ -2069,6 +2116,7 @@ Source code for tigramite.causal_effects
effect [( x , y )] = 0.
for causal_path in causal_paths [ x ][ y ]:
effect_here = 1.
+ # print(x, y, causal_path)
for index , node in enumerate ( causal_path [: - 1 ]):
i , taui = node
j , tauj = causal_path [ index + 1 ]
@@ -2102,7 +2150,7 @@ Source code for tigramite.causal_effects
self . model . fit_results = fit_results
return self
-
+ # @profile
[docs] def predict_wright_effect ( self ,
intervention_data ,
pred_params = None ,
@@ -2128,32 +2176,200 @@
Source code for tigramite.causal_effects
print ( "No causal path from X to Y exists." )
return np . zeros (( len ( intervention_data ), len ( self . Y )))
- effect = self . model . get_general_prediction (
- intervention_data = intervention_data ,
- conditions_data = None ,
- pred_params = pred_params )
+ intervention_T , lenX = intervention_data . shape
+
+ lenY = len ( self . listY )
+
+ predicted_array = np . zeros (( intervention_T , lenY ))
+ pred_dict = {}
+ for iy , y in enumerate ( self . listY ):
+ # Print message
+ if self . verbosity > 1 :
+ print ( " \n ## Predicting target %s " % str ( y ))
+ if pred_params is not None :
+ for key in list ( pred_params ):
+ print ( " %s = %s " % ( key , pred_params [ key ]))
+ # Default value for pred_params
+ if pred_params is None :
+ pred_params = {}
+ # Check this is a valid target
+ if y not in self . model . fit_results :
+ raise ValueError ( "y = %s not yet fitted" % str ( y ))
+
+ # Transform the data if needed
+ a_transform = self . model . fit_results [ y ][ 'data_transform' ]
+ if a_transform is not None :
+ intervention_data = a_transform . transform ( X = intervention_data )
+
+
+ # Now iterate through interventions (and potentially S)
+ for index , dox_vals in enumerate ( intervention_data ):
+ # Construct XZS-array
+ intervention_array = dox_vals . reshape ( 1 , lenX )
+ predictor_array = intervention_array
+
+ predicted_vals = self . model . fit_results [ y ][ 'model' ] . predict (
+ X = predictor_array , ** pred_params )
+ predicted_array [ index , iy ] = predicted_vals . mean ()
+
+ return predicted_array
+
+
[docs] @staticmethod
+
def get_graph_from_dict ( links , tau_max = None ):
+
"""Helper function to convert dictionary of links to graph array format.
+
+
Parameters
+
---------
+
links : dict
+
Dictionary of form {0:[((0, -1), coeff, func), ...], 1:[...], ...}.
+
Also format {0:[(0, -1), ...], 1:[...], ...} is allowed.
+
tau_max : int or None
+
Maximum lag. If None, the maximum lag in links is used.
+
+
Returns
+
-------
+
graph : array of shape (N, N, tau_max+1)
+
Matrix format of graph with 1 for true links and 0 else.
+
"""
+
+
def _get_minmax_lag ( links ):
+
"""Helper function to retrieve tau_min and tau_max from links.
+
"""
+
+
N = len ( links )
+
+
# Get maximum time lag
+
min_lag = np . inf
+
max_lag = 0
+
for j in range ( N ):
+
for link_props in links [ j ]:
+
if len ( link_props ) > 2 :
+
var , lag = link_props [ 0 ]
+
coeff = link_props [ 1 ]
+
# func = link_props[2]
+
if coeff != 0. :
+
min_lag = min ( min_lag , abs ( lag ))
+
max_lag = max ( max_lag , abs ( lag ))
+
else :
+
var , lag = link_props
+
min_lag = min ( min_lag , abs ( lag ))
+
max_lag = max ( max_lag , abs ( lag ))
-
return effect
+ return min_lag , max_lag
+
+ N = len ( links )
+
+ # Get maximum time lag
+ min_lag , max_lag = _get_minmax_lag ( links )
+
+ # Set maximum lag
+ if tau_max is None :
+ tau_max = max_lag
+ else :
+ if max_lag > tau_max :
+ raise ValueError ( "tau_max is smaller than maximum lag = %d "
+ "found in links, use tau_max=None or larger "
+ "value" % max_lag )
+
+ graph = np . zeros (( N , N , tau_max + 1 ), dtype = '<U3' )
+ for j in links . keys ():
+ for link_props in links [ j ]:
+ if len ( link_props ) > 2 :
+ var , lag = link_props [ 0 ]
+ coeff = link_props [ 1 ]
+ if coeff != 0. :
+ graph [ var , j , abs ( lag )] = "-->"
+ if lag == 0 :
+ graph [ j , var , 0 ] = "<--"
+ else :
+ var , lag = link_props
+ graph [ var , j , abs ( lag )] = "-->"
+ if lag == 0 :
+ graph [ j , var , 0 ] = "<--"
+
+ return graph
+
+if __name__ == '__main__' :
+
+ # Consider some toy data
+ import tigramite
+ import tigramite.toymodels.structural_causal_processes as toys
+ import tigramite.data_processing as pp
+
+ import sklearn
+ from sklearn.linear_model import LinearRegression
+
+ T = 1000
+ def lin_f ( x ): return x
+ auto_coeff = 0.3
+ coeff = 2.
+ links = {
+ 0 : [(( 0 , - 1 ), auto_coeff , lin_f )],
+ 1 : [(( 1 , - 1 ), auto_coeff , lin_f ), (( 0 , - 1 ), coeff , lin_f )],
+ 2 : [(( 2 , - 1 ), auto_coeff , lin_f ), (( 1 , 0 ), coeff , lin_f )],
+ }
+ data , nonstat = toys . structural_causal_process ( links , T = T ,
+ noises = None , seed = 7 )
+
+ # Create some missing values
+ data [ - 10 :,:] = 999.
+ dataframe = pp . DataFrame ( data , missing_flag = 999. )
+
+
+ # Construct expert knowledge graph from links here
+ links = { 0 : [( 0 , - 1 )],
+ 1 : [( 1 , - 1 ), ( 0 , - 1 )],
+ 2 : [( 2 , - 1 ), ( 1 , 0 ),],
+ }
+ # Use staticmethod to get graph
+ graph = CausalEffects . get_graph_from_dict ( links , tau_max = None )
+
+ # We are interested in lagged total effect of X on Y
+ X = [( 0 , - 1 )]
+ Y = [( 2 , 0 )]
+
+ # Initialize class as `stationary_dag`
+ causal_effects = CausalEffects ( graph , graph_type = 'stationary_dag' ,
+ X = X , Y = Y , S = None ,
+ hidden_variables = None ,
+ verbosity = 5 )
+
+ print ( data )
+ # Optimal adjustment set (is used by default)
+ # print(causal_effects.get_optimal_set())
+
+ # # Fit causal effect model from observational data
+ # causal_effects.fit_total_effect(
+ # dataframe=dataframe,
+ # # mask_type='y',
+ # estimator=LinearRegression(),
+ # )
+
+ # # Predict effect of interventions do(X=0.), ..., do(X=1.) in one go
+ # dox_vals = np.linspace(0., 1., 5)
+ # intervention_data = dox_vals.reshape(len(dox_vals), len(X))
+ # pred_Y = causal_effects.predict_total_effect(
+ # intervention_data=intervention_data)
+ # print(pred_Y)
+
+ # Fit causal effect model from observational data
+ causal_effects . fit_wright_effect (
+ dataframe = dataframe ,
+ # mask_type='y',
+ # estimator=LinearRegression(),
+ )
+
+ # Predict effect of interventions do(X=0.), ..., do(X=1.) in one go
+ dox_vals = np . linspace ( 0. , 1. , 5 )
+ intervention_data = dox_vals . reshape ( len ( dox_vals ), len ( X ))
+ pred_Y = causal_effects . predict_wright_effect (
+ intervention_data = intervention_data )
+ print ( pred_Y )
-
-
\ No newline at end of file
diff --git a/docs/_modules/tigramite/data_processing.html b/docs/_modules/tigramite/data_processing.html
index 4752cfa0..11366b61 100644
--- a/docs/_modules/tigramite/data_processing.html
+++ b/docs/_modules/tigramite/data_processing.html
@@ -1,10 +1,9 @@
-
+
-
tigramite.data_processing — Tigramite 5.0 documentation
@@ -26,10 +25,23 @@
Navigation
modules |
Tigramite 5.0 documentation »
-
Module code »
-
tigramite.data_processing
+
Module code »
-
+
+
@@ -56,8 +68,6 @@
Source code for tigramite.data_processing
[docs] class DataFrame ():
"""Data object containing time series array and optional mask.
-
Alternatively, a panda dataframe can be used.
-
Parameters
----------
data : array-like
@@ -81,22 +91,28 @@
Source code for tigramite.data_processing
passed, variables are enumerated as [0, 1, ...]
datatime : array-like, optional (default: None)
Timelabel array. If None, range(T) is used.
+ remove_missing_upto_maxlag : bool, optional (default: False)
+ Whether to remove not only missing samples, but also all neighboring
+ samples up to max_lag (as given by cut_off in construct_array).
"""
def __init__ ( self , data , mask = None , missing_flag = None , var_names = None ,
- datatime = None ):
+ datatime = None , remove_missing_upto_maxlag = False ):
- self . values = data
+ self . values = data . copy ()
self . mask = mask
self . missing_flag = missing_flag
if self . missing_flag is not None :
self . values [ self . values == self . missing_flag ] = np . nan
+ self . remove_missing_upto_maxlag = remove_missing_upto_maxlag
T , N = data . shape
# Set the variable names
self . var_names = var_names
# Set the default variable names if none are set
if self . var_names is None :
self . var_names = { i : i for i in range ( N )}
-
+ else :
+ if len ( self . var_names ) != N :
+ raise ValueError ( "len(var_names) != data.shape[1]." )
# Set datatime
self . datatime = datatime
if self . datatime is None :
@@ -153,6 +169,7 @@ Source code for tigramite.data_processing
% str ( _use_mask . shape ))
[docs] def construct_array ( self , X , Y , Z , tau_max ,
+
extraZ = None ,
mask = None ,
mask_type = None ,
return_cleaned_xyz = False ,
@@ -166,10 +183,10 @@
Source code for tigramite.data_processing
Parameters
----------
- X, Y, Z : list of tuples
+ X, Y, Z, extraZ : list of tuples
For a dependence measure I(X;Y|Z), X, Y, Z can be multivariate of
the form [(var1, -lag), (var2, -lag), ...]. At least one varlag in Y
- has to be at lag zero.
+ has to be at lag zero. extraZ is only used in CausalEffects class.
tau_max : int
Maximum time lag. This may be used to make sure that estimates for
different lags in X and Z all have the same sample size.
@@ -210,16 +227,20 @@ Source code for tigramite.data_processing
# Get the length in time and the number of nodes
T , N = self . values . shape
- # Remove duplicates in X, Y, Z
+ if extraZ is None :
+ extraZ = []
+ # Remove duplicates in X, Y, Z, extraZ
X = list ( OrderedDict . fromkeys ( X ))
Y = list ( OrderedDict . fromkeys ( Y ))
Z = list ( OrderedDict . fromkeys ( Z ))
+ extraZ = list ( OrderedDict . fromkeys ( extraZ ))
# If a node in Z occurs already in X or Y, remove it from Z
Z = [ node for node in Z if ( node not in X ) and ( node not in Y )]
+ extraZ = [ node for node in extraZ if ( node not in X ) and ( node not in Y ) and ( node not in Z )]
# Check that all lags are non-positive and indices are in [0,N-1]
- XYZ = X + Y + Z
+ XYZ = X + Y + Z + extraZ
dim = len ( XYZ )
# Ensure that XYZ makes sense
@@ -239,9 +260,10 @@ Source code for tigramite.data_processing
# Setup XYZ identifier
index_code = { 'x' : 0 ,
'y' : 1 ,
- 'z' : 2 }
+ 'z' : 2 ,
+ 'e' : 3 }
xyz = np . array ([ index_code [ name ]
- for var , name in zip ([ X , Y , Z ], [ 'x' , 'y' , 'z' ])
+ for var , name in zip ([ X , Y , Z , extraZ ], [ 'x' , 'y' , 'z' , 'e' ])
for _ in var ])
# Setup and fill array with lagged time series
@@ -257,15 +279,23 @@ Source code for tigramite.data_processing
# Choose which indices to use
use_indices = np . ones ( time_length , dtype = 'int' )
- # Remove all values that have missing value flag, as well as the time
+ # Remove all values that have missing value flag, and optionally as well the time
# slices that occur up to max_lag after
if self . missing_flag is not None :
- missing_anywhere = np . any ( np . isnan ( self . values ), axis = 1 )
- for tau in range ( max_lag + 1 ):
+ missing_anywhere = np . array ( np . where ( np . any ( np . isnan ( array ), axis = 0 ))[ 0 ])
+ if self . remove_missing_upto_maxlag :
+ for tau in range ( max_lag + 1 ):
+ if self . bootstrap is None :
+ delete = missing_anywhere + tau
+ delete = delete [ delete < time_length ]
+ use_indices [ delete ] = 0
+ else :
+ use_indices [ missing_anywhere [ self . bootstrap ] + tau ] = 0
+ else :
if self . bootstrap is None :
- use_indices [ missing_anywhere [ tau : T - max_lag + tau ]] = 0
+ use_indices [ missing_anywhere ] = 0
else :
- use_indices [ missing_anywhere [ self . bootstrap - max_lag + tau ]] = 0
+ use_indices [ missing_anywhere [ self . bootstrap ]] = 0
# Use the mask override if needed
_use_mask = mask
@@ -289,7 +319,7 @@ Source code for tigramite.data_processing
array_mask [ i , :] = ( _use_mask [ self . bootstrap + lag , var ] == False )
# Iterate over defined mapping from letter index to number index,
- # i.e. 'x' -> 0, 'y' -> 1, 'z'-> 2
+ # i.e. 'x' -> 0, 'y' -> 1, 'z'-> 2, 'e'-> 3
for idx , cde in index_code . items ():
# Check if the letter index is in the mask type
if ( mask_type is not None ) and ( idx in mask_type ):
@@ -307,7 +337,7 @@ Source code for tigramite.data_processing
# Print information about the constructed array
if verbosity > 2 :
- self . print_array_info ( array , X , Y , Z , self . missing_flag , mask_type )
+ self . print_array_info ( array , X , Y , Z , self . missing_flag , mask_type , extraZ )
# Return the array and xyz and optionally (X, Y, Z)
if return_cleaned_xyz :
@@ -349,7 +379,7 @@ Source code for tigramite.data_processing
# raise ValueError("Y-nodes are %s, " % str(Y) +
# "but one of the Y-nodes must have zero lag")
-[docs] def print_array_info ( self , array , X , Y , Z , missing_flag , mask_type ):
+
[docs] def print_array_info ( self , array , X , Y , Z , missing_flag , mask_type , extraZ = None ):
"""
Print info about the constructed array
@@ -357,7 +387,7 @@
Source code for tigramite.data_processing
----------
array : Data array of shape (dim, T)
Data array.
- X, Y, Z : list of tuples
+ X, Y, Z, extraZ : list of tuples
For a dependence measure I(X;Y|Z), Y is of the form [(varY, 0)],
where var specifies the variable index. X typically is of the form
[(varX, -tau)] with tau denoting the time lag and Z can be
@@ -372,11 +402,15 @@ Source code for tigramite.data_processing
measure I(X; Y | Z) the samples should be masked. If None, the mask
is not used. Explained in tutorial on masking and missing values.
"""
+ if extraZ is None :
+ extraZ = []
indt = " " * 12
print ( indt + "Constructed array of shape %s from" % str ( array . shape ) +
" \n " + indt + "X = %s " % str ( X ) +
" \n " + indt + "Y = %s " % str ( Y ) +
" \n " + indt + "Z = %s " % str ( Z ))
+ if extraZ is not None :
+ print ( indt + "extraZ = %s " % str ( extraZ ))
if self . mask is not None and mask_type is not None :
print ( indt + "with masked samples in %s removed" % mask_type )
if self . missing_flag is not None :
@@ -745,6 +779,7 @@ Source code for tigramite.data_processing
if __name__ == '__main__' :
+ from tigramite.toymodels.structural_causal_processes import structural_causal_process
## Generate some time series from a structural causal process
def lin_f ( x ): return x
def nonlin_f ( x ): return ( x + 5. * x ** 2 * np . exp ( - x ** 2 / 20. ))
@@ -757,26 +792,13 @@ Source code for tigramite.data_processing
data , nonstat = structural_causal_process ( links ,
T = 100 , noises = noises )
print ( data . shape )
+
+ frame = DataFrame ( data )
-
-
\ No newline at end of file
diff --git a/docs/_modules/tigramite/independence_tests/cmiknn.html b/docs/_modules/tigramite/independence_tests/cmiknn.html
index 5623a7e3..795c4796 100644
--- a/docs/_modules/tigramite/independence_tests/cmiknn.html
+++ b/docs/_modules/tigramite/independence_tests/cmiknn.html
@@ -1,10 +1,9 @@
-
+
-
tigramite.independence_tests.cmiknn — Tigramite 5.0 documentation
@@ -26,10 +25,23 @@
Navigation
modules |
Tigramite 5.0 documentation »
-
Module code »
-
tigramite.independence_tests.cmiknn
+
Module code »
-
+
+
@@ -48,7 +60,7 @@
Source code for tigramite.independence_tests.cmiknn import
numpy as np
from .independence_tests_base import CondIndTest
from numba import jit
-
+
import warnings
[docs] class CMIknn ( CondIndTest ):
r """Conditional mutual information test based on nearest-neighbor estimator.
@@ -201,12 +213,17 @@
Source code for tigramite.independence_tests.cmiknn # Standardize
array = array . astype ( np . float64 )
array -= array . mean ( axis = 1 ) . reshape ( dim , 1 )
-
array /= array . std ( axis = 1 ) . reshape ( dim , 1 )
+
std = array . std ( axis = 1 )
+
for i in range ( dim ):
+
if std [ i ] != 0. :
+
array [ i ] /= std [ i ]
+
# array /= array.std(axis=1).reshape(dim, 1)
# FIXME: If the time series is constant, return nan rather than
# raising Exception
-
if np . isnan ( array ) . sum () != 0 :
-
raise ValueError ( "nans after standardizing, "
-
"possibly constant array!" )
+
if np . any ( std == 0. ):
+
warnings . warn ( "Possibly constant array!" )
+
# raise ValueError("nans after standardizing, "
+
# "possibly constant array!")
elif self . transform == 'uniform' :
array = self . _trafo2uniform ( array )
elif self . transform == 'ranks' :
@@ -415,12 +432,18 @@
Source code for tigramite.independence_tests.cmiknn # Standardize
array = array . astype ( np . float64 )
array -= array . mean ( axis = 1 ) . reshape ( dim , 1 )
-
array /= array . std ( axis = 1 ) . reshape ( dim , 1 )
+
std = array . std ( axis = 1 )
+
for i in range ( dim ):
+
if std [ i ] != 0. :
+
array [ i ] /= std [ i ]
+
# array /= array.std(axis=1).reshape(dim, 1)
# FIXME: If the time series is constant, return nan rather than
# raising Exception
-
if np . isnan ( array ) . sum () != 0 :
-
raise ValueError ( "nans after standardizing, "
-
"possibly constant array!" )
+
if np . any ( std == 0. ):
+
warnings . warn ( "Possibly constant array!" )
+
# if np.isnan(array).sum() != 0:
+
# raise ValueError("nans after standardizing, "
+
# "possibly constant array!")
elif self . transform == 'uniform' :
array = self . _trafo2uniform ( array )
elif self . transform == 'ranks' :
@@ -481,24 +504,9 @@
Source code for tigramite.independence_tests.cmiknn return restricted_permutation
-
-
\ No newline at end of file
diff --git a/docs/_modules/tigramite/independence_tests/cmisymb.html b/docs/_modules/tigramite/independence_tests/cmisymb.html
index b08eb34a..37ad4667 100644
--- a/docs/_modules/tigramite/independence_tests/cmisymb.html
+++ b/docs/_modules/tigramite/independence_tests/cmisymb.html
@@ -1,10 +1,9 @@
-
+
-
tigramite.independence_tests.cmisymb — Tigramite 5.0 documentation
@@ -26,10 +25,23 @@
Navigation
modules |
Tigramite 5.0 documentation »
-
Module code »
-
tigramite.independence_tests.cmisymb
+
Module code »
-
+
+
@@ -257,24 +269,9 @@
Source code for tigramite.independence_tests.cmisymb return pval
-
-
\ No newline at end of file
diff --git a/docs/_modules/tigramite/independence_tests/gpdc.html b/docs/_modules/tigramite/independence_tests/gpdc.html
index aa2b1ca5..9235c461 100644
--- a/docs/_modules/tigramite/independence_tests/gpdc.html
+++ b/docs/_modules/tigramite/independence_tests/gpdc.html
@@ -1,10 +1,9 @@
-
+
-
tigramite.independence_tests.gpdc — Tigramite 5.0 documentation
@@ -26,10 +25,23 @@ Navigation
modules |
Tigramite 5.0 documentation »
-
Module code »
-
tigramite.independence_tests.gpdc
+
Module code »
-
+
+
@@ -44,15 +56,27 @@
Source code for tigramite.independence_tests.gpdc # License: GNU General Public License v3.0
from __future__ import print_function
+
import json , warnings
import numpy as np
-
import warnings
-
from .independence_tests_base import CondIndTest
-
+
try :
+
from importlib import metadata
+
except ImportError :
+
import importlib_metadata as metadata # python<=3.7
try :
import dcor
from sklearn import gaussian_process
+
with open ( '../versions.py' , 'r' ) as vfile :
+
packages = json . loads ( vfile . read ())[ 'all' ]
+
packages = dict ( map ( lambda s : s . split ( '>=' ), packages ))
+
if metadata . version ( 'dcor' ) < packages [ 'dcor' ]:
+
raise Exception ( 'Version mismatch. Installed version of dcor' , metadata . version ( 'dcor' ),
+
'Please install dcor>=' , packages [ 'dcor' ])
+
if metadata . version ( 'scikit-learn' ) < packages [ 'scikit-learn' ]:
+
raise Exception ( 'Version mismatch. Installed version of scikit-learn' , metadata . version ( 'scikit-learn' ),
+
'Please install scikit-learn>=' , packages [ 'scikit-learn' ])
except Exception as e :
warnings . warn ( str ( e ))
+
from .independence_tests_base import CondIndTest
class GaussProcReg ():
r """Gaussian processes abstract base class.
@@ -251,10 +275,16 @@
Source code for tigramite.independence_tests.gpdc # Standardize
if standardize :
array -= array . mean ( axis = 1 ) . reshape ( dim , 1 )
-
array /= array . std ( axis = 1 ) . reshape ( dim , 1 )
-
if np . isnan ( array ) . sum () != 0 :
-
raise ValueError ( "nans after standardizing, "
-
"possibly constant array!" )
+
std = array . std ( axis = 1 )
+
for i in range ( dim ):
+
if std [ i ] != 0. :
+
array [ i ] /= std [ i ]
+
if np . any ( std == 0. ):
+
warnings . warn ( "Possibly constant array!" )
+
# array /= array.std(axis=1).reshape(dim, 1)
+
# if np.isnan(array).sum() != 0:
+
# raise ValueError("nans after standardizing, "
+
# "possibly constant array!")
target_series = array [ target_var , :]
z = np . fastCopyAndTranspose ( array [ 2 :])
@@ -693,24 +723,9 @@
Source code for tigramite.independence_tests.gpdc
-
-
\ No newline at end of file
diff --git a/docs/_modules/tigramite/independence_tests/gpdc_torch.html b/docs/_modules/tigramite/independence_tests/gpdc_torch.html
index ddffaa5f..f88154fa 100644
--- a/docs/_modules/tigramite/independence_tests/gpdc_torch.html
+++ b/docs/_modules/tigramite/independence_tests/gpdc_torch.html
@@ -1,10 +1,9 @@
-
+
-
tigramite.independence_tests.gpdc_torch — Tigramite 5.0 documentation
@@ -26,10 +25,23 @@ Navigation
modules |
Tigramite 5.0 documentation »
-
Module code »
-
tigramite.independence_tests.gpdc_torch
+
Module code »
-
+
+
@@ -44,17 +56,33 @@
Source code for tigramite.independence_tests.gpdc_torch # License: GNU General Public License v3.0
from __future__ import print_function
-
import warnings
+
import json , warnings
import numpy as np
import gc
-
from .independence_tests_base import CondIndTest
+
try :
+
from importlib import metadata
+
except ImportError :
+
import importlib_metadata as metadata # python<=3.7
try :
import dcor
import torch
import gpytorch
from .LBFGS import FullBatchLBFGS
+
with open ( '../versions.py' , 'r' ) as vfile :
+
packages = json . loads ( vfile . read ())[ 'all' ]
+
packages = dict ( map ( lambda s : s . split ( '>=' ), packages ))
+
if metadata . version ( 'dcor' ) < packages [ 'dcor' ]:
+
raise Exception ( 'Version mismatch. Installed version of dcor' , metadata . version ( 'dcor' ),
+
'Please install dcor>=' , packages [ 'dcor' ])
+
if metadata . version ( 'torch' ) < packages [ 'pytorch' ]:
+
raise Exception ( 'Version mismatch. Installed version of pytorch' , metadata . version ( 'torch' ),
+
'Please install pytorch>=' , packages [ 'pytorch' ])
+
if metadata . version ( 'gpytorch' ) < packages [ 'gpytorch' ]:
+
raise Exception ( 'Version mismatch. Installed version of gpytorch' , metadata . version ( 'gpytorch' ),
+
'Please install gpytorch>=' , packages [ 'gpytorch' ])
except Exception as e :
warnings . warn ( str ( e ))
+
from .independence_tests_base import CondIndTest
class GaussProcRegTorch ():
r """Gaussian processes abstract base class.
@@ -256,10 +284,16 @@
Source code for tigramite.independence_tests.gpdc_torch # Standardize
if standardize :
array -= array . mean ( axis = 1 ) . reshape ( dim , 1 )
-
array /= array . std ( axis = 1 ) . reshape ( dim , 1 )
-
if np . isnan ( array ) . any ():
-
raise ValueError ( "Nans after standardizing, "
-
"possibly constant array!" )
+
std = array . std ( axis = 1 )
+
for i in range ( dim ):
+
if std [ i ] != 0. :
+
array [ i ] /= std [ i ]
+
if np . any ( std == 0. ):
+
warnings . warn ( "Possibly constant array!" )
+
# array /= array.std(axis=1).reshape(dim, 1)
+
# if np.isnan(array).any():
+
# raise ValueError("Nans after standardizing, "
+
# "possibly constant array!")
target_series = array [ target_var , :]
z = np . fastCopyAndTranspose ( array [ 2 :])
@@ -847,24 +881,9 @@
Source code for tigramite.independence_tests.gpdc_torch
-
\ No newline at end of file
diff --git a/docs/_modules/tigramite/independence_tests/independence_tests_base.html b/docs/_modules/tigramite/independence_tests/independence_tests_base.html
index 31a503f3..01bda2db 100644
--- a/docs/_modules/tigramite/independence_tests/independence_tests_base.html
+++ b/docs/_modules/tigramite/independence_tests/independence_tests_base.html
@@ -1,10 +1,9 @@
-
+
-
tigramite.independence_tests.independence_tests_base — Tigramite 5.0 documentation
@@ -26,10 +25,23 @@
Navigation
modules |
Tigramite 5.0 documentation »
-
Module code »
-
tigramite.independence_tests.independence_tests_base
+
Module code »
-
+
+
@@ -1052,24 +1064,9 @@
Source code for tigramite.independence_tests.independence_tests_base return u
-
-
\ No newline at end of file
diff --git a/docs/_modules/tigramite/independence_tests/oracle_conditional_independence.html b/docs/_modules/tigramite/independence_tests/oracle_conditional_independence.html
index 96ff3d7b..5fde4ff6 100644
--- a/docs/_modules/tigramite/independence_tests/oracle_conditional_independence.html
+++ b/docs/_modules/tigramite/independence_tests/oracle_conditional_independence.html
@@ -1,10 +1,9 @@
-
+
-
tigramite.independence_tests.oracle_conditional_independence — Tigramite 5.0 documentation
@@ -26,10 +25,23 @@ Navigation
modules |
Tigramite 5.0 documentation »
-
Module code »
-
tigramite.independence_tests.oracle_conditional_independence
+
Module code »
-
+
+
@@ -1602,24 +1614,9 @@
Source code for tigramite.independence_tests.oracle_conditional_independence
# fig.savefig("/home/rung_ja/Downloads/tsg.pdf")
-
-
\ No newline at end of file
diff --git a/docs/_modules/tigramite/independence_tests/parcorr.html b/docs/_modules/tigramite/independence_tests/parcorr.html
index d92a210a..64ee9151 100644
--- a/docs/_modules/tigramite/independence_tests/parcorr.html
+++ b/docs/_modules/tigramite/independence_tests/parcorr.html
@@ -1,10 +1,9 @@
-
+
-
tigramite.independence_tests.parcorr — Tigramite 5.0 documentation
@@ -26,10 +25,23 @@ Navigation
modules |
Tigramite 5.0 documentation »
-
Module code »
-
tigramite.independence_tests.parcorr
+
Module code »
-
+
+
@@ -47,6 +59,7 @@
Source code for tigramite.independence_tests.parcorr from
scipy import stats
import numpy as np
import sys
+
import warnings
from .independence_tests_base import CondIndTest
@@ -130,10 +143,16 @@
Source code for tigramite.independence_tests.parcorr # Standardize
if standardize :
array -= array . mean ( axis = 1 ) . reshape ( dim , 1 )
-
array /= array . std ( axis = 1 ) . reshape ( dim , 1 )
-
if np . isnan ( array ) . sum () != 0 :
-
raise ValueError ( "nans after standardizing, "
-
"possibly constant array!" )
+
std = array . std ( axis = 1 )
+
for i in range ( dim ):
+
if std [ i ] != 0. :
+
array [ i ] /= std [ i ]
+
if np . any ( std == 0. ):
+
warnings . warn ( "Possibly constant array!" )
+
# array /= array.std(axis=1).reshape(dim, 1)
+
# if np.isnan(array).sum() != 0:
+
# raise ValueError("nans after standardizing, "
+
# "possibly constant array!")
y = array [ target_var , :]
@@ -340,24 +359,9 @@
Source code for tigramite.independence_tests.parcorr return score
-
-
\ No newline at end of file
diff --git a/docs/_modules/tigramite/lpcmci.html b/docs/_modules/tigramite/lpcmci.html
index 7a356d35..693d9bcb 100644
--- a/docs/_modules/tigramite/lpcmci.html
+++ b/docs/_modules/tigramite/lpcmci.html
@@ -1,10 +1,9 @@
-
+
-
tigramite.lpcmci — Tigramite 5.0 documentation
@@ -26,10 +25,23 @@ Navigation
modules |
Tigramite 5.0 documentation »
-
Module code »
-
tigramite.lpcmci
+
Module code »
-
+
+
@@ -3451,24 +3463,9 @@
Source code for tigramite.lpcmci
-
-
\ No newline at end of file
diff --git a/docs/_modules/tigramite/models.html b/docs/_modules/tigramite/models.html
index bebddb92..32848d7b 100644
--- a/docs/_modules/tigramite/models.html
+++ b/docs/_modules/tigramite/models.html
@@ -1,10 +1,9 @@
-
+
-
tigramite.models — Tigramite 5.0 documentation
@@ -26,10 +25,23 @@ Navigation
modules |
Tigramite 5.0 documentation »
-
Module code »
-
tigramite.models
+
Module code »
-
+
+
@@ -45,23 +57,29 @@
Source code for tigramite.models
from __future__ import print_function
from copy import deepcopy
-
+import json , warnings
import numpy as np
-
-from tigramite.data_processing import DataFrame
-from tigramite.pcmci import PCMCI
-
-# try:
-import sklearn
-import sklearn.linear_model
-# except:
-# print("Could not import sklearn...")
-
try :
+ from importlib import metadata
+except ImportError :
+ import importlib_metadata as metadata # python<=3.7
+try :
+ import sklearn
+ import sklearn.linear_model
import networkx
-except :
- print ( "Could not import networkx, LinearMediation plots not possible..." )
-
+ with open ( '../versions.py' , 'r' ) as vfile :
+ packages = json . loads ( vfile . read ())[ 'all' ]
+ packages = dict ( map ( lambda s : s . split ( '>=' ), packages ))
+ if metadata . version ( 'scikit-learn' ) < packages [ 'scikit-learn' ]:
+ raise Exception ( 'Version mismatch. Installed version of scikit-learn' , metadata . version ( 'scikit-learn' ),
+ 'Please install scikit-learn>=' , packages [ 'scikit-learn' ])
+ if metadata . version ( 'networkx' ) < packages [ 'networkx' ]:
+ raise Exception ( 'Version mismatch. Installed version of networkx' , metadata . version ( 'networkx' ),
+ 'Please install networkx>=' , packages [ 'networkx' ])
+except Exception as e :
+ warnings . warn ( str ( e ))
+from tigramite.data_processing import DataFrame
+from tigramite.pcmci import PCMCI
[docs] class Models ():
"""Base class for time series models.
@@ -120,6 +138,7 @@
Source code for tigramite.models
self . tau_max = None
self . fit_results = None
+ # @profile
[docs] def get_general_fitted_model ( self ,
Y , X , Z = None ,
conditions = None ,
@@ -189,10 +208,13 @@
Source code for tigramite.models
# Initialize the fit results
fit_results = {}
for y in self . Y :
+
# Construct array of shape (var, time) with first entry being
# a dummy, second is y followed by joint X and Z (ignore the notation in construct_array)
array , xyz = \
- self . dataframe . construct_array ( X = self . X , Y = [ y ] + self . Z , Z = self . conditions ,
+ self . dataframe . construct_array ( X = self . X , Y = [ y ], # + self.Z,
+ Z = self . conditions ,
+ extraZ = self . Z ,
tau_max = self . tau_max ,
mask_type = self . mask_type ,
cut_off = self . cut_off ,
@@ -203,23 +225,23 @@ Source code for tigramite.models
if self . data_transform is not None :
array = self . data_transform . fit_transform ( X = array . T ) . T
- # Cache array for use in prediction
- self . observation_array = array
- self . xyz = xyz
# Fit the model
# Copy and fit the model
a_model = deepcopy ( self . model )
predictor_indices = list ( np . where ( xyz == 0 )[ 0 ]) \
- + list ( np . where ( xyz == 1 )[ 0 ][ 1 :]) \
- + list ( np . where ( xyz == 2 )[ 0 ])
+ + list ( np . where ( xyz == 2 )[ 0 ]) \
+ + list ( np . where ( xyz == 3 )[ 0 ])
predictor_array = array [ predictor_indices , :] . T
# Target is only first entry of Y, ie [y]
target_array = array [ np . where ( xyz == 1 )[ 0 ][ 0 ], :]
a_model . fit ( X = predictor_array , y = target_array )
+
# Cache the results
fit_results [ y ] = {}
+ fit_results [ y ][ 'observation_array' ] = array
+ fit_results [ y ][ 'xyz' ] = xyz
fit_results [ y ][ 'model' ] = a_model
# Cache the data transform
fit_results [ y ][ 'data_transform' ] = deepcopy ( self . data_transform )
@@ -231,6 +253,7 @@ Source code for tigramite.models
self . fit_results = fit_results
return fit_results
+ # @profile
[docs] def get_general_prediction ( self ,
intervention_data ,
conditions_data = None ,
@@ -293,13 +316,13 @@
Source code for tigramite.models
conditions_data = a_transform . transform ( X = conditions_data )
# Extract observational Z from stored array
- z_indices = list ( np . where ( self . xyz == 1 )[ 0 ][ 1 :])
- z_array = self . observation_array [ z_indices , :] . T
+ z_indices = list ( np . where ( self . fit_results [ y ][ 'xyz' ] == 3 )[ 0 ])
+ z_array = self . fit_results [ y ][ 'observation_array' ][ z_indices , :] . T
Tobs = len ( z_array )
if self . conditions is not None and conditions_data is not None :
- s_indices = list ( np . where ( self . xyz == 2 )[ 0 ])
- s_array = self . observation_array [ s_indices , :] . T
+ s_indices = list ( np . where ( self . fit_results [ y ][ 'xyz' ] == 2 )[ 0 ])
+ s_array = self . fit_results [ y ][ 'observation_array' ][ s_indices , :] . T
# Now iterate through interventions (and potentially S)
for index , dox_vals in enumerate ( intervention_data ):
@@ -332,133 +355,6 @@ Source code for tigramite.models
- # def get_general_prediction(self,
- # intervention_data=None,
- # conditions_data=None,
- # pred_params=None,
- # ):
- # r"""Predict effect of intervention with fitted model.
-
- # Uses the model.predict() function of the sklearn model.
-
- # Parameters
- # ----------
- # intervention_data : data object, optional
- # Tigramite dataframe object with optional new mask. Only the
- # values for X will be extracted.
- # conditions_data : data object, optional
- # Tigramite dataframe object with optional new mask. Only the
- # values for conditions will be extracted.
- # pred_params : dict, optional
- # Optional parameters passed on to sklearn prediction function.
-
- # Returns
- # -------
- # Results from prediction.
- # """
-
- # pred_dict = {}
- # for y in self.Y:
- # # Print message
- # if self.verbosity > 1:
- # print("\n## Predicting target %s" % str(y))
- # if pred_params is not None:
- # for key in list(pred_params):
- # print("%s = %s" % (key, pred_params[key]))
- # # Default value for pred_params
- # if pred_params is None:
- # pred_params = {}
- # # Check this is a valid target
- # if y not in self.fit_results:
- # raise ValueError("y = %s not yet fitted" % str(y))
- # # Construct the array form of the data
- # # Check if we've passed a new dataframe object
- # observation_array, xyz = \
- # self.dataframe.construct_array(X=self.X, Y=[y] + self.Z, Z=self.conditions,
- # tau_max=self.tau_max,
- # # mask=self.test_mask,
- # mask_type=self.mask_type,
- # cut_off=self.cut_off,
- # verbosity=self.verbosity)
-
- # intervention_array = np.copy(observation_array)
- # if intervention_data is not None:
- # tmp_array, _ = intervention_data.construct_array(X=self.X, Y=[y] + self.Z,
- # Z=self.conditions,
- # tau_max=self.tau_max,
- # mask_type=self.mask_type,
- # cut_off=self.cut_off,
- # verbosity=self.verbosity)
-
- # # Only replace X-variables in intervention_array (necessary if lags of
- # # X are in Z...)
- # for index in np.where(xyz==0)[0]:
- # intervention_array[index] = tmp_array[index]
-
- # if self.conditions is not None and conditions_data is not None:
- # tmp_array, _ = conditions_data.construct_array(X=self.X, Y=[y] + self.Z,
- # Z=self.conditions,
- # tau_max=self.tau_max,
- # mask_type=self.mask_type,
- # cut_off=self.cut_off,
- # verbosity=self.verbosity)
-
- # # Only replace condition-variables in intervention_array
- # # (necessary if lags of X are in Z...)
- # for index in np.where(xyz==2)[0]:
- # intervention_array[index] = tmp_array[index]
-
- # # Transform the data if needed
- # a_transform = self.fit_results[y]['data_transform']
- # if a_transform is not None:
- # intervention_array = a_transform.transform(X=intervention_array.T).T
- # # Cache the test array
- # self.intervention_array = intervention_array
- # # Run the predictor, for Y only the Z-part is used, the first index is y
- # predictor_indices = list(np.where(xyz==0)[0]) \
- # + list(np.where(xyz==1)[0][1:]) \
- # + list(np.where(xyz==2)[0])
- # predictor_array = intervention_array[predictor_indices, :].T
-
- # pred_dict[y] = self.fit_results[y]['model'].predict(
- # X=predictor_array, **pred_params)
-
- # # print(pred_dict[y])
- # if self.conditions is not None and conditions_data is not None:
-
- # a_conditional_model = deepcopy(self.conditional_model)
-
- # # Fit Y|do(X) on S
- # conditions_array = observation_array[list(np.where(xyz==2)[0])]
- # target_array = pred_dict[y] # array[np.where(xyz==1)[0][0], :]
-
- # if a_transform is not None:
- # conditions_array = a_transform.transform(X=conditions_array.T).T
- # target_array = a_transform.transform(X=target_array.T).T
-
- # a_conditional_model.fit(X=conditions_array.T, y=target_array)
- # self.fit_results[y]['conditional_model'] = a_conditional_model
-
- # # Now predict conditional causal effect for new conditions
- # tmp_array, _ = conditions_data.construct_array(X=self.X, Y=[y] + self.Z,
- # Z=self.conditions,
- # tau_max=self.tau_max,
- # mask_type=self.mask_type,
- # cut_off=self.cut_off,
- # verbosity=self.verbosity)
-
- # # Construct conditions array
- # new_conditions_array = tmp_array[list(np.where(xyz==2)[0])]
-
- # if a_transform is not None:
- # new_conditions_array = a_transform.transform(X=new_conditions_array.T).T
-
- # pred_dict[y] = a_conditional_model.predict(
- # X=new_conditions_array.T, **pred_params)
-
- # return pred_dict
-
-
[docs] def get_fit ( self , all_parents ,
selected_variables = None ,
tau_max = None ,
@@ -1650,24 +1546,9 @@
Source code for tigramite.models
-
-
\ No newline at end of file
diff --git a/docs/_modules/tigramite/pcmci.html b/docs/_modules/tigramite/pcmci.html
index 4bf70db3..cc3019fc 100644
--- a/docs/_modules/tigramite/pcmci.html
+++ b/docs/_modules/tigramite/pcmci.html
@@ -1,10 +1,9 @@
-
+
-
tigramite.pcmci — Tigramite 5.0 documentation
@@ -26,10 +25,23 @@ Navigation
modules |
Tigramite 5.0 documentation »
-
Module code »
-
tigramite.pcmci
+
Module code »
-
+
+
@@ -4155,24 +4167,9 @@
Source code for tigramite.pcmci
-
-
\ No newline at end of file
diff --git a/docs/_modules/tigramite/plotting.html b/docs/_modules/tigramite/plotting.html
index 6c5ec8fe..3bc18132 100644
--- a/docs/_modules/tigramite/plotting.html
+++ b/docs/_modules/tigramite/plotting.html
@@ -1,10 +1,9 @@
-
+
-
tigramite.plotting — Tigramite 5.0 documentation
@@ -26,10 +25,23 @@ Navigation
modules |
Tigramite 5.0 documentation »
-
Module code »
-
tigramite.plotting
+
Module code »
-
+
+
@@ -44,7 +56,26 @@
Source code for tigramite.plotting
# License: GNU General Public License v3.0
import numpy as np
-import matplotlib
+import json , warnings
+try :
+ from importlib import metadata
+except ImportError :
+ import importlib_metadata as metadata # python<=3.7
+try :
+ import matplotlib
+ import networkx as nx
+ with open ( '../versions.py' , 'r' ) as vfile :
+ packages = json . loads ( vfile . read ())[ 'all' ]
+ packages = dict ( map ( lambda s : s . split ( '>=' ), packages ))
+ if metadata . version ( 'matplotlib' ) < packages [ 'matplotlib' ]:
+ raise Exception ( 'Version mismatch. Installed version of matplotlib' , metadata . version ( 'matplotlib' ),
+ 'Please install matplotlib>=' , packages [ 'matplotlib' ])
+ if metadata . version ( 'networkx' ) < packages [ 'networkx' ]:
+ raise Exception ( 'Version mismatch. Installed version of networkx' , metadata . version ( 'networkx' ),
+ 'Please install networkx>=' , packages [ 'networkx' ])
+except Exception as e :
+ warnings . warn ( str ( e ))
+
from matplotlib.colors import ListedColormap
import matplotlib.transforms as transforms
from matplotlib import pyplot , ticker
@@ -54,7 +85,6 @@ Source code for tigramite.plotting
import sys
from operator import sub
-import networkx as nx
import tigramite.data_processing as pp
from copy import deepcopy
import matplotlib.path as mpath
@@ -1005,7 +1035,7 @@ Source code for tigramite.plotting
coor1 ,
coor2 ,
arrowstyle = arrowstyle ,
- connectionstyle = f "arc3,rad= { rad } " ,
+ connectionstyle = f "arc3,rad= {rad} " ,
mutation_scale = width ,
lw = width / 2 ,
alpha = alpha ,
@@ -2418,7 +2448,7 @@ Source code for tigramite.plotting
ax . text (
label_space_left ,
pos [ order [ i ] * max_lag ][ 1 ],
- f " { var_names [ order [ i ]] } " ,
+ f "{var_names[order[i]]}" ,
fontsize = label_fontsize ,
horizontalalignment = "left" ,
verticalalignment = "center" ,
@@ -3378,24 +3408,9 @@ Source code for tigramite.plotting
-
-
\ No newline at end of file
diff --git a/docs/_modules/tigramite/toymodels/structural_causal_processes.html b/docs/_modules/tigramite/toymodels/structural_causal_processes.html
index 75df6b2b..856aaab6 100644
--- a/docs/_modules/tigramite/toymodels/structural_causal_processes.html
+++ b/docs/_modules/tigramite/toymodels/structural_causal_processes.html
@@ -1,10 +1,9 @@
-
+
-
tigramite.toymodels.structural_causal_processes — Tigramite 5.0 documentation
@@ -26,10 +25,23 @@
Navigation
modules |
Tigramite 5.0 documentation »
-
Module code »
-
tigramite.toymodels.structural_causal_processes
+
Module code »
-
+
+
@@ -753,7 +765,7 @@
Source code for tigramite.toymodels.structural_causal_processes return data , nonstationary
def _get_minmax_lag ( links ):
-
"""Helper function to retrieve tau_min and tau_max from links
+
"""Helper function to retrieve tau_min and tau_max from links.
"""
N = len ( links )
@@ -763,12 +775,18 @@
Source code for tigramite.toymodels.structural_causal_processes max_lag
= 0
for j in range ( N ):
for link_props in links [ j ]:
-
var , lag = link_props [ 0 ]
-
coeff = link_props [ 1 ]
-
# func = link_props[2]
-
if coeff != 0. :
+
if len ( link_props ) > 2 :
+
var , lag = link_props [ 0 ]
+
coeff = link_props [ 1 ]
+
# func = link_props[2]
+
if coeff != 0. :
+
min_lag = min ( min_lag , abs ( lag ))
+
max_lag = max ( max_lag , abs ( lag ))
+
else :
+
var , lag = link_props
min_lag = min ( min_lag , abs ( lag ))
-
max_lag = max ( max_lag , abs ( lag ))
+
max_lag = max ( max_lag , abs ( lag ))
+
return min_lag , max_lag
def _get_parents ( links , exclude_contemp = False ):
@@ -806,6 +824,54 @@
Source code for tigramite.toymodels.structural_causal_processes return
children
+
[docs] def links_to_graph ( links , tau_max = None ):
+
"""Helper function to convert dictionary of links to graph array format.
+
+
Parameters
+
---------
+
links : dict
+
Dictionary of form {0:[((0, -1), coeff, func), ...], 1:[...], ...}.
+
Also format {0:[(0, -1), ...], 1:[...], ...} is allowed.
+
tau_max : int or None
+
Maximum lag. If None, the maximum lag in links is used.
+
+
Returns
+
-------
+
graph : array of shape (N, N, tau_max+1)
+
Matrix format of graph with 1 for true links and 0 else.
+
"""
+
N = len ( links )
+
+
# Get maximum time lag
+
min_lag , max_lag = _get_minmax_lag ( links )
+
+
# Set maximum lag
+
if tau_max is None :
+
tau_max = max_lag
+
else :
+
if max_lag > tau_max :
+
raise ValueError ( "tau_max is smaller than maximum lag = %d "
+
"found in links, use tau_max=None or larger "
+
"value" % max_lag )
+
+
graph = np . zeros (( N , N , tau_max + 1 ), dtype = '<U3' )
+
for j in links . keys ():
+
for link_props in links [ j ]:
+
if len ( link_props ) > 2 :
+
var , lag = link_props [ 0 ]
+
coeff = link_props [ 1 ]
+
if coeff != 0. :
+
graph [ var , j , abs ( lag )] = "-->"
+
if lag == 0 :
+
graph [ j , var , 0 ] = "<--"
+
else :
+
var , lag = link_props
+
graph [ var , j , abs ( lag )] = "-->"
+
if lag == 0 :
+
graph [ j , var , 0 ] = "<--"
+
+
return graph
+
class _Logger ( object ):
"""Class to append print output to a string which can be saved"""
def __init__ ( self ):
@@ -831,26 +897,18 @@
Source code for tigramite.toymodels.structural_causal_processes data, nonstat = structural_causal_process ( links ,
T = 100 , noises = noises )
print ( data . shape )
+
+ # Construct graph
+ # links = {0: [(0, -1)],
+ # 1: [(1, -1), (0, -1)],
+ # 2: [(2, -1), (1, 0),],
+ # }
+ print ( links_to_graph ( links ))
-
-
\ No newline at end of file
diff --git a/docs/_static/jquery-3.4.1.js b/docs/_static/jquery-3.4.1.js
new file mode 100644
index 00000000..773ad95c
--- /dev/null
+++ b/docs/_static/jquery-3.4.1.js
@@ -0,0 +1,10598 @@
+/*!
+ * jQuery JavaScript Library v3.4.1
+ * https://jquery.com/
+ *
+ * Includes Sizzle.js
+ * https://sizzlejs.com/
+ *
+ * Copyright JS Foundation and other contributors
+ * Released under the MIT license
+ * https://jquery.org/license
+ *
+ * Date: 2019-05-01T21:04Z
+ */
+( function( global, factory ) {
+
+ "use strict";
+
+ if ( typeof module === "object" && typeof module.exports === "object" ) {
+
+ // For CommonJS and CommonJS-like environments where a proper `window`
+ // is present, execute the factory and get jQuery.
+ // For environments that do not have a `window` with a `document`
+ // (such as Node.js), expose a factory as module.exports.
+ // This accentuates the need for the creation of a real `window`.
+ // e.g. var jQuery = require("jquery")(window);
+ // See ticket #14549 for more info.
+ module.exports = global.document ?
+ factory( global, true ) :
+ function( w ) {
+ if ( !w.document ) {
+ throw new Error( "jQuery requires a window with a document" );
+ }
+ return factory( w );
+ };
+ } else {
+ factory( global );
+ }
+
+// Pass this if window is not defined yet
+} )( typeof window !== "undefined" ? window : this, function( window, noGlobal ) {
+
+// Edge <= 12 - 13+, Firefox <=18 - 45+, IE 10 - 11, Safari 5.1 - 9+, iOS 6 - 9.1
+// throw exceptions when non-strict code (e.g., ASP.NET 4.5) accesses strict mode
+// arguments.callee.caller (trac-13335). But as of jQuery 3.0 (2016), strict mode should be common
+// enough that all such attempts are guarded in a try block.
+"use strict";
+
+var arr = [];
+
+var document = window.document;
+
+var getProto = Object.getPrototypeOf;
+
+var slice = arr.slice;
+
+var concat = arr.concat;
+
+var push = arr.push;
+
+var indexOf = arr.indexOf;
+
+var class2type = {};
+
+var toString = class2type.toString;
+
+var hasOwn = class2type.hasOwnProperty;
+
+var fnToString = hasOwn.toString;
+
+var ObjectFunctionString = fnToString.call( Object );
+
+var support = {};
+
+var isFunction = function isFunction( obj ) {
+
+ // Support: Chrome <=57, Firefox <=52
+ // In some browsers, typeof returns "function" for HTML
elements
+ // (i.e., `typeof document.createElement( "object" ) === "function"`).
+ // We don't want to classify *any* DOM node as a function.
+ return typeof obj === "function" && typeof obj.nodeType !== "number";
+ };
+
+
+var isWindow = function isWindow( obj ) {
+ return obj != null && obj === obj.window;
+ };
+
+
+
+
+ var preservedScriptAttributes = {
+ type: true,
+ src: true,
+ nonce: true,
+ noModule: true
+ };
+
+ function DOMEval( code, node, doc ) {
+ doc = doc || document;
+
+ var i, val,
+ script = doc.createElement( "script" );
+
+ script.text = code;
+ if ( node ) {
+ for ( i in preservedScriptAttributes ) {
+
+ // Support: Firefox 64+, Edge 18+
+ // Some browsers don't support the "nonce" property on scripts.
+ // On the other hand, just using `getAttribute` is not enough as
+ // the `nonce` attribute is reset to an empty string whenever it
+ // becomes browsing-context connected.
+ // See https://github.com/whatwg/html/issues/2369
+ // See https://html.spec.whatwg.org/#nonce-attributes
+ // The `node.getAttribute` check was added for the sake of
+ // `jQuery.globalEval` so that it can fake a nonce-containing node
+ // via an object.
+ val = node[ i ] || node.getAttribute && node.getAttribute( i );
+ if ( val ) {
+ script.setAttribute( i, val );
+ }
+ }
+ }
+ doc.head.appendChild( script ).parentNode.removeChild( script );
+ }
+
+
+function toType( obj ) {
+ if ( obj == null ) {
+ return obj + "";
+ }
+
+ // Support: Android <=2.3 only (functionish RegExp)
+ return typeof obj === "object" || typeof obj === "function" ?
+ class2type[ toString.call( obj ) ] || "object" :
+ typeof obj;
+}
+/* global Symbol */
+// Defining this global in .eslintrc.json would create a danger of using the global
+// unguarded in another place, it seems safer to define global only for this module
+
+
+
+var
+ version = "3.4.1",
+
+ // Define a local copy of jQuery
+ jQuery = function( selector, context ) {
+
+ // The jQuery object is actually just the init constructor 'enhanced'
+ // Need init if jQuery is called (just allow error to be thrown if not included)
+ return new jQuery.fn.init( selector, context );
+ },
+
+ // Support: Android <=4.0 only
+ // Make sure we trim BOM and NBSP
+ rtrim = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g;
+
+jQuery.fn = jQuery.prototype = {
+
+ // The current version of jQuery being used
+ jquery: version,
+
+ constructor: jQuery,
+
+ // The default length of a jQuery object is 0
+ length: 0,
+
+ toArray: function() {
+ return slice.call( this );
+ },
+
+ // Get the Nth element in the matched element set OR
+ // Get the whole matched element set as a clean array
+ get: function( num ) {
+
+ // Return all the elements in a clean array
+ if ( num == null ) {
+ return slice.call( this );
+ }
+
+ // Return just the one element from the set
+ return num < 0 ? this[ num + this.length ] : this[ num ];
+ },
+
+ // Take an array of elements and push it onto the stack
+ // (returning the new matched element set)
+ pushStack: function( elems ) {
+
+ // Build a new jQuery matched element set
+ var ret = jQuery.merge( this.constructor(), elems );
+
+ // Add the old object onto the stack (as a reference)
+ ret.prevObject = this;
+
+ // Return the newly-formed element set
+ return ret;
+ },
+
+ // Execute a callback for every element in the matched set.
+ each: function( callback ) {
+ return jQuery.each( this, callback );
+ },
+
+ map: function( callback ) {
+ return this.pushStack( jQuery.map( this, function( elem, i ) {
+ return callback.call( elem, i, elem );
+ } ) );
+ },
+
+ slice: function() {
+ return this.pushStack( slice.apply( this, arguments ) );
+ },
+
+ first: function() {
+ return this.eq( 0 );
+ },
+
+ last: function() {
+ return this.eq( -1 );
+ },
+
+ eq: function( i ) {
+ var len = this.length,
+ j = +i + ( i < 0 ? len : 0 );
+ return this.pushStack( j >= 0 && j < len ? [ this[ j ] ] : [] );
+ },
+
+ end: function() {
+ return this.prevObject || this.constructor();
+ },
+
+ // For internal use only.
+ // Behaves like an Array's method, not like a jQuery method.
+ push: push,
+ sort: arr.sort,
+ splice: arr.splice
+};
+
+jQuery.extend = jQuery.fn.extend = function() {
+ var options, name, src, copy, copyIsArray, clone,
+ target = arguments[ 0 ] || {},
+ i = 1,
+ length = arguments.length,
+ deep = false;
+
+ // Handle a deep copy situation
+ if ( typeof target === "boolean" ) {
+ deep = target;
+
+ // Skip the boolean and the target
+ target = arguments[ i ] || {};
+ i++;
+ }
+
+ // Handle case when target is a string or something (possible in deep copy)
+ if ( typeof target !== "object" && !isFunction( target ) ) {
+ target = {};
+ }
+
+ // Extend jQuery itself if only one argument is passed
+ if ( i === length ) {
+ target = this;
+ i--;
+ }
+
+ for ( ; i < length; i++ ) {
+
+ // Only deal with non-null/undefined values
+ if ( ( options = arguments[ i ] ) != null ) {
+
+ // Extend the base object
+ for ( name in options ) {
+ copy = options[ name ];
+
+ // Prevent Object.prototype pollution
+ // Prevent never-ending loop
+ if ( name === "__proto__" || target === copy ) {
+ continue;
+ }
+
+ // Recurse if we're merging plain objects or arrays
+ if ( deep && copy && ( jQuery.isPlainObject( copy ) ||
+ ( copyIsArray = Array.isArray( copy ) ) ) ) {
+ src = target[ name ];
+
+ // Ensure proper type for the source value
+ if ( copyIsArray && !Array.isArray( src ) ) {
+ clone = [];
+ } else if ( !copyIsArray && !jQuery.isPlainObject( src ) ) {
+ clone = {};
+ } else {
+ clone = src;
+ }
+ copyIsArray = false;
+
+ // Never move original objects, clone them
+ target[ name ] = jQuery.extend( deep, clone, copy );
+
+ // Don't bring in undefined values
+ } else if ( copy !== undefined ) {
+ target[ name ] = copy;
+ }
+ }
+ }
+ }
+
+ // Return the modified object
+ return target;
+};
+
+jQuery.extend( {
+
+ // Unique for each copy of jQuery on the page
+ expando: "jQuery" + ( version + Math.random() ).replace( /\D/g, "" ),
+
+ // Assume jQuery is ready without the ready module
+ isReady: true,
+
+ error: function( msg ) {
+ throw new Error( msg );
+ },
+
+ noop: function() {},
+
+ isPlainObject: function( obj ) {
+ var proto, Ctor;
+
+ // Detect obvious negatives
+ // Use toString instead of jQuery.type to catch host objects
+ if ( !obj || toString.call( obj ) !== "[object Object]" ) {
+ return false;
+ }
+
+ proto = getProto( obj );
+
+ // Objects with no prototype (e.g., `Object.create( null )`) are plain
+ if ( !proto ) {
+ return true;
+ }
+
+ // Objects with prototype are plain iff they were constructed by a global Object function
+ Ctor = hasOwn.call( proto, "constructor" ) && proto.constructor;
+ return typeof Ctor === "function" && fnToString.call( Ctor ) === ObjectFunctionString;
+ },
+
+ isEmptyObject: function( obj ) {
+ var name;
+
+ for ( name in obj ) {
+ return false;
+ }
+ return true;
+ },
+
+ // Evaluates a script in a global context
+ globalEval: function( code, options ) {
+ DOMEval( code, { nonce: options && options.nonce } );
+ },
+
+ each: function( obj, callback ) {
+ var length, i = 0;
+
+ if ( isArrayLike( obj ) ) {
+ length = obj.length;
+ for ( ; i < length; i++ ) {
+ if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) {
+ break;
+ }
+ }
+ } else {
+ for ( i in obj ) {
+ if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) {
+ break;
+ }
+ }
+ }
+
+ return obj;
+ },
+
+ // Support: Android <=4.0 only
+ trim: function( text ) {
+ return text == null ?
+ "" :
+ ( text + "" ).replace( rtrim, "" );
+ },
+
+ // results is for internal usage only
+ makeArray: function( arr, results ) {
+ var ret = results || [];
+
+ if ( arr != null ) {
+ if ( isArrayLike( Object( arr ) ) ) {
+ jQuery.merge( ret,
+ typeof arr === "string" ?
+ [ arr ] : arr
+ );
+ } else {
+ push.call( ret, arr );
+ }
+ }
+
+ return ret;
+ },
+
+ inArray: function( elem, arr, i ) {
+ return arr == null ? -1 : indexOf.call( arr, elem, i );
+ },
+
+ // Support: Android <=4.0 only, PhantomJS 1 only
+ // push.apply(_, arraylike) throws on ancient WebKit
+ merge: function( first, second ) {
+ var len = +second.length,
+ j = 0,
+ i = first.length;
+
+ for ( ; j < len; j++ ) {
+ first[ i++ ] = second[ j ];
+ }
+
+ first.length = i;
+
+ return first;
+ },
+
+ grep: function( elems, callback, invert ) {
+ var callbackInverse,
+ matches = [],
+ i = 0,
+ length = elems.length,
+ callbackExpect = !invert;
+
+ // Go through the array, only saving the items
+ // that pass the validator function
+ for ( ; i < length; i++ ) {
+ callbackInverse = !callback( elems[ i ], i );
+ if ( callbackInverse !== callbackExpect ) {
+ matches.push( elems[ i ] );
+ }
+ }
+
+ return matches;
+ },
+
+ // arg is for internal usage only
+ map: function( elems, callback, arg ) {
+ var length, value,
+ i = 0,
+ ret = [];
+
+ // Go through the array, translating each of the items to their new values
+ if ( isArrayLike( elems ) ) {
+ length = elems.length;
+ for ( ; i < length; i++ ) {
+ value = callback( elems[ i ], i, arg );
+
+ if ( value != null ) {
+ ret.push( value );
+ }
+ }
+
+ // Go through every key on the object,
+ } else {
+ for ( i in elems ) {
+ value = callback( elems[ i ], i, arg );
+
+ if ( value != null ) {
+ ret.push( value );
+ }
+ }
+ }
+
+ // Flatten any nested arrays
+ return concat.apply( [], ret );
+ },
+
+ // A global GUID counter for objects
+ guid: 1,
+
+ // jQuery.support is not used in Core but other projects attach their
+ // properties to it so it needs to exist.
+ support: support
+} );
+
+if ( typeof Symbol === "function" ) {
+ jQuery.fn[ Symbol.iterator ] = arr[ Symbol.iterator ];
+}
+
+// Populate the class2type map
+jQuery.each( "Boolean Number String Function Array Date RegExp Object Error Symbol".split( " " ),
+function( i, name ) {
+ class2type[ "[object " + name + "]" ] = name.toLowerCase();
+} );
+
+function isArrayLike( obj ) {
+
+ // Support: real iOS 8.2 only (not reproducible in simulator)
+ // `in` check used to prevent JIT error (gh-2145)
+ // hasOwn isn't used here due to false negatives
+ // regarding Nodelist length in IE
+ var length = !!obj && "length" in obj && obj.length,
+ type = toType( obj );
+
+ if ( isFunction( obj ) || isWindow( obj ) ) {
+ return false;
+ }
+
+ return type === "array" || length === 0 ||
+ typeof length === "number" && length > 0 && ( length - 1 ) in obj;
+}
+var Sizzle =
+/*!
+ * Sizzle CSS Selector Engine v2.3.4
+ * https://sizzlejs.com/
+ *
+ * Copyright JS Foundation and other contributors
+ * Released under the MIT license
+ * https://js.foundation/
+ *
+ * Date: 2019-04-08
+ */
+(function( window ) {
+
+var i,
+ support,
+ Expr,
+ getText,
+ isXML,
+ tokenize,
+ compile,
+ select,
+ outermostContext,
+ sortInput,
+ hasDuplicate,
+
+ // Local document vars
+ setDocument,
+ document,
+ docElem,
+ documentIsHTML,
+ rbuggyQSA,
+ rbuggyMatches,
+ matches,
+ contains,
+
+ // Instance-specific data
+ expando = "sizzle" + 1 * new Date(),
+ preferredDoc = window.document,
+ dirruns = 0,
+ done = 0,
+ classCache = createCache(),
+ tokenCache = createCache(),
+ compilerCache = createCache(),
+ nonnativeSelectorCache = createCache(),
+ sortOrder = function( a, b ) {
+ if ( a === b ) {
+ hasDuplicate = true;
+ }
+ return 0;
+ },
+
+ // Instance methods
+ hasOwn = ({}).hasOwnProperty,
+ arr = [],
+ pop = arr.pop,
+ push_native = arr.push,
+ push = arr.push,
+ slice = arr.slice,
+ // Use a stripped-down indexOf as it's faster than native
+ // https://jsperf.com/thor-indexof-vs-for/5
+ indexOf = function( list, elem ) {
+ var i = 0,
+ len = list.length;
+ for ( ; i < len; i++ ) {
+ if ( list[i] === elem ) {
+ return i;
+ }
+ }
+ return -1;
+ },
+
+ booleans = "checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",
+
+ // Regular expressions
+
+ // http://www.w3.org/TR/css3-selectors/#whitespace
+ whitespace = "[\\x20\\t\\r\\n\\f]",
+
+ // http://www.w3.org/TR/CSS21/syndata.html#value-def-identifier
+ identifier = "(?:\\\\.|[\\w-]|[^\0-\\xa0])+",
+
+ // Attribute selectors: http://www.w3.org/TR/selectors/#attribute-selectors
+ attributes = "\\[" + whitespace + "*(" + identifier + ")(?:" + whitespace +
+ // Operator (capture 2)
+ "*([*^$|!~]?=)" + whitespace +
+ // "Attribute values must be CSS identifiers [capture 5] or strings [capture 3 or capture 4]"
+ "*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|(" + identifier + "))|)" + whitespace +
+ "*\\]",
+
+ pseudos = ":(" + identifier + ")(?:\\((" +
+ // To reduce the number of selectors needing tokenize in the preFilter, prefer arguments:
+ // 1. quoted (capture 3; capture 4 or capture 5)
+ "('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|" +
+ // 2. simple (capture 6)
+ "((?:\\\\.|[^\\\\()[\\]]|" + attributes + ")*)|" +
+ // 3. anything else (capture 2)
+ ".*" +
+ ")\\)|)",
+
+ // Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter
+ rwhitespace = new RegExp( whitespace + "+", "g" ),
+ rtrim = new RegExp( "^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + whitespace + "+$", "g" ),
+
+ rcomma = new RegExp( "^" + whitespace + "*," + whitespace + "*" ),
+ rcombinators = new RegExp( "^" + whitespace + "*([>+~]|" + whitespace + ")" + whitespace + "*" ),
+ rdescend = new RegExp( whitespace + "|>" ),
+
+ rpseudo = new RegExp( pseudos ),
+ ridentifier = new RegExp( "^" + identifier + "$" ),
+
+ matchExpr = {
+ "ID": new RegExp( "^#(" + identifier + ")" ),
+ "CLASS": new RegExp( "^\\.(" + identifier + ")" ),
+ "TAG": new RegExp( "^(" + identifier + "|[*])" ),
+ "ATTR": new RegExp( "^" + attributes ),
+ "PSEUDO": new RegExp( "^" + pseudos ),
+ "CHILD": new RegExp( "^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" + whitespace +
+ "*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" + whitespace +
+ "*(\\d+)|))" + whitespace + "*\\)|)", "i" ),
+ "bool": new RegExp( "^(?:" + booleans + ")$", "i" ),
+ // For use in libraries implementing .is()
+ // We use this for POS matching in `select`
+ "needsContext": new RegExp( "^" + whitespace + "*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" +
+ whitespace + "*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)", "i" )
+ },
+
+ rhtml = /HTML$/i,
+ rinputs = /^(?:input|select|textarea|button)$/i,
+ rheader = /^h\d$/i,
+
+ rnative = /^[^{]+\{\s*\[native \w/,
+
+ // Easily-parseable/retrievable ID or TAG or CLASS selectors
+ rquickExpr = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,
+
+ rsibling = /[+~]/,
+
+ // CSS escapes
+ // http://www.w3.org/TR/CSS21/syndata.html#escaped-characters
+ runescape = new RegExp( "\\\\([\\da-f]{1,6}" + whitespace + "?|(" + whitespace + ")|.)", "ig" ),
+ funescape = function( _, escaped, escapedWhitespace ) {
+ var high = "0x" + escaped - 0x10000;
+ // NaN means non-codepoint
+ // Support: Firefox<24
+ // Workaround erroneous numeric interpretation of +"0x"
+ return high !== high || escapedWhitespace ?
+ escaped :
+ high < 0 ?
+ // BMP codepoint
+ String.fromCharCode( high + 0x10000 ) :
+ // Supplemental Plane codepoint (surrogate pair)
+ String.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 );
+ },
+
+ // CSS string/identifier serialization
+ // https://drafts.csswg.org/cssom/#common-serializing-idioms
+ rcssescape = /([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,
+ fcssescape = function( ch, asCodePoint ) {
+ if ( asCodePoint ) {
+
+ // U+0000 NULL becomes U+FFFD REPLACEMENT CHARACTER
+ if ( ch === "\0" ) {
+ return "\uFFFD";
+ }
+
+ // Control characters and (dependent upon position) numbers get escaped as code points
+ return ch.slice( 0, -1 ) + "\\" + ch.charCodeAt( ch.length - 1 ).toString( 16 ) + " ";
+ }
+
+ // Other potentially-special ASCII characters get backslash-escaped
+ return "\\" + ch;
+ },
+
+ // Used for iframes
+ // See setDocument()
+ // Removing the function wrapper causes a "Permission Denied"
+ // error in IE
+ unloadHandler = function() {
+ setDocument();
+ },
+
+ inDisabledFieldset = addCombinator(
+ function( elem ) {
+ return elem.disabled === true && elem.nodeName.toLowerCase() === "fieldset";
+ },
+ { dir: "parentNode", next: "legend" }
+ );
+
+// Optimize for push.apply( _, NodeList )
+try {
+ push.apply(
+ (arr = slice.call( preferredDoc.childNodes )),
+ preferredDoc.childNodes
+ );
+ // Support: Android<4.0
+ // Detect silently failing push.apply
+ arr[ preferredDoc.childNodes.length ].nodeType;
+} catch ( e ) {
+ push = { apply: arr.length ?
+
+ // Leverage slice if possible
+ function( target, els ) {
+ push_native.apply( target, slice.call(els) );
+ } :
+
+ // Support: IE<9
+ // Otherwise append directly
+ function( target, els ) {
+ var j = target.length,
+ i = 0;
+ // Can't trust NodeList.length
+ while ( (target[j++] = els[i++]) ) {}
+ target.length = j - 1;
+ }
+ };
+}
+
+function Sizzle( selector, context, results, seed ) {
+ var m, i, elem, nid, match, groups, newSelector,
+ newContext = context && context.ownerDocument,
+
+ // nodeType defaults to 9, since context defaults to document
+ nodeType = context ? context.nodeType : 9;
+
+ results = results || [];
+
+ // Return early from calls with invalid selector or context
+ if ( typeof selector !== "string" || !selector ||
+ nodeType !== 1 && nodeType !== 9 && nodeType !== 11 ) {
+
+ return results;
+ }
+
+ // Try to shortcut find operations (as opposed to filters) in HTML documents
+ if ( !seed ) {
+
+ if ( ( context ? context.ownerDocument || context : preferredDoc ) !== document ) {
+ setDocument( context );
+ }
+ context = context || document;
+
+ if ( documentIsHTML ) {
+
+ // If the selector is sufficiently simple, try using a "get*By*" DOM method
+ // (excepting DocumentFragment context, where the methods don't exist)
+ if ( nodeType !== 11 && (match = rquickExpr.exec( selector )) ) {
+
+ // ID selector
+ if ( (m = match[1]) ) {
+
+ // Document context
+ if ( nodeType === 9 ) {
+ if ( (elem = context.getElementById( m )) ) {
+
+ // Support: IE, Opera, Webkit
+ // TODO: identify versions
+ // getElementById can match elements by name instead of ID
+ if ( elem.id === m ) {
+ results.push( elem );
+ return results;
+ }
+ } else {
+ return results;
+ }
+
+ // Element context
+ } else {
+
+ // Support: IE, Opera, Webkit
+ // TODO: identify versions
+ // getElementById can match elements by name instead of ID
+ if ( newContext && (elem = newContext.getElementById( m )) &&
+ contains( context, elem ) &&
+ elem.id === m ) {
+
+ results.push( elem );
+ return results;
+ }
+ }
+
+ // Type selector
+ } else if ( match[2] ) {
+ push.apply( results, context.getElementsByTagName( selector ) );
+ return results;
+
+ // Class selector
+ } else if ( (m = match[3]) && support.getElementsByClassName &&
+ context.getElementsByClassName ) {
+
+ push.apply( results, context.getElementsByClassName( m ) );
+ return results;
+ }
+ }
+
+ // Take advantage of querySelectorAll
+ if ( support.qsa &&
+ !nonnativeSelectorCache[ selector + " " ] &&
+ (!rbuggyQSA || !rbuggyQSA.test( selector )) &&
+
+ // Support: IE 8 only
+ // Exclude object elements
+ (nodeType !== 1 || context.nodeName.toLowerCase() !== "object") ) {
+
+ newSelector = selector;
+ newContext = context;
+
+ // qSA considers elements outside a scoping root when evaluating child or
+ // descendant combinators, which is not what we want.
+ // In such cases, we work around the behavior by prefixing every selector in the
+ // list with an ID selector referencing the scope context.
+ // Thanks to Andrew Dupont for this technique.
+ if ( nodeType === 1 && rdescend.test( selector ) ) {
+
+ // Capture the context ID, setting it first if necessary
+ if ( (nid = context.getAttribute( "id" )) ) {
+ nid = nid.replace( rcssescape, fcssescape );
+ } else {
+ context.setAttribute( "id", (nid = expando) );
+ }
+
+ // Prefix every selector in the list
+ groups = tokenize( selector );
+ i = groups.length;
+ while ( i-- ) {
+ groups[i] = "#" + nid + " " + toSelector( groups[i] );
+ }
+ newSelector = groups.join( "," );
+
+ // Expand context for sibling selectors
+ newContext = rsibling.test( selector ) && testContext( context.parentNode ) ||
+ context;
+ }
+
+ try {
+ push.apply( results,
+ newContext.querySelectorAll( newSelector )
+ );
+ return results;
+ } catch ( qsaError ) {
+ nonnativeSelectorCache( selector, true );
+ } finally {
+ if ( nid === expando ) {
+ context.removeAttribute( "id" );
+ }
+ }
+ }
+ }
+ }
+
+ // All others
+ return select( selector.replace( rtrim, "$1" ), context, results, seed );
+}
+
+/**
+ * Create key-value caches of limited size
+ * @returns {function(string, object)} Returns the Object data after storing it on itself with
+ * property name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength)
+ * deleting the oldest entry
+ */
+function createCache() {
+ var keys = [];
+
+ function cache( key, value ) {
+ // Use (key + " ") to avoid collision with native prototype properties (see Issue #157)
+ if ( keys.push( key + " " ) > Expr.cacheLength ) {
+ // Only keep the most recent entries
+ delete cache[ keys.shift() ];
+ }
+ return (cache[ key + " " ] = value);
+ }
+ return cache;
+}
+
+/**
+ * Mark a function for special use by Sizzle
+ * @param {Function} fn The function to mark
+ */
+function markFunction( fn ) {
+ fn[ expando ] = true;
+ return fn;
+}
+
+/**
+ * Support testing using an element
+ * @param {Function} fn Passed the created element and returns a boolean result
+ */
+function assert( fn ) {
+ var el = document.createElement("fieldset");
+
+ try {
+ return !!fn( el );
+ } catch (e) {
+ return false;
+ } finally {
+ // Remove from its parent by default
+ if ( el.parentNode ) {
+ el.parentNode.removeChild( el );
+ }
+ // release memory in IE
+ el = null;
+ }
+}
+
+/**
+ * Adds the same handler for all of the specified attrs
+ * @param {String} attrs Pipe-separated list of attributes
+ * @param {Function} handler The method that will be applied
+ */
+function addHandle( attrs, handler ) {
+ var arr = attrs.split("|"),
+ i = arr.length;
+
+ while ( i-- ) {
+ Expr.attrHandle[ arr[i] ] = handler;
+ }
+}
+
+/**
+ * Checks document order of two siblings
+ * @param {Element} a
+ * @param {Element} b
+ * @returns {Number} Returns less than 0 if a precedes b, greater than 0 if a follows b
+ */
+function siblingCheck( a, b ) {
+ var cur = b && a,
+ diff = cur && a.nodeType === 1 && b.nodeType === 1 &&
+ a.sourceIndex - b.sourceIndex;
+
+ // Use IE sourceIndex if available on both nodes
+ if ( diff ) {
+ return diff;
+ }
+
+ // Check if b follows a
+ if ( cur ) {
+ while ( (cur = cur.nextSibling) ) {
+ if ( cur === b ) {
+ return -1;
+ }
+ }
+ }
+
+ return a ? 1 : -1;
+}
+
+/**
+ * Returns a function to use in pseudos for input types
+ * @param {String} type
+ */
+function createInputPseudo( type ) {
+ return function( elem ) {
+ var name = elem.nodeName.toLowerCase();
+ return name === "input" && elem.type === type;
+ };
+}
+
+/**
+ * Returns a function to use in pseudos for buttons
+ * @param {String} type
+ */
+function createButtonPseudo( type ) {
+ return function( elem ) {
+ var name = elem.nodeName.toLowerCase();
+ return (name === "input" || name === "button") && elem.type === type;
+ };
+}
+
+/**
+ * Returns a function to use in pseudos for :enabled/:disabled
+ * @param {Boolean} disabled true for :disabled; false for :enabled
+ */
+function createDisabledPseudo( disabled ) {
+
+ // Known :disabled false positives: fieldset[disabled] > legend:nth-of-type(n+2) :can-disable
+ return function( elem ) {
+
+ // Only certain elements can match :enabled or :disabled
+ // https://html.spec.whatwg.org/multipage/scripting.html#selector-enabled
+ // https://html.spec.whatwg.org/multipage/scripting.html#selector-disabled
+ if ( "form" in elem ) {
+
+ // Check for inherited disabledness on relevant non-disabled elements:
+ // * listed form-associated elements in a disabled fieldset
+ // https://html.spec.whatwg.org/multipage/forms.html#category-listed
+ // https://html.spec.whatwg.org/multipage/forms.html#concept-fe-disabled
+ // * option elements in a disabled optgroup
+ // https://html.spec.whatwg.org/multipage/forms.html#concept-option-disabled
+ // All such elements have a "form" property.
+ if ( elem.parentNode && elem.disabled === false ) {
+
+ // Option elements defer to a parent optgroup if present
+ if ( "label" in elem ) {
+ if ( "label" in elem.parentNode ) {
+ return elem.parentNode.disabled === disabled;
+ } else {
+ return elem.disabled === disabled;
+ }
+ }
+
+ // Support: IE 6 - 11
+ // Use the isDisabled shortcut property to check for disabled fieldset ancestors
+ return elem.isDisabled === disabled ||
+
+ // Where there is no isDisabled, check manually
+ /* jshint -W018 */
+ elem.isDisabled !== !disabled &&
+ inDisabledFieldset( elem ) === disabled;
+ }
+
+ return elem.disabled === disabled;
+
+ // Try to winnow out elements that can't be disabled before trusting the disabled property.
+ // Some victims get caught in our net (label, legend, menu, track), but it shouldn't
+ // even exist on them, let alone have a boolean value.
+ } else if ( "label" in elem ) {
+ return elem.disabled === disabled;
+ }
+
+ // Remaining elements are neither :enabled nor :disabled
+ return false;
+ };
+}
+
+/**
+ * Returns a function to use in pseudos for positionals
+ * @param {Function} fn
+ */
+function createPositionalPseudo( fn ) {
+ return markFunction(function( argument ) {
+ argument = +argument;
+ return markFunction(function( seed, matches ) {
+ var j,
+ matchIndexes = fn( [], seed.length, argument ),
+ i = matchIndexes.length;
+
+ // Match elements found at the specified indexes
+ while ( i-- ) {
+ if ( seed[ (j = matchIndexes[i]) ] ) {
+ seed[j] = !(matches[j] = seed[j]);
+ }
+ }
+ });
+ });
+}
+
+/**
+ * Checks a node for validity as a Sizzle context
+ * @param {Element|Object=} context
+ * @returns {Element|Object|Boolean} The input node if acceptable, otherwise a falsy value
+ */
+function testContext( context ) {
+ return context && typeof context.getElementsByTagName !== "undefined" && context;
+}
+
+// Expose support vars for convenience
+support = Sizzle.support = {};
+
+/**
+ * Detects XML nodes
+ * @param {Element|Object} elem An element or a document
+ * @returns {Boolean} True iff elem is a non-HTML XML node
+ */
+isXML = Sizzle.isXML = function( elem ) {
+ var namespace = elem.namespaceURI,
+ docElem = (elem.ownerDocument || elem).documentElement;
+
+ // Support: IE <=8
+ // Assume HTML when documentElement doesn't yet exist, such as inside loading iframes
+ // https://bugs.jquery.com/ticket/4833
+ return !rhtml.test( namespace || docElem && docElem.nodeName || "HTML" );
+};
+
+/**
+ * Sets document-related variables once based on the current document
+ * @param {Element|Object} [doc] An element or document object to use to set the document
+ * @returns {Object} Returns the current document
+ */
+setDocument = Sizzle.setDocument = function( node ) {
+ var hasCompare, subWindow,
+ doc = node ? node.ownerDocument || node : preferredDoc;
+
+ // Return early if doc is invalid or already selected
+ if ( doc === document || doc.nodeType !== 9 || !doc.documentElement ) {
+ return document;
+ }
+
+ // Update global variables
+ document = doc;
+ docElem = document.documentElement;
+ documentIsHTML = !isXML( document );
+
+ // Support: IE 9-11, Edge
+ // Accessing iframe documents after unload throws "permission denied" errors (jQuery #13936)
+ if ( preferredDoc !== document &&
+ (subWindow = document.defaultView) && subWindow.top !== subWindow ) {
+
+ // Support: IE 11, Edge
+ if ( subWindow.addEventListener ) {
+ subWindow.addEventListener( "unload", unloadHandler, false );
+
+ // Support: IE 9 - 10 only
+ } else if ( subWindow.attachEvent ) {
+ subWindow.attachEvent( "onunload", unloadHandler );
+ }
+ }
+
+ /* Attributes
+ ---------------------------------------------------------------------- */
+
+ // Support: IE<8
+ // Verify that getAttribute really returns attributes and not properties
+ // (excepting IE8 booleans)
+ support.attributes = assert(function( el ) {
+ el.className = "i";
+ return !el.getAttribute("className");
+ });
+
+ /* getElement(s)By*
+ ---------------------------------------------------------------------- */
+
+ // Check if getElementsByTagName("*") returns only elements
+ support.getElementsByTagName = assert(function( el ) {
+ el.appendChild( document.createComment("") );
+ return !el.getElementsByTagName("*").length;
+ });
+
+ // Support: IE<9
+ support.getElementsByClassName = rnative.test( document.getElementsByClassName );
+
+ // Support: IE<10
+ // Check if getElementById returns elements by name
+ // The broken getElementById methods don't pick up programmatically-set names,
+ // so use a roundabout getElementsByName test
+ support.getById = assert(function( el ) {
+ docElem.appendChild( el ).id = expando;
+ return !document.getElementsByName || !document.getElementsByName( expando ).length;
+ });
+
+ // ID filter and find
+ if ( support.getById ) {
+ Expr.filter["ID"] = function( id ) {
+ var attrId = id.replace( runescape, funescape );
+ return function( elem ) {
+ return elem.getAttribute("id") === attrId;
+ };
+ };
+ Expr.find["ID"] = function( id, context ) {
+ if ( typeof context.getElementById !== "undefined" && documentIsHTML ) {
+ var elem = context.getElementById( id );
+ return elem ? [ elem ] : [];
+ }
+ };
+ } else {
+ Expr.filter["ID"] = function( id ) {
+ var attrId = id.replace( runescape, funescape );
+ return function( elem ) {
+ var node = typeof elem.getAttributeNode !== "undefined" &&
+ elem.getAttributeNode("id");
+ return node && node.value === attrId;
+ };
+ };
+
+ // Support: IE 6 - 7 only
+ // getElementById is not reliable as a find shortcut
+ Expr.find["ID"] = function( id, context ) {
+ if ( typeof context.getElementById !== "undefined" && documentIsHTML ) {
+ var node, i, elems,
+ elem = context.getElementById( id );
+
+ if ( elem ) {
+
+ // Verify the id attribute
+ node = elem.getAttributeNode("id");
+ if ( node && node.value === id ) {
+ return [ elem ];
+ }
+
+ // Fall back on getElementsByName
+ elems = context.getElementsByName( id );
+ i = 0;
+ while ( (elem = elems[i++]) ) {
+ node = elem.getAttributeNode("id");
+ if ( node && node.value === id ) {
+ return [ elem ];
+ }
+ }
+ }
+
+ return [];
+ }
+ };
+ }
+
+ // Tag
+ Expr.find["TAG"] = support.getElementsByTagName ?
+ function( tag, context ) {
+ if ( typeof context.getElementsByTagName !== "undefined" ) {
+ return context.getElementsByTagName( tag );
+
+ // DocumentFragment nodes don't have gEBTN
+ } else if ( support.qsa ) {
+ return context.querySelectorAll( tag );
+ }
+ } :
+
+ function( tag, context ) {
+ var elem,
+ tmp = [],
+ i = 0,
+ // By happy coincidence, a (broken) gEBTN appears on DocumentFragment nodes too
+ results = context.getElementsByTagName( tag );
+
+ // Filter out possible comments
+ if ( tag === "*" ) {
+ while ( (elem = results[i++]) ) {
+ if ( elem.nodeType === 1 ) {
+ tmp.push( elem );
+ }
+ }
+
+ return tmp;
+ }
+ return results;
+ };
+
+ // Class
+ Expr.find["CLASS"] = support.getElementsByClassName && function( className, context ) {
+ if ( typeof context.getElementsByClassName !== "undefined" && documentIsHTML ) {
+ return context.getElementsByClassName( className );
+ }
+ };
+
+ /* QSA/matchesSelector
+ ---------------------------------------------------------------------- */
+
+ // QSA and matchesSelector support
+
+ // matchesSelector(:active) reports false when true (IE9/Opera 11.5)
+ rbuggyMatches = [];
+
+ // qSa(:focus) reports false when true (Chrome 21)
+ // We allow this because of a bug in IE8/9 that throws an error
+ // whenever `document.activeElement` is accessed on an iframe
+ // So, we allow :focus to pass through QSA all the time to avoid the IE error
+ // See https://bugs.jquery.com/ticket/13378
+ rbuggyQSA = [];
+
+ if ( (support.qsa = rnative.test( document.querySelectorAll )) ) {
+ // Build QSA regex
+ // Regex strategy adopted from Diego Perini
+ assert(function( el ) {
+ // Select is set to empty string on purpose
+ // This is to test IE's treatment of not explicitly
+ // setting a boolean content attribute,
+ // since its presence should be enough
+ // https://bugs.jquery.com/ticket/12359
+ docElem.appendChild( el ).innerHTML = " " +
+ "" +
+ " ";
+
+ // Support: IE8, Opera 11-12.16
+ // Nothing should be selected when empty strings follow ^= or $= or *=
+ // The test attribute must be unknown in Opera but "safe" for WinRT
+ // https://msdn.microsoft.com/en-us/library/ie/hh465388.aspx#attribute_section
+ if ( el.querySelectorAll("[msallowcapture^='']").length ) {
+ rbuggyQSA.push( "[*^$]=" + whitespace + "*(?:''|\"\")" );
+ }
+
+ // Support: IE8
+ // Boolean attributes and "value" are not treated correctly
+ if ( !el.querySelectorAll("[selected]").length ) {
+ rbuggyQSA.push( "\\[" + whitespace + "*(?:value|" + booleans + ")" );
+ }
+
+ // Support: Chrome<29, Android<4.4, Safari<7.0+, iOS<7.0+, PhantomJS<1.9.8+
+ if ( !el.querySelectorAll( "[id~=" + expando + "-]" ).length ) {
+ rbuggyQSA.push("~=");
+ }
+
+ // Webkit/Opera - :checked should return selected option elements
+ // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked
+ // IE8 throws error here and will not see later tests
+ if ( !el.querySelectorAll(":checked").length ) {
+ rbuggyQSA.push(":checked");
+ }
+
+ // Support: Safari 8+, iOS 8+
+ // https://bugs.webkit.org/show_bug.cgi?id=136851
+ // In-page `selector#id sibling-combinator selector` fails
+ if ( !el.querySelectorAll( "a#" + expando + "+*" ).length ) {
+ rbuggyQSA.push(".#.+[+~]");
+ }
+ });
+
+ assert(function( el ) {
+ el.innerHTML = " " +
+ " ";
+
+ // Support: Windows 8 Native Apps
+ // The type and name attributes are restricted during .innerHTML assignment
+ var input = document.createElement("input");
+ input.setAttribute( "type", "hidden" );
+ el.appendChild( input ).setAttribute( "name", "D" );
+
+ // Support: IE8
+ // Enforce case-sensitivity of name attribute
+ if ( el.querySelectorAll("[name=d]").length ) {
+ rbuggyQSA.push( "name" + whitespace + "*[*^$|!~]?=" );
+ }
+
+ // FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled)
+ // IE8 throws error here and will not see later tests
+ if ( el.querySelectorAll(":enabled").length !== 2 ) {
+ rbuggyQSA.push( ":enabled", ":disabled" );
+ }
+
+ // Support: IE9-11+
+ // IE's :disabled selector does not pick up the children of disabled fieldsets
+ docElem.appendChild( el ).disabled = true;
+ if ( el.querySelectorAll(":disabled").length !== 2 ) {
+ rbuggyQSA.push( ":enabled", ":disabled" );
+ }
+
+ // Opera 10-11 does not throw on post-comma invalid pseudos
+ el.querySelectorAll("*,:x");
+ rbuggyQSA.push(",.*:");
+ });
+ }
+
+ if ( (support.matchesSelector = rnative.test( (matches = docElem.matches ||
+ docElem.webkitMatchesSelector ||
+ docElem.mozMatchesSelector ||
+ docElem.oMatchesSelector ||
+ docElem.msMatchesSelector) )) ) {
+
+ assert(function( el ) {
+ // Check to see if it's possible to do matchesSelector
+ // on a disconnected node (IE 9)
+ support.disconnectedMatch = matches.call( el, "*" );
+
+ // This should fail with an exception
+ // Gecko does not error, returns false instead
+ matches.call( el, "[s!='']:x" );
+ rbuggyMatches.push( "!=", pseudos );
+ });
+ }
+
+ rbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join("|") );
+ rbuggyMatches = rbuggyMatches.length && new RegExp( rbuggyMatches.join("|") );
+
+ /* Contains
+ ---------------------------------------------------------------------- */
+ hasCompare = rnative.test( docElem.compareDocumentPosition );
+
+ // Element contains another
+ // Purposefully self-exclusive
+ // As in, an element does not contain itself
+ contains = hasCompare || rnative.test( docElem.contains ) ?
+ function( a, b ) {
+ var adown = a.nodeType === 9 ? a.documentElement : a,
+ bup = b && b.parentNode;
+ return a === bup || !!( bup && bup.nodeType === 1 && (
+ adown.contains ?
+ adown.contains( bup ) :
+ a.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16
+ ));
+ } :
+ function( a, b ) {
+ if ( b ) {
+ while ( (b = b.parentNode) ) {
+ if ( b === a ) {
+ return true;
+ }
+ }
+ }
+ return false;
+ };
+
+ /* Sorting
+ ---------------------------------------------------------------------- */
+
+ // Document order sorting
+ sortOrder = hasCompare ?
+ function( a, b ) {
+
+ // Flag for duplicate removal
+ if ( a === b ) {
+ hasDuplicate = true;
+ return 0;
+ }
+
+ // Sort on method existence if only one input has compareDocumentPosition
+ var compare = !a.compareDocumentPosition - !b.compareDocumentPosition;
+ if ( compare ) {
+ return compare;
+ }
+
+ // Calculate position if both inputs belong to the same document
+ compare = ( a.ownerDocument || a ) === ( b.ownerDocument || b ) ?
+ a.compareDocumentPosition( b ) :
+
+ // Otherwise we know they are disconnected
+ 1;
+
+ // Disconnected nodes
+ if ( compare & 1 ||
+ (!support.sortDetached && b.compareDocumentPosition( a ) === compare) ) {
+
+ // Choose the first element that is related to our preferred document
+ if ( a === document || a.ownerDocument === preferredDoc && contains(preferredDoc, a) ) {
+ return -1;
+ }
+ if ( b === document || b.ownerDocument === preferredDoc && contains(preferredDoc, b) ) {
+ return 1;
+ }
+
+ // Maintain original order
+ return sortInput ?
+ ( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) :
+ 0;
+ }
+
+ return compare & 4 ? -1 : 1;
+ } :
+ function( a, b ) {
+ // Exit early if the nodes are identical
+ if ( a === b ) {
+ hasDuplicate = true;
+ return 0;
+ }
+
+ var cur,
+ i = 0,
+ aup = a.parentNode,
+ bup = b.parentNode,
+ ap = [ a ],
+ bp = [ b ];
+
+ // Parentless nodes are either documents or disconnected
+ if ( !aup || !bup ) {
+ return a === document ? -1 :
+ b === document ? 1 :
+ aup ? -1 :
+ bup ? 1 :
+ sortInput ?
+ ( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) :
+ 0;
+
+ // If the nodes are siblings, we can do a quick check
+ } else if ( aup === bup ) {
+ return siblingCheck( a, b );
+ }
+
+ // Otherwise we need full lists of their ancestors for comparison
+ cur = a;
+ while ( (cur = cur.parentNode) ) {
+ ap.unshift( cur );
+ }
+ cur = b;
+ while ( (cur = cur.parentNode) ) {
+ bp.unshift( cur );
+ }
+
+ // Walk down the tree looking for a discrepancy
+ while ( ap[i] === bp[i] ) {
+ i++;
+ }
+
+ return i ?
+ // Do a sibling check if the nodes have a common ancestor
+ siblingCheck( ap[i], bp[i] ) :
+
+ // Otherwise nodes in our document sort first
+ ap[i] === preferredDoc ? -1 :
+ bp[i] === preferredDoc ? 1 :
+ 0;
+ };
+
+ return document;
+};
+
+Sizzle.matches = function( expr, elements ) {
+ return Sizzle( expr, null, null, elements );
+};
+
+Sizzle.matchesSelector = function( elem, expr ) {
+ // Set document vars if needed
+ if ( ( elem.ownerDocument || elem ) !== document ) {
+ setDocument( elem );
+ }
+
+ if ( support.matchesSelector && documentIsHTML &&
+ !nonnativeSelectorCache[ expr + " " ] &&
+ ( !rbuggyMatches || !rbuggyMatches.test( expr ) ) &&
+ ( !rbuggyQSA || !rbuggyQSA.test( expr ) ) ) {
+
+ try {
+ var ret = matches.call( elem, expr );
+
+ // IE 9's matchesSelector returns false on disconnected nodes
+ if ( ret || support.disconnectedMatch ||
+ // As well, disconnected nodes are said to be in a document
+ // fragment in IE 9
+ elem.document && elem.document.nodeType !== 11 ) {
+ return ret;
+ }
+ } catch (e) {
+ nonnativeSelectorCache( expr, true );
+ }
+ }
+
+ return Sizzle( expr, document, null, [ elem ] ).length > 0;
+};
+
+Sizzle.contains = function( context, elem ) {
+ // Set document vars if needed
+ if ( ( context.ownerDocument || context ) !== document ) {
+ setDocument( context );
+ }
+ return contains( context, elem );
+};
+
+Sizzle.attr = function( elem, name ) {
+ // Set document vars if needed
+ if ( ( elem.ownerDocument || elem ) !== document ) {
+ setDocument( elem );
+ }
+
+ var fn = Expr.attrHandle[ name.toLowerCase() ],
+ // Don't get fooled by Object.prototype properties (jQuery #13807)
+ val = fn && hasOwn.call( Expr.attrHandle, name.toLowerCase() ) ?
+ fn( elem, name, !documentIsHTML ) :
+ undefined;
+
+ return val !== undefined ?
+ val :
+ support.attributes || !documentIsHTML ?
+ elem.getAttribute( name ) :
+ (val = elem.getAttributeNode(name)) && val.specified ?
+ val.value :
+ null;
+};
+
+Sizzle.escape = function( sel ) {
+ return (sel + "").replace( rcssescape, fcssescape );
+};
+
+Sizzle.error = function( msg ) {
+ throw new Error( "Syntax error, unrecognized expression: " + msg );
+};
+
+/**
+ * Document sorting and removing duplicates
+ * @param {ArrayLike} results
+ */
+Sizzle.uniqueSort = function( results ) {
+ var elem,
+ duplicates = [],
+ j = 0,
+ i = 0;
+
+ // Unless we *know* we can detect duplicates, assume their presence
+ hasDuplicate = !support.detectDuplicates;
+ sortInput = !support.sortStable && results.slice( 0 );
+ results.sort( sortOrder );
+
+ if ( hasDuplicate ) {
+ while ( (elem = results[i++]) ) {
+ if ( elem === results[ i ] ) {
+ j = duplicates.push( i );
+ }
+ }
+ while ( j-- ) {
+ results.splice( duplicates[ j ], 1 );
+ }
+ }
+
+ // Clear input after sorting to release objects
+ // See https://github.com/jquery/sizzle/pull/225
+ sortInput = null;
+
+ return results;
+};
+
+/**
+ * Utility function for retrieving the text value of an array of DOM nodes
+ * @param {Array|Element} elem
+ */
+getText = Sizzle.getText = function( elem ) {
+ var node,
+ ret = "",
+ i = 0,
+ nodeType = elem.nodeType;
+
+ if ( !nodeType ) {
+ // If no nodeType, this is expected to be an array
+ while ( (node = elem[i++]) ) {
+ // Do not traverse comment nodes
+ ret += getText( node );
+ }
+ } else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) {
+ // Use textContent for elements
+ // innerText usage removed for consistency of new lines (jQuery #11153)
+ if ( typeof elem.textContent === "string" ) {
+ return elem.textContent;
+ } else {
+ // Traverse its children
+ for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {
+ ret += getText( elem );
+ }
+ }
+ } else if ( nodeType === 3 || nodeType === 4 ) {
+ return elem.nodeValue;
+ }
+ // Do not include comment or processing instruction nodes
+
+ return ret;
+};
+
+Expr = Sizzle.selectors = {
+
+ // Can be adjusted by the user
+ cacheLength: 50,
+
+ createPseudo: markFunction,
+
+ match: matchExpr,
+
+ attrHandle: {},
+
+ find: {},
+
+ relative: {
+ ">": { dir: "parentNode", first: true },
+ " ": { dir: "parentNode" },
+ "+": { dir: "previousSibling", first: true },
+ "~": { dir: "previousSibling" }
+ },
+
+ preFilter: {
+ "ATTR": function( match ) {
+ match[1] = match[1].replace( runescape, funescape );
+
+ // Move the given value to match[3] whether quoted or unquoted
+ match[3] = ( match[3] || match[4] || match[5] || "" ).replace( runescape, funescape );
+
+ if ( match[2] === "~=" ) {
+ match[3] = " " + match[3] + " ";
+ }
+
+ return match.slice( 0, 4 );
+ },
+
+ "CHILD": function( match ) {
+ /* matches from matchExpr["CHILD"]
+ 1 type (only|nth|...)
+ 2 what (child|of-type)
+ 3 argument (even|odd|\d*|\d*n([+-]\d+)?|...)
+ 4 xn-component of xn+y argument ([+-]?\d*n|)
+ 5 sign of xn-component
+ 6 x of xn-component
+ 7 sign of y-component
+ 8 y of y-component
+ */
+ match[1] = match[1].toLowerCase();
+
+ if ( match[1].slice( 0, 3 ) === "nth" ) {
+ // nth-* requires argument
+ if ( !match[3] ) {
+ Sizzle.error( match[0] );
+ }
+
+ // numeric x and y parameters for Expr.filter.CHILD
+ // remember that false/true cast respectively to 0/1
+ match[4] = +( match[4] ? match[5] + (match[6] || 1) : 2 * ( match[3] === "even" || match[3] === "odd" ) );
+ match[5] = +( ( match[7] + match[8] ) || match[3] === "odd" );
+
+ // other types prohibit arguments
+ } else if ( match[3] ) {
+ Sizzle.error( match[0] );
+ }
+
+ return match;
+ },
+
+ "PSEUDO": function( match ) {
+ var excess,
+ unquoted = !match[6] && match[2];
+
+ if ( matchExpr["CHILD"].test( match[0] ) ) {
+ return null;
+ }
+
+ // Accept quoted arguments as-is
+ if ( match[3] ) {
+ match[2] = match[4] || match[5] || "";
+
+ // Strip excess characters from unquoted arguments
+ } else if ( unquoted && rpseudo.test( unquoted ) &&
+ // Get excess from tokenize (recursively)
+ (excess = tokenize( unquoted, true )) &&
+ // advance to the next closing parenthesis
+ (excess = unquoted.indexOf( ")", unquoted.length - excess ) - unquoted.length) ) {
+
+ // excess is a negative index
+ match[0] = match[0].slice( 0, excess );
+ match[2] = unquoted.slice( 0, excess );
+ }
+
+ // Return only captures needed by the pseudo filter method (type and argument)
+ return match.slice( 0, 3 );
+ }
+ },
+
+ filter: {
+
+ "TAG": function( nodeNameSelector ) {
+ var nodeName = nodeNameSelector.replace( runescape, funescape ).toLowerCase();
+ return nodeNameSelector === "*" ?
+ function() { return true; } :
+ function( elem ) {
+ return elem.nodeName && elem.nodeName.toLowerCase() === nodeName;
+ };
+ },
+
+ "CLASS": function( className ) {
+ var pattern = classCache[ className + " " ];
+
+ return pattern ||
+ (pattern = new RegExp( "(^|" + whitespace + ")" + className + "(" + whitespace + "|$)" )) &&
+ classCache( className, function( elem ) {
+ return pattern.test( typeof elem.className === "string" && elem.className || typeof elem.getAttribute !== "undefined" && elem.getAttribute("class") || "" );
+ });
+ },
+
+ "ATTR": function( name, operator, check ) {
+ return function( elem ) {
+ var result = Sizzle.attr( elem, name );
+
+ if ( result == null ) {
+ return operator === "!=";
+ }
+ if ( !operator ) {
+ return true;
+ }
+
+ result += "";
+
+ return operator === "=" ? result === check :
+ operator === "!=" ? result !== check :
+ operator === "^=" ? check && result.indexOf( check ) === 0 :
+ operator === "*=" ? check && result.indexOf( check ) > -1 :
+ operator === "$=" ? check && result.slice( -check.length ) === check :
+ operator === "~=" ? ( " " + result.replace( rwhitespace, " " ) + " " ).indexOf( check ) > -1 :
+ operator === "|=" ? result === check || result.slice( 0, check.length + 1 ) === check + "-" :
+ false;
+ };
+ },
+
+ "CHILD": function( type, what, argument, first, last ) {
+ var simple = type.slice( 0, 3 ) !== "nth",
+ forward = type.slice( -4 ) !== "last",
+ ofType = what === "of-type";
+
+ return first === 1 && last === 0 ?
+
+ // Shortcut for :nth-*(n)
+ function( elem ) {
+ return !!elem.parentNode;
+ } :
+
+ function( elem, context, xml ) {
+ var cache, uniqueCache, outerCache, node, nodeIndex, start,
+ dir = simple !== forward ? "nextSibling" : "previousSibling",
+ parent = elem.parentNode,
+ name = ofType && elem.nodeName.toLowerCase(),
+ useCache = !xml && !ofType,
+ diff = false;
+
+ if ( parent ) {
+
+ // :(first|last|only)-(child|of-type)
+ if ( simple ) {
+ while ( dir ) {
+ node = elem;
+ while ( (node = node[ dir ]) ) {
+ if ( ofType ?
+ node.nodeName.toLowerCase() === name :
+ node.nodeType === 1 ) {
+
+ return false;
+ }
+ }
+ // Reverse direction for :only-* (if we haven't yet done so)
+ start = dir = type === "only" && !start && "nextSibling";
+ }
+ return true;
+ }
+
+ start = [ forward ? parent.firstChild : parent.lastChild ];
+
+ // non-xml :nth-child(...) stores cache data on `parent`
+ if ( forward && useCache ) {
+
+ // Seek `elem` from a previously-cached index
+
+ // ...in a gzip-friendly way
+ node = parent;
+ outerCache = node[ expando ] || (node[ expando ] = {});
+
+ // Support: IE <9 only
+ // Defend against cloned attroperties (jQuery gh-1709)
+ uniqueCache = outerCache[ node.uniqueID ] ||
+ (outerCache[ node.uniqueID ] = {});
+
+ cache = uniqueCache[ type ] || [];
+ nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ];
+ diff = nodeIndex && cache[ 2 ];
+ node = nodeIndex && parent.childNodes[ nodeIndex ];
+
+ while ( (node = ++nodeIndex && node && node[ dir ] ||
+
+ // Fallback to seeking `elem` from the start
+ (diff = nodeIndex = 0) || start.pop()) ) {
+
+ // When found, cache indexes on `parent` and break
+ if ( node.nodeType === 1 && ++diff && node === elem ) {
+ uniqueCache[ type ] = [ dirruns, nodeIndex, diff ];
+ break;
+ }
+ }
+
+ } else {
+ // Use previously-cached element index if available
+ if ( useCache ) {
+ // ...in a gzip-friendly way
+ node = elem;
+ outerCache = node[ expando ] || (node[ expando ] = {});
+
+ // Support: IE <9 only
+ // Defend against cloned attroperties (jQuery gh-1709)
+ uniqueCache = outerCache[ node.uniqueID ] ||
+ (outerCache[ node.uniqueID ] = {});
+
+ cache = uniqueCache[ type ] || [];
+ nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ];
+ diff = nodeIndex;
+ }
+
+ // xml :nth-child(...)
+ // or :nth-last-child(...) or :nth(-last)?-of-type(...)
+ if ( diff === false ) {
+ // Use the same loop as above to seek `elem` from the start
+ while ( (node = ++nodeIndex && node && node[ dir ] ||
+ (diff = nodeIndex = 0) || start.pop()) ) {
+
+ if ( ( ofType ?
+ node.nodeName.toLowerCase() === name :
+ node.nodeType === 1 ) &&
+ ++diff ) {
+
+ // Cache the index of each encountered element
+ if ( useCache ) {
+ outerCache = node[ expando ] || (node[ expando ] = {});
+
+ // Support: IE <9 only
+ // Defend against cloned attroperties (jQuery gh-1709)
+ uniqueCache = outerCache[ node.uniqueID ] ||
+ (outerCache[ node.uniqueID ] = {});
+
+ uniqueCache[ type ] = [ dirruns, diff ];
+ }
+
+ if ( node === elem ) {
+ break;
+ }
+ }
+ }
+ }
+ }
+
+ // Incorporate the offset, then check against cycle size
+ diff -= last;
+ return diff === first || ( diff % first === 0 && diff / first >= 0 );
+ }
+ };
+ },
+
+ "PSEUDO": function( pseudo, argument ) {
+ // pseudo-class names are case-insensitive
+ // http://www.w3.org/TR/selectors/#pseudo-classes
+ // Prioritize by case sensitivity in case custom pseudos are added with uppercase letters
+ // Remember that setFilters inherits from pseudos
+ var args,
+ fn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] ||
+ Sizzle.error( "unsupported pseudo: " + pseudo );
+
+ // The user may use createPseudo to indicate that
+ // arguments are needed to create the filter function
+ // just as Sizzle does
+ if ( fn[ expando ] ) {
+ return fn( argument );
+ }
+
+ // But maintain support for old signatures
+ if ( fn.length > 1 ) {
+ args = [ pseudo, pseudo, "", argument ];
+ return Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ?
+ markFunction(function( seed, matches ) {
+ var idx,
+ matched = fn( seed, argument ),
+ i = matched.length;
+ while ( i-- ) {
+ idx = indexOf( seed, matched[i] );
+ seed[ idx ] = !( matches[ idx ] = matched[i] );
+ }
+ }) :
+ function( elem ) {
+ return fn( elem, 0, args );
+ };
+ }
+
+ return fn;
+ }
+ },
+
+ pseudos: {
+ // Potentially complex pseudos
+ "not": markFunction(function( selector ) {
+ // Trim the selector passed to compile
+ // to avoid treating leading and trailing
+ // spaces as combinators
+ var input = [],
+ results = [],
+ matcher = compile( selector.replace( rtrim, "$1" ) );
+
+ return matcher[ expando ] ?
+ markFunction(function( seed, matches, context, xml ) {
+ var elem,
+ unmatched = matcher( seed, null, xml, [] ),
+ i = seed.length;
+
+ // Match elements unmatched by `matcher`
+ while ( i-- ) {
+ if ( (elem = unmatched[i]) ) {
+ seed[i] = !(matches[i] = elem);
+ }
+ }
+ }) :
+ function( elem, context, xml ) {
+ input[0] = elem;
+ matcher( input, null, xml, results );
+ // Don't keep the element (issue #299)
+ input[0] = null;
+ return !results.pop();
+ };
+ }),
+
+ "has": markFunction(function( selector ) {
+ return function( elem ) {
+ return Sizzle( selector, elem ).length > 0;
+ };
+ }),
+
+ "contains": markFunction(function( text ) {
+ text = text.replace( runescape, funescape );
+ return function( elem ) {
+ return ( elem.textContent || getText( elem ) ).indexOf( text ) > -1;
+ };
+ }),
+
+ // "Whether an element is represented by a :lang() selector
+ // is based solely on the element's language value
+ // being equal to the identifier C,
+ // or beginning with the identifier C immediately followed by "-".
+ // The matching of C against the element's language value is performed case-insensitively.
+ // The identifier C does not have to be a valid language name."
+ // http://www.w3.org/TR/selectors/#lang-pseudo
+ "lang": markFunction( function( lang ) {
+ // lang value must be a valid identifier
+ if ( !ridentifier.test(lang || "") ) {
+ Sizzle.error( "unsupported lang: " + lang );
+ }
+ lang = lang.replace( runescape, funescape ).toLowerCase();
+ return function( elem ) {
+ var elemLang;
+ do {
+ if ( (elemLang = documentIsHTML ?
+ elem.lang :
+ elem.getAttribute("xml:lang") || elem.getAttribute("lang")) ) {
+
+ elemLang = elemLang.toLowerCase();
+ return elemLang === lang || elemLang.indexOf( lang + "-" ) === 0;
+ }
+ } while ( (elem = elem.parentNode) && elem.nodeType === 1 );
+ return false;
+ };
+ }),
+
+ // Miscellaneous
+ "target": function( elem ) {
+ var hash = window.location && window.location.hash;
+ return hash && hash.slice( 1 ) === elem.id;
+ },
+
+ "root": function( elem ) {
+ return elem === docElem;
+ },
+
+ "focus": function( elem ) {
+ return elem === document.activeElement && (!document.hasFocus || document.hasFocus()) && !!(elem.type || elem.href || ~elem.tabIndex);
+ },
+
+ // Boolean properties
+ "enabled": createDisabledPseudo( false ),
+ "disabled": createDisabledPseudo( true ),
+
+ "checked": function( elem ) {
+ // In CSS3, :checked should return both checked and selected elements
+ // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked
+ var nodeName = elem.nodeName.toLowerCase();
+ return (nodeName === "input" && !!elem.checked) || (nodeName === "option" && !!elem.selected);
+ },
+
+ "selected": function( elem ) {
+ // Accessing this property makes selected-by-default
+ // options in Safari work properly
+ if ( elem.parentNode ) {
+ elem.parentNode.selectedIndex;
+ }
+
+ return elem.selected === true;
+ },
+
+ // Contents
+ "empty": function( elem ) {
+ // http://www.w3.org/TR/selectors/#empty-pseudo
+ // :empty is negated by element (1) or content nodes (text: 3; cdata: 4; entity ref: 5),
+ // but not by others (comment: 8; processing instruction: 7; etc.)
+ // nodeType < 6 works because attributes (2) do not appear as children
+ for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {
+ if ( elem.nodeType < 6 ) {
+ return false;
+ }
+ }
+ return true;
+ },
+
+ "parent": function( elem ) {
+ return !Expr.pseudos["empty"]( elem );
+ },
+
+ // Element/input types
+ "header": function( elem ) {
+ return rheader.test( elem.nodeName );
+ },
+
+ "input": function( elem ) {
+ return rinputs.test( elem.nodeName );
+ },
+
+ "button": function( elem ) {
+ var name = elem.nodeName.toLowerCase();
+ return name === "input" && elem.type === "button" || name === "button";
+ },
+
+ "text": function( elem ) {
+ var attr;
+ return elem.nodeName.toLowerCase() === "input" &&
+ elem.type === "text" &&
+
+ // Support: IE<8
+ // New HTML5 attribute values (e.g., "search") appear with elem.type === "text"
+ ( (attr = elem.getAttribute("type")) == null || attr.toLowerCase() === "text" );
+ },
+
+ // Position-in-collection
+ "first": createPositionalPseudo(function() {
+ return [ 0 ];
+ }),
+
+ "last": createPositionalPseudo(function( matchIndexes, length ) {
+ return [ length - 1 ];
+ }),
+
+ "eq": createPositionalPseudo(function( matchIndexes, length, argument ) {
+ return [ argument < 0 ? argument + length : argument ];
+ }),
+
+ "even": createPositionalPseudo(function( matchIndexes, length ) {
+ var i = 0;
+ for ( ; i < length; i += 2 ) {
+ matchIndexes.push( i );
+ }
+ return matchIndexes;
+ }),
+
+ "odd": createPositionalPseudo(function( matchIndexes, length ) {
+ var i = 1;
+ for ( ; i < length; i += 2 ) {
+ matchIndexes.push( i );
+ }
+ return matchIndexes;
+ }),
+
+ "lt": createPositionalPseudo(function( matchIndexes, length, argument ) {
+ var i = argument < 0 ?
+ argument + length :
+ argument > length ?
+ length :
+ argument;
+ for ( ; --i >= 0; ) {
+ matchIndexes.push( i );
+ }
+ return matchIndexes;
+ }),
+
+ "gt": createPositionalPseudo(function( matchIndexes, length, argument ) {
+ var i = argument < 0 ? argument + length : argument;
+ for ( ; ++i < length; ) {
+ matchIndexes.push( i );
+ }
+ return matchIndexes;
+ })
+ }
+};
+
+Expr.pseudos["nth"] = Expr.pseudos["eq"];
+
+// Add button/input type pseudos
+for ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) {
+ Expr.pseudos[ i ] = createInputPseudo( i );
+}
+for ( i in { submit: true, reset: true } ) {
+ Expr.pseudos[ i ] = createButtonPseudo( i );
+}
+
+// Easy API for creating new setFilters
+function setFilters() {}
+setFilters.prototype = Expr.filters = Expr.pseudos;
+Expr.setFilters = new setFilters();
+
+tokenize = Sizzle.tokenize = function( selector, parseOnly ) {
+ var matched, match, tokens, type,
+ soFar, groups, preFilters,
+ cached = tokenCache[ selector + " " ];
+
+ if ( cached ) {
+ return parseOnly ? 0 : cached.slice( 0 );
+ }
+
+ soFar = selector;
+ groups = [];
+ preFilters = Expr.preFilter;
+
+ while ( soFar ) {
+
+ // Comma and first run
+ if ( !matched || (match = rcomma.exec( soFar )) ) {
+ if ( match ) {
+ // Don't consume trailing commas as valid
+ soFar = soFar.slice( match[0].length ) || soFar;
+ }
+ groups.push( (tokens = []) );
+ }
+
+ matched = false;
+
+ // Combinators
+ if ( (match = rcombinators.exec( soFar )) ) {
+ matched = match.shift();
+ tokens.push({
+ value: matched,
+ // Cast descendant combinators to space
+ type: match[0].replace( rtrim, " " )
+ });
+ soFar = soFar.slice( matched.length );
+ }
+
+ // Filters
+ for ( type in Expr.filter ) {
+ if ( (match = matchExpr[ type ].exec( soFar )) && (!preFilters[ type ] ||
+ (match = preFilters[ type ]( match ))) ) {
+ matched = match.shift();
+ tokens.push({
+ value: matched,
+ type: type,
+ matches: match
+ });
+ soFar = soFar.slice( matched.length );
+ }
+ }
+
+ if ( !matched ) {
+ break;
+ }
+ }
+
+ // Return the length of the invalid excess
+ // if we're just parsing
+ // Otherwise, throw an error or return tokens
+ return parseOnly ?
+ soFar.length :
+ soFar ?
+ Sizzle.error( selector ) :
+ // Cache the tokens
+ tokenCache( selector, groups ).slice( 0 );
+};
+
+function toSelector( tokens ) {
+ var i = 0,
+ len = tokens.length,
+ selector = "";
+ for ( ; i < len; i++ ) {
+ selector += tokens[i].value;
+ }
+ return selector;
+}
+
+function addCombinator( matcher, combinator, base ) {
+ var dir = combinator.dir,
+ skip = combinator.next,
+ key = skip || dir,
+ checkNonElements = base && key === "parentNode",
+ doneName = done++;
+
+ return combinator.first ?
+ // Check against closest ancestor/preceding element
+ function( elem, context, xml ) {
+ while ( (elem = elem[ dir ]) ) {
+ if ( elem.nodeType === 1 || checkNonElements ) {
+ return matcher( elem, context, xml );
+ }
+ }
+ return false;
+ } :
+
+ // Check against all ancestor/preceding elements
+ function( elem, context, xml ) {
+ var oldCache, uniqueCache, outerCache,
+ newCache = [ dirruns, doneName ];
+
+ // We can't set arbitrary data on XML nodes, so they don't benefit from combinator caching
+ if ( xml ) {
+ while ( (elem = elem[ dir ]) ) {
+ if ( elem.nodeType === 1 || checkNonElements ) {
+ if ( matcher( elem, context, xml ) ) {
+ return true;
+ }
+ }
+ }
+ } else {
+ while ( (elem = elem[ dir ]) ) {
+ if ( elem.nodeType === 1 || checkNonElements ) {
+ outerCache = elem[ expando ] || (elem[ expando ] = {});
+
+ // Support: IE <9 only
+ // Defend against cloned attroperties (jQuery gh-1709)
+ uniqueCache = outerCache[ elem.uniqueID ] || (outerCache[ elem.uniqueID ] = {});
+
+ if ( skip && skip === elem.nodeName.toLowerCase() ) {
+ elem = elem[ dir ] || elem;
+ } else if ( (oldCache = uniqueCache[ key ]) &&
+ oldCache[ 0 ] === dirruns && oldCache[ 1 ] === doneName ) {
+
+ // Assign to newCache so results back-propagate to previous elements
+ return (newCache[ 2 ] = oldCache[ 2 ]);
+ } else {
+ // Reuse newcache so results back-propagate to previous elements
+ uniqueCache[ key ] = newCache;
+
+ // A match means we're done; a fail means we have to keep checking
+ if ( (newCache[ 2 ] = matcher( elem, context, xml )) ) {
+ return true;
+ }
+ }
+ }
+ }
+ }
+ return false;
+ };
+}
+
+function elementMatcher( matchers ) {
+ return matchers.length > 1 ?
+ function( elem, context, xml ) {
+ var i = matchers.length;
+ while ( i-- ) {
+ if ( !matchers[i]( elem, context, xml ) ) {
+ return false;
+ }
+ }
+ return true;
+ } :
+ matchers[0];
+}
+
+function multipleContexts( selector, contexts, results ) {
+ var i = 0,
+ len = contexts.length;
+ for ( ; i < len; i++ ) {
+ Sizzle( selector, contexts[i], results );
+ }
+ return results;
+}
+
+function condense( unmatched, map, filter, context, xml ) {
+ var elem,
+ newUnmatched = [],
+ i = 0,
+ len = unmatched.length,
+ mapped = map != null;
+
+ for ( ; i < len; i++ ) {
+ if ( (elem = unmatched[i]) ) {
+ if ( !filter || filter( elem, context, xml ) ) {
+ newUnmatched.push( elem );
+ if ( mapped ) {
+ map.push( i );
+ }
+ }
+ }
+ }
+
+ return newUnmatched;
+}
+
+function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) {
+ if ( postFilter && !postFilter[ expando ] ) {
+ postFilter = setMatcher( postFilter );
+ }
+ if ( postFinder && !postFinder[ expando ] ) {
+ postFinder = setMatcher( postFinder, postSelector );
+ }
+ return markFunction(function( seed, results, context, xml ) {
+ var temp, i, elem,
+ preMap = [],
+ postMap = [],
+ preexisting = results.length,
+
+ // Get initial elements from seed or context
+ elems = seed || multipleContexts( selector || "*", context.nodeType ? [ context ] : context, [] ),
+
+ // Prefilter to get matcher input, preserving a map for seed-results synchronization
+ matcherIn = preFilter && ( seed || !selector ) ?
+ condense( elems, preMap, preFilter, context, xml ) :
+ elems,
+
+ matcherOut = matcher ?
+ // If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results,
+ postFinder || ( seed ? preFilter : preexisting || postFilter ) ?
+
+ // ...intermediate processing is necessary
+ [] :
+
+ // ...otherwise use results directly
+ results :
+ matcherIn;
+
+ // Find primary matches
+ if ( matcher ) {
+ matcher( matcherIn, matcherOut, context, xml );
+ }
+
+ // Apply postFilter
+ if ( postFilter ) {
+ temp = condense( matcherOut, postMap );
+ postFilter( temp, [], context, xml );
+
+ // Un-match failing elements by moving them back to matcherIn
+ i = temp.length;
+ while ( i-- ) {
+ if ( (elem = temp[i]) ) {
+ matcherOut[ postMap[i] ] = !(matcherIn[ postMap[i] ] = elem);
+ }
+ }
+ }
+
+ if ( seed ) {
+ if ( postFinder || preFilter ) {
+ if ( postFinder ) {
+ // Get the final matcherOut by condensing this intermediate into postFinder contexts
+ temp = [];
+ i = matcherOut.length;
+ while ( i-- ) {
+ if ( (elem = matcherOut[i]) ) {
+ // Restore matcherIn since elem is not yet a final match
+ temp.push( (matcherIn[i] = elem) );
+ }
+ }
+ postFinder( null, (matcherOut = []), temp, xml );
+ }
+
+ // Move matched elements from seed to results to keep them synchronized
+ i = matcherOut.length;
+ while ( i-- ) {
+ if ( (elem = matcherOut[i]) &&
+ (temp = postFinder ? indexOf( seed, elem ) : preMap[i]) > -1 ) {
+
+ seed[temp] = !(results[temp] = elem);
+ }
+ }
+ }
+
+ // Add elements to results, through postFinder if defined
+ } else {
+ matcherOut = condense(
+ matcherOut === results ?
+ matcherOut.splice( preexisting, matcherOut.length ) :
+ matcherOut
+ );
+ if ( postFinder ) {
+ postFinder( null, results, matcherOut, xml );
+ } else {
+ push.apply( results, matcherOut );
+ }
+ }
+ });
+}
+
+function matcherFromTokens( tokens ) {
+ var checkContext, matcher, j,
+ len = tokens.length,
+ leadingRelative = Expr.relative[ tokens[0].type ],
+ implicitRelative = leadingRelative || Expr.relative[" "],
+ i = leadingRelative ? 1 : 0,
+
+ // The foundational matcher ensures that elements are reachable from top-level context(s)
+ matchContext = addCombinator( function( elem ) {
+ return elem === checkContext;
+ }, implicitRelative, true ),
+ matchAnyContext = addCombinator( function( elem ) {
+ return indexOf( checkContext, elem ) > -1;
+ }, implicitRelative, true ),
+ matchers = [ function( elem, context, xml ) {
+ var ret = ( !leadingRelative && ( xml || context !== outermostContext ) ) || (
+ (checkContext = context).nodeType ?
+ matchContext( elem, context, xml ) :
+ matchAnyContext( elem, context, xml ) );
+ // Avoid hanging onto element (issue #299)
+ checkContext = null;
+ return ret;
+ } ];
+
+ for ( ; i < len; i++ ) {
+ if ( (matcher = Expr.relative[ tokens[i].type ]) ) {
+ matchers = [ addCombinator(elementMatcher( matchers ), matcher) ];
+ } else {
+ matcher = Expr.filter[ tokens[i].type ].apply( null, tokens[i].matches );
+
+ // Return special upon seeing a positional matcher
+ if ( matcher[ expando ] ) {
+ // Find the next relative operator (if any) for proper handling
+ j = ++i;
+ for ( ; j < len; j++ ) {
+ if ( Expr.relative[ tokens[j].type ] ) {
+ break;
+ }
+ }
+ return setMatcher(
+ i > 1 && elementMatcher( matchers ),
+ i > 1 && toSelector(
+ // If the preceding token was a descendant combinator, insert an implicit any-element `*`
+ tokens.slice( 0, i - 1 ).concat({ value: tokens[ i - 2 ].type === " " ? "*" : "" })
+ ).replace( rtrim, "$1" ),
+ matcher,
+ i < j && matcherFromTokens( tokens.slice( i, j ) ),
+ j < len && matcherFromTokens( (tokens = tokens.slice( j )) ),
+ j < len && toSelector( tokens )
+ );
+ }
+ matchers.push( matcher );
+ }
+ }
+
+ return elementMatcher( matchers );
+}
+
+function matcherFromGroupMatchers( elementMatchers, setMatchers ) {
+ var bySet = setMatchers.length > 0,
+ byElement = elementMatchers.length > 0,
+ superMatcher = function( seed, context, xml, results, outermost ) {
+ var elem, j, matcher,
+ matchedCount = 0,
+ i = "0",
+ unmatched = seed && [],
+ setMatched = [],
+ contextBackup = outermostContext,
+ // We must always have either seed elements or outermost context
+ elems = seed || byElement && Expr.find["TAG"]( "*", outermost ),
+ // Use integer dirruns iff this is the outermost matcher
+ dirrunsUnique = (dirruns += contextBackup == null ? 1 : Math.random() || 0.1),
+ len = elems.length;
+
+ if ( outermost ) {
+ outermostContext = context === document || context || outermost;
+ }
+
+ // Add elements passing elementMatchers directly to results
+ // Support: IE<9, Safari
+ // Tolerate NodeList properties (IE: "length"; Safari: ) matching elements by id
+ for ( ; i !== len && (elem = elems[i]) != null; i++ ) {
+ if ( byElement && elem ) {
+ j = 0;
+ if ( !context && elem.ownerDocument !== document ) {
+ setDocument( elem );
+ xml = !documentIsHTML;
+ }
+ while ( (matcher = elementMatchers[j++]) ) {
+ if ( matcher( elem, context || document, xml) ) {
+ results.push( elem );
+ break;
+ }
+ }
+ if ( outermost ) {
+ dirruns = dirrunsUnique;
+ }
+ }
+
+ // Track unmatched elements for set filters
+ if ( bySet ) {
+ // They will have gone through all possible matchers
+ if ( (elem = !matcher && elem) ) {
+ matchedCount--;
+ }
+
+ // Lengthen the array for every element, matched or not
+ if ( seed ) {
+ unmatched.push( elem );
+ }
+ }
+ }
+
+ // `i` is now the count of elements visited above, and adding it to `matchedCount`
+ // makes the latter nonnegative.
+ matchedCount += i;
+
+ // Apply set filters to unmatched elements
+ // NOTE: This can be skipped if there are no unmatched elements (i.e., `matchedCount`
+ // equals `i`), unless we didn't visit _any_ elements in the above loop because we have
+ // no element matchers and no seed.
+ // Incrementing an initially-string "0" `i` allows `i` to remain a string only in that
+ // case, which will result in a "00" `matchedCount` that differs from `i` but is also
+ // numerically zero.
+ if ( bySet && i !== matchedCount ) {
+ j = 0;
+ while ( (matcher = setMatchers[j++]) ) {
+ matcher( unmatched, setMatched, context, xml );
+ }
+
+ if ( seed ) {
+ // Reintegrate element matches to eliminate the need for sorting
+ if ( matchedCount > 0 ) {
+ while ( i-- ) {
+ if ( !(unmatched[i] || setMatched[i]) ) {
+ setMatched[i] = pop.call( results );
+ }
+ }
+ }
+
+ // Discard index placeholder values to get only actual matches
+ setMatched = condense( setMatched );
+ }
+
+ // Add matches to results
+ push.apply( results, setMatched );
+
+ // Seedless set matches succeeding multiple successful matchers stipulate sorting
+ if ( outermost && !seed && setMatched.length > 0 &&
+ ( matchedCount + setMatchers.length ) > 1 ) {
+
+ Sizzle.uniqueSort( results );
+ }
+ }
+
+ // Override manipulation of globals by nested matchers
+ if ( outermost ) {
+ dirruns = dirrunsUnique;
+ outermostContext = contextBackup;
+ }
+
+ return unmatched;
+ };
+
+ return bySet ?
+ markFunction( superMatcher ) :
+ superMatcher;
+}
+
+compile = Sizzle.compile = function( selector, match /* Internal Use Only */ ) {
+ var i,
+ setMatchers = [],
+ elementMatchers = [],
+ cached = compilerCache[ selector + " " ];
+
+ if ( !cached ) {
+ // Generate a function of recursive functions that can be used to check each element
+ if ( !match ) {
+ match = tokenize( selector );
+ }
+ i = match.length;
+ while ( i-- ) {
+ cached = matcherFromTokens( match[i] );
+ if ( cached[ expando ] ) {
+ setMatchers.push( cached );
+ } else {
+ elementMatchers.push( cached );
+ }
+ }
+
+ // Cache the compiled function
+ cached = compilerCache( selector, matcherFromGroupMatchers( elementMatchers, setMatchers ) );
+
+ // Save selector and tokenization
+ cached.selector = selector;
+ }
+ return cached;
+};
+
+/**
+ * A low-level selection function that works with Sizzle's compiled
+ * selector functions
+ * @param {String|Function} selector A selector or a pre-compiled
+ * selector function built with Sizzle.compile
+ * @param {Element} context
+ * @param {Array} [results]
+ * @param {Array} [seed] A set of elements to match against
+ */
+select = Sizzle.select = function( selector, context, results, seed ) {
+ var i, tokens, token, type, find,
+ compiled = typeof selector === "function" && selector,
+ match = !seed && tokenize( (selector = compiled.selector || selector) );
+
+ results = results || [];
+
+ // Try to minimize operations if there is only one selector in the list and no seed
+ // (the latter of which guarantees us context)
+ if ( match.length === 1 ) {
+
+ // Reduce context if the leading compound selector is an ID
+ tokens = match[0] = match[0].slice( 0 );
+ if ( tokens.length > 2 && (token = tokens[0]).type === "ID" &&
+ context.nodeType === 9 && documentIsHTML && Expr.relative[ tokens[1].type ] ) {
+
+ context = ( Expr.find["ID"]( token.matches[0].replace(runescape, funescape), context ) || [] )[0];
+ if ( !context ) {
+ return results;
+
+ // Precompiled matchers will still verify ancestry, so step up a level
+ } else if ( compiled ) {
+ context = context.parentNode;
+ }
+
+ selector = selector.slice( tokens.shift().value.length );
+ }
+
+ // Fetch a seed set for right-to-left matching
+ i = matchExpr["needsContext"].test( selector ) ? 0 : tokens.length;
+ while ( i-- ) {
+ token = tokens[i];
+
+ // Abort if we hit a combinator
+ if ( Expr.relative[ (type = token.type) ] ) {
+ break;
+ }
+ if ( (find = Expr.find[ type ]) ) {
+ // Search, expanding context for leading sibling combinators
+ if ( (seed = find(
+ token.matches[0].replace( runescape, funescape ),
+ rsibling.test( tokens[0].type ) && testContext( context.parentNode ) || context
+ )) ) {
+
+ // If seed is empty or no tokens remain, we can return early
+ tokens.splice( i, 1 );
+ selector = seed.length && toSelector( tokens );
+ if ( !selector ) {
+ push.apply( results, seed );
+ return results;
+ }
+
+ break;
+ }
+ }
+ }
+ }
+
+ // Compile and execute a filtering function if one is not provided
+ // Provide `match` to avoid retokenization if we modified the selector above
+ ( compiled || compile( selector, match ) )(
+ seed,
+ context,
+ !documentIsHTML,
+ results,
+ !context || rsibling.test( selector ) && testContext( context.parentNode ) || context
+ );
+ return results;
+};
+
+// One-time assignments
+
+// Sort stability
+support.sortStable = expando.split("").sort( sortOrder ).join("") === expando;
+
+// Support: Chrome 14-35+
+// Always assume duplicates if they aren't passed to the comparison function
+support.detectDuplicates = !!hasDuplicate;
+
+// Initialize against the default document
+setDocument();
+
+// Support: Webkit<537.32 - Safari 6.0.3/Chrome 25 (fixed in Chrome 27)
+// Detached nodes confoundingly follow *each other*
+support.sortDetached = assert(function( el ) {
+ // Should return 1, but returns 4 (following)
+ return el.compareDocumentPosition( document.createElement("fieldset") ) & 1;
+});
+
+// Support: IE<8
+// Prevent attribute/property "interpolation"
+// https://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx
+if ( !assert(function( el ) {
+ el.innerHTML = " ";
+ return el.firstChild.getAttribute("href") === "#" ;
+}) ) {
+ addHandle( "type|href|height|width", function( elem, name, isXML ) {
+ if ( !isXML ) {
+ return elem.getAttribute( name, name.toLowerCase() === "type" ? 1 : 2 );
+ }
+ });
+}
+
+// Support: IE<9
+// Use defaultValue in place of getAttribute("value")
+if ( !support.attributes || !assert(function( el ) {
+ el.innerHTML = " ";
+ el.firstChild.setAttribute( "value", "" );
+ return el.firstChild.getAttribute( "value" ) === "";
+}) ) {
+ addHandle( "value", function( elem, name, isXML ) {
+ if ( !isXML && elem.nodeName.toLowerCase() === "input" ) {
+ return elem.defaultValue;
+ }
+ });
+}
+
+// Support: IE<9
+// Use getAttributeNode to fetch booleans when getAttribute lies
+if ( !assert(function( el ) {
+ return el.getAttribute("disabled") == null;
+}) ) {
+ addHandle( booleans, function( elem, name, isXML ) {
+ var val;
+ if ( !isXML ) {
+ return elem[ name ] === true ? name.toLowerCase() :
+ (val = elem.getAttributeNode( name )) && val.specified ?
+ val.value :
+ null;
+ }
+ });
+}
+
+return Sizzle;
+
+})( window );
+
+
+
+jQuery.find = Sizzle;
+jQuery.expr = Sizzle.selectors;
+
+// Deprecated
+jQuery.expr[ ":" ] = jQuery.expr.pseudos;
+jQuery.uniqueSort = jQuery.unique = Sizzle.uniqueSort;
+jQuery.text = Sizzle.getText;
+jQuery.isXMLDoc = Sizzle.isXML;
+jQuery.contains = Sizzle.contains;
+jQuery.escapeSelector = Sizzle.escape;
+
+
+
+
+var dir = function( elem, dir, until ) {
+ var matched = [],
+ truncate = until !== undefined;
+
+ while ( ( elem = elem[ dir ] ) && elem.nodeType !== 9 ) {
+ if ( elem.nodeType === 1 ) {
+ if ( truncate && jQuery( elem ).is( until ) ) {
+ break;
+ }
+ matched.push( elem );
+ }
+ }
+ return matched;
+};
+
+
+var siblings = function( n, elem ) {
+ var matched = [];
+
+ for ( ; n; n = n.nextSibling ) {
+ if ( n.nodeType === 1 && n !== elem ) {
+ matched.push( n );
+ }
+ }
+
+ return matched;
+};
+
+
+var rneedsContext = jQuery.expr.match.needsContext;
+
+
+
+function nodeName( elem, name ) {
+
+ return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase();
+
+};
+var rsingleTag = ( /^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i );
+
+
+
+// Implement the identical functionality for filter and not
+function winnow( elements, qualifier, not ) {
+ if ( isFunction( qualifier ) ) {
+ return jQuery.grep( elements, function( elem, i ) {
+ return !!qualifier.call( elem, i, elem ) !== not;
+ } );
+ }
+
+ // Single element
+ if ( qualifier.nodeType ) {
+ return jQuery.grep( elements, function( elem ) {
+ return ( elem === qualifier ) !== not;
+ } );
+ }
+
+ // Arraylike of elements (jQuery, arguments, Array)
+ if ( typeof qualifier !== "string" ) {
+ return jQuery.grep( elements, function( elem ) {
+ return ( indexOf.call( qualifier, elem ) > -1 ) !== not;
+ } );
+ }
+
+ // Filtered directly for both simple and complex selectors
+ return jQuery.filter( qualifier, elements, not );
+}
+
+jQuery.filter = function( expr, elems, not ) {
+ var elem = elems[ 0 ];
+
+ if ( not ) {
+ expr = ":not(" + expr + ")";
+ }
+
+ if ( elems.length === 1 && elem.nodeType === 1 ) {
+ return jQuery.find.matchesSelector( elem, expr ) ? [ elem ] : [];
+ }
+
+ return jQuery.find.matches( expr, jQuery.grep( elems, function( elem ) {
+ return elem.nodeType === 1;
+ } ) );
+};
+
+jQuery.fn.extend( {
+ find: function( selector ) {
+ var i, ret,
+ len = this.length,
+ self = this;
+
+ if ( typeof selector !== "string" ) {
+ return this.pushStack( jQuery( selector ).filter( function() {
+ for ( i = 0; i < len; i++ ) {
+ if ( jQuery.contains( self[ i ], this ) ) {
+ return true;
+ }
+ }
+ } ) );
+ }
+
+ ret = this.pushStack( [] );
+
+ for ( i = 0; i < len; i++ ) {
+ jQuery.find( selector, self[ i ], ret );
+ }
+
+ return len > 1 ? jQuery.uniqueSort( ret ) : ret;
+ },
+ filter: function( selector ) {
+ return this.pushStack( winnow( this, selector || [], false ) );
+ },
+ not: function( selector ) {
+ return this.pushStack( winnow( this, selector || [], true ) );
+ },
+ is: function( selector ) {
+ return !!winnow(
+ this,
+
+ // If this is a positional/relative selector, check membership in the returned set
+ // so $("p:first").is("p:last") won't return true for a doc with two "p".
+ typeof selector === "string" && rneedsContext.test( selector ) ?
+ jQuery( selector ) :
+ selector || [],
+ false
+ ).length;
+ }
+} );
+
+
+// Initialize a jQuery object
+
+
+// A central reference to the root jQuery(document)
+var rootjQuery,
+
+ // A simple way to check for HTML strings
+ // Prioritize #id over to avoid XSS via location.hash (#9521)
+ // Strict HTML recognition (#11290: must start with <)
+ // Shortcut simple #id case for speed
+ rquickExpr = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/,
+
+ init = jQuery.fn.init = function( selector, context, root ) {
+ var match, elem;
+
+ // HANDLE: $(""), $(null), $(undefined), $(false)
+ if ( !selector ) {
+ return this;
+ }
+
+ // Method init() accepts an alternate rootjQuery
+ // so migrate can support jQuery.sub (gh-2101)
+ root = root || rootjQuery;
+
+ // Handle HTML strings
+ if ( typeof selector === "string" ) {
+ if ( selector[ 0 ] === "<" &&
+ selector[ selector.length - 1 ] === ">" &&
+ selector.length >= 3 ) {
+
+ // Assume that strings that start and end with <> are HTML and skip the regex check
+ match = [ null, selector, null ];
+
+ } else {
+ match = rquickExpr.exec( selector );
+ }
+
+ // Match html or make sure no context is specified for #id
+ if ( match && ( match[ 1 ] || !context ) ) {
+
+ // HANDLE: $(html) -> $(array)
+ if ( match[ 1 ] ) {
+ context = context instanceof jQuery ? context[ 0 ] : context;
+
+ // Option to run scripts is true for back-compat
+ // Intentionally let the error be thrown if parseHTML is not present
+ jQuery.merge( this, jQuery.parseHTML(
+ match[ 1 ],
+ context && context.nodeType ? context.ownerDocument || context : document,
+ true
+ ) );
+
+ // HANDLE: $(html, props)
+ if ( rsingleTag.test( match[ 1 ] ) && jQuery.isPlainObject( context ) ) {
+ for ( match in context ) {
+
+ // Properties of context are called as methods if possible
+ if ( isFunction( this[ match ] ) ) {
+ this[ match ]( context[ match ] );
+
+ // ...and otherwise set as attributes
+ } else {
+ this.attr( match, context[ match ] );
+ }
+ }
+ }
+
+ return this;
+
+ // HANDLE: $(#id)
+ } else {
+ elem = document.getElementById( match[ 2 ] );
+
+ if ( elem ) {
+
+ // Inject the element directly into the jQuery object
+ this[ 0 ] = elem;
+ this.length = 1;
+ }
+ return this;
+ }
+
+ // HANDLE: $(expr, $(...))
+ } else if ( !context || context.jquery ) {
+ return ( context || root ).find( selector );
+
+ // HANDLE: $(expr, context)
+ // (which is just equivalent to: $(context).find(expr)
+ } else {
+ return this.constructor( context ).find( selector );
+ }
+
+ // HANDLE: $(DOMElement)
+ } else if ( selector.nodeType ) {
+ this[ 0 ] = selector;
+ this.length = 1;
+ return this;
+
+ // HANDLE: $(function)
+ // Shortcut for document ready
+ } else if ( isFunction( selector ) ) {
+ return root.ready !== undefined ?
+ root.ready( selector ) :
+
+ // Execute immediately if ready is not present
+ selector( jQuery );
+ }
+
+ return jQuery.makeArray( selector, this );
+ };
+
+// Give the init function the jQuery prototype for later instantiation
+init.prototype = jQuery.fn;
+
+// Initialize central reference
+rootjQuery = jQuery( document );
+
+
+var rparentsprev = /^(?:parents|prev(?:Until|All))/,
+
+ // Methods guaranteed to produce a unique set when starting from a unique set
+ guaranteedUnique = {
+ children: true,
+ contents: true,
+ next: true,
+ prev: true
+ };
+
+jQuery.fn.extend( {
+ has: function( target ) {
+ var targets = jQuery( target, this ),
+ l = targets.length;
+
+ return this.filter( function() {
+ var i = 0;
+ for ( ; i < l; i++ ) {
+ if ( jQuery.contains( this, targets[ i ] ) ) {
+ return true;
+ }
+ }
+ } );
+ },
+
+ closest: function( selectors, context ) {
+ var cur,
+ i = 0,
+ l = this.length,
+ matched = [],
+ targets = typeof selectors !== "string" && jQuery( selectors );
+
+ // Positional selectors never match, since there's no _selection_ context
+ if ( !rneedsContext.test( selectors ) ) {
+ for ( ; i < l; i++ ) {
+ for ( cur = this[ i ]; cur && cur !== context; cur = cur.parentNode ) {
+
+ // Always skip document fragments
+ if ( cur.nodeType < 11 && ( targets ?
+ targets.index( cur ) > -1 :
+
+ // Don't pass non-elements to Sizzle
+ cur.nodeType === 1 &&
+ jQuery.find.matchesSelector( cur, selectors ) ) ) {
+
+ matched.push( cur );
+ break;
+ }
+ }
+ }
+ }
+
+ return this.pushStack( matched.length > 1 ? jQuery.uniqueSort( matched ) : matched );
+ },
+
+ // Determine the position of an element within the set
+ index: function( elem ) {
+
+ // No argument, return index in parent
+ if ( !elem ) {
+ return ( this[ 0 ] && this[ 0 ].parentNode ) ? this.first().prevAll().length : -1;
+ }
+
+ // Index in selector
+ if ( typeof elem === "string" ) {
+ return indexOf.call( jQuery( elem ), this[ 0 ] );
+ }
+
+ // Locate the position of the desired element
+ return indexOf.call( this,
+
+ // If it receives a jQuery object, the first element is used
+ elem.jquery ? elem[ 0 ] : elem
+ );
+ },
+
+ add: function( selector, context ) {
+ return this.pushStack(
+ jQuery.uniqueSort(
+ jQuery.merge( this.get(), jQuery( selector, context ) )
+ )
+ );
+ },
+
+ addBack: function( selector ) {
+ return this.add( selector == null ?
+ this.prevObject : this.prevObject.filter( selector )
+ );
+ }
+} );
+
+function sibling( cur, dir ) {
+ while ( ( cur = cur[ dir ] ) && cur.nodeType !== 1 ) {}
+ return cur;
+}
+
+jQuery.each( {
+ parent: function( elem ) {
+ var parent = elem.parentNode;
+ return parent && parent.nodeType !== 11 ? parent : null;
+ },
+ parents: function( elem ) {
+ return dir( elem, "parentNode" );
+ },
+ parentsUntil: function( elem, i, until ) {
+ return dir( elem, "parentNode", until );
+ },
+ next: function( elem ) {
+ return sibling( elem, "nextSibling" );
+ },
+ prev: function( elem ) {
+ return sibling( elem, "previousSibling" );
+ },
+ nextAll: function( elem ) {
+ return dir( elem, "nextSibling" );
+ },
+ prevAll: function( elem ) {
+ return dir( elem, "previousSibling" );
+ },
+ nextUntil: function( elem, i, until ) {
+ return dir( elem, "nextSibling", until );
+ },
+ prevUntil: function( elem, i, until ) {
+ return dir( elem, "previousSibling", until );
+ },
+ siblings: function( elem ) {
+ return siblings( ( elem.parentNode || {} ).firstChild, elem );
+ },
+ children: function( elem ) {
+ return siblings( elem.firstChild );
+ },
+ contents: function( elem ) {
+ if ( typeof elem.contentDocument !== "undefined" ) {
+ return elem.contentDocument;
+ }
+
+ // Support: IE 9 - 11 only, iOS 7 only, Android Browser <=4.3 only
+ // Treat the template element as a regular one in browsers that
+ // don't support it.
+ if ( nodeName( elem, "template" ) ) {
+ elem = elem.content || elem;
+ }
+
+ return jQuery.merge( [], elem.childNodes );
+ }
+}, function( name, fn ) {
+ jQuery.fn[ name ] = function( until, selector ) {
+ var matched = jQuery.map( this, fn, until );
+
+ if ( name.slice( -5 ) !== "Until" ) {
+ selector = until;
+ }
+
+ if ( selector && typeof selector === "string" ) {
+ matched = jQuery.filter( selector, matched );
+ }
+
+ if ( this.length > 1 ) {
+
+ // Remove duplicates
+ if ( !guaranteedUnique[ name ] ) {
+ jQuery.uniqueSort( matched );
+ }
+
+ // Reverse order for parents* and prev-derivatives
+ if ( rparentsprev.test( name ) ) {
+ matched.reverse();
+ }
+ }
+
+ return this.pushStack( matched );
+ };
+} );
+var rnothtmlwhite = ( /[^\x20\t\r\n\f]+/g );
+
+
+
+// Convert String-formatted options into Object-formatted ones
+function createOptions( options ) {
+ var object = {};
+ jQuery.each( options.match( rnothtmlwhite ) || [], function( _, flag ) {
+ object[ flag ] = true;
+ } );
+ return object;
+}
+
+/*
+ * Create a callback list using the following parameters:
+ *
+ * options: an optional list of space-separated options that will change how
+ * the callback list behaves or a more traditional option object
+ *
+ * By default a callback list will act like an event callback list and can be
+ * "fired" multiple times.
+ *
+ * Possible options:
+ *
+ * once: will ensure the callback list can only be fired once (like a Deferred)
+ *
+ * memory: will keep track of previous values and will call any callback added
+ * after the list has been fired right away with the latest "memorized"
+ * values (like a Deferred)
+ *
+ * unique: will ensure a callback can only be added once (no duplicate in the list)
+ *
+ * stopOnFalse: interrupt callings when a callback returns false
+ *
+ */
+jQuery.Callbacks = function( options ) {
+
+ // Convert options from String-formatted to Object-formatted if needed
+ // (we check in cache first)
+ options = typeof options === "string" ?
+ createOptions( options ) :
+ jQuery.extend( {}, options );
+
+ var // Flag to know if list is currently firing
+ firing,
+
+ // Last fire value for non-forgettable lists
+ memory,
+
+ // Flag to know if list was already fired
+ fired,
+
+ // Flag to prevent firing
+ locked,
+
+ // Actual callback list
+ list = [],
+
+ // Queue of execution data for repeatable lists
+ queue = [],
+
+ // Index of currently firing callback (modified by add/remove as needed)
+ firingIndex = -1,
+
+ // Fire callbacks
+ fire = function() {
+
+ // Enforce single-firing
+ locked = locked || options.once;
+
+ // Execute callbacks for all pending executions,
+ // respecting firingIndex overrides and runtime changes
+ fired = firing = true;
+ for ( ; queue.length; firingIndex = -1 ) {
+ memory = queue.shift();
+ while ( ++firingIndex < list.length ) {
+
+ // Run callback and check for early termination
+ if ( list[ firingIndex ].apply( memory[ 0 ], memory[ 1 ] ) === false &&
+ options.stopOnFalse ) {
+
+ // Jump to end and forget the data so .add doesn't re-fire
+ firingIndex = list.length;
+ memory = false;
+ }
+ }
+ }
+
+ // Forget the data if we're done with it
+ if ( !options.memory ) {
+ memory = false;
+ }
+
+ firing = false;
+
+ // Clean up if we're done firing for good
+ if ( locked ) {
+
+ // Keep an empty list if we have data for future add calls
+ if ( memory ) {
+ list = [];
+
+ // Otherwise, this object is spent
+ } else {
+ list = "";
+ }
+ }
+ },
+
+ // Actual Callbacks object
+ self = {
+
+ // Add a callback or a collection of callbacks to the list
+ add: function() {
+ if ( list ) {
+
+ // If we have memory from a past run, we should fire after adding
+ if ( memory && !firing ) {
+ firingIndex = list.length - 1;
+ queue.push( memory );
+ }
+
+ ( function add( args ) {
+ jQuery.each( args, function( _, arg ) {
+ if ( isFunction( arg ) ) {
+ if ( !options.unique || !self.has( arg ) ) {
+ list.push( arg );
+ }
+ } else if ( arg && arg.length && toType( arg ) !== "string" ) {
+
+ // Inspect recursively
+ add( arg );
+ }
+ } );
+ } )( arguments );
+
+ if ( memory && !firing ) {
+ fire();
+ }
+ }
+ return this;
+ },
+
+ // Remove a callback from the list
+ remove: function() {
+ jQuery.each( arguments, function( _, arg ) {
+ var index;
+ while ( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) {
+ list.splice( index, 1 );
+
+ // Handle firing indexes
+ if ( index <= firingIndex ) {
+ firingIndex--;
+ }
+ }
+ } );
+ return this;
+ },
+
+ // Check if a given callback is in the list.
+ // If no argument is given, return whether or not list has callbacks attached.
+ has: function( fn ) {
+ return fn ?
+ jQuery.inArray( fn, list ) > -1 :
+ list.length > 0;
+ },
+
+ // Remove all callbacks from the list
+ empty: function() {
+ if ( list ) {
+ list = [];
+ }
+ return this;
+ },
+
+ // Disable .fire and .add
+ // Abort any current/pending executions
+ // Clear all callbacks and values
+ disable: function() {
+ locked = queue = [];
+ list = memory = "";
+ return this;
+ },
+ disabled: function() {
+ return !list;
+ },
+
+ // Disable .fire
+ // Also disable .add unless we have memory (since it would have no effect)
+ // Abort any pending executions
+ lock: function() {
+ locked = queue = [];
+ if ( !memory && !firing ) {
+ list = memory = "";
+ }
+ return this;
+ },
+ locked: function() {
+ return !!locked;
+ },
+
+ // Call all callbacks with the given context and arguments
+ fireWith: function( context, args ) {
+ if ( !locked ) {
+ args = args || [];
+ args = [ context, args.slice ? args.slice() : args ];
+ queue.push( args );
+ if ( !firing ) {
+ fire();
+ }
+ }
+ return this;
+ },
+
+ // Call all the callbacks with the given arguments
+ fire: function() {
+ self.fireWith( this, arguments );
+ return this;
+ },
+
+ // To know if the callbacks have already been called at least once
+ fired: function() {
+ return !!fired;
+ }
+ };
+
+ return self;
+};
+
+
+function Identity( v ) {
+ return v;
+}
+function Thrower( ex ) {
+ throw ex;
+}
+
+function adoptValue( value, resolve, reject, noValue ) {
+ var method;
+
+ try {
+
+ // Check for promise aspect first to privilege synchronous behavior
+ if ( value && isFunction( ( method = value.promise ) ) ) {
+ method.call( value ).done( resolve ).fail( reject );
+
+ // Other thenables
+ } else if ( value && isFunction( ( method = value.then ) ) ) {
+ method.call( value, resolve, reject );
+
+ // Other non-thenables
+ } else {
+
+ // Control `resolve` arguments by letting Array#slice cast boolean `noValue` to integer:
+ // * false: [ value ].slice( 0 ) => resolve( value )
+ // * true: [ value ].slice( 1 ) => resolve()
+ resolve.apply( undefined, [ value ].slice( noValue ) );
+ }
+
+ // For Promises/A+, convert exceptions into rejections
+ // Since jQuery.when doesn't unwrap thenables, we can skip the extra checks appearing in
+ // Deferred#then to conditionally suppress rejection.
+ } catch ( value ) {
+
+ // Support: Android 4.0 only
+ // Strict mode functions invoked without .call/.apply get global-object context
+ reject.apply( undefined, [ value ] );
+ }
+}
+
+jQuery.extend( {
+
+ Deferred: function( func ) {
+ var tuples = [
+
+ // action, add listener, callbacks,
+ // ... .then handlers, argument index, [final state]
+ [ "notify", "progress", jQuery.Callbacks( "memory" ),
+ jQuery.Callbacks( "memory" ), 2 ],
+ [ "resolve", "done", jQuery.Callbacks( "once memory" ),
+ jQuery.Callbacks( "once memory" ), 0, "resolved" ],
+ [ "reject", "fail", jQuery.Callbacks( "once memory" ),
+ jQuery.Callbacks( "once memory" ), 1, "rejected" ]
+ ],
+ state = "pending",
+ promise = {
+ state: function() {
+ return state;
+ },
+ always: function() {
+ deferred.done( arguments ).fail( arguments );
+ return this;
+ },
+ "catch": function( fn ) {
+ return promise.then( null, fn );
+ },
+
+ // Keep pipe for back-compat
+ pipe: function( /* fnDone, fnFail, fnProgress */ ) {
+ var fns = arguments;
+
+ return jQuery.Deferred( function( newDefer ) {
+ jQuery.each( tuples, function( i, tuple ) {
+
+ // Map tuples (progress, done, fail) to arguments (done, fail, progress)
+ var fn = isFunction( fns[ tuple[ 4 ] ] ) && fns[ tuple[ 4 ] ];
+
+ // deferred.progress(function() { bind to newDefer or newDefer.notify })
+ // deferred.done(function() { bind to newDefer or newDefer.resolve })
+ // deferred.fail(function() { bind to newDefer or newDefer.reject })
+ deferred[ tuple[ 1 ] ]( function() {
+ var returned = fn && fn.apply( this, arguments );
+ if ( returned && isFunction( returned.promise ) ) {
+ returned.promise()
+ .progress( newDefer.notify )
+ .done( newDefer.resolve )
+ .fail( newDefer.reject );
+ } else {
+ newDefer[ tuple[ 0 ] + "With" ](
+ this,
+ fn ? [ returned ] : arguments
+ );
+ }
+ } );
+ } );
+ fns = null;
+ } ).promise();
+ },
+ then: function( onFulfilled, onRejected, onProgress ) {
+ var maxDepth = 0;
+ function resolve( depth, deferred, handler, special ) {
+ return function() {
+ var that = this,
+ args = arguments,
+ mightThrow = function() {
+ var returned, then;
+
+ // Support: Promises/A+ section 2.3.3.3.3
+ // https://promisesaplus.com/#point-59
+ // Ignore double-resolution attempts
+ if ( depth < maxDepth ) {
+ return;
+ }
+
+ returned = handler.apply( that, args );
+
+ // Support: Promises/A+ section 2.3.1
+ // https://promisesaplus.com/#point-48
+ if ( returned === deferred.promise() ) {
+ throw new TypeError( "Thenable self-resolution" );
+ }
+
+ // Support: Promises/A+ sections 2.3.3.1, 3.5
+ // https://promisesaplus.com/#point-54
+ // https://promisesaplus.com/#point-75
+ // Retrieve `then` only once
+ then = returned &&
+
+ // Support: Promises/A+ section 2.3.4
+ // https://promisesaplus.com/#point-64
+ // Only check objects and functions for thenability
+ ( typeof returned === "object" ||
+ typeof returned === "function" ) &&
+ returned.then;
+
+ // Handle a returned thenable
+ if ( isFunction( then ) ) {
+
+ // Special processors (notify) just wait for resolution
+ if ( special ) {
+ then.call(
+ returned,
+ resolve( maxDepth, deferred, Identity, special ),
+ resolve( maxDepth, deferred, Thrower, special )
+ );
+
+ // Normal processors (resolve) also hook into progress
+ } else {
+
+ // ...and disregard older resolution values
+ maxDepth++;
+
+ then.call(
+ returned,
+ resolve( maxDepth, deferred, Identity, special ),
+ resolve( maxDepth, deferred, Thrower, special ),
+ resolve( maxDepth, deferred, Identity,
+ deferred.notifyWith )
+ );
+ }
+
+ // Handle all other returned values
+ } else {
+
+ // Only substitute handlers pass on context
+ // and multiple values (non-spec behavior)
+ if ( handler !== Identity ) {
+ that = undefined;
+ args = [ returned ];
+ }
+
+ // Process the value(s)
+ // Default process is resolve
+ ( special || deferred.resolveWith )( that, args );
+ }
+ },
+
+ // Only normal processors (resolve) catch and reject exceptions
+ process = special ?
+ mightThrow :
+ function() {
+ try {
+ mightThrow();
+ } catch ( e ) {
+
+ if ( jQuery.Deferred.exceptionHook ) {
+ jQuery.Deferred.exceptionHook( e,
+ process.stackTrace );
+ }
+
+ // Support: Promises/A+ section 2.3.3.3.4.1
+ // https://promisesaplus.com/#point-61
+ // Ignore post-resolution exceptions
+ if ( depth + 1 >= maxDepth ) {
+
+ // Only substitute handlers pass on context
+ // and multiple values (non-spec behavior)
+ if ( handler !== Thrower ) {
+ that = undefined;
+ args = [ e ];
+ }
+
+ deferred.rejectWith( that, args );
+ }
+ }
+ };
+
+ // Support: Promises/A+ section 2.3.3.3.1
+ // https://promisesaplus.com/#point-57
+ // Re-resolve promises immediately to dodge false rejection from
+ // subsequent errors
+ if ( depth ) {
+ process();
+ } else {
+
+ // Call an optional hook to record the stack, in case of exception
+ // since it's otherwise lost when execution goes async
+ if ( jQuery.Deferred.getStackHook ) {
+ process.stackTrace = jQuery.Deferred.getStackHook();
+ }
+ window.setTimeout( process );
+ }
+ };
+ }
+
+ return jQuery.Deferred( function( newDefer ) {
+
+ // progress_handlers.add( ... )
+ tuples[ 0 ][ 3 ].add(
+ resolve(
+ 0,
+ newDefer,
+ isFunction( onProgress ) ?
+ onProgress :
+ Identity,
+ newDefer.notifyWith
+ )
+ );
+
+ // fulfilled_handlers.add( ... )
+ tuples[ 1 ][ 3 ].add(
+ resolve(
+ 0,
+ newDefer,
+ isFunction( onFulfilled ) ?
+ onFulfilled :
+ Identity
+ )
+ );
+
+ // rejected_handlers.add( ... )
+ tuples[ 2 ][ 3 ].add(
+ resolve(
+ 0,
+ newDefer,
+ isFunction( onRejected ) ?
+ onRejected :
+ Thrower
+ )
+ );
+ } ).promise();
+ },
+
+ // Get a promise for this deferred
+ // If obj is provided, the promise aspect is added to the object
+ promise: function( obj ) {
+ return obj != null ? jQuery.extend( obj, promise ) : promise;
+ }
+ },
+ deferred = {};
+
+ // Add list-specific methods
+ jQuery.each( tuples, function( i, tuple ) {
+ var list = tuple[ 2 ],
+ stateString = tuple[ 5 ];
+
+ // promise.progress = list.add
+ // promise.done = list.add
+ // promise.fail = list.add
+ promise[ tuple[ 1 ] ] = list.add;
+
+ // Handle state
+ if ( stateString ) {
+ list.add(
+ function() {
+
+ // state = "resolved" (i.e., fulfilled)
+ // state = "rejected"
+ state = stateString;
+ },
+
+ // rejected_callbacks.disable
+ // fulfilled_callbacks.disable
+ tuples[ 3 - i ][ 2 ].disable,
+
+ // rejected_handlers.disable
+ // fulfilled_handlers.disable
+ tuples[ 3 - i ][ 3 ].disable,
+
+ // progress_callbacks.lock
+ tuples[ 0 ][ 2 ].lock,
+
+ // progress_handlers.lock
+ tuples[ 0 ][ 3 ].lock
+ );
+ }
+
+ // progress_handlers.fire
+ // fulfilled_handlers.fire
+ // rejected_handlers.fire
+ list.add( tuple[ 3 ].fire );
+
+ // deferred.notify = function() { deferred.notifyWith(...) }
+ // deferred.resolve = function() { deferred.resolveWith(...) }
+ // deferred.reject = function() { deferred.rejectWith(...) }
+ deferred[ tuple[ 0 ] ] = function() {
+ deferred[ tuple[ 0 ] + "With" ]( this === deferred ? undefined : this, arguments );
+ return this;
+ };
+
+ // deferred.notifyWith = list.fireWith
+ // deferred.resolveWith = list.fireWith
+ // deferred.rejectWith = list.fireWith
+ deferred[ tuple[ 0 ] + "With" ] = list.fireWith;
+ } );
+
+ // Make the deferred a promise
+ promise.promise( deferred );
+
+ // Call given func if any
+ if ( func ) {
+ func.call( deferred, deferred );
+ }
+
+ // All done!
+ return deferred;
+ },
+
+ // Deferred helper
+ when: function( singleValue ) {
+ var
+
+ // count of uncompleted subordinates
+ remaining = arguments.length,
+
+ // count of unprocessed arguments
+ i = remaining,
+
+ // subordinate fulfillment data
+ resolveContexts = Array( i ),
+ resolveValues = slice.call( arguments ),
+
+ // the master Deferred
+ master = jQuery.Deferred(),
+
+ // subordinate callback factory
+ updateFunc = function( i ) {
+ return function( value ) {
+ resolveContexts[ i ] = this;
+ resolveValues[ i ] = arguments.length > 1 ? slice.call( arguments ) : value;
+ if ( !( --remaining ) ) {
+ master.resolveWith( resolveContexts, resolveValues );
+ }
+ };
+ };
+
+ // Single- and empty arguments are adopted like Promise.resolve
+ if ( remaining <= 1 ) {
+ adoptValue( singleValue, master.done( updateFunc( i ) ).resolve, master.reject,
+ !remaining );
+
+ // Use .then() to unwrap secondary thenables (cf. gh-3000)
+ if ( master.state() === "pending" ||
+ isFunction( resolveValues[ i ] && resolveValues[ i ].then ) ) {
+
+ return master.then();
+ }
+ }
+
+ // Multiple arguments are aggregated like Promise.all array elements
+ while ( i-- ) {
+ adoptValue( resolveValues[ i ], updateFunc( i ), master.reject );
+ }
+
+ return master.promise();
+ }
+} );
+
+
+// These usually indicate a programmer mistake during development,
+// warn about them ASAP rather than swallowing them by default.
+var rerrorNames = /^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;
+
+jQuery.Deferred.exceptionHook = function( error, stack ) {
+
+ // Support: IE 8 - 9 only
+ // Console exists when dev tools are open, which can happen at any time
+ if ( window.console && window.console.warn && error && rerrorNames.test( error.name ) ) {
+ window.console.warn( "jQuery.Deferred exception: " + error.message, error.stack, stack );
+ }
+};
+
+
+
+
+jQuery.readyException = function( error ) {
+ window.setTimeout( function() {
+ throw error;
+ } );
+};
+
+
+
+
+// The deferred used on DOM ready
+var readyList = jQuery.Deferred();
+
+jQuery.fn.ready = function( fn ) {
+
+ readyList
+ .then( fn )
+
+ // Wrap jQuery.readyException in a function so that the lookup
+ // happens at the time of error handling instead of callback
+ // registration.
+ .catch( function( error ) {
+ jQuery.readyException( error );
+ } );
+
+ return this;
+};
+
+jQuery.extend( {
+
+ // Is the DOM ready to be used? Set to true once it occurs.
+ isReady: false,
+
+ // A counter to track how many items to wait for before
+ // the ready event fires. See #6781
+ readyWait: 1,
+
+ // Handle when the DOM is ready
+ ready: function( wait ) {
+
+ // Abort if there are pending holds or we're already ready
+ if ( wait === true ? --jQuery.readyWait : jQuery.isReady ) {
+ return;
+ }
+
+ // Remember that the DOM is ready
+ jQuery.isReady = true;
+
+ // If a normal DOM Ready event fired, decrement, and wait if need be
+ if ( wait !== true && --jQuery.readyWait > 0 ) {
+ return;
+ }
+
+ // If there are functions bound, to execute
+ readyList.resolveWith( document, [ jQuery ] );
+ }
+} );
+
+jQuery.ready.then = readyList.then;
+
+// The ready event handler and self cleanup method
+function completed() {
+ document.removeEventListener( "DOMContentLoaded", completed );
+ window.removeEventListener( "load", completed );
+ jQuery.ready();
+}
+
+// Catch cases where $(document).ready() is called
+// after the browser event has already occurred.
+// Support: IE <=9 - 10 only
+// Older IE sometimes signals "interactive" too soon
+if ( document.readyState === "complete" ||
+ ( document.readyState !== "loading" && !document.documentElement.doScroll ) ) {
+
+ // Handle it asynchronously to allow scripts the opportunity to delay ready
+ window.setTimeout( jQuery.ready );
+
+} else {
+
+ // Use the handy event callback
+ document.addEventListener( "DOMContentLoaded", completed );
+
+ // A fallback to window.onload, that will always work
+ window.addEventListener( "load", completed );
+}
+
+
+
+
+// Multifunctional method to get and set values of a collection
+// The value/s can optionally be executed if it's a function
+var access = function( elems, fn, key, value, chainable, emptyGet, raw ) {
+ var i = 0,
+ len = elems.length,
+ bulk = key == null;
+
+ // Sets many values
+ if ( toType( key ) === "object" ) {
+ chainable = true;
+ for ( i in key ) {
+ access( elems, fn, i, key[ i ], true, emptyGet, raw );
+ }
+
+ // Sets one value
+ } else if ( value !== undefined ) {
+ chainable = true;
+
+ if ( !isFunction( value ) ) {
+ raw = true;
+ }
+
+ if ( bulk ) {
+
+ // Bulk operations run against the entire set
+ if ( raw ) {
+ fn.call( elems, value );
+ fn = null;
+
+ // ...except when executing function values
+ } else {
+ bulk = fn;
+ fn = function( elem, key, value ) {
+ return bulk.call( jQuery( elem ), value );
+ };
+ }
+ }
+
+ if ( fn ) {
+ for ( ; i < len; i++ ) {
+ fn(
+ elems[ i ], key, raw ?
+ value :
+ value.call( elems[ i ], i, fn( elems[ i ], key ) )
+ );
+ }
+ }
+ }
+
+ if ( chainable ) {
+ return elems;
+ }
+
+ // Gets
+ if ( bulk ) {
+ return fn.call( elems );
+ }
+
+ return len ? fn( elems[ 0 ], key ) : emptyGet;
+};
+
+
+// Matches dashed string for camelizing
+var rmsPrefix = /^-ms-/,
+ rdashAlpha = /-([a-z])/g;
+
+// Used by camelCase as callback to replace()
+function fcamelCase( all, letter ) {
+ return letter.toUpperCase();
+}
+
+// Convert dashed to camelCase; used by the css and data modules
+// Support: IE <=9 - 11, Edge 12 - 15
+// Microsoft forgot to hump their vendor prefix (#9572)
+function camelCase( string ) {
+ return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase );
+}
+var acceptData = function( owner ) {
+
+ // Accepts only:
+ // - Node
+ // - Node.ELEMENT_NODE
+ // - Node.DOCUMENT_NODE
+ // - Object
+ // - Any
+ return owner.nodeType === 1 || owner.nodeType === 9 || !( +owner.nodeType );
+};
+
+
+
+
+function Data() {
+ this.expando = jQuery.expando + Data.uid++;
+}
+
+Data.uid = 1;
+
+Data.prototype = {
+
+ cache: function( owner ) {
+
+ // Check if the owner object already has a cache
+ var value = owner[ this.expando ];
+
+ // If not, create one
+ if ( !value ) {
+ value = {};
+
+ // We can accept data for non-element nodes in modern browsers,
+ // but we should not, see #8335.
+ // Always return an empty object.
+ if ( acceptData( owner ) ) {
+
+ // If it is a node unlikely to be stringify-ed or looped over
+ // use plain assignment
+ if ( owner.nodeType ) {
+ owner[ this.expando ] = value;
+
+ // Otherwise secure it in a non-enumerable property
+ // configurable must be true to allow the property to be
+ // deleted when data is removed
+ } else {
+ Object.defineProperty( owner, this.expando, {
+ value: value,
+ configurable: true
+ } );
+ }
+ }
+ }
+
+ return value;
+ },
+ set: function( owner, data, value ) {
+ var prop,
+ cache = this.cache( owner );
+
+ // Handle: [ owner, key, value ] args
+ // Always use camelCase key (gh-2257)
+ if ( typeof data === "string" ) {
+ cache[ camelCase( data ) ] = value;
+
+ // Handle: [ owner, { properties } ] args
+ } else {
+
+ // Copy the properties one-by-one to the cache object
+ for ( prop in data ) {
+ cache[ camelCase( prop ) ] = data[ prop ];
+ }
+ }
+ return cache;
+ },
+ get: function( owner, key ) {
+ return key === undefined ?
+ this.cache( owner ) :
+
+ // Always use camelCase key (gh-2257)
+ owner[ this.expando ] && owner[ this.expando ][ camelCase( key ) ];
+ },
+ access: function( owner, key, value ) {
+
+ // In cases where either:
+ //
+ // 1. No key was specified
+ // 2. A string key was specified, but no value provided
+ //
+ // Take the "read" path and allow the get method to determine
+ // which value to return, respectively either:
+ //
+ // 1. The entire cache object
+ // 2. The data stored at the key
+ //
+ if ( key === undefined ||
+ ( ( key && typeof key === "string" ) && value === undefined ) ) {
+
+ return this.get( owner, key );
+ }
+
+ // When the key is not a string, or both a key and value
+ // are specified, set or extend (existing objects) with either:
+ //
+ // 1. An object of properties
+ // 2. A key and value
+ //
+ this.set( owner, key, value );
+
+ // Since the "set" path can have two possible entry points
+ // return the expected data based on which path was taken[*]
+ return value !== undefined ? value : key;
+ },
+ remove: function( owner, key ) {
+ var i,
+ cache = owner[ this.expando ];
+
+ if ( cache === undefined ) {
+ return;
+ }
+
+ if ( key !== undefined ) {
+
+ // Support array or space separated string of keys
+ if ( Array.isArray( key ) ) {
+
+ // If key is an array of keys...
+ // We always set camelCase keys, so remove that.
+ key = key.map( camelCase );
+ } else {
+ key = camelCase( key );
+
+ // If a key with the spaces exists, use it.
+ // Otherwise, create an array by matching non-whitespace
+ key = key in cache ?
+ [ key ] :
+ ( key.match( rnothtmlwhite ) || [] );
+ }
+
+ i = key.length;
+
+ while ( i-- ) {
+ delete cache[ key[ i ] ];
+ }
+ }
+
+ // Remove the expando if there's no more data
+ if ( key === undefined || jQuery.isEmptyObject( cache ) ) {
+
+ // Support: Chrome <=35 - 45
+ // Webkit & Blink performance suffers when deleting properties
+ // from DOM nodes, so set to undefined instead
+ // https://bugs.chromium.org/p/chromium/issues/detail?id=378607 (bug restricted)
+ if ( owner.nodeType ) {
+ owner[ this.expando ] = undefined;
+ } else {
+ delete owner[ this.expando ];
+ }
+ }
+ },
+ hasData: function( owner ) {
+ var cache = owner[ this.expando ];
+ return cache !== undefined && !jQuery.isEmptyObject( cache );
+ }
+};
+var dataPriv = new Data();
+
+var dataUser = new Data();
+
+
+
+// Implementation Summary
+//
+// 1. Enforce API surface and semantic compatibility with 1.9.x branch
+// 2. Improve the module's maintainability by reducing the storage
+// paths to a single mechanism.
+// 3. Use the same single mechanism to support "private" and "user" data.
+// 4. _Never_ expose "private" data to user code (TODO: Drop _data, _removeData)
+// 5. Avoid exposing implementation details on user objects (eg. expando properties)
+// 6. Provide a clear path for implementation upgrade to WeakMap in 2014
+
+var rbrace = /^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,
+ rmultiDash = /[A-Z]/g;
+
+function getData( data ) {
+ if ( data === "true" ) {
+ return true;
+ }
+
+ if ( data === "false" ) {
+ return false;
+ }
+
+ if ( data === "null" ) {
+ return null;
+ }
+
+ // Only convert to a number if it doesn't change the string
+ if ( data === +data + "" ) {
+ return +data;
+ }
+
+ if ( rbrace.test( data ) ) {
+ return JSON.parse( data );
+ }
+
+ return data;
+}
+
+function dataAttr( elem, key, data ) {
+ var name;
+
+ // If nothing was found internally, try to fetch any
+ // data from the HTML5 data-* attribute
+ if ( data === undefined && elem.nodeType === 1 ) {
+ name = "data-" + key.replace( rmultiDash, "-$&" ).toLowerCase();
+ data = elem.getAttribute( name );
+
+ if ( typeof data === "string" ) {
+ try {
+ data = getData( data );
+ } catch ( e ) {}
+
+ // Make sure we set the data so it isn't changed later
+ dataUser.set( elem, key, data );
+ } else {
+ data = undefined;
+ }
+ }
+ return data;
+}
+
+jQuery.extend( {
+ hasData: function( elem ) {
+ return dataUser.hasData( elem ) || dataPriv.hasData( elem );
+ },
+
+ data: function( elem, name, data ) {
+ return dataUser.access( elem, name, data );
+ },
+
+ removeData: function( elem, name ) {
+ dataUser.remove( elem, name );
+ },
+
+ // TODO: Now that all calls to _data and _removeData have been replaced
+ // with direct calls to dataPriv methods, these can be deprecated.
+ _data: function( elem, name, data ) {
+ return dataPriv.access( elem, name, data );
+ },
+
+ _removeData: function( elem, name ) {
+ dataPriv.remove( elem, name );
+ }
+} );
+
+jQuery.fn.extend( {
+ data: function( key, value ) {
+ var i, name, data,
+ elem = this[ 0 ],
+ attrs = elem && elem.attributes;
+
+ // Gets all values
+ if ( key === undefined ) {
+ if ( this.length ) {
+ data = dataUser.get( elem );
+
+ if ( elem.nodeType === 1 && !dataPriv.get( elem, "hasDataAttrs" ) ) {
+ i = attrs.length;
+ while ( i-- ) {
+
+ // Support: IE 11 only
+ // The attrs elements can be null (#14894)
+ if ( attrs[ i ] ) {
+ name = attrs[ i ].name;
+ if ( name.indexOf( "data-" ) === 0 ) {
+ name = camelCase( name.slice( 5 ) );
+ dataAttr( elem, name, data[ name ] );
+ }
+ }
+ }
+ dataPriv.set( elem, "hasDataAttrs", true );
+ }
+ }
+
+ return data;
+ }
+
+ // Sets multiple values
+ if ( typeof key === "object" ) {
+ return this.each( function() {
+ dataUser.set( this, key );
+ } );
+ }
+
+ return access( this, function( value ) {
+ var data;
+
+ // The calling jQuery object (element matches) is not empty
+ // (and therefore has an element appears at this[ 0 ]) and the
+ // `value` parameter was not undefined. An empty jQuery object
+ // will result in `undefined` for elem = this[ 0 ] which will
+ // throw an exception if an attempt to read a data cache is made.
+ if ( elem && value === undefined ) {
+
+ // Attempt to get data from the cache
+ // The key will always be camelCased in Data
+ data = dataUser.get( elem, key );
+ if ( data !== undefined ) {
+ return data;
+ }
+
+ // Attempt to "discover" the data in
+ // HTML5 custom data-* attrs
+ data = dataAttr( elem, key );
+ if ( data !== undefined ) {
+ return data;
+ }
+
+ // We tried really hard, but the data doesn't exist.
+ return;
+ }
+
+ // Set the data...
+ this.each( function() {
+
+ // We always store the camelCased key
+ dataUser.set( this, key, value );
+ } );
+ }, null, value, arguments.length > 1, null, true );
+ },
+
+ removeData: function( key ) {
+ return this.each( function() {
+ dataUser.remove( this, key );
+ } );
+ }
+} );
+
+
+jQuery.extend( {
+ queue: function( elem, type, data ) {
+ var queue;
+
+ if ( elem ) {
+ type = ( type || "fx" ) + "queue";
+ queue = dataPriv.get( elem, type );
+
+ // Speed up dequeue by getting out quickly if this is just a lookup
+ if ( data ) {
+ if ( !queue || Array.isArray( data ) ) {
+ queue = dataPriv.access( elem, type, jQuery.makeArray( data ) );
+ } else {
+ queue.push( data );
+ }
+ }
+ return queue || [];
+ }
+ },
+
+ dequeue: function( elem, type ) {
+ type = type || "fx";
+
+ var queue = jQuery.queue( elem, type ),
+ startLength = queue.length,
+ fn = queue.shift(),
+ hooks = jQuery._queueHooks( elem, type ),
+ next = function() {
+ jQuery.dequeue( elem, type );
+ };
+
+ // If the fx queue is dequeued, always remove the progress sentinel
+ if ( fn === "inprogress" ) {
+ fn = queue.shift();
+ startLength--;
+ }
+
+ if ( fn ) {
+
+ // Add a progress sentinel to prevent the fx queue from being
+ // automatically dequeued
+ if ( type === "fx" ) {
+ queue.unshift( "inprogress" );
+ }
+
+ // Clear up the last queue stop function
+ delete hooks.stop;
+ fn.call( elem, next, hooks );
+ }
+
+ if ( !startLength && hooks ) {
+ hooks.empty.fire();
+ }
+ },
+
+ // Not public - generate a queueHooks object, or return the current one
+ _queueHooks: function( elem, type ) {
+ var key = type + "queueHooks";
+ return dataPriv.get( elem, key ) || dataPriv.access( elem, key, {
+ empty: jQuery.Callbacks( "once memory" ).add( function() {
+ dataPriv.remove( elem, [ type + "queue", key ] );
+ } )
+ } );
+ }
+} );
+
+jQuery.fn.extend( {
+ queue: function( type, data ) {
+ var setter = 2;
+
+ if ( typeof type !== "string" ) {
+ data = type;
+ type = "fx";
+ setter--;
+ }
+
+ if ( arguments.length < setter ) {
+ return jQuery.queue( this[ 0 ], type );
+ }
+
+ return data === undefined ?
+ this :
+ this.each( function() {
+ var queue = jQuery.queue( this, type, data );
+
+ // Ensure a hooks for this queue
+ jQuery._queueHooks( this, type );
+
+ if ( type === "fx" && queue[ 0 ] !== "inprogress" ) {
+ jQuery.dequeue( this, type );
+ }
+ } );
+ },
+ dequeue: function( type ) {
+ return this.each( function() {
+ jQuery.dequeue( this, type );
+ } );
+ },
+ clearQueue: function( type ) {
+ return this.queue( type || "fx", [] );
+ },
+
+ // Get a promise resolved when queues of a certain type
+ // are emptied (fx is the type by default)
+ promise: function( type, obj ) {
+ var tmp,
+ count = 1,
+ defer = jQuery.Deferred(),
+ elements = this,
+ i = this.length,
+ resolve = function() {
+ if ( !( --count ) ) {
+ defer.resolveWith( elements, [ elements ] );
+ }
+ };
+
+ if ( typeof type !== "string" ) {
+ obj = type;
+ type = undefined;
+ }
+ type = type || "fx";
+
+ while ( i-- ) {
+ tmp = dataPriv.get( elements[ i ], type + "queueHooks" );
+ if ( tmp && tmp.empty ) {
+ count++;
+ tmp.empty.add( resolve );
+ }
+ }
+ resolve();
+ return defer.promise( obj );
+ }
+} );
+var pnum = ( /[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/ ).source;
+
+var rcssNum = new RegExp( "^(?:([+-])=|)(" + pnum + ")([a-z%]*)$", "i" );
+
+
+var cssExpand = [ "Top", "Right", "Bottom", "Left" ];
+
+var documentElement = document.documentElement;
+
+
+
+ var isAttached = function( elem ) {
+ return jQuery.contains( elem.ownerDocument, elem );
+ },
+ composed = { composed: true };
+
+ // Support: IE 9 - 11+, Edge 12 - 18+, iOS 10.0 - 10.2 only
+ // Check attachment across shadow DOM boundaries when possible (gh-3504)
+ // Support: iOS 10.0-10.2 only
+ // Early iOS 10 versions support `attachShadow` but not `getRootNode`,
+ // leading to errors. We need to check for `getRootNode`.
+ if ( documentElement.getRootNode ) {
+ isAttached = function( elem ) {
+ return jQuery.contains( elem.ownerDocument, elem ) ||
+ elem.getRootNode( composed ) === elem.ownerDocument;
+ };
+ }
+var isHiddenWithinTree = function( elem, el ) {
+
+ // isHiddenWithinTree might be called from jQuery#filter function;
+ // in that case, element will be second argument
+ elem = el || elem;
+
+ // Inline style trumps all
+ return elem.style.display === "none" ||
+ elem.style.display === "" &&
+
+ // Otherwise, check computed style
+ // Support: Firefox <=43 - 45
+ // Disconnected elements can have computed display: none, so first confirm that elem is
+ // in the document.
+ isAttached( elem ) &&
+
+ jQuery.css( elem, "display" ) === "none";
+ };
+
+var swap = function( elem, options, callback, args ) {
+ var ret, name,
+ old = {};
+
+ // Remember the old values, and insert the new ones
+ for ( name in options ) {
+ old[ name ] = elem.style[ name ];
+ elem.style[ name ] = options[ name ];
+ }
+
+ ret = callback.apply( elem, args || [] );
+
+ // Revert the old values
+ for ( name in options ) {
+ elem.style[ name ] = old[ name ];
+ }
+
+ return ret;
+};
+
+
+
+
+function adjustCSS( elem, prop, valueParts, tween ) {
+ var adjusted, scale,
+ maxIterations = 20,
+ currentValue = tween ?
+ function() {
+ return tween.cur();
+ } :
+ function() {
+ return jQuery.css( elem, prop, "" );
+ },
+ initial = currentValue(),
+ unit = valueParts && valueParts[ 3 ] || ( jQuery.cssNumber[ prop ] ? "" : "px" ),
+
+ // Starting value computation is required for potential unit mismatches
+ initialInUnit = elem.nodeType &&
+ ( jQuery.cssNumber[ prop ] || unit !== "px" && +initial ) &&
+ rcssNum.exec( jQuery.css( elem, prop ) );
+
+ if ( initialInUnit && initialInUnit[ 3 ] !== unit ) {
+
+ // Support: Firefox <=54
+ // Halve the iteration target value to prevent interference from CSS upper bounds (gh-2144)
+ initial = initial / 2;
+
+ // Trust units reported by jQuery.css
+ unit = unit || initialInUnit[ 3 ];
+
+ // Iteratively approximate from a nonzero starting point
+ initialInUnit = +initial || 1;
+
+ while ( maxIterations-- ) {
+
+ // Evaluate and update our best guess (doubling guesses that zero out).
+ // Finish if the scale equals or crosses 1 (making the old*new product non-positive).
+ jQuery.style( elem, prop, initialInUnit + unit );
+ if ( ( 1 - scale ) * ( 1 - ( scale = currentValue() / initial || 0.5 ) ) <= 0 ) {
+ maxIterations = 0;
+ }
+ initialInUnit = initialInUnit / scale;
+
+ }
+
+ initialInUnit = initialInUnit * 2;
+ jQuery.style( elem, prop, initialInUnit + unit );
+
+ // Make sure we update the tween properties later on
+ valueParts = valueParts || [];
+ }
+
+ if ( valueParts ) {
+ initialInUnit = +initialInUnit || +initial || 0;
+
+ // Apply relative offset (+=/-=) if specified
+ adjusted = valueParts[ 1 ] ?
+ initialInUnit + ( valueParts[ 1 ] + 1 ) * valueParts[ 2 ] :
+ +valueParts[ 2 ];
+ if ( tween ) {
+ tween.unit = unit;
+ tween.start = initialInUnit;
+ tween.end = adjusted;
+ }
+ }
+ return adjusted;
+}
+
+
+var defaultDisplayMap = {};
+
+function getDefaultDisplay( elem ) {
+ var temp,
+ doc = elem.ownerDocument,
+ nodeName = elem.nodeName,
+ display = defaultDisplayMap[ nodeName ];
+
+ if ( display ) {
+ return display;
+ }
+
+ temp = doc.body.appendChild( doc.createElement( nodeName ) );
+ display = jQuery.css( temp, "display" );
+
+ temp.parentNode.removeChild( temp );
+
+ if ( display === "none" ) {
+ display = "block";
+ }
+ defaultDisplayMap[ nodeName ] = display;
+
+ return display;
+}
+
+function showHide( elements, show ) {
+ var display, elem,
+ values = [],
+ index = 0,
+ length = elements.length;
+
+ // Determine new display value for elements that need to change
+ for ( ; index < length; index++ ) {
+ elem = elements[ index ];
+ if ( !elem.style ) {
+ continue;
+ }
+
+ display = elem.style.display;
+ if ( show ) {
+
+ // Since we force visibility upon cascade-hidden elements, an immediate (and slow)
+ // check is required in this first loop unless we have a nonempty display value (either
+ // inline or about-to-be-restored)
+ if ( display === "none" ) {
+ values[ index ] = dataPriv.get( elem, "display" ) || null;
+ if ( !values[ index ] ) {
+ elem.style.display = "";
+ }
+ }
+ if ( elem.style.display === "" && isHiddenWithinTree( elem ) ) {
+ values[ index ] = getDefaultDisplay( elem );
+ }
+ } else {
+ if ( display !== "none" ) {
+ values[ index ] = "none";
+
+ // Remember what we're overwriting
+ dataPriv.set( elem, "display", display );
+ }
+ }
+ }
+
+ // Set the display of the elements in a second loop to avoid constant reflow
+ for ( index = 0; index < length; index++ ) {
+ if ( values[ index ] != null ) {
+ elements[ index ].style.display = values[ index ];
+ }
+ }
+
+ return elements;
+}
+
+jQuery.fn.extend( {
+ show: function() {
+ return showHide( this, true );
+ },
+ hide: function() {
+ return showHide( this );
+ },
+ toggle: function( state ) {
+ if ( typeof state === "boolean" ) {
+ return state ? this.show() : this.hide();
+ }
+
+ return this.each( function() {
+ if ( isHiddenWithinTree( this ) ) {
+ jQuery( this ).show();
+ } else {
+ jQuery( this ).hide();
+ }
+ } );
+ }
+} );
+var rcheckableType = ( /^(?:checkbox|radio)$/i );
+
+var rtagName = ( /<([a-z][^\/\0>\x20\t\r\n\f]*)/i );
+
+var rscriptType = ( /^$|^module$|\/(?:java|ecma)script/i );
+
+
+
+// We have to close these tags to support XHTML (#13200)
+var wrapMap = {
+
+ // Support: IE <=9 only
+ option: [ 1, "", " " ],
+
+ // XHTML parsers do not magically insert elements in the
+ // same way that tag soup parsers do. So we cannot shorten
+ // this by omitting or other required elements.
+ thead: [ 1, "" ],
+ col: [ 2, "" ],
+ tr: [ 2, "" ],
+ td: [ 3, "" ],
+
+ _default: [ 0, "", "" ]
+};
+
+// Support: IE <=9 only
+wrapMap.optgroup = wrapMap.option;
+
+wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead;
+wrapMap.th = wrapMap.td;
+
+
+function getAll( context, tag ) {
+
+ // Support: IE <=9 - 11 only
+ // Use typeof to avoid zero-argument method invocation on host objects (#15151)
+ var ret;
+
+ if ( typeof context.getElementsByTagName !== "undefined" ) {
+ ret = context.getElementsByTagName( tag || "*" );
+
+ } else if ( typeof context.querySelectorAll !== "undefined" ) {
+ ret = context.querySelectorAll( tag || "*" );
+
+ } else {
+ ret = [];
+ }
+
+ if ( tag === undefined || tag && nodeName( context, tag ) ) {
+ return jQuery.merge( [ context ], ret );
+ }
+
+ return ret;
+}
+
+
+// Mark scripts as having already been evaluated
+function setGlobalEval( elems, refElements ) {
+ var i = 0,
+ l = elems.length;
+
+ for ( ; i < l; i++ ) {
+ dataPriv.set(
+ elems[ i ],
+ "globalEval",
+ !refElements || dataPriv.get( refElements[ i ], "globalEval" )
+ );
+ }
+}
+
+
+var rhtml = /<|?\w+;/;
+
+function buildFragment( elems, context, scripts, selection, ignored ) {
+ var elem, tmp, tag, wrap, attached, j,
+ fragment = context.createDocumentFragment(),
+ nodes = [],
+ i = 0,
+ l = elems.length;
+
+ for ( ; i < l; i++ ) {
+ elem = elems[ i ];
+
+ if ( elem || elem === 0 ) {
+
+ // Add nodes directly
+ if ( toType( elem ) === "object" ) {
+
+ // Support: Android <=4.0 only, PhantomJS 1 only
+ // push.apply(_, arraylike) throws on ancient WebKit
+ jQuery.merge( nodes, elem.nodeType ? [ elem ] : elem );
+
+ // Convert non-html into a text node
+ } else if ( !rhtml.test( elem ) ) {
+ nodes.push( context.createTextNode( elem ) );
+
+ // Convert html into DOM nodes
+ } else {
+ tmp = tmp || fragment.appendChild( context.createElement( "div" ) );
+
+ // Deserialize a standard representation
+ tag = ( rtagName.exec( elem ) || [ "", "" ] )[ 1 ].toLowerCase();
+ wrap = wrapMap[ tag ] || wrapMap._default;
+ tmp.innerHTML = wrap[ 1 ] + jQuery.htmlPrefilter( elem ) + wrap[ 2 ];
+
+ // Descend through wrappers to the right content
+ j = wrap[ 0 ];
+ while ( j-- ) {
+ tmp = tmp.lastChild;
+ }
+
+ // Support: Android <=4.0 only, PhantomJS 1 only
+ // push.apply(_, arraylike) throws on ancient WebKit
+ jQuery.merge( nodes, tmp.childNodes );
+
+ // Remember the top-level container
+ tmp = fragment.firstChild;
+
+ // Ensure the created nodes are orphaned (#12392)
+ tmp.textContent = "";
+ }
+ }
+ }
+
+ // Remove wrapper from fragment
+ fragment.textContent = "";
+
+ i = 0;
+ while ( ( elem = nodes[ i++ ] ) ) {
+
+ // Skip elements already in the context collection (trac-4087)
+ if ( selection && jQuery.inArray( elem, selection ) > -1 ) {
+ if ( ignored ) {
+ ignored.push( elem );
+ }
+ continue;
+ }
+
+ attached = isAttached( elem );
+
+ // Append to fragment
+ tmp = getAll( fragment.appendChild( elem ), "script" );
+
+ // Preserve script evaluation history
+ if ( attached ) {
+ setGlobalEval( tmp );
+ }
+
+ // Capture executables
+ if ( scripts ) {
+ j = 0;
+ while ( ( elem = tmp[ j++ ] ) ) {
+ if ( rscriptType.test( elem.type || "" ) ) {
+ scripts.push( elem );
+ }
+ }
+ }
+ }
+
+ return fragment;
+}
+
+
+( function() {
+ var fragment = document.createDocumentFragment(),
+ div = fragment.appendChild( document.createElement( "div" ) ),
+ input = document.createElement( "input" );
+
+ // Support: Android 4.0 - 4.3 only
+ // Check state lost if the name is set (#11217)
+ // Support: Windows Web Apps (WWA)
+ // `name` and `type` must use .setAttribute for WWA (#14901)
+ input.setAttribute( "type", "radio" );
+ input.setAttribute( "checked", "checked" );
+ input.setAttribute( "name", "t" );
+
+ div.appendChild( input );
+
+ // Support: Android <=4.1 only
+ // Older WebKit doesn't clone checked state correctly in fragments
+ support.checkClone = div.cloneNode( true ).cloneNode( true ).lastChild.checked;
+
+ // Support: IE <=11 only
+ // Make sure textarea (and checkbox) defaultValue is properly cloned
+ div.innerHTML = "";
+ support.noCloneChecked = !!div.cloneNode( true ).lastChild.defaultValue;
+} )();
+
+
+var
+ rkeyEvent = /^key/,
+ rmouseEvent = /^(?:mouse|pointer|contextmenu|drag|drop)|click/,
+ rtypenamespace = /^([^.]*)(?:\.(.+)|)/;
+
+function returnTrue() {
+ return true;
+}
+
+function returnFalse() {
+ return false;
+}
+
+// Support: IE <=9 - 11+
+// focus() and blur() are asynchronous, except when they are no-op.
+// So expect focus to be synchronous when the element is already active,
+// and blur to be synchronous when the element is not already active.
+// (focus and blur are always synchronous in other supported browsers,
+// this just defines when we can count on it).
+function expectSync( elem, type ) {
+ return ( elem === safeActiveElement() ) === ( type === "focus" );
+}
+
+// Support: IE <=9 only
+// Accessing document.activeElement can throw unexpectedly
+// https://bugs.jquery.com/ticket/13393
+function safeActiveElement() {
+ try {
+ return document.activeElement;
+ } catch ( err ) { }
+}
+
+function on( elem, types, selector, data, fn, one ) {
+ var origFn, type;
+
+ // Types can be a map of types/handlers
+ if ( typeof types === "object" ) {
+
+ // ( types-Object, selector, data )
+ if ( typeof selector !== "string" ) {
+
+ // ( types-Object, data )
+ data = data || selector;
+ selector = undefined;
+ }
+ for ( type in types ) {
+ on( elem, type, selector, data, types[ type ], one );
+ }
+ return elem;
+ }
+
+ if ( data == null && fn == null ) {
+
+ // ( types, fn )
+ fn = selector;
+ data = selector = undefined;
+ } else if ( fn == null ) {
+ if ( typeof selector === "string" ) {
+
+ // ( types, selector, fn )
+ fn = data;
+ data = undefined;
+ } else {
+
+ // ( types, data, fn )
+ fn = data;
+ data = selector;
+ selector = undefined;
+ }
+ }
+ if ( fn === false ) {
+ fn = returnFalse;
+ } else if ( !fn ) {
+ return elem;
+ }
+
+ if ( one === 1 ) {
+ origFn = fn;
+ fn = function( event ) {
+
+ // Can use an empty set, since event contains the info
+ jQuery().off( event );
+ return origFn.apply( this, arguments );
+ };
+
+ // Use same guid so caller can remove using origFn
+ fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ );
+ }
+ return elem.each( function() {
+ jQuery.event.add( this, types, fn, data, selector );
+ } );
+}
+
+/*
+ * Helper functions for managing events -- not part of the public interface.
+ * Props to Dean Edwards' addEvent library for many of the ideas.
+ */
+jQuery.event = {
+
+ global: {},
+
+ add: function( elem, types, handler, data, selector ) {
+
+ var handleObjIn, eventHandle, tmp,
+ events, t, handleObj,
+ special, handlers, type, namespaces, origType,
+ elemData = dataPriv.get( elem );
+
+ // Don't attach events to noData or text/comment nodes (but allow plain objects)
+ if ( !elemData ) {
+ return;
+ }
+
+ // Caller can pass in an object of custom data in lieu of the handler
+ if ( handler.handler ) {
+ handleObjIn = handler;
+ handler = handleObjIn.handler;
+ selector = handleObjIn.selector;
+ }
+
+ // Ensure that invalid selectors throw exceptions at attach time
+ // Evaluate against documentElement in case elem is a non-element node (e.g., document)
+ if ( selector ) {
+ jQuery.find.matchesSelector( documentElement, selector );
+ }
+
+ // Make sure that the handler has a unique ID, used to find/remove it later
+ if ( !handler.guid ) {
+ handler.guid = jQuery.guid++;
+ }
+
+ // Init the element's event structure and main handler, if this is the first
+ if ( !( events = elemData.events ) ) {
+ events = elemData.events = {};
+ }
+ if ( !( eventHandle = elemData.handle ) ) {
+ eventHandle = elemData.handle = function( e ) {
+
+ // Discard the second event of a jQuery.event.trigger() and
+ // when an event is called after a page has unloaded
+ return typeof jQuery !== "undefined" && jQuery.event.triggered !== e.type ?
+ jQuery.event.dispatch.apply( elem, arguments ) : undefined;
+ };
+ }
+
+ // Handle multiple events separated by a space
+ types = ( types || "" ).match( rnothtmlwhite ) || [ "" ];
+ t = types.length;
+ while ( t-- ) {
+ tmp = rtypenamespace.exec( types[ t ] ) || [];
+ type = origType = tmp[ 1 ];
+ namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort();
+
+ // There *must* be a type, no attaching namespace-only handlers
+ if ( !type ) {
+ continue;
+ }
+
+ // If event changes its type, use the special event handlers for the changed type
+ special = jQuery.event.special[ type ] || {};
+
+ // If selector defined, determine special event api type, otherwise given type
+ type = ( selector ? special.delegateType : special.bindType ) || type;
+
+ // Update special based on newly reset type
+ special = jQuery.event.special[ type ] || {};
+
+ // handleObj is passed to all event handlers
+ handleObj = jQuery.extend( {
+ type: type,
+ origType: origType,
+ data: data,
+ handler: handler,
+ guid: handler.guid,
+ selector: selector,
+ needsContext: selector && jQuery.expr.match.needsContext.test( selector ),
+ namespace: namespaces.join( "." )
+ }, handleObjIn );
+
+ // Init the event handler queue if we're the first
+ if ( !( handlers = events[ type ] ) ) {
+ handlers = events[ type ] = [];
+ handlers.delegateCount = 0;
+
+ // Only use addEventListener if the special events handler returns false
+ if ( !special.setup ||
+ special.setup.call( elem, data, namespaces, eventHandle ) === false ) {
+
+ if ( elem.addEventListener ) {
+ elem.addEventListener( type, eventHandle );
+ }
+ }
+ }
+
+ if ( special.add ) {
+ special.add.call( elem, handleObj );
+
+ if ( !handleObj.handler.guid ) {
+ handleObj.handler.guid = handler.guid;
+ }
+ }
+
+ // Add to the element's handler list, delegates in front
+ if ( selector ) {
+ handlers.splice( handlers.delegateCount++, 0, handleObj );
+ } else {
+ handlers.push( handleObj );
+ }
+
+ // Keep track of which events have ever been used, for event optimization
+ jQuery.event.global[ type ] = true;
+ }
+
+ },
+
+ // Detach an event or set of events from an element
+ remove: function( elem, types, handler, selector, mappedTypes ) {
+
+ var j, origCount, tmp,
+ events, t, handleObj,
+ special, handlers, type, namespaces, origType,
+ elemData = dataPriv.hasData( elem ) && dataPriv.get( elem );
+
+ if ( !elemData || !( events = elemData.events ) ) {
+ return;
+ }
+
+ // Once for each type.namespace in types; type may be omitted
+ types = ( types || "" ).match( rnothtmlwhite ) || [ "" ];
+ t = types.length;
+ while ( t-- ) {
+ tmp = rtypenamespace.exec( types[ t ] ) || [];
+ type = origType = tmp[ 1 ];
+ namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort();
+
+ // Unbind all events (on this namespace, if provided) for the element
+ if ( !type ) {
+ for ( type in events ) {
+ jQuery.event.remove( elem, type + types[ t ], handler, selector, true );
+ }
+ continue;
+ }
+
+ special = jQuery.event.special[ type ] || {};
+ type = ( selector ? special.delegateType : special.bindType ) || type;
+ handlers = events[ type ] || [];
+ tmp = tmp[ 2 ] &&
+ new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" );
+
+ // Remove matching events
+ origCount = j = handlers.length;
+ while ( j-- ) {
+ handleObj = handlers[ j ];
+
+ if ( ( mappedTypes || origType === handleObj.origType ) &&
+ ( !handler || handler.guid === handleObj.guid ) &&
+ ( !tmp || tmp.test( handleObj.namespace ) ) &&
+ ( !selector || selector === handleObj.selector ||
+ selector === "**" && handleObj.selector ) ) {
+ handlers.splice( j, 1 );
+
+ if ( handleObj.selector ) {
+ handlers.delegateCount--;
+ }
+ if ( special.remove ) {
+ special.remove.call( elem, handleObj );
+ }
+ }
+ }
+
+ // Remove generic event handler if we removed something and no more handlers exist
+ // (avoids potential for endless recursion during removal of special event handlers)
+ if ( origCount && !handlers.length ) {
+ if ( !special.teardown ||
+ special.teardown.call( elem, namespaces, elemData.handle ) === false ) {
+
+ jQuery.removeEvent( elem, type, elemData.handle );
+ }
+
+ delete events[ type ];
+ }
+ }
+
+ // Remove data and the expando if it's no longer used
+ if ( jQuery.isEmptyObject( events ) ) {
+ dataPriv.remove( elem, "handle events" );
+ }
+ },
+
+ dispatch: function( nativeEvent ) {
+
+ // Make a writable jQuery.Event from the native event object
+ var event = jQuery.event.fix( nativeEvent );
+
+ var i, j, ret, matched, handleObj, handlerQueue,
+ args = new Array( arguments.length ),
+ handlers = ( dataPriv.get( this, "events" ) || {} )[ event.type ] || [],
+ special = jQuery.event.special[ event.type ] || {};
+
+ // Use the fix-ed jQuery.Event rather than the (read-only) native event
+ args[ 0 ] = event;
+
+ for ( i = 1; i < arguments.length; i++ ) {
+ args[ i ] = arguments[ i ];
+ }
+
+ event.delegateTarget = this;
+
+ // Call the preDispatch hook for the mapped type, and let it bail if desired
+ if ( special.preDispatch && special.preDispatch.call( this, event ) === false ) {
+ return;
+ }
+
+ // Determine handlers
+ handlerQueue = jQuery.event.handlers.call( this, event, handlers );
+
+ // Run delegates first; they may want to stop propagation beneath us
+ i = 0;
+ while ( ( matched = handlerQueue[ i++ ] ) && !event.isPropagationStopped() ) {
+ event.currentTarget = matched.elem;
+
+ j = 0;
+ while ( ( handleObj = matched.handlers[ j++ ] ) &&
+ !event.isImmediatePropagationStopped() ) {
+
+ // If the event is namespaced, then each handler is only invoked if it is
+ // specially universal or its namespaces are a superset of the event's.
+ if ( !event.rnamespace || handleObj.namespace === false ||
+ event.rnamespace.test( handleObj.namespace ) ) {
+
+ event.handleObj = handleObj;
+ event.data = handleObj.data;
+
+ ret = ( ( jQuery.event.special[ handleObj.origType ] || {} ).handle ||
+ handleObj.handler ).apply( matched.elem, args );
+
+ if ( ret !== undefined ) {
+ if ( ( event.result = ret ) === false ) {
+ event.preventDefault();
+ event.stopPropagation();
+ }
+ }
+ }
+ }
+ }
+
+ // Call the postDispatch hook for the mapped type
+ if ( special.postDispatch ) {
+ special.postDispatch.call( this, event );
+ }
+
+ return event.result;
+ },
+
+ handlers: function( event, handlers ) {
+ var i, handleObj, sel, matchedHandlers, matchedSelectors,
+ handlerQueue = [],
+ delegateCount = handlers.delegateCount,
+ cur = event.target;
+
+ // Find delegate handlers
+ if ( delegateCount &&
+
+ // Support: IE <=9
+ // Black-hole SVG instance trees (trac-13180)
+ cur.nodeType &&
+
+ // Support: Firefox <=42
+ // Suppress spec-violating clicks indicating a non-primary pointer button (trac-3861)
+ // https://www.w3.org/TR/DOM-Level-3-Events/#event-type-click
+ // Support: IE 11 only
+ // ...but not arrow key "clicks" of radio inputs, which can have `button` -1 (gh-2343)
+ !( event.type === "click" && event.button >= 1 ) ) {
+
+ for ( ; cur !== this; cur = cur.parentNode || this ) {
+
+ // Don't check non-elements (#13208)
+ // Don't process clicks on disabled elements (#6911, #8165, #11382, #11764)
+ if ( cur.nodeType === 1 && !( event.type === "click" && cur.disabled === true ) ) {
+ matchedHandlers = [];
+ matchedSelectors = {};
+ for ( i = 0; i < delegateCount; i++ ) {
+ handleObj = handlers[ i ];
+
+ // Don't conflict with Object.prototype properties (#13203)
+ sel = handleObj.selector + " ";
+
+ if ( matchedSelectors[ sel ] === undefined ) {
+ matchedSelectors[ sel ] = handleObj.needsContext ?
+ jQuery( sel, this ).index( cur ) > -1 :
+ jQuery.find( sel, this, null, [ cur ] ).length;
+ }
+ if ( matchedSelectors[ sel ] ) {
+ matchedHandlers.push( handleObj );
+ }
+ }
+ if ( matchedHandlers.length ) {
+ handlerQueue.push( { elem: cur, handlers: matchedHandlers } );
+ }
+ }
+ }
+ }
+
+ // Add the remaining (directly-bound) handlers
+ cur = this;
+ if ( delegateCount < handlers.length ) {
+ handlerQueue.push( { elem: cur, handlers: handlers.slice( delegateCount ) } );
+ }
+
+ return handlerQueue;
+ },
+
+ addProp: function( name, hook ) {
+ Object.defineProperty( jQuery.Event.prototype, name, {
+ enumerable: true,
+ configurable: true,
+
+ get: isFunction( hook ) ?
+ function() {
+ if ( this.originalEvent ) {
+ return hook( this.originalEvent );
+ }
+ } :
+ function() {
+ if ( this.originalEvent ) {
+ return this.originalEvent[ name ];
+ }
+ },
+
+ set: function( value ) {
+ Object.defineProperty( this, name, {
+ enumerable: true,
+ configurable: true,
+ writable: true,
+ value: value
+ } );
+ }
+ } );
+ },
+
+ fix: function( originalEvent ) {
+ return originalEvent[ jQuery.expando ] ?
+ originalEvent :
+ new jQuery.Event( originalEvent );
+ },
+
+ special: {
+ load: {
+
+ // Prevent triggered image.load events from bubbling to window.load
+ noBubble: true
+ },
+ click: {
+
+ // Utilize native event to ensure correct state for checkable inputs
+ setup: function( data ) {
+
+ // For mutual compressibility with _default, replace `this` access with a local var.
+ // `|| data` is dead code meant only to preserve the variable through minification.
+ var el = this || data;
+
+ // Claim the first handler
+ if ( rcheckableType.test( el.type ) &&
+ el.click && nodeName( el, "input" ) ) {
+
+ // dataPriv.set( el, "click", ... )
+ leverageNative( el, "click", returnTrue );
+ }
+
+ // Return false to allow normal processing in the caller
+ return false;
+ },
+ trigger: function( data ) {
+
+ // For mutual compressibility with _default, replace `this` access with a local var.
+ // `|| data` is dead code meant only to preserve the variable through minification.
+ var el = this || data;
+
+ // Force setup before triggering a click
+ if ( rcheckableType.test( el.type ) &&
+ el.click && nodeName( el, "input" ) ) {
+
+ leverageNative( el, "click" );
+ }
+
+ // Return non-false to allow normal event-path propagation
+ return true;
+ },
+
+ // For cross-browser consistency, suppress native .click() on links
+ // Also prevent it if we're currently inside a leveraged native-event stack
+ _default: function( event ) {
+ var target = event.target;
+ return rcheckableType.test( target.type ) &&
+ target.click && nodeName( target, "input" ) &&
+ dataPriv.get( target, "click" ) ||
+ nodeName( target, "a" );
+ }
+ },
+
+ beforeunload: {
+ postDispatch: function( event ) {
+
+ // Support: Firefox 20+
+ // Firefox doesn't alert if the returnValue field is not set.
+ if ( event.result !== undefined && event.originalEvent ) {
+ event.originalEvent.returnValue = event.result;
+ }
+ }
+ }
+ }
+};
+
+// Ensure the presence of an event listener that handles manually-triggered
+// synthetic events by interrupting progress until reinvoked in response to
+// *native* events that it fires directly, ensuring that state changes have
+// already occurred before other listeners are invoked.
+function leverageNative( el, type, expectSync ) {
+
+ // Missing expectSync indicates a trigger call, which must force setup through jQuery.event.add
+ if ( !expectSync ) {
+ if ( dataPriv.get( el, type ) === undefined ) {
+ jQuery.event.add( el, type, returnTrue );
+ }
+ return;
+ }
+
+ // Register the controller as a special universal handler for all event namespaces
+ dataPriv.set( el, type, false );
+ jQuery.event.add( el, type, {
+ namespace: false,
+ handler: function( event ) {
+ var notAsync, result,
+ saved = dataPriv.get( this, type );
+
+ if ( ( event.isTrigger & 1 ) && this[ type ] ) {
+
+ // Interrupt processing of the outer synthetic .trigger()ed event
+ // Saved data should be false in such cases, but might be a leftover capture object
+ // from an async native handler (gh-4350)
+ if ( !saved.length ) {
+
+ // Store arguments for use when handling the inner native event
+ // There will always be at least one argument (an event object), so this array
+ // will not be confused with a leftover capture object.
+ saved = slice.call( arguments );
+ dataPriv.set( this, type, saved );
+
+ // Trigger the native event and capture its result
+ // Support: IE <=9 - 11+
+ // focus() and blur() are asynchronous
+ notAsync = expectSync( this, type );
+ this[ type ]();
+ result = dataPriv.get( this, type );
+ if ( saved !== result || notAsync ) {
+ dataPriv.set( this, type, false );
+ } else {
+ result = {};
+ }
+ if ( saved !== result ) {
+
+ // Cancel the outer synthetic event
+ event.stopImmediatePropagation();
+ event.preventDefault();
+ return result.value;
+ }
+
+ // If this is an inner synthetic event for an event with a bubbling surrogate
+ // (focus or blur), assume that the surrogate already propagated from triggering the
+ // native event and prevent that from happening again here.
+ // This technically gets the ordering wrong w.r.t. to `.trigger()` (in which the
+ // bubbling surrogate propagates *after* the non-bubbling base), but that seems
+ // less bad than duplication.
+ } else if ( ( jQuery.event.special[ type ] || {} ).delegateType ) {
+ event.stopPropagation();
+ }
+
+ // If this is a native event triggered above, everything is now in order
+ // Fire an inner synthetic event with the original arguments
+ } else if ( saved.length ) {
+
+ // ...and capture the result
+ dataPriv.set( this, type, {
+ value: jQuery.event.trigger(
+
+ // Support: IE <=9 - 11+
+ // Extend with the prototype to reset the above stopImmediatePropagation()
+ jQuery.extend( saved[ 0 ], jQuery.Event.prototype ),
+ saved.slice( 1 ),
+ this
+ )
+ } );
+
+ // Abort handling of the native event
+ event.stopImmediatePropagation();
+ }
+ }
+ } );
+}
+
+jQuery.removeEvent = function( elem, type, handle ) {
+
+ // This "if" is needed for plain objects
+ if ( elem.removeEventListener ) {
+ elem.removeEventListener( type, handle );
+ }
+};
+
+jQuery.Event = function( src, props ) {
+
+ // Allow instantiation without the 'new' keyword
+ if ( !( this instanceof jQuery.Event ) ) {
+ return new jQuery.Event( src, props );
+ }
+
+ // Event object
+ if ( src && src.type ) {
+ this.originalEvent = src;
+ this.type = src.type;
+
+ // Events bubbling up the document may have been marked as prevented
+ // by a handler lower down the tree; reflect the correct value.
+ this.isDefaultPrevented = src.defaultPrevented ||
+ src.defaultPrevented === undefined &&
+
+ // Support: Android <=2.3 only
+ src.returnValue === false ?
+ returnTrue :
+ returnFalse;
+
+ // Create target properties
+ // Support: Safari <=6 - 7 only
+ // Target should not be a text node (#504, #13143)
+ this.target = ( src.target && src.target.nodeType === 3 ) ?
+ src.target.parentNode :
+ src.target;
+
+ this.currentTarget = src.currentTarget;
+ this.relatedTarget = src.relatedTarget;
+
+ // Event type
+ } else {
+ this.type = src;
+ }
+
+ // Put explicitly provided properties onto the event object
+ if ( props ) {
+ jQuery.extend( this, props );
+ }
+
+ // Create a timestamp if incoming event doesn't have one
+ this.timeStamp = src && src.timeStamp || Date.now();
+
+ // Mark it as fixed
+ this[ jQuery.expando ] = true;
+};
+
+// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding
+// https://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html
+jQuery.Event.prototype = {
+ constructor: jQuery.Event,
+ isDefaultPrevented: returnFalse,
+ isPropagationStopped: returnFalse,
+ isImmediatePropagationStopped: returnFalse,
+ isSimulated: false,
+
+ preventDefault: function() {
+ var e = this.originalEvent;
+
+ this.isDefaultPrevented = returnTrue;
+
+ if ( e && !this.isSimulated ) {
+ e.preventDefault();
+ }
+ },
+ stopPropagation: function() {
+ var e = this.originalEvent;
+
+ this.isPropagationStopped = returnTrue;
+
+ if ( e && !this.isSimulated ) {
+ e.stopPropagation();
+ }
+ },
+ stopImmediatePropagation: function() {
+ var e = this.originalEvent;
+
+ this.isImmediatePropagationStopped = returnTrue;
+
+ if ( e && !this.isSimulated ) {
+ e.stopImmediatePropagation();
+ }
+
+ this.stopPropagation();
+ }
+};
+
+// Includes all common event props including KeyEvent and MouseEvent specific props
+jQuery.each( {
+ altKey: true,
+ bubbles: true,
+ cancelable: true,
+ changedTouches: true,
+ ctrlKey: true,
+ detail: true,
+ eventPhase: true,
+ metaKey: true,
+ pageX: true,
+ pageY: true,
+ shiftKey: true,
+ view: true,
+ "char": true,
+ code: true,
+ charCode: true,
+ key: true,
+ keyCode: true,
+ button: true,
+ buttons: true,
+ clientX: true,
+ clientY: true,
+ offsetX: true,
+ offsetY: true,
+ pointerId: true,
+ pointerType: true,
+ screenX: true,
+ screenY: true,
+ targetTouches: true,
+ toElement: true,
+ touches: true,
+
+ which: function( event ) {
+ var button = event.button;
+
+ // Add which for key events
+ if ( event.which == null && rkeyEvent.test( event.type ) ) {
+ return event.charCode != null ? event.charCode : event.keyCode;
+ }
+
+ // Add which for click: 1 === left; 2 === middle; 3 === right
+ if ( !event.which && button !== undefined && rmouseEvent.test( event.type ) ) {
+ if ( button & 1 ) {
+ return 1;
+ }
+
+ if ( button & 2 ) {
+ return 3;
+ }
+
+ if ( button & 4 ) {
+ return 2;
+ }
+
+ return 0;
+ }
+
+ return event.which;
+ }
+}, jQuery.event.addProp );
+
+jQuery.each( { focus: "focusin", blur: "focusout" }, function( type, delegateType ) {
+ jQuery.event.special[ type ] = {
+
+ // Utilize native event if possible so blur/focus sequence is correct
+ setup: function() {
+
+ // Claim the first handler
+ // dataPriv.set( this, "focus", ... )
+ // dataPriv.set( this, "blur", ... )
+ leverageNative( this, type, expectSync );
+
+ // Return false to allow normal processing in the caller
+ return false;
+ },
+ trigger: function() {
+
+ // Force setup before trigger
+ leverageNative( this, type );
+
+ // Return non-false to allow normal event-path propagation
+ return true;
+ },
+
+ delegateType: delegateType
+ };
+} );
+
+// Create mouseenter/leave events using mouseover/out and event-time checks
+// so that event delegation works in jQuery.
+// Do the same for pointerenter/pointerleave and pointerover/pointerout
+//
+// Support: Safari 7 only
+// Safari sends mouseenter too often; see:
+// https://bugs.chromium.org/p/chromium/issues/detail?id=470258
+// for the description of the bug (it existed in older Chrome versions as well).
+jQuery.each( {
+ mouseenter: "mouseover",
+ mouseleave: "mouseout",
+ pointerenter: "pointerover",
+ pointerleave: "pointerout"
+}, function( orig, fix ) {
+ jQuery.event.special[ orig ] = {
+ delegateType: fix,
+ bindType: fix,
+
+ handle: function( event ) {
+ var ret,
+ target = this,
+ related = event.relatedTarget,
+ handleObj = event.handleObj;
+
+ // For mouseenter/leave call the handler if related is outside the target.
+ // NB: No relatedTarget if the mouse left/entered the browser window
+ if ( !related || ( related !== target && !jQuery.contains( target, related ) ) ) {
+ event.type = handleObj.origType;
+ ret = handleObj.handler.apply( this, arguments );
+ event.type = fix;
+ }
+ return ret;
+ }
+ };
+} );
+
+jQuery.fn.extend( {
+
+ on: function( types, selector, data, fn ) {
+ return on( this, types, selector, data, fn );
+ },
+ one: function( types, selector, data, fn ) {
+ return on( this, types, selector, data, fn, 1 );
+ },
+ off: function( types, selector, fn ) {
+ var handleObj, type;
+ if ( types && types.preventDefault && types.handleObj ) {
+
+ // ( event ) dispatched jQuery.Event
+ handleObj = types.handleObj;
+ jQuery( types.delegateTarget ).off(
+ handleObj.namespace ?
+ handleObj.origType + "." + handleObj.namespace :
+ handleObj.origType,
+ handleObj.selector,
+ handleObj.handler
+ );
+ return this;
+ }
+ if ( typeof types === "object" ) {
+
+ // ( types-object [, selector] )
+ for ( type in types ) {
+ this.off( type, selector, types[ type ] );
+ }
+ return this;
+ }
+ if ( selector === false || typeof selector === "function" ) {
+
+ // ( types [, fn] )
+ fn = selector;
+ selector = undefined;
+ }
+ if ( fn === false ) {
+ fn = returnFalse;
+ }
+ return this.each( function() {
+ jQuery.event.remove( this, types, fn, selector );
+ } );
+ }
+} );
+
+
+var
+
+ /* eslint-disable max-len */
+
+ // See https://github.com/eslint/eslint/issues/3229
+ rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([a-z][^\/\0>\x20\t\r\n\f]*)[^>]*)\/>/gi,
+
+ /* eslint-enable */
+
+ // Support: IE <=10 - 11, Edge 12 - 13 only
+ // In IE/Edge using regex groups here causes severe slowdowns.
+ // See https://connect.microsoft.com/IE/feedback/details/1736512/
+ rnoInnerhtml = /
+
+
@@ -205,13 +218,15 @@
G
get_fit() (tigramite.models.Models method)
-
-
+
get_general_fitted_model() (tigramite.models.Models method)
get_general_prediction() (tigramite.models.Models method)
+
+ get_graph_from_dict() (tigramite.causal_effects.CausalEffects static method)
get_graph_from_links() (tigramite.independence_tests.OracleCI method)
@@ -296,6 +311,8 @@ L
@@ -426,6 +432,8 @@ Q
R
+ remove_missing_upto_maxlag (tigramite.data_processing.DataFrame attribute)
+
return_parents_dict() (tigramite.pcmci.PCMCI method)
return_significant_links() (tigramite.pcmci.PCMCI method)
@@ -498,29 +506,14 @@ T
-
+
+
@@ -111,9 +144,9 @@
TIGRAMITE
tigramite.lpcmci
: LPCMCI
-
+
-class tigramite.lpcmci.
LPCMCI
( dataframe , cond_ind_test , verbosity = 0 ) [source]
+class tigramite.lpcmci.
LPCMCI
( dataframe , cond_ind_test , verbosity=0 ) [source]
LPCMCI is an algorithm for causal discovery in large-scale times series that allows for latent confounders and learns lag-specific
causal relationships.
The algorithm is introduced and explained in:
@@ -1259,9 +1292,9 @@
A note on wildcards: The middle mark wildcard ast and the edge mark wildcard are here represented as * , the edge mark wildcard star as +
-
+
-run_lpcmci
( selected_links = None , tau_min = 0 , tau_max = 1 , pc_alpha = 0.05 , n_preliminary_iterations = 1 , max_cond_px = 0 , max_p_global = numpy.inf , max_p_non_ancestral = numpy.inf , max_q_global = numpy.inf , max_pds_set = numpy.inf , prelim_with_collider_rules = True , parents_of_lagged = True , prelim_only = False , break_once_separated = True , no_non_ancestral_phase = False , use_a_pds_t_for_majority = True , orient_contemp = 1 , update_middle_marks = True , prelim_rules = 1 , fix_all_edges_before_final_orientation = True , auto_first = True , remember_only_parents = True , no_apr = 0 ) [source]
+run_lpcmci
( selected_links=None , tau_min=0 , tau_max=1 , pc_alpha=0.05 , n_preliminary_iterations=1 , max_cond_px=0 , max_p_global=numpy.inf , max_p_non_ancestral=numpy.inf , max_q_global=numpy.inf , max_pds_set=numpy.inf , prelim_with_collider_rules=True , parents_of_lagged=True , prelim_only=False , break_once_separated=True , no_non_ancestral_phase=False , use_a_pds_t_for_majority=True , orient_contemp=1 , update_middle_marks=True , prelim_rules=1 , fix_all_edges_before_final_orientation=True , auto_first=True , remember_only_parents=True , no_apr=0 ) [source]
Run LPCMCI on the dataset and with the conditional independence test passed to the class constructor and with the
options passed to this function.
@@ -1272,9 +1305,9 @@
tigramite.independence_tests
: Conditional independence tests
Base class:
-
+
-class tigramite.independence_tests.
CondIndTest
( seed = 42 , mask_type = None , significance = 'analytic' , fixed_thres = 0.1 , sig_samples = 1000 , sig_blocklength = None , confidence = None , conf_lev = 0.9 , conf_samples = 100 , conf_blocklength = None , recycle_residuals = False , verbosity = 0 ) [source]
+class tigramite.independence_tests.
CondIndTest
( seed=42 , mask_type=None , significance='analytic' , fixed_thres=0.1 , sig_samples=1000 , sig_blocklength=None , confidence=None , conf_lev=0.9 , conf_samples=100 , conf_blocklength=None , recycle_residuals=False , verbosity=0 ) [source]
Base class of conditional independence tests.
Provides useful general functions for different independence tests such as
shuffle significance testing and bootstrap confidence estimation. Also
@@ -1308,23 +1341,23 @@
-
+
-get_analytic_confidence
( value , df , conf_lev ) [source]
+get_analytic_confidence
( value , df , conf_lev ) [source]
Base class assumption that this is not implemented. Concrete classes
should override when possible.
-
+
-get_analytic_significance
( value , T , dim ) [source]
+get_analytic_significance
( value , T , dim ) [source]
Base class assumption that this is not implemented. Concrete classes
should override when possible.
-
+
-get_bootstrap_confidence
( array , xyz , dependence_measure = None , conf_samples = 100 , conf_blocklength = None , conf_lev = 0.95 , verbosity = 0 ) [source]
+get_bootstrap_confidence
( array , xyz , dependence_measure=None , conf_samples=100 , conf_blocklength=None , conf_lev=0.95 , verbosity=0 ) [source]
Perform bootstrap confidence interval estimation.
With conf_blocklength > 1 or None a block-bootstrap is performed.
@@ -1351,9 +1384,9 @@
-
+
-get_confidence
( X , Y , Z = None , tau_max = 0 ) [source]
+get_confidence
( X , Y , Z=None , tau_max=0 ) [source]
Perform confidence interval estimation.
Calls the dependence measure and confidence test functions. The child
classes can specify a function get_dependence_measure and
@@ -1362,11 +1395,7 @@
Parameters
-X (list of tuples ) – X,Y,Z are of the form [(var, -tau)], where var specifies the
-variable index and tau the time lag.
-Y (list of tuples ) – X,Y,Z are of the form [(var, -tau)], where var specifies the
-variable index and tau the time lag.
-Z (list of tuples ) – X,Y,Z are of the form [(var, -tau)], where var specifies the
+
Y , Z (X , ) – X,Y,Z are of the form [(var, -tau)], where var specifies the
variable index and tau the time lag.
tau_max (int , optional ( default: 0 ) ) – Maximum time lag. This may be used to make sure that estimates for
different lags in X, Z, all have the same sample size.
@@ -1381,15 +1410,15 @@
-
+
-abstract get_dependence_measure
( array , xyz ) [source]
+abstract get_dependence_measure
( array , xyz ) [source]
Abstract function that all concrete classes must instantiate.
-
+
-get_fixed_thres_significance
( value , fixed_thres ) [source]
+get_fixed_thres_significance
( value , fixed_thres ) [source]
Returns signficance for thresholding test.
Returns 0 if numpy.abs(value) is smaller than fixed_thres and 1 else.
@@ -1409,20 +1438,16 @@
-
+
-get_measure
( X , Y , Z = None , tau_max = 0 ) [source]
+get_measure
( X , Y , Z=None , tau_max=0 ) [source]
Estimate dependence measure.
Calls the dependence measure function. The child classes must specify
a function get_dependence_measure.
Parameters
-X (list of tuples ) – X,Y,Z are of the form [(var, -tau)], where var specifies the
-variable index and tau the time lag.
-[ (Y ) – X,Y,Z are of the form [(var, -tau)], where var specifies the
-variable index and tau the time lag.
-Z ] (list of tuples ) – X,Y,Z are of the form [(var, -tau)], where var specifies the
+
Y [ , Z ] (X , ) – X,Y,Z are of the form [(var, -tau)], where var specifies the
variable index and tau the time lag.
tau_max (int , optional ( default: 0 ) ) – Maximum time lag. This may be used to make sure that estimates for
different lags in X, Z, all have the same sample size.
@@ -1437,23 +1462,23 @@
-
+
-get_model_selection_criterion
( j , parents , tau_max = 0 ) [source]
+get_model_selection_criterion
( j , parents , tau_max=0 ) [source]
Base class assumption that this is not implemented. Concrete classes
should override when possible.
-
+
-get_shuffle_significance
( array , xyz , value , return_null_dist = False ) [source]
+get_shuffle_significance
( array , xyz , value , return_null_dist=False ) [source]
Base class assumption that this is not implemented. Concrete classes
should override when possible.
-
+
-get_significance
( val , array , xyz , T , dim , sig_override = None ) [source]
+get_significance
( val , array , xyz , T , dim , sig_override=None ) [source]
Returns the p-value from whichever significance function is specified
for this test. If an override is used, then it will call a different
function then specified by self.significance
@@ -1477,21 +1502,21 @@
-
+
abstract property measure
Abstract property to store the type of independence test.
-
+
print_info
( ) [source]
Print information about the conditional independence test parameters
-
+
-run_test
( X , Y , Z = None , tau_max = 0 , cut_off = '2xtau_max' ) [source]
+run_test
( X , Y , Z=None , tau_max=0 , cut_off='2xtau_max' ) [source]
Perform conditional independence test.
Calls the dependence measure and signficicance test functions. The child
classes must specify a function get_dependence_measure and either or
@@ -1501,11 +1526,7 @@
Parameters
-X (list of tuples ) – X,Y,Z are of the form [(var, -tau)], where var specifies the
-variable index and tau the time lag.
-Y (list of tuples ) – X,Y,Z are of the form [(var, -tau)], where var specifies the
-variable index and tau the time lag.
-Z (list of tuples ) – X,Y,Z are of the form [(var, -tau)], where var specifies the
+
Y , Z (X , ) – X,Y,Z are of the form [(var, -tau)], where var specifies the
variable index and tau the time lag.
tau_max (int , optional ( default: 0 ) ) – Maximum time lag. This may be used to make sure that estimates for
different lags in X, Z, all have the same sample size.
@@ -1526,20 +1547,16 @@
-
+
-run_test_raw
( x , y , z = None ) [source]
+run_test_raw
( x , y , z=None ) [source]
Perform conditional independence test directly on input arrays x, y, z.
Calls the dependence measure and signficicance test functions. The child
classes must specify a function get_dependence_measure and either or
both functions get_analytic_significance and get_shuffle_significance.
Parameters
-
-x (arrays ) – x,y,z are of the form (samples, dimension).
-y (arrays ) – x,y,z are of the form (samples, dimension).
-z (arrays ) – x,y,z are of the form (samples, dimension).
-
+y , z (x , ) – x,y,z are of the form (samples, dimension).
Returns
val, pval – The test statistic value and the p-value.
@@ -1550,9 +1567,9 @@
-
+
-set_dataframe
( dataframe ) [source]
+set_dataframe
( dataframe ) [source]
Initialize and check the dataframe.
Parameters
@@ -1564,9 +1581,9 @@
-
+
-set_mask_type
( mask_type ) [source]
+set_mask_type
( mask_type ) [source]
Setter for mask type to ensure that this option does not clash with
recycle_residuals.
@@ -1582,9 +1599,9 @@
Test statistics:
-
+
-class tigramite.independence_tests.
ParCorr
( ** kwargs ) [source]
+class tigramite.independence_tests.
ParCorr
( **kwargs ) [source]
Partial correlation test.
Partial correlation is estimated through linear ordinary least squares (OLS)
regression and a test for non-zero linear Pearson correlation on the
@@ -1606,9 +1623,9 @@
**kwargs – Arguments passed on to Parent class CondIndTest.
-
+
-get_analytic_confidence
( value , df , conf_lev ) [source]
+get_analytic_confidence
( value , df , conf_lev ) [source]
Returns analytic confidence interval for correlation coefficient.
Based on Student’s t-distribution.
@@ -1628,9 +1645,9 @@
-
+
-get_analytic_significance
( value , T , dim ) [source]
+get_analytic_significance
( value , T , dim ) [source]
Returns analytic p-value from Student’s t-test for the Pearson
correlation coefficient.
Assumes two-sided correlation. If the degrees of freedom are less than
@@ -1652,9 +1669,9 @@
-
+
-get_dependence_measure
( array , xyz ) [source]
+get_dependence_measure
( array , xyz ) [source]
Return partial correlation.
Estimated as the Pearson correlation of the residuals of a linear
OLS regression.
@@ -1674,9 +1691,9 @@
-
+
-get_model_selection_criterion
( j , parents , tau_max = 0 , corrected_aic = False ) [source]
+get_model_selection_criterion
( j , parents , tau_max=0 , corrected_aic=False ) [source]
Returns Akaike’s Information criterion modulo constants.
Fits a linear model of the parents to variable j and returns the
score. Leave-one-out cross-validation is asymptotically equivalent to
@@ -1696,9 +1713,9 @@
-
+
-get_shuffle_significance
( array , xyz , value , return_null_dist = False ) [source]
+get_shuffle_significance
( array , xyz , value , return_null_dist=False ) [source]
Returns p-value for shuffle significance test.
For residual-based test statistics only the residuals are shuffled.
@@ -1718,7 +1735,7 @@
-
+
property measure
Concrete property to return the measure of the independence test
@@ -1726,9 +1743,9 @@
-
+
-class tigramite.independence_tests.
GPDC
( null_dist_filename = None , gp_params = None , ** kwargs ) [source]
+class tigramite.independence_tests.
GPDC
( null_dist_filename=None , gp_params=None , **kwargs ) [source]
GPDC conditional independence test based on Gaussian processes and distance correlation.
GPDC is based on a Gaussian process (GP) regression and a distance
correlation test on the residuals . GP is estimated with scikit-learn
@@ -1771,9 +1788,9 @@
-
+
-generate_and_save_nulldists
( sample_sizes , null_dist_filename ) [source]
+generate_and_save_nulldists
( sample_sizes , null_dist_filename ) [source]
Generates and saves null distribution for pairwise independence
tests.
Generates the null distribution for different sample sizes. Calls
@@ -1790,9 +1807,9 @@
-
+
-generate_nulldist
( df , add_to_null_dists = True ) [source]
+generate_nulldist
( df , add_to_null_dists=True ) [source]
Generates null distribution for pairwise independence tests.
Generates the null distribution for sample size df. Assumes pairwise
samples transformed to uniform marginals. Uses get_dependence_measure
@@ -1815,9 +1832,9 @@
-
+
-get_analytic_significance
( value , T , dim ) [source]
+get_analytic_significance
( value , T , dim ) [source]
Returns p-value for the distance correlation coefficient.
The null distribution for necessary degrees of freedom (df) is loaded.
If not available, the null distribution is generated with the function
@@ -1843,9 +1860,9 @@
-
+
-get_dependence_measure
( array , xyz ) [source]
+get_dependence_measure
( array , xyz ) [source]
Return GPDC measure.
Estimated as the distance correlation of the residuals of a GP
regression.
@@ -1865,9 +1882,9 @@
-
+
-get_model_selection_criterion
( j , parents , tau_max = 0 ) [source]
+get_model_selection_criterion
( j , parents , tau_max=0 ) [source]
Returns log marginal likelihood for GP regression.
Fits a GP model of the parents to variable j and returns the negative
log marginal likelihood as a model selection score. Is used to determine
@@ -1886,9 +1903,9 @@
-
+
-get_shuffle_significance
( array , xyz , value , return_null_dist = False ) [source]
+get_shuffle_significance
( array , xyz , value , return_null_dist=False ) [source]
Returns p-value for shuffle significance test.
For residual-based test statistics only the residuals are shuffled.
@@ -1908,7 +1925,7 @@
-
+
property measure
Concrete property to return the measure of the independence test
@@ -1916,9 +1933,9 @@
-
+
-class tigramite.independence_tests.
GPDCtorch
( null_dist_filename = None , ** kwargs ) [source]
+class tigramite.independence_tests.
GPDCtorch
( null_dist_filename=None , **kwargs ) [source]
GPDC conditional independence test based on Gaussian processes and distance correlation. Here with gpytorch implementation.
GPDC is based on a Gaussian process (GP) regression and a distance
correlation test on the residuals . GP is estimated with gpytorch.
@@ -1951,9 +1968,9 @@
-
+
-generate_and_save_nulldists
( sample_sizes , null_dist_filename ) [source]
+generate_and_save_nulldists
( sample_sizes , null_dist_filename ) [source]
Generates and saves null distribution for pairwise independence
tests.
Generates the null distribution for different sample sizes. Calls
@@ -1970,9 +1987,9 @@
-
+
-generate_nulldist
( df , add_to_null_dists = True ) [source]
+generate_nulldist
( df , add_to_null_dists=True ) [source]
Generates null distribution for pairwise independence tests.
Generates the null distribution for sample size df. Assumes pairwise
samples transformed to uniform marginals. Uses get_dependence_measure
@@ -1995,9 +2012,9 @@
-
+
-get_analytic_significance
( value , T , dim ) [source]
+get_analytic_significance
( value , T , dim ) [source]
Returns p-value for the distance correlation coefficient.
The null distribution for necessary degrees of freedom (df) is loaded.
If not available, the null distribution is generated with the function
@@ -2023,9 +2040,9 @@
-
+
-get_dependence_measure
( array , xyz ) [source]
+get_dependence_measure
( array , xyz ) [source]
Return GPDC measure.
Estimated as the distance correlation of the residuals of a GP
regression.
@@ -2045,9 +2062,9 @@
-
+
-get_model_selection_criterion
( j , parents , tau_max = 0 ) [source]
+get_model_selection_criterion
( j , parents , tau_max=0 ) [source]
Returns log marginal likelihood for GP regression.
Fits a GP model of the parents to variable j and returns the negative
log marginal likelihood as a model selection score. Is used to determine
@@ -2066,9 +2083,9 @@
-
+
-get_shuffle_significance
( array , xyz , value , return_null_dist = False ) [source]
+get_shuffle_significance
( array , xyz , value , return_null_dist=False ) [source]
Returns p-value for shuffle significance test.
For residual-based test statistics only the residuals are shuffled.
@@ -2088,7 +2105,7 @@
-
+
property measure
Concrete property to return the measure of the independence test
@@ -2096,9 +2113,9 @@
-
+
-class tigramite.independence_tests.
CMIknn
( knn = 0.2 , shuffle_neighbors = 5 , significance = 'shuffle_test' , transform = 'ranks' , workers = - 1 , ** kwargs ) [source]
+class tigramite.independence_tests.
CMIknn
( knn=0.2 , shuffle_neighbors=5 , significance='shuffle_test' , transform='ranks' , workers=-1 , **kwargs ) [source]
Conditional mutual information test based on nearest-neighbor estimator.
Conditional mutual information is the most general dependency measure coming
from an information-theoretic framework. It makes no assumptions about the
@@ -2160,9 +2177,9 @@
-
+
-get_conditional_entropy
( array , xyz ) [source]
+get_conditional_entropy
( array , xyz ) [source]
Returns the nearest-neighbor conditional entropy estimate of H(X|Y).
Parameters
@@ -2181,9 +2198,9 @@
-
+
-get_dependence_measure
( array , xyz ) [source]
+get_dependence_measure
( array , xyz ) [source]
Returns CMI estimate as described in Frenzel and Pompe PRL (2007).
Parameters
@@ -2201,9 +2218,9 @@
-
+
-get_shuffle_significance
( array , xyz , value , return_null_dist = False ) [source]
+get_shuffle_significance
( array , xyz , value , return_null_dist=False ) [source]
Returns p-value for nearest-neighbor shuffle significance test.
For non-empty Z, overwrites get_shuffle_significance from the parent
class which is a block shuffle test, which does not preserve
@@ -2228,7 +2245,7 @@
-
+
property measure
Concrete property to return the measure of the independence test
@@ -2236,9 +2253,9 @@
-
+
-class tigramite.independence_tests.
CMIsymb
( n_symbs = None , significance = 'shuffle_test' , sig_blocklength = 1 , conf_blocklength = 1 , ** kwargs ) [source]
+class tigramite.independence_tests.
CMIsymb
( n_symbs=None , significance='shuffle_test' , sig_blocklength=1 , conf_blocklength=1 , **kwargs ) [source]
Conditional mutual information test based on discrete estimator.
Conditional mutual information is the most general dependency measure
coming from an information-theoretic framework. It makes no assumptions
@@ -2268,9 +2285,9 @@
-
+
-get_dependence_measure
( array , xyz ) [source]
+get_dependence_measure
( array , xyz ) [source]
Returns CMI estimate based on bincount histogram.
Parameters
@@ -2288,9 +2305,9 @@
-
+
-get_shuffle_significance
( array , xyz , value , return_null_dist = False ) [source]
+get_shuffle_significance
( array , xyz , value , return_null_dist=False ) [source]
Returns p-value for shuffle significance test.
For residual-based test statistics only the residuals are shuffled.
@@ -2310,7 +2327,7 @@
-
+
property measure
Concrete property to return the measure of the independence test
@@ -2318,9 +2335,9 @@
-
+
-class tigramite.independence_tests.
OracleCI
( links = None , observed_vars = None , selection_vars = None , graph = None , graph_is_mag = False , tau_max = None , verbosity = 0 ) [source]
+class tigramite.independence_tests.
OracleCI
( links=None , observed_vars=None , selection_vars=None , graph=None , graph_is_mag=False , tau_max=None , verbosity=0 ) [source]
Oracle of conditional independence test X _|_ Y | Z given a graph.
Class around link_coeff causal ground truth. X _|_ Y | Z is based on
assessing whether X and Y are d-separated given Z in the graph.
@@ -2341,9 +2358,9 @@
-
+
-check_shortest_path
( X , Y , Z , max_lag = None , starts_with = None , ends_with = None , forbidden_nodes = None , directed = False , only_non_causal_paths = False , check_optimality_cond = False , optimality_cond_des_YM = None , optimality_cond_Y = None , return_path = False ) [source]
+check_shortest_path
( X , Y , Z , max_lag=None , starts_with=None , ends_with=None , forbidden_nodes=None , directed=False , only_non_causal_paths=False , check_optimality_cond=False , optimality_cond_des_YM=None , optimality_cond_Y=None , return_path=False ) [source]
Returns path between X and Y given Z in the graph.
X, Y, Z are of the form (var, lag) for lag <= 0. D-separation is
based on:
@@ -2363,9 +2380,7 @@
Parameters
-X (list of tuples ) – List of variables chosen for testing paths.
-Y (list of tuples ) – List of variables chosen for testing paths.
-Z (list of tuples ) – List of variables chosen for testing paths.
+Y , Z (X , ) – List of variables chosen for testing paths.
max_lag (int , optional ( default: None ) ) – Used here to constrain the has_path function to the graph
truncated at max_lag instead of identifying the max_lag from
ancestral search.
@@ -2384,9 +2399,9 @@
-
+
-get_confidence
( X , Y , Z = None , tau_max = 0 ) [source]
+get_confidence
( X , Y , Z=None , tau_max=0 ) [source]
For compatibility with PCMCI.
Returns
@@ -2398,17 +2413,17 @@
-
+
-get_graph_from_links
( tau_max = None ) [source]
+get_graph_from_links
( tau_max=None ) [source]
Constructs graph (DAG or MAG or ADMG) from links, observed_vars,
and selection_vars.
For ADMGs uses the Latent projection operation (Pearl 2009).
-
+
-get_links_from_graph
( graph ) [source]
+get_links_from_graph
( graph ) [source]
Constructs links_coeffs dictionary, observed_vars,
and selection_vars from graph array (MAG or DAG).
In the case of MAGs, for every <-> or — link further
@@ -2419,19 +2434,15 @@
Can be used to evaluate d-separation in MAG/DAGs.
-
+
-get_measure
( X , Y , Z = None , tau_max = 0 ) [source]
+get_measure
( X , Y , Z=None , tau_max=0 ) [source]
Returns dependence measure.
Returns 0 if X and Y are d-separated given Z in the graph and 1 else.
Parameters
-X (list of tuples ) – X,Y,Z are of the form [(var, -tau)], where var specifies the
-variable index in the observed_vars and tau the time lag.
-[ (Y ) – X,Y,Z are of the form [(var, -tau)], where var specifies the
-variable index in the observed_vars and tau the time lag.
-Z ] (list of tuples ) – X,Y,Z are of the form [(var, -tau)], where var specifies the
+
Y [ , Z ] (X , ) – X,Y,Z are of the form [(var, -tau)], where var specifies the
variable index in the observed_vars and tau the time lag.
tau_max (int , optional ( default: 0 ) ) – Maximum time lag. This may be used to make sure that estimates for
different lags in X, Z, all have the same sample size.
@@ -2446,32 +2457,28 @@
-
+
-get_model_selection_criterion
( j , parents , tau_max = 0 ) [source]
+get_model_selection_criterion
( j , parents , tau_max=0 ) [source]
Base class assumption that this is not implemented. Concrete classes
should override when possible.
-
+
property measure
Concrete property to return the measure of the independence test
-
+
-run_test
( X , Y , Z = None , tau_max = 0 , cut_off = '2xtau_max' , verbosity = 0 ) [source]
+run_test
( X , Y , Z=None , tau_max=0 , cut_off='2xtau_max' , verbosity=0 ) [source]
Perform oracle conditional independence test.
Calls the d-separation function.
Parameters
-X (list of tuples ) – X,Y,Z are of the form [(var, -tau)], where var specifies the
-variable index in the observed_vars and tau the time lag.
-Y (list of tuples ) – X,Y,Z are of the form [(var, -tau)], where var specifies the
-variable index in the observed_vars and tau the time lag.
-Z (list of tuples ) – X,Y,Z are of the form [(var, -tau)], where var specifies the
+
Y , Z (X , ) – X,Y,Z are of the form [(var, -tau)], where var specifies the
variable index in the observed_vars and tau the time lag.
tau_max (int , optional ( default: 0 ) ) – Not used here.
cut_off ({'2xtau_max' , 'max_lag' , 'max_lag_or_tau_max'} ) – Not used here.
@@ -2486,9 +2493,9 @@
-
+
-set_dataframe
( dataframe ) [source]
+set_dataframe
( dataframe ) [source]
Dummy function.
@@ -2497,9 +2504,9 @@
tigramite.causal_effects
: Causal Effect analysis
-
+
-class tigramite.causal_effects.
CausalEffects
( graph , graph_type , X , Y , S = None , hidden_variables = None , check_SM_overlap = True , verbosity = 0 ) [source]
+class tigramite.causal_effects.
CausalEffects
( graph , graph_type , X , Y , S=None , hidden_variables=None , check_SM_overlap=True , verbosity=0 ) [source]
Causal effect estimation.
Methods for the estimation of linear or non-parametric causal effects
between (potentially multivariate) X and Y (potentially conditional
@@ -2536,7 +2543,7 @@
-
+
check_XYS_paths
( ) [source]
Check whether one can remove nodes from X and Y with no proper causal paths.
@@ -2550,7 +2557,7 @@
-
+
check_optimality
( ) [source]
Check whether optimal adjustment set exists according to Thm. 3 in Runge NeurIPS 2021.
@@ -2564,9 +2571,9 @@
-
+
-fit_total_effect
( dataframe , estimator , adjustment_set = 'optimal' , conditional_estimator = None , data_transform = None , mask_type = None ) [source]
+fit_total_effect
( dataframe , estimator , adjustment_set='optimal' , conditional_estimator=None , data_transform=None , mask_type=None ) [source]
Returns a fitted model for the total causal effect of X on Y conditional on S.
@@ -2595,9 +2602,9 @@
-
+
-fit_wright_effect
( dataframe , mediation = None , method = 'parents' , links_coeffs = None , data_transform = None , mask_type = None ) [source]
+fit_wright_effect
( dataframe , mediation=None , method='parents' , links_coeffs=None , data_transform=None , mask_type=None ) [source]
Returns a fitted model for the total or mediated causal effect of X on Y potentially through mediator variables.
@@ -2628,9 +2635,30 @@
-
+
+
+static get_graph_from_dict
( links , tau_max=None ) [source]
+Helper function to convert dictionary of links to graph array format.
+
+Parameters
+
+links (dict ) – Dictionary of form {0:[((0, -1), coeff, func), …], 1:[…], …}.
+Also format {0:[(0, -1), …], 1:[…], …} is allowed.
+tau_max (int or None ) – Maximum lag. If None, the maximum lag in links is used.
+
+
+Returns
+graph – Matrix format of graph with 1 for true links and 0 else.
+
+Return type
+array of shape (N, N, tau_max+1)
+
+
+
+
+
-get_mediators
( start , end ) [source]
+get_mediators
( start , end ) [source]
Returns mediator variables on proper causal paths.
Parameters
@@ -2648,9 +2676,9 @@
-
+
-get_optimal_set
( alternative_conditions = None , minimize = False , return_separate_sets = False ) [source]
+get_optimal_set
( alternative_conditions=None , minimize=False , return_separate_sets=False ) [source]
Returns optimal adjustment set.
See Runge NeurIPS 2021.
@@ -2672,9 +2700,9 @@
-
+
-predict_total_effect
( intervention_data , conditions_data = None , pred_params = None ) [source]
+predict_total_effect
( intervention_data , conditions_data=None , pred_params=None ) [source]
Predict effect of intervention with fitted model.
Uses the model.predict() function of the sklearn model.
@@ -2694,9 +2722,9 @@
-
+
-predict_wright_effect
( intervention_data , pred_params = None ) [source]
+predict_wright_effect
( intervention_data , pred_params=None ) [source]
Predict linear effect of intervention with fitted Wright-model.
Parameters
@@ -2720,9 +2748,9 @@
-
\ No newline at end of file
diff --git a/docs/objects.inv b/docs/objects.inv
index 27a3be23..480c1c78 100644
Binary files a/docs/objects.inv and b/docs/objects.inv differ
diff --git a/docs/py-modindex.html b/docs/py-modindex.html
index 65cb7725..a7848825 100644
--- a/docs/py-modindex.html
+++ b/docs/py-modindex.html
@@ -1,10 +1,9 @@
-
+
-
Python Module Index — Tigramite 5.0 documentation
@@ -28,10 +27,23 @@ Navigation
modules |
- Tigramite 5.0 documentation »
- Python Module Index
+ Tigramite 5.0 documentation »
-
+
+
@@ -73,24 +85,9 @@
Python Module Index
-
-
\ No newline at end of file
diff --git a/docs/search.html b/docs/search.html
index 0acff014..6cdb96f2 100644
--- a/docs/search.html
+++ b/docs/search.html
@@ -1,10 +1,9 @@
-
+
-
Search — Tigramite 5.0 documentation
@@ -30,10 +29,13 @@ Navigation
modules |
- Tigramite 5.0 documentation »
- Search
+ Tigramite 5.0 documentation »
-
+
+
@@ -49,8 +51,10 @@
Search
- Searching for multiple words only shows matches that contain
- all words.
+ From here you can search these documents. Enter your search
+ words into the box below and click "search". Note that the search
+ function will automatically search for all of the words. Pages
+ containing fewer words won't appear in the result list.
-
-
\ No newline at end of file
diff --git a/docs/searchindex.js b/docs/searchindex.js
index 2113f346..6a85b8e8 100644
--- a/docs/searchindex.js
+++ b/docs/searchindex.js
@@ -1 +1 @@
-Search.setIndex({docnames:["index"],envversion:{"sphinx.domains.c":2,"sphinx.domains.changeset":1,"sphinx.domains.citation":1,"sphinx.domains.cpp":3,"sphinx.domains.index":1,"sphinx.domains.javascript":2,"sphinx.domains.math":2,"sphinx.domains.python":2,"sphinx.domains.rst":2,"sphinx.domains.std":1,"sphinx.ext.viewcode":1,sphinx:56},filenames:["index.rst"],objects:{"tigramite.causal_effects":{CausalEffects:[0,0,1,""]},"tigramite.causal_effects.CausalEffects":{check_XYS_paths:[0,1,1,""],check_optimality:[0,1,1,""],fit_total_effect:[0,1,1,""],fit_wright_effect:[0,1,1,""],get_mediators:[0,1,1,""],get_optimal_set:[0,1,1,""],predict_total_effect:[0,1,1,""],predict_wright_effect:[0,1,1,""]},"tigramite.data_processing":{DataFrame:[0,0,1,""],lowhighpass_filter:[0,4,1,""],ordinal_patt_array:[0,4,1,""],quantile_bin_array:[0,4,1,""],smooth:[0,4,1,""],structural_causal_process:[0,4,1,""],time_bin_with_mask:[0,4,1,""],var_process:[0,4,1,""],weighted_avg_and_std:[0,4,1,""]},"tigramite.data_processing.DataFrame":{construct_array:[0,1,1,""],data:[0,3,1,""],datatime:[0,3,1,""],mask:[0,3,1,""],missing_flag:[0,3,1,""],print_array_info:[0,1,1,""],var_names:[0,3,1,""]},"tigramite.independence_tests":{CMIknn:[0,0,1,""],CMIsymb:[0,0,1,""],CondIndTest:[0,0,1,""],GPDC:[0,0,1,""],GPDCtorch:[0,0,1,""],OracleCI:[0,0,1,""],ParCorr:[0,0,1,""]},"tigramite.independence_tests.CMIknn":{get_conditional_entropy:[0,1,1,""],get_dependence_measure:[0,1,1,""],get_shuffle_significance:[0,1,1,""],measure:[0,1,1,""]},"tigramite.independence_tests.CMIsymb":{get_dependence_measure:[0,1,1,""],get_shuffle_significance:[0,1,1,""],measure:[0,1,1,""]},"tigramite.independence_tests.CondIndTest":{get_analytic_confidence:[0,1,1,""],get_analytic_significance:[0,1,1,""],get_bootstrap_confidence:[0,1,1,""],get_confidence:[0,1,1,""],get_dependence_measure:[0,1,1,""],get_fixed_thres_significance:[0,1,1,""],get_measure:[0,1,1,""],get_model_selection_criterion:[0,1,1,""],get_shuffle_significance:[0,1,1,""],get_significance:[0,1,1,""],measure:[0,1,1,""],print_info:[0,1,1,""],run_test:[0,1,1,""],run_test_raw:[0,1,1,""],set_dataframe:[0,1,1,""],set_mask_type:[0,1,1,""]},"tigramite.independence_tests.GPDC":{generate_and_save_nulldists:[0,1,1,""],generate_nulldist:[0,1,1,""],get_analytic_significance:[0,1,1,""],get_dependence_measure:[0,1,1,""],get_model_selection_criterion:[0,1,1,""],get_shuffle_significance:[0,1,1,""],measure:[0,1,1,""]},"tigramite.independence_tests.GPDCtorch":{generate_and_save_nulldists:[0,1,1,""],generate_nulldist:[0,1,1,""],get_analytic_significance:[0,1,1,""],get_dependence_measure:[0,1,1,""],get_model_selection_criterion:[0,1,1,""],get_shuffle_significance:[0,1,1,""],measure:[0,1,1,""]},"tigramite.independence_tests.OracleCI":{check_shortest_path:[0,1,1,""],get_confidence:[0,1,1,""],get_graph_from_links:[0,1,1,""],get_links_from_graph:[0,1,1,""],get_measure:[0,1,1,""],get_model_selection_criterion:[0,1,1,""],measure:[0,1,1,""],run_test:[0,1,1,""],set_dataframe:[0,1,1,""]},"tigramite.independence_tests.ParCorr":{get_analytic_confidence:[0,1,1,""],get_analytic_significance:[0,1,1,""],get_dependence_measure:[0,1,1,""],get_model_selection_criterion:[0,1,1,""],get_shuffle_significance:[0,1,1,""],measure:[0,1,1,""]},"tigramite.lpcmci":{LPCMCI:[0,0,1,""]},"tigramite.lpcmci.LPCMCI":{run_lpcmci:[0,1,1,""]},"tigramite.models":{LinearMediation:[0,0,1,""],Models:[0,0,1,""],Prediction:[0,0,1,""]},"tigramite.models.LinearMediation":{fit_model:[0,1,1,""],get_ace:[0,1,1,""],get_acs:[0,1,1,""],get_all_ace:[0,1,1,""],get_all_acs:[0,1,1,""],get_all_amce:[0,1,1,""],get_amce:[0,1,1,""],get_ce:[0,1,1,""],get_ce_max:[0,1,1,""],get_coeff:[0,1,1,""],get_mce:[0,1,1,""],get_mediation_graph_data:[0,1,1,""],get_tsg:[0,1,1,""],get_val_matrix:[0,1,1,""],net_to_tsg:[0,1,1,""],tsg_to_net:[0,1,1,""]},"tigramite.models.Models":{get_coefs:[0,1,1,""],get_fit:[0,1,1,""],get_general_fitted_model:[0,1,1,""],get_general_prediction:[0,1,1,""],get_val_matrix:[0,1,1,""]},"tigramite.models.Prediction":{fit:[0,1,1,""],get_predictors:[0,1,1,""],get_test_array:[0,1,1,""],get_train_array:[0,1,1,""],predict:[0,1,1,""]},"tigramite.pcmci":{PCMCI:[0,0,1,""]},"tigramite.pcmci.PCMCI":{N:[0,3,1,""],T:[0,3,1,""],all_parents:[0,3,1,""],convert_to_string_graph:[0,1,1,""],get_corrected_pvalues:[0,1,1,""],get_graph_from_pmatrix:[0,1,1,""],get_lagged_dependencies:[0,1,1,""],iterations:[0,3,1,""],print_results:[0,1,1,""],print_significant_links:[0,1,1,""],pval_max:[0,3,1,""],return_parents_dict:[0,1,1,""],return_significant_links:[0,1,1,""],run_bivci:[0,1,1,""],run_fullci:[0,1,1,""],run_mci:[0,1,1,""],run_pc_stable:[0,1,1,""],run_pcalg:[0,1,1,""],run_pcalg_non_timeseries_data:[0,1,1,""],run_pcmci:[0,1,1,""],run_pcmciplus:[0,1,1,""],run_sliding_window_of:[0,1,1,""],symmetrize_p_and_val_matrix:[0,1,1,""],val_min:[0,3,1,""]},"tigramite.plotting":{plot_graph:[0,4,1,""],plot_lagfuncs:[0,4,1,""],plot_mediation_graph:[0,4,1,""],plot_mediation_time_series_graph:[0,4,1,""],plot_time_series_graph:[0,4,1,""],plot_timeseries:[0,4,1,""],plot_tsg:[0,4,1,""],setup_matrix:[0,0,1,""]},"tigramite.plotting.setup_matrix":{add_lagfuncs:[0,1,1,""],savefig:[0,1,1,""]},"tigramite.toymodels":{structural_causal_processes:[0,2,0,"-"]},"tigramite.toymodels.structural_causal_processes":{structural_causal_process:[0,4,1,""],var_process:[0,4,1,""]},tigramite:{data_processing:[0,2,0,"-"],plotting:[0,2,0,"-"]}},objnames:{"0":["py","class","Python class"],"1":["py","method","Python method"],"2":["py","module","Python module"],"3":["py","attribute","Python attribute"],"4":["py","function","Python function"]},objtypes:{"0":"py:class","1":"py:method","2":"py:module","3":"py:attribute","4":"py:function"},terms:{"00000":0,"001":0,"005":0,"019":0,"025":0,"051122":0,"062829":0,"075310":0,"0803":0,"100":0,"1000":0,"10105":0,"1038":0,"1063":0,"1103":0,"12532404":0,"2002":0,"2007":0,"2009":0,"2011":0,"2015":0,"2018":0,"2019":0,"2020":0,"2021":0,"204101":0,"21st":0,"24365041":0,"250648072987":0,"25718002":0,"2xtau_max":0,"36897445":0,"36th":0,"38250406":0,"4101":0,"447":0,"449":0,"466":0,"486":0,"499":0,"5025050":0,"524":0,"579_main_pap":0,"588":0,"599":0,"602":0,"606":0,"618":0,"62829":0,"676":0,"8485ae387a981d783f8764e508151cd9":0,"8502":0,"94e70705efae423efda1088614128d0b":0,"abstract":0,"boolean":0,"break":0,"case":0,"class":0,"default":0,"float":0,"import":0,"int":0,"long":0,"new":0,"null":0,"return":0,"true":0,"var":0,"while":0,ACE:0,ACS:0,For:0,Its:0,Not:0,OLS:0,The:0,Then:0,There:0,These:0,Used:0,Useful:0,Uses:0,Using:0,Will:0,With:0,_get_single_residu:0,_run_ancestral_removal_phas:0,_run_dsep_removal_phas:0,_run_non_ancestral_removal_phas:0,about:0,abov:0,abs:0,absent:0,absmax:0,absolut:0,accept:0,accord:0,account:0,ace:0,across:0,acs:0,act:0,actual:0,adapt:0,add:0,add_lagfunc:0,add_lagfunc_arg:0,add_to_null_dist:0,added:0,adding:0,addit:0,address:0,adj:0,adjac:0,adjust:0,adjustment_set:0,admg:0,adv:0,advanc:0,affect:0,after:0,again:0,ahead:0,aic:0,aip:0,akaik:0,algorithm:0,all:0,all_lag:0,all_par:0,all_result:0,alloc:0,allow:0,along:0,alpha:0,alpha_level:0,alreadi:0,also:0,altern:0,alternative_condit:0,although:0,alwai:0,ambigu:0,ambiguous_tripl:0,amc:0,among:0,analyt:0,analyz:0,anc_all_i:0,anc_all_x:0,anc_all_z:0,anc_i:0,anc_x:0,anc_xi:0,ancestor:0,ancestr:0,ani:0,anoth:0,apds_t:0,appli:0,applic:0,appropri:0,apr:0,arang:0,arbitrari:0,argument:0,around:0,arrai:0,array_lik:0,array_mask:0,arrohead:0,arrow:0,arrow_linewidth:0,arrowhead_s:0,articl:0,artifici:0,arxiv:0,assess:0,assign:0,associ:0,assum:0,assumpt:0,ast:0,asymptot:0,attribut:0,au_i:0,au_j:0,auai:0,auto:0,auto_first:0,autocorrel:0,autocovari:0,autodepend:0,automat:0,autoregress:0,auxadmg:0,auxiliari:0,avail:0,averag:0,avoid:0,axes:0,axi:0,backdoor:0,backward:0,bakirov:0,bandwidth:0,base:0,basemap:0,been:0,befor:0,beforehand:0,begin:0,being:0,below:0,benjamini:0,best:0,beta:0,beta_i:0,beta_x:0,better:0,between:0,bia:0,bias:0,bin:0,bincount:0,bindata:0,bivci:0,black:0,block:0,blue:0,bold:0,bool:0,bootstrap:0,both:0,bottom:0,bound:0,box:0,breadth:0,break_once_separ:0,briefli:0,butterworth:0,call:0,callabl:0,can:0,canada:0,canon:0,cardin:0,care:0,caus:0,causaleffect:0,cdot:0,certain:0,chain:0,chao:0,check:0,check_optim:0,check_optimality_cond:0,check_shortest_path:0,check_sm_overlap:0,check_xys_path:0,child:0,choic:0,chosen:0,cite:0,ckdtree:0,clash:0,clean:0,cmap_edg:0,cmap_nod:0,cmi:0,cmiknn:0,cmisymb:0,coef1:0,coef2:0,coeff:0,coeffici:0,collid:0,collider_par:0,colliders_minimized_optim:0,colliders_onli:0,color:0,colorbar:0,colormap:0,column:0,com:0,combin:0,come:0,command:0,common:0,commun:0,compar:0,comparison:0,compat:0,complex:0,comprehens:0,comput:0,compute_ancestor:0,concret:0,cond_ind_test:0,condindtest:0,conditional_estim:0,conditional_model:0,conditions_data:0,conduct:0,conf_blocklength:0,conf_lev:0,conf_low:0,conf_matrix:0,conf_sampl:0,conf_upp:0,confer:0,confid:0,conflict:0,conflict_resolut:0,confound:0,conserv:0,consid:0,consider:0,considerd:0,consist:0,constant:0,constrain:0,construct:0,construct_arrai:0,constructor:0,contain:0,contemp_collider_rul:0,contemp_cond:0,contemporan:0,content:0,continu:0,contrast:0,control:0,conveni:0,convert:0,convert_to_string_graph:0,coordin:0,correct:0,corrected_a:0,correl:0,correspond:0,cost:0,could:0,coupl:0,covari:0,creat:0,criteria:0,criterion:0,cross:0,cube:0,current:0,curv:0,curvatur:0,curved_radiu:0,cut_off:0,cutoff:0,cutperiod:0,cython:0,d_z:0,dag:0,dash:0,data_linewidth:0,data_transform:0,datafram:0,dataset:0,datatim:0,dcor:0,debug:0,decai:0,def:0,default_rng:0,defin:0,definin:0,degre:0,delai:0,denot:0,densiti:0,depend:0,dependence_measur:0,deprec:0,depth:0,deriv:0,describ:0,descript:0,detail:0,detect:0,determin:0,deviat:0,dict:0,dictionari:0,differ:0,digamma:0,digest:0,dim:0,dimens:0,dimension:0,direct:0,direction:0,directli:0,disabl:0,discov:0,discoveri:0,discret:0,discuss:0,disk:0,dismiss:0,dist:0,distanc:0,distribut:0,do_check:0,doc:0,doe:0,doi:0,dpag:0,draw:0,drawn:0,driver:0,due:0,dummi:0,duplic:0,dure:0,eaau4996:0,each:0,easi:0,edg:0,edge_tick:0,effici:0,either:0,element:0,els:0,eman:0,embed:0,empti:0,end:0,ends_with:0,ensur:0,entri:0,entropi:0,enumer:0,epsilon_:0,equal:0,equival:0,error:0,estim:0,eta:0,etc:0,evalu:0,even:0,everi:0,exampl:0,except:0,exclud:0,exclude_contemporan:0,exclude_i:0,exclude_j:0,exclude_k:0,exclude_self_effect:0,execut:0,exist:0,expect:0,experi:0,experiment:0,explain:0,extern:0,f_x:0,f_y:0,factor:0,faculti:0,faith:0,fals:0,fancyarrowpatch:0,faster:0,fdr:0,fdr_bh:0,fdr_method:0,featur:0,feedback:0,fig:0,fig_ax:0,figsiz:0,figur:0,file:0,fill:0,filter:0,fine:0,first:0,fit:0,fit_model:0,fit_result:0,fit_total_effect:0,fit_wright_effect:0,fix:0,fix_all_edges_before_final_orient:0,fixed_thr:0,flag:0,flaxman:0,flexibl:0,follow:0,fontsiz:0,forbidden_nod:0,forc:0,forecast:0,form:0,format:0,forward:0,found:0,four:0,frac:0,fraction:0,framework:0,free:0,freedom:0,frenzel:0,frequenc:0,frequent:0,friendli:0,from:0,full:0,fullci:0,fulli:0,func:0,further:0,futur:0,gabor:0,gatewai:0,gauss_pr:0,gaussian:0,gaussianprocessregressor:0,gaussprocreg:0,gaussprocregtorch:0,generate_and_save_nulldist:0,generate_nulldist:0,gerhardu:0,get:0,get_ac:0,get_all_ac:0,get_all_amc:0,get_amc:0,get_analytic_confid:0,get_analytic_signific:0,get_bootstrap_confid:0,get_c:0,get_ce_max:0,get_coef:0,get_coeff:0,get_conditional_entropi:0,get_confid:0,get_corrected_pvalu:0,get_dependence_measur:0,get_fit:0,get_fixed_thres_signific:0,get_general_fitted_model:0,get_general_predict:0,get_graph_from_link:0,get_graph_from_pmatrix:0,get_lagged_depend:0,get_links_from_graph:0,get_mc:0,get_measur:0,get_medi:0,get_mediation_graph_data:0,get_model_selection_criterion:0,get_optimal_set:0,get_predictor:0,get_shuffle_signific:0,get_signific:0,get_test_arrai:0,get_train_arrai:0,get_tsg:0,get_val_matrix:0,github:0,give:0,given:0,going:0,gp_param:0,gpdc:0,gpdctorch:0,gpytorch:0,graph:0,graph_bool:0,graph_data:0,graph_is_mag:0,graph_typ:0,graphic:0,greater:0,grei:0,grey_masked_sampl:0,grid:0,ground:0,guarante:0,guidanc:0,handl:0,hard:0,has:0,has_path:0,hash:0,have:0,head:0,heavisid:0,heigth:0,help:0,helper:0,henc:0,here:0,hidden:0,hidden_vari:0,high:0,higher:0,histogram:0,hochberg:0,horizont:0,how:0,howev:0,html:0,http:0,hyper:0,hyperparamet:0,hypothesi:0,hypothet:0,identifi:0,iint:0,implement:0,impli:0,importantli:0,improv:0,includ:0,include_lagzero_link:0,include_lagzero_par:0,include_neighbor:0,incom:0,index:0,indirect:0,individu:0,inf:0,infin:0,info:0,inform:0,inherit:0,initi:0,initial_valu:0,inner_edg:0,inner_edge_styl:0,inno_cov:0,innov:0,input:0,instanc:0,instanti:0,instead:0,instruct:0,integ:0,intellig:0,interdisciplinari:0,interest:0,intern:0,interpret:0,interv:0,interven:0,intervent:0,intervention_data:0,intervention_typ:0,introduc:0,introduct:0,inv_inno_cov:0,invalid:0,invers:0,invit:0,irrelev:0,iter:0,its:0,itself:0,j_t:0,joint:0,journal:0,just:0,kei:0,kernel:0,kind:0,knn:0,kretschmer:0,kwarg:0,label:0,label_fonts:0,label_space_left:0,label_space_top:0,lag1:0,lag2:0,lag:0,lag_arrai:0,lag_mod:0,lag_unit:0,lagfunct:0,lagged_par:0,larg:0,larger:0,last:0,latent:0,later:0,latter:0,lead:0,learn:0,least:0,leav:0,left:0,legend:0,legend_fonts:0,legend_width:0,len:0,length:0,less:0,let:0,lett:0,level:0,lightgrei:0,like:0,likelihood:0,limit:0,lin_f:0,line:0,linear:0,linear_model:0,linearmedi:0,linearregress:0,linewidth:0,link:0,link_attribut:0,link_coeff:0,link_colorbar_label:0,link_frequ:0,link_label_fonts:0,link_matrix:0,link_width:0,links_coeff:0,list:0,load:0,log:0,look:0,low:0,lower:0,lowhighpass_filt:0,made:0,mag:0,magnitud:0,mai:0,main:0,major:0,make:0,mani:0,map:0,margin:0,maria:0,mark:0,marker:0,markers:0,markov:0,mask:0,mask_typ:0,match:0,mathcal:0,matplotlib:0,matric:0,matrix:0,matter:0,max:0,max_combin:0,max_cond_px:0,max_conds_dim:0,max_conds_pi:0,max_conds_px:0,max_conds_px_lag:0,max_delai:0,max_lag:0,max_lag_or_tau_max:0,max_p_glob:0,max_p_non_ancestr:0,max_pds_set:0,max_q_glob:0,maxim:0,maximum:0,mce:0,mci:0,mean:0,measur:0,med:0,member:0,memori:0,method:0,method_arg:0,middl:0,might:0,minim:0,minimized_optim:0,minimum:0,minu:0,miss:0,missing_flag:0,mlr:0,mmr:0,mode:0,model_param:0,modul:0,modulo:0,momentari:0,more:0,most:0,most_frequent_link:0,mostli:0,motif:0,much:0,multi:0,multipl:0,multivari:0,must:0,mutual:0,n_preliminary_iter:0,n_symb:0,nail:0,name:0,nan:0,napds_t:0,natur:0,ncomms9502:0,nearest:0,necessari:0,need:0,neg:0,neighbor:0,nest:0,net_to_tsg:0,network:0,network_lower_bound:0,neural:0,neurip:0,never:0,nevertheless:0,new_data:0,niehgbor:0,no_apr:0,no_nois:0,no_non_ancestral_phas:0,node:0,node_aspect:0,node_colorbar_label:0,node_label_s:0,node_po:0,node_s:0,node_tick:0,nois:0,non:0,non_rep:0,none:0,nonlinear:0,nonstat:0,nonstationari:0,nonzero:0,normal:0,note:0,nowack:0,npz:0,null_dist:0,null_dist_filenam:0,nulldist:0,number:0,numer:0,numpi:0,object:0,observ:0,observed_var:0,occur:0,onc:0,one:0,onli:0,only_non_causal_path:0,opac:0,oper:0,opposit:0,optim:0,optimality_cond_des_ym:0,optimality_cond_i:0,optimz:0,option:0,oracl:0,oracleci:0,order:0,ordin:0,ordinal_patt_arrai:0,ordinari:0,org:0,orient:0,orient_comtemp:0,orient_contemp:0,origin:0,orrd:0,oset:0,oset_:0,other:0,otherwis:0,otion:0,ouput:0,out:0,outcom:0,output:0,over:0,overlaid:0,overlap:0,overrid:0,overwrit:0,p_matrix:0,packag:0,page:0,pair:0,pairwis:0,panda:0,panel:0,paper:0,parallel:0,paramet:0,parametr:0,parcorr:0,parent:0,parent_node_id:0,parents_dict:0,parents_neighbors_coeff:0,parents_of_lag:0,part:0,partial:0,particular:0,pass:0,pass_period:0,path:0,path_node_arrai:0,path_val_matrix:0,pathwai:0,patt:0,patt_mask:0,patt_tim:0,pattern:0,pc1:0,pc_1:0,pc_alpha:0,pcmciplu:0,pdf:0,peak:0,pearl:0,pearson:0,percentil:0,perform:0,period:0,permut:0,perp:0,perspect:0,phase:0,phi:0,phy:0,physrev:0,pip:0,plai:0,pleas:0,plot_graph:0,plot_gridlin:0,plot_lagfunc:0,plot_mediation_graph:0,plot_mediation_time_series_graph:0,plot_time_series_graph:0,plot_timeseri:0,plot_tsg:0,point:0,pomp:0,pos:0,posit:0,possibl:0,post:0,potenti:0,power:0,pq_matrix:0,practic:0,pre:0,precis:0,precomput:0,pred_param:0,predict_total_effect:0,predict_wright_effect:0,prediction_model:0,predictor:0,prelim_onli:0,prelim_rul:0,prelim_with_collider_rul:0,preliminari:0,preprocess:0,present:0,preserv:0,press:0,previou:0,prime:0,print:0,print_array_info:0,print_info:0,print_result:0,print_significant_link:0,prior:0,priorit:0,prl:0,procedur:0,proceed:0,processor:0,project:0,proper:0,properti:0,provid:0,pseudcod:0,pseudoc:0,pseudocod:0,psi:0,purpos:0,pval:0,pval_max:0,pyplot:0,python:0,q_matrix:0,qualiti:0,quantifi:0,quantil:0,quantile_bin_arrai:0,quantiti:0,r10:0,r_x:0,r_y:0,rais:0,randn:0,random:0,randomst:0,rang:0,rank:0,rate:0,rather:0,ratio:0,rdbu_r:0,recal:0,recommend:0,reconstruct:0,recycle_residu:0,red:0,reduc:0,refer:0,regard:0,regress:0,regular:0,rel:0,relat:0,relationship:0,relev:0,remain:0,remember_only_par:0,remov:0,repeat:0,replac:0,repo:0,repres:0,requir:0,reset_lagged_link:0,residu:0,respect:0,restrict:0,result:0,return_cleaned_xyz:0,return_data:0,return_dict:0,return_null_dist:0,return_parents_dict:0,return_path:0,return_separate_set:0,return_significant_link:0,rev:0,rho:0,richardson:0,right:0,rizzo:0,robust:0,role:0,row:0,rtype:0,rule:0,run:0,run_bivci:0,run_fullci:0,run_lpcmci:0,run_mci:0,run_pc_stabl:0,run_pcalg:0,run_pcalg_non_timeseries_data:0,run_pcmci:0,run_pcmciplu:0,run_sliding_window_of:0,run_test:0,run_test_raw:0,rung:0,runge18a:0,runtim:0,s41467:0,same:0,sampl:0,sample_s:0,saniti:0,save:0,save_iter:0,save_nam:0,savefig:0,scale:0,sci:0,scienc:0,sciencemag:0,scikit:0,scipi:0,scitat:0,score:0,script:0,search:0,second:0,section:0,see:0,seed:0,seen:0,sejdinov:0,select:0,selected_link:0,selected_target:0,selected_vari:0,selection_var:0,self:0,separ:0,sepset:0,set:0,set_datafram:0,set_mask_typ:0,setter:0,setup:0,setup_arg:0,setup_matrix:0,sever:0,shape:0,shorter:0,should:0,show:0,show_colorbar:0,shown:0,shuffl:0,shuffle_neighbor:0,shuffle_test:0,side:0,sig_blocklength:0,sig_overrid:0,sig_sampl:0,sig_thr:0,sigma:0,signfic:0,signficic:0,signific:0,sim:0,simpl:0,simpli:0,sinc:0,size:0,skeleton:0,skip:0,skip_ticks_data_i:0,skip_ticks_data_x:0,sklearn:0,slice:0,slide:0,slightli:0,smaller:0,smooth:0,smooth_width:0,soft:0,some:0,sort:0,sound:0,sourc:0,space:0,spatial:0,spatio:0,special:0,special_nod:0,specif:0,specifi:0,spirt:0,squar:0,stack:0,standard:0,standard_color_link:0,standard_color_nod:0,standardscal:0,star:0,start:0,starts_with:0,stationar:0,statist:0,std:0,step:0,steps_ahead:0,still:0,stop:0,store:0,str:0,straight:0,strength:0,string:0,structur:0,structural_causal_process:0,student:0,style:0,sub:0,subplot:0,subset:0,subspac:0,suffici:0,suitabl:0,sum:0,sum_:0,summar:0,summari:0,summary_result:0,superset:0,supplement:0,suppli:0,support:0,sure:0,surrog:0,suscept:0,symb_arrai:0,symbol:0,symbolifi:0,symmetr:0,symmetrize_p_and_val_matrix:0,system:0,szeke:0,tail:0,take:0,taken:0,target:0,target_predictor:0,tau:0,tau_:0,tau_max:0,tau_min:0,tau_mix:0,taumax:0,techniqu:0,tempor:0,termin:0,test_indic:0,than:0,thei:0,them:0,themselv:0,theorem:0,theoret:0,thi:0,thm:0,those:0,threshold:0,through:0,tick:0,tickmark:0,tild:0,time_bin_length:0,time_bin_with_mask:0,time_label:0,time_lag:0,timelabel:0,togeth:0,top:0,toronto:0,total:0,toward:0,train:0,train_indic:0,transfer:0,transform:0,translat:0,tripl:0,true_par:0,true_parent_neighbor:0,truncat:0,truth:0,tsg:0,tsg_path_val_matrix:0,tsg_to_net:0,tune:0,tupl:0,tutori:0,twice:0,two:0,two_sided_thr:0,type:0,typic:0,uai2020:0,uai:0,uncertainti:0,unclear:0,uncondit:0,undecid:0,under:0,underli:0,undirect:0,uniform:0,uniqu:0,unit:0,unlik:0,unori:0,unrestrict:0,unshield:0,unshuffl:0,update_middle_mark:0,upper:0,use:0,use_a_pds_t_for_major:0,use_mask:0,used:0,useful:0,user:0,uses:0,using:0,v84:0,val:0,val_matrix:0,val_matrix_interv:0,val_matrix_mean:0,val_min:0,val_onli:0,valid:0,valu:0,var1:0,var2:0,var_nam:0,var_network:0,var_process:0,var_unit:0,vari:0,variabl:0,varianc:0,variant:0,varibl:0,variou:0,varlag:0,varx:0,vector:0,verbos:0,veri:0,vertic:0,via:0,view:0,visual:0,vmax_edg:0,vmax_nod:0,vmin_edg:0,vmin_nod:0,weight:0,weighted_avg_and_std:0,well:0,when:0,where:0,whether:0,which:0,whichev:0,wide:0,widehat:0,width:0,wildcard:0,window:0,window_length:0,window_step:0,within:0,without:0,work:0,worker:0,wrapper:0,wright:0,www:0,x_base:0,x_i:0,x_j:0,x_t:0,xyz:0,y_base:0,y_t:0,yield:0,you:0,z_i:0,z_j:0,z_t:0,zero:0},titles:["TIGRAMITE"],titleterms:{"function":0,analysi:0,causal:0,causal_effect:0,condit:0,data:0,data_process:0,effect:0,gener:0,independ:0,independence_test:0,indic:0,lpcmci:0,mediat:0,model:0,pcmci:0,plot:0,predict:0,process:0,seri:0,tabl:0,test:0,tigramit:0,time:0,toi:0,toymodel:0}})
\ No newline at end of file
+Search.setIndex({docnames:["index"],envversion:{"sphinx.domains.c":1,"sphinx.domains.changeset":1,"sphinx.domains.citation":1,"sphinx.domains.cpp":1,"sphinx.domains.index":1,"sphinx.domains.javascript":1,"sphinx.domains.math":2,"sphinx.domains.python":1,"sphinx.domains.rst":1,"sphinx.domains.std":1,"sphinx.ext.viewcode":1,sphinx:56},filenames:["index.rst"],objects:{"tigramite.causal_effects":{CausalEffects:[0,0,1,""]},"tigramite.causal_effects.CausalEffects":{check_XYS_paths:[0,1,1,""],check_optimality:[0,1,1,""],fit_total_effect:[0,1,1,""],fit_wright_effect:[0,1,1,""],get_graph_from_dict:[0,1,1,""],get_mediators:[0,1,1,""],get_optimal_set:[0,1,1,""],predict_total_effect:[0,1,1,""],predict_wright_effect:[0,1,1,""]},"tigramite.data_processing":{DataFrame:[0,0,1,""],lowhighpass_filter:[0,4,1,""],ordinal_patt_array:[0,4,1,""],quantile_bin_array:[0,4,1,""],smooth:[0,4,1,""],structural_causal_process:[0,4,1,""],time_bin_with_mask:[0,4,1,""],var_process:[0,4,1,""],weighted_avg_and_std:[0,4,1,""]},"tigramite.data_processing.DataFrame":{construct_array:[0,1,1,""],data:[0,3,1,""],datatime:[0,3,1,""],mask:[0,3,1,""],missing_flag:[0,3,1,""],print_array_info:[0,1,1,""],remove_missing_upto_maxlag:[0,3,1,""],var_names:[0,3,1,""]},"tigramite.independence_tests":{CMIknn:[0,0,1,""],CMIsymb:[0,0,1,""],CondIndTest:[0,0,1,""],GPDC:[0,0,1,""],GPDCtorch:[0,0,1,""],OracleCI:[0,0,1,""],ParCorr:[0,0,1,""]},"tigramite.independence_tests.CMIknn":{get_conditional_entropy:[0,1,1,""],get_dependence_measure:[0,1,1,""],get_shuffle_significance:[0,1,1,""],measure:[0,1,1,""]},"tigramite.independence_tests.CMIsymb":{get_dependence_measure:[0,1,1,""],get_shuffle_significance:[0,1,1,""],measure:[0,1,1,""]},"tigramite.independence_tests.CondIndTest":{get_analytic_confidence:[0,1,1,""],get_analytic_significance:[0,1,1,""],get_bootstrap_confidence:[0,1,1,""],get_confidence:[0,1,1,""],get_dependence_measure:[0,1,1,""],get_fixed_thres_significance:[0,1,1,""],get_measure:[0,1,1,""],get_model_selection_criterion:[0,1,1,""],get_shuffle_significance:[0,1,1,""],get_significance:[0,1,1,""],measure:[0,1,1,""],print_info:[0,1,1,""],run_test:[0,1,1,""],run_test_raw:[0,1,1,""],set_dataframe:[0,1,1,""],set_mask_type:[0,1,1,""]},"tigramite.independence_tests.GPDC":{generate_and_save_nulldists:[0,1,1,""],generate_nulldist:[0,1,1,""],get_analytic_significance:[0,1,1,""],get_dependence_measure:[0,1,1,""],get_model_selection_criterion:[0,1,1,""],get_shuffle_significance:[0,1,1,""],measure:[0,1,1,""]},"tigramite.independence_tests.GPDCtorch":{generate_and_save_nulldists:[0,1,1,""],generate_nulldist:[0,1,1,""],get_analytic_significance:[0,1,1,""],get_dependence_measure:[0,1,1,""],get_model_selection_criterion:[0,1,1,""],get_shuffle_significance:[0,1,1,""],measure:[0,1,1,""]},"tigramite.independence_tests.OracleCI":{check_shortest_path:[0,1,1,""],get_confidence:[0,1,1,""],get_graph_from_links:[0,1,1,""],get_links_from_graph:[0,1,1,""],get_measure:[0,1,1,""],get_model_selection_criterion:[0,1,1,""],measure:[0,1,1,""],run_test:[0,1,1,""],set_dataframe:[0,1,1,""]},"tigramite.independence_tests.ParCorr":{get_analytic_confidence:[0,1,1,""],get_analytic_significance:[0,1,1,""],get_dependence_measure:[0,1,1,""],get_model_selection_criterion:[0,1,1,""],get_shuffle_significance:[0,1,1,""],measure:[0,1,1,""]},"tigramite.lpcmci":{LPCMCI:[0,0,1,""]},"tigramite.lpcmci.LPCMCI":{run_lpcmci:[0,1,1,""]},"tigramite.models":{LinearMediation:[0,0,1,""],Models:[0,0,1,""],Prediction:[0,0,1,""]},"tigramite.models.LinearMediation":{fit_model:[0,1,1,""],get_ace:[0,1,1,""],get_acs:[0,1,1,""],get_all_ace:[0,1,1,""],get_all_acs:[0,1,1,""],get_all_amce:[0,1,1,""],get_amce:[0,1,1,""],get_ce:[0,1,1,""],get_ce_max:[0,1,1,""],get_coeff:[0,1,1,""],get_mce:[0,1,1,""],get_mediation_graph_data:[0,1,1,""],get_tsg:[0,1,1,""],get_val_matrix:[0,1,1,""],net_to_tsg:[0,1,1,""],tsg_to_net:[0,1,1,""]},"tigramite.models.Models":{get_coefs:[0,1,1,""],get_fit:[0,1,1,""],get_general_fitted_model:[0,1,1,""],get_general_prediction:[0,1,1,""],get_val_matrix:[0,1,1,""]},"tigramite.models.Prediction":{fit:[0,1,1,""],get_predictors:[0,1,1,""],get_test_array:[0,1,1,""],get_train_array:[0,1,1,""],predict:[0,1,1,""]},"tigramite.pcmci":{PCMCI:[0,0,1,""]},"tigramite.pcmci.PCMCI":{N:[0,3,1,""],T:[0,3,1,""],all_parents:[0,3,1,""],convert_to_string_graph:[0,1,1,""],get_corrected_pvalues:[0,1,1,""],get_graph_from_pmatrix:[0,1,1,""],get_lagged_dependencies:[0,1,1,""],iterations:[0,3,1,""],print_results:[0,1,1,""],print_significant_links:[0,1,1,""],pval_max:[0,3,1,""],return_parents_dict:[0,1,1,""],return_significant_links:[0,1,1,""],run_bivci:[0,1,1,""],run_fullci:[0,1,1,""],run_mci:[0,1,1,""],run_pc_stable:[0,1,1,""],run_pcalg:[0,1,1,""],run_pcalg_non_timeseries_data:[0,1,1,""],run_pcmci:[0,1,1,""],run_pcmciplus:[0,1,1,""],run_sliding_window_of:[0,1,1,""],symmetrize_p_and_val_matrix:[0,1,1,""],val_min:[0,3,1,""]},"tigramite.plotting":{plot_graph:[0,4,1,""],plot_lagfuncs:[0,4,1,""],plot_mediation_graph:[0,4,1,""],plot_mediation_time_series_graph:[0,4,1,""],plot_time_series_graph:[0,4,1,""],plot_timeseries:[0,4,1,""],plot_tsg:[0,4,1,""],setup_matrix:[0,0,1,""]},"tigramite.plotting.setup_matrix":{add_lagfuncs:[0,1,1,""],savefig:[0,1,1,""]},"tigramite.toymodels":{structural_causal_processes:[0,2,0,"-"]},"tigramite.toymodels.structural_causal_processes":{links_to_graph:[0,4,1,""],structural_causal_process:[0,4,1,""],var_process:[0,4,1,""]},tigramite:{data_processing:[0,2,0,"-"],plotting:[0,2,0,"-"]}},objnames:{"0":["py","class","Python class"],"1":["py","method","Python method"],"2":["py","module","Python module"],"3":["py","attribute","Python attribute"],"4":["py","function","Python function"]},objtypes:{"0":"py:class","1":"py:method","2":"py:module","3":"py:attribute","4":"py:function"},terms:{"21st":0,"2xtau_max":0,"36th":0,"579_main_pap":0,"8485ae387a981d783f8764e508151cd9":0,"94e70705efae423efda1088614128d0b":0,"abstract":0,"boolean":0,"break":0,"case":0,"class":0,"default":0,"float":0,"import":0,"int":0,"long":0,"new":0,"null":0,"return":0,"static":0,"true":0,"var":0,"while":0,ACE:0,ACS:0,For:0,Its:0,Not:0,OLS:0,The:0,Then:0,There:0,These:0,Used:0,Useful:0,Uses:0,Using:0,Will:0,With:0,_get_single_residu:0,_run_ancestral_removal_phas:0,_run_dsep_removal_phas:0,_run_non_ancestral_removal_phas:0,about:0,abov:0,abs:0,absent:0,absmax:0,absolut:0,accept:0,accord:0,account:0,ace:0,across:0,acs:0,act:0,actual:0,adapt:0,add:0,add_lagfunc:0,add_lagfunc_arg:0,add_to_null_dist:0,added:0,adding:0,addit:0,address:0,adj:0,adjac:0,adjust:0,adjustment_set:0,admg:0,adv:0,advanc:0,affect:0,after:0,again:0,ahead:0,aic:0,aip:0,akaik:0,algorithm:0,all:0,all_lag:0,all_par:0,all_result:0,alloc:0,allow:0,along:0,alpha:0,alpha_level:0,alreadi:0,also:0,altern:0,alternative_condit:0,although:0,alwai:0,ambigu:0,ambiguous_tripl:0,amc:0,among:0,analyt:0,analyz:0,anc_all_i:0,anc_all_x:0,anc_all_z:0,anc_i:0,anc_x:0,anc_xi:0,ancestor:0,ancestr:0,ani:0,anoth:0,apds_t:0,appli:0,applic:0,appropri:0,apr:0,arang:0,arbitrari:0,argument:0,around:0,arrai:0,array_lik:0,array_mask:0,arrohead:0,arrow:0,arrow_linewidth:0,arrowhead_s:0,articl:0,artifici:0,arxiv:0,assess:0,assign:0,associ:0,assum:0,assumpt:0,ast:0,asymptot:0,attribut:0,au_i:0,au_j:0,auai:0,auto:0,auto_first:0,autocorrel:0,autocovari:0,autodepend:0,automat:0,autoregress:0,auxadmg:0,auxiliari:0,avail:0,averag:0,avoid:0,axes:0,axi:0,backdoor:0,backward:0,bakirov:0,bandwidth:0,base:0,basemap:0,been:0,befor:0,beforehand:0,begin:0,being:0,below:0,benjamini:0,best:0,beta:0,beta_i:0,beta_x:0,better:0,between:0,bia:0,bias:0,bin:0,bincount:0,bindata:0,bivci:0,black:0,block:0,blue:0,bold:0,bool:0,bootstrap:0,both:0,bottom:0,bound:0,box:0,breadth:0,break_once_separ:0,briefli:0,butterworth:0,call:0,callabl:0,can:0,canada:0,canon:0,cardin:0,care:0,caus:0,causaleffect:0,cdot:0,certain:0,chain:0,chao:0,check:0,check_optim:0,check_optimality_cond:0,check_shortest_path:0,check_sm_overlap:0,check_xys_path:0,child:0,choic:0,chosen:0,cite:0,ckdtree:0,clash:0,clean:0,cmap_edg:0,cmap_nod:0,cmi:0,cmiknn:0,cmisymb:0,coef1:0,coef2:0,coeff:0,coeffici:0,collid:0,collider_par:0,colliders_minimized_optim:0,colliders_onli:0,color:0,colorbar:0,colormap:0,column:0,com:0,combin:0,come:0,command:0,common:0,commun:0,compar:0,comparison:0,compat:0,complex:0,comprehens:0,comput:0,compute_ancestor:0,concret:0,cond_ind_test:0,condindtest:0,conditional_estim:0,conditional_model:0,conditions_data:0,conduct:0,conf_blocklength:0,conf_lev:0,conf_low:0,conf_matrix:0,conf_sampl:0,conf_upp:0,confer:0,confid:0,conflict:0,conflict_resolut:0,confound:0,conserv:0,consid:0,consider:0,considerd:0,consist:0,constant:0,constrain:0,construct:0,construct_arrai:0,constructor:0,contain:0,contemp_collider_rul:0,contemp_cond:0,contemporan:0,content:0,continu:0,contrast:0,control:0,conveni:0,convert:0,convert_to_string_graph:0,coordin:0,correct:0,corrected_a:0,correl:0,correspond:0,cost:0,could:0,coupl:0,covari:0,creat:0,criteria:0,criterion:0,cross:0,cube:0,current:0,curv:0,curvatur:0,curved_radiu:0,cut_off:0,cutoff:0,cutperiod:0,cython:0,d_z:0,dag:0,dash:0,data_linewidth:0,data_transform:0,datafram:0,dataset:0,datatim:0,dcor:0,debug:0,decai:0,def:0,default_rng:0,defin:0,definin:0,degre:0,delai:0,denot:0,densiti:0,depend:0,dependence_measur:0,deprec:0,depth:0,deriv:0,describ:0,descript:0,detail:0,detect:0,determin:0,deviat:0,dict:0,dictionari:0,differ:0,digamma:0,digest:0,dim:0,dimens:0,dimension:0,direct:0,direction:0,directli:0,disabl:0,discov:0,discoveri:0,discret:0,discuss:0,disk:0,dismiss:0,dist:0,distanc:0,distribut:0,do_check:0,doc:0,doe:0,doi:0,dpag:0,draw:0,drawn:0,driver:0,due:0,dummi:0,duplic:0,dure:0,eaau4996:0,each:0,easi:0,edg:0,edge_tick:0,effici:0,either:0,element:0,els:0,eman:0,embed:0,empti:0,end:0,ends_with:0,ensur:0,entri:0,entropi:0,enumer:0,epsilon_:0,equal:0,equival:0,error:0,estim:0,eta:0,etc:0,evalu:0,even:0,everi:0,exampl:0,except:0,exclud:0,exclude_contemporan:0,exclude_i:0,exclude_j:0,exclude_k:0,exclude_self_effect:0,execut:0,exist:0,expect:0,experi:0,experiment:0,explain:0,extern:0,extraz:0,f_x:0,f_y:0,factor:0,faculti:0,faith:0,fals:0,fancyarrowpatch:0,faster:0,fdr:0,fdr_bh:0,fdr_method:0,featur:0,feedback:0,fig:0,fig_ax:0,figsiz:0,figur:0,file:0,fill:0,filter:0,fine:0,first:0,fit:0,fit_model:0,fit_result:0,fit_total_effect:0,fit_wright_effect:0,fix:0,fix_all_edges_before_final_orient:0,fixed_thr:0,flag:0,flaxman:0,flexibl:0,follow:0,fontsiz:0,forbidden_nod:0,forc:0,forecast:0,form:0,format:0,forward:0,found:0,four:0,frac:0,fraction:0,framework:0,free:0,freedom:0,frenzel:0,frequenc:0,frequent:0,friendli:0,from:0,full:0,fullci:0,fulli:0,func:0,further:0,futur:0,gabor:0,gatewai:0,gauss_pr:0,gaussian:0,gaussianprocessregressor:0,gaussprocreg:0,gaussprocregtorch:0,generate_and_save_nulldist:0,generate_nulldist:0,gerhardu:0,get:0,get_ac:0,get_all_ac:0,get_all_amc:0,get_amc:0,get_analytic_confid:0,get_analytic_signific:0,get_bootstrap_confid:0,get_c:0,get_ce_max:0,get_coef:0,get_coeff:0,get_conditional_entropi:0,get_confid:0,get_corrected_pvalu:0,get_dependence_measur:0,get_fit:0,get_fixed_thres_signific:0,get_general_fitted_model:0,get_general_predict:0,get_graph_from_dict:0,get_graph_from_link:0,get_graph_from_pmatrix:0,get_lagged_depend:0,get_links_from_graph:0,get_mc:0,get_measur:0,get_medi:0,get_mediation_graph_data:0,get_model_selection_criterion:0,get_optimal_set:0,get_predictor:0,get_shuffle_signific:0,get_signific:0,get_test_arrai:0,get_train_arrai:0,get_tsg:0,get_val_matrix:0,github:0,give:0,given:0,going:0,gp_param:0,gpdc:0,gpdctorch:0,gpytorch:0,graph:0,graph_bool:0,graph_data:0,graph_is_mag:0,graph_typ:0,graphic:0,greater:0,grei:0,grey_masked_sampl:0,grid:0,ground:0,guarante:0,guidanc:0,handl:0,hard:0,has:0,has_path:0,hash:0,have:0,head:0,heavisid:0,heigth:0,help:0,helper:0,henc:0,here:0,hidden:0,hidden_vari:0,high:0,higher:0,histogram:0,hochberg:0,horizont:0,how:0,howev:0,html:0,http:0,hyper:0,hyperparamet:0,hypothesi:0,hypothet:0,identifi:0,iint:0,implement:0,impli:0,importantli:0,improv:0,includ:0,include_lagzero_link:0,include_lagzero_par:0,include_neighbor:0,incom:0,index:0,indirect:0,individu:0,inf:0,infin:0,info:0,inform:0,inherit:0,initi:0,initial_valu:0,inner_edg:0,inner_edge_styl:0,inno_cov:0,innov:0,input:0,instanc:0,instanti:0,instead:0,instruct:0,integ:0,intellig:0,interdisciplinari:0,interest:0,intern:0,interpret:0,interv:0,interven:0,intervent:0,intervention_data:0,intervention_typ:0,introduc:0,introduct:0,inv_inno_cov:0,invalid:0,invers:0,invit:0,irrelev:0,iter:0,its:0,itself:0,j_t:0,joint:0,journal:0,just:0,kei:0,kernel:0,kind:0,knn:0,kretschmer:0,kwarg:0,label:0,label_fonts:0,label_space_left:0,label_space_top:0,lag1:0,lag2:0,lag:0,lag_arrai:0,lag_mod:0,lag_unit:0,lagfunct:0,lagged_par:0,larg:0,larger:0,last:0,latent:0,later:0,latter:0,lead:0,learn:0,least:0,leav:0,left:0,legend:0,legend_fonts:0,legend_width:0,len:0,length:0,less:0,let:0,lett:0,level:0,lightgrei:0,like:0,likelihood:0,limit:0,lin_f:0,line:0,linear:0,linear_model:0,linearmedi:0,linearregress:0,linewidth:0,link:0,link_attribut:0,link_coeff:0,link_colorbar_label:0,link_frequ:0,link_label_fonts:0,link_matrix:0,link_width:0,links_coeff:0,links_to_graph:0,list:0,load:0,log:0,look:0,low:0,lower:0,lowhighpass_filt:0,made:0,mag:0,magnitud:0,mai:0,main:0,major:0,make:0,mani:0,map:0,margin:0,maria:0,mark:0,marker:0,markers:0,markov:0,mask:0,mask_typ:0,match:0,mathcal:0,matplotlib:0,matric:0,matrix:0,matter:0,max:0,max_combin:0,max_cond_px:0,max_conds_dim:0,max_conds_pi:0,max_conds_px:0,max_conds_px_lag:0,max_delai:0,max_lag:0,max_lag_or_tau_max:0,max_p_glob:0,max_p_non_ancestr:0,max_pds_set:0,max_q_glob:0,maxim:0,maximum:0,mce:0,mci:0,mean:0,measur:0,med:0,member:0,memori:0,method:0,method_arg:0,middl:0,might:0,minim:0,minimized_optim:0,minimum:0,minu:0,miss:0,missing_flag:0,mlr:0,mmr:0,mode:0,model_param:0,modul:0,modulo:0,momentari:0,more:0,most:0,most_frequent_link:0,mostli:0,motif:0,much:0,multi:0,multipl:0,multivari:0,must:0,mutual:0,n_preliminary_iter:0,n_symb:0,nail:0,name:0,nan:0,napds_t:0,natur:0,ncomms9502:0,nearest:0,necessari:0,need:0,neg:0,neighbor:0,nest:0,net_to_tsg:0,network:0,network_lower_bound:0,neural:0,neurip:0,never:0,nevertheless:0,new_data:0,niehgbor:0,no_apr:0,no_nois:0,no_non_ancestral_phas:0,node:0,node_aspect:0,node_colorbar_label:0,node_label_s:0,node_po:0,node_s:0,node_tick:0,nois:0,non:0,non_rep:0,none:0,nonlinear:0,nonstat:0,nonstationari:0,nonzero:0,normal:0,note:0,nowack:0,npz:0,null_dist:0,null_dist_filenam:0,nulldist:0,number:0,numer:0,numpi:0,object:0,observ:0,observed_var:0,occur:0,onc:0,one:0,onli:0,only_non_causal_path:0,opac:0,oper:0,opposit:0,optim:0,optimality_cond_des_ym:0,optimality_cond_i:0,optimz:0,option:0,oracl:0,oracleci:0,order:0,ordin:0,ordinal_patt_arrai:0,ordinari:0,org:0,orient:0,orient_comtemp:0,orient_contemp:0,origin:0,orrd:0,oset:0,oset_:0,other:0,otherwis:0,otion:0,ouput:0,out:0,outcom:0,output:0,over:0,overlaid:0,overlap:0,overrid:0,overwrit:0,p_matrix:0,packag:0,page:0,pair:0,pairwis:0,panel:0,paper:0,parallel:0,paramet:0,parametr:0,parcorr:0,parent:0,parent_node_id:0,parents_dict:0,parents_neighbors_coeff:0,parents_of_lag:0,part:0,partial:0,particular:0,pass:0,pass_period:0,path:0,path_node_arrai:0,path_val_matrix:0,pathwai:0,patt:0,patt_mask:0,patt_tim:0,pattern:0,pc1:0,pc_1:0,pc_alpha:0,pcmciplu:0,pdf:0,peak:0,pearl:0,pearson:0,percentil:0,perform:0,period:0,permut:0,perp:0,perspect:0,phase:0,phi:0,phy:0,physrev:0,pip:0,plai:0,pleas:0,plot_graph:0,plot_gridlin:0,plot_lagfunc:0,plot_mediation_graph:0,plot_mediation_time_series_graph:0,plot_time_series_graph:0,plot_timeseri:0,plot_tsg:0,point:0,pomp:0,pos:0,posit:0,possibl:0,post:0,potenti:0,power:0,pq_matrix:0,practic:0,pre:0,precis:0,precomput:0,pred_param:0,predict_total_effect:0,predict_wright_effect:0,prediction_model:0,predictor:0,prelim_onli:0,prelim_rul:0,prelim_with_collider_rul:0,preliminari:0,preprocess:0,present:0,preserv:0,press:0,previou:0,prime:0,print:0,print_array_info:0,print_info:0,print_result:0,print_significant_link:0,prior:0,priorit:0,prl:0,procedur:0,proceed:0,processor:0,project:0,proper:0,properti:0,provid:0,pseudcod:0,pseudoc:0,pseudocod:0,psi:0,purpos:0,pval:0,pval_max:0,pyplot:0,python:0,q_matrix:0,qualiti:0,quantifi:0,quantil:0,quantile_bin_arrai:0,quantiti:0,r10:0,r_x:0,r_y:0,rais:0,randn:0,random:0,randomst:0,rang:0,rank:0,rate:0,rather:0,ratio:0,rdbu_r:0,recal:0,recommend:0,reconstruct:0,recycle_residu:0,red:0,reduc:0,refer:0,regard:0,regress:0,regular:0,rel:0,relat:0,relationship:0,relev:0,remain:0,remember_only_par:0,remov:0,remove_missing_upto_maxlag:0,repeat:0,replac:0,repo:0,repres:0,requir:0,reset_lagged_link:0,residu:0,respect:0,restrict:0,result:0,return_cleaned_xyz:0,return_data:0,return_dict:0,return_null_dist:0,return_parents_dict:0,return_path:0,return_separate_set:0,return_significant_link:0,rev:0,rho:0,richardson:0,right:0,rizzo:0,robust:0,role:0,row:0,rtype:0,rule:0,run:0,run_bivci:0,run_fullci:0,run_lpcmci:0,run_mci:0,run_pc_stabl:0,run_pcalg:0,run_pcalg_non_timeseries_data:0,run_pcmci:0,run_pcmciplu:0,run_sliding_window_of:0,run_test:0,run_test_raw:0,rung:0,runge18a:0,runtim:0,s41467:0,same:0,sampl:0,sample_s:0,saniti:0,save:0,save_iter:0,save_nam:0,savefig:0,scale:0,sci:0,scienc:0,sciencemag:0,scikit:0,scipi:0,scitat:0,score:0,script:0,search:0,second:0,section:0,see:0,seed:0,seen:0,sejdinov:0,select:0,selected_link:0,selected_target:0,selected_vari:0,selection_var:0,self:0,separ:0,sepset:0,set:0,set_datafram:0,set_mask_typ:0,setter:0,setup:0,setup_arg:0,setup_matrix:0,sever:0,shape:0,shorter:0,should:0,show:0,show_colorbar:0,shown:0,shuffl:0,shuffle_neighbor:0,shuffle_test:0,side:0,sig_blocklength:0,sig_overrid:0,sig_sampl:0,sig_thr:0,sigma:0,signfic:0,signficic:0,signific:0,sim:0,simpl:0,simpli:0,sinc:0,size:0,skeleton:0,skip:0,skip_ticks_data_i:0,skip_ticks_data_x:0,sklearn:0,slice:0,slide:0,slightli:0,smaller:0,smooth:0,smooth_width:0,soft:0,some:0,sort:0,sound:0,sourc:0,space:0,spatial:0,spatio:0,special:0,special_nod:0,specif:0,specifi:0,spirt:0,squar:0,stack:0,standard:0,standard_color_link:0,standard_color_nod:0,standardscal:0,star:0,start:0,starts_with:0,stationar:0,statist:0,std:0,step:0,steps_ahead:0,still:0,stop:0,store:0,str:0,straight:0,strength:0,string:0,structur:0,structural_causal_process:0,student:0,style:0,sub:0,subplot:0,subset:0,subspac:0,suffici:0,suitabl:0,sum:0,sum_:0,summar:0,summari:0,summary_result:0,superset:0,supplement:0,suppli:0,support:0,sure:0,surrog:0,suscept:0,symb_arrai:0,symbol:0,symbolifi:0,symmetr:0,symmetrize_p_and_val_matrix:0,system:0,szeke:0,tail:0,take:0,taken:0,target:0,target_predictor:0,tau:0,tau_:0,tau_max:0,tau_min:0,tau_mix:0,taumax:0,techniqu:0,tempor:0,termin:0,test_indic:0,than:0,thei:0,them:0,themselv:0,theorem:0,theoret:0,thi:0,thm:0,those:0,threshold:0,through:0,tick:0,tickmark:0,tild:0,time_bin_length:0,time_bin_with_mask:0,time_label:0,time_lag:0,timelabel:0,togeth:0,top:0,toronto:0,total:0,toward:0,train:0,train_indic:0,transfer:0,transform:0,translat:0,tripl:0,true_par:0,true_parent_neighbor:0,truncat:0,truth:0,tsg:0,tsg_path_val_matrix:0,tsg_to_net:0,tune:0,tupl:0,tutori:0,twice:0,two:0,two_sided_thr:0,type:0,typic:0,uai2020:0,uai:0,uncertainti:0,unclear:0,uncondit:0,undecid:0,under:0,underli:0,undirect:0,uniform:0,uniqu:0,unit:0,unlik:0,unori:0,unrestrict:0,unshield:0,unshuffl:0,update_middle_mark:0,upper:0,use:0,use_a_pds_t_for_major:0,use_mask:0,used:0,useful:0,user:0,uses:0,using:0,v84:0,val:0,val_matrix:0,val_matrix_interv:0,val_matrix_mean:0,val_min:0,val_onli:0,valid:0,valu:0,var1:0,var2:0,var_nam:0,var_network:0,var_process:0,var_unit:0,vari:0,variabl:0,varianc:0,variant:0,varibl:0,variou:0,varlag:0,varx:0,vector:0,verbos:0,veri:0,vertic:0,via:0,view:0,visual:0,vmax_edg:0,vmax_nod:0,vmin_edg:0,vmin_nod:0,weight:0,weighted_avg_and_std:0,well:0,when:0,where:0,whether:0,which:0,whichev:0,wide:0,widehat:0,width:0,wildcard:0,window:0,window_length:0,window_step:0,within:0,without:0,work:0,worker:0,wrapper:0,wright:0,www:0,x_base:0,x_i:0,x_j:0,x_t:0,xyz:0,y_base:0,y_t:0,yield:0,you:0,z_i:0,z_j:0,z_t:0,zero:0},titles:["TIGRAMITE"],titleterms:{"function":0,analysi:0,causal:0,causal_effect:0,condit:0,data:0,data_process:0,effect:0,gener:0,independ:0,independence_test:0,indic:0,lpcmci:0,mediat:0,model:0,pcmci:0,plot:0,predict:0,process:0,seri:0,tabl:0,test:0,tigramit:0,time:0,toi:0,toymodel:0}})
\ No newline at end of file
diff --git a/tigramite/causal_effects.py b/tigramite/causal_effects.py
index cdbf92f6..5e878f53 100644
--- a/tigramite/causal_effects.py
+++ b/tigramite/causal_effects.py
@@ -2262,7 +2262,9 @@ def lin_f(x): return x
# Create some missing values
data[-10:,:] = 999.
- dataframe = pp.DataFrame(data, missing_flag=999.)
+ var_names = range(5)
+ dataframe = pp.DataFrame(data, var_names=var_names,
+ missing_flag=999.)
# Construct expert knowledge graph from links here