class_docstr: !
  @brief Represent algorithm for searching optimal number of clusters using specified K-algorithm (K-Means,
          K-Medians, K-Medoids) that is based on Silhouette method.
  
  @details This algorithm uses average value of scores for estimation and applicable for clusters that are well
            separated. Here is an example where clusters are well separated (sample 'Hepta'):
  @code
      from pyclustering.cluster import cluster_visualizer
      from pyclustering.cluster.center_initializer import kmeans_plusplus_initializer
      from pyclustering.cluster.kmeans import kmeans
      from pyclustering.cluster.silhouette import silhouette_ksearch_type, silhouette_ksearch
      from pyclustering.samples.definitions import FCPS_SAMPLES
      from pyclustering.utils import read_sample
  
      sample = read_sample(FCPS_SAMPLES.SAMPLE_HEPTA)
      search_instance = silhouette_ksearch(sample, 2, 10, algorithm=silhouette_ksearch_type.KMEANS).process()
  
      amount = search_instance.get_amount()
      scores = search_instance.get_scores()
  
      print("Scores: '%s'" % str(scores))
  
      initial_centers = kmeans_plusplus_initializer(sample, amount).initialize()
      kmeans_instance = kmeans(sample, initial_centers).process()
  
      clusters = kmeans_instance.get_clusters()
  
      visualizer = cluster_visualizer()
      visualizer.append_clusters(clusters, sample)
      visualizer.show()
  @endcode
  
  Obtained Silhouette scores for each K:
  @code
  Scores: '{2: 0.418434, 3: 0.450906, 4: 0.534709, 5: 0.689970, 6: 0.588460, 7: 0.882674, 8: 0.804725, 9: 0.780189}'
  @endcode
  
  K = 7 has the bigger average Silhouette score and it means that it is optimal amount of clusters:
  @image html silhouette_ksearch_hepta.png "Silhouette ksearch's analysis with further K-Means clustering (sample 'Hepta')."
  
  @see silhouette_ksearch_type
docstr: !
  @brief Performs processing using CCORE (C/C++ part of pyclustering library).
docstr_tok: ["!","@","brief","Performs","processing","using","CCORE","(","C\/C++","part","of","pyclustering","library",")","."]
code: def __process_by_ccore(self):
      """!
      @brief Performs processing using CCORE (C/C++ part of pyclustering library).
  
      """
      results = wrapper.silhoeutte_ksearch(
          self.__data,
          self.__kmin,
          self.__kmax,
          self.__algorithm,
          self.__random_state,
      )
  
      self.__amount = results[0]
      self.__score = results[1]
  
      scores_list = results[2]
      self.__scores = {}
      for i in range(len(scores_list)):
          self.__scores[self.__kmin + i] = scores_list[i]
  
imports: from enum import IntEnum
  import numpy
  from pyclustering.cluster.kmeans import kmeans
  from pyclustering.cluster.kmedians import kmedians
  from pyclustering.cluster.kmedoids import kmedoids
  from pyclustering.cluster.center_initializer import kmeans_plusplus_initializer
  from pyclustering.utils.metric import distance_metric, type_metric
  from pyclustering.core.wrapper import ccore_library
  from pyclustering.core.metric_wrapper import metric_wrapper
  import pyclustering.core.silhouette_wrapper
label_desc: Use image node_id 3 for calling the silhouette_ksearch obj's underlying member method code with example usage: obj.__process_by_ccore() without return types