useDynLib(gRbase)

## Bioconductor imports/exports
## ----------------------------

importClassesFrom(graph, graphNEL)
importFrom(graph, edges, nodes)
#export("edges")
#export("nodes")

##importFrom("RBGL", "maxClique", "is.triangulated", "separates")

importMethodsFrom(Rgraphviz, plot)

## CRAN imports/exports
## --------------------

importFrom(Rcpp, evalCpp)
importFrom("methods", "as", "new", "setOldClass")

importMethodsFrom(Matrix, t, isSymmetric, diag)
importFrom(Matrix, Matrix)
importClassesFrom(Matrix, Matrix)
##exportMethods(plot)

importFrom(igraph, plot.igraph, print.igraph, "graph.edgelist")

importFrom("stats", "as.formula", "cov", "cov2cor", "delete.response",
           "deviance", "formula", "runif", "terms", "xtabs")

importFrom("utils", "str")

importFrom("graphics", "plot")

importFrom(magrittr,"%>%")
export("%>%") ## To make available in vignette 

## gRbase functionality exports

##exportPattern("^[[:alpha:]]+")

## Old stuff from gRbase-paper
export(as.gmData, gModel, gmData, observations, "observations<-",
       "gmData<-", newgmData, validVarTypes, varNames, nLevels,
       valueLabels)

## Generics
export(fit, compile, propagate, stepwise, compareModels)

## Graph algorithms
export(ug, ugList, dag, dagList, ug2dag, coerceGraph, edgeList, 
       edgeListMAT, nonEdgeListMAT, nonEdgeList, isGraphical, isDecomposable,
       glist2adjMAT)

## Graph algorithms
export(is.DAG, is.DAGMAT,
       is.UG, is.UGMAT,
       is.DG, is.DGMAT,
       is.TUG, is.TUGMAT,
       get_cliques,       
       
       moralize, moralizeMAT,
       topo_sort, topo_sortMAT,
       mcs, mcsMAT, mcs_marked,
       triangulate, triangulateMAT,
       rip, ripMAT,
       minimal_triang, minimal_triangMAT,
       mpd, mpdMAT,
       junction_tree, junction_treeMAT,
       triang, triang_mcwh, triang_elo,

       vpar, random_dag)

## Graph properties (used directly or in connection with querygraph/qgraph)
export(querygraph, qgraph, ancestors, ancestralGraph, ancestralSet,
       children, closure, is.complete, is.decomposition, parents,
       is.simplicial, simplicialNodes)

## Graph coercions. Ugly, but I needed a handle on generator lists
export(graphNEL2M, M2graphNEL, M2adjList, M2ugList, M2dagList,
       ugList2M, dagList2M, M2dgCMatrix, M2matrix, M2igraph,
       glist2setMAT)

export(names2pairs, df2xtabs, dimnames_match, parray, as.parray,
       is.named.array, is_named_array_, is_number_vector_,
       simulateArray, cov2pcor, colwiseProd, data2parray, rowmat2list,
       colmat2list, matrix2list, rowSumsPrim, colSumsPrim, as_, iplot,
       rhsf2list, rhsFormula2list, list2rhsf, as.adjMAT, is.adjMAT,
       solveSPD, which_matrix_index, which.arr.index
       )


## Set operations (should perhaps go into a separate package one
## day)
export(all_pairs, all_subsets, all_subsets0, is.subsetof,
       remove_redundant, is_inset, maximal_sets, minimal_sets,
       get_subset, get_superset, is_subsetof, combn_prim)

## Array operations (should perhaps go into a separate package one
## day)
export(ar_new, ar_normalize, ar_slice, ar_slice_prim, ar_marg,
       ar_expand, ar_perm, ar_equal, ar_align, ar_add, ar_sum,
       ar_prod, ar_subt, ar_mult, ar_div, ar_div0, ar_prod_list,
       ar_sum_list, ar_dist, ar_slice_mult, ar_slice_entries)

export(tabAdd, tabAlign, tabDiv, tabDiv0, tabEqual, tabExpand,
       tabMult, tabSubt, tabPerm, tabMarg, tabProd, tabListMult,
       tabListAdd)
       
## Array operations - very low level
export(cell2entry, entry2cell, next_cell, next_cell_slice,
       slice2entry, perm_cell_entries, fact_grid, cell2entry_perm)


