Sha256: 3ff8cc9754ea875c56e895e080477fd1d51c92305dfe84f573f33c85b28f1b89

Contents?: true

Size: 1.02 KB

Versions: 1

Compression:

Stored size: 1.02 KB

Contents

require_relative 'pm'

module Bioinform
  module MotifModel
    def self.acts_as_ppm?(ppm)
      ppm.is_a?(MotifModel::PPM) || ppm.is_a?(MotifModel::NamedModel) && acts_as_ppm?(ppm.model)
    end

    class PPM < PM
      def self.default_validator
        PPM::VALIDATOR
      end

      def self.probability_validator(eps: 1.0e-4)
        Validator.new{|matrix, alphabet|
          errors = []
          unless matrix.all?{|pos| pos.all?{|el| el >= 0 } }
            errors << "Elements of PPM should be non-negative."
          end

          warnings = []
          probability_sums = matrix.map{|pos| pos.inject(0.0, &:+) }
          max_discrepancy = probability_sums.map{|sum| (sum - 1.0).abs }.max
          unless max_discrepancy <= eps
            warnings << "PPM should sum up to 1, with discrepancy not greater than #{eps}."
          end

          ValidationResult.new(errors: errors, warnings: warnings)
        }
      end

      VALIDATOR = PM::VALIDATOR * PPM.probability_validator(eps: 1.0e-4).make_strict
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
bioinform-0.3.1 lib/bioinform/data_models/ppm.rb