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