Assembling parts into an object is a combinatorial problem that arises in a
variety of contexts in the real world and involves numerous applications in
science and engineering. Previous related work tackles limited cases with
identical unit parts or jigsaw-style parts of textured shape