-
Notifications
You must be signed in to change notification settings - Fork 1
/
Index.jsx
120 lines (101 loc) · 4.07 KB
/
Index.jsx
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
import React, { useState, useEffect} from "react"
import CholeskyBodyDescription from "./CholeskyBodyDescription"
import CholeskyBodyExecution from "./CholeskyBodyExecution"
import CholeskyBodyResult from "./CholeskyBodyResult"
import validateMatrix from "../../../utilities/validateMatrix"
import validateVector from "../../../utilities/validateVector"
import Cholesky from "../../../utilities/methods/functions/Cholesky"
import transformMatrix from "../../../utilities/transformMatrix"
import Graph from "../../graph"
import { isNull } from "mathjs"
const mathjs = require("mathjs")
const Doolittlebody = () => {
//Se crea el estado que guardara la info del formulario con sus valores iniciales
const [dataForm, setDataForm] = useState({
A: '4,-1,0,3;1,15.5,3,8;0,-1.3,-4,1.1;14,5,-2,30',
b: '1;1;1;1'
})
// Método para cambiar el valor de los campos del formulario
const handleChangeDataForm = (e) => {
setDataForm({ ...dataForm, [`${e.target.id}`]: e.target.value })
}
//Se crea el estado que guardará los errores ocurridos durante la ejecución del método
const [logs, setLogs] = useState([])
//Se crea el estado para validar si mostrar los resultados siempre y cuando se haya ejecutado el método
const [isRun, setIsRun] = useState(false);
//Se crea el estado para guardar la lista de matrices resultantes
const [matrixList,setMatrixList] = useState([]);
//Se crea el estado para guardar el vector x resultantes
const [vectorResult,setVectorResult] = useState([]);
const validateData = ({ A, b }) => {
const { message, n } = validateMatrix(A);
const logsAux = [];
let flag = true;
if (!(message === 'Success')) {
logsAux.push({ type: 'Error', text: message })
flag = false;
}
const validateVectorResult = validateVector(b, n);
if (message === 'Success' && !(validateVectorResult === 'Success')) {
logsAux.push({ type: 'Error', text: validateVectorResult })
flag = false;
}
setLogs(logsAux);
return flag;
}
//Función para correr el método
const run = () => {
const validateDataResult = validateData({ ...dataForm });
if(validateDataResult){
const matrixTransformered = transformMatrix(dataForm.A);
const vectorTransformered = transformMatrix(dataForm.b);
const eigs = mathjs.eigs(matrixTransformered);
var flag= true;
for(var i=0;i<eigs.values.length;i++){
console.log(eigs.values[i])
if(eigs.values[i]<0){
flag = false;
}
}
if(flag){
const {x, stages,logs} = Cholesky(matrixTransformered,vectorTransformered);
setLogs(logs);
if(stages.length >0 && !isNull(x)){
setMatrixList(stages);
setVectorResult(x);
setIsRun(true);
}
}else{
let message = { type: 'Error', text: "The matrix is not positive definite"}
let logs = [message];
setLogs(logs);
}
}else{
setIsRun(false);
}
}
useEffect(()=>{
if(isRun){
document.getElementById('result_cholesky').scrollIntoView()
}
},[isRun])
//Método para reiniciar los valores
const clear = () => {
setDataForm({
A: '4,-1,0,3;1,15.5,3,8;0,-1.3,-4,1.1;14,5,-2,30',
b: '1;1;1;1'
})
setIsRun(false);
setLogs([]);
}
return (
<div className="container">
<h1 className="text-center">Cholesky</h1>
<CholeskyBodyDescription />
<CholeskyBodyExecution run={run} dataForm={dataForm} handleChangeDataForm={handleChangeDataForm} logs={logs} clear={clear}/>
{isRun?<CholeskyBodyResult matrixList={matrixList} vectorResult={vectorResult}/>:null}
<Graph />
</div>
)
}
export default Doolittlebody;