Problem
uplift_curve and marginal_curve work by temporarily replacing self.idata.sensitivity_analysis with a synthetic dataset, calling self.sensitivity_analysis(...), and restoring in a finally block.
This is not thread-safe, mutates shared state, and is extremely fragile. If sensitivity_analysis raises an exception, the finally block restores state, but any concurrent access during execution sees corrupted data.
Recommendation
Refactor sensitivity_analysis to accept the data array as a parameter, so uplift_curve / marginal_curve can pass it directly.