Files
2026-07-13 11:17:57 +05:00

87 lines
2.0 KiB
Go

package analize
import (
"errors"
"fmt"
"time"
"control/control_case"
"control/series"
"gorm.io/gorm"
)
func RunAnalyzeWorker(db *gorm.DB) {
for {
var cases []control_case.ControlCase
if err := db.Where("status = ?", "R").Find(&cases).Error; err != nil {
fmt.Printf("failed to load cases for analysis: %v\n", err)
time.Sleep(10 * time.Second)
continue
}
for _, controlCase := range cases {
if _, err := AnalyzeCSV(db, controlCase.ID, controlCase.Name, controlCase.FooCSVPath()); err != nil {
fmt.Printf("failed to analyze case %d: %v\n", controlCase.ID, err)
continue
}
if err := db.Model(&control_case.ControlCase{}).Where("id = ?", controlCase.ID).Update("status", "D").Error; err != nil {
fmt.Printf("failed to mark case %d as done: %v\n", controlCase.ID, err)
}
}
time.Sleep(10 * time.Second)
}
}
func AnalyzeCSV(db *gorm.DB, caseID uint, caseName, csvPath string) (*Analize, error) {
data, err := series.ReadCSV(csvPath)
if err != nil {
return nil, err
}
if len(data.Rows) == 0 {
return nil, fmt.Errorf("csv has no data rows")
}
columns, err := data.NumericColumns("t", "psi_m", "psi_l")
if err != nil {
return nil, err
}
times, psiM, psiL := columns[0], columns[1], columns[2]
if len(psiL) == 0 {
return nil, fmt.Errorf("no numeric rows found in csv")
}
psiMax := series.MaxLastHalf(psiM)
psiLMax := series.MaxLastHalf(psiL)
omega := series.MainAngularFrequency(times, psiL)
result := &Analize{
Name: fmt.Sprintf("analysis-%d", caseID),
CaseID: caseID,
CaseName: caseName,
PsiMax: psiMax,
PsiLMax: psiLMax,
Omega: omega,
}
var existing Analize
err = db.Where("case_id = ?", caseID).First(&existing).Error
if err != nil {
if errors.Is(err, gorm.ErrRecordNotFound) {
if err := db.Create(result).Error; err != nil {
return nil, err
}
return result, nil
}
return nil, err
}
result.ID = existing.ID
if err := db.Save(result).Error; err != nil {
return nil, err
}
return result, nil
}