19  Stock Complexes

In openMSE, every stock belongs to a stock complex. When each stock is managed independently, no complex configuration is needed. Multi-stock complexes are used when two or more stocks cannot be distinguished in the data: for example, males and females modelled as separate stocks, or two species landed together in a mixed fishery where catch cannot be attributed to either species individually. In these cases the stocks share a single combined data stream and receive a single joint management action such as a total allowable catch that applies to the complex as a whole.

The key consequences of grouping stocks into a complex are:

Note that fleets remain stock-specific; each fleet has its own selectivity, retention, and effort schedule defined independently for each stock. Complexes operate above the fleet level, determining how data and advice are aggregated.

19.1 The Complexes Slot

Complexes are defined via the Complexes slot of the OM object, which is a named list where each element is an integer vector of stock indices belonging to that complex:

# Two stocks in one complex
OM(
  Stock     = list(AlbacoreExStock, ButterfishExStock),
  Fleet     = AsympExFleet,
  Obs       = AgeStructuredObs,
  Complexes = list(StockComplex = 1:2)
)

Here both stocks (indices 1 and 2) are assigned to a single complex named "StockComplex". The Obs object is indexed by complex and fleet, so a single observation model applies to the aggregated data for the whole complex.

When Complexes is not specified, openMSE sets a default automatically:

  • If the OM contains a single stock, that stock forms its own complex.
  • If the OM has a single Data object for multiple stocks, all stocks are placed in one complex.
  • Otherwise, each stock is treated as its own independent complex.
# Inspect the complexes defined in an OM or Hist object
Complexes(myOM)
Complexes(Hist)

19.2 Multi-Stock vs Multi-Complex

It is important to distinguish between a multi-stock, multi-complex OM and a multi-stock, single-complex OM:

  • Multi-stock, multi-complex: each stock is managed independently, with its own Obs, its own Data object, and its own management advice. This is the default when Complexes is not specified.
  • Multi-stock, single complex: all stocks share one Obs, their data are aggregated into one Data object, and management advice is applied jointly. This requires explicitly setting Complexes.

The MultiStockOM example has two stocks each in their own complex; ComplexOM has two stocks in a single shared complex.

# Two stocks, each managed separately (two complexes)
Complexes(MultiStockOM) # NULL

Complexes(Populate(MultiStockOM)) # list length 2

# Two stocks managed jointly (one complex)
Complexes(ComplexOM)

19.3 Stock-Recruitment Linkages

By default each stock’s recruitment is driven by its own spawning production. The SPFrom slot of Stock@SRR can designate a different stock as the source of spawning output used to determine recruitment. The most common case is a sex-structured model where female spawning biomass drives recruitment for both sexes. SPFrom operates at the OM level and can reference any stock regardless of which complex it belongs to.

19.4 Reference Points

CalcMSY() finds the single apical \(F\) that maximises total yield across all stocks in the complex. Stock-level reference points (BMSY, SBMSY, etc.) are then evaluated at this complex-level \(F_\text{MSY}\), reflecting the reality that a single management action applies to all stocks simultaneously. See Chapter 21 for details.