## Array operations 
export("%a+%")
export("%a-%")
export("%a*%")
export("%a/%")
export("%a/0%")
export("%a==%")
export("%a_%")
export("%a^%")

## Array operations in R (made in Bristol)

export(tablePerm, tableMult, tableDiv, tableOp, tableSlice,
       tableSlicePrim, tableMargin, tableGetSliceIndex,
       tableSetSliceValue)


## downstream
export(topoSort)  ## topo_sort
S3method(topoSort, default)

export(isin)      ## is_inset
export(tab)       ## newar/ar_new; this is messy
export(get_superset_)
export(is_subsetof_)
export(subsetof)
export(tabMult__)
export(tableOp2)
export(newar)
export(unlistPrim)

## The prim functions... uniquePrim is used in gRc
export(uniquePrim)


export(topoSortMAT) ## Used by mcmcabn

export(jTree)       ## Used by rags2ridges
S3method(jTree, default)




## grim
export(removeRedundant, isGSD_glist, getCliques, mcsmarked,
       combnPrim,
       maxCliqueMAT, intersectPrim, mcsmarkedMAT, setdiffPrim, nextCell,
       outerPrim, ell, ellK, MAT2ftM_)


## S3method(coerceGraph, dgCMatrix)
## S3method(coerceGraph, graphNEL)
## S3method(coerceGraph, igraph)
## S3method(coerceGraph, matrix)

S3method(isGraphical, default)
S3method(isDecomposable, default)

S3method(is.DAG, default)
S3method(is.DAG, graphNEL)
S3method(is.DG, default)
S3method(is.DG, graphNEL)
S3method(is.TUG, default)
S3method(is.TUG, graphNEL)
S3method(is.UG, default)
S3method(is.UG, graphNEL)

S3method(vpar, Matrix)
S3method(vpar, matrix)
S3method(vpar, graphNEL)
S3method(vchi, Matrix)
S3method(vchi, matrix)
S3method(vchi, graphNEL)

S3method(get_cliques, graphNEL)
S3method(get_cliques, default)

S3method(junction_tree, default)
S3method(mcs, default)
S3method(mcs_marked, default)
S3method(minimal_triang, default)
S3method(moralize, default)
S3method(mpd, default)
##S3method(print, parray)
S3method(print, ripOrder)
S3method(rip, default)

S3method(nLevels, default)
S3method(plot, ripOrder)

S3method(nonEdgeList, default)
S3method(edgeList, default)

S3method(fit, ggm)
S3method(topo_sort, default)

S3method(triangulate, default)
S3method(triang, default)
S3method(triang_elo, default)
S3method(triang_mcwh, default)

S3method(iplot, graphNEL)
S3method(plot, ripOrder)
S3method(isDecomposable, default)

S3method(as_, dgCMatrix)
S3method(as_, graphNEL)
S3method(as_, igraph)
S3method(as_, matrix)

S3method(fit, ggm)


## Old stuff from gRbase paper

S3method(valueLabels, gmData)
S3method(valueLabels, default)
S3method("valueLabels<-", gmData)
## S3method(valueLabels, array)
## S3method(valueLabels, parray)

S3method(dataOrigin, gmData)
S3method(as.gmData, array)
S3method(as.gmData, data.frame)
S3method(as.gmData, table)

S3method(nominal, gmData)
S3method("nominal<-", gmData)

S3method(observations, gmData)
S3method("observations<-", gmData)

S3method(latent, gmData)
S3method("latent<-", gmData)

S3method(varTypes, gmData)
S3method("varTypes<-", gmData)

S3method(shortNames, gmData)
S3method("shortNames<-", gmData)

S3method(nLevels, default)
S3method(nLevels, gmData)
S3method("nLevels<-", gmData)

S3method(varNames, gmData)
S3method(varNames, default)
S3method("varNames<-", gmData)

S3method(ordinal, gmData)
S3method("ordinal<-", gmData)

S3method("description<-", gmData)
## S3method(varNames, array)
## S3method(varNames, parray)

S3method(gmData, gModel)
S3method("gmData<-", gModel)

S3method(stepwise, hllm)
S3method(update, gModel)
S3method("formula<-", gModel)
S3method(getFit, gRfit)
S3method("getFit<-", gRfit)

S3method(summary, gRfit)
S3method(summary, gmData)

S3method(print, gRfit)
S3method(print, gmData)
S3method(print, gModel)

S3method(fit, hllm)

