useDynLib(gRbase)

## Vanilla R imports (and exports)
## -------------------------------
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 

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

importClassesFrom(graph, graphNEL)
importFrom(graph, edges, nodes, randomGraph)
export(randomGraph)

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

importMethodsFrom(Rgraphviz, plot)
exportMethods(plot) ## IS THIS OK FOR CRAN????

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

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

importMethodsFrom(Matrix, t, isSymmetric, diag)
importFrom(Matrix, Matrix)
importClassesFrom(Matrix, Matrix)

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

## gRbase functionality exports

## 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
##        )


export(gn2xm_, xm2gn_, xm2ig_,
       M2adl_ , M2ugl_, M2dagl_
       ##M2adjList, M2ugList, M2dagList,
       ##ugList2M, dagList2M
       ##M2dgCMatrix, M2matrix, 
       )

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, 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_) ## Bruges i gRain
export(is_subsetof_)  ## Bruges i gRain
export(subsetof)      ## Bruges i gRain
export(tabMult__)     ## Bruges i gRain
export(tableOp2)      ## Bruges i gRain

export(get_subset_)   ## Bruges ikke downstream
export(unlistPrim)    ## Bruges denne???

## The prim functions... 
export(uniquePrim)       ## uniquePrim is used in gRc
export(topoSortMAT)      ## Used by mcmcabn

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

## grain
export(is.TUG, is.DAG)

## simPATHy
export(is.UG, is.DG, graphNEL2M, M2graphNEL)

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


export(isGraphical.default, isDecomposable.default)

## --------------------


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

## Not to self: Export methods but do not create aliases in .Rd files
## (remember to drop aliases on roxygen). Then methods are available
## for generics but not exported.

S3method(is_dag, default)
S3method(is_dag, graphNEL)
S3method(is_dag, igraph)
S3method(is_dg, default)
S3method(is_dg, graphNEL)
S3method(is_dg, igraph)
S3method(is_tug, default)
S3method(is_tug, graphNEL)
S3method(is_tug, igraph)
S3method(is_ug, default)
S3method(is_ug, graphNEL)
S3method(is_ug, igraph)

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_fun, dgCMatrix)
## S3method(.as_fun, graphNEL)
## S3method(.as_fun, igraph)
## S3method(.as_fun, 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)

