lib/flight/carbon_model.rb in flight-0.0.17 vs lib/flight/carbon_model.rb in flight-0.0.18

- old
+ new

@@ -31,51 +31,76 @@ characteristics[:fuel_per_segment] * characteristics[:emplanements_per_trip].to_f * characteristics[:trips].to_f end end committee :fuel_per_segment do # returns kg fuel - quorum 'from adjusted distance and fuel use formula and emplanements and trips', :needs => [:adjusted_distance_per_segment, :fuel_use_coefficients, :endpoint_fuel] do |characteristics| - characteristics[:fuel_use_coefficients][:m3].to_f * characteristics[:adjusted_distance_per_segment].to_f ** 3 + - characteristics[:fuel_use_coefficients][:m2].to_f * characteristics[:adjusted_distance_per_segment].to_f ** 2 + - characteristics[:fuel_use_coefficients][:m1].to_f * characteristics[:adjusted_distance_per_segment].to_f + - characteristics[:endpoint_fuel].to_f + quorum 'from adjusted distance per segment and fuel use coefficients', :needs => [:adjusted_distance_per_segment, :fuel_use_coefficients] do |characteristics| + characteristics[:fuel_use_coefficients].m3.to_f * characteristics[:adjusted_distance_per_segment].to_f ** 3 + + characteristics[:fuel_use_coefficients].m2.to_f * characteristics[:adjusted_distance_per_segment].to_f ** 2 + + characteristics[:fuel_use_coefficients].m1.to_f * characteristics[:adjusted_distance_per_segment].to_f + + characteristics[:fuel_use_coefficients].endpoint_fuel.to_f end end committee :adjusted_distance_per_segment do quorum 'from adjusted distance and emplanements', :needs => [:adjusted_distance, :emplanements_per_trip] do |characteristics| characteristics[:adjusted_distance] / characteristics[:emplanements_per_trip] end end - committee :endpoint_fuel do + committee :fuel_use_coefficients do quorum 'from aircraft', :needs => :aircraft do |characteristics| - characteristics[:aircraft].endpoint_fuel + aircraft = characteristics[:aircraft] + FuelUseEquation.new aircraft.m3, aircraft.m2, aircraft.m1, aircraft.endpoint_fuel end quorum 'from aircraft class', :needs => :aircraft_class do |characteristics| - characteristics[:aircraft_class].endpoint_fuel + aircraft_class = characteristics[:aircraft_class] + FuelUseEquation.new aircraft_class.m3, aircraft_class.m2, aircraft_class.m1, aircraft_class.endpoint_fuel end - quorum 'default' do - Aircraft.fallback.andand.endpoint_fuel + quorum 'from cohort', :needs => :cohort do |characteristics| + flight_segments = characteristics[:cohort] + + passengers = flight_segments.inject(0) do |passengers, flight_segment| + passengers + flight_segment.passengers + end + + m3 = flight_segments.inject(0) do |m3, flight_segment| + aircraft = Aircraft.find_by_bts_aircraft_type_code flight_segment.bts_aircraft_type_code + m3 + (aircraft.m3 * flight_segment.passengers) + end + + m2 = flight_segments.inject(0) do |m2, flight_segment| + aircraft = Aircraft.find_by_bts_aircraft_type_code flight_segment.bts_aircraft_type_code + m2 + (aircraft.m2 * flight_segment.passengers) + end + + m1 = flight_segments.inject(0) do |m1, flight_segment| + aircraft = Aircraft.find_by_bts_aircraft_type_code flight_segment.bts_aircraft_type_code + m1 + (aircraft.m1 * flight_segment.passengers) + end + + endpoint_fuel = flight_segments.inject(0) do |endpoint_fuel, flight_segment| + aircraft = Aircraft.find_by_bts_aircraft_type_code flight_segment.bts_aircraft_type_code + endpoint_fuel + (aircraft.endpoint_fuel * flight_segment.passengers) + end + + if [m3, m2, m1, endpoint_fuel, passengers].any?(&:nonzero?) + m3 = m3 / passengers + m2 = m2 / passengers + m1 = m1 / passengers + endpoint_fuel = endpoint_fuel / passengers + + FuelUseEquation.new m3, m2, m1, endpoint_fuel + end end - end - - committee :fuel_use_coefficients do - quorum 'from aircraft', :needs => :aircraft do |characteristics| - characteristics[:aircraft].attributes.symbolize_keys.slice(:m1, :m2, :m3) - end - quorum 'from aircraft class', :needs => :aircraft_class do |characteristics| - characteristics[:aircraft_class].attributes.symbolize_keys.slice(:m1, :m2, :m3) - end - quorum 'default' do fallback = Aircraft.fallback if fallback - fallback.attributes.symbolize_keys.slice(:m1, :m2, :m3) + FuelUseEquation.new fallback.m3, fallback.m2, fallback.m1, fallback.endpoint_fuel end end end committee :passengers do @@ -203,37 +228,39 @@ quorum 'default' do BrighterPlanet::Flight.flight_model.fallback.andand.trips_before_type_cast end end - committee :domesticity do - quorum 'from airports', :needs => [:origin_airport, :destination_airport] do |characteristics| - if [characteristics[:origin_airport], characteristics[:destination_airport]].all?(&:united_states?) - FlightDomesticity.find_by_name('domestic') - elsif [characteristics[:origin_airport], characteristics[:destination_airport]].any?(&:united_states?) - FlightDomesticity.find_by_name('international') - end - end - - quorum 'from origin', :needs => :origin_airport do |characteristics| - if characteristics[:origin_airport].all_flights_from_here_domestic? - FlightDomesticity.find_by_name('domestic') - end - end - - quorum 'from destination', :needs => :destination_airport do |characteristics| - if characteristics[:destination_airport].all_flights_to_here_domestic? - FlightDomesticity.find_by_name('domestic') - end - end - - quorum 'from airline', :needs => :airline do |characteristics| - if characteristics[:airline].all_flights_domestic? - FlightDomesticity.find_by_name('domestic') - end - end - end + # Disabling this for now because domesticity is pretty useless + # FIXME TODO make domesticity non-us-centric and check that data's ok + # committee :domesticity do + # quorum 'from airports', :needs => [:origin_airport, :destination_airport] do |characteristics| + # if [characteristics[:origin_airport], characteristics[:destination_airport]].all?(&:united_states?) + # FlightDomesticity.find_by_name('domestic') + # elsif [characteristics[:origin_airport], characteristics[:destination_airport]].any?(&:united_states?) + # FlightDomesticity.find_by_name('international') + # end + # end + # + # quorum 'from origin', :needs => :origin_airport do |characteristics| + # if characteristics[:origin_airport].all_flights_from_here_domestic? + # FlightDomesticity.find_by_name('domestic') + # end + # end + # + # quorum 'from destination', :needs => :destination_airport do |characteristics| + # if characteristics[:destination_airport].all_flights_to_here_domestic? + # FlightDomesticity.find_by_name('domestic') + # end + # end + # + # quorum 'from airline', :needs => :airline do |characteristics| + # if characteristics[:airline].all_flights_domestic? + # FlightDomesticity.find_by_name('domestic') + # end + # end + # end committee :seat_class_multiplier do quorum 'from seat class', :needs => :seat_class do |characteristics| characteristics[:seat_class].multiplier end @@ -247,27 +274,31 @@ quorum 'from creation date', :needs => :creation_date do |characteristics| characteristics[:creation_date] end quorum 'from timeframe' do |characteristics, timeframe| - timeframe.andand.from + timeframe.present? ? timeframe.from : nil end end committee :cohort do - quorum 'from t100', :appreciates => FlightSegment::INPUT_CHARACTERISTICS do |characteristics| - needed_characteristics = characteristics - needed_characteristics. - reject! { |k,v| !FlightSegment::INPUT_CHARACTERISTICS.include?(k) } - cohort = FlightSegment.big_cohort needed_characteristics + quorum 'from t100', :appreciates => [:origin_airport, :destination_airport, :aircraft, :airline] do |characteristics| + provided_characteristics = [:origin_airport, :destination_airport, :aircraft, :airline]. + inject(ActiveSupport::OrderedHash.new) do |memo, characteristic_name| + memo[characteristic_name] = characteristics[characteristic_name] + memo + end + cohort = FlightSegment.strict_cohort provided_characteristics if cohort.any? cohort else nil end end end end end + + class FuelUseEquation < Struct.new(:m3, :m2, :m1, :endpoint_fuel); end end end end