# File lib/core/facets/string/similarity.rb, line 28
  def similarity(str_in)
    return 0 if str_in == nil
    return 1 if self == str_in

    # -- make a graph of each word (okay, its not a true graph, but is similar)
    graph_A = Array.new
    graph_B = Array.new

    # -- "graph" self
    last = self.length
    (0..last).each do |ff|
      loc  = self.length
      break if ff == last - 1
      wordB = (1..(last-1)).to_a.reverse!
      if (wordB != nil)
        wordB.each do |ss|
          break if ss == ff
          graph_A.push( "#{self[ff..ss]}" )
        end
      end
    end

    # -- "graph" input string
    last = str_in.length
    (0..last).each{ |ff|
      loc  = str_in.length
      break if ff == last - 1
      wordB = (1..(last-1)).to_a.reverse!
      wordB.each do |ss|
        break if ss == ff
        graph_B.push( "#{str_in[ff..ss]}" )
      end
    }

    # -- count how many of these "graph edges" we have that are the same
    matches = graph_A & graph_B

    #--
    #matches = Array.new
    #graph_A.each{ |aa| matches.push(aa) if( graph_B.include?(aa) ) }
    #++

    # -- for eliminating subsets, we want to start with the smallest hits.
    matches.sort!{|x,y| x.length <=> y.length}

    # -- eliminate any subsets
    mclone = matches.dup
    mclone.each_index do |ii|
      reg = Regexp.compile( Regexp.escape(mclone[ii]) )
      count = 0.0
      matches.each{|xx| count += 1 if xx =~ reg}
      matches.delete(mclone[ii]) if count > 1
    end

    score = 0.0
    matches.each{ |mm| score += mm.length }
    self.length > str_in.length ? largest = self.length : largest = str_in.length
    return score/largest
  end