89 lines
3.0 KiB
Python
89 lines
3.0 KiB
Python
from flask import Flask, render_template, request
|
|
import HookJeeves
|
|
import os
|
|
import json
|
|
|
|
app = Flask(__name__)
|
|
app.config["UPLOAD_FOLDER"] = "uploads/"
|
|
os.makedirs(app.config["UPLOAD_FOLDER"], exist_ok=True)
|
|
|
|
|
|
def parse_uploaded_data(file):
|
|
data = json.load(file)
|
|
return data
|
|
|
|
|
|
def to_str(arr):
|
|
return ",".join(list(map(str, arr)))
|
|
|
|
|
|
@app.route("/", methods=["GET", "POST"])
|
|
def index():
|
|
if request.method == "POST":
|
|
if "datafile" in request.files and request.files["datafile"].filename != "":
|
|
file = request.files["datafile"]
|
|
data = parse_uploaded_data(file)
|
|
else:
|
|
try:
|
|
data = {
|
|
"x0": list(map(float, request.form["x0"].split(","))),
|
|
"delta0": list(map(float, request.form["delta0"].split(","))),
|
|
"epsilon": float(request.form["epsilon"]),
|
|
"alpha": float(request.form["alpha"]),
|
|
"target": request.form["target"],
|
|
"x1c": list(map(float, request.form["x1c"].split(","))),
|
|
"x2c": list(map(float, request.form["x2c"].split(","))),
|
|
"x1r": list(map(float, request.form["x1r"].split(","))),
|
|
"x2r": list(map(float, request.form["x2r"].split(","))),
|
|
}
|
|
except (KeyError, ValueError, json.JSONDecodeError):
|
|
return render_template(
|
|
"index.html",
|
|
error="Ошибка в данных формы. Заполните все поля корректно.",
|
|
)
|
|
|
|
# Инициализация функций
|
|
c = [data["x1c"][::-1], data["x2c"][::-1]]
|
|
x1r = data["x1r"]
|
|
x2r = data["x2r"]
|
|
target = data["target"]
|
|
|
|
def f(x):
|
|
return sum(
|
|
[
|
|
sum([c[i][j] * x[i] ** j for j in range(len(c[i]))])
|
|
for i in range(len(c))
|
|
]
|
|
)
|
|
|
|
def fit(a, b):
|
|
return a < b if target == "min" else a > b
|
|
|
|
def r(x):
|
|
return x1r[0] <= x[0] <= x1r[1] and x2r[0] <= x[1] <= x2r[1]
|
|
|
|
# Запуск метода
|
|
x, val, x_err = HookJeeves.hooke_jeeves(
|
|
f, data["x0"], data["delta0"], data["epsilon"], data["alpha"], r=r, fit=fit
|
|
)
|
|
|
|
return render_template(
|
|
"index.html",
|
|
result=True,
|
|
log=HookJeeves.result_log,
|
|
extreme={"x": x, "val": val, "x_err": x_err, "type": target},
|
|
form_data={
|
|
"x0": to_str(data["x0"]),
|
|
"delta0": to_str(data["delta0"]),
|
|
"epsilon": str(data["epsilon"]),
|
|
"alpha": str(data["alpha"]),
|
|
"target": data["target"],
|
|
"x1c": to_str(data["x1c"]),
|
|
"x2c": to_str(data["x2c"]),
|
|
"x1r": to_str(data["x1r"]),
|
|
"x2r": to_str(data["x2r"]),
|
|
},
|
|
)
|
|
|
|
return render_template("index.html")
|