proof.rb revision a5e53dbef6b3edf62bcb2f94bad010bf7cd2442d
e00c2b5ac4963de9521599c88597b7fb97339d0eJakub Hrozek# The Proof class is not supposed to be stored in the database. Its purpose is
e00c2b5ac4963de9521599c88597b7fb97339d0eJakub Hrozek# to allow for an easy way to create proving commands in the RESTful manner.
e00c2b5ac4963de9521599c88597b7fb97339d0eJakub Hrozek# It is called Proof to comply with the ProofsController which in turn gets
e00c2b5ac4963de9521599c88597b7fb97339d0eJakub Hrozek# called on */proofs routes.
e00c2b5ac4963de9521599c88597b7fb97339d0eJakub Hrozek# This class prepares the proving procedure and creates the models which are
e00c2b5ac4963de9521599c88597b7fb97339d0eJakub Hrozek# presented in the UI (ProofAttempt).
e00c2b5ac4963de9521599c88597b7fb97339d0eJakub Hrozekclass Proof < FakeRecord
e00c2b5ac4963de9521599c88597b7fb97339d0eJakub Hrozek class ProversValidator < ActiveModel::EachValidator
e00c2b5ac4963de9521599c88597b7fb97339d0eJakub Hrozek def validate_each(record, attribute, value)
e00c2b5ac4963de9521599c88597b7fb97339d0eJakub Hrozek not_provers = value.reject { |id| Prover.where(id: id).any? }
e00c2b5ac4963de9521599c88597b7fb97339d0eJakub Hrozek if not_provers.any?
e00c2b5ac4963de9521599c88597b7fb97339d0eJakub Hrozek record.errors.add attribute, "#{not_provers} are not provers"
e00c2b5ac4963de9521599c88597b7fb97339d0eJakub Hrozek end
e00c2b5ac4963de9521599c88597b7fb97339d0eJakub Hrozek end
e00c2b5ac4963de9521599c88597b7fb97339d0eJakub Hrozek end
e00c2b5ac4963de9521599c88597b7fb97339d0eJakub Hrozek
e00c2b5ac4963de9521599c88597b7fb97339d0eJakub Hrozek TIMEOUT_RANGE = [5.seconds, 10.seconds, 30.seconds,
e00c2b5ac4963de9521599c88597b7fb97339d0eJakub Hrozek 1.minutes, 5.minutes, 10.minutes, 30.minutes,
e00c2b5ac4963de9521599c88597b7fb97339d0eJakub Hrozek 1.hours, 6.hours,
e00c2b5ac4963de9521599c88597b7fb97339d0eJakub Hrozek 1.days, 2.days, 7.days]
e00c2b5ac4963de9521599c88597b7fb97339d0eJakub Hrozek
e00c2b5ac4963de9521599c88597b7fb97339d0eJakub Hrozek # flags
e00c2b5ac4963de9521599c88597b7fb97339d0eJakub Hrozek attr_reader :prove_asynchronously
e00c2b5ac4963de9521599c88597b7fb97339d0eJakub Hrozek # ontology related
e00c2b5ac4963de9521599c88597b7fb97339d0eJakub Hrozek attr_reader :ontology, :proof_obligation
e00c2b5ac4963de9521599c88597b7fb97339d0eJakub Hrozek # prover related
e00c2b5ac4963de9521599c88597b7fb97339d0eJakub Hrozek attr_reader :prover_ids, :provers
e00c2b5ac4963de9521599c88597b7fb97339d0eJakub Hrozek # axiom related
e00c2b5ac4963de9521599c88597b7fb97339d0eJakub Hrozek attr_reader :axiom_selection_method, :specific_axiom_selection, :axioms
e00c2b5ac4963de9521599c88597b7fb97339d0eJakub Hrozek # timeout
fb3c5cdfcda069a5fbeb7b9d200c0881911364b8Jakub Hrozek attr_reader :timeout
e00c2b5ac4963de9521599c88597b7fb97339d0eJakub Hrozek # result related
e00c2b5ac4963de9521599c88597b7fb97339d0eJakub Hrozek attr_reader :proof_attempts
44703b84feaafa4f0a4f8df11c5a503dcf48616eJakub Hrozek
44703b84feaafa4f0a4f8df11c5a503dcf48616eJakub Hrozek validates :prover_ids, provers: true
e00c2b5ac4963de9521599c88597b7fb97339d0eJakub Hrozek validates :axiom_selection_method, inclusion: {in: AxiomSelection::METHODS}
e00c2b5ac4963de9521599c88597b7fb97339d0eJakub Hrozek validates :timeout,
e00c2b5ac4963de9521599c88597b7fb97339d0eJakub Hrozek inclusion: {in: (TIMEOUT_RANGE.first..TIMEOUT_RANGE.last)},
e00c2b5ac4963de9521599c88597b7fb97339d0eJakub Hrozek if: :timeout_present?
e00c2b5ac4963de9521599c88597b7fb97339d0eJakub Hrozek
e00c2b5ac4963de9521599c88597b7fb97339d0eJakub Hrozek delegate :to_s, to: :proof_obligation
e00c2b5ac4963de9521599c88597b7fb97339d0eJakub Hrozek
e00c2b5ac4963de9521599c88597b7fb97339d0eJakub Hrozek def initialize(opts, prove_asynchronously: true)
e00c2b5ac4963de9521599c88597b7fb97339d0eJakub Hrozek prepare_options(opts)
e00c2b5ac4963de9521599c88597b7fb97339d0eJakub Hrozek @prove_asynchronously = prove_asynchronously
e00c2b5ac4963de9521599c88597b7fb97339d0eJakub Hrozek @ontology = Ontology.find(opts[:ontology_id])
e00c2b5ac4963de9521599c88597b7fb97339d0eJakub Hrozek @timeout = opts[:proof][:timeout].to_i if opts[:proof][:timeout].present?
e00c2b5ac4963de9521599c88597b7fb97339d0eJakub Hrozek initialize_proof_obligation(opts)
e00c2b5ac4963de9521599c88597b7fb97339d0eJakub Hrozek initialize_provers(opts)
e00c2b5ac4963de9521599c88597b7fb97339d0eJakub Hrozek initialize_axiom_selection(opts)
e00c2b5ac4963de9521599c88597b7fb97339d0eJakub Hrozek initialize_proof_attempts(opts)
e00c2b5ac4963de9521599c88597b7fb97339d0eJakub Hrozek end
e00c2b5ac4963de9521599c88597b7fb97339d0eJakub Hrozek
e00c2b5ac4963de9521599c88597b7fb97339d0eJakub Hrozek def save!
e00c2b5ac4963de9521599c88597b7fb97339d0eJakub Hrozek ActiveRecord::Base.transaction do
e00c2b5ac4963de9521599c88597b7fb97339d0eJakub Hrozek specific_axiom_selection.save!
e00c2b5ac4963de9521599c88597b7fb97339d0eJakub Hrozek proof_attempts.each do |proof_attempt|
e00c2b5ac4963de9521599c88597b7fb97339d0eJakub Hrozek proof_attempt.save!
e00c2b5ac4963de9521599c88597b7fb97339d0eJakub Hrozek proof_attempt.proof_attempt_configuration.save!
e00c2b5ac4963de9521599c88597b7fb97339d0eJakub Hrozek end
e00c2b5ac4963de9521599c88597b7fb97339d0eJakub Hrozek end
e00c2b5ac4963de9521599c88597b7fb97339d0eJakub Hrozek prove
e00c2b5ac4963de9521599c88597b7fb97339d0eJakub Hrozek end
e00c2b5ac4963de9521599c88597b7fb97339d0eJakub Hrozek
e00c2b5ac4963de9521599c88597b7fb97339d0eJakub Hrozek def axiom_selection
e00c2b5ac4963de9521599c88597b7fb97339d0eJakub Hrozek specific_axiom_selection.try(:axiom_selection)
e00c2b5ac4963de9521599c88597b7fb97339d0eJakub Hrozek end
e00c2b5ac4963de9521599c88597b7fb97339d0eJakub Hrozek
e00c2b5ac4963de9521599c88597b7fb97339d0eJakub Hrozek def theorem?
e00c2b5ac4963de9521599c88597b7fb97339d0eJakub Hrozek proof_obligation.is_a?(Theorem)
e00c2b5ac4963de9521599c88597b7fb97339d0eJakub Hrozek end
e00c2b5ac4963de9521599c88597b7fb97339d0eJakub Hrozek
e00c2b5ac4963de9521599c88597b7fb97339d0eJakub Hrozek protected
e00c2b5ac4963de9521599c88597b7fb97339d0eJakub Hrozek
e00c2b5ac4963de9521599c88597b7fb97339d0eJakub Hrozek # This is needed for the validations to run.
e00c2b5ac4963de9521599c88597b7fb97339d0eJakub Hrozek def prepare_options(opts)
e00c2b5ac4963de9521599c88597b7fb97339d0eJakub Hrozek opts[:proof] ||= {}
e00c2b5ac4963de9521599c88597b7fb97339d0eJakub Hrozek opts[:proof][:prover_ids] ||= []
e00c2b5ac4963de9521599c88597b7fb97339d0eJakub Hrozek end
e00c2b5ac4963de9521599c88597b7fb97339d0eJakub Hrozek
e00c2b5ac4963de9521599c88597b7fb97339d0eJakub Hrozek def ontology_version
e00c2b5ac4963de9521599c88597b7fb97339d0eJakub Hrozek @ontology_version ||= ontology.current_version
e00c2b5ac4963de9521599c88597b7fb97339d0eJakub Hrozek end
e00c2b5ac4963de9521599c88597b7fb97339d0eJakub Hrozek
e00c2b5ac4963de9521599c88597b7fb97339d0eJakub Hrozek def initialize_proof_obligation(opts)
e00c2b5ac4963de9521599c88597b7fb97339d0eJakub Hrozek @proof_obligation ||=
e00c2b5ac4963de9521599c88597b7fb97339d0eJakub Hrozek if opts[:theorem_id]
e00c2b5ac4963de9521599c88597b7fb97339d0eJakub Hrozek Theorem.find(opts[:theorem_id])
e00c2b5ac4963de9521599c88597b7fb97339d0eJakub Hrozek else
e00c2b5ac4963de9521599c88597b7fb97339d0eJakub Hrozek ontology_version
e00c2b5ac4963de9521599c88597b7fb97339d0eJakub Hrozek end
e00c2b5ac4963de9521599c88597b7fb97339d0eJakub Hrozek end
e00c2b5ac4963de9521599c88597b7fb97339d0eJakub Hrozek
16cb0969f0a9ea71524d852077d6a480740d4f12Jakub Hrozek def initialize_provers(opts)
b4f87b42b18888c396e44e7359f7aafb092221bfJakub Hrozek @prover_ids = normalize_check_box_ids(opts[:proof][:prover_ids])
b4f87b42b18888c396e44e7359f7aafb092221bfJakub Hrozek @provers = @prover_ids.map { |prover| Prover.where(id: prover).first }
b4f87b42b18888c396e44e7359f7aafb092221bfJakub Hrozek @provers.compact!
b4f87b42b18888c396e44e7359f7aafb092221bfJakub Hrozek @provers = [nil] if @provers.blank?
b4f87b42b18888c396e44e7359f7aafb092221bfJakub Hrozek end
b4f87b42b18888c396e44e7359f7aafb092221bfJakub Hrozek
b4f87b42b18888c396e44e7359f7aafb092221bfJakub Hrozek # HACK: Remove the empty string from params.
b4f87b42b18888c396e44e7359f7aafb092221bfJakub Hrozek # Rails 4.2 introduces the html form option :include_hidden for this task.
b4f87b42b18888c396e44e7359f7aafb092221bfJakub Hrozek def normalize_check_box_ids(collection)
b4f87b42b18888c396e44e7359f7aafb092221bfJakub Hrozek collection.select(&:present?).map(&:to_i) if collection
b4f87b42b18888c396e44e7359f7aafb092221bfJakub Hrozek end
b4f87b42b18888c396e44e7359f7aafb092221bfJakub Hrozek
b4f87b42b18888c396e44e7359f7aafb092221bfJakub Hrozek def initialize_axioms(opts)
b4f87b42b18888c396e44e7359f7aafb092221bfJakub Hrozek axiom_ids = normalize_check_box_ids(opts[:proof][:axioms])
b4f87b42b18888c396e44e7359f7aafb092221bfJakub Hrozek @axioms = axiom_ids.map { |id| Axiom.find(id) } if axiom_ids
b4f87b42b18888c396e44e7359f7aafb092221bfJakub Hrozek end
b4f87b42b18888c396e44e7359f7aafb092221bfJakub Hrozek
b4f87b42b18888c396e44e7359f7aafb092221bfJakub Hrozek def initialize_axiom_selection(opts)
b4f87b42b18888c396e44e7359f7aafb092221bfJakub Hrozek @axiom_selection_method = opts[:proof][:axiom_selection_method].try(:to_sym)
b4f87b42b18888c396e44e7359f7aafb092221bfJakub Hrozek build_axiom_selection(opts)
b4f87b42b18888c396e44e7359f7aafb092221bfJakub Hrozek end
44703b84feaafa4f0a4f8df11c5a503dcf48616eJakub Hrozek
b4f87b42b18888c396e44e7359f7aafb092221bfJakub Hrozek def initialize_proof_attempts(opts)
b4f87b42b18888c396e44e7359f7aafb092221bfJakub Hrozek @proof_attempts = []
b4f87b42b18888c396e44e7359f7aafb092221bfJakub Hrozek if theorem?
b4f87b42b18888c396e44e7359f7aafb092221bfJakub Hrozek initialize_proof_attempts_for_theorem(opts, proof_obligation)
b4f87b42b18888c396e44e7359f7aafb092221bfJakub Hrozek else
b4f87b42b18888c396e44e7359f7aafb092221bfJakub Hrozek proof_obligation.theorems.each do |theorem|
b4f87b42b18888c396e44e7359f7aafb092221bfJakub Hrozek initialize_proof_attempts_for_theorem(opts, theorem)
b4f87b42b18888c396e44e7359f7aafb092221bfJakub Hrozek end
b4f87b42b18888c396e44e7359f7aafb092221bfJakub Hrozek end
b4f87b42b18888c396e44e7359f7aafb092221bfJakub Hrozek end
b4f87b42b18888c396e44e7359f7aafb092221bfJakub Hrozek
b4f87b42b18888c396e44e7359f7aafb092221bfJakub Hrozek def initialize_proof_attempts_for_theorem(opts, theorem)
b4f87b42b18888c396e44e7359f7aafb092221bfJakub Hrozek provers.each do |prover|
b4f87b42b18888c396e44e7359f7aafb092221bfJakub Hrozek pac = ProofAttemptConfiguration.new
b4f87b42b18888c396e44e7359f7aafb092221bfJakub Hrozek pac.prover = prover
b4f87b42b18888c396e44e7359f7aafb092221bfJakub Hrozek pac.timeout = timeout
16cb0969f0a9ea71524d852077d6a480740d4f12Jakub Hrozek pac.axiom_selection = axiom_selection
16cb0969f0a9ea71524d852077d6a480740d4f12Jakub Hrozek
16cb0969f0a9ea71524d852077d6a480740d4f12Jakub Hrozek proof_attempt = ProofAttempt.new
16cb0969f0a9ea71524d852077d6a480740d4f12Jakub Hrozek proof_attempt.theorem = theorem
16cb0969f0a9ea71524d852077d6a480740d4f12Jakub Hrozek proof_attempt.proof_attempt_configuration = pac
e00c2b5ac4963de9521599c88597b7fb97339d0eJakub Hrozek pac.proof_attempt = proof_attempt
e00c2b5ac4963de9521599c88597b7fb97339d0eJakub Hrozek
e00c2b5ac4963de9521599c88597b7fb97339d0eJakub Hrozek @proof_attempts << proof_attempt
e00c2b5ac4963de9521599c88597b7fb97339d0eJakub Hrozek end
e00c2b5ac4963de9521599c88597b7fb97339d0eJakub Hrozek end
e00c2b5ac4963de9521599c88597b7fb97339d0eJakub Hrozek
e00c2b5ac4963de9521599c88597b7fb97339d0eJakub Hrozek def build_axiom_selection(opts)
e00c2b5ac4963de9521599c88597b7fb97339d0eJakub Hrozek if AxiomSelection::METHODS.include?(axiom_selection_method)
e00c2b5ac4963de9521599c88597b7fb97339d0eJakub Hrozek send("build_#{axiom_selection_method}", opts)
e00c2b5ac4963de9521599c88597b7fb97339d0eJakub Hrozek end
e00c2b5ac4963de9521599c88597b7fb97339d0eJakub Hrozek end
e00c2b5ac4963de9521599c88597b7fb97339d0eJakub Hrozek
e00c2b5ac4963de9521599c88597b7fb97339d0eJakub Hrozek def build_manual_axiom_selection(opts)
e00c2b5ac4963de9521599c88597b7fb97339d0eJakub Hrozek axiom_ids = normalize_check_box_ids(opts[:proof][:axioms])
e00c2b5ac4963de9521599c88597b7fb97339d0eJakub Hrozek @specific_axiom_selection = ManualAxiomSelection.new
e00c2b5ac4963de9521599c88597b7fb97339d0eJakub Hrozek if axiom_ids
e00c2b5ac4963de9521599c88597b7fb97339d0eJakub Hrozek specific_axiom_selection.axioms =
e00c2b5ac4963de9521599c88597b7fb97339d0eJakub Hrozek axiom_ids.map { |id| Axiom.unscoped.find(id) }
e00c2b5ac4963de9521599c88597b7fb97339d0eJakub Hrozek end
e00c2b5ac4963de9521599c88597b7fb97339d0eJakub Hrozek end
e00c2b5ac4963de9521599c88597b7fb97339d0eJakub Hrozek
44703b84feaafa4f0a4f8df11c5a503dcf48616eJakub Hrozek def build_sine_axiom_selection(opts)
44703b84feaafa4f0a4f8df11c5a503dcf48616eJakub Hrozek @specific_axiom_selection =
44703b84feaafa4f0a4f8df11c5a503dcf48616eJakub Hrozek SineAxiomSelection.new(opts[:proof][:sine_axiom_selection])
44703b84feaafa4f0a4f8df11c5a503dcf48616eJakub Hrozek end
44703b84feaafa4f0a4f8df11c5a503dcf48616eJakub Hrozek
44703b84feaafa4f0a4f8df11c5a503dcf48616eJakub Hrozek def timeout_present?
44703b84feaafa4f0a4f8df11c5a503dcf48616eJakub Hrozek timeout.present?
44703b84feaafa4f0a4f8df11c5a503dcf48616eJakub Hrozek end
44703b84feaafa4f0a4f8df11c5a503dcf48616eJakub Hrozek
44703b84feaafa4f0a4f8df11c5a503dcf48616eJakub Hrozek def prove
44703b84feaafa4f0a4f8df11c5a503dcf48616eJakub Hrozek proof_attempts.each do |proof_attempt|
44703b84feaafa4f0a4f8df11c5a503dcf48616eJakub Hrozek if prove_asynchronously
44703b84feaafa4f0a4f8df11c5a503dcf48616eJakub Hrozek ProofExecutionWorker.perform_async(proof_attempt.id)
44703b84feaafa4f0a4f8df11c5a503dcf48616eJakub Hrozek else
44703b84feaafa4f0a4f8df11c5a503dcf48616eJakub Hrozek ProofExecutionWorker.new.perform(proof_attempt.id)
44703b84feaafa4f0a4f8df11c5a503dcf48616eJakub Hrozek end
44703b84feaafa4f0a4f8df11c5a503dcf48616eJakub Hrozek end
44703b84feaafa4f0a4f8df11c5a503dcf48616eJakub Hrozek end
44703b84feaafa4f0a4f8df11c5a503dcf48616eJakub Hrozekend
44703b84feaafa4f0a4f8df11c5a503dcf48616eJakub Hrozek