Golang implementation of CLOPE clusterization algorythm with parallel calculation.
Install go-clope
$ go get github.com/realb0t/go-clope
Example programm:
package clope_example
import (
"github.com/realb0t/go-clope/clope"
"github.com/realb0t/go-clope/cluster/store"
"github.com/realb0t/go-clope/transaction"
"github.com/realb0t/go-clope/transaction/simple"
io "github.com/realb0t/go-clope/io/memory"
driver "github.com/realb0t/go-clope/cluster/store/driver/memory"
)
func main() {
trans := []*transaction.Transaction{
simple.Make( "a", "b" ),
simple.Make( "a", "b", "c" ),
simple.Make( "a", "c", "d" ),
simple.Make( "d", "e" ),
simple.Make( "d", "e", "f" ),
simple.Make( "h", "e", "l", "l", "o", " ", "w", "o", "r", "l", "d" ),
simple.Make( "h", "e", "l", "l", "o" ),
simple.Make( "w", "o", "r", "l", "d" ),
}
repulsion := 1.8
input := io.NewMemoryInput(&trans)
output := io.NewMemoryOutput()
driver := driver.NewMemory()
storage := store.NewStore(driver)
process := clope.NewProcess(input, output, store, repulsion)
err := process.Build()
if (err != nil) {
panic(err)
}
// Print created clusters
storage.Print()
}
Output:
[1] - [[w o r l d] [h e l l o] [h e l l o w o r l d]]
[2] - [[a c d] [a b c] [a b] [d e] [d e f]]
Output Pop/Push can include into DB-transaction.
Transaction - is data-transaction structure have atoms collection.
Atom - is data structure for build transaction entity (as string).
Example: gender:female
, income:site-from.com
, etc.
Clusters - map of all linked transaction.
Input - is data-store source for transactions
Output - is data-store for work algorythm. Before session is empty and after session is empty.
Store - is data-store for storage results as array of clusters with linked transactions.
Package go-clope/clope
have struct clope.Process
with three methods:
Initialization
, Iteration
and Build
.
Method Initialization
build first clusters structure by transactions from Input. And Push linked transactions into Output.
Method Iteration
transactions distributes between clusters. And Push transactions into Output.
Method Build
call clusters reset and call Initialization
and Iteration
.
Base usage:
process := clope.NewProcess(input, output, repulsion)
err := process.Build()
After Build
you can call again Iteration
.
For read results you can make use of your IO Output or cluster.Clusters
map or cluster.Print()
function for print.
Package go-clope/io
have test IO-structures MemoryInput
and MemoryOutput
for memory data storing .
You can create other IO structures for other data stores (PostgreSQL, MongoDB, Redis, etc.).
Your IO structures must implement for interface:
type Input interface {
// Pop Pop transaction unlinked from data store.
Pop() (*transaction.Transaction, error)
}
type Output interface {
// Pop Pop linked (to cluster) transaction. After initialization process.
Input
// Push linked (to cluster) transaction into data store.
Push(*transaction.Transaction) error
}
Result storage is Cluster store and then driver.
For get Clusters as map[int]*cluster.Cluster
:
clusters, errors := storage.Driver().Clusters()
For iterate Clusters:
storage.Driver().Iterate(func(clu *cluster.Cluster) {
// ...
})
For acces for Cluster Transaction use Driver.ClusterTransactions function:
storage.Driver().Iterate(func(clu *cluster.Cluster) {
transactions := storage.Driver().ClusterTransactions(clu)
})
Or get all transaction as map[int][]*transaction.Transaction
:
transactions, error := storage.Driver().Transactions()
- Abstract Transaction (with custom fields)
- Apply decimal calculations
- Create clustarization testing tools