Awesome
Introduction
This is a LeetCode weekly and biweekly contest rating predictor. The APP is available online at 🔗 lccn.lbao.site
Hopefully, you can get the predicted result within 15-30 minutes after the contest has finished.
Features
- ⚡️ Fast
- The core Elo rating algorithm is significantly enhanced by a Just-In-Time (JIT) compiler through Numba, reducing execution time to approximately 20 seconds on a dual-core Intel(R) Xeon(R) Platinum 8255C CPU (@ 2.50GHz).
- In addition to the JIT implementation, this project incorporates a Fast Fourier Transform (FFT) implementation. The Elo rating system employed by LeetCode benefits significantly from the FFT algorithm, achieving speedups ranging from 65 to 1,000 times for individual contest predictions. The most efficient FFT implementation (
EXPAND_SIZE=1
) completes predictions in under 0.25 seconds, maintaining an impressively low Mean Squared Error (MSE) of approximately 0.027. - Caching the user's latest rating before initiating the prediction process leads to a substantial reduction in the time required for data retrieval.
- 🎯 Accurate
- If there were no significant rejudges (assuming everyone's global ranking remains unchanged), it is ensured that the prediction error for rating deltas for EACH participant is within the precision limit of 0.05. As a result, the rating difference should be negligible.
- Please note that a normal case is that there would be some misconduct detection, so your global ranking will be slightly higher even if your submissions are not rejudged, which results in a slightly higher rating :)
- 📱 Responsive web page
- Tested on phones and tablets.
More Information
- 🔗 refined-leetcode: A Chrome extension for leetcode.cn, created by @XYShaoKang
Underlying Mechanism
Algorithm
- 🔗 English official illustration on leetcode.com
- 🔗 Chinese official illustration on leetcode.cn
- 🔗 Detailed post about FFT acceleration
- ❤️ Special thanks to @tiger2005 for proposing this idea in issue #8
Database
Backend
- APScheduler: background tasks
- Numpy and Numba: core prediction algorithm implementation and acceleration
- FastAPI: restful API
- 🚮
Jinja: HTML templates for server-side rendering
Frontend
- React: most popular front-end library
- TailwindCSS and DaisyUI: modern CSS framework and its component library
- 🚮
Materialize: responsive front-end framework - Echarts: data visualization
Development
Backend Deployment
virtualenv
git clone git@github.com:baoliay2008/lccn_predictor.git
cd lccn_predictor
# write your mongodb environment config
cp config.yaml.template config.yaml
vi config.yaml
python3.10 -m virtualenv venv/
source venv/bin/activate
pip3 install -r requirements.txt
python main.py
uvicorn api.entry:app --host 0.0.0.0 --port 55555
Docker
git clone git@github.com:baoliay2008/lccn_predictor.git
cd lccn_predictor
# write production environment mongodb config
cp config.yaml.template config.yaml
vi config.yaml
# build docker image
docker image build -t lccn_predictor:0.1.2 .
# create docker volume
docker volume create lccn_predictor
# run container
docker run -d -v lccn_predictor:/lccn_predictor -p 55555:55555 --name lp lccn_predictor:0.1.2
docker exec -it lp bash
docker container stop lp
docker container start lp
Frontend Deployment
cd client
# install dependencies
npm install
# change `baseUrl` to your local backend process
vi src/data/constants.js
# if you followed instruction above
# it should be "http://localhost:55555/api/v1"
# local test
npm run dev
# publish
npm run build
License
Changelog
- v0.0.1(2022/11/14)
make this repo public, first release.
- v0.0.2(2022/11/25)
first version in production
- v0.1.1(2023/02/14)
change frontend from server-side rendering(Jinja + Materialize) to client-side rendering(React).
- v0.1.2(2023/10/04)
refine backend logic to enhance robustness and clean up deprecated static site rendering code
- v0.1.3(2023/12/28)
last version prior to the rewrite of the Elo rating algorithm