class_docstr: Return a sparse matrix having random values from a multinomial
  density having number of experiment `n` and probability of succes
  `p`.
  
  WARNING: This Op is NOT deterministic, as calling it twice with the
  same inputs will NOT give the same result. This is a violation of
  Theano's contract for Ops
  
  :param n: Tensor type vector or scalar representing the number of
            experiment for each row. If `n` is a scalar, it will be
            used for each row.
  :param p: Sparse matrix of probability where each row is a probability
            vector representing the probability of succes. N.B. Each row
            must sum to one.
  
  :return: A sparse matrix of random integers from a multinomial density
           for each row.
  
  :note: It will works only if `p` have csr format.
class_docstr_tok: ["Return","a","sparse","matrix","having","random","values","from","a","multinomial","density","having","number","of","experiment","`","n","`","and","probability","of","succes","`","p","`",".","WARNING",":","This","Op","is","NOT","deterministic",",","as","calling","it","twice","with","the","same","inputs","will","NOT","give","the","same","result",".","This","is","a","violation","of","Theano","'s","contract","for","Ops",":","param","n",":","Tensor","type","vector","or","scalar","representing","the","number","of","experiment","for","each","row",".","If","`","n","`","is","a","scalar",",","it","will","be","used","for","each","row",".",":","param","p",":","Sparse","matrix","of","probability","where","each","row","is","a","probability","vector","representing","the","probability","of","succes",".","N.B",".","Each","row","must","sum","to","one",".",":","return",":","A","sparse","matrix","of","random","integers","from","a","multinomial","density","for","each","row",".",":","note",":","It","will","works","only","if","`","p","`","have","csr","format","."]
code: def make_node(self, n, p):
      n = tensor.as_tensor_variable(n)
      p = as_sparse_variable(p)
      assert p.format in ["csr", "csc"]
  
      return gof.Apply(self, [n, p], [p.type()])
  
imports: from __future__ import absolute_import, print_function, division
  import numpy
  from six.moves import xrange
  import theano
  import scipy.sparse
  from theano import gof, tensor
  from theano.tensor import discrete_dtypes, float_dtypes
  from theano.tensor.opt import register_specialize
  from theano.sparse.basic import as_sparse_variable, SparseType, add_s_s, neg, mul_s_s, mul_s_d, dot, CSMProperties, CSM, _is_sparse_variable, _is_dense_variable, CSC, CSR, csm_properties, csm_data, csm_indices, csm_indptr, csm_shape, _is_sparse, Remove0, remove0, Cast, bcast, wcast, icast, lcast, fcast, dcast, ccast, zcast, HStack, hstack, VStack, vstack, AddSSData, add_s_s_data, MulSV, mul_s_v, structured_monoid, structured_sigmoid, structured_exp, structured_log, structured_pow, structured_minimum, structured_maximum, structured_add, StructuredAddSV, structured_add_s_v, SamplingDot, sampling_dot
  from theano.sparse.opt import MulSDCSC, mul_s_d_csc, MulSDCSR, mul_s_d_csr, MulSVCSR, mul_s_v_csr, StructuredAddSVCSR, structured_add_s_v_csr, SamplingDotCSR, sampling_dot_csr, local_mul_s_d, local_mul_s_v, local_structured_add_s_v, local_sampling_dot_csr
label_desc: Use image node_id 1 for calling the Multinomial obj's underlying member method code with example usage: obj.make_node(n, p) and returns: gof