File size: 1,876 Bytes
c0e639b
61ffb8e
0abe8e4
61ffb8e
d12096d
c0e639b
d12096d
 
0abe8e4
61ffb8e
 
 
 
0abe8e4
61ffb8e
0abe8e4
 
61ffb8e
0abe8e4
 
14765ac
0abe8e4
14765ac
61ffb8e
d12096d
0abe8e4
 
caf4aa2
d12096d
61ffb8e
0abe8e4
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
from flask import Flask, request, jsonify, send_from_directory
from flask_cors import CORS
import joblib, numpy as np, json, math, xgboost as xgb, logging

app = Flask(__name__, static_folder=".", static_url_path="")
CORS(app)
logging.basicConfig(level=logging.INFO)

# Load models
try:
    rf = joblib.load("rf_model.pkl")
    xgb_model = xgb.Booster()
    xgb_model.load_model("xgb_model.json")
    app.logger.info("βœ… Models loaded.")
except Exception as e:
    app.logger.error(f"❌ Model load error: {e}")
    raise

# Load tile data
with open("tile_catalog.json") as f:
    tile_catalog = json.load(f)
with open("tile_sizes.json") as f:
    tile_sizes = json.load(f)

@app.route('/')
def homepage():
    return send_from_directory(".", "index.html")

@app.route('/recommend', methods=['POST'])
def recommend():
    data = request.get_json()
    # Basic validation
    for key in ('tile_type','length','width','area','price_range'):
        if key not in data:
            return jsonify({"error":f"Missing {key}"}),400

    length = float(data['length']); width = float(data['width'])
    coverage = length * width
    # build features for ML
    features = np.array([[0 if data['tile_type']=='floor' else 1, data['area'], coverage, *data['price_range'], data['price_range'][1]/coverage, coverage/data['price_range'][1]]])
    xgb_pred = xgb_model.predict(xgb.DMatrix(features))[0]
    rf_pred = rf.predict_proba(features)[0,1]
    score = (xgb_pred+rf_pred)/2

    # Filter products
    recs = []
    for p in tile_catalog:
        if p['type']==data['tile_type'] and p['size']==f"{length}x{width}" and data['price_range'][0] <= p['price'] <= data['price_range'][1]:
            recs.append({**p})
    return jsonify({"recommendation_score": round(score,3), "recommended_products": recs})

if __name__=="__main__":
    app.run(host="0.0.0.0", port=7860, debug=False)