Setting a range for a target in ROOT

Hello everyone,

I am using ROOT to optimise selection of areas for sediment reduction based on SDR model outputs. The SDR model was used to estimate sediment reduction if all proposed interventions are carried out to their full extent (i.e. maximum potential sediment reduction).

I have been setting different sediment reduction targets in ROOT (e.g. 75% of maximum potential sediment reduction, 50% of potential etc.). The idea is that these represent different levels of intervention that might be carried out. This is working fine but I’d like to know if I can instead specify a range for the sediment reduction target. For example, say the target to achieve 75% of maximum potential sediment reduction is a reduction of 50 000t. Is there any way I can instead specify a range as my target (e.g. 48 000 - 52 000 t)?

My concern is that if ROOT has to come up with a solution which reduces sediment export by exactly 50 000 t, then it might be selecting SDUs which aren’t necessarily optimal for intervention but have to be chosen to meet the exact sediment reduction goal. However, what I really want to know is what areas are optimal for intervention to meet a sediment reduction goal of approximately 50 000 t. I tried setting 2 targets in the target csv as follows: sed_reduction >= 48 000 t and on the next line sed_reduction <=52 000t. However, when I do this the model runs for a while before throwing up a ValueError: total size of new array must be unchanged. The log file (attached) is littered with PRIMAL INFEASIBLE errors when I use a range as a target in this way.

Should what I am trying to do be possible or am I barking up the wrong tree?

Thanks for any help.


Hi Luke, if you’re familiar with the terminology for mathematical optimization, ROOT uses linear programming rather than integer programming optimization. What that means in practice is that it can select fractions of SDUs, not just all or none of an SDU, so as it is selecting SDUs to meet an equality constraint it will just chop off the portion of the final SDU that goes over the constraint.

In your case, I think you should be okay to go ahead with the equality constraint. That said, the bounding constraint approach should work also. We’ll take a look at what might be going on there.


Thanks that makes me feel a bit more comfortable. I didn’t realise ROOT could select a fraction of an SDU.

However, I do have a second question now following on from that. How can one tell which SDUs have been selected in full, and which have only been selected in part? For my purposes, this could be important for mapping the underlying interventions within each SDU.