func PseudoMetric(m markov.MarkovChain, lambda float64, TPSolver func(markov.MarkovChain, *coupling.Node, [][]float64, float64, int, int)) [][]float64 { // initialize all the sets and the coupling n := len(m.Transitions) tocompute := sets.InitToCompute(len(m.Transitions)) visited := sets.MakeMatrix(n) exact := sets.MakeMatrix(n) c := coupling.New() d := InitD(n) for !sets.EmptySet(tocompute) { var node *coupling.Node s, t := extractrandomfromset(tocompute) s, t = utils.GetMinMax(s, t) tocompute[s][t], tocompute[t][s] = false, false log.Printf("Run with node: (%v,%v)", s, t) if m.Labels[s] != m.Labels[t] { // s and t have the same label, so we set its distance to 0, and its exact and visited to true log.Printf("State %v and %v had different labels", s, t) d[s][t] = 1 exact[s][t] = true visited[s][t] = true continue } else if s == t { // s and t are the same state, so we set its distance to 1, and its exact and visited to true log.Printf("State %v %v) was the same state", s, t) d[s][t] = 0 exact[s][t] = true visited[s][t] = true continue } // since the pair of states is not the same and share a label, we have to further process it // try to find the correpsonding node in the coupling node = coupling.FindNode(s, t, &c) if node == nil { // if FindNode returned a nil pointer, the node does not exist, and we have to make it node = matching.FindFeasibleMatching(m, s, t, &c) setpair.Setpair(m, node, exact, visited, d, &c) } else if node.Adj == nil { // if FindNode did return a node reference, but its adjacency matrix(matching) is nil, we have to create it node = matching.FindFeasibleMatching(m, s, t, &c) setpair.Setpair(m, node, exact, visited, d, &c) } disc.Disc(lambda, node, exact, d, &c) updateUntilOptimalSolutionsFound(lambda, m, node, exact, visited, d, c, TPSolver, []*coupling.Node{}) removeExactEdges(node, exact) // remove everything that has been computed to exact, such that we will not try to solve it again tocompute = *sets.DifferensReal(&tocompute, &exact) } return d }
func SetUpTest() (Coupling, markov.MarkovChain, [][]bool, [][]bool, [][]float64) { c := New() m := SetUpMarkov() n := len(m.Transitions) visited := sets.MakeMatrix(n) exact := sets.MakeMatrix(n) d := make([][]float64, n, n) for i := 0; i < n; i++ { d[i] = make([]float64, n, n) } return c, m, visited, exact, d }