Class Pfqn_jointmarg

java.lang.Object
jline.api.pfqn.Pfqn_jointmarg

public final class Pfqn_jointmarg extends Object
Joint probability of the per-station TOTAL queue lengths.

Joint probability that station i holds n(i) jobs in total, all classes summed out, in a closed multiclass product-form network:

   P(n_1,...,n_M) = perm(A) / ( prod_r N_r! * prod_{j in infset} n_j! * G(N) )
 

with A the demand matrix whose column r is repeated N_r times and whose row i is repeated n_i times, so A is square of order sum(N). Unlike Pfqn_joint, which takes the delay as a single aggregated row, every infinite-server station keeps its own row here and contributes its own 1/n_j!: the queueing stations contribute the n_i! the permanent identity supplies, the infinite servers do not.

The identity holds for load-independent single-server queues plus infinite servers. Multiserver and load-dependent stations break the n_i! factor and are the caller's responsibility to exclude.

ZERO ELEMENTS are safe under the exact engine and only under it: a station holding no jobs contributes no row, a class with no jobs contributes no column, a zero demand is an ordinary zero entry of A, and the permanent of the empty matrix is 1. The approximate engines are REFUSED on a matrix with a structural zero rather than having it floored at eps: Sinkhorn scaling needs full support, and the Bethe gap is a state-dependent lower bound that does not cancel when the estimates are normalized against each other.

Reference: H. J. Ryser, "Combinatorial Mathematics", Carus Mathematical Monographs 14, Mathematical Association of America, 1963.

  • Method Details

    • pfqn_jointmarg

      public static Pfqn_jointmarg.Ret_jointmarg pfqn_jointmarg(Matrix n, Matrix L, Matrix N, int[] infset, Double lGN, String engine)
      Joint probability of the per-station total queue lengths.
      Parameters:
      n - (1 x M) or (M x 1) per-station total job counts, infinite servers included
      L - (M x R) demand matrix, infinite-server rows included
      N - (1 x R) per-class populations
      infset - row indices of L that are infinite-server stations, may be null or empty
      lGN - log normalizing constant, or null to compute it here
      engine - "exact" (default), "spm", "bethe", "heur", "huberlaw" or "adapart". "spm" is the only engine that does not expand the matrix to order sum(N): it takes the row-replicated matrix with the class populations as column multiplicities, which is the regime its saddle-point expansion is asymptotically exact in, so its cost does not grow with the population and its relative error is O((R-1)/min(N)). Measured on a 3-station 2-class model, 12.8% at N = (1,1), 4.2% at (3,3), 2.1% at (6,6); it degrades the other way round, when the class count grows at fixed population (2.7% at R = 2, 21% at R = 7, both at N_r = 3), because R-1 is the dimension being expanded in. The bias is nearly constant across the lattice, so a caller that renormalizes a full sweep keeps far less of it: total variation distance 5.0e-3 at N = (1,1), 8.4e-4 at (3,3), 4.3e-4 at (5,5), better than "bethe" and "heur" at every population measured.
      Returns:
      the probability, its logarithm and the constant used
    • pfqn_jointmarg

      public static Pfqn_jointmarg.Ret_jointmarg pfqn_jointmarg(Matrix n, Matrix L, Matrix N, int[] infset, Double lGN)
    • pfqn_jointmarg

      public static Pfqn_jointmarg.Ret_jointmarg pfqn_jointmarg(Matrix n, Matrix L, Matrix N, int[] infset)