// Copyright ©2017 The gonum Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.

package mat_test

import (
	"fmt"
	"log"
	"math"

	"gonum.org/v1/gonum/mat"
)

func ExampleGSVD() {
	// Perform a GSVD factorization on food production/consumption data for the
	// three years 1990, 2000 and 2014, for Africa and Latin America/Caribbean.
	//
	// See Lee et al. doi:10.1371/journal.pone.0030098 and
	// Alter at al. doi:10.1073/pnas.0530258100 for more details.
	var gsvd mat.GSVD
	ok := gsvd.Factorize(FAO.Africa, FAO.LatinAmericaCaribbean, mat.GSVDU|mat.GSVDV|mat.GSVDQ)
	if !ok {
		log.Fatal("GSVD factorization failed")
	}

	u := gsvd.UTo(nil)
	v := gsvd.VTo(nil)

	s1 := gsvd.ValuesA(nil)
	s2 := gsvd.ValuesB(nil)

	fmt.Printf("Africa\n\ts1 = %.4f\n\n\tU = %.4f\n\n",
		s1, mat.Formatted(u, mat.Prefix("\t    "), mat.Excerpt(2)))
	fmt.Printf("Latin America/Caribbean\n\ts2 = %.4f\n\n\tV = %.4f\n",
		s2, mat.Formatted(v, mat.Prefix("\t    "), mat.Excerpt(2)))

	var q mat.Dense
	q.Mul(gsvd.ZeroRTo(nil), gsvd.QTo(nil))
	fmt.Printf("\nCommon basis vectors\n\n\tQ^T = %.4f\n",
		mat.Formatted(q.T(), mat.Prefix("\t      ")))

	// Calculate the antisymmetric angular distances for each eigenvariable.
	fmt.Println("\nSignificance:")
	for i := 0; i < 3; i++ {
		fmt.Printf("\teigenvar_%d: %+.4f\n", i, math.Atan(s1[i]/s2[i])-math.Pi/4)
	}

	// Output:
	//
	// Africa
	// 	s1 = [1.0000 0.9344 0.5118]
	//
	// 	U = Dims(21, 21)
	// 	    ⎡-0.0005   0.0142  ...  ...  -0.0060  -0.0055⎤
	// 	    ⎢-0.0010   0.0019             0.0071   0.0075⎥
	// 	     .
	// 	     .
	// 	     .
	// 	    ⎢-0.0007  -0.0024             0.9999  -0.0001⎥
	// 	    ⎣-0.0010  -0.0016  ...  ...  -0.0001   0.9999⎦
	//
	// Latin America/Caribbean
	// 	s2 = [0.0047 0.3563 0.8591]
	//
	// 	V = Dims(14, 14)
	// 	    ⎡ 0.1362   0.0008  ...  ...   0.0700   0.2636⎤
	// 	    ⎢ 0.1830  -0.0040             0.2908   0.7834⎥
	// 	     .
	// 	     .
	// 	     .
	// 	    ⎢-0.2598  -0.0324             0.9339  -0.2170⎥
	// 	    ⎣-0.8386   0.1494  ...  ...  -0.1639   0.4121⎦
	//
	// Common basis vectors
	//
	// 	Q^T = ⎡ -8172.4084   -4524.2933    4813.9616⎤
	// 	      ⎢ 22581.8020   12397.1070  -16364.8933⎥
	// 	      ⎣ -8910.8462  -10902.1488   15762.8719⎦
	//
	// Significance:
	// 	eigenvar_0: +0.7807
	// 	eigenvar_1: +0.4211
	// 	eigenvar_2: -0.2482
}
