// Copyright ©2015 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"

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

func ExampleFormatted() {
	a := mat.NewDense(3, 3, []float64{1, 2, 3, 0, 4, 5, 0, 0, 6})

	// Create a matrix formatting value with a prefix and calculating each column
	// width individually...
	fa := mat.Formatted(a, mat.Prefix("    "), mat.Squeeze())

	// and then print with and without zero value elements.
	fmt.Printf("with all values:\na = %v\n\n", fa)
	fmt.Printf("with only non-zero values:\na = % v\n\n", fa)

	// Modify the matrix...
	a.Set(0, 2, 0)

	// and print it without zero value elements.
	fmt.Printf("after modification with only non-zero values:\na = % v\n\n", fa)

	// Modify the matrix again...
	a.Set(0, 2, 123.456)

	// and print it using scientific notation for large exponents.
	fmt.Printf("after modification with scientific notation:\na = %.2g\n\n", fa)
	// See golang.org/pkg/fmt/ floating-point verbs for a comprehensive list.

	// Output:
	// with all values:
	// a = ⎡1  2  3⎤
	//     ⎢0  4  5⎥
	//     ⎣0  0  6⎦
	//
	// with only non-zero values:
	// a = ⎡1  2  3⎤
	//     ⎢.  4  5⎥
	//     ⎣.  .  6⎦
	//
	// after modification with only non-zero values:
	// a = ⎡1  2  .⎤
	//     ⎢.  4  5⎥
	//     ⎣.  .  6⎦
	//
	// after modification with scientific notation:
	// a = ⎡1  2  1.2e+02⎤
	//     ⎢0  4        5⎥
	//     ⎣0  0        6⎦
}

func ExampleFormatted_mATLAB() {
	a := mat.NewDense(3, 3, []float64{1, 2, 3, 0, 4, 5, 0, 0, 6})

	// Create a matrix formatting value using MATLAB format...
	fa := mat.Formatted(a, mat.FormatMATLAB())

	// and then print with and without layout formatting.
	fmt.Printf("standard syntax:\na = %v\n\n", fa)
	fmt.Printf("layout syntax:\na = %#v\n\n", fa)

	// Output:
	// standard syntax:
	// a = [1 2 3; 0 4 5; 0 0 6]
	//
	// layout syntax:
	// a = [
	//  1 2 3
	//  0 4 5
	//  0 0 6
	// ]
}

func ExampleFormatted_python() {
	a := mat.NewDense(3, 3, []float64{1, 2, 3, 0, 4, 5, 0, 0, 6})

	// Create a matrix formatting value with a prefix using Python format...
	fa := mat.Formatted(a, mat.Prefix("    "), mat.FormatPython())

	// and then print with and without layout formatting.
	fmt.Printf("standard syntax:\na = %v\n\n", fa)
	fmt.Printf("layout syntax:\na = %#v\n\n", fa)

	// Output:
	// standard syntax:
	// a = [[1, 2, 3], [0, 4, 5], [0, 0, 6]]
	//
	// layout syntax:
	// a = [[1, 2, 3],
	//      [0, 4, 5],
	//      [0, 0, 6]]
}

func ExampleExcerpt() {
	// Excerpt allows diagnostic display of very large
	// matrices and vectors.

	// The big matrix is too large to properly print...
	big := mat.NewDense(100, 100, nil)
	for i := 0; i < 100; i++ {
		big.Set(i, i, 1)
	}

	// so only print corner excerpts of the matrix.
	fmt.Printf("excerpt big identity matrix: %v\n\n",
		mat.Formatted(big, mat.Prefix(" "), mat.Excerpt(3)))

	// The long vector is also too large, ...
	long := mat.NewVecDense(100, nil)
	for i := 0; i < 100; i++ {
		long.SetVec(i, float64(i))
	}

	// ... so print end excerpts of the vector,
	fmt.Printf("excerpt long column vector: %v\n\n",
		mat.Formatted(long, mat.Prefix(" "), mat.Excerpt(3)))
	// or its transpose.
	fmt.Printf("excerpt long row vector: %v\n",
		mat.Formatted(long.T(), mat.Prefix(" "), mat.Excerpt(3)))

	// Output:
	// excerpt big identity matrix: Dims(100, 100)
	//  ⎡1  0  0  ...  ...  0  0  0⎤
	//  ⎢0  1  0            0  0  0⎥
	//  ⎢0  0  1            0  0  0⎥
	//   .
	//   .
	//   .
	//  ⎢0  0  0            1  0  0⎥
	//  ⎢0  0  0            0  1  0⎥
	//  ⎣0  0  0  ...  ...  0  0  1⎦
	//
	// excerpt long column vector: Dims(100, 1)
	//  ⎡ 0⎤
	//  ⎢ 1⎥
	//  ⎢ 2⎥
	//   .
	//   .
	//   .
	//  ⎢97⎥
	//  ⎢98⎥
	//  ⎣99⎦
	//
	// excerpt long row vector: Dims(1, 100)
	//  [ 0   1   2  ...  ...  97  98  99]
}
