first version with a custom matrix reader but we should throw away this because there is a built-in matrix market reader

This commit is contained in:
antonl 2026-03-14 18:11:28 +01:00
parent 651e619f7d
commit d11d53c0a4
2 changed files with 92 additions and 0 deletions

2
go.sum Normal file
View File

@ -0,0 +1,2 @@
gonum.org/v1/gonum v0.17.0 h1:VbpOemQlsSMrYmn7T2OUvQ4dqxQXU+ouZFQsZOx50z4=
gonum.org/v1/gonum v0.17.0/go.mod h1:El3tOrEuMpv2UdMrbNlKEh9vd86bmQ6vqIcDwxEOc1E=

90
src/main.go Normal file
View File

@ -0,0 +1,90 @@
package main
import (
"bufio"
"fmt"
"io"
"os"
"strconv"
"strings"
"github.com/james-bowman/sparse"
"gonum.org/v1/gonum/mat"
)
func matrix_read_market(path string) (*sparse.CSR, error) {
f, err := os.Open(path)
if err != nil {
return nil, fmt.Errorf("open %q: %w", path, err)
}
defer f.Close()
sc := bufio.NewScanner(f)
const maxCapacity = 1024 * 1024 // Long lines
buf := make([]byte, 64*1024)
sc.Buffer(buf, maxCapacity)
if !sc.Scan() {
if err := sc.Err(); err != nil {
return nil, fmt.Errorf("read header: %w", err)
}
return nil, fmt.Errorf("empty file!")
}
header := strings.Fields(strings.TrimSpace(sc.Text()))
if len(header) != 5 || header[0] != "%%MatrixMarket" {
return nil, fmt.Errorf("invalid matrix martket header: %q", sc.Text())
}
object := strings.ToLower(header[1])
format := strings.ToLower(header[2])
field := strings.ToLower(header[3])
symmetry := strings.ToLower(header[4])
if object != "matrix" {
return nil, fmt.Errorf("unsupported object: %q", object)
}
if format != "coordinate" {
return nil, fmt.Errorf("unsupported format %q (need coordinate)", format)
}
switch field {
case "real", "integer", "pattern":
default:
return nil, fmt.Errorf("unsupported field %q", field)
}
switch symmetry {
case "general", "symmetric":
default:
return nil, fmt.Errorf("unsupported symmetry %q", symmetry)
}
// Skip comments and then read the size line
var size_line string
for sc.Scan() {
line := strings.TrimSpace(sc.Text())
if line == "" || strings.HasPrefix(line, "%") {
continue // skip comment
}
sizeLine
}
func main() {
A := mat.NewDense(2, 2, []float64{
1, 2,
3, 4,
})
B := mat.NewDense(2, 2, []float64{
5, 6,
7, 8,
})
var C mat.Dense
C.Mul(A, B)
fmt.Printf("%v\n", mat.Formatted(&C))
}