# DotProductGraphs

A Julia Package to work with Random Dot Product Graphs.

It should cover all things RDPG, from SVD embeddings of networks, to more advanced functionalities such as omniembeddings, procrustes alignments, and so on.

## Functioning

For now, you can retrieve an embedding of a given size:

```
# we build a random, silly 1,0 matrix A
# and think of it as a Graph adjacency matrix
A = rand(Bool,100,100)
# we build a pair of 4 dimensional embeddings
Left_embedding, Right_embedding = svd_embedding(A,4)
# or we can let the function identify automatically the optimal embedding dimension
Left_optimal, Right_optimal = svd_embedding(A)
```

And produce a matrix of interaction probability by dot product:

`P = dot_product(Left_embedding, Right_embedding)`

## TODO

- Document all the things!
- Unit Tests All The Things!
- Include basic embedding and dot product capability relying on LinearAlgebra
- Allow user to choose the svd "engine" (e.g., KrylovKit.JL, Arpack.JL, LowRankApprox.jl, ...) by defining a unified interface
- Implement Omniembedding functions
- Automatic block matrix building
- Embedding extraction

- Implement Procrustes Allignment
- orthogonal
- Partial: Just getting the min distances (cheating, as we compute the full rotation matrix)
- Full: Obtaining rotation matrix

- allowing translations
- seedless

- orthogonal
- Elbow method to choose dimensionality
- hard thresholds?

- Register package.
- Think how to integrate with Graphs.jl and EcologicalNetworks.jl

## Acknowledgement

DotProductGraphs is heavily inspired by graspologic, but it focus on being light (focussing on a narrower set of techniques, as we complement wider ecosystems as Graphs.jl and EcologicalNetworks.jl) and squeezing out performance from being written in Julia.