1. A method of partitioning an algorithm between hardware and software comprising: accepting a user defined algorithm specified in a source code; identifying worker methods and feature extraction methods within the user defined algorithm; replacing worker methods in the source code with hardware logic; replacing feature extraction methods with a combination of hardware logic and software libraries that interface with the hardware logic; and outputting an FPGA programming specification of the hardware logic and interface libraries.