this seems like a violation of the contract.  you pass in a kinsol, but then it evaluates the constraints with a different kinsol (only maintaining q).  there must be a better way??