class_docstr: !
  @brief Class represents clustering algorithm SyncNet. 
  @details SyncNet is bio-inspired algorithm that is based on oscillatory network that uses modified Kuramoto model. Each attribute of a data object
           is considered as a phase oscillator.
  
  Example:
  @code
      from pyclustering.cluster import cluster_visualizer
      from pyclustering.cluster.syncnet import syncnet, solve_type
      from pyclustering.samples.definitions import SIMPLE_SAMPLES
      from pyclustering.utils import read_sample
  
      # Read sample for clustering from some file.
      sample = read_sample(SIMPLE_SAMPLES.SAMPLE_SIMPLE3)
  
      # Create oscillatory network with connectivity radius 1.0.
      network = syncnet(sample, 1.0)
  
      # Run cluster analysis and collect output dynamic of the oscillatory network.
      # Network simulation is performed by Runge Kutta 4.
      analyser = network.process(0.998, solve_type.RK4)
  
      # Show oscillatory network.
      network.show_network()
  
      # Obtain clustering results.
      clusters = analyser.allocate_clusters()
  
      # Visualize clustering results.
      visualizer = cluster_visualizer()
      visualizer.append_clusters(clusters, sample)
      visualizer.show()
  @endcode
class_docstr_tok: ["!","@","brief","Class","represents","clustering","algorithm","SyncNet",".","@","details","SyncNet","is","bio-inspired","algorithm","that","is","based","on","oscillatory","network","that","uses","modified","Kuramoto","model",".","Each","attribute","of","a","data","object","is","considered","as","a","phase","oscillator",".","Example",":","@","code","from","pyclustering.cluster","import","cluster_visualizer","from","pyclustering.cluster.syncnet","import","syncnet",",","solve_type","from","pyclustering.samples.definitions","import","SIMPLE_SAMPLES","from","pyclustering.utils","import","read_sample","#","Read","sample","for","clustering","from","some","file",".","sample","=","read_sample","(","SIMPLE_SAMPLES.SAMPLE_SIMPLE3",")","#","Create","oscillatory","network","with","connectivity","radius","1.0.","network","=","syncnet","(","sample",",","1.0",")","#","Run","cluster","analysis","and","collect","output","dynamic","of","the","oscillatory","network",".","#","Network","simulation","is","performed","by","Runge","Kutta","4.","analyser","=","network.process","(","0.998",",","solve_type.RK4",")","#","Show","oscillatory","network",".","network.show_network","(",")","#","Obtain","clustering","results",".","clusters","=","analyser.allocate_clusters","(",")","#","Visualize","clustering","results",".","visualizer","=","cluster_visualizer","(",")","visualizer.append_clusters","(","clusters",",","sample",")","visualizer.show","(",")","@","endcode"]
docstr: !
  @brief Peforms cluster analysis using simulation of the oscillatory network.
  
  @param[in] order (double): Order of synchronization that is used as indication for stopping processing.
  @param[in] solution (solve_type): Specified type of solving diff. equation.
  @param[in] collect_dynamic (bool): Specified requirement to collect whole dynamic of the network.
  
  @return (syncnet_analyser) Returns analyser of results of clustering.
docstr_tok: ["!","@","brief","Peforms","cluster","analysis","using","simulation","of","the","oscillatory","network",".","@","param","[","in","]","order","(","double",")",":","Order","of","synchronization","that","is","used","as","indication","for","stopping","processing",".","@","param","[","in","]","solution","(","solve_type",")",":","Specified","type","of","solving","diff",".","equation",".","@","param","[","in","]","collect_dynamic","(","bool",")",":","Specified","requirement","to","collect","whole","dynamic","of","the","network",".","@","return","(","syncnet_analyser",")","Returns","analyser","of","results","of","clustering","."]
code: def process(
      self, order=0.998, solution=solve_type.FAST, collect_dynamic=True
  ):
      """!
      @brief Peforms cluster analysis using simulation of the oscillatory network.
  
      @param[in] order (double): Order of synchronization that is used as indication for stopping processing.
      @param[in] solution (solve_type): Specified type of solving diff. equation.
      @param[in] collect_dynamic (bool): Specified requirement to collect whole dynamic of the network.
  
      @return (syncnet_analyser) Returns analyser of results of clustering.
  
      """
  
      if self._ccore_network_pointer is not None:
          pointer_output_dynamic = syncnet_process(
              self._ccore_network_pointer,
              order,
              solution,
              collect_dynamic,
          )
          return syncnet_analyser(None, None, pointer_output_dynamic)
      else:
          output_sync_dynamic = self.simulate_dynamic(
              order, solution, collect_dynamic
          )
          return syncnet_analyser(
              output_sync_dynamic.output, output_sync_dynamic.time, None
          )
  
imports: import math
  import matplotlib.pyplot
  import matplotlib.animation
  from pyclustering.cluster.encoder import type_encoding
  from pyclustering.cluster import cluster_visualizer
  from pyclustering.core.syncnet_wrapper import syncnet_create_network, syncnet_process, syncnet_destroy_network, syncnet_analyser_destroy
  from pyclustering.core.sync_wrapper import sync_connectivity_matrix
  from pyclustering.core.wrapper import ccore_library
  from pyclustering.nnet.sync import sync_dynamic, sync_network, sync_visualizer
  from pyclustering.nnet import conn_represent, initial_type, conn_type, solve_type
  from pyclustering.utils import euclidean_distance
label_desc: Use image node_id 5 for calling the syncnet obj's underlying member method code with example usage: obj.process(order, solution, collect_dynamic) and returns: syncnet_analyser, syncnet_analyser