Methods 9 min
The honest no
Finding a spectrum that satisfies your constraints is the easy half. Saying that none exists, without overclaiming, is the hard half.
A useful question in materials and manufacturing: can a single coating look brick red under daylight and olive under tungsten?
Existing work can generate a spectrum hitting several appearance targets when one exists. What it does not provide is the other half of the answer — a no, with reasons. And the no is the valuable half, because it is the one that stops a project before it spends six months on something impossible.
This post is about producing that no honestly, which turns out to require more care than producing the yes.
Setting it up
Each requirement is a constraint on a reflectance. Under illuminant L, the reflectance must produce a response within ΔE tolerance of a target color. The set of reflectances satisfying that is convex — it is the preimage of a small ball under a linear map, intersected with the physical box [0, 1].
Several requirements means several convex sets. A reflectance satisfying all of them is a point in their intersection. If the intersection is empty, no such material exists.
Convexity makes this tractable. Projections onto convex sets cycles through the constraints, projecting the current iterate onto each in turn, plus the physical box. When the intersection is nonempty, the iterates converge into it.
The yes is easy to make trustworthy
When POCS converges, you have a candidate reflectance. Do not trust it because the algorithm said so — push it back through the forward colorimetric path and measure the achieved error against each target.
That verification is cheap and it catches everything: a projection with a sign error, a tolerance applied in the wrong space, an iterate that stopped just outside. The witness returned by the tool has been re-verified through the forward path, and the achieved error per constraint ships in the response.
A yes backed by a verified witness is about as solid as this kind of answer gets. You can render it. You can hand it to a chemist.
The no is where it gets subtle
Now suppose POCS does not converge. The residual stalls, the iteration budget runs out, and no witness appears.
The tempting conclusion is that the intersection is empty and the material is impossible. That conclusion is not justified, and the difference matters.
POCS has no dual certificate. In linear programming, infeasibility comes with a proof object — a Farkas certificate, a separating hyperplane — that can be checked independently and settles the question. POCS produces no such object. It produces iterates that failed to converge within a budget.
Those are different statements:
- No reflectance exists satisfying these constraints.
- This algorithm did not find one within this many iterations.
The second is evidence for the first. It is not proof of it. Very tight tolerances can stall convergence on a problem that is technically feasible, and a slow-converging geometry looks identical to an infeasible one from inside the loop.
So the tool says exactly that. Infeasibility is reported as strong evidence, not proof, in the response text, every time. Not in a footnote.
Making the no useful anyway
An unqualified “probably impossible” is honest and unhelpful. So when the full set fails, the tool runs a second pass over every pair of constraints and reports which pairs are already jointly unsatisfiable.
That converts a dead end into a diagnosis. Instead of “your six requirements cannot be met,” you get “requirements two and five conflict with each other.” Now you know which one to relax, and you know the other four are not the problem.
Pairwise localization is a heuristic — three constraints can be jointly infeasible while every pair is fine — and when no pair conflicts the tool reports the full set as the conflict rather than inventing a smaller one. But in practice conflicts usually are pairwise, and naming the pair is most of the value.
The forensic corollary
The two-constraint case has a use worth naming separately.
Given two photographs of a surface under different (known) lighting, could they show the same physical surface? That is exactly a two-constraint feasibility question. Feasible means one reflectance accounts for both observations. Infeasible means something else is going on.
The temptation to call this a lie detector is strong and must be resisted. What an infeasible result actually licenses is a disjunction:
- a different surface, or
- a wrong assumption about one of the illuminants, or
- a surface that is not a plain diffuse reflector — fluorescent, metallic, retroreflective.
The response says those three alternatives in those words. A feasible result is weaker still: it proves a reflectance could explain both observations, never that it did. Consistency is not identity.
This is decision support. It narrows a question for someone who then does more work. It does not close one.
Why the discipline is worth it
The honest version of this tool is less impressive than the version that says “IMPOSSIBLE” in bold. It is also the version that can survive someone checking it.
An unqualified impossibility claim gets falsified the first time a chemist produces the coating anyway, because the tolerance was tight and the geometry was slow. Every result the tool ever produced becomes suspect. The qualified claim — strong evidence, no dual certificate, here are the conflicting pairs — stays true in that world, and the chemist’s success is interesting rather than embarrassing.
The general rule this lab keeps landing on: state the strongest thing your method actually supports, and put the gap between that and what people want in the output where they cannot miss it. Optimism in a certificate is a debt that gets called.