1function mask = sn_region_members(sn, f, Rmat, memvec)
2% MASK = SN_REGION_MEMBERS(SN, F, RMAT, MEMVEC) 1xM logical membership mask of
3% finite capacity region F.
5% Membership
is read from sn.regionmembers{f}, which refreshRegions records
6% directly from
the region
's node list. It cannot be derived from sn.region{f}:
7% -1 there means "unbounded", which is indistinguishable from "not a member", so
8% a region constrained only by regionlincon (or only by a memory budget) reads as
9% empty and is silently ignored.
11% RMAT and MEMVEC provide the legacy derivation, used only for an sn built before
12% regionmembers existed (for instance one deserialised from an older model file).
13% That derivation carries the ambiguity above and is not equivalent.
15if isfield(sn,'regionmembers
') && numel(sn.regionmembers) >= f && ~isempty(sn.regionmembers{f})
16 mask = logical(sn.regionmembers{f}(:))';
19mask = (any(Rmat ~= -1, 2) | memvec(:) ~= -1)
';