require bigdecimal loaderror ruby (Programare, Ruby, Linux, Erori De Compilare, Irb)

Ben Nelson a intrebat.
a intrebat.

Am o problemă foarte frustrantă. Am ubuntu 12.04 pe mașina mea de acasă cu ruby 1.8.7 și abia am terminat un proiect care compilează și rulează perfect pe mașina mea de acasă, dar când l-am portat în laboratorul universității mele (pe care trebuie să compileze pentru ca eu să primesc o notă, ei rulează, de asemenea, ruby 1.8.7) primesc următoarea eroare:

`require': no such file to load -- bigdecimal (LoadError)

Clasa pe care încerc să o solicit este clasa BigDecimal clasă de care am nevoie pentru o precizie mai mare a virgulei flotante pentru unele calcule logaritmice pentru proiectul meu.Mă poate ajuta cineva să descifrez de ce ar fi aceasta o problemă? Credeam că clasa BigDecimal a fost inclusă în bibliotecile de bază ruby pentru 1.8.7? Îmi scapă ceva aici?EDIT: Codul este compilat.

  `#this is the language model generator
    require "trainer"
    require "bigdecimal"

class Model
    attr_accessor :frequency_tables

def initialize(trainer, test_file)
@trainer = trainer
@frequency_tables = []
@frequency_tables[0] = trainer.corpus
@frequency_tables[1] = trainer.freq
@frequency_tables[2] = trainer.bifreq
@frequency_tables[3] = trainer.trifreq
@frequency_tables[4] = trainer.word_count()
@frequency_tables[5] = trainer.vocab_count()
end

def unigram_count(string)
string.upcase!
return @frequency_tables[1][string]
end
def bigram_count(string)
string.upcase!
return @frequency_tables[2][string]
end
def trigram_count(string)
string.upcase!
return @frequency_tables[3][string]
end

def round(float)
return ((float * 10000).round.to_f) / 10000 
end

def process_unigram(sentence)
probability = BigDecimal.new("1") 
sen_arr = sentence.split(" ")
sen_arr.each { |word|
#  binding.pry
  probability *= (BigDecimal.new(unigram_count(word).to_s()) / BigDecimal.new(@frequency_tables[4].to_s())) 
}
unless probability.eql? 0
    val= ((Math.log(probability)/Math.log(2))) 
    return retval = round(val)  
end
return "undefined" 
end

def process_bigram(sentence)
probability = BigDecimal.new("1")
sen_arr = sentence.split(" ")
for i in (0..(sen_arr.length-1))
  unless i == 0
  denom = BigDecimal.new(unigram_count(sen_arr[i-1]).to_s())/BigDecimal.new(@frequency_tables[4].to_s())
    unless denom.eql? 0
      probability *= (BigDecimal.new(bigram_count(sen_arr[i-1]+" "+sen_arr[i]).to_s()) / BigDecimal.new(@frequency_tables[4].to_s()))/denom  
     else
      probability = 0
     end
  else
  probability *= (BigDecimal.new(bigram_count("PHI "+sen_arr[i]).to_s()) / BigDecimal.new(@frequency_tables[4].to_s())) / (BigDecimal.new(unigram_count("PHI").to_s())/BigDecimal.new(@frequency_tables[4].to_s()))   
  end
end
unless probability.eql? 0
    val= ((Math.log(probability)/Math.log(2))) 
    retval = round(val) 
    return retval
end
return "undefined"
end

def process_trigram(sentence)
probability = BigDecimal.new("1")
sen_arr = sentence.split(" ")
for i in (0..(sen_arr.length-1))
  if i >= 2
  denom = (BigDecimal.new(bigram_count(sen_arr[i-2]+" "+sen_arr[i-1]).to_s()))
      unless denom.eql? 0
      probability *= (BigDecimal.new(trigram_count(sen_arr[i-2]+" "+sen_arr[i-1]+" "+sen_arr[i]).to_s()))/denom   
      else
    probability *= 0
      end
  elsif i == 1
  denom = (BigDecimal.new(bigram_count("PHI "+sen_arr[i-1]).to_s()))
      unless denom.eql? 0
      probability *= (BigDecimal.new(trigram_count("PHI "+sen_arr[i-1]+" "+sen_arr[i]).to_s()))/denom  
      else
      probability = 0
      end
  else
  probability *= (BigDecimal.new(trigram_count("PHI PHI "+sen_arr[i]).to_s())) / (BigDecimal.new(unigram_count("PHI").to_s()))   
  end
