code: def basic_noisy_selfloop_network():
      
      tpm = np.array([
          [0.271, 0.19, 0.244],
          [0.919, 0.19, 0.756],
          [0.919, 0.91, 0.756],
          [0.991, 0.91, 0.244],
          [0.919, 0.91, 0.756],
          [0.991, 0.91, 0.244],
          [0.991, 0.99, 0.244],
          [0.999, 0.99, 0.756]
      ])
  
      cm = np.array([
          [1, 0, 1],
          [1, 1, 1],
          [1, 1, 1]
      ])
  
      return Network(tpm, cm=cm)
docs: Based on the basic_network, but with added selfloops and noisy edges.
  
      Nodes perform deterministic functions of their inputs, but those inputs
      may be flipped (i.e. what should be a 0 becomes a 1, and vice versa) with
      probability epsilon (eps = 0.1 here).
  
      Diagram::
  
                     +~~+
                     |  v
                  +~~~~~~~~+
            +~~~~>|   A    |<~~~~+
            |     |  (OR)  +~~~+ |
            |     +~~~~~~~~+   | |
            |                  | |
            |                  v |
          +~+~~~~~~+       +~~~~~+~+
          |   B    |<~~~~~~+   C   |
        +>| (COPY) +~~~~~~>| (XOR) |<+
        | +~~~~~~~~+       +~~~~~~~+ |
        |   |                    |   |
        +~~~+                    +~~~+