diff --git a/.github/workflows/automated-experiment-result-checker.yml b/.github/workflows/automated-experiment-result-checker.yml new file mode 100644 index 000000000..b784ef391 --- /dev/null +++ b/.github/workflows/automated-experiment-result-checker.yml @@ -0,0 +1,70 @@ +--- +name: "Automated Experiment Result Checker" + +# yamllint disable-line rule:truthy +on: + pull_request: + types: [opened, reopened, synchronize] + +concurrency: + group: ${{ github.ref }}-automated-experiment-result-checker + cancel-in-progress: true + +permissions: + contents: write + pull-requests: write +jobs: + automated-experiment-result-checker: + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 + with: + ref: ${{ github.event.pull_request.head.sha }} + fetch-depth: 0 + + - name: Check for updated experiment result graphs and tables + run: | + set -e + cd "$(git rev-parse --show-toplevel)" + + # TODO: Include lower bound windup experiment once we have a way to make it run in a reasonable time. + # Find all PNGs and CSV files, excluding those with "windup" in their filename + mapfile -t all_pngs < <(find experiments/results/main_graphs -type f -name '*.png' ! -name '*windup*.png' | sort) + mapfile -t all_csvs < <(find experiments/results/csv -type f -name '*.csv' ! -name '*windup*.csv' 2>/dev/null | sort) + + # Combine all result files + all_files=("${all_pngs[@]}" "${all_csvs[@]}") + + # Find all changed PNGs and CSVs in the latest commit + mapfile -t changed_files < <(git diff --name-only --diff-filter=AM HEAD~1..HEAD | grep -E '^experiments/results/main_graphs/.*\.png$|^experiments/results/csv/.*\.csv$' | grep -v windup | sort) + + # Report any files that are not updated in the latest commit + declare -a not_updated=() + for file in "${all_files[@]}"; do + if ! printf "%s\n" "${changed_files[@]}" | grep -qx "$file"; then + not_updated+=("$file") + fi + done + + if [ ${#not_updated[@]} -gt 0 ]; then + echo "❌ The following result files have NOT been updated in the latest commit:" + for f in "${not_updated[@]}"; do + echo " - $f" + done + echo "" + echo "Every commit must update all non-windup experiment result graphs and CSV files. You may be missing updates." + echo "Run:" + echo "" + echo " cd experiments" + echo " bundle install" + echo " bundle exec ruby run_all_experiments.rb" + echo "" + echo "Commit the updated graphs and CSV files to resolve this check." + exit 1 + fi + + echo "✅ All non-windup experiment result graphs and CSV files are up to date for this commit!" + + + diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 0dd7cd80f..9c447b384 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -6,7 +6,7 @@ on: push: branches: [ main ] pull_request: - branches: [ main ] + branches: [ '**' ] workflow_call: concurrency: diff --git a/Gemfile b/Gemfile index 0cd7adff7..3bfe979f6 100644 --- a/Gemfile +++ b/Gemfile @@ -15,6 +15,7 @@ group :test do gem "pry-byebug", require: false gem "toxiproxy" gem "webrick" + gem "rubystats" gem "bigdecimal" gem "mutex_m" diff --git a/Gemfile.lock b/Gemfile.lock index b474bbae6..b2e0c9748 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -89,6 +89,7 @@ GEM language_server-protocol (3.17.0.5) lint_roller (1.1.0) logger (1.7.0) + matrix (0.4.3) memory_profiler (1.1.0) method_source (1.1.0) minitest (5.25.5) @@ -157,6 +158,8 @@ GEM rubocop-ast (>= 1.44.0, < 2.0) ruby-progressbar (1.13.0) ruby2_keywords (0.0.5) + rubystats (0.4.1) + matrix securerandom (0.4.1) stringio (3.1.7) timeout (0.4.3) @@ -177,6 +180,7 @@ PLATFORMS arm64-darwin-22 arm64-darwin-23 arm64-darwin-24 + arm64-darwin-25 x86_64-darwin-21 x86_64-darwin-22 x86_64-linux @@ -205,6 +209,7 @@ DEPENDENCIES rubocop-rake rubocop-shopify (~> 2) rubocop-thread_safety + rubystats semian! toxiproxy trilogy (~> 2.9) diff --git a/README.md b/README.md index cfca16656..384c84c9f 100644 --- a/README.md +++ b/README.md @@ -575,6 +575,52 @@ It is possible to disable Circuit Breaker with environment variable For more information about configuring these parameters, please read [this post](https://shopify.engineering/circuit-breaker-misconfigured). +#### Adaptive Circuit Breaker (Experimental) + +Semian also includes an experimental adaptive circuit breaker that uses a [PID controller](https://en.wikipedia.org/wiki/Proportional%E2%80%93integral%E2%80%93derivative_controller) +to dynamically adjust the rejection rate based on real-time error rates. Unlike the +traditional circuit breaker with fixed thresholds, the adaptive circuit breaker continuously +monitors error rates and adjusts its behavior accordingly. + +##### How It Works + +The adaptive circuit breaker uses the error function: +``` +P = (error_rate - ideal_error_rate) - (1 - (error_rate - ideal_error_rate)) * rejection_rate +``` + +This formula ensures that: +- Rejection rate increases when the service is unhealthy +- Rejection rate decreases when the service recovers +- The system finds an equilibrium that protects against cascading failures while allowing recovery + +##### Adaptive Circuit Breaker Configuration + +To enable the adaptive circuit breaker, simply set: + +- **adaptive_circuit_breaker**. Enable adaptive circuit breaker instead of traditional. Defaults to `false`. + +Example configuration: +```ruby +Semian.register( + :my_service, + adaptive_circuit_breaker: true, # Use adaptive instead of traditional + bulkhead: false # Can be combined with bulkhead +) +``` + +The adaptive circuit breaker uses carefully tuned internal parameters based on extensive testing: +- PID controller gains optimized for stability and responsiveness +- 10-second window for rate calculations +- 1-hour history for ideal error rate calculation (p90) +- 1-second interval for background health checks + +The adaptive circuit breaker can be disabled with the environment variable +`SEMIAN_ADAPTIVE_CIRCUIT_BREAKER_DISABLED=1`. + +**Note**: When `adaptive_circuit_breaker: true` is set, traditional circuit breaker +parameters (`error_threshold`, `error_timeout`, etc.) are ignored. + ### Bulkheading For some applications, circuit breakers are not enough. This is best illustrated diff --git a/examples/dual_circuit_breaker_demo.rb b/examples/dual_circuit_breaker_demo.rb new file mode 100644 index 000000000..1779d63c5 --- /dev/null +++ b/examples/dual_circuit_breaker_demo.rb @@ -0,0 +1,174 @@ +#!/usr/bin/env ruby +# frozen_string_literal: true + +require "bundler/setup" +require "semian" + +# Example: Dual Circuit Breaker Demo +# This demonstrates how to use both legacy and adaptive circuit breakers +# simultaneously, switching between them at runtime based on a callable. + +# Simulate a feature flag that can be toggled +module ExperimentFlags + @enabled = false + + def self.enable_adaptive! + @enabled = true + end + + def self.disable_adaptive! + @enabled = false + end + + def self.use_adaptive_circuit_breaker? + @enabled + end +end + +# Helper function to print state of all Semian objects between each phase +def print_semian_state + puts "\n=== Semian Resources State ===\n" + Semian.resources.values.each do |resource| + puts "Resource: #{resource.name}" + + # Bulkhead info + if resource.bulkhead + puts " Bulkhead: tickets=#{resource.tickets}, count=#{resource.count}" + else + puts " Bulkhead: disabled" + end + + # Circuit breaker info + cb = resource.circuit_breaker + if cb.nil? + puts " Circuit Breaker: disabled" + elsif cb.is_a?(Semian::DualCircuitBreaker) + puts " Circuit Breaker: DualCircuitBreaker" + metrics = cb.metrics + puts " Active: #{metrics[:active]}" + puts " Classic: state=#{metrics[:classic][:state]}, open=#{metrics[:classic][:open]}, half_open=#{metrics[:classic][:half_open]}" + puts " Adaptive: rejection_rate=#{metrics[:adaptive][:rejection_rate]}, error_rate=#{metrics[:adaptive][:error_rate]}" + elsif cb.is_a?(Semian::AdaptiveCircuitBreaker) + puts " Circuit Breaker: AdaptiveCircuitBreaker" + puts " open=#{cb.open?}, closed=#{cb.closed?}, half_open=#{cb.half_open?}" + else + puts " Circuit Breaker: Legacy" + puts " state=#{cb.state&.value}, open=#{cb.open?}, closed=#{cb.closed?}, half_open=#{cb.half_open?}" + puts " last_error=#{cb.last_error&.class}" + end + puts "" + end + puts "=== END STATE OUTPUT ===\n\n" +end + +# Register a resource with dual circuit breaker mode +resource = Semian.register( + :my_service, + # Enable dual circuit breaker mode + dual_circuit_breaker: true, + + # Legacy circuit breaker parameters (required) + success_threshold: 2, + error_threshold: 3, + error_timeout: 10, + + # Adaptive circuit breaker parameters (optional, has defaults) + seed_error_rate: 0.01, + + # Common parameters + tickets: 5, + timeout: 0.5, + exceptions: [RuntimeError], +) + +Semian::DualCircuitBreaker.adaptive_circuit_breaker_selector(->(_resource) { ExperimentFlags.use_adaptive_circuit_breaker? }) + +puts "=== Dual Circuit Breaker Demo ===\n\n" + +# Helper to simulate service calls +def simulate_call(success: true) + if success + "Success!" + else + raise "Service error" + end +end + +# Test with legacy circuit breaker (use_adaptive returns false) +puts "Phase 1: Using LEGACY circuit breaker (use_adaptive=false)" +puts "The first 3 requests will succeed, the rest will fail." +puts "-" * 50 + +ExperimentFlags.disable_adaptive! + +10.times do |i| + result = Semian[:my_service].acquire do + simulate_call(success: i < 3) # First 3 succeed, rest fail + end + puts " Request #{i + 1}: #{result}" +rescue => e + puts " Request #{i + 1}: Failed - #{e.class.name}: #{e.message}" +end + +print_semian_state + +# Reset both circuit breakers +puts "\n" + "=" * 50 +puts "Resetting circuit breakers..." +resource.circuit_breaker.reset + +# Test with adaptive circuit breaker (use_adaptive returns true) +puts "\nPhase 2: Using ADAPTIVE circuit breaker (use_adaptive=true)" +puts "The first 3 requests will succeed, then the rest will be failures." +puts "The adaptive circuit breaker is not expected to open yet." +puts "-" * 50 + +ExperimentFlags.enable_adaptive! + +10.times do |i| + begin + result = Semian[:my_service].acquire do + simulate_call(success: i < 3) # First 3 succeed, rest fail + end + puts " Request #{i + 1}: #{result}" + rescue => e + puts " Request #{i + 1}: Failed - #{e.class.name}: #{e.message}" + end + sleep 0.05 # Small delay to see adaptive behavior +end + +print_semian_state + +# Demonstrate dynamic switching +puts "\n" + "=" * 50 +puts "Phase 3: Dynamic switching between circuit breakers" +puts "-" * 50 + +5.times do |i| + # Toggle every 2 requests + if i.even? + ExperimentFlags.disable_adaptive! + puts " Switched to LEGACY" + else + ExperimentFlags.enable_adaptive! + puts " Switched to ADAPTIVE" + end + + begin + result = Semian[:my_service].acquire do + simulate_call(success: true) + end + puts " Request #{i + 1}: #{result}" + rescue => e + puts " Request #{i + 1}: Failed - #{e.class.name}" + end +end + +puts "\n=== Demo Complete ===\n" +puts "Both circuit breakers tracked all requests, but only the active one" +puts "was used for decision-making based on the adaptive_circuit_breaker_selector callable." + +print_semian_state + +# Cleanup +Semian.destroy(:my_service) diff --git a/examples/net_http/08_dual_circuit_breaker.rb b/examples/net_http/08_dual_circuit_breaker.rb new file mode 100644 index 000000000..8e8c970bc --- /dev/null +++ b/examples/net_http/08_dual_circuit_breaker.rb @@ -0,0 +1,166 @@ +#!/usr/bin/env ruby +# frozen_string_literal: true + +require "bundler/setup" +require "semian" +require "semian/net_http" +require "net/http" + +# Example: Dual Circuit Breaker with Net::HTTP +# This shows how to run both legacy and adaptive circuit breakers in parallel +# and switch between them at runtime using a callable that determines which to use. + +# Simulate a feature flag system (in production, this would be your actual feature flag service) +module ExperimentFlags + @enabled = false + + def self.enable_adaptive! + @enabled = true + end + + def self.disable_adaptive! + @enabled = false + end + + def self.use_adaptive_circuit_breaker? + @enabled + end +end + +# Helper function to print state of all Semian objects between each phase +def print_semian_state + puts "\n=== Semian Resources State ===\n" + Semian.resources.values.each do |resource| + puts "Resource: #{resource.name}" + + # Bulkhead info + if resource.bulkhead + puts " Bulkhead: tickets=#{resource.tickets}, count=#{resource.count}" + else + puts " Bulkhead: disabled" + end + + # Circuit breaker info + cb = resource.circuit_breaker + if cb.nil? + puts " Circuit Breaker: disabled" + elsif cb.is_a?(Semian::DualCircuitBreaker) + puts " Circuit Breaker: DualCircuitBreaker" + metrics = cb.metrics + puts " Active: #{metrics[:active]}" + puts " Classic: state=#{metrics[:classic][:state]}, open=#{metrics[:classic][:open]}, half_open=#{metrics[:classic][:half_open]}" + puts " Adaptive: rejection_rate=#{metrics[:adaptive][:rejection_rate]}, error_rate=#{metrics[:adaptive][:error_rate]}" + elsif cb.is_a?(Semian::AdaptiveCircuitBreaker) + puts " Circuit Breaker: AdaptiveCircuitBreaker" + puts " open=#{cb.open?}, closed=#{cb.closed?}, half_open=#{cb.half_open?}" + else + puts " Circuit Breaker: Legacy" + puts " state=#{cb.state&.value}, open=#{cb.open?}, closed=#{cb.closed?}, half_open=#{cb.half_open?}" + puts " last_error=#{cb.last_error&.class}" + end + puts "" + end + puts "=== END STATE OUTPUT ===\n\n" +end + +Semian::DualCircuitBreaker.adaptive_circuit_breaker_selector(->(_resource) { ExperimentFlags.use_adaptive_circuit_breaker? }) + +# Configure Semian with dual circuit breaker +Semian::NetHTTP.semian_configuration = proc do |host, port| + # Example: only enable for specific host + if host == "shopify-debug.com" + { + # Enable dual circuit breaker mode + dual_circuit_breaker: true, + + # Legacy circuit breaker settings (required) + success_threshold: 2, + error_threshold: 3, + error_timeout: 5, + + # Adaptive circuit breaker settings (uses defaults if not specified) + seed_error_rate: 0.01, + + # Bulkhead settings + tickets: 3, + timeout: 1, + + # Exceptions to track + exceptions: [Net::HTTPServerException], + } + end +end + +puts "=== Dual Circuit Breaker with Net::HTTP ===\n\n" + +# Helper to make HTTP requests +def make_request(uri_str) + uri = URI(uri_str) + Net::HTTP.start(uri.host, uri.port) do |http| + request = Net::HTTP::Get.new(uri) + response = http.request(request) + response.code + end +rescue => e + e.class.name +end + +print_semian_state + +# Phase 1: Use legacy circuit breaker +puts "Phase 1: Using LEGACY circuit breaker" +puts "-" * 50 +ExperimentFlags.disable_adaptive! + +3.times do |i| + puts "Request #{i + 1} (using legacy)..." + result = make_request("http://shopify-debug.com/") + puts " Result: #{result}\n\n" + sleep 3 +end + +print_semian_state + +# Phase 2: Switch to adaptive circuit breaker +puts "Phase 2: Switching to ADAPTIVE circuit breaker" +puts "-" * 50 +ExperimentFlags.enable_adaptive! + +3.times do |i| + puts "Request #{i + 1} (using adaptive)..." + result = make_request("http://shopify-debug.com/") + puts " Result: #{result}\n\n" + sleep 3 +end + +print_semian_state + +# Phase 3: Demonstrate dynamic switching +puts "Phase 3: Dynamic switching during runtime" +puts "-" * 50 + +5.times do |i| + # Toggle between legacy and adaptive + if i.even? + ExperimentFlags.disable_adaptive! + active = "LEGACY" + else + ExperimentFlags.enable_adaptive! + active = "ADAPTIVE" + end + + puts "Request #{i + 1} (using #{active})..." + result = make_request("http://shopify-debug.com/") + puts " Result: #{result}\n\n" + sleep 3 +end + +print_semian_state + +puts "=== Demo Complete ===\n\n" +puts "Key Benefits of Dual Circuit Breaker:" +puts " 1. Both breakers track all requests independently" +puts " 2. Can switch between breakers without losing state" +puts " 3. Can compare behavior of both approaches with same traffic" +puts " 4. Enables gradual rollout with instant rollback capability" +puts " 5. Perfect for A/B testing circuit breaker strategies" diff --git a/experiments/Gemfile b/experiments/Gemfile index 2afa2ed38..c5590cb32 100644 --- a/experiments/Gemfile +++ b/experiments/Gemfile @@ -2,8 +2,9 @@ source "https://rubygems.org" +gemspec path: ".." + # Graphing library for visualization gem "gruff", "~> 0.23" - -# Alternative: Use rubyplot for pure Ruby plotting (no ImageMagick dependency) -# gem 'rubyplot', '~> 0.1' +gem "logger" +gem "csv" diff --git a/experiments/Gemfile.lock b/experiments/Gemfile.lock index 66ebe6986..4ab2cb787 100644 --- a/experiments/Gemfile.lock +++ b/experiments/Gemfile.lock @@ -1,12 +1,21 @@ +PATH + remote: .. + specs: + semian (0.26.6) + concurrent-ruby + GEM remote: https://rubygems.org/ specs: bigdecimal (3.3.0) + concurrent-ruby (1.3.5) + csv (3.3.5) gruff (0.29.0) bigdecimal (>= 3.0) histogram rmagick (>= 5.5) histogram (0.2.4.1) + logger (1.7.0) observer (0.1.2) pkg-config (1.6.4) rmagick (6.1.4) @@ -18,7 +27,10 @@ PLATFORMS ruby DEPENDENCIES + csv gruff (~> 0.23) + logger + semian! BUNDLED WITH 2.6.9 diff --git a/experiments/example_output.png b/experiments/example_output.png deleted file mode 100644 index 0976a711c..000000000 Binary files a/experiments/example_output.png and /dev/null differ diff --git a/experiments/example_with_circuit_breaker.rb b/experiments/example_with_circuit_breaker.rb deleted file mode 100644 index a2db1b5a2..000000000 --- a/experiments/example_with_circuit_breaker.rb +++ /dev/null @@ -1,86 +0,0 @@ -# frozen_string_literal: true - -$LOAD_PATH.unshift(File.expand_path("../lib", __dir__)) - -require "semian" -require_relative "experimental_resource" - -resource = Semian::Experiments::ExperimentalResource.new( - name: "protected_service", - endpoints_count: 200, - min_latency: 0.01, - max_latency: 10, - distribution: { - type: :log_normal, - mean: 1, - std_dev: 0.1, - }, - error_rate: 0.01, # 1% baseline error rate - timeout: 5, # 5 seconds timeout - semian: { - success_threshold: 2, - error_threshold: 3, - error_threshold_timeout: 20, - error_timeout: 15, - bulkhead: false, - }, -) - -outcomes = {} - -done = false - -Thread.new do - until done - sleep(0.1) # Don't send more than 10 requests per second - current_sec = outcomes[Time.now.to_i] ||= { - success: 0, - circuit_open: 0, - error: 0, - } - begin - resource.request(rand(resource.endpoints_count)) - puts "✓ Success" - current_sec[:success] += 1 - rescue Semian::Experiments::ExperimentalResource::CircuitOpenError => e - puts "⚡ Circuit Open - #{e.message}" - current_sec[:circuit_open] += 1 - rescue Semian::Experiments::ExperimentalResource::RequestError, Semian::Experiments::ExperimentalResource::TimeoutError => e - puts "✗ Error" - current_sec[:error] += 1 - end - end -end - -sleep 10 - -puts "Setting error rate to 0.5" -resource.set_error_rate(0.5) - -sleep 10 - -puts "Resetting error rate to 0.01" -resource.set_error_rate(0.01) - -sleep 10 - -done = true - -puts "Generating graph showing success, circuit open, and error rates over time, (bucketed by 1 second)..." -require "gruff" - -graph = Gruff::Line.new -graph.title = "Outcomes" -graph.x_axis_label = "Time" -graph.y_axis_label = "Count" - -graph.hide_dots = true -graph.line_width = 3 - -graph.data("Success", outcomes.map { |_, data| data[:success] }) -graph.data("Circuit Open", outcomes.map { |_, data| data[:circuit_open] }) -graph.data("Error", outcomes.map { |_, data| data[:error] }) - -graph.write("example_output.png") - -puts "Graph saved to outcomes.png" diff --git a/experiments/experiment_helpers.rb b/experiments/experiment_helpers.rb new file mode 100644 index 000000000..1c5eff03d --- /dev/null +++ b/experiments/experiment_helpers.rb @@ -0,0 +1,669 @@ +# frozen_string_literal: true + +module Semian + module Experiments + # Experiment runner for circuit breaker experiments (both adaptive and classic) + # Handles all the common logic: service creation, threading, monitoring, analysis, and visualization + require "fileutils" + require "csv" + class DegradationPhase + attr_reader :healthy, :error_rate, :latency, :specific_endpoint_latency + + def initialize(healthy: nil, error_rate: nil, latency: nil, specific_endpoint_latency: nil) + @healthy = healthy + @error_rate = error_rate + @latency = latency + @specific_endpoint_latency = specific_endpoint_latency + end + end + + class CircuitBreakerExperimentRunner + attr_reader :experiment_name, :resource_name, :degradation_phases, :phase_duration, :graph_title, :graph_filename, :service_count, :target_service + + def initialize( + experiment_name:, + resource_name:, + degradation_phases:, + phase_duration:, + graph_title:, + semian_config:, + graph_filename: nil, + num_threads: 60, + requests_per_second: 1000, + x_axis_label_interval: nil, + service_count: 1, + graph_bucket_size: nil, + base_error_rate: 0.01, + with_max_threads: false + ) + @experiment_name = experiment_name + @resource_name = resource_name + @degradation_phases = degradation_phases + @phase_duration = phase_duration + @graph_title = graph_title + @semian_config = semian_config + @is_adaptive = semian_config[:adaptive_circuit_breaker] == true + @graph_filename = graph_filename || "#{resource_name}.png" + @main_results_path = File.join(File.dirname(__FILE__), "results/main_graphs") + @csv_results_path = File.join(File.dirname(__FILE__), "results/csv") + FileUtils.mkdir_p(@main_results_path) unless File.directory?(@main_results_path) + FileUtils.mkdir_p(@csv_results_path) unless File.directory?(@csv_results_path) + @num_threads = num_threads + @requests_per_second = requests_per_second + @x_axis_label_interval = x_axis_label_interval || phase_duration + @experiment_duration = degradation_phases.length * phase_duration + @service_count = service_count + @target_service = nil + @graph_bucket_size = graph_bucket_size || 1 + @base_error_rate = base_error_rate + @with_max_threads = with_max_threads + base_filename = graph_filename ? graph_filename.sub(/\.png$/, "") : resource_name + @time_analysis_csv_filename = "#{base_filename}_time_analysis.csv" + @pid_controller_csv_filename = "#{base_filename}_pid_controller.csv" + @time_analysis_data = [] + @pid_controller_data = [] + end + + def run + setup_services + setup_resources + start_threads + execute_phases + wait_for_completion + generate_analysis + generate_visualization + end + + private + + def setup_services + puts "Creating mock service..." + @services = [] + mean_latency = 0.15 + # Provide barely enough threads for us to handle the expected load (using Little's law) + max_threads_per_service = ((@requests_per_second / @service_count) * mean_latency).to_i + @service_count.times do + @services << MockService.new( + endpoints_count: 10, + min_latency: 0.1, + max_latency: 10, + distribution: { + type: :log_normal, + mean: mean_latency, + std_dev: 3, + }, + error_rate: @base_error_rate, + timeout: 10, + max_threads: @with_max_threads ? max_threads_per_service : 0, + queue_timeout: 1.0, + ) + end + # We always assume that you want to degrade one service, and we pick @services[0] + # If you have more complex experiments with multi-service degradation, + # feel free to change this code. + @target_service = @services[0] + end + + def setup_resources + puts "Initializing Semian resource..." + begin + @services.each do |service| + init_resource = ExperimentalResource.new( + name: "#{@resource_name}_#{service.object_id}", + service: service, + semian: @semian_config, + ) + init_resource.request(0) + end + rescue + # Ignore any error, we just needed to trigger registration + end + puts "Resource initialized successfully.\n" + end + + def start_threads + @outcomes = {} + @done = false + @outcomes_mutex = Mutex.new + @pid_mutex = Mutex.new + @thread_timings = {} + @state_transitions = [] + @state_transitions_mutex = Mutex.new + + start_request_arrival + start_processing_threads + subscribe_to_metrics if @is_adaptive + subscribe_to_state_changes unless @is_adaptive + end + + def start_request_arrival + @request_queue = Queue.new + @arrival_thread = Thread.new do + until @done + sleep(1.0 / @requests_per_second) + @request_queue << Time.now.to_i + end + # Push sentinel values to wake up all worker threads on shutdown + @num_threads.times { @request_queue << :shutdown } + end + end + + def start_processing_threads + puts "Starting #{@num_threads} concurrent request threads (#{@requests_per_second} requests/second)..." + + @request_threads = [] + @num_threads.times do |thread_num| + @request_threads << Thread.new do + thread_id = Thread.current.object_id + @thread_timings[thread_id] = { samples: [] } + + loop do + # Block waiting for a request token + token = @request_queue.pop + break if token == :shutdown || @done + + next if token < Time.now.to_i - 1 # Ignore requests that are more than 1 second old + + service = @services.sample + # technically, we are creating a new resource instance on every request. + # But the resource class is pretty much only a wrapper around things that are longer-living. + # So this works just fine. + thread_resource = ExperimentalResource.new( + name: "#{@resource_name}_#{service.object_id}_thread_#{thread_num}", + service: service, + semian: @semian_config, + ) + + request_start = Time.now + begin + thread_resource.request(rand(service.endpoints_count)) + + @outcomes_mutex.synchronize do + current_sec = @outcomes[Time.now.to_i] ||= { + success: 0, + circuit_open: 0, + error: 0, + } + print("✓") + current_sec[:success] += 1 + end + rescue ExperimentalResource::CircuitOpenError + @outcomes_mutex.synchronize do + current_sec = @outcomes[Time.now.to_i] ||= { + success: 0, + circuit_open: 0, + error: 0, + } + print("⚡") + current_sec[:circuit_open] += 1 + end + rescue ExperimentalResource::RequestError, ExperimentalResource::TimeoutError, ExperimentalResource::QueueTimeoutError + @outcomes_mutex.synchronize do + current_sec = @outcomes[Time.now.to_i] ||= { + success: 0, + circuit_open: 0, + error: 0, + } + print("✗") + current_sec[:error] += 1 + end + ensure + request_duration = Time.now - request_start + timestamp = Time.now.to_i + @thread_timings[thread_id][:samples] << { duration: request_duration, timestamp: timestamp } + end + end + end + end + end + + def subscribe_to_metrics + target_resource_prefix = "#{@resource_name}_#{@target_service.object_id}_thread_" + # Collect raw metrics from all threads + @raw_metrics = [] + + @subscription = Semian.subscribe do |event, resource, _scope, _adapter, payload| + # Only capture adaptive_update events for our target service thread resources + next unless event == :adaptive_update && resource.name.to_s.start_with?(target_resource_prefix) + + @pid_mutex.synchronize do + timestamp = Time.now.to_i + + @raw_metrics << { + timestamp: timestamp, + resource_name: resource.name, + error_rate: payload[:error_rate], + ideal_error_rate: payload[:ideal_error_rate], + p_value: payload[:p_value], + previous_p_value: payload[:previous_p_value], + rejection_rate: payload[:rejection_rate], + integral: payload[:integral], + derivative: payload[:derivative], + } + end + end + end + + def subscribe_to_state_changes + target_resource_prefix = "#{@resource_name}_#{@target_service.object_id}_thread_" + + @subscription = Semian.subscribe do |event, resource, _scope, _adapter, payload| + # Only capture state_change events for our target service thread resources + next unless event == :state_change && resource.name.to_s.start_with?(target_resource_prefix) + + @state_transitions_mutex.synchronize do + @state_transitions << { + timestamp: Time.now.to_i, + state: payload[:state], + resource_name: resource.name, + } + end + end + end + + def execute_phases + puts "\n=== #{@experiment_name} (ADAPTIVE) ===" + puts "Error rate: #{@degradation_phases.map { |r| r.error_rate ? "#{(r.error_rate * 100).round(1)}%" : "N/A" }.join(" -> ")}" + puts "Latency: #{@degradation_phases.map { |r| r.latency ? "#{(r.latency * 1000).round(1)}ms" : "N/A" }.join(" -> ")}" + puts "Specific endpoint latency: #{@degradation_phases.map { |r| r.specific_endpoint_latency ? "#{(r.specific_endpoint_latency * 1000).round(1)}ms" : "N/A" }.join(" -> ")}" + puts "Phase duration: #{@phase_duration} seconds (#{(@phase_duration / 60.0).round(1)} minutes) per phase" + puts "Duration: #{@experiment_duration} seconds (#{(@experiment_duration / 60.0).round(1)} minutes)" + puts "Starting experiment...\n" + + @start_time = Time.now + + @degradation_phases.each_with_index do |degradation_phase, idx| + if idx > 0 + if degradation_phase.healthy + puts "\n=== Transitioning to healthy state ===" + @target_service.reset_degradation + else + if degradation_phase.error_rate + puts "\n=== Transitioning to #{(degradation_phase.error_rate * 100).round(1)}% error rate ===" + @target_service.set_error_rate(degradation_phase.error_rate) + end + if degradation_phase.latency + puts "\n=== Transitioning to #{(degradation_phase.latency * 1000).round(1)}ms latency ===" + @target_service.add_latency(degradation_phase.latency) + end + if degradation_phase.specific_endpoint_latency + puts "\n=== Transitioning to #{(degradation_phase.specific_endpoint_latency * 1000).round(1)}ms specific endpoint latency ===" + @target_service.degrade_specific_endpoint(rand(@target_service.endpoints_count), degradation_phase.specific_endpoint_latency) + end + end + end + + sleep(@phase_duration) + end + end + + def wait_for_completion + @done = true + puts "\nWaiting for all request threads to finish..." + @arrival_thread.join # Wait for arrival thread to push shutdown tokens + @request_threads.each(&:join) + + Semian.unsubscribe(@subscription) if @subscription + + @end_time = Time.now + + # Clean up per-thread resources + @services.each do |service| + @num_threads.times do |thread_num| + resource_name = "#{@resource_name}_#{service.object_id}_thread_#{thread_num}".to_sym + Semian.destroy(resource_name) + end + end + end + + def generate_analysis + output_lines = [] + output_lines << "\n\n=== Experiment Complete ===" + output_lines << "Actual duration: #{(@end_time - @start_time).round(2)} seconds" + output_lines << "\nGenerating analysis..." + + # Print to console + output_lines.each { |line| puts line } + + display_summary_statistics + display_time_based_analysis + display_thread_timing_statistics + display_pid_controller_state + + # Save CSV outputs + save_csv_outputs + end + + def display_summary_statistics + total_success = @outcomes.values.sum { |data| data[:success] } + total_circuit_open = @outcomes.values.sum { |data| data[:circuit_open] } + total_error = @outcomes.values.sum { |data| data[:error] } + total_requests = total_success + total_circuit_open + total_error + + puts "\n=== Summary Statistics ===" + puts "Total Requests: #{total_requests}" + puts " Successes: #{total_success} (#{(total_success.to_f / total_requests * 100).round(2)}%)" + puts " Rejected: #{total_circuit_open} (#{(total_circuit_open.to_f / total_requests * 100).round(2)}%)" + puts " Errors: #{total_error} (#{(total_error.to_f / total_requests * 100).round(2)}%)" + end + + def display_time_based_analysis + bucket_size = @phase_duration + num_buckets = (@experiment_duration / bucket_size.to_f).ceil + + puts "\n=== Time-Based Analysis (#{bucket_size}-second buckets) ===" + + # Add CSV header + @time_analysis_data << ["Time Range", "Total Requests", "Success", "Errors", "Error %", "Rejected", "Rejected %", "Target Error Rate %"] + + (0...num_buckets).each do |bucket_idx| + bucket_start = @outcomes.keys[0] + (bucket_idx * bucket_size) + bucket_data = @outcomes.select { |time, _| time >= bucket_start && time < bucket_start + bucket_size } + + bucket_success = bucket_data.values.sum { |d| d[:success] } + bucket_errors = bucket_data.values.sum { |d| d[:error] } + bucket_circuit = bucket_data.values.sum { |d| d[:circuit_open] } + bucket_total = bucket_success + bucket_errors + bucket_circuit + + bucket_time_range = "#{bucket_idx * bucket_size}-#{(bucket_idx + 1) * bucket_size}s" + circuit_pct = bucket_total > 0 ? ((bucket_circuit.to_f / bucket_total) * 100).round(2) : 0 + error_pct = bucket_total > 0 ? ((bucket_errors.to_f / bucket_total) * 100).round(2) : 0 + status = bucket_circuit > 0 ? "⚡" : "✓" + + degradation_phase = @degradation_phases[bucket_idx] || @degradation_phases.last + phase_error_rate = degradation_phase.error_rate || @base_error_rate + phase_label = "[Target: #{(phase_error_rate * 100).round(1)}%]" + + # Console output + output_line = "#{status} #{bucket_time_range} #{phase_label}: #{bucket_total} requests | Success: #{bucket_success} | Errors: #{bucket_errors} (#{error_pct}%) | Rejected: #{bucket_circuit} (#{circuit_pct}%)" + puts output_line + + # CSV data + @time_analysis_data << [ + bucket_time_range, + bucket_total, + bucket_success, + bucket_errors, + error_pct, + bucket_circuit, + circuit_pct, + (phase_error_rate * 100).round(1), + ] + end + end + + def display_thread_timing_statistics + return if @thread_timings.empty? + + puts "\n=== Thread Timing Statistics ===" + + total_times = @thread_timings.values.map { |t| t[:samples].sum { |s| s[:duration] } } + request_counts = @thread_timings.values.map { |t| t[:samples].size } + + total_wall_time = @end_time - @start_time + sum_thread_time = total_times.sum + avg_thread_time = sum_thread_time / @thread_timings.size + min_thread_time = total_times.min + max_thread_time = total_times.max + + avg_requests = request_counts.sum / @thread_timings.size.to_f + + # Calculate utilization (time spent in requests vs wall clock time) + avg_utilization = (avg_thread_time / total_wall_time * 100) + + puts "Total threads: #{@thread_timings.size}" + puts "Experiment wall clock duration: #{total_wall_time.round(2)}s" + puts "\nTime spent making requests per thread:" + puts " Min: #{min_thread_time.round(2)}s" + puts " Max: #{max_thread_time.round(2)}s" + puts " Average: #{avg_thread_time.round(2)}s" + puts " Total (all threads): #{sum_thread_time.round(2)}s" + puts "\nThread utilization:" + puts " Average: #{avg_utilization.round(2)}% (time in requests / wall clock time)" + puts "\nRequests per thread:" + puts " Average: #{avg_requests.round(0)} requests" + puts " Average time per request: #{(avg_thread_time / avg_requests).round(4)}s" if avg_requests > 0 + end + + def display_pid_controller_state + return unless @is_adaptive + + if @raw_metrics.empty? + puts "\n⚠️ No metrics collected" + return + end + + # Aggregate raw metrics by timestamp + metrics_by_timestamp = @raw_metrics.group_by { |m| m[:timestamp] } + + # Create aggregated snapshots, sorted by timestamp + aggregated_snapshots = metrics_by_timestamp.sort.map do |timestamp, metrics| + total_request_time = @thread_timings.values.sum do |t| + t[:samples].select { |s| s[:timestamp] <= timestamp }.sum { |s| s[:duration] } + end + + { + timestamp: timestamp, + error_rate_avg: metrics.sum { |m| m[:error_rate] } / metrics.length.to_f, + error_rate_min: metrics.map { |m| m[:error_rate] }.min, + error_rate_max: metrics.map { |m| m[:error_rate] }.max, + ideal_error_rate: metrics.first[:ideal_error_rate], + rejection_rate_avg: metrics.sum { |m| m[:rejection_rate] } / metrics.length.to_f, + rejection_rate_min: metrics.map { |m| m[:rejection_rate] }.min, + rejection_rate_max: metrics.map { |m| m[:rejection_rate] }.max, + integral_avg: metrics.sum { |m| m[:integral] } / metrics.length.to_f, + integral_min: metrics.map { |m| m[:integral] }.min, + integral_max: metrics.map { |m| m[:integral] }.max, + p_value_avg: metrics.sum { |m| m[:p_value] } / metrics.length.to_f, + p_value_min: metrics.map { |m| m[:p_value] }.min, + p_value_max: metrics.map { |m| m[:p_value] }.max, + derivative_avg: metrics.sum { |m| m[:derivative] } / metrics.length.to_f, + derivative_min: metrics.map { |m| m[:derivative] }.min, + derivative_max: metrics.map { |m| m[:derivative] }.max, + total_request_time: total_request_time, + thread_count: metrics.length, + } + end + + puts "\n=== PID Controller State Per Second (Aggregated across threads) ===" + + header = format("%-8s %-10s %-22s %-15s %-22s %-25s %-25s %-25s %-15s", "Window", "# Threads", "Err % (min-max)", "Ideal Err %", "Reject % (min-max)", "Integral (min-max)", "Derivative (min-max)", "P Value (min-max)", "Total Req Time") + separator = "-" * 150 + + puts header + puts separator + + # Add CSV header + @pid_controller_data << [ + "Window", + "Thread Count", + "Error Rate Avg", + "Error Rate Min", + "Error Rate Max", + "Ideal Error Rate", + "Rejection Rate Avg", + "Rejection Rate Min", + "Rejection Rate Max", + "Integral Avg", + "Integral Min", + "Integral Max", + "Derivative Avg", + "Derivative Min", + "Derivative Max", + "P Value Avg", + "P Value Min", + "P Value Max", + "Total Request Time", + ] + + aggregated_snapshots.each_with_index do |snapshot, idx| + error_rate_str = format_metric_range(snapshot[:error_rate_avg], snapshot[:error_rate_min], snapshot[:error_rate_max], is_percent: true) + reject_rate_str = format_metric_range(snapshot[:rejection_rate_avg], snapshot[:rejection_rate_min], snapshot[:rejection_rate_max], is_percent: true) + integral_str = format_metric_range(snapshot[:integral_avg], snapshot[:integral_min], snapshot[:integral_max]) + derivative_str = format_metric_range(snapshot[:derivative_avg], snapshot[:derivative_min], snapshot[:derivative_max]) + p_value_str = format_metric_range(snapshot[:p_value_avg], snapshot[:p_value_min], snapshot[:p_value_max]) + + # Console output + row = format( + "%-8d %-10d %-22s %-15s %-22s %-25s %-25s %-25s %-15s", + idx + 1, + snapshot[:thread_count], + error_rate_str, + "#{(snapshot[:ideal_error_rate] * 100).round(2)}%", + reject_rate_str, + integral_str, + derivative_str, + p_value_str, + "#{(snapshot[:total_request_time] || 0).round(2)}s", + ) + puts row + + # CSV data + @pid_controller_data << [ + idx + 1, + snapshot[:thread_count], + (snapshot[:error_rate_avg] * 100).round(2), + (snapshot[:error_rate_min] * 100).round(2), + (snapshot[:error_rate_max] * 100).round(2), + (snapshot[:ideal_error_rate] * 100).round(2), + (snapshot[:rejection_rate_avg] * 100).round(2), + (snapshot[:rejection_rate_min] * 100).round(2), + (snapshot[:rejection_rate_max] * 100).round(2), + snapshot[:integral_avg].round(4), + snapshot[:integral_min].round(4), + snapshot[:integral_max].round(4), + snapshot[:derivative_avg].round(4), + snapshot[:derivative_min].round(4), + snapshot[:derivative_max].round(4), + snapshot[:p_value_avg].round(4), + snapshot[:p_value_min].round(4), + snapshot[:p_value_max].round(4), + (snapshot[:total_request_time] || 0).round(2), + ] + end + + puts "\n📊 Key Observations:" + puts " - Timestamps captured: #{aggregated_snapshots.length}" + puts " - Max avg rejection rate: #{(aggregated_snapshots.map { |s| s[:rejection_rate_avg] }.max * 100).round(2)}%" + puts " - Avg integral range: #{aggregated_snapshots.map { |s| s[:integral_avg] }.min.round(4)} to #{aggregated_snapshots.map { |s| s[:integral_avg] }.max.round(4)}" + puts " - Thread counts per timestamp: min #{aggregated_snapshots.map { |s| s[:thread_count] }.min}, max #{aggregated_snapshots.map { |s| s[:thread_count] }.max}" + end + + def format_metric_range(avg, min, max, is_percent: false) + if is_percent + avg_str = "#{(avg * 100).round(2)}%" + min_str = "#{(min * 100).round(2)}%" + max_str = "#{(max * 100).round(2)}%" + else + avg_str = avg.round(4).to_s + min_str = min.round(4).to_s + max_str = max.round(4).to_s + end + "#{avg_str} (#{min_str}-#{max_str})" + end + + def generate_visualization + puts "\nGenerating visualization..." + require "gruff" + + # Aggregate data into buckets for detailed visualization + bucket_size = @graph_bucket_size + num_buckets = (@experiment_duration / bucket_size.to_f).ceil + + bucketed_data = [] + (0...num_buckets).each do |bucket_idx| + bucket_start = @outcomes.keys[0] + (bucket_idx * bucket_size) + bucket_end = bucket_start + bucket_size + bucket_data = @outcomes.select { |time, _| time >= bucket_start && time < bucket_end } + + bucketed_data << { + success: bucket_data.values.sum { |d| d[:success] }, + circuit_open: bucket_data.values.sum { |d| d[:circuit_open] }, + error: bucket_data.values.sum { |d| d[:error] }, + } + end + + # Set x-axis labels + labels = {} + (0...num_buckets).each do |i| + time_sec = i * bucket_size + labels[i] = "#{time_sec}s" if time_sec % @x_axis_label_interval == 0 + end + + # Create two graphs: one for requests per interval that shows success and failure rates, and a separate graph for total request duration. + # They're separate graphs because the difference in scale of the two values prevents the request duration signal from being clearly visible on the same graph. + + # Generate main graph (requests) + graph = Gruff::Line.new + graph.title = @graph_title + graph.x_axis_label = "Time (#{bucket_size}-second intervals)" + graph.y_axis_label = "Requests per Interval" + graph.hide_dots = true + graph.line_width = 1 + graph.y_axis_increment = 100 + graph.marker_font_size = 12 + graph.labels = labels + + graph.data("Success", bucketed_data.map { |d| d[:success] }) + graph.data("Rejected", bucketed_data.map { |d| d[:circuit_open] }) + graph.data("Error", bucketed_data.map { |d| d[:error] }) + + # Add circuit state transition markers (for classic CB) + unless @is_adaptive + add_state_transition_markers(graph, bucketed_data, bucket_size, num_buckets) + end + + main_graph_path = File.join(@main_results_path, @graph_filename) + graph.write(main_graph_path) + puts "Graph saved to #{main_graph_path}" + end + + def add_state_transition_markers(graph, bucketed_data, bucket_size, num_buckets) + return if @state_transitions.empty? + + experiment_start = @outcomes.keys[0] + + @state_transitions.each_with_index do |transition, idx| + # Calculate which bucket this transition falls into + elapsed = transition[:timestamp] - experiment_start + bucket_idx = (elapsed / bucket_size).to_i + + next if bucket_idx < 0 || bucket_idx >= num_buckets + + # Add vertical reference line at this bucket index + color = case transition[:state] + when :open then "red" + when :half_open then "gray" + when :closed then "green" + end + + graph.reference_lines[:"transition_#{idx}"] = { + index: bucket_idx, + color: color, + width: 1, + } + end + end + + def save_csv_outputs + # Save time-based analysis CSV + if @time_analysis_data.any? + csv_path = File.join(@csv_results_path, @time_analysis_csv_filename) + CSV.open(csv_path, "w") do |csv| + @time_analysis_data.each { |row| csv << row } + end + puts "\nTime analysis CSV saved to #{csv_path}" + end + + # Save PID controller CSV (only for adaptive experiments) + if @is_adaptive && @pid_controller_data.any? + csv_path = File.join(@csv_results_path, @pid_controller_csv_filename) + CSV.open(csv_path, "w") do |csv| + @pid_controller_data.each { |row| csv << row } + end + puts "PID controller CSV saved to #{csv_path}" + end + end + end + end +end diff --git a/experiments/experimental_resource.rb b/experiments/experimental_resource.rb index 6add2aa8b..ac9a3218d 100644 --- a/experiments/experimental_resource.rb +++ b/experiments/experimental_resource.rb @@ -7,43 +7,25 @@ $LOAD_PATH.unshift(lib_path) unless $LOAD_PATH.include?(lib_path) require "semian/adapter" +require_relative "mock_service" module Semian module Experiments - # ExperimentalResource is a simulated resource adapter for running experiments - # with configurable endpoints, latencies, and statistical distributions. - # It allows testing degradation scenarios and various latency patterns. + # ExperimentalResource is a Semian adapter for the MockService. + # It provides circuit breaker and bulkhead functionality for the mock service. class ExperimentalResource include Semian::Adapter - attr_reader :endpoints_count, :min_latency, :max_latency, :distribution, :endpoint_latencies, :timeout, :base_error_rate + attr_reader :service - # Initialize the experimental resource + # Initialize the experimental resource adapter # @param name [String] The identifier for this resource - # @param endpoints_count [Integer] Number of available endpoints - # @param min_latency [Float] Minimum latency in seconds - # @param max_latency [Float] Maximum latency in seconds - # @param distribution [Hash] Statistical distribution configuration - # For log-normal: { type: :log_normal, mean: Float, std_dev: Float } - # @param timeout [Float, nil] Maximum time to wait for a request (in seconds). If nil, no timeout is enforced. - # @param error_rate [Float] Baseline error rate (0.0 to 1.0). Probability that any request will fail. + # @param service [MockService] The mock service instance to wrap # @param options [Hash] Additional Semian options - def initialize(name:, endpoints_count:, min_latency:, max_latency:, distribution:, timeout: nil, error_rate: 0.0, **options) + def initialize(name:, service:, **options) @name = name - @endpoints_count = endpoints_count - @min_latency = min_latency - @max_latency = max_latency - @distribution = validate_distribution(distribution) - @timeout = timeout - @base_error_rate = validate_error_rate(error_rate) + @service = service @raw_semian_options = options[:semian] - - # Initialize service degradation state - @latency_degradation = { amount: 0.0, target: 0.0, ramp_start: nil, ramp_duration: 0 } - @error_rate_degradation = { rate: @base_error_rate, target: @base_error_rate, ramp_start: nil, ramp_duration: 0 } - - # Assign fixed latencies to each endpoint - @endpoint_latencies = generate_endpoint_latencies end # Required by Adapter @@ -51,154 +33,17 @@ def semian_identifier @name.to_sym end - # Simulate making a request to a specific endpoint + # Make a request through Semian with circuit breaker protection # @param endpoint_index [Integer] The index of the endpoint to request (0-based) - # @raises [TimeoutError] if the request would exceed the configured timeout - # @raises [RequestError] if the request fails based on error rate + # @raises [CircuitOpenError] if the circuit is open + # @raises [ResourceBusyError] if bulkhead limit is reached + # @raises [MockService::TimeoutError] if the request times out + # @raises [MockService::RequestError] if the request fails + # @raises [MockService::QueueTimeoutError] if the request times out while waiting in queue def request(endpoint_index, &block) - validate_endpoint_index(endpoint_index) - acquire_semian_resource(scope: :request, adapter: :experimental) do - perform_request(endpoint_index, &block) - end - end - - private - - def perform_request(endpoint_index, &block) - # Calculate latency with degradation - base_latency = @endpoint_latencies[endpoint_index] - latency = base_latency + current_latency_degradation - - # Check if request should fail based on current error rate - current_rate = current_error_rate - if should_fail?(current_rate) - # Sleep for partial latency to simulate some processing before error - error_latency = latency * 0.3 # Fail after 30% of expected latency - sleep(error_latency) if error_latency > 0 - - raise RequestError, "Request to endpoint #{endpoint_index} failed " \ - "(error rate: #{(current_rate * 100).round(1)}%)" - end - - # Check if request would timeout - if @timeout && latency > @timeout - # Sleep for the timeout period, then raise exception - sleep(@timeout) if @timeout > 0 - raise TimeoutError, - "Request to endpoint #{endpoint_index} timed out after #{@timeout}s " \ - "(would have taken #{latency.round(3)}s)" - end - - # Simulate the request with calculated latency - sleep(latency) if latency > 0 - - if block_given? - yield(endpoint_index, latency) - else - { endpoint: endpoint_index, latency: latency } - end - end - - public - - # Add fixed latency to all requests with optional ramp-up time - # @param amount [Float] Amount of latency to add (in seconds) - # @param ramp_time [Float] Time to ramp up to the target latency (in seconds), 0 for immediate - def add_latency(amount, ramp_time: 0) - raise ArgumentError, "Latency amount must be non-negative" if amount < 0 - raise ArgumentError, "Ramp time must be non-negative" if ramp_time < 0 - - @latency_degradation[:target] = amount - @latency_degradation[:ramp_start] = Time.now - @latency_degradation[:ramp_duration] = ramp_time - - # If no ramp time, apply immediately - @latency_degradation[:amount] = amount if ramp_time == 0 - end - - # Change the error rate with optional ramp-up time - # @param rate [Float] New error rate (0.0 to 1.0) - # @param ramp_time [Float] Time to ramp up to the target error rate (in seconds), 0 for immediate - def set_error_rate(rate, ramp_time: 0) - validate_error_rate(rate) - raise ArgumentError, "Ramp time must be non-negative" if ramp_time < 0 - - @error_rate_degradation[:target] = rate - @error_rate_degradation[:ramp_start] = Time.now - @error_rate_degradation[:ramp_duration] = ramp_time - - # If no ramp time, apply immediately - @error_rate_degradation[:rate] = rate if ramp_time == 0 - end - - # Reset service to baseline (remove all degradation) - def reset_degradation - @latency_degradation = { amount: 0.0, target: 0.0, ramp_start: nil, ramp_duration: 0 } - @error_rate_degradation = { rate: @base_error_rate, target: @base_error_rate, ramp_start: nil, ramp_duration: 0 } - end - - # Get current latency degradation (accounting for ramp-up) - def current_latency_degradation - return @latency_degradation[:amount] unless @latency_degradation[:ramp_start] && @latency_degradation[:ramp_duration] > 0 - - elapsed = Time.now - @latency_degradation[:ramp_start] - if elapsed >= @latency_degradation[:ramp_duration] - # Ramp complete - @latency_degradation[:amount] = @latency_degradation[:target] - @latency_degradation[:ramp_start] = nil - @latency_degradation[:target] - else - # Still ramping - progress = elapsed / @latency_degradation[:ramp_duration] - current = @latency_degradation[:amount] - target = @latency_degradation[:target] - current + (target - current) * progress - end - end - - # Get current error rate (accounting for ramp-up) - def current_error_rate - return @error_rate_degradation[:rate] unless @error_rate_degradation[:ramp_start] && @error_rate_degradation[:ramp_duration] > 0 - - elapsed = Time.now - @error_rate_degradation[:ramp_start] - if elapsed >= @error_rate_degradation[:ramp_duration] - # Ramp complete - @error_rate_degradation[:rate] = @error_rate_degradation[:target] - @error_rate_degradation[:ramp_start] = nil - @error_rate_degradation[:target] - else - # Still ramping - progress = elapsed / @error_rate_degradation[:ramp_duration] - current = @error_rate_degradation[:rate] - target = @error_rate_degradation[:target] - current + (target - current) * progress - end - end - - # Get the base latency for an endpoint (without degradation effects) - def base_latency(endpoint_index) - validate_endpoint_index(endpoint_index) - @endpoint_latencies[endpoint_index] - end - - # Check if a specific endpoint would timeout with current settings - def would_timeout?(endpoint_index) - return false unless @timeout - - validate_endpoint_index(endpoint_index) - get_effective_latency(endpoint_index) > @timeout - end - - # Get all endpoints that would timeout with current settings - def timeout_endpoints - return [] unless @timeout - - endpoints = [] - @endpoint_latencies.each_with_index do |_, idx| - endpoints << idx if would_timeout?(idx) + @service.request(endpoint_index, &block) end - endpoints end private @@ -206,93 +51,7 @@ def timeout_endpoints attr_reader :raw_semian_options def resource_exceptions - [RequestError, TimeoutError] # Exceptions that should trigger circuit breaker - end - - def validate_distribution(dist) - unless dist.is_a?(Hash) && dist[:type] - raise ArgumentError, "Distribution must be a Hash with :type key" - end - - case dist[:type] - when :log_normal - validate_log_normal_distribution(dist) - else - raise ArgumentError, "Unsupported distribution type: #{dist[:type]}. Only :log_normal is currently supported." - end - - dist - end - - def validate_error_rate(rate) - unless rate.is_a?(Numeric) && rate >= 0.0 && rate <= 1.0 - raise ArgumentError, "Error rate must be a number between 0.0 and 1.0, got #{rate}" - end - - rate - end - - def validate_log_normal_distribution(dist) - unless dist[:mean] && dist[:std_dev] - raise ArgumentError, "Log-normal distribution requires :mean and :std_dev parameters" - end - - unless dist[:mean].is_a?(Numeric) && dist[:mean] > 0 - raise ArgumentError, "Log-normal mean must be a positive number" - end - - unless dist[:std_dev].is_a?(Numeric) && dist[:std_dev] >= 0 - raise ArgumentError, "Log-normal std_dev must be a non-negative number" - end - end - - def validate_endpoint_index(endpoint_index) - unless endpoint_index.is_a?(Integer) && endpoint_index >= 0 && endpoint_index < @endpoints_count - raise ArgumentError, "Invalid endpoint index: #{endpoint_index}. Must be between 0 and #{@endpoints_count - 1}" - end - end - - def generate_endpoint_latencies - Array.new(@endpoints_count) do - latency = sample_from_distribution - # Clamp to min/max bounds - latency.clamp(@min_latency, @max_latency) - end - end - - def should_fail?(error_rate) - return false if error_rate <= 0 - - rand < error_rate - end - - def sample_from_distribution - case @distribution[:type] - when :log_normal - sample_log_normal(@distribution[:mean], @distribution[:std_dev]) - else - # Fallback to mean value - @distribution[:mean] || (@min_latency + @max_latency) / 2.0 - end - end - - def sample_log_normal(mean, std_dev) - # Convert mean and std_dev of the log-normal to the underlying normal distribution - # Using method of moments conversion - variance = std_dev**2 - mean_squared = mean**2 - - # Calculate parameters for underlying normal distribution - mu = Math.log(mean_squared / Math.sqrt(variance + mean_squared)) - sigma = Math.sqrt(Math.log(1 + variance / mean_squared)) - - # Generate log-normal sample using Box-Muller transform - u1 = rand - u2 = rand - z0 = Math.sqrt(-2.0 * Math.log(u1)) * Math.cos(2.0 * Math::PI * u2) - - # Transform to log-normal - Math.exp(mu + sigma * z0) + [MockService::RequestError, MockService::TimeoutError, MockService::QueueTimeoutError] # Exceptions that should trigger circuit breaker end # Error classes specific to this adapter @@ -310,17 +69,10 @@ def initialize(semian_identifier, *args) end end - class TimeoutError < StandardError - def marks_semian_circuits? - true # This error should trigger circuit breaker - end - end - - class RequestError < StandardError - def marks_semian_circuits? - true # This error should trigger circuit breaker - end - end + # Re-export the service errors for backward compatibility + RequestError = MockService::RequestError + TimeoutError = MockService::TimeoutError + QueueTimeoutError = MockService::QueueTimeoutError end end end diff --git a/experiments/experiments/experiment_error_spike_100.rb b/experiments/experiments/experiment_error_spike_100.rb new file mode 100644 index 000000000..d1f4288aa --- /dev/null +++ b/experiments/experiments/experiment_error_spike_100.rb @@ -0,0 +1,30 @@ +# frozen_string_literal: true + +$LOAD_PATH.unshift(File.expand_path("../../lib", __dir__)) + +require "semian" +require_relative "../mock_service" +require_relative "../experimental_resource" +require_relative "../experiment_helpers" + +# Sudden error spike experiment: 1% -> 100% -> 1% +runner = Semian::Experiments::CircuitBreakerExperimentRunner.new( + experiment_name: "Sudden Error Spike Experiment (Classic) - 100% for 20 seconds", + resource_name: "protected_service_sudden_error_spike_100", + degradation_phases: [Semian::Experiments::DegradationPhase.new(healthy: true)] * 3 + + [Semian::Experiments::DegradationPhase.new(error_rate: 1.00)] + + [Semian::Experiments::DegradationPhase.new(healthy: true)] * 3, + phase_duration: 20, + semian_config: { + success_threshold: 2, + error_threshold: 12, + error_threshold_timeout: 20, + error_timeout: 15, + bulkhead: false, + }, + graph_title: "Sudden Error Spike Experiment (Classic) - 100% for 20 seconds", + graph_filename: "sudden_error_spike_100.png", + x_axis_label_interval: 60, +) + +runner.run diff --git a/experiments/experiments/experiment_error_spike_100_adaptive.rb b/experiments/experiments/experiment_error_spike_100_adaptive.rb new file mode 100644 index 000000000..c137698c2 --- /dev/null +++ b/experiments/experiments/experiment_error_spike_100_adaptive.rb @@ -0,0 +1,27 @@ +# frozen_string_literal: true + +$LOAD_PATH.unshift(File.expand_path("../../lib", __dir__)) + +require "semian" +require_relative "../mock_service" +require_relative "../experimental_resource" +require_relative "../experiment_helpers" + +# Sudden error spike experiment: 1% -> 100% -> 1% +runner = Semian::Experiments::CircuitBreakerExperimentRunner.new( + experiment_name: "Sudden Error Spike Experiment (Adaptive) - 100% for 20 seconds", + resource_name: "protected_service_sudden_error_spike_100_adaptive", + degradation_phases: [Semian::Experiments::DegradationPhase.new(healthy: true)] * 3 + + [Semian::Experiments::DegradationPhase.new(error_rate: 1.00)] + + [Semian::Experiments::DegradationPhase.new(healthy: true)] * 3, + phase_duration: 20, + semian_config: { + adaptive_circuit_breaker: true, + bulkhead: false, + }, + graph_title: "Sudden Error Spike Experiment (Adaptive) - 100% for 20 seconds", + graph_filename: "sudden_error_spike_100_adaptive.png", + x_axis_label_interval: 60, +) + +runner.run diff --git a/experiments/experiments/experiment_error_spike_20.rb b/experiments/experiments/experiment_error_spike_20.rb new file mode 100644 index 000000000..d5f8c27dc --- /dev/null +++ b/experiments/experiments/experiment_error_spike_20.rb @@ -0,0 +1,30 @@ +# frozen_string_literal: true + +$LOAD_PATH.unshift(File.expand_path("../../lib", __dir__)) + +require "semian" +require_relative "../mock_service" +require_relative "../experimental_resource" +require_relative "../experiment_helpers" + +# Sudden error spike experiment: 1% -> 20% -> 1% +runner = Semian::Experiments::CircuitBreakerExperimentRunner.new( + experiment_name: "Sudden Error Spike Experiment (Classic) - 20% for 20 seconds", + resource_name: "protected_service_sudden_error_spike_20", + degradation_phases: [Semian::Experiments::DegradationPhase.new(healthy: true)] * 3 + + [Semian::Experiments::DegradationPhase.new(error_rate: 0.20)] + + [Semian::Experiments::DegradationPhase.new(healthy: true)] * 3, + phase_duration: 20, + semian_config: { + success_threshold: 2, + error_threshold: 12, + error_threshold_timeout: 20, + error_timeout: 15, + bulkhead: false, + }, + graph_title: "Sudden Error Spike Experiment (Classic) - 20% for 20 seconds", + graph_filename: "sudden_error_spike_20.png", + x_axis_label_interval: 60, +) + +runner.run diff --git a/experiments/experiments/experiment_error_spike_20_adaptive.rb b/experiments/experiments/experiment_error_spike_20_adaptive.rb new file mode 100644 index 000000000..51245823c --- /dev/null +++ b/experiments/experiments/experiment_error_spike_20_adaptive.rb @@ -0,0 +1,27 @@ +# frozen_string_literal: true + +$LOAD_PATH.unshift(File.expand_path("../../lib", __dir__)) + +require "semian" +require_relative "../mock_service" +require_relative "../experimental_resource" +require_relative "../experiment_helpers" + +# Sudden error spike experiment: 1% -> 20% -> 1% +runner = Semian::Experiments::CircuitBreakerExperimentRunner.new( + experiment_name: "Sudden Error Spike Experiment (Adaptive) - 20% for 20 seconds", + resource_name: "protected_service_sudden_error_spike_20_seconds_adaptive", + degradation_phases: [Semian::Experiments::DegradationPhase.new(healthy: true)] * 3 + + [Semian::Experiments::DegradationPhase.new(error_rate: 0.20)] + + [Semian::Experiments::DegradationPhase.new(healthy: true)] * 3, + phase_duration: 20, + semian_config: { + adaptive_circuit_breaker: true, + bulkhead: false, + }, + graph_title: "Sudden Error Spike Experiment (Adaptive) - 20% for 20 seconds", + graph_filename: "sudden_error_spike_20_adaptive.png", + x_axis_label_interval: 60, +) + +runner.run diff --git a/experiments/experiments/experiment_gradual_increase.rb b/experiments/experiments/experiment_gradual_increase.rb new file mode 100644 index 000000000..69ba9d304 --- /dev/null +++ b/experiments/experiments/experiment_gradual_increase.rb @@ -0,0 +1,39 @@ +# frozen_string_literal: true + +$LOAD_PATH.unshift(File.expand_path("../../lib", __dir__)) + +require "semian" +require_relative "../mock_service" +require_relative "../experimental_resource" +require_relative "../experiment_helpers" + +# Gradual error increase experiment: 1% -> 1.5% -> 2% -> ... -> 5% -> 1% +runner = Semian::Experiments::CircuitBreakerExperimentRunner.new( + experiment_name: "Gradual Error Increase Experiment", + resource_name: "protected_service_gradual", + degradation_phases: [ + Semian::Experiments::DegradationPhase.new(healthy: true), + Semian::Experiments::DegradationPhase.new(error_rate: 0.015), + Semian::Experiments::DegradationPhase.new(error_rate: 0.02), + Semian::Experiments::DegradationPhase.new(error_rate: 0.025), + Semian::Experiments::DegradationPhase.new(error_rate: 0.03), + Semian::Experiments::DegradationPhase.new(error_rate: 0.035), + Semian::Experiments::DegradationPhase.new(error_rate: 0.04), + Semian::Experiments::DegradationPhase.new(error_rate: 0.045), + Semian::Experiments::DegradationPhase.new(error_rate: 0.05), + Semian::Experiments::DegradationPhase.new(healthy: true), + ], + phase_duration: 60, + semian_config: { + success_threshold: 2, + error_threshold: 12, + error_threshold_timeout: 20, + error_timeout: 15, + bulkhead: false, + }, + graph_title: "Classic Circuit Breaker: Gradual Error Increase (1% to 5%)", + graph_filename: "gradual_increase.png", + x_axis_label_interval: 60, +) + +runner.run diff --git a/experiments/experiments/experiment_gradual_increase_adaptive.rb b/experiments/experiments/experiment_gradual_increase_adaptive.rb new file mode 100644 index 000000000..d47c622e8 --- /dev/null +++ b/experiments/experiments/experiment_gradual_increase_adaptive.rb @@ -0,0 +1,36 @@ +# frozen_string_literal: true + +$LOAD_PATH.unshift(File.expand_path("../../lib", __dir__)) + +require "semian" +require_relative "../mock_service" +require_relative "../experimental_resource" +require_relative "../experiment_helpers" + +# Gradual error increase experiment: 1% -> 1.5% -> 2% -> ... -> 5% -> 1% +runner = Semian::Experiments::CircuitBreakerExperimentRunner.new( + experiment_name: "Gradual Error Increase Experiment (Adaptive)", + resource_name: "protected_service_gradual_adaptive", + degradation_phases: [ + Semian::Experiments::DegradationPhase.new(healthy: true), + Semian::Experiments::DegradationPhase.new(error_rate: 0.015), + Semian::Experiments::DegradationPhase.new(error_rate: 0.02), + Semian::Experiments::DegradationPhase.new(error_rate: 0.025), + Semian::Experiments::DegradationPhase.new(error_rate: 0.03), + Semian::Experiments::DegradationPhase.new(error_rate: 0.035), + Semian::Experiments::DegradationPhase.new(error_rate: 0.04), + Semian::Experiments::DegradationPhase.new(error_rate: 0.045), + Semian::Experiments::DegradationPhase.new(error_rate: 0.05), + Semian::Experiments::DegradationPhase.new(healthy: true), + ], + phase_duration: 60, + semian_config: { + adaptive_circuit_breaker: true, + bulkhead: false, + }, + graph_title: "Adaptive Circuit Breaker: Gradual Error Increase (1% to 5%)", + graph_filename: "gradual_increase_adaptive.png", + x_axis_label_interval: 60, +) + +runner.run diff --git a/experiments/experiments/experiment_lower_bound_windup_adaptive.rb b/experiments/experiments/experiment_lower_bound_windup_adaptive.rb new file mode 100644 index 000000000..6b44cc186 --- /dev/null +++ b/experiments/experiments/experiment_lower_bound_windup_adaptive.rb @@ -0,0 +1,30 @@ +# frozen_string_literal: true + +$LOAD_PATH.unshift(File.expand_path("../../lib", __dir__)) + +require "semian" +require_relative "../mock_service" +require_relative "../experimental_resource" +require_relative "../experiment_helpers" + +# Lower bound windup experiment: demonstrates the response to error spikes +# when integral has accumulated negative values during extended low-error periods. +runner = Semian::Experiments::CircuitBreakerExperimentRunner.new( + experiment_name: "Lower Bound Windup Experiment", + resource_name: "protected_service_windup_demo", + degradation_phases: [Semian::Experiments::DegradationPhase.new(error_rate: 0.01)] + + [Semian::Experiments::DegradationPhase.new(error_rate: 0.60)] * 6 + + [Semian::Experiments::DegradationPhase.new(error_rate: 0.005)] * 120 + + [Semian::Experiments::DegradationPhase.new(error_rate: 0.60)] * 6 + + [Semian::Experiments::DegradationPhase.new(error_rate: 0.01)] * 6, + phase_duration: 30, + semian_config: { + adaptive_circuit_breaker: true, + bulkhead: false, + }, + graph_title: "Adaptive Circuit Breaker: Lower Bound Integral Windup", + graph_filename: "lower_bound_windup.png", + x_axis_label_interval: 60, +) + +runner.run diff --git a/experiments/experiments/experiment_near_target_error_rate.rb b/experiments/experiments/experiment_near_target_error_rate.rb new file mode 100644 index 000000000..763eef8d1 --- /dev/null +++ b/experiments/experiments/experiment_near_target_error_rate.rb @@ -0,0 +1,29 @@ +# frozen_string_literal: true + +$LOAD_PATH.unshift(File.expand_path("../../lib", __dir__)) + +require "semian" +require_relative "../mock_service" +require_relative "../experimental_resource" +require_relative "../experiment_helpers" + +runner = Semian::Experiments::CircuitBreakerExperimentRunner.new( + experiment_name: "Near Target Error Rate Experiment (Classic)", + resource_name: "protected_service_near_target", + degradation_phases: [Semian::Experiments::DegradationPhase.new(healthy: true)] * 1 + + [Semian::Experiments::DegradationPhase.new(error_rate: 0.012)] * 4 + + [Semian::Experiments::DegradationPhase.new(healthy: true)] * 1, + phase_duration: 30, + semian_config: { + success_threshold: 2, + error_threshold: 12, + error_threshold_timeout: 20, + error_timeout: 15, + bulkhead: false, + }, + graph_title: "Classic Circuit Breaker: Near Target Error Rate (1.2%)", + graph_filename: "near_target_error_rate.png", + x_axis_label_interval: 30, +) + +runner.run diff --git a/experiments/experiments/experiment_near_target_error_rate_adaptive.rb b/experiments/experiments/experiment_near_target_error_rate_adaptive.rb new file mode 100644 index 000000000..ad22a10d5 --- /dev/null +++ b/experiments/experiments/experiment_near_target_error_rate_adaptive.rb @@ -0,0 +1,27 @@ +# frozen_string_literal: true + +$LOAD_PATH.unshift(File.expand_path("../../lib", __dir__)) + +require "semian" +require_relative "../mock_service" +require_relative "../experimental_resource" +require_relative "../experiment_helpers" + +runner = Semian::Experiments::CircuitBreakerExperimentRunner.new( + experiment_name: "Near Target Error Rate Experiment (Adaptive)", + resource_name: "protected_service_near_target_adaptive", + degradation_phases: [Semian::Experiments::DegradationPhase.new(healthy: true)] * 1 + + [Semian::Experiments::DegradationPhase.new(error_rate: 0.012)] * 4 + + [Semian::Experiments::DegradationPhase.new(healthy: true)] * 1, + phase_duration: 30, + semian_config: { + adaptive_circuit_breaker: true, + bulkhead: false, + }, + graph_title: "Adaptive Circuit Breaker: Near Target Error Rate (1.2%)", + graph_filename: "near_target_error_rate_adaptive.png", + x_axis_label_interval: 30, + graph_bucket_size: 1, +) + +runner.run diff --git a/experiments/experiments/experiment_one_of_many_services_degradation.rb b/experiments/experiments/experiment_one_of_many_services_degradation.rb new file mode 100644 index 000000000..45a78afd6 --- /dev/null +++ b/experiments/experiments/experiment_one_of_many_services_degradation.rb @@ -0,0 +1,30 @@ +# frozen_string_literal: true + +$LOAD_PATH.unshift(File.expand_path("../../lib", __dir__)) + +require "semian" +require_relative "../mock_service" +require_relative "../experimental_resource" +require_relative "../experiment_helpers" + +runner = Semian::Experiments::CircuitBreakerExperimentRunner.new( + experiment_name: "One of Many Services Degradation Experiment", + resource_name: "protected_service", + degradation_phases: [Semian::Experiments::DegradationPhase.new(healthy: true)] * 1 + + [Semian::Experiments::DegradationPhase.new(latency: 9.95)] * 10 + # Most requests to the target service will timeout + [Semian::Experiments::DegradationPhase.new(healthy: true)] * 3, + phase_duration: 30, + service_count: 10, + semian_config: { + success_threshold: 2, + error_threshold: 2, + error_threshold_timeout: 20, + error_timeout: 15, + bulkhead: false, + }, + graph_title: "Classic Circuit Breaker: One of Many Services Latency Degradation", + graph_filename: "one_of_many_services_latency_degradation.png", + x_axis_label_interval: 30, +) + +runner.run diff --git a/experiments/experiments/experiment_one_of_many_services_degradation_adaptive.rb b/experiments/experiments/experiment_one_of_many_services_degradation_adaptive.rb new file mode 100644 index 000000000..7c233b6c9 --- /dev/null +++ b/experiments/experiments/experiment_one_of_many_services_degradation_adaptive.rb @@ -0,0 +1,27 @@ +# frozen_string_literal: true + +$LOAD_PATH.unshift(File.expand_path("../../lib", __dir__)) + +require "semian" +require_relative "../mock_service" +require_relative "../experimental_resource" +require_relative "../experiment_helpers" + +runner = Semian::Experiments::CircuitBreakerExperimentRunner.new( + experiment_name: "One of Many Services Degradation Experiment", + resource_name: "protected_service_adaptive", + degradation_phases: [Semian::Experiments::DegradationPhase.new(healthy: true)] * 1 + + [Semian::Experiments::DegradationPhase.new(latency: 9.95)] * 10 + # Most requests to the target service will timeout + [Semian::Experiments::DegradationPhase.new(healthy: true)] * 3, + phase_duration: 30, + service_count: 10, + semian_config: { + adaptive_circuit_breaker: true, + bulkhead: false, + }, + graph_title: "Adaptive Circuit Breaker: One of Many Services Latency Degradation", + graph_filename: "one_of_many_services_latency_degradation_adaptive.png", + x_axis_label_interval: 30, +) + +runner.run diff --git a/experiments/experiments/experiment_oscillating_errors.rb b/experiments/experiments/experiment_oscillating_errors.rb new file mode 100644 index 000000000..491631d9e --- /dev/null +++ b/experiments/experiments/experiment_oscillating_errors.rb @@ -0,0 +1,30 @@ +# frozen_string_literal: true + +$LOAD_PATH.unshift(File.expand_path("../../lib", __dir__)) + +require "semian" +require_relative "../mock_service" +require_relative "../experimental_resource" +require_relative "../experiment_helpers" + +# Oscillating errors experiment: 2% <-> 6% errors every 10 seconds +runner = Semian::Experiments::CircuitBreakerExperimentRunner.new( + experiment_name: "Oscillating Errors Experiment", + resource_name: "protected_service_oscillating", + degradation_phases: [Semian::Experiments::DegradationPhase.new(healthy: true)] * 2 + + [Semian::Experiments::DegradationPhase.new(error_rate: 0.02), Semian::Experiments::DegradationPhase.new(error_rate: 0.06)] * 9 + + [Semian::Experiments::DegradationPhase.new(healthy: true)] * 2, + phase_duration: 10, + semian_config: { + success_threshold: 2, + error_threshold: 12, + error_threshold_timeout: 20, + error_timeout: 15, + bulkhead: false, + }, + graph_title: "Classic Circuit Breaker: Oscillating Errors (2% <-> 6%)", + graph_filename: "oscillating_errors.png", + x_axis_label_interval: 60, +) + +runner.run diff --git a/experiments/experiments/experiment_oscillating_errors_adaptive.rb b/experiments/experiments/experiment_oscillating_errors_adaptive.rb new file mode 100644 index 000000000..81e6721a8 --- /dev/null +++ b/experiments/experiments/experiment_oscillating_errors_adaptive.rb @@ -0,0 +1,27 @@ +# frozen_string_literal: true + +$LOAD_PATH.unshift(File.expand_path("../../lib", __dir__)) + +require "semian" +require_relative "../mock_service" +require_relative "../experimental_resource" +require_relative "../experiment_helpers" + +# Oscillating errors experiment: 2% <-> 6% errors every 10 seconds +runner = Semian::Experiments::CircuitBreakerExperimentRunner.new( + experiment_name: "Oscillating Errors Experiment", + resource_name: "protected_service_oscillating_adaptive", + degradation_phases: [Semian::Experiments::DegradationPhase.new(healthy: true)] * 2 + + [Semian::Experiments::DegradationPhase.new(error_rate: 0.02), Semian::Experiments::DegradationPhase.new(error_rate: 0.06)] * 9 + + [Semian::Experiments::DegradationPhase.new(healthy: true)] * 2, + phase_duration: 10, + semian_config: { + adaptive_circuit_breaker: true, + bulkhead: false, + }, + graph_title: "Adaptive Circuit Breaker: Oscillating Errors (2% <-> 6%)", + graph_filename: "oscillating_errors_adaptive.png", + x_axis_label_interval: 60, +) + +runner.run diff --git a/experiments/experiments/experiment_slow_query.rb b/experiments/experiments/experiment_slow_query.rb new file mode 100644 index 000000000..20a8f27b7 --- /dev/null +++ b/experiments/experiments/experiment_slow_query.rb @@ -0,0 +1,31 @@ +# frozen_string_literal: true + +$LOAD_PATH.unshift(File.expand_path("../lib", __dir__)) + +require "semian" +require_relative "../mock_service" +require_relative "../experimental_resource" +require_relative "../experiment_helpers" + +runner = Semian::Experiments::CircuitBreakerExperimentRunner.new( + experiment_name: "Slow Query Experiment", + resource_name: "protected_service", + degradation_phases: [Semian::Experiments::DegradationPhase.new(healthy: true)] * 1 + + [Semian::Experiments::DegradationPhase.new(specific_endpoint_latency: 9.5)] * 10 + # This should lead the service to get overwhelmed and start rejecting requests + [Semian::Experiments::DegradationPhase.new(healthy: true)] * 3, + phase_duration: 30, + service_count: 10, + with_max_threads: true, + semian_config: { + success_threshold: 2, + error_threshold: 3, + error_threshold_timeout: 20, + error_timeout: 15, + bulkhead: false, + }, + graph_title: "Classic Circuit Breaker: Slow Query Experiment", + graph_filename: "slow_query.png", + x_axis_label_interval: 30, +) + +runner.run diff --git a/experiments/experiments/experiment_slow_query_adaptive.rb b/experiments/experiments/experiment_slow_query_adaptive.rb new file mode 100644 index 000000000..1adf9c2c4 --- /dev/null +++ b/experiments/experiments/experiment_slow_query_adaptive.rb @@ -0,0 +1,28 @@ +# frozen_string_literal: true + +$LOAD_PATH.unshift(File.expand_path("../lib", __dir__)) + +require "semian" +require_relative "../mock_service" +require_relative "../experimental_resource" +require_relative "../experiment_helpers" + +runner = Semian::Experiments::CircuitBreakerExperimentRunner.new( + experiment_name: "Slow Query Experiment (Adaptive)", + resource_name: "protected_service", + degradation_phases: [Semian::Experiments::DegradationPhase.new(healthy: true)] * 1 + + [Semian::Experiments::DegradationPhase.new(specific_endpoint_latency: 9.5)] * 10 + # This should lead the service to get overwhelmed and start rejecting requests + [Semian::Experiments::DegradationPhase.new(healthy: true)] * 3, + phase_duration: 30, + service_count: 10, + with_max_threads: true, + semian_config: { + adaptive_circuit_breaker: true, + bulkhead: false, + }, + graph_title: "Adaptive Circuit Breaker: Slow Query Experiment", + graph_filename: "slow_query_adaptive.png", + x_axis_label_interval: 30, +) + +runner.run diff --git a/experiments/experiments/experiment_sudden_error_spikes.rb b/experiments/experiments/experiment_sudden_error_spikes.rb new file mode 100644 index 000000000..fe75f08db --- /dev/null +++ b/experiments/experiments/experiment_sudden_error_spikes.rb @@ -0,0 +1,41 @@ +# frozen_string_literal: true + +$LOAD_PATH.unshift(File.expand_path("../../lib", __dir__)) + +require "semian" +require_relative "../mock_service" +require_relative "../experimental_resource" +require_relative "../experiment_helpers" + +# Error spikes experiment: +# Phase 1: 1% for 60 seconds +# Phase 2: 20% for 20 seconds +# Phase 3: 1% for 60 seconds +# Phase 4: 60% for 20 seconds +# Phase 5: 1% for 60 seconds +# Phase 6: 100% for 20 seconds +# Phase 7: 1% for 60 seconds +runner = Semian::Experiments::CircuitBreakerExperimentRunner.new( + experiment_name: "Sudden Error Spikes Experiment (Classic)", + resource_name: "protected_service_sudden_error_spikes", + degradation_phases: [Semian::Experiments::DegradationPhase.new(healthy: true)] * 3 + + [Semian::Experiments::DegradationPhase.new(error_rate: 0.20)] + + [Semian::Experiments::DegradationPhase.new(healthy: true)] * 3 + + [Semian::Experiments::DegradationPhase.new(error_rate: 0.60)] + + [Semian::Experiments::DegradationPhase.new(healthy: true)] * 3 + + [Semian::Experiments::DegradationPhase.new(error_rate: 1.00)] + + [Semian::Experiments::DegradationPhase.new(healthy: true)] * 3, + phase_duration: 20, + semian_config: { + success_threshold: 2, + error_threshold: 12, + error_threshold_timeout: 20, + error_timeout: 15, + bulkhead: false, + }, + graph_title: "Classic: Sudden Error Spikes, 20 second spikes (20%, 60%, 100%)", + graph_filename: "sudden_error_spikes.png", + x_axis_label_interval: 60, +) + +runner.run diff --git a/experiments/experiments/experiment_sudden_error_spikes_adaptive.rb b/experiments/experiments/experiment_sudden_error_spikes_adaptive.rb new file mode 100644 index 000000000..b26efe86a --- /dev/null +++ b/experiments/experiments/experiment_sudden_error_spikes_adaptive.rb @@ -0,0 +1,38 @@ +# frozen_string_literal: true + +$LOAD_PATH.unshift(File.expand_path("../../lib", __dir__)) + +require "semian" +require_relative "../mock_service" +require_relative "../experimental_resource" +require_relative "../experiment_helpers" + +# Error spikes experiment: +# Phase 1: 1% for 60 seconds +# Phase 2: 20% for 20 seconds +# Phase 3: 1% for 60 seconds +# Phase 4: 60% for 20 seconds +# Phase 5: 1% for 60 seconds +# Phase 6: 100% for 20 seconds +# Phase 7: 1% for 60 seconds +runner = Semian::Experiments::CircuitBreakerExperimentRunner.new( + experiment_name: "Sudden Error Spikes Experiment - adaptive", + resource_name: "protected_service_sudden_error_spikes_adaptive", + degradation_phases: [Semian::Experiments::DegradationPhase.new(healthy: true)] * 3 + + [Semian::Experiments::DegradationPhase.new(error_rate: 0.20)] + + [Semian::Experiments::DegradationPhase.new(healthy: true)] * 3 + + [Semian::Experiments::DegradationPhase.new(error_rate: 0.60)] + + [Semian::Experiments::DegradationPhase.new(healthy: true)] * 3 + + [Semian::Experiments::DegradationPhase.new(error_rate: 1.00)] + + [Semian::Experiments::DegradationPhase.new(healthy: true)] * 3, + phase_duration: 20, + semian_config: { + adaptive_circuit_breaker: true, + bulkhead: false, + }, + graph_title: "Adaptive: Sudden Error Spikes, 20 second spikes (20%, 60%, 100%)", + graph_filename: "sudden_error_spikes_adaptive.png", + x_axis_label_interval: 60, +) + +runner.run diff --git a/experiments/experiments/experiment_sustained_load.rb b/experiments/experiments/experiment_sustained_load.rb new file mode 100644 index 000000000..5e296378e --- /dev/null +++ b/experiments/experiments/experiment_sustained_load.rb @@ -0,0 +1,30 @@ +# frozen_string_literal: true + +$LOAD_PATH.unshift(File.expand_path("../../lib", __dir__)) + +require "semian" +require_relative "../mock_service" +require_relative "../experimental_resource" +require_relative "../experiment_helpers" + +# Sustained load experiment: 120s baseline (1%) -> 300s sustained (20%) -> 120s recovery (1%) +runner = Semian::Experiments::CircuitBreakerExperimentRunner.new( + experiment_name: "Sustained Load Experiment (Classic)", + resource_name: "protected_service_sustained_load", + degradation_phases: [Semian::Experiments::DegradationPhase.new(healthy: true)] * 4 + + [Semian::Experiments::DegradationPhase.new(error_rate: 0.20)] * 10 + + [Semian::Experiments::DegradationPhase.new(healthy: true)] * 4, + phase_duration: 30, + semian_config: { + success_threshold: 2, + error_threshold: 12, + error_threshold_timeout: 20, + error_timeout: 15, + bulkhead: false, + }, + graph_title: "Classic Circuit Breaker: Sustained 20% Error Load", + graph_filename: "sustained_load.png", + x_axis_label_interval: 30, +) + +runner.run diff --git a/experiments/experiments/experiment_sustained_load_adaptive.rb b/experiments/experiments/experiment_sustained_load_adaptive.rb new file mode 100644 index 000000000..bcb1dcaa3 --- /dev/null +++ b/experiments/experiments/experiment_sustained_load_adaptive.rb @@ -0,0 +1,27 @@ +# frozen_string_literal: true + +$LOAD_PATH.unshift(File.expand_path("../../lib", __dir__)) + +require "semian" +require_relative "../mock_service" +require_relative "../experimental_resource" +require_relative "../experiment_helpers" + +# Sustained load experiment: 120s baseline (1%) -> 300s sustained (20%) -> 120s recovery (1%) +runner = Semian::Experiments::CircuitBreakerExperimentRunner.new( + experiment_name: "Sustained Load Experiment (Adaptive)", + resource_name: "protected_service_sustained_load_adaptive", + degradation_phases: [Semian::Experiments::DegradationPhase.new(healthy: true)] * 4 + + [Semian::Experiments::DegradationPhase.new(error_rate: 0.20)] * 10 + + [Semian::Experiments::DegradationPhase.new(healthy: true)] * 4, + phase_duration: 30, + semian_config: { + adaptive_circuit_breaker: true, + bulkhead: false, + }, + graph_title: "Adaptive Circuit Breaker: Sustained 20% Error Load", + graph_filename: "sustained_load_adaptive.png", + x_axis_label_interval: 30, +) + +runner.run diff --git a/experiments/mock_service.rb b/experiments/mock_service.rb new file mode 100644 index 000000000..8ba21d5d7 --- /dev/null +++ b/experiments/mock_service.rb @@ -0,0 +1,349 @@ +# frozen_string_literal: true + +module Semian + module Experiments + # MockService simulates a service with configurable endpoints, latencies, and error rates. + # This class handles the service behavior independently from Semian integration. + # It's designed to be thread-safe and shared across multiple client instances. + class MockService + attr_reader :endpoints_count, :min_latency, :max_latency, :distribution, :endpoint_latencies, :timeout, :base_error_rate + + # Initialize the mock service + # @param endpoints_count [Integer] Number of available endpoints + # @param min_latency [Float] Minimum latency in seconds + # @param max_latency [Float] Maximum latency in seconds + # @param distribution [Hash] Statistical distribution configuration + # For log-normal: { type: :log_normal, mean: Float, std_dev: Float } + # @param timeout [Float, nil] Maximum time to wait for a request (in seconds). If nil, no timeout is enforced. + # @param error_rate [Float] Baseline error rate (0.0 to 1.0). Probability that any request will fail. + # @param deterministic_errors [Boolean] If true, use deterministic error injection for predictable testing + # @param max_threads [Integer] Maximum number of requests that can be processed concurrently. 0 for unlimited. + # @param queue_timeout [Float] Maximum time to wait for a request to be processed if all threads are busy. Only used if max_threads is not 0. 0 means we drop requests immediately. + def initialize(endpoints_count:, min_latency:, max_latency:, distribution:, timeout: nil, error_rate: 0.0, deterministic_errors: false, max_threads: 0, queue_timeout: 0) + @endpoints_count = endpoints_count + @min_latency = min_latency + @max_latency = max_latency + @distribution = validate_distribution(distribution) + @timeout = timeout + @base_error_rate = validate_error_rate(error_rate) + @deterministic_errors = deterministic_errors + + @thread_semaphore = max_threads > 0 ? Concurrent::Semaphore.new(max_threads) : nil + @queue_timeout = queue_timeout + + # Initialize service degradation state + @latency_degradation = { amount: 0.0, target: 0.0, ramp_start: nil, ramp_duration: 0 } + @error_rate_degradation = { rate: @base_error_rate, target: @base_error_rate, ramp_start: nil, ramp_duration: 0 } + + # Phase-synchronized tracking for precise error rates + @current_phase_requests = 0 + @current_phase_failures = 0 + + # Assign fixed latencies to each endpoint + @endpoint_latencies = generate_endpoint_latencies + + @specific_endpoint_degradations = {} + + # Mutex for thread-safe operations on shared state + @mutex = Mutex.new + end + + # Simulate making a request to a specific endpoint + # @param endpoint_index [Integer] The index of the endpoint to request (0-based) + # @raises [TimeoutError] if the request would exceed the configured timeout + # @raises [RequestError] if the request fails based on error rate + def request(endpoint_index, &block) + if @thread_semaphore.nil? || @thread_semaphore.try_acquire(1, @queue_timeout) + begin + validate_endpoint_index(endpoint_index) + + # Calculate latency with degradation + base_latency = @endpoint_latencies[endpoint_index] + latency = base_latency + current_latency_degradation(endpoint_index) + + # Check if request should fail based on current error rate + current_rate = current_error_rate + if should_fail?(current_rate) + # Sleep for partial latency to simulate some processing before error + error_latency = latency * 0.3 # Fail after 30% of expected latency + sleep(error_latency) if error_latency > 0 + + raise RequestError, "Request to endpoint #{endpoint_index} failed " \ + "(error rate: #{(current_rate * 100).round(1)}%)" + end + + # Check if request would timeout + if @timeout && latency > @timeout + # Sleep for the timeout period, then raise exception + sleep(@timeout) if @timeout > 0 + raise TimeoutError, + "Request to endpoint #{endpoint_index} timed out after #{@timeout}s " \ + "(would have taken #{latency.round(3)}s)" + end + + # Simulate the request with calculated latency + sleep(latency) if latency > 0 + + if block_given? + yield(endpoint_index, latency) + else + { endpoint: endpoint_index, latency: latency } + end + ensure + @thread_semaphore&.release(1) + end + else + raise QueueTimeoutError, "Request timed out while waiting in queue" + end + end + + # Add fixed latency to all requests with optional ramp-up time + # @param amount [Float] Amount of latency to add (in seconds) + # @param ramp_time [Float] Time to ramp up to the target latency (in seconds), 0 for immediate + def add_latency(amount, ramp_time: 0) + raise ArgumentError, "Latency amount must be non-negative" if amount < 0 + raise ArgumentError, "Ramp time must be non-negative" if ramp_time < 0 + + @mutex.synchronize do + @latency_degradation[:target] = amount + @latency_degradation[:ramp_start] = Time.now + @latency_degradation[:ramp_duration] = ramp_time + + # If no ramp time, apply immediately + @latency_degradation[:amount] = amount if ramp_time == 0 + end + end + + # Change the error rate with optional ramp-up time + # @param rate [Float] New error rate (0.0 to 1.0) + # @param ramp_time [Float] Time to ramp up to the target error rate (in seconds), 0 for immediate + def set_error_rate(rate, ramp_time: 0) + validate_error_rate(rate) + raise ArgumentError, "Ramp time must be non-negative" if ramp_time < 0 + + @mutex.synchronize do + @error_rate_degradation[:target] = rate + @error_rate_degradation[:ramp_start] = Time.now + @error_rate_degradation[:ramp_duration] = ramp_time + + # If no ramp time, apply immediately + @error_rate_degradation[:rate] = rate if ramp_time == 0 + + # Reset deterministic request counter when error rate changes + if @deterministic_errors + # Reset phase tracking for new error rate (perfect synchronization) + @current_phase_requests = 0 + @current_phase_failures = 0 + end + end + end + + def degrade_specific_endpoint(endpoint_index, amount, ramp_time: 0) + @mutex.synchronize do + @specific_endpoint_degradations[endpoint_index] = { + amount: ramp_time == 0 ? amount : 0.0, # If no ramp time, apply immediately + target: amount, + ramp_start: Time.now, + ramp_duration: ramp_time, + } + end + end + + # Reset service to baseline (remove all degradation) + def reset_degradation + @mutex.synchronize do + @latency_degradation = { amount: 0.0, target: 0.0, ramp_start: nil, ramp_duration: 0 } + @error_rate_degradation = { rate: @base_error_rate, target: @base_error_rate, ramp_start: nil, ramp_duration: 0 } + @specific_endpoint_degradations = {} + # Reset phase tracking + @current_phase_requests = 0 + @current_phase_failures = 0 + end + end + + # Get current latency degradation (accounting for ramp-up) + def current_latency_degradation(endpoint_index) + @mutex.synchronize do + degradation = @specific_endpoint_degradations[endpoint_index] || @latency_degradation + + return degradation[:amount] unless degradation[:ramp_start] && degradation[:ramp_duration] > 0 + + elapsed = Time.now - degradation[:ramp_start] + if elapsed >= degradation[:ramp_duration] + # Ramp complete + degradation[:amount] = degradation[:target] + degradation[:ramp_start] = nil + degradation[:target] + else + # Still ramping + progress = elapsed / degradation[:ramp_duration] + current = degradation[:amount] + target = degradation[:target] + current + (target - current) * progress + end + end + end + + # Get current error rate (accounting for ramp-up) + def current_error_rate + @mutex.synchronize do + return @error_rate_degradation[:rate] unless @error_rate_degradation[:ramp_start] && @error_rate_degradation[:ramp_duration] > 0 + + elapsed = Time.now - @error_rate_degradation[:ramp_start] + if elapsed >= @error_rate_degradation[:ramp_duration] + # Ramp complete + @error_rate_degradation[:rate] = @error_rate_degradation[:target] + @error_rate_degradation[:ramp_start] = nil + @error_rate_degradation[:target] + else + # Still ramping + progress = elapsed / @error_rate_degradation[:ramp_duration] + current = @error_rate_degradation[:rate] + target = @error_rate_degradation[:target] + current + (target - current) * progress + end + end + end + + # Get the base latency for an endpoint (without degradation effects) + def base_latency(endpoint_index) + validate_endpoint_index(endpoint_index) + @endpoint_latencies[endpoint_index] + end + + private + + def validate_distribution(dist) + unless dist.is_a?(Hash) && dist[:type] + raise ArgumentError, "Distribution must be a Hash with :type key" + end + + case dist[:type] + when :log_normal + validate_log_normal_distribution(dist) + else + raise ArgumentError, "Unsupported distribution type: #{dist[:type]}. Only :log_normal is currently supported." + end + + dist + end + + def validate_error_rate(rate) + unless rate.is_a?(Numeric) && rate >= 0.0 && rate <= 1.0 + raise ArgumentError, "Error rate must be a number between 0.0 and 1.0, got #{rate}" + end + + rate + end + + def validate_log_normal_distribution(dist) + unless dist[:mean] && dist[:std_dev] + raise ArgumentError, "Log-normal distribution requires :mean and :std_dev parameters" + end + + unless dist[:mean].is_a?(Numeric) && dist[:mean] > 0 + raise ArgumentError, "Log-normal mean must be a positive number" + end + + unless dist[:std_dev].is_a?(Numeric) && dist[:std_dev] >= 0 + raise ArgumentError, "Log-normal std_dev must be a non-negative number" + end + end + + def validate_endpoint_index(endpoint_index) + unless endpoint_index.is_a?(Integer) && endpoint_index >= 0 && endpoint_index < @endpoints_count + raise ArgumentError, "Invalid endpoint index: #{endpoint_index}. Must be between 0 and #{@endpoints_count - 1}" + end + end + + def generate_endpoint_latencies + Array.new(@endpoints_count) do + latency = sample_from_distribution + # Clamp to min/max bounds + latency.clamp(@min_latency, @max_latency) + end + end + + def should_fail?(error_rate) + return false if error_rate <= 0 + + @mutex.synchronize do + if @deterministic_errors + return true if error_rate >= 1.0 # Always fail if 100% error rate + + # Phase-synchronized deterministic failure optimized for closest target + @current_phase_requests += 1 + + # Calculate what error rate would be if we fail vs don't fail + error_rate_if_fail = (@current_phase_failures + 1).to_f / @current_phase_requests + error_rate_if_pass = @current_phase_failures.to_f / @current_phase_requests + + # Calculate distance from target for each option + distance_if_fail = (error_rate_if_fail - error_rate).abs + distance_if_pass = (error_rate_if_pass - error_rate).abs + + # Choose the option that gets us closer to the target + should_fail_now = distance_if_fail < distance_if_pass + + if should_fail_now + @current_phase_failures += 1 + end + + should_fail_now + else + # Use random error injection + rand < error_rate + end + end + end + + def sample_from_distribution + case @distribution[:type] + when :log_normal + sample_log_normal(@distribution[:mean], @distribution[:std_dev]) + else + # Fallback to mean value + @distribution[:mean] || (@min_latency + @max_latency) / 2.0 + end + end + + def sample_log_normal(mean, std_dev) + # Convert mean and std_dev of the log-normal to the underlying normal distribution + # Using method of moments conversion + variance = std_dev**2 + mean_squared = mean**2 + + # Calculate parameters for underlying normal distribution + mu = Math.log(mean_squared / Math.sqrt(variance + mean_squared)) + sigma = Math.sqrt(Math.log(1 + variance / mean_squared)) + + # Generate log-normal sample using Box-Muller transform + u1 = rand + u2 = rand + z0 = Math.sqrt(-2.0 * Math.log(u1)) * Math.cos(2.0 * Math::PI * u2) + + # Transform to log-normal + Math.exp(mu + sigma * z0) + end + + # Error classes for the mock service + class TimeoutError < StandardError + def marks_semian_circuits? + true # This error should trigger circuit breaker + end + end + + class RequestError < StandardError + def marks_semian_circuits? + true # This error should trigger circuit breaker + end + end + + class QueueTimeoutError < StandardError + def marks_semian_circuits? + true # This error should trigger circuit breaker + end + end + end + end +end diff --git a/experiments/results/csv/gradual_increase_adaptive_pid_controller.csv b/experiments/results/csv/gradual_increase_adaptive_pid_controller.csv new file mode 100644 index 000000000..840c2b003 --- /dev/null +++ b/experiments/results/csv/gradual_increase_adaptive_pid_controller.csv @@ -0,0 +1,602 @@ +Window,Thread Count,Error Rate Avg,Error Rate Min,Error Rate Max,Ideal Error Rate,Rejection Rate Avg,Rejection Rate Min,Rejection Rate Max,Integral Avg,Integral Min,Integral Max,Derivative Avg,Derivative Min,Derivative Max,P Value Avg,P Value Min,P Value Max,Total Request Time +1,60,1.67,0.0,50.0,4.61,1.7,0.0,54.0,-0.0296,-0.0461,0.45,0.0,-0.0,-0.0,-0.0296,-0.0461,0.45,65.3 +2,60,0.73,0.0,12.5,4.25,0.55,0.0,12.06,-0.0812,-0.0886,0.053,0.0,0.0,0.0,-0.0515,-0.4245,0.0592,127.74 +3,60,0.76,0.0,9.09,3.92,0.15,0.0,4.22,-0.1189,-0.1278,-0.0054,0.0,0.0,0.0,-0.0377,-0.0975,0.02,185.22 +4,60,0.85,0.0,6.9,3.61,0.06,0.0,1.89,-0.1493,-0.1639,-0.0239,0.0,0.0,0.0,-0.0304,-0.0361,0.0264,246.72 +5,60,0.95,0.0,7.89,3.33,0.12,0.0,3.02,-0.1756,-0.1972,-0.0263,0.0,0.0,0.0,-0.0263,-0.0333,0.0343,306.04 +6,60,1.03,0.0,7.5,3.07,0.06,0.0,2.73,-0.1995,-0.228,-0.0302,0.0,0.0,0.0,-0.0239,-0.0307,0.0238,366.38 +7,60,1.01,0.0,7.14,3.22,0.04,0.0,2.39,-0.2212,-0.2563,-0.028,0.0,-0.0,-0.0,-0.0217,-0.0283,0.0111,427.64 +8,60,1.1,0.0,6.38,3.13,0.03,0.0,1.55,-0.2403,-0.2824,-0.0303,0.0,-0.0,-0.0,-0.0191,-0.0261,0.0142,485.04 +9,60,1.01,0.0,5.88,3.03,0.03,0.0,1.04,-0.2585,-0.3065,-0.0295,0.0,-0.0,-0.0,-0.0182,-0.0241,0.0121,546.51 +10,60,1.0,0.0,5.26,2.92,0.01,0.0,0.39,-0.2754,-0.3287,-0.03,0.0,-0.0,-0.0,-0.0169,-0.0222,0.0034,605.49 +11,60,1.1,0.0,5.77,2.82,0.02,0.0,1.11,-0.2898,-0.3491,-0.019,0.0,0.0,0.0,-0.0144,-0.0384,0.011,663.16 +12,60,1.14,0.0,5.66,2.72,0.02,0.0,1.07,-0.3028,-0.368,-0.0162,0.0,0.0,0.0,-0.013,-0.0403,0.01,727.26 +13,60,1.19,0.0,5.17,2.63,0.01,0.0,0.54,-0.3142,-0.3854,-0.0179,0.0,0.0,0.0,-0.0114,-0.0372,0.0173,785.27 +14,60,1.15,0.0,3.85,2.55,0.0,0.0,0.0,-0.325,-0.4014,-0.0274,0.0,0.0,0.0,-0.0108,-0.0343,0.0165,844.04 +15,60,1.08,0.0,3.77,1.48,0.0,0.0,0.0,-0.3354,-0.4162,-0.0489,0.0,0.0,0.0,-0.0104,-0.0316,0.0154,909.19 +16,60,1.01,0.0,3.92,1.36,0.0,0.0,0.0,-0.3456,-0.4298,-0.0708,0.0,0.0,0.0,-0.0102,-0.0305,0.0158,965.35 +17,60,0.9,0.0,4.0,1.26,0.0,0.0,0.0,-0.356,-0.4424,-0.0915,0.0,0.0,0.0,-0.0104,-0.0281,0.0154,1024.92 +18,60,0.86,0.0,3.92,2.07,0.0,0.0,0.0,-0.3658,-0.454,-0.111,0.0,0.0,0.0,-0.0098,-0.0286,0.0151,1087.88 +19,60,0.98,0.0,4.08,2.02,0.0,0.0,0.0,-0.3736,-0.4647,-0.1295,0.0,0.0,0.0,-0.0078,-0.0263,0.0145,1147.22 +20,60,0.93,0.0,4.35,1.99,0.0,0.0,0.0,-0.3811,-0.4746,-0.1362,0.0,0.0,0.0,-0.0075,-0.0252,0.0228,1208.69 +21,60,0.83,0.0,4.84,1.95,0.0,0.0,0.0,-0.3889,-0.4836,-0.1385,0.0,0.0,0.0,-0.0078,-0.0325,0.0244,1265.2 +22,60,0.8,0.0,4.92,0.84,0.0,0.0,0.0,-0.3962,-0.492,-0.1369,0.0,0.0,0.0,-0.0073,-0.03,0.0251,1327.23 +23,60,0.72,0.0,4.35,0.77,0.0,0.0,0.0,-0.4036,-0.4997,-0.1386,0.0,0.0,0.0,-0.0074,-0.0276,0.016,1386.84 +24,60,0.76,0.0,4.0,1.83,0.0,0.0,0.0,-0.4099,-0.5112,-0.1391,0.0,0.0,0.0,-0.0063,-0.0255,0.0137,1447.28 +25,60,0.85,0.0,4.17,1.79,0.0,0.0,0.0,-0.4146,-0.5235,-0.1397,0.0,0.0,0.0,-0.0048,-0.0235,0.0286,1505.4 +26,60,0.86,0.0,4.26,1.77,0.0,0.0,0.0,-0.4187,-0.5348,-0.1391,0.0,0.0,0.0,-0.0041,-0.0232,0.034,1563.17 +27,60,1.0,0.0,6.0,1.75,0.0,0.0,0.0,-0.421,-0.5452,-0.1373,0.0,0.0,0.0,-0.0022,-0.0214,0.0514,1626.99 +28,60,0.93,0.0,6.25,1.61,0.0,0.0,0.0,-0.4234,-0.5548,-0.1342,0.0,-0.0,-0.0,-0.0024,-0.0197,0.0538,1687.01 +29,60,0.84,0.0,5.77,1.49,0.0,0.0,0.0,-0.4263,-0.5636,-0.1632,0.0,0.0,0.0,-0.0028,-0.0307,0.0489,1746.12 +30,60,0.84,0.0,5.0,1.49,0.0,0.0,0.0,-0.4285,-0.5718,-0.1541,0.0,0.0,0.0,-0.0022,-0.0283,0.0412,1805.51 +31,60,0.87,0.0,5.17,1.49,0.01,0.0,0.57,-0.43,-0.5793,-0.1421,0.0,0.0,0.0,-0.0015,-0.0212,0.0411,1865.72 +32,60,0.82,0.0,5.08,1.49,0.03,0.0,1.4,-0.4317,-0.5862,-0.1314,0.0,0.0,0.0,-0.0017,-0.0195,0.0364,1925.11 +33,60,0.96,0.0,5.08,1.49,0.02,0.0,1.08,-0.4317,-0.5926,-0.1042,0.0,0.0,0.0,-0.0001,-0.018,0.0313,1985.46 +34,60,0.99,0.0,4.76,0.32,0.0,0.0,0.0,-0.4311,-0.5985,-0.1003,0.0,0.0,0.0,0.0007,-0.0166,0.0364,2044.99 +35,60,0.89,0.0,4.84,1.5,0.0,0.0,0.0,-0.4308,-0.604,-0.084,0.0,-0.0,-0.0,0.0003,-0.0213,0.0371,2108.24 +36,60,0.98,0.0,4.84,1.5,0.0,0.0,0.0,-0.4293,-0.609,-0.0706,0.0,-0.0,-0.0,0.0015,-0.0196,0.0371,2165.78 +37,60,0.92,0.0,5.26,1.51,0.0,0.0,0.0,-0.4282,-0.6136,-0.0745,0.0,0.0,0.0,0.0012,-0.0183,0.0418,2225.25 +38,60,0.98,0.0,5.77,1.51,0.03,0.0,1.2,-0.4261,-0.596,-0.0767,0.0,-0.0,-0.0,0.0021,-0.0171,0.0462,2286.48 +39,59,0.97,0.0,5.13,1.51,0.02,0.0,1.0,-0.4231,-0.579,-0.094,0.0,0.0,0.0,0.002,-0.0174,0.0462,2346.26 +40,60,0.98,0.0,5.08,0.48,0.03,0.0,1.84,-0.4216,-0.5681,-0.1101,0.0,0.0,0.0,0.0025,-0.016,0.0401,2402.5 +41,60,0.92,0.0,4.84,0.44,0.03,0.0,1.97,-0.4195,-0.5699,-0.1009,0.0,0.0,0.0,0.0021,-0.0197,0.0403,2464.72 +42,60,0.91,0.0,5.0,0.4,0.03,0.0,1.94,-0.4172,-0.5715,-0.0843,0.0,0.0,0.0,0.0023,-0.0182,0.0447,2527.0 +43,60,0.75,0.0,5.97,0.37,0.04,0.0,1.23,-0.4162,-0.573,-0.0825,0.0,0.0,0.0,0.001,-0.0168,0.0548,2586.31 +44,60,0.74,0.0,6.56,0.34,0.08,0.0,2.86,-0.415,-0.5744,-0.0804,0.0,0.0,0.0,0.0012,-0.0155,0.049,2643.24 +45,60,0.82,0.0,6.45,0.32,0.11,0.0,3.49,-0.4132,-0.5757,-0.0745,0.0,0.0,0.0,0.0018,-0.0143,0.0379,2703.92 +46,60,0.76,0.0,5.97,0.29,0.07,0.0,3.45,-0.412,-0.5769,-0.0672,0.0,0.0,0.0,0.0013,-0.0133,0.0389,2766.6 +47,60,0.74,0.0,5.0,0.27,0.04,0.0,2.67,-0.4103,-0.578,-0.0751,0.0,0.0,0.0,0.0017,-0.0123,0.0357,2826.79 +48,60,0.76,0.0,4.17,0.25,0.03,0.0,1.42,-0.408,-0.579,-0.0686,0.0,0.0,0.0,0.0023,-0.0113,0.0393,2885.85 +49,60,0.83,0.0,4.55,0.25,0.04,0.0,1.57,-0.4046,-0.5821,-0.0514,0.0,0.0,0.0,0.0034,-0.0105,0.0431,2943.02 +50,59,0.8,0.0,4.35,0.25,0.03,0.0,2.03,-0.3989,-0.5852,-0.0589,0.0,-0.0,-0.0,0.0031,-0.0096,0.041,3003.38 +51,60,0.94,0.0,6.67,0.19,0.05,0.0,2.74,-0.3967,-0.588,-0.0431,0.0,0.0,0.0,0.0048,-0.0089,0.0641,3065.37 +52,60,0.96,0.0,7.14,0.19,0.01,0.0,0.37,-0.3916,-0.5906,-0.0546,0.0,0.0,0.0,0.0051,-0.0326,0.0687,3126.79 +53,59,1.04,0.0,6.52,0.2,0.03,0.0,0.89,-0.3861,-0.5931,-0.0433,0.0,-0.0,-0.0,0.0064,-0.0112,0.0595,3184.85 +54,60,0.99,0.0,6.52,0.35,0.05,0.0,1.99,-0.3795,-0.5837,-0.0354,0.0,0.0,0.0,0.0059,-0.0148,0.054,3241.61 +55,60,0.93,0.0,5.88,0.32,0.05,0.0,2.14,-0.3742,-0.5842,-0.0283,0.0,0.0,0.0,0.0053,-0.0136,0.037,3305.82 +56,59,0.93,0.0,3.64,0.3,0.0,0.0,0.1,-0.3713,-0.5848,-0.0417,0.0,0.0,0.0,0.0054,-0.0134,0.0342,3364.79 +57,59,0.83,0.0,3.7,0.7,0.01,0.0,0.75,-0.3619,-0.5853,-0.0456,0.0,-0.0,-0.0,0.0049,-0.0116,0.0329,3425.92 +58,60,0.76,0.0,3.64,0.21,0.02,0.0,1.06,-0.3598,-0.5857,-0.0492,0.0,0.0,0.0,0.0042,-0.0107,0.0341,3488.99 +59,60,0.77,0.0,3.51,0.21,0.03,0.0,1.5,-0.3553,-0.5861,-0.0526,0.0,0.0,0.0,0.0045,-0.0098,0.0322,3546.6 +60,60,0.79,0.0,4.17,0.22,0.0,0.0,0.0,-0.3507,-0.5865,-0.0556,0.0,0.0,0.0,0.0047,-0.018,0.0406,3609.76 +61,59,0.75,0.0,4.48,0.23,0.0,0.0,0.16,-0.344,-0.5869,-0.0585,0.0,-0.0,-0.0,0.0047,-0.0084,0.0437,3664.59 +62,60,0.75,0.0,4.55,0.39,0.02,0.0,0.55,-0.3414,-0.5872,-0.0611,0.0,0.0,0.0,0.0047,-0.0066,0.0443,3728.52 +63,60,0.7,0.0,4.23,0.36,0.0,0.0,0.0,-0.3371,-0.5875,-0.0635,0.0,0.0,0.0,0.0042,-0.0061,0.041,3786.07 +64,59,0.86,0.0,4.62,0.34,0.02,0.0,0.94,-0.3297,-0.5878,-0.0613,0.0,0.0,0.0,0.0061,-0.0085,0.0448,3847.14 +65,60,0.98,0.0,5.71,0.08,0.03,0.0,1.16,-0.3239,-0.588,-0.0497,0.0,0.0,0.0,0.0072,-0.0078,0.0557,3906.98 +66,60,1.08,0.0,5.56,0.08,0.05,0.0,1.46,-0.3158,-0.5882,-0.0404,0.0,0.0,0.0,0.0081,-0.0072,0.0517,3967.27 +67,60,1.12,0.0,5.63,0.08,0.08,0.0,2.13,-0.3073,-0.5885,-0.0325,0.0,0.0,0.0,0.0085,-0.0066,0.0443,4024.9 +68,60,1.19,0.0,5.08,0.08,0.08,0.0,2.15,-0.2984,-0.5887,-0.0252,0.0,0.0,0.0,0.0089,-0.0061,0.0459,4087.02 +69,60,1.32,0.0,4.92,0.09,0.08,0.0,2.1,-0.2882,-0.5888,-0.0322,0.0,-0.0,-0.0,0.0102,-0.0097,0.0441,4146.97 +70,60,1.36,0.0,3.92,0.09,0.08,0.0,2.35,-0.2776,-0.589,-0.0292,0.0,0.0,0.0,0.0106,-0.0124,0.0384,4205.54 +71,60,1.41,0.0,3.7,0.1,0.11,0.0,2.42,-0.2663,-0.5892,-0.0238,0.0,0.0,0.0,0.0112,-0.0045,0.0361,4268.04 +72,60,1.4,0.0,5.0,0.1,0.15,0.0,2.69,-0.2556,-0.5893,-0.0195,0.0,-0.0,-0.0,0.0107,-0.0078,0.0445,4326.01 +73,60,1.49,0.0,4.84,0.11,0.21,0.0,4.2,-0.2442,-0.5895,-0.0017,0.0,0.0,0.0,0.0114,-0.0072,0.0467,4388.52 +74,59,1.36,0.0,5.0,0.33,0.17,0.0,2.04,-0.2343,-0.5896,-0.0177,0.0,0.0,0.0,0.0095,-0.0282,0.049,4444.08 +75,48,1.32,0.0,5.0,0.28,0.22,0.0,1.97,-0.2329,-0.5843,-0.0138,0.0,0.0,0.0,0.0096,-0.0074,0.0465,4506.57 +76,60,1.41,0.0,5.36,0.11,0.35,0.0,3.04,-0.217,-0.5701,-0.0111,0.0,-0.0,-0.0,0.0102,-0.0102,0.0522,4566.09 +77,60,1.52,0.0,6.52,0.12,0.43,0.0,4.39,-0.2071,-0.5568,-0.0071,0.0,-0.0,-0.0,0.0099,-0.0052,0.0563,4625.48 +78,59,1.5,0.0,6.52,0.12,0.45,0.0,4.54,-0.2008,-0.5431,-0.0064,0.0,-0.0,-0.0,0.0093,-0.0048,0.0521,4685.73 +79,60,1.54,0.0,6.52,0.13,0.53,0.0,5.0,-0.1891,-0.5301,-0.0074,0.0,-0.0,-0.0,0.0088,-0.0179,0.0529,4746.68 +80,60,1.41,0.0,5.45,0.13,0.41,0.0,4.3,-0.182,-0.5034,-0.0082,0.0,-0.0,-0.0,0.0071,-0.0176,0.0446,4804.6 +81,60,1.47,0.0,5.0,0.14,0.45,0.0,3.74,-0.1731,-0.4904,-0.0066,0.0,0.0,0.0,0.0089,-0.0139,0.044,4865.17 +82,60,1.52,0.0,4.84,0.14,0.58,0.0,3.18,-0.164,-0.4906,0.0003,0.0,-0.0,-0.0,0.0091,-0.0093,0.0467,4926.0 +83,59,1.36,0.0,4.84,0.14,0.54,0.0,3.18,-0.1583,-0.4907,0.0032,0.0,-0.0,-0.0,0.0066,-0.0165,0.0474,4984.82 +84,60,1.43,0.0,4.84,0.19,0.59,0.0,3.47,-0.1505,-0.4908,0.0006,0.0,-0.0,-0.0,0.0071,-0.0101,0.0449,5043.93 +85,59,1.29,0.0,4.84,0.19,0.57,0.0,3.66,-0.1471,-0.4909,0.0008,0.0,0.0,0.0,0.0054,-0.0146,0.0477,5106.56 +86,50,1.23,0.0,3.77,0.09,0.54,0.0,3.24,-0.1406,-0.4911,0.0027,0.0,0.0,0.0,0.0056,-0.0098,0.035,5162.31 +87,60,1.24,0.0,4.69,0.15,0.65,0.0,3.84,-0.1355,-0.4912,0.0059,0.0,0.0,0.0,0.0051,-0.0123,0.0462,5227.43 +88,60,1.2,0.0,5.08,0.15,0.61,0.0,4.56,-0.1314,-0.4912,0.0037,0.0,-0.0,-0.0,0.0041,-0.0188,0.0501,5286.51 +89,60,1.25,0.0,5.88,0.16,0.69,0.0,5.85,-0.1264,-0.4913,0.0032,0.0,0.0,0.0,0.005,-0.0291,0.0471,5344.57 +90,60,1.14,0.0,5.56,0.14,0.6,0.0,5.58,-0.1231,-0.4914,0.005,0.0,-0.0,-0.0,0.0033,-0.0183,0.038,5407.89 +91,60,1.12,0.0,7.41,0.13,0.61,0.0,5.53,-0.1192,-0.4558,0.0027,0.0,0.0,0.0,0.0039,-0.0155,0.054,5465.69 +92,60,1.14,0.0,5.36,0.03,0.55,0.0,3.61,-0.1152,-0.4197,0.0018,0.0,0.0,0.0,0.0041,-0.0215,0.0362,5524.86 +93,60,1.27,0.0,5.17,0.24,0.62,0.0,3.63,-0.1092,-0.3855,0.0117,0.0,0.0,0.0,0.006,-0.0146,0.0414,5587.63 +94,60,1.22,0.0,5.17,0.1,0.64,0.0,3.94,-0.1045,-0.3856,0.0098,0.0,0.0,0.0,0.0047,-0.0286,0.0397,5645.45 +95,59,1.4,0.0,6.56,0.07,0.79,0.0,5.93,-0.0996,-0.3858,0.0084,0.0,0.0,0.0,0.0065,-0.0138,0.0374,5705.82 +96,60,1.46,0.0,6.56,0.18,0.92,0.0,6.22,-0.0926,-0.3859,0.0258,0.0,-0.0,-0.0,0.0055,-0.0042,0.0353,5765.2 +97,59,1.35,0.0,5.56,0.18,0.86,0.0,4.94,-0.0866,-0.386,0.0064,0.0,-0.0,-0.0,0.003,-0.0266,0.0532,5824.05 +98,60,1.4,0.0,6.12,0.03,0.95,0.0,6.7,-0.0851,-0.3861,0.0293,0.0,0.0,0.0,0.0045,-0.0136,0.0402,5884.64 +99,59,1.37,0.0,7.27,0.19,0.99,0.0,8.25,-0.0821,-0.3862,0.0373,0.0,-0.0,-0.0,0.0029,-0.0396,0.0568,5942.64 +100,59,1.46,0.0,7.41,0.12,1.1,0.0,8.39,-0.0781,-0.3863,0.0322,0.0,0.0,0.0,0.0038,-0.0131,0.0383,6007.03 +101,59,1.42,0.0,6.56,0.06,1.07,0.0,7.15,-0.0771,-0.3864,0.0166,0.0,0.0,0.0,0.0028,-0.0157,0.0365,6064.38 +102,59,1.4,0.0,6.25,0.25,1.07,0.0,6.58,-0.0747,-0.3865,0.0167,0.0,0.0,0.0,0.0019,-0.0192,0.0261,6127.82 +103,58,1.39,0.0,6.06,0.19,1.09,0.0,6.25,-0.0697,-0.3865,0.0159,0.0,0.0,0.0,0.0021,-0.0207,0.0312,6185.23 +104,59,1.38,0.0,6.06,0.06,1.07,0.0,6.32,-0.0702,-0.3866,0.0145,0.0,-0.0,-0.0,0.0031,-0.015,0.0281,6247.94 +105,59,1.3,0.0,5.19,0.27,0.99,0.0,5.45,-0.0683,-0.3867,0.0204,0.0,-0.0,-0.0,0.0006,-0.0313,0.0382,6304.99 +106,59,1.24,0.0,5.36,0.07,0.91,0.0,5.88,-0.0668,-0.3867,0.0195,0.0,-0.0,-0.0,0.0017,-0.0197,0.0179,6364.94 +107,60,1.42,0.0,5.63,0.1,1.03,0.0,5.91,-0.0625,-0.3868,0.0179,0.0,-0.0,-0.0,0.004,-0.0283,0.0311,6427.32 +108,60,1.52,0.0,5.97,0.11,1.25,0.0,6.28,-0.0586,-0.3868,0.018,0.0,-0.0,-0.0,0.004,-0.0163,0.0369,6488.58 +109,56,1.55,0.0,5.97,0.11,1.33,0.0,6.22,-0.0591,-0.3869,0.016,0.0,0.0,0.0,0.0025,-0.0181,0.0297,6544.12 +110,58,1.59,0.0,6.45,0.08,1.33,0.0,6.76,-0.0561,-0.3869,0.0236,0.0,-0.0,-0.0,0.0023,-0.0159,0.0354,6604.39 +111,57,1.65,0.0,5.36,0.13,1.38,0.0,5.65,-0.0521,-0.3869,0.016,0.0,-0.0,-0.0,0.0011,-0.0238,0.0381,6667.8 +112,58,1.58,0.0,6.9,0.03,1.36,0.0,7.57,-0.0522,-0.387,0.026,0.0,-0.0,-0.0,0.002,-0.0266,0.0387,6727.65 +113,56,1.64,0.0,7.02,0.11,1.46,0.0,7.9,-0.0499,-0.387,0.0314,0.0,0.0,0.0,0.0019,-0.0316,0.0381,6786.98 +114,59,1.59,0.0,7.14,0.03,1.36,0.0,8.15,-0.0471,-0.387,0.0282,0.0,0.0,0.0,0.0007,-0.0186,0.0254,6843.72 +115,60,1.51,0.0,7.41,0.04,1.3,0.0,8.39,-0.0475,-0.3871,0.0255,0.0,0.0,0.0,0.001,-0.0288,0.0225,6907.21 +116,60,1.69,0.0,7.55,0.05,1.46,0.0,8.47,-0.0443,-0.3871,0.0292,0.0,-0.0,-0.0,0.0033,-0.0198,0.0249,6964.35 +117,60,1.72,0.0,7.69,0.05,1.5,0.0,8.57,-0.0423,-0.3871,0.0271,0.0,-0.0,-0.0,0.0019,-0.0154,0.0348,7026.53 +118,60,1.59,0.0,6.38,0.05,1.32,0.0,7.06,-0.0421,-0.3871,0.027,0.0,-0.0,-0.0,0.0002,-0.0421,0.0207,7086.04 +119,60,1.61,0.0,5.77,0.05,1.41,0.0,5.8,-0.0399,-0.3872,0.015,0.0,0.0,0.0,0.0022,-0.0248,0.0293,7143.91 +120,60,1.63,0.0,5.36,0.06,1.46,0.0,5.36,-0.0384,-0.3872,0.0193,0.0,-0.0,-0.0,0.0016,-0.0133,0.029,7205.58 +121,60,1.58,0.0,6.49,0.06,1.35,0.0,6.96,-0.0379,-0.3872,0.0235,0.0,-0.0,-0.0,0.0005,-0.0188,0.0279,7265.25 +122,60,1.48,0.0,6.67,0.07,1.28,0.0,7.21,-0.0374,-0.3872,0.0286,0.0,0.0,0.0,0.0005,-0.0197,0.0263,7327.35 +123,60,1.54,0.0,7.25,0.07,1.37,0.0,7.87,-0.0355,-0.3872,0.0276,0.0,0.0,0.0,0.0018,-0.0173,0.0263,7385.63 +124,60,1.64,0.0,6.35,0.07,1.47,0.0,7.17,-0.0336,-0.3872,0.0243,0.0,-0.0,-0.0,0.002,-0.0201,0.0377,7446.44 +125,60,1.8,0.0,6.35,0.07,1.63,0.0,7.07,-0.031,-0.3872,0.0216,0.0,0.0,0.0,0.0026,-0.0171,0.029,7507.63 +126,60,1.87,0.0,6.67,0.08,1.66,0.0,7.31,-0.0293,-0.3873,0.0257,0.0,0.0,0.0,0.0017,-0.0206,0.0328,7565.95 +127,60,2.0,0.0,6.35,0.08,1.79,0.0,6.89,-0.0266,-0.3688,0.0222,0.0,-0.0,-0.0,0.0027,-0.0237,0.0304,7623.78 +128,60,2.01,0.0,7.35,0.07,1.82,0.0,8.1,-0.025,-0.3484,0.0201,0.0,-0.0,-0.0,0.0016,-0.0233,0.0222,7684.14 +129,60,2.0,0.0,6.67,0.07,1.84,0.0,7.29,-0.0238,-0.3304,0.0293,0.0,0.0,0.0,0.0012,-0.0336,0.0198,7744.25 +130,60,2.08,0.0,6.67,0.06,1.89,0.0,7.66,-0.022,-0.312,0.0462,0.0,0.0,0.0,0.0018,-0.0274,0.0463,7804.32 +131,60,2.12,0.0,7.32,0.06,2.0,0.0,8.74,-0.0203,-0.2943,0.0475,0.0,0.0,0.0,0.0017,-0.0227,0.0232,7864.63 +132,60,2.31,0.0,8.7,0.05,2.21,0.0,10.42,-0.0177,-0.2763,0.0536,0.0,0.0,0.0,0.0026,-0.0147,0.0234,7925.11 +133,60,2.46,0.0,9.26,0.07,2.33,0.0,10.69,-0.0156,-0.258,0.0401,0.0,-0.0,-0.0,0.0021,-0.0241,0.0306,7984.58 +134,60,2.41,0.0,8.96,0.07,2.27,0.0,10.3,-0.0151,-0.2387,0.0338,0.0,-0.0,-0.0,0.0004,-0.0347,0.038,8046.11 +135,60,2.3,0.0,7.55,0.08,2.13,0.0,8.43,-0.0153,-0.2194,0.0178,0.0,0.0,0.0,-0.0002,-0.0366,0.0211,8105.5 +136,60,2.19,0.0,5.88,0.08,2.03,0.0,6.13,-0.0154,-0.2025,0.0274,0.0,0.0,0.0,-0.0001,-0.0337,0.0312,8162.24 +137,60,1.94,0.0,5.77,0.09,1.81,0.0,5.97,-0.017,-0.2028,0.0185,0.0,-0.0,-0.0,-0.0016,-0.0383,0.0408,8226.01 +138,60,2.04,0.0,6.15,0.1,1.98,0.0,6.58,-0.0155,-0.203,0.0277,0.0,0.0,0.0,0.0016,-0.0162,0.0274,8286.81 +139,60,1.97,0.0,6.35,0.11,1.91,0.0,7.25,-0.0162,-0.2033,0.0312,0.0,-0.0,-0.0,-0.0007,-0.0188,0.0215,8346.01 +140,60,2.17,0.0,6.67,0.08,2.05,0.0,7.19,-0.0144,-0.2035,0.0255,0.0,-0.0,-0.0,0.0018,-0.0377,0.0355,8405.45 +141,60,2.2,0.0,6.25,0.08,2.08,0.0,6.94,-0.0136,-0.2038,0.0298,0.0,-0.0,-0.0,0.0008,-0.0381,0.0338,8462.69 +142,60,2.12,0.0,6.58,0.09,2.01,0.0,7.23,-0.0139,-0.204,0.0283,0.0,0.0,0.0,-0.0003,-0.0192,0.0219,8525.4 +143,60,2.07,0.0,6.06,0.08,1.92,0.0,6.64,-0.0142,-0.2041,0.0218,0.0,-0.0,-0.0,-0.0003,-0.0285,0.02,8585.35 +144,60,2.23,0.0,6.45,0.09,2.12,0.0,7.02,-0.0119,-0.2043,0.0246,0.0,0.0,0.0,0.0023,-0.0344,0.0336,8645.55 +145,60,2.3,0.0,6.15,0.09,2.22,0.0,6.61,-0.011,-0.2045,0.0219,0.0,-0.0,-0.0,0.001,-0.0247,0.0216,8706.07 +146,60,2.31,0.0,5.88,0.1,2.23,0.0,6.5,-0.0108,-0.2046,0.0324,0.0,-0.0,-0.0,0.0002,-0.0182,0.0186,8764.55 +147,60,2.47,0.0,6.9,0.18,2.42,0.0,7.91,-0.0091,-0.2047,0.0388,0.0,0.0,0.0,0.0017,-0.0144,0.0188,8827.59 +148,60,2.37,0.0,7.81,0.19,2.3,0.0,9.04,-0.0103,-0.2049,0.0417,0.0,-0.0,-0.0,-0.0012,-0.041,0.0197,8883.57 +149,60,2.36,0.0,7.94,0.19,2.27,0.0,9.12,-0.0104,-0.1899,0.0398,0.0,0.0,0.0,-0.0001,-0.0222,0.0323,8943.93 +150,60,2.11,0.0,6.35,0.2,2.0,0.0,6.89,-0.0129,-0.1759,0.0255,0.0,0.0,0.0,-0.0024,-0.0317,0.026,9005.1 +151,60,2.08,0.0,6.45,0.2,1.98,0.0,6.8,-0.0129,-0.1624,0.0313,0.0,-0.0,-0.0,-0.0,-0.0423,0.0375,9064.32 +152,60,2.09,0.0,6.35,0.2,1.98,0.0,7.19,-0.0127,-0.1477,0.0317,0.0,-0.0,-0.0,0.0002,-0.0258,0.0183,9124.72 +153,60,2.16,0.0,7.02,0.2,2.02,0.0,7.58,-0.0118,-0.1316,0.0306,0.0,0.0,0.0,0.0009,-0.0193,0.031,9185.13 +154,60,1.88,0.0,6.78,0.19,1.75,0.0,7.64,-0.0141,-0.1167,0.0262,0.0,-0.0,-0.0,-0.0023,-0.0416,0.0149,9246.25 +155,60,1.81,0.0,7.81,0.17,1.68,0.0,8.92,-0.0144,-0.1001,0.0325,0.0,0.0,0.0,-0.0003,-0.0188,0.0167,9303.56 +156,60,1.88,0.0,8.2,0.19,1.74,0.0,9.39,-0.0135,-0.0822,0.031,0.0,0.0,0.0,0.0009,-0.0174,0.0207,9364.35 +157,60,1.78,0.0,7.94,0.17,1.64,0.0,8.95,-0.0141,-0.0512,0.0222,0.0,0.0,0.0,-0.0006,-0.0365,0.0321,9425.16 +158,60,1.76,0.0,7.41,0.16,1.65,0.0,8.12,-0.014,-0.0516,0.0191,0.0,0.0,0.0,0.0001,-0.0172,0.0232,9484.78 +159,60,1.75,0.0,7.84,0.15,1.65,0.0,8.55,-0.014,-0.052,0.0237,0.0,0.0,0.0,-0.0,-0.0364,0.022,9544.06 +160,60,1.85,0.0,7.84,0.14,1.78,0.0,8.52,-0.013,-0.0523,0.0183,0.0,0.0,0.0,0.001,-0.0321,0.028,9605.65 +161,60,1.8,0.0,6.25,0.14,1.71,0.0,6.38,-0.0139,-0.054,0.0153,0.0,0.0,0.0,-0.0008,-0.0405,0.0223,9665.62 +162,60,1.77,0.0,6.12,0.04,1.67,0.0,6.15,-0.0143,-0.056,0.0262,0.0,0.0,0.0,-0.0004,-0.0207,0.0182,9724.93 +163,60,1.83,0.0,7.04,0.04,1.73,0.0,7.92,-0.0137,-0.0539,0.0367,0.0,0.0,0.0,0.0006,-0.0305,0.0211,9782.33 +164,60,2.0,0.0,7.14,0.04,1.89,0.0,8.04,-0.0118,-0.0551,0.0315,0.0,0.0,0.0,0.0018,-0.0153,0.0203,9845.81 +165,60,2.1,0.0,7.14,0.04,1.98,0.0,7.91,-0.0106,-0.0562,0.0252,0.0,-0.0,-0.0,0.0012,-0.0239,0.0191,9903.97 +166,60,2.06,0.0,6.06,0.04,1.95,0.0,6.21,-0.0108,-0.0572,0.0226,0.0,-0.0,-0.0,-0.0002,-0.0214,0.0214,9964.1 +167,60,2.08,0.0,7.69,0.05,2.01,0.0,8.28,-0.0104,-0.0582,0.0283,0.0,0.0,0.0,0.0004,-0.02,0.0226,10024.81 +168,60,2.21,0.0,10.53,0.05,2.17,0.0,12.12,-0.0092,-0.059,0.0608,0.0,0.0,0.0,0.0012,-0.0185,0.0325,10088.03 +169,60,2.24,0.0,10.53,0.06,2.21,0.0,12.42,-0.0092,-0.0598,0.0531,0.0,-0.0,-0.0,0.0,-0.0227,0.0344,10147.74 +170,60,2.19,0.0,10.34,0.06,2.18,0.0,12.0,-0.0101,-0.0606,0.0408,0.0,-0.0,-0.0,-0.0009,-0.033,0.0184,10207.8 +171,60,2.13,0.0,9.38,0.07,2.06,0.0,10.46,-0.0112,-0.0612,0.0246,0.0,0.0,0.0,-0.0011,-0.0227,0.0184,10265.45 +172,60,2.11,0.0,7.25,0.08,2.02,0.0,7.37,-0.0115,-0.0619,0.0279,0.0,0.0,0.0,-0.0003,-0.0293,0.0225,10326.8 +173,60,2.01,0.0,6.45,0.08,1.86,0.0,7.25,-0.0126,-0.0624,0.0234,0.0,0.0,0.0,-0.001,-0.0245,0.0204,10385.66 +174,60,1.95,0.0,6.06,0.08,1.75,0.0,6.64,-0.0127,-0.063,0.0149,0.0,-0.0,-0.0,-0.0001,-0.0218,0.0185,10445.25 +175,60,1.96,0.0,6.56,0.09,1.79,0.0,7.16,-0.0118,-0.0635,0.0167,0.0,0.0,0.0,0.0009,-0.0197,0.0234,10506.21 +176,60,1.97,0.0,5.36,0.1,1.83,0.0,5.58,-0.0112,-0.0639,0.0169,0.0,-0.0,-0.0,0.0006,-0.021,0.0184,10564.5 +177,60,1.88,0.0,5.26,0.1,1.72,0.0,5.35,-0.0118,-0.0643,0.0156,0.0,-0.0,-0.0,-0.0006,-0.0281,0.0185,10624.87 +178,60,1.83,0.0,5.8,0.11,1.64,0.0,6.33,-0.0119,-0.0647,0.031,0.0,-0.0,-0.0,-0.0001,-0.0235,0.0356,10683.45 +179,60,1.72,0.0,5.97,0.11,1.53,0.0,6.64,-0.0122,-0.0651,0.0284,0.0,0.0,0.0,-0.0004,-0.0291,0.0214,10742.08 +180,60,1.83,0.0,7.94,0.4,1.68,0.0,9.05,-0.0105,-0.0654,0.0437,0.0,0.0,0.0,0.0017,-0.0204,0.0202,10804.78 +181,60,1.77,0.0,7.46,0.28,1.66,0.0,8.46,-0.0107,-0.0657,0.0315,0.0,-0.0,-0.0,-0.0002,-0.021,0.023,10867.13 +182,60,1.91,0.0,6.76,0.34,1.8,0.0,7.35,-0.0094,-0.0576,0.0271,0.0,0.0,0.0,0.0014,-0.0176,0.0403,10927.26 +183,60,2.02,0.0,6.06,0.36,1.9,0.0,6.63,-0.0082,-0.0608,0.0204,0.0,-0.0,-0.0,0.0011,-0.0175,0.0272,10982.99 +184,60,1.99,0.0,7.04,0.29,1.89,0.0,7.77,-0.0085,-0.0636,0.0265,0.0,0.0,0.0,-0.0002,-0.0285,0.036,11045.17 +185,60,2.05,0.0,7.46,0.26,2.0,0.0,8.28,-0.0078,-0.0663,0.0287,0.0,0.0,0.0,0.0006,-0.0196,0.0383,11106.37 +186,60,2.08,0.0,7.81,0.24,2.06,0.0,8.66,-0.0079,-0.0687,0.0382,0.0,0.0,0.0,-0.0001,-0.0198,0.0277,11165.93 +187,60,2.15,0.0,7.69,0.39,2.1,0.0,8.42,-0.0079,-0.0499,0.0359,0.0,0.0,0.0,0.0,-0.0205,0.0188,11227.33 +188,60,2.23,0.0,7.69,0.4,2.15,0.0,8.31,-0.0074,-0.0487,0.0271,0.0,-0.0,-0.0,0.0005,-0.0218,0.0172,11284.52 +189,60,2.33,0.0,7.79,0.25,2.27,0.0,8.58,-0.0065,-0.0502,0.032,0.0,0.0,0.0,0.001,-0.0202,0.0288,11344.76 +190,60,2.4,0.0,9.09,0.26,2.35,0.0,10.2,-0.006,-0.0515,0.0335,0.0,-0.0,-0.0,0.0005,-0.02,0.0239,11404.73 +191,60,2.41,0.0,10.26,0.26,2.39,0.0,11.78,-0.0061,-0.0527,0.0411,0.0,-0.0,-0.0,-0.0001,-0.0188,0.0284,11465.32 +192,60,2.39,0.0,10.13,0.42,2.35,0.0,11.63,-0.0068,-0.0376,0.0383,0.0,-0.0,-0.0,-0.0007,-0.0202,0.0168,11525.36 +193,60,2.41,0.0,10.96,0.26,2.35,0.0,12.59,-0.007,-0.0336,0.0355,0.0,-0.0,-0.0,-0.0002,-0.0335,0.0192,11587.05 +194,60,2.42,0.0,10.45,0.27,2.35,0.0,11.88,-0.0071,-0.0367,0.0255,0.0,0.0,0.0,-0.0001,-0.0261,0.0287,11644.3 +195,60,2.39,0.0,8.96,0.27,2.3,0.0,9.68,-0.0075,-0.0395,0.0344,0.0,-0.0,-0.0,-0.0004,-0.0339,0.0263,11704.85 +196,60,2.41,0.0,7.58,0.28,2.35,0.0,8.15,-0.0072,-0.0421,0.0428,0.0,0.0,0.0,0.0003,-0.0267,0.0314,11764.65 +197,60,2.42,0.0,9.23,0.28,2.36,0.0,9.62,-0.0073,-0.0445,0.0292,0.0,-0.0,-0.0,-0.0001,-0.0182,0.0249,11825.33 +198,60,2.33,0.0,8.33,0.28,2.28,0.0,8.62,-0.0084,-0.0467,0.0326,0.0,0.0,0.0,-0.0012,-0.0231,0.0192,11887.46 +199,60,2.27,0.0,9.09,0.46,2.18,0.0,10.38,-0.0094,-0.0487,0.0352,0.0,0.0,0.0,-0.001,-0.0354,0.0147,11945.94 +200,60,2.11,0.0,7.32,0.46,1.97,0.0,8.08,-0.0112,-0.0506,0.0219,0.0,-0.0,-0.0,-0.0017,-0.025,0.0169,12008.71 +201,60,2.05,0.0,6.67,0.22,1.85,0.0,6.99,-0.0115,-0.0523,0.009,0.0,-0.0,-0.0,-0.0003,-0.0414,0.0214,12064.72 +202,60,1.92,0.0,6.56,0.18,1.75,0.0,6.9,-0.0122,-0.0657,0.0156,0.0,-0.0,-0.0,-0.0007,-0.0262,0.0183,12123.18 +203,60,1.85,0.0,5.08,0.48,1.67,0.0,5.79,-0.0125,-0.0553,0.0278,0.0,0.0,0.0,-0.0003,-0.0205,0.0177,12183.29 +204,60,1.85,0.0,7.04,0.24,1.7,0.0,7.41,-0.012,-0.0567,0.0233,0.0,0.0,0.0,0.0005,-0.0292,0.0253,12244.68 +205,60,1.82,0.0,7.14,0.49,1.72,0.0,8.31,-0.0121,-0.0646,0.0403,0.0,0.0,0.0,-0.0001,-0.0474,0.0216,12306.57 +206,60,1.79,0.0,7.14,0.49,1.7,0.0,8.18,-0.0126,-0.0664,0.0326,0.0,-0.0,-0.0,-0.0006,-0.0272,0.018,12365.44 +207,60,1.92,0.0,7.41,0.5,1.82,0.0,8.53,-0.0116,-0.0681,0.03,0.0,-0.0,-0.0,0.001,-0.0248,0.0346,12423.28 +208,60,2.11,0.0,7.41,0.51,2.04,0.0,8.43,-0.0099,-0.0697,0.0395,0.0,-0.0,-0.0,0.0017,-0.0204,0.0312,12483.78 +209,60,2.23,0.0,8.47,0.52,2.19,0.0,9.69,-0.009,-0.0712,0.0491,0.0,0.0,0.0,0.0009,-0.0221,0.0177,12544.77 +210,60,2.49,0.0,11.67,0.17,2.47,0.0,13.9,-0.0069,-0.0725,0.0606,0.0,-0.0,-0.0,0.0021,-0.0283,0.0314,12606.07 +211,60,2.62,0.0,10.91,0.17,2.62,0.0,13.2,-0.0061,-0.0737,0.0447,0.0,0.0,0.0,0.0008,-0.0294,0.0342,12666.64 +212,60,2.78,0.0,11.11,0.17,2.8,0.0,13.21,-0.0051,-0.0749,0.0441,0.0,0.0,0.0,0.001,-0.0172,0.0359,12726.25 +213,60,2.9,0.0,9.84,0.18,2.92,0.0,11.05,-0.0047,-0.0759,0.0486,0.0,-0.0,-0.0,0.0005,-0.0266,0.0293,12785.87 +214,60,2.99,0.0,9.43,0.18,2.96,0.0,10.42,-0.0046,-0.0769,0.0301,0.0,0.0,0.0,0.0001,-0.0315,0.0326,12844.55 +215,60,3.01,0.0,7.27,0.19,2.98,0.0,7.48,-0.0048,-0.0778,0.0263,0.0,0.0,0.0,-0.0003,-0.0255,0.0218,12904.95 +216,60,2.99,0.0,7.94,0.6,3.0,0.0,8.4,-0.0055,-0.0786,0.0514,0.0,0.0,0.0,-0.0006,-0.0196,0.0492,12965.39 +217,60,2.99,0.0,9.38,0.61,2.99,0.0,10.25,-0.0062,-0.0793,0.0452,0.0,0.0,0.0,-0.0007,-0.0281,0.0247,13025.85 +218,60,2.9,0.0,8.82,0.62,2.88,0.0,10.3,-0.0077,-0.08,0.0484,0.0,0.0,0.0,-0.0015,-0.0211,0.0192,13087.69 +219,60,2.83,0.0,8.82,0.62,2.74,0.0,10.23,-0.009,-0.0807,0.0398,0.0,-0.0,-0.0,-0.0013,-0.0339,0.0259,13146.83 +220,60,2.74,0.0,8.57,0.62,2.61,0.0,9.72,-0.01,-0.0813,0.0339,0.0,0.0,0.0,-0.001,-0.0498,0.0312,13205.44 +221,60,2.81,0.0,8.57,0.57,2.7,0.0,9.53,-0.009,-0.0818,0.0271,0.0,0.0,0.0,0.001,-0.0332,0.0261,13264.62 +222,60,2.63,0.0,8.57,0.53,2.52,0.0,9.4,-0.0107,-0.0823,0.0415,0.0,0.0,0.0,-0.0017,-0.0347,0.0209,13323.46 +223,60,2.57,0.0,7.35,0.49,2.44,0.0,8.12,-0.0113,-0.0828,0.0368,0.0,0.0,0.0,-0.0006,-0.0293,0.0206,13384.1 +224,60,2.52,0.0,7.55,0.45,2.37,0.0,8.66,-0.0117,-0.0832,0.0351,0.0,0.0,0.0,-0.0004,-0.0385,0.0333,13444.74 +225,60,2.48,0.0,7.55,0.42,2.3,0.0,8.4,-0.0119,-0.0836,0.0245,0.0,0.0,0.0,-0.0002,-0.0269,0.0235,13503.82 +226,60,2.52,0.0,10.0,0.25,2.38,0.0,11.62,-0.0109,-0.084,0.0499,0.0,-0.0,-0.0,0.001,-0.0327,0.0416,13560.05 +227,60,2.38,0.0,8.47,0.26,2.23,0.0,9.34,-0.0121,-0.0764,0.0314,0.0,0.0,0.0,-0.0012,-0.0438,0.02,13624.74 +228,60,2.24,0.0,7.94,0.27,2.1,0.0,8.71,-0.0133,-0.0797,0.0279,0.0,-0.0,-0.0,-0.0012,-0.0229,0.0193,13682.44 +229,60,2.23,0.0,6.52,0.28,2.06,0.0,6.95,-0.0134,-0.0827,0.0239,0.0,-0.0,-0.0,-0.0001,-0.0328,0.0329,13745.55 +230,60,2.03,0.0,6.25,0.28,1.81,0.0,6.49,-0.0151,-0.0855,0.0161,0.0,0.0,0.0,-0.0017,-0.0365,0.0194,13802.27 +231,60,2.03,0.0,6.67,0.29,1.83,0.0,6.92,-0.0145,-0.088,0.029,0.0,-0.0,-0.0,0.0006,-0.0235,0.0272,13865.39 +232,60,2.19,0.0,8.51,0.29,2.03,0.0,9.63,-0.0124,-0.0904,0.0413,0.0,0.0,0.0,0.0021,-0.023,0.0451,13925.67 +233,60,2.22,0.0,7.84,0.3,2.11,0.0,9.1,-0.0118,-0.0925,0.0301,0.0,-0.0,-0.0,0.0006,-0.0212,0.042,13983.38 +234,60,2.24,0.0,8.0,0.3,2.1,0.0,9.12,-0.0119,-0.0945,0.0379,0.0,0.0,0.0,-0.0001,-0.0299,0.0471,14044.49 +235,60,2.18,0.0,7.14,0.3,2.0,0.0,7.89,-0.0125,-0.0964,0.0298,0.0,-0.0,-0.0,-0.0006,-0.0218,0.0344,14105.07 +236,60,2.14,0.0,7.02,0.3,1.96,0.0,7.56,-0.0125,-0.0981,0.0205,0.0,0.0,0.0,-0.0,-0.0312,0.0212,14163.4 +237,60,2.21,0.0,5.63,0.31,2.0,0.0,6.01,-0.0115,-0.0997,0.02,0.0,-0.0,-0.0,0.001,-0.0214,0.0219,14227.1 +238,60,2.27,0.0,7.69,0.31,2.07,0.0,8.7,-0.0104,-0.1011,0.042,0.0,0.0,0.0,0.0012,-0.0198,0.0318,14284.42 +239,60,2.13,0.0,7.27,0.15,1.91,0.0,8.33,-0.0113,-0.0862,0.0319,0.0,0.0,0.0,-0.0009,-0.022,0.0152,14345.39 +240,60,2.19,0.0,6.9,0.31,2.02,0.0,7.67,-0.01,-0.0707,0.03,0.0,-0.0,-0.0,0.0012,-0.0183,0.0381,14405.69 +241,60,2.42,0.0,7.84,0.32,2.3,0.0,8.95,-0.0074,-0.0695,0.0375,0.0,0.0,0.0,0.0026,-0.0201,0.0198,14464.09 +242,60,2.45,0.0,8.33,0.32,2.32,0.0,9.68,-0.0072,-0.0724,0.0523,0.0,-0.0,-0.0,0.0002,-0.0335,0.0407,14522.4 +243,60,2.45,0.0,7.25,0.32,2.38,0.0,8.18,-0.0073,-0.0751,0.0403,0.0,0.0,0.0,-0.0,-0.0312,0.0394,14585.14 +244,60,2.52,0.0,7.35,0.32,2.53,0.0,8.42,-0.0071,-0.0776,0.0356,0.0,-0.0,-0.0,0.0002,-0.0503,0.0388,14643.34 +245,60,2.69,0.0,8.47,0.33,2.68,0.0,9.55,-0.0066,-0.0629,0.0507,0.0,-0.0,-0.0,0.0005,-0.0346,0.0224,14703.94 +246,60,2.66,0.0,8.33,0.33,2.61,0.0,9.41,-0.0079,-0.0561,0.0275,0.0,-0.0,-0.0,-0.0013,-0.0296,0.0161,14763.37 +247,60,2.71,0.0,8.62,0.33,2.61,0.0,9.64,-0.0079,-0.0545,0.0291,0.0,0.0,0.0,-0.0,-0.0248,0.0203,14823.64 +248,60,2.73,0.0,7.94,0.33,2.6,0.0,8.9,-0.0078,-0.0557,0.0258,0.0,0.0,0.0,0.0001,-0.0294,0.0229,14884.04 +249,60,2.93,0.0,8.47,0.33,2.85,0.0,9.66,-0.0056,-0.0567,0.0332,0.0,-0.0,-0.0,0.0022,-0.0244,0.0228,14943.77 +250,60,2.84,0.0,9.43,0.31,2.75,0.0,10.86,-0.0068,-0.0578,0.0332,0.0,-0.0,-0.0,-0.0012,-0.0387,0.0202,15002.87 +251,60,2.85,0.0,9.62,0.28,2.78,0.0,11.08,-0.0069,-0.0587,0.0384,0.0,0.0,0.0,-0.0001,-0.0255,0.0245,15066.66 +252,60,2.73,0.0,8.33,0.26,2.64,0.0,9.7,-0.0086,-0.0596,0.0514,0.0,0.0,0.0,-0.0017,-0.0426,0.0311,15123.12 +253,60,2.66,0.0,8.33,0.26,2.53,0.0,9.71,-0.0096,-0.0603,0.0429,0.0,0.0,0.0,-0.001,-0.0337,0.0196,15183.36 +254,60,2.63,0.0,8.62,0.27,2.46,0.0,9.43,-0.01,-0.0611,0.0515,0.0,-0.0,-0.0,-0.0003,-0.0382,0.0239,15243.57 +255,60,2.69,0.0,8.77,0.27,2.56,0.0,9.72,-0.009,-0.0617,0.0472,0.0,0.0,0.0,0.001,-0.0182,0.0259,15306.06 +256,60,2.91,0.0,9.62,0.27,2.86,0.0,10.95,-0.0066,-0.0624,0.0491,0.0,0.0,0.0,0.0024,-0.0259,0.0402,15365.2 +257,60,2.99,0.0,9.43,0.28,2.89,0.0,10.45,-0.0064,-0.0629,0.0433,0.0,-0.0,-0.0,0.0003,-0.0316,0.0343,15425.79 +258,60,2.89,0.0,7.94,0.29,2.81,0.0,9.03,-0.0075,-0.0635,0.0293,0.0,0.0,0.0,-0.0012,-0.0271,0.028,15484.72 +259,60,2.92,0.0,8.7,0.3,2.83,0.0,9.84,-0.0076,-0.064,0.038,0.0,-0.0,-0.0,-0.0001,-0.021,0.0229,15545.32 +260,60,3.02,0.0,10.71,0.3,2.95,0.0,12.48,-0.0069,-0.0644,0.0499,0.0,0.0,0.0,0.0008,-0.0191,0.0287,15603.99 +261,60,3.01,0.0,10.34,0.31,2.95,0.0,12.11,-0.0073,-0.0632,0.0392,0.0,0.0,0.0,-0.0005,-0.029,0.0405,15665.53 +262,60,3.12,0.0,10.71,0.32,3.08,0.0,12.41,-0.0067,-0.0644,0.0378,0.0,-0.0,-0.0,0.0007,-0.0418,0.0355,15725.2 +263,60,3.33,0.0,9.62,0.33,3.29,0.0,10.8,-0.0052,-0.0619,0.033,0.0,0.0,0.0,0.0015,-0.0302,0.0229,15784.92 +264,60,3.36,0.0,9.72,0.33,3.3,0.0,11.11,-0.0054,-0.0643,0.0435,0.0,-0.0,-0.0,-0.0002,-0.0232,0.0294,15843.84 +265,60,3.24,0.0,9.21,0.34,3.17,0.0,10.48,-0.0071,-0.0677,0.0332,0.0,0.0,0.0,-0.0016,-0.022,0.031,15905.49 +266,60,3.08,0.0,8.45,0.35,2.92,0.0,9.26,-0.0092,-0.0632,0.0396,0.0,0.0,0.0,-0.0021,-0.0533,0.0226,15965.74 +267,60,2.99,0.0,8.45,0.36,2.8,0.0,9.06,-0.0098,-0.0625,0.0295,0.0,-0.0,-0.0,-0.0006,-0.0381,0.0262,16025.84 +268,60,3.0,0.0,8.0,0.37,2.82,0.0,9.07,-0.0093,-0.0636,0.0276,0.0,-0.0,-0.0,0.0006,-0.0463,0.034,16083.9 +269,60,3.03,0.0,9.33,0.15,2.87,0.0,10.72,-0.0087,-0.0646,0.0367,0.0,0.0,0.0,0.0006,-0.0244,0.0406,16142.5 +270,60,3.04,0.0,9.86,0.14,2.9,0.0,11.43,-0.0084,-0.0655,0.0365,0.0,0.0,0.0,0.0002,-0.0404,0.0224,16204.63 +271,60,2.89,0.0,9.09,0.13,2.71,0.0,10.32,-0.01,-0.0664,0.0305,0.0,0.0,0.0,-0.0015,-0.0532,0.02,16264.31 +272,60,2.77,0.0,9.33,0.4,2.58,0.0,10.41,-0.011,-0.0672,0.0288,0.0,-0.0,-0.0,-0.001,-0.0326,0.0269,16327.89 +273,60,2.5,0.0,8.62,0.41,2.25,0.0,9.69,-0.0136,-0.0656,0.0416,0.0,-0.0,-0.0,-0.0026,-0.0289,0.0308,16383.04 +274,60,2.39,0.0,9.26,0.41,2.17,0.0,10.74,-0.0141,-0.0669,0.0434,0.0,0.0,0.0,-0.0005,-0.0413,0.0232,16443.07 +275,60,2.41,0.0,7.41,0.42,2.18,0.0,8.2,-0.0136,-0.0681,0.0347,0.0,0.0,0.0,0.0004,-0.0284,0.0335,16504.94 +276,60,2.61,0.0,7.84,0.11,2.39,0.0,8.48,-0.0112,-0.0596,0.0277,0.0,-0.0,-0.0,0.0024,-0.0219,0.0235,16566.25 +277,60,2.63,0.0,10.87,0.43,2.36,0.0,12.45,-0.0107,-0.0479,0.0568,0.0,0.0,0.0,0.0005,-0.021,0.0463,16626.67 +278,60,2.67,0.0,7.84,0.43,2.46,0.0,8.67,-0.0094,-0.0468,0.0417,0.0,0.0,0.0,0.0013,-0.0453,0.0325,16684.34 +279,60,2.74,0.0,8.0,0.44,2.56,0.0,8.94,-0.0083,-0.0496,0.037,0.0,-0.0,-0.0,0.001,-0.04,0.0411,16742.77 +280,60,2.71,0.0,10.0,0.45,2.52,0.0,11.17,-0.0086,-0.0427,0.0631,0.0,0.0,0.0,-0.0003,-0.0214,0.0608,16803.9 +281,60,2.91,0.0,9.8,0.13,2.73,0.0,10.99,-0.0065,-0.0435,0.0511,0.0,0.0,0.0,0.0021,-0.0257,0.0266,16861.1 +282,60,3.07,0.0,10.0,0.14,2.94,0.0,11.32,-0.0047,-0.0446,0.048,0.0,-0.0,-0.0,0.0018,-0.0242,0.0364,16926.63 +283,60,3.1,0.0,9.8,0.15,3.0,0.0,10.92,-0.0045,-0.0462,0.0518,0.0,-0.0,-0.0,0.0002,-0.0398,0.0377,16983.95 +284,60,3.23,0.0,9.68,0.16,3.11,0.0,10.64,-0.0037,-0.045,0.054,0.0,0.0,0.0,0.0008,-0.0286,0.0291,17043.11 +285,60,3.21,0.0,9.38,0.16,3.06,0.0,10.19,-0.0042,-0.0433,0.0311,0.0,-0.0,-0.0,-0.0005,-0.0311,0.0389,17104.02 +286,60,2.96,0.0,8.06,0.17,2.79,0.0,8.55,-0.0068,-0.0443,0.0205,0.0,0.0,0.0,-0.0026,-0.0258,0.0384,17166.55 +287,60,3.0,0.0,8.62,0.18,2.84,0.0,8.82,-0.0065,-0.0484,0.0281,0.0,-0.0,-0.0,0.0003,-0.0426,0.0272,17223.49 +288,60,2.86,0.0,7.84,0.18,2.68,0.0,7.85,-0.0081,-0.0564,0.0314,0.0,-0.0,-0.0,-0.0016,-0.0275,0.0197,17284.44 +289,60,2.71,0.0,8.33,0.19,2.51,0.0,9.41,-0.0097,-0.0469,0.0463,0.0,0.0,0.0,-0.0016,-0.0368,0.0216,17343.24 +290,60,2.78,0.0,10.0,0.19,2.58,0.0,11.62,-0.009,-0.0631,0.057,0.0,-0.0,-0.0,0.0007,-0.0549,0.0546,17403.6 +291,60,2.61,0.0,8.06,0.2,2.4,0.0,9.04,-0.0108,-0.0468,0.026,0.0,0.0,0.0,-0.0017,-0.031,0.0324,17464.37 +292,60,2.41,0.0,8.62,0.2,2.19,0.0,9.41,-0.0128,-0.0502,0.0309,0.0,-0.0,-0.0,-0.0021,-0.0333,0.0295,17524.68 +293,60,2.21,0.0,8.06,0.21,2.01,0.0,8.6,-0.0148,-0.0641,0.0255,0.0,0.0,0.0,-0.002,-0.0543,0.0382,17583.84 +294,60,2.22,0.0,6.25,0.21,2.02,0.0,6.62,-0.0149,-0.0664,0.0353,0.0,-0.0,-0.0,-0.0001,-0.0374,0.0382,17642.71 +295,60,2.2,0.0,7.25,0.22,1.97,0.0,7.63,-0.0154,-0.0686,0.0441,0.0,0.0,0.0,-0.0005,-0.0297,0.0455,17705.85 +296,60,2.2,0.0,7.14,0.22,2.0,0.0,8.34,-0.0153,-0.0705,0.047,0.0,-0.0,-0.0,0.0001,-0.0424,0.0259,17762.13 +297,60,2.18,0.0,6.76,0.22,1.96,0.0,7.86,-0.0156,-0.0723,0.0352,0.0,0.0,0.0,-0.0004,-0.0278,0.0303,17823.52 +298,60,2.29,0.0,7.04,0.23,2.04,0.0,8.04,-0.0145,-0.0633,0.0308,0.0,-0.0,-0.0,0.0012,-0.0198,0.0381,17883.36 +299,60,2.52,0.0,7.14,0.23,2.31,0.0,8.05,-0.0117,-0.0662,0.0257,0.0,-0.0,-0.0,0.0027,-0.0283,0.0365,17944.26 +300,60,2.63,0.0,7.69,0.23,2.44,0.0,8.56,-0.0105,-0.069,0.0365,0.0,0.0,0.0,0.0012,-0.049,0.0243,18003.96 +301,60,2.69,0.0,9.52,0.21,2.5,0.0,10.96,-0.0099,-0.0715,0.048,0.0,-0.0,-0.0,0.0007,-0.0268,0.0518,18062.98 +302,60,2.85,0.0,8.33,0.2,2.66,0.0,9.3,-0.0082,-0.0738,0.0335,0.0,0.0,0.0,0.0017,-0.0381,0.0216,18125.03 +303,60,2.89,0.0,7.81,0.2,2.67,0.0,8.68,-0.0076,-0.076,0.0533,0.0,0.0,0.0,0.0005,-0.0338,0.0436,18185.26 +304,60,2.91,0.0,8.2,0.2,2.72,0.0,9.43,-0.0071,-0.078,0.0507,0.0,-0.0,-0.0,0.0006,-0.0263,0.0208,18241.67 +305,60,3.01,0.0,8.47,0.2,2.85,0.0,9.57,-0.006,-0.0798,0.0438,0.0,0.0,0.0,0.0011,-0.0536,0.0329,18301.87 +306,60,3.14,0.0,8.77,0.2,3.07,0.0,9.88,-0.0047,-0.0815,0.0411,0.0,-0.0,-0.0,0.0013,-0.0191,0.0374,18365.39 +307,60,3.09,0.0,10.34,0.21,3.04,0.0,11.92,-0.006,-0.083,0.0467,0.0,0.0,0.0,-0.0013,-0.0303,0.0198,18424.32 +308,60,3.13,0.0,8.77,0.21,3.01,0.0,9.9,-0.0068,-0.0845,0.05,0.0,0.0,0.0,-0.0007,-0.0271,0.0241,18481.58 +309,60,3.24,0.0,10.34,0.22,3.08,0.0,11.7,-0.0062,-0.0858,0.0551,0.0,-0.0,-0.0,0.0006,-0.0315,0.0249,18544.36 +310,60,3.42,0.0,10.17,0.22,3.29,0.0,11.55,-0.0044,-0.087,0.0492,0.0,-0.0,-0.0,0.0018,-0.0226,0.0379,18601.73 +311,60,3.53,0.0,10.94,0.23,3.41,0.0,12.46,-0.0034,-0.0597,0.0527,0.0,0.0,0.0,0.0009,-0.0487,0.0371,18661.87 +312,60,3.62,0.0,11.29,0.24,3.53,0.0,12.89,-0.0028,-0.0494,0.0476,0.0,-0.0,-0.0,0.0006,-0.0282,0.0345,18724.67 +313,60,3.52,0.0,12.31,0.24,3.39,0.0,14.14,-0.0043,-0.0524,0.05,0.0,-0.0,-0.0,-0.0015,-0.0412,0.0165,18786.37 +314,60,3.35,0.0,10.29,0.25,3.21,0.0,11.36,-0.0063,-0.0497,0.0342,0.0,0.0,0.0,-0.002,-0.0351,0.0299,18845.93 +315,60,3.29,0.0,9.46,0.26,3.14,0.0,9.77,-0.0071,-0.052,0.0352,0.0,-0.0,-0.0,-0.0009,-0.0314,0.0246,18904.57 +316,60,3.3,0.0,10.0,0.26,3.09,0.0,10.33,-0.0073,-0.0507,0.0333,0.0,0.0,0.0,-0.0002,-0.0427,0.0283,18965.89 +317,60,3.55,0.0,9.52,0.27,3.4,0.0,10.55,-0.0044,-0.0512,0.0472,0.0,0.0,0.0,0.0029,-0.0265,0.025,19024.66 +318,60,3.64,0.0,11.76,0.28,3.47,0.0,12.36,-0.0037,-0.0517,0.0302,0.0,-0.0,-0.0,0.0006,-0.0246,0.0455,19085.1 +319,60,3.63,0.0,11.76,0.29,3.45,0.0,12.93,-0.0039,-0.0479,0.0329,0.0,0.0,0.0,-0.0001,-0.0315,0.0294,19145.48 +320,60,3.44,0.0,10.29,0.3,3.22,0.0,10.9,-0.0058,-0.0486,0.0302,0.0,-0.0,-0.0,-0.002,-0.0382,0.0215,19201.24 +321,60,3.29,0.0,8.57,0.31,3.03,0.0,9.0,-0.0072,-0.0411,0.0347,0.0,-0.0,-0.0,-0.0014,-0.0336,0.0175,19262.09 +322,60,3.21,0.0,8.45,0.31,2.98,0.0,8.27,-0.0076,-0.0425,0.0378,0.0,0.0,0.0,-0.0004,-0.0325,0.0357,19321.24 +323,60,3.29,0.0,8.33,0.32,3.07,0.0,9.12,-0.0065,-0.0437,0.0297,0.0,-0.0,-0.0,0.001,-0.0372,0.0219,19385.68 +324,60,3.59,0.0,8.7,0.33,3.49,0.0,9.67,-0.0032,-0.0567,0.0319,0.0,0.0,0.0,0.0033,-0.0447,0.0392,19445.18 +325,59,3.76,0.0,10.0,0.34,3.67,0.0,10.84,-0.002,-0.0593,0.0499,0.0,-0.0,-0.0,0.001,-0.0247,0.0241,19503.25 +326,60,3.59,0.0,9.84,0.46,3.44,0.0,11.55,-0.0048,-0.0617,0.051,0.0,-0.0,-0.0,-0.0026,-0.0404,0.0332,19563.23 +327,60,3.48,0.0,10.17,0.46,3.23,0.0,11.92,-0.0065,-0.0471,0.0456,0.0,0.0,0.0,-0.0016,-0.0283,0.0298,19623.25 +328,60,3.4,0.0,8.62,0.47,3.14,0.0,9.69,-0.007,-0.0834,0.0308,0.0,-0.0,-0.0,-0.0006,-0.0681,0.0475,19683.62 +329,56,3.18,0.0,8.0,0.47,2.88,0.0,8.81,-0.0089,-0.0742,0.0402,0.0,0.0,0.0,-0.0015,-0.0368,0.0303,19745.28 +330,54,3.41,0.0,8.57,0.12,3.15,0.0,9.14,-0.0066,-0.0647,0.0333,0.0,0.0,0.0,0.0018,-0.0197,0.0257,19802.71 +331,60,3.45,0.0,8.96,0.6,3.16,0.0,9.57,-0.0052,-0.0541,0.0328,0.0,0.0,0.0,0.0016,-0.0287,0.03,19863.06 +332,58,3.63,0.0,10.0,0.48,3.39,0.0,10.59,-0.0029,-0.0562,0.0363,0.0,-0.0,-0.0,0.0019,-0.0438,0.0422,19925.57 +333,52,3.45,0.0,10.53,0.61,3.2,0.0,11.72,-0.0038,-0.0476,0.0345,0.0,-0.0,-0.0,-0.0004,-0.027,0.0322,19980.68 +334,56,3.65,0.0,9.68,0.21,3.45,0.0,11.0,-0.0028,-0.0436,0.0453,0.0,-0.0,-0.0,0.0007,-0.0257,0.0241,20045.89 +335,57,3.24,0.0,10.61,0.29,3.05,0.0,12.49,-0.007,-0.0489,0.0612,0.0,0.0,0.0,-0.0036,-0.0387,0.0169,20104.24 +336,60,3.29,0.0,10.0,0.28,3.07,0.0,11.75,-0.0066,-0.0561,0.0449,0.0,-0.0,-0.0,-0.0001,-0.0438,0.0272,20159.26 +337,59,3.54,0.0,9.86,0.29,3.28,0.0,11.28,-0.0046,-0.0627,0.0708,0.0,0.0,0.0,0.0019,-0.0246,0.0661,20225.48 +338,60,3.46,0.0,11.59,0.56,3.27,0.0,13.41,-0.0048,-0.0687,0.0623,0.0,-0.0,-0.0,-0.0001,-0.0372,0.027,20282.36 +339,60,3.55,0.0,12.68,0.52,3.39,0.0,14.98,-0.0042,-0.0744,0.0551,0.0,0.0,0.0,0.0006,-0.0316,0.0387,20343.41 +340,60,3.75,0.0,12.5,0.52,3.61,0.0,14.77,-0.0027,-0.0795,0.0589,0.0,0.0,0.0,0.0015,-0.0231,0.0698,20403.53 +341,60,3.69,0.0,11.29,0.52,3.56,0.0,13.47,-0.004,-0.0843,0.0592,0.0,-0.0,-0.0,-0.0013,-0.0424,0.0245,20464.21 +342,60,3.61,0.0,12.73,0.53,3.5,0.0,15.35,-0.0056,-0.0887,0.065,0.0,0.0,0.0,-0.0016,-0.0283,0.0208,20525.72 +343,60,3.7,0.0,13.46,0.53,3.55,0.0,16.38,-0.0057,-0.0928,0.0632,0.0,-0.0,-0.0,-0.0001,-0.0226,0.0286,20583.78 +344,60,3.8,0.0,12.5,0.16,3.66,0.0,14.95,-0.0052,-0.0808,0.0578,0.0,0.0,0.0,0.0006,-0.0224,0.0472,20642.3 +345,59,3.82,0.0,12.0,0.17,3.67,0.0,13.89,-0.0054,-0.0831,0.0614,0.0,0.0,0.0,0.0,-0.032,0.0262,20704.21 +346,58,3.85,0.0,10.96,0.68,3.68,0.0,12.7,-0.006,-0.0852,0.0516,0.0,-0.0,-0.0,-0.0009,-0.0272,0.0352,20762.27 +347,60,3.69,0.0,11.11,0.69,3.52,0.0,12.65,-0.0075,-0.0872,0.0488,0.0,-0.0,-0.0,-0.0015,-0.049,0.0306,20822.83 +348,60,3.64,0.0,9.86,0.7,3.41,0.0,10.78,-0.0086,-0.068,0.039,0.0,0.0,0.0,-0.001,-0.0238,0.0193,20885.36 +349,60,3.51,0.0,10.0,0.7,3.24,0.0,11.38,-0.0099,-0.0713,0.034,0.0,-0.0,-0.0,-0.0014,-0.0385,0.0236,20944.59 +350,60,3.49,0.0,8.89,0.7,3.13,0.0,9.84,-0.01,-0.0743,0.0337,0.0,0.0,0.0,-0.0,-0.0504,0.0324,21002.22 +351,60,3.42,0.0,8.62,0.65,3.13,0.0,9.31,-0.0097,-0.0771,0.028,0.0,0.0,0.0,0.0002,-0.0356,0.0261,21063.98 +352,60,3.38,0.0,9.84,0.6,3.03,0.0,10.88,-0.0101,-0.065,0.0283,0.0,0.0,0.0,-0.0003,-0.0295,0.0289,21121.29 +353,60,3.18,0.0,9.84,0.55,2.82,0.0,10.93,-0.0115,-0.0535,0.0379,0.0,0.0,0.0,-0.0014,-0.0299,0.0326,21182.1 +354,60,3.18,0.0,10.0,0.51,2.85,0.0,11.49,-0.0108,-0.0573,0.0683,0.0,0.0,0.0,0.0007,-0.0345,0.0304,21245.8 +355,60,3.27,0.0,10.71,0.51,2.9,0.0,11.83,-0.0095,-0.0563,0.0467,0.0,0.0,0.0,0.0013,-0.0216,0.0221,21302.67 +356,60,3.31,0.0,9.84,0.51,2.98,0.0,11.14,-0.0083,-0.0531,0.0462,0.0,-0.0,-0.0,0.0012,-0.0355,0.0224,21365.59 +357,60,3.24,0.0,9.38,0.51,2.93,0.0,10.41,-0.0086,-0.0553,0.0368,0.0,0.0,0.0,-0.0003,-0.0267,0.0232,21424.24 +358,60,3.42,0.0,9.09,0.51,3.15,0.0,10.31,-0.0066,-0.0579,0.0492,0.0,-0.0,-0.0,0.002,-0.0195,0.0377,21482.37 +359,60,3.51,0.0,9.38,0.52,3.24,0.0,10.6,-0.0059,-0.0608,0.0434,0.0,-0.0,-0.0,0.0008,-0.0293,0.0372,21544.11 +360,60,3.43,0.0,9.86,0.52,3.15,0.0,11.15,-0.0067,-0.0529,0.0464,0.0,-0.0,-0.0,-0.0008,-0.0356,0.0269,21604.94 +361,60,3.61,0.0,10.45,0.52,3.35,0.0,11.66,-0.0049,-0.0401,0.0461,0.0,0.0,0.0,0.0018,-0.0185,0.0367,21662.8 +362,60,3.76,0.0,10.94,0.53,3.56,0.0,12.61,-0.0033,-0.0432,0.0518,0.0,-0.0,-0.0,0.0016,-0.0378,0.0515,21727.13 +363,60,3.97,0.0,11.11,0.53,3.77,0.0,12.79,-0.0016,-0.0463,0.0441,0.0,-0.0,-0.0,0.0017,-0.0334,0.0352,21783.37 +364,60,3.94,0.0,10.39,0.54,3.79,0.0,11.43,-0.0023,-0.0492,0.0373,0.0,0.0,0.0,-0.0007,-0.0324,0.0227,21844.29 +365,60,4.04,0.0,9.33,0.54,3.81,0.0,10.33,-0.0022,-0.0519,0.0355,0.0,-0.0,-0.0,0.0001,-0.0194,0.0293,21901.27 +366,60,4.05,0.0,11.67,0.54,3.83,0.0,12.89,-0.0023,-0.0544,0.0342,0.0,0.0,0.0,-0.0001,-0.0221,0.0271,21964.16 +367,60,4.15,0.0,11.29,0.55,3.99,0.0,12.71,-0.0014,-0.0566,0.034,0.0,0.0,0.0,0.0008,-0.0259,0.0272,22023.76 +368,60,4.31,0.0,10.71,0.55,4.15,0.0,11.81,-0.0005,-0.0587,0.0424,0.0,-0.0,-0.0,0.0009,-0.0242,0.0264,22086.13 +369,60,4.14,0.0,9.86,0.56,3.9,0.0,10.55,-0.0031,-0.0607,0.0366,0.0,-0.0,-0.0,-0.0026,-0.0488,0.0203,22144.49 +370,60,4.05,0.0,10.45,0.57,3.76,0.0,11.33,-0.0044,-0.0624,0.0332,0.0,0.0,0.0,-0.0013,-0.035,0.0285,22204.76 +371,60,4.03,0.0,9.52,0.57,3.75,0.0,10.07,-0.0046,-0.0641,0.046,0.0,-0.0,-0.0,-0.0002,-0.026,0.0342,22262.97 +372,59,3.91,0.0,8.0,0.58,3.59,0.0,8.94,-0.0054,-0.0656,0.0464,0.0,0.0,0.0,-0.0012,-0.0538,0.0263,22324.68 +373,60,3.88,0.0,9.38,0.54,3.57,0.0,10.53,-0.0061,-0.067,0.0525,0.0,-0.0,-0.0,-0.0003,-0.046,0.0377,22384.33 +374,60,3.97,0.0,10.14,0.55,3.68,0.0,11.67,-0.0051,-0.0683,0.0532,0.0,0.0,0.0,0.001,-0.0246,0.0316,22444.69 +375,59,4.02,0.0,9.46,0.55,3.7,0.0,10.65,-0.005,-0.0529,0.0358,0.0,0.0,0.0,-0.0001,-0.0218,0.0248,22501.79 +376,60,3.87,0.0,9.72,0.3,3.58,0.0,10.72,-0.0061,-0.0436,0.0305,0.0,-0.0,-0.0,-0.0009,-0.0314,0.0197,22563.52 +377,57,3.96,0.0,8.96,0.3,3.66,0.0,9.77,-0.0057,-0.0464,0.0345,0.0,0.0,0.0,0.0007,-0.0237,0.0294,22623.07 +378,59,3.86,0.0,8.22,0.28,3.58,0.0,8.78,-0.0061,-0.0494,0.0264,0.0,-0.0,-0.0,-0.0002,-0.0278,0.034,22685.18 +379,57,3.83,0.0,7.46,0.92,3.47,0.0,7.79,-0.0066,-0.0516,0.0302,0.0,-0.0,-0.0,-0.0011,-0.0551,0.0418,22743.76 +380,60,4.05,0.0,8.77,0.36,3.73,0.0,9.07,-0.0049,-0.0539,0.0378,0.0,-0.0,-0.0,0.0017,-0.0284,0.0265,22802.81 +381,60,4.21,0.0,11.59,0.36,3.94,0.0,13.44,-0.0031,-0.056,0.0699,0.0,-0.0,-0.0,0.0018,-0.0328,0.0448,22864.22 +382,60,4.15,0.0,10.29,0.37,3.9,0.0,12.13,-0.0039,-0.06,0.0474,0.0,0.0,0.0,-0.0008,-0.0396,0.0211,22923.92 +383,60,4.01,0.0,9.86,0.38,3.71,0.0,11.18,-0.0059,-0.0647,0.036,0.0,0.0,0.0,-0.002,-0.0373,0.0404,22982.73 +384,59,3.96,0.0,10.94,0.39,3.58,0.0,12.39,-0.0068,-0.0606,0.0363,0.0,0.0,0.0,-0.0009,-0.032,0.0328,23042.36 +385,60,3.86,0.0,10.61,0.44,3.47,0.0,11.94,-0.0072,-0.0622,0.0266,0.0,0.0,0.0,-0.0005,-0.0232,0.0195,23102.15 +386,60,4.03,0.0,13.11,0.44,3.68,0.0,15.15,-0.0049,-0.0657,0.0489,0.0,-0.0,-0.0,0.0023,-0.0307,0.0295,23165.48 +387,60,4.03,0.0,13.85,0.45,3.66,0.0,16.46,-0.0047,-0.065,0.0589,0.0,-0.0,-0.0,0.0003,-0.0354,0.0412,23225.33 +388,58,3.93,0.0,11.48,0.45,3.63,0.0,13.15,-0.0055,-0.0662,0.0636,0.0,-0.0,-0.0,-0.0012,-0.0362,0.0272,23283.5 +389,60,4.1,0.0,10.91,1.13,3.87,0.0,12.42,-0.0034,-0.0674,0.0574,0.0,0.0,0.0,0.0024,-0.037,0.0395,23344.48 +390,60,3.96,0.0,10.71,1.14,3.67,0.0,12.27,-0.0056,-0.0684,0.0567,0.0,0.0,0.0,-0.0022,-0.0348,0.0248,23402.03 +391,60,3.87,0.0,11.25,1.14,3.47,0.0,12.95,-0.007,-0.0714,0.0529,0.0,-0.0,-0.0,-0.0014,-0.0518,0.0432,23463.94 +392,60,4.03,0.0,11.63,1.15,3.72,0.0,13.34,-0.0049,-0.0703,0.0474,0.0,0.0,0.0,0.0021,-0.0219,0.0427,23522.04 +393,60,4.15,0.0,11.11,0.27,3.9,0.0,12.5,-0.0038,-0.0711,0.0412,0.0,-0.0,-0.0,0.0011,-0.0391,0.0222,23580.83 +394,60,4.27,0.0,10.29,0.27,4.04,0.0,11.59,-0.0032,-0.0719,0.0459,0.0,-0.0,-0.0,0.0006,-0.0244,0.0352,23645.1 +395,54,4.42,0.0,10.77,0.28,4.27,0.0,12.03,-0.0013,-0.0729,0.043,0.0,0.0,0.0,0.0021,-0.0238,0.0373,23699.93 +396,60,4.51,0.0,12.33,0.83,4.29,0.0,13.58,-0.0023,-0.077,0.0331,0.0,-0.0,-0.0,-0.001,-0.0236,0.0365,23762.87 +397,60,4.63,0.0,10.61,0.83,4.43,0.0,11.66,-0.0019,-0.0809,0.0429,0.0,-0.0,-0.0,0.0004,-0.0448,0.0252,23823.35 +398,59,4.51,0.0,11.11,0.63,4.26,0.0,12.23,-0.0039,-0.0844,0.046,0.0,0.0,0.0,-0.0016,-0.0312,0.0177,23883.97 +399,60,4.38,0.0,9.84,0.9,4.1,0.0,11.14,-0.0061,-0.0877,0.0519,0.0,-0.0,-0.0,-0.0027,-0.0474,0.0328,23943.55 +400,60,4.3,0.0,10.53,0.91,3.94,0.0,12.23,-0.0074,-0.0907,0.0523,0.0,-0.0,-0.0,-0.0013,-0.0347,0.0203,24003.89 +401,55,4.44,0.0,10.53,0.91,4.12,0.0,11.81,-0.0058,-0.0782,0.0452,0.0,-0.0,-0.0,0.0003,-0.0474,0.0324,24063.01 +402,60,4.24,0.0,15.56,0.44,3.79,0.0,17.77,-0.0081,-0.0642,0.0956,0.0,0.0,0.0,-0.0009,-0.0753,0.0532,24123.81 +403,60,4.29,0.0,14.29,0.73,3.85,0.0,16.84,-0.0066,-0.062,0.0719,0.0,-0.0,-0.0,0.0014,-0.0266,0.0304,24184.93 +404,60,4.33,0.0,13.46,0.73,3.91,0.0,15.25,-0.0054,-0.0662,0.0467,0.0,0.0,0.0,0.0012,-0.0277,0.027,24245.17 +405,59,4.5,0.0,11.54,0.74,4.13,0.0,12.26,-0.0033,-0.0701,0.0417,0.0,0.0,0.0,0.0019,-0.0429,0.0319,24304.22 +406,59,4.37,0.0,10.0,0.33,3.95,0.0,9.79,-0.0042,-0.0654,0.0392,0.0,0.0,0.0,-0.0008,-0.0411,0.0307,24363.0 +407,59,4.11,0.0,9.52,0.5,3.6,0.0,10.24,-0.007,-0.0716,0.0415,0.0,-0.0,-0.0,-0.0028,-0.0353,0.0198,24419.88 +408,60,4.14,0.0,11.11,0.52,3.67,0.0,12.47,-0.0056,-0.0773,0.0556,0.0,-0.0,-0.0,0.0015,-0.0386,0.0381,24483.84 +409,60,4.1,0.0,10.26,0.52,3.6,0.0,11.71,-0.0056,-0.0655,0.04,0.0,0.0,0.0,0.0001,-0.0388,0.0545,24543.07 +410,60,4.18,0.0,12.2,0.52,3.69,0.0,14.06,-0.004,-0.054,0.0529,0.0,0.0,0.0,0.0016,-0.0313,0.0289,24600.4 +411,59,4.11,0.0,11.9,0.53,3.65,0.0,13.78,-0.0038,-0.0441,0.0417,0.0,-0.0,-0.0,0.0006,-0.0243,0.0203,24663.07 +412,60,4.04,0.0,11.11,0.38,3.53,0.0,12.49,-0.0045,-0.0536,0.0372,0.0,-0.0,-0.0,-0.0011,-0.0407,0.0215,24724.22 +413,60,3.91,0.0,10.42,0.4,3.39,0.0,11.3,-0.0053,-0.0604,0.0435,0.0,0.0,0.0,-0.0008,-0.0268,0.0206,24784.08 +414,60,3.75,0.0,11.76,0.41,3.26,0.0,12.92,-0.0063,-0.063,0.0449,0.0,-0.0,-0.0,-0.001,-0.0309,0.0308,24844.28 +415,60,3.48,0.0,9.52,0.53,3.02,0.0,9.99,-0.0088,-0.0694,0.0371,0.0,0.0,0.0,-0.0025,-0.0307,0.0402,24902.83 +416,60,3.5,0.0,9.52,0.54,3.03,0.0,10.2,-0.0087,-0.0801,0.0326,0.0,-0.0,-0.0,0.0001,-0.0332,0.0297,24964.47 +417,60,3.73,0.0,8.7,0.56,3.27,0.0,9.2,-0.0064,-0.0748,0.0539,0.0,0.0,0.0,0.0023,-0.0192,0.0488,25023.02 +418,60,3.76,0.0,8.62,0.56,3.37,0.0,9.17,-0.0062,-0.0782,0.0446,0.0,-0.0,-0.0,0.0003,-0.0352,0.0383,25083.32 +419,60,3.76,0.0,9.23,0.57,3.37,0.0,10.1,-0.0067,-0.0813,0.043,0.0,0.0,0.0,-0.0006,-0.031,0.0361,25143.59 +420,60,3.65,0.0,10.29,0.48,3.2,0.0,11.87,-0.0085,-0.0794,0.0506,0.0,-0.0,-0.0,-0.0017,-0.0342,0.0302,25201.87 +421,60,3.99,0.0,13.33,0.57,3.6,0.0,15.06,-0.0051,-0.0836,0.0684,0.0,-0.0,-0.0,0.0034,-0.0256,0.0476,25262.1 +422,60,3.84,0.0,13.11,0.57,3.44,0.0,15.2,-0.007,-0.0875,0.0582,0.0,0.0,0.0,-0.0019,-0.0359,0.0202,25322.05 +423,60,3.96,0.0,12.31,0.59,3.56,0.0,13.87,-0.006,-0.0911,0.0606,0.0,-0.0,-0.0,0.001,-0.0208,0.0443,25382.98 +424,60,4.21,0.0,13.43,0.58,3.81,0.0,15.07,-0.0037,-0.0549,0.0468,0.0,-0.0,-0.0,0.0023,-0.0211,0.0398,25446.43 +425,60,4.18,0.0,10.61,0.58,3.8,0.0,11.44,-0.0041,-0.0575,0.0454,0.0,-0.0,-0.0,-0.0005,-0.0393,0.0381,25501.61 +426,60,4.22,0.0,10.0,0.59,3.8,0.0,10.9,-0.0042,-0.0598,0.0434,0.0,0.0,0.0,-0.0001,-0.0238,0.0546,25564.19 +427,60,4.05,0.0,10.0,0.59,3.55,0.0,11.18,-0.0062,-0.0664,0.0593,0.0,0.0,0.0,-0.0019,-0.0627,0.0247,25622.39 +428,60,4.11,0.0,11.94,0.6,3.71,0.0,14.2,-0.005,-0.0641,0.0726,0.0,0.0,0.0,0.0011,-0.0418,0.0282,25685.38 +429,60,4.09,0.0,11.59,0.61,3.68,0.0,13.99,-0.0056,-0.0709,0.0588,0.0,-0.0,-0.0,-0.0005,-0.0263,0.0299,25745.48 +430,60,4.07,0.0,10.94,0.61,3.68,0.0,12.16,-0.006,-0.0799,0.0407,0.0,-0.0,-0.0,-0.0004,-0.0284,0.0281,25803.88 +431,60,3.85,0.0,9.38,0.62,3.28,0.0,10.15,-0.009,-0.0773,0.0309,0.0,-0.0,-0.0,-0.003,-0.0347,0.0273,25863.69 +432,60,4.04,0.0,10.17,0.63,3.52,0.0,11.13,-0.0062,-0.0826,0.0399,0.0,0.0,0.0,0.0028,-0.0218,0.0305,25919.92 +433,60,3.98,0.0,8.93,0.64,3.39,0.0,9.2,-0.0064,-0.0588,0.0358,0.0,0.0,0.0,-0.0002,-0.0291,0.0297,25983.67 +434,60,3.93,0.0,9.38,0.65,3.38,0.0,9.86,-0.006,-0.052,0.0312,0.0,-0.0,-0.0,0.0004,-0.0291,0.043,26041.44 +435,60,3.67,0.0,9.38,0.66,3.17,0.0,9.91,-0.0081,-0.0635,0.0283,0.0,0.0,0.0,-0.0021,-0.0359,0.0183,26102.97 +436,60,3.97,0.0,9.8,0.67,3.45,0.0,10.46,-0.0052,-0.0674,0.0502,0.0,-0.0,-0.0,0.0029,-0.0522,0.0357,26163.09 +437,60,4.05,0.0,10.0,0.68,3.57,0.0,10.42,-0.0041,-0.0709,0.0453,0.0,0.0,0.0,0.0011,-0.0374,0.0384,26224.26 +438,60,4.24,0.0,13.56,0.68,3.79,0.0,14.91,-0.0022,-0.0742,0.0745,0.0,-0.0,-0.0,0.0019,-0.0323,0.0415,26283.25 +439,60,4.22,0.0,12.9,0.68,3.81,0.0,14.4,-0.0025,-0.0772,0.0579,0.0,0.0,0.0,-0.0003,-0.0397,0.0316,26343.65 +440,60,4.16,0.0,11.94,0.69,3.73,0.0,12.78,-0.0037,-0.08,0.0411,0.0,0.0,0.0,-0.0011,-0.0267,0.024,26402.07 +441,60,4.34,0.0,11.29,0.7,3.97,0.0,12.74,-0.0022,-0.0825,0.0392,0.0,-0.0,-0.0,0.0014,-0.0325,0.034,26462.48 +442,60,4.16,0.0,10.14,0.7,3.81,0.0,11.12,-0.0049,-0.0849,0.039,0.0,-0.0,-0.0,-0.0027,-0.034,0.0231,26521.76 +443,60,4.32,0.0,10.77,0.7,3.98,0.0,11.93,-0.0044,-0.0871,0.0511,0.0,-0.0,-0.0,0.0005,-0.025,0.0316,26580.81 +444,60,4.31,0.0,9.86,0.7,4.01,0.0,10.55,-0.0056,-0.0891,0.0456,0.0,0.0,0.0,-0.0012,-0.0364,0.0319,26642.22 +445,60,4.35,0.0,10.14,0.71,4.02,0.0,10.92,-0.0067,-0.0909,0.0352,0.0,0.0,0.0,-0.0011,-0.0273,0.0301,26702.34 +446,60,4.03,0.0,10.77,0.72,3.68,0.0,11.13,-0.0112,-0.0926,0.0489,0.0,0.0,0.0,-0.0045,-0.0478,0.0537,26759.88 +447,60,4.32,0.0,11.94,0.73,3.83,0.0,12.7,-0.0094,-0.0942,0.0512,0.0,-0.0,-0.0,0.0018,-0.0401,0.0325,26821.41 +448,60,4.04,0.0,10.34,0.75,3.48,0.0,11.1,-0.0121,-0.0957,0.0461,0.0,-0.0,-0.0,-0.0027,-0.0548,0.0313,26881.64 +449,60,4.11,0.0,9.68,0.76,3.57,0.0,10.28,-0.0108,-0.097,0.0434,0.0,-0.0,-0.0,0.0013,-0.0301,0.0363,26942.53 +450,60,4.38,0.0,11.29,0.77,3.9,0.0,11.5,-0.0075,-0.0982,0.0375,0.0,0.0,0.0,0.0033,-0.0162,0.0489,27006.11 +451,60,4.22,0.0,10.14,0.79,3.73,0.0,10.97,-0.0091,-0.1035,0.0406,0.0,0.0,0.0,-0.0016,-0.0403,0.0354,27061.38 +452,60,4.27,0.0,11.11,0.8,3.78,0.0,12.87,-0.0086,-0.1004,0.0496,0.0,-0.0,-0.0,0.0005,-0.0427,0.0483,27121.07 +453,60,4.22,0.0,9.72,0.81,3.72,0.0,11.01,-0.0091,-0.1014,0.03,0.0,-0.0,-0.0,-0.0005,-0.0354,0.0312,27182.62 +454,60,4.16,0.0,9.59,0.83,3.61,0.0,10.5,-0.0097,-0.1023,0.0267,0.0,0.0,0.0,-0.0006,-0.0425,0.0338,27239.81 +455,60,4.39,0.0,10.0,0.84,3.87,0.0,10.9,-0.0068,-0.0705,0.035,0.0,0.0,0.0,0.0029,-0.0283,0.0318,27305.99 +456,60,4.4,0.0,10.53,0.84,3.9,0.0,11.56,-0.0064,-0.0695,0.0459,0.0,-0.0,-0.0,0.0004,-0.0647,0.0569,27361.56 +457,60,4.28,0.0,9.72,0.84,3.79,0.0,10.29,-0.0076,-0.0757,0.0573,0.0,0.0,0.0,-0.0011,-0.0472,0.0365,27423.13 +458,60,4.34,0.0,9.52,0.84,3.85,0.0,10.61,-0.007,-0.0813,0.0508,0.0,-0.0,-0.0,0.0006,-0.0305,0.032,27482.83 +459,60,4.52,0.0,9.8,0.85,4.06,0.0,10.83,-0.0052,-0.0866,0.0486,0.0,0.0,0.0,0.0018,-0.0342,0.0328,27543.09 +460,60,4.25,0.0,8.7,0.85,3.72,0.0,9.66,-0.0084,-0.0914,0.0362,0.0,-0.0,-0.0,-0.0032,-0.0542,0.0201,27602.74 +461,60,4.4,0.0,10.34,0.86,3.89,0.0,11.04,-0.0066,-0.0958,0.0346,0.0,-0.0,-0.0,0.0017,-0.0276,0.0498,27663.41 +462,60,4.43,0.0,11.9,0.86,3.93,0.0,13.33,-0.0062,-0.0999,0.053,0.0,0.0,0.0,0.0004,-0.0376,0.0326,27719.88 +463,60,4.42,0.0,10.87,0.86,3.92,0.0,12.29,-0.0063,-0.1037,0.0482,0.0,0.0,0.0,-0.0001,-0.0301,0.0658,27780.71 +464,60,4.48,0.0,11.11,0.87,4.0,0.0,12.35,-0.0057,-0.1072,0.0441,0.0,0.0,0.0,0.0006,-0.057,0.038,27845.03 +465,60,4.48,0.0,13.33,0.87,3.95,0.0,15.01,-0.0058,-0.0903,0.0571,0.0,-0.0,-0.0,-0.0001,-0.0313,0.0499,27904.41 +466,60,4.44,0.0,12.31,0.88,3.92,0.0,14.3,-0.0058,-0.0721,0.0417,0.0,0.0,0.0,-0.0,-0.0468,0.0194,27962.32 +467,60,4.52,0.0,10.61,0.89,4.05,0.0,11.7,-0.005,-0.0685,0.0423,0.0,0.0,0.0,0.0009,-0.0361,0.0413,28023.52 +468,60,4.56,0.0,10.39,0.89,4.08,0.0,11.22,-0.005,-0.071,0.0537,0.0,-0.0,-0.0,-0.0,-0.0407,0.0325,28082.84 +469,60,4.37,0.0,9.64,0.9,3.85,0.0,10.22,-0.0075,-0.0755,0.0478,0.0,-0.0,-0.0,-0.0024,-0.0388,0.0229,28141.74 +470,60,4.53,0.0,10.34,0.91,4.02,0.0,11.59,-0.0059,-0.0797,0.0609,0.0,-0.0,-0.0,0.0015,-0.0255,0.0362,28204.63 +471,60,4.37,0.0,10.34,0.92,3.84,0.0,11.89,-0.0077,-0.0835,0.0665,0.0,0.0,0.0,-0.0017,-0.0557,0.0265,28260.21 +472,60,4.52,0.0,10.39,0.93,4.02,0.0,11.44,-0.0061,-0.087,0.0492,0.0,-0.0,-0.0,0.0015,-0.0238,0.0327,28321.49 +473,60,4.39,0.0,10.34,0.93,3.82,0.0,11.53,-0.0077,-0.0903,0.0472,0.0,-0.0,-0.0,-0.0015,-0.0608,0.0299,28379.56 +474,60,4.4,0.0,12.07,0.94,3.8,0.0,13.71,-0.0072,-0.075,0.0551,0.0,-0.0,-0.0,0.0005,-0.0332,0.0381,28443.12 +475,60,4.38,0.0,12.31,0.95,3.82,0.0,14.11,-0.0066,-0.0626,0.0492,0.0,-0.0,-0.0,0.0005,-0.0512,0.0264,28503.0 +476,60,4.39,0.0,11.43,0.95,3.88,0.0,12.77,-0.0062,-0.067,0.0373,0.0,-0.0,-0.0,0.0004,-0.0295,0.0352,28562.07 +477,60,4.37,0.0,11.11,0.96,3.95,0.0,12.04,-0.0066,-0.0711,0.0699,0.0,0.0,0.0,-0.0003,-0.0327,0.0644,28623.87 +478,60,4.27,0.0,12.66,0.96,3.81,0.0,14.77,-0.0086,-0.0749,0.0858,0.0,0.0,0.0,-0.002,-0.0314,0.0385,28684.35 +479,60,4.45,0.0,12.2,0.96,3.98,0.0,14.25,-0.0073,-0.0784,0.0672,0.0,-0.0,-0.0,0.0013,-0.0354,0.0541,28743.1 +480,60,4.4,0.0,10.98,0.96,3.92,0.0,12.24,-0.0082,-0.0817,0.0392,0.0,0.0,0.0,-0.001,-0.0371,0.0236,28802.43 +481,60,4.22,0.0,11.59,0.89,3.68,0.0,13.19,-0.0106,-0.0846,0.0428,0.0,-0.0,-0.0,-0.0023,-0.034,0.0236,28861.42 +482,60,4.55,0.0,12.12,0.82,4.01,0.0,14.06,-0.0071,-0.0874,0.0634,0.0,0.0,0.0,0.0035,-0.0315,0.0383,28920.48 +483,60,4.74,0.0,10.34,0.75,4.18,0.0,10.98,-0.0049,-0.0716,0.0401,0.0,0.0,0.0,0.0021,-0.0421,0.0611,28981.85 +484,60,4.64,0.0,10.61,0.69,4.09,0.0,11.54,-0.0056,-0.0613,0.0331,0.0,0.0,0.0,-0.0006,-0.037,0.0307,29044.29 +485,60,4.45,0.0,9.43,0.7,3.78,0.0,10.0,-0.0075,-0.0543,0.0246,0.0,0.0,0.0,-0.0019,-0.036,0.0226,29103.35 +486,60,4.51,0.0,9.52,0.7,3.85,0.0,10.09,-0.006,-0.0578,0.0236,0.0,-0.0,-0.0,0.0015,-0.0287,0.036,29161.28 +487,60,4.6,0.0,10.0,0.7,3.98,0.0,11.41,-0.0043,-0.0613,0.0589,0.0,-0.0,-0.0,0.0016,-0.0608,0.0428,29222.13 +488,60,4.48,0.0,9.46,0.7,3.87,0.0,11.06,-0.0051,-0.0751,0.0462,0.0,-0.0,-0.0,-0.0008,-0.0337,0.0219,29280.42 +489,60,4.57,0.0,11.86,0.71,3.96,0.0,12.07,-0.0041,-0.0673,0.0491,0.0,0.0,0.0,0.0011,-0.0435,0.0303,29341.81 +490,60,4.45,0.0,11.48,0.71,3.85,0.0,11.76,-0.0051,-0.07,0.0384,0.0,-0.0,-0.0,-0.001,-0.0187,0.0267,29401.61 +491,60,4.57,0.0,12.5,0.72,3.94,0.0,12.95,-0.004,-0.0725,0.0419,0.0,-0.0,-0.0,0.0011,-0.0252,0.0293,29459.55 +492,60,4.41,0.0,9.38,0.72,3.81,0.0,9.64,-0.0054,-0.0748,0.0372,0.0,-0.0,-0.0,-0.0014,-0.048,0.0333,29521.57 +493,60,4.4,0.0,10.64,0.72,3.79,0.0,9.89,-0.0056,-0.0769,0.0295,0.0,0.0,0.0,-0.0003,-0.0481,0.0202,29578.94 +494,60,4.43,0.0,11.11,0.73,3.84,0.0,12.56,-0.0053,-0.0788,0.0532,0.0,0.0,0.0,0.0003,-0.0264,0.0243,29642.66 +495,60,4.54,0.0,10.53,0.74,3.97,0.0,12.0,-0.0043,-0.0819,0.0428,0.0,-0.0,-0.0,0.001,-0.0294,0.038,29701.81 +496,60,4.4,0.0,12.12,0.74,3.84,0.0,14.09,-0.0062,-0.0853,0.0653,0.0,-0.0,-0.0,-0.0019,-0.0302,0.025,29764.63 +497,60,4.22,0.0,10.0,0.74,3.67,0.0,10.74,-0.0085,-0.0885,0.0354,0.0,0.0,0.0,-0.0023,-0.0422,0.0343,29822.21 +498,60,4.31,0.0,9.23,0.75,3.65,0.0,9.97,-0.0084,-0.0852,0.0519,0.0,0.0,0.0,0.0001,-0.0352,0.0288,29882.96 +499,60,4.37,0.0,10.17,0.75,3.72,0.0,11.55,-0.0074,-0.0749,0.0513,0.0,-0.0,-0.0,0.001,-0.0346,0.0429,29940.51 +500,60,4.64,0.0,11.94,0.75,4.02,0.0,13.06,-0.0041,-0.0786,0.0517,0.0,0.0,0.0,0.0032,-0.0353,0.0303,30002.39 +501,60,4.71,0.0,10.94,0.76,4.12,0.0,12.46,-0.003,-0.0821,0.0489,0.0,0.0,0.0,0.0011,-0.0409,0.0299,30061.15 +502,60,4.49,0.0,10.96,0.76,3.9,0.0,12.63,-0.0053,-0.0853,0.0469,0.0,-0.0,-0.0,-0.0023,-0.0349,0.0391,30122.45 +503,60,4.36,0.0,10.29,0.76,3.71,0.0,10.75,-0.0069,-0.0724,0.027,0.0,0.0,0.0,-0.0016,-0.0294,0.0271,30183.62 +504,60,4.51,0.0,9.72,0.76,3.89,0.0,10.53,-0.0052,-0.0722,0.0437,0.0,-0.0,-0.0,0.0017,-0.0213,0.0507,30241.76 +505,60,4.51,0.0,10.71,0.89,3.95,0.0,12.27,-0.0051,-0.0788,0.0746,0.0,0.0,0.0,0.0001,-0.0366,0.0423,30302.81 +506,60,4.58,0.0,11.29,0.9,4.11,0.0,12.42,-0.0047,-0.085,0.0633,0.0,-0.0,-0.0,0.0004,-0.0304,0.0267,30364.62 +507,60,4.68,0.0,10.71,0.9,4.14,0.0,12.27,-0.0048,-0.0907,0.0395,0.0,0.0,0.0,-0.0002,-0.0345,0.0224,30422.13 +508,60,4.93,0.0,11.86,0.9,4.41,0.0,13.33,-0.0027,-0.0959,0.0489,0.0,0.0,0.0,0.0022,-0.0223,0.036,30483.92 +509,60,4.77,0.0,11.11,0.72,4.22,0.0,12.51,-0.0049,-0.0655,0.0361,0.0,0.0,0.0,-0.0022,-0.0271,0.0356,30541.27 +510,60,4.73,0.0,10.45,0.73,4.12,0.0,11.38,-0.006,-0.07,0.0367,0.0,-0.0,-0.0,-0.0011,-0.0307,0.0439,30600.23 +511,60,4.86,0.0,10.71,0.73,4.29,0.0,11.56,-0.0047,-0.0749,0.0466,0.0,-0.0,-0.0,0.0013,-0.0343,0.036,30661.31 +512,60,4.88,0.0,11.11,0.74,4.32,0.0,11.97,-0.0047,-0.0795,0.0509,0.0,0.0,0.0,-0.0,-0.0525,0.0225,30720.41 +513,60,4.95,0.0,12.0,0.74,4.46,0.0,13.33,-0.0042,-0.0836,0.0564,0.0,-0.0,-0.0,0.0005,-0.0254,0.0242,30780.26 +514,60,5.16,0.0,11.59,0.75,4.6,0.0,12.58,-0.0029,-0.0875,0.0493,0.0,0.0,0.0,0.0013,-0.07,0.0346,30842.11 +515,60,5.37,0.0,12.16,0.44,4.83,0.0,13.37,-0.0009,-0.0728,0.0451,0.0,-0.0,-0.0,0.002,-0.0328,0.0326,30901.42 +516,60,5.41,0.0,12.86,0.45,4.89,0.0,14.34,-0.0006,-0.0689,0.0463,0.0,-0.0,-0.0,0.0003,-0.0414,0.0368,30963.59 +517,60,5.4,0.0,13.04,0.45,4.87,0.0,14.64,-0.0011,-0.0725,0.0572,0.0,0.0,0.0,-0.0004,-0.0392,0.0218,31021.22 +518,60,5.4,0.0,10.94,0.45,4.82,0.0,12.13,-0.0016,-0.0757,0.0495,0.0,-0.0,-0.0,-0.0005,-0.0468,0.0237,31084.07 +519,60,5.37,0.0,12.33,0.45,4.76,0.0,13.61,-0.0021,-0.0788,0.0504,0.0,0.0,0.0,-0.0005,-0.0441,0.03,31139.3 +520,60,5.3,0.0,12.5,1.02,4.66,0.0,13.91,-0.0028,-0.0815,0.0607,0.0,0.0,0.0,-0.0008,-0.0327,0.0282,31202.91 +521,60,5.25,0.0,11.86,1.02,4.63,0.0,13.1,-0.0032,-0.0841,0.0546,0.0,0.0,0.0,-0.0003,-0.0281,0.0374,31263.16 +522,60,5.36,0.0,11.86,1.03,4.73,0.0,12.82,-0.0021,-0.0865,0.0342,0.0,-0.0,-0.0,0.001,-0.0239,0.0375,31323.82 +523,60,5.26,0.0,11.54,1.04,4.64,0.0,11.79,-0.0031,-0.0887,0.0398,0.0,0.0,0.0,-0.001,-0.0326,0.0403,31381.24 +524,60,5.05,0.0,10.17,1.04,4.35,0.0,10.63,-0.0057,-0.0907,0.0431,0.0,-0.0,-0.0,-0.0026,-0.0706,0.0532,31442.8 +525,60,4.78,0.0,9.52,1.05,3.99,0.0,9.39,-0.0083,-0.0925,0.0333,0.0,0.0,0.0,-0.0027,-0.0402,0.0376,31499.71 +526,60,4.87,0.0,10.53,1.05,4.09,0.0,10.65,-0.0066,-0.0942,0.0558,0.0,0.0,0.0,0.0017,-0.0358,0.0386,31560.33 +527,60,4.88,0.0,9.84,1.06,4.14,0.0,10.7,-0.0058,-0.0958,0.0474,0.0,-0.0,-0.0,0.0008,-0.0233,0.0369,31623.75 +528,60,4.79,0.0,10.29,1.07,4.06,0.0,11.67,-0.0064,-0.0973,0.046,0.0,-0.0,-0.0,-0.0006,-0.0284,0.0504,31682.21 +529,60,4.83,0.0,10.81,1.08,4.2,0.0,12.41,-0.0056,-0.0986,0.0451,0.0,0.0,0.0,0.0008,-0.0231,0.0321,31742.49 +530,60,5.0,0.0,11.59,1.09,4.35,0.0,13.4,-0.0045,-0.0998,0.0415,0.0,-0.0,-0.0,0.0011,-0.0266,0.0421,31799.35 +531,60,4.86,0.0,12.31,1.09,4.16,0.0,14.34,-0.0062,-0.101,0.0424,0.0,-0.0,-0.0,-0.0018,-0.0526,0.0231,31862.2 +532,60,4.72,0.0,11.76,0.78,3.99,0.0,13.56,-0.0077,-0.102,0.049,0.0,0.0,0.0,-0.0014,-0.0375,0.022,31920.56 +533,60,4.87,0.0,11.39,0.78,4.23,0.0,12.24,-0.0058,-0.103,0.0659,0.0,-0.0,-0.0,0.0019,-0.0314,0.0439,31982.42 +534,60,4.91,0.0,11.48,0.78,4.3,0.0,12.68,-0.0058,-0.1039,0.0586,0.0,-0.0,-0.0,0.0,-0.0505,0.0407,32044.03 +535,60,4.99,0.0,13.04,0.78,4.31,0.0,14.27,-0.0057,-0.1071,0.0586,0.0,-0.0,-0.0,0.0001,-0.0424,0.0284,32101.44 +536,60,5.09,0.0,13.95,0.79,4.45,0.0,15.68,-0.0047,-0.1206,0.0606,0.0,0.0,0.0,0.001,-0.0322,0.0404,32161.25 +537,60,5.23,0.0,10.71,0.8,4.62,0.0,11.05,-0.0035,-0.1038,0.0464,0.0,-0.0,-0.0,0.0011,-0.0487,0.0393,32222.25 +538,60,5.25,0.0,10.26,0.8,4.56,0.0,11.01,-0.004,-0.0835,0.0449,0.0,-0.0,-0.0,-0.0005,-0.0529,0.044,32283.15 +539,60,5.18,0.0,10.29,0.81,4.51,0.0,10.53,-0.0047,-0.0684,0.0376,0.0,0.0,0.0,-0.0007,-0.031,0.0377,32341.55 +540,60,4.93,0.0,10.0,0.82,4.15,0.0,11.28,-0.0077,-0.0567,0.0604,0.0,0.0,0.0,-0.003,-0.0524,0.031,32397.91 +541,60,4.63,0.0,10.45,0.54,3.81,0.0,12.03,-0.0103,-0.064,0.0566,0.0,0.0,0.0,-0.0026,-0.0261,0.0165,32461.03 +542,60,4.36,0.0,10.61,0.55,3.5,0.0,12.11,-0.0125,-0.0731,0.0478,0.0,0.0,0.0,-0.0022,-0.0344,0.0214,32521.76 +543,60,3.87,0.0,9.68,0.56,2.95,0.0,10.07,-0.0168,-0.0815,0.0196,0.0,-0.0,-0.0,-0.0043,-0.0546,0.0127,32584.43 +544,60,3.34,0.0,7.46,0.56,2.29,0.0,7.38,-0.0213,-0.0893,0.0154,0.0,0.0,0.0,-0.0045,-0.0359,0.0091,32640.83 +545,60,2.99,0.0,7.69,0.86,2.0,0.0,7.55,-0.023,-0.0964,0.014,0.0,0.0,0.0,-0.0017,-0.029,0.033,32697.51 +546,60,2.5,0.0,8.33,0.86,1.6,0.0,8.3,-0.0267,-0.103,0.021,0.0,-0.0,-0.0,-0.0037,-0.027,0.0085,32758.88 +547,60,2.03,0.0,8.33,0.86,1.17,0.0,8.35,-0.0311,-0.109,0.0106,0.0,0.0,0.0,-0.0044,-0.026,0.0233,32821.3 +548,60,1.53,0.0,6.56,0.48,0.87,0.0,6.02,-0.0361,-0.1146,0.0026,0.0,0.0,0.0,-0.005,-0.0323,0.0191,32881.36 +549,60,1.21,0.0,6.15,0.44,0.55,0.0,5.71,-0.0412,-0.1198,0.0014,0.0,0.0,0.0,-0.0051,-0.0383,0.016,32941.98 +550,60,0.87,0.0,3.7,0.41,0.25,0.0,2.93,-0.0462,-0.1245,0.0004,0.0,0.0,0.0,-0.005,-0.0336,0.0174,33002.17 +551,60,0.9,0.0,5.0,0.38,0.35,0.0,4.53,-0.0476,-0.1289,0.0137,0.0,0.0,0.0,-0.0015,-0.0121,0.0258,33056.51 +552,60,0.9,0.0,5.45,0.87,0.35,0.0,5.12,-0.0497,-0.133,0.0163,0.0,-0.0,-0.0,-0.0021,-0.0172,0.0224,33123.17 +553,60,1.08,0.0,5.08,0.32,0.56,0.0,4.61,-0.0498,-0.1392,0.0101,0.0,0.0,0.0,-0.0001,-0.0133,0.0295,33181.42 +554,60,1.13,0.0,5.0,0.3,0.63,0.0,4.43,-0.0511,-0.1457,0.0079,0.0,0.0,0.0,-0.0013,-0.0122,0.0213,33242.69 +555,60,1.15,0.0,4.41,0.27,0.61,0.0,3.3,-0.0527,-0.1522,0.0179,0.0,0.0,0.0,-0.0016,-0.0359,0.0224,33300.82 +556,60,1.19,0.0,4.17,0.25,0.58,0.0,3.22,-0.0535,-0.1602,0.0132,0.0,0.0,0.0,-0.0008,-0.017,0.011,33362.18 +557,60,1.18,0.0,4.55,0.87,0.56,0.0,3.41,-0.054,-0.1677,0.0128,0.0,0.0,0.0,-0.0005,-0.0228,0.0197,33421.82 +558,60,1.2,0.0,4.29,0.21,0.6,0.0,3.15,-0.0539,-0.1745,0.0095,0.0,0.0,0.0,0.0001,-0.0127,0.0209,33482.88 +559,60,1.16,0.0,4.17,0.2,0.59,0.0,3.23,-0.0545,-0.1808,0.0066,0.0,0.0,0.0,-0.0005,-0.0186,0.0246,33540.02 +560,60,1.11,0.0,4.69,0.18,0.6,0.0,4.18,-0.0552,-0.1866,0.0116,0.0,0.0,0.0,-0.0008,-0.0218,0.0153,33602.05 +561,60,1.08,0.0,4.84,0.18,0.57,0.0,4.39,-0.0562,-0.192,0.0114,0.0,0.0,0.0,-0.0009,-0.0158,0.0151,33663.11 +562,60,1.16,0.0,3.51,0.19,0.59,0.0,2.82,-0.0558,-0.197,0.0078,0.0,-0.0,-0.0,0.0003,-0.0161,0.0159,33721.21 +563,60,1.19,0.0,5.36,0.19,0.61,0.0,5.24,-0.0553,-0.1819,0.0182,0.0,0.0,0.0,0.0005,-0.028,0.0287,33784.14 +564,60,1.15,0.0,4.92,0.2,0.59,0.0,4.74,-0.0552,-0.1776,0.011,0.0,-0.0,-0.0,0.0001,-0.0184,0.0245,33839.37 +565,60,1.16,0.0,5.08,0.89,0.65,0.0,4.55,-0.0545,-0.1815,0.0226,0.0,0.0,0.0,0.0007,-0.0191,0.0261,33901.65 +566,60,1.2,0.0,5.77,0.21,0.66,0.0,5.34,-0.0539,-0.185,0.0259,0.0,-0.0,-0.0,0.0006,-0.0237,0.0177,33959.57 +567,60,1.22,0.0,5.17,0.22,0.7,0.0,4.52,-0.053,-0.1883,0.0148,0.0,-0.0,-0.0,0.0009,-0.0174,0.0346,34018.6 +568,60,1.2,0.0,5.26,0.22,0.67,0.0,4.53,-0.0526,-0.1913,0.0124,0.0,0.0,0.0,0.0004,-0.0213,0.0195,34080.88 +569,60,1.26,0.0,5.36,0.23,0.76,0.0,4.59,-0.0512,-0.1941,0.0115,0.0,-0.0,-0.0,0.0014,-0.0206,0.0296,34142.58 +570,60,1.41,0.0,5.26,0.9,0.83,0.0,4.63,-0.049,-0.1967,0.0129,0.0,0.0,0.0,0.0022,-0.0198,0.0199,34201.38 +571,60,1.44,0.0,5.17,0.91,0.86,0.0,4.82,-0.0472,-0.1991,0.0145,0.0,-0.0,-0.0,0.0018,-0.0194,0.0329,34259.03 +572,60,1.39,0.0,5.0,0.84,0.91,0.0,5.03,-0.046,-0.2013,0.0138,0.0,-0.0,-0.0,0.0012,-0.0221,0.0195,34321.43 +573,60,1.32,0.0,5.56,0.77,0.85,0.0,5.51,-0.0459,-0.2033,0.0273,0.0,0.0,0.0,0.0001,-0.0183,0.02,34380.82 +574,60,1.29,0.0,4.76,0.71,0.84,0.0,4.85,-0.0454,-0.2051,0.0192,0.0,0.0,0.0,0.0005,-0.0208,0.0337,34442.68 +575,60,1.24,0.0,5.77,0.65,0.81,0.0,5.73,-0.0452,-0.2068,0.0238,0.0,0.0,0.0,0.0002,-0.0196,0.0207,34500.68 +576,60,1.16,0.0,5.26,0.6,0.8,0.0,5.14,-0.0455,-0.2084,0.0149,0.0,0.0,0.0,-0.0002,-0.0158,0.0196,34560.13 +577,60,1.11,0.0,6.0,0.56,0.7,0.0,5.97,-0.046,-0.2099,0.0193,0.0,0.0,0.0,-0.0005,-0.0182,0.0294,34621.14 +578,60,1.21,0.0,5.66,0.51,0.8,0.0,5.5,-0.0443,-0.2112,0.0162,0.0,0.0,0.0,0.0016,-0.0084,0.016,34678.91 +579,60,1.15,0.0,5.36,0.47,0.74,0.0,5.03,-0.0442,-0.2125,0.0116,0.0,0.0,0.0,0.0001,-0.0291,0.0179,34737.6 +580,60,1.07,0.0,4.84,0.44,0.73,0.0,4.69,-0.0443,-0.2136,0.0109,0.0,0.0,0.0,-0.0,-0.0189,0.0363,34802.4 +581,60,0.99,0.0,5.08,0.4,0.7,0.0,5.41,-0.0448,-0.2147,0.0117,0.0,0.0,0.0,-0.0006,-0.0164,0.0165,34858.75 +582,57,0.84,0.0,5.45,0.4,0.6,0.0,5.94,-0.047,-0.2156,0.0171,0.0,0.0,0.0,-0.0009,-0.0202,0.021,34919.88 +583,60,0.93,0.0,5.36,0.14,0.64,0.0,5.78,-0.0462,-0.2165,0.0162,0.0,0.0,0.0,-0.0005,-0.018,0.0149,34981.28 +584,60,0.99,0.0,4.84,0.14,0.67,0.0,5.06,-0.0456,-0.2174,0.0112,0.0,-0.0,-0.0,0.0006,-0.0175,0.0299,35038.69 +585,60,1.01,0.0,6.67,0.29,0.76,0.0,7.3,-0.045,-0.2181,0.0209,0.0,0.0,0.0,0.0006,-0.0154,0.0204,35101.36 +586,58,1.08,0.0,6.35,0.29,0.85,0.0,6.97,-0.0442,-0.2188,0.0147,0.0,-0.0,-0.0,0.0006,-0.0172,0.0191,35160.15 +587,57,0.96,0.0,6.06,0.6,0.78,0.0,6.5,-0.0469,-0.2195,0.0128,0.0,0.0,0.0,-0.0015,-0.0189,0.0155,35221.5 +588,57,0.95,0.0,6.67,0.01,0.74,0.0,7.2,-0.0467,-0.2201,0.0143,0.0,0.0,0.0,-0.0003,-0.0174,0.017,35279.6 +589,60,1.04,0.0,7.69,0.58,0.81,0.0,8.5,-0.0458,-0.2206,0.0215,0.0,-0.0,-0.0,0.0003,-0.0156,0.0147,35336.98 +590,59,1.01,0.0,5.08,0.53,0.75,0.0,5.19,-0.0467,-0.2211,0.0136,0.0,-0.0,-0.0,-0.0002,-0.0368,0.0249,35400.36 +591,60,1.07,0.0,5.08,0.23,0.8,0.0,5.12,-0.0451,-0.2216,0.012,0.0,0.0,0.0,0.001,-0.0222,0.0248,35460.95 +592,59,1.12,0.0,3.77,0.23,0.86,0.0,3.61,-0.042,-0.222,0.0122,0.0,-0.0,-0.0,0.0008,-0.0194,0.0194,35519.38 +593,60,1.17,0.0,3.7,0.04,0.87,0.0,3.52,-0.0432,-0.2224,0.0113,0.0,0.0,0.0,0.0012,-0.0154,0.0266,35580.22 +594,57,1.08,0.0,3.7,0.03,0.71,0.0,3.51,-0.044,-0.2228,0.0061,0.0,0.0,0.0,-0.0001,-0.0223,0.026,35641.0 +595,54,1.01,0.0,3.17,0.32,0.65,0.0,3.08,-0.044,-0.2231,0.0027,0.0,0.0,0.0,0.0015,-0.0155,0.0165,35698.7 +596,59,0.95,0.0,3.85,0.29,0.65,0.0,3.69,-0.042,-0.2234,0.0036,0.0,0.0,0.0,0.0004,-0.0164,0.0157,35760.96 +597,58,1.11,0.0,4.62,0.16,0.83,0.0,4.07,-0.0397,-0.2237,0.0138,0.0,-0.0,-0.0,0.0028,-0.0179,0.0273,35819.39 +598,60,1.15,0.0,6.35,0.13,0.92,0.0,6.77,-0.0378,-0.224,0.0177,0.0,-0.0,-0.0,0.0012,-0.0183,0.0331,35882.41 +599,60,1.35,0.0,6.25,0.14,1.11,0.0,6.83,-0.0353,-0.2242,0.0156,0.0,0.0,0.0,0.0025,-0.0177,0.0354,35940.12 +600,60,1.46,0.0,6.78,0.14,1.25,0.0,7.44,-0.0335,-0.2244,0.0212,0.0,-0.0,-0.0,0.0018,-0.0149,0.0336,35987.72 +601,25,1.29,0.0,7.27,0.15,1.11,0.0,8.03,-0.0273,-0.0902,0.0198,0.0,0.0,0.0,-0.0036,-0.0264,0.0188,35993.91 diff --git a/experiments/results/csv/gradual_increase_adaptive_time_analysis.csv b/experiments/results/csv/gradual_increase_adaptive_time_analysis.csv new file mode 100644 index 000000000..c9f2e542f --- /dev/null +++ b/experiments/results/csv/gradual_increase_adaptive_time_analysis.csv @@ -0,0 +1,11 @@ +Time Range,Total Requests,Success,Errors,Error %,Rejected,Rejected %,Target Error Rate % +0-60s,21047,20845,192,0.91,10,0.05,1.0 +60-120s,21933,21440,312,1.42,181,0.83,1.5 +120-180s,21948,21052,446,2.03,450,2.05,2.0 +180-240s,22411,21411,512,2.28,488,2.18,2.5 +240-300s,22337,21165,618,2.77,554,2.48,3.0 +300-360s,22600,21104,767,3.39,729,3.23,3.5 +360-420s,22817,21068,896,3.93,853,3.74,4.0 +420-480s,23033,21190,968,4.2,875,3.8,4.5 +480-540s,22995,20931,1079,4.69,985,4.28,5.0 +540-600s,21900,21423,255,1.16,222,1.01,1.0 diff --git a/experiments/results/csv/gradual_increase_time_analysis.csv b/experiments/results/csv/gradual_increase_time_analysis.csv new file mode 100644 index 000000000..3143eb54f --- /dev/null +++ b/experiments/results/csv/gradual_increase_time_analysis.csv @@ -0,0 +1,11 @@ +Time Range,Total Requests,Success,Errors,Error %,Rejected,Rejected %,Target Error Rate % +0-60s,3293,3264,29,0.88,0,0.0,1.0 +60-120s,3062,3000,62,2.02,0,0.0,1.5 +120-180s,3000,2942,58,1.93,0,0.0,2.0 +180-240s,3113,3045,68,2.18,0,0.0,2.5 +240-300s,3366,3278,88,2.61,0,0.0,3.0 +300-360s,3431,3307,124,3.61,0,0.0,3.5 +360-420s,3415,3289,126,3.69,0,0.0,4.0 +420-480s,3458,3294,164,4.74,0,0.0,4.5 +480-540s,3411,3243,168,4.93,0,0.0,5.0 +540-600s,3182,3154,28,0.88,0,0.0,1.0 diff --git a/experiments/results/csv/near_target_error_rate_adaptive_pid_controller.csv b/experiments/results/csv/near_target_error_rate_adaptive_pid_controller.csv new file mode 100644 index 000000000..250331663 --- /dev/null +++ b/experiments/results/csv/near_target_error_rate_adaptive_pid_controller.csv @@ -0,0 +1,182 @@ +Window,Thread Count,Error Rate Avg,Error Rate Min,Error Rate Max,Ideal Error Rate,Rejection Rate Avg,Rejection Rate Min,Rejection Rate Max,Integral Avg,Integral Min,Integral Max,Derivative Avg,Derivative Min,Derivative Max,P Value Avg,P Value Min,P Value Max,Total Request Time +1,60,0.5,0.0,10.0,4.61,0.3,0.0,5.99,-0.0413,-0.0461,0.0499,0.0,-0.0,-0.0,-0.0413,-0.0461,0.0499,78.6 +2,60,0.78,0.0,12.5,4.25,0.42,0.0,8.55,-0.0795,-0.0886,0.0428,0.0,0.0,0.0,-0.0382,-0.06,0.0789,138.65 +3,60,0.65,0.0,9.09,3.92,0.16,0.0,4.81,-0.1171,-0.1278,0.0246,0.0,0.0,0.0,-0.0376,-0.0717,0.0163,199.99 +4,60,1.03,0.0,20.0,3.61,0.37,0.0,16.74,-0.1458,-0.1639,0.033,0.0,0.0,0.0,-0.0287,-0.0361,0.1608,259.76 +5,60,0.89,0.0,10.0,3.33,0.14,0.0,5.82,-0.1753,-0.1972,0.003,0.0,0.0,0.0,-0.0296,-0.0965,0.0115,322.43 +6,60,0.73,0.0,5.26,3.07,0.0,0.0,0.0,-0.2023,-0.228,-0.0315,0.0,0.0,0.0,-0.027,-0.0441,0.0073,387.01 +7,60,0.76,0.0,4.0,2.83,0.0,0.0,0.0,-0.2256,-0.2563,-0.0494,0.0,0.0,0.0,-0.0233,-0.0283,0.0007,433.81 +8,60,0.72,0.0,4.76,2.61,0.0,0.0,0.0,-0.2474,-0.2824,-0.066,0.0,0.0,0.0,-0.0218,-0.0261,0.01,507.24 +9,60,0.79,0.0,5.0,2.41,0.0,0.0,0.0,-0.2668,-0.3065,-0.0836,0.0,0.0,0.0,-0.0194,-0.0241,0.0112,560.41 +10,60,0.78,0.0,4.55,2.22,0.0,0.0,0.0,-0.2847,-0.3287,-0.077,0.0,0.0,0.0,-0.018,-0.0222,0.0066,620.53 +11,60,0.91,0.0,4.65,2.05,0.0,0.0,0.0,-0.3001,-0.3491,-0.0693,0.0,0.0,0.0,-0.0153,-0.0404,0.0135,687.82 +12,60,0.9,0.0,5.41,1.89,0.0,0.0,0.0,-0.3142,-0.368,-0.0673,0.0,0.0,0.0,-0.0142,-0.0367,0.0211,740.82 +13,60,1.18,0.0,5.26,1.74,0.0,0.0,0.0,-0.3246,-0.3854,-0.0654,0.0,0.0,0.0,-0.0103,-0.0339,0.0337,803.01 +14,60,1.25,0.0,5.26,1.6,0.0,0.0,0.0,-0.3333,-0.4014,-0.0824,0.0,0.0,0.0,-0.0087,-0.0294,0.0336,860.8 +15,60,1.23,0.0,6.0,1.48,0.0,0.0,0.0,-0.3414,-0.4162,-0.1001,0.0,0.0,0.0,-0.0081,-0.0292,0.0376,924.5 +16,60,1.37,0.0,5.45,1.36,0.0,0.0,0.0,-0.3474,-0.4298,-0.1181,0.0,0.0,0.0,-0.006,-0.0269,0.0321,981.55 +17,60,1.43,0.0,5.0,1.26,0.0,0.0,0.0,-0.352,-0.4424,-0.1359,0.0,0.0,0.0,-0.0046,-0.0248,0.0275,1042.69 +18,60,1.55,0.0,5.88,1.89,0.02,0.0,1.02,-0.3547,-0.454,-0.1302,0.0,-0.0,-0.0,-0.0028,-0.0288,0.0407,1094.14 +19,60,1.48,0.0,6.82,1.07,0.02,0.0,1.06,-0.3578,-0.4647,-0.1082,0.0,0.0,0.0,-0.003,-0.0291,0.0532,1161.01 +20,60,1.46,0.0,6.67,1.9,0.03,0.0,2.01,-0.3603,-0.4746,-0.0823,0.0,-0.0,-0.0,-0.0025,-0.0268,0.0516,1220.35 +21,60,1.33,0.0,7.32,1.9,0.03,0.0,1.84,-0.3637,-0.4836,-0.1028,0.0,0.0,0.0,-0.0034,-0.0248,0.0576,1282.36 +22,60,1.4,0.0,6.12,1.9,0.04,0.0,1.29,-0.3657,-0.492,-0.0889,0.0,-0.0,-0.0,-0.002,-0.0256,0.0307,1346.49 +23,60,1.3,0.0,6.25,0.77,0.03,0.0,1.24,-0.3682,-0.4997,-0.1067,0.0,0.0,0.0,-0.0025,-0.0309,0.0429,1403.07 +24,60,1.09,0.0,5.77,1.82,0.03,0.0,2.05,-0.3719,-0.5069,-0.1088,0.0,0.0,0.0,-0.0037,-0.0239,0.031,1458.17 +25,60,1.1,0.0,5.88,0.66,0.04,0.0,2.67,-0.375,-0.5134,-0.0878,0.0,0.0,0.0,-0.0031,-0.0221,0.0376,1521.51 +26,60,1.01,0.0,4.76,0.66,0.01,0.0,0.63,-0.3785,-0.5195,-0.0901,0.0,0.0,0.0,-0.0035,-0.0256,0.0348,1588.01 +27,60,1.08,0.0,6.12,0.66,0.04,0.0,2.23,-0.3805,-0.5251,-0.086,0.0,-0.0,-0.0,-0.0019,-0.0236,0.0395,1642.18 +28,60,1.17,0.0,4.76,0.51,0.0,0.0,0.0,-0.3812,-0.5302,-0.083,0.0,0.0,0.0,-0.0008,-0.0217,0.0409,1699.67 +29,60,1.16,0.0,5.13,0.47,0.01,0.0,0.52,-0.3814,-0.5349,-0.0822,0.0,0.0,0.0,-0.0001,-0.0201,0.0456,1757.3 +30,60,1.15,0.0,5.13,1.8,0.01,0.0,0.45,-0.3812,-0.5393,-0.0677,0.0,0.0,0.0,0.0001,-0.0185,0.0455,1823.87 +31,60,1.13,0.0,6.45,0.69,0.02,0.0,0.98,-0.3808,-0.5434,-0.0566,0.0,-0.0,-0.0,0.0004,-0.017,0.0586,1882.07 +32,60,1.2,0.0,6.45,0.37,0.03,0.0,1.31,-0.3794,-0.5471,-0.0447,0.0,0.0,0.0,0.0015,-0.0166,0.0585,1939.2 +33,60,1.25,0.0,7.41,2.21,0.06,0.0,2.59,-0.3773,-0.5505,-0.0533,0.0,-0.0,-0.0,0.0021,-0.0164,0.0649,1999.9 +34,60,1.36,0.0,10.0,2.21,0.14,0.0,6.8,-0.374,-0.5537,-0.0405,0.0,0.0,0.0,0.0033,-0.0152,0.0702,2065.61 +35,60,1.28,0.0,7.41,0.71,0.09,0.0,4.49,-0.3719,-0.5566,-0.0546,0.0,0.0,0.0,0.0021,-0.0203,0.0453,2116.98 +36,60,1.26,0.0,5.77,1.2,0.06,0.0,2.52,-0.3692,-0.5593,-0.0351,0.0,0.0,0.0,0.0027,-0.0187,0.0484,2182.19 +37,60,1.37,0.0,5.77,1.11,0.06,0.0,2.56,-0.3649,-0.5617,-0.0447,0.0,0.0,0.0,0.0043,-0.0229,0.048,2241.52 +38,60,1.08,0.0,5.66,1.02,0.05,0.0,1.61,-0.3631,-0.564,-0.0398,0.0,0.0,0.0,0.0018,-0.0318,0.0497,2302.94 +39,60,1.19,0.0,5.41,0.55,0.05,0.0,1.44,-0.3598,-0.5661,-0.0357,0.0,0.0,0.0,0.0033,-0.0194,0.0496,2354.96 +40,60,1.23,0.0,6.25,0.56,0.1,0.0,3.06,-0.3557,-0.5681,-0.0301,0.0,0.0,0.0,0.0041,-0.0179,0.0481,2425.23 +41,60,1.39,0.0,4.92,0.41,0.08,0.0,2.4,-0.3503,-0.5699,-0.022,0.0,0.0,0.0,0.0054,-0.0165,0.0436,2482.64 +42,60,1.17,0.0,4.88,0.38,0.04,0.0,1.37,-0.3467,-0.5715,-0.0185,0.0,0.0,0.0,0.0036,-0.0257,0.0397,2542.58 +43,60,1.19,0.0,5.13,0.47,0.05,0.0,1.01,-0.3423,-0.573,-0.0172,0.0,-0.0,-0.0,0.0044,-0.0237,0.0413,2602.9 +44,60,1.2,0.0,5.13,0.47,0.08,0.0,2.4,-0.3376,-0.5744,0.0037,0.0,-0.0,-0.0,0.0047,-0.0134,0.0383,2660.68 +45,60,1.3,0.0,5.26,0.48,0.11,0.0,3.34,-0.3322,-0.5759,0.0117,0.0,-0.0,-0.0,0.0054,-0.0123,0.0378,2718.96 +46,60,1.22,0.0,4.76,0.49,0.09,0.0,1.89,-0.3277,-0.578,-0.0124,0.0,0.0,0.0,0.0046,-0.0241,0.0428,2779.25 +47,60,1.17,0.0,4.65,0.49,0.1,0.0,2.35,-0.3232,-0.5799,-0.0137,0.0,-0.0,-0.0,0.0044,-0.0154,0.0416,2846.11 +48,60,1.06,0.0,4.35,0.5,0.14,0.0,2.38,-0.3197,-0.5817,-0.0131,0.0,-0.0,-0.0,0.0035,-0.0142,0.0347,2893.31 +49,60,1.09,0.0,4.76,0.51,0.16,0.0,3.43,-0.316,-0.5834,-0.0098,0.0,0.0,0.0,0.0037,-0.0131,0.035,2967.48 +50,60,1.04,0.0,4.35,0.51,0.15,0.0,3.27,-0.3129,-0.5849,0.0084,0.0,-0.0,-0.0,0.0031,-0.0123,0.0311,3018.87 +51,60,0.94,0.0,4.26,0.23,0.12,0.0,2.7,-0.3105,-0.5863,0.0022,0.0,0.0,0.0,0.0024,-0.0149,0.0339,3082.41 +52,60,1.08,0.0,4.55,0.21,0.14,0.0,2.82,-0.3061,-0.5876,0.0039,0.0,0.0,0.0,0.0043,-0.0132,0.0366,3141.63 +53,60,1.11,0.0,5.88,0.2,0.16,0.0,4.15,-0.3016,-0.5888,0.0223,0.0,0.0,0.0,0.0045,-0.0121,0.029,3202.14 +54,60,1.21,0.0,4.65,0.18,0.11,0.0,2.61,-0.2962,-0.5888,0.0058,0.0,0.0,0.0,0.0055,-0.0206,0.0332,3258.82 +55,60,1.22,0.0,4.88,0.17,0.13,0.0,2.54,-0.2899,-0.5898,0.0042,0.0,0.0,0.0,0.0063,-0.019,0.0456,3322.57 +56,60,1.32,0.0,5.0,0.05,0.13,0.0,2.39,-0.2827,-0.5908,0.0022,0.0,0.0,0.0,0.0072,-0.0175,0.0486,3376.9 +57,60,1.4,0.0,6.52,0.05,0.13,0.0,2.93,-0.2746,-0.5916,0.0064,0.0,0.0,0.0,0.0081,-0.0162,0.0637,3440.55 +58,60,1.33,0.0,6.98,0.05,0.17,0.0,3.79,-0.267,-0.5925,0.0125,0.0,0.0,0.0,0.0076,-0.028,0.0682,3501.49 +59,60,1.36,0.0,5.88,0.04,0.24,0.0,4.38,-0.2593,-0.5932,0.0042,0.0,0.0,0.0,0.0076,-0.0137,0.0571,3558.81 +60,60,1.45,0.0,5.77,0.04,0.29,0.0,4.77,-0.2513,-0.5939,-0.0158,0.0,0.0,0.0,0.008,-0.0268,0.0559,3618.17 +61,60,1.67,0.0,6.9,0.1,0.47,0.0,5.97,-0.2415,-0.5945,-0.0063,0.0,0.0,0.0,0.0099,-0.0166,0.0671,3682.44 +62,60,1.68,0.0,7.41,0.03,0.57,0.0,5.81,-0.2331,-0.5951,-0.0045,0.0,0.0,0.0,0.0084,-0.02,0.0558,3742.6 +63,60,1.61,0.0,7.5,0.28,0.64,0.0,5.93,-0.2262,-0.5956,-0.0044,0.0,0.0,0.0,0.0069,-0.0212,0.0475,3800.53 +64,60,1.46,0.0,7.41,0.4,0.52,0.0,6.54,-0.2215,-0.5961,-0.0152,0.0,0.0,0.0,0.0048,-0.0178,0.0372,3860.63 +65,60,1.35,0.0,7.5,0.24,0.57,0.0,6.37,-0.2165,-0.5966,-0.0082,0.0,0.0,0.0,0.005,-0.0253,0.0372,3920.09 +66,60,1.33,0.0,7.69,0.07,0.61,0.0,6.87,-0.2121,-0.597,-0.0135,0.0,0.0,0.0,0.0044,-0.0149,0.034,3976.39 +67,60,1.37,0.0,7.41,0.06,0.66,0.0,6.7,-0.2075,-0.5974,-0.0106,0.0,0.0,0.0,0.0046,-0.0114,0.0466,4045.94 +68,60,1.59,0.0,6.67,0.06,0.73,0.0,5.85,-0.2013,-0.5978,0.0066,0.0,0.0,0.0,0.0063,-0.0066,0.0483,4100.22 +69,60,1.58,0.0,6.67,0.15,0.72,0.0,5.91,-0.1957,-0.5981,-0.0023,0.0,-0.0,-0.0,0.0056,-0.0235,0.0379,4162.01 +70,60,1.69,0.0,7.14,0.22,0.78,0.0,6.49,-0.1889,-0.5984,-0.0078,0.0,0.0,0.0,0.0068,-0.0168,0.0477,4222.04 +71,60,1.48,0.0,6.25,0.45,0.63,0.0,5.85,-0.1847,-0.5987,0.0097,0.0,0.0,0.0,0.0043,-0.035,0.0396,4284.78 +72,60,1.42,0.0,6.06,0.19,0.57,0.0,5.61,-0.1794,-0.5989,0.0077,0.0,0.0,0.0,0.0052,-0.0505,0.038,4337.14 +73,60,1.36,0.0,5.0,0.38,0.49,0.0,4.38,-0.1742,-0.5992,0.0046,0.0,0.0,0.0,0.0052,-0.0334,0.042,4400.54 +74,60,1.36,0.0,6.38,0.35,0.51,0.0,5.18,-0.1681,-0.5994,0.0023,0.0,0.0,0.0,0.0061,-0.0082,0.0632,4459.34 +75,60,1.52,0.0,6.38,0.21,0.58,0.0,5.92,-0.1606,-0.5996,-0.0017,0.0,0.0,0.0,0.0075,-0.0095,0.0631,4521.04 +76,60,1.52,0.0,5.97,0.21,0.62,0.0,5.6,-0.1537,-0.5998,-0.0008,0.0,-0.0,-0.0,0.0069,-0.0204,0.0472,4578.52 +77,60,1.43,0.0,6.25,0.17,0.62,0.0,6.02,-0.1481,-0.6,0.002,0.0,-0.0,-0.0,0.0056,-0.0249,0.0402,4640.73 +78,60,1.29,0.0,6.67,0.25,0.62,0.0,6.64,-0.1437,-0.6001,0.0017,0.0,0.0,0.0,0.0044,-0.0273,0.039,4703.89 +79,60,1.29,0.0,6.0,0.26,0.63,0.0,5.86,-0.1394,-0.6003,0.0003,0.0,0.0,0.0,0.0044,-0.0371,0.0407,4756.87 +80,60,1.22,0.0,5.77,0.18,0.55,0.0,4.97,-0.1357,-0.6004,0.0019,0.0,-0.0,-0.0,0.0037,-0.0433,0.035,4818.84 +81,60,1.14,0.0,5.77,0.19,0.6,0.0,5.82,-0.132,-0.6005,0.0049,0.0,-0.0,-0.0,0.0037,-0.0258,0.0406,4883.91 +82,60,1.18,0.0,6.67,0.19,0.66,0.0,7.06,-0.1282,-0.5846,0.0144,0.0,-0.0,-0.0,0.0038,-0.0188,0.0345,4944.9 +83,60,1.2,0.0,6.67,0.19,0.77,0.0,6.58,-0.1248,-0.5696,0.0064,0.0,0.0,0.0,0.0034,-0.0188,0.0581,5001.37 +84,60,1.26,0.0,6.52,0.2,0.78,0.0,5.81,-0.1218,-0.5693,-0.0028,0.0,0.0,0.0,0.003,-0.0179,0.0296,5058.95 +85,60,1.21,0.0,6.25,0.2,0.82,0.0,6.12,-0.1192,-0.5694,0.0002,0.0,-0.0,-0.0,0.0026,-0.0174,0.0258,5118.8 +86,60,1.22,0.0,6.12,0.2,0.79,0.0,6.01,-0.1169,-0.5695,-0.0002,0.0,0.0,0.0,0.0023,-0.0296,0.0394,5178.82 +87,60,1.07,0.0,6.0,0.21,0.73,0.0,5.86,-0.1157,-0.5696,-0.0014,0.0,-0.0,-0.0,0.0011,-0.0209,0.0376,5243.3 +88,60,1.0,0.0,6.0,0.19,0.68,0.0,6.09,-0.1147,-0.5697,0.0121,0.0,-0.0,-0.0,0.001,-0.0208,0.0344,5293.89 +89,60,1.12,0.0,7.5,0.17,0.78,0.0,8.1,-0.1119,-0.5698,0.0268,0.0,0.0,0.0,0.0028,-0.0174,0.0265,5361.51 +90,60,1.03,0.0,6.67,0.16,0.74,0.0,6.78,-0.1108,-0.5699,0.0254,0.0,0.0,0.0,0.0011,-0.047,0.0344,5425.93 +91,60,1.08,0.0,7.41,0.15,0.83,0.0,7.78,-0.1088,-0.57,0.0318,0.0,0.0,0.0,0.002,-0.0223,0.0241,5473.3 +92,60,1.06,0.0,5.88,0.14,0.81,0.0,6.53,-0.1078,-0.57,0.0272,0.0,0.0,0.0,0.001,-0.0393,0.0379,5540.92 +93,60,1.11,0.0,5.71,0.13,0.86,0.0,5.81,-0.106,-0.5701,0.0193,0.0,0.0,0.0,0.0018,-0.0348,0.0289,5607.05 +94,60,1.22,0.0,5.56,0.06,0.88,0.0,5.72,-0.1035,-0.5702,0.0154,0.0,0.0,0.0,0.0025,-0.0201,0.0343,5658.25 +95,60,1.23,0.0,6.0,0.06,0.92,0.0,6.58,-0.1012,-0.5702,0.0199,0.0,-0.0,-0.0,0.0024,-0.0405,0.0343,5722.37 +96,60,1.26,0.0,7.5,0.1,0.93,0.0,8.02,-0.0988,-0.5703,0.0255,0.0,0.0,0.0,0.0023,-0.0228,0.0494,5783.12 +97,60,1.35,0.0,8.33,0.09,1.06,0.0,9.21,-0.0957,-0.5703,0.0311,0.0,0.0,0.0,0.0031,-0.0117,0.0546,5839.29 +98,60,1.28,0.0,7.32,0.08,1.04,0.0,7.85,-0.0945,-0.5704,0.0146,0.0,0.0,0.0,0.0012,-0.0165,0.0318,5897.66 +99,60,1.31,0.0,6.45,0.08,1.05,0.0,5.96,-0.0927,-0.5704,0.012,0.0,0.0,0.0,0.0017,-0.0248,0.0379,5963.03 +100,60,1.16,0.0,7.32,0.08,0.95,0.0,7.51,-0.0926,-0.5704,0.026,0.0,0.0,0.0,0.0002,-0.0292,0.0333,6014.85 +101,60,1.24,0.0,6.52,0.08,0.92,0.0,6.95,-0.0905,-0.5705,0.0144,0.0,-0.0,-0.0,0.002,-0.0625,0.0337,6087.98 +102,60,1.32,0.0,7.41,0.09,0.94,0.0,6.68,-0.0874,-0.5705,0.002,0.0,-0.0,-0.0,0.0031,-0.0444,0.0368,6138.97 +103,60,1.33,0.0,5.56,0.09,0.9,0.0,5.51,-0.0844,-0.5705,0.0087,0.0,0.0,0.0,0.003,-0.0334,0.0361,6204.01 +104,60,1.16,0.0,6.06,0.09,0.79,0.0,5.49,-0.0828,-0.5706,0.0114,0.0,-0.0,-0.0,0.0017,-0.0275,0.0381,6261.83 +105,60,1.25,0.0,6.06,0.1,0.9,0.0,5.71,-0.0791,-0.5706,0.0232,0.0,0.0,0.0,0.0037,-0.02,0.0367,6323.0 +106,60,1.28,0.0,6.06,0.1,0.98,0.0,6.83,-0.0761,-0.5706,0.0286,0.0,-0.0,-0.0,0.003,-0.0268,0.0332,6381.0 +107,60,1.23,0.0,6.38,0.11,0.98,0.0,7.27,-0.0743,-0.5706,0.0293,0.0,-0.0,-0.0,0.0018,-0.0246,0.0329,6440.97 +108,60,1.29,0.0,6.52,0.11,1.05,0.0,7.38,-0.0719,-0.5706,0.0253,0.0,0.0,0.0,0.0024,-0.0268,0.0308,6502.63 +109,59,1.22,0.0,7.69,0.1,1.02,0.0,8.78,-0.0707,-0.5707,0.0328,0.0,-0.0,-0.0,0.0009,-0.0327,0.0328,6559.05 +110,60,1.34,0.0,7.69,0.06,1.03,0.0,8.76,-0.0683,-0.5707,0.0271,0.0,0.0,0.0,0.0027,-0.0111,0.0331,6619.15 +111,60,1.23,0.0,5.88,0.06,0.94,0.0,6.27,-0.0671,-0.5707,0.0062,0.0,0.0,0.0,0.0013,-0.029,0.0251,6682.49 +112,60,1.32,0.0,5.45,0.06,1.04,0.0,5.54,-0.0639,-0.5707,0.0234,0.0,-0.0,-0.0,0.0031,-0.0247,0.0302,6734.25 +113,60,1.16,0.0,4.92,0.05,0.92,0.0,5.37,-0.0635,-0.5707,0.0211,0.0,0.0,0.0,0.0005,-0.0274,0.0215,6801.77 +114,60,1.12,0.0,4.92,0.05,0.88,0.0,5.4,-0.0621,-0.5707,0.0178,0.0,0.0,0.0,0.0013,-0.0143,0.021,6860.39 +115,60,1.15,0.0,4.76,0.04,0.9,0.0,5.12,-0.0602,-0.5707,0.0206,0.0,0.0,0.0,0.0019,-0.0202,0.0369,6923.99 +116,60,1.19,0.0,4.76,0.04,0.93,0.0,5.09,-0.058,-0.5708,0.0177,0.0,0.0,0.0,0.0022,-0.0194,0.0336,6983.41 +117,60,1.23,0.0,5.77,0.04,0.99,0.0,5.47,-0.0558,-0.5708,0.0179,0.0,0.0,0.0,0.0022,-0.0339,0.0543,7032.26 +118,60,1.3,0.0,6.45,0.03,1.13,0.0,7.08,-0.0534,-0.5708,0.0284,0.0,0.0,0.0,0.0024,-0.0247,0.0424,7100.77 +119,60,1.25,0.0,6.67,0.03,1.14,0.0,7.43,-0.0527,-0.5708,0.024,0.0,0.0,0.0,0.0007,-0.0272,0.0239,7157.25 +120,60,1.25,0.0,7.41,0.03,1.21,0.0,8.44,-0.052,-0.5708,0.0284,0.0,0.0,0.0,0.0006,-0.0199,0.0221,7223.83 +121,60,1.16,0.0,6.06,0.03,1.13,0.0,6.65,-0.053,-0.5708,0.0182,0.0,0.0,0.0,-0.0009,-0.0288,0.0304,7284.24 +122,60,1.0,0.0,6.12,0.02,0.92,0.0,6.42,-0.0548,-0.5708,0.0161,0.0,0.0,0.0,-0.0018,-0.0516,0.0295,7341.57 +123,60,1.19,0.0,7.5,0.02,1.12,0.0,8.55,-0.0526,-0.5708,0.0409,0.0,0.0,0.0,0.0022,-0.0076,0.0343,7401.78 +124,60,1.19,0.0,6.25,0.02,1.13,0.0,6.84,-0.0522,-0.5708,0.0225,0.0,0.0,0.0,0.0004,-0.0227,0.0317,7455.99 +125,60,1.2,0.0,8.0,0.02,1.15,0.0,9.13,-0.0518,-0.5708,0.0359,0.0,0.0,0.0,0.0003,-0.0282,0.0328,7521.0 +126,60,0.98,0.0,6.45,0.02,0.86,0.0,7.24,-0.054,-0.5708,0.0257,0.0,0.0,0.0,-0.0021,-0.0522,0.0292,7583.55 +127,60,0.97,0.0,7.14,0.02,0.83,0.0,8.03,-0.0534,-0.5708,0.028,0.0,0.0,0.0,0.0005,-0.048,0.0203,7638.09 +128,59,1.04,0.0,6.06,0.02,0.85,0.0,6.57,-0.0518,-0.5708,0.0111,0.0,0.0,0.0,0.0014,-0.0234,0.0254,7698.34 +129,60,1.15,0.0,4.0,0.02,0.9,0.0,4.18,-0.0495,-0.5516,0.0051,0.0,0.0,0.0,0.0025,-0.0381,0.0321,7762.0 +130,59,1.19,0.0,4.76,0.01,1.0,0.0,5.18,-0.0474,-0.5325,0.0169,0.0,0.0,0.0,0.0026,-0.026,0.0291,7822.43 +131,60,1.23,0.0,4.17,0.13,1.03,0.0,4.45,-0.0453,-0.5117,0.0134,0.0,0.0,0.0,0.0017,-0.036,0.025,7877.66 +132,60,1.14,0.0,4.88,0.14,0.97,0.0,5.23,-0.0448,-0.4875,0.0196,0.0,0.0,0.0,0.0005,-0.0453,0.029,7938.84 +133,60,1.24,0.0,4.55,0.14,1.04,0.0,4.9,-0.0427,-0.4664,0.0128,0.0,0.0,0.0,0.0021,-0.0256,0.0293,7999.4 +134,60,1.26,0.0,5.26,0.13,1.07,0.0,5.78,-0.041,-0.441,0.018,0.0,-0.0,-0.0,0.0017,-0.0184,0.0254,8060.65 +135,60,1.35,0.0,9.09,0.12,1.17,0.0,10.6,-0.0386,-0.3937,0.0552,0.0,0.0,0.0,0.0024,-0.0171,0.0473,8119.06 +136,60,1.42,0.0,9.52,0.11,1.26,0.0,11.45,-0.0364,-0.3464,0.0531,0.0,0.0,0.0,0.0021,-0.0212,0.0472,8178.81 +137,60,1.44,0.0,7.69,0.1,1.26,0.0,8.87,-0.035,-0.2981,0.0288,0.0,0.0,0.0,0.0014,-0.0304,0.0577,8238.54 +138,60,1.56,0.0,7.5,0.09,1.33,0.0,8.47,-0.0324,-0.2474,0.0256,0.0,0.0,0.0,0.0026,-0.0563,0.0507,8307.36 +139,60,1.56,0.0,8.51,0.09,1.38,0.0,9.68,-0.0305,-0.2229,0.0314,0.0,0.0,0.0,0.0019,-0.0257,0.0415,8358.78 +140,60,1.45,0.0,8.51,0.08,1.33,0.0,9.66,-0.0301,-0.2027,0.026,0.0,0.0,0.0,0.0004,-0.0381,0.0235,8422.94 +141,60,1.63,0.0,8.16,0.07,1.54,0.0,9.08,-0.0274,-0.195,0.0298,0.0,0.0,0.0,0.0027,-0.0291,0.0375,8483.29 +142,60,1.76,0.0,7.69,0.07,1.72,0.0,8.61,-0.0253,-0.1951,0.035,0.0,0.0,0.0,0.0021,-0.0126,0.0248,8545.7 +143,60,1.53,0.0,9.52,0.07,1.47,0.0,10.58,-0.0273,-0.1951,0.0253,0.0,0.0,0.0,-0.002,-0.0375,0.0189,8600.59 +144,60,1.47,0.0,8.0,0.07,1.41,0.0,8.7,-0.0276,-0.1951,0.0339,0.0,-0.0,-0.0,-0.0003,-0.0313,0.0355,8660.26 +145,60,1.45,0.0,7.5,0.08,1.4,0.0,8.06,-0.0274,-0.1952,0.0277,0.0,0.0,0.0,0.0002,-0.0278,0.0319,8718.79 +146,60,1.45,0.0,7.14,0.08,1.43,0.0,8.22,-0.0272,-0.1952,0.0354,0.0,0.0,0.0,0.0002,-0.0159,0.0206,8783.51 +147,60,1.4,0.0,7.69,0.08,1.34,0.0,8.23,-0.0278,-0.1952,0.0123,0.0,-0.0,-0.0,-0.0006,-0.0354,0.0399,8840.23 +148,60,1.19,0.0,7.89,0.09,1.16,0.0,8.52,-0.0297,-0.1952,0.0181,0.0,-0.0,-0.0,-0.0019,-0.0299,0.0263,8903.99 +149,60,1.07,0.0,5.71,0.09,0.98,0.0,6.12,-0.031,-0.1952,0.0107,0.0,0.0,0.0,-0.0013,-0.0525,0.0313,8956.82 +150,60,1.26,0.0,6.67,0.09,1.2,0.0,7.22,-0.0287,-0.1953,0.0261,0.0,-0.0,-0.0,0.0023,-0.0074,0.0536,9019.26 +151,60,0.9,0.0,6.67,0.1,0.89,0.0,7.74,-0.0321,-0.1953,0.0373,0.0,0.0,0.0,-0.0034,-0.0366,0.0112,9078.08 +152,60,0.85,0.0,5.26,0.1,0.79,0.0,5.92,-0.0329,-0.1953,0.0158,0.0,-0.0,-0.0,-0.0008,-0.0315,0.0235,9140.68 +153,60,0.99,0.0,6.45,0.09,0.91,0.0,7.25,-0.0314,-0.1745,0.0267,0.0,-0.0,-0.0,0.0016,-0.0124,0.0364,9197.49 +154,60,1.02,0.0,6.25,0.08,0.94,0.0,7.0,-0.0306,-0.1417,0.0201,0.0,0.0,0.0,0.0007,-0.0286,0.0475,9261.86 +155,60,0.96,0.0,6.06,0.08,0.89,0.0,6.22,-0.0309,-0.142,0.0146,0.0,0.0,0.0,-0.0003,-0.071,0.0396,9321.1 +156,60,0.92,0.0,6.06,0.07,0.85,0.0,6.31,-0.031,-0.1423,0.0128,0.0,0.0,0.0,-0.0001,-0.029,0.0237,9378.82 +157,60,0.95,0.0,7.89,0.07,0.9,0.0,7.52,-0.0304,-0.1426,0.0102,0.0,0.0,0.0,0.0006,-0.0255,0.0331,9440.11 +158,60,0.98,0.0,7.89,0.06,0.94,0.0,7.89,-0.0298,-0.1428,0.0098,0.0,0.0,0.0,0.0005,-0.0166,0.0247,9500.87 +159,60,0.96,0.0,7.89,0.06,0.93,0.0,8.02,-0.03,-0.143,0.0176,0.0,0.0,0.0,-0.0002,-0.037,0.0199,9557.03 +160,60,0.86,0.0,8.33,0.07,0.86,0.0,8.66,-0.0311,-0.1433,0.0257,0.0,-0.0,-0.0,-0.0011,-0.038,0.0248,9624.04 +161,60,0.89,0.0,7.69,0.07,0.9,0.0,7.92,-0.031,-0.1434,0.0291,0.0,-0.0,-0.0,0.0001,-0.0072,0.0151,9678.52 +162,59,0.81,0.0,6.67,0.07,0.8,0.0,6.69,-0.0324,-0.1436,0.0148,0.0,0.0,0.0,-0.0011,-0.0188,0.0298,9730.77 +163,60,0.69,0.0,5.26,0.06,0.65,0.0,4.97,-0.0335,-0.1438,0.0132,0.0,-0.0,-0.0,-0.0015,-0.0273,0.0135,9808.84 +164,60,0.74,0.0,6.45,0.05,0.69,0.0,7.33,-0.0329,-0.1439,0.0307,0.0,0.0,0.0,0.0006,-0.0213,0.0293,9858.32 +165,60,0.78,0.0,6.25,0.05,0.73,0.0,7.11,-0.0324,-0.1441,0.0238,0.0,0.0,0.0,0.0006,-0.0317,0.0192,9920.99 +166,60,0.87,0.0,5.56,0.04,0.79,0.0,6.31,-0.0313,-0.1242,0.0282,0.0,0.0,0.0,0.0011,-0.0182,0.0377,9983.67 +167,60,0.8,0.0,5.56,0.05,0.71,0.0,6.34,-0.0314,-0.1066,0.0238,0.0,0.0,0.0,-0.0001,-0.0323,0.0249,10042.56 +168,60,0.83,0.0,5.13,0.05,0.76,0.0,5.69,-0.0305,-0.0907,0.0162,0.0,-0.0,-0.0,0.0009,-0.0248,0.0224,10098.23 +169,60,0.83,0.0,4.44,0.05,0.75,0.0,4.72,-0.0301,-0.081,0.0046,0.0,0.0,0.0,0.0004,-0.0204,0.0262,10164.53 +170,60,0.86,0.0,4.55,0.06,0.81,0.0,4.77,-0.0293,-0.0811,0.0189,0.0,-0.0,-0.0,0.0008,-0.0274,0.0224,10220.52 +171,60,0.84,0.0,5.26,0.06,0.79,0.0,5.75,-0.0292,-0.0811,0.0249,0.0,0.0,0.0,0.0001,-0.0299,0.0256,10285.04 +172,60,0.86,0.0,4.65,0.07,0.81,0.0,5.05,-0.0287,-0.0811,0.0149,0.0,-0.0,-0.0,0.0005,-0.01,0.0256,10335.78 +173,60,0.88,0.0,5.0,0.07,0.84,0.0,5.28,-0.0283,-0.0811,0.0127,0.0,0.0,0.0,0.0004,-0.0202,0.0085,10398.52 +174,60,0.87,0.0,4.44,0.08,0.83,0.0,4.62,-0.0283,-0.0811,0.0114,0.0,-0.0,-0.0,0.0,-0.0296,0.0291,10465.06 +175,60,0.74,0.0,4.65,0.08,0.7,0.0,4.82,-0.0295,-0.0811,0.0079,0.0,0.0,0.0,-0.0012,-0.028,0.0176,10524.59 +176,60,0.73,0.0,6.98,0.09,0.7,0.0,7.71,-0.0294,-0.0811,0.0302,0.0,0.0,0.0,0.0001,-0.0255,0.0348,10581.6 +177,60,0.69,0.0,5.88,0.08,0.67,0.0,6.4,-0.0299,-0.0811,0.0247,0.0,-0.0,-0.0,-0.0004,-0.0371,0.0525,10636.41 +178,59,0.64,0.0,5.56,0.07,0.62,0.0,6.37,-0.0305,-0.0811,0.0258,0.0,0.0,0.0,-0.0006,-0.0261,0.0115,10699.91 +179,58,0.51,0.0,5.13,0.09,0.49,0.0,5.75,-0.0317,-0.0811,0.0164,0.0,0.0,0.0,-0.0006,-0.0263,0.0268,10765.58 +180,60,0.61,0.0,7.14,0.03,0.58,0.0,8.18,-0.0308,-0.0811,0.0339,0.0,0.0,0.0,0.0002,-0.0257,0.0183,10802.23 +181,7,1.46,0.0,3.33,0.03,1.29,0.0,2.96,-0.0157,-0.0338,-0.0021,0.0,0.0,0.0,0.004,-0.0007,0.0179,10823.46 diff --git a/experiments/results/csv/near_target_error_rate_adaptive_time_analysis.csv b/experiments/results/csv/near_target_error_rate_adaptive_time_analysis.csv new file mode 100644 index 000000000..7a5151a5d --- /dev/null +++ b/experiments/results/csv/near_target_error_rate_adaptive_time_analysis.csv @@ -0,0 +1,7 @@ +Time Range,Total Requests,Success,Errors,Error %,Rejected,Rejected %,Target Error Rate % +0-30s,8248,8151,94,1.14,3,0.04,1.0 +30-60s,7982,7870,101,1.27,11,0.14,1.2 +60-90s,7938,7773,110,1.39,55,0.69,1.2 +90-120s,8156,7981,103,1.26,72,0.88,1.2 +120-150s,8116,7923,99,1.22,94,1.16,1.2 +150-180s,8152,8020,67,0.82,65,0.8,1.0 diff --git a/experiments/results/csv/near_target_error_rate_time_analysis.csv b/experiments/results/csv/near_target_error_rate_time_analysis.csv new file mode 100644 index 000000000..d39093d60 --- /dev/null +++ b/experiments/results/csv/near_target_error_rate_time_analysis.csv @@ -0,0 +1,7 @@ +Time Range,Total Requests,Success,Errors,Error %,Rejected,Rejected %,Target Error Rate % +0-30s,17043,16864,179,1.05,0,0.0,1.0 +30-60s,17522,17319,203,1.16,0,0.0,1.2 +60-90s,17528,17333,195,1.11,0,0.0,1.2 +90-120s,17521,17318,203,1.16,0,0.0,1.2 +120-150s,17451,17261,190,1.09,0,0.0,1.2 +150-180s,17493,17297,196,1.12,0,0.0,1.0 diff --git a/experiments/results/csv/one_of_many_services_latency_degradation_adaptive_pid_controller.csv b/experiments/results/csv/one_of_many_services_latency_degradation_adaptive_pid_controller.csv new file mode 100644 index 000000000..efee64e72 --- /dev/null +++ b/experiments/results/csv/one_of_many_services_latency_degradation_adaptive_pid_controller.csv @@ -0,0 +1,422 @@ +Window,Thread Count,Error Rate Avg,Error Rate Min,Error Rate Max,Ideal Error Rate,Rejection Rate Avg,Rejection Rate Min,Rejection Rate Max,Integral Avg,Integral Min,Integral Max,Derivative Avg,Derivative Min,Derivative Max,P Value Avg,P Value Min,P Value Max,Total Request Time +1,31,0.0,0.0,0.0,4.61,0.0,0.0,0.0,-0.0461,-0.0461,-0.0461,0.0,-0.0,-0.0,-0.0461,-0.0461,-0.0461,111.58 +2,45,1.11,0.0,50.0,4.25,1.2,0.0,54.0,-0.0644,-0.0886,0.45,0.0,0.0,0.0,-0.0326,-0.0461,0.45,169.57 +3,52,0.96,0.0,50.0,3.92,1.56,0.0,81.36,-0.0929,-0.1278,0.603,0.0,0.0,0.0,-0.0373,-0.0461,0.153,227.41 +4,56,0.6,0.0,33.33,3.61,1.03,0.0,57.45,-0.1294,-0.1639,0.3033,0.0,0.0,0.0,-0.0431,-0.2997,-0.0361,288.44 +5,57,0.58,0.0,33.33,3.33,0.84,0.0,48.11,-0.1617,-0.1972,0.1749,0.0,0.0,0.0,-0.0374,-0.1284,-0.0333,349.22 +6,58,0.43,0.0,25.0,3.33,0.51,0.0,29.42,-0.1973,-0.228,-0.01,0.0,0.0,0.0,-0.0356,-0.1849,-0.0307,407.96 +7,55,0.45,0.0,25.0,3.07,0.45,0.0,24.98,-0.223,-0.2563,-0.0454,0.0,0.0,0.0,-0.0309,-0.0461,-0.0283,463.04 +8,59,0.34,0.0,20.0,2.61,0.28,0.0,16.59,-0.2519,-0.2824,-0.0886,0.0,0.0,0.0,-0.0291,-0.0623,-0.0261,527.14 +9,59,0.34,0.0,20.0,2.41,0.26,0.0,15.51,-0.2776,-0.3065,-0.0987,0.0,0.0,0.0,-0.0257,-0.0392,0.009,589.21 +10,60,0.56,0.0,33.33,2.22,0.57,0.0,34.2,-0.2942,-0.3287,0.0734,0.0,0.0,0.0,-0.0213,-0.0461,0.1721,648.36 +11,60,0.56,0.0,33.33,2.05,0.67,0.0,40.26,-0.3159,-0.3491,0.1117,0.0,0.0,0.0,-0.0216,-0.0425,0.0383,707.35 +12,60,0.58,0.0,25.0,2.05,0.51,0.0,27.84,-0.3368,-0.368,-0.0104,0.0,0.0,0.0,-0.0209,-0.122,0.0777,770.79 +13,60,0.82,0.0,25.0,1.74,0.61,0.0,24.91,-0.3526,-0.3854,-0.0331,0.0,0.0,0.0,-0.0158,-0.0361,0.1224,828.26 +14,60,1.14,0.0,33.33,1.6,1.09,0.0,36.82,-0.3642,-0.4014,0.0717,0.0,0.0,0.0,-0.0116,-0.0333,0.1702,890.56 +15,60,1.06,0.0,28.57,1.48,1.1,0.0,33.49,-0.3793,-0.4162,0.0354,0.0,0.0,0.0,-0.0151,-0.0946,0.0919,948.5 +16,60,1.08,0.0,28.57,1.36,1.14,0.0,36.5,-0.393,-0.4298,0.0545,0.0,0.0,0.0,-0.0137,-0.0283,0.0375,1007.55 +17,60,1.02,0.0,25.0,1.36,1.06,0.0,31.39,-0.4067,-0.4424,0.0029,0.0,0.0,0.0,-0.0137,-0.0517,0.0195,1071.58 +18,60,1.48,0.0,33.33,1.26,1.5,0.0,36.69,-0.4136,-0.454,0.0747,0.0,0.0,0.0,-0.0069,-0.0241,0.1097,1128.3 +19,60,1.96,0.0,50.0,1.16,2.38,0.0,71.66,-0.4168,-0.4647,0.3317,0.0,0.0,0.0,-0.0032,-0.0222,0.2942,1182.79 +20,60,1.68,0.0,66.67,1.07,2.22,0.0,100.0,-0.4275,-0.4746,0.7244,0.0,0.0,0.0,-0.0106,-0.4711,0.3927,1249.6 +21,60,1.35,0.0,66.67,0.99,1.86,0.0,100.0,-0.4363,-0.4836,1.0168,0.0,0.0,0.0,-0.0088,-0.2518,0.2924,1310.85 +22,60,1.39,0.0,66.67,0.91,1.92,0.0,100.0,-0.4402,-0.492,1.3092,0.0,0.0,0.0,-0.0039,-0.0392,0.2924,1370.03 +23,60,0.24,0.0,14.29,0.91,0.24,0.0,12.92,-0.4665,-0.4997,0.2715,0.0,0.0,0.0,-0.0263,-1.0377,-0.0077,1427.02 +24,60,0.24,0.0,14.29,0.84,0.26,0.0,12.88,-0.475,-0.5272,0.2372,0.0,0.0,0.0,-0.0085,-0.0342,0.0125,1489.21 +25,60,0.24,0.0,14.29,0.77,0.25,0.0,13.13,-0.4831,-0.5579,0.191,0.0,0.0,0.0,-0.0081,-0.0463,0.0129,1546.61 +26,60,0.75,0.0,16.67,0.61,0.5,0.0,13.37,-0.4853,-0.5863,0.1542,0.0,0.0,0.0,-0.0022,-0.0368,0.1601,1609.98 +27,60,0.65,0.0,14.29,0.66,0.46,0.0,13.57,-0.4901,-0.6124,0.1246,0.0,0.0,0.0,-0.0048,-0.0296,0.0648,1668.54 +28,60,0.57,0.0,14.29,0.61,0.27,0.0,9.88,-0.4952,-0.6364,0.1008,0.0,0.0,0.0,-0.0051,-0.1539,0.1055,1729.49 +29,60,0.58,0.0,16.67,0.56,0.34,0.0,14.52,-0.4977,-0.6586,0.0817,0.0,0.0,0.0,-0.0025,-0.0222,0.0771,1789.56 +30,60,0.67,0.0,20.0,0.51,0.52,0.0,20.61,-0.4994,-0.6791,0.0663,0.0,0.0,0.0,-0.0017,-0.0205,0.0909,1831.62 +31,60,0.71,0.0,20.0,0.4,0.64,0.0,22.33,-0.5018,-0.698,0.0539,0.0,0.0,0.0,-0.0024,-0.0189,0.0713,1857.24 +32,60,0.74,0.0,20.0,0.37,0.72,0.0,22.93,-0.5045,-0.7154,0.0439,0.0,0.0,0.0,-0.0027,-0.0174,0.0617,1866.93 +33,60,0.78,0.0,20.0,0.34,0.8,0.0,23.22,-0.5071,-0.7314,0.0355,0.0,0.0,0.0,-0.0026,-0.016,0.0577,1874.38 +34,60,0.83,0.0,20.0,0.32,0.91,0.0,23.39,-0.5094,-0.7462,0.0278,0.0,0.0,0.0,-0.0024,-0.0148,0.0603,1875.4 +35,60,0.94,0.0,25.0,0.29,1.09,0.0,30.93,-0.5111,-0.7598,0.0445,0.0,0.0,0.0,-0.0017,-0.0136,0.0664,1875.54 +36,60,0.42,0.0,25.0,0.27,0.53,0.0,31.56,-0.5204,-0.7724,0.0658,0.0,0.0,0.0,-0.0093,-0.3172,0.0643,1875.54 +37,59,0.56,0.0,33.33,0.25,0.79,0.0,46.72,-0.521,-0.784,0.1812,0.0,0.0,0.0,-0.0012,-0.0116,0.1154,1875.54 +38,60,0.0,0.0,0.0,0.27,0.0,0.0,0.0,-0.5324,-0.7947,0.0025,0.0,0.0,0.0,-0.0108,-0.475,-0.0023,1875.54 +39,60,0.0,0.0,0.0,0.25,0.0,0.0,0.0,-0.5351,-0.8045,-0.0027,0.0,0.0,0.0,-0.0028,-0.0099,-0.0021,1875.54 +40,60,41.67,0.0,100.0,0.23,41.67,0.0,100.0,-0.1211,-0.8136,0.8216,0.0,0.0,0.0,0.414,-0.0091,0.9979,2216.66 +41,60,68.33,0.0,100.0,0.23,68.33,0.0,100.0,0.5586,-0.5699,1.8106,0.0,0.0,0.0,0.6797,-0.0056,0.9981,2347.65 +42,60,86.67,0.0,100.0,0.23,86.67,0.0,100.0,1.4208,-0.5715,2.7996,0.0,-0.0,-0.0,0.8622,-0.0019,0.9982,2465.75 +43,60,96.67,0.0,100.0,0.23,96.67,0.0,100.0,2.3826,-0.573,3.7885,0.0,0.0,0.0,0.9618,-0.0015,0.9983,2556.95 +44,60,98.33,0.0,100.0,0.23,98.33,0.0,100.0,3.3609,-0.5744,4.7775,0.0,0.0,0.0,0.9783,-0.0014,0.9985,2585.69 +45,60,100.0,100.0,100.0,0.23,100.0,100.0,100.0,4.3558,0.4242,5.7665,0.0,0.0,0.0,0.9949,0.9818,0.9986,2630.02 +46,60,100.0,100.0,100.0,0.23,100.0,100.0,100.0,5.3507,1.4214,6.7555,0.0,0.0,0.0,0.9949,0.9818,0.9972,2660.96 +47,60,100.0,100.0,100.0,0.23,100.0,100.0,100.0,6.3456,2.4185,7.7445,0.0,0.0,0.0,0.9949,0.9818,0.9972,2695.59 +48,59,100.0,100.0,100.0,0.23,100.0,100.0,100.0,7.3226,3.4157,8.7334,0.0,0.0,0.0,0.9949,0.9818,0.9972,2729.28 +49,60,100.0,100.0,100.0,0.23,100.0,100.0,100.0,8.3188,4.4129,9.7224,0.0,0.0,0.0,0.9949,0.9818,0.9972,2761.32 +50,60,70.0,0.0,100.0,0.23,100.0,100.0,100.0,8.6558,5.4101,10.0,0.0,0.0,0.0,0.395,-1.0102,0.9972,2931.28 +51,60,60.0,0.0,100.0,0.23,100.0,100.0,100.0,8.6564,6.392,10.0,0.0,0.0,0.0,0.1952,-1.0168,0.9972,3037.54 +52,60,53.33,0.0,100.0,0.23,100.0,100.0,100.0,8.4174,5.389,10.0,0.0,0.0,0.0,0.0621,-1.0154,0.9972,3140.95 +53,60,46.67,0.0,100.0,0.23,99.79,87.44,100.0,7.962,4.3862,10.0,0.0,0.0,0.0,-0.0711,-1.0142,0.9972,3226.97 +54,60,46.67,0.0,100.0,0.23,96.44,69.94,100.0,7.4555,3.5093,10.0,0.0,0.0,0.0,-0.0688,-1.0131,0.9972,3290.0 +55,60,45.0,0.0,100.0,0.23,90.36,55.95,100.0,6.9392,2.8079,10.0,0.0,0.0,0.0,-0.0684,-1.0063,0.9967,3347.15 +56,60,45.0,0.0,100.0,0.23,83.35,44.76,100.0,6.484,2.2466,10.0,0.0,0.0,0.0,-0.0074,-1.003,0.9967,3399.36 +57,60,45.0,0.0,100.0,0.23,76.38,35.8,100.0,6.099,1.7975,10.0,0.0,0.0,0.0,0.063,-1.0026,0.9967,3447.87 +58,60,45.0,0.0,100.0,0.23,70.43,28.64,100.0,5.784,1.4382,10.0,0.0,0.0,0.0,0.1329,-1.002,0.9967,3498.01 +59,60,45.0,0.0,100.0,0.23,65.47,22.9,100.0,5.5287,1.1507,10.0,0.0,0.0,0.0,0.1925,-1.0019,0.9967,3538.59 +60,60,30.0,0.0,100.0,0.23,61.37,18.32,100.0,5.1724,0.9207,10.0,0.0,0.0,0.0,-0.0577,-1.005,0.9967,3574.6 +61,60,15.0,0.0,100.0,0.21,58.09,14.65,100.0,4.7067,0.7367,10.0,0.0,-0.0,-0.0,-0.3164,-1.0074,0.9967,3606.65 +62,60,5.0,0.0,100.0,0.19,55.47,11.71,100.0,4.1734,0.5894,10.0,0.0,0.0,0.0,-0.4834,-1.0103,0.9967,3637.21 +63,60,0.0,0.0,0.0,0.18,53.37,9.36,100.0,3.6164,0.4716,8.997,0.0,0.0,0.0,-0.557,-1.0095,-0.1178,3666.91 +64,60,1.67,0.0,100.0,0.17,53.13,9.21,100.0,3.0988,0.4677,7.9941,0.0,0.0,0.0,-0.5176,-1.0087,0.9993,3706.12 +65,60,5.0,0.0,100.0,0.15,51.81,7.36,100.0,2.6354,0.3743,6.9916,0.0,0.0,0.0,-0.4635,-1.0081,0.9993,3764.6 +66,60,15.0,0.0,100.0,0.14,54.72,5.87,100.0,2.3236,0.2996,5.9892,0.0,0.0,0.0,-0.3117,-1.0074,0.9994,3858.05 +67,60,20.0,0.0,100.0,0.13,52.44,4.69,100.0,2.1287,0.2398,4.987,0.0,0.0,0.0,-0.195,-1.0024,0.9994,3919.75 +68,60,28.33,0.0,100.0,0.12,53.86,3.74,100.0,2.0914,0.1919,5.466,0.0,0.0,0.0,-0.0372,-0.9972,0.9995,4003.21 +69,60,36.67,0.0,100.0,0.11,56.77,3.04,100.0,2.2054,0.1544,6.4647,0.0,0.0,0.0,0.114,-0.7976,0.9995,4073.42 +70,59,40.68,0.0,100.0,0.1,56.88,2.43,100.0,2.3716,0.1236,7.4635,0.0,0.0,0.0,0.2029,-0.6382,0.9996,4133.06 +71,60,46.67,0.0,100.0,0.06,59.22,1.94,100.0,2.7134,0.0989,8.4622,0.0,0.0,0.0,0.3085,-0.5106,0.9996,4187.26 +72,58,51.72,0.0,100.0,0.06,61.21,1.55,100.0,3.1537,0.0791,9.461,0.0,0.0,0.0,0.3974,-0.4085,0.9997,4234.49 +73,60,51.67,0.0,100.0,0.07,59.76,1.94,100.0,3.5043,0.0988,10.0,0.0,0.0,0.0,0.4143,-0.3268,0.9997,4274.67 +74,45,53.33,0.0,100.0,0.07,59.72,1.55,100.0,4.0159,0.0791,10.0,0.0,0.0,0.0,0.4523,-0.2615,0.9993,4310.62 +75,60,48.33,0.0,100.0,0.06,58.82,1.55,100.0,4.166,0.0791,10.0,0.0,0.0,0.0,0.3636,-1.0012,0.9997,4335.8 +76,60,41.67,0.0,100.0,0.06,57.72,1.23,100.0,4.3826,0.0633,10.0,0.0,0.0,0.0,0.2441,-1.0012,0.9993,4403.17 +77,56,46.43,0.0,100.0,0.05,63.9,5.42,100.0,4.3157,0.2744,10.0,0.0,0.0,0.0,0.2807,-1.0011,0.9997,4464.4 +78,58,43.1,0.0,100.0,0.09,69.39,4.33,100.0,4.8497,0.2195,10.0,0.0,0.0,0.0,0.1617,-1.0023,0.9994,4566.39 +79,60,48.33,0.0,100.0,0.05,78.01,3.46,100.0,4.8447,0.1757,10.0,0.0,-0.0,-0.0,0.1821,-1.0022,0.9996,4684.07 +80,60,53.33,0.0,100.0,0.08,86.56,2.77,100.0,4.9423,0.1406,10.0,0.0,0.0,0.0,0.1919,-1.002,0.9996,4774.83 +81,58,53.45,0.0,100.0,0.07,90.74,3.45,100.0,5.0649,0.1756,10.0,0.0,0.0,0.0,0.1405,-1.0033,0.9996,4836.96 +82,60,51.67,0.0,100.0,0.04,88.16,2.75,100.0,5.028,0.1406,10.0,0.0,-0.0,-0.0,0.1219,-1.003,0.9993,4889.37 +83,60,53.33,0.0,100.0,0.11,85.86,2.2,100.0,5.1116,0.1125,10.0,0.0,0.0,0.0,0.1681,-1.0028,0.9996,4959.3 +84,59,55.93,0.0,100.0,0.04,85.03,2.22,100.0,5.2504,0.1125,10.0,0.0,0.0,0.0,0.2285,-1.0026,0.9997,4997.06 +85,56,53.57,0.0,100.0,0.04,79.87,1.77,100.0,5.2214,0.0901,10.0,0.0,0.0,0.0,0.2283,-1.0024,0.9993,5033.58 +86,60,55.0,0.0,100.0,0.04,76.97,1.42,100.0,5.5373,0.0721,10.0,0.0,0.0,0.0,0.287,-1.0006,0.9993,5079.58 +87,60,50.0,0.0,100.0,0.02,73.24,1.13,100.0,5.6269,0.0577,10.0,0.0,0.0,0.0,0.2295,-1.0011,0.9993,5141.45 +88,60,45.0,0.0,100.0,0.1,69.92,0.9,100.0,5.6515,0.0462,10.0,0.0,0.0,0.0,0.1669,-1.002,0.9993,5197.76 +89,60,41.67,0.0,100.0,0.02,68.92,10.71,100.0,5.5738,0.5365,10.0,0.0,0.0,0.0,0.1169,-1.0019,0.9998,5271.17 +90,60,35.0,0.0,100.0,0.02,66.47,8.56,100.0,5.3731,0.4292,10.0,0.0,0.0,0.0,0.0101,-1.002,0.9996,5335.02 +91,60,30.0,0.0,100.0,0.02,66.06,6.85,100.0,5.1065,0.3434,10.0,0.0,0.0,0.0,-0.0806,-1.0022,0.9998,5366.94 +92,60,28.33,0.0,100.0,0.01,65.41,6.85,100.0,4.8077,0.3434,10.0,0.0,0.0,0.0,-0.11,-1.002,0.9998,5435.87 +93,60,36.67,0.0,100.0,0.03,68.57,5.48,100.0,4.6211,0.2748,10.0,0.0,0.0,0.0,0.0172,-1.0019,0.9998,5511.9 +94,60,33.33,0.0,100.0,0.03,66.73,4.38,100.0,4.4004,0.2198,10.0,0.0,0.0,0.0,-0.0348,-1.0017,0.9997,5588.37 +95,60,41.67,0.0,100.0,0.03,70.94,3.51,100.0,4.2881,0.1759,10.0,0.0,-0.0,-0.0,0.0875,-1.0016,0.9999,5637.85 +96,60,41.67,0.0,100.0,0.03,66.41,2.8,100.0,4.2117,0.1407,10.0,0.0,0.0,0.0,0.1235,-1.0008,0.9998,5695.25 +97,60,45.0,0.0,100.0,0.02,68.8,2.24,100.0,4.2181,0.1126,10.0,0.0,0.0,0.0,0.1729,-1.001,0.9999,5762.68 +98,59,45.76,0.0,100.0,0.02,70.02,1.79,100.0,4.2464,0.0901,10.0,0.0,0.0,0.0,0.1835,-1.001,0.9999,5828.08 +99,60,46.67,0.0,100.0,0.02,71.94,4.39,100.0,4.3442,0.2199,10.0,0.0,0.0,0.0,0.1795,-1.0011,0.9999,5903.67 +100,60,43.33,0.0,100.0,0.02,70.79,3.51,100.0,4.4185,0.1759,10.0,0.0,0.0,0.0,0.1313,-1.0011,0.9999,5938.09 +101,60,41.67,0.0,100.0,0.02,70.24,2.81,100.0,4.4885,0.1407,10.0,0.0,0.0,0.0,0.1091,-1.0011,0.9999,5991.12 +102,58,41.38,0.0,100.0,0.02,68.43,5.49,100.0,4.4787,0.2748,10.0,0.0,0.0,0.0,0.1183,-1.001,0.9999,6022.48 +103,59,35.59,0.0,100.0,0.02,66.35,4.39,100.0,4.4927,0.2199,10.0,0.0,-0.0,-0.0,0.0219,-1.0009,0.9999,6094.85 +104,60,38.33,0.0,100.0,0.05,66.96,3.51,100.0,4.5152,0.1759,10.0,0.0,0.0,0.0,0.0668,-1.0008,0.9999,6139.27 +105,59,33.9,0.0,100.0,0.05,65.18,2.81,100.0,4.4504,0.1407,10.0,0.0,0.0,0.0,-0.0057,-1.0006,0.9999,6193.94 +106,60,38.33,0.0,100.0,0.03,66.84,4.39,100.0,4.4269,0.2198,10.0,0.0,0.0,0.0,0.0643,-1.0006,0.9999,6245.63 +107,60,36.67,0.0,100.0,0.02,65.71,3.51,100.0,4.3747,0.1759,10.0,0.0,0.0,0.0,0.0492,-1.0005,0.9999,6330.02 +108,58,41.38,0.0,100.0,0.02,69.46,2.81,100.0,4.2596,0.1407,10.0,0.0,0.0,0.0,0.1013,-1.0009,0.9999,6412.88 +109,60,43.33,0.0,100.0,0.01,72.25,2.81,100.0,4.3549,0.1407,10.0,0.0,0.0,0.0,0.1133,-1.0008,0.9999,6490.97 +110,59,44.07,0.0,100.0,0.01,71.97,2.24,100.0,4.3777,0.1126,10.0,0.0,-0.0,-0.0,0.1255,-1.0008,0.9999,6535.35 +111,58,44.83,0.0,100.0,0.02,71.08,2.81,100.0,4.2923,0.1407,10.0,0.0,0.0,0.0,0.1543,-1.0007,0.9999,6606.25 +112,58,46.55,0.0,100.0,0.01,69.58,4.39,100.0,4.3784,0.2199,10.0,0.0,0.0,0.0,0.2032,-1.0007,0.9999,6641.78 +113,60,46.67,0.0,100.0,0.01,67.47,3.51,100.0,4.5312,0.1759,10.0,0.0,0.0,0.0,0.2272,-1.0003,0.9999,6700.17 +114,60,45.0,0.0,100.0,0.01,67.48,2.81,100.0,4.6037,0.1407,10.0,0.0,0.0,0.0,0.1937,-1.0006,0.9999,6735.75 +115,60,43.33,0.0,100.0,0.01,64.32,2.25,100.0,4.6682,0.1126,10.0,0.0,0.0,0.0,0.1916,-1.0005,0.9999,6819.27 +116,60,45.0,0.0,100.0,0.01,66.54,1.8,100.0,4.7446,0.0901,10.0,0.0,0.0,0.0,0.2097,-1.0005,0.9999,6873.58 +117,60,48.33,0.0,100.0,0.01,69.29,1.44,100.0,4.8507,0.0721,10.0,0.0,0.0,0.0,0.2545,-1.0004,0.9999,6939.8 +118,60,40.0,0.0,100.0,0.01,69.02,1.15,100.0,4.8194,0.0577,10.0,0.0,0.0,0.0,0.0912,-1.0006,0.9999,6983.66 +119,60,36.67,0.0,100.0,0.01,68.1,0.92,100.0,4.7341,0.0461,10.0,0.0,0.0,0.0,0.0277,-1.0005,0.9999,7079.97 +120,60,43.33,0.0,100.0,0.01,75.36,0.73,100.0,4.7031,0.0369,10.0,0.0,-0.0,-0.0,0.0911,-1.0005,1.0,7149.93 +121,60,43.33,0.0,100.0,0.01,76.06,0.59,100.0,4.6666,0.0295,10.0,0.0,0.0,0.0,0.0824,-1.0004,1.0,7218.06 +122,60,43.33,0.0,100.0,0.01,77.06,0.47,100.0,4.6406,0.0236,10.0,0.0,0.0,0.0,0.074,-1.0004,1.0,7289.0 +123,60,48.33,0.0,100.0,0.01,78.13,4.39,100.0,4.6787,0.2199,10.0,0.0,0.0,0.0,0.1481,-1.0003,1.0,7326.57 +124,60,43.33,0.0,100.0,0.01,74.17,3.51,100.0,4.6806,0.1759,10.0,0.0,0.0,0.0,0.0852,-1.0003,0.9999,7385.69 +125,60,45.0,0.0,100.0,0.01,73.51,4.39,100.0,4.7255,0.2199,10.0,0.0,0.0,0.0,0.1268,-1.0003,1.0,7457.37 +126,60,43.33,0.0,100.0,0.01,71.4,3.52,100.0,4.7407,0.1759,10.0,0.0,0.0,0.0,0.1157,-1.0003,0.9999,7497.57 +127,60,41.67,0.0,100.0,0.01,69.41,3.52,100.0,4.7393,0.1759,10.0,0.0,0.0,0.0,0.1031,-1.0002,1.0,7547.33 +128,60,40.0,0.0,100.0,0.0,68.12,2.81,100.0,4.7389,0.1407,10.0,0.0,0.0,0.0,0.0901,-1.0002,1.0,7583.75 +129,60,38.33,0.0,100.0,0.0,64.83,2.25,100.0,4.7129,0.1126,10.0,0.0,0.0,0.0,0.0854,-1.0002,1.0,7668.54 +130,60,36.67,0.0,100.0,0.0,66.75,5.49,100.0,4.6184,0.2748,10.0,0.0,0.0,0.0,0.0364,-1.0003,1.0,7722.92 +131,60,33.33,0.0,100.0,0.0,63.73,4.39,100.0,4.4785,0.2199,10.0,0.0,0.0,0.0,-0.0009,-1.0002,1.0,7772.5 +132,60,33.33,0.0,100.0,0.0,63.79,3.51,100.0,4.349,0.1759,10.0,0.0,0.0,0.0,-0.0017,-1.0002,1.0,7841.21 +133,60,35.0,0.0,100.0,0.0,63.9,2.81,100.0,4.2293,0.1407,10.0,0.0,0.0,0.0,0.0303,-1.0002,1.0,7890.81 +134,60,35.0,0.0,100.0,0.01,62.71,2.25,100.0,4.1173,0.1126,10.0,0.0,0.0,0.0,0.0451,-1.0002,1.0,7931.27 +135,60,40.0,0.0,100.0,0.01,65.14,1.8,100.0,4.0738,0.0901,10.0,0.0,0.0,0.0,0.111,-1.0001,1.0,8008.52 +136,60,43.33,0.0,100.0,0.01,68.15,1.44,100.0,4.0898,0.0721,10.0,0.0,0.0,0.0,0.1522,-1.0003,1.0,8106.17 +137,60,45.0,0.0,100.0,0.01,69.63,1.44,100.0,4.1398,0.0721,10.0,0.0,-0.0,-0.0,0.1712,-1.0003,1.0,8144.96 +138,60,45.0,0.0,100.0,0.01,66.43,1.15,100.0,4.2101,0.0577,10.0,0.0,0.0,0.0,0.2036,-1.0003,1.0,8180.51 +139,60,46.67,0.0,100.0,0.01,65.38,0.92,100.0,4.3231,0.0461,10.0,0.0,0.0,0.0,0.2535,-1.0002,1.0,8228.2 +140,60,40.0,0.0,100.0,0.01,66.25,1.8,100.0,4.3533,0.0901,10.0,0.0,0.0,0.0,0.1135,-1.0002,1.0,8297.84 +141,60,46.67,0.0,100.0,0.01,71.66,3.52,100.0,4.4666,0.1759,10.0,0.0,0.0,0.0,0.1917,-1.0002,1.0,8352.59 +142,60,45.0,0.0,100.0,0.01,69.0,2.81,100.0,4.5584,0.1407,10.0,0.0,0.0,0.0,0.1833,-1.0001,1.0,8435.46 +143,60,46.67,0.0,100.0,0.01,73.19,2.25,100.0,4.668,0.1126,10.0,0.0,0.0,0.0,0.1809,-1.0001,1.0,8489.41 +144,60,50.0,0.0,100.0,0.01,74.81,5.5,100.0,4.7958,0.2749,10.0,0.0,0.0,0.0,0.2357,-1.0001,1.0,8551.48 +145,60,50.0,0.0,100.0,0.01,73.09,4.4,100.0,4.8806,0.2199,10.0,0.0,0.0,0.0,0.2363,-1.0001,1.0,8625.94 +146,60,43.33,0.0,100.0,0.01,71.74,4.4,100.0,4.8696,0.2199,10.0,0.0,-0.0,-0.0,0.1198,-1.0002,1.0,8699.56 +147,60,46.67,0.0,100.0,0.01,73.81,3.52,100.0,4.8887,0.1759,10.0,0.0,0.0,0.0,0.169,-1.0002,1.0,8757.05 +148,60,46.67,0.0,100.0,0.0,72.33,4.39,100.0,4.9288,0.2199,10.0,0.0,0.0,0.0,0.1792,-1.0002,1.0,8808.36 +149,60,51.67,0.0,100.0,0.0,76.21,3.52,100.0,5.0391,0.1759,10.0,0.0,0.0,0.0,0.2473,-1.0002,1.0,8874.26 +150,60,48.33,0.0,100.0,0.0,75.59,2.81,100.0,5.0789,0.1407,10.0,0.0,0.0,0.0,0.1884,-1.0002,1.0,8921.03 +151,60,45.0,0.0,100.0,0.0,73.77,4.4,100.0,5.0568,0.2199,10.0,0.0,0.0,0.0,0.1279,-1.0001,1.0,8971.54 +152,60,43.33,0.0,100.0,0.0,70.68,3.52,100.0,5.0313,0.1759,10.0,0.0,0.0,0.0,0.129,-1.0001,1.0,9035.17 +153,60,45.0,0.0,100.0,0.0,72.64,2.94,100.0,5.0059,0.1469,10.0,0.0,0.0,0.0,0.1461,-1.0001,1.0,9127.48 +154,60,50.0,0.0,100.0,0.0,76.18,4.39,100.0,5.0286,0.2199,10.0,0.0,0.0,0.0,0.2117,-1.0001,1.0,9210.05 +155,59,45.76,0.0,100.0,0.0,72.82,3.52,100.0,4.9625,0.1759,10.0,0.0,0.0,0.0,0.1575,-1.0001,1.0,9250.79 +156,60,43.33,0.0,100.0,0.0,69.95,2.81,100.0,4.9976,0.1407,10.0,0.0,0.0,0.0,0.1339,-1.0001,1.0,9307.09 +157,60,40.0,0.0,100.0,0.0,70.11,2.25,100.0,4.9308,0.1126,10.0,0.0,0.0,0.0,0.0694,-1.0,1.0,9388.35 +158,60,46.67,0.0,100.0,0.0,75.04,4.4,100.0,4.9313,0.2199,10.0,0.0,0.0,0.0,0.1536,-1.0,1.0,9453.99 +159,60,41.67,0.0,100.0,0.0,72.7,3.52,100.0,4.8613,0.1759,10.0,0.0,0.0,0.0,0.0829,-1.0,1.0,9497.52 +160,60,38.33,0.0,100.0,0.0,69.49,2.81,100.0,4.7509,0.1407,10.0,0.0,0.0,0.0,0.0397,-1.0001,1.0,9533.32 +161,60,36.67,0.0,100.0,0.0,66.59,2.25,100.0,4.656,0.1126,10.0,0.0,0.0,0.0,0.0384,-1.0,1.0,9568.68 +162,60,38.33,0.0,100.0,0.0,64.49,1.8,100.0,4.5935,0.0901,10.0,0.0,0.0,0.0,0.0855,-1.0,1.0,9617.63 +163,60,36.67,0.0,100.0,0.0,67.67,2.81,100.0,4.4945,0.1407,10.0,0.0,0.0,0.0,0.0249,-1.0001,1.0,9706.48 +164,60,31.67,0.0,100.0,0.0,65.48,2.25,100.0,4.3348,0.1126,10.0,0.0,0.0,0.0,-0.0596,-1.0001,1.0,9757.9 +165,60,30.0,0.0,100.0,0.0,62.05,1.8,100.0,4.1967,0.0901,10.0,0.0,0.0,0.0,-0.0548,-1.0001,1.0,9823.55 +166,60,38.33,0.0,100.0,0.0,67.04,2.81,100.0,4.168,0.1407,10.0,0.0,0.0,0.0,0.0661,-1.0001,1.0,9896.78 +167,60,36.67,0.0,100.0,0.0,66.26,3.52,100.0,4.1075,0.1759,10.0,0.0,0.0,0.0,0.0467,-1.0001,1.0,9944.58 +168,60,33.33,0.0,100.0,0.0,64.3,3.52,100.0,3.9788,0.1759,10.0,0.0,0.0,0.0,-0.012,-1.0001,1.0,9996.19 +169,60,33.33,0.0,100.0,0.0,61.65,2.81,100.0,3.8872,0.1407,10.0,0.0,0.0,0.0,0.0085,-1.0,1.0,10059.23 +170,60,36.67,0.0,100.0,0.0,61.22,2.25,100.0,3.872,0.1126,10.0,0.0,0.0,0.0,0.0848,-1.0,1.0,10103.92 +171,60,38.33,0.0,100.0,0.0,59.93,1.8,100.0,3.9032,0.0901,10.0,0.0,0.0,0.0,0.1384,-1.0,1.0,10168.45 +172,60,46.67,0.0,100.0,0.0,66.6,2.25,100.0,4.0257,0.1126,10.0,0.0,0.0,0.0,0.2383,-1.0,1.0,10244.73 +173,60,45.0,0.0,100.0,0.0,66.47,4.4,100.0,4.1092,0.2199,10.0,0.0,-0.0,-0.0,0.2025,-1.0,1.0,10324.85 +174,60,43.33,0.0,100.0,0.0,66.68,3.52,100.0,4.1965,0.1759,10.0,0.0,0.0,0.0,0.1707,-1.0,1.0,10365.74 +175,60,45.0,0.0,100.0,0.0,67.55,2.81,100.0,4.3042,0.1407,10.0,0.0,0.0,0.0,0.2014,-1.0,1.0,10430.38 +176,60,41.67,0.0,100.0,0.0,68.89,2.25,100.0,4.3448,0.1126,10.0,0.0,0.0,0.0,0.1263,-1.0,1.0,10489.37 +177,60,43.33,0.0,100.0,0.0,71.92,3.52,100.0,4.4054,0.1759,10.0,0.0,0.0,0.0,0.1302,-1.0,1.0,10567.5 +178,60,43.33,0.0,100.0,0.0,72.72,2.81,100.0,4.4643,0.1407,10.0,0.0,0.0,0.0,0.116,-1.0,1.0,10600.09 +179,60,45.0,0.0,100.0,0.0,74.36,2.81,100.0,4.5375,0.1407,10.0,0.0,0.0,0.0,0.1262,-1.0,1.0,10667.83 +180,60,45.0,0.0,100.0,0.0,73.38,2.25,100.0,4.6257,0.1126,10.0,0.0,0.0,0.0,0.1411,-1.0,1.0,10715.03 +181,60,45.0,0.0,100.0,0.0,71.42,1.8,100.0,4.7073,0.0901,10.0,0.0,0.0,0.0,0.1531,-1.0,1.0,10773.39 +182,60,43.33,0.0,100.0,0.0,72.95,1.44,100.0,4.7198,0.0721,10.0,0.0,-0.0,-0.0,0.1048,-1.0,1.0,10852.43 +183,60,40.0,0.0,100.0,0.0,72.67,2.81,100.0,4.6979,0.1407,10.0,0.0,0.0,0.0,0.0383,-1.0,1.0,10919.68 +184,60,40.0,0.0,100.0,0.0,69.47,2.25,100.0,4.6803,0.1126,10.0,0.0,0.0,0.0,0.0733,-1.0,1.0,10967.9 +185,59,40.68,0.0,100.0,0.0,70.92,1.8,100.0,4.6031,0.0901,10.0,0.0,0.0,0.0,0.0753,-1.0,1.0,11063.98 +186,60,46.67,0.0,100.0,0.0,75.23,3.52,100.0,4.7066,0.1759,10.0,0.0,0.0,0.0,0.1554,-1.0,1.0,11134.18 +187,60,46.67,0.0,100.0,0.0,74.79,8.59,100.0,4.737,0.4295,10.0,0.0,0.0,0.0,0.1526,-1.0,1.0,11175.86 +188,60,45.0,0.0,100.0,0.0,70.83,6.87,100.0,4.7558,0.3436,10.0,0.0,-0.0,-0.0,0.1521,-1.0,1.0,11231.83 +189,59,40.68,0.0,100.0,0.0,68.67,5.5,100.0,4.7898,0.2749,10.0,0.0,0.0,0.0,0.0951,-1.0,1.0,11267.41 +190,60,40.0,0.0,100.0,0.0,66.09,5.5,100.0,4.6761,0.2749,10.0,0.0,0.0,0.0,0.1072,-1.0,1.0,11314.42 +191,60,40.0,0.0,100.0,0.0,64.8,4.4,100.0,4.6543,0.2199,10.0,0.0,0.0,0.0,0.1234,-1.0,1.0,11370.97 +192,60,35.0,0.0,100.0,0.0,65.32,3.52,100.0,4.5695,0.1759,10.0,0.0,0.0,0.0,0.021,-1.0,1.0,11417.77 +193,60,38.33,0.0,100.0,0.0,67.39,2.81,100.0,4.5189,0.1407,10.0,0.0,0.0,0.0,0.066,-1.0,1.0,11501.85 +194,60,40.0,0.0,100.0,0.0,69.1,4.4,100.0,4.5031,0.2199,10.0,0.0,0.0,0.0,0.078,-1.0,1.0,11561.64 +195,60,40.0,0.0,100.0,0.0,69.46,4.4,100.0,4.4612,0.2199,10.0,0.0,-0.0,-0.0,0.0776,-1.0,1.0,11613.68 +196,60,36.67,0.0,100.0,0.0,66.9,3.52,100.0,4.347,0.1759,10.0,0.0,0.0,0.0,0.0388,-1.0,1.0,11677.51 +197,60,35.0,0.0,100.0,0.0,64.8,2.81,100.0,4.2286,0.1407,10.0,0.0,0.0,0.0,0.0149,-1.0,1.0,11729.17 +198,59,33.9,0.0,100.0,0.0,64.16,2.81,100.0,4.0614,0.1407,10.0,0.0,0.0,0.0,0.0031,-1.0,1.0,11778.9 +199,60,38.33,0.0,100.0,0.0,64.6,2.25,100.0,4.12,0.1126,10.0,0.0,0.0,0.0,0.0883,-1.0,1.0,11829.89 +200,59,42.37,0.0,100.0,0.0,65.07,1.8,100.0,4.2095,0.0901,10.0,0.0,0.0,0.0,0.1654,-1.0,1.0,11900.19 +201,60,46.67,0.0,100.0,0.0,69.37,1.44,100.0,4.2696,0.0721,10.0,0.0,0.0,0.0,0.2079,-1.0,1.0,11947.02 +202,60,51.67,0.0,100.0,0.0,71.02,1.15,100.0,4.4154,0.0576,10.0,0.0,0.0,0.0,0.2915,-1.0,1.0,12024.91 +203,60,48.33,0.0,100.0,0.0,69.34,0.92,100.0,4.5145,0.0461,10.0,0.0,0.0,0.0,0.2416,-1.0,1.0,12086.26 +204,59,47.46,0.0,100.0,0.0,67.92,2.25,100.0,4.5977,0.1126,10.0,0.0,0.0,0.0,0.2442,-1.0,1.0,12147.69 +205,60,46.67,0.0,100.0,0.0,69.68,4.4,100.0,4.6448,0.2199,10.0,0.0,0.0,0.0,0.2165,-1.0,1.0,12195.06 +206,60,46.67,0.0,100.0,0.0,72.13,3.52,100.0,4.7318,0.1759,10.0,0.0,0.0,0.0,0.19,-1.0,1.0,12265.09 +207,60,46.67,0.0,100.0,0.0,71.99,3.52,100.0,4.8225,0.1759,10.0,0.0,0.0,0.0,0.1959,-1.0,1.0,12315.59 +208,60,48.33,0.0,100.0,0.0,74.25,2.81,100.0,4.9106,0.1407,10.0,0.0,0.0,0.0,0.201,-1.0,1.0,12356.43 +209,60,50.0,0.0,100.0,0.0,75.23,2.25,100.0,5.0111,0.1126,10.0,0.0,0.0,0.0,0.2263,-1.0,1.0,12429.75 +210,60,51.67,0.0,100.0,0.0,75.7,4.4,100.0,5.1113,0.2199,10.0,0.0,0.0,0.0,0.2495,-1.0,1.0,12502.86 +211,60,53.33,0.0,100.0,0.0,75.78,3.52,100.0,5.1897,0.1759,10.0,0.0,0.0,0.0,0.2778,-1.0,1.0,12585.09 +212,60,51.67,0.0,100.0,0.0,76.13,4.4,100.0,5.2249,0.2199,10.0,0.0,0.0,0.0,0.2442,-1.0,1.0,12661.84 +213,59,50.85,0.0,100.0,0.0,76.04,4.4,100.0,5.2822,0.2199,10.0,0.0,-0.0,-0.0,0.2275,-1.0,1.0,12723.31 +214,59,49.15,0.0,100.0,0.0,74.97,3.52,100.0,5.3443,0.1759,10.0,0.0,0.0,0.0,0.2069,-1.0,1.0,12779.61 +215,59,52.54,0.0,100.0,0.0,76.35,2.81,100.0,5.3797,0.1407,10.0,0.0,0.0,0.0,0.2659,-1.0,1.0,12846.77 +216,60,50.0,0.0,100.0,0.0,75.76,2.81,100.0,5.3734,0.1407,10.0,0.0,0.0,0.0,0.2196,-1.0,1.0,12882.42 +217,57,47.37,0.0,100.0,0.0,73.44,2.25,100.0,5.3706,0.1126,10.0,0.0,0.0,0.0,0.1873,-1.0,1.0,12914.52 +218,60,48.33,0.0,100.0,0.0,73.53,2.81,100.0,5.3411,0.1407,10.0,0.0,0.0,0.0,0.2016,-1.0,1.0,12988.88 +219,60,46.67,0.0,100.0,0.0,70.49,2.25,100.0,5.3097,0.1126,10.0,0.0,0.0,0.0,0.198,-1.0,1.0,13051.98 +220,60,45.0,0.0,100.0,0.0,70.86,1.8,100.0,5.25,0.0901,10.0,0.0,0.0,0.0,0.1643,-1.0,1.0,13122.09 +221,60,45.0,0.0,100.0,0.0,74.41,4.4,100.0,5.192,0.2199,10.0,0.0,0.0,0.0,0.1282,-1.0,1.0,13200.42 +222,60,40.0,0.0,100.0,0.0,73.13,5.5,100.0,5.0832,0.2749,10.0,0.0,0.0,0.0,0.04,-1.0,1.0,13264.37 +223,60,40.0,0.0,100.0,0.0,72.1,4.4,100.0,4.9637,0.2199,10.0,0.0,0.0,0.0,0.0529,-1.0,1.0,13295.47 +224,60,40.0,0.0,100.0,0.0,72.88,4.4,100.0,4.8398,0.2199,10.0,0.0,0.0,0.0,0.0473,-1.0,1.0,13362.86 +225,60,40.0,0.0,100.0,0.0,71.55,3.52,100.0,4.7431,0.1759,10.0,0.0,0.0,0.0,0.0557,-1.0,1.0,13458.61 +226,60,45.0,0.0,100.0,0.0,74.25,3.52,100.0,4.7093,0.1759,10.0,0.0,0.0,0.0,0.1219,-1.0,1.0,13505.5 +227,60,45.0,0.0,100.0,0.0,70.07,2.81,100.0,4.6925,0.1407,10.0,0.0,0.0,0.0,0.1575,-1.0,1.0,13534.68 +228,60,40.0,0.0,100.0,0.0,66.39,2.25,100.0,4.6419,0.1126,10.0,0.0,0.0,0.0,0.0993,-1.0,1.0,13582.95 +229,60,38.33,0.0,100.0,0.0,64.68,1.8,100.0,4.5996,0.0901,10.0,0.0,0.0,0.0,0.0873,-1.0,1.0,13645.17 +230,60,40.0,0.0,100.0,0.0,66.13,1.44,100.0,4.5723,0.0721,10.0,0.0,0.0,0.0,0.1067,-1.0,1.0,13726.45 +231,60,41.67,0.0,100.0,0.0,68.12,2.81,100.0,4.5421,0.1407,10.0,0.0,0.0,0.0,0.1234,-1.0,1.0,13776.31 +232,60,43.33,0.0,100.0,0.0,67.38,2.25,100.0,4.541,0.1126,10.0,0.0,0.0,0.0,0.1702,-1.0,1.0,13834.08 +233,60,41.67,0.0,100.0,0.0,67.8,2.81,100.0,4.5269,0.1407,10.0,0.0,0.0,0.0,0.1274,-1.0,1.0,13871.65 +234,59,40.68,0.0,100.0,0.0,69.18,2.25,100.0,4.5531,0.1126,10.0,0.0,0.0,0.0,0.0928,-1.0,1.0,13934.06 +235,60,38.33,0.0,100.0,0.0,66.76,1.8,100.0,4.4453,0.0901,10.0,0.0,-0.0,-0.0,0.0697,-1.0,1.0,13992.53 +236,60,41.67,0.0,100.0,0.0,68.51,3.52,100.0,4.4139,0.1759,10.0,0.0,0.0,0.0,0.1186,-1.0,1.0,14075.54 +237,60,43.33,0.0,100.0,0.0,67.75,2.81,100.0,4.4295,0.1407,10.0,0.0,0.0,0.0,0.1656,-1.0,1.0,14104.8 +238,60,45.0,0.0,100.0,0.0,66.44,2.25,100.0,4.4808,0.1126,10.0,0.0,0.0,0.0,0.207,-1.0,1.0,14167.06 +239,58,50.0,0.0,100.0,0.0,68.41,1.8,100.0,4.6354,0.0901,10.0,0.0,0.0,0.0,0.2828,-1.0,1.0,14245.16 +240,60,50.0,0.0,100.0,0.0,69.82,1.44,100.0,4.6858,0.0721,10.0,0.0,0.0,0.0,0.2731,-1.0,1.0,14302.31 +241,60,50.0,0.0,100.0,0.0,71.74,3.52,100.0,4.7652,0.1759,10.0,0.0,0.0,0.0,0.2532,-1.0,1.0,14392.71 +242,60,51.67,0.0,100.0,0.0,72.55,2.81,100.0,4.8787,0.1407,10.0,0.0,0.0,0.0,0.2848,-1.0,1.0,14445.94 +243,60,51.67,0.0,100.0,0.0,70.71,2.25,100.0,4.9881,0.1126,10.0,0.0,0.0,0.0,0.3078,-1.0,1.0,14488.32 +244,60,48.33,0.0,100.0,0.0,70.45,1.8,100.0,5.0324,0.0901,10.0,0.0,0.0,0.0,0.2443,-1.0,1.0,14551.78 +245,60,55.0,0.0,100.0,0.0,74.77,2.25,100.0,5.15,0.1126,10.0,0.0,0.0,0.0,0.332,-1.0,1.0,14602.84 +246,60,45.0,0.0,100.0,0.0,73.68,1.8,100.0,5.1504,0.0901,10.0,0.0,0.0,0.0,0.1374,-1.0,1.0,14662.1 +247,60,48.33,0.0,100.0,0.0,74.49,1.8,100.0,5.1927,0.0901,10.0,0.0,0.0,0.0,0.198,-1.0,1.0,14739.05 +248,60,51.67,0.0,100.0,0.0,75.76,1.44,100.0,5.2668,0.0721,10.0,0.0,0.0,0.0,0.2571,-1.0,1.0,14807.94 +249,60,51.67,0.0,100.0,0.0,74.92,2.81,100.0,5.315,0.1407,10.0,0.0,0.0,0.0,0.2593,-1.0,1.0,14887.38 +250,60,53.33,0.0,100.0,0.0,79.22,2.25,100.0,5.3633,0.1126,10.0,0.0,0.0,0.0,0.2556,-1.0,1.0,14955.17 +251,60,46.67,0.0,100.0,0.0,77.01,4.4,100.0,5.3107,0.2199,10.0,0.0,0.0,0.0,0.1249,-1.0,1.0,15028.29 +252,60,46.67,0.0,100.0,0.0,77.1,3.52,100.0,5.2761,0.1759,10.0,0.0,0.0,0.0,0.132,-1.0,1.0,15086.29 +253,60,46.67,0.0,100.0,0.0,76.3,3.52,100.0,5.2651,0.1759,10.0,0.0,0.0,0.0,0.1462,-1.0,1.0,15135.65 +254,60,45.0,0.0,100.0,0.0,74.04,2.81,100.0,5.2362,0.1407,10.0,0.0,0.0,0.0,0.137,-1.0,1.0,15216.0 +255,60,43.33,0.0,100.0,0.0,74.47,2.25,100.0,5.1547,0.1126,10.0,0.0,0.0,0.0,0.0941,-1.0,1.0,15259.08 +256,60,41.67,0.0,100.0,0.0,70.58,1.8,100.0,5.0695,0.0901,10.0,0.0,-0.0,-0.0,0.0886,-1.0,1.0,15296.49 +257,60,36.67,0.0,100.0,0.0,66.79,1.44,100.0,4.9367,0.0721,10.0,0.0,0.0,0.0,0.0276,-1.0,1.0,15340.72 +258,60,36.67,0.0,100.0,0.0,66.66,3.52,100.0,4.819,0.1759,10.0,0.0,0.0,0.0,0.0334,-1.0,1.0,15396.76 +259,60,35.0,0.0,100.0,0.0,65.27,2.81,100.0,4.679,0.1407,10.0,0.0,0.0,0.0,0.0175,-1.0,1.0,15466.59 +260,60,33.33,0.0,100.0,0.0,68.29,3.52,100.0,4.511,0.1759,10.0,0.0,0.0,0.0,-0.0495,-1.0,1.0,15546.01 +261,60,31.67,0.0,100.0,0.0,66.92,3.52,100.0,4.3345,0.1759,10.0,0.0,0.0,0.0,-0.0656,-1.0,1.0,15592.23 +262,60,30.0,0.0,100.0,0.0,65.09,2.81,100.0,4.1471,0.1407,10.0,0.0,0.0,0.0,-0.0844,-1.0,1.0,15645.76 +263,60,33.33,0.0,100.0,0.0,66.49,2.25,100.0,4.016,0.1126,10.0,0.0,0.0,0.0,-0.0312,-1.0,1.0,15699.24 +264,60,33.33,0.0,100.0,0.0,64.83,2.81,100.0,3.912,0.1407,10.0,0.0,0.0,0.0,-0.0146,-1.0,1.0,15766.17 +265,60,33.33,0.0,100.0,0.0,62.14,2.25,100.0,3.8145,0.1126,10.0,0.0,0.0,0.0,0.0024,-1.0,1.0,15822.22 +266,60,36.67,0.0,100.0,0.0,61.24,1.8,100.0,3.7948,0.0901,10.0,0.0,0.0,0.0,0.0803,-1.0,1.0,15879.93 +267,60,43.33,0.0,100.0,0.0,63.72,2.25,100.0,3.8788,0.1126,10.0,0.0,0.0,0.0,0.1909,-1.0,1.0,15968.4 +268,60,43.33,0.0,100.0,0.0,63.48,1.8,100.0,3.9733,0.0901,10.0,0.0,0.0,0.0,0.1981,-1.0,1.0,16025.11 +269,60,43.33,0.0,100.0,0.0,63.69,3.52,100.0,4.0736,0.1759,10.0,0.0,0.0,0.0,0.1997,-1.0,1.0,16082.16 +270,60,36.67,0.0,100.0,0.0,62.56,2.81,100.0,4.0845,0.1407,10.0,0.0,0.0,0.0,0.0805,-1.0,1.0,16136.83 +271,60,41.67,0.0,100.0,0.0,66.79,3.52,100.0,4.155,0.1759,10.0,0.0,0.0,0.0,0.1443,-1.0,1.0,16204.1 +272,60,40.0,0.0,100.0,0.0,66.72,3.52,100.0,4.2059,0.1759,10.0,0.0,0.0,0.0,0.116,-1.0,1.0,16250.14 +273,60,40.0,0.0,100.0,0.0,67.9,3.52,100.0,4.2386,0.1759,10.0,0.0,0.0,0.0,0.1012,-1.0,1.0,16324.37 +274,60,41.67,0.0,100.0,0.0,68.88,3.52,100.0,4.2905,0.1759,10.0,0.0,0.0,0.0,0.1223,-1.0,1.0,16368.53 +275,60,40.0,0.0,100.0,0.0,68.65,4.4,100.0,4.3279,0.2199,10.0,0.0,-0.0,-0.0,0.0793,-1.0,1.0,16426.77 +276,60,40.0,0.0,100.0,0.0,67.18,3.52,100.0,4.3589,0.1759,10.0,0.0,0.0,0.0,0.0977,-1.0,1.0,16471.08 +277,60,36.67,0.0,100.0,0.0,67.27,2.81,100.0,4.3286,0.1407,10.0,0.0,0.0,0.0,0.03,-1.0,1.0,16548.27 +278,60,38.33,0.0,100.0,0.0,70.52,2.25,100.0,4.3202,0.1126,10.0,0.0,0.0,0.0,0.031,-1.0,1.0,16600.62 +279,60,36.67,0.0,100.0,0.0,67.75,1.8,100.0,4.2947,0.0901,10.0,0.0,0.0,0.0,0.0281,-1.0,1.0,16669.7 +280,60,40.0,0.0,100.0,0.0,69.38,1.44,100.0,4.303,0.0721,10.0,0.0,0.0,0.0,0.0745,-1.0,1.0,16727.11 +281,60,40.0,0.0,100.0,0.0,71.33,1.15,100.0,4.2918,0.0576,10.0,0.0,0.0,0.0,0.0584,-1.0,1.0,16809.82 +282,60,41.67,0.0,100.0,0.0,70.95,1.15,100.0,4.3046,0.0576,10.0,0.0,0.0,0.0,0.0881,-1.0,1.0,16862.94 +283,60,40.0,0.0,100.0,0.0,68.72,0.92,100.0,4.3057,0.0461,10.0,0.0,0.0,0.0,0.0744,-1.0,1.0,16928.18 +284,60,41.67,0.0,100.0,0.0,66.94,0.74,100.0,4.3281,0.0369,10.0,0.0,0.0,0.0,0.1299,-1.0,1.0,16996.58 +285,60,41.67,0.0,100.0,0.0,67.12,5.5,100.0,4.3554,0.2749,10.0,0.0,-0.0,-0.0,0.1318,-1.0,1.0,17034.86 +286,60,41.67,0.0,100.0,0.0,66.82,4.4,100.0,4.3943,0.2199,10.0,0.0,0.0,0.0,0.1314,-1.0,1.0,17088.9 +287,60,40.0,0.0,100.0,0.0,65.37,3.52,100.0,4.4089,0.1759,10.0,0.0,0.0,0.0,0.1163,-1.0,1.0,17144.67 +288,60,38.33,0.0,100.0,0.0,65.42,2.81,100.0,4.3911,0.1407,10.0,0.0,0.0,0.0,0.0822,-1.0,1.0,17197.82 +289,60,35.0,0.0,100.0,0.0,63.0,2.25,100.0,4.3475,0.1126,10.0,0.0,0.0,0.0,0.0458,-1.0,1.0,17245.54 +290,60,35.0,0.0,100.0,0.0,60.4,1.8,100.0,4.2898,0.0901,10.0,0.0,0.0,0.0,0.07,-1.0,1.0,17284.94 +291,60,33.33,0.0,100.0,0.0,60.84,1.44,100.0,4.1975,0.0721,10.0,0.0,0.0,0.0,0.0311,-1.0,1.0,17393.12 +292,60,41.67,0.0,100.0,0.0,67.66,1.8,100.0,4.1905,0.0901,10.0,0.0,0.0,0.0,0.1292,-1.0,1.0,17464.7 +293,60,40.0,0.0,100.0,0.0,65.84,1.44,100.0,4.179,0.0721,10.0,0.0,0.0,0.0,0.107,-1.0,1.0,17511.29 +294,60,40.0,0.0,100.0,0.0,67.42,1.15,100.0,4.1841,0.0576,10.0,0.0,0.0,0.0,0.0948,-1.0,1.0,17570.9 +295,60,38.33,0.0,100.0,0.0,66.51,0.92,100.0,4.1648,0.0461,10.0,0.0,0.0,0.0,0.077,-1.0,1.0,17623.99 +296,60,41.67,0.0,100.0,0.0,70.03,0.74,100.0,4.1796,0.0369,10.0,0.0,0.0,0.0,0.1038,-1.0,1.0,17674.84 +297,60,41.67,0.0,100.0,0.0,68.93,0.59,100.0,4.201,0.0295,10.0,0.0,-0.0,-0.0,0.1175,-1.0,1.0,17726.19 +298,60,41.67,0.0,100.0,0.0,69.43,2.81,100.0,4.2289,0.1407,10.0,0.0,0.0,0.0,0.1113,-1.0,1.0,17789.66 +299,60,46.67,0.0,100.0,0.0,71.03,2.81,100.0,4.3369,0.1407,10.0,0.0,0.0,0.0,0.1913,-1.0,1.0,17841.55 +300,60,43.33,0.0,100.0,0.0,67.82,2.25,100.0,4.4342,0.1126,10.0,0.0,0.0,0.0,0.1564,-1.0,1.0,17881.89 +301,60,46.67,0.0,100.0,0.0,70.99,3.52,100.0,4.5542,0.1759,10.0,0.0,0.0,0.0,0.1918,-1.0,1.0,17970.19 +302,60,43.33,0.0,100.0,0.0,69.75,3.52,100.0,4.5934,0.1759,10.0,0.0,0.0,0.0,0.1407,-1.0,1.0,18039.5 +303,60,45.0,0.0,100.0,0.0,68.37,2.81,100.0,4.6477,0.1407,10.0,0.0,0.0,0.0,0.187,-1.0,1.0,18104.72 +304,59,45.76,0.0,100.0,0.0,70.1,2.25,100.0,4.7623,0.1126,10.0,0.0,0.0,0.0,0.1915,-1.0,1.0,18145.13 +305,57,47.37,0.0,100.0,0.0,69.29,1.8,100.0,4.81,0.0901,10.0,0.0,0.0,0.0,0.2304,-1.0,1.0,18201.82 +306,58,48.28,0.0,100.0,0.0,69.58,1.44,100.0,4.8407,0.0721,10.0,0.0,0.0,0.0,0.2423,-1.0,1.0,18287.0 +307,60,50.0,0.0,100.0,0.0,70.73,1.8,100.0,4.8919,0.0901,10.0,0.0,0.0,0.0,0.2618,-1.0,1.0,18343.03 +308,59,45.76,0.0,100.0,0.0,69.31,1.44,100.0,4.8383,0.0721,10.0,0.0,-0.0,-0.0,0.1972,-1.0,1.0,18402.17 +309,59,47.46,0.0,100.0,0.0,68.99,2.25,100.0,4.8912,0.1126,10.0,0.0,0.0,0.0,0.2393,-1.0,1.0,18455.98 +310,59,50.85,0.0,100.0,0.0,70.76,3.52,100.0,5.0738,0.1759,10.0,0.0,0.0,0.0,0.285,-1.0,1.0,18535.41 +311,59,50.85,0.0,100.0,0.0,73.84,3.52,100.0,5.0712,0.1759,10.0,0.0,0.0,0.0,0.255,-1.0,1.0,18611.37 +312,59,44.07,0.0,100.0,0.0,73.21,2.81,100.0,5.0354,0.1407,10.0,0.0,0.0,0.0,0.1272,-1.0,1.0,18667.37 +313,58,43.1,0.0,100.0,0.0,73.41,2.25,100.0,5.0087,0.1126,10.0,0.0,0.0,0.0,0.1039,-1.0,1.0,18723.81 +314,60,43.33,0.0,100.0,0.0,73.59,2.81,100.0,4.9463,0.1407,10.0,0.0,0.0,0.0,0.1052,-1.0,1.0,18780.68 +315,60,43.33,0.0,100.0,0.0,73.11,2.25,100.0,4.9237,0.1126,10.0,0.0,0.0,0.0,0.1153,-1.0,1.0,18813.5 +316,60,40.0,0.0,100.0,0.0,70.49,1.8,100.0,4.8626,0.0901,10.0,0.0,0.0,0.0,0.0689,-1.0,1.0,18891.11 +317,60,40.0,0.0,100.0,0.0,71.59,2.25,100.0,4.7915,0.1126,10.0,0.0,0.0,0.0,0.0467,-1.0,1.0,18947.31 +318,60,40.0,0.0,100.0,0.0,69.52,1.8,100.0,4.7365,0.0901,10.0,0.0,0.0,0.0,0.0685,-1.0,1.0,19014.73 +319,59,38.98,0.0,100.0,0.0,69.61,1.44,100.0,4.7119,0.0721,10.0,0.0,0.0,0.0,0.0494,-1.0,1.0,19057.11 +320,60,38.33,0.0,100.0,0.0,68.87,1.15,100.0,4.6065,0.0576,10.0,0.0,0.0,0.0,0.0475,-1.0,1.0,19137.27 +321,60,38.33,0.0,100.0,0.0,70.64,3.52,100.0,4.5136,0.1759,10.0,0.0,0.0,0.0,0.0295,-1.0,1.0,19213.21 +322,60,40.0,0.0,100.0,0.0,70.38,2.81,100.0,4.4544,0.1407,10.0,0.0,0.0,0.0,0.062,-1.0,1.0,19254.29 +323,60,41.67,0.0,100.0,0.0,68.93,4.4,100.0,4.4296,0.2199,10.0,0.0,0.0,0.0,0.1134,-1.0,1.0,19321.02 +324,60,40.0,0.0,100.0,0.0,67.07,3.52,100.0,4.3855,0.1759,10.0,0.0,0.0,0.0,0.095,-1.0,1.0,19368.78 +325,60,41.67,0.0,100.0,0.0,66.85,2.81,100.0,4.3832,0.1407,10.0,0.0,0.0,0.0,0.131,-1.0,1.0,19424.5 +326,59,44.07,0.0,100.0,0.0,67.33,4.4,100.0,4.4903,0.2199,10.0,0.0,0.0,0.0,0.1711,-1.0,1.0,19464.08 +327,60,38.33,0.0,100.0,0.0,63.14,3.52,100.0,4.4059,0.1759,10.0,0.0,0.0,0.0,0.1024,-1.0,1.0,19515.64 +328,54,40.74,0.0,100.0,0.0,64.93,2.81,100.0,4.5387,0.1407,10.0,0.0,0.0,0.0,0.1421,-1.0,1.0,19587.17 +329,57,45.61,0.0,100.0,0.0,70.43,4.4,100.0,4.6293,0.2199,10.0,0.0,0.0,0.0,0.181,-1.0,1.0,19638.2 +330,60,45.0,0.0,100.0,0.0,68.44,4.4,100.0,4.4943,0.2199,10.0,0.0,0.0,0.0,0.1903,-1.0,1.0,19722.88 +331,60,42.5,0.0,100.0,0.0,68.71,3.52,100.0,4.4944,0.1759,10.0,0.0,0.0,0.0,0.1421,-1.0,1.0,19780.22 +332,57,40.35,0.0,100.0,0.0,68.64,2.81,100.0,4.5187,0.1407,10.0,0.0,0.0,0.0,0.0975,-1.0,1.0,19840.53 +333,60,36.67,0.0,100.0,0.0,65.53,2.25,100.0,4.3846,0.1126,10.0,0.0,0.0,0.0,0.0545,-1.0,1.0,19901.41 +334,60,38.33,0.0,100.0,0.0,66.39,1.8,100.0,4.345,0.0901,10.0,0.0,0.0,0.0,0.08,-1.0,1.0,19978.99 +335,60,39.72,0.0,100.0,0.0,67.6,1.44,100.0,4.3151,0.0721,10.0,0.0,0.0,0.0,0.0948,-1.0,1.0,20083.84 +336,59,44.49,0.0,100.0,0.0,69.94,1.8,100.0,4.3614,0.0901,10.0,0.0,0.0,0.0,0.1573,-1.0,1.0,20145.28 +337,60,42.64,0.0,100.0,0.0,68.53,2.81,100.0,4.3077,0.1407,10.0,0.0,0.0,0.0,0.1359,-1.0,1.0,20218.92 +338,60,41.72,0.0,100.0,0.0,68.13,2.25,100.0,4.2747,0.0897,10.0,0.0,0.0,0.0,0.1206,-1.0,1.0,20306.18 +339,60,37.14,0.0,100.0,0.0,67.77,1.8,100.0,4.163,0.0488,10.0,0.0,0.0,0.0,0.0325,-1.0,1.0,20386.43 +340,60,33.61,0.0,100.0,0.0,66.87,1.8,100.0,4.0109,-0.0095,10.0,0.0,0.0,0.0,-0.0297,-1.0,1.0,20444.98 +341,60,27.78,0.0,100.0,0.0,63.03,0.0,100.0,3.8077,-0.1329,10.0,0.0,0.0,0.0,-0.1199,-1.0,1.0,20506.96 +342,59,25.52,0.0,100.0,0.0,58.02,0.0,100.0,3.5493,-0.162,10.0,0.0,0.0,0.0,-0.1196,-1.0,1.0,20567.75 +343,60,25.39,0.0,100.0,0.0,56.66,0.0,100.0,3.4615,-0.2068,10.0,0.0,0.0,0.0,-0.0881,-1.0,1.0,20627.34 +344,59,21.58,0.0,100.0,0.0,52.67,0.0,100.0,3.3095,-0.2068,10.0,0.0,0.0,0.0,-0.1503,-1.0,1.0,20687.54 +345,57,19.21,0.0,100.0,0.0,47.94,0.0,100.0,3.1618,-0.2068,10.0,0.0,0.0,0.0,-0.1505,-1.0,1.0,20743.68 +346,60,10.2,0.0,100.0,0.0,42.76,0.0,100.0,2.7681,-0.2068,10.0,0.0,0.0,0.0,-0.2723,-1.0,1.0,20803.84 +347,60,8.35,0.0,100.0,0.0,38.8,0.0,100.0,2.4804,-0.2068,10.0,0.0,0.0,0.0,-0.2664,-1.0,1.0,20867.8 +348,60,6.68,0.0,100.0,0.0,35.85,0.0,100.0,2.1972,-0.2068,10.0,0.0,0.0,0.0,-0.2609,-1.0,1.0,20925.79 +349,60,2.33,0.0,100.0,0.0,31.01,0.0,100.0,1.8786,-0.2068,10.0,0.0,0.0,0.0,-0.317,-1.0,1.0,20984.94 +350,60,1.67,0.0,50.0,0.0,29.75,0.0,100.0,1.5887,-0.2068,9.0,0.0,0.0,0.0,-0.2899,-1.0,0.4161,21046.57 +351,60,2.06,0.0,50.0,0.0,26.96,0.0,100.0,1.3205,-0.2068,8.0,0.0,0.0,0.0,-0.2682,-1.0,0.3173,21110.33 +352,60,1.81,0.0,50.0,0.0,23.56,0.0,100.0,1.0811,-0.2068,7.0,0.0,0.0,0.0,-0.2394,-1.0,0.104,21167.86 +353,60,0.74,0.0,33.33,0.0,18.52,0.0,100.0,0.8575,-0.3498,6.0,0.0,0.0,0.0,-0.2236,-1.0,0.0,21227.9 +354,60,0.95,0.0,33.33,0.0,15.6,0.0,100.0,0.686,-0.3498,5.0,0.0,0.0,0.0,-0.1714,-1.0,0.1149,21288.7 +355,60,2.12,0.0,50.0,0.0,14.32,0.0,100.0,0.5582,-0.3498,4.0,0.0,0.0,0.0,-0.1278,-1.0,0.3362,21345.29 +356,60,1.98,0.0,50.0,0.0,11.92,0.0,100.0,0.447,-0.3498,3.2,0.0,0.0,0.0,-0.1112,-0.8,0.0411,21400.43 +357,60,2.23,0.0,50.0,0.0,10.5,0.0,100.0,0.3626,-0.3498,2.56,0.0,0.0,0.0,-0.0844,-0.64,0.0651,21466.01 +358,60,2.38,0.0,50.0,0.0,9.38,0.0,100.0,0.2947,-0.3498,2.048,0.0,0.0,0.0,-0.0679,-0.512,0.0893,21528.35 +359,60,2.4,0.0,50.0,0.0,8.31,0.0,100.0,0.2385,-0.3498,1.9746,0.0,0.0,0.0,-0.0561,-0.4096,0.0004,21583.95 +360,60,1.91,0.0,50.0,0.0,6.6,0.0,100.0,0.1853,-0.3908,1.9746,0.0,0.0,0.0,-0.0532,-0.5452,0.0309,21648.95 +361,60,1.65,0.0,50.0,0.0,5.56,0.0,100.0,0.1462,-0.3908,1.9746,0.0,0.0,0.0,-0.0391,-0.2621,0.0106,21704.61 +362,60,1.71,0.0,50.0,0.0,5.04,0.0,100.0,0.1179,-0.3908,1.9746,0.0,0.0,0.0,-0.0282,-0.2097,0.0194,21766.95 +363,60,1.65,0.0,50.0,0.0,4.51,0.0,100.0,0.0943,-0.3908,1.9746,0.0,0.0,0.0,-0.0237,-0.1678,0.0015,21826.72 +364,60,2.24,0.0,100.0,0.0,3.82,0.0,100.0,0.0896,-0.3908,2.9746,0.0,0.0,0.0,-0.0047,-0.1466,1.0,21884.09 +365,60,0.21,0.0,12.5,0.0,2.06,0.0,39.49,0.0539,-0.3908,1.9746,0.0,0.0,0.0,-0.0358,-1.0,0.0,21944.5 +366,60,0.21,0.0,12.5,0.0,1.69,0.0,31.59,0.0357,-0.3908,1.5796,0.0,0.0,0.0,-0.0182,-0.3949,0.0,22007.87 +367,60,0.21,0.0,12.5,0.0,1.4,0.0,25.27,0.0212,-0.3908,1.2637,0.0,0.0,0.0,-0.0145,-0.3159,0.0,22064.71 +368,60,0.19,0.0,11.11,0.0,1.15,0.0,20.22,0.0091,-0.3908,1.011,0.0,0.0,0.0,-0.0121,-0.2527,0.111,22123.93 +369,60,0.19,0.0,11.11,0.0,0.99,0.0,16.18,-0.0003,-0.3908,0.8088,0.0,0.0,0.0,-0.0094,-0.2022,0.0,22187.3 +370,60,0.19,0.0,11.11,0.0,0.83,0.0,14.44,-0.0081,-0.3908,0.647,0.0,0.0,0.0,-0.0077,-0.1618,0.0,22245.41 +371,60,0.17,0.0,10.0,0.0,0.68,0.0,12.52,-0.0145,-0.3908,0.5176,0.0,0.0,0.0,-0.0064,-0.1294,0.0,22307.69 +372,60,0.58,0.0,12.5,0.0,1.03,0.0,14.19,-0.0153,-0.3908,0.4141,0.0,0.0,0.0,-0.0008,-0.1035,0.1248,22364.71 +373,60,0.85,0.0,16.67,0.0,1.27,0.0,19.56,-0.0162,-0.3908,0.3313,0.0,0.0,0.0,-0.0009,-0.0828,0.0908,22428.32 +374,60,0.96,0.0,20.0,0.0,1.4,0.0,25.65,-0.0178,-0.3908,0.265,0.0,0.0,0.0,-0.0015,-0.0663,0.0433,22483.32 +375,60,0.98,0.0,25.0,0.0,1.43,0.0,34.3,-0.02,-0.3908,0.212,0.0,0.0,0.0,-0.0022,-0.053,0.0573,22545.65 +376,60,0.96,0.0,25.0,0.0,1.38,0.0,36.31,-0.0224,-0.3908,0.1696,0.0,0.0,0.0,-0.0024,-0.0424,0.0196,22603.41 +377,60,1.51,0.0,25.0,0.0,1.98,0.0,30.06,-0.0191,-0.3908,0.2522,0.0,0.0,0.0,0.0034,-0.0908,0.2496,22661.8 +378,59,1.04,0.0,33.33,0.0,1.51,0.0,51.05,-0.023,-0.3908,0.3851,0.0,0.0,0.0,-0.0028,-0.2624,0.133,22727.84 +379,60,1.37,0.0,33.33,0.02,2.03,0.0,57.91,-0.0234,-0.3908,0.3781,0.0,0.0,0.0,-0.0016,-0.0257,0.0189,22781.95 +380,60,1.43,0.0,33.33,0.02,2.1,0.0,59.14,-0.0248,-0.3908,0.3253,0.0,0.0,0.0,-0.0013,-0.0528,0.0279,22844.26 +381,60,1.87,0.0,33.33,0.02,2.55,0.0,58.34,-0.0223,-0.3908,0.2644,0.0,0.0,0.0,0.0024,-0.061,0.1665,22907.64 +382,60,1.65,0.0,33.33,0.02,2.23,0.0,45.2,-0.027,-0.3908,0.174,0.0,0.0,0.0,-0.0046,-0.2667,0.1647,22962.94 +383,60,1.01,0.0,25.0,0.02,1.3,0.0,33.12,-0.0372,-0.3908,0.111,0.0,-0.0,-0.0,-0.0102,-0.4523,0.0336,23026.73 +384,60,0.92,0.0,20.0,0.02,1.15,0.0,25.54,-0.0391,-0.3908,0.0667,0.0,0.0,0.0,-0.0019,-0.0649,0.0221,23085.84 +385,60,0.95,0.0,16.67,0.02,1.14,0.0,20.08,-0.0394,-0.3908,0.0554,0.0,0.0,0.0,-0.0004,-0.0461,0.0492,23145.33 +386,54,1.67,0.0,25.0,0.02,1.9,0.0,30.5,-0.0381,-0.3908,0.2694,0.0,0.0,0.0,0.0058,-0.0296,0.2466,23207.62 +387,60,0.94,0.0,20.0,0.0,1.18,0.0,30.61,-0.0401,-0.3908,0.2253,0.0,0.0,0.0,-0.0059,-0.1799,0.0642,23264.61 +388,60,0.96,0.0,20.0,0.0,1.2,0.0,29.73,-0.0404,-0.3908,0.1805,0.0,0.0,0.0,-0.0003,-0.0449,0.0448,23320.95 +389,59,1.42,0.0,20.0,0.0,1.75,0.0,28.8,-0.0348,-0.3908,0.1429,0.0,0.0,0.0,0.004,-0.0378,0.1428,23383.55 +390,59,1.43,0.0,20.0,0.0,1.81,0.0,28.0,-0.0376,-0.3908,0.1388,0.0,0.0,0.0,-0.0006,-0.0323,0.0257,23449.37 +391,58,1.55,0.0,25.0,0.0,1.98,0.0,35.05,-0.0357,-0.3908,0.1522,0.0,0.0,0.0,-0.0004,-0.2019,0.1111,23508.06 +392,60,1.59,0.0,33.33,0.0,2.14,0.0,50.05,-0.0368,-0.3908,0.2519,0.0,0.0,0.0,0.0006,-0.0995,0.0997,23562.4 +393,60,1.57,0.0,33.33,0.0,2.18,0.0,55.05,-0.0379,-0.3908,0.2516,0.0,0.0,0.0,-0.0011,-0.0458,0.0071,23626.57 +394,60,1.49,0.0,33.33,0.0,2.05,0.0,56.04,-0.0402,-0.3908,0.2179,0.0,0.0,0.0,-0.0024,-0.0995,0.0054,23688.0 +395,60,0.99,0.0,14.29,0.0,1.16,0.0,17.47,-0.0495,-0.3908,0.0482,0.0,0.0,0.0,-0.0093,-0.5604,0.0423,23742.05 +396,60,0.68,0.0,12.5,0.0,0.79,0.0,14.56,-0.0534,-0.3908,0.0381,0.0,0.0,0.0,-0.0039,-0.1582,0.0,23807.05 +397,60,0.7,0.0,12.5,0.0,0.79,0.0,14.15,-0.0536,-0.3908,0.0199,0.0,0.0,0.0,-0.0002,-0.0182,0.0106,23861.35 +398,60,0.78,0.0,14.29,0.0,0.89,0.0,16.57,-0.0529,-0.3908,0.0369,0.0,0.0,0.0,0.0007,-0.0014,0.0215,23926.74 +399,60,0.38,0.0,12.5,0.0,0.44,0.0,14.53,-0.0577,-0.3908,0.0263,0.0,0.0,0.0,-0.0048,-0.1657,0.0132,23988.03 +400,60,1.0,0.0,33.33,0.0,1.2,0.0,40.0,-0.0515,-0.3908,0.3334,0.0,0.0,0.0,0.0062,-0.0054,0.3333,24043.29 +401,60,0.83,0.0,50.0,0.0,1.38,0.0,82.67,-0.0519,-0.3908,0.6334,0.0,0.0,0.0,-0.0004,-0.2051,0.3,24100.84 +402,60,1.83,0.0,100.0,0.0,1.81,0.0,100.0,-0.0336,-0.3908,1.6334,0.0,0.0,0.0,0.0183,-0.0011,1.0,24166.57 +403,60,2.08,0.0,100.0,0.0,2.1,0.0,100.0,-0.0141,-0.3908,2.6334,0.0,0.0,0.0,0.0195,-0.001,1.0,24226.27 +404,59,2.36,0.0,100.0,0.0,2.34,0.0,100.0,0.0083,-0.3498,3.6334,0.0,0.0,0.0,0.0198,-0.0009,1.0,24281.14 +405,60,2.35,0.0,100.0,0.01,2.39,0.0,100.0,0.0233,-0.3498,4.6334,0.0,0.0,0.0,0.018,-0.002,1.0,24338.65 +406,59,2.43,0.0,100.0,0.01,2.51,0.0,100.0,0.0417,-0.3498,5.6334,0.0,0.0,0.0,0.018,-0.0018,1.0,24406.3 +407,60,2.67,0.0,100.0,0.0,2.82,0.0,100.0,0.0608,-0.3498,6.6334,0.0,0.0,0.0,0.0198,-0.032,1.0,24464.74 +408,60,3.16,0.0,100.0,0.0,3.47,0.0,100.0,0.0826,-0.3498,7.6334,0.0,0.0,0.0,0.0218,-0.0166,1.0,24526.17 +409,60,3.62,0.0,100.0,0.0,4.05,0.0,100.0,0.1037,-0.3498,8.6334,0.0,0.0,0.0,0.0211,-0.0571,1.0,24584.84 +410,60,2.3,0.0,25.0,0.0,4.6,0.0,100.0,0.0905,-0.3498,7.6334,0.0,0.0,0.0,-0.0132,-1.0,0.1429,24645.36 +411,60,2.49,0.0,25.0,0.0,4.91,0.0,100.0,0.0747,-0.3498,6.6334,0.0,-0.0,-0.0,-0.0158,-1.0,0.1429,24703.26 +412,60,2.25,0.0,33.33,0.0,4.73,0.0,100.0,0.0538,-0.3498,5.6334,0.0,-0.0,-0.0,-0.0209,-1.0,0.1026,24762.89 +413,60,2.56,0.0,25.0,0.0,4.97,0.0,92.67,0.0385,-0.3498,4.6334,0.0,-0.0,-0.0,-0.0153,-1.0,0.1249,24827.68 +414,60,2.73,0.0,33.33,0.0,4.91,0.0,74.13,0.0223,-0.3498,3.7067,0.0,0.0,0.0,-0.0162,-0.9267,0.2,24886.07 +415,60,2.71,0.0,33.33,0.0,4.83,0.0,59.31,0.0087,-0.3498,2.9654,0.0,-0.0,-0.0,-0.0136,-0.7413,0.1027,24944.62 +416,60,3.37,0.0,50.0,0.0,5.85,0.0,84.78,0.0065,-0.3498,2.3723,0.0,0.0,0.0,-0.0022,-0.5931,0.2518,25004.2 +417,60,3.06,0.0,50.0,0.0,5.81,0.0,100.0,-0.0039,-0.3498,1.8978,0.0,-0.0,-0.0,-0.0103,-0.4745,0.0768,25065.44 +418,60,2.93,0.0,50.0,0.0,5.02,0.0,100.0,-0.02,-0.4324,1.5183,0.0,0.0,0.0,-0.0161,-1.0,0.3333,25126.38 +419,60,2.36,0.0,50.0,0.0,4.5,0.0,100.0,-0.0311,-0.4324,1.2146,0.0,-0.0,-0.0,-0.0111,-0.3037,0.0,25187.02 +420,60,2.03,0.0,50.0,0.0,3.82,0.0,100.0,-0.0423,-0.4324,0.9717,0.0,-0.0,-0.0,-0.0112,-0.2429,0.0098,25201.39 +421,13,7.69,0.0,100.0,0.0,8.89,0.0,100.0,0.1101,-0.225,1.4953,0.0,0.0,0.0,0.062,-0.1943,0.9999,25202.75 diff --git a/experiments/results/csv/one_of_many_services_latency_degradation_adaptive_time_analysis.csv b/experiments/results/csv/one_of_many_services_latency_degradation_adaptive_time_analysis.csv new file mode 100644 index 000000000..9d0619230 --- /dev/null +++ b/experiments/results/csv/one_of_many_services_latency_degradation_adaptive_time_analysis.csv @@ -0,0 +1,15 @@ +Time Range,Total Requests,Success,Errors,Error %,Rejected,Rejected %,Target Error Rate % +0-30s,12973,12685,114,0.88,174,1.34,1.0 +30-60s,7108,6244,151,2.12,713,10.03,1.0 +60-90s,7884,6945,137,1.74,802,10.17,1.0 +90-120s,8349,7386,146,1.75,817,9.79,1.0 +120-150s,8186,7216,148,1.81,822,10.04,1.0 +150-180s,8640,7573,136,1.57,931,10.78,1.0 +180-210s,7712,6788,152,1.97,772,10.01,1.0 +210-240s,8109,7079,141,1.74,889,10.96,1.0 +240-270s,8528,7480,164,1.92,884,10.37,1.0 +270-300s,8529,7539,156,1.83,834,9.78,1.0 +300-330s,8377,7335,153,1.83,889,10.61,1.0 +330-360s,12884,11914,155,1.2,815,6.33,1.0 +360-390s,13023,12694,127,0.98,202,1.55,1.0 +390-420s,13117,12807,121,0.92,189,1.44,1.0 diff --git a/experiments/results/csv/one_of_many_services_latency_degradation_time_analysis.csv b/experiments/results/csv/one_of_many_services_latency_degradation_time_analysis.csv new file mode 100644 index 000000000..67bbfdc2d --- /dev/null +++ b/experiments/results/csv/one_of_many_services_latency_degradation_time_analysis.csv @@ -0,0 +1,15 @@ +Time Range,Total Requests,Success,Errors,Error %,Rejected,Rejected %,Target Error Rate % +0-30s,4540,4469,51,1.12,20,0.44,1.0 +30-60s,2024,1822,108,5.34,94,4.64,1.0 +60-90s,3268,2915,92,2.82,261,7.99,1.0 +90-120s,3349,2991,81,2.42,277,8.27,1.0 +120-150s,3511,3138,80,2.28,293,8.35,1.0 +150-180s,3145,2796,85,2.7,264,8.39,1.0 +180-210s,3314,2956,81,2.44,277,8.36,1.0 +210-240s,2998,2668,82,2.74,248,8.27,1.0 +240-270s,3106,2746,90,2.9,270,8.69,1.0 +270-300s,3360,2994,87,2.59,279,8.3,1.0 +300-330s,3476,3067,89,2.56,320,9.21,1.0 +330-360s,4306,4042,61,1.42,203,4.71,1.0 +360-390s,4125,4067,42,1.02,16,0.39,1.0 +390-420s,4130,4074,51,1.23,5,0.12,1.0 diff --git a/experiments/results/csv/oscillating_errors_adaptive_pid_controller.csv b/experiments/results/csv/oscillating_errors_adaptive_pid_controller.csv new file mode 100644 index 000000000..25e658f51 --- /dev/null +++ b/experiments/results/csv/oscillating_errors_adaptive_pid_controller.csv @@ -0,0 +1,222 @@ +Window,Thread Count,Error Rate Avg,Error Rate Min,Error Rate Max,Ideal Error Rate,Rejection Rate Avg,Rejection Rate Min,Rejection Rate Max,Integral Avg,Integral Min,Integral Max,Derivative Avg,Derivative Min,Derivative Max,P Value Avg,P Value Min,P Value Max,Total Request Time +1,3,0.0,0.0,0.0,4.61,0.0,0.0,0.0,-0.0461,-0.0461,-0.0461,0.0,-0.0,-0.0,-0.0461,-0.0461,-0.0461,52.18 +2,59,1.32,0.0,20.0,4.61,0.97,0.0,18.0,-0.0347,-0.0886,0.15,0.0,-0.0,-0.0,-0.0332,-0.0461,0.15,111.61 +3,58,1.04,0.0,7.14,4.25,0.17,0.0,2.5,-0.0759,-0.0886,0.0083,0.0,0.0,0.0,-0.0429,-0.1604,0.0127,171.49 +4,60,0.95,0.0,7.14,3.92,0.04,0.0,2.24,-0.1094,-0.1278,-0.0143,0.0,0.0,0.0,-0.033,-0.0392,0.0253,231.56 +5,60,1.17,0.0,6.9,4.14,0.06,0.0,1.67,-0.1365,-0.1639,-0.013,0.0,-0.0,-0.0,-0.0271,-0.0361,0.0274,292.46 +6,60,1.26,0.0,5.26,4.02,0.0,0.0,0.06,-0.1609,-0.1972,-0.028,0.0,-0.0,-0.0,-0.0244,-0.0333,0.0061,351.61 +7,60,1.18,0.0,4.35,3.67,0.0,0.0,0.0,-0.1835,-0.228,-0.0354,0.0,-0.0,-0.0,-0.0227,-0.0307,0.0042,411.79 +8,60,1.27,0.0,5.17,4.28,0.0,0.0,0.03,-0.2036,-0.2563,-0.03,0.0,-0.0,-0.0,-0.0201,-0.0283,0.0063,470.8 +9,60,1.16,0.0,4.41,3.53,0.0,0.0,0.0,-0.2231,-0.2824,-0.0315,0.0,-0.0,-0.0,-0.0195,-0.0261,-0.0013,530.12 +10,60,1.24,0.0,4.0,3.22,0.0,0.0,0.0,-0.2403,-0.3065,-0.0373,0.0,-0.0,-0.0,-0.0172,-0.0246,0.0024,591.39 +11,60,1.19,0.0,4.6,2.22,0.0,0.0,0.0,-0.2566,-0.3287,-0.0432,0.0,0.0,0.0,-0.0163,-0.0297,0.0021,651.3 +12,60,1.08,0.0,4.55,2.93,0.0,0.0,0.0,-0.2728,-0.3491,-0.0426,0.0,0.0,0.0,-0.0161,-0.0328,0.0035,712.55 +13,60,1.19,0.0,6.02,2.79,0.0,0.0,0.0,-0.2865,-0.368,-0.051,0.0,0.0,0.0,-0.0138,-0.0303,0.0305,771.25 +14,60,1.26,0.0,6.1,2.75,0.0,0.0,0.0,-0.2985,-0.3854,-0.0698,0.0,0.0,0.0,-0.012,-0.0279,0.0312,831.41 +15,60,1.17,0.0,6.17,1.6,0.0,0.0,0.26,-0.3104,-0.4014,-0.0871,0.0,0.0,0.0,-0.0118,-0.0333,0.0319,893.29 +16,60,1.07,0.0,5.06,1.48,0.0,0.0,0.0,-0.3221,-0.4162,-0.1031,0.0,0.0,0.0,-0.0117,-0.0307,0.0217,951.16 +17,60,1.1,0.0,5.0,2.41,0.0,0.0,0.0,-0.3325,-0.4298,-0.108,0.0,0.0,0.0,-0.0104,-0.0283,0.0205,1012.04 +18,60,0.98,0.0,5.19,2.31,0.01,0.0,0.47,-0.3432,-0.4424,-0.0861,0.0,0.0,0.0,-0.0107,-0.0277,0.022,1070.84 +19,60,1.01,0.0,5.48,2.23,0.02,0.0,1.17,-0.3527,-0.454,-0.0659,0.0,0.0,0.0,-0.0095,-0.0298,0.0201,1129.91 +20,60,0.93,0.0,4.17,2.15,0.0,0.0,0.0,-0.3623,-0.4647,-0.0659,0.0,0.0,0.0,-0.0096,-0.0275,0.0128,1192.15 +21,60,1.02,0.0,4.23,2.07,0.0,0.0,0.14,-0.3701,-0.4746,-0.0537,0.0,0.0,0.0,-0.0078,-0.0253,0.0198,1251.74 +22,60,1.22,0.0,4.11,2.01,0.0,0.0,0.22,-0.3753,-0.4836,-0.0441,0.0,0.0,0.0,-0.0052,-0.0226,0.0208,1313.18 +23,60,1.32,0.0,4.29,1.94,0.0,0.0,0.0,-0.379,-0.492,-0.0741,0.0,0.0,0.0,-0.0037,-0.03,0.0175,1371.69 +24,60,1.35,0.0,4.35,1.79,0.0,0.0,0.0,-0.3818,-0.4997,-0.0997,0.0,-0.0,-0.0,-0.0028,-0.0256,0.0236,1432.52 +25,60,1.47,0.0,5.06,1.75,0.0,0.0,0.0,-0.383,-0.5069,-0.1233,0.0,0.0,0.0,-0.0012,-0.0236,0.031,1492.19 +26,60,1.59,0.0,5.06,1.71,0.0,0.0,0.0,-0.3826,-0.5134,-0.145,0.0,0.0,0.0,0.0004,-0.0217,0.0323,1551.13 +27,60,1.66,0.0,5.19,1.67,0.0,0.0,0.0,-0.3811,-0.5195,-0.1651,0.0,0.0,0.0,0.0015,-0.0215,0.0329,1612.29 +28,60,1.65,0.0,6.41,1.64,0.0,0.0,0.05,-0.3793,-0.5251,-0.1829,0.0,0.0,0.0,0.0018,-0.0298,0.0463,1671.79 +29,60,1.8,0.0,6.41,1.6,0.02,0.0,0.62,-0.3757,-0.5302,-0.1473,0.0,0.0,0.0,0.0036,-0.0275,0.0548,1731.36 +30,60,2.04,0.0,6.41,1.61,0.03,0.0,1.0,-0.3696,-0.5349,-0.1199,0.0,0.0,0.0,0.0061,-0.0172,0.0547,1791.24 +31,60,2.21,0.0,8.75,1.61,0.13,0.0,3.34,-0.3618,-0.5393,-0.0966,0.0,-0.0,-0.0,0.0078,-0.0208,0.078,1851.71 +32,60,2.72,0.0,10.13,1.38,0.19,0.0,6.07,-0.3496,-0.5306,-0.0798,0.0,0.0,0.0,0.0122,-0.0192,0.0632,1912.56 +33,60,3.13,0.0,9.21,1.39,0.25,0.0,5.89,-0.3338,-0.5121,-0.0772,0.0,0.0,0.0,0.0158,-0.0135,0.0465,1971.26 +34,60,3.69,0.0,9.21,1.39,0.4,0.0,6.43,-0.3129,-0.4967,-0.0509,0.0,0.0,0.0,0.0209,-0.0125,0.0565,2031.78 +35,60,4.0,0.0,10.26,1.4,0.69,0.0,8.27,-0.2903,-0.4929,-0.0312,0.0,0.0,0.0,0.0226,-0.0115,0.057,2092.05 +36,60,4.32,0.0,11.11,1.41,0.92,0.0,9.91,-0.2672,-0.4774,-0.0218,0.0,-0.0,-0.0,0.0231,-0.0163,0.0625,2152.17 +37,60,4.72,0.0,10.84,1.41,1.26,0.0,9.97,-0.2422,-0.4688,-0.0058,0.0,-0.0,-0.0,0.025,-0.0096,0.0835,2211.06 +38,60,5.07,1.15,10.84,1.42,1.64,0.0,8.85,-0.2169,-0.4658,0.0026,0.0,-0.0,-0.0,0.0253,-0.004,0.069,2271.33 +39,60,5.44,0.0,11.25,1.43,2.08,0.0,9.93,-0.1915,-0.4512,0.0043,0.0,0.0,0.0,0.0253,-0.0133,0.077,2332.38 +40,60,5.62,0.0,10.39,1.44,2.56,0.0,9.29,-0.1684,-0.4456,0.0171,0.0,-0.0,-0.0,0.0231,-0.0123,0.0597,2391.2 +41,60,5.76,0.0,10.71,1.45,2.96,0.0,9.88,-0.1485,-0.4505,0.0138,0.0,-0.0,-0.0,0.0199,-0.0127,0.0648,2451.98 +42,60,5.37,0.0,10.75,1.46,2.81,0.0,10.33,-0.1365,-0.461,-0.004,0.0,-0.0,-0.0,0.0119,-0.0247,0.0562,2512.41 +43,60,4.84,0.0,8.89,1.46,2.42,0.0,7.65,-0.1286,-0.4706,-0.0075,0.0,-0.0,-0.0,0.0079,-0.0227,0.0433,2571.25 +44,60,4.31,0.0,9.09,1.47,2.0,0.0,7.34,-0.1224,-0.4795,-0.0151,0.0,0.0,0.0,0.0062,-0.034,0.0487,2631.86 +45,60,4.1,0.0,8.97,1.47,1.9,0.0,7.84,-0.1142,-0.4877,0.0075,0.0,-0.0,-0.0,0.0082,-0.0196,0.05,2690.47 +46,60,3.67,0.0,8.6,1.48,1.67,0.0,6.8,-0.1093,-0.4953,-0.0087,0.0,0.0,0.0,0.0049,-0.0243,0.0489,2751.92 +47,60,3.21,0.0,8.25,1.48,1.35,0.0,6.2,-0.1067,-0.5023,0.0035,0.0,-0.0,-0.0,0.0025,-0.035,0.0475,2810.51 +48,60,2.94,0.0,7.22,1.49,1.19,0.0,5.04,-0.1037,-0.5087,-0.0058,0.0,0.0,0.0,0.003,-0.0236,0.0313,2871.81 +49,60,2.64,0.0,6.98,1.47,1.01,0.0,6.42,-0.1019,-0.5146,0.0067,0.0,-0.0,-0.0,0.0018,-0.0326,0.0375,2931.51 +50,60,2.35,0.0,6.1,1.36,0.79,0.0,5.63,-0.1011,-0.5201,0.0114,0.0,0.0,0.0,0.0008,-0.0253,0.0356,2991.3 +51,60,2.43,0.0,5.88,1.35,0.78,0.0,4.14,-0.0973,-0.5251,-0.0029,0.0,0.0,0.0,0.0038,-0.0188,0.0461,3050.64 +52,60,2.75,0.0,6.33,1.33,0.98,0.0,5.12,-0.0901,-0.5298,0.0102,0.0,-0.0,-0.0,0.0072,-0.0196,0.0447,3112.1 +53,60,3.21,0.0,6.25,1.32,1.29,0.0,5.24,-0.0803,-0.5222,0.011,0.0,0.0,0.0,0.0098,-0.0102,0.0353,3171.56 +54,60,3.58,0.0,6.9,1.32,1.73,0.0,6.53,-0.0696,-0.5145,0.0219,0.0,0.0,0.0,0.0106,-0.0193,0.0425,3230.61 +55,60,3.97,0.0,9.2,1.31,2.16,0.0,8.09,-0.0593,-0.5066,0.0268,0.0,0.0,0.0,0.0103,-0.0148,0.0526,3290.25 +56,60,4.4,0.0,9.88,1.3,2.74,0.0,9.79,-0.0487,-0.4983,0.0407,0.0,-0.0,-0.0,0.0106,-0.0137,0.0568,3351.23 +57,60,4.75,0.0,9.41,1.3,3.19,0.0,8.44,-0.0402,-0.49,0.0243,0.0,0.0,0.0,0.0086,-0.0194,0.0521,3410.61 +58,60,5.24,0.0,10.26,1.31,3.81,0.0,9.79,-0.031,-0.4563,0.0434,0.0,0.0,0.0,0.0092,-0.0188,0.0554,3471.29 +59,60,5.45,0.0,10.13,1.31,4.12,0.0,9.98,-0.0254,-0.4002,0.0377,0.0,-0.0,-0.0,0.0056,-0.0297,0.0561,3530.28 +60,60,5.91,1.16,11.24,1.31,4.64,0.0,11.46,-0.0181,-0.3292,0.0471,0.0,-0.0,-0.0,0.0073,-0.0194,0.071,3591.64 +61,60,5.86,1.22,12.36,1.32,4.61,0.0,12.77,-0.0164,-0.2537,0.0536,0.0,-0.0,-0.0,0.0018,-0.0267,0.0755,3652.27 +62,60,5.39,1.18,11.36,1.32,4.02,0.0,11.51,-0.0192,-0.2011,0.0384,0.0,-0.0,-0.0,-0.0029,-0.0403,0.0526,3711.42 +63,60,4.99,1.11,10.71,1.33,3.55,0.0,10.54,-0.0208,-0.1718,0.0234,0.0,0.0,0.0,-0.0016,-0.0321,0.0293,3771.82 +64,60,4.58,1.1,10.23,1.33,3.06,0.0,10.16,-0.0222,-0.1406,0.0237,0.0,-0.0,-0.0,-0.0014,-0.0364,0.0312,3831.09 +65,60,4.11,0.0,11.36,1.33,2.64,0.0,11.71,-0.0236,-0.1305,0.0179,0.0,0.0,0.0,-0.0015,-0.0386,0.0291,3890.83 +66,60,3.81,0.0,8.89,1.34,2.3,0.0,8.59,-0.0241,-0.1203,0.0131,0.0,0.0,0.0,-0.0004,-0.0273,0.0273,3950.98 +67,60,3.64,0.0,8.24,1.34,2.18,0.0,7.41,-0.023,-0.1106,0.0213,0.0,-0.0,-0.0,0.001,-0.0214,0.0257,4012.09 +68,60,3.1,0.0,7.14,1.34,1.58,0.0,6.14,-0.0264,-0.0889,0.0111,0.0,-0.0,-0.0,-0.0034,-0.0441,0.0218,4069.89 +69,60,2.77,0.0,5.95,1.35,1.32,0.0,4.83,-0.0273,-0.09,0.0135,0.0,0.0,0.0,-0.0009,-0.0338,0.0245,4131.47 +70,60,2.14,0.0,5.75,1.35,0.83,0.0,4.13,-0.0317,-0.0857,0.0097,0.0,-0.0,-0.0,-0.0045,-0.0318,0.0173,4191.47 +71,60,2.39,0.0,5.62,1.35,1.15,0.0,3.91,-0.0288,-0.0992,0.0151,0.0,0.0,0.0,0.0029,-0.0254,0.033,4252.35 +72,60,2.81,0.0,7.45,1.36,1.58,0.0,6.28,-0.0247,-0.1116,0.031,0.0,0.0,0.0,0.0042,-0.0131,0.0482,4310.5 +73,60,2.98,0.0,8.75,1.37,1.85,0.0,8.71,-0.0228,-0.1231,0.0507,0.0,-0.0,-0.0,0.0019,-0.0236,0.0244,4370.71 +74,60,3.38,0.0,8.43,1.37,2.23,0.0,8.49,-0.0193,-0.1165,0.0413,0.0,-0.0,-0.0,0.0035,-0.0166,0.0365,4430.75 +75,60,3.85,0.0,9.76,1.39,2.68,0.0,9.89,-0.0147,-0.1063,0.0531,0.0,0.0,0.0,0.0046,-0.0148,0.0323,4491.0 +76,58,3.97,0.0,10.98,1.4,2.79,0.0,11.47,-0.0133,-0.1058,0.051,0.0,-0.0,-0.0,0.0029,-0.0181,0.0248,4549.91 +77,60,4.43,0.0,10.98,0.94,3.3,0.0,11.44,-0.0082,-0.1051,0.0423,0.0,0.0,0.0,0.0038,-0.0266,0.0496,4611.11 +78,60,4.93,0.0,10.71,0.95,3.89,0.0,10.92,-0.0029,-0.0773,0.0309,0.0,-0.0,-0.0,0.0053,-0.0175,0.0336,4669.79 +79,60,5.4,1.2,10.84,0.97,4.43,0.0,10.91,0.0016,-0.0764,0.052,0.0,0.0,0.0,0.0044,-0.0125,0.0366,4730.32 +80,60,5.93,1.18,11.63,0.98,5.09,0.0,11.59,0.0063,-0.0752,0.0715,0.0,-0.0,-0.0,0.0047,-0.0258,0.0388,4790.18 +81,60,5.6,1.2,11.9,0.99,4.68,0.0,12.09,0.0014,-0.0737,0.0513,0.0,-0.0,-0.0,-0.0049,-0.0299,0.0183,4850.7 +82,60,5.25,1.16,9.88,1.0,4.19,0.0,9.27,-0.0034,-0.0722,0.0338,0.0,0.0,0.0,-0.0047,-0.0575,0.0298,4911.91 +83,60,4.94,0.0,10.34,1.01,3.81,0.0,10.29,-0.0067,-0.0733,0.0298,0.0,-0.0,-0.0,-0.0033,-0.0241,0.0166,4970.03 +84,60,4.65,0.0,11.11,1.02,3.45,0.0,10.35,-0.0095,-0.0864,0.0322,0.0,0.0,0.0,-0.0028,-0.0283,0.0156,5030.69 +85,60,4.16,0.0,11.11,1.02,2.92,0.0,11.06,-0.0138,-0.0985,0.0322,0.0,-0.0,-0.0,-0.0043,-0.0309,0.0164,5091.81 +86,60,3.81,0.0,9.64,1.02,2.55,0.0,9.34,-0.0166,-0.1097,0.0163,0.0,0.0,0.0,-0.0028,-0.0267,0.0271,5150.98 +87,59,3.36,0.0,9.88,1.02,2.11,0.0,8.43,-0.0201,-0.1091,0.022,0.0,-0.0,-0.0,-0.0031,-0.0444,0.041,5209.23 +88,60,2.92,0.0,8.64,0.56,1.71,0.0,6.8,-0.0245,-0.1086,0.0194,0.0,-0.0,-0.0,-0.0048,-0.0402,0.0183,5272.59 +89,60,2.5,0.0,7.32,0.57,1.39,0.0,6.18,-0.0286,-0.1081,0.0147,0.0,-0.0,-0.0,-0.0041,-0.0364,0.0159,5331.47 +90,60,2.04,0.0,7.23,0.57,0.9,0.0,5.51,-0.0341,-0.107,0.0106,0.0,0.0,0.0,-0.0055,-0.0358,0.0282,5390.96 +91,60,2.24,0.0,6.17,0.58,1.1,0.0,4.81,-0.0326,-0.1146,0.0146,0.0,-0.0,-0.0,0.0015,-0.0223,0.0259,5450.9 +92,60,2.39,0.0,7.59,0.59,1.26,0.0,5.82,-0.0314,-0.1222,0.0122,0.0,0.0,0.0,0.0012,-0.0208,0.0256,5510.16 +93,60,2.99,0.0,9.52,0.6,1.85,0.0,8.32,-0.0256,-0.1293,0.0307,0.0,0.0,0.0,0.0058,-0.0132,0.04,5570.89 +94,60,3.38,0.0,11.11,0.61,2.21,0.0,11.94,-0.0214,-0.1239,0.0654,0.0,-0.0,-0.0,0.0042,-0.0191,0.0419,5631.62 +95,60,3.79,0.0,10.99,0.62,2.62,0.0,12.17,-0.0165,-0.1208,0.0565,0.0,-0.0,-0.0,0.0049,-0.0149,0.0304,5690.47 +96,60,4.06,0.0,11.36,0.63,2.96,0.0,12.48,-0.0127,-0.1265,0.0496,0.0,-0.0,-0.0,0.0037,-0.0229,0.0428,5751.28 +97,60,4.4,0.0,11.63,0.64,3.34,0.0,12.67,-0.0088,-0.1317,0.0437,0.0,0.0,0.0,0.004,-0.0521,0.0403,5811.97 +98,60,4.79,0.0,11.24,0.65,3.8,0.0,11.67,-0.0044,-0.1365,0.0547,0.0,0.0,0.0,0.0043,-0.0201,0.0292,5870.93 +99,60,5.32,0.0,11.54,0.66,4.47,0.0,12.6,0.001,-0.1409,0.0699,0.0,-0.0,-0.0,0.0054,-0.0291,0.0375,5931.51 +100,60,5.68,1.25,11.25,0.66,4.84,0.0,12.49,0.0036,-0.1229,0.0573,0.0,-0.0,-0.0,0.0026,-0.0369,0.04,5990.48 +101,59,5.6,1.28,10.13,0.67,4.71,0.0,9.16,0.0016,-0.1049,0.0334,0.0,0.0,0.0,-0.0019,-0.0386,0.0365,6050.91 +102,60,5.39,1.2,9.52,2.05,4.4,0.0,9.5,-0.0012,-0.087,0.0361,0.0,-0.0,-0.0,-0.003,-0.0432,0.0229,6111.92 +103,59,4.9,0.0,9.46,2.06,3.78,0.0,9.6,-0.0062,-0.0688,0.0311,0.0,-0.0,-0.0,-0.0047,-0.0416,0.0204,6171.25 +104,56,4.44,0.0,8.64,1.27,3.17,0.0,8.27,-0.0103,-0.0622,0.0221,0.0,-0.0,-0.0,-0.0037,-0.0398,0.0259,6231.3 +105,58,4.18,0.0,8.86,2.07,2.86,0.0,7.78,-0.0122,-0.0601,0.0164,0.0,0.0,0.0,-0.0026,-0.0365,0.0184,6291.31 +106,59,3.84,0.0,9.52,0.48,2.5,0.0,8.64,-0.0141,-0.0693,0.008,0.0,-0.0,-0.0,-0.0022,-0.0244,0.0164,6351.04 +107,58,3.5,0.0,8.22,0.48,2.15,0.0,7.48,-0.0153,-0.0653,0.0085,0.0,-0.0,-0.0,-0.0013,-0.0278,0.0167,6410.83 +108,59,3.12,0.0,6.02,1.03,1.77,0.0,4.91,-0.0177,-0.0596,0.008,0.0,0.0,0.0,-0.0024,-0.0422,0.027,6470.73 +109,60,2.8,0.0,5.95,1.93,1.37,0.0,4.79,-0.019,-0.0693,0.005,0.0,0.0,0.0,-0.0015,-0.0269,0.0358,6531.63 +110,58,2.24,0.0,6.76,1.87,0.84,0.0,6.21,-0.0232,-0.0797,0.0073,0.0,-0.0,-0.0,-0.0036,-0.0375,0.0193,6592.64 +111,58,2.16,0.0,7.79,0.61,0.97,0.0,7.63,-0.0214,-0.0894,0.0179,0.0,-0.0,-0.0,0.001,-0.0268,0.0313,6649.8 +112,58,2.57,0.0,9.09,0.61,1.35,0.0,9.33,-0.0168,-0.0665,0.0291,0.0,-0.0,-0.0,0.0042,-0.0181,0.0341,6710.65 +113,56,2.79,0.0,5.75,2.81,1.59,0.0,5.13,-0.0143,-0.0688,0.021,0.0,0.0,0.0,0.0046,-0.0167,0.0286,6770.16 +114,56,3.06,0.0,8.86,1.17,1.91,0.0,9.06,-0.0115,-0.0841,0.0297,0.0,0.0,0.0,0.0022,-0.0154,0.0376,6831.2 +115,59,3.61,0.0,10.13,1.04,2.56,0.0,10.6,-0.0056,-0.0983,0.0344,0.0,0.0,0.0,0.0058,-0.015,0.0364,6891.26 +116,60,4.02,0.0,10.0,0.83,3.06,0.0,10.46,-0.0019,-0.1113,0.0478,0.0,0.0,0.0,0.0034,-0.0175,0.0385,6951.29 +117,60,4.4,0.0,12.35,0.84,3.54,0.0,13.45,0.0011,-0.1234,0.0456,0.0,0.0,0.0,0.003,-0.0169,0.0323,7010.21 +118,60,4.85,0.0,11.76,0.85,4.02,0.0,12.89,0.004,-0.1213,0.0382,0.0,-0.0,-0.0,0.0029,-0.0212,0.0484,7071.66 +119,60,5.14,0.0,9.3,0.86,4.32,0.0,9.7,0.005,-0.1197,0.0571,0.0,-0.0,-0.0,0.0011,-0.045,0.044,7130.35 +120,59,5.65,0.0,11.24,0.86,4.9,0.0,11.85,0.0084,-0.0895,0.0655,0.0,0.0,0.0,0.0035,-0.0186,0.0378,7191.65 +121,60,5.69,0.0,11.69,1.24,4.95,0.0,13.18,0.0072,-0.0837,0.0702,0.0,-0.0,-0.0,-0.0014,-0.0289,0.022,7250.88 +122,60,5.13,0.0,10.71,1.24,4.2,0.0,11.78,-0.0007,-0.0898,0.0452,0.0,0.0,0.0,-0.0079,-0.037,0.0159,7306.19 +123,60,4.83,0.0,10.0,1.25,3.78,0.0,10.3,-0.0047,-0.0954,0.0379,0.0,0.0,0.0,-0.004,-0.0331,0.0146,7370.94 +124,60,4.57,1.35,10.23,1.26,3.41,0.0,9.72,-0.0074,-0.0776,0.0198,0.0,-0.0,-0.0,-0.0027,-0.028,0.0184,7430.52 +125,60,4.04,0.0,10.47,1.27,2.89,0.0,9.36,-0.0121,-0.0763,0.0152,0.0,0.0,0.0,-0.0047,-0.0337,0.0174,7491.1 +126,59,3.57,0.0,9.76,1.28,2.4,0.0,8.65,-0.0164,-0.0989,0.0244,0.0,0.0,0.0,-0.0039,-0.036,0.0156,7549.55 +127,58,3.25,0.0,8.64,0.52,2.1,0.0,8.15,-0.0192,-0.1196,0.0222,0.0,-0.0,-0.0,-0.0036,-0.0208,0.0152,7610.82 +128,59,2.94,0.0,7.5,0.94,1.7,0.0,6.94,-0.0221,-0.1388,0.0164,0.0,0.0,0.0,-0.0033,-0.057,0.0139,7670.08 +129,59,2.55,0.0,8.43,1.02,1.38,0.0,8.08,-0.0258,-0.1565,0.0231,0.0,0.0,0.0,-0.0028,-0.0458,0.0188,7730.35 +130,60,2.07,0.0,7.32,1.33,0.98,0.0,6.62,-0.03,-0.1727,0.0142,0.0,0.0,0.0,-0.0045,-0.0377,0.0184,7790.95 +131,60,2.09,0.0,7.32,0.87,1.05,0.0,6.47,-0.0302,-0.1877,0.0228,0.0,0.0,0.0,-0.0002,-0.0334,0.0312,7850.57 +132,60,2.62,0.0,6.67,0.8,1.55,0.0,5.49,-0.0257,-0.1894,0.0284,0.0,0.0,0.0,0.0045,-0.0163,0.03,7909.66 +133,60,3.09,0.0,6.67,1.34,2.0,0.0,5.22,-0.0213,-0.1916,0.0222,0.0,0.0,0.0,0.0044,-0.015,0.0374,7969.95 +134,59,3.47,0.0,6.67,1.35,2.41,0.0,6.01,-0.0176,-0.1822,0.0401,0.0,0.0,0.0,0.0038,-0.0139,0.0272,8030.31 +135,60,3.64,0.0,6.41,1.52,2.49,0.0,6.63,-0.0155,-0.1604,0.0382,0.0,0.0,0.0,0.0021,-0.0133,0.0248,8090.3 +136,60,4.18,0.0,9.09,1.53,3.1,0.0,8.54,-0.0091,-0.1386,0.0472,0.0,-0.0,-0.0,0.0064,-0.0146,0.0438,8150.79 +137,60,4.5,0.0,9.52,1.53,3.48,0.0,10.59,-0.0051,-0.1181,0.05,0.0,0.0,0.0,0.004,-0.0182,0.0326,8210.42 +138,60,4.84,1.22,9.52,1.54,3.88,0.0,9.77,-0.0015,-0.0978,0.0416,0.0,-0.0,-0.0,0.0036,-0.0219,0.0394,8270.99 +139,60,5.11,1.2,10.34,0.98,4.22,0.0,11.31,0.0012,-0.0933,0.0516,0.0,0.0,0.0,0.0027,-0.0211,0.0227,8330.47 +140,60,5.39,1.22,10.34,1.55,4.59,0.0,11.64,0.0037,-0.0887,0.0553,0.0,-0.0,-0.0,0.0025,-0.0157,0.03,8390.67 +141,60,5.6,1.22,10.47,1.0,4.83,0.0,11.11,0.0048,-0.0834,0.0472,0.0,0.0,0.0,0.0011,-0.0291,0.0297,8450.93 +142,60,5.08,0.0,10.34,1.01,4.24,0.0,10.98,-0.0019,-0.078,0.0447,0.0,-0.0,-0.0,-0.0067,-0.0306,0.0176,8509.9 +143,60,4.63,0.0,9.88,1.02,3.63,0.0,10.26,-0.0077,-0.0723,0.0329,0.0,-0.0,-0.0,-0.0058,-0.0412,0.026,8570.44 +144,60,4.13,0.0,9.52,1.03,2.99,0.0,9.72,-0.0128,-0.0662,0.0208,0.0,0.0,0.0,-0.0052,-0.0424,0.0141,8631.59 +145,60,4.17,0.0,9.33,1.59,3.07,0.0,8.22,-0.0114,-0.0614,0.0246,0.0,-0.0,-0.0,0.0014,-0.0282,0.0262,8689.98 +146,60,3.72,0.0,7.59,1.6,2.54,0.0,6.94,-0.0154,-0.0697,0.018,0.0,0.0,0.0,-0.004,-0.041,0.0254,8750.23 +147,60,3.5,0.0,7.32,1.06,2.39,0.0,6.89,-0.0166,-0.0779,0.025,0.0,0.0,0.0,-0.0012,-0.0212,0.0252,8809.88 +148,60,3.21,0.0,7.32,1.07,2.05,0.0,6.91,-0.0193,-0.0849,0.0237,0.0,0.0,0.0,-0.0027,-0.039,0.0201,8871.03 +149,60,2.88,0.0,7.69,1.58,1.75,0.0,7.37,-0.0219,-0.0916,0.0289,0.0,-0.0,-0.0,-0.0026,-0.0259,0.0275,8929.95 +150,60,2.47,0.0,6.02,1.56,1.42,0.0,5.27,-0.0256,-0.0976,0.0196,0.0,0.0,0.0,-0.0037,-0.026,0.0161,8990.59 +151,60,2.31,0.0,6.85,1.56,1.31,0.0,6.82,-0.0277,-0.1146,0.0329,0.0,0.0,0.0,-0.0021,-0.0291,0.0444,9049.65 +152,60,2.69,0.0,9.09,1.08,1.66,0.0,9.92,-0.0245,-0.1188,0.0532,0.0,0.0,0.0,0.0031,-0.0234,0.0255,9110.07 +153,60,3.24,0.0,10.0,1.08,2.22,0.0,11.19,-0.0191,-0.1228,0.055,0.0,0.0,0.0,0.0054,-0.0226,0.0377,9169.86 +154,60,3.7,0.0,8.64,1.08,2.72,0.0,9.14,-0.0144,-0.1139,0.0398,0.0,0.0,0.0,0.0048,-0.0262,0.0314,9230.15 +155,60,3.83,0.0,9.76,1.09,2.92,0.0,10.11,-0.0131,-0.0928,0.0419,0.0,0.0,0.0,0.0013,-0.0267,0.0282,9289.17 +156,60,4.26,0.0,11.25,1.09,3.38,0.0,11.33,-0.0093,-0.0939,0.051,0.0,-0.0,-0.0,0.0038,-0.0199,0.0305,9349.87 +157,60,4.69,0.0,9.76,1.6,3.79,0.0,9.55,-0.0055,-0.0965,0.0356,0.0,-0.0,-0.0,0.0038,-0.0277,0.0401,9411.15 +158,60,5.16,0.0,9.76,1.61,4.3,0.0,9.55,-0.001,-0.0897,0.0388,0.0,0.0,0.0,0.0045,-0.0187,0.0417,9470.29 +159,60,5.44,1.28,11.11,1.11,4.63,0.0,11.6,0.0016,-0.0829,0.0527,0.0,0.0,0.0,0.0026,-0.0174,0.0248,9530.84 +160,60,5.97,1.32,11.25,1.11,5.27,0.0,11.87,0.0066,-0.0636,0.0494,0.0,0.0,0.0,0.005,-0.0167,0.0296,9590.68 +161,59,5.99,1.28,11.36,1.12,5.29,0.0,11.21,0.0054,-0.0508,0.0487,0.0,-0.0,-0.0,-0.0012,-0.0338,0.023,9649.83 +162,60,5.62,1.3,11.49,1.52,4.79,0.0,11.36,0.0004,-0.0433,0.0373,0.0,-0.0,-0.0,-0.005,-0.027,0.0183,9709.59 +163,60,5.01,0.0,11.63,1.52,4.04,0.0,11.49,-0.0065,-0.066,0.032,0.0,-0.0,-0.0,-0.0069,-0.0397,0.0124,9769.95 +164,59,4.47,0.0,10.47,1.53,3.35,0.0,9.86,-0.0117,-0.0668,0.0256,0.0,0.0,0.0,-0.005,-0.0444,0.0176,9828.5 +165,60,4.29,0.0,9.3,1.3,3.2,0.0,8.12,-0.0126,-0.0788,0.0188,0.0,0.0,0.0,-0.0012,-0.0242,0.0316,9888.97 +166,60,3.84,0.0,8.33,1.31,2.72,0.0,7.21,-0.0164,-0.0899,0.0144,0.0,-0.0,-0.0,-0.0038,-0.0269,0.0149,9950.45 +167,60,3.39,0.0,9.09,1.32,2.18,0.0,8.09,-0.0203,-0.1001,0.02,0.0,-0.0,-0.0,-0.0039,-0.0268,0.0152,10010.9 +168,60,2.97,0.0,7.5,1.33,1.62,0.0,6.77,-0.0233,-0.0987,0.0162,0.0,0.0,0.0,-0.003,-0.0385,0.0198,10071.58 +169,60,2.59,0.0,7.69,1.33,1.23,0.0,6.93,-0.0248,-0.0975,0.0137,0.0,-0.0,-0.0,-0.0015,-0.0225,0.0155,10130.02 +170,60,2.29,0.0,5.88,1.33,1.06,0.0,4.14,-0.0254,-0.0963,0.0111,0.0,0.0,0.0,-0.0006,-0.0308,0.0315,10189.68 +171,60,2.24,0.0,8.14,1.32,1.13,0.0,8.25,-0.0246,-0.099,0.0246,0.0,-0.0,-0.0,0.0008,-0.0269,0.0362,10250.35 +172,60,2.68,0.0,6.67,1.22,1.56,0.0,6.59,-0.02,-0.1054,0.0204,0.0,0.0,0.0,0.0046,-0.0179,0.0277,10309.89 +173,60,3.25,0.0,7.14,1.12,2.22,0.0,6.79,-0.0137,-0.1114,0.0341,0.0,0.0,0.0,0.0063,-0.0292,0.0368,10370.54 +174,60,3.74,0.0,8.43,1.12,2.77,0.0,8.01,-0.0087,-0.1168,0.0435,0.0,0.0,0.0,0.005,-0.0179,0.0262,10431.62 +175,60,4.14,0.0,8.54,1.12,3.21,0.0,8.85,-0.0051,-0.1219,0.0395,0.0,-0.0,-0.0,0.0037,-0.0201,0.0305,10490.87 +176,60,4.59,0.0,9.41,1.59,3.72,0.0,9.98,-0.0011,-0.1266,0.0423,0.0,0.0,0.0,0.004,-0.0164,0.0359,10549.75 +177,60,4.95,0.0,11.76,1.13,4.14,0.0,12.34,0.0018,-0.1309,0.053,0.0,-0.0,-0.0,0.0028,-0.0192,0.0259,10610.9 +178,60,5.36,0.0,11.9,1.13,4.64,0.0,12.7,0.0047,-0.1348,0.0471,0.0,-0.0,-0.0,0.003,-0.0341,0.0499,10670.77 +179,60,5.67,0.0,12.05,1.14,4.99,0.0,12.75,0.0062,-0.1385,0.0746,0.0,0.0,0.0,0.0015,-0.0239,0.0591,10730.12 +180,60,5.93,1.27,12.5,1.14,5.25,0.0,13.62,0.0072,-0.1295,0.0724,0.0,-0.0,-0.0,0.0009,-0.0365,0.0336,10788.81 +181,59,6.01,0.0,11.96,1.15,5.34,0.0,12.75,0.0066,-0.1207,0.0531,0.0,0.0,0.0,0.0001,-0.0374,0.024,10850.75 +182,60,5.57,0.0,11.96,0.3,4.76,0.0,12.43,-0.0001,-0.112,0.0416,0.0,-0.0,-0.0,-0.0073,-0.0369,0.0228,10910.84 +183,60,5.12,0.0,11.96,0.31,4.16,0.0,12.22,-0.0057,-0.1038,0.0336,0.0,0.0,0.0,-0.0056,-0.0424,0.0262,10969.68 +184,60,4.75,0.0,11.49,0.32,3.7,0.0,11.44,-0.0094,-0.0835,0.04,0.0,-0.0,-0.0,-0.0037,-0.028,0.0204,11030.27 +185,60,4.21,0.0,10.67,0.34,3.13,0.0,10.5,-0.0143,-0.0661,0.0332,0.0,0.0,0.0,-0.0048,-0.0315,0.0195,11090.41 +186,60,3.88,0.0,9.41,0.34,2.74,0.0,8.3,-0.017,-0.0704,0.0189,0.0,0.0,0.0,-0.0027,-0.0295,0.0382,11149.75 +187,60,3.39,0.0,9.41,0.35,2.24,0.0,8.18,-0.021,-0.0845,0.0137,0.0,0.0,0.0,-0.0039,-0.027,0.0168,11209.78 +188,60,2.89,0.0,8.0,0.36,1.68,0.0,6.62,-0.0252,-0.0976,0.0121,0.0,-0.0,-0.0,-0.0043,-0.0541,0.0236,11268.9 +189,60,2.67,0.0,6.67,0.37,1.5,0.0,5.79,-0.0263,-0.0978,0.0133,0.0,-0.0,-0.0,-0.001,-0.06,0.0314,11330.74 +190,59,2.28,0.0,6.49,0.34,1.14,0.0,5.79,-0.0286,-0.1045,0.0068,0.0,-0.0,-0.0,-0.0034,-0.0342,0.0207,11390.85 +191,60,1.89,0.0,6.02,0.65,0.87,0.0,4.39,-0.0328,-0.1187,0.0044,0.0,0.0,0.0,-0.0031,-0.0275,0.0192,11449.63 +192,60,2.4,0.0,7.23,0.6,1.26,0.0,5.92,-0.0282,-0.1188,0.0167,0.0,0.0,0.0,0.0045,-0.0142,0.0273,11509.54 +193,60,2.57,0.0,6.82,0.6,1.41,0.0,5.72,-0.0257,-0.1057,0.0346,0.0,0.0,0.0,0.0025,-0.0264,0.0238,11570.78 +194,60,3.03,0.0,7.06,0.6,1.91,0.0,6.27,-0.0199,-0.1027,0.0295,0.0,0.0,0.0,0.0058,-0.0184,0.0443,11629.73 +195,60,3.49,0.0,7.41,0.6,2.42,0.0,7.26,-0.0143,-0.1125,0.0367,0.0,-0.0,-0.0,0.0056,-0.0252,0.0422,11690.63 +196,60,4.02,0.0,9.41,0.6,3.03,0.0,10.45,-0.0082,-0.1092,0.0406,0.0,0.0,0.0,0.0061,-0.0379,0.034,11749.09 +197,60,4.36,0.0,9.09,0.6,3.44,0.0,10.28,-0.0044,-0.1062,0.037,0.0,0.0,0.0,0.0038,-0.0192,0.0274,11809.86 +198,60,4.89,0.0,10.47,0.6,4.09,0.0,11.95,0.0009,-0.1033,0.0452,0.0,0.0,0.0,0.0053,-0.0153,0.027,11869.52 +199,60,5.1,0.0,10.99,0.6,4.36,0.0,12.69,0.0022,-0.0887,0.0518,0.0,0.0,0.0,0.0014,-0.021,0.0327,11930.73 +200,60,5.52,1.16,11.63,0.61,4.83,0.0,13.13,0.0053,-0.0728,0.0547,0.0,-0.0,-0.0,0.0031,-0.021,0.0261,11988.97 +201,60,5.71,1.15,11.49,0.61,5.04,0.0,12.91,0.0058,-0.0685,0.0437,0.0,-0.0,-0.0,0.0005,-0.028,0.0221,12050.04 +202,60,5.23,1.16,10.34,0.61,4.4,0.0,11.22,-0.0009,-0.0688,0.0306,0.0,-0.0,-0.0,-0.0067,-0.0356,0.0131,12110.76 +203,60,4.92,0.0,9.64,0.56,3.98,0.0,9.6,-0.0048,-0.0692,0.0269,0.0,-0.0,-0.0,-0.004,-0.0274,0.0122,12169.47 +204,60,4.31,0.0,9.09,0.52,3.23,0.0,8.41,-0.0112,-0.0694,0.017,0.0,0.0,0.0,-0.0064,-0.0371,0.0151,12230.27 +205,60,3.77,0.0,8.54,0.48,2.66,0.0,8.17,-0.0159,-0.0803,0.0196,0.0,0.0,0.0,-0.0047,-0.0287,0.0141,12289.71 +206,60,3.2,0.0,7.69,0.44,2.04,0.0,6.95,-0.0209,-0.0904,0.0147,0.0,0.0,0.0,-0.005,-0.0303,0.0151,12350.17 +207,60,2.88,0.0,7.06,0.41,1.73,0.0,6.64,-0.0231,-0.0968,0.0162,0.0,0.0,0.0,-0.0022,-0.0249,0.016,12408.92 +208,60,2.42,0.0,6.1,0.37,1.22,0.0,5.38,-0.0269,-0.1054,0.0082,0.0,0.0,0.0,-0.0038,-0.0352,0.014,12469.36 +209,60,2.06,0.0,4.82,0.34,0.97,0.0,3.7,-0.0293,-0.1133,0.0053,0.0,0.0,0.0,-0.0023,-0.0284,0.0184,12530.38 +210,60,1.51,0.0,5.71,0.32,0.66,0.0,4.4,-0.0344,-0.1206,0.0076,0.0,0.0,0.0,-0.0052,-0.0367,0.0218,12589.0 +211,60,1.21,0.0,4.71,0.29,0.42,0.0,3.51,-0.0392,-0.1274,0.0101,0.0,0.0,0.0,-0.0048,-0.0264,0.0174,12649.94 +212,60,1.17,0.0,4.0,0.27,0.41,0.0,3.23,-0.0418,-0.1336,0.0119,0.0,0.0,0.0,-0.0026,-0.0207,0.0168,12710.22 +213,60,1.19,0.0,4.88,0.25,0.41,0.0,4.25,-0.0437,-0.1394,0.0095,0.0,0.0,0.0,-0.002,-0.0158,0.0137,12769.4 +214,60,1.17,0.0,4.76,0.23,0.41,0.0,4.14,-0.0457,-0.1446,0.0071,0.0,0.0,0.0,-0.002,-0.0146,0.0132,12829.63 +215,59,1.17,0.0,4.82,0.21,0.43,0.0,4.17,-0.0478,-0.1495,0.0118,0.0,0.0,0.0,-0.0016,-0.0135,0.0144,12888.96 +216,59,1.11,0.0,4.88,0.6,0.42,0.0,4.22,-0.0491,-0.154,0.0117,0.0,0.0,0.0,-0.0023,-0.0124,0.0159,12950.26 +217,60,1.03,0.0,4.76,1.48,0.34,0.0,4.06,-0.0521,-0.1582,0.0093,0.0,0.0,0.0,-0.0025,-0.0158,0.0102,13009.3 +218,60,0.99,0.0,4.0,1.49,0.33,0.0,3.38,-0.0541,-0.162,0.0073,0.0,0.0,0.0,-0.002,-0.0141,0.0177,13070.21 +219,58,0.91,0.0,3.95,1.47,0.3,0.0,3.34,-0.0559,-0.1655,0.0058,0.0,-0.0,-0.0,-0.0024,-0.0129,0.0089,13130.09 +220,60,0.82,0.0,2.86,1.4,0.23,0.0,1.97,-0.0592,-0.1688,0.0044,0.0,0.0,0.0,-0.0028,-0.015,0.0149,13188.08 +221,12,0.31,0.0,1.27,1.39,0.06,0.0,0.72,-0.081,-0.1718,-0.0056,0.0,-0.0,-0.0,-0.0045,-0.0093,0.0016,13200.65 diff --git a/experiments/results/csv/oscillating_errors_adaptive_time_analysis.csv b/experiments/results/csv/oscillating_errors_adaptive_time_analysis.csv new file mode 100644 index 000000000..ae808f2dd --- /dev/null +++ b/experiments/results/csv/oscillating_errors_adaptive_time_analysis.csv @@ -0,0 +1,23 @@ +Time Range,Total Requests,Success,Errors,Error %,Rejected,Rejected %,Target Error Rate % +0-10s,4723,4655,59,1.25,9,0.19,1.0 +10-20s,4611,4568,43,0.93,0,0.0,1.0 +20-30s,4778,4674,104,2.18,0,0.0,2.0 +30-40s,5074,4735,291,5.74,48,0.95,6.0 +40-50s,4937,4740,107,2.17,90,1.82,2.0 +50-60s,5092,4669,303,5.95,120,2.36,6.0 +60-70s,5103,4820,103,2.02,180,3.53,2.0 +70-80s,5076,4638,298,5.87,140,2.76,6.0 +80-90s,5027,4778,94,1.87,155,3.08,2.0 +90-100s,5112,4672,291,5.69,149,2.91,6.0 +100-110s,5006,4758,91,1.82,157,3.14,2.0 +110-120s,5140,4692,295,5.74,153,2.98,6.0 +120-130s,4889,4671,87,1.78,131,2.68,2.0 +130-140s,5105,4681,287,5.62,137,2.68,6.0 +140-150s,4899,4658,102,2.08,139,2.84,2.0 +150-160s,5064,4606,299,5.9,159,3.14,6.0 +160-170s,4992,4747,105,2.1,140,2.8,2.0 +170-180s,5107,4646,312,6.11,149,2.92,6.0 +180-190s,4984,4758,89,1.79,137,2.75,2.0 +190-200s,5036,4639,286,5.68,111,2.2,6.0 +200-210s,4907,4702,61,1.24,144,2.93,1.0 +210-220s,4771,4715,38,0.8,18,0.38,1.0 diff --git a/experiments/results/csv/oscillating_errors_time_analysis.csv b/experiments/results/csv/oscillating_errors_time_analysis.csv new file mode 100644 index 000000000..d29e8d03c --- /dev/null +++ b/experiments/results/csv/oscillating_errors_time_analysis.csv @@ -0,0 +1,23 @@ +Time Range,Total Requests,Success,Errors,Error %,Rejected,Rejected %,Target Error Rate % +0-10s,4954,4904,50,1.01,0,0.0,1.0 +10-20s,4922,4867,55,1.12,0,0.0,1.0 +20-30s,5080,4974,106,2.09,0,0.0,2.0 +30-40s,7385,4521,306,4.14,2558,34.64,6.0 +40-50s,7343,4263,84,1.14,2996,40.8,2.0 +50-60s,7369,4458,267,3.62,2644,35.88,6.0 +60-70s,7553,3946,86,1.14,3521,46.62,2.0 +70-80s,7245,3982,273,3.77,2990,41.27,6.0 +80-90s,7430,4515,104,1.4,2811,37.83,2.0 +90-100s,7566,4004,296,3.91,3266,43.17,6.0 +100-110s,7293,3666,81,1.11,3546,48.62,2.0 +110-120s,7448,3933,258,3.46,3257,43.73,6.0 +120-130s,6745,3884,94,1.39,2767,41.02,2.0 +130-140s,6770,4145,276,4.08,2349,34.7,6.0 +140-150s,7354,4488,105,1.43,2761,37.54,2.0 +150-160s,7226,4217,295,4.08,2714,37.56,6.0 +160-170s,7295,4145,84,1.15,3066,42.03,2.0 +170-180s,7132,3761,236,3.31,3135,43.96,6.0 +180-190s,7191,3865,89,1.24,3237,45.01,2.0 +190-200s,6618,4287,262,3.96,2069,31.26,6.0 +200-210s,6567,4319,39,0.59,2209,33.64,1.0 +210-220s,5640,4797,53,0.94,790,14.01,1.0 diff --git a/experiments/results/csv/slow_query_adaptive_pid_controller.csv b/experiments/results/csv/slow_query_adaptive_pid_controller.csv new file mode 100644 index 000000000..ea1248254 --- /dev/null +++ b/experiments/results/csv/slow_query_adaptive_pid_controller.csv @@ -0,0 +1,427 @@ +Window,Thread Count,Error Rate Avg,Error Rate Min,Error Rate Max,Ideal Error Rate,Rejection Rate Avg,Rejection Rate Min,Rejection Rate Max,Integral Avg,Integral Min,Integral Max,Derivative Avg,Derivative Min,Derivative Max,P Value Avg,P Value Min,P Value Max,Total Request Time +1,17,0.0,0.0,0.0,4.61,0.0,0.0,0.0,-0.0461,-0.0461,-0.0461,0.0,-0.0,-0.0,-0.0461,-0.0461,-0.0461,59.2 +2,37,0.0,0.0,0.0,4.61,0.0,0.0,0.0,-0.0645,-0.0886,-0.0461,0.0,-0.0,-0.0,-0.0445,-0.0461,-0.0425,112.92 +3,38,0.0,0.0,0.0,4.25,0.0,0.0,0.0,-0.0922,-0.1278,-0.0461,0.0,0.0,0.0,-0.0422,-0.0461,-0.0392,155.31 +4,50,0.0,0.0,0.0,3.92,0.0,0.0,0.0,-0.1205,-0.1639,-0.0461,0.0,0.0,0.0,-0.0398,-0.0461,-0.0361,199.79 +5,50,0.0,0.0,0.0,3.61,0.0,0.0,0.0,-0.1572,-0.1972,-0.0886,0.0,0.0,0.0,-0.0367,-0.0425,-0.0333,242.62 +6,50,0.33,0.0,16.67,3.33,0.25,0.0,12.39,-0.1878,-0.228,-0.0334,0.0,0.0,0.0,-0.0306,-0.0392,0.1305,309.34 +7,52,0.71,0.0,20.0,3.07,0.58,0.0,15.76,-0.2075,-0.2563,-0.0105,0.0,0.0,0.0,-0.0269,-0.0461,0.1693,373.38 +8,53,1.32,0.0,33.33,2.83,1.25,0.0,32.06,-0.2251,-0.2824,0.1028,0.0,0.0,0.0,-0.0215,-0.0461,0.3,449.73 +9,54,1.08,0.0,25.0,2.61,1.11,0.0,29.98,-0.2483,-0.3065,0.0684,0.0,0.0,0.0,-0.0274,-0.0461,0.0016,507.37 +10,58,1.14,0.0,20.0,2.41,0.97,0.0,21.37,-0.2562,-0.3287,-0.0032,0.0,0.0,0.0,-0.025,-0.0832,0.1406,568.44 +11,58,1.04,0.0,20.0,2.22,0.85,0.0,19.71,-0.2798,-0.3491,-0.0262,0.0,0.0,0.0,-0.0236,-0.0472,0.0583,632.33 +12,59,1.01,0.0,16.67,2.05,0.81,0.0,14.26,-0.2963,-0.368,0.0001,0.0,0.0,0.0,-0.0213,-0.0659,0.0614,695.65 +13,59,1.09,0.0,16.67,1.89,0.93,0.0,15.05,-0.3148,-0.3854,0.0067,0.0,0.0,0.0,-0.0185,-0.0425,0.0508,755.31 +14,59,1.45,0.0,25.0,1.74,1.26,0.0,26.65,-0.329,-0.4014,0.1022,0.0,0.0,0.0,-0.0142,-0.0392,0.0956,817.57 +15,60,1.46,0.0,25.0,1.6,1.39,0.0,29.22,-0.3388,-0.4162,0.1066,0.0,0.0,0.0,-0.0153,-0.0461,0.0683,872.62 +16,60,1.12,0.0,25.0,1.48,0.9,0.0,30.3,-0.3587,-0.4298,0.0782,0.0,0.0,0.0,-0.0198,-0.3352,0.0477,925.71 +17,60,0.9,0.0,25.0,1.36,0.77,0.0,30.51,-0.3745,-0.4424,0.0669,0.0,0.0,0.0,-0.0158,-0.0915,0.0365,976.07 +18,60,0.59,0.0,20.0,1.26,0.48,0.0,22.47,-0.3912,-0.454,-0.0113,0.0,0.0,0.0,-0.0168,-0.1471,0.0398,1039.26 +19,60,0.55,0.0,16.67,1.16,0.4,0.0,15.94,-0.4045,-0.4647,-0.0638,0.0,0.0,0.0,-0.0133,-0.0526,0.0368,1114.01 +20,60,0.78,0.0,16.67,1.07,0.43,0.0,12.79,-0.4143,-0.4746,-0.0293,0.0,0.0,0.0,-0.0098,-0.1873,0.1551,1173.26 +21,60,0.83,0.0,16.67,0.99,0.58,0.0,16.82,-0.4224,-0.4836,0.0092,0.0,0.0,0.0,-0.0081,-0.0283,0.0746,1227.42 +22,60,1.26,0.0,20.0,0.91,1.02,0.0,22.17,-0.4265,-0.492,0.0522,0.0,0.0,0.0,-0.0041,-0.0261,0.1811,1269.06 +23,60,1.7,0.0,25.0,0.84,1.49,0.0,25.11,-0.4291,-0.4997,0.0515,0.0,0.0,0.0,-0.0026,-0.0241,0.2409,1347.63 +24,60,1.32,0.0,25.0,0.77,1.22,0.0,28.35,-0.4391,-0.5069,-0.0282,0.0,0.0,0.0,-0.01,-0.253,0.0505,1408.1 +25,60,1.16,0.0,20.0,0.71,1.03,0.0,19.3,-0.4475,-0.5134,-0.0453,0.0,0.0,0.0,-0.0084,-0.0938,0.0403,1460.7 +26,60,1.28,0.0,20.0,0.66,1.08,0.0,20.79,-0.4525,-0.5195,-0.0002,0.0,0.0,0.0,-0.005,-0.07,0.0937,1522.16 +27,59,1.32,0.0,25.0,0.61,1.21,0.0,29.98,-0.4558,-0.5251,0.0592,0.0,0.0,0.0,-0.0044,-0.0174,0.0801,1580.86 +28,60,2.21,0.0,50.0,0.56,2.17,0.0,49.01,-0.4523,-0.5302,0.0693,0.0,0.0,0.0,0.0045,-0.016,0.4929,1638.35 +29,59,2.33,0.0,50.0,0.51,2.91,0.0,78.05,-0.4502,-0.5349,0.2304,0.0,0.0,0.0,0.0008,-0.0148,0.2443,1716.39 +30,60,2.04,0.0,50.0,0.47,2.61,0.0,94.31,-0.4597,-0.5393,0.3274,0.0,0.0,0.0,-0.0081,-0.4758,0.3282,1769.57 +31,60,1.74,0.0,33.33,0.44,2.29,0.0,63.75,-0.4673,-0.5434,0.0182,0.0,0.0,0.0,-0.0077,-0.3092,0.1349,1819.35 +32,60,1.88,0.0,50.0,0.4,2.57,0.0,74.15,-0.47,-0.5471,0.221,0.0,0.0,0.0,-0.0027,-0.1033,0.2881,1867.04 +33,59,1.62,0.0,50.0,0.37,2.56,0.0,93.01,-0.4749,-0.5505,0.3412,0.0,0.0,0.0,-0.0062,-0.1866,0.1203,1930.92 +34,60,1.49,0.0,50.0,0.34,2.42,0.0,100.0,-0.4817,-0.5537,0.3663,0.0,0.0,0.0,-0.0056,-0.1156,0.0296,1985.47 +35,60,1.53,0.0,50.0,0.32,2.41,0.0,100.0,-0.4855,-0.5566,0.356,0.0,0.0,0.0,-0.0038,-0.014,0.0337,2052.64 +36,60,2.08,0.0,100.0,0.29,2.12,0.0,100.0,-0.4756,-0.5593,1.3457,0.0,0.0,0.0,0.0099,-0.1918,0.9897,2113.3 +37,60,2.08,0.0,100.0,0.27,2.13,0.0,100.0,-0.4624,-0.5617,2.3354,0.0,0.0,0.0,0.0132,-0.0148,0.9897,2151.1 +38,59,1.69,0.0,100.0,0.25,1.69,0.0,100.0,-0.4524,-0.564,3.3251,0.0,0.0,0.0,0.0083,-0.2883,0.9897,2198.74 +39,60,1.67,0.0,100.0,0.23,1.67,0.0,100.0,-0.4411,-0.5661,4.3148,0.0,0.0,0.0,0.0131,-0.0126,0.9897,2247.42 +40,58,0.0,0.0,0.0,0.21,1.12,0.0,65.16,-0.4575,-0.5681,3.3053,0.0,0.0,0.0,-0.0206,-1.0095,-0.0019,2294.72 +41,60,0.33,0.0,20.0,0.21,1.08,0.0,52.21,-0.4715,-0.5707,2.6465,0.0,0.0,0.0,-0.0105,-0.6588,0.1975,2371.13 +42,60,0.52,0.0,16.67,0.19,1.09,0.0,41.75,-0.4796,-0.5747,2.1183,0.0,0.0,0.0,-0.0081,-0.5282,0.1322,2434.2 +43,60,4.32,0.0,50.0,0.18,4.26,0.0,48.39,-0.4491,-0.5785,1.6955,0.0,0.0,0.0,0.0305,-0.4228,0.4982,2482.7 +44,58,15.93,0.0,100.0,0.17,15.57,0.0,100.0,-0.3198,-0.5819,2.6906,0.0,0.0,0.0,0.1397,-0.0042,0.9983,2525.61 +45,60,21.46,0.0,100.0,0.67,26.23,0.0,100.0,-0.1546,-0.585,3.6831,0.0,0.0,0.0,0.1594,-0.0067,0.9967,2589.45 +46,60,23.91,0.0,100.0,0.62,30.57,0.0,100.0,-0.0076,-0.588,4.6757,0.0,0.0,0.0,0.147,-0.057,0.9967,2667.59 +47,58,30.57,0.0,100.0,0.57,36.63,0.0,100.0,0.229,-0.5907,5.6683,0.0,0.0,0.0,0.217,-0.0098,0.9979,2724.48 +48,59,33.07,0.0,100.0,0.11,39.48,0.0,100.0,0.4249,-0.5931,6.6608,0.0,0.0,0.0,0.2345,-0.0063,0.9975,2774.82 +49,60,38.52,0.0,100.0,0.17,47.49,0.0,100.0,0.7037,-0.5954,7.6534,0.0,-0.0,-0.0,0.271,-0.0232,0.9989,2832.89 +50,59,41.28,0.0,100.0,0.17,52.38,0.0,100.0,0.9972,-0.5975,8.6459,0.0,0.0,0.0,0.2718,-0.1205,0.9978,2909.08 +51,60,45.03,0.0,100.0,0.09,56.16,0.0,100.0,1.2927,-0.5995,9.6385,0.0,0.0,0.0,0.3218,-0.1503,0.9985,2990.54 +52,60,49.58,0.0,100.0,0.08,58.39,0.0,100.0,1.6745,-0.6013,10.0,0.0,0.0,0.0,0.3923,-0.1854,0.998,3054.67 +53,60,47.36,0.0,100.0,0.17,58.7,0.0,100.0,1.9887,-0.6029,10.0,0.0,0.0,0.0,0.3307,-1.0074,0.998,3097.34 +54,60,33.19,0.0,100.0,0.15,52.4,0.0,100.0,2.0458,-0.6044,9.4583,0.0,-0.0,-0.0,0.057,-1.0069,0.998,3135.56 +55,60,19.78,0.0,100.0,0.06,48.34,0.0,100.0,1.9011,-0.6058,8.4508,0.0,0.0,0.0,-0.1447,-1.0087,0.998,3204.46 +56,60,14.64,0.0,100.0,0.06,41.85,0.0,100.0,1.695,-0.6071,7.444,0.0,0.0,0.0,-0.206,-1.0081,0.998,3284.81 +57,60,14.83,0.0,100.0,0.05,39.57,0.0,100.0,1.5514,-0.6083,8.4033,0.0,0.0,0.0,-0.1437,-1.0197,0.998,3371.2 +58,60,9.17,0.0,100.0,0.05,35.67,0.0,100.0,1.3311,-0.6094,9.4011,0.0,0.0,0.0,-0.2203,-1.0069,0.998,3423.6 +59,60,4.17,0.0,100.0,0.05,27.88,0.0,100.0,1.0555,-0.6589,8.9022,0.0,0.0,0.0,-0.2755,-1.0054,0.998,3470.68 +60,60,3.06,0.0,100.0,0.04,21.22,0.0,100.0,0.8307,-0.7187,9.9002,0.0,0.0,0.0,-0.2248,-1.0033,0.998,3520.34 +61,60,1.25,0.0,50.0,0.04,18.06,0.0,100.0,0.6392,-0.7195,8.8983,0.0,0.0,0.0,-0.1915,-1.0019,0.0222,3574.95 +62,60,1.25,0.0,50.0,0.04,15.55,0.0,100.0,0.4793,-0.7203,7.8966,0.0,0.0,0.0,-0.1598,-1.0017,0.0249,3647.85 +63,60,0.75,0.0,25.0,0.03,12.18,0.0,100.0,0.3323,-0.7211,6.895,0.0,0.0,0.0,-0.147,-1.0016,0.0219,3692.27 +64,60,7.14,0.0,100.0,0.03,16.91,0.0,100.0,0.2951,-0.7218,5.8935,0.0,0.0,0.0,-0.0372,-1.0015,0.999,3737.15 +65,60,18.33,0.0,100.0,0.03,27.42,0.0,100.0,0.3705,-0.6658,4.8922,0.0,0.0,0.0,0.0754,-1.0014,0.9992,3774.65 +66,60,28.38,0.0,100.0,0.03,38.54,0.0,100.0,0.5295,-0.6667,4.7593,0.0,0.0,0.0,0.159,-0.9783,0.9994,3853.01 +67,60,28.65,0.0,100.0,0.03,41.94,0.0,100.0,0.6565,-0.6674,5.7579,0.0,0.0,0.0,0.127,-0.7826,0.9988,3917.61 +68,59,30.01,0.0,100.0,0.03,45.26,0.0,100.0,0.807,-0.6682,6.7564,0.0,-0.0,-0.0,0.1294,-0.6261,0.9988,3988.03 +69,60,30.53,0.0,100.0,0.02,45.75,0.0,100.0,0.9213,-0.6689,7.7549,0.0,0.0,0.0,0.1376,-0.5009,0.9988,4050.49 +70,54,34.7,0.0,100.0,0.02,46.46,0.0,100.0,1.1922,-0.6695,8.7535,0.0,0.0,0.0,0.2038,-0.4008,0.9988,4090.34 +71,60,34.36,0.0,100.0,0.07,45.44,0.0,100.0,1.3235,-0.6701,9.752,0.0,0.0,0.0,0.2188,-0.3206,0.9988,4173.98 +72,59,34.89,0.0,100.0,0.07,45.93,0.0,100.0,1.5527,-0.6706,10.0,0.0,0.0,0.0,0.2239,-0.2565,0.9988,4237.78 +73,59,37.29,0.0,100.0,0.11,44.33,0.0,100.0,1.6955,-0.6711,10.0,0.0,0.0,0.0,0.2896,-0.2052,0.9995,4303.58 +74,60,30.28,0.0,100.0,0.17,41.92,0.0,100.0,1.8908,-0.6715,10.0,0.0,0.0,0.0,0.141,-1.003,0.9995,4345.18 +75,60,21.44,0.0,100.0,0.15,36.33,0.0,100.0,1.8747,-0.6719,10.0,0.0,-0.0,-0.0,0.0048,-1.003,0.9995,4384.66 +76,60,5.0,0.0,100.0,0.09,26.07,0.0,100.0,1.6105,-0.6723,8.9988,0.0,0.0,0.0,-0.2642,-1.0051,0.9995,4446.81 +77,59,0.0,0.0,0.0,0.08,24.71,0.0,100.0,1.382,-0.6727,7.9976,0.0,0.0,0.0,-0.2658,-1.0026,-0.0001,4537.93 +78,59,0.0,0.0,0.0,0.01,22.79,0.0,100.0,1.1333,-0.673,6.9965,0.0,0.0,0.0,-0.2477,-1.0024,-0.0001,4594.74 +79,59,1.69,0.0,100.0,0.02,21.9,0.0,100.0,0.9099,-0.6733,5.9956,0.0,0.0,0.0,-0.2108,-1.0016,0.9999,4642.01 +80,60,9.08,0.0,100.0,0.05,23.39,0.0,100.0,0.8194,-0.6736,4.9947,0.0,0.0,0.0,-0.0788,-1.0015,0.9998,4688.44 +81,58,17.13,0.0,100.0,0.04,30.21,0.0,100.0,0.8721,-0.6738,5.7905,0.0,0.0,0.0,0.0143,-0.9989,0.9998,4745.62 +82,60,20.08,0.0,100.0,0.01,33.23,0.0,100.0,0.8817,-0.6741,6.7883,0.0,0.0,0.0,0.0484,-0.799,0.9998,4826.76 +83,60,19.19,0.0,100.0,0.01,32.1,0.0,100.0,0.9202,-0.6743,7.7861,0.0,0.0,0.0,0.0385,-0.6392,0.9998,4881.23 +84,60,19.28,0.0,100.0,0.01,31.2,0.0,100.0,0.9749,-0.6745,8.7839,0.0,0.0,0.0,0.0548,-0.5114,0.9998,4951.43 +85,60,19.58,0.0,100.0,0.01,30.31,0.0,100.0,1.0473,-0.6747,9.7817,0.0,0.0,0.0,0.0723,-0.4092,0.9998,5002.7 +86,60,20.56,0.0,100.0,0.01,29.65,0.0,100.0,1.1356,-0.6748,10.0,0.0,0.0,0.0,0.1013,-0.3273,0.9998,5064.32 +87,60,21.94,0.0,100.0,0.01,29.03,0.0,100.0,1.2555,-0.675,10.0,0.0,0.0,0.0,0.1366,-0.2619,0.9998,5150.44 +88,60,23.11,0.0,100.0,0.01,28.83,0.0,100.0,1.392,-0.6751,10.0,0.0,0.0,0.0,0.1627,-0.2095,0.9998,5188.0 +89,60,20.25,0.0,100.0,0.01,28.31,0.0,100.0,1.484,-0.6753,10.0,0.0,0.0,0.0,0.1087,-1.0015,0.9998,5240.45 +90,60,19.22,0.0,100.0,0.01,29.43,0.0,100.0,1.5337,-0.6754,10.0,0.0,0.0,0.0,0.0791,-1.002,0.9998,5290.21 +91,60,13.17,0.0,100.0,0.01,32.35,0.0,100.0,1.4256,-0.5906,9.7227,0.0,0.0,0.0,-0.1081,-1.0037,0.9999,5359.18 +92,59,12.18,0.0,100.0,0.01,32.95,0.0,100.0,1.311,-0.5907,8.7212,0.0,0.0,0.0,-0.1387,-1.0034,0.9998,5398.87 +93,60,15.06,0.0,100.0,0.01,35.87,0.0,100.0,1.2097,-0.5907,7.7198,0.0,0.0,0.0,-0.0794,-1.0031,0.9998,5478.3 +94,59,17.57,0.0,100.0,0.01,39.59,0.0,100.0,1.175,-0.5907,6.7186,0.0,0.0,0.0,-0.0604,-1.0029,0.9999,5523.66 +95,60,22.78,0.0,100.0,0.01,43.39,0.0,100.0,1.1521,-0.5907,5.7174,0.0,-0.0,-0.0,0.0018,-1.0027,0.9999,5603.15 +96,60,24.33,0.0,100.0,0.01,44.78,0.0,100.0,1.17,-0.5907,6.181,0.0,-0.0,-0.0,0.0179,-1.0011,0.9999,5670.18 +97,60,24.25,0.0,100.0,0.01,43.94,0.0,100.0,1.1917,-0.5908,7.1808,0.0,-0.0,-0.0,0.0216,-0.9432,0.9999,5742.85 +98,60,28.53,0.0,100.0,0.01,42.94,0.0,100.0,1.2983,-0.5908,8.1806,0.0,0.0,0.0,0.1066,-0.9913,0.9999,5795.72 +99,59,35.45,0.0,100.0,0.01,47.44,0.0,100.0,1.542,-0.5908,9.1805,0.0,0.0,0.0,0.2227,-0.6036,0.9999,5840.86 +100,60,38.75,0.0,100.0,0.01,50.57,0.0,100.0,1.7565,-0.5908,10.0,0.0,0.0,0.0,0.2423,-1.0004,0.9999,5898.78 +101,60,40.94,0.0,100.0,0.01,53.0,0.0,100.0,1.9672,-0.5908,10.0,0.0,0.0,0.0,0.2523,-1.0002,1.0,5957.57 +102,60,35.14,0.0,100.0,0.01,52.29,0.0,100.0,2.0841,-0.5908,10.0,0.0,0.0,0.0,0.1335,-1.0002,0.9999,6005.69 +103,60,27.78,0.0,100.0,0.01,48.83,0.0,100.0,2.1018,-0.6112,9.8587,0.0,0.0,0.0,0.0176,-1.0007,0.9999,6076.43 +104,60,25.56,0.0,100.0,0.01,48.5,0.0,100.0,2.0984,-0.6113,10.0,0.0,0.0,0.0,0.0109,-1.0007,0.9999,6129.27 +105,60,21.11,0.0,100.0,0.01,49.82,0.0,100.0,1.9958,-0.5909,8.9999,0.0,0.0,0.0,-0.1025,-1.0009,0.9999,6213.07 +106,60,22.92,0.0,100.0,0.01,48.27,0.0,100.0,1.9382,-0.5909,9.6313,0.0,0.0,0.0,-0.0576,-1.0008,0.9999,6290.56 +107,60,23.61,0.0,100.0,0.01,46.29,0.0,100.0,1.9005,-0.5909,10.0,0.0,0.0,0.0,-0.0265,-1.0005,0.9999,6342.65 +108,58,21.55,0.0,100.0,0.0,40.35,0.0,100.0,1.8128,-0.5909,10.0,0.0,0.0,0.0,-0.0463,-1.0004,0.9999,6387.55 +109,60,25.69,0.0,100.0,0.0,39.77,0.0,100.0,1.849,-0.5909,10.0,0.0,0.0,0.0,0.0681,-1.0002,0.9999,6435.08 +110,60,17.08,0.0,100.0,0.0,36.17,0.0,100.0,1.759,-0.5909,10.0,0.0,0.0,0.0,-0.0818,-1.0007,0.9999,6511.92 +111,60,15.69,0.0,100.0,0.0,35.13,0.0,100.0,1.6473,-0.5909,10.0,0.0,0.0,0.0,-0.0783,-1.0006,0.9999,6551.49 +112,60,21.67,0.0,100.0,0.0,42.32,0.0,100.0,1.6399,-0.5909,10.0,0.0,0.0,0.0,-0.0018,-1.0008,0.9999,6613.99 +113,60,21.25,0.0,100.0,0.0,42.11,0.0,100.0,1.602,-0.591,10.0,0.0,0.0,0.0,-0.0212,-1.0007,0.9999,6678.79 +114,60,21.11,0.0,100.0,0.0,40.62,0.0,100.0,1.5743,-0.591,10.0,0.0,0.0,0.0,-0.011,-1.0007,0.9999,6725.11 +115,60,18.33,0.0,100.0,0.0,39.53,0.0,100.0,1.4962,-0.591,10.0,0.0,0.0,0.0,-0.0748,-1.0006,0.9999,6790.06 +116,60,20.0,0.0,100.0,0.0,39.01,0.0,100.0,1.4595,-0.591,10.0,0.0,0.0,0.0,-0.0201,-1.0006,0.9999,6873.3 +117,60,21.03,0.0,100.0,0.0,37.27,0.0,100.0,1.4594,-0.591,10.0,0.0,0.0,0.0,0.0166,-1.0002,1.0,6926.17 +118,60,21.03,0.0,100.0,0.0,35.47,0.0,100.0,1.4803,-0.591,10.0,0.0,0.0,0.0,0.0376,-1.0002,1.0,6984.83 +119,60,20.69,0.0,100.0,0.0,38.15,0.0,100.0,1.4742,-0.4986,10.0,0.0,0.0,0.0,0.0088,-1.0002,1.0,7044.33 +120,60,29.03,0.0,100.0,0.0,47.0,0.0,100.0,1.5612,-0.4986,10.0,0.0,0.0,0.0,0.1036,-1.0001,1.0,7102.41 +121,60,28.61,0.0,100.0,0.0,47.87,0.0,100.0,1.6032,-0.5211,10.0,0.0,-0.0,-0.0,0.0587,-1.0007,1.0,7141.45 +122,60,24.22,0.0,100.0,0.0,47.33,0.0,100.0,1.5583,-0.5211,8.9999,0.0,-0.0,-0.0,-0.0449,-1.0002,1.0,7214.4 +123,60,29.61,0.0,100.0,0.0,51.2,0.0,100.0,1.6192,-0.5212,8.5003,0.0,-0.0,-0.0,0.0609,-1.0001,1.0,7281.06 +124,60,30.67,0.0,100.0,0.0,50.01,0.0,100.0,1.7005,-0.5213,9.5002,0.0,0.0,0.0,0.0813,-1.0001,1.0,7330.89 +125,60,26.94,0.0,100.0,0.0,46.55,0.0,100.0,1.7207,-0.5213,8.5001,0.0,0.0,0.0,0.0202,-1.0001,1.0,7386.31 +126,59,32.63,0.0,100.0,0.0,48.68,0.0,100.0,1.906,-0.4988,8.9984,0.0,0.0,0.0,0.1474,-1.0001,1.0,7482.01 +127,60,35.28,0.0,100.0,0.01,48.28,0.0,100.0,2.0662,-0.5214,9.9983,0.0,0.0,0.0,0.2006,-1.0001,1.0,7530.58 +128,59,36.16,0.0,100.0,0.0,46.25,0.0,100.0,2.2137,-0.5214,10.0,0.0,0.0,0.0,0.2424,-1.0001,1.0,7586.79 +129,60,33.89,0.0,100.0,0.0,44.56,0.0,100.0,2.4007,-0.5214,10.0,0.0,0.0,0.0,0.201,-1.0001,1.0,7652.66 +130,60,23.33,0.0,100.0,0.0,40.39,0.0,100.0,2.3941,-0.5352,10.0,0.0,0.0,0.0,0.0101,-1.0002,1.0,7689.87 +131,60,21.72,0.0,100.0,0.0,46.66,0.0,100.0,2.3483,-0.5353,10.0,0.0,-0.0,-0.0,-0.0406,-1.0002,1.0,7745.44 +132,60,19.5,0.0,100.0,0.0,49.19,0.0,100.0,2.1823,-0.5354,10.0,0.0,0.0,0.0,-0.1494,-1.0002,1.0,7809.46 +133,60,17.28,0.0,100.0,0.0,50.13,0.0,100.0,2.0057,-0.5355,9.3097,0.0,0.0,0.0,-0.1766,-1.0002,1.0,7889.07 +134,60,17.97,0.0,100.0,0.0,47.48,0.0,100.0,1.8444,-0.5355,10.0,0.0,0.0,0.0,-0.1561,-1.0002,1.0,7949.95 +135,60,18.81,0.0,100.0,0.0,43.64,0.0,100.0,1.7172,-0.5356,10.0,0.0,0.0,0.0,-0.1105,-1.0002,1.0,8004.17 +136,60,20.42,0.0,100.0,0.0,43.91,0.0,100.0,1.6506,-0.5356,8.9999,0.0,0.0,0.0,-0.0666,-1.0002,1.0,8048.12 +137,60,26.81,0.0,100.0,0.0,50.21,0.0,100.0,1.6811,-0.5357,7.9998,0.0,0.0,0.0,0.0305,-1.0002,1.0,8122.66 +138,60,29.86,0.0,100.0,0.0,53.42,0.0,100.0,1.7335,-0.5357,8.7934,0.0,0.0,0.0,0.0525,-1.0001,1.0,8186.68 +139,58,34.2,0.0,100.0,0.0,55.63,0.0,100.0,1.7866,-0.5358,9.7934,0.0,0.0,0.0,0.1148,-1.0001,1.0,8251.85 +140,60,35.0,0.0,100.0,0.0,55.37,0.0,100.0,1.9563,-0.5358,10.0,0.0,0.0,0.0,0.1324,-1.0001,1.0,8287.87 +141,60,32.5,0.0,100.0,0.0,55.09,0.0,100.0,1.9945,-0.5359,10.0,0.0,0.0,0.0,0.0548,-1.0001,1.0,8327.29 +142,60,28.61,0.0,100.0,0.0,53.33,0.0,100.0,1.9796,-0.5359,9.7631,0.0,0.0,0.0,-0.0149,-1.0001,1.0,8369.8 +143,60,25.28,0.0,100.0,0.0,52.26,0.0,100.0,1.94,-0.5359,10.0,0.0,-0.0,-0.0,-0.0363,-1.0002,1.0,8461.28 +144,60,27.92,0.0,100.0,0.0,51.01,0.0,100.0,1.9519,-0.5359,10.0,0.0,0.0,0.0,0.0286,-1.0001,1.0,8546.38 +145,60,28.75,0.0,100.0,0.0,49.35,0.0,100.0,1.9949,-0.536,10.0,0.0,0.0,0.0,0.0597,-1.0001,1.0,8599.52 +146,60,26.25,0.0,100.0,0.0,41.62,0.0,100.0,2.0051,-0.536,10.0,0.0,0.0,0.0,0.0268,-1.0001,1.0,8682.81 +147,60,16.39,0.0,100.0,0.0,34.33,0.0,100.0,1.891,-0.536,10.0,0.0,0.0,0.0,-0.0942,-1.0001,1.0,8755.65 +148,60,14.72,0.0,100.0,0.0,31.53,0.0,100.0,1.8203,-0.536,10.0,0.0,0.0,0.0,-0.054,-1.0001,1.0,8806.49 +149,60,10.83,0.0,100.0,0.0,29.36,0.0,100.0,1.6917,-0.5361,10.0,0.0,0.0,0.0,-0.1231,-1.0001,1.0,8856.17 +150,60,15.56,0.0,100.0,0.0,32.16,0.0,100.0,1.6134,-0.5361,10.0,0.0,0.0,0.0,-0.0322,-1.0001,1.0,8914.62 +151,60,17.5,0.0,100.0,0.0,37.52,0.0,100.0,1.5546,-0.5361,10.0,0.0,0.0,0.0,-0.0457,-1.0001,1.0,8967.4 +152,60,21.81,0.0,100.0,0.0,42.15,0.0,100.0,1.5457,-0.5361,9.0,0.0,0.0,0.0,-0.0089,-1.0001,1.0,9008.9 +153,60,28.61,0.0,100.0,0.0,49.9,0.0,100.0,1.6159,-0.5361,8.0,0.0,0.0,0.0,0.0702,-1.0001,1.0,9053.96 +154,60,32.64,0.0,100.0,0.0,53.68,0.0,100.0,1.7305,-0.5361,7.0477,0.0,0.0,0.0,0.1146,-1.0001,1.0,9096.03 +155,60,38.19,0.0,100.0,0.0,58.38,0.0,100.0,1.9024,-0.5361,8.0477,0.0,0.0,0.0,0.1719,-1.0001,1.0,9197.1 +156,60,40.19,0.0,100.0,0.0,57.85,0.0,100.0,2.1063,-0.5362,9.0477,0.0,0.0,0.0,0.2039,-1.0,1.0,9273.94 +157,60,42.5,0.0,100.0,0.0,56.23,0.0,100.0,2.3683,-0.5362,10.0,0.0,0.0,0.0,0.2628,-1.0,1.0,9355.44 +158,58,46.98,0.0,100.0,0.0,57.51,0.0,100.0,2.778,-0.5362,10.0,0.0,0.0,0.0,0.3508,-0.8,1.0,9381.72 +159,60,43.47,0.0,100.0,0.0,52.45,0.0,100.0,2.9543,-0.5362,10.0,0.0,0.0,0.0,0.3013,-1.0001,1.0,9462.88 +160,60,42.22,0.0,100.0,0.0,49.71,0.0,100.0,3.2176,-0.544,10.0,0.0,-0.0,-0.0,0.3172,-1.0001,1.0,9511.26 +161,60,35.56,0.0,100.0,0.0,49.7,0.0,100.0,3.3662,-0.544,10.0,0.0,-0.0,-0.0,0.1967,-1.0,1.0,9555.18 +162,60,31.11,0.0,100.0,0.0,52.25,0.0,100.0,3.4266,-0.5362,10.0,0.0,0.0,0.0,0.0812,-1.0001,1.0,9588.11 +163,60,29.03,0.0,100.0,0.0,56.2,0.0,100.0,3.4192,-0.5362,10.0,0.0,0.0,0.0,0.0093,-1.0001,1.0,9643.51 +164,60,21.81,0.0,100.0,0.0,62.37,0.0,100.0,3.2004,-0.5362,10.0,0.0,0.0,0.0,-0.1921,-1.0001,1.0,9690.73 +165,60,19.97,0.0,100.0,0.0,63.9,0.0,100.0,2.9488,-0.5362,9.9372,0.0,0.0,0.0,-0.2515,-1.0001,1.0,9774.41 +166,60,20.56,0.0,100.0,0.0,61.86,0.0,100.0,2.6969,-0.5362,8.9372,0.0,0.0,0.0,-0.2519,-1.0001,1.0,9860.38 +167,60,23.44,0.0,100.0,0.0,58.67,0.0,100.0,2.5378,-0.5362,7.9372,0.0,-0.0,-0.0,-0.1591,-1.0,1.0,9939.89 +168,60,25.56,0.0,100.0,0.0,53.81,0.0,100.0,2.4592,-0.5362,7.4705,0.0,0.0,0.0,-0.0786,-1.0,1.0,10008.23 +169,60,25.56,0.0,100.0,0.0,49.38,0.0,100.0,2.4321,-0.5362,8.4705,0.0,0.0,0.0,-0.027,-1.0,1.0,10050.9 +170,60,26.11,0.0,100.0,0.0,45.15,0.0,100.0,2.4605,-0.5362,9.4705,0.0,0.0,0.0,0.0284,-1.0,1.0,10106.38 +171,60,22.78,0.0,100.0,0.0,40.53,0.0,100.0,2.4567,-0.5362,10.0,0.0,0.0,0.0,0.004,-1.0,1.0,10166.34 +172,60,22.92,0.0,100.0,0.0,42.21,0.0,100.0,2.4465,-0.5362,10.0,0.0,0.0,0.0,0.0099,-1.0,1.0,10221.44 +173,60,29.86,0.0,100.0,0.0,49.63,0.0,100.0,2.51,-0.5363,10.0,0.0,0.0,0.0,0.0914,-1.0,1.0,10254.64 +174,59,27.99,0.0,100.0,0.0,52.03,0.0,100.0,2.5668,-0.5363,10.0,0.0,-0.0,-0.0,0.031,-1.0,1.0,10311.4 +175,59,24.72,0.0,100.0,0.0,52.57,0.0,100.0,2.5154,-0.5363,10.0,0.0,-0.0,-0.0,-0.0564,-1.0,1.0,10360.33 +176,60,29.03,0.0,100.0,0.0,56.71,0.0,100.0,2.4866,-0.5219,9.0,0.0,0.0,0.0,0.0019,-1.0,1.0,10447.54 +177,60,28.92,0.0,100.0,0.0,55.02,0.0,100.0,2.4897,-0.5219,8.1597,0.0,0.0,0.0,0.0032,-1.0,1.0,10512.06 +178,60,30.17,0.0,100.0,0.0,52.03,0.0,100.0,2.5361,-0.5219,9.1596,0.0,0.0,0.0,0.0464,-1.0,1.0,10614.8 +179,60,31.86,0.0,100.0,0.0,49.09,0.0,100.0,2.642,-0.5219,10.0,0.0,0.0,0.0,0.1094,-1.0,1.0,10655.75 +180,60,32.14,0.0,100.0,0.0,46.92,0.0,100.0,2.7356,-0.5219,10.0,0.0,0.0,0.0,0.1434,-1.0,1.0,10701.07 +181,60,33.25,0.0,100.0,0.0,45.1,0.0,100.0,2.835,-0.5219,10.0,0.0,0.0,0.0,0.1881,-1.0,1.0,10751.14 +182,60,28.11,0.0,100.0,0.0,41.78,0.0,100.0,2.8227,-0.5219,10.0,0.0,0.0,0.0,0.1017,-1.0,1.0,10809.16 +183,60,22.56,0.0,100.0,0.0,45.7,0.0,100.0,2.754,-0.5219,10.0,0.0,-0.0,-0.0,-0.0221,-1.0,1.0,10855.59 +184,60,19.47,0.0,100.0,0.0,47.44,0.0,100.0,2.6271,-0.5219,10.0,0.0,0.0,0.0,-0.1129,-1.0,1.0,10946.01 +185,60,17.5,0.0,100.0,0.0,46.01,0.0,100.0,2.4683,-0.5219,10.0,0.0,0.0,0.0,-0.1366,-1.0,1.0,10992.66 +186,60,13.17,0.0,100.0,0.0,43.04,0.0,100.0,2.2448,-0.5219,9.0,0.0,0.0,0.0,-0.2235,-1.0,1.0,11046.54 +187,60,19.72,0.0,100.0,0.0,47.52,0.0,100.0,2.148,-0.4079,9.2,0.0,0.0,0.0,-0.0969,-1.0,1.0,11096.78 +188,60,22.5,0.0,100.0,0.0,48.57,0.0,100.0,2.0792,-0.4079,10.0,0.0,0.0,0.0,-0.0654,-1.0,1.0,11184.57 +189,60,24.28,0.0,100.0,0.0,46.73,0.0,100.0,2.0452,-0.4079,10.0,0.0,0.0,0.0,-0.0174,-1.0,1.0,11259.36 +190,60,27.22,0.0,100.0,0.0,47.46,0.0,100.0,2.0752,-0.4079,10.0,0.0,0.0,0.0,0.0467,-1.0,1.0,11302.9 +191,60,34.31,0.0,100.0,0.0,51.54,0.0,100.0,2.18,-0.4079,10.0,0.0,0.0,0.0,0.1455,-1.0,1.0,11357.65 +192,59,37.99,0.0,100.0,0.0,54.33,0.0,100.0,2.3544,-0.4079,10.0,0.0,-0.0,-0.0,0.1983,-1.0,1.0,11405.42 +193,60,34.58,0.0,100.0,0.0,53.84,0.0,100.0,2.4111,-0.4079,10.0,0.0,0.0,0.0,0.1246,-1.0,1.0,11478.81 +194,60,33.06,0.0,100.0,0.0,53.6,0.0,100.0,2.5079,-0.4079,9.0,0.0,0.0,0.0,0.0968,-1.0,1.0,11541.61 +195,60,34.44,0.0,100.0,0.0,52.68,0.0,100.0,2.6555,-0.4079,10.0,0.0,0.0,0.0,0.1476,-1.0,1.0,11592.23 +196,56,34.23,0.0,100.0,0.0,52.22,0.0,100.0,2.9189,-0.4079,10.0,0.0,0.0,0.0,0.1532,-1.0,1.0,11634.75 +197,60,32.22,0.0,100.0,0.0,55.39,0.0,100.0,2.8198,-0.4079,10.0,0.0,0.0,0.0,0.0799,-1.0,1.0,11707.02 +198,60,29.17,0.0,100.0,0.0,55.28,0.0,100.0,2.8194,-0.4079,10.0,0.0,-0.0,-0.0,0.0089,-1.0,1.0,11772.21 +199,60,29.17,0.0,100.0,0.0,54.35,0.0,100.0,2.8245,-0.4079,10.0,0.0,0.0,0.0,0.025,-1.0,1.0,11851.1 +200,59,28.25,0.0,100.0,0.0,52.61,0.0,100.0,2.7197,-0.4079,10.0,0.0,0.0,0.0,0.0119,-1.0,1.0,11897.28 +201,60,26.94,0.0,100.0,0.0,56.28,0.0,100.0,2.6849,-0.4079,10.0,0.0,0.0,0.0,-0.044,-1.0,1.0,11939.9 +202,59,18.36,0.0,100.0,0.0,56.28,0.0,100.0,2.4821,-0.4079,10.0,0.0,-0.0,-0.0,-0.2208,-1.0,1.0,12008.53 +203,60,21.11,0.0,100.0,0.0,55.9,0.0,100.0,2.2703,-0.4079,10.0,0.0,-0.0,-0.0,-0.1633,-1.0,1.0,12059.01 +204,60,18.61,0.0,100.0,0.0,51.96,0.0,100.0,2.0809,-0.4079,9.0,0.0,-0.0,-0.0,-0.1894,-1.0,1.0,12124.47 +205,60,23.61,0.0,100.0,0.0,51.79,0.0,100.0,2.0114,-0.4079,8.0,0.0,0.0,0.0,-0.0695,-1.0,1.0,12193.74 +206,60,26.94,0.0,100.0,0.0,52.74,0.0,100.0,1.9858,-0.4079,7.0,0.0,0.0,0.0,-0.0256,-1.0,1.0,12243.38 +207,60,31.11,0.0,100.0,0.0,52.91,0.0,100.0,2.0363,-0.4079,7.0502,0.0,0.0,0.0,0.0505,-1.0,1.0,12311.83 +208,60,30.0,0.0,100.0,0.0,51.52,0.0,100.0,2.082,-0.4079,8.0502,0.0,0.0,0.0,0.0457,-1.0,1.0,12391.93 +209,60,33.33,0.0,100.0,0.0,50.69,0.0,100.0,2.2159,-0.4079,9.0502,0.0,0.0,0.0,0.1339,-1.0,1.0,12453.08 +210,60,38.06,0.0,100.0,0.0,52.36,0.0,100.0,2.4243,-0.4079,10.0,0.0,0.0,0.0,0.2092,-1.0,1.0,12519.77 +211,60,42.22,0.0,100.0,0.0,56.9,0.01,100.0,2.6649,-0.0746,10.0,0.0,0.0,0.0,0.2637,-1.0,1.0,12561.31 +212,60,38.61,0.0,100.0,0.0,59.58,0.0,100.0,2.8043,-0.4094,10.0,0.0,0.0,0.0,0.1561,-1.0,1.0,12609.1 +213,58,40.8,0.0,100.0,0.0,62.59,0.0,100.0,3.027,-0.4094,10.0,0.0,-0.0,-0.0,0.1804,-1.0,1.0,12646.52 +214,60,41.11,0.0,100.0,0.0,60.77,0.0,100.0,3.1071,-0.4094,10.0,0.0,0.0,0.0,0.1983,-1.0,1.0,12715.75 +215,59,38.98,0.0,100.0,0.0,57.14,0.0,100.0,3.1944,-0.4094,10.0,0.0,0.0,0.0,0.1786,-1.0,1.0,12791.49 +216,60,30.0,0.0,100.0,0.0,55.55,0.0,100.0,3.149,-0.4094,10.0,0.0,0.0,0.0,0.0214,-1.0,1.0,12833.77 +217,59,27.12,0.0,100.0,0.0,54.31,0.0,100.0,3.1343,-0.4094,10.0,0.0,0.0,0.0,-0.0178,-1.0,1.0,12915.43 +218,60,27.5,0.0,100.0,0.0,51.44,0.0,100.0,3.0622,-0.4094,10.0,0.0,0.0,0.0,0.0031,-1.0,1.0,12999.83 +219,56,35.71,0.0,100.0,0.0,57.38,0.0,100.0,3.0885,-0.0,10.0,0.0,0.0,0.0,0.1393,-1.0,1.0,13051.87 +220,60,30.83,0.0,100.0,0.0,56.59,0.0,100.0,3.1567,-0.0,10.0,0.0,0.0,0.0,0.0423,-1.0,1.0,13104.76 +221,60,23.06,0.0,100.0,0.0,53.39,0.0,100.0,2.9925,-0.0,10.0,0.0,0.0,0.0,-0.1271,-1.0,1.0,13150.86 +222,60,14.72,0.0,100.0,0.0,51.34,0.0,100.0,2.708,0.0,10.0,0.0,0.0,0.0,-0.2586,-1.0,1.0,13194.45 +223,60,13.06,0.0,100.0,0.0,48.34,0.0,100.0,2.4307,0.0,10.0,0.0,0.0,0.0,-0.2606,-1.0,1.0,13244.94 +224,60,12.5,0.0,100.0,0.0,46.31,0.0,100.0,2.1866,0.0,9.0,0.0,0.0,0.0,-0.2441,-1.0,1.0,13299.43 +225,60,19.44,0.0,100.0,0.0,49.13,0.0,100.0,2.0699,0.0,8.9247,0.0,0.0,0.0,-0.1167,-1.0,1.0,13383.69 +226,60,19.44,0.0,100.0,0.0,46.62,0.0,100.0,1.9645,0.0,9.9247,0.0,-0.0,-0.0,-0.1054,-1.0,1.0,13443.65 +227,60,21.67,0.0,100.0,0.0,44.01,0.0,100.0,1.9104,0.0,10.0,0.0,0.0,0.0,-0.0387,-1.0,1.0,13521.14 +228,60,20.14,0.0,100.0,0.0,40.27,0.0,100.0,1.8392,0.0,10.0,0.0,0.0,0.0,-0.0398,-1.0,1.0,13597.05 +229,60,13.33,0.0,100.0,0.0,36.52,0.0,100.0,1.6943,0.0,9.004,0.0,0.0,0.0,-0.1449,-1.0,1.0,13656.08 +230,60,14.31,0.0,100.0,0.0,33.94,0.0,100.0,1.6101,0.0,10.0,0.0,0.0,0.0,-0.0842,-1.0,1.0,13703.84 +231,60,16.78,0.0,100.0,0.0,34.73,0.0,100.0,1.5571,0.0,10.0,0.0,0.0,0.0,-0.0306,-1.0,1.0,13738.07 +232,59,24.41,0.0,100.0,0.0,41.54,0.0,100.0,1.617,0.0,10.0,0.0,0.0,0.0,0.0568,-1.0,1.0,13803.68 +233,59,27.8,0.0,100.0,0.0,43.51,0.0,100.0,1.706,0.0,10.0,0.0,0.0,0.0,0.1069,-1.0,1.0,13860.78 +234,60,25.11,0.0,100.0,0.0,43.47,0.0,100.0,1.7208,0.0,10.0,0.0,0.0,0.0,0.0365,-1.0,1.0,13934.16 +235,60,17.89,0.0,100.0,0.0,39.35,0.0,100.0,1.6287,0.0,9.0,0.0,-0.0,-0.0,-0.0922,-1.0,1.0,13993.82 +236,60,18.33,0.0,100.0,0.0,38.67,0.0,100.0,1.5894,0.0,8.0,0.0,0.0,0.0,-0.0393,-1.0,1.0,14036.56 +237,60,20.0,0.0,100.0,0.0,37.78,0.0,100.0,1.5747,-0.5602,8.56,0.0,-0.0,-0.0,-0.0147,-1.0,1.0,14098.29 +238,60,31.11,0.0,100.0,0.0,46.98,0.0,100.0,1.7228,-0.5602,9.56,0.0,0.0,0.0,0.1481,-1.0,1.0,14190.47 +239,60,34.17,0.0,100.0,0.0,48.31,0.0,100.0,1.9044,-0.5602,10.0,0.0,0.0,0.0,0.1917,-1.0,1.0,14255.06 +240,60,40.28,0.0,100.0,0.0,50.88,0.0,100.0,2.1385,-0.5602,10.0,0.0,0.0,0.0,0.2791,-1.0,1.0,14313.46 +241,60,46.39,0.0,100.0,0.0,57.52,0.0,100.0,2.408,-0.5602,10.0,0.0,0.0,0.0,0.3266,-1.0,1.0,14372.35 +242,60,40.56,0.0,100.0,0.0,58.31,0.0,100.0,2.5942,-0.5602,10.0,0.0,0.0,0.0,0.2114,-1.0,1.0,14413.0 +243,60,44.17,0.0,100.0,0.0,66.32,0.0,100.0,2.8018,-0.5602,10.0,0.0,0.0,0.0,0.2147,-1.0,1.0,14463.51 +244,60,41.94,0.0,100.0,0.0,66.56,0.0,100.0,2.9505,-0.5602,10.0,0.0,-0.0,-0.0,0.1654,-1.0,1.0,14538.96 +245,60,43.06,0.0,100.0,0.0,67.71,0.0,100.0,3.1284,-0.5602,9.0,0.0,0.0,0.0,0.1779,-1.0,1.0,14601.95 +246,60,45.0,0.0,100.0,0.0,66.7,0.0,100.0,3.3489,-0.5602,9.3131,0.0,0.0,0.0,0.2205,-1.0,1.0,14660.11 +247,60,46.67,0.0,100.0,0.0,66.36,0.0,100.0,3.5879,-0.5602,10.0,0.0,0.0,0.0,0.2497,-1.0,1.0,14714.09 +248,60,36.67,0.0,100.0,0.0,62.29,0.0,100.0,3.6284,-0.5602,10.0,0.0,0.0,0.0,0.0614,-1.0,1.0,14798.07 +249,60,37.5,0.0,100.0,0.0,60.6,0.0,100.0,3.7206,-0.5602,10.0,0.0,0.0,0.0,0.1238,-1.0,1.0,14853.7 +250,60,34.17,0.0,100.0,0.0,60.26,0.0,100.0,3.7281,-0.5602,10.0,0.0,0.0,0.0,0.0632,-1.0,1.0,14887.17 +251,60,25.83,0.0,100.0,0.0,60.3,0.0,100.0,3.5965,-0.5602,10.0,0.0,0.0,0.0,-0.115,-1.0,1.0,14942.14 +252,60,19.17,0.0,100.0,0.0,59.36,0.0,100.0,3.3628,-0.5602,10.0,0.0,0.0,0.0,-0.2258,-1.0,1.0,15005.43 +253,60,13.33,0.0,100.0,0.0,55.12,0.0,100.0,3.0201,-0.5602,9.9836,0.0,-0.0,-0.0,-0.3427,-1.0,1.0,15070.57 +254,59,11.86,0.0,100.0,0.0,51.93,0.0,100.0,2.7306,-0.5602,10.0,0.0,0.0,0.0,-0.3231,-1.0,1.0,15141.93 +255,60,10.83,0.0,100.0,0.0,46.53,0.0,100.0,2.3918,-0.5602,9.3993,0.0,0.0,0.0,-0.2942,-1.0,1.0,15202.67 +256,60,14.17,0.0,100.0,0.0,43.68,0.0,100.0,2.1867,-0.5602,10.0,0.0,0.0,0.0,-0.1985,-1.0,1.0,15247.9 +257,60,21.11,0.0,100.0,0.0,46.35,0.0,100.0,2.0984,-0.5602,10.0,0.0,0.0,0.0,-0.0716,-1.0,1.0,15315.24 +258,59,27.97,0.0,100.0,0.0,47.73,0.0,100.0,2.0741,-0.2269,10.0,0.0,0.0,0.0,0.0426,-1.0,1.0,15383.9 +259,60,30.28,0.0,100.0,0.0,49.34,0.0,100.0,2.1742,0.0,10.0,0.0,0.0,0.0,0.0847,-1.0,1.0,15447.95 +260,60,33.61,0.0,100.0,0.0,51.6,0.0,100.0,2.2809,0.0001,10.0,0.0,0.0,0.0,0.1234,-1.0,1.0,15492.8 +261,60,33.89,0.0,100.0,0.0,53.22,0.0,100.0,2.3975,0.0,9.4026,0.0,0.0,0.0,0.1165,-1.0,1.0,15554.94 +262,60,38.33,0.0,100.0,0.0,55.2,0.0,100.0,2.5926,0.0,10.0,0.0,0.0,0.0,0.2019,-1.0,1.0,15603.74 +263,60,39.17,0.0,100.0,0.0,56.54,0.0,100.0,2.7828,0.0,10.0,0.0,0.0,0.0,0.2028,-1.0,1.0,15648.91 +264,60,40.0,0.0,100.0,0.0,56.24,0.0,100.0,2.9656,0.0,10.0,0.0,0.0,0.0,0.2263,-1.0,1.0,15727.15 +265,60,40.83,0.0,100.0,0.0,55.43,0.0,100.0,3.1433,0.0,10.0,0.0,0.0,0.0,0.251,-1.0,1.0,15785.42 +266,60,43.33,0.0,100.0,0.0,57.66,0.0,100.0,3.3463,0.0,10.0,0.0,0.0,0.0,0.2803,-1.0,1.0,15845.21 +267,59,38.7,0.0,100.0,0.0,59.33,0.0,100.0,3.369,0.0,10.0,0.0,0.0,0.0,0.1599,-1.0,1.0,15918.55 +268,60,34.17,0.0,100.0,0.0,58.71,0.0,100.0,3.5126,0.0,10.0,0.0,-0.0,-0.0,0.0773,-1.0,1.0,15993.19 +269,60,28.33,0.0,100.0,0.0,56.35,0.0,100.0,3.4625,0.0,10.0,0.0,0.0,0.0,-0.0237,-1.0,1.0,16052.47 +270,60,28.75,0.0,100.0,0.0,58.77,0.0,100.0,3.3983,0.0,10.0,0.0,0.0,0.0,-0.0277,-1.0,1.0,16109.98 +271,60,24.58,0.0,100.0,0.0,59.65,0.0,100.0,3.2602,0.0,10.0,0.0,0.0,0.0,-0.1162,-1.0,1.0,16152.26 +272,60,23.47,0.0,100.0,0.0,59.94,0.0,100.0,3.0679,0.0,10.0,0.0,0.0,0.0,-0.1672,-1.0,1.0,16199.42 +273,60,20.14,0.0,100.0,0.0,57.07,0.0,100.0,2.8624,0.0,9.0,0.0,0.0,0.0,-0.2055,-1.0,1.0,16266.26 +274,60,20.39,0.0,100.0,0.0,53.89,0.0,100.0,2.6824,0.0,9.9382,0.0,0.0,0.0,-0.1801,-1.0,1.0,16340.54 +275,60,22.89,0.0,100.0,0.0,53.51,0.0,100.0,2.5344,0.0,10.0,0.0,0.0,0.0,-0.1147,-1.0,1.0,16382.09 +276,60,25.11,0.0,100.0,0.0,54.85,0.0,100.0,2.4191,0.0,10.0,0.0,0.0,0.0,-0.0819,-1.0,1.0,16435.91 +277,60,28.06,0.0,100.0,0.0,58.45,0.0,100.0,2.3576,0.0,9.0,0.0,0.0,0.0,-0.0615,-1.0,1.0,16526.6 +278,60,29.72,0.0,100.0,0.0,54.71,0.0,100.0,2.3639,0.0,9.1665,0.0,-0.0,-0.0,0.0063,-1.0,1.0,16587.39 +279,60,32.22,0.0,100.0,0.0,52.44,0.0,100.0,2.4483,0.0,10.0,0.0,0.0,0.0,0.0883,-1.0,1.0,16635.49 +280,59,36.16,0.0,100.0,0.0,55.91,0.0,100.0,2.5955,0.0,10.0,0.0,0.0,0.0,0.1471,-1.0,1.0,16685.14 +281,60,36.39,0.0,100.0,0.0,57.33,0.0,100.0,2.6599,0.0,10.0,0.0,0.0,0.0,0.127,-1.0,1.0,16738.69 +282,60,33.33,0.0,100.0,0.0,55.84,0.0,100.0,2.7351,0.0,10.0,0.0,0.0,0.0,0.0785,-1.0,1.0,16790.37 +283,60,33.47,0.0,100.0,0.0,54.24,0.0,100.0,2.825,0.0,10.0,0.0,0.0,0.0,0.1065,-1.0,1.0,16873.9 +284,60,36.25,0.0,100.0,0.0,55.21,0.0,100.0,2.9539,0.0,10.0,0.0,0.0,0.0,0.1558,-1.0,1.0,16921.22 +285,60,39.86,0.0,100.0,0.0,60.09,0.0,100.0,3.0665,0.0,10.0,0.0,0.0,0.0,0.1784,-1.0,1.0,16980.07 +286,60,32.64,0.0,100.0,0.0,59.54,0.0,100.0,3.0232,0.0,10.0,0.0,0.0,0.0,0.0156,-1.0,1.0,17043.1 +287,60,27.08,0.0,100.0,0.0,58.4,0.0,100.0,2.9557,0.0,9.3107,0.0,0.0,0.0,-0.0674,-1.0,1.0,17146.51 +288,60,30.42,0.0,100.0,0.0,57.07,0.0,100.0,2.9644,0.0,10.0,0.0,0.0,0.0,0.0147,-1.0,1.0,17194.11 +289,60,33.06,0.0,100.0,0.0,57.01,0.0,100.0,2.9774,0.0,10.0,0.0,0.0,0.0,0.0709,-1.0,1.0,17247.93 +290,60,28.06,0.0,100.0,0.0,54.25,0.0,100.0,2.8919,0.0,10.0,0.0,0.0,0.0,-0.0355,-1.0,1.0,17291.17 +291,60,24.44,0.0,100.0,0.0,53.51,0.0,100.0,2.8205,0.0,9.0441,0.0,0.0,0.0,-0.0714,-1.0,1.0,17339.71 +292,60,30.83,0.0,100.0,0.0,58.78,0.01,100.0,2.8208,0.0007,9.1126,0.0,0.0,0.0,0.0003,-1.0,1.0,17400.41 +293,60,31.25,0.0,100.0,0.0,57.15,0.01,100.0,2.8412,0.0005,10.0,0.0,0.0,0.0,0.0223,-1.0,1.0,17486.58 +294,60,35.97,0.0,100.0,0.0,59.45,0.21,100.0,2.9175,0.0104,10.0,0.0,-0.0,-0.0,0.1073,-1.0,1.0,17518.91 +295,60,35.14,0.0,100.0,0.0,64.3,0.17,100.0,2.9385,0.0083,10.0,0.0,-0.0,-0.0,0.0377,-1.0,1.0,17576.81 +296,60,28.39,0.0,100.0,0.0,58.69,0.13,100.0,2.8536,0.0067,9.56,0.0,-0.0,-0.0,-0.0849,-1.0,1.0,17657.88 +297,60,26.72,0.0,100.0,0.0,56.79,0.11,100.0,2.7795,0.0053,10.0,0.0,0.0,0.0,-0.0621,-1.0,1.0,17720.88 +298,60,29.31,0.0,100.0,0.0,54.6,0.09,100.0,2.7582,0.0043,10.0,0.0,0.0,0.0,0.0121,-1.0,1.0,17774.63 +299,60,28.19,0.0,100.0,0.0,51.49,0.07,100.0,2.7416,0.0034,10.0,0.0,0.0,0.0,0.0151,-1.0,1.0,17839.17 +300,60,27.08,0.0,100.0,0.0,49.6,0.05,100.0,2.7464,0.0027,10.0,0.0,0.0,0.0,0.0121,-1.0,1.0,17890.32 +301,60,32.92,0.0,100.0,0.0,51.28,0.04,100.0,2.8243,0.0022,10.0,0.0,0.0,0.0,0.1209,-1.0,1.0,17936.82 +302,60,29.44,0.0,100.0,0.0,54.02,0.0,100.0,2.8365,-0.2911,10.0,0.0,0.0,0.0,0.0297,-1.0,1.0,18015.52 +303,59,31.07,0.0,100.0,0.0,55.38,0.0,100.0,2.8683,-0.2911,10.0,0.0,-0.0,-0.0,0.0502,-1.0,1.0,18082.93 +304,59,27.97,0.0,100.0,0.0,54.3,0.0,100.0,2.8189,-0.2911,10.0,0.0,0.0,0.0,-0.0391,-1.0,1.0,18124.78 +305,59,23.16,0.0,100.0,0.0,53.88,0.02,100.0,2.5505,0.0009,9.0,0.0,0.0,0.0,-0.1027,-1.0,1.0,18173.87 +306,59,27.4,0.0,100.0,0.0,55.08,0.01,100.0,2.5936,0.0007,9.0,0.0,0.0,0.0,-0.0246,-1.0,1.0,18246.13 +307,60,29.44,0.0,100.0,0.0,56.48,0.01,100.0,2.6462,0.0006,9.4123,0.0,0.0,0.0,-0.0042,-1.0,1.0,18332.02 +308,59,30.23,0.0,100.0,0.0,54.34,0.01,100.0,2.712,0.0005,10.0,0.0,0.0,0.0,0.0314,-1.0,1.0,18376.76 +309,59,35.31,0.0,100.0,0.0,57.04,0.01,100.0,2.7768,0.0004,10.0,0.0,0.0,0.0,0.1157,-1.0,1.0,18431.99 +310,59,41.24,0.0,100.0,0.0,61.62,0.01,100.0,2.9487,0.0003,10.0,0.0,0.0,0.0,0.1904,-1.0,1.0,18488.71 +311,60,37.92,0.0,100.0,0.0,59.05,0.0,100.0,3.0243,0.0002,10.0,0.0,0.0,0.0,0.1445,-1.0,1.0,18539.59 +312,60,32.64,0.0,100.0,0.0,58.02,0.0,100.0,3.0555,0.0002,10.0,0.0,0.0,0.0,0.046,-1.0,1.0,18614.93 +313,60,31.81,0.0,100.0,0.0,56.15,0.0,100.0,3.0726,0.0002,10.0,0.0,0.0,0.0,0.0443,-1.0,1.0,18656.76 +314,59,29.8,0.0,100.0,0.0,53.57,0.0,100.0,3.1149,0.0001,10.0,0.0,0.0,0.0,0.0253,-1.0,1.0,18707.42 +315,60,31.81,0.0,100.0,0.0,57.3,0.0,100.0,3.0938,0.0001,10.0,0.0,0.0,0.0,0.0428,-1.0,1.0,18811.62 +316,60,32.92,0.0,100.0,0.0,56.46,0.0,100.0,3.124,0.0001,10.0,0.0,0.0,0.0,0.0645,-1.0,1.0,18862.15 +317,60,30.97,0.0,100.0,0.0,56.48,0.0,100.0,3.1465,0.0001,10.0,0.0,0.0,0.0,0.0318,-1.0,1.0,18938.6 +318,60,32.78,0.0,100.0,0.0,56.52,0.0,100.0,3.1738,0.0,10.0,0.0,0.0,0.0,0.0668,-1.0,1.0,18991.95 +319,56,36.01,0.0,100.0,0.0,62.83,0.05,100.0,3.3584,0.0027,10.0,0.0,0.0,0.0,0.0842,-1.0,1.0,19041.91 +320,60,34.44,0.0,100.0,0.0,61.07,0.0,100.0,3.2489,0.0001,10.0,0.0,0.0,0.0,0.0632,-1.0,1.0,19089.26 +321,59,29.94,0.0,100.0,0.0,63.44,0.0,100.0,3.2137,0.0,10.0,0.0,0.0,0.0,-0.0536,-1.0,1.0,19151.91 +322,60,31.94,0.0,100.0,0.0,61.09,0.0,100.0,3.1604,0.0,10.0,0.0,0.0,0.0,-0.0016,-1.0,1.0,19220.71 +323,60,31.67,0.0,100.0,0.0,59.08,0.0,100.0,3.1573,0.0,10.0,0.0,-0.0,-0.0,0.0144,-1.0,1.0,19260.58 +324,55,39.09,0.0,100.0,0.0,61.05,0.0,100.0,3.2675,0.0,10.0,0.0,0.0,0.0,0.1443,-1.0,1.0,19325.62 +325,54,33.33,0.0,100.0,0.0,60.53,0.0,100.0,3.2031,0.0,10.0,0.0,0.0,0.0,0.0316,-1.0,1.0,19387.25 +326,60,35.83,0.0,100.0,0.0,63.17,0.0,100.0,3.3051,0.0,10.0,0.0,-0.0,-0.0,0.0605,-1.0,1.0,19453.66 +327,60,33.33,0.0,100.0,0.0,59.2,0.0,100.0,3.3267,-0.2582,10.0,0.0,0.0,0.0,0.035,-1.0,1.0,19521.66 +328,60,32.5,0.0,100.0,0.0,57.14,0.0,100.0,3.3518,-0.2582,10.0,0.0,0.0,0.0,0.0497,-1.0,1.0,19578.39 +329,60,30.83,0.0,100.0,0.0,54.26,0.0,100.0,3.3155,-0.2582,10.0,0.0,0.0,0.0,0.0304,-1.0,1.0,19626.0 +330,60,24.44,0.0,100.0,0.0,50.1,0.0,100.0,3.2172,-0.2582,10.0,0.0,0.0,0.0,-0.0543,-1.0,1.0,19686.53 +331,60,21.94,0.0,100.0,0.0,49.38,0.0,100.0,3.1181,-0.2582,10.0,0.0,0.0,0.0,-0.0824,-1.0,1.0,19751.05 +332,60,22.5,0.0,100.0,0.0,47.89,0.0,100.0,3.0613,-0.2582,10.0,0.0,0.0,0.0,-0.0559,-1.0,1.0,19817.2 +333,60,23.33,0.0,100.0,0.0,45.05,0.0,100.0,3.0106,-0.2582,10.0,0.0,0.0,0.0,-0.0131,-1.0,1.0,19874.07 +334,60,17.22,0.0,100.0,0.0,43.65,0.0,100.0,2.8625,-0.2582,10.0,0.0,0.0,0.0,-0.1094,-1.0,1.0,19933.88 +335,60,12.22,0.0,100.0,0.0,41.4,0.0,100.0,2.649,-0.2582,10.0,0.0,0.0,0.0,-0.1926,-1.0,1.0,19996.17 +336,60,8.89,0.0,100.0,0.0,38.34,0.0,100.0,2.4128,-0.2582,9.4934,0.0,0.0,0.0,-0.2362,-1.0,1.0,20069.16 +337,60,8.89,0.0,100.0,0.0,35.21,0.0,100.0,2.1988,-0.2582,10.0,0.0,0.0,0.0,-0.2058,-1.0,1.0,20167.78 +338,60,8.89,0.0,100.0,0.0,32.67,0.0,100.0,2.0073,-0.2582,10.0,0.0,0.0,0.0,-0.1749,-1.0,1.0,20221.78 +339,60,7.22,0.0,100.0,0.0,29.63,0.0,100.0,1.8119,-0.2582,10.0,0.0,0.0,0.0,-0.1832,-1.0,1.0,20274.02 +340,60,5.56,0.0,100.0,0.0,26.19,0.0,100.0,1.592,-0.2582,10.0,0.0,0.0,0.0,-0.1865,-1.0,1.0,20351.49 +341,60,2.22,0.0,100.0,0.0,22.78,0.0,100.0,1.3562,-0.2582,10.0,0.0,0.0,0.0,-0.2192,-1.0,1.0,20412.2 +342,60,0.83,0.0,50.0,0.0,20.6,0.0,100.0,1.1422,-0.2582,9.0,0.0,0.0,0.0,-0.214,-1.0,0.1749,20465.43 +343,60,0.0,0.0,0.0,0.0,16.88,0.0,100.0,0.9362,-0.3443,8.0,0.0,0.0,0.0,-0.206,-1.0,0.0,20541.69 +344,60,0.0,0.0,0.0,0.0,14.55,0.0,100.0,0.7674,-0.3443,7.0,0.0,0.0,0.0,-0.1688,-1.0,0.0,20575.98 +345,60,0.0,0.0,0.0,0.0,12.31,0.0,100.0,0.6219,-0.3443,6.0,0.0,0.0,0.0,-0.1455,-1.0,0.0,20664.95 +346,60,0.0,0.0,0.0,0.0,10.18,0.0,100.0,0.4988,-0.3443,5.0,0.0,0.0,0.0,-0.1231,-1.0,0.0,20718.66 +347,60,0.0,0.0,0.0,0.0,8.14,0.0,80.0,0.3971,-0.3443,4.0,0.0,0.0,0.0,-0.1018,-1.0,0.0,20768.94 +348,60,0.0,0.0,0.0,0.0,6.51,0.0,64.0,0.3156,-0.3443,3.2,0.0,0.0,0.0,-0.0814,-0.8,0.0,20824.43 +349,60,0.0,0.0,0.0,0.0,5.21,0.0,51.2,0.2505,-0.3443,2.56,0.0,0.0,0.0,-0.0651,-0.64,0.0,20902.36 +350,60,0.0,0.0,0.0,0.0,4.17,0.0,40.96,0.1984,-0.3443,2.048,0.0,0.0,0.0,-0.0521,-0.512,0.0,20943.38 +351,60,0.0,0.0,0.0,0.0,3.34,0.0,32.77,0.1567,-0.3443,1.6384,0.0,0.0,0.0,-0.0417,-0.4096,0.0,21014.02 +352,60,0.0,0.0,0.0,0.0,2.67,0.0,26.21,0.1234,-0.3443,1.3107,0.0,0.0,0.0,-0.0334,-0.3277,0.0,21100.51 +353,60,0.0,0.0,0.0,0.0,2.13,0.0,20.97,0.0967,-0.3443,1.0486,0.0,0.0,0.0,-0.0267,-0.2621,0.0,21155.82 +354,60,0.0,0.0,0.0,0.0,1.71,0.0,16.78,0.0753,-0.3443,0.8389,0.0,0.0,0.0,-0.0213,-0.2097,0.0,21200.26 +355,60,0.0,0.0,0.0,0.0,1.37,0.0,13.42,0.0583,-0.3443,0.6711,0.0,0.0,0.0,-0.0171,-0.1678,0.0,21252.45 +356,60,0.0,0.0,0.0,0.0,1.09,0.0,10.74,0.0446,-0.3443,0.5369,0.0,0.0,0.0,-0.0137,-0.1342,0.0,21314.55 +357,59,0.0,0.0,0.0,0.0,0.86,0.0,8.59,0.033,-0.3443,0.4295,0.0,0.0,0.0,-0.0108,-0.1074,0.0,21388.3 +358,60,0.56,0.0,33.33,0.0,1.37,0.0,40.04,0.0307,-0.3443,0.3436,0.0,0.0,0.0,-0.0032,-0.0859,0.3331,21453.12 +359,59,0.42,0.0,25.0,0.0,1.26,0.0,40.7,0.0231,-0.3443,0.2845,0.0,0.0,0.0,-0.008,-0.0687,0.0,21517.8 +360,60,0.6,0.0,25.0,0.0,1.34,0.0,39.76,0.0182,-0.3443,0.2292,0.0,0.0,0.0,-0.0047,-0.0552,0.1097,21569.8 +361,60,0.74,0.0,33.33,0.0,1.48,0.0,52.54,0.0147,-0.3443,0.2975,0.0,0.0,0.0,-0.0035,-0.044,0.0683,21625.75 +362,60,0.76,0.0,33.33,0.0,1.5,0.0,56.46,0.0107,-0.3443,0.2806,0.0,0.0,0.0,-0.0039,-0.0352,0.0,21666.67 +363,60,0.76,0.0,33.33,0.0,1.45,0.0,56.9,0.0068,-0.3443,0.2375,0.0,0.0,0.0,-0.0039,-0.043,0.0,21712.02 +364,60,0.76,0.0,33.33,0.0,1.38,0.0,56.13,0.0035,-0.3443,0.1915,0.0,0.0,0.0,-0.0034,-0.046,0.0,21789.58 +365,60,0.79,0.0,33.33,0.0,1.37,0.0,55.06,0.0011,-0.3443,0.1506,0.0,0.0,0.0,-0.0024,-0.0409,0.0066,21860.21 +366,60,0.89,0.0,33.33,0.0,1.46,0.0,54.02,-0.0,-0.3443,0.1304,0.0,0.0,0.0,-0.0011,-0.0337,0.0556,21912.93 +367,60,0.97,0.0,33.33,0.0,1.57,0.0,53.14,-0.0008,-0.3443,0.1838,0.0,0.0,0.0,-0.0007,-0.0268,0.0534,21960.87 +368,60,0.56,0.0,33.33,0.0,0.92,0.0,50.72,-0.0089,-0.4413,0.2822,0.0,0.0,0.0,-0.0082,-0.5314,0.0985,22033.09 +369,60,0.56,0.0,33.33,0.0,0.99,0.0,55.79,-0.0098,-0.4413,0.2774,0.0,0.0,0.0,-0.0008,-0.0074,0.0,22087.83 +370,59,0.0,0.0,0.0,0.0,0.05,0.0,0.47,-0.0152,-0.4413,0.0236,0.0,0.0,0.0,-0.0006,-0.0059,0.0,22154.54 +371,59,0.0,0.0,0.0,0.0,0.04,0.0,0.38,-0.0205,-0.4413,0.0189,0.0,-0.0,-0.0,-0.0099,-0.5579,0.0,22220.43 +372,60,0.28,0.0,16.67,0.0,0.36,0.0,20.0,-0.0178,-0.4413,0.1667,0.0,0.0,0.0,0.0024,-0.0038,0.1667,22272.85 +373,60,0.28,0.0,16.67,0.0,0.41,0.0,23.33,-0.0181,-0.4413,0.1667,0.0,0.0,0.0,-0.0003,-0.003,0.0,22346.6 +374,60,0.56,0.0,33.33,0.0,0.82,0.0,48.0,-0.0153,-0.4413,0.3445,0.0,0.0,0.0,0.0027,-0.0024,0.1778,22407.73 +375,60,0.56,0.0,33.33,0.0,0.96,0.0,56.49,-0.0153,-0.4413,0.3578,0.0,0.0,0.0,0.0,-0.0019,0.0133,22464.86 +376,60,0.56,0.0,33.33,0.0,0.99,0.0,58.45,-0.0162,-0.4413,0.3145,0.0,0.0,0.0,-0.0009,-0.0433,0.0,22521.51 +377,60,1.11,0.0,33.33,0.0,1.64,0.0,57.98,-0.0117,-0.4413,0.3334,0.0,0.0,0.0,0.0045,-0.0564,0.3333,22576.14 +378,60,1.11,0.0,33.33,0.0,1.87,0.0,56.76,-0.0116,-0.4413,0.4,0.0,0.0,0.0,0.0001,-0.0532,0.0667,22653.99 +379,60,1.94,0.0,50.0,0.0,2.91,0.0,60.02,-0.0046,-0.4413,0.5007,0.0,0.0,0.0,0.007,-0.0451,0.4999,22707.38 +380,60,1.81,0.0,50.0,0.0,3.2,0.0,94.02,-0.0051,-0.4413,0.7006,0.0,0.0,0.0,-0.0005,-0.1659,0.1999,22779.77 +381,60,1.81,0.0,50.0,0.0,3.2,0.0,100.0,-0.0063,-0.4413,0.7305,0.0,0.0,0.0,-0.0012,-0.0611,0.0299,22832.97 +382,58,1.44,0.0,50.0,0.0,2.7,0.0,100.0,-0.0134,-0.4413,0.7305,0.0,0.0,0.0,-0.0068,-0.3375,0.0,22882.59 +383,59,1.41,0.0,50.0,0.0,2.63,0.0,100.0,-0.0139,-0.4413,0.7305,0.0,0.0,0.0,-0.0008,-0.0438,0.0,22939.08 +384,59,1.69,0.0,50.0,0.0,3.14,0.0,100.0,-0.0101,-0.4413,0.7305,0.0,0.0,0.0,0.0038,-0.0003,0.224,22996.8 +385,60,2.71,0.0,100.0,0.0,3.59,0.0,100.0,0.0088,-0.4413,1.3749,0.0,0.0,0.0,0.0187,-0.0002,1.0,23077.52 +386,60,2.74,0.0,100.0,0.0,3.65,0.0,100.0,0.0257,-0.4413,2.3749,0.0,0.0,0.0,0.0169,-0.0002,1.0,23135.84 +387,60,1.9,0.0,100.0,0.0,2.45,0.0,100.0,0.0253,-0.4413,1.7305,0.0,0.0,0.0,-0.0004,-1.0,1.0,23191.12 +388,60,1.9,0.0,100.0,0.0,2.35,0.0,100.0,0.037,-0.4413,2.7305,0.0,0.0,0.0,0.0117,-0.275,1.0,23246.06 +389,60,0.24,0.0,14.29,0.0,1.18,0.0,34.61,0.0163,-0.4413,1.7305,0.0,0.0,0.0,-0.0207,-1.0,0.0,23293.03 +390,60,0.24,0.0,14.29,0.0,1.0,0.0,27.69,0.0073,-0.4413,1.3844,0.0,0.0,0.0,-0.009,-0.3461,0.0,23342.05 +391,60,0.24,0.0,14.29,0.0,0.85,0.0,22.15,0.0002,-0.4413,1.1075,0.0,0.0,0.0,-0.0072,-0.2769,0.0,23410.53 +392,60,0.24,0.0,14.29,0.0,0.74,0.0,17.72,-0.0056,-0.4413,0.886,0.0,0.0,0.0,-0.0057,-0.2215,0.0,23471.95 +393,60,0.24,0.0,14.29,0.0,0.65,0.0,17.38,-0.0102,-0.4413,0.7088,0.0,0.0,0.0,-0.0046,-0.1772,0.0,23548.85 +394,60,1.11,0.0,50.0,0.0,1.74,0.0,67.54,-0.0041,-0.4413,0.5671,0.0,0.0,0.0,0.0061,-0.1418,0.4131,23592.58 +395,60,0.28,0.0,16.67,0.0,0.62,0.0,23.33,-0.0182,-0.4413,0.4536,0.0,0.0,0.0,-0.0141,-0.6754,0.0,23652.43 +396,60,0.28,0.0,16.67,0.0,0.57,0.0,23.33,-0.0209,-0.4413,0.3629,0.0,0.0,0.0,-0.0027,-0.0907,0.0,23709.92 +397,60,0.28,0.0,16.67,0.0,0.53,0.0,22.78,-0.0232,-0.4413,0.2903,0.0,0.0,0.0,-0.0023,-0.0726,0.0,23783.09 +398,60,0.61,0.0,20.0,0.0,0.89,0.0,24.0,-0.0217,-0.4413,0.2323,0.0,0.0,0.0,0.0015,-0.0581,0.2,23836.63 +399,60,0.69,0.0,25.0,0.0,1.06,0.0,36.4,-0.022,-0.4413,0.27,0.0,0.0,0.0,-0.0003,-0.0465,0.07,23889.9 +400,60,0.75,0.0,25.0,0.0,1.16,0.0,39.04,-0.0229,-0.4413,0.247,0.0,0.0,0.0,-0.0009,-0.0372,0.0259,23962.44 +401,60,0.83,0.0,25.0,0.0,1.28,0.0,38.84,-0.0235,-0.4413,0.2042,0.0,0.0,0.0,-0.0006,-0.0428,0.0531,24032.44 +402,60,0.83,0.0,25.0,0.0,1.29,0.0,37.97,-0.0249,-0.4413,0.1629,0.0,0.0,0.0,-0.0014,-0.0413,0.0,24087.71 +403,60,1.53,0.0,33.33,0.0,2.16,0.0,50.85,-0.0189,-0.4413,0.3333,0.0,0.0,0.0,0.006,-0.0232,0.3333,24139.5 +404,60,1.25,0.0,50.0,0.0,2.13,0.0,85.2,-0.0221,-0.4413,0.4888,0.0,0.0,0.0,-0.0032,-0.3643,0.2457,24205.3 +405,60,3.46,0.0,100.0,0.0,3.99,0.0,100.0,0.0077,-0.4413,1.4888,0.0,0.0,0.0,0.0298,-0.0122,1.0,24262.71 +406,60,4.38,0.0,100.0,0.0,5.38,0.0,100.0,0.0334,-0.4413,2.4888,0.0,0.0,0.0,0.0257,-0.1535,1.0,24315.92 +407,60,4.04,0.0,100.0,0.0,5.21,0.0,100.0,0.0446,-0.4413,3.4888,0.0,0.0,0.0,0.0112,-0.12,1.0,24360.62 +408,59,2.36,0.0,25.0,0.0,4.25,0.0,49.78,0.0236,-0.4413,2.4888,0.0,0.0,0.0,-0.0218,-1.0,0.0,24427.92 +409,60,2.77,0.0,40.0,0.0,4.57,0.0,56.6,0.0172,-0.4413,1.9911,0.0,0.0,0.0,-0.0061,-0.4978,0.2633,24482.42 +410,60,2.53,0.0,40.0,0.0,4.28,0.0,71.34,0.0065,-0.4413,1.5928,0.0,0.0,0.0,-0.0107,-0.3982,0.0604,24575.01 +411,60,2.59,0.0,50.0,0.0,4.31,0.0,97.23,0.0003,-0.4413,1.2743,0.0,0.0,0.0,-0.0062,-0.3186,0.1433,24633.24 +412,60,2.63,0.0,50.0,0.0,4.25,0.0,100.0,-0.0042,-0.4413,1.0194,0.0,0.0,0.0,-0.0045,-0.2549,0.0191,24683.17 +413,59,2.45,0.0,50.0,0.0,3.98,0.0,100.0,-0.011,-0.4413,0.8155,0.0,0.0,0.0,-0.0068,-0.245,0.0837,24744.32 +414,59,3.32,0.0,50.0,0.0,5.01,0.0,100.0,-0.0052,-0.4413,0.6524,0.0,0.0,0.0,0.0058,-0.1631,0.5,24800.9 +415,60,3.35,0.0,50.0,0.0,5.51,0.0,100.0,-0.0057,-0.4413,0.7,0.0,0.0,0.0,-0.0006,-0.2696,0.5,24846.33 +416,60,2.41,0.0,50.0,0.0,4.83,0.0,100.0,-0.0181,-0.4413,0.7,0.0,0.0,0.0,-0.0123,-0.3583,0.2,24913.65 +417,60,2.43,0.0,50.0,0.0,4.76,0.0,100.0,-0.0215,-0.4413,0.73,0.0,0.0,0.0,-0.0035,-0.152,0.03,24992.29 +418,60,3.26,0.0,100.0,0.0,4.65,0.0,100.0,-0.0077,-0.4413,1.592,0.0,0.0,0.0,0.0138,-0.0846,1.0,25049.38 +419,60,1.67,0.0,50.0,0.0,3.21,0.0,100.0,-0.0256,-0.4413,0.73,0.0,0.0,0.0,-0.0179,-1.0,0.0312,25115.63 +420,60,1.81,0.0,50.0,0.0,3.35,0.0,100.0,-0.0274,-0.4413,0.73,0.0,0.0,0.0,-0.0018,-0.1184,0.0872,25157.3 +421,60,2.22,0.0,50.0,0.0,4.01,0.0,100.0,-0.0245,-0.4413,0.73,0.0,0.0,0.0,0.0029,-0.0947,0.3274,25179.02 +422,60,3.06,0.0,100.0,0.0,4.33,0.0,100.0,-0.0098,-0.4413,1.5309,0.0,0.0,0.0,0.0147,-0.0758,0.9997,25207.89 +423,59,3.39,0.0,100.0,0.0,4.89,0.0,100.0,0.0097,-0.4413,2.5306,0.0,0.0,0.0,0.0196,-0.0606,0.9997,25220.98 +424,60,3.33,0.0,100.0,0.0,3.42,0.0,100.0,0.0281,-0.5275,3.5303,0.0,0.0,0.0,0.0186,-0.8166,1.0,25244.22 +425,60,0.0,0.0,0.0,0.0,1.16,0.0,50.57,-0.0061,-0.5275,2.53,0.0,0.0,0.0,-0.0342,-1.0003,0.0,25254.9 +426,1,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,25260.24 diff --git a/experiments/results/csv/slow_query_adaptive_time_analysis.csv b/experiments/results/csv/slow_query_adaptive_time_analysis.csv new file mode 100644 index 000000000..2cad72f48 --- /dev/null +++ b/experiments/results/csv/slow_query_adaptive_time_analysis.csv @@ -0,0 +1,15 @@ +Time Range,Total Requests,Success,Errors,Error %,Rejected,Rejected %,Target Error Rate % +0-30s,7664,7334,108,1.41,222,2.9,1.0 +30-60s,5848,5473,123,2.1,252,4.31,1.0 +60-90s,5540,5126,105,1.9,309,5.58,1.0 +90-120s,5692,5148,136,2.39,408,7.17,1.0 +120-150s,5509,4923,134,2.43,452,8.2,1.0 +150-180s,5005,4539,119,2.38,347,6.93,1.0 +180-210s,5029,4419,132,2.62,478,9.5,1.0 +210-240s,5119,4600,113,2.21,406,7.93,1.0 +240-270s,5777,5152,118,2.04,507,8.78,1.0 +270-300s,5416,4860,123,2.27,433,7.99,1.0 +300-330s,5569,4940,128,2.3,501,9.0,1.0 +330-360s,6399,5936,111,1.73,352,5.5,1.0 +360-390s,7302,6948,104,1.42,250,3.42,1.0 +390-420s,7027,6734,105,1.49,188,2.68,1.0 diff --git a/experiments/results/csv/slow_query_time_analysis.csv b/experiments/results/csv/slow_query_time_analysis.csv new file mode 100644 index 000000000..21bc805c9 --- /dev/null +++ b/experiments/results/csv/slow_query_time_analysis.csv @@ -0,0 +1,15 @@ +Time Range,Total Requests,Success,Errors,Error %,Rejected,Rejected %,Target Error Rate % +0-30s,8481,8080,194,2.29,207,2.44,1.0 +30-60s,8058,7474,231,2.87,353,4.38,1.0 +60-90s,8243,7608,164,1.99,471,5.71,1.0 +90-120s,8400,7661,196,2.33,543,6.46,1.0 +120-150s,8913,8042,180,2.02,691,7.75,1.0 +150-180s,8841,8005,168,1.9,668,7.56,1.0 +180-210s,8951,8017,178,1.99,756,8.45,1.0 +210-240s,8535,7696,197,2.31,642,7.52,1.0 +240-270s,8731,7874,190,2.18,667,7.64,1.0 +270-300s,8797,7863,178,2.02,756,8.59,1.0 +300-330s,8925,8050,162,1.82,713,7.99,1.0 +330-360s,8053,7712,102,1.27,239,2.97,1.0 +360-390s,8142,7531,213,2.62,398,4.89,1.0 +390-420s,8373,7794,190,2.27,389,4.65,1.0 diff --git a/experiments/results/csv/sudden_error_spike_100_adaptive_pid_controller.csv b/experiments/results/csv/sudden_error_spike_100_adaptive_pid_controller.csv new file mode 100644 index 000000000..60e434a2b --- /dev/null +++ b/experiments/results/csv/sudden_error_spike_100_adaptive_pid_controller.csv @@ -0,0 +1,141 @@ +Window,Thread Count,Error Rate Avg,Error Rate Min,Error Rate Max,Ideal Error Rate,Rejection Rate Avg,Rejection Rate Min,Rejection Rate Max,Integral Avg,Integral Min,Integral Max,Derivative Avg,Derivative Min,Derivative Max,P Value Avg,P Value Min,P Value Max,Total Request Time +1,60,0.95,0.0,22.22,4.61,0.74,0.0,20.67,-0.0369,-0.0461,0.1722,0.0,-0.0,-0.0,-0.0369,-0.0461,0.1722,104.89 +2,60,1.0,0.0,10.53,4.25,0.16,0.0,7.31,-0.0774,-0.0886,0.0322,0.0,0.0,0.0,-0.0405,-0.14,0.0094,165.33 +3,60,0.9,0.0,7.14,3.92,0.03,0.0,1.94,-0.1106,-0.1278,-0.0179,0.0,0.0,0.0,-0.0333,-0.0502,-0.005,225.66 +4,60,0.84,0.0,5.26,3.61,0.0,0.0,0.0,-0.1407,-0.1639,-0.0347,0.0,0.0,0.0,-0.03,-0.0361,0.0106,285.29 +5,60,0.92,0.0,4.26,3.33,0.0,0.0,0.0,-0.1674,-0.1972,-0.0416,0.0,0.0,0.0,-0.0267,-0.0333,-0.0003,345.41 +6,60,0.88,0.0,3.51,3.07,0.0,0.0,0.0,-0.1923,-0.228,-0.0536,0.0,0.0,0.0,-0.0249,-0.0307,-0.0005,405.33 +7,60,0.85,0.0,2.99,2.83,0.0,0.0,0.0,-0.2156,-0.2563,-0.0669,0.0,0.0,0.0,-0.0233,-0.0283,-0.0047,465.08 +8,60,0.94,0.0,3.9,2.61,0.0,0.0,0.0,-0.2362,-0.2824,-0.0827,0.0,0.0,0.0,-0.0206,-0.0261,0.0039,521.38 +9,60,0.98,0.0,3.49,2.41,0.0,0.0,0.0,-0.2549,-0.3065,-0.0891,0.0,0.0,0.0,-0.0187,-0.0241,0.0003,586.38 +10,60,0.95,0.0,3.16,2.22,0.0,0.0,0.0,-0.2723,-0.3287,-0.098,0.0,0.0,0.0,-0.0174,-0.0222,-0.0027,644.81 +11,60,0.92,0.0,3.13,2.05,0.0,0.0,0.0,-0.2887,-0.3491,-0.1068,0.0,0.0,0.0,-0.0164,-0.0386,0.0057,706.46 +12,60,0.89,0.0,4.12,1.89,0.0,0.0,0.0,-0.3041,-0.368,-0.1243,0.0,0.0,0.0,-0.0154,-0.0356,0.0054,764.62 +13,60,0.89,0.0,4.17,1.74,0.0,0.0,0.0,-0.3183,-0.3854,-0.1401,0.0,0.0,0.0,-0.0142,-0.0328,0.0057,825.44 +14,60,0.89,0.0,4.12,1.6,0.0,0.0,0.0,-0.3313,-0.4014,-0.1614,0.0,0.0,0.0,-0.013,-0.0303,0.0057,885.68 +15,60,0.85,0.0,4.12,1.48,0.0,0.0,0.0,-0.3436,-0.4162,-0.1582,0.0,0.0,0.0,-0.0123,-0.0293,0.0056,945.38 +16,60,0.85,0.0,4.12,1.36,0.0,0.0,0.0,-0.355,-0.4298,-0.1529,0.0,0.0,0.0,-0.0114,-0.027,0.0056,1004.48 +17,60,0.87,0.0,4.12,1.26,0.0,0.0,0.0,-0.3652,-0.4424,-0.1476,0.0,0.0,0.0,-0.0103,-0.0283,0.0156,1065.26 +18,60,0.79,0.0,3.19,1.16,0.0,0.0,0.0,-0.3754,-0.454,-0.152,0.0,0.0,0.0,-0.0101,-0.0273,0.0063,1125.88 +19,60,0.87,0.0,4.26,1.15,0.0,0.0,0.0,-0.384,-0.4647,-0.1554,0.0,0.0,0.0,-0.0086,-0.0252,0.0265,1185.4 +20,60,0.87,0.0,4.21,1.14,0.0,0.0,0.0,-0.3918,-0.4746,-0.1586,0.0,-0.0,-0.0,-0.0078,-0.0232,0.026,1244.85 +21,60,0.93,0.0,4.26,1.14,0.0,0.0,0.0,-0.3984,-0.4836,-0.181,0.0,0.0,0.0,-0.0066,-0.0224,0.0264,1305.42 +22,60,0.91,0.0,4.26,1.13,0.0,0.0,0.0,-0.4045,-0.492,-0.2115,0.0,0.0,0.0,-0.0062,-0.0306,0.0263,1364.7 +23,60,1.02,0.0,3.23,1.13,0.0,0.0,0.0,-0.4091,-0.4997,-0.2397,0.0,0.0,0.0,-0.0046,-0.0282,0.0157,1425.0 +24,60,1.08,0.0,3.23,1.12,0.0,0.0,0.0,-0.4126,-0.5069,-0.2555,0.0,0.0,0.0,-0.0035,-0.026,0.0153,1484.49 +25,60,1.04,0.0,3.23,1.12,0.0,0.0,0.0,-0.4159,-0.5134,-0.2449,0.0,0.0,0.0,-0.0034,-0.024,0.0156,1545.64 +26,60,0.97,0.0,3.23,1.12,0.0,0.0,0.0,-0.4195,-0.5195,-0.2293,0.0,-0.0,-0.0,-0.0036,-0.0221,0.022,1603.91 +27,60,0.97,0.0,3.23,1.11,0.0,0.0,0.0,-0.4226,-0.5251,-0.2138,0.0,0.0,0.0,-0.0031,-0.0204,0.0238,1665.0 +28,60,0.97,0.0,4.26,1.11,0.0,0.0,0.0,-0.4252,-0.5302,-0.2089,0.0,-0.0,-0.0,-0.0026,-0.017,0.0335,1725.45 +29,60,1.05,0.0,4.12,1.02,0.0,0.0,0.0,-0.4267,-0.5349,-0.2145,0.0,-0.0,-0.0,-0.0015,-0.0157,0.0326,1784.85 +30,60,1.07,0.0,4.08,0.94,0.0,0.0,0.0,-0.4276,-0.5393,-0.2196,0.0,0.0,0.0,-0.0009,-0.0145,0.0321,1844.2 +31,60,0.98,0.0,4.04,0.87,0.0,0.0,0.0,-0.4291,-0.5434,-0.2244,0.0,0.0,0.0,-0.0015,-0.0138,0.0317,1905.5 +32,60,1.05,0.0,4.08,0.8,0.0,0.0,0.0,-0.4295,-0.5471,-0.2287,0.0,0.0,0.0,-0.0004,-0.0152,0.032,1965.05 +33,60,1.0,0.0,5.1,0.8,0.0,0.0,0.0,-0.4302,-0.5505,-0.2327,0.0,0.0,0.0,-0.0006,-0.0162,0.0335,2024.59 +34,60,0.87,0.0,4.04,0.8,0.0,0.0,0.0,-0.4317,-0.5537,-0.2181,0.0,-0.0,-0.0,-0.0015,-0.0181,0.0228,2084.52 +35,60,0.96,0.0,4.04,0.8,0.0,0.0,0.0,-0.4321,-0.5566,-0.1953,0.0,-0.0,-0.0,-0.0004,-0.0167,0.0228,2145.0 +36,60,1.02,0.0,4.04,0.8,0.0,0.0,0.0,-0.4316,-0.5593,-0.1726,0.0,-0.0,-0.0,0.0005,-0.0154,0.0249,2204.83 +37,60,1.04,0.0,4.04,0.8,0.0,0.0,0.0,-0.4306,-0.5617,-0.1503,0.0,-0.0,-0.0,0.001,-0.0142,0.0249,2264.64 +38,60,1.05,0.0,4.04,0.8,0.0,0.0,0.0,-0.4294,-0.564,-0.1476,0.0,-0.0,-0.0,0.0012,-0.0151,0.0248,2324.94 +39,60,0.91,0.0,2.08,0.81,0.0,0.0,0.0,-0.4292,-0.5661,-0.1449,0.0,-0.0,-0.0,0.0002,-0.0139,0.0172,2384.47 +40,60,0.95,0.0,3.09,0.81,0.0,0.0,0.0,-0.4285,-0.5681,-0.1422,0.0,-0.0,-0.0,0.0007,-0.0128,0.023,2444.59 +41,60,1.05,0.0,3.09,0.81,0.0,0.0,0.0,-0.4265,-0.5699,-0.1393,0.0,-0.0,-0.0,0.002,-0.0118,0.0257,2504.67 +42,60,1.0,0.0,4.08,0.81,0.0,0.0,0.0,-0.4248,-0.5715,-0.1461,0.0,-0.0,-0.0,0.0017,-0.011,0.0302,2564.85 +43,60,0.96,0.0,4.08,0.74,0.0,0.0,0.0,-0.4232,-0.573,-0.1574,0.0,-0.0,-0.0,0.0016,-0.0158,0.0301,2624.65 +44,60,1.06,0.0,5.05,0.69,0.0,0.0,0.0,-0.4204,-0.5643,-0.1361,0.0,0.0,0.0,0.0028,-0.0146,0.0397,2684.1 +45,60,1.08,0.0,4.08,0.69,0.0,0.0,0.0,-0.4172,-0.5591,-0.1145,0.0,0.0,0.0,0.0032,-0.0135,0.0372,2745.1 +46,60,1.06,0.0,4.08,0.69,0.0,0.0,0.3,-0.414,-0.5616,-0.0929,0.0,-0.0,-0.0,0.0032,-0.0124,0.0371,2804.57 +47,60,1.02,0.0,4.04,0.69,0.01,0.0,0.64,-0.411,-0.5639,-0.0746,0.0,-0.0,-0.0,0.003,-0.0114,0.0362,2864.73 +48,60,1.04,0.0,3.06,0.69,0.0,0.0,0.0,-0.4077,-0.566,-0.0694,0.0,-0.0,-0.0,0.0033,-0.0118,0.0268,2926.14 +49,60,1.11,0.0,3.06,0.69,0.0,0.0,0.0,-0.4035,-0.568,-0.0579,0.0,0.0,0.0,0.0042,-0.0109,0.0278,2983.79 +50,60,1.05,0.0,3.09,0.69,0.0,0.0,0.0,-0.3998,-0.5698,-0.0566,0.0,-0.0,-0.0,0.0037,-0.0102,0.0278,3044.35 +51,60,1.02,0.0,3.09,0.69,0.0,0.0,0.0,-0.3962,-0.5714,-0.0553,0.0,-0.0,-0.0,0.0035,-0.0102,0.028,3104.28 +52,60,1.01,0.0,3.09,0.69,0.0,0.0,0.0,-0.3925,-0.5729,-0.0541,0.0,-0.0,-0.0,0.0037,-0.0106,0.0277,3164.35 +53,60,1.01,0.0,3.09,0.69,0.0,0.0,0.0,-0.3887,-0.5744,-0.0625,0.0,-0.0,-0.0,0.0039,-0.0098,0.0276,3224.88 +54,60,1.05,0.0,3.09,0.69,0.0,0.0,0.0,-0.3843,-0.5757,-0.0703,0.0,-0.0,-0.0,0.0044,-0.0101,0.0245,3284.77 +55,60,0.96,0.0,4.04,0.64,0.0,0.0,0.0,-0.3807,-0.5769,-0.0676,0.0,-0.0,-0.0,0.0037,-0.0093,0.0287,3344.71 +56,60,1.0,0.0,3.09,0.64,0.0,0.0,0.19,-0.3765,-0.578,-0.0548,0.0,0.0,0.0,0.0042,-0.01,0.0284,3405.35 +57,60,1.01,0.0,3.09,0.64,0.03,0.0,1.64,-0.372,-0.579,-0.0335,0.0,-0.0,-0.0,0.0045,-0.0106,0.029,3463.76 +58,60,1.01,0.0,4.08,0.64,0.05,0.0,3.02,-0.3676,-0.5799,-0.0165,0.0,-0.0,-0.0,0.0044,-0.0098,0.0339,3524.43 +59,60,0.99,0.0,6.0,0.64,0.09,0.0,5.5,-0.3636,-0.5808,0.0069,0.0,-0.0,-0.0,0.004,-0.009,0.0338,3585.11 +60,60,11.69,5.0,20.54,0.65,6.26,0.0,17.47,-0.2529,-0.4944,0.1013,0.0,0.0,0.0,0.1107,0.0435,0.2006,3639.41 +61,60,26.52,23.64,30.43,0.65,26.89,19.9,39.86,-0.0389,-0.2388,0.2753,0.0,0.0,0.0,0.2141,0.1604,0.2615,3658.59 +62,60,34.37,30.84,37.93,0.65,45.4,37.36,57.09,0.1219,-0.0347,0.373,0.0,-0.0,-0.0,0.1608,0.0977,0.2041,3675.16 +63,60,41.53,36.89,45.13,0.65,64.92,56.26,75.82,0.2643,0.1336,0.4669,0.0,-0.0,-0.0,0.1423,0.0848,0.1928,3686.48 +64,60,47.7,44.44,51.4,0.65,85.68,76.1,97.19,0.3932,0.2692,0.5319,0.0,0.0,0.0,0.1289,0.0634,0.1737,3692.69 +65,60,53.58,50.54,56.57,0.65,99.99,99.37,100.0,0.5216,0.4197,0.6313,0.0,-0.0,-0.0,0.1284,0.0637,0.1763,3694.57 +66,60,59.51,56.1,62.92,0.65,100.0,100.0,100.0,0.701,0.5805,0.8736,0.0,0.0,0.0,0.1795,0.1077,0.2478,3694.62 +67,60,66.95,63.89,70.89,0.65,100.0,100.0,100.0,1.0293,0.8625,1.2626,0.0,0.0,0.0,0.3283,0.2635,0.4008,3694.66 +68,60,76.71,73.44,81.25,0.65,100.0,100.0,100.0,1.5527,1.3321,1.8552,0.0,0.0,0.0,0.5234,0.4598,0.6193,3694.69 +69,60,89.57,86.79,96.15,0.65,100.0,100.0,100.0,2.3332,2.0536,2.7345,0.0,0.0,0.0,0.7805,0.7215,0.9135,3694.73 +70,60,100.0,100.0,100.0,0.65,100.0,100.0,100.0,3.3224,3.0393,3.721,0.0,0.0,0.0,0.9892,0.9761,0.998,3694.8 +71,60,100.0,100.0,100.0,0.65,100.0,100.0,100.0,4.3115,4.025,4.7075,0.0,0.0,0.0,0.9892,0.9761,0.998,3694.84 +72,60,100.0,100.0,100.0,0.65,100.0,100.0,100.0,5.3007,5.0107,5.6939,0.0,0.0,0.0,0.9892,0.9761,0.998,3694.88 +73,60,100.0,100.0,100.0,0.65,100.0,100.0,100.0,6.2899,5.9964,6.6804,0.0,0.0,0.0,0.9892,0.9761,0.998,3694.93 +74,60,83.33,0.0,100.0,0.6,100.0,100.0,100.0,6.9459,5.078,7.6065,0.0,-0.0,-0.0,0.656,-1.0218,0.998,3694.96 +75,60,0.0,0.0,0.0,0.55,97.52,80.24,100.0,5.9361,4.067,6.5976,0.0,0.0,0.0,-1.0098,-1.0221,-1.0018,3695.17 +76,60,13.33,0.0,100.0,0.55,98.87,65.64,100.0,5.198,3.345,5.6454,0.0,0.0,0.0,-0.738,-1.0203,0.9977,3695.67 +77,60,18.33,0.0,100.0,0.55,87.09,77.68,100.0,4.5573,3.9665,6.6339,0.0,-0.0,-0.0,-0.6408,-1.0181,0.9976,3697.49 +78,60,88.33,0.0,100.0,0.55,96.38,66.25,100.0,5.332,3.3501,7.6224,0.0,0.0,0.0,0.7747,-0.9054,0.9986,3699.76 +79,60,100.0,100.0,100.0,0.55,100.0,100.0,100.0,6.3235,4.3432,8.6109,0.0,0.0,0.0,0.9915,0.9799,0.9984,3700.14 +80,60,100.0,100.0,100.0,0.55,100.0,100.0,100.0,7.315,5.335,9.5994,0.0,0.0,0.0,0.9914,0.9799,0.9984,3700.18 +81,60,100.0,100.0,100.0,0.55,100.0,100.0,100.0,8.2768,6.3267,10.0,0.0,0.0,0.0,0.9914,0.9799,0.9984,3700.22 +82,60,100.0,100.0,100.0,0.55,100.0,100.0,100.0,9.1202,7.3184,10.0,0.0,0.0,0.0,0.9914,0.9799,0.9984,3700.26 +83,60,100.0,100.0,100.0,0.55,100.0,100.0,100.0,9.8131,8.3102,10.0,0.0,0.0,0.0,0.9914,0.9799,0.9984,3700.34 +84,60,100.0,100.0,100.0,0.55,100.0,100.0,100.0,9.9349,9.3019,10.0,0.0,0.0,0.0,0.9914,0.9799,0.9984,3700.38 +85,60,100.0,100.0,100.0,0.55,100.0,100.0,100.0,10.0,10.0,10.0,0.0,0.0,0.0,0.9914,0.9799,0.9984,3700.43 +86,59,86.44,0.0,100.0,0.51,100.0,100.0,100.0,9.863,8.9815,10.0,0.0,-0.0,-0.0,0.7204,-1.0185,0.9984,3700.46 +87,60,81.67,0.0,100.0,0.38,100.0,100.0,100.0,9.6801,7.9644,10.0,0.0,0.0,0.0,0.625,-1.0171,0.9984,3700.5 +88,60,13.33,0.0,100.0,0.38,100.0,100.0,100.0,8.8066,6.9486,10.0,0.0,0.0,0.0,-0.741,-1.0173,0.9976,3700.54 +89,60,0.0,0.0,0.0,0.35,100.0,100.0,100.0,7.7995,5.9341,8.9978,0.0,-0.0,-0.0,-1.0071,-1.0159,-1.0013,3700.58 +90,60,0.0,0.0,0.0,0.32,99.78,97.07,100.0,6.7929,4.9207,7.9957,0.0,0.0,0.0,-1.0066,-1.0147,-1.0012,3700.71 +91,60,0.0,0.0,0.0,0.3,97.07,77.54,100.0,5.7891,3.9378,6.9938,0.0,0.0,0.0,-1.0038,-1.0135,-0.9829,3701.3 +92,60,0.42,0.0,25.0,0.27,93.77,62.03,100.0,4.8204,3.1523,5.9921,0.0,0.0,0.0,-0.9687,-1.0125,-0.3459,3703.61 +93,60,0.83,0.0,25.0,0.25,78.68,49.62,100.0,3.8928,2.5234,4.9905,0.0,0.0,0.0,-0.9276,-1.0081,-0.2275,3710.55 +94,60,1.08,0.0,25.0,0.23,64.01,39.68,100.0,3.1227,2.02,3.9925,0.0,0.0,0.0,-0.7701,-0.998,-0.433,3730.27 +95,60,1.42,0.0,25.0,0.21,52.39,31.72,97.15,2.5054,1.617,3.1943,0.0,0.0,0.0,-0.6173,-0.7983,-0.3661,3760.37 +96,60,1.38,0.0,20.0,0.2,42.16,25.35,76.96,2.0026,1.2518,2.5556,0.0,0.0,0.0,-0.5028,-0.6557,-0.3226,3796.75 +97,60,1.04,0.0,12.5,0.18,33.21,20.25,47.91,1.5942,0.9544,2.0446,0.0,0.0,0.0,-0.4083,-0.6178,-0.1597,3843.26 +98,60,1.22,0.0,11.11,0.17,26.95,16.17,36.09,1.2764,0.7422,1.6358,0.0,0.0,0.0,-0.3179,-0.409,-0.2067,3896.41 +99,60,1.21,0.0,7.41,0.15,21.74,13.03,30.92,1.0202,0.5812,1.3475,0.0,0.0,0.0,-0.2562,-0.3271,-0.1426,3951.57 +100,60,1.08,0.0,6.0,0.14,17.41,10.4,24.73,0.8141,0.4474,1.079,0.0,0.0,0.0,-0.2062,-0.279,-0.1228,4011.22 +101,60,1.09,0.0,6.67,0.13,14.1,8.3,19.59,0.6508,0.3419,0.8563,0.0,0.0,0.0,-0.1632,-0.2228,-0.0956,4071.12 +102,60,1.05,0.0,5.71,0.14,11.42,6.64,17.95,0.52,0.2443,0.7078,0.0,0.0,0.0,-0.1309,-0.1764,-0.0712,4131.68 +103,59,1.03,0.0,5.06,0.14,9.32,3.97,14.53,0.4177,0.1912,0.5613,0.0,-0.0,-0.0,-0.1052,-0.1465,-0.0531,4191.58 +104,60,0.93,0.0,4.71,0.03,7.49,3.16,11.64,0.3322,0.1506,0.4516,0.0,0.0,0.0,-0.0843,-0.1176,-0.0407,4250.75 +105,60,0.97,0.0,4.44,0.03,6.2,2.5,9.68,0.266,0.1185,0.3591,0.0,0.0,0.0,-0.0662,-0.0925,-0.0321,4311.07 +106,60,0.89,0.0,4.3,0.02,5.02,1.98,8.22,0.2119,0.0934,0.2852,0.0,0.0,0.0,-0.0541,-0.074,-0.0251,4371.93 +107,60,0.9,0.0,3.16,0.02,4.17,1.56,7.9,0.1695,0.074,0.2333,0.0,0.0,0.0,-0.0424,-0.0673,-0.0193,4430.76 +108,60,0.85,0.0,3.13,0.02,3.43,0.6,6.92,0.135,0.0486,0.1862,0.0,0.0,0.0,-0.0344,-0.0493,-0.0088,4491.12 +109,60,0.91,0.0,3.09,0.02,2.96,0.96,6.09,0.1086,0.0493,0.1513,0.0,0.0,0.0,-0.0264,-0.0455,0.0007,4553.37 +110,60,0.89,0.0,3.06,0.02,2.5,0.75,5.39,0.0867,0.0395,0.1212,0.0,0.0,0.0,-0.0219,-0.0404,-0.0098,4609.77 +111,60,0.89,0.0,4.04,0.02,2.15,0.21,6.16,0.0693,0.0286,0.1045,0.0,0.0,0.0,-0.0174,-0.0297,0.0028,4671.56 +112,58,0.92,0.0,3.09,0.01,1.92,0.14,4.62,0.056,0.0232,0.0841,0.0,0.0,0.0,-0.0135,-0.0419,-0.0012,4732.36 +113,57,1.01,0.0,4.04,0.43,1.81,0.07,5.53,0.0461,0.0188,0.0777,0.0,0.0,0.0,-0.0101,-0.0256,0.0103,4790.45 +114,60,1.08,0.0,3.06,0.18,1.72,0.03,4.05,0.0378,0.0153,0.0596,0.0,0.0,0.0,-0.0088,-0.0256,0.0113,4851.81 +115,60,1.03,0.0,3.06,0.25,1.5,0.0,3.86,0.0297,0.0125,0.0482,0.0,0.0,0.0,-0.0081,-0.0216,0.0064,4911.3 +116,59,1.08,0.0,3.06,0.18,1.44,0.0,3.62,0.0242,0.0099,0.0423,0.0,0.0,0.0,-0.0052,-0.0164,0.0168,4970.77 +117,60,1.13,0.0,3.06,0.03,1.41,0.0,3.77,0.02,0.0076,0.0371,0.0,0.0,0.0,-0.0046,-0.0155,0.0079,5031.73 +118,60,1.08,0.0,3.06,0.03,1.28,0.0,3.65,0.0155,-0.0034,0.0323,0.0,0.0,0.0,-0.0045,-0.0165,0.0069,5091.37 +119,60,0.99,0.0,3.06,0.04,1.13,0.0,3.65,0.0114,-0.0065,0.0308,0.0,0.0,0.0,-0.0041,-0.0165,0.0176,5150.72 +120,60,0.99,0.0,4.04,0.04,1.09,0.0,4.6,0.0088,-0.0095,0.0282,0.0,0.0,0.0,-0.0026,-0.0144,0.0081,5210.87 +121,60,0.98,0.0,4.04,0.04,1.06,0.0,4.48,0.0066,-0.0122,0.0265,0.0,0.0,0.0,-0.0022,-0.0126,0.0091,5268.0 +122,60,0.91,0.0,4.04,0.05,0.97,0.0,4.43,0.004,-0.0177,0.0218,0.0,0.0,0.0,-0.0027,-0.0212,0.0089,5331.47 +123,60,0.84,0.0,4.08,0.05,0.87,0.0,4.4,0.0016,-0.0206,0.0231,0.0,0.0,0.0,-0.0024,-0.0228,0.0199,5390.43 +124,60,0.91,0.0,4.08,0.05,0.92,0.0,4.33,0.001,-0.0232,0.019,0.0,0.0,0.0,-0.0006,-0.0137,0.0099,5450.99 +125,60,0.91,0.0,3.06,0.05,0.91,0.0,3.29,-0.0002,-0.0257,0.0151,0.0,-0.0,-0.0,-0.0012,-0.0226,0.0114,5511.16 +126,59,0.91,0.0,3.09,0.04,0.9,0.0,3.28,-0.0012,-0.028,0.015,0.0,0.0,0.0,-0.001,-0.0121,0.0116,5570.93 +127,60,0.97,0.0,3.06,0.09,0.94,0.0,2.84,-0.0016,-0.0301,0.0184,0.0,0.0,0.0,-0.0004,-0.0125,0.01,5630.71 +128,60,1.02,0.0,3.09,0.09,0.99,0.0,3.43,-0.0018,-0.032,0.0194,0.0,0.0,0.0,-0.0002,-0.0112,0.0197,5689.86 +129,60,1.04,0.0,4.12,0.09,1.01,0.0,4.68,-0.0024,-0.0338,0.0254,0.0,-0.0,-0.0,-0.0006,-0.0216,0.0112,5750.43 +130,60,1.11,0.0,5.1,0.1,1.08,0.0,5.85,-0.0024,-0.0354,0.031,0.0,0.0,0.0,0.0,-0.0109,0.0188,5811.27 +131,59,1.16,0.0,5.1,0.1,1.16,0.0,5.79,-0.0023,-0.0369,0.0253,0.0,0.0,0.0,-0.0,-0.0111,0.0197,5871.23 +132,60,1.27,0.0,6.0,0.32,1.26,0.0,6.81,-0.0023,-0.0383,0.0296,0.0,0.0,0.0,0.0001,-0.0115,0.0119,5931.63 +133,60,1.22,0.0,4.08,0.33,1.19,0.0,4.36,-0.0036,-0.0396,0.0258,0.0,-0.0,-0.0,-0.0014,-0.0259,0.0094,5989.56 +134,60,1.16,0.0,4.08,0.33,1.14,0.0,4.28,-0.0048,-0.0408,0.0213,0.0,-0.0,-0.0,-0.0012,-0.0129,0.0207,6051.07 +135,60,1.16,0.0,4.08,0.33,1.13,0.0,4.21,-0.0055,-0.0419,0.0167,0.0,0.0,0.0,-0.0006,-0.013,0.0109,6111.73 +136,60,1.11,0.0,4.08,0.34,1.07,0.0,4.2,-0.0065,-0.0429,0.0132,0.0,0.0,0.0,-0.001,-0.0121,0.0099,6170.26 +137,60,1.08,0.0,4.08,0.34,1.03,0.0,4.35,-0.0073,-0.0438,0.0155,0.0,-0.0,-0.0,-0.0008,-0.0129,0.01,6230.96 +138,60,1.06,0.0,4.04,0.34,1.01,0.0,4.33,-0.008,-0.0446,0.0149,0.0,-0.0,-0.0,-0.0007,-0.0211,0.0105,6291.29 +139,60,1.02,0.0,4.04,0.35,0.97,0.0,4.22,-0.0087,-0.0454,0.0133,0.0,0.0,0.0,-0.0007,-0.0125,0.0106,6350.11 +140,8,0.9,0.0,2.06,0.35,0.79,0.0,2.13,-0.014,-0.0462,0.0069,0.0,-0.0,-0.0,-0.0018,-0.0101,0.0014,6357.18 diff --git a/experiments/results/csv/sudden_error_spike_100_adaptive_time_analysis.csv b/experiments/results/csv/sudden_error_spike_100_adaptive_time_analysis.csv new file mode 100644 index 000000000..8c06526bf --- /dev/null +++ b/experiments/results/csv/sudden_error_spike_100_adaptive_time_analysis.csv @@ -0,0 +1,8 @@ +Time Range,Total Requests,Success,Errors,Error %,Rejected,Rejected %,Target Error Rate % +0-20s,11159,11042,103,0.92,14,0.13,1.0 +20-40s,11544,11430,114,0.99,0,0.0,1.0 +40-60s,11616,11493,122,1.05,1,0.01,1.0 +60-80s,15586,65,3215,20.63,12306,78.96,100.0 +80-100s,14913,2395,27,0.18,12491,83.76,1.0 +100-120s,12370,11515,111,0.9,744,6.01,1.0 +120-140s,11680,11440,120,1.03,120,1.03,1.0 diff --git a/experiments/results/csv/sudden_error_spike_100_time_analysis.csv b/experiments/results/csv/sudden_error_spike_100_time_analysis.csv new file mode 100644 index 000000000..7055acf28 --- /dev/null +++ b/experiments/results/csv/sudden_error_spike_100_time_analysis.csv @@ -0,0 +1,8 @@ +Time Range,Total Requests,Success,Errors,Error %,Rejected,Rejected %,Target Error Rate % +0-20s,10754,10636,118,1.1,0,0.0,1.0 +20-40s,11571,11457,114,0.99,0,0.0,1.0 +40-60s,11692,11558,134,1.15,0,0.0,1.0 +60-80s,15507,582,655,4.22,14270,92.02,100.0 +80-100s,14937,4481,38,0.25,10418,69.75,1.0 +100-120s,12597,11269,129,1.02,1199,9.52,1.0 +120-140s,11616,11492,124,1.07,0,0.0,1.0 diff --git a/experiments/results/csv/sudden_error_spike_20_adaptive_pid_controller.csv b/experiments/results/csv/sudden_error_spike_20_adaptive_pid_controller.csv new file mode 100644 index 000000000..0bf61deac --- /dev/null +++ b/experiments/results/csv/sudden_error_spike_20_adaptive_pid_controller.csv @@ -0,0 +1,141 @@ +Window,Thread Count,Error Rate Avg,Error Rate Min,Error Rate Max,Ideal Error Rate,Rejection Rate Avg,Rejection Rate Min,Rejection Rate Max,Integral Avg,Integral Min,Integral Max,Derivative Avg,Derivative Min,Derivative Max,P Value Avg,P Value Min,P Value Max,Total Request Time +1,60,1.28,0.0,20.0,5.0,0.94,0.0,18.0,-0.0337,-0.0461,0.15,0.0,0.0,0.0,-0.0337,-0.0461,0.15,54.29 +2,60,1.25,0.0,10.0,4.25,0.14,0.0,6.47,-0.074,-0.0886,0.0289,0.0,0.0,0.0,-0.0404,-0.1211,0.0094,114.16 +3,60,1.12,0.0,6.9,3.92,0.05,0.0,1.69,-0.1053,-0.1278,-0.0157,0.0,0.0,0.0,-0.0313,-0.0446,0.0264,174.91 +4,60,1.01,0.0,5.41,3.61,0.0,0.0,0.0,-0.1344,-0.1639,-0.0315,0.0,0.0,0.0,-0.029,-0.0361,0.012,234.77 +5,57,0.88,0.0,4.26,3.33,0.0,0.0,0.0,-0.1642,-0.1972,-0.04,0.0,0.0,0.0,-0.0273,-0.0333,0.0005,294.01 +6,60,0.91,0.0,3.51,4.52,0.0,0.0,0.0,-0.1855,-0.228,-0.0543,0.0,-0.0,-0.0,-0.0252,-0.0333,-0.0004,354.53 +7,56,0.91,0.0,3.03,4.3,0.0,0.0,0.0,-0.2079,-0.2563,-0.0716,0.0,-0.0,-0.0,-0.0233,-0.0307,-0.0051,414.37 +8,59,0.96,0.0,5.06,2.83,0.0,0.0,0.0,-0.2275,-0.2824,-0.0911,0.0,0.0,0.0,-0.0211,-0.0283,0.0161,474.13 +9,19,1.15,0.0,3.85,2.61,0.0,0.0,0.0,-0.2325,-0.3065,-0.1117,0.0,0.0,0.0,-0.019,-0.0261,0.0038,530.85 +10,60,0.96,0.0,4.55,2.5,0.0,0.0,0.0,-0.253,-0.3287,-0.1156,0.0,0.0,0.0,-0.019,-0.0251,0.0109,595.79 +11,60,1.0,0.0,4.17,2.39,0.0,0.0,0.0,-0.2702,-0.3491,-0.132,0.0,-0.0,-0.0,-0.0171,-0.0383,0.0071,654.24 +12,60,0.99,0.0,4.17,2.37,0.0,0.0,0.0,-0.2861,-0.368,-0.1393,0.0,0.0,0.0,-0.0159,-0.0353,0.0071,715.28 +13,59,1.0,0.0,4.12,3.3,0.0,0.0,0.0,-0.3011,-0.3854,-0.1355,0.0,0.0,0.0,-0.0144,-0.0326,0.0076,773.55 +14,60,1.06,0.0,4.12,2.61,0.0,0.0,0.0,-0.3131,-0.4014,-0.1288,0.0,0.0,0.0,-0.0128,-0.0318,0.0175,834.53 +15,60,1.11,0.0,4.17,2.41,0.0,0.0,0.0,-0.3244,-0.4162,-0.1218,0.0,0.0,0.0,-0.0113,-0.0249,0.0175,894.85 +16,59,1.11,0.0,4.12,2.22,0.0,0.0,0.0,-0.3354,-0.4298,-0.1342,0.0,0.0,0.0,-0.0103,-0.0285,0.0175,954.74 +17,57,1.09,0.0,4.12,2.78,0.0,0.0,0.0,-0.3438,-0.4424,-0.1455,0.0,0.0,0.0,-0.0097,-0.0263,0.0175,1013.3 +18,58,1.08,0.0,4.08,1.91,0.0,0.0,0.0,-0.3515,-0.4424,-0.1561,0.0,0.0,0.0,-0.0092,-0.0245,0.017,1075.11 +19,60,1.11,0.0,4.12,2.23,0.0,0.0,0.0,-0.3605,-0.454,-0.1853,0.0,0.0,0.0,-0.008,-0.0292,0.0174,1134.37 +20,60,1.11,0.0,3.23,2.22,0.0,0.0,0.0,-0.3679,-0.4647,-0.1914,0.0,0.0,0.0,-0.0074,-0.0269,0.0081,1194.38 +21,60,1.0,0.0,3.19,2.05,0.0,0.0,0.0,-0.3756,-0.4746,-0.1834,0.0,-0.0,-0.0,-0.0077,-0.0248,0.0087,1253.59 +22,59,1.02,0.0,3.26,1.89,0.0,0.0,0.0,-0.3836,-0.4836,-0.1858,0.0,0.0,0.0,-0.0067,-0.0229,0.0099,1315.85 +23,60,1.06,0.0,3.26,2.29,0.0,0.0,0.0,-0.388,-0.492,-0.1976,0.0,0.0,0.0,-0.0058,-0.0211,0.0173,1372.31 +24,60,0.99,0.0,3.26,2.2,0.0,0.0,0.0,-0.3939,-0.4997,-0.2133,0.0,0.0,0.0,-0.0059,-0.0216,0.0173,1434.58 +25,60,1.0,0.0,3.3,2.11,0.0,0.0,0.0,-0.3992,-0.5069,-0.2216,0.0,0.0,0.0,-0.0052,-0.0199,0.0191,1494.1 +26,60,0.96,0.0,3.3,2.04,0.0,0.0,0.0,-0.4041,-0.5134,-0.2293,0.0,0.0,0.0,-0.005,-0.0184,0.0191,1554.98 +27,59,0.94,0.0,4.35,1.97,0.0,0.0,0.0,-0.4105,-0.5195,-0.2443,0.0,0.0,0.0,-0.0046,-0.0205,0.0204,1613.0 +28,60,0.9,0.0,4.3,2.09,0.0,0.0,0.0,-0.4131,-0.5251,-0.2347,0.0,0.0,0.0,-0.0045,-0.02,0.0265,1674.46 +29,60,1.05,0.0,4.21,2.02,0.0,0.0,0.0,-0.4157,-0.5302,-0.2262,0.0,0.0,0.0,-0.0026,-0.0185,0.0255,1734.42 +30,59,1.08,0.0,4.08,2.02,0.0,0.0,0.0,-0.4165,-0.5349,-0.2281,0.0,0.0,0.0,-0.002,-0.017,0.0242,1793.38 +31,60,0.99,0.0,3.13,0.77,0.0,0.0,0.0,-0.4202,-0.5393,-0.2395,0.0,0.0,0.0,-0.0024,-0.0157,0.0231,1853.61 +32,60,1.0,0.0,3.13,0.77,0.0,0.0,0.0,-0.4221,-0.5434,-0.2306,0.0,0.0,0.0,-0.0019,-0.0151,0.0227,1914.26 +33,60,0.98,0.0,3.09,0.78,0.0,0.0,0.0,-0.4239,-0.5471,-0.2219,0.0,0.0,0.0,-0.0018,-0.0203,0.0227,1973.76 +34,59,1.02,0.0,3.09,0.78,0.0,0.0,0.0,-0.4275,-0.5505,-0.213,0.0,-0.0,-0.0,-0.0011,-0.0187,0.0227,2033.75 +35,60,1.02,0.0,3.09,1.47,0.0,0.0,0.0,-0.4257,-0.5537,-0.2047,0.0,0.0,0.0,-0.0008,-0.0173,0.0231,2094.13 +36,60,1.04,0.0,4.0,1.35,0.0,0.0,0.0,-0.426,-0.5566,-0.1868,0.0,-0.0,-0.0,-0.0003,-0.0159,0.0232,2153.64 +37,60,1.1,0.0,4.04,1.25,0.0,0.0,0.0,-0.4254,-0.5593,-0.1721,0.0,0.0,0.0,0.0006,-0.0147,0.0236,2213.73 +38,60,1.08,0.0,3.06,1.15,0.0,0.0,0.0,-0.4248,-0.5617,-0.1587,0.0,0.0,0.0,0.0006,-0.0135,0.0227,2273.02 +39,60,0.94,0.0,3.06,1.06,0.0,0.0,0.0,-0.4254,-0.564,-0.1549,0.0,0.0,0.0,-0.0005,-0.0125,0.0224,2334.3 +40,60,1.06,0.0,3.06,0.98,0.0,0.0,0.0,-0.4245,-0.5661,-0.1514,0.0,0.0,0.0,0.0009,-0.0137,0.0226,2393.84 +41,60,1.08,0.0,3.06,0.9,0.0,0.0,0.0,-0.4232,-0.5681,-0.1479,0.0,0.0,0.0,0.0013,-0.0126,0.0226,2453.01 +42,60,1.09,0.0,3.06,0.83,0.0,0.0,0.0,-0.4216,-0.5699,-0.1444,0.0,0.0,0.0,0.0016,-0.0116,0.0222,2513.63 +43,60,1.11,0.0,3.06,0.77,0.0,0.0,0.0,-0.4196,-0.5715,-0.1408,0.0,0.0,0.0,0.002,-0.0137,0.0225,2574.66 +44,60,1.06,0.0,3.06,0.71,0.0,0.0,0.0,-0.4178,-0.5628,-0.1373,0.0,0.0,0.0,0.0017,-0.0126,0.0225,2633.32 +45,60,1.09,0.0,3.06,0.65,0.0,0.0,0.0,-0.4156,-0.5568,-0.1237,0.0,0.0,0.0,0.0022,-0.0117,0.0206,2693.4 +46,60,1.13,0.0,3.09,0.6,0.0,0.0,0.0,-0.4128,-0.5595,-0.1202,0.0,0.0,0.0,0.0028,-0.0173,0.0245,2754.17 +47,60,1.06,0.0,3.06,0.55,0.0,0.0,0.0,-0.4106,-0.5619,-0.1263,0.0,0.0,0.0,0.0022,-0.0159,0.0248,2813.53 +48,60,1.07,0.0,4.04,0.51,0.0,0.0,0.0,-0.4081,-0.5642,-0.132,0.0,0.0,0.0,0.0025,-0.0147,0.0306,2873.68 +49,60,1.07,0.0,4.95,0.51,0.0,0.0,0.0,-0.4054,-0.5663,-0.1373,0.0,0.0,0.0,0.0027,-0.0135,0.0397,2933.2 +50,60,0.99,0.0,4.04,0.52,0.0,0.0,0.0,-0.4033,-0.5682,-0.1422,0.0,0.0,0.0,0.0021,-0.0125,0.0305,2994.43 +51,60,0.97,0.0,4.95,0.52,0.0,0.0,0.09,-0.4012,-0.57,-0.1466,0.0,-0.0,-0.0,0.0021,-0.0115,0.0396,3052.42 +52,60,0.92,0.0,5.0,0.53,0.02,0.0,0.91,-0.3994,-0.5716,-0.1506,0.0,0.0,0.0,0.0018,-0.0115,0.0392,3113.42 +53,60,0.92,0.0,5.0,0.53,0.03,0.0,1.56,-0.3975,-0.5732,-0.1232,0.0,0.0,0.0,0.0019,-0.0161,0.0355,3174.17 +54,60,0.96,0.0,5.94,0.54,0.05,0.0,3.22,-0.3952,-0.5745,-0.0888,0.0,-0.0,-0.0,0.0023,-0.0149,0.035,3233.8 +55,60,0.97,0.0,5.94,0.54,0.06,0.0,3.67,-0.3928,-0.5758,-0.0703,0.0,-0.0,-0.0,0.0024,-0.0137,0.035,3293.85 +56,60,0.87,0.0,6.0,0.55,0.07,0.0,4.04,-0.3912,-0.577,-0.0555,0.0,0.0,0.0,0.0016,-0.0126,0.0356,3353.91 +57,60,0.94,0.0,5.94,0.56,0.09,0.0,4.2,-0.3889,-0.5781,-0.0449,0.0,-0.0,-0.0,0.0023,-0.0116,0.0355,3413.62 +58,60,0.94,0.0,5.0,0.56,0.08,0.0,3.2,-0.3865,-0.5791,-0.0457,0.0,-0.0,-0.0,0.0024,-0.0107,0.0261,3474.04 +59,60,0.96,0.0,4.04,0.57,0.05,0.0,2.14,-0.3837,-0.5699,-0.0469,0.0,-0.0,-0.0,0.0028,-0.0099,0.0233,3533.22 +60,60,0.92,0.0,4.04,0.57,0.04,0.0,2.29,-0.3808,-0.5607,-0.0379,0.0,-0.0,-0.0,0.0029,-0.0091,0.0253,3594.22 +61,60,2.02,0.0,6.0,0.57,0.15,0.0,4.77,-0.3667,-0.5514,-0.0109,0.0,0.0,0.0,0.0141,-0.0084,0.0565,3653.61 +62,60,4.56,0.0,10.58,0.58,0.53,0.0,10.78,-0.3283,-0.5319,0.041,0.0,0.0,0.0,0.0384,-0.0072,0.0844,3713.97 +63,60,6.6,3.03,12.26,0.58,1.79,0.0,13.55,-0.2731,-0.4926,0.0572,0.0,-0.0,-0.0,0.0553,0.0105,0.0938,3773.86 +64,60,8.29,4.0,14.15,0.59,3.84,0.0,16.26,-0.2122,-0.4339,0.0703,0.0,0.0,0.0,0.0609,0.0131,0.1118,3834.0 +65,60,10.48,4.04,17.27,0.6,7.4,0.0,20.76,-0.1473,-0.366,0.0961,0.0,-0.0,-0.0,0.0649,0.0146,0.1176,3894.06 +66,60,12.36,6.93,20.35,0.61,10.86,0.82,23.64,-0.0939,-0.2981,0.104,0.0,-0.0,-0.0,0.0534,-0.0173,0.1272,3953.6 +67,60,14.33,6.86,21.24,0.62,14.38,5.42,25.75,-0.0489,-0.1926,0.0995,0.0,-0.0,-0.0,0.0449,-0.0079,0.1055,4013.56 +68,60,15.67,7.84,23.28,0.64,17.02,7.36,29.39,-0.0188,-0.1363,0.0803,0.0,0.0,0.0,0.0301,-0.0192,0.0634,4073.54 +69,60,17.43,7.84,25.64,0.65,20.06,7.91,33.84,0.0097,-0.1055,0.0789,0.0,-0.0,-0.0,0.0285,-0.0144,0.0957,4133.24 +70,60,19.38,12.26,26.27,0.65,23.45,12.43,36.03,0.0363,-0.074,0.0999,0.0,0.0,0.0,0.0266,-0.0024,0.0682,4193.51 +71,60,20.15,10.58,27.5,0.65,25.19,10.62,37.56,0.0448,-0.0303,0.1094,0.0,-0.0,-0.0,0.0085,-0.0381,0.0708,4253.85 +72,60,19.6,9.71,27.73,0.66,24.59,10.47,38.75,0.0323,-0.0467,0.088,0.0,-0.0,-0.0,-0.0125,-0.0721,0.0255,4313.72 +73,60,19.76,11.54,29.17,0.66,24.55,12.56,41.87,0.0266,-0.0532,0.1051,0.0,0.0,0.0,-0.0057,-0.0557,0.04,4371.87 +74,60,19.81,11.65,29.17,0.66,24.51,10.97,42.55,0.0218,-0.0602,0.1002,0.0,0.0,0.0,-0.0048,-0.0494,0.0294,4424.42 +75,60,19.5,12.62,28.7,0.66,23.95,12.13,41.63,0.0135,-0.0715,0.0816,0.0,0.0,0.0,-0.0083,-0.0744,0.0302,4470.68 +76,60,19.35,12.87,27.43,0.66,23.55,12.31,38.9,0.0079,-0.0984,0.0893,0.0,-0.0,-0.0,-0.0056,-0.0707,0.0477,4520.04 +77,60,19.34,11.34,27.27,0.66,23.46,10.4,36.81,0.0059,-0.0892,0.1134,0.0,0.0,0.0,-0.002,-0.0476,0.0338,4567.82 +78,60,19.76,11.34,27.88,0.66,24.07,10.33,38.15,0.01,-0.075,0.1112,0.0,0.0,0.0,0.0041,-0.047,0.0537,4618.68 +79,60,19.81,9.57,32.08,0.66,24.21,8.1,45.59,0.0095,-0.081,0.1249,0.0,-0.0,-0.0,-0.0005,-0.0526,0.084,4667.75 +80,60,19.84,8.7,28.28,0.66,24.25,7.03,41.31,0.0083,-0.0764,0.0924,0.0,-0.0,-0.0,-0.0012,-0.0769,0.0579,4715.08 +81,60,18.9,8.7,25.0,0.66,22.83,7.22,33.56,-0.0049,-0.0924,0.1017,0.0,0.0,0.0,-0.0132,-0.0808,0.0255,4774.34 +82,60,17.37,6.67,24.24,0.66,20.28,4.79,33.11,-0.0254,-0.1047,0.081,0.0,-0.0,-0.0,-0.0205,-0.0533,0.0241,4832.55 +83,60,15.12,6.74,22.45,0.66,16.59,4.89,29.8,-0.0519,-0.1348,0.0399,0.0,-0.0,-0.0,-0.0265,-0.0663,0.0196,4892.49 +84,60,13.27,6.59,19.59,0.66,13.52,5.04,24.31,-0.0688,-0.1459,0.011,0.0,-0.0,-0.0,-0.0169,-0.0738,0.0174,4952.7 +85,60,11.46,4.55,16.49,0.66,10.83,1.72,18.24,-0.0798,-0.1672,-0.0289,0.0,-0.0,-0.0,-0.011,-0.0551,0.0167,5013.48 +86,60,9.69,4.35,16.33,0.66,8.39,1.08,17.46,-0.0868,-0.1746,-0.0312,0.0,0.0,0.0,-0.007,-0.0712,0.0246,5071.42 +87,60,7.75,2.17,15.0,0.66,5.97,0.0,15.61,-0.0929,-0.1637,-0.028,0.0,-0.0,-0.0,-0.0061,-0.0582,0.0222,5131.26 +88,60,5.86,1.08,11.11,0.68,3.73,0.0,10.81,-0.0968,-0.1559,-0.0439,0.0,-0.0,-0.0,-0.0038,-0.0467,0.0322,5193.6 +89,60,3.78,0.0,7.22,0.69,1.69,0.0,5.61,-0.1012,-0.1723,-0.0561,0.0,0.0,0.0,-0.0045,-0.0644,0.0425,5252.24 +90,60,1.76,0.0,5.1,0.69,0.28,0.0,3.06,-0.1067,-0.169,-0.0455,0.0,0.0,0.0,-0.0054,-0.0388,0.0227,5312.22 +91,60,1.04,0.0,3.06,0.69,0.03,0.0,0.89,-0.1053,-0.1754,-0.0364,0.0,-0.0,-0.0,0.0013,-0.02,0.0244,5372.53 +92,60,1.02,0.0,3.06,0.64,0.08,0.0,1.03,-0.1016,-0.1839,-0.0292,0.0,0.0,0.0,0.0038,-0.0085,0.0254,5432.02 +93,60,0.97,0.0,3.03,0.59,0.1,0.0,1.33,-0.0986,-0.1918,-0.0233,0.0,0.0,0.0,0.0029,-0.0097,0.0244,5492.22 +94,60,1.01,0.0,4.04,0.54,0.21,0.0,2.65,-0.0955,-0.199,-0.0187,0.0,0.0,0.0,0.0032,-0.0089,0.0234,5552.81 +95,60,1.02,0.0,4.0,0.5,0.28,0.0,2.81,-0.093,-0.2057,-0.0152,0.0,0.0,0.0,0.0024,-0.0082,0.0186,5612.3 +96,60,1.04,0.0,5.0,0.46,0.3,0.0,4.17,-0.091,-0.2119,-0.0119,0.0,0.0,0.0,0.002,-0.0101,0.0231,5672.4 +97,60,1.0,0.0,5.0,0.43,0.31,0.0,4.29,-0.0893,-0.2176,-0.0094,0.0,0.0,0.0,0.0017,-0.0152,0.0233,5732.98 +98,60,1.01,0.0,5.0,0.39,0.3,0.0,4.34,-0.0876,-0.2228,-0.0075,0.0,0.0,0.0,0.0017,-0.0095,0.0135,5792.66 +99,60,0.9,0.0,4.04,0.36,0.27,0.0,3.17,-0.0868,-0.2276,-0.0096,0.0,0.0,0.0,0.0008,-0.0174,0.0215,5851.41 +100,60,0.99,0.0,4.0,0.33,0.27,0.0,3.13,-0.0847,-0.2321,-0.0074,0.0,0.0,0.0,0.0021,-0.0068,0.0229,5912.65 +101,60,1.01,0.0,3.06,0.31,0.33,0.0,2.53,-0.0824,-0.2362,-0.0008,0.0,0.0,0.0,0.0023,-0.01,0.016,5972.27 +102,60,0.94,0.0,3.06,0.28,0.29,0.0,2.62,-0.0812,-0.24,0.0006,0.0,0.0,0.0,0.0012,-0.01,0.0147,6032.04 +103,60,1.04,0.0,3.03,0.26,0.31,0.0,2.1,-0.0784,-0.2435,-0.0015,0.0,0.0,0.0,0.0027,-0.0103,0.0202,6093.06 +104,57,1.04,0.0,4.04,0.24,0.3,0.0,3.06,-0.0763,-0.2467,-0.0069,0.0,0.0,0.0,0.0025,-0.01,0.025,6152.18 +105,60,1.06,0.0,3.06,0.36,0.33,0.0,2.74,-0.073,-0.2497,-0.0011,0.0,-0.0,-0.0,0.0031,-0.009,0.0282,6212.31 +106,60,1.06,0.0,3.06,0.36,0.35,0.0,2.54,-0.0703,-0.2524,0.0051,0.0,-0.0,-0.0,0.0028,-0.0099,0.019,6272.04 +107,59,1.08,0.0,4.04,0.36,0.39,0.0,3.11,-0.0684,-0.2549,0.0056,0.0,0.0,0.0,0.003,-0.007,0.0217,6332.09 +108,60,1.14,0.0,4.04,0.62,0.47,0.0,3.32,-0.0644,-0.2573,0.0094,0.0,0.0,0.0,0.0029,-0.0111,0.0138,6392.21 +109,60,1.19,0.0,4.0,0.62,0.5,0.0,3.39,-0.0615,-0.2594,0.0078,0.0,-0.0,-0.0,0.0029,-0.0108,0.0197,6452.19 +110,60,1.12,0.0,3.03,0.63,0.45,0.0,2.99,-0.0596,-0.2614,0.008,0.0,0.0,0.0,0.0019,-0.0104,0.0176,6513.33 +111,59,1.04,0.0,3.06,0.63,0.38,0.0,2.57,-0.0588,-0.2632,-0.0001,0.0,-0.0,-0.0,0.0016,-0.0115,0.0274,6571.42 +112,59,1.04,0.0,4.0,0.84,0.45,0.0,3.63,-0.0562,-0.2649,-0.0004,0.0,-0.0,-0.0,0.0026,-0.0087,0.0196,6632.3 +113,58,0.97,0.0,4.0,1.03,0.41,0.0,3.72,-0.0551,-0.2664,-0.0004,0.0,-0.0,-0.0,0.0013,-0.01,0.0163,6692.88 +114,60,1.01,0.0,4.04,0.49,0.45,0.0,3.94,-0.0526,-0.2679,0.0038,0.0,0.0,0.0,0.0016,-0.0104,0.0186,6751.4 +115,60,0.96,0.0,4.04,0.46,0.45,0.0,3.97,-0.0515,-0.2692,0.0058,0.0,0.0,0.0,0.001,-0.0198,0.0197,6812.42 +116,60,1.06,0.0,4.08,0.42,0.48,0.0,4.0,-0.0494,-0.2704,0.0113,0.0,0.0,0.0,0.0022,-0.0113,0.0178,6872.69 +117,60,1.06,0.0,4.04,0.39,0.5,0.0,3.93,-0.0474,-0.2715,0.0097,0.0,0.0,0.0,0.0019,-0.0091,0.0191,6931.52 +118,60,1.05,0.0,4.04,0.36,0.58,0.0,3.91,-0.0456,-0.2726,0.0125,0.0,0.0,0.0,0.0019,-0.011,0.0196,6992.36 +119,60,1.07,0.0,4.04,0.33,0.61,0.0,3.29,-0.0442,-0.2735,0.0103,0.0,0.0,0.0,0.0013,-0.0105,0.0276,7052.46 +120,60,1.11,0.0,4.04,0.3,0.63,0.0,3.25,-0.0428,-0.2642,0.0082,0.0,0.0,0.0,0.0015,-0.0111,0.0194,7111.44 +121,60,1.19,0.0,4.04,0.28,0.69,0.0,3.2,-0.0406,-0.2448,0.0089,0.0,0.0,0.0,0.0022,-0.0096,0.0194,7172.02 +122,60,1.22,0.0,4.04,0.26,0.69,0.0,3.4,-0.0387,-0.2254,0.0074,0.0,0.0,0.0,0.0019,-0.0098,0.0292,7232.13 +123,60,1.24,0.0,4.04,0.24,0.76,0.0,3.54,-0.0365,-0.2058,0.0069,0.0,0.0,0.0,0.0022,-0.0101,0.0196,7291.7 +124,60,1.33,0.0,5.0,0.22,0.88,0.0,4.8,-0.0341,-0.1863,0.0159,0.0,0.0,0.0,0.0024,-0.0101,0.0195,7351.95 +125,59,1.35,0.0,5.0,0.22,0.92,0.0,5.22,-0.0329,-0.167,0.0231,0.0,0.0,0.0,0.0017,-0.0124,0.0236,7412.1 +126,60,1.22,0.0,5.0,0.24,0.79,0.0,5.18,-0.0326,-0.1478,0.0189,0.0,0.0,0.0,-0.0002,-0.0112,0.0192,7471.83 +127,59,1.25,0.0,5.05,0.24,0.8,0.0,5.45,-0.0315,-0.1184,0.0224,0.0,-0.0,-0.0,0.0016,-0.0202,0.0294,7531.71 +128,60,1.23,0.0,5.05,0.3,0.78,0.0,5.09,-0.03,-0.1151,0.0124,0.0,0.0,0.0,0.0011,-0.0146,0.0235,7592.18 +129,60,1.17,0.0,4.08,0.31,0.69,0.0,4.05,-0.0292,-0.1159,0.0061,0.0,0.0,0.0,0.0008,-0.0128,0.0197,7651.43 +130,60,1.13,0.0,4.08,0.31,0.71,0.0,4.06,-0.0278,-0.1166,0.0077,0.0,-0.0,-0.0,0.0014,-0.0097,0.0201,7711.56 +131,60,1.12,0.0,4.08,0.25,0.76,0.0,3.99,-0.0267,-0.1173,0.0062,0.0,-0.0,-0.0,0.0011,-0.0108,0.0259,7771.96 +132,59,1.03,0.0,5.05,0.25,0.69,0.0,5.22,-0.0266,-0.118,0.015,0.0,-0.0,-0.0,-0.0003,-0.0113,0.0145,7831.9 +133,60,1.04,0.0,5.0,0.16,0.75,0.0,5.16,-0.0263,-0.1185,0.0126,0.0,0.0,0.0,0.0008,-0.0093,0.0123,7892.09 +134,60,0.91,0.0,4.08,0.16,0.57,0.0,3.95,-0.0275,-0.1191,0.0097,0.0,0.0,0.0,-0.0012,-0.0118,0.0107,7950.4 +135,60,0.89,0.0,3.06,0.16,0.56,0.0,3.12,-0.027,-0.1196,0.0077,0.0,-0.0,-0.0,0.0004,-0.0108,0.0127,8011.76 +136,60,0.89,0.0,3.06,0.16,0.57,0.0,3.12,-0.0264,-0.12,0.0064,0.0,-0.0,-0.0,0.0006,-0.0096,0.014,8072.28 +137,60,0.91,0.0,4.0,0.17,0.6,0.0,4.25,-0.0258,-0.1205,0.0147,0.0,-0.0,-0.0,0.0007,-0.0203,0.0229,8130.37 +138,60,0.93,0.0,5.0,0.17,0.62,0.0,5.02,-0.0251,-0.1209,0.0158,0.0,-0.0,-0.0,0.0007,-0.0124,0.0159,8192.01 +139,60,0.94,0.0,4.04,0.17,0.66,0.0,3.81,-0.0244,-0.1212,0.0121,0.0,0.0,0.0,0.0007,-0.0127,0.0193,8252.29 +140,60,1.02,0.0,4.04,0.17,0.74,0.0,3.77,-0.0233,-0.1227,0.0144,0.0,-0.0,-0.0,0.0012,-0.01,0.0129,8310.88 diff --git a/experiments/results/csv/sudden_error_spike_20_adaptive_time_analysis.csv b/experiments/results/csv/sudden_error_spike_20_adaptive_time_analysis.csv new file mode 100644 index 000000000..7f161417d --- /dev/null +++ b/experiments/results/csv/sudden_error_spike_20_adaptive_time_analysis.csv @@ -0,0 +1,8 @@ +Time Range,Total Requests,Success,Errors,Error %,Rejected,Rejected %,Target Error Rate % +0-20s,11295,11174,115,1.02,6,0.05,1.0 +20-40s,11542,11419,123,1.07,0,0.0,1.0 +40-60s,11667,11544,120,1.03,3,0.03,1.0 +60-80s,15230,10010,2516,16.52,2704,17.75,20.0 +80-100s,12497,11517,119,0.95,861,6.89,1.0 +100-120s,11724,11546,130,1.11,48,0.41,1.0 +120-140s,11683,11479,126,1.08,78,0.67,1.0 diff --git a/experiments/results/csv/sudden_error_spike_20_time_analysis.csv b/experiments/results/csv/sudden_error_spike_20_time_analysis.csv new file mode 100644 index 000000000..80d952898 --- /dev/null +++ b/experiments/results/csv/sudden_error_spike_20_time_analysis.csv @@ -0,0 +1,8 @@ +Time Range,Total Requests,Success,Errors,Error %,Rejected,Rejected %,Target Error Rate % +0-20s,7862,7775,87,1.11,0,0.0,1.0 +20-40s,7997,7929,68,0.85,0,0.0,1.0 +40-60s,7963,7872,91,1.14,0,0.0,1.0 +60-80s,15045,2650,675,4.49,11720,77.9,20.0 +80-100s,14953,5463,56,0.37,9434,63.09,1.0 +100-120s,8176,7988,66,0.81,122,1.49,1.0 +120-140s,7994,7907,87,1.09,0,0.0,1.0 diff --git a/experiments/results/csv/sudden_error_spikes_adaptive_pid_controller.csv b/experiments/results/csv/sudden_error_spikes_adaptive_pid_controller.csv new file mode 100644 index 000000000..45fea04ad --- /dev/null +++ b/experiments/results/csv/sudden_error_spikes_adaptive_pid_controller.csv @@ -0,0 +1,302 @@ +Window,Thread Count,Error Rate Avg,Error Rate Min,Error Rate Max,Ideal Error Rate,Rejection Rate Avg,Rejection Rate Min,Rejection Rate Max,Integral Avg,Integral Min,Integral Max,Derivative Avg,Derivative Min,Derivative Max,P Value Avg,P Value Min,P Value Max,Total Request Time +1,60,0.37,0.0,11.11,4.61,0.24,0.0,7.33,-0.0425,-0.0461,0.0611,0.0,-0.0,-0.0,-0.0425,-0.0461,0.0611,54.22 +2,58,0.81,0.0,12.5,4.25,0.32,0.0,8.55,-0.0798,-0.0886,0.0328,0.0,0.0,0.0,-0.0374,-0.0705,0.0789,113.78 +3,59,1.1,0.0,8.33,4.25,0.16,0.0,3.12,-0.111,-0.1278,-0.0125,0.0,0.0,0.0,-0.0325,-0.0752,0.0408,175.13 +4,59,1.22,0.0,7.14,3.92,0.08,0.0,1.98,-0.1379,-0.1639,-0.0213,0.0,0.0,0.0,-0.0275,-0.0392,0.0207,231.78 +5,56,1.16,0.0,6.25,3.92,0.04,0.0,1.26,-0.1612,-0.1972,-0.0209,0.0,0.0,0.0,-0.0253,-0.0361,0.0063,291.14 +6,58,0.92,0.0,5.56,3.33,0.01,0.0,0.49,-0.1854,-0.228,-0.0239,0.0,0.0,0.0,-0.0253,-0.0333,0.0033,351.8 +7,57,0.93,0.0,5.0,3.07,0.0,0.0,0.0,-0.2095,-0.2563,-0.0248,0.0,0.0,0.0,-0.0229,-0.0307,0.0137,411.54 +8,60,0.9,0.0,4.88,2.83,0.0,0.0,0.0,-0.2289,-0.2824,-0.022,0.0,0.0,0.0,-0.0214,-0.0283,0.007,471.07 +9,16,0.6,0.0,4.65,4.26,0.0,0.0,0.0,-0.2579,-0.3065,-0.0982,0.0,-0.0,-0.0,-0.0222,-0.0261,0.0085,530.05 +10,59,1.05,0.0,6.0,2.53,0.02,0.0,1.24,-0.2515,-0.3287,-0.0243,0.0,0.0,0.0,-0.0179,-0.0241,0.0173,590.05 +11,60,1.01,0.0,5.17,4.48,0.01,0.0,0.36,-0.2695,-0.3491,-0.0277,0.0,-0.0,-0.0,-0.0171,-0.0238,0.0015,650.57 +12,60,1.02,0.0,4.69,2.05,0.0,0.0,0.0,-0.285,-0.368,-0.0271,0.0,0.0,0.0,-0.0155,-0.035,0.0216,714.14 +13,60,0.94,0.0,4.76,1.89,0.0,0.0,0.04,-0.2998,-0.3854,-0.0222,0.0,0.0,0.0,-0.0148,-0.0342,0.0209,774.29 +14,60,0.96,0.0,6.45,1.74,0.0,0.0,0.0,-0.3132,-0.4014,-0.0308,0.0,0.0,0.0,-0.0134,-0.0316,0.0399,833.61 +15,60,1.06,0.0,8.06,1.74,0.04,0.0,2.33,-0.3246,-0.4162,-0.0383,0.0,0.0,0.0,-0.0114,-0.0373,0.0559,890.85 +16,60,1.19,0.0,7.58,1.74,0.04,0.0,2.53,-0.334,-0.4298,-0.0447,0.0,0.0,0.0,-0.0094,-0.0344,0.0289,951.14 +17,59,1.13,0.0,7.58,1.59,0.05,0.0,3.06,-0.3452,-0.4424,-0.0501,0.0,0.0,0.0,-0.0091,-0.0317,0.0269,1013.42 +18,60,1.08,0.0,8.45,3.2,0.08,0.0,4.6,-0.352,-0.454,-0.0581,0.0,0.0,0.0,-0.009,-0.0292,0.0307,1074.38 +19,60,1.11,0.0,8.96,3.2,0.09,0.0,5.63,-0.36,-0.4647,-0.0554,0.0,0.0,0.0,-0.0081,-0.028,0.0224,1134.28 +20,60,1.05,0.0,7.94,3.09,0.08,0.0,4.63,-0.3681,-0.4746,-0.0545,0.0,-0.0,-0.0,-0.0081,-0.0259,0.0229,1192.77 +21,60,1.13,0.0,7.81,2.98,0.08,0.0,4.62,-0.3745,-0.4836,-0.0455,0.0,0.0,0.0,-0.0064,-0.0238,0.03,1252.7 +22,60,1.0,0.0,4.84,2.89,0.01,0.0,0.87,-0.3814,-0.492,-0.0692,0.0,0.0,0.0,-0.007,-0.0326,0.0275,1311.94 +23,60,1.04,0.0,4.92,2.79,0.02,0.0,0.96,-0.3867,-0.4997,-0.0569,0.0,-0.0,-0.0,-0.0053,-0.0301,0.0283,1372.58 +24,60,1.06,0.0,4.92,2.71,0.0,0.0,0.0,-0.3912,-0.5069,-0.0624,0.0,0.0,0.0,-0.0044,-0.0278,0.0282,1430.92 +25,60,0.95,0.0,4.92,2.5,0.0,0.0,0.0,-0.3958,-0.5134,-0.0712,0.0,-0.0,-0.0,-0.0047,-0.0256,0.0353,1492.49 +26,60,0.92,0.0,5.0,2.31,0.0,0.0,0.0,-0.4002,-0.5195,-0.0777,0.0,0.0,0.0,-0.0043,-0.0236,0.0361,1552.44 +27,60,0.97,0.0,4.84,2.13,0.0,0.0,0.0,-0.4035,-0.5195,-0.0999,0.0,0.0,0.0,-0.0033,-0.0222,0.0344,1613.79 +28,59,1.04,0.0,4.41,1.96,0.0,0.0,0.0,-0.4039,-0.5251,-0.1204,0.0,0.0,0.0,-0.0022,-0.0205,0.0265,1672.3 +29,60,0.93,0.0,4.41,0.61,0.0,0.0,0.0,-0.4082,-0.5302,-0.1157,0.0,0.0,0.0,-0.0026,-0.0248,0.0265,1733.8 +30,60,0.95,0.0,5.17,0.61,0.0,0.0,0.0,-0.4102,-0.5349,-0.1074,0.0,-0.0,-0.0,-0.0019,-0.0229,0.043,1792.52 +31,60,0.95,0.0,5.17,0.61,0.0,0.0,0.0,-0.4117,-0.5393,-0.1269,0.0,-0.0,-0.0,-0.0016,-0.0195,0.0429,1850.42 +32,60,1.08,0.0,5.17,0.62,0.0,0.0,0.16,-0.4115,-0.5434,-0.1449,0.0,-0.0,-0.0,0.0002,-0.018,0.0429,1909.88 +33,60,1.1,0.0,5.17,0.62,0.02,0.0,0.99,-0.4109,-0.5471,-0.1515,0.0,-0.0,-0.0,0.0007,-0.0166,0.0412,1972.28 +34,60,0.95,0.0,3.51,0.62,0.0,0.0,0.0,-0.4115,-0.5505,-0.1512,0.0,-0.0,-0.0,-0.0006,-0.0153,0.0306,2032.54 +35,60,0.94,0.0,3.45,0.62,0.0,0.0,0.0,-0.4117,-0.5537,-0.1515,0.0,-0.0,-0.0,-0.0002,-0.0208,0.03,2092.06 +36,60,1.05,0.0,4.41,0.62,0.0,0.0,0.0,-0.4105,-0.5566,-0.1473,0.0,0.0,0.0,0.0012,-0.0192,0.0378,2150.4 +37,60,1.06,0.0,4.35,0.62,0.0,0.0,0.0,-0.4088,-0.5593,-0.1391,0.0,-0.0,-0.0,0.0017,-0.0177,0.0371,2213.0 +38,60,0.98,0.0,4.35,0.57,0.0,0.0,0.0,-0.4076,-0.5617,-0.1325,0.0,-0.0,-0.0,0.0012,-0.0163,0.0388,2272.28 +39,60,1.07,0.0,4.84,0.53,0.0,0.0,0.07,-0.4053,-0.564,-0.1098,0.0,0.0,0.0,0.0023,-0.015,0.0436,2330.74 +40,60,1.05,0.0,5.88,0.49,0.01,0.0,0.48,-0.4028,-0.5661,-0.1044,0.0,0.0,0.0,0.0024,-0.0139,0.0539,2391.19 +41,60,1.16,0.0,6.06,0.45,0.03,0.0,1.7,-0.3991,-0.5681,-0.0845,0.0,0.0,0.0,0.0037,-0.0137,0.0511,2451.73 +42,60,1.09,0.0,6.12,0.45,0.01,0.0,0.64,-0.3961,-0.5699,-0.0676,0.0,0.0,0.0,0.0031,-0.0144,0.0549,2513.21 +43,60,1.11,0.0,6.12,0.45,0.02,0.0,0.91,-0.3923,-0.5715,-0.054,0.0,-0.0,-0.0,0.0037,-0.0135,0.0548,2572.79 +44,60,1.13,0.0,4.55,0.45,0.02,0.0,0.9,-0.3882,-0.573,-0.0452,0.0,0.0,0.0,0.0041,-0.0123,0.0428,2633.46 +45,60,1.21,0.0,4.29,0.46,0.03,0.0,1.12,-0.3832,-0.5587,-0.0358,0.0,-0.0,-0.0,0.005,-0.0113,0.0401,2690.21 +46,60,1.07,0.0,5.0,0.46,0.08,0.0,3.14,-0.3793,-0.5444,-0.013,0.0,0.0,0.0,0.0038,-0.0104,0.0389,2752.06 +47,60,1.13,0.0,4.76,0.46,0.1,0.0,3.85,-0.3751,-0.5299,-0.0049,0.0,0.0,0.0,0.0042,-0.0124,0.04,2813.04 +48,60,1.1,0.0,3.95,0.46,0.05,0.0,2.49,-0.3714,-0.5288,-0.0154,0.0,-0.0,-0.0,0.0038,-0.0105,0.0365,2872.32 +49,60,1.18,0.0,4.0,0.46,0.11,0.0,2.67,-0.3661,-0.5229,-0.0113,0.0,0.0,0.0,0.0053,-0.0082,0.0324,2934.61 +50,60,1.26,0.0,5.26,0.47,0.08,0.0,2.9,-0.3604,-0.5208,-0.0075,0.0,0.0,0.0,0.0056,-0.012,0.0458,2990.37 +51,60,1.05,0.0,5.0,0.47,0.03,0.0,1.03,-0.3565,-0.5261,-0.0218,0.0,0.0,0.0,0.004,-0.0177,0.0431,3050.38 +52,60,1.03,0.0,4.62,0.43,0.03,0.0,0.96,-0.352,-0.5309,-0.0194,0.0,-0.0,-0.0,0.0045,-0.0164,0.0392,3113.67 +53,60,0.95,0.0,4.35,0.4,0.03,0.0,1.16,-0.3481,-0.5353,-0.0139,0.0,0.0,0.0,0.0039,-0.0151,0.0404,3176.03 +54,60,0.96,0.0,3.85,0.37,0.04,0.0,1.44,-0.3439,-0.5394,-0.0093,0.0,0.0,0.0,0.0042,-0.0139,0.0328,3232.71 +55,60,0.83,0.0,4.0,0.34,0.04,0.0,1.26,-0.3409,-0.5432,-0.0093,0.0,0.0,0.0,0.003,-0.0128,0.0343,3293.4 +56,60,0.84,0.0,4.94,0.31,0.04,0.0,1.33,-0.3376,-0.5467,-0.011,0.0,0.0,0.0,0.0033,-0.0215,0.0436,3353.77 +57,60,1.04,0.0,6.1,0.31,0.1,0.0,2.59,-0.332,-0.5499,-0.0092,0.0,0.0,0.0,0.0056,-0.0109,0.0514,3412.36 +58,60,1.08,0.0,6.1,0.32,0.16,0.0,3.32,-0.3265,-0.5529,-0.007,0.0,0.0,0.0,0.0055,-0.0101,0.0408,3471.38 +59,60,1.04,0.0,4.35,0.32,0.11,0.0,3.18,-0.3217,-0.55,-0.0168,0.0,0.0,0.0,0.0047,-0.0193,0.0419,3534.53 +60,60,0.97,0.0,4.29,0.32,0.12,0.0,3.42,-0.3171,-0.5528,-0.013,0.0,0.0,0.0,0.0047,-0.0143,0.0406,3593.47 +61,60,2.36,0.0,9.09,0.33,0.41,0.0,4.68,-0.2985,-0.5396,-0.0121,0.0,0.0,0.0,0.0185,-0.0056,0.0882,3650.62 +62,60,4.46,0.0,13.11,0.33,1.34,0.0,9.3,-0.2618,-0.4861,0.0435,0.0,0.0,0.0,0.0368,-0.0051,0.1037,3712.52 +63,60,6.65,0.0,15.0,0.35,3.33,0.0,17.05,-0.2114,-0.4573,0.0822,0.0,0.0,0.0,0.0503,-0.0069,0.1066,3771.93 +64,60,8.67,1.41,18.0,0.35,6.06,0.0,22.18,-0.1584,-0.4463,0.1112,0.0,0.0,0.0,0.0531,-0.0022,0.1459,3831.27 +65,60,10.14,1.96,19.05,0.35,8.46,0.0,24.7,-0.1142,-0.4073,0.1137,0.0,-0.0,-0.0,0.0442,-0.0024,0.1007,3894.16 +66,60,12.01,1.89,22.95,0.35,11.47,0.0,30.64,-0.071,-0.3671,0.1443,0.0,-0.0,-0.0,0.0432,-0.0073,0.0967,3951.94 +67,60,13.57,1.82,22.39,0.35,14.22,0.0,28.43,-0.0365,-0.3243,0.1227,0.0,-0.0,-0.0,0.0345,-0.0425,0.108,4012.06 +68,60,15.59,3.77,24.53,0.35,17.55,2.76,32.13,-0.0027,-0.2456,0.1444,0.0,0.0,0.0,0.0338,-0.021,0.1097,4073.88 +69,60,17.51,5.45,25.42,0.35,20.9,4.2,34.72,0.0257,-0.1943,0.1497,0.0,-0.0,-0.0,0.0283,-0.0136,0.1076,4132.81 +70,60,19.4,7.84,29.07,0.35,24.25,7.2,40.53,0.0493,-0.1332,0.2096,0.0,0.0,0.0,0.0237,-0.0208,0.0988,4194.88 +71,60,20.2,6.67,32.18,0.35,26.02,5.54,49.8,0.0558,-0.0844,0.2518,0.0,-0.0,-0.0,0.0065,-0.0949,0.0797,4252.35 +72,60,20.41,6.67,29.21,0.35,26.59,5.72,46.99,0.0513,-0.0645,0.1865,0.0,0.0,0.0,-0.0046,-0.0654,0.0607,4314.86 +73,60,20.39,6.52,30.26,0.35,26.55,5.55,44.97,0.0424,-0.0737,0.1638,0.0,-0.0,-0.0,-0.0089,-0.0871,0.0446,4369.79 +74,60,20.21,6.9,28.79,0.35,26.1,7.12,43.01,0.0315,-0.0872,0.1603,0.0,-0.0,-0.0,-0.0109,-0.1034,0.0758,4433.02 +75,60,20.89,7.14,30.14,0.35,26.85,7.36,45.11,0.0326,-0.0546,0.146,0.0,0.0,0.0,0.0011,-0.0851,0.0517,4493.57 +76,60,21.18,10.17,30.38,0.35,27.36,10.33,44.02,0.0314,-0.0935,0.1564,0.0,0.0,0.0,-0.0012,-0.0847,0.0837,4551.04 +77,60,20.76,7.14,29.49,0.35,26.74,5.84,43.9,0.021,-0.0912,0.136,0.0,-0.0,-0.0,-0.0104,-0.0653,0.0449,4611.08 +78,60,20.5,2.44,29.17,0.35,26.13,0.0,43.27,0.0124,-0.1259,0.1226,0.0,-0.0,-0.0,-0.0086,-0.0656,0.0574,4671.78 +79,60,20.25,2.33,29.17,0.35,25.55,0.03,42.73,0.0055,-0.1047,0.1177,0.0,0.0,0.0,-0.0069,-0.0783,0.0555,4731.73 +80,60,20.16,9.26,27.94,0.35,25.17,8.75,39.61,0.0014,-0.1175,0.0967,0.0,-0.0,-0.0,-0.0041,-0.0883,0.0902,4792.91 +81,60,19.01,10.42,26.32,0.35,23.26,9.47,35.92,-0.0147,-0.1482,0.0848,0.0,0.0,0.0,-0.0161,-0.1268,0.0403,4851.26 +82,60,16.82,7.14,25.0,0.35,19.62,5.48,33.59,-0.0426,-0.1862,0.0732,0.0,-0.0,-0.0,-0.0279,-0.0858,0.0118,4912.89 +83,60,14.86,6.12,22.86,0.35,16.2,3.64,28.85,-0.064,-0.2035,0.0592,0.0,-0.0,-0.0,-0.0214,-0.1407,0.0246,4971.16 +84,60,13.54,5.88,21.25,0.36,14.02,3.37,25.64,-0.0716,-0.1645,0.0106,0.0,0.0,0.0,-0.0075,-0.0644,0.0391,5033.41 +85,60,11.35,3.85,20.55,0.37,10.92,0.59,24.34,-0.0854,-0.1775,-0.0046,0.0,-0.0,-0.0,-0.0139,-0.075,0.0257,5093.8 +86,60,8.99,1.92,17.81,0.38,7.67,0.0,20.0,-0.0983,-0.1646,-0.0193,0.0,-0.0,-0.0,-0.0129,-0.0564,0.0267,5150.77 +87,60,7.39,1.79,13.85,0.39,5.7,0.0,14.42,-0.099,-0.1691,-0.026,0.0,0.0,0.0,-0.0007,-0.0432,0.026,5210.23 +88,60,5.66,0.0,12.12,0.4,3.79,0.0,11.43,-0.1001,-0.1833,-0.0157,0.0,-0.0,-0.0,-0.0011,-0.0481,0.0273,5272.76 +89,60,3.92,0.0,10.0,0.4,2.14,0.0,8.65,-0.1014,-0.1767,-0.0189,0.0,-0.0,-0.0,-0.0013,-0.0721,0.0359,5331.02 +90,60,1.73,0.0,7.25,0.4,0.43,0.0,4.91,-0.1096,-0.1804,-0.0542,0.0,0.0,0.0,-0.0082,-0.0663,0.0231,5394.35 +91,60,0.9,0.0,4.23,0.37,0.17,0.0,1.71,-0.1092,-0.1838,-0.0448,0.0,-0.0,-0.0,0.0004,-0.0414,0.034,5453.19 +92,60,1.07,0.0,4.26,0.34,0.22,0.0,2.72,-0.1044,-0.1894,-0.0342,0.0,0.0,0.0,0.0047,-0.007,0.0334,5513.08 +93,60,1.09,0.0,4.62,0.31,0.34,0.0,3.13,-0.0998,-0.1959,-0.0273,0.0,0.0,0.0,0.0046,-0.0091,0.0353,5570.95 +94,60,1.01,0.0,5.0,0.29,0.35,0.0,3.65,-0.097,-0.2019,-0.0222,0.0,0.0,0.0,0.0029,-0.0089,0.0174,5630.87 +95,60,0.96,0.0,4.44,0.27,0.31,0.0,3.63,-0.0945,-0.1949,-0.0192,0.0,0.0,0.0,0.0024,-0.0107,0.0204,5690.92 +96,60,0.79,0.0,3.85,0.25,0.3,0.0,3.01,-0.0933,-0.1971,-0.0154,0.0,0.0,0.0,0.0012,-0.0106,0.0142,5749.45 +97,60,0.83,0.0,3.77,0.23,0.32,0.0,3.01,-0.0915,-0.1992,-0.0127,0.0,0.0,0.0,0.0018,-0.0101,0.0244,5812.33 +98,60,0.84,0.0,3.77,0.21,0.41,0.0,3.11,-0.0897,-0.2011,-0.0085,0.0,0.0,0.0,0.0018,-0.0136,0.0232,5871.31 +99,60,0.89,0.0,3.45,0.19,0.42,0.0,2.76,-0.0881,-0.2029,0.0032,0.0,0.0,0.0,0.0016,-0.016,0.0249,5932.3 +100,60,0.9,0.0,4.0,0.18,0.48,0.0,3.47,-0.0865,-0.2046,0.0016,0.0,0.0,0.0,0.0016,-0.0106,0.0189,5992.06 +101,60,0.89,0.0,4.29,0.16,0.43,0.0,3.91,-0.0854,-0.2061,-0.0019,0.0,0.0,0.0,0.0012,-0.0165,0.0176,6053.26 +102,60,0.88,0.0,4.69,0.17,0.38,0.0,4.43,-0.0838,-0.2074,0.0028,0.0,0.0,0.0,0.0016,-0.0152,0.0213,6110.26 +103,60,0.84,0.0,3.39,0.17,0.35,0.0,2.96,-0.0819,-0.2087,-0.0056,0.0,-0.0,-0.0,0.0018,-0.0167,0.0188,6171.56 +104,60,0.82,0.0,3.39,0.17,0.34,0.0,2.8,-0.08,-0.2099,-0.004,0.0,-0.0,-0.0,0.0019,-0.0157,0.0157,6231.45 +105,60,0.86,0.0,3.45,0.17,0.39,0.0,2.91,-0.0775,-0.211,-0.0045,0.0,-0.0,-0.0,0.0025,-0.0138,0.0184,6289.29 +106,60,0.94,0.0,3.51,0.18,0.47,0.0,2.75,-0.0745,-0.212,-0.0032,0.0,-0.0,-0.0,0.003,-0.0052,0.025,6349.85 +107,60,0.91,0.0,3.85,0.18,0.51,0.0,3.63,-0.0726,-0.2129,0.013,0.0,0.0,0.0,0.0019,-0.0156,0.0226,6409.54 +108,60,0.9,0.0,4.08,0.19,0.53,0.0,3.96,-0.0711,-0.2138,0.0136,0.0,-0.0,-0.0,0.0015,-0.0176,0.0321,6469.91 +109,60,0.94,0.0,5.08,0.19,0.54,0.0,4.83,-0.0692,-0.2146,0.0086,0.0,-0.0,-0.0,0.0019,-0.0234,0.0258,6533.1 +110,60,1.0,0.0,5.66,0.2,0.61,0.0,5.73,-0.0668,-0.2153,0.009,0.0,0.0,0.0,0.0024,-0.0171,0.0236,6592.41 +111,60,0.95,0.0,6.0,0.2,0.63,0.0,6.22,-0.0656,-0.216,0.0081,0.0,-0.0,-0.0,0.0013,-0.0146,0.0161,6649.43 +112,60,0.87,0.0,6.12,0.2,0.55,0.0,6.39,-0.0651,-0.2166,0.0034,0.0,-0.0,-0.0,0.0004,-0.0212,0.0175,6711.87 +113,60,0.98,0.0,6.25,0.21,0.6,0.0,6.54,-0.0628,-0.2171,0.0065,0.0,0.0,0.0,0.0023,-0.0151,0.0284,6771.65 +114,60,1.02,0.0,6.25,0.21,0.6,0.0,6.52,-0.0606,-0.2177,0.0042,0.0,0.0,0.0,0.0023,-0.0145,0.0288,6833.6 +115,60,0.97,0.0,6.82,0.21,0.62,0.0,7.22,-0.0587,-0.2182,0.0082,0.0,-0.0,-0.0,0.0019,-0.0176,0.0256,6891.78 +116,60,1.07,0.0,9.09,0.21,0.73,0.0,10.15,-0.0559,-0.2186,0.0312,0.0,0.0,0.0,0.0028,-0.017,0.0351,6952.57 +117,60,1.08,0.0,6.12,0.2,0.73,0.0,6.4,-0.0542,-0.219,0.0091,0.0,-0.0,-0.0,0.0018,-0.0364,0.0337,7010.2 +118,60,1.13,0.0,4.35,0.18,0.74,0.0,3.65,-0.0519,-0.2194,0.0103,0.0,0.0,0.0,0.0023,-0.022,0.0299,7071.89 +119,60,1.11,0.0,4.29,0.17,0.77,0.0,3.58,-0.0498,-0.2197,0.0115,0.0,0.0,0.0,0.0021,-0.0177,0.0291,7129.76 +120,60,1.07,0.0,4.29,0.15,0.75,0.0,3.72,-0.0483,-0.2201,0.0082,0.0,0.0,0.0,0.0015,-0.0178,0.0171,7194.73 +121,60,1.13,0.0,4.55,0.14,0.85,0.0,4.36,-0.0461,-0.2204,0.0057,0.0,0.0,0.0,0.0022,-0.0175,0.0285,7252.47 +122,60,1.18,0.0,4.76,0.13,0.97,0.0,4.52,-0.0443,-0.2206,0.0141,0.0,0.0,0.0,0.0018,-0.0169,0.0184,7307.83 +123,60,1.15,0.0,4.62,0.12,0.92,0.0,4.57,-0.044,-0.2209,0.0154,0.0,0.0,0.0,0.0004,-0.0185,0.0171,7373.91 +124,60,1.2,0.0,6.06,0.11,0.95,0.0,6.43,-0.0426,-0.2211,0.0183,0.0,0.0,0.0,0.0014,-0.0145,0.0191,7428.16 +125,60,1.36,0.0,6.15,0.1,1.09,0.0,6.6,-0.0398,-0.2213,0.018,0.0,0.0,0.0,0.0028,-0.0166,0.03,7492.89 +126,60,1.31,0.0,4.62,0.09,1.06,0.0,4.56,-0.039,-0.2215,0.016,0.0,0.0,0.0,0.0009,-0.0197,0.019,7551.84 +127,60,1.34,0.0,4.62,0.09,1.11,0.0,4.7,-0.0374,-0.2217,0.0205,0.0,0.0,0.0,0.0016,-0.0182,0.0275,7612.23 +128,60,1.33,0.0,4.62,0.08,1.12,0.0,4.77,-0.0363,-0.2219,0.017,0.0,0.0,0.0,0.001,-0.0213,0.0336,7670.85 +129,60,1.38,0.0,4.76,0.07,1.15,0.0,4.81,-0.0349,-0.222,0.0135,0.0,0.0,0.0,0.0014,-0.0307,0.0409,7732.6 +130,60,1.38,0.0,4.62,0.08,1.18,0.0,4.47,-0.0339,-0.2222,0.0102,0.0,0.0,0.0,0.0011,-0.0174,0.0282,7791.09 +131,60,1.42,0.0,4.92,0.08,1.23,0.0,5.05,-0.0325,-0.2223,0.0198,0.0,-0.0,-0.0,0.0013,-0.0184,0.0231,7851.03 +132,60,1.34,0.0,4.62,0.08,1.19,0.0,4.54,-0.0325,-0.2224,0.0085,0.0,-0.0,-0.0,0.0,-0.0284,0.0189,7910.41 +133,60,1.36,0.0,6.35,0.08,1.19,0.0,5.89,-0.0318,-0.2062,0.012,0.0,-0.0,-0.0,0.0007,-0.0186,0.0309,7972.03 +134,60,1.26,0.0,6.67,0.08,1.08,0.0,6.58,-0.0321,-0.1905,0.01,0.0,-0.0,-0.0,-0.0003,-0.0221,0.0157,8032.72 +135,60,1.19,0.0,6.45,0.09,1.01,0.0,6.42,-0.0321,-0.1847,0.0203,0.0,-0.0,-0.0,0.0,-0.0355,0.0301,8092.18 +136,60,1.15,0.0,6.56,0.09,1.01,0.0,6.59,-0.0317,-0.1848,0.0223,0.0,0.0,0.0,0.0004,-0.0166,0.0458,8153.07 +137,60,0.99,0.0,5.66,0.09,0.85,0.0,6.05,-0.0328,-0.1849,0.019,0.0,-0.0,-0.0,-0.0011,-0.0342,0.0246,8210.55 +138,60,0.97,0.0,7.41,0.1,0.85,0.0,8.19,-0.0326,-0.185,0.0337,0.0,0.0,0.0,0.0002,-0.0274,0.0175,8274.7 +139,60,0.91,0.0,7.84,0.1,0.81,0.0,8.79,-0.033,-0.1851,0.033,0.0,-0.0,-0.0,-0.0004,-0.0163,0.0194,8333.49 +140,60,0.9,0.0,8.16,0.1,0.82,0.0,9.11,-0.0329,-0.1851,0.0302,0.0,-0.0,-0.0,0.0001,-0.0171,0.018,8393.49 +141,60,7.93,0.0,16.67,0.11,8.66,0.0,19.79,0.0377,-0.1053,0.1385,0.0,0.0,0.0,0.0706,-0.0009,0.1526,8452.26 +142,60,16.1,1.72,34.38,0.11,20.1,1.31,47.84,0.1267,-0.0231,0.3492,0.0,0.0,0.0,0.089,0.0073,0.2416,8513.12 +143,60,23.66,11.54,41.67,0.11,33.0,13.54,70.86,0.2131,0.0458,0.4828,0.0,-0.0,-0.0,0.0864,0.0055,0.1739,8572.87 +144,60,29.82,13.92,44.83,0.11,45.74,17.09,83.78,0.2837,0.0677,0.51,0.0,0.0,0.0,0.0706,-0.0282,0.169,8636.18 +145,60,35.63,15.0,53.42,0.11,59.2,18.92,100.0,0.3508,0.0717,0.6491,0.0,-0.0,-0.0,0.0671,-0.0046,0.1903,8686.09 +146,60,39.62,23.46,58.02,0.11,70.45,31.03,100.0,0.3955,0.1607,0.7691,0.0,-0.0,-0.0,0.0446,-0.0309,0.1587,8710.09 +147,60,43.93,26.39,60.0,0.11,82.55,38.39,100.0,0.4448,0.1953,0.9572,0.0,0.0,0.0,0.0493,-0.017,0.1946,8728.6 +148,60,48.05,28.57,62.67,0.11,92.1,43.57,100.0,0.5008,0.2058,1.2088,0.0,0.0,0.0,0.056,-0.0327,0.2516,8741.49 +149,60,52.42,32.81,63.93,0.11,97.31,51.82,100.0,0.5895,0.2403,1.4773,0.0,0.0,0.0,0.0887,-0.0246,0.2733,8745.87 +150,60,57.33,37.5,75.0,0.11,99.07,62.64,100.0,0.7481,0.2904,1.9339,0.0,0.0,0.0,0.1586,-0.004,0.4946,8747.63 +151,60,58.65,37.5,73.81,0.11,99.37,66.34,100.0,0.924,0.2728,2.4048,0.0,0.0,0.0,0.1759,-0.0679,0.4708,8747.88 +152,60,58.78,37.74,74.47,0.11,99.2,67.38,100.0,1.1011,0.1375,2.7327,0.0,-0.0,-0.0,0.177,-0.1745,0.4879,8748.09 +153,60,58.03,37.93,78.57,0.11,98.81,69.76,100.0,1.2639,-0.0104,3.0607,0.0,-0.0,-0.0,0.1628,-0.226,0.5699,8749.02 +154,60,58.32,28.57,86.96,0.11,98.05,76.6,100.0,1.434,0.2105,3.5847,0.0,-0.0,-0.0,0.1701,-0.4295,0.7369,8750.02 +155,60,55.65,0.0,87.5,0.11,93.15,24.88,100.0,1.5559,-0.0138,3.847,0.0,0.0,0.0,0.122,-1.005,0.7472,8750.98 +156,60,64.42,0.0,100.0,0.11,94.98,8.97,100.0,1.8676,-0.0385,4.7088,0.0,0.0,0.0,0.3117,-1.0064,0.9992,8754.6 +157,60,57.14,0.0,100.0,0.1,84.66,2.89,100.0,2.0308,-0.0221,5.7073,0.0,-0.0,-0.0,0.1632,-1.0064,0.9993,8758.65 +158,60,48.66,0.0,100.0,0.1,84.75,17.5,100.0,2.0701,0.0279,5.5175,0.0,0.0,0.0,0.0393,-1.0059,0.9998,8765.11 +159,59,50.48,0.0,100.0,0.1,87.24,8.28,100.0,2.1731,-0.0215,5.7046,0.0,-0.0,-0.0,0.0855,-1.0039,0.9996,8773.67 +160,60,59.89,0.0,100.0,0.06,95.14,19.41,100.0,2.4166,0.184,6.7032,0.0,0.0,0.0,0.2624,-1.0006,0.9995,8780.22 +161,60,56.96,0.0,100.0,0.06,94.5,20.57,100.0,2.5863,0.2107,7.7018,0.0,-0.0,-0.0,0.1697,-1.0043,0.9995,8783.28 +162,60,56.42,0.0,100.0,0.05,92.78,16.49,100.0,2.7607,0.1886,8.7004,0.0,0.0,0.0,0.1744,-0.5006,0.9995,8786.05 +163,60,54.94,0.0,100.0,0.05,89.63,13.19,100.0,2.9212,0.0148,9.699,0.0,0.0,0.0,0.1605,-1.0012,0.9995,8789.64 +164,60,54.58,0.0,100.0,0.05,87.9,10.55,100.0,3.0914,-0.1004,10.0,0.0,0.0,0.0,0.1839,-0.4489,0.9995,8793.59 +165,60,52.42,0.0,100.0,0.04,84.29,8.43,100.0,3.2152,-0.1492,10.0,0.0,0.0,0.0,0.157,-1.0035,0.9995,8800.88 +166,60,49.31,0.0,100.0,0.04,81.44,6.74,100.0,3.3083,-0.1752,10.0,0.0,0.0,0.0,0.1306,-1.0031,0.9995,8808.14 +167,60,41.08,0.0,100.0,0.04,77.67,5.39,100.0,3.2521,-0.1867,10.0,0.0,0.0,0.0,-0.0063,-1.0059,0.9995,8817.75 +168,59,29.55,0.0,100.0,0.03,68.93,0.0,100.0,2.9875,-0.3266,10.0,0.0,0.0,0.0,-0.1928,-1.0042,0.9995,8830.32 +169,60,13.94,0.0,100.0,0.14,55.41,0.0,100.0,2.5887,-0.5534,8.9995,0.0,-0.0,-0.0,-0.4238,-1.0054,0.9996,8846.02 +170,60,1.36,0.0,50.0,0.13,39.56,0.0,100.0,2.056,-0.5542,7.9991,0.0,0.0,0.0,-0.5327,-1.0059,-0.0002,8876.87 +171,60,1.09,0.0,20.0,0.12,33.37,0.0,100.0,1.6734,-0.555,6.9987,0.0,0.0,0.0,-0.3825,-1.0029,0.0508,8913.1 +172,60,0.97,0.0,10.0,0.11,28.05,0.0,100.0,1.3523,-0.5558,5.9983,0.0,0.0,0.0,-0.3211,-1.0017,0.0365,8961.51 +173,60,0.76,0.0,8.33,0.1,23.25,0.0,99.92,1.0807,-0.5565,4.998,0.0,0.0,0.0,-0.2716,-1.0011,0.0325,9012.84 +174,60,1.27,0.0,14.29,0.09,19.58,0.0,79.94,0.8639,-0.5571,3.9984,0.0,0.0,0.0,-0.2168,-0.9996,0.0283,9065.68 +175,60,1.09,0.0,10.53,0.09,15.71,0.0,63.95,0.6815,-0.5577,3.1988,0.0,0.0,0.0,-0.1824,-0.7996,0.025,9126.9 +176,60,1.12,0.0,8.33,0.08,12.77,0.0,51.16,0.5372,-0.5582,2.5591,0.0,0.0,0.0,-0.1443,-0.6397,0.0217,9184.88 +177,60,1.15,0.0,7.41,0.07,10.43,0.0,40.93,0.4222,-0.5587,2.0473,0.0,0.0,0.0,-0.115,-0.5118,0.0201,9245.82 +178,60,1.16,0.0,5.56,0.07,8.58,0.0,42.05,0.3306,-0.5592,1.7147,0.0,0.0,0.0,-0.0916,-0.4094,0.0191,9308.26 +179,60,1.16,0.0,5.45,0.06,7.08,0.0,34.76,0.2572,-0.5596,1.3682,0.0,0.0,0.0,-0.0734,-0.3466,0.017,9365.47 +180,60,1.1,0.0,5.0,0.06,5.79,0.0,27.34,0.1979,-0.56,1.0783,0.0,0.0,0.0,-0.0593,-0.2899,0.0178,9424.38 +181,59,1.16,0.0,4.55,0.06,4.97,0.0,21.65,0.1603,-0.5603,0.8598,0.0,0.0,0.0,-0.047,-0.2271,0.0185,9486.15 +182,60,1.18,0.0,4.76,0.04,4.11,0.0,17.29,0.1148,-0.5606,0.6925,0.0,0.0,0.0,-0.0369,-0.1782,0.0233,9543.73 +183,60,1.12,0.0,4.35,0.04,3.42,0.0,13.69,0.0849,-0.561,0.5523,0.0,0.0,0.0,-0.0299,-0.1422,0.0245,9606.92 +184,60,0.96,0.0,4.55,0.04,2.72,0.0,10.79,0.06,-0.5612,0.4407,0.0,0.0,0.0,-0.0249,-0.1126,0.0264,9665.16 +185,60,0.91,0.0,4.62,0.03,2.3,0.0,8.98,0.0416,-0.5615,0.3531,0.0,0.0,0.0,-0.0184,-0.0876,0.0223,9723.9 +186,60,0.91,0.0,4.69,0.03,2.01,0.0,7.53,0.0274,-0.5617,0.2821,0.0,0.0,0.0,-0.0142,-0.0709,0.0202,9783.96 +187,60,0.83,0.0,4.29,0.03,1.68,0.0,6.22,0.0152,-0.5619,0.2239,0.0,0.0,0.0,-0.0123,-0.0582,0.0191,9844.58 +188,60,0.77,0.0,4.26,0.03,1.43,0.0,5.64,0.0056,-0.5621,0.1795,0.0,0.0,0.0,-0.0095,-0.0632,0.0172,9902.67 +189,60,0.75,0.0,4.17,0.02,1.23,0.0,5.03,-0.0016,-0.5623,0.1453,0.0,0.0,0.0,-0.0072,-0.0429,0.0185,9966.36 +190,60,0.82,0.0,4.17,0.02,1.16,0.0,5.07,-0.0061,-0.5625,0.1169,0.0,0.0,0.0,-0.0046,-0.0293,0.019,10025.77 +191,60,0.65,0.0,4.26,0.02,0.9,0.0,5.14,-0.0118,-0.5627,0.0916,0.0,0.0,0.0,-0.0056,-0.0347,0.0181,10085.02 +192,60,0.74,0.0,4.35,0.02,0.95,0.0,5.12,-0.0138,-0.5628,0.0625,0.0,0.0,0.0,-0.0021,-0.0366,0.0225,10144.65 +193,60,0.76,0.0,4.17,0.02,0.92,0.0,4.76,-0.0162,-0.5629,0.05,0.0,0.0,0.0,-0.0023,-0.0125,0.0192,10204.95 +194,60,0.78,0.0,3.77,0.02,0.92,0.0,4.44,-0.018,-0.5631,0.04,0.0,0.0,0.0,-0.0018,-0.0184,0.0209,10267.11 +195,60,0.8,0.0,3.7,0.02,0.9,0.0,4.32,-0.0197,-0.5632,0.0321,0.0,0.0,0.0,-0.0017,-0.008,0.0124,10325.76 +196,60,0.68,0.0,3.92,0.01,0.75,0.0,4.21,-0.0224,-0.5633,0.0257,0.0,0.0,0.0,-0.0027,-0.0227,0.0262,10385.77 +197,60,0.72,0.0,3.77,0.02,0.75,0.0,3.99,-0.0231,-0.5634,0.0206,0.0,0.0,0.0,-0.0007,-0.0057,0.0183,10445.7 +198,60,0.83,0.0,4.76,0.02,0.85,0.0,5.18,-0.0226,-0.5635,0.0338,0.0,-0.0,-0.0,0.0005,-0.0156,0.0232,10505.54 +199,60,0.78,0.0,4.23,0.02,0.78,0.0,5.01,-0.0237,-0.5636,0.0311,0.0,0.0,0.0,-0.0011,-0.0186,0.0176,10564.23 +200,60,0.73,0.0,4.17,0.03,0.73,0.0,4.82,-0.0245,-0.5636,0.0243,0.0,0.0,0.0,-0.0009,-0.0198,0.0186,10620.71 +201,60,0.77,0.0,4.29,0.03,0.74,0.0,4.85,-0.0245,-0.5637,0.0319,0.0,0.0,0.0,0.0,-0.0218,0.0205,10683.41 +202,57,0.78,0.0,3.57,0.03,0.72,0.0,4.09,-0.0256,-0.5491,0.0289,0.0,-0.0,-0.0,-0.0001,-0.0208,0.0265,10746.46 +203,60,0.78,0.0,3.28,0.02,0.72,0.0,3.61,-0.0243,-0.5353,0.026,0.0,0.0,0.0,0.0003,-0.0147,0.0189,10806.74 +204,60,0.75,0.0,3.03,0.01,0.66,0.0,3.36,-0.0244,-0.5216,0.0208,0.0,0.0,0.0,-0.0001,-0.0166,0.0192,10865.46 +205,60,0.77,0.0,3.28,0.01,0.69,0.0,3.55,-0.0237,-0.5068,0.0189,0.0,0.0,0.0,0.0007,-0.0186,0.0181,10923.91 +206,57,0.83,0.0,3.39,0.01,0.76,0.0,3.8,-0.0241,-0.4909,0.0192,0.0,0.0,0.0,0.0009,-0.0125,0.0171,10984.29 +207,59,0.81,0.0,3.7,0.0,0.79,0.0,4.13,-0.0226,-0.4747,0.0254,0.0,0.0,0.0,0.0002,-0.0171,0.0163,11044.27 +208,57,0.82,0.0,5.08,0.06,0.82,0.0,5.7,-0.0229,-0.4571,0.0274,0.0,0.0,0.0,-0.0003,-0.0181,0.018,11103.94 +209,59,0.88,0.0,5.17,0.02,0.85,0.0,5.83,-0.0227,-0.4223,0.0239,0.0,0.0,0.0,0.0006,-0.0148,0.0348,11163.43 +210,60,0.85,0.0,4.92,0.02,0.8,0.0,5.4,-0.0225,-0.387,0.0195,0.0,0.0,0.0,-0.0001,-0.0179,0.0353,11227.74 +211,60,0.8,0.0,4.84,0.02,0.78,0.0,5.32,-0.0228,-0.3698,0.0206,0.0,0.0,0.0,-0.0003,-0.0221,0.0171,11283.16 +212,58,0.7,0.0,4.76,0.01,0.7,0.0,5.22,-0.024,-0.3539,0.0204,0.0,0.0,0.0,-0.0012,-0.0353,0.0203,11345.14 +213,60,0.81,0.0,4.84,0.04,0.77,0.0,5.23,-0.0231,-0.3371,0.0345,0.0,0.0,0.0,0.0009,-0.0165,0.0346,11405.61 +214,55,0.87,0.0,4.84,0.12,0.83,0.0,5.17,-0.0237,-0.3371,0.0307,0.0,0.0,0.0,0.0007,-0.0141,0.0339,11467.41 +215,60,0.81,0.0,3.77,0.03,0.77,0.0,4.36,-0.0229,-0.3371,0.0222,0.0,-0.0,-0.0,-0.0004,-0.0141,0.0311,11525.64 +216,60,0.88,0.0,3.85,0.04,0.85,0.0,4.34,-0.022,-0.3371,0.0203,0.0,0.0,0.0,0.0009,-0.017,0.0311,11586.32 +217,59,0.86,0.0,3.85,0.02,0.8,0.0,3.86,-0.0226,-0.3371,0.0162,0.0,0.0,0.0,-0.0003,-0.0181,0.0338,11642.97 +218,60,0.76,0.0,5.17,0.0,0.71,0.0,5.82,-0.0227,-0.3372,0.0289,0.0,0.0,0.0,-0.0005,-0.0212,0.0305,11706.01 +219,48,0.6,0.0,2.86,0.0,0.55,0.0,3.01,-0.0263,-0.3372,0.0164,0.0,0.0,0.0,-0.0003,-0.0185,0.0151,11764.57 +220,60,0.75,0.0,4.76,0.02,0.72,0.0,5.3,-0.0224,-0.3372,0.0197,0.0,0.0,0.0,0.0006,-0.0156,0.0156,11825.72 +221,60,11.5,0.0,32.43,0.03,13.35,0.0,39.36,0.0858,-0.086,0.3179,0.0,0.0,0.0,0.1083,-0.0159,0.3181,11891.74 +222,57,30.55,11.48,48.05,0.03,41.27,13.34,78.81,0.3052,0.0945,0.5937,0.0,0.0,0.0,0.2285,0.1145,0.3261,11929.83 +223,59,40.75,28.09,57.53,0.19,67.07,38.53,100.0,0.474,0.2907,0.834,0.0,0.0,0.0,0.1731,0.0891,0.269,11948.09 +224,60,47.13,38.2,60.29,0.01,87.96,61.6,100.0,0.5956,0.4269,1.0394,0.0,-0.0,-0.0,0.1225,0.0132,0.2157,11955.2 +225,54,51.74,42.5,59.76,0.0,97.7,80.39,100.0,0.6864,0.4749,0.9845,0.0,-0.0,-0.0,0.099,0.0286,0.1935,11957.08 +226,60,56.24,48.57,65.75,0.08,100.0,100.0,100.0,0.8222,0.5803,1.3006,0.0,-0.0,-0.0,0.1374,0.0088,0.3124,11957.57 +227,58,61.85,53.16,75.61,0.06,100.0,100.0,100.0,1.0492,0.6624,1.6905,0.0,0.0,0.0,0.2362,0.0631,0.5102,11957.61 +228,60,68.39,58.21,79.49,0.1,100.0,100.0,100.0,1.4174,0.8795,2.2767,0.0,0.0,0.0,0.3669,0.161,0.5877,11957.66 +229,60,76.88,65.38,91.43,0.01,100.0,100.0,100.0,1.954,1.2697,3.0299,0.0,0.0,0.0,0.5366,0.305,0.8262,11957.71 +230,60,87.96,76.19,100.0,0.01,100.0,100.0,100.0,2.7123,1.8687,3.9519,0.0,0.0,0.0,0.7583,0.5233,0.9996,11957.78 +231,60,99.23,96.97,100.0,0.01,100.0,100.0,100.0,3.696,2.8189,4.9115,0.0,0.0,0.0,0.9836,0.9389,1.0,11957.83 +232,60,100.0,100.0,100.0,0.05,100.0,100.0,100.0,4.695,3.8179,5.9104,0.0,0.0,0.0,0.9991,0.9961,1.0,11957.9 +233,59,100.0,100.0,100.0,0.05,100.0,100.0,100.0,5.6852,4.8169,6.9093,0.0,0.0,0.0,0.9991,0.9961,1.0,11957.95 +234,60,70.0,0.0,100.0,0.07,99.44,89.19,100.0,6.0766,4.4621,7.4836,0.0,0.0,0.0,0.3991,-1.0024,1.0,11958.1 +235,59,22.03,0.0,100.0,0.06,96.15,76.03,100.0,5.5298,3.8034,7.4823,0.0,-0.0,-0.0,-0.5574,-1.0036,0.9999,11958.91 +236,59,23.73,0.0,100.0,0.01,93.52,68.86,100.0,5.0267,3.4442,7.9029,0.0,0.0,0.0,-0.5209,-1.0033,0.9997,11961.44 +237,60,56.67,0.0,100.0,0.03,94.16,66.94,100.0,5.1618,3.3476,7.6762,0.0,0.0,0.0,0.1455,-1.0031,1.0,11962.95 +238,60,80.0,0.0,100.0,0.03,96.46,62.9,100.0,5.7679,3.145,8.6756,0.0,-0.0,-0.0,0.6062,-1.001,1.0,11964.42 +239,60,95.0,0.0,100.0,0.03,98.87,62.93,100.0,6.6725,3.1554,9.6751,0.0,0.0,0.0,0.9046,-1.001,1.0,11965.39 +240,60,98.33,0.0,100.0,0.03,99.64,78.31,100.0,7.6199,3.9199,10.0,0.0,0.0,0.0,0.9663,-0.9799,1.0,11965.44 +241,53,98.11,0.0,100.0,0.03,99.3,62.65,100.0,8.4484,3.136,10.0,0.0,0.0,0.0,0.9656,-0.7838,1.0,11965.91 +242,59,98.87,33.33,100.0,0.03,100.0,100.0,100.0,9.1312,3.0511,10.0,0.0,0.0,0.0,0.9809,-0.085,1.0,11965.96 +243,59,98.87,33.33,100.0,0.05,100.0,100.0,100.0,9.5312,2.7169,10.0,0.0,0.0,0.0,0.9767,-0.3341,1.0,11966.01 +244,60,98.89,33.33,100.0,0.05,100.0,100.0,100.0,9.7736,2.3828,10.0,0.0,0.0,0.0,0.977,-0.3341,1.0,11966.07 +245,60,95.56,0.0,100.0,0.02,100.0,100.0,100.0,9.8058,2.0486,10.0,0.0,0.0,0.0,0.9104,-1.0005,1.0,11966.13 +246,60,85.56,0.0,100.0,0.02,100.0,100.0,100.0,9.6951,1.7145,10.0,0.0,0.0,0.0,0.7104,-1.0027,1.0,11966.19 +247,60,43.89,0.0,100.0,0.02,99.9,94.19,100.0,9.1392,1.3803,10.0,0.0,0.0,0.0,-0.1229,-1.0025,1.0,11966.25 +248,60,23.89,0.0,100.0,0.02,99.77,86.35,100.0,8.3837,1.0849,10.0,0.0,0.0,0.0,-0.5222,-1.0028,1.0,11966.42 +249,60,7.08,0.0,100.0,0.05,99.33,60.24,100.0,7.4599,0.6865,10.0,0.0,-0.0,-0.0,-0.8572,-1.0026,0.9999,11966.7 +250,60,0.24,0.0,14.29,0.04,98.13,29.07,100.0,6.4698,0.3124,8.9999,0.0,0.0,0.0,-0.9901,-1.0024,-0.3742,11967.39 +251,60,0.0,0.0,0.0,0.04,95.08,0.37,100.0,5.488,0.0212,7.9998,0.0,0.0,0.0,-0.9818,-1.0022,-0.2912,11970.32 +252,60,0.0,0.0,0.0,0.04,84.7,0.31,100.0,4.5367,0.0171,6.9998,0.0,0.0,0.0,-0.9513,-1.002,-0.0041,11976.95 +253,60,1.67,0.0,100.0,0.03,73.02,0.24,100.0,3.7192,0.0137,5.9997,0.0,0.0,0.0,-0.8174,-1.0014,0.9998,11994.46 +254,60,1.67,0.0,100.0,0.03,60.07,0.19,100.0,3.022,0.011,5.9981,0.0,0.0,0.0,-0.6972,-1.0013,0.9997,12025.49 +255,60,1.81,0.0,100.0,0.01,48.64,0.15,100.0,2.4564,0.0088,6.9978,0.0,0.0,0.0,-0.5656,-0.9999,0.9997,12069.19 +256,60,2.14,0.0,100.0,0.03,39.93,0.12,100.0,2.0105,0.0071,7.9975,0.0,0.0,0.0,-0.4459,-0.7999,0.9997,12120.32 +257,60,2.13,0.0,100.0,0.02,32.38,0.09,100.0,1.6514,0.0057,8.9972,0.0,0.0,0.0,-0.3591,-0.6399,0.9997,12175.05 +258,60,2.11,0.0,100.0,0.02,26.27,0.07,100.0,1.3669,0.0046,9.997,0.0,0.0,0.0,-0.2845,-0.512,0.9997,12231.42 +259,60,2.15,0.0,100.0,0.01,21.48,0.05,100.0,1.127,0.0037,10.0,0.0,0.0,0.0,-0.2233,-0.4096,0.9997,12285.31 +260,60,2.3,0.0,100.0,0.01,17.83,0.04,100.0,0.9365,0.0029,10.0,0.0,0.0,0.0,-0.1738,-0.3277,0.9997,12341.96 +261,60,2.42,0.0,100.0,0.01,14.89,0.03,100.0,0.7837,0.0024,10.0,0.0,0.0,0.0,-0.1361,-0.2765,0.9997,12400.21 +262,60,2.48,0.0,100.0,0.02,12.48,0.02,100.0,0.6608,0.0019,10.0,0.0,0.0,0.0,-0.1063,-0.2213,0.9997,12456.47 +263,60,0.91,0.0,4.0,0.01,10.6,0.02,100.0,0.5461,0.0015,8.9997,0.0,0.0,0.0,-0.1147,-1.0003,-0.0004,12515.83 +264,60,0.88,0.0,3.57,0.01,8.95,0.01,100.0,0.4496,0.0012,7.9995,0.0,0.0,0.0,-0.0965,-1.0002,-0.0003,12571.43 +265,60,0.94,0.0,5.17,0.01,7.75,0.01,100.0,0.3702,0.001,6.9993,0.0,0.0,0.0,-0.0794,-1.0002,-0.0002,12628.86 +266,60,1.0,0.0,4.48,0.01,6.79,0.01,100.0,0.3034,0.0008,5.9991,0.0,0.0,0.0,-0.0669,-1.0002,-0.0002,12688.66 +267,59,1.02,0.0,4.48,0.01,6.02,0.0,99.96,0.2475,0.0007,4.9989,0.0,0.0,0.0,-0.0573,-1.0002,-0.0002,12745.14 +268,60,1.0,0.0,4.17,0.06,4.98,0.0,79.97,0.1971,0.0005,3.9991,0.0,-0.0,-0.0,-0.0499,-0.9998,-0.0001,12803.29 +269,60,1.05,0.0,4.29,0.05,4.24,0.0,63.97,0.1581,0.0004,3.1993,0.0,0.0,0.0,-0.039,-0.7998,-0.0001,12862.33 +270,60,1.23,0.0,10.0,0.05,3.94,0.0,70.82,0.1293,0.0004,2.7232,0.0,0.0,0.0,-0.0288,-0.4762,0.0037,12925.24 +271,60,1.15,0.0,6.67,0.05,3.29,0.0,53.89,0.1023,0.0003,2.1282,0.0,0.0,0.0,-0.027,-0.5949,0.011,12985.44 +272,60,1.12,0.0,4.35,0.04,2.79,0.0,39.4,0.0811,0.0002,1.6528,0.0,0.0,0.0,-0.0212,-0.4755,0.0085,13044.35 +273,60,1.06,0.0,6.9,0.04,2.39,0.0,36.62,0.0642,0.0001,1.3541,0.0,0.0,0.0,-0.0169,-0.2986,0.0087,13104.65 +274,60,1.11,0.0,6.06,0.04,2.18,0.0,29.59,0.0517,0.0001,1.0699,0.0,0.0,0.0,-0.0125,-0.2843,0.0149,13165.66 +275,60,1.1,0.0,5.41,0.03,1.95,0.0,23.77,0.0412,0.0,0.8431,0.0,0.0,0.0,-0.0106,-0.2268,0.0146,13226.1 +276,60,1.06,0.0,4.35,0.03,1.71,0.0,18.31,0.0324,-0.0,0.657,0.0,0.0,0.0,-0.0088,-0.186,0.0166,13284.13 +277,60,1.06,0.0,4.48,0.03,1.59,0.0,14.71,0.0259,-0.0101,0.5176,0.0,0.0,0.0,-0.0065,-0.1395,0.0156,13344.1 +278,60,1.11,0.0,4.69,0.03,1.55,0.0,12.29,0.0212,-0.0109,0.4111,0.0,0.0,0.0,-0.0048,-0.1065,0.0135,13405.65 +279,59,1.13,0.0,4.76,0.03,1.49,0.0,10.2,0.0172,-0.0149,0.3252,0.0,-0.0,-0.0,-0.0044,-0.0859,0.0179,13466.87 +280,60,1.01,0.0,5.0,0.04,1.28,0.0,6.43,0.0122,-0.0155,0.2396,0.0,0.0,0.0,-0.0046,-0.0856,0.0156,13523.14 +281,60,1.04,0.0,4.23,0.04,1.27,0.0,5.22,0.0097,-0.0254,0.1896,0.0,0.0,0.0,-0.0025,-0.05,0.0131,13586.25 +282,60,1.1,0.0,4.35,0.04,1.29,0.0,5.01,0.0078,-0.026,0.1515,0.0,0.0,0.0,-0.0019,-0.0381,0.0239,13644.32 +283,60,1.12,0.0,4.29,0.03,1.28,0.0,4.83,0.006,-0.0265,0.106,0.0,0.0,0.0,-0.0018,-0.0455,0.0169,13706.56 +284,60,1.17,0.0,4.76,0.03,1.32,0.0,5.7,0.0047,-0.0269,0.0849,0.0,0.0,0.0,-0.0013,-0.0228,0.0308,13763.94 +285,60,1.19,0.0,5.26,0.03,1.31,0.0,6.37,0.0033,-0.0273,0.068,0.0,0.0,0.0,-0.0014,-0.0177,0.0194,13823.6 +286,60,1.22,0.0,6.78,0.03,1.35,0.0,8.17,0.0022,-0.0277,0.0545,0.0,0.0,0.0,-0.001,-0.0182,0.0224,13885.08 +287,60,1.3,0.0,6.67,0.02,1.43,0.0,7.95,0.0016,-0.0281,0.0437,0.0,0.0,0.0,-0.0006,-0.0248,0.0332,13943.4 +288,60,1.27,0.0,6.67,0.02,1.36,0.0,7.76,-0.0,-0.0284,0.0359,0.0,0.0,0.0,-0.0016,-0.0178,0.0157,14004.96 +289,60,1.29,0.0,5.45,0.02,1.34,0.0,6.04,-0.0008,-0.0232,0.028,0.0,0.0,0.0,-0.0008,-0.0213,0.0219,14062.58 +290,60,1.26,0.0,5.56,0.02,1.29,0.0,5.99,-0.0018,-0.0236,0.0235,0.0,0.0,0.0,-0.001,-0.0194,0.0171,14124.24 +291,60,1.14,0.0,5.66,0.07,1.18,0.0,6.07,-0.0034,-0.0239,0.0205,0.0,0.0,0.0,-0.0016,-0.0203,0.0165,14184.81 +292,60,1.04,0.0,6.12,0.08,1.08,0.0,6.62,-0.005,-0.0322,0.0194,0.0,-0.0,-0.0,-0.0016,-0.038,0.0173,14243.17 +293,60,1.07,0.0,4.84,0.08,1.09,0.0,5.54,-0.0053,-0.0337,0.0282,0.0,-0.0,-0.0,-0.0002,-0.023,0.0166,14302.18 +294,60,1.04,0.0,5.08,0.08,1.05,0.0,5.81,-0.0059,-0.0351,0.0258,0.0,0.0,0.0,-0.0007,-0.0229,0.0188,14365.81 +295,60,1.0,0.0,4.76,0.09,1.01,0.0,5.31,-0.0067,-0.0365,0.0173,0.0,0.0,0.0,-0.0008,-0.0173,0.0236,14424.06 +296,60,0.84,0.0,4.0,0.02,0.83,0.0,4.11,-0.0087,-0.0377,0.0114,0.0,-0.0,-0.0,-0.0019,-0.0215,0.0141,14484.64 +297,60,0.81,0.0,4.26,0.09,0.78,0.0,4.61,-0.0092,-0.0392,0.0217,0.0,0.0,0.0,-0.0006,-0.042,0.0164,14546.14 +298,60,0.85,0.0,4.76,0.09,0.84,0.0,5.09,-0.0089,-0.04,0.0208,0.0,-0.0,-0.0,0.0003,-0.0249,0.0171,14604.09 +299,60,0.8,0.0,4.62,0.1,0.79,0.0,4.95,-0.0096,-0.0407,0.0152,0.0,0.0,0.0,-0.0007,-0.0173,0.0148,14666.57 +300,60,0.85,0.0,4.62,0.03,0.83,0.0,4.89,-0.0093,-0.0414,0.026,0.0,0.0,0.0,0.0003,-0.0172,0.0167,14724.26 +301,60,0.86,0.0,4.76,0.04,0.85,0.0,5.13,-0.0093,-0.042,0.034,0.0,0.0,0.0,0.0,-0.0153,0.0143,14740.12 diff --git a/experiments/results/csv/sudden_error_spikes_adaptive_time_analysis.csv b/experiments/results/csv/sudden_error_spikes_adaptive_time_analysis.csv new file mode 100644 index 000000000..b3766671f --- /dev/null +++ b/experiments/results/csv/sudden_error_spikes_adaptive_time_analysis.csv @@ -0,0 +1,16 @@ +Time Range,Total Requests,Success,Errors,Error %,Rejected,Rejected %,Target Error Rate % +0-20s,7349,7268,77,1.05,4,0.05,1.0 +20-40s,7397,7317,80,1.08,0,0.0,1.0 +40-60s,7530,7447,82,1.09,1,0.01,1.0 +60-80s,10836,6845,1753,16.18,2238,20.65,20.0 +80-100s,8110,7512,72,0.89,526,6.49,1.0 +100-120s,7321,7204,78,1.07,39,0.53,1.0 +120-140s,7521,7364,99,1.32,58,0.77,1.0 +140-160s,15220,1606,2282,14.99,11332,74.45,60.0 +160-180s,12866,4102,42,0.33,8722,67.79,1.0 +180-200s,7638,7421,56,0.73,161,2.11,1.0 +200-220s,7594,7472,71,0.93,51,0.67,1.0 +220-240s,15248,35,2517,16.51,12696,83.26,100.0 +240-260s,14037,2405,21,0.15,11611,82.72,1.0 +260-280s,10026,7324,80,0.8,2622,26.15,1.0 +280-300s,7457,7307,74,0.99,76,1.02,1.0 diff --git a/experiments/results/csv/sudden_error_spikes_time_analysis.csv b/experiments/results/csv/sudden_error_spikes_time_analysis.csv new file mode 100644 index 000000000..59c6d4cfc --- /dev/null +++ b/experiments/results/csv/sudden_error_spikes_time_analysis.csv @@ -0,0 +1,16 @@ +Time Range,Total Requests,Success,Errors,Error %,Rejected,Rejected %,Target Error Rate % +0-20s,10492,10394,98,0.93,0,0.0,1.0 +20-40s,10645,10536,109,1.02,0,0.0,1.0 +40-60s,10761,10632,129,1.2,0,0.0,1.0 +60-80s,15496,2638,641,4.14,12217,78.84,20.0 +80-100s,14743,7943,92,0.62,6708,45.5,1.0 +100-120s,10738,10646,92,0.86,0,0.0,1.0 +120-140s,10706,10608,98,0.92,0,0.0,1.0 +140-160s,15318,622,828,5.41,13868,90.53,60.0 +160-180s,14375,4039,34,0.24,10302,71.67,1.0 +180-200s,12201,10420,106,0.87,1675,13.73,1.0 +200-220s,10705,10610,95,0.89,0,0.0,1.0 +220-240s,15305,40,686,4.48,14579,95.26,100.0 +240-260s,12551,4916,59,0.47,7576,60.36,1.0 +260-280s,10764,10646,118,1.1,0,0.0,1.0 +280-300s,10744,10637,107,1.0,0,0.0,1.0 diff --git a/experiments/results/csv/sustained_load_adaptive_pid_controller.csv b/experiments/results/csv/sustained_load_adaptive_pid_controller.csv new file mode 100644 index 000000000..bc0fb52db --- /dev/null +++ b/experiments/results/csv/sustained_load_adaptive_pid_controller.csv @@ -0,0 +1,541 @@ +Window,Thread Count,Error Rate Avg,Error Rate Min,Error Rate Max,Ideal Error Rate,Rejection Rate Avg,Rejection Rate Min,Rejection Rate Max,Integral Avg,Integral Min,Integral Max,Derivative Avg,Derivative Min,Derivative Max,P Value Avg,P Value Min,P Value Max,Total Request Time +1,60,1.03,0.0,25.0,4.61,0.93,0.0,24.0,-0.036,-0.0461,0.2,0.0,-0.0,-0.0,-0.036,-0.0461,0.2,105.01 +2,60,1.56,0.0,16.67,4.25,1.09,0.0,16.56,-0.0722,-0.0886,0.1047,0.0,0.0,0.0,-0.0362,-0.1094,0.1206,161.55 +3,60,1.22,0.0,13.33,3.92,0.64,0.0,10.01,-0.1107,-0.1278,0.0452,0.0,0.0,0.0,-0.0385,-0.1268,0.0466,224.39 +4,60,1.21,0.0,9.52,3.61,0.28,0.0,5.37,-0.1426,-0.1639,0.0023,0.0,0.0,0.0,-0.0319,-0.0463,0.0298,283.67 +5,60,1.15,0.0,8.0,3.33,0.12,0.0,3.17,-0.1695,-0.1972,-0.0157,0.0,0.0,0.0,-0.0269,-0.0333,0.0172,343.66 +6,60,1.25,0.0,7.69,3.07,0.07,0.0,2.95,-0.192,-0.228,-0.0068,0.0,0.0,0.0,-0.0225,-0.0307,0.0309,401.7 +7,60,1.15,0.0,7.14,2.83,0.05,0.0,2.4,-0.2131,-0.2563,-0.0102,0.0,0.0,0.0,-0.0212,-0.0283,0.0026,463.58 +8,60,1.17,0.0,5.71,2.61,0.02,0.0,0.67,-0.2323,-0.2824,-0.023,0.0,0.0,0.0,-0.0191,-0.0261,0.0118,521.19 +9,60,1.21,0.0,5.0,2.41,0.0,0.0,0.0,-0.2491,-0.3065,-0.0258,0.0,0.0,0.0,-0.0169,-0.0241,0.0205,580.52 +10,60,1.21,0.0,4.65,2.22,0.0,0.0,0.0,-0.2644,-0.3287,-0.0254,0.0,0.0,0.0,-0.0153,-0.0222,0.0182,642.64 +11,60,1.16,0.0,6.98,2.05,0.04,0.0,2.32,-0.279,-0.3491,-0.0018,0.0,0.0,0.0,-0.0145,-0.0393,0.0236,702.75 +12,60,1.08,0.0,5.26,1.89,0.0,0.0,0.29,-0.2934,-0.368,-0.0184,0.0,0.0,0.0,-0.0145,-0.0387,0.0216,762.17 +13,60,1.08,0.0,5.0,1.74,0.0,0.0,0.03,-0.3064,-0.3854,-0.0175,0.0,0.0,0.0,-0.013,-0.0399,0.0204,822.52 +14,60,1.02,0.0,4.76,2.39,0.0,0.0,0.0,-0.3188,-0.4014,-0.0195,0.0,0.0,0.0,-0.0124,-0.0372,0.0192,882.8 +15,60,1.03,0.0,4.65,1.48,0.0,0.0,0.0,-0.33,-0.4162,-0.0218,0.0,0.0,0.0,-0.0112,-0.0343,0.0172,942.39 +16,60,0.95,0.0,4.35,2.39,0.0,0.0,0.0,-0.3411,-0.4298,-0.0445,0.0,0.0,0.0,-0.011,-0.0316,0.015,1001.51 +17,60,1.01,0.0,4.44,2.39,0.0,0.0,0.0,-0.3506,-0.4424,-0.0658,0.0,0.0,0.0,-0.0096,-0.0291,0.0159,1065.01 +18,60,0.95,0.0,3.45,2.39,0.0,0.0,0.0,-0.3599,-0.454,-0.0822,0.0,-0.0,-0.0,-0.0092,-0.0308,0.0123,1125.22 +19,60,0.98,0.0,4.88,2.1,0.0,0.0,0.0,-0.368,-0.4647,-0.0978,0.0,0.0,0.0,-0.0081,-0.0284,0.0248,1182.41 +20,60,1.02,0.0,6.82,1.94,0.0,0.0,0.0,-0.3749,-0.4746,-0.1122,0.0,0.0,0.0,-0.0069,-0.0262,0.0399,1243.35 +21,60,1.09,0.0,6.12,1.79,0.0,0.0,0.0,-0.3803,-0.4836,-0.1474,0.0,0.0,0.0,-0.0054,-0.0352,0.0339,1301.69 +22,60,1.1,0.0,5.56,1.65,0.0,0.0,0.0,-0.385,-0.492,-0.141,0.0,0.0,0.0,-0.0047,-0.0325,0.0295,1363.6 +23,60,1.19,0.0,5.66,1.52,0.01,0.0,0.57,-0.3882,-0.4997,-0.1128,0.0,0.0,0.0,-0.0032,-0.0299,0.0327,1422.83 +24,60,1.21,0.0,5.77,0.71,0.02,0.0,1.16,-0.3906,-0.5069,-0.089,0.0,0.0,0.0,-0.0024,-0.0276,0.0336,1486.21 +25,60,1.16,0.0,5.0,0.66,0.0,0.0,0.0,-0.3931,-0.5134,-0.0873,0.0,0.0,0.0,-0.0024,-0.0255,0.0349,1543.44 +26,60,1.13,0.0,5.13,0.61,0.01,0.0,0.51,-0.3951,-0.5195,-0.0741,0.0,0.0,0.0,-0.0021,-0.0235,0.0348,1600.98 +27,60,1.06,0.0,5.13,0.56,0.01,0.0,0.73,-0.3974,-0.5251,-0.0609,0.0,0.0,0.0,-0.0023,-0.0216,0.0291,1661.53 +28,60,1.01,0.0,5.41,0.51,0.03,0.0,1.45,-0.3996,-0.5302,-0.047,0.0,0.0,0.0,-0.0023,-0.0218,0.0318,1720.41 +29,60,0.98,0.0,5.13,0.47,0.01,0.0,0.87,-0.4019,-0.5349,-0.0366,0.0,0.0,0.0,-0.0023,-0.0339,0.0426,1781.74 +30,60,1.01,0.0,5.0,0.44,0.0,0.0,0.0,-0.4032,-0.5393,-0.0718,0.0,0.0,0.0,-0.0013,-0.0352,0.0413,1843.02 +31,60,0.85,0.0,5.0,0.4,0.0,0.0,0.0,-0.4054,-0.5434,-0.0961,0.0,0.0,0.0,-0.0022,-0.0243,0.0412,1901.33 +32,60,0.82,0.0,4.55,0.37,0.0,0.0,0.0,-0.4074,-0.5471,-0.1184,0.0,0.0,0.0,-0.002,-0.0224,0.0366,1962.69 +33,60,0.73,0.0,4.17,0.34,0.0,0.0,0.0,-0.4099,-0.5505,-0.1391,0.0,0.0,0.0,-0.0025,-0.0206,0.0247,2021.64 +34,60,0.8,0.0,4.08,0.32,0.0,0.0,0.0,-0.4112,-0.5564,-0.1189,0.0,0.0,0.0,-0.0013,-0.019,0.0312,2082.21 +35,60,0.88,0.0,4.44,0.29,0.0,0.0,0.0,-0.4114,-0.562,-0.1163,0.0,0.0,0.0,-0.0002,-0.0175,0.0356,2140.3 +36,60,0.99,0.0,4.76,0.27,0.0,0.0,0.03,-0.4101,-0.5671,-0.1104,0.0,0.0,0.0,0.0013,-0.0219,0.0349,2199.1 +37,60,1.09,0.0,4.88,0.25,0.01,0.0,0.71,-0.4075,-0.5718,-0.1056,0.0,0.0,0.0,0.0026,-0.0204,0.0409,2263.1 +38,60,1.3,0.0,5.13,0.23,0.03,0.0,1.78,-0.4026,-0.5762,-0.0977,0.0,0.0,0.0,0.0049,-0.0188,0.0397,2323.57 +39,60,1.27,0.0,5.56,0.21,0.06,0.0,3.03,-0.3979,-0.5802,-0.0774,0.0,0.0,0.0,0.0047,-0.0173,0.0408,2383.12 +40,60,1.18,0.0,6.06,0.19,0.09,0.0,3.39,-0.3941,-0.5839,-0.0614,0.0,0.0,0.0,0.0038,-0.0161,0.0407,2442.11 +41,60,1.21,0.0,6.25,0.18,0.07,0.0,2.77,-0.3901,-0.5874,-0.0678,0.0,0.0,0.0,0.0041,-0.0148,0.0398,2501.46 +42,60,1.22,0.0,4.65,0.93,0.03,0.0,1.24,-0.3855,-0.5905,-0.0609,0.0,0.0,0.0,0.0046,-0.0137,0.043,2562.11 +43,60,1.3,0.0,4.76,0.93,0.04,0.0,1.56,-0.3795,-0.5934,-0.0516,0.0,-0.0,-0.0,0.006,-0.0161,0.0448,2619.48 +44,60,1.23,0.0,5.13,0.86,0.01,0.0,0.31,-0.3741,-0.5961,-0.0528,0.0,-0.0,-0.0,0.0054,-0.0206,0.0476,2680.5 +45,60,1.34,0.0,7.5,0.79,0.17,0.0,4.34,-0.3671,-0.5986,-0.0346,0.0,0.0,0.0,0.0071,-0.0195,0.0719,2743.53 +46,60,1.28,0.0,7.14,0.73,0.15,0.0,3.4,-0.3619,-0.6008,-0.0426,0.0,0.0,0.0,0.0052,-0.018,0.0584,2802.27 +47,60,1.25,0.0,7.32,0.67,0.19,0.0,4.38,-0.3565,-0.6029,-0.0356,0.0,0.0,0.0,0.0054,-0.0202,0.0522,2862.6 +48,60,1.24,0.0,6.52,0.62,0.25,0.0,2.76,-0.3514,-0.6049,-0.0302,0.0,0.0,0.0,0.0051,-0.0186,0.0582,2923.89 +49,60,1.31,0.0,7.14,0.57,0.32,0.0,3.89,-0.346,-0.6067,-0.0266,0.0,0.0,0.0,0.0054,-0.0141,0.0591,2981.56 +50,60,1.33,0.0,7.5,0.53,0.31,0.0,4.29,-0.3409,-0.6083,-0.0228,0.0,0.0,0.0,0.0051,-0.013,0.0429,3043.43 +51,60,1.34,0.0,7.14,0.49,0.3,0.0,4.49,-0.3353,-0.6098,-0.0154,0.0,0.0,0.0,0.0055,-0.012,0.0377,3103.41 +52,60,1.37,0.0,9.09,0.45,0.32,0.0,7.37,-0.3293,-0.6112,-0.013,0.0,0.0,0.0,0.0061,-0.0111,0.0425,3162.07 +53,60,1.38,0.0,9.09,0.41,0.4,0.0,7.91,-0.3232,-0.6125,-0.0097,0.0,0.0,0.0,0.0061,-0.0102,0.0434,3223.66 +54,60,1.46,0.0,6.98,0.38,0.4,0.0,5.83,-0.3169,-0.6137,-0.0069,0.0,0.0,0.0,0.0063,-0.0122,0.0402,3280.5 +55,60,1.33,0.0,6.12,0.47,0.28,0.0,5.58,-0.3117,-0.6148,-0.013,0.0,0.0,0.0,0.0052,-0.0391,0.0424,3341.2 +56,60,1.23,0.0,6.67,0.43,0.31,0.0,6.29,-0.3062,-0.6158,-0.0049,0.0,0.0,0.0,0.0055,-0.0104,0.0473,3400.01 +57,60,1.21,0.0,6.52,0.4,0.34,0.0,6.16,-0.3011,-0.6167,-0.0051,0.0,0.0,0.0,0.0051,-0.0074,0.0338,3462.38 +58,60,1.19,0.0,6.67,0.37,0.25,0.0,6.35,-0.2964,-0.6176,-0.0028,0.0,0.0,0.0,0.0047,-0.0228,0.0392,3523.58 +59,60,1.21,0.0,7.32,0.34,0.31,0.0,6.75,-0.2904,-0.6184,0.0011,0.0,0.0,0.0,0.006,-0.0173,0.0461,3582.13 +60,60,1.13,0.0,7.69,0.31,0.29,0.0,6.53,-0.2858,-0.6191,-0.0048,0.0,0.0,0.0,0.0046,-0.0281,0.0359,3641.89 +61,60,1.0,0.0,7.5,0.29,0.26,0.0,6.48,-0.2821,-0.6198,-0.006,0.0,0.0,0.0,0.0037,-0.0178,0.0413,3704.2 +62,60,0.93,0.0,7.69,0.27,0.28,0.0,6.83,-0.2786,-0.6204,-0.0029,0.0,0.0,0.0,0.0035,-0.0231,0.0464,3765.17 +63,60,0.98,0.0,6.98,0.25,0.22,0.0,6.01,-0.2747,-0.621,-0.021,0.0,0.0,0.0,0.0039,-0.0181,0.0382,3821.31 +64,60,0.99,0.0,6.38,0.23,0.33,0.0,5.28,-0.2699,-0.6215,0.0027,0.0,0.0,0.0,0.0048,-0.018,0.042,3882.78 +65,60,0.94,0.0,6.82,0.21,0.39,0.0,5.87,-0.2666,-0.622,0.0021,0.0,0.0,0.0,0.0033,-0.0186,0.039,3944.0 +66,60,0.98,0.0,6.67,0.19,0.45,0.0,5.97,-0.2634,-0.6224,0.0215,0.0,0.0,0.0,0.0033,-0.0098,0.0303,4000.21 +67,60,0.94,0.0,6.52,0.18,0.43,0.0,5.64,-0.2609,-0.6229,-0.0003,0.0,0.0,0.0,0.0025,-0.0219,0.045,4061.0 +68,60,0.95,0.0,5.66,0.16,0.39,0.0,5.74,-0.2581,-0.6232,0.0161,0.0,0.0,0.0,0.0028,-0.0344,0.0513,4122.7 +69,60,0.85,0.0,5.41,0.15,0.31,0.0,5.29,-0.2558,-0.6236,0.0136,0.0,0.0,0.0,0.0023,-0.0215,0.046,4183.4 +70,60,0.88,0.0,5.26,0.14,0.33,0.0,5.21,-0.2523,-0.6239,0.0108,0.0,0.0,0.0,0.0035,-0.0071,0.0459,4243.52 +71,60,0.95,0.0,5.66,0.13,0.36,0.0,5.67,-0.2483,-0.6242,0.0101,0.0,0.0,0.0,0.0041,-0.0065,0.047,4302.83 +72,60,1.01,0.0,5.77,0.12,0.31,0.0,5.78,-0.2438,-0.6245,0.0096,0.0,0.0,0.0,0.0045,-0.0207,0.047,4362.46 +73,60,0.88,0.0,5.77,0.11,0.29,0.0,5.74,-0.2402,-0.6247,0.0074,0.0,0.0,0.0,0.0036,-0.0285,0.0495,4420.39 +74,60,0.72,0.0,4.08,0.1,0.21,0.0,2.76,-0.2379,-0.625,-0.0073,0.0,0.0,0.0,0.0023,-0.0261,0.0375,4482.55 +75,60,0.75,0.0,4.44,0.09,0.26,0.0,3.24,-0.2344,-0.6252,-0.0146,0.0,0.0,0.0,0.0035,-0.0225,0.04,4539.2 +76,60,0.81,0.0,5.26,0.09,0.22,0.0,3.29,-0.2307,-0.6254,-0.0111,0.0,0.0,0.0,0.0037,-0.0157,0.0521,4603.4 +77,60,0.82,0.0,4.76,0.08,0.26,0.0,3.2,-0.2265,-0.6256,-0.0097,0.0,0.0,0.0,0.0043,-0.0068,0.047,4663.19 +78,60,0.81,0.0,4.65,0.07,0.26,0.0,3.57,-0.2227,-0.6257,-0.0083,0.0,0.0,0.0,0.0038,-0.0141,0.0458,4720.42 +79,60,0.76,0.0,4.35,0.07,0.25,0.0,2.12,-0.2193,-0.6259,-0.0043,0.0,0.0,0.0,0.0034,-0.0178,0.0351,4782.22 +80,60,0.74,0.0,4.17,0.06,0.24,0.0,2.05,-0.216,-0.626,-0.0043,0.0,0.0,0.0,0.0033,-0.0211,0.0292,4839.78 +81,60,0.84,0.0,5.0,0.06,0.34,0.0,4.44,-0.2115,-0.6262,0.0154,0.0,0.0,0.0,0.0045,-0.0152,0.0463,4899.66 +82,60,0.77,0.0,6.0,0.05,0.34,0.0,4.81,-0.2087,-0.6263,-0.0028,0.0,0.0,0.0,0.0029,-0.0223,0.0368,4962.62 +83,60,0.88,0.0,6.12,0.05,0.41,0.0,5.37,-0.2047,-0.6264,0.0058,0.0,0.0,0.0,0.004,-0.0047,0.0261,5022.63 +84,60,0.89,0.0,5.88,0.04,0.45,0.0,5.28,-0.2011,-0.6265,0.0095,0.0,0.0,0.0,0.0036,-0.0043,0.0341,5081.55 +85,60,0.97,0.0,6.45,0.04,0.5,0.0,5.41,-0.1971,-0.6266,0.0101,0.0,0.0,0.0,0.0039,-0.0208,0.0556,5139.73 +86,60,0.99,0.0,6.25,0.04,0.53,0.0,5.69,-0.1934,-0.6267,0.0069,0.0,0.0,0.0,0.0037,-0.0166,0.0411,5200.08 +87,60,0.96,0.0,5.88,0.03,0.49,0.0,5.39,-0.1903,-0.6268,-0.0011,0.0,0.0,0.0,0.0031,-0.0264,0.0374,5263.5 +88,60,0.85,0.0,5.26,0.03,0.47,0.0,4.79,-0.1878,-0.6269,-0.0011,0.0,0.0,0.0,0.0025,-0.0218,0.0522,5323.34 +89,60,0.93,0.0,5.0,0.03,0.45,0.0,4.52,-0.1842,-0.6269,-0.003,0.0,0.0,0.0,0.0035,-0.0259,0.0487,5382.59 +90,60,0.98,0.0,5.13,0.03,0.48,0.0,4.73,-0.18,-0.627,-0.003,0.0,0.0,0.0,0.0042,-0.0246,0.0478,5441.13 +91,60,1.09,0.0,9.3,0.03,0.52,0.0,10.07,-0.1749,-0.6271,0.025,0.0,0.0,0.0,0.0051,-0.0222,0.0484,5501.48 +92,60,1.22,0.0,8.33,0.03,0.57,0.0,9.25,-0.1688,-0.6271,0.0141,0.0,0.0,0.0,0.0062,-0.023,0.0461,5561.34 +93,60,1.21,0.0,8.51,0.03,0.55,0.0,9.33,-0.1633,-0.6272,0.0124,0.0,0.0,0.0,0.0055,-0.0278,0.04,5622.82 +94,60,1.29,0.0,9.09,0.04,0.7,0.0,10.03,-0.1567,-0.6272,0.0161,0.0,0.0,0.0,0.0065,-0.0161,0.0459,5680.67 +95,60,1.22,0.0,6.82,0.04,0.63,0.0,7.03,-0.1524,-0.6272,-0.0065,0.0,-0.0,-0.0,0.0044,-0.0277,0.0358,5741.75 +96,60,1.3,0.0,8.33,0.04,0.72,0.0,8.76,-0.1464,-0.6041,0.012,0.0,0.0,0.0,0.006,-0.0194,0.0354,5802.06 +97,60,1.36,0.0,8.89,0.05,0.87,0.0,9.62,-0.1408,-0.5908,0.0149,0.0,0.0,0.0,0.0056,-0.0067,0.0507,5863.71 +98,60,1.45,0.0,9.3,0.05,1.0,0.0,10.19,-0.1357,-0.5908,0.014,0.0,-0.0,-0.0,0.0051,-0.0092,0.0329,5920.25 +99,60,1.45,0.0,9.38,0.06,1.08,0.0,10.17,-0.1317,-0.5908,0.0116,0.0,-0.0,-0.0,0.004,-0.0389,0.0455,5979.64 +100,60,1.46,0.0,9.68,0.06,1.12,0.0,10.64,-0.1284,-0.5908,0.01,0.0,-0.0,-0.0,0.0033,-0.0184,0.0391,6041.79 +101,60,1.21,0.0,6.67,0.07,0.9,0.0,6.69,-0.1281,-0.5909,0.0122,0.0,-0.0,-0.0,0.0003,-0.0417,0.0358,6102.72 +102,60,1.03,0.0,6.45,0.09,0.74,0.0,6.19,-0.1276,-0.5909,0.0076,0.0,-0.0,-0.0,0.0005,-0.0255,0.03,6160.74 +103,60,1.09,0.0,6.67,0.09,0.82,0.0,7.08,-0.1249,-0.5909,0.0376,0.0,-0.0,-0.0,0.0027,-0.0228,0.0322,6221.2 +104,60,1.15,0.0,6.9,0.09,0.76,0.0,6.89,-0.1222,-0.5909,0.0263,0.0,0.0,0.0,0.0027,-0.0242,0.0423,6278.26 +105,60,1.16,0.0,6.45,0.05,0.73,0.0,6.38,-0.1189,-0.5909,0.0172,0.0,0.0,0.0,0.0033,-0.018,0.0422,6343.71 +106,60,1.1,0.0,5.88,0.09,0.67,0.0,5.66,-0.1159,-0.5909,0.0105,0.0,-0.0,-0.0,0.003,-0.0232,0.0412,6399.28 +107,60,1.15,0.0,6.38,0.08,0.69,0.0,6.9,-0.1118,-0.5909,0.022,0.0,0.0,0.0,0.0041,-0.0321,0.045,6463.62 +108,60,1.09,0.0,6.52,0.07,0.7,0.0,7.15,-0.1085,-0.5909,0.0204,0.0,0.0,0.0,0.0034,-0.0269,0.0246,6521.77 +109,60,1.01,0.0,6.38,0.07,0.68,0.0,6.89,-0.106,-0.5909,0.0148,0.0,0.0,0.0,0.0025,-0.0194,0.0248,6583.01 +110,60,0.92,0.0,6.0,0.06,0.62,0.0,6.31,-0.1042,-0.5909,0.0075,0.0,0.0,0.0,0.0018,-0.0236,0.0257,6641.79 +111,60,0.88,0.0,4.26,0.05,0.59,0.0,4.35,-0.1022,-0.591,0.003,0.0,-0.0,-0.0,0.002,-0.0223,0.0271,6702.08 +112,60,1.04,0.0,5.71,0.06,0.76,0.0,6.27,-0.0984,-0.591,0.0281,0.0,-0.0,-0.0,0.0038,-0.0025,0.0306,6760.07 +113,60,0.94,0.0,5.56,0.06,0.66,0.0,6.19,-0.0972,-0.591,0.0227,0.0,-0.0,-0.0,0.0012,-0.0234,0.027,6823.44 +114,60,0.86,0.0,5.41,0.06,0.66,0.0,5.89,-0.0957,-0.591,0.0164,0.0,-0.0,-0.0,0.0015,-0.0164,0.0257,6880.45 +115,60,0.83,0.0,5.41,0.07,0.63,0.0,5.79,-0.0946,-0.591,0.0129,0.0,0.0,0.0,0.0012,-0.0191,0.0221,6941.79 +116,60,0.84,0.0,5.56,0.07,0.68,0.0,5.91,-0.0929,-0.591,0.0288,0.0,-0.0,-0.0,0.0017,-0.019,0.0282,7001.91 +117,60,0.7,0.0,5.26,0.04,0.54,0.0,5.91,-0.0932,-0.591,0.0246,0.0,0.0,0.0,-0.0003,-0.0333,0.0239,7062.35 +118,60,0.65,0.0,5.08,0.03,0.5,0.0,4.99,-0.0927,-0.591,0.0032,0.0,0.0,0.0,0.0005,-0.0342,0.0238,7124.5 +119,60,0.74,0.0,3.7,0.03,0.52,0.0,3.35,-0.0908,-0.591,-0.0024,0.0,0.0,0.0,0.0019,-0.0141,0.0254,7182.1 +120,60,1.96,0.0,11.9,0.04,1.59,0.0,11.1,-0.0769,-0.591,0.0395,0.0,0.0,0.0,0.0138,-0.0019,0.1188,7244.41 +121,57,4.1,0.0,14.29,0.05,3.7,0.0,16.02,-0.053,-0.5607,0.0741,0.0,-0.0,-0.0,0.0259,-0.0028,0.1241,7299.58 +122,60,6.07,0.0,16.36,0.14,6.19,0.0,21.0,-0.0256,-0.5296,0.1266,0.0,0.0,0.0,0.0267,-0.0248,0.1078,7362.02 +123,60,8.42,0.0,19.64,0.14,9.25,0.0,26.77,0.0026,-0.5012,0.1536,0.0,0.0,0.0,0.0282,-0.0103,0.1017,7420.47 +124,60,10.1,2.04,20.37,0.14,11.69,0.0,28.62,0.0216,-0.4757,0.1492,0.0,-0.0,-0.0,0.0189,-0.0244,0.1188,7483.11 +125,60,11.77,2.0,26.92,0.14,14.09,1.83,37.74,0.0379,-0.3672,0.2246,0.0,0.0,0.0,0.0164,-0.0297,0.1085,7544.27 +126,60,13.53,1.89,28.85,0.14,16.77,1.79,44.44,0.0539,-0.2831,0.2431,0.0,-0.0,-0.0,0.016,-0.0354,0.1105,7603.22 +127,60,14.83,1.75,28.3,0.14,18.84,1.63,44.84,0.0622,-0.2,0.2058,0.0,0.0,0.0,0.0083,-0.0548,0.083,7662.91 +128,60,16.85,1.89,27.27,0.14,21.79,1.8,42.36,0.0765,-0.139,0.1702,0.0,0.0,0.0,0.0142,-0.055,0.0772,7721.62 +129,60,18.76,2.04,31.58,0.14,24.93,1.99,48.31,0.0898,-0.0591,0.2011,0.0,-0.0,-0.0,0.0134,-0.0278,0.0799,7781.72 +130,60,19.48,2.17,32.79,0.14,26.41,2.16,52.0,0.0872,-0.0669,0.1981,0.0,0.0,0.0,-0.0027,-0.1215,0.074,7844.2 +131,60,19.88,4.17,35.0,0.14,27.05,4.59,56.78,0.078,-0.0414,0.2109,0.0,-0.0,-0.0,-0.0091,-0.0892,0.0651,7900.28 +132,60,20.02,4.55,31.67,0.14,27.07,5.08,51.76,0.0652,-0.0617,0.1904,0.0,-0.0,-0.0,-0.0128,-0.1098,0.1002,7963.02 +133,60,19.83,4.55,29.55,0.14,26.46,5.01,44.42,0.0492,-0.0768,0.1568,0.0,-0.0,-0.0,-0.016,-0.1342,0.0954,8021.77 +134,60,20.26,6.52,30.51,0.14,26.71,7.41,46.27,0.0431,-0.1358,0.1328,0.0,0.0,0.0,-0.0061,-0.0746,0.0721,8082.62 +135,60,20.42,7.84,30.65,0.14,26.86,9.14,46.74,0.0371,-0.1194,0.1737,0.0,-0.0,-0.0,-0.006,-0.0708,0.0504,8140.92 +136,60,20.68,8.33,31.88,0.14,27.12,9.75,48.67,0.0332,-0.0946,0.1754,0.0,0.0,0.0,-0.004,-0.1227,0.085,8201.43 +137,60,21.53,7.89,30.91,0.14,28.37,7.89,47.03,0.038,-0.1075,0.1963,0.0,-0.0,-0.0,0.0049,-0.0617,0.0952,8263.56 +138,60,21.34,8.33,30.65,0.14,28.24,8.3,45.25,0.0306,-0.1002,0.1487,0.0,-0.0,-0.0,-0.0074,-0.0864,0.0656,8321.34 +139,60,21.36,7.69,31.03,0.14,28.17,6.8,47.03,0.0249,-0.1183,0.1354,0.0,0.0,0.0,-0.0057,-0.1048,0.0899,8378.62 +140,60,21.76,7.89,31.75,0.14,28.72,7.88,48.3,0.0254,-0.0615,0.1282,0.0,-0.0,-0.0,0.0005,-0.0618,0.0616,8440.22 +141,60,21.39,6.25,31.03,0.14,28.22,4.86,47.02,0.017,-0.1032,0.1307,0.0,0.0,0.0,-0.0084,-0.0834,0.0452,8502.64 +142,60,20.68,7.32,30.51,0.14,26.9,6.72,45.95,0.0031,-0.0978,0.1453,0.0,-0.0,-0.0,-0.0139,-0.1092,0.0693,8561.15 +143,60,20.74,8.16,30.36,0.14,26.62,7.57,45.05,0.0003,-0.1267,0.1261,0.0,0.0,0.0,-0.0028,-0.1094,0.0655,8621.83 +144,60,20.62,10.0,36.21,0.14,26.37,9.02,55.03,-0.0019,-0.1321,0.2077,0.0,0.0,0.0,-0.0022,-0.1265,0.0997,8681.72 +145,60,20.22,8.7,33.9,0.14,25.77,6.88,56.02,-0.0066,-0.1398,0.1813,0.0,0.0,0.0,-0.0047,-0.0652,0.0834,8739.75 +146,60,20.37,8.0,33.33,0.14,25.93,5.96,54.64,-0.0041,-0.1434,0.1499,0.0,-0.0,-0.0,0.0025,-0.0824,0.1074,8802.35 +147,59,20.06,8.33,34.62,0.14,25.4,7.15,52.21,-0.0071,-0.1388,0.1273,0.0,0.0,0.0,-0.0003,-0.1158,0.0895,8864.31 +148,60,20.61,6.82,33.96,0.09,26.23,5.48,53.58,0.0002,-0.1474,0.1335,0.0,-0.0,-0.0,0.0046,-0.1041,0.0927,8922.05 +149,60,20.49,7.84,30.91,0.09,26.13,6.98,47.84,-0.0006,-0.1352,0.1797,0.0,0.0,0.0,-0.0008,-0.0925,0.0579,8983.11 +150,60,20.43,8.7,33.93,0.09,26.04,8.69,49.98,-0.0013,-0.1366,0.1754,0.0,0.0,0.0,-0.0007,-0.0832,0.0637,9042.76 +151,60,20.4,7.27,31.48,0.09,25.94,4.9,48.27,-0.0019,-0.1756,0.153,0.0,-0.0,-0.0,-0.0007,-0.0794,0.074,9103.11 +152,60,20.79,7.27,35.19,0.09,26.47,5.13,53.96,0.0028,-0.1237,0.1139,0.0,0.0,0.0,0.0048,-0.0924,0.0817,9162.51 +153,60,21.27,11.54,33.33,0.09,27.31,12.81,52.53,0.0093,-0.095,0.1557,0.0,-0.0,-0.0,0.0065,-0.1021,0.1069,9220.37 +154,60,20.78,12.5,29.55,0.09,26.68,13.51,43.64,0.0025,-0.1789,0.116,0.0,0.0,0.0,-0.0068,-0.0939,0.0642,9280.24 +155,60,20.91,12.2,31.58,0.09,26.72,12.56,47.8,0.0024,-0.1878,0.1313,0.0,-0.0,-0.0,-0.0001,-0.0709,0.0632,9342.16 +156,60,20.2,8.0,32.26,0.09,25.67,7.17,50.04,-0.0067,-0.1904,0.1282,0.0,-0.0,-0.0,-0.0092,-0.0859,0.056,9402.75 +157,60,20.14,6.12,32.84,0.09,25.4,4.53,51.44,-0.0078,-0.1532,0.1184,0.0,0.0,0.0,-0.0011,-0.0839,0.0717,9461.1 +158,60,19.48,8.16,30.36,0.09,24.39,7.27,47.01,-0.0149,-0.1329,0.1221,0.0,0.0,0.0,-0.0071,-0.0955,0.0754,9523.21 +159,60,19.14,5.88,29.09,0.09,23.75,3.03,42.92,-0.0177,-0.1643,0.0988,0.0,0.0,0.0,-0.0028,-0.0671,0.1072,9581.83 +160,60,19.01,6.25,32.65,0.09,23.54,3.98,47.54,-0.0166,-0.1442,0.0972,0.0,-0.0,-0.0,0.0012,-0.0747,0.0665,9641.92 +161,60,19.08,4.26,32.69,0.09,23.67,1.82,49.2,-0.0127,-0.1495,0.1193,0.0,0.0,0.0,0.0039,-0.0802,0.1135,9701.07 +162,60,18.87,4.65,32.08,0.09,23.5,2.68,48.51,-0.0121,-0.12,0.1161,0.0,-0.0,-0.0,0.0006,-0.0607,0.0832,9762.32 +163,58,18.25,6.82,32.08,0.09,22.55,5.76,48.48,-0.0181,-0.1031,0.0905,0.0,0.0,0.0,-0.0072,-0.1158,0.0464,9818.17 +164,60,18.49,6.25,31.37,0.03,22.63,5.48,47.63,-0.0143,-0.1535,0.0816,0.0,0.0,0.0,0.0046,-0.0634,0.1004,9879.93 +165,60,18.84,7.84,31.25,0.03,23.22,7.49,45.08,-0.007,-0.1123,0.1021,0.0,0.0,0.0,0.0073,-0.0608,0.1021,9941.12 +166,60,19.12,7.84,29.31,0.03,23.73,7.91,42.86,-0.0017,-0.1373,0.1547,0.0,0.0,0.0,0.0054,-0.0664,0.1259,10001.51 +167,60,18.81,6.0,34.33,0.03,23.46,4.77,51.26,-0.0036,-0.1753,0.1842,0.0,-0.0,-0.0,-0.002,-0.0648,0.0867,10065.13 +168,60,18.98,7.27,37.33,0.03,23.75,6.59,61.06,-0.0006,-0.1467,0.2351,0.0,0.0,0.0,0.003,-0.1112,0.0752,10123.05 +169,60,19.09,7.14,32.84,0.03,24.04,5.65,55.8,0.0019,-0.1498,0.1745,0.0,0.0,0.0,0.0025,-0.083,0.0854,10183.47 +170,60,19.42,7.14,32.35,0.03,24.6,5.71,52.23,0.0062,-0.1901,0.1382,0.0,-0.0,-0.0,0.0043,-0.0865,0.0949,10241.42 +171,60,19.26,5.45,31.51,0.03,24.45,2.98,48.91,0.004,-0.1543,0.1114,0.0,0.0,0.0,-0.0022,-0.0986,0.0824,10305.08 +172,60,19.56,6.98,31.75,0.03,24.85,5.27,48.3,0.0066,-0.1415,0.1317,0.0,-0.0,-0.0,0.0026,-0.0742,0.1083,10361.89 +173,60,20.94,6.82,33.93,0.03,26.95,5.92,51.96,0.023,-0.1169,0.1307,0.0,0.0,0.0,0.0164,-0.0479,0.166,10421.67 +174,60,21.07,8.33,33.33,0.03,27.55,8.02,51.01,0.0242,-0.1171,0.1233,0.0,-0.0,-0.0,0.0012,-0.0873,0.1074,10481.64 +175,60,21.37,7.84,36.51,0.03,28.11,7.7,55.58,0.0248,-0.0991,0.1321,0.0,0.0,0.0,0.0006,-0.1315,0.0807,10542.29 +176,60,21.12,7.89,37.93,0.04,27.83,6.95,60.52,0.0184,-0.1339,0.152,0.0,-0.0,-0.0,-0.0064,-0.0979,0.0626,10602.3 +177,60,20.94,9.09,34.55,0.04,27.39,8.69,57.36,0.0116,-0.1185,0.1154,0.0,0.0,0.0,-0.0067,-0.1187,0.0774,10662.15 +178,60,20.78,8.33,34.09,0.04,26.96,7.07,49.81,0.0061,-0.178,0.217,0.0,-0.0,-0.0,-0.0055,-0.1036,0.1231,10721.5 +179,58,20.75,6.0,34.09,0.04,26.83,4.23,54.99,0.0021,-0.1379,0.2298,0.0,-0.0,-0.0,-0.0037,-0.1011,0.0877,10782.0 +180,57,20.32,5.88,31.91,0.06,25.99,4.29,52.4,-0.0006,-0.1193,0.17,0.0,-0.0,-0.0,-0.002,-0.0635,0.0927,10844.83 +181,60,20.49,6.38,33.96,0.12,26.19,5.26,53.04,-0.0016,-0.1279,0.1642,0.0,-0.0,-0.0,-0.0023,-0.0889,0.0719,10899.35 +182,60,20.75,6.38,33.33,0.07,26.6,5.25,53.67,0.0022,-0.1377,0.1587,0.0,0.0,0.0,0.0037,-0.1425,0.1083,10961.53 +183,60,19.99,6.52,34.48,0.07,25.66,5.77,55.47,-0.0061,-0.1502,0.1386,0.0,-0.0,-0.0,-0.0083,-0.1137,0.0536,11019.66 +184,60,19.84,6.67,32.65,0.07,25.16,5.81,50.62,-0.0092,-0.1834,0.1501,0.0,0.0,0.0,-0.0031,-0.1166,0.0633,11081.79 +185,60,19.06,7.27,30.16,0.07,23.83,6.3,47.14,-0.0188,-0.1709,0.1029,0.0,-0.0,-0.0,-0.0096,-0.0814,0.0648,11142.45 +186,60,19.22,4.88,31.67,0.06,23.76,4.27,46.89,-0.0162,-0.1608,0.1036,0.0,0.0,0.0,0.0026,-0.064,0.0852,11201.98 +187,60,19.95,5.13,35.82,0.08,24.94,4.48,54.76,-0.0037,-0.1404,0.1869,0.0,0.0,0.0,0.0125,-0.0569,0.0888,11263.05 +188,60,20.14,5.26,34.85,0.08,25.57,4.8,56.39,0.0022,-0.1295,0.1584,0.0,-0.0,-0.0,0.0059,-0.1003,0.0997,11323.14 +189,59,20.24,2.63,36.51,0.12,25.98,1.61,59.67,0.0054,-0.159,0.1429,0.0,-0.0,-0.0,0.0029,-0.056,0.098,11381.23 +190,60,20.15,6.67,36.51,0.1,25.97,6.24,60.57,0.0043,-0.1758,0.1372,0.0,-0.0,-0.0,-0.0008,-0.0961,0.0693,11442.15 +191,60,20.08,7.14,36.67,0.1,25.81,7.0,60.79,0.0022,-0.1351,0.1505,0.0,-0.0,-0.0,-0.0021,-0.0646,0.0578,11501.48 +192,60,19.48,7.32,32.0,0.1,24.7,7.36,49.43,-0.0074,-0.1263,0.1513,0.0,0.0,0.0,-0.0096,-0.1585,0.053,11561.68 +193,60,19.61,9.43,33.33,0.1,24.63,8.75,49.22,-0.0067,-0.1245,0.1463,0.0,-0.0,-0.0,0.0007,-0.0543,0.069,11622.58 +194,60,19.57,10.87,35.71,0.1,24.56,10.46,56.81,-0.0062,-0.1593,0.1839,0.0,0.0,0.0,0.0005,-0.0662,0.1344,11682.41 +195,60,20.03,8.89,38.33,0.12,25.32,7.21,64.24,0.0011,-0.1304,0.2152,0.0,0.0,0.0,0.0073,-0.1055,0.0648,11743.07 +196,60,20.06,8.7,35.94,0.13,25.61,7.05,62.07,0.0034,-0.1255,0.1612,0.0,0.0,0.0,0.0022,-0.0882,0.0997,11800.47 +197,60,19.31,7.5,37.5,0.14,24.63,6.62,63.53,-0.0053,-0.1403,0.1465,0.0,0.0,0.0,-0.0087,-0.1136,0.0692,11860.36 +198,60,19.49,6.67,35.82,0.14,24.7,5.7,60.3,-0.0038,-0.1606,0.1375,0.0,0.0,0.0,0.0015,-0.062,0.0679,11922.86 +199,60,19.05,4.26,32.86,0.09,23.97,2.42,52.84,-0.0094,-0.1769,0.1899,0.0,-0.0,-0.0,-0.0055,-0.1039,0.0701,11981.76 +200,60,18.6,6.25,36.99,0.08,23.11,4.88,57.41,-0.015,-0.151,0.1158,0.0,-0.0,-0.0,-0.0056,-0.1028,0.0722,12042.25 +201,60,18.98,6.12,35.37,0.09,23.53,5.16,56.16,-0.0089,-0.1544,0.1547,0.0,-0.0,-0.0,0.0061,-0.07,0.1229,12101.2 +202,60,19.38,7.69,32.5,0.09,24.23,6.8,50.13,-0.0016,-0.1178,0.1465,0.0,-0.0,-0.0,0.0073,-0.0688,0.1186,12164.26 +203,60,19.62,7.89,30.61,0.09,24.71,6.97,44.18,0.0027,-0.1169,0.1544,0.0,0.0,0.0,0.0043,-0.0877,0.0846,12223.63 +204,60,20.09,7.89,32.73,0.09,25.49,6.93,49.67,0.0087,-0.1143,0.1454,0.0,-0.0,-0.0,0.006,-0.1081,0.0813,12279.14 +205,60,20.43,8.89,31.48,0.09,26.16,7.82,48.98,0.0128,-0.1211,0.1582,0.0,-0.0,-0.0,0.0041,-0.065,0.0877,12341.42 +206,60,20.31,7.69,31.58,0.06,26.11,5.52,45.45,0.0103,-0.146,0.1475,0.0,-0.0,-0.0,-0.0025,-0.0682,0.0927,12403.25 +207,60,20.55,7.02,31.48,0.09,26.47,4.74,47.35,0.0116,-0.1809,0.1482,0.0,-0.0,-0.0,0.0013,-0.0625,0.0617,12460.71 +208,60,20.7,5.13,30.91,0.12,26.73,2.8,47.37,0.0118,-0.1269,0.1557,0.0,0.0,0.0,0.0002,-0.0997,0.1265,12520.64 +209,60,20.87,5.13,33.33,0.12,27.08,3.8,52.17,0.0127,-0.113,0.1759,0.0,0.0,0.0,0.0009,-0.0897,0.052,12583.15 +210,60,21.23,4.88,34.62,0.12,27.64,3.71,55.76,0.0153,-0.1111,0.1677,0.0,-0.0,-0.0,0.0025,-0.0669,0.0937,12640.22 +211,60,21.36,6.82,33.33,0.12,27.87,6.33,51.63,0.0147,-0.1141,0.2244,0.0,0.0,0.0,-0.0006,-0.1169,0.0739,12700.71 +212,59,21.27,8.51,31.88,0.09,27.76,8.77,50.17,0.0104,-0.0978,0.2053,0.0,0.0,0.0,-0.0044,-0.0978,0.0643,12760.81 +213,57,20.74,12.5,33.33,0.08,26.75,12.43,47.63,0.0001,-0.1241,0.1529,0.0,-0.0,-0.0,-0.0095,-0.1118,0.0755,12822.67 +214,59,20.23,7.69,32.84,0.15,25.8,6.27,49.76,-0.007,-0.1443,0.1228,0.0,-0.0,-0.0,-0.0076,-0.1471,0.0751,12880.76 +215,58,20.05,5.88,31.25,0.23,25.39,4.45,47.46,-0.0089,-0.1218,0.0857,0.0,0.0,0.0,-0.0022,-0.0748,0.0644,12943.29 +216,60,19.7,4.76,31.15,0.03,24.77,2.17,46.86,-0.0127,-0.1449,0.0933,0.0,-0.0,-0.0,-0.0044,-0.1067,0.0559,13000.26 +217,59,19.89,5.0,30.16,0.07,24.93,2.8,45.13,-0.0094,-0.1315,0.1543,0.0,-0.0,-0.0,0.0024,-0.0736,0.0866,13061.39 +218,37,20.57,10.81,27.87,0.34,25.79,11.07,40.32,-0.0048,-0.112,0.1522,0.0,0.0,0.0,0.0048,-0.1221,0.0841,13119.98 +219,60,19.26,4.65,30.0,0.25,24.02,2.79,42.19,-0.0148,-0.1746,0.1486,0.0,-0.0,-0.0,-0.0075,-0.082,0.0638,13180.2 +220,60,19.25,6.25,29.79,0.25,23.87,5.09,42.76,-0.0136,-0.1709,0.1531,0.0,-0.0,-0.0,0.0012,-0.0953,0.0779,13246.57 +221,59,19.39,6.82,29.79,0.16,24.17,5.91,44.1,-0.0088,-0.1697,0.1403,0.0,0.0,0.0,0.004,-0.1076,0.1279,13303.97 +222,60,19.76,8.51,32.08,0.18,24.86,7.16,48.42,-0.0016,-0.1703,0.1457,0.0,0.0,0.0,0.008,-0.0932,0.0677,13362.21 +223,59,20.28,7.84,35.71,0.18,25.88,6.84,54.1,0.0077,-0.1446,0.1749,0.0,-0.0,-0.0,0.0076,-0.0561,0.0862,13420.93 +224,56,19.91,8.33,38.6,0.11,25.36,6.35,63.91,0.0021,-0.1571,0.2275,0.0,-0.0,-0.0,-0.0013,-0.0596,0.0657,13480.11 +225,58,19.79,6.25,37.04,0.14,25.34,4.13,64.47,0.0015,-0.1457,0.1942,0.0,0.0,0.0,-0.0036,-0.0952,0.0755,13537.34 +226,60,19.92,6.82,35.85,0.16,25.48,5.43,61.59,0.0019,-0.1014,0.202,0.0,-0.0,-0.0,0.0008,-0.0601,0.0909,13600.74 +227,60,19.84,4.55,35.09,0.17,25.48,3.52,55.67,0.0016,-0.1222,0.2082,0.0,0.0,0.0,-0.0004,-0.0829,0.0794,13661.33 +228,59,19.52,2.63,36.21,0.19,25.15,0.0,59.24,-0.002,-0.1714,0.1755,0.0,0.0,0.0,-0.0018,-0.0722,0.0639,13721.63 +229,60,19.95,4.65,37.5,0.23,25.78,2.28,60.15,0.0041,-0.1235,0.2029,0.0,-0.0,-0.0,0.0043,-0.1097,0.0912,13783.29 +230,60,20.07,4.76,33.93,0.23,26.01,2.48,56.46,0.0053,-0.1377,0.1456,0.0,0.0,0.0,0.0012,-0.075,0.0811,13843.39 +231,59,20.06,4.76,33.33,0.23,25.91,2.97,53.92,0.0045,-0.135,0.1569,0.0,-0.0,-0.0,-0.002,-0.1036,0.1188,13900.74 +232,59,20.2,5.88,33.33,0.27,26.01,4.47,52.58,0.0027,-0.1257,0.2241,0.0,0.0,0.0,-0.003,-0.0874,0.0904,13960.67 +233,60,19.21,5.56,32.26,0.32,24.39,3.75,50.41,-0.0102,-0.2783,0.2058,0.0,0.0,0.0,-0.0107,-0.1526,0.0557,14020.35 +234,60,19.11,6.25,32.65,0.32,23.94,5.36,50.3,-0.0123,-0.242,0.1636,0.0,-0.0,-0.0,-0.0021,-0.0826,0.1039,14082.13 +235,60,19.55,6.25,32.79,0.27,24.39,5.27,51.11,-0.0065,-0.1672,0.1219,0.0,-0.0,-0.0,0.0059,-0.105,0.0965,14142.66 +236,60,20.18,8.33,33.33,0.27,25.42,7.27,52.17,0.0031,-0.1754,0.1656,0.0,-0.0,-0.0,0.0096,-0.066,0.082,14201.72 +237,60,20.21,9.09,31.03,0.27,25.6,8.42,47.72,0.0041,-0.129,0.1521,0.0,0.0,0.0,0.001,-0.0708,0.0903,14262.16 +238,59,20.58,10.0,31.58,0.27,26.08,9.6,47.05,0.0073,-0.1347,0.1534,0.0,-0.0,-0.0,0.0019,-0.0795,0.1483,14321.55 +239,59,20.37,9.43,31.71,0.22,25.81,9.5,46.64,0.004,-0.1806,0.1396,0.0,-0.0,-0.0,-0.0021,-0.1035,0.0857,14380.82 +240,56,20.23,10.0,34.09,0.07,25.58,9.73,52.13,-0.0034,-0.1746,0.1522,0.0,0.0,0.0,-0.005,-0.0765,0.0564,14443.74 +241,60,19.71,6.98,34.04,0.17,24.75,5.98,54.6,-0.0049,-0.1551,0.1684,0.0,-0.0,-0.0,-0.0043,-0.0872,0.056,14501.94 +242,60,19.38,9.3,32.65,0.07,24.17,8.91,52.44,-0.009,-0.1595,0.1557,0.0,0.0,0.0,-0.004,-0.0662,0.1247,14558.26 +243,60,20.01,8.89,32.0,0.2,25.05,7.91,49.98,-0.0002,-0.1282,0.1484,0.0,-0.0,-0.0,0.0088,-0.0678,0.0709,14623.84 +244,60,19.74,9.52,30.91,0.17,24.87,8.93,46.81,-0.0016,-0.1179,0.1248,0.0,0.0,0.0,-0.0015,-0.1112,0.0564,14678.81 +245,60,19.29,4.88,29.82,0.07,24.23,3.27,43.61,-0.0067,-0.115,0.122,0.0,0.0,0.0,-0.0051,-0.0785,0.0818,14742.66 +246,60,18.64,4.88,32.2,0.07,23.17,3.17,46.68,-0.0144,-0.1171,0.1355,0.0,-0.0,-0.0,-0.0076,-0.0919,0.0692,14801.69 +247,60,18.92,6.98,31.67,0.07,23.38,6.09,48.72,-0.0102,-0.1429,0.1299,0.0,0.0,0.0,0.0041,-0.1075,0.0744,14863.17 +248,60,18.15,2.94,30.0,0.07,22.28,0.51,45.24,-0.0177,-0.127,0.0923,0.0,0.0,0.0,-0.0075,-0.0949,0.0527,14922.08 +249,60,18.29,7.5,28.89,0.07,22.23,7.25,42.48,-0.0152,-0.1284,0.0743,0.0,-0.0,-0.0,0.0025,-0.0896,0.1015,14978.53 +250,60,18.63,8.7,29.23,0.07,22.74,8.69,41.59,-0.0084,-0.1572,0.0865,0.0,0.0,0.0,0.0068,-0.0492,0.0826,15040.88 +251,60,19.12,7.84,30.36,0.07,23.55,7.8,42.91,-0.0002,-0.1489,0.144,0.0,0.0,0.0,0.0081,-0.102,0.1314,15101.33 +252,60,18.98,8.16,31.37,0.07,23.56,8.21,46.26,-0.0001,-0.1639,0.2118,0.0,-0.0,-0.0,0.0001,-0.1735,0.1123,15162.3 +253,60,18.56,8.7,32.73,0.07,23.03,8.28,49.35,-0.0045,-0.1841,0.1968,0.0,-0.0,-0.0,-0.0044,-0.0768,0.1188,15222.6 +254,60,18.96,8.51,35.71,0.07,23.59,9.03,55.87,0.0009,-0.1151,0.1718,0.0,0.0,0.0,0.0054,-0.0957,0.0776,15278.89 +255,60,19.12,8.33,32.69,0.07,23.95,8.57,52.41,0.0037,-0.103,0.1554,0.0,-0.0,-0.0,0.0029,-0.1358,0.0984,15341.17 +256,60,19.35,5.56,34.0,0.07,24.41,4.35,53.08,0.0069,-0.1165,0.158,0.0,0.0,0.0,0.0032,-0.0646,0.0692,15400.52 +257,60,19.37,3.23,32.0,0.21,24.52,1.25,49.34,0.0067,-0.165,0.1388,0.0,-0.0,-0.0,-0.0002,-0.1287,0.0814,15461.74 +258,60,19.74,6.06,33.33,0.21,25.15,4.95,51.52,0.0109,-0.1777,0.1653,0.0,0.0,0.0,0.0041,-0.0935,0.0688,15522.65 +259,60,19.73,3.03,35.59,0.21,25.31,1.58,55.85,0.0104,-0.1323,0.1739,0.0,-0.0,-0.0,-0.0005,-0.0914,0.0708,15583.41 +260,60,19.28,3.03,34.78,0.21,24.62,1.74,56.96,0.0029,-0.1045,0.1541,0.0,0.0,0.0,-0.0075,-0.0826,0.0666,15640.04 +261,60,19.02,3.13,32.81,0.21,23.99,2.07,52.08,-0.0028,-0.1554,0.137,0.0,-0.0,-0.0,-0.0057,-0.0995,0.0821,15703.06 +262,60,19.17,6.06,32.65,0.21,24.04,5.84,50.4,-0.0019,-0.1412,0.1521,0.0,0.0,0.0,0.0009,-0.0775,0.0856,15761.62 +263,60,19.55,8.57,30.95,0.21,24.54,7.37,45.89,0.0025,-0.1578,0.0909,0.0,-0.0,-0.0,0.0044,-0.1308,0.06,15822.47 +264,60,19.5,5.41,33.33,0.21,24.56,3.56,48.77,0.0023,-0.1508,0.0966,0.0,0.0,0.0,-0.0002,-0.0464,0.0655,15879.57 +265,60,19.64,7.5,29.41,0.21,24.7,6.46,41.17,0.0031,-0.1379,0.1483,0.0,0.0,0.0,0.0007,-0.0863,0.1271,15938.7 +266,60,19.94,6.82,32.73,0.21,25.24,4.85,47.03,0.007,-0.1341,0.1789,0.0,-0.0,-0.0,0.004,-0.0564,0.0917,16002.01 +267,60,19.57,7.14,31.48,0.21,24.8,5.92,48.31,0.0022,-0.1045,0.1719,0.0,0.0,0.0,-0.0048,-0.1115,0.1346,16059.24 +268,60,19.47,8.0,32.73,0.21,24.49,7.97,48.85,-0.0007,-0.1402,0.1602,0.0,-0.0,-0.0,-0.0029,-0.0926,0.0857,16122.59 +269,60,19.57,7.55,33.33,0.21,24.62,7.53,51.06,0.0004,-0.1493,0.179,0.0,0.0,0.0,0.0011,-0.0856,0.0699,16181.59 +270,60,19.85,8.51,31.58,0.21,25.11,8.02,47.2,0.0045,-0.1307,0.1565,0.0,0.0,0.0,0.004,-0.0863,0.0925,16238.71 +271,60,19.71,9.8,31.25,0.21,24.99,10.67,48.15,0.0027,-0.1502,0.1547,0.0,0.0,0.0,-0.0018,-0.1065,0.0811,16301.39 +272,60,19.8,8.16,34.48,0.21,25.06,8.07,53.14,0.0029,-0.1143,0.1558,0.0,-0.0,-0.0,0.0002,-0.0632,0.0817,16362.19 +273,60,20.06,8.33,33.33,0.21,25.48,6.76,53.36,0.0059,-0.1143,0.1616,0.0,0.0,0.0,0.003,-0.0503,0.0878,16422.3 +274,60,20.19,8.51,32.2,0.21,25.74,8.74,50.26,0.0071,-0.1145,0.1451,0.0,-0.0,-0.0,0.0012,-0.0707,0.0618,16480.15 +275,60,20.04,8.16,34.55,0.21,25.53,8.13,53.9,0.0042,-0.1206,0.1063,0.0,0.0,0.0,-0.0029,-0.0922,0.08,16540.99 +276,60,19.84,6.38,32.65,0.21,25.12,5.85,47.25,-0.0,-0.1431,0.1192,0.0,0.0,0.0,-0.0042,-0.105,0.0743,16602.22 +277,60,20.1,6.12,31.03,0.21,25.36,5.51,44.79,0.002,-0.0896,0.1396,0.0,0.0,0.0,0.002,-0.0857,0.0536,16661.41 +278,60,20.55,9.62,32.2,0.21,26.06,9.33,47.12,0.0075,-0.0839,0.1265,0.0,-0.0,-0.0,0.0055,-0.068,0.0702,16722.65 +279,60,20.6,10.42,29.79,0.21,26.28,10.53,43.91,0.0081,-0.0759,0.1278,0.0,-0.0,-0.0,0.0005,-0.1043,0.0683,16781.47 +280,60,20.72,10.0,31.91,0.21,26.51,9.22,47.35,0.0086,-0.1365,0.1513,0.0,-0.0,-0.0,0.0006,-0.1058,0.0561,16841.34 +281,60,20.92,8.89,30.3,0.23,26.84,7.72,45.7,0.01,-0.148,0.1753,0.0,-0.0,-0.0,0.0013,-0.0819,0.0869,16900.26 +282,60,20.65,8.89,34.43,0.24,26.57,7.42,53.77,0.006,-0.1794,0.2391,0.0,0.0,0.0,-0.004,-0.0825,0.0637,16960.09 +283,60,20.2,8.7,35.0,0.26,25.89,7.3,58.47,-0.0006,-0.1735,0.2384,0.0,0.0,0.0,-0.0066,-0.0765,0.0696,17019.34 +284,60,19.4,6.98,32.76,0.27,24.53,4.27,55.22,-0.0118,-0.1522,0.1716,0.0,-0.0,-0.0,-0.0113,-0.1176,0.0613,17083.21 +285,60,19.37,6.67,33.33,0.28,24.21,5.63,54.33,-0.0125,-0.1383,0.1356,0.0,0.0,0.0,-0.0007,-0.0703,0.057,17141.72 +286,60,19.62,8.33,31.37,0.28,24.5,7.4,48.2,-0.008,-0.1336,0.1301,0.0,0.0,0.0,0.0045,-0.0737,0.1122,17201.97 +287,60,19.26,7.89,30.36,0.07,24.06,5.92,45.8,-0.0103,-0.1551,0.1398,0.0,-0.0,-0.0,-0.0023,-0.06,0.085,17262.2 +288,60,19.34,8.51,33.33,0.07,24.03,7.93,49.81,-0.0088,-0.1309,0.1383,0.0,-0.0,-0.0,0.0015,-0.0949,0.1138,17318.54 +289,60,19.08,6.12,34.69,0.07,23.68,5.04,54.5,-0.0103,-0.1569,0.1543,0.0,0.0,0.0,-0.0015,-0.0945,0.0735,17380.96 +290,60,19.42,4.26,36.0,0.07,24.21,2.71,58.24,-0.0042,-0.133,0.2196,0.0,0.0,0.0,0.0061,-0.0699,0.0912,17440.16 +291,60,19.06,4.88,37.04,0.07,23.86,3.64,61.17,-0.0064,-0.1248,0.2086,0.0,-0.0,-0.0,-0.0022,-0.1028,0.075,17500.58 +292,60,19.2,7.69,33.33,0.07,23.99,6.46,54.66,-0.0043,-0.1554,0.2207,0.0,0.0,0.0,0.0022,-0.0805,0.1095,17561.5 +293,60,19.41,8.89,32.39,0.07,24.31,8.08,52.58,-0.0008,-0.1067,0.1807,0.0,-0.0,-0.0,0.0034,-0.0759,0.0921,17622.63 +294,60,19.91,8.89,32.89,0.28,25.12,8.87,52.62,0.006,-0.1181,0.151,0.0,0.0,0.0,0.0069,-0.0857,0.0925,17680.57 +295,60,20.03,8.7,33.8,0.07,25.46,8.73,53.7,0.0079,-0.1285,0.1647,0.0,-0.0,-0.0,0.0019,-0.0787,0.0839,17741.46 +296,60,19.71,8.11,35.38,0.07,24.98,7.74,56.51,0.0025,-0.1275,0.1408,0.0,-0.0,-0.0,-0.0054,-0.1044,0.0631,17802.47 +297,60,19.69,5.56,35.59,0.28,24.86,4.19,57.54,0.0011,-0.1322,0.1734,0.0,0.0,0.0,-0.0014,-0.0939,0.0477,17860.99 +298,60,19.14,5.71,32.81,0.28,23.99,4.49,52.71,-0.0063,-0.1639,0.146,0.0,-0.0,-0.0,-0.0074,-0.1573,0.068,17922.31 +299,60,19.39,8.16,32.81,0.28,24.18,5.3,52.2,-0.0037,-0.1734,0.1174,0.0,0.0,0.0,0.0026,-0.0724,0.0884,17979.6 +300,60,18.65,4.55,32.84,0.28,23.12,0.95,51.57,-0.0119,-0.1973,0.1034,0.0,-0.0,-0.0,-0.0083,-0.1345,0.0729,18040.07 +301,60,18.85,6.25,36.92,0.28,23.28,3.5,58.39,-0.0086,-0.1879,0.1408,0.0,0.0,0.0,0.0033,-0.0502,0.0933,18100.23 +302,60,19.38,8.7,36.51,0.28,24.11,7.22,60.07,-0.0002,-0.1744,0.1502,0.0,0.0,0.0,0.0084,-0.0797,0.1262,18159.88 +303,60,19.16,9.3,31.82,0.28,23.97,8.66,50.2,-0.0013,-0.1429,0.1174,0.0,-0.0,-0.0,-0.0011,-0.1032,0.0797,18221.26 +304,60,19.43,9.3,31.71,0.28,24.25,9.01,48.51,0.0012,-0.1054,0.1824,0.0,0.0,0.0,0.0025,-0.082,0.1214,18280.56 +305,60,19.11,8.7,31.82,0.28,23.74,7.88,48.93,-0.0033,-0.1039,0.2045,0.0,0.0,0.0,-0.0045,-0.1392,0.0964,18340.74 +306,60,18.8,4.65,28.0,0.28,23.19,2.3,42.02,-0.0073,-0.1385,0.1284,0.0,-0.0,-0.0,-0.004,-0.0916,0.0529,18402.29 +307,60,19.17,8.82,28.57,0.28,23.61,7.9,40.88,-0.0026,-0.2175,0.1546,0.0,0.0,0.0,0.0047,-0.079,0.1061,18459.55 +308,60,19.33,7.5,31.25,0.28,24.0,6.5,45.52,0.0011,-0.1764,0.1457,0.0,0.0,0.0,0.0037,-0.081,0.0622,18519.55 +309,60,19.33,8.33,31.91,0.28,24.11,6.95,48.04,0.0019,-0.1324,0.1508,0.0,0.0,0.0,0.0007,-0.0624,0.0822,18582.51 +310,60,19.66,6.82,29.79,0.28,24.62,5.99,44.83,0.0058,-0.1158,0.1271,0.0,-0.0,-0.0,0.0039,-0.0806,0.0849,18641.41 +311,60,20.02,5.0,32.14,0.28,25.22,3.7,48.57,0.0098,-0.1108,0.1512,0.0,-0.0,-0.0,0.0041,-0.108,0.1105,18698.82 +312,60,19.64,9.52,33.33,0.28,24.71,9.46,52.16,0.0039,-0.1297,0.1559,0.0,-0.0,-0.0,-0.0059,-0.1029,0.0762,18762.06 +313,60,20.16,9.52,36.67,0.28,25.36,10.14,59.05,0.0087,-0.0915,0.1873,0.0,0.0,0.0,0.0048,-0.0639,0.0901,18820.48 +314,60,19.83,9.76,33.87,0.28,25.03,9.34,55.97,0.0045,-0.1464,0.1304,0.0,-0.0,-0.0,-0.0042,-0.0999,0.1045,18881.33 +315,60,19.98,11.11,31.67,0.28,25.19,9.28,50.08,0.0051,-0.1225,0.1563,0.0,-0.0,-0.0,0.0006,-0.0897,0.071,18942.54 +316,60,20.29,9.76,29.79,0.28,25.68,8.37,44.15,0.0083,-0.1242,0.1142,0.0,0.0,0.0,0.0033,-0.084,0.0955,19001.34 +317,60,20.34,10.64,29.79,0.28,25.86,9.28,43.75,0.0084,-0.1024,0.1333,0.0,0.0,0.0,0.0001,-0.0782,0.0635,19063.19 +318,60,20.63,10.0,31.67,0.28,26.3,8.64,47.79,0.0107,-0.1287,0.1307,0.0,-0.0,-0.0,0.0023,-0.0755,0.072,19118.75 +319,60,20.76,9.09,29.82,0.28,26.53,8.42,44.67,0.0108,-0.0857,0.1638,0.0,-0.0,-0.0,0.0001,-0.0715,0.0915,19178.82 +320,60,20.59,8.51,31.71,0.28,26.28,7.65,47.54,0.0069,-0.1148,0.2312,0.0,0.0,0.0,-0.0039,-0.0855,0.0674,19241.34 +321,60,20.51,4.55,28.85,0.28,26.1,2.63,44.81,0.0043,-0.1129,0.1699,0.0,-0.0,-0.0,-0.0026,-0.0768,0.0951,19301.31 +322,60,20.49,8.33,30.0,0.28,26.03,7.21,43.65,0.003,-0.1579,0.1192,0.0,0.0,0.0,-0.0013,-0.0969,0.0575,19360.41 +323,60,20.51,8.33,32.08,0.28,26.02,6.02,48.7,0.0024,-0.1672,0.1414,0.0,0.0,0.0,-0.0005,-0.0645,0.0994,19421.93 +324,60,20.2,6.82,34.69,0.28,25.58,3.6,54.75,-0.0017,-0.1595,0.1682,0.0,-0.0,-0.0,-0.0041,-0.0788,0.0906,19481.23 +325,60,20.25,5.13,34.0,0.28,25.58,1.95,55.29,-0.0014,-0.1611,0.1447,0.0,0.0,0.0,0.0003,-0.127,0.0732,19541.76 +326,60,20.21,5.13,36.54,0.28,25.65,2.43,59.66,-0.0006,-0.1443,0.157,0.0,-0.0,-0.0,0.0008,-0.0618,0.0821,19600.77 +327,60,20.11,8.77,34.62,0.28,25.55,8.2,54.82,-0.0013,-0.1421,0.1779,0.0,-0.0,-0.0,-0.0007,-0.0971,0.0827,19662.41 +328,60,19.74,6.9,34.69,0.28,24.95,6.09,56.69,-0.006,-0.1339,0.1638,0.0,0.0,0.0,-0.0047,-0.0748,0.0602,19718.66 +329,60,19.41,2.63,30.0,0.28,24.22,0.12,43.28,-0.0112,-0.1258,0.1118,0.0,-0.0,-0.0,-0.0051,-0.1521,0.085,19780.93 +330,60,19.71,7.14,32.76,0.28,24.51,6.55,47.46,-0.0069,-0.1425,0.1233,0.0,0.0,0.0,0.0043,-0.0977,0.103,19840.53 +331,60,19.56,9.09,34.88,0.28,24.42,8.45,50.7,-0.0065,-0.1488,0.1679,0.0,-0.0,-0.0,0.0004,-0.0972,0.1049,19902.04 +332,60,19.65,9.09,33.33,0.28,24.59,6.71,52.94,-0.004,-0.1714,0.1497,0.0,0.0,0.0,0.0025,-0.0655,0.0687,19960.6 +333,60,19.4,6.67,29.73,0.28,24.18,6.3,46.62,-0.0068,-0.1741,0.1302,0.0,-0.0,-0.0,-0.0028,-0.0871,0.0657,20019.69 +334,60,20.01,6.82,32.65,0.28,25.0,6.29,47.41,0.0012,-0.1538,0.125,0.0,0.0,0.0,0.008,-0.093,0.1097,20082.12 +335,60,19.92,7.69,29.17,0.28,25.06,7.22,43.18,0.0015,-0.1784,0.1403,0.0,0.0,0.0,0.0003,-0.0846,0.069,20138.54 +336,60,19.56,8.89,30.77,0.28,24.58,6.08,44.75,-0.0027,-0.1709,0.1373,0.0,-0.0,-0.0,-0.0042,-0.0877,0.1138,20200.09 +337,60,19.46,8.93,30.36,0.28,24.37,7.27,44.27,-0.004,-0.1571,0.1266,0.0,0.0,0.0,-0.0013,-0.0647,0.0851,20261.03 +338,60,19.65,10.0,31.82,0.07,24.61,9.35,47.99,-0.0013,-0.1646,0.167,0.0,0.0,0.0,0.0027,-0.0894,0.0674,20319.86 +339,60,19.65,8.51,31.91,0.07,24.67,7.21,50.3,-0.0006,-0.1514,0.1585,0.0,0.0,0.0,0.0007,-0.082,0.0755,20380.58 +340,60,19.78,9.3,32.61,0.28,24.82,7.07,51.81,0.0008,-0.1429,0.1446,0.0,-0.0,-0.0,0.0014,-0.083,0.0648,20441.61 +341,60,19.24,5.41,36.0,0.07,24.06,2.4,57.99,-0.0057,-0.158,0.172,0.0,-0.0,-0.0,-0.0065,-0.0773,0.0686,20499.73 +342,60,19.26,8.57,37.25,0.28,24.0,6.62,62.35,-0.0052,-0.1261,0.1797,0.0,-0.0,-0.0,0.0005,-0.0692,0.0715,20562.44 +343,60,19.68,10.53,36.54,0.28,24.61,10.23,62.18,0.0007,-0.115,0.1483,0.0,-0.0,-0.0,0.0059,-0.0512,0.1077,20619.12 +344,60,19.47,8.7,33.33,0.28,24.45,7.6,55.28,-0.0007,-0.0925,0.1653,0.0,0.0,0.0,-0.0014,-0.0823,0.0487,20679.9 +345,60,19.0,6.98,30.36,0.28,23.7,5.39,45.35,-0.0069,-0.1305,0.108,0.0,-0.0,-0.0,-0.0062,-0.109,0.0602,20741.96 +346,60,18.95,6.67,28.3,0.07,23.45,4.83,40.43,-0.0078,-0.1463,0.099,0.0,0.0,0.0,-0.0009,-0.1033,0.0701,20802.21 +347,60,19.22,6.67,32.69,0.07,23.81,4.59,47.55,-0.0035,-0.1252,0.0921,0.0,0.0,0.0,0.0043,-0.0821,0.0757,20860.49 +348,60,19.05,5.13,36.0,0.28,23.72,3.17,55.82,-0.0037,-0.1314,0.1456,0.0,0.0,0.0,-0.0002,-0.0648,0.0848,20919.36 +349,60,19.07,0.0,33.33,0.28,23.9,0.0,53.81,-0.002,-0.1406,0.1612,0.0,-0.0,-0.0,0.0017,-0.0863,0.0746,20979.17 +350,60,18.79,0.0,31.48,0.28,23.53,0.0,46.92,-0.0052,-0.1437,0.1503,0.0,0.0,0.0,-0.0031,-0.1116,0.0945,21039.92 +351,60,19.25,4.0,32.08,0.28,24.03,1.79,49.26,-0.0002,-0.1251,0.1344,0.0,-0.0,-0.0,0.005,-0.1291,0.0778,21100.12 +352,60,19.44,5.26,32.08,0.07,24.38,4.01,49.67,0.0028,-0.1059,0.1363,0.0,0.0,0.0,0.003,-0.1011,0.0891,21157.34 +353,60,18.84,4.76,32.69,0.07,23.58,3.72,50.52,-0.0043,-0.1372,0.1265,0.0,-0.0,-0.0,-0.0071,-0.0831,0.0641,21222.05 +354,60,19.62,6.98,34.43,0.08,24.61,4.39,51.78,0.005,-0.159,0.2147,0.0,0.0,0.0,0.0093,-0.0821,0.0883,21282.53 +355,60,19.74,9.52,32.65,0.1,24.99,7.75,50.69,0.0073,-0.1044,0.1745,0.0,0.0,0.0,0.0023,-0.0706,0.0656,21340.64 +356,60,19.88,6.98,34.92,0.28,25.28,5.59,54.71,0.0085,-0.129,0.148,0.0,0.0,0.0,0.0012,-0.0783,0.0652,21401.09 +357,60,19.72,6.67,35.29,0.28,25.11,4.88,56.63,0.0056,-0.104,0.164,0.0,-0.0,-0.0,-0.0029,-0.1031,0.0966,21460.1 +358,60,19.66,4.44,34.38,0.28,24.93,2.44,54.47,0.0032,-0.1104,0.1867,0.0,0.0,0.0,-0.0024,-0.0924,0.0922,21519.84 +359,60,19.76,4.65,33.33,0.28,25.0,2.98,51.45,0.0033,-0.137,0.1351,0.0,-0.0,-0.0,0.0001,-0.0983,0.1013,21581.71 +360,60,20.31,6.67,34.48,0.28,25.81,5.83,54.52,0.0094,-0.1619,0.1399,0.0,-0.0,-0.0,0.0062,-0.1011,0.1202,21638.68 +361,60,19.99,6.82,36.54,0.15,25.51,3.85,57.54,0.0053,-0.1566,0.1511,0.0,-0.0,-0.0,-0.0041,-0.0793,0.0985,21697.74 +362,60,20.01,6.52,34.69,0.15,25.37,3.88,56.9,0.0033,-0.1302,0.1817,0.0,-0.0,-0.0,-0.002,-0.0924,0.0797,21762.8 +363,60,20.26,5.88,32.56,0.15,25.63,3.6,52.13,0.0049,-0.1109,0.1795,0.0,-0.0,-0.0,0.0016,-0.0598,0.1105,21818.28 +364,60,19.64,5.45,38.64,0.15,24.76,3.48,61.12,-0.0031,-0.169,0.1618,0.0,0.0,0.0,-0.0081,-0.1099,0.0902,21879.35 +365,60,20.03,4.88,40.48,0.28,25.25,2.92,68.34,0.0015,-0.1364,0.1648,0.0,0.0,0.0,0.0046,-0.0746,0.067,21938.41 +366,60,20.17,5.66,37.78,0.28,25.58,4.4,65.72,0.004,-0.1576,0.1424,0.0,-0.0,-0.0,0.0025,-0.0645,0.1025,22001.72 +367,60,19.67,1.75,35.42,0.28,24.9,0.0,59.38,-0.0024,-0.1582,0.1377,0.0,-0.0,-0.0,-0.0064,-0.0721,0.0794,22063.31 +368,60,19.45,5.36,34.78,0.28,24.35,4.31,55.31,-0.0066,-0.1358,0.136,0.0,0.0,0.0,-0.0042,-0.1085,0.0833,22122.12 +369,60,19.39,7.69,29.31,0.28,24.07,7.62,44.27,-0.0078,-0.1396,0.1227,0.0,0.0,0.0,-0.0012,-0.1018,0.0757,22180.3 +370,60,19.16,8.7,32.2,0.28,23.64,7.78,49.18,-0.0101,-0.1902,0.1432,0.0,-0.0,-0.0,-0.0023,-0.0993,0.1165,22242.43 +371,60,19.47,9.3,32.79,0.28,24.14,8.1,50.92,-0.0042,-0.1894,0.1459,0.0,0.0,0.0,0.0059,-0.0803,0.0637,22299.01 +372,60,19.71,6.98,32.76,0.28,24.65,4.73,51.49,0.0008,-0.1537,0.1354,0.0,-0.0,-0.0,0.005,-0.0683,0.0746,22359.73 +373,60,19.47,7.89,33.33,0.28,24.42,7.14,51.81,-0.0014,-0.1207,0.1123,0.0,-0.0,-0.0,-0.0021,-0.1308,0.082,22420.29 +374,60,19.46,9.3,31.67,0.28,24.28,8.18,45.97,-0.0023,-0.1837,0.1931,0.0,0.0,0.0,-0.0009,-0.1297,0.0808,22480.08 +375,60,19.2,8.0,33.33,0.28,23.85,7.11,52.62,-0.0055,-0.189,0.2163,0.0,-0.0,-0.0,-0.0032,-0.0657,0.0515,22540.07 +376,60,19.24,8.51,32.14,0.28,23.83,7.61,47.97,-0.0047,-0.145,0.1415,0.0,0.0,0.0,0.0008,-0.0748,0.0745,22600.64 +377,60,19.85,7.14,35.59,0.28,24.8,5.73,54.52,0.0041,-0.1128,0.1424,0.0,-0.0,-0.0,0.0088,-0.0421,0.0656,22661.18 +378,60,20.01,4.88,32.08,0.28,25.25,3.04,50.94,0.0072,-0.1025,0.1322,0.0,0.0,0.0,0.003,-0.0636,0.0894,22720.23 +379,60,19.87,10.81,30.51,0.28,25.06,10.6,44.8,0.0044,-0.1404,0.1009,0.0,-0.0,-0.0,-0.0027,-0.0916,0.0812,22780.19 +380,60,19.79,11.11,32.84,0.28,24.82,11.5,48.48,0.0017,-0.1477,0.1537,0.0,0.0,0.0,-0.0027,-0.0991,0.0898,22837.98 +381,60,20.15,11.11,33.93,0.28,25.34,10.81,52.26,0.0057,-0.1596,0.1596,0.0,-0.0,-0.0,0.004,-0.0757,0.0967,22902.95 +382,60,20.13,5.71,31.11,0.28,25.46,3.86,48.65,0.0058,-0.1532,0.1334,0.0,0.0,0.0,0.0,-0.1765,0.0832,22959.84 +383,60,20.59,11.11,33.33,0.28,26.24,10.89,51.28,0.0113,-0.1223,0.1469,0.0,0.0,0.0,0.0055,-0.0722,0.1329,23020.48 +384,60,20.5,8.82,32.76,0.28,26.21,7.39,50.85,0.0092,-0.131,0.1359,0.0,0.0,0.0,-0.0021,-0.1439,0.0838,23081.09 +385,60,20.79,6.67,34.62,0.28,26.65,4.47,51.41,0.0113,-0.1234,0.1444,0.0,-0.0,-0.0,0.0021,-0.0597,0.1032,23140.77 +386,60,20.77,6.06,38.6,0.28,26.76,3.96,59.91,0.0103,-0.1226,0.215,0.0,-0.0,-0.0,-0.001,-0.0716,0.1115,23201.21 +387,60,20.27,2.0,38.71,0.28,26.08,0.0,66.4,0.0029,-0.1468,0.2333,0.0,-0.0,-0.0,-0.0075,-0.1228,0.0579,23263.15 +388,60,20.18,4.0,36.84,0.28,25.71,1.97,64.75,-0.0007,-0.1707,0.1806,0.0,-0.0,-0.0,-0.0035,-0.0846,0.1286,23321.96 +389,60,20.36,4.26,34.55,0.28,25.82,2.74,58.76,0.0004,-0.1545,0.1096,0.0,0.0,0.0,0.001,-0.08,0.0894,23381.05 +390,60,20.13,4.35,34.38,0.28,25.47,3.18,53.43,-0.0027,-0.1963,0.1201,0.0,-0.0,-0.0,-0.003,-0.1413,0.0952,23443.19 +391,59,19.7,8.0,33.96,0.28,24.75,7.93,52.63,-0.0086,-0.1467,0.1604,0.0,-0.0,-0.0,-0.0062,-0.0963,0.0661,23502.83 +392,59,18.83,7.84,34.38,0.23,23.3,8.05,53.05,-0.0174,-0.1644,0.1258,0.0,0.0,0.0,-0.0095,-0.0862,0.0783,23558.38 +393,60,18.95,9.62,33.33,0.19,23.22,8.94,51.11,-0.0167,-0.1462,0.1176,0.0,0.0,0.0,0.0014,-0.0604,0.0694,23618.99 +394,60,19.42,7.89,31.82,0.19,23.83,6.37,47.44,-0.0088,-0.1138,0.1273,0.0,-0.0,-0.0,0.0078,-0.0725,0.0813,23678.85 +395,60,19.51,8.7,34.15,0.19,24.11,7.89,51.69,-0.005,-0.1621,0.1455,0.0,-0.0,-0.0,0.0038,-0.1158,0.1357,23738.67 +396,60,19.03,8.7,34.0,0.23,23.51,7.6,53.02,-0.0092,-0.2241,0.1197,0.0,-0.0,-0.0,-0.0042,-0.1253,0.059,23799.36 +397,60,19.31,8.33,30.61,0.23,23.8,7.33,46.06,-0.0052,-0.1994,0.1199,0.0,-0.0,-0.0,0.004,-0.0931,0.0799,23862.19 +398,60,19.67,6.67,31.25,0.19,24.42,5.26,44.81,0.0008,-0.1525,0.1143,0.0,-0.0,-0.0,0.006,-0.0919,0.0623,23920.62 +399,60,19.5,6.38,29.41,0.19,24.31,5.05,42.41,-0.0003,-0.1154,0.1128,0.0,-0.0,-0.0,-0.001,-0.0714,0.0726,23978.12 +400,60,19.6,7.41,30.77,0.19,24.49,6.59,45.32,0.0013,-0.2344,0.1351,0.0,-0.0,-0.0,0.0016,-0.119,0.0583,24041.06 +401,60,19.18,6.38,29.09,0.19,23.94,5.05,43.65,-0.0035,-0.1878,0.1081,0.0,-0.0,-0.0,-0.0048,-0.106,0.0637,24096.91 +402,59,19.48,8.7,29.09,0.19,24.29,7.92,42.68,-0.0005,-0.1718,0.1197,0.0,0.0,0.0,0.0021,-0.0878,0.0518,24160.28 +403,60,19.02,8.7,30.43,0.29,23.61,8.35,43.37,-0.0056,-0.1586,0.1434,0.0,-0.0,-0.0,-0.0041,-0.0844,0.0719,24220.65 +404,60,18.88,6.25,31.82,0.29,23.29,4.56,48.69,-0.0073,-0.1306,0.1638,0.0,0.0,0.0,-0.0018,-0.0692,0.0853,24278.28 +405,60,18.76,6.67,28.89,0.29,23.07,4.97,44.83,-0.0079,-0.1206,0.1557,0.0,-0.0,-0.0,-0.0006,-0.0961,0.0695,24341.36 +406,60,18.9,8.7,34.69,0.29,23.3,7.88,53.17,-0.0047,-0.1307,0.1565,0.0,-0.0,-0.0,0.0032,-0.0603,0.0567,24399.54 +407,60,19.25,6.82,32.69,0.29,23.87,5.32,52.32,0.0008,-0.1247,0.1233,0.0,0.0,0.0,0.0055,-0.0667,0.1259,24461.1 +408,60,18.88,2.78,33.33,0.29,23.5,0.31,52.67,-0.0024,-0.1447,0.1242,0.0,-0.0,-0.0,-0.0032,-0.0719,0.1073,24518.15 +409,60,18.83,2.78,30.91,0.29,23.38,0.6,45.92,-0.003,-0.1416,0.1424,0.0,0.0,0.0,-0.0006,-0.0974,0.1057,24580.39 +410,60,18.75,2.94,28.36,0.29,23.2,1.16,42.27,-0.004,-0.1478,0.1432,0.0,0.0,0.0,-0.0009,-0.1039,0.0698,24641.87 +411,60,19.02,5.13,31.25,0.29,23.57,4.1,44.63,-0.0002,-0.1131,0.1457,0.0,-0.0,-0.0,0.0037,-0.0706,0.0725,24698.39 +412,60,19.11,6.82,30.19,0.29,23.79,6.5,45.47,0.0016,-0.1102,0.1686,0.0,0.0,0.0,0.0019,-0.0547,0.0599,24761.1 +413,60,19.56,8.57,31.11,0.29,24.46,8.39,46.96,0.0069,-0.1966,0.1586,0.0,0.0,0.0,0.0053,-0.0864,0.095,24823.29 +414,60,19.67,7.69,35.42,0.29,24.75,6.85,54.71,0.0082,-0.1606,0.1476,0.0,-0.0,-0.0,0.0013,-0.0915,0.111,24878.87 +415,60,19.7,8.89,32.61,0.29,24.84,8.72,52.18,0.0076,-0.1299,0.1248,0.0,-0.0,-0.0,-0.0006,-0.0783,0.0787,24939.4 +416,60,19.8,10.0,30.43,0.29,24.99,10.79,46.82,0.0076,-0.1374,0.1359,0.0,-0.0,-0.0,-0.0001,-0.0617,0.0773,25002.72 +417,60,19.6,10.2,31.37,0.29,24.69,9.45,46.64,0.0038,-0.1337,0.1377,0.0,0.0,0.0,-0.0038,-0.1095,0.0759,25058.43 +418,60,19.85,9.62,33.96,0.29,25.0,8.55,52.25,0.0058,-0.1628,0.146,0.0,0.0,0.0,0.002,-0.1121,0.0854,25117.01 +419,60,19.59,7.32,34.88,0.29,24.72,5.93,54.43,0.0025,-0.1704,0.1489,0.0,-0.0,-0.0,-0.0033,-0.0701,0.0555,25180.72 +420,60,18.61,8.47,29.55,0.29,23.12,6.76,45.99,-0.0113,-0.1682,0.1092,0.0,0.0,0.0,-0.0138,-0.1467,0.0905,25241.0 +421,60,17.11,6.0,30.0,0.29,20.54,3.49,44.11,-0.0309,-0.1688,0.0988,0.0,-0.0,-0.0,-0.0196,-0.1,0.0271,25298.59 +422,60,15.54,5.45,28.95,0.29,17.87,3.49,41.5,-0.048,-0.1805,0.0748,0.0,0.0,0.0,-0.0171,-0.0973,0.0539,25360.08 +423,60,13.49,3.7,25.64,0.3,14.63,1.5,35.19,-0.067,-0.1593,0.0465,0.0,-0.0,-0.0,-0.019,-0.0821,0.041,25420.46 +424,60,11.27,1.89,22.95,0.3,11.33,0.0,30.28,-0.0838,-0.1993,0.0051,0.0,0.0,0.0,-0.0168,-0.1186,0.0405,25481.44 +425,60,9.58,0.0,21.43,0.31,9.01,0.0,26.79,-0.0904,-0.1818,0.0084,0.0,0.0,0.0,-0.0066,-0.073,0.0272,25540.09 +426,59,7.34,0.0,17.95,0.31,6.12,0.0,20.31,-0.0997,-0.1771,-0.0117,0.0,-0.0,-0.0,-0.0082,-0.1128,0.026,25599.33 +427,60,5.8,0.0,22.45,0.48,4.36,0.0,27.57,-0.1021,-0.199,-0.0143,0.0,0.0,0.0,-0.0037,-0.0914,0.034,25660.27 +428,59,3.62,0.0,14.04,0.48,2.21,0.0,15.35,-0.108,-0.1904,-0.0395,0.0,-0.0,-0.0,-0.0071,-0.1038,0.0297,25718.65 +429,60,2.09,0.0,10.42,0.35,1.05,0.0,8.63,-0.1125,-0.2264,-0.036,0.0,0.0,0.0,-0.0035,-0.0509,0.0404,25780.34 +430,60,1.11,0.0,6.12,0.48,0.26,0.0,4.7,-0.1143,-0.2283,-0.0305,0.0,-0.0,-0.0,-0.0018,-0.0637,0.0344,25841.17 +431,60,0.99,0.0,6.25,0.45,0.29,0.0,4.24,-0.1094,-0.2301,-0.0343,0.0,0.0,0.0,0.0048,-0.0229,0.0313,25898.07 +432,60,0.92,0.0,4.65,0.41,0.31,0.0,2.64,-0.1055,-0.2317,-0.0274,0.0,0.0,0.0,0.004,-0.0141,0.0278,25958.93 +433,59,0.86,0.0,4.44,0.38,0.33,0.0,2.66,-0.1028,-0.2332,-0.0215,0.0,0.0,0.0,0.0034,-0.015,0.0241,26019.41 +434,60,0.93,0.0,6.38,0.27,0.51,0.0,5.35,-0.0985,-0.2346,-0.0158,0.0,-0.0,-0.0,0.0037,-0.0106,0.0368,26080.39 +435,60,0.88,0.0,6.0,0.25,0.55,0.0,5.5,-0.0968,-0.2358,-0.0121,0.0,-0.0,-0.0,0.0017,-0.0151,0.031,26140.24 +436,60,0.91,0.0,6.52,0.23,0.59,0.0,6.43,-0.095,-0.238,-0.0097,0.0,0.0,0.0,0.0018,-0.0171,0.0267,26200.12 +437,60,0.97,0.0,4.88,0.21,0.65,0.0,4.44,-0.093,-0.2408,-0.0061,0.0,0.0,0.0,0.002,-0.0144,0.0398,26257.53 +438,60,1.04,0.0,6.67,0.2,0.79,0.0,5.54,-0.0908,-0.2433,-0.0049,0.0,0.0,0.0,0.0022,-0.0037,0.054,26316.21 +439,60,1.05,0.0,6.9,0.18,0.68,0.0,6.37,-0.0898,-0.2456,-0.0097,0.0,0.0,0.0,0.0011,-0.0238,0.0224,26377.39 +440,60,0.94,0.0,6.45,0.17,0.63,0.0,6.0,-0.0888,-0.2478,-0.0051,0.0,0.0,0.0,0.001,-0.0238,0.0255,26436.55 +441,60,1.02,0.0,6.06,0.15,0.69,0.0,5.7,-0.0864,-0.2498,-0.0054,0.0,0.0,0.0,0.0023,-0.0188,0.0248,26499.59 +442,59,1.0,0.0,5.0,0.14,0.63,0.0,4.33,-0.0857,-0.2318,-0.005,0.0,0.0,0.0,0.0015,-0.0309,0.0235,26560.79 +443,60,0.9,0.0,4.88,0.13,0.54,0.0,4.24,-0.0836,-0.213,-0.0018,0.0,0.0,0.0,0.0013,-0.022,0.024,26618.06 +444,60,0.95,0.0,6.82,0.12,0.59,0.0,6.78,-0.081,-0.1961,-0.0047,0.0,0.0,0.0,0.0026,-0.0179,0.0263,26680.59 +445,60,1.05,0.0,6.67,0.11,0.66,0.0,6.79,-0.0778,-0.197,0.0163,0.0,0.0,0.0,0.0032,-0.0255,0.0265,26736.79 +446,60,0.96,0.0,6.25,0.1,0.6,0.0,6.26,-0.0761,-0.1978,0.0201,0.0,0.0,0.0,0.0017,-0.027,0.0267,26801.82 +447,60,0.95,0.0,4.88,0.09,0.6,0.0,5.12,-0.074,-0.1985,0.0174,0.0,0.0,0.0,0.0021,-0.0235,0.0205,26861.3 +448,58,0.98,0.0,4.65,0.08,0.62,0.0,4.76,-0.0706,-0.1826,0.0115,0.0,0.0,0.0,0.0023,-0.0161,0.0336,26922.06 +449,60,0.83,0.0,3.57,0.05,0.55,0.0,3.54,-0.0707,-0.1792,0.0121,0.0,0.0,0.0,0.0011,-0.0263,0.0174,26980.81 +450,60,0.83,0.0,4.0,0.05,0.58,0.0,3.64,-0.0691,-0.1797,0.0109,0.0,0.0,0.0,0.0016,-0.0035,0.0167,27038.95 +451,60,0.82,0.0,5.77,0.05,0.6,0.0,6.24,-0.0677,-0.1802,0.0308,0.0,0.0,0.0,0.0013,-0.0233,0.0228,27100.78 +452,60,0.76,0.0,6.0,0.05,0.6,0.0,6.57,-0.0672,-0.1806,0.0284,0.0,0.0,0.0,0.0005,-0.0245,0.02,27158.06 +453,59,0.75,0.0,7.84,0.05,0.62,0.0,8.82,-0.0662,-0.1809,0.0424,0.0,0.0,0.0,0.0004,-0.0237,0.0271,27217.45 +454,60,0.77,0.0,9.3,0.03,0.68,0.0,10.74,-0.0661,-0.1813,0.0513,0.0,0.0,0.0,0.0008,-0.0232,0.0334,27278.9 +455,60,0.8,0.0,9.3,0.03,0.69,0.0,10.72,-0.0657,-0.1816,0.0426,0.0,0.0,0.0,0.0004,-0.0227,0.0352,27339.6 +456,60,0.78,0.0,9.76,0.02,0.69,0.0,11.13,-0.0655,-0.1819,0.0389,0.0,0.0,0.0,0.0002,-0.0198,0.0185,27397.89 +457,60,0.77,0.0,11.11,0.02,0.69,0.0,12.83,-0.0654,-0.1822,0.0466,0.0,0.0,0.0,0.0001,-0.0288,0.0235,27458.39 +458,59,0.75,0.0,11.11,0.02,0.7,0.0,12.86,-0.0661,-0.1825,0.0391,0.0,0.0,0.0,0.0006,-0.0209,0.0253,27515.68 +459,60,0.99,0.0,9.38,0.21,0.92,0.0,10.33,-0.063,-0.1827,0.0189,0.0,-0.0,-0.0,0.0017,-0.0275,0.053,27580.72 +460,60,1.14,0.0,9.68,0.21,1.06,0.0,10.4,-0.0613,-0.1652,0.0262,0.0,-0.0,-0.0,0.0018,-0.0032,0.0267,27637.86 +461,60,1.1,0.0,6.52,0.22,0.95,0.0,7.18,-0.0614,-0.1652,0.02,0.0,0.0,0.0,-0.0001,-0.0721,0.0282,27698.33 +462,60,1.28,0.0,6.12,0.23,1.13,0.0,6.63,-0.0587,-0.1653,0.0182,0.0,0.0,0.0,0.0027,-0.0084,0.0412,27760.86 +463,60,1.27,0.0,6.52,0.23,1.11,0.0,7.03,-0.0578,-0.1653,0.022,0.0,-0.0,-0.0,0.0009,-0.0326,0.0397,27819.0 +464,60,1.39,0.0,6.98,0.24,1.23,0.0,7.64,-0.0554,-0.1654,0.0305,0.0,0.0,0.0,0.0024,-0.0236,0.0486,27879.89 +465,57,1.45,0.0,7.14,0.24,1.24,0.0,7.88,-0.0521,-0.1524,0.031,0.0,-0.0,-0.0,0.0011,-0.0518,0.0383,27939.11 +466,59,1.5,0.0,7.69,0.01,1.31,0.0,8.45,-0.0519,-0.1526,0.0292,0.0,0.0,0.0,0.0026,-0.0196,0.0298,28000.05 +467,60,1.57,0.0,9.3,0.02,1.32,0.0,10.42,-0.0493,-0.1509,0.0415,0.0,0.0,0.0,0.0025,-0.0271,0.0243,28057.99 +468,60,1.48,0.0,9.09,0.02,1.27,0.0,10.3,-0.048,-0.151,0.0336,0.0,0.0,0.0,0.0013,-0.0297,0.0253,28119.43 +469,60,1.33,0.0,10.0,0.07,1.14,0.0,11.34,-0.0479,-0.1511,0.0366,0.0,0.0,0.0,0.0002,-0.0504,0.0225,28177.56 +470,59,1.39,0.0,7.89,0.03,1.14,0.0,8.48,-0.0459,-0.1512,0.0067,0.0,-0.0,-0.0,0.0018,-0.0299,0.0249,28239.25 +471,56,1.32,0.0,4.76,0.02,1.04,0.0,4.11,-0.0447,-0.1512,0.0013,0.0,0.0,0.0,0.0015,-0.0375,0.0221,28298.55 +472,58,1.28,0.0,4.88,0.14,1.06,0.0,4.15,-0.0436,-0.1513,0.0044,0.0,0.0,0.0,0.0015,-0.0232,0.031,28357.82 +473,60,1.18,0.0,4.55,0.15,0.98,0.0,3.9,-0.0427,-0.1514,-0.0021,0.0,0.0,0.0,0.0006,-0.0319,0.0209,28420.13 +474,54,1.11,0.0,4.26,0.02,0.9,0.0,4.24,-0.0436,-0.1514,-0.0027,0.0,0.0,0.0,0.0005,-0.0221,0.0243,28477.11 +475,60,1.12,0.0,4.35,0.38,0.93,0.0,4.39,-0.0407,-0.1515,0.0114,0.0,0.0,0.0,0.0016,-0.0353,0.0278,28536.98 +476,58,1.14,0.0,6.82,0.35,1.01,0.0,7.64,-0.0392,-0.1515,0.0406,0.0,0.0,0.0,0.0015,-0.0197,0.0456,28600.24 +477,60,0.97,0.0,6.82,0.32,0.88,0.0,7.89,-0.0403,-0.1516,0.0359,0.0,0.0,0.0,-0.001,-0.0271,0.0215,28656.25 +478,57,0.94,0.0,9.76,0.3,0.87,0.0,11.55,-0.0409,-0.1516,0.0604,0.0,0.0,0.0,0.0013,-0.0226,0.0273,28718.36 +479,60,1.06,0.0,10.0,0.07,1.03,0.0,12.04,-0.0387,-0.1517,0.0544,0.0,0.0,0.0,0.0003,-0.0195,0.0201,28779.64 +480,60,1.08,0.0,12.2,0.13,1.07,0.0,14.83,-0.0385,-0.1517,0.0686,0.0,-0.0,-0.0,0.0002,-0.0254,0.021,28840.05 +481,58,1.04,0.0,11.36,0.12,0.99,0.0,13.81,-0.0383,-0.1517,0.0487,0.0,-0.0,-0.0,-0.0009,-0.0247,0.0216,28899.48 +482,60,0.97,0.0,11.11,0.05,0.87,0.0,13.13,-0.0395,-0.1305,0.0349,0.0,0.0,0.0,-0.0001,-0.0237,0.0212,28959.32 +483,60,1.1,0.0,12.82,0.05,0.99,0.0,15.22,-0.0375,-0.111,0.0465,0.0,0.0,0.0,0.0021,-0.0233,0.0261,29016.0 +484,60,1.18,0.0,14.71,0.04,1.07,0.0,17.96,-0.0357,-0.1109,0.0616,0.0,0.0,0.0,0.0018,-0.0218,0.0213,29076.93 +485,60,1.08,0.0,9.68,0.04,0.94,0.0,11.05,-0.0359,-0.111,0.0051,0.0,0.0,0.0,-0.0002,-0.0679,0.0209,29138.22 +486,60,1.07,0.0,8.57,0.08,0.93,0.0,8.8,-0.0351,-0.111,0.0058,0.0,-0.0,-0.0,0.0009,-0.0264,0.0273,29198.16 +487,59,1.16,0.0,8.33,0.07,1.02,0.0,8.34,-0.033,-0.1111,0.0069,0.0,0.0,0.0,0.0017,-0.0195,0.0235,29257.35 +488,60,1.25,0.0,5.56,0.01,1.12,0.0,4.77,-0.0314,-0.1111,0.015,0.0,0.0,0.0,0.002,-0.0267,0.03,29319.32 +489,59,1.24,0.0,4.35,0.01,1.13,0.0,4.66,-0.0296,-0.1112,0.0128,0.0,0.0,0.0,0.0015,-0.0202,0.0241,29379.55 +490,59,1.46,0.0,5.0,0.25,1.3,0.0,5.45,-0.0277,-0.1087,0.014,0.0,0.0,0.0,0.0026,-0.0198,0.0302,29439.64 +491,55,1.35,0.0,5.88,0.04,1.19,0.0,6.55,-0.0285,-0.1087,0.0238,0.0,-0.0,-0.0,-0.0006,-0.0267,0.0175,29500.26 +492,56,1.52,0.0,5.66,0.06,1.41,0.0,6.3,-0.0244,-0.1087,0.0178,0.0,0.0,0.0,0.0025,-0.0208,0.0364,29558.77 +493,59,1.27,0.0,6.12,0.03,1.17,0.0,6.79,-0.026,-0.1087,0.0189,0.0,0.0,0.0,-0.0011,-0.0277,0.0208,29621.4 +494,60,1.22,0.0,4.35,0.04,1.15,0.0,4.75,-0.0263,-0.1088,0.0184,0.0,0.0,0.0,0.0003,-0.0254,0.0228,29676.91 +495,60,1.2,0.0,5.0,0.04,1.14,0.0,5.62,-0.0263,-0.1088,0.0225,0.0,0.0,0.0,0.0001,-0.0197,0.0211,29738.8 +496,57,1.14,0.0,5.0,0.04,1.11,0.0,5.57,-0.0267,-0.1088,0.0184,0.0,0.0,0.0,-0.0005,-0.0226,0.0054,29799.54 +497,60,1.0,0.0,4.76,0.01,0.94,0.0,5.18,-0.0281,-0.1088,0.0121,0.0,0.0,0.0,-0.0013,-0.0257,0.0224,29859.5 +498,60,1.05,0.0,4.44,0.01,0.96,0.0,4.71,-0.0275,-0.1088,0.0062,0.0,0.0,0.0,0.0006,-0.0288,0.0241,29918.44 +499,60,0.93,0.0,5.13,0.02,0.87,0.0,5.56,-0.0282,-0.1088,0.0239,0.0,-0.0,-0.0,-0.0007,-0.0258,0.0274,29977.12 +500,57,0.85,0.0,5.88,0.25,0.81,0.0,6.6,-0.0293,-0.1088,0.0286,0.0,0.0,0.0,-0.0003,-0.0222,0.0208,30037.57 +501,58,0.63,0.0,4.35,0.16,0.59,0.0,4.75,-0.031,-0.1088,0.0124,0.0,0.0,0.0,-0.0013,-0.0238,0.0073,30098.97 +502,59,0.72,0.0,6.67,0.19,0.71,0.0,7.54,-0.03,-0.1088,0.0317,0.0,-0.0,-0.0,-0.0005,-0.0207,0.0253,30158.46 +503,60,0.66,0.0,6.45,0.0,0.66,0.0,7.2,-0.0309,-0.1088,0.0235,0.0,0.0,0.0,-0.0007,-0.0175,0.0051,30220.09 +504,60,0.49,0.0,5.56,0.0,0.48,0.0,5.91,-0.033,-0.1088,0.0099,0.0,0.0,0.0,-0.0021,-0.0256,0.0028,30278.11 +505,60,0.63,0.0,6.82,0.0,0.62,0.0,7.73,-0.0319,-0.1088,0.0403,0.0,0.0,0.0,0.0011,-0.0266,0.0457,30336.74 +506,60,0.73,0.0,6.25,0.0,0.72,0.0,7.26,-0.031,-0.1088,0.0296,0.0,0.0,0.0,0.0008,-0.0107,0.0248,30396.58 +507,58,0.83,0.0,10.0,0.0,0.84,0.0,11.91,-0.0303,-0.1088,0.0634,0.0,0.0,0.0,0.0009,-0.0196,0.0338,30459.43 +508,60,0.68,0.0,10.2,0.07,0.69,0.0,12.48,-0.0319,-0.1089,0.0577,0.0,0.0,0.0,-0.0017,-0.0292,0.0226,30521.11 +509,60,0.79,0.0,10.0,0.07,0.77,0.0,12.02,-0.0311,-0.1089,0.0442,0.0,0.0,0.0,0.0008,-0.0329,0.0264,30577.72 +510,60,0.84,0.0,9.8,0.06,0.82,0.0,11.51,-0.0306,-0.1089,0.0325,0.0,0.0,0.0,0.0005,-0.0281,0.0248,30640.11 +511,60,0.92,0.0,10.0,0.06,0.89,0.0,11.56,-0.0297,-0.1089,0.0275,0.0,0.0,0.0,0.0008,-0.005,0.0216,30696.06 +512,60,0.95,0.0,7.41,0.05,0.9,0.0,7.97,-0.0293,-0.1089,0.0104,0.0,0.0,0.0,0.0004,-0.0345,0.0226,30757.88 +513,59,1.16,0.0,7.41,0.05,1.11,0.0,7.66,-0.0272,-0.1089,0.018,0.0,0.0,0.0,0.0026,-0.0023,0.0463,30816.65 +514,60,1.3,0.0,7.84,0.08,1.28,0.0,8.22,-0.0251,-0.1089,0.0282,0.0,0.0,0.0,0.0017,-0.0064,0.0275,30876.8 +515,60,1.32,0.0,5.0,0.08,1.26,0.0,5.66,-0.0248,-0.0844,0.0214,0.0,0.0,0.0,0.0003,-0.0399,0.0285,30938.14 +516,60,1.37,0.0,5.77,0.08,1.3,0.0,5.54,-0.0238,-0.0844,0.0098,0.0,-0.0,-0.0,0.001,-0.0287,0.0574,30997.92 +517,60,1.43,0.0,5.66,0.09,1.39,0.0,6.17,-0.0226,-0.0844,0.0289,0.0,-0.0,-0.0,0.0012,-0.0329,0.0396,31055.55 +518,60,1.58,0.0,5.88,0.09,1.58,0.0,6.61,-0.0207,-0.0845,0.0367,0.0,0.0,0.0,0.0018,-0.0234,0.0386,31117.53 +519,60,1.5,0.0,7.14,0.1,1.5,0.0,8.26,-0.0215,-0.0845,0.0374,0.0,-0.0,-0.0,-0.0008,-0.0353,0.02,31179.53 +520,60,1.33,0.0,6.9,0.1,1.32,0.0,7.95,-0.0232,-0.0845,0.0286,0.0,-0.0,-0.0,-0.0017,-0.0308,0.0219,31238.45 +521,60,1.35,0.0,6.9,0.11,1.34,0.0,7.79,-0.0229,-0.0845,0.0225,0.0,0.0,0.0,0.0003,-0.0224,0.0261,31295.19 +522,60,1.32,0.0,7.02,0.11,1.3,0.0,7.83,-0.0232,-0.0846,0.0191,0.0,0.0,0.0,-0.0003,-0.0226,0.0273,31358.65 +523,60,1.2,0.0,7.02,0.11,1.16,0.0,7.74,-0.0244,-0.0846,0.0152,0.0,-0.0,-0.0,-0.0012,-0.0451,0.0269,31416.38 +524,60,1.16,0.0,6.78,0.12,1.14,0.0,7.35,-0.0245,-0.0846,0.0159,0.0,-0.0,-0.0,-0.0001,-0.0297,0.0213,31478.47 +525,60,1.11,0.0,7.55,0.12,1.06,0.0,8.26,-0.025,-0.0846,0.0154,0.0,0.0,0.0,-0.0005,-0.0354,0.0249,31538.87 +526,60,1.12,0.0,6.12,0.13,1.09,0.0,6.41,-0.0247,-0.0846,0.0245,0.0,-0.0,-0.0,0.0003,-0.0534,0.0293,31596.04 +527,60,1.11,0.0,5.26,0.13,1.08,0.0,5.96,-0.0247,-0.0846,0.0225,0.0,0.0,0.0,-0.0,-0.0426,0.0425,31657.74 +528,60,0.96,0.0,5.13,0.12,0.93,0.0,5.42,-0.0261,-0.0846,0.0172,0.0,-0.0,-0.0,-0.0014,-0.0456,0.0243,31716.98 +529,60,0.95,0.0,5.13,0.11,0.93,0.0,5.37,-0.0262,-0.0846,0.0183,0.0,0.0,0.0,-0.0001,-0.015,0.0223,31778.15 +530,60,1.03,0.0,5.26,0.1,1.01,0.0,5.67,-0.0255,-0.0847,0.018,0.0,0.0,0.0,0.0007,-0.0272,0.0262,31836.17 +531,60,1.04,0.0,5.26,0.09,1.03,0.0,5.8,-0.0254,-0.0847,0.0161,0.0,0.0,0.0,0.0001,-0.0265,0.0209,31896.26 +532,60,1.08,0.0,5.13,0.09,1.06,0.0,5.56,-0.0251,-0.0847,0.0124,0.0,0.0,0.0,0.0004,-0.0186,0.0289,31958.65 +533,60,1.22,0.0,7.02,0.08,1.22,0.0,7.94,-0.0237,-0.0847,0.0348,0.0,0.0,0.0,0.0014,-0.0314,0.0452,32016.74 +534,60,1.14,0.0,7.02,0.07,1.14,0.0,8.11,-0.0246,-0.0847,0.0304,0.0,0.0,0.0,-0.0009,-0.0274,0.0281,32077.01 +535,60,1.17,0.0,6.78,0.07,1.16,0.0,7.68,-0.0244,-0.0847,0.0218,0.0,0.0,0.0,0.0002,-0.0219,0.0267,32135.66 +536,60,1.22,0.0,5.66,0.06,1.19,0.0,6.1,-0.0239,-0.0847,0.024,0.0,0.0,0.0,0.0005,-0.0278,0.0207,32200.39 +537,60,1.15,0.0,5.56,0.06,1.12,0.0,6.16,-0.0244,-0.0847,0.0183,0.0,0.0,0.0,-0.0004,-0.024,0.0257,32259.47 +538,60,1.23,0.0,5.88,0.05,1.16,0.0,6.43,-0.0234,-0.0847,0.0164,0.0,0.0,0.0,0.0009,-0.0316,0.0263,32316.7 +539,60,1.21,0.0,5.71,0.05,1.15,0.0,6.16,-0.0231,-0.0847,0.0114,0.0,0.0,0.0,0.0004,-0.0191,0.0195,32376.89 +540,60,1.26,0.0,6.25,0.05,1.21,0.0,6.74,-0.0222,-0.0847,0.0173,0.0,0.0,0.0,0.0009,-0.02,0.0298,32408.23 diff --git a/experiments/results/csv/sustained_load_adaptive_time_analysis.csv b/experiments/results/csv/sustained_load_adaptive_time_analysis.csv new file mode 100644 index 000000000..72ac0d272 --- /dev/null +++ b/experiments/results/csv/sustained_load_adaptive_time_analysis.csv @@ -0,0 +1,19 @@ +Time Range,Total Requests,Success,Errors,Error %,Rejected,Rejected %,Target Error Rate % +0-30s,7936,7842,84,1.06,10,0.13,1.0 +30-60s,7991,7883,97,1.21,11,0.14,1.0 +60-90s,8059,7966,71,0.88,22,0.27,1.0 +90-120s,7966,7810,88,1.1,68,0.85,1.0 +120-150s,12273,7425,1928,15.71,2920,23.79,20.0 +150-180s,12658,7523,1873,14.8,3262,25.77,20.0 +180-210s,12603,7365,1896,15.04,3342,26.52,20.0 +210-240s,12376,7257,1828,14.77,3291,26.59,20.0 +240-270s,12463,7379,1795,14.4,3289,26.39,20.0 +270-300s,12635,7463,1851,14.65,3321,26.28,20.0 +300-330s,12482,7419,1860,14.9,3203,25.66,20.0 +330-360s,12439,7377,1838,14.78,3224,25.92,20.0 +360-390s,12498,7313,1838,14.71,3347,26.78,20.0 +390-420s,12389,7448,1809,14.6,3132,25.28,20.0 +420-450s,8588,8014,89,1.04,485,5.65,1.0 +450-480s,7976,7810,88,1.1,78,0.98,1.0 +480-510s,8186,8023,84,1.03,79,0.97,1.0 +510-540s,8118,7930,100,1.23,88,1.08,1.0 diff --git a/experiments/results/csv/sustained_load_time_analysis.csv b/experiments/results/csv/sustained_load_time_analysis.csv new file mode 100644 index 000000000..f5a5cbcda --- /dev/null +++ b/experiments/results/csv/sustained_load_time_analysis.csv @@ -0,0 +1,19 @@ +Time Range,Total Requests,Success,Errors,Error %,Rejected,Rejected %,Target Error Rate % +0-30s,15789,15630,159,1.01,0,0.0,1.0 +30-60s,16200,16028,172,1.06,0,0.0,1.0 +60-90s,16239,16053,186,1.15,0,0.0,1.0 +90-120s,16200,16014,186,1.15,0,0.0,1.0 +120-150s,21517,4204,973,4.52,16340,75.94,20.0 +150-180s,21653,2710,641,2.96,18302,84.52,20.0 +180-210s,20375,2535,636,3.12,17204,84.44,20.0 +210-240s,21072,2776,700,3.32,17596,83.5,20.0 +240-270s,21191,2832,688,3.25,17671,83.39,20.0 +270-300s,20726,3149,766,3.7,16811,81.11,20.0 +300-330s,21064,2639,692,3.29,17733,84.19,20.0 +330-360s,20903,2627,693,3.32,17583,84.12,20.0 +360-390s,20582,2618,657,3.19,17307,84.09,20.0 +390-420s,20460,2935,730,3.57,16795,82.09,20.0 +420-450s,20878,11724,94,0.45,9060,43.39,1.0 +450-480s,16113,15943,170,1.06,0,0.0,1.0 +480-510s,16088,15940,148,0.92,0,0.0,1.0 +510-540s,16117,15951,166,1.03,0,0.0,1.0 diff --git a/experiments/results/main_graphs/gradual_increase.png b/experiments/results/main_graphs/gradual_increase.png new file mode 100644 index 000000000..0a0247349 Binary files /dev/null and b/experiments/results/main_graphs/gradual_increase.png differ diff --git a/experiments/results/main_graphs/gradual_increase_adaptive.png b/experiments/results/main_graphs/gradual_increase_adaptive.png new file mode 100644 index 000000000..c55f5cd44 Binary files /dev/null and b/experiments/results/main_graphs/gradual_increase_adaptive.png differ diff --git a/experiments/results/main_graphs/lower_bound_windup.png b/experiments/results/main_graphs/lower_bound_windup.png new file mode 100644 index 000000000..6fc220568 Binary files /dev/null and b/experiments/results/main_graphs/lower_bound_windup.png differ diff --git a/experiments/results/main_graphs/near_target_error_rate.png b/experiments/results/main_graphs/near_target_error_rate.png new file mode 100644 index 000000000..c163e99b4 Binary files /dev/null and b/experiments/results/main_graphs/near_target_error_rate.png differ diff --git a/experiments/results/main_graphs/near_target_error_rate_adaptive.png b/experiments/results/main_graphs/near_target_error_rate_adaptive.png new file mode 100644 index 000000000..c5c3ac2d0 Binary files /dev/null and b/experiments/results/main_graphs/near_target_error_rate_adaptive.png differ diff --git a/experiments/results/main_graphs/one_of_many_services_latency_degradation.png b/experiments/results/main_graphs/one_of_many_services_latency_degradation.png new file mode 100644 index 000000000..209054595 Binary files /dev/null and b/experiments/results/main_graphs/one_of_many_services_latency_degradation.png differ diff --git a/experiments/results/main_graphs/one_of_many_services_latency_degradation_adaptive.png b/experiments/results/main_graphs/one_of_many_services_latency_degradation_adaptive.png new file mode 100644 index 000000000..588caf550 Binary files /dev/null and b/experiments/results/main_graphs/one_of_many_services_latency_degradation_adaptive.png differ diff --git a/experiments/results/main_graphs/oscillating_errors.png b/experiments/results/main_graphs/oscillating_errors.png new file mode 100644 index 000000000..a03bffc3d Binary files /dev/null and b/experiments/results/main_graphs/oscillating_errors.png differ diff --git a/experiments/results/main_graphs/oscillating_errors_adaptive.png b/experiments/results/main_graphs/oscillating_errors_adaptive.png new file mode 100644 index 000000000..691efaa4d Binary files /dev/null and b/experiments/results/main_graphs/oscillating_errors_adaptive.png differ diff --git a/experiments/results/main_graphs/slow_query.png b/experiments/results/main_graphs/slow_query.png new file mode 100644 index 000000000..5d276d0fe Binary files /dev/null and b/experiments/results/main_graphs/slow_query.png differ diff --git a/experiments/results/main_graphs/slow_query_adaptive.png b/experiments/results/main_graphs/slow_query_adaptive.png new file mode 100644 index 000000000..cdbdac0f6 Binary files /dev/null and b/experiments/results/main_graphs/slow_query_adaptive.png differ diff --git a/experiments/results/main_graphs/sudden_error_spike_100.png b/experiments/results/main_graphs/sudden_error_spike_100.png new file mode 100644 index 000000000..07b66a284 Binary files /dev/null and b/experiments/results/main_graphs/sudden_error_spike_100.png differ diff --git a/experiments/results/main_graphs/sudden_error_spike_100_adaptive.png b/experiments/results/main_graphs/sudden_error_spike_100_adaptive.png new file mode 100644 index 000000000..e694adedd Binary files /dev/null and b/experiments/results/main_graphs/sudden_error_spike_100_adaptive.png differ diff --git a/experiments/results/main_graphs/sudden_error_spike_20.png b/experiments/results/main_graphs/sudden_error_spike_20.png new file mode 100644 index 000000000..68ac9085e Binary files /dev/null and b/experiments/results/main_graphs/sudden_error_spike_20.png differ diff --git a/experiments/results/main_graphs/sudden_error_spike_20_adaptive.png b/experiments/results/main_graphs/sudden_error_spike_20_adaptive.png new file mode 100644 index 000000000..52da4140c Binary files /dev/null and b/experiments/results/main_graphs/sudden_error_spike_20_adaptive.png differ diff --git a/experiments/results/main_graphs/sudden_error_spikes.png b/experiments/results/main_graphs/sudden_error_spikes.png new file mode 100644 index 000000000..9e4b4d19e Binary files /dev/null and b/experiments/results/main_graphs/sudden_error_spikes.png differ diff --git a/experiments/results/main_graphs/sudden_error_spikes_adaptive.png b/experiments/results/main_graphs/sudden_error_spikes_adaptive.png new file mode 100644 index 000000000..bcdf6b33c Binary files /dev/null and b/experiments/results/main_graphs/sudden_error_spikes_adaptive.png differ diff --git a/experiments/results/main_graphs/sustained_load.png b/experiments/results/main_graphs/sustained_load.png new file mode 100644 index 000000000..11f7cee7a Binary files /dev/null and b/experiments/results/main_graphs/sustained_load.png differ diff --git a/experiments/results/main_graphs/sustained_load_adaptive.png b/experiments/results/main_graphs/sustained_load_adaptive.png new file mode 100644 index 000000000..3d8428755 Binary files /dev/null and b/experiments/results/main_graphs/sustained_load_adaptive.png differ diff --git a/experiments/run_all_experiments.rb b/experiments/run_all_experiments.rb new file mode 100755 index 000000000..5ec2d379b --- /dev/null +++ b/experiments/run_all_experiments.rb @@ -0,0 +1,91 @@ +#!/usr/bin/env ruby +# frozen_string_literal: true + +require "thread" + +# Get all experiment files (excluding the windup experiment) +# TODO: Include lower bound windup experiment once we have a way to make it run in a reasonable time. +experiment_files = Dir.glob("experiments/*.rb").reject { |file| file.include?("experiment_lower_bound_windup_adaptive.rb") }.sort + +puts "Found #{experiment_files.length} experiment files to run:" +experiment_files.each { |file| puts " - #{file}" } +puts "\nRunning all experiments in parallel..." +puts "=" * 60 + +# Track results +results = {} +mutex = Mutex.new + +# Create threads for each experiment file +threads = experiment_files.map do |experiment_file| + Thread.new do + start_time = Time.now + + # Capture output and error + output = nil + error = nil + exit_status = nil + + begin + # Run the experiment file and capture output + output = %x(bundle exec ruby #{experiment_file} 2>&1) + exit_status = $?.exitstatus + rescue => e + error = e.message + exit_status = 1 + end + + end_time = Time.now + duration = end_time - start_time + + # Thread-safe result storage + mutex.synchronize do + results[experiment_file] = { + output: output, + error: error, + exit_status: exit_status, + duration: duration, + } + + status = exit_status == 0 ? "✅ SUCCESS" : "❌ FAILED" + puts "[#{Time.now.strftime("%H:%M:%S")}] #{status} #{experiment_file} (#{duration.round(2)}s)" + end + end +end + +# Wait for all threads to complete +threads.each(&:join) + +puts "\n" + "=" * 60 +puts "All experiments completed!" +puts "=" * 60 + +# Summary +total_duration = results.values.map { |r| r[:duration] }.sum +successful = results.select { |_, r| r[:exit_status] == 0 } +failed = results.select { |_, r| r[:exit_status] != 0 } + +puts "\nSUMMARY:" +puts " Total files: #{results.length}" +puts " Successful: #{successful.length}" +puts " Failed: #{failed.length}" +puts " Total execution time: #{total_duration.round(2)}s" + +# Show failed experiments with details +if failed.any? + puts "\nFAILED EXPERIMENTS:" + failed.each do |file, result| + puts "\n#{file}:" + puts " Exit status: #{result[:exit_status]}" + puts " Duration: #{result[:duration].round(2)}s" + if result[:error] + puts " Error: #{result[:error]}" + end + if result[:output] && !result[:output].strip.empty? + puts " Output:" + result[:output].split("\n").each { |line| puts " #{line}" } + end + end +end + +exit failed.any? ? 1 : 0 diff --git a/lib/semian.rb b/lib/semian.rb index c135d8ec6..d350fcca1 100644 --- a/lib/semian.rb +++ b/lib/semian.rb @@ -11,6 +11,8 @@ require "semian/platform" require "semian/resource" require "semian/circuit_breaker" +require "semian/adaptive_circuit_breaker" +require "semian/dual_circuit_breaker" require "semian/protected_resource" require "semian/unprotected_resource" require "semian/simple_sliding_window" @@ -197,6 +199,20 @@ def to_s # +exceptions+: An array of exception classes that should be accounted as resource errors. Default []. # (circuit breaker) # + # +adaptive_circuit_breaker+: Enable adaptive circuit breaker using PID controller. Default false. + # When enabled, this replaces the traditional circuit breaker with an adaptive version + # that dynamically adjusts rejection rates based on service health. (adaptive circuit breaker) + # + # +dual_circuit_breaker+: Enable dual circuit breaker mode where both legacy and adaptive + # circuit breakers are initialized. Default false. When enabled, both circuit breakers track + # requests, but only one is used for decision-making based on use_adaptive. + # (dual circuit breaker) + # + # +use_adaptive+: A callable (Proc/lambda) that returns true to use adaptive circuit breaker + # or false to use legacy. Only used when dual_circuit_breaker is enabled. Default: ->() { false }. + # Example: ->() { MyFeatureFlag.enabled?(:adaptive_circuit_breaker) } + # (dual circuit breaker) + # # Returns the registered resource. def register(name, **options) return UnprotectedResource.new(name) if ENV.key?("SEMIAN_DISABLED") @@ -204,7 +220,14 @@ def register(name, **options) # Validate configuration before proceeding ConfigurationValidator.new(name, options).validate! - circuit_breaker = create_circuit_breaker(name, **options) + circuit_breaker = if options[:dual_circuit_breaker] + create_dual_circuit_breaker(name, **options) + elsif options[:adaptive_circuit_breaker] + create_adaptive_circuit_breaker(name, **options) + else + create_circuit_breaker(name, **options) + end + bulkhead = create_bulkhead(name, **options) resources[name] = ProtectedResource.new(name, bulkhead, circuit_breaker) @@ -300,12 +323,44 @@ def consumers private - def create_circuit_breaker(name, **options) + def create_dual_circuit_breaker(name, **options) + return if ENV.key?("SEMIAN_CIRCUIT_BREAKER_DISABLED") + + classic_cb = create_circuit_breaker(name, is_child: true, **options) + adaptive_cb = create_adaptive_circuit_breaker(name, is_child: true, **options) + + DualCircuitBreaker.new( + name: name, + classic_circuit_breaker: classic_cb, + adaptive_circuit_breaker: adaptive_cb, + ) + end + + def create_adaptive_circuit_breaker(name, is_child: false, **options) + return if ENV.key?("SEMIAN_CIRCUIT_BREAKER_DISABLED") || ENV.key?("SEMIAN_ADAPTIVE_CIRCUIT_BREAKER_DISABLED") + + exceptions = options[:exceptions] || [] + cls = is_child ? DualCircuitBreaker::ChildAdaptiveCircuitBreaker : AdaptiveCircuitBreaker + cls.new( + name: name, + exceptions: Array(exceptions) + [::Semian::BaseError], + kp: 1.0, + ki: 0.2, + kd: 0.0, + window_size: 10, + sliding_interval: 1, + initial_error_rate: options[:initial_error_rate] || 0.05, + implementation: implementation(**options), + ) + end + + def create_circuit_breaker(name, is_child: false, **options) return if ENV.key?("SEMIAN_CIRCUIT_BREAKER_DISABLED") return unless options.fetch(:circuit_breaker, true) exceptions = options[:exceptions] || [] - CircuitBreaker.new( + cls = is_child ? DualCircuitBreaker::ChildClassicCircuitBreaker : CircuitBreaker + cls.new( name, success_threshold: options[:success_threshold], error_threshold: options[:error_threshold], diff --git a/lib/semian/adapter.rb b/lib/semian/adapter.rb index dd2b385d5..404f9507d 100644 --- a/lib/semian/adapter.rb +++ b/lib/semian/adapter.rb @@ -45,7 +45,7 @@ def acquire_semian_resource(scope:, adapter:, &block) end rescue ::Semian::OpenCircuitError => error last_error = semian_resource.circuit_breaker.last_error - message = "#{error.message} caused by #{last_error.message}" + message = "#{error.message} caused by #{last_error&.message}" last_error = nil unless last_error.is_a?(Exception) # Net::HTTPServerError is not an exception raise self.class::CircuitOpenError.new(semian_identifier, message), cause: last_error rescue ::Semian::BaseError => error diff --git a/lib/semian/adaptive_circuit_breaker.rb b/lib/semian/adaptive_circuit_breaker.rb new file mode 100644 index 000000000..1823c8a4f --- /dev/null +++ b/lib/semian/adaptive_circuit_breaker.rb @@ -0,0 +1,182 @@ +# frozen_string_literal: true + +require_relative "pid_controller" +require_relative "circuit_breaker_behaviour" + +module Semian + # Adaptive Circuit Breaker that uses PID controller for dynamic rejection + class AdaptiveCircuitBreaker + include CircuitBreakerBehaviour + + attr_reader :pid_controller, :update_thread + + def initialize(name:, exceptions:, kp:, ki:, kd:, window_size:, sliding_interval:, initial_error_rate:, implementation:) + initialize_behaviour(name: name) + + @exceptions = exceptions + @sliding_interval = sliding_interval + @stopped = false + + @pid_controller = implementation::PIDController.new( + kp: kp, + ki: ki, + kd: kd, + window_size: window_size, + sliding_interval: sliding_interval, + implementation: implementation, + initial_error_rate: initial_error_rate, + ) + + start_pid_controller_update_thread + end + + def acquire(resource = nil, &block) + unless request_allowed? + mark_rejected + raise OpenCircuitError, "Rejected by adaptive circuit breaker" + end + + result = nil + begin + result = block.call + rescue *@exceptions => error + if !error.respond_to?(:marks_semian_circuits?) || error.marks_semian_circuits? + mark_failed(error) + end + raise error + else + mark_success + end + result + end + + def reset + @last_error = nil + @pid_controller.reset + end + + def stop + @stopped = true + @update_thread&.kill + @update_thread = nil + end + + def destroy + stop + @pid_controller.reset + end + + def metrics + @pid_controller.metrics + end + + def open? + @pid_controller.rejection_rate == 1 + end + + def closed? + @pid_controller.rejection_rate == 0 + end + + # Compatibility with ProtectedResource - Adaptive circuit breaker does not have a half open state + def half_open? + !open? && !closed? + end + + def mark_failed(error) + @last_error = error + @pid_controller.record_request(:error) + end + + def mark_success + @pid_controller.record_request(:success) + end + + def mark_rejected + @pid_controller.record_request(:rejected) + end + + def request_allowed? + !@pid_controller.should_reject? + end + + def in_use? + true + end + + private + + def start_pid_controller_update_thread + @update_thread = Thread.new do + loop do + break if @stopped + + wait_for_window + + old_rejection_rate = @pid_controller.rejection_rate + pre_update_metrics = @pid_controller.metrics + + @pid_controller.update + new_rejection_rate = @pid_controller.rejection_rate + + check_and_notify_state_transition(old_rejection_rate, new_rejection_rate, pre_update_metrics) + notify_metrics_update + end + rescue => e + Semian.logger&.warn("[#{@name}] PID controller update thread error: #{e.message}") + end + end + + def wait_for_window + Kernel.sleep(@sliding_interval) + end + + def check_and_notify_state_transition(old_rate, new_rate, pre_update_metrics) + old_state = old_rate == 0.0 ? :closed : :open + new_state = new_rate == 0.0 ? :closed : :open + + if old_state != new_state + notify_state_transition(new_state) + log_state_transition(old_state, new_state, new_rate, pre_update_metrics) + end + end + + def notify_state_transition(new_state) + Semian.notify(:state_change, self, nil, nil, state: new_state) + end + + def log_state_transition(old_state, new_state, rejection_rate, pre_update_metrics) + requests = pre_update_metrics[:current_window_requests] + + str = "[#{self.class.name}] State transition from #{old_state} to #{new_state}." + str += " success_count=#{requests[:success]}" + str += " error_count=#{requests[:error]}" + str += " rejected_count=#{requests[:rejected]}" + str += " rejection_rate=#{(rejection_rate * 100).round(2)}%" + str += " error_rate=#{(pre_update_metrics[:error_rate] * 100).round(2)}%" + str += " ideal_error_rate=#{(pre_update_metrics[:ideal_error_rate] * 100).round(2)}%" + str += " integral=#{pre_update_metrics[:integral].round(4)}" + str += " name=\"#{@name}\"" + + Semian.logger.info(str) + end + + def notify_metrics_update + metrics = @pid_controller.metrics + + Semian.notify( + :adaptive_update, + @semian_resource, + nil, + nil, + rejection_rate: metrics[:rejection_rate], + error_rate: metrics[:error_rate], + ideal_error_rate: metrics[:ideal_error_rate], + p_value: metrics[:p_value], + integral: metrics[:integral], + derivative: metrics[:derivative], + previous_p_value: metrics[:previous_p_value], + ) + end + end +end diff --git a/lib/semian/circuit_breaker.rb b/lib/semian/circuit_breaker.rb index b08951459..8e60dc84c 100644 --- a/lib/semian/circuit_breaker.rb +++ b/lib/semian/circuit_breaker.rb @@ -1,17 +1,18 @@ # frozen_string_literal: true +require_relative "circuit_breaker_behaviour" + module Semian class CircuitBreaker # :nodoc: + include CircuitBreakerBehaviour extend Forwardable def_delegators :@state, :closed?, :open?, :half_open? attr_reader( - :name, :half_open_resource_timeout, :error_timeout, :state, - :last_error, :error_threshold_timeout_enabled, ) @@ -19,13 +20,14 @@ def initialize(name, exceptions:, success_threshold:, error_threshold:, error_timeout:, implementation:, half_open_resource_timeout: nil, error_threshold_timeout: nil, error_threshold_timeout_enabled: true, lumping_interval: 0) - @name = name.to_sym + initialize_behaviour(name: name) + + @exceptions = exceptions @success_count_threshold = success_threshold @error_count_threshold = error_threshold @error_threshold_timeout = error_threshold_timeout || error_timeout @error_threshold_timeout_enabled = error_threshold_timeout_enabled.nil? ? true : error_threshold_timeout_enabled @error_timeout = error_timeout - @exceptions = exceptions @half_open_resource_timeout = half_open_resource_timeout @lumping_interval = lumping_interval diff --git a/lib/semian/circuit_breaker_behaviour.rb b/lib/semian/circuit_breaker_behaviour.rb new file mode 100644 index 000000000..5b3031256 --- /dev/null +++ b/lib/semian/circuit_breaker_behaviour.rb @@ -0,0 +1,64 @@ +# frozen_string_literal: true + +module Semian + module CircuitBreakerBehaviour + attr_reader :name, :last_error + attr_accessor :exceptions, :semian_resource + + # Initialize common circuit breaker attributes + def initialize_behaviour(name:) + @name = name.to_sym + @last_error = nil + end + + # Main method to execute a block with circuit breaker protection + def acquire(resource = nil, &block) + raise NotImplementedError, "#{self.class} must implement #acquire" + end + + # Reset the circuit breaker to its initial state + def reset + raise NotImplementedError, "#{self.class} must implement #reset" + end + + # Clean up resources + def destroy + raise NotImplementedError, "#{self.class} must implement #destroy" + end + + # Check if the circuit is open (rejecting requests) + def open? + raise NotImplementedError, "#{self.class} must implement #open?" + end + + # Check if the circuit is closed (allowing requests) + def closed? + raise NotImplementedError, "#{self.class} must implement #closed?" + end + + # Check if the circuit is half-open (testing if service recovered) + def half_open? + raise NotImplementedError, "#{self.class} must implement #half_open?" + end + + # Check if requests are currently allowed + def request_allowed? + raise NotImplementedError, "#{self.class} must implement #request_allowed?" + end + + # Mark a request as failed + def mark_failed(error) + raise NotImplementedError, "#{self.class} must implement #mark_failed" + end + + # Mark a request as successful + def mark_success + raise NotImplementedError, "#{self.class} must implement #mark_success" + end + + # Check if the circuit breaker is actively tracking failures + def in_use? + raise NotImplementedError, "#{self.class} must implement #in_use?" + end + end +end diff --git a/lib/semian/configuration_validator.rb b/lib/semian/configuration_validator.rb index 3d5be716a..dc3f23c8c 100644 --- a/lib/semian/configuration_validator.rb +++ b/lib/semian/configuration_validator.rb @@ -13,6 +13,7 @@ def validate! validate_circuit_breaker_or_bulkhead! validate_bulkhead_configuration! validate_circuit_breaker_configuration! + validate_adaptive_circuit_breaker_configuration! validate_resource_name! end @@ -66,12 +67,21 @@ def validate_bulkhead_configuration! def validate_circuit_breaker_configuration! return if ENV.key?("SEMIAN_CIRCUIT_BREAKER_DISABLED") return unless @configuration.fetch(:circuit_breaker, true) + return if @configuration[:adaptive_circuit_breaker] # Skip traditional validation if using adaptive require_keys!([:success_threshold, :error_threshold, :error_timeout], @configuration) validate_thresholds! validate_timeouts! end + def validate_adaptive_circuit_breaker_configuration! + return unless @configuration[:adaptive_circuit_breaker] + + nil if ENV.key?("SEMIAN_ADAPTIVE_CIRCUIT_BREAKER_DISABLED") + + # No additional validation needed - adaptive circuit breaker uses fixed internal parameters + end + def validate_thresholds! success_threshold = @configuration[:success_threshold] error_threshold = @configuration[:error_threshold] diff --git a/lib/semian/dual_circuit_breaker.rb b/lib/semian/dual_circuit_breaker.rb new file mode 100644 index 000000000..31d511d60 --- /dev/null +++ b/lib/semian/dual_circuit_breaker.rb @@ -0,0 +1,176 @@ +# frozen_string_literal: true + +module Semian + # DualCircuitBreaker wraps both classic and adaptive circuit breakers, + # allowing runtime switching between them via a callable that determines which to use. + class DualCircuitBreaker + include CircuitBreakerBehaviour + + class ChildClassicCircuitBreaker < CircuitBreaker + attr_writer :sibling + + def mark_success + super + @sibling.method(:mark_success).super_method.call + end + + def mark_failed(error) + super + @sibling.method(:mark_failed).super_method.call(error) + end + end + + class ChildAdaptiveCircuitBreaker < AdaptiveCircuitBreaker + attr_writer :sibling + + def mark_success + super + @sibling.method(:mark_success).super_method.call + end + + def mark_failed(error) + super + @sibling.method(:mark_failed).super_method.call(error) + end + end + + attr_reader :classic_circuit_breaker, :adaptive_circuit_breaker, :active_circuit_breaker + + # Override to propagate semian_resource to child breakers + def semian_resource=(resource) + @semian_resource = resource + @classic_circuit_breaker.semian_resource = resource if @classic_circuit_breaker + @adaptive_circuit_breaker.semian_resource = resource if @adaptive_circuit_breaker + end + + # use_adaptive should be a callable (Proc/lambda) that returns true/false + # to determine which circuit breaker to use. If it returns true, use adaptive. + def initialize(name:, classic_circuit_breaker:, adaptive_circuit_breaker:) + initialize_behaviour(name: name) + + @classic_circuit_breaker = classic_circuit_breaker + @adaptive_circuit_breaker = adaptive_circuit_breaker + + @classic_circuit_breaker.sibling = @adaptive_circuit_breaker + @adaptive_circuit_breaker.sibling = @classic_circuit_breaker + + @active_circuit_breaker = @classic_circuit_breaker + end + + def self.adaptive_circuit_breaker_selector(selector) # rubocop:disable Style/ClassMethodsDefinitions + @@adaptive_circuit_breaker_selector = selector # rubocop:disable Style/ClassVars + end + + def active_breaker_type + @active_circuit_breaker.is_a?(Semian::AdaptiveCircuitBreaker) ? :adaptive : :classic + end + + def acquire(resource = nil, &block) + # NOTE: This assignment is not thread-safe, but this is acceptable for now: + # - Each request gets its own decision based on the selector at that moment + # - The worst case is a brief inconsistency where a thread reads a stale value, + # which just means it uses the previous circuit breaker type for that one request + old_type = active_breaker_type + @active_circuit_breaker = get_active_circuit_breaker(resource) + if old_type != active_breaker_type + Semian.notify(:circuit_breaker_mode_change, @semian_resource, nil, nil, old_mode: old_type, new_mode: active_breaker_type) + end + + @active_circuit_breaker.acquire(resource, &block) + end + + def open? + @active_circuit_breaker.open? + end + + def closed? + @active_circuit_breaker.closed? + end + + def half_open? + @active_circuit_breaker.half_open? + end + + def request_allowed? + @active_circuit_breaker.request_allowed? + end + + def mark_failed(error) + @active_circuit_breaker&.mark_failed(error) + end + + def mark_success + @active_circuit_breaker&.mark_success + end + + def stop + @adaptive_circuit_breaker&.stop + end + + def reset + @classic_circuit_breaker&.reset + @adaptive_circuit_breaker&.reset + end + + def destroy + @classic_circuit_breaker&.destroy + @adaptive_circuit_breaker&.destroy + end + + def in_use? + @classic_circuit_breaker&.in_use? || @adaptive_circuit_breaker&.in_use? + end + + def last_error + @active_circuit_breaker.last_error + end + + def metrics + { + active: active_breaker_type, + classic: classic_metrics, + adaptive: adaptive_metrics, + } + end + + private + + def classic_metrics + return {} unless @classic_circuit_breaker + + { + state: @classic_circuit_breaker.state&.value, + open: @classic_circuit_breaker.open?, + closed: @classic_circuit_breaker.closed?, + half_open: @classic_circuit_breaker.half_open?, + } + end + + def adaptive_metrics + return {} unless @adaptive_circuit_breaker + + @adaptive_circuit_breaker.metrics.merge( + open: @adaptive_circuit_breaker.open?, + closed: @adaptive_circuit_breaker.closed?, + half_open: @adaptive_circuit_breaker.half_open?, + ) + end + + def get_active_circuit_breaker(resource) + if use_adaptive?(resource) + @adaptive_circuit_breaker + else + @classic_circuit_breaker + end + end + + def use_adaptive?(resource = nil) + return false unless defined?(@@adaptive_circuit_breaker_selector) + + @@adaptive_circuit_breaker_selector.call(resource) + rescue => e + Semian.logger&.warn("[#{@name}] use_adaptive check failed: #{e.message}. Defaulting to classic circuit breaker.") + false + end + end +end diff --git a/lib/semian/pid_controller.rb b/lib/semian/pid_controller.rb new file mode 100644 index 000000000..ee7e26e98 --- /dev/null +++ b/lib/semian/pid_controller.rb @@ -0,0 +1,193 @@ +# frozen_string_literal: true + +require "thread" +require_relative "simple_exponential_smoother" + +module Semian + module Simple + # PID Controller for adaptive circuit breaking + # Based on the error function: + # P = (error_rate - ideal_error_rate) - (1 - (error_rate - ideal_error_rate)) * rejection_rate + # Note: P increases when error_rate increases + # P decreases when rejection_rate increases (providing feedback) + class PIDController + attr_reader :rejection_rate + + def initialize(kp:, ki:, kd:, window_size:, sliding_interval:, implementation:, initial_error_rate:, + smoother_cap_value: SimpleExponentialSmoother::DEFAULT_CAP_VALUE) + @kp = kp + @ki = ki + @kd = kd + + @rejection_rate = 0.0 + @integral = 0.0 + @derivative = 0.0 + @previous_p_value = 0.0 + + @window_size = window_size + @sliding_interval = sliding_interval + @smoother = SimpleExponentialSmoother.new( + cap_value: smoother_cap_value, + initial_value: initial_error_rate, + observations_per_minute: 60 / sliding_interval, + ) + + @errors = implementation::SlidingWindow.new(max_size: 200 * window_size) + @successes = implementation::SlidingWindow.new(max_size: 200 * window_size) + @rejections = implementation::SlidingWindow.new(max_size: 200 * window_size) + + @last_error_rate = 0.0 + @last_p_value = 0.0 + end + + def record_request(outcome) + case outcome + when :error + @errors.push(current_time) + when :success + @successes.push(current_time) + when :rejected + @rejections.push(current_time) + end + end + + def update + # Store the last window's P value so that we can serve it up in the metrics snapshots + @previous_p_value = @last_p_value + + @last_error_rate = calculate_error_rate + + store_error_rate(@last_error_rate) + + dt = @sliding_interval + + @last_p_value = calculate_p_value(@last_error_rate) + + proportional = @kp * @last_p_value + @integral += @last_p_value * dt + integral = @ki * @integral + @derivative = @kd * (@last_p_value - @previous_p_value) / dt + + # Calculate the control signal (change in rejection rate) + control_signal = proportional + integral + @derivative + + # Calculate what the new rejection rate would be + new_rejection_rate = @rejection_rate + control_signal + + # Update rejection rate (clamped between 0 and 1) + @rejection_rate = new_rejection_rate.clamp(0.0, 1.0) + + @integral = @integral.clamp(-10.0, 10.0) + + @rejection_rate + end + + # Should we reject this request based on current rejection rate? + def should_reject? + rand < @rejection_rate + end + + # Reset the controller state + def reset + @rejection_rate = 0.0 + @integral = 0.0 + @previous_p_value = 0.0 + @derivative = 0.0 + @last_p_value = 0.0 + @errors.clear + @successes.clear + @rejections.clear + @last_error_rate = 0.0 + @smoother.reset + end + + # Get current metrics for monitoring/debugging + def metrics + { + rejection_rate: @rejection_rate, + error_rate: @last_error_rate, + ideal_error_rate: calculate_ideal_error_rate, + p_value: @last_p_value, + previous_p_value: @previous_p_value, + integral: @integral, + derivative: @derivative, + smoother_state: @smoother.state, + current_window_requests: { + success: @successes.size, + error: @errors.size, + rejected: @rejections.size, + }, + } + end + + private + + # Calculate the current P value + def calculate_p_value(current_error_rate) + ideal_error_rate = calculate_ideal_error_rate + + # P = (error_rate - ideal_error_rate) - (1 - (error_rate - ideal_error_rate)) * rejection_rate + # P increases when: error_rate > ideal + # P decreases when: rejection_rate > 0 (feedback mechanism) + delta_error = current_error_rate - ideal_error_rate + delta_error - (1 - delta_error) * @rejection_rate + end + + def calculate_error_rate + # Clean up old observations + current_timestamp = current_time + cutoff_time = current_timestamp - @window_size + @errors.reject! { |timestamp| timestamp < cutoff_time } + @successes.reject! { |timestamp| timestamp < cutoff_time } + @rejections.reject! { |timestamp| timestamp < cutoff_time } + + total_requests = @successes.size + @errors.size + return 0.0 if total_requests == 0 + + @errors.size.to_f / total_requests + end + + def store_error_rate(error_rate) + @smoother.add_observation(error_rate) + end + + def calculate_ideal_error_rate + @smoother.forecast + end + + def current_time + Process.clock_gettime(Process::CLOCK_MONOTONIC) + end + end + end + + module ThreadSafe + # Thread-safe version of PIDController + class PIDController < Simple::PIDController + def initialize(**kwargs) + super(**kwargs) + @lock = Mutex.new + end + + def record_request(outcome) + @lock.synchronize { super } + end + + def update + @lock.synchronize { super } + end + + def should_reject? + @lock.synchronize { super } + end + + def reset + @lock.synchronize { super } + end + + # NOTE: metrics, calculate_error_rate are not overridden + # to avoid deadlock. calculate_error_rate is private method + # only called internally from update (synchronized) and metrics (not synchronized). + end + end +end diff --git a/lib/semian/protected_resource.rb b/lib/semian/protected_resource.rb index 391fcabe7..54b96fc07 100644 --- a/lib/semian/protected_resource.rb +++ b/lib/semian/protected_resource.rb @@ -21,6 +21,7 @@ def initialize(name, bulkhead, circuit_breaker) @name = name @bulkhead = bulkhead @circuit_breaker = circuit_breaker + @circuit_breaker.semian_resource = self if @circuit_breaker @updated_at = Process.clock_gettime(Process::CLOCK_MONOTONIC) end diff --git a/lib/semian/simple_exponential_smoother.rb b/lib/semian/simple_exponential_smoother.rb new file mode 100644 index 000000000..c8646a601 --- /dev/null +++ b/lib/semian/simple_exponential_smoother.rb @@ -0,0 +1,139 @@ +# frozen_string_literal: true + +module Semian + # SimpleExponentialSmoother implements Simple Exponential Smoothing (SES) for forecasting + # a stable baseline error rate in adaptive circuit breakers. + # + # SES focuses on the level component only (no trend or seasonality), using the formula: + # smoothed = alpha * value + (1 - alpha) * previous_smoothed + # + # Key characteristics: + # - Drops extreme values above cap to prevent outliers from distorting the forecast + # - Runs in two periods: low confidence (first 30 minutes) and high confidence (after 30 minutes) + # - During the low confidence period, we converge faster towards observed value than during the high confidence period + # - The choice of alphas follows the following criteria: + # - During low confidence: + # - If we are observing 2x our current estimate, we need to converge towards it in 30 minutes + # - If we are observing 0.5x our current estimate, we need to converge towards it in 5 minutes + # - During high confidence: + # - If we are observing 2x our current estimate, we need to converge towards it in 1 hour + # - If we are observing 0.5x our current estimate, we need to converge towards it in 10 minutes + # The following code snippet can be used to calculate the alphas: + # def find_alpha(name, start_point, multiplier, convergence_duration) + # target = start_point * multiplier + # desired_distance = 0.003 + # alpha_ceil = 0.5 + # alpha_floor = 0.0 + # alpha = 0.25 + # while true + # smoothed_value = start_point + # step_size = convergence_duration / 10 + # converged_too_fast = false + # 10.times do |step| + # step_size.times do + # smoothed_value = alpha * target + (1 - alpha) * smoothed_value + # end + # if step < 9 and (smoothed_value - target).abs < desired_distance + # converged_too_fast = true + # end + # end + # + # if converged_too_fast + # alpha_ceil = alpha + # alpha = (alpha + alpha_floor) / 2 + # next + # end + # + # if (smoothed_value - target).abs > desired_distance + # alpha_floor = alpha + # alpha = (alpha + alpha_ceil) / 2 + # next + # end + # + # break + # end + # + # print "#{name} is #{alpha}\n" + # end + # + # initial_error_rate = 0.05 + # + # find_alpha("low confidence upward convergence alpha", initial_error_rate, 2, 1800) + # find_alpha("low confidence downward convergence alpha", initial_error_rate, 0.5, 300) + # find_alpha("high confidence upward convergence alpha", initial_error_rate, 2, 3600) + # find_alpha("high confidence downward convergence alpha", initial_error_rate, 0.5, 600) + class SimpleExponentialSmoother + DEFAULT_CAP_VALUE = 0.1 + + LOW_CONFIDENCE_ALPHA_UP = 0.0017 + LOW_CONFIDENCE_ALPHA_DOWN = 0.078 + HIGH_CONFIDENCE_ALPHA_UP = 0.0009 + HIGH_CONFIDENCE_ALPHA_DOWN = 0.039 + LOW_CONFIDENCE_THRESHOLD_MINUTES = 30 + + # Validate all alpha constants at class load time + [ + LOW_CONFIDENCE_ALPHA_UP, + LOW_CONFIDENCE_ALPHA_DOWN, + HIGH_CONFIDENCE_ALPHA_UP, + HIGH_CONFIDENCE_ALPHA_DOWN, + ].each do |alpha| + if alpha <= 0 || alpha >= 0.5 + raise ArgumentError, "alpha constant must be in range (0, 0.5), got: #{alpha}" + end + end + + attr_reader :alpha, :cap_value, :initial_value, :smoothed_value, :observations_per_minute + + def initialize(cap_value: DEFAULT_CAP_VALUE, initial_value:, observations_per_minute:) + @alpha = LOW_CONFIDENCE_ALPHA_DOWN # Start with low confidence, converging down + @cap_value = cap_value + @initial_value = initial_value + @observations_per_minute = observations_per_minute + @smoothed_value = initial_value + @observation_count = 0 + end + + def add_observation(value) + raise ArgumentError, "value must be non-negative, got: #{value}" if value < 0 + + return @smoothed_value if value > cap_value + + @observation_count += 1 + + low_confidence = @observation_count < (@observations_per_minute * LOW_CONFIDENCE_THRESHOLD_MINUTES) + converging_up = value > @smoothed_value + + @alpha = if low_confidence + converging_up ? LOW_CONFIDENCE_ALPHA_UP : LOW_CONFIDENCE_ALPHA_DOWN + else + converging_up ? HIGH_CONFIDENCE_ALPHA_UP : HIGH_CONFIDENCE_ALPHA_DOWN + end + + @smoothed_value = (@alpha * value) + ((1.0 - @alpha) * @smoothed_value) + @smoothed_value + end + + def forecast + @smoothed_value + end + + def state + { + smoothed_value: @smoothed_value, + alpha: @alpha, + cap_value: @cap_value, + initial_value: @initial_value, + observations_per_minute: @observations_per_minute, + observation_count: @observation_count, + } + end + + def reset + @smoothed_value = initial_value + @observation_count = 0 + @alpha = LOW_CONFIDENCE_ALPHA_DOWN + self + end + end +end diff --git a/scripts/estimator/README.md b/scripts/estimator/README.md new file mode 100644 index 000000000..984ddb827 --- /dev/null +++ b/scripts/estimator/README.md @@ -0,0 +1,76 @@ +# P² Quantile Estimator Scripts + +This directory contains scripts for testing and visualizing the P² (P-squared) quantile estimator implementation. + +## What is the P² Estimator? + +The P² algorithm is a sequential quantile estimation algorithm that calculates quantiles (like median, p90, p95) in **O(1) constant memory** and **O(1) time per observation**. This is ideal for streaming data where you can't store all observations. + +Traditional methods require sorting all data, which uses O(n) memory. The P² estimator only needs 5 markers regardless of data size. + +**Reference Paper:** +> Jain, Raj, and Imrich Chlamtac. "The P² algorithm for dynamic calculation of quantiles and histograms without storing observations." *Communications of the ACM* 28, no. 10 (1985): 1076-1085. + +## Scripts + +### `p2_accuracy.rb` + +Visualizes how the P² estimator converges to the true median over time. + +**What it does:** +- Generates 10,000 observations from a Normal(100, 15) distribution +- Tracks both the P² estimate and exact median every 100 observations +- Creates two visualizations showing convergence and mean squared error (MSE) + +**Prerequisites:** +```bash +gem install gruff rubystats +``` + +**Usage:** +```bash +ruby scripts/estimator/p2_accuracy.rb +``` + +**Output:** +- `p2_convergence.png` - Shows P² estimate vs exact median vs theoretical over time +- `p2_mse_over_time.png` - Shows mean squared error decreasing as sample size increases + +**Example Output:** +``` +P² Estimator Convergence Visualization +================================================================================ +Generating 10000 observations from Normal(100, 15) +Tracking median estimate every 100 observations +================================================================================ + +Final Results (10000 observations): + P² Estimate: 99.9442 + Exact Median: 99.9604 + MSE: 0.000262 + Theoretical: ~100.0 (μ for Normal(100, 15)) + +================================================================================ +Visualizations saved to: scripts/estimator + - p2_convergence.png (Estimates over time) + - p2_mse_over_time.png (MSE over time) +================================================================================ +``` + +## Understanding the Visualizations + +### Convergence Plot +Shows three lines: +- **P² Estimate** (teal): The running estimate from the P² algorithm +- **Exact Median** (red): The actual median calculated from all observations so far +- **Theoretical** (light teal): The true population median (μ=100) + +As more observations are added, all three lines should converge together. + +### MSE Plot +Shows how the mean squared error `(P² estimate - exact median)²` decreases over time. This demonstrates that the P² estimator becomes more accurate as it processes more data. + +## Implementation + +The P² estimator is implemented in `lib/semian/p2_estimator.rb` and is used by Semian's adaptive circuit breaker for real-time error rate estimation. + diff --git a/scripts/estimator/p2_accuracy.rb b/scripts/estimator/p2_accuracy.rb new file mode 100755 index 000000000..1c0443b10 --- /dev/null +++ b/scripts/estimator/p2_accuracy.rb @@ -0,0 +1,202 @@ +#!/usr/bin/env ruby +# frozen_string_literal: true + +# Visualize P2 quantile estimator convergence to actual median over time + +require "benchmark" + +begin + require "gruff" + require "rubystats" +rescue LoadError => e + puts "Error: Required gem is not installed." + puts "Please install with: gem install gruff rubystats" + puts "Error details: #{e.message}" + exit(1) +end + +require_relative "../../lib/semian/p2_estimator" + +class P2AccuracyBenchmark + TOTAL_OBSERVATIONS = 10_000 + SAMPLE_INTERVAL = 100 # Track estimate every N observations + QUANTILES = [0.5, 0.9].freeze # P50 (Median) and P90 + + def run + puts "P² Estimator Convergence Visualization" + puts "=" * 80 + puts "Generating #{TOTAL_OBSERVATIONS} observations from Normal(100, 15)" + puts "Tracking quantile estimates (P50, P90) every #{SAMPLE_INTERVAL} observations" + puts "=" * 80 + puts + + # Generate all observations once + normal_distribution = Rubystats::NormalDistribution.new(100, 15) + all_values = Array.new(TOTAL_OBSERVATIONS) { normal_distribution.rng } + + output_dir = File.dirname(__FILE__) + + # Run benchmark for each quantile + QUANTILES.each do |quantile| + run_quantile_benchmark(quantile, all_values, output_dir) + end + + puts "=" * 80 + puts "All visualizations saved to: #{output_dir}" + QUANTILES.each do |q| + quantile_label = "p#{(q * 100).to_i}" + puts " - #{quantile_label}_convergence.png" + puts " - #{quantile_label}_mse_over_time.png" + end + puts "=" * 80 + end + + private + + def run_quantile_benchmark(quantile, all_values, output_dir) + quantile_label = "P#{(quantile * 100).to_i}" + puts "\nProcessing #{quantile_label}..." + puts "-" * 80 + + observation_counts = [] + p2_estimates = [] + exact_quantiles = [] + + estimator = Semian::P2QuantileEstimator.new(quantile) + + all_values.each_with_index do |value, idx| + estimator.add_observation(value) + + next unless (idx + 1) % SAMPLE_INTERVAL == 0 || idx == TOTAL_OBSERVATIONS - 1 + + n = idx + 1 + observation_counts << n + + # Get P2 estimate + p2_estimates << estimator.estimate + + # Calculate exact quantile from observations so far + exact_quantiles << calculate_exact_quantile(all_values[0..idx], quantile) + + if n % 1000 == 0 + print("\rProcessed: #{n}/#{TOTAL_OBSERVATIONS}") + end + end + + puts "\r" + " " * 50 + + # Print final results + final_mse = (p2_estimates.last - exact_quantiles.last)**2 + puts "\nFinal Results for #{quantile_label} (#{TOTAL_OBSERVATIONS} observations):" + puts " P² Estimate: #{format("%.4f", p2_estimates.last)}" + puts " Exact #{quantile_label}: #{format("%.4f", exact_quantiles.last)}" + puts " MSE: #{format("%.6f", final_mse)}" + puts + + # Create visualization + create_convergence_plot(observation_counts, p2_estimates, exact_quantiles, quantile, output_dir) + create_error_plot(observation_counts, p2_estimates, exact_quantiles, quantile, output_dir) + end + + def calculate_exact_quantile(values, quantile) + sorted = values.sort + n = sorted.length + + # Linear interpolation between closest ranks + index = quantile * (n - 1) + lower = index.floor + upper = index.ceil + + if lower == upper + sorted[lower] + else + # Interpolate between the two values + weight = index - lower + sorted[lower] * (1 - weight) + sorted[upper] * weight + end + end + + def create_convergence_plot(observation_counts, p2_estimates, exact_quantiles, quantile, output_dir) + quantile_label = "P#{(quantile * 100).to_i}" + quantile_filename = "p#{(quantile * 100).to_i}" + + g = Gruff::Line.new(1400) + g.title = "P² Estimator Convergence: #{quantile_label} Estimate vs Actual" + g.x_axis_label = "Number of Observations" + g.y_axis_label = "#{quantile_label} Estimate" + g.hide_dots = true + g.theme = { + colors: ["#4ecdc4", "#ff6b6b", "#95e1d3"], + marker_color: "#aaa", + font_color: "#333", + background_colors: ["#fff", "#f8f9fa"], + } + + # Add data series + g.data("P² Estimate", p2_estimates) + g.data("Exact #{quantile_label}", exact_quantiles) + + # Add theoretical line for P50 only (μ = 100 for median) + if quantile == 0.5 + theoretical_line = Array.new(observation_counts.length, 100.0) + g.data("Theoretical (μ=100)", theoretical_line) + end + + all_values = p2_estimates + exact_quantiles + min_val = all_values.min + max_val = all_values.max + margin = (max_val - min_val) * 0.1 # Add 10% margin + g.minimum_value = min_val - margin + g.maximum_value = max_val + margin + + labels = {} + observation_counts.each_with_index do |count, idx| + if count % 1000 == 0 || idx == 0 || idx == observation_counts.length - 1 + labels[idx] = "#{count / 1000}k" + end + end + g.labels = labels + + output_path = File.join(output_dir, "#{quantile_filename}_convergence.png") + g.write(output_path) + puts "\nGenerated: #{quantile_filename}_convergence.png" + end + + def create_error_plot(observation_counts, p2_estimates, exact_quantiles, quantile, output_dir) + quantile_label = "P#{(quantile * 100).to_i}" + quantile_filename = "p#{(quantile * 100).to_i}" + + mse_values = p2_estimates.zip(exact_quantiles).map { |p2, exact| (p2 - exact)**2 } + + g = Gruff::Line.new(1400) + g.title = "P² Estimator (#{quantile_label}): Mean Squared Error Over Time" + g.x_axis_label = "Number of Observations" + g.y_axis_label = "MSE (P² - Exact)²" + g.hide_dots = true + g.theme = { + colors: ["#667eea"], + marker_color: "#aaa", + font_color: "#333", + background_colors: ["#fff", "#f8f9fa"], + } + + g.data("Mean Squared Error", mse_values) + + labels = {} + observation_counts.each_with_index do |count, idx| + if count % 1000 == 0 || idx == 0 || idx == observation_counts.length - 1 + labels[idx] = "#{count / 1000}k" + end + end + g.labels = labels + + output_path = File.join(output_dir, "#{quantile_filename}_mse_over_time.png") + g.write(output_path) + puts "Generated: #{quantile_filename}_mse_over_time.png" + end +end + +if __FILE__ == $PROGRAM_NAME + demo = P2AccuracyBenchmark.new + demo.run +end diff --git a/scripts/estimator/p50_convergence.png b/scripts/estimator/p50_convergence.png new file mode 100644 index 000000000..8d2d1f767 Binary files /dev/null and b/scripts/estimator/p50_convergence.png differ diff --git a/scripts/estimator/p50_mse_over_time.png b/scripts/estimator/p50_mse_over_time.png new file mode 100644 index 000000000..7f03bc8e1 Binary files /dev/null and b/scripts/estimator/p50_mse_over_time.png differ diff --git a/scripts/estimator/p90_convergence.png b/scripts/estimator/p90_convergence.png new file mode 100644 index 000000000..3f36e5dee Binary files /dev/null and b/scripts/estimator/p90_convergence.png differ diff --git a/scripts/estimator/p90_mse_over_time.png b/scripts/estimator/p90_mse_over_time.png new file mode 100644 index 000000000..f62d3369d Binary files /dev/null and b/scripts/estimator/p90_mse_over_time.png differ diff --git a/test/adaptive_circuit_breaker_test.rb b/test/adaptive_circuit_breaker_test.rb new file mode 100644 index 000000000..d59fcfd96 --- /dev/null +++ b/test/adaptive_circuit_breaker_test.rb @@ -0,0 +1,261 @@ +# frozen_string_literal: true + +require "test_helper" +require "semian/adaptive_circuit_breaker" + +class TestAdaptiveCircuitBreaker < Minitest::Test + def setup + @breaker = Semian::AdaptiveCircuitBreaker.new( + name: "test_breaker", + exceptions: [RuntimeError], + kp: 1.0, + ki: 0.1, + kd: 0.01, + window_size: 0.05, + initial_error_rate: 0.01, + implementation: Semian::ThreadSafe, + sliding_interval: 1, + ) + + # Stub resource for notify calls - CB expects a resource with .name + @breaker.semian_resource = Struct.new(:name).new(:test_breaker) + end + + def teardown + @breaker.stop + end + + def test_acquire_with_success_returns_value_and_records_request + # Mock the PID controller to allow the request + @breaker.pid_controller.expects(:should_reject?).returns(false) + @breaker.pid_controller.expects(:record_request).with(:success) + + # Execute the block and verify it returns the expected value + result = @breaker.acquire { "successful_result" } + + assert_equal("successful_result", result) + end + + def test_acquire_with_error_raises_and_records_request + # Mock the PID controller to allow the request + @breaker.pid_controller.expects(:should_reject?).returns(false) + @breaker.pid_controller.expects(:record_request).with(:error) + + # Execute the block and verify it raises the error + error = assert_raises(RuntimeError) do + @breaker.acquire { raise "Something went wrong" } + end + + assert_equal("Something went wrong", error.message) + assert_equal("Something went wrong", @breaker.last_error.message) + end + + def test_acquire_with_rejection_raises_and_records_request + # Mock the PID controller to reject the request + @breaker.pid_controller.expects(:should_reject?).returns(true) + @breaker.pid_controller.expects(:record_request).with(:rejected) + + # Verify that OpenCircuitError is raised and the block is never executed + block_executed = false + + error = assert_raises(Semian::OpenCircuitError) do + @breaker.acquire do + block_executed = true + "should not be executed" + end + end + + assert_equal("Rejected by adaptive circuit breaker", error.message) + assert_equal(false, block_executed) + end + + def test_update_thread_calls_pid_controller_update_after_every_wait_interval + # Verify that the update thread is created and alive + assert_instance_of(Thread, @breaker.update_thread) + assert(@breaker.update_thread.alive?) + + # Track how many times wait_for_window is called + wait_count = 0 + ready_to_progress = false + + @breaker.stub(:wait_for_window, -> { + # Wait until we're ready to start + Kernel.sleep(0.01) until ready_to_progress + + wait_count += 1 + # Stop the breaker after 3 waits + @breaker.stop if wait_count >= 3 + }) do + # We call update after sleeping. And since we exit on the third sleep, we only expect 2 updates. + @breaker.pid_controller.expects(:update).times(2) + + # Now allow the thread to start progressing + ready_to_progress = true + + # Wait for the thread to complete + Kernel.sleep(0.01) while @breaker.update_thread.alive? + end + + assert_equal(false, @breaker.update_thread.alive?) + assert_equal(3, wait_count) + end + + def test_notify_state_transition + events = [] + Semian.subscribe(:test_breaker) do |event, resource, _scope, _adapter, payload| + if event == :state_change + events << { name: resource.name, state: payload[:state] } + end + end + + # Control when the update thread progresses + ready_to_progress = false + wait_count = 0 + + @breaker.stub(:wait_for_window, -> { + # Wait until we're ready to start + Kernel.sleep(0.01) until ready_to_progress + + wait_count += 1 + # Stop the breaker after 6 waits + @breaker.stop if wait_count >= 6 + }) do + # Set up expectations before allowing the thread to progress + @breaker.pid_controller.expects(:rejection_rate).returns(0.0, 0.0, 0.0, 0.5, 0.5, 0.5, 0.5, 0.0, 0.0, 0.0).times(10) + @breaker.pid_controller.expects(:update).times(5) + @breaker.pid_controller.expects(:metrics).returns({ + rejection_rate: 0.5, + error_rate: 0.35, + ideal_error_rate: 0.10, + integral: 5.0, + p_value: 0.1, + derivative: 0.01, + current_window_requests: { success: 10, error: 50, rejected: 5 }, + }).at_least_once + + # Now allow the thread to start progressing + ready_to_progress = true + + # Wait for the thread to complete + Kernel.sleep(0.01) while @breaker.update_thread&.alive? + end + + # Should receive exactly 2 notifications (only when state actually changes) + assert_equal(2, events.length) + assert_equal(:test_breaker, events[0][:name]) + assert_equal(:open, events[0][:state]) + assert_equal(:test_breaker, events[1][:name]) + assert_equal(:closed, events[1][:state]) + ensure + Semian.unsubscribe(:test_breaker) + end + + def test_notify_adaptive_update + events = [] + Semian.subscribe(:test_breaker) do |event, resource, _scope, _adapter, payload| + if event == :adaptive_update + events << { + name: resource.name, + rejection_rate: payload[:rejection_rate], + error_rate: payload[:error_rate], + } + end + end + + # Control when the update thread progresses + ready_to_progress = false + wait_count = 0 + + @breaker.stub(:wait_for_window, -> { + # Wait until we're ready to start + Kernel.sleep(0.01) until ready_to_progress + + wait_count += 1 + # Stop the breaker after 3 waits + @breaker.stop if wait_count >= 3 + }) do + # Set up expectations before allowing the thread to progress + @breaker.pid_controller.expects(:update).times(2) + @breaker.pid_controller.expects(:rejection_rate).returns(0.25).at_least_once + @breaker.pid_controller.expects(:metrics).returns({ + rejection_rate: 0.25, + error_rate: 0.15, + ideal_error_rate: 0.10, + integral: 2.5, + p_value: 0.05, + derivative: 0.01, + current_window_requests: { success: 15, error: 3, rejected: 5 }, + }).at_least(2) + + # Now allow the thread to start progressing + ready_to_progress = true + + # Wait for the thread to complete + Kernel.sleep(0.01) while @breaker.update_thread&.alive? + end + + # Should receive 2 adaptive_update notifications (one per update) + assert_equal(2, events.length) + events.each do |event| + assert_equal(:test_breaker, event[:name]) + assert_equal(0.25, event[:rejection_rate]) + assert_equal(0.15, event[:error_rate]) + end + ensure + Semian.unsubscribe(:test_breaker) + end + + def test_state_transition_logging + strio = StringIO.new + original_logger = Semian.logger + Semian.logger = Logger.new(strio) + + # Control when the update thread progresses + ready_to_progress = false + wait_count = 0 + + @breaker.stub(:wait_for_window, -> { + # Wait until we're ready to start + Kernel.sleep(0.01) until ready_to_progress + + wait_count += 1 + # Stop the breaker after 2 waits + @breaker.stop if wait_count >= 2 + }) do + # Set up expectations before allowing the thread to progress + # rejection_rate called twice: before update (0.0), after update (0.5) + @breaker.pid_controller.expects(:rejection_rate).returns(0.0, 0.5).times(2) + @breaker.pid_controller.expects(:update).once + @breaker.pid_controller.expects(:metrics).returns({ + rejection_rate: 0.5, + error_rate: 0.35, + ideal_error_rate: 0.10, + integral: 5.0, + p_value: 0.1, + derivative: 0.01, + current_window_requests: { success: 10, error: 50, rejected: 5 }, + }).at_least_once + + # Now allow the thread to start progressing + ready_to_progress = true + + # Wait for the thread to complete + Kernel.sleep(0.01) while @breaker.update_thread&.alive? + end + + log_output = strio.string + + # Verify log contains expected fields + assert_match(/State transition from closed to open/, log_output) + assert_match(/rejection_rate=50.0%/, log_output) + assert_match(/error_rate=35.0%/, log_output) + assert_match(/ideal_error_rate=10.0%/, log_output) + assert_match(/integral=5.0/, log_output) + assert_match(/success_count=10/, log_output) + assert_match(/error_count=50/, log_output) + assert_match(/rejected_count=5/, log_output) + assert_match(/name="test_breaker"/, log_output) + ensure + Semian.logger = original_logger + end +end diff --git a/test/dual_circuit_breaker_test.rb b/test/dual_circuit_breaker_test.rb new file mode 100644 index 000000000..cf98c6c2a --- /dev/null +++ b/test/dual_circuit_breaker_test.rb @@ -0,0 +1,227 @@ +# frozen_string_literal: true + +require "test_helper" + +class TestDualCircuitBreaker < Minitest::Test + def setup + Semian.reset! + @use_adaptive_flag = true + Semian::DualCircuitBreaker.adaptive_circuit_breaker_selector(->(_resource) { + @use_adaptive_flag + }) + end + + def teardown + Semian.destroy_all_resources + end + + def test_creates_both_circuit_breakers + resource = create_dual_resource + + assert_instance_of(Semian::DualCircuitBreaker, resource.circuit_breaker) + assert_instance_of(Semian::DualCircuitBreaker::ChildClassicCircuitBreaker, resource.circuit_breaker.classic_circuit_breaker) + assert_instance_of(Semian::DualCircuitBreaker::ChildAdaptiveCircuitBreaker, resource.circuit_breaker.adaptive_circuit_breaker) + end + + def test_uses_classic_when_use_adaptive_returns_false + resource = create_dual_resource + @use_adaptive_flag = false + + resource.acquire { "success" } + + assert_instance_of(Semian::DualCircuitBreaker::ChildClassicCircuitBreaker, resource.circuit_breaker.active_circuit_breaker) + end + + def test_uses_adaptive_when_use_adaptive_returns_true + resource = create_dual_resource + @use_adaptive_flag = true + + resource.acquire { "success" } + + assert_instance_of(Semian::DualCircuitBreaker::ChildAdaptiveCircuitBreaker, resource.circuit_breaker.active_circuit_breaker) + end + + def test_can_switch_between_breakers_at_runtime + resource = create_dual_resource + + # Start with classic + @use_adaptive_flag = false + resource.acquire { "success" } + + assert_instance_of(Semian::DualCircuitBreaker::ChildClassicCircuitBreaker, resource.circuit_breaker.active_circuit_breaker) + + # Switch to adaptive + @use_adaptive_flag = true + resource.acquire { "success" } + + assert_instance_of(Semian::DualCircuitBreaker::ChildAdaptiveCircuitBreaker, resource.circuit_breaker.active_circuit_breaker) + + # Switch back to classic + @use_adaptive_flag = false + resource.acquire { "success" } + + assert_instance_of(Semian::DualCircuitBreaker::ChildClassicCircuitBreaker, resource.circuit_breaker.active_circuit_breaker) + end + + def test_both_breakers_record_requests + resource = create_dual_resource + @use_adaptive_flag = false + + classic_cb = resource.circuit_breaker.classic_circuit_breaker + adaptive_cb = resource.circuit_breaker.adaptive_circuit_breaker + + 2.times { resource.acquire { "success" } } + + adaptive_metrics = adaptive_cb.pid_controller.metrics + + assert_equal(2, adaptive_metrics[:current_window_requests][:success]) + + begin + resource.acquire { raise TestError, "test error" } + rescue TestError + nil + end + + assert_equal(1, classic_cb.instance_variable_get(:@errors).size) + assert_equal("test error", adaptive_cb.last_error.message) + adaptive_metrics = adaptive_cb.pid_controller.metrics + + assert_equal(1, adaptive_metrics[:current_window_requests][:error]) + end + + def test_destroy_destroys_both_breakers + resource = create_dual_resource + + resource.circuit_breaker.destroy + + assert(resource.circuit_breaker.adaptive_circuit_breaker.instance_variable_get(:@stopped)) + end + + def test_handles_use_adaptive_check_errors_gracefully + resource = Semian.register( + :test_error_handling, + dual_circuit_breaker: true, + success_threshold: 2, + error_threshold: 3, + error_timeout: 5, + tickets: 5, + timeout: 0.5, + exceptions: [TestError], + ) + + Semian::DualCircuitBreaker.adaptive_circuit_breaker_selector(->(_resource) { raise StandardError, "check failed" }) + + success_count = 0 + resource.acquire { success_count += 1 } + + assert_equal(1, success_count) + assert_instance_of(Semian::DualCircuitBreaker::ChildClassicCircuitBreaker, resource.circuit_breaker.active_circuit_breaker) + end + + def test_with_bulkhead_enabled + resource = Semian.register( + :test_with_bulkhead, + dual_circuit_breaker: true, + success_threshold: 2, + error_threshold: 3, + error_timeout: 5, + tickets: 2, + timeout: 0.5, + exceptions: [TestError], + ) + + assert(resource.bulkhead) + assert_equal(2, resource.tickets) + end + + def test_env_variable_disables_dual_breaker + ENV["SEMIAN_CIRCUIT_BREAKER_DISABLED"] = "1" + + resource = Semian.register( + :test_disabled, + dual_circuit_breaker: true, + success_threshold: 2, + error_threshold: 3, + error_timeout: 5, + tickets: 2, + ) + + assert_nil(resource.circuit_breaker) + ensure + ENV.delete("SEMIAN_CIRCUIT_BREAKER_DISABLED") + end + + def test_both_breakers_track_last_error + resource = create_dual_resource + + begin + resource.acquire { raise TestError, "test error" } + rescue TestError + nil # expected + end + + assert_equal("test error", resource.circuit_breaker.last_error.message) + assert_equal("test error", resource.circuit_breaker.classic_circuit_breaker.last_error.message) + assert_equal("test error", resource.circuit_breaker.adaptive_circuit_breaker.last_error.message) + end + + def test_active_breaker_type + resource = create_dual_resource + + @use_adaptive_flag = false + resource.acquire { "success" } + + assert_instance_of(Semian::DualCircuitBreaker::ChildClassicCircuitBreaker, resource.circuit_breaker.classic_circuit_breaker) + + @use_adaptive_flag = true + resource.acquire { "success" } + + assert_instance_of(Semian::DualCircuitBreaker::ChildAdaptiveCircuitBreaker, resource.circuit_breaker.adaptive_circuit_breaker) + end + + def test_notifies_on_mode_change + resource = create_dual_resource + notifications = [] + + subscription = Semian.subscribe do |event, _, _, _, payload| + notifications << { event: event, payload: payload } if event == :circuit_breaker_mode_change + end + + @use_adaptive_flag = false + resource.acquire { "success" } + + @use_adaptive_flag = true + resource.acquire { "success" } + + assert_equal(1, notifications.size) + assert_equal(:classic, notifications[0][:payload][:old_mode]) + assert_equal(:adaptive, notifications[0][:payload][:new_mode]) + + @use_adaptive_flag = false + resource.acquire { "success" } + + assert_equal(2, notifications.size) + assert_equal(:adaptive, notifications[1][:payload][:old_mode]) + assert_equal(:classic, notifications[1][:payload][:new_mode]) + ensure + Semian.unsubscribe(subscription) + end + + private + + def create_dual_resource + Semian.register( + :test_dual_resource, + dual_circuit_breaker: true, + success_threshold: 2, + error_threshold: 3, + error_timeout: 5, + tickets: 5, + timeout: 0.5, + exceptions: [TestError], + ) + end + + class TestError < StandardError + end +end diff --git a/test/forecast_success_criteria_test.rb b/test/forecast_success_criteria_test.rb new file mode 100644 index 000000000..c087a2c07 --- /dev/null +++ b/test/forecast_success_criteria_test.rb @@ -0,0 +1,191 @@ +# frozen_string_literal: true + +require "test_helper" +require "semian/simple_exponential_smoother" + +class TestForecastSuccessCriteria < Minitest::Test + DELTA_TOLERANCE = 0.003 + + def setup + @observations_per_minute = 60 + end + + private + + def simulate_observations(smoother, error_rate, count) + count.times { smoother.add_observation(error_rate) } + end + + def minutes_to_observations(minutes) + (minutes * @observations_per_minute).to_i + end + + def establish_high_confidence(smoother, baseline_error_rate) + observations = minutes_to_observations(30) + simulate_observations(smoother, baseline_error_rate, observations) + end + + public + + def test_low_confidence_during_incident_above_cap_stays_at_initial_value + smoother = Semian::SimpleExponentialSmoother.new(initial_value: 0.05, observations_per_minute: @observations_per_minute) + initial_value = smoother.forecast + + observations = minutes_to_observations(30) + simulate_observations(smoother, 0.15, observations) + + assert_in_delta( + initial_value, + smoother.forecast, + DELTA_TOLERANCE, + "IER should stay at initial value during low confidence incident above cap", + ) + end + + def test_low_confidence_ier_lower_than_actual_converges_in_30_minutes_for_2x_error_rate + smoother = Semian::SimpleExponentialSmoother.new(initial_value: 0.05, observations_per_minute: @observations_per_minute) + current_ier = smoother.forecast + target_error_rate = current_ier * 2 + + [5, 10, 15, 20, 25].each do |minutes| + observations = minutes_to_observations(5) + simulate_observations(smoother, target_error_rate, observations) + + refute_in_delta( + target_error_rate, + smoother.forecast, + DELTA_TOLERANCE, + "IER should not have converged to target after #{minutes} minutes during low confidence", + ) + end + + observations = minutes_to_observations(5) + simulate_observations(smoother, target_error_rate, observations) + + assert_in_delta( + target_error_rate, + smoother.forecast, + DELTA_TOLERANCE, + "IER should converge to 2x observed rate in 30 minutes during low confidence", + ) + end + + def test_low_confidence_ier_higher_than_actual_converges_in_5_minutes + smoother = Semian::SimpleExponentialSmoother.new(initial_value: 0.05, observations_per_minute: @observations_per_minute) + current_ier = smoother.forecast + target_error_rate = current_ier * 0.5 + + observations = minutes_to_observations(5) + simulate_observations(smoother, target_error_rate, observations) + + assert_in_delta( + target_error_rate, + smoother.forecast, + DELTA_TOLERANCE, + "IER should converge to 0.5x observed rate in 5 minutes during low confidence", + ) + end + + def test_low_confidence_ier_already_perfect_stays_static + smoother = Semian::SimpleExponentialSmoother.new(initial_value: 0.05, observations_per_minute: @observations_per_minute) + perfect_rate = smoother.forecast + + observations = minutes_to_observations(30) + simulate_observations(smoother, perfect_rate, observations) + + assert_in_delta( + perfect_rate, + smoother.forecast, + DELTA_TOLERANCE, + "IER should stay static when already perfect during low confidence", + ) + end + + def test_high_confidence_during_incident_above_cap_stays_stable + smoother = Semian::SimpleExponentialSmoother.new(initial_value: 0.05, observations_per_minute: @observations_per_minute) + baseline_error_rate = 0.05 + + establish_high_confidence(smoother, baseline_error_rate) + pre_incident_value = smoother.forecast + + observations = minutes_to_observations(30) + simulate_observations(smoother, 0.15, observations) + + assert_in_delta( + pre_incident_value, + smoother.forecast, + DELTA_TOLERANCE, + "IER should stay stable during high confidence incident above cap", + ) + end + + def test_high_confidence_ier_lower_than_actual_converges_in_1_hour + smoother = Semian::SimpleExponentialSmoother.new(initial_value: 0.05, observations_per_minute: @observations_per_minute) + baseline_error_rate = 0.05 + + establish_high_confidence(smoother, baseline_error_rate) + + current_ier = smoother.forecast + target_error_rate = current_ier * 2 + + [10, 20, 30, 40, 50].each do |minutes| + observations = minutes_to_observations(10) + simulate_observations(smoother, target_error_rate, observations) + + refute_in_delta( + target_error_rate, + smoother.forecast, + DELTA_TOLERANCE, + "IER should not have converged to target after #{minutes} minutes during high confidence", + ) + end + + observations = minutes_to_observations(10) + simulate_observations(smoother, target_error_rate, observations) + + assert_in_delta( + target_error_rate, + smoother.forecast, + DELTA_TOLERANCE, + "IER should converge to 2x observed rate in 1 hour during high confidence", + ) + end + + def test_high_confidence_ier_higher_than_actual_converges_in_10_minutes + smoother = Semian::SimpleExponentialSmoother.new(initial_value: 0.05, observations_per_minute: @observations_per_minute) + baseline_error_rate = 0.05 + + establish_high_confidence(smoother, baseline_error_rate) + + current_ier = smoother.forecast + target_error_rate = current_ier * 0.5 + + observations = minutes_to_observations(10) + simulate_observations(smoother, target_error_rate, observations) + + assert_in_delta( + target_error_rate, + smoother.forecast, + DELTA_TOLERANCE, + "IER should converge to 0.5x observed rate in 10 minutes during high confidence", + ) + end + + def test_high_confidence_ier_already_perfect_stays_static + smoother = Semian::SimpleExponentialSmoother.new(initial_value: 0.05, observations_per_minute: @observations_per_minute) + baseline_error_rate = 0.012 + + establish_high_confidence(smoother, baseline_error_rate) + established_ier = smoother.forecast + + observations = minutes_to_observations(30) + simulate_observations(smoother, baseline_error_rate, observations) + + assert_in_delta( + established_ier, + smoother.forecast, + DELTA_TOLERANCE, + "IER should stay static when already perfect during high confidence", + ) + end +end diff --git a/test/pid_controller_test.rb b/test/pid_controller_test.rb new file mode 100644 index 000000000..b860e4be6 --- /dev/null +++ b/test/pid_controller_test.rb @@ -0,0 +1,278 @@ +# frozen_string_literal: true + +require "test_helper" +require "semian/pid_controller" + +class TestPIDController < Minitest::Test + include TimeHelper + + def setup + @controller = Semian::ThreadSafe::PIDController.new( + kp: 1.0, + ki: 0.1, + kd: 0.01, + window_size: 10, + initial_error_rate: 0.01, + implementation: Semian::ThreadSafe, + sliding_interval: 1, + ) + end + + def teardown + @controller.reset + Process.unstub(:clock_gettime) + end + + def test_initial_values + assert_equal( + { + rejection_rate: 0.0, + error_rate: 0.0, + ideal_error_rate: 0.01, + p_value: 0.0, + previous_p_value: 0.0, + integral: 0.0, + derivative: 0.0, + current_window_requests: { success: 0, error: 0, rejected: 0 }, + smoother_state: { + smoothed_value: 0.01, + alpha: 0.078, + cap_value: 0.1, + initial_value: 0.01, + observations_per_minute: 60, + observation_count: 0, + }, + }, + @controller.metrics, + ) + end + + def test_record_requests + (0..2).each do |_| + @controller.record_request(:success) + @controller.record_request(:error) + @controller.record_request(:rejected) + end + + assert_equal({ success: 3, error: 3, rejected: 3 }, @controller.metrics[:current_window_requests]) + end + + def test_update_flow + # Each iteration advances time by 1 second. Window is 10 seconds. + elapsed = 0 + + # Phase 1: Start with 1% error rate + elapsed += 1 + time_travel(elapsed) do + 99.times { @controller.record_request(:success) } + @controller.record_request(:error) + @controller.update + end + + # Rejection should be 0 when error rate is less than or equal to ideal + assert_equal(0.0, @controller.metrics[:rejection_rate]) + assert_equal(1, @controller.metrics[:smoother_state][:observation_count]) + + # Phase 2: Introduce error spike + elapsed += 1 + time_travel(elapsed) do + 61.times { @controller.record_request(:success) } + 39.times { @controller.record_request(:error) } + @controller.update + end + + # Rejection should be around 20% (± 2%) + assert_in_delta(0.20, @controller.metrics[:rejection_rate], 0.02, "Rejection should be ~20%") + rejection_after_spike = @controller.metrics[:rejection_rate] + + # Phase 3: Continue high error rate (20% per window) + 5.times do + elapsed += 1 + time_travel(elapsed) do + 80.times { @controller.record_request(:success) } + 20.times { @controller.record_request(:error) } + @controller.update + end + end + + # After sustained errors, rejection should be at least as high as after the initial spike + assert_operator( + @controller.metrics[:rejection_rate], + :>=, + rejection_after_spike, + "Rejection should remain elevated during sustained errors", + ) + + # Phase 4: Recovery - all successes to bring error rate down + 10.times do + elapsed += 1 + time_travel(elapsed) do + 100.times { @controller.record_request(:success) } + @controller.update + end + end + + # After 10 seconds of all successes (window fully refreshed), + # all error data has expired, so rejection should be ~0 + assert_in_delta(0.0, @controller.metrics[:rejection_rate], 0.01, "Rejection should be ~0 after full recovery") + assert_equal(0.0, @controller.metrics[:error_rate], "Error rate should be 0 after window expires") + end + + def test_should_reject_probability + @controller.instance_variable_set(:@rejection_rate, 0.5) + + # Mock rand to return deterministic values + sequence = [0.3, 0.7, 0.4, 0.6, 0.2, 0.8, 0.5, 0.1, 0.9, 0.45] + index = 0 + @controller.stub(:rand, -> { + val = sequence[index % sequence.length] + index += 1 + val + }) do + rejections = 0 + 10.times do + rejections += 1 if @controller.should_reject? + end + + # With rejection_rate = 0.5, values < 0.5 should be rejected + # From sequence: 0.3, 0.4, 0.2, 0.1, 0.45 = 5 rejections + assert_equal(5, rejections) + end + end + + def test_reset_clears_all_state + @controller.record_request(:error) + @controller.update + + @controller.reset + + assert_equal( + { + rejection_rate: 0.0, + error_rate: 0.0, + ideal_error_rate: 0.01, + p_value: 0.0, + previous_p_value: 0.0, + integral: 0.0, + derivative: 0.0, + current_window_requests: { success: 0, error: 0, rejected: 0 }, + smoother_state: { + smoothed_value: 0.01, + alpha: 0.078, + cap_value: 0.1, + initial_value: 0.01, + observations_per_minute: 60, + observation_count: 0, + }, + }, + @controller.metrics, + ) + end + + def test_integral_anti_windup + # Test that integral is clamped between -10 and 10 + + # Test lower bound: integral should not go below -10 + # Simulate prolonged low error rate (below ideal) which would push integral negative + 100.times do + 100.times { @controller.record_request(:success) } + @controller.update + end + + # Integral should be clamped at -10, not accumulate unbounded negative values + assert_operator(@controller.metrics[:integral], :>=, -10.0, "Integral should not go below -10") + + @controller.reset + + # Test upper bound: integral should not go above 10 + # Simulate prolonged high error rate (100%) which would push integral positive + 50.times do + 100.times { @controller.record_request(:error) } + @controller.update + end + + # Integral should be clamped at 10, not accumulate unbounded positive values + assert_operator(@controller.metrics[:integral], :<=, 10.0, "Integral should not go above 10") + end + + def test_sliding_window_behavior_of_controller + time_travel(0.5) do + @controller.record_request(:success) + @controller.record_request(:success) + @controller.record_request(:error) + end + + time_travel(1.5) do + @controller.record_request(:error) + end + + time_travel(10) do + @controller.update + + # On the first 10 seconds, all requests are included + assert_equal(0.5, @controller.metrics[:error_rate]) + end + + time_travel(11) do + @controller.update + + # On the 11th second, the first second is excluded, and we're left with 1 error, so 100% + assert_equal(1.0, @controller.metrics[:error_rate]) + end + end +end + +class TestThreadSafePIDController < Minitest::Test + include TimeHelper + + def setup + @controller = Semian::ThreadSafe::PIDController.new( + kp: 1.0, + ki: 0.1, + kd: 0.01, + window_size: 10, + initial_error_rate: 0.01, + implementation: Semian::ThreadSafe, + sliding_interval: 1, + ) + end + + def test_thread_safety + threads = [] + errors = [] + + # Create multiple threads that simultaneously update the controller + 10.times do |i| + threads << Thread.new do + 100.times do + if i.even? + @controller.record_request(:error) + else + @controller.record_request(:success) + end + end + rescue => e + errors << e + end + end + + threads.each(&:join) + + # No errors should have occurred + assert_empty(errors) + # Values got updated correctly with no race conditions + assert_equal(500, @controller.metrics[:current_window_requests][:error]) + assert_equal(500, @controller.metrics[:current_window_requests][:success]) + end + + def test_no_deadlocks + # Confirm the code does not try to acquire the same lock twice + @controller.update + @controller.record_request(:error) + @controller.should_reject? + @controller.reset + + # If any of the above has a deadlock, the test will hang, and we'll never reach this line + assert(true) # rubocop:disable Minitest/UselessAssertion + end +end diff --git a/test/semian_adaptive_config_test.rb b/test/semian_adaptive_config_test.rb new file mode 100644 index 000000000..56a9700be --- /dev/null +++ b/test/semian_adaptive_config_test.rb @@ -0,0 +1,120 @@ +# frozen_string_literal: true + +require "test_helper" + +class TestSemianAdaptiveConfig < Minitest::Test + def teardown + Semian.destroy_all_resources + end + + def test_register_with_adaptive_circuit_breaker + resource = Semian.register( + :test_adaptive, + adaptive_circuit_breaker: true, + bulkhead: false, + ) + + assert_instance_of(Semian::ProtectedResource, resource) + assert_instance_of(Semian::AdaptiveCircuitBreaker, resource.circuit_breaker) + end + + def test_adaptive_circuit_breaker_disabled_by_env + ENV["SEMIAN_ADAPTIVE_CIRCUIT_BREAKER_DISABLED"] = "1" + + resource = Semian.register( + :test_adaptive_disabled, + adaptive_circuit_breaker: true, + bulkhead: true, + tickets: 1, + ) + + assert_instance_of(Semian::ProtectedResource, resource) + assert_nil(resource.circuit_breaker) + ensure + ENV.delete("SEMIAN_ADAPTIVE_CIRCUIT_BREAKER_DISABLED") + end + + def test_traditional_circuit_breaker_still_works + resource = Semian.register( + :test_traditional, + circuit_breaker: true, + success_threshold: 2, + error_threshold: 3, + error_timeout: 10, + bulkhead: false, + ) + + assert_instance_of(Semian::ProtectedResource, resource) + assert_instance_of(Semian::CircuitBreaker, resource.circuit_breaker) + end + + def test_adaptive_overrides_traditional_when_enabled + resource = Semian.register( + :test_override, + adaptive_circuit_breaker: true, + circuit_breaker: true, # This should be ignored + success_threshold: 2, # These traditional params should be ignored + error_threshold: 3, + error_timeout: 10, + bulkhead: false, + ) + + assert_instance_of(Semian::AdaptiveCircuitBreaker, resource.circuit_breaker) + end + + def test_adaptive_circuit_breaker_with_bulkhead + resource = Semian.register( + :test_combined, + adaptive_circuit_breaker: true, + bulkhead: true, + tickets: 5, + timeout: 1, + ) + + assert_instance_of(Semian::ProtectedResource, resource) + assert_instance_of(Semian::AdaptiveCircuitBreaker, resource.circuit_breaker) + assert_instance_of(Semian::Resource, resource.bulkhead) + assert_equal(5, resource.tickets) + end + + def test_retrieve_adaptive_resource + Semian.register( + :test_retrieve, + adaptive_circuit_breaker: true, + bulkhead: false, + ) + + resource = Semian[:test_retrieve] + + assert_instance_of(Semian::ProtectedResource, resource) + assert_instance_of(Semian::AdaptiveCircuitBreaker, resource.circuit_breaker) + end + + def test_adaptive_circuit_breaker_default_params + resource = Semian.register( + :test_defaults, + adaptive_circuit_breaker: true, + bulkhead: false, + ) + + controller = resource.circuit_breaker.pid_controller + metrics = controller.metrics + + # Check that defaults were applied + assert_equal(0.0, metrics[:rejection_rate]) + end + + def test_resource_cleanup_with_adaptive + resource = Semian.register( + :test_cleanup, + adaptive_circuit_breaker: true, + bulkhead: false, + ) + + Semian.destroy(:test_cleanup) + + # After destroy, the update thread should be stopped + # (the destroy method should call stop on the adaptive circuit breaker) + assert_nil(resource.circuit_breaker.update_thread) + end +end diff --git a/test/simple_exponential_smoother_test.rb b/test/simple_exponential_smoother_test.rb new file mode 100644 index 000000000..2b80ca45b --- /dev/null +++ b/test/simple_exponential_smoother_test.rb @@ -0,0 +1,130 @@ +# frozen_string_literal: true + +require "test_helper" +require "semian/simple_exponential_smoother" + +class TestSimpleExponentialSmoother < Minitest::Test + private + + def simulate_observations(smoother, error_rate, count) + count.times { smoother.add_observation(error_rate) } + end + + public + + def test_initialization_with_defaults + smoother = Semian::SimpleExponentialSmoother.new(initial_value: 0.05, observations_per_minute: 60) + + # Alpha starts at LOW_CONFIDENCE_ALPHA_DOWN + assert_equal(0.078, smoother.alpha) + assert_equal(0.1, smoother.cap_value) + assert_equal(0.05, smoother.initial_value) + assert_equal(0.05, smoother.forecast) + end + + def test_initialization_with_custom_params + smoother = Semian::SimpleExponentialSmoother.new( + cap_value: 0.5, + initial_value: 0.02, + observations_per_minute: 60, + ) + + # Alpha starts at LOW_CONFIDENCE_ALPHA_DOWN + assert_equal(0.078, smoother.alpha) + assert_equal(0.5, smoother.cap_value) + assert_equal(0.02, smoother.initial_value) + assert_equal(0.02, smoother.forecast) + end + + def test_smoothing_formula + smoother = Semian::SimpleExponentialSmoother.new(initial_value: 0.01, observations_per_minute: 60) + + smoother.add_observation(0.01) + + assert_in_delta(0.01, smoother.forecast, 0.001) + + smoother.add_observation(0.05) + + # Converging up in low confidence: alpha = 0.0017 + # Expected: 0.0017 * 0.05 + 0.9983 * 0.01 = 0.010068 + assert_in_delta(0.010068, smoother.forecast, 0.0001) + end + + def test_add_observation_updates_smoothed_value + smoother = Semian::SimpleExponentialSmoother.new(initial_value: 0.05, observations_per_minute: 60) + + initial_forecast = smoother.forecast + smoother.add_observation(0.08) + + assert_operator(smoother.forecast, :>, initial_forecast) + assert_operator(smoother.forecast, :<, 0.08) + end + + def test_cap_value_drops_high_observations + smoother = Semian::SimpleExponentialSmoother.new(initial_value: 0.01, observations_per_minute: 60) + initial_forecast = smoother.forecast + + 20.times { smoother.add_observation(1.0) } + + assert_equal(initial_forecast, smoother.forecast) + + 20.times { smoother.add_observation(0.05) } + + assert_operator(smoother.forecast, :>, initial_forecast) + end + + def test_adaptive_alpha_based_on_direction + smoother = Semian::SimpleExponentialSmoother.new(initial_value: 0.01, observations_per_minute: 60) + + smoother.add_observation(0.08) + + # Converging up in low confidence: alpha = 0.0017 + assert_equal(0.0017, smoother.alpha) + # Expected: 0.0017 * 0.08 + 0.9983 * 0.01 = 0.010119 + assert_in_delta(0.010119, smoother.forecast, 0.0001) + end + + def test_reset_returns_to_initial_state + smoother = Semian::SimpleExponentialSmoother.new(initial_value: 0.05, observations_per_minute: 60) + initial_forecast = smoother.forecast + + 50.times { smoother.add_observation(0.1) } + + assert_operator(smoother.forecast, :>, initial_forecast) + + result = smoother.reset + + assert_equal(smoother, result) + assert_equal(initial_forecast, smoother.forecast) + end + + def test_alpha_changes_with_confidence_period + smoother = Semian::SimpleExponentialSmoother.new(initial_value: 0.01, observations_per_minute: 60) + + smoother.add_observation(0.08) + low_confidence_alpha = smoother.alpha + + 1800.times { smoother.add_observation(0.01) } + + smoother.add_observation(0.08) + high_confidence_alpha = smoother.alpha + + assert_operator(high_confidence_alpha, :<, low_confidence_alpha) + end + + def test_handles_edge_case_values + smoother = Semian::SimpleExponentialSmoother.new(initial_value: 0.05, observations_per_minute: 60) + + initial_value = smoother.forecast + smoother.add_observation(0.0) + + assert_operator(smoother.forecast, :<, initial_value) + + assert_raises(ArgumentError) { smoother.add_observation(-0.1) } + + smoother.reset + 1000.times { smoother.add_observation(0.05) } + + assert_in_delta(0.05, smoother.forecast, 0.0001) + end +end