end
unless probability.eql? 0 
    val= ((Math.log(probability)/Math.log(2))) 
    retval = round(val) 
    return retval
end
return "undefined"
end

def process_smooth_bigram(sentence)
probability = BigDecimal.new("1")
sen_arr = sentence.split(" ")
for i in (0..(sen_arr.length-1))
  unless i == 0
  bigram_c = bigram_count(sen_arr[i-1]+" "+sen_arr[i])+1
  ugram_c = unigram_count(sen_arr[i-1])[email protected]_tables[5]
  probability *= (BigDecimal.new(bigram_c.to_s()))/(BigDecimal.new(ugram_c.to_s()))   
  else
  probability *= (BigDecimal.new((bigram_count("PHI "+sen_arr[i])+1).to_s())) / (BigDecimal.new((unigram_count("PHI")[email protected]_tables[5]).to_s()))   
  end
end
unless probability.eql? 0
    val= ((Math.log(probability)/Math.log(2))) 
    retval = round(val) 
    return retval
end
return "undefined"
end

def process_smooth_trigram(sentence)
probability = BigDecimal.new("1")
sen_arr = sentence.split(" ")
for i in (0..(sen_arr.length-1))
  if i >= 2
  denom = (BigDecimal.new((bigram_count(sen_arr[i-2]+" "+sen_arr[i-1])[email protected]_tables[5]).to_s()))
  probability *= (BigDecimal.new((trigram_count(sen_arr[i-2]+" "+sen_arr[i-1]+" "+sen_arr[i])+1).to_s()))/denom   
  elsif i == 1
  denom = (BigDecimal.new((bigram_count("PHI "+sen_arr[i-1])[email protected]_tables[5]).to_s()))
  probability *= (BigDecimal.new((trigram_count("PHI "+sen_arr[i-1]+" "+sen_arr[i])+1).to_s()))/denom  
  else
  probability *= (BigDecimal.new((trigram_count("PHI PHI "+sen_arr[i])+1).to_s())) / (BigDecimal.new((unigram_count("PHI")[email protected]_tables[5]).to_s()))   
  end
end
unless probability.eql? 0 
    val= ((Math.log(probability)/Math.log(2))) 
    retval = round(val) 
    return retval
end
return "undefined"
end
end`

Comentarii

  • Unde se află require declarație? –  > Por Adam Eberlin.
2 răspunsuri
Adam Eberlin

Funcționează bine pentru mine. Probabil o eroare de sintaxă, adăugați un cod și voi actualiza.

ruby-1.8.7-p334 :001 > require 'bigdecimal'
 => true 

ruby-1.8.7-p334 :002 >  BigDecimal("1.0e+25") - BigDecimal("9999999999999999900000000.0")
 => #<BigDecimal:10035f970,'0.1E9',9(45)> 

Comentarii

  • când intru în irb pot face require ‘bigdecimal’ la fel de bine și obțin true, apoi pot manipula și clasa. WTF?! Voi edita niște cod la postarea mea originală. –  > Por Ben Nelson.
  • Ce se întâmplă dacă copiați/lipiți modelul direct în irb? Îl recunoaște sau dă și eroare? –  > Por Adam Eberlin.
Ben Nelson

Se pare că mașinile de pe laboratorul pe care îl foloseam aveau instalate mai multe versiuni de Ruby pe ele fără ca eu să știu. Cred că IRB folosea informațiile de la celelalte versiuni și astfel am putut să folosesc bigdecimal fără să-l folosesc doar cu comanda Ruby. După ce am folosit cealaltă versiune de Ruby care era instalată, a funcționat bine.