theory Example_Oil
imports
  "../Numerics/Euler_Affine"
  "../Numerics/Optimize_Float"
begin

subsection {* Oil reservoir in Affine arithmetic *}
text {*\label{sec:exampleoil}*}
approximate_affine oil "\<lambda>(y::real, z::real). (z, z*z + -3 * inverse (inverse 1000 + y*y))"

lemma oil_deriv_ok: fixes y::real
shows "1 / 1000 + y*y = 0 \<longleftrightarrow> False"
proof -
  have "1 / 1000 + y*y > 0"
    by (auto intro!: add_pos_nonneg)
  thus ?thesis by auto
qed

lemma oil_fderiv: "((\<lambda>(y::real, z::real). (z, z * z + -3 * inverse (inverse 1000 + y * y))) has_derivative
   (case x of (y, z) \<Rightarrow> \<lambda>(dy, dz). (dz, 2 * dz * z + 6 * (inverse (inverse 1000 + y * y) * (dy * (y * inverse (inverse 1000 + y * y)))))))
   (at x within X)"
  by (auto intro!: derivative_eq_intros simp: oil_deriv_ok split_beta inverse_eq_divide)

approximate_affine oil_d "\<lambda>(y::real, z) (dy, dz). (dz, 2 * dz * z  + 6 * (inverse (inverse 1000 + y*y) * (dy * (y * inverse (inverse 1000 + y*y)))))"

interpretation oil!: aform_approximate_ivp
  "uncurry_options oil"
  "uncurry_options oil_d"
  "\<lambda>(y::real, z::real). (z, z*z + -3 * inverse (inverse 1000 + y*y))"
  "\<lambda>(y::real, z) (dy, dz).
    (dz, 2 * dz * z  + 6 * (inverse (inverse 1000 + y*y) * (dy * (y * inverse (inverse 1000 + y*y)))))"
  apply default
  apply (rule oil[THEN Joints2_JointsI]) apply assumption apply assumption
  apply (rule oil_fderiv)
  apply (rule oil_d[THEN Joints2_JointsI]) apply assumption apply assumption
  apply (auto intro!: continuous_intros simp: split_beta oil_deriv_ok)
  done

definition "rough_optns = default_optns
    \<lparr> precision := 50,
      tolerance := FloatR 1 (- 3),
      stepsize  := FloatR 1 (- 9),
      result_fun := ivls_result 20 110,
      iterations := 20,
      widening_mod := 20,
      printing_fun := (\<lambda>_ _ _. ())\<rparr>"

definition "oiltest_rough =
  (\<lambda>_::unit. euler_series_result (uncurry_options oil) (uncurry_options oil_d) rough_optns 0
      (aform_of_point (10, 0)) 22000)"

lemma "oiltest_rough () =
  Some (FloatR 175831 (- 12),
       [(FloatR 174951 (- 12), (FloatR (- 899741) (- 17), FloatR (- 666307) (- 21)),
         (FloatR (- 793547) (- 17), FloatR (- 591743) (- 21)), FloatR 175831 (- 12),
         (FloatR (- 899741) (- 17), FloatR (- 658317) (- 21)), FloatR (- 801547) (- 17),
         FloatR (- 591821) (- 21)),
        (FloatR 174071 (- 12), (FloatR (- 890848) (- 17), FloatR (- 674567) (- 21)),
         (FloatR (- 785451) (- 17), FloatR (- 599104) (- 21)), FloatR 174951 (- 12),
         (FloatR (- 890848) (- 17), FloatR (- 666230) (- 21)), FloatR (- 793551) (- 17),
         FloatR (- 599183) (- 21)),
        (FloatR 173191 (- 12), (FloatR (- 881846) (- 17), FloatR (- 683203) (- 21)),
         (FloatR (- 777248) (- 17), FloatR (- 606801) (- 21)), FloatR 174071 (- 12),
         (FloatR (- 881846) (- 17), FloatR (- 674489) (- 21)), FloatR (- 785455) (- 17),
         FloatR (- 606882) (- 21)),
        (FloatR 172311 (- 12), (FloatR (- 872731) (- 17), FloatR (- 692248) (- 21)),
         (FloatR (- 768935) (- 17), FloatR (- 614865) (- 21)), FloatR 173191 (- 12),
         (FloatR (- 872731) (- 17), FloatR (- 683123) (- 21)), FloatR (- 777252) (- 17),
         FloatR (- 614947) (- 21)),
        (FloatR 171431 (- 12), (FloatR (- 863498) (- 17), FloatR (- 701740) (- 21)),
         (FloatR (- 760505) (- 17), FloatR (- 623329) (- 21)), FloatR 172311 (- 12),
         (FloatR (- 863498) (- 17), FloatR (- 692166) (- 21)), FloatR (- 768939) (- 17),
         FloatR (- 623413) (- 21)),
        (FloatR 170551 (- 12), (FloatR (- 854140) (- 17), FloatR (- 711722) (- 21)),
         (FloatR (- 751953) (- 17), FloatR (- 632231) (- 21)), FloatR 171431 (- 12),
         (FloatR (- 854140) (- 17), FloatR (- 701656) (- 21)), FloatR (- 760510) (- 17),
         FloatR (- 632318) (- 21)),
        (FloatR 169671 (- 12), (FloatR (- 844651) (- 17), FloatR (- 722245) (- 21)),
         (FloatR (- 743271) (- 17), FloatR (- 641616) (- 21)), FloatR 170551 (- 12),
         (FloatR (- 844651) (- 17), FloatR (- 711637) (- 21)), FloatR (- 751957) (- 17),
         FloatR (- 641705) (- 21)),
        (FloatR 168791 (- 12), (FloatR (- 835025) (- 17), FloatR (- 733366) (- 21)),
         (FloatR (- 734452) (- 17), FloatR (- 651534) (- 21)), FloatR 169671 (- 12),
         (FloatR (- 835025) (- 17), FloatR (- 722158) (- 21)), FloatR (- 743275) (- 17),
         FloatR (- 651624) (- 21)),
        (FloatR 167911 (- 12), (FloatR (- 825253) (- 17), FloatR (- 745150) (- 21)),
         (FloatR (- 725487) (- 17), FloatR (- 662041) (- 21)), FloatR 168791 (- 12),
         (FloatR (- 825253) (- 17), FloatR (- 733276) (- 21)), FloatR (- 734456) (- 17),
         FloatR (- 662134) (- 21)),
        (FloatR 167031 (- 12), (FloatR (- 815328) (- 17), FloatR (- 757674) (- 21)),
         (FloatR (- 716368) (- 17), FloatR (- 673205) (- 21)), FloatR 167911 (- 12),
         (FloatR (- 815328) (- 17), FloatR (- 745058) (- 21)), FloatR (- 725491) (- 17),
         FloatR (- 673299) (- 21)),
        (FloatR 166151 (- 12), (FloatR (- 805240) (- 17), FloatR (- 771028) (- 21)),
         (FloatR (- 707083) (- 17), FloatR (- 685101) (- 21)), FloatR 167031 (- 12),
         (FloatR (- 805240) (- 17), FloatR (- 757580) (- 21)), FloatR (- 716372) (- 17),
         FloatR (- 685198) (- 21)),
        (FloatR 165271 (- 12), (FloatR (- 794978) (- 17), FloatR (- 785316) (- 21)),
         (FloatR (- 697622) (- 17), FloatR (- 697820) (- 21)), FloatR 166151 (- 12),
         (FloatR (- 794978) (- 17), FloatR (- 770931) (- 21)), FloatR (- 707088) (- 17),
         FloatR (- 697920) (- 21)),
        (FloatR 164391 (- 12), (FloatR (- 784531) (- 17), FloatR (- 800661) (- 21)),
         (FloatR (- 687970) (- 17), FloatR (- 711467) (- 21)), FloatR 165271 (- 12),
         (FloatR (- 784531) (- 17), FloatR (- 785216) (- 21)), FloatR (- 697626) (- 17),
         FloatR (- 711570) (- 21)),
        (FloatR 163511 (- 12), (FloatR (- 773884) (- 17), FloatR (- 817211) (- 21)),
         (FloatR (- 678114) (- 17), FloatR (- 726165) (- 21)), FloatR 164391 (- 12),
         (FloatR (- 773884) (- 17), FloatR (- 800559) (- 21)), FloatR (- 687975) (- 17),
         FloatR (- 726271) (- 21)),
        (FloatR 162631 (- 12), (FloatR (- 763024) (- 17), FloatR (- 835141) (- 21)),
         (FloatR (- 668034) (- 17), FloatR (- 742062) (- 21)), FloatR 163511 (- 12),
         (FloatR (- 763024) (- 17), FloatR (- 817105) (- 21)), FloatR (- 678118) (- 17),
         FloatR (- 742171) (- 21)),
        (FloatR 161751 (- 12), (FloatR (- 751933) (- 17), FloatR (- 854663) (- 21)),
         (FloatR (- 657713) (- 17), FloatR (- 759332) (- 21)), FloatR 162631 (- 12),
         (FloatR (- 751933) (- 17), FloatR (- 835032) (- 21)), FloatR (- 668039) (- 17),
         FloatR (- 759444) (- 21)),
        (FloatR 160871 (- 12), (FloatR (- 740591) (- 17), FloatR (- 876032) (- 21)),
         (FloatR (- 647126) (- 17), FloatR (- 778186) (- 21)), FloatR 161751 (- 12),
         (FloatR (- 740591) (- 17), FloatR (- 854550) (- 21)), FloatR (- 657717) (- 17),
         FloatR (- 778302) (- 21)),
        (FloatR 159991 (- 12), (FloatR (- 728974) (- 17), FloatR (- 899562) (- 21)),
         (FloatR (- 636247) (- 17), FloatR (- 798881) (- 21)), FloatR 160871 (- 12),
         (FloatR (- 728974) (- 17), FloatR (- 875915) (- 21)), FloatR (- 647131) (- 17),
         FloatR (- 799001) (- 21)),
        (FloatR 159111 (- 12), (FloatR (- 717056) (- 17), FloatR (- 925642) (- 21)),
         (FloatR (- 625045) (- 17), FloatR (- 821726) (- 21)), FloatR 159991 (- 12),
         (FloatR (- 717056) (- 17), FloatR (- 899441) (- 21)), FloatR (- 636252) (- 17),
         FloatR (- 821851) (- 21)),
        (FloatR 158231 (- 12), (FloatR (- 704806) (- 17), FloatR (- 954755) (- 21)),
         (FloatR (- 613482) (- 17), FloatR (- 847108) (- 21)), FloatR 159111 (- 12),
         (FloatR (- 704806) (- 17), FloatR (- 925515) (- 21)), FloatR (- 625050) (- 17),
         FloatR (- 847237) (- 21)),
        (FloatR 157351 (- 12), (FloatR (- 692186) (- 17), FloatR (- 987512) (- 21)),
         (FloatR (- 601515) (- 17), FloatR (- 875505) (- 21)), FloatR 158231 (- 12),
         (FloatR (- 692186) (- 17), FloatR (- 954623) (- 21)), FloatR (- 613487) (- 17),
         FloatR (- 875640) (- 21)),
        (FloatR 156471 (- 12), (FloatR (- 679151) (- 17), FloatR (- 1024697) (- 21)),
         (FloatR (- 589089) (- 17), FloatR (- 907522) (- 21)), FloatR 157351 (- 12),
         (FloatR (- 679151) (- 17), FloatR (- 987375) (- 21)), FloatR (- 601520) (- 17),
         FloatR (- 907663) (- 21)),
        (FloatR 155591 (- 12), (FloatR (- 665648) (- 17), FloatR (- 533662) (- 20)),
         (FloatR (- 576139) (- 17), FloatR (- 943929) (- 21)), FloatR 156471 (- 12),
         (FloatR (- 665648) (- 17), FloatR (- 1024553) (- 21)), FloatR (- 589094) (- 17),
         FloatR (- 944077) (- 21)),
        (FloatR 154711 (- 12), (FloatR (- 651610) (- 17), FloatR (- 558366) (- 20)),
         (FloatR (- 562584) (- 17), FloatR (- 985725) (- 21)), FloatR 155591 (- 12),
         (FloatR (- 651610) (- 17), FloatR (- 533586) (- 20)), FloatR (- 576144) (- 17),
         FloatR (- 985881) (- 21)),
        (FloatR 153831 (- 12), (FloatR (- 636956) (- 17), FloatR (- 587361) (- 20)),
         (FloatR (- 548324) (- 17), FloatR (- 1034224) (- 21)), FloatR 154711 (- 12),
         (FloatR (- 636956) (- 17), FloatR (- 558286) (- 20)), FloatR (- 562589) (- 17),
         FloatR (- 1034389) (- 21)),
        (FloatR 152951 (- 12), (FloatR (- 621583) (- 17), FloatR (- 621886) (- 20)),
         (FloatR (- 533229) (- 17), FloatR (- 545594) (- 20)), FloatR 153831 (- 12),
         (FloatR (- 621583) (- 17), FloatR (- 587276) (- 20)), FloatR (- 548329) (- 17),
         FloatR (- 545681) (- 20)),
        (FloatR 152071 (- 12), (FloatR (- 605361) (- 17), FloatR (- 663687) (- 20)),
         (FloatR (- 1034263) (- 18), FloatR (- 579517) (- 20)), FloatR 152951 (- 12),
         (FloatR (- 605361) (- 17), FloatR (- 621794) (- 20)), FloatR (- 533234) (- 17),
         FloatR (- 579611) (- 20)),
        (FloatR 151191 (- 12), (FloatR (- 588119) (- 17), FloatR (- 715306) (- 20)),
         (FloatR (- 999617) (- 18), FloatR (- 620582) (- 20)), FloatR 152071 (- 12),
         (FloatR (- 588119) (- 17), FloatR (- 663587) (- 20)), FloatR (- 1034274) (- 18),
         FloatR (- 620685) (- 20)),
        (FloatR 150311 (- 12), (FloatR (- 569629) (- 17), FloatR (- 780586) (- 20)),
         (FloatR (- 961911) (- 18), FloatR (- 671256) (- 20)), FloatR 151191 (- 12),
         (FloatR (- 569629) (- 17), FloatR (- 715197) (- 20)), FloatR (- 999628) (- 18),
         FloatR (- 671370) (- 20)),
        (FloatR 149431 (- 12), (FloatR (- 549580) (- 17), FloatR (- 865610) (- 20)),
         (FloatR (- 920285) (- 18), FloatR (- 735257) (- 20)), FloatR 150311 (- 12),
         (FloatR (- 549580) (- 17), FloatR (- 780464) (- 20)), FloatR (- 961922) (- 18),
         FloatR (- 735385) (- 20)),
        (FloatR 148551 (- 12), (FloatR (- 527531) (- 17), FloatR (- 980602) (- 20)),
         (FloatR (- 873468) (- 18), FloatR (- 818447) (- 20)), FloatR 149431 (- 12),
         (FloatR (- 527530) (- 17), FloatR (- 865471) (- 20)), FloatR (- 920297) (- 18),
         FloatR (- 818595) (- 20)),
        (FloatR 147671 (- 12), (FloatR (- 1005650) (- 18), FloatR (- 572069) (- 19)),
         (FloatR (- 819476) (- 18), FloatR (- 930637) (- 20)), FloatR 148551 (- 12),
         (FloatR (- 1005649) (- 18), FloatR (- 980439) (- 20)), FloatR (- 873480) (- 18),
         FloatR (- 930815) (- 20)),
        (FloatR 146791 (- 12), (FloatR (- 948872) (- 18), FloatR (- 696902) (- 19)),
         (FloatR (- 754961) (- 18), FloatR (- 544773) (- 19)), FloatR 147671 (- 12),
         (FloatR (- 948871) (- 18), FloatR (- 571968) (- 19)), FloatR (- 819489) (- 18),
         FloatR (- 544887) (- 19)),
        (FloatR 145911 (- 12), (FloatR (- 881238) (- 18), FloatR (- 909366) (- 19)),
         (FloatR (- 673607) (- 18), FloatR (- 665379) (- 19)), FloatR 146791 (- 12),
         (FloatR (- 881238) (- 18), FloatR (- 696766) (- 19)), FloatR (- 754977) (- 18),
         FloatR (- 665541) (- 19)),
        (FloatR 145031 (- 12), (FloatR (- 796106) (- 18), FloatR (- 676194) (- 18)),
         (FloatR (- 561314) (- 18), FloatR (- 868852) (- 19)), FloatR 145911 (- 12),
         (FloatR (- 796105) (- 18), FloatR (- 909153) (- 19)), FloatR (- 673628) (- 18),
         FloatR (- 869126) (- 19)),
        (FloatR 144151 (- 12), (FloatR (- 678028) (- 18), FloatR (- 697052) (- 17)),
         (FloatR (- 747200) (- 19), FloatR (- 637694) (- 18)), FloatR 145031 (- 12),
         (FloatR (- 678025) (- 18), FloatR (- 675934) (- 18)), FloatR (- 561354) (- 18),
         FloatR (- 638108) (- 18)),
        (FloatR 35859 (- 10), (FloatR (- 949024) (- 19), FloatR (- 782952) (- 15)),
         (FloatR 809103 (- 23), FloatR (- 621866) (- 17)), FloatR 144151 (- 12),
         (FloatR (- 949003) (- 19), FloatR (- 696167) (- 17)), FloatR (- 747511) (- 19),
         FloatR (- 623437) (- 17)),
        (FloatR 17820 (- 9), (FloatR 794796 (- 23), FloatR (- 863739) (- 17)),
         (FloatR 704638 (- 20), FloatR (- 923149) (- 19)), FloatR 35859 (- 10),
         (FloatR 794796 (- 23), FloatR (- 863739) (- 17)), FloatR 808606 (- 23),
         FloatR (- 847811) (- 17)),
        (FloatR 17710 (- 9), (FloatR 704583 (- 20), FloatR (- 923233) (- 19)),
         (FloatR 1040854 (- 20), FloatR (- 680113) (- 19)), FloatR 17820 (- 9),
         (FloatR 704583 (- 20), FloatR (- 923232) (- 19)), FloatR 704638 (- 20),
         FloatR (- 923150) (- 19)),
        (FloatR 17600 (- 9), (FloatR 1040826 (- 20), FloatR (- 680135) (- 19)),
         (FloatR 653079 (- 19), FloatR (- 565606) (- 19)), FloatR 17710 (- 9),
         (FloatR 1040826 (- 20), FloatR (- 680135) (- 19)), FloatR 1040854 (- 20),
         FloatR (- 680113) (- 19)),
        (FloatR 17490 (- 9), (FloatR 653069 (- 19), FloatR (- 565616) (- 19)),
         (FloatR 766522 (- 19), FloatR (- 990470) (- 20)), FloatR 17600 (- 9),
         (FloatR 653069 (- 19), FloatR (- 565616) (- 19)), FloatR 653079 (- 19),
         FloatR (- 565606) (- 19)),
        (FloatR 17380 (- 9), (FloatR 766515 (- 19), FloatR (- 990482) (- 20)),
         (FloatR 867382 (- 19), FloatR (- 892557) (- 20)), FloatR 17490 (- 9),
         (FloatR 766515 (- 19), FloatR (- 990482) (- 20)), FloatR 766522 (- 19),
         FloatR (- 990470) (- 20)),
        (FloatR 17270 (- 9), (FloatR 867376 (- 19), FloatR (- 892565) (- 20)),
         (FloatR 959155 (- 19), FloatR (- 819290) (- 20)), FloatR 17380 (- 9),
         (FloatR 867376 (- 19), FloatR (- 892565) (- 20)), FloatR 867382 (- 19),
         FloatR (- 892557) (- 20)),
        (FloatR 17160 (- 9), (FloatR 959150 (- 19), FloatR (- 819295) (- 20)),
         (FloatR 1043960 (- 19), FloatR (- 761757) (- 20)), FloatR 17270 (- 9),
         (FloatR 959150 (- 19), FloatR (- 819295) (- 20)), FloatR 959155 (- 19),
         FloatR (- 819290) (- 20)),
        (FloatR 17050 (- 9), (FloatR 1043956 (- 19), FloatR (- 761761) (- 20)),
         (FloatR 561599 (- 18), FloatR (- 715002) (- 20)), FloatR 17160 (- 9),
         (FloatR 1043956 (- 19), FloatR (- 761761) (- 20)), FloatR 1043960 (- 19),
         FloatR (- 761757) (- 20)),
        (FloatR 16940 (- 9), (FloatR 561596 (- 18), FloatR (- 715005) (- 20)),
         (FloatR 598926 (- 18), FloatR (- 676015) (- 20)), FloatR 17050 (- 9),
         (FloatR 561596 (- 18), FloatR (- 715005) (- 20)), FloatR 561599 (- 18),
         FloatR (- 715002) (- 20)),
        (FloatR 16830 (- 9), (FloatR 598923 (- 18), FloatR (- 676018) (- 20)),
         (FloatR 634322 (- 18), FloatR (- 642850) (- 20)), FloatR 16940 (- 9),
         (FloatR 598923 (- 18), FloatR (- 676018) (- 20)), FloatR 598926 (- 18),
         FloatR (- 676015) (- 20)),
        (FloatR 16720 (- 9), (FloatR 634319 (- 18), FloatR (- 642853) (- 20)),
         (FloatR 668062 (- 18), FloatR (- 614182) (- 20)), FloatR 16830 (- 9),
         (FloatR 634319 (- 18), FloatR (- 642853) (- 20)), FloatR 634322 (- 18),
         FloatR (- 642850) (- 20)),
        (FloatR 16610 (- 9), (FloatR 668060 (- 18), FloatR (- 614184) (- 20)),
         (FloatR 700362 (- 18), FloatR (- 589074) (- 20)), FloatR 16720 (- 9),
         (FloatR 668060 (- 18), FloatR (- 614184) (- 20)), FloatR 668062 (- 18),
         FloatR (- 614182) (- 20)),
        (FloatR 16500 (- 9), (FloatR 700360 (- 18), FloatR (- 589076) (- 20)),
         (FloatR 731393 (- 18), FloatR (- 566842) (- 20)), FloatR 16610 (- 9),
         (FloatR 700360 (- 18), FloatR (- 589076) (- 20)), FloatR 700362 (- 18),
         FloatR (- 589074) (- 20)),
        (FloatR 16390 (- 9), (FloatR 731391 (- 18), FloatR (- 566844) (- 20)),
         (FloatR 761295 (- 18), FloatR (- 546974) (- 20)), FloatR 16500 (- 9),
         (FloatR 731391 (- 18), FloatR (- 566844) (- 20)), FloatR 731393 (- 18),
         FloatR (- 566842) (- 20)),
        (FloatR 16280 (- 9), (FloatR 761293 (- 18), FloatR (- 546976) (- 20)),
         (FloatR 790185 (- 18), FloatR (- 529077) (- 20)), FloatR 16390 (- 9),
         (FloatR 761293 (- 18), FloatR (- 546976) (- 20)), FloatR 761295 (- 18),
         FloatR (- 546974) (- 20)),
        (FloatR 16170 (- 9), (FloatR 790183 (- 18), FloatR (- 529078) (- 20)),
         (FloatR 818160 (- 18), FloatR (- 1025688) (- 21)), FloatR 16280 (- 9),
         (FloatR 790183 (- 18), FloatR (- 529078) (- 20)), FloatR 790185 (- 18),
         FloatR (- 529077) (- 20)),
        (FloatR 16060 (- 9), (FloatR 818158 (- 18), FloatR (- 1025690) (- 21)),
         (FloatR 845301 (- 18), FloatR (- 996061) (- 21)), FloatR 16170 (- 9),
         (FloatR 818158 (- 18), FloatR (- 1025690) (- 21)), FloatR 818160 (- 18),
         FloatR (- 1025688) (- 21)),
        (FloatR 15950 (- 9), (FloatR 845299 (- 18), FloatR (- 996064) (- 21)),
         (FloatR 871681 (- 18), FloatR (- 968883) (- 21)), FloatR 16060 (- 9),
         (FloatR 845299 (- 18), FloatR (- 996064) (- 21)), FloatR 845301 (- 18),
         FloatR (- 996061) (- 21)),
        (FloatR 15840 (- 9), (FloatR 871679 (- 18), FloatR (- 968885) (- 21)),
         (FloatR 897360 (- 18), FloatR (- 943831) (- 21)), FloatR 15950 (- 9),
         (FloatR 871679 (- 18), FloatR (- 968885) (- 21)), FloatR 871681 (- 18),
         FloatR (- 968883) (- 21)),
        (FloatR 15730 (- 9), (FloatR 897358 (- 18), FloatR (- 943833) (- 21)),
         (FloatR 922392 (- 18), FloatR (- 920641) (- 21)), FloatR 15840 (- 9),
         (FloatR 897358 (- 18), FloatR (- 943833) (- 21)), FloatR 897360 (- 18),
         FloatR (- 943831) (- 21)),
        (FloatR 15620 (- 9), (FloatR 922390 (- 18), FloatR (- 920643) (- 21)),
         (FloatR 946823 (- 18), FloatR (- 899093) (- 21)), FloatR 15730 (- 9),
         (FloatR 922390 (- 18), FloatR (- 920643) (- 21)), FloatR 922392 (- 18),
         FloatR (- 920641) (- 21)),
        (FloatR 15510 (- 9), (FloatR 946821 (- 18), FloatR (- 899094) (- 21)),
         (FloatR 970696 (- 18), FloatR (- 879000) (- 21)), FloatR 15620 (- 9),
         (FloatR 946821 (- 18), FloatR (- 899094) (- 21)), FloatR 946823 (- 18),
         FloatR (- 899093) (- 21)),
        (FloatR 15400 (- 9), (FloatR 970694 (- 18), FloatR (- 879002) (- 21)),
         (FloatR 994047 (- 18), FloatR (- 860207) (- 21)), FloatR 15510 (- 9),
         (FloatR 970694 (- 18), FloatR (- 879002) (- 21)), FloatR 970696 (- 18),
         FloatR (- 879000) (- 21)),
        (FloatR 15290 (- 9), (FloatR 994045 (- 18), FloatR (- 860208) (- 21)),
         (FloatR 1016909 (- 18), FloatR (- 842577) (- 21)), FloatR 15400 (- 9),
         (FloatR 994045 (- 18), FloatR (- 860208) (- 21)), FloatR 994047 (- 18),
         FloatR (- 860207) (- 21)),
        (FloatR 15180 (- 9), (FloatR 1016907 (- 18), FloatR (- 842578) (- 21)),
         (FloatR 1039312 (- 18), FloatR (- 825995) (- 21)), FloatR 15290 (- 9),
         (FloatR 1016907 (- 18), FloatR (- 842578) (- 21)), FloatR 1016909 (- 18),
         FloatR (- 842577) (- 21)),
        (FloatR 15070 (- 9), (FloatR 1039310 (- 18), FloatR (- 825997) (- 21)),
         (FloatR 530641 (- 17), FloatR (- 810362) (- 21)), FloatR 15180 (- 9),
         (FloatR 1039310 (- 18), FloatR (- 825997) (- 21)), FloatR 1039312 (- 18),
         FloatR (- 825995) (- 21)),
        (FloatR 14960 (- 9), (FloatR 530640 (- 17), FloatR (- 810363) (- 21)),
         (FloatR 541423 (- 17), FloatR (- 795589) (- 21)), FloatR 15070 (- 9),
         (FloatR 530640 (- 17), FloatR (- 810363) (- 21)), FloatR 530641 (- 17),
         FloatR (- 810362) (- 21)),
        (FloatR 14850 (- 9), (FloatR 541421 (- 17), FloatR (- 795590) (- 21)),
         (FloatR 552011 (- 17), FloatR (- 781600) (- 21)), FloatR 14960 (- 9),
         (FloatR 541421 (- 17), FloatR (- 795590) (- 21)), FloatR 541423 (- 17),
         FloatR (- 795589) (- 21)),
        (FloatR 14740 (- 9), (FloatR 552010 (- 17), FloatR (- 781602) (- 21)),
         (FloatR 562416 (- 17), FloatR (- 768329) (- 21)), FloatR 14850 (- 9),
         (FloatR 552010 (- 17), FloatR (- 781602) (- 21)), FloatR 552011 (- 17),
         FloatR (- 781600) (- 21)),
        (FloatR 14630 (- 9), (FloatR 562415 (- 17), FloatR (- 768330) (- 21)),
         (FloatR 572648 (- 17), FloatR (- 755715) (- 21)), FloatR 14740 (- 9),
         (FloatR 562415 (- 17), FloatR (- 768330) (- 21)), FloatR 562416 (- 17),
         FloatR (- 768329) (- 21)),
        (FloatR 14520 (- 9), (FloatR 572646 (- 17), FloatR (- 755716) (- 21)),
         (FloatR 582714 (- 17), FloatR (- 743706) (- 21)), FloatR 14630 (- 9),
         (FloatR 572646 (- 17), FloatR (- 755716) (- 21)), FloatR 572648 (- 17),
         FloatR (- 755715) (- 21)),
        (FloatR 14410 (- 9), (FloatR 582713 (- 17), FloatR (- 743707) (- 21)),
         (FloatR 592623 (- 17), FloatR (- 732255) (- 21)), FloatR 14520 (- 9),
         (FloatR 582713 (- 17), FloatR (- 743707) (- 21)), FloatR 582714 (- 17),
         FloatR (- 743706) (- 21)),
        (FloatR 14300 (- 9), (FloatR 592621 (- 17), FloatR (- 732256) (- 21)),
         (FloatR 602381 (- 17), FloatR (- 721319) (- 21)), FloatR 14410 (- 9),
         (FloatR 592621 (- 17), FloatR (- 732256) (- 21)), FloatR 592623 (- 17),
         FloatR (- 732255) (- 21)),
        (FloatR 14190 (- 9), (FloatR 602380 (- 17), FloatR (- 721321) (- 21)),
         (FloatR 611996 (- 17), FloatR (- 710862) (- 21)), FloatR 14300 (- 9),
         (FloatR 602380 (- 17), FloatR (- 721321) (- 21)), FloatR 602381 (- 17),
         FloatR (- 721319) (- 21)),
        (FloatR 14080 (- 9), (FloatR 611995 (- 17), FloatR (- 710864) (- 21)),
         (FloatR 621474 (- 17), FloatR (- 700849) (- 21)), FloatR 14190 (- 9),
         (FloatR 611995 (- 17), FloatR (- 710864) (- 21)), FloatR 611996 (- 17),
         FloatR (- 710862) (- 21)),
        (FloatR 13970 (- 9), (FloatR 621473 (- 17), FloatR (- 700851) (- 21)),
         (FloatR 630820 (- 17), FloatR (- 691250) (- 21)), FloatR 14080 (- 9),
         (FloatR 621473 (- 17), FloatR (- 700851) (- 21)), FloatR 621474 (- 17),
         FloatR (- 700849) (- 21)),
        (FloatR 13860 (- 9), (FloatR 630818 (- 17), FloatR (- 691251) (- 21)),
         (FloatR 640039 (- 17), FloatR (- 682037) (- 21)), FloatR 13970 (- 9),
         (FloatR 630818 (- 17), FloatR (- 691251) (- 21)), FloatR 630820 (- 17),
         FloatR (- 691250) (- 21)),
        (FloatR 13750 (- 9), (FloatR 640038 (- 17), FloatR (- 682038) (- 21)),
         (FloatR 649138 (- 17), FloatR (- 673184) (- 21)), FloatR 13860 (- 9),
         (FloatR 640038 (- 17), FloatR (- 682038) (- 21)), FloatR 640039 (- 17),
         FloatR (- 682037) (- 21)),
        (FloatR 13640 (- 9), (FloatR 649137 (- 17), FloatR (- 673185) (- 21)),
         (FloatR 658119 (- 17), FloatR (- 664668) (- 21)), FloatR 13750 (- 9),
         (FloatR 649137 (- 17), FloatR (- 673185) (- 21)), FloatR 649138 (- 17),
         FloatR (- 673184) (- 21)),
        (FloatR 13530 (- 9), (FloatR 658118 (- 17), FloatR (- 664669) (- 21)),
         (FloatR 666989 (- 17), FloatR (- 656469) (- 21)), FloatR 13640 (- 9),
         (FloatR 658118 (- 17), FloatR (- 664669) (- 21)), FloatR 658119 (- 17),
         FloatR (- 664668) (- 21)),
        (FloatR 13420 (- 9), (FloatR 666988 (- 17), FloatR (- 656470) (- 21)),
         (FloatR 675751 (- 17), FloatR (- 648567) (- 21)), FloatR 13530 (- 9),
         (FloatR 666988 (- 17), FloatR (- 656470) (- 21)), FloatR 666989 (- 17),
         FloatR (- 656469) (- 21)),
        (FloatR 13310 (- 9), (FloatR 675749 (- 17), FloatR (- 648569) (- 21)),
         (FloatR 684408 (- 17), FloatR (- 640946) (- 21)), FloatR 13420 (- 9),
         (FloatR 675749 (- 17), FloatR (- 648569) (- 21)), FloatR 675751 (- 17),
         FloatR (- 648567) (- 21)),
        (FloatR 13200 (- 9), (FloatR 684407 (- 17), FloatR (- 640947) (- 21)),
         (FloatR 692965 (- 17), FloatR (- 633587) (- 21)), FloatR 13310 (- 9),
         (FloatR 684407 (- 17), FloatR (- 640947) (- 21)), FloatR 684408 (- 17),
         FloatR (- 640946) (- 21)),
        (FloatR 13090 (- 9), (FloatR 692964 (- 17), FloatR (- 633588) (- 21)),
         (FloatR 701424 (- 17), FloatR (- 626477) (- 21)), FloatR 13200 (- 9),
         (FloatR 692964 (- 17), FloatR (- 633588) (- 21)), FloatR 692965 (- 17),
         FloatR (- 633587) (- 21)),
        (FloatR 12980 (- 9), (FloatR 701423 (- 17), FloatR (- 626479) (- 21)),
         (FloatR 709790 (- 17), FloatR (- 619603) (- 21)), FloatR 13090 (- 9),
         (FloatR 701423 (- 17), FloatR (- 626479) (- 21)), FloatR 701424 (- 17),
         FloatR (- 626477) (- 21)),
        (FloatR 12870 (- 9), (FloatR 709789 (- 17), FloatR (- 619604) (- 21)),
         (FloatR 718065 (- 17), FloatR (- 612950) (- 21)), FloatR 12980 (- 9),
         (FloatR 709789 (- 17), FloatR (- 619604) (- 21)), FloatR 709790 (- 17),
         FloatR (- 619603) (- 21)),
        (FloatR 12760 (- 9), (FloatR 718064 (- 17), FloatR (- 612951) (- 21)),
         (FloatR 726252 (- 17), FloatR (- 606508) (- 21)), FloatR 12870 (- 9),
         (FloatR 718064 (- 17), FloatR (- 612951) (- 21)), FloatR 718065 (- 17),
         FloatR (- 612950) (- 21)),
        (FloatR 12650 (- 9), (FloatR 726251 (- 17), FloatR (- 606509) (- 21)),
         (FloatR 734354 (- 17), FloatR (- 600265) (- 21)), FloatR 12760 (- 9),
         (FloatR 726251 (- 17), FloatR (- 606509) (- 21)), FloatR 726252 (- 17),
         FloatR (- 606508) (- 21)),
        (FloatR 12540 (- 9), (FloatR 734353 (- 17), FloatR (- 600266) (- 21)),
         (FloatR 742373 (- 17), FloatR (- 594211) (- 21)), FloatR 12650 (- 9),
         (FloatR 734353 (- 17), FloatR (- 600266) (- 21)), FloatR 734354 (- 17),
         FloatR (- 600265) (- 21)),
        (FloatR 12430 (- 9), (FloatR 742372 (- 17), FloatR (- 594212) (- 21)),
         (FloatR 750313 (- 17), FloatR (- 588337) (- 21)), FloatR 12540 (- 9),
         (FloatR 742372 (- 17), FloatR (- 594212) (- 21)), FloatR 742373 (- 17),
         FloatR (- 594211) (- 21)),
        (FloatR 12320 (- 9), (FloatR 750312 (- 17), FloatR (- 588339) (- 21)),
         (FloatR 758174 (- 17), FloatR (- 582635) (- 21)), FloatR 12430 (- 9),
         (FloatR 750312 (- 17), FloatR (- 588339) (- 21)), FloatR 750313 (- 17),
         FloatR (- 588337) (- 21)),
        (FloatR 12210 (- 9), (FloatR 758173 (- 17), FloatR (- 582636) (- 21)),
         (FloatR 765960 (- 17), FloatR (- 577095) (- 21)), FloatR 12320 (- 9),
         (FloatR 758173 (- 17), FloatR (- 582636) (- 21)), FloatR 758174 (- 17),
         FloatR (- 582635) (- 21)),
        (FloatR 12100 (- 9), (FloatR 765959 (- 17), FloatR (- 577096) (- 21)),
         (FloatR 773673 (- 17), FloatR (- 571710) (- 21)), FloatR 12210 (- 9),
         (FloatR 765959 (- 17), FloatR (- 577096) (- 21)), FloatR 765960 (- 17),
         FloatR (- 577095) (- 21)),
        (FloatR 11990 (- 9), (FloatR 773672 (- 17), FloatR (- 571711) (- 21)),
         (FloatR 781314 (- 17), FloatR (- 566473) (- 21)), FloatR 12100 (- 9),
         (FloatR 773672 (- 17), FloatR (- 571711) (- 21)), FloatR 773673 (- 17),
         FloatR (- 571710) (- 21)),
        (FloatR 11880 (- 9), (FloatR 781313 (- 17), FloatR (- 566474) (- 21)),
         (FloatR 788887 (- 17), FloatR (- 561378) (- 21)), FloatR 11990 (- 9),
         (FloatR 781313 (- 17), FloatR (- 566474) (- 21)), FloatR 781314 (- 17),
         FloatR (- 566473) (- 21)),
        (FloatR 11770 (- 9), (FloatR 788886 (- 17), FloatR (- 561379) (- 21)),
         (FloatR 796391 (- 17), FloatR (- 556417) (- 21)), FloatR 11880 (- 9),
         (FloatR 788886 (- 17), FloatR (- 561379) (- 21)), FloatR 788887 (- 17),
         FloatR (- 561378) (- 21)),
        (FloatR 11660 (- 9), (FloatR 796390 (- 17), FloatR (- 556418) (- 21)),
         (FloatR 803830 (- 17), FloatR (- 551585) (- 21)), FloatR 11770 (- 9),
         (FloatR 796390 (- 17), FloatR (- 556418) (- 21)), FloatR 796391 (- 17),
         FloatR (- 556417) (- 21)),
        (FloatR 11550 (- 9), (FloatR 803829 (- 17), FloatR (- 551586) (- 21)),
         (FloatR 811205 (- 17), FloatR (- 546877) (- 21)), FloatR 11660 (- 9),
         (FloatR 803829 (- 17), FloatR (- 551586) (- 21)), FloatR 803830 (- 17),
         FloatR (- 551585) (- 21)),
        (FloatR 11440 (- 9), (FloatR 811204 (- 17), FloatR (- 546878) (- 21)),
         (FloatR 818517 (- 17), FloatR (- 542286) (- 21)), FloatR 11550 (- 9),
         (FloatR 811204 (- 17), FloatR (- 546878) (- 21)), FloatR 811205 (- 17),
         FloatR (- 546877) (- 21)),
        (FloatR 11330 (- 9), (FloatR 818516 (- 17), FloatR (- 542287) (- 21)),
         (FloatR 825769 (- 17), FloatR (- 537808) (- 21)), FloatR 11440 (- 9),
         (FloatR 818516 (- 17), FloatR (- 542287) (- 21)), FloatR 818517 (- 17),
         FloatR (- 542286) (- 21)),
        (FloatR 11220 (- 9), (FloatR 825768 (- 17), FloatR (- 537809) (- 21)),
         (FloatR 832961 (- 17), FloatR (- 533439) (- 21)), FloatR 11330 (- 9),
         (FloatR 825768 (- 17), FloatR (- 537809) (- 21)), FloatR 825769 (- 17),
         FloatR (- 537808) (- 21)),
        (FloatR 11110 (- 9), (FloatR 832960 (- 17), FloatR (- 533440) (- 21)),
         (FloatR 840095 (- 17), FloatR (- 529174) (- 21)), FloatR 11220 (- 9),
         (FloatR 832960 (- 17), FloatR (- 533440) (- 21)), FloatR 832961 (- 17),
         FloatR (- 533439) (- 21)),
        (FloatR 11000 (- 9), (FloatR 840094 (- 17), FloatR (- 529175) (- 21)),
         (FloatR 847172 (- 17), FloatR (- 525008) (- 21)), FloatR 11110 (- 9),
         (FloatR 840094 (- 17), FloatR (- 529175) (- 21)), FloatR 840095 (- 17),
         FloatR (- 529174) (- 21)),
        (FloatR 10890 (- 9), (FloatR 847171 (- 17), FloatR (- 525009) (- 21)),
         (FloatR 854195 (- 17), FloatR (- 1041875) (- 22)), FloatR 11000 (- 9),
         (FloatR 847171 (- 17), FloatR (- 525009) (- 21)), FloatR 847172 (- 17),
         FloatR (- 525008) (- 21)),
        (FloatR 10780 (- 9), (FloatR 854194 (- 17), FloatR (- 1041876) (- 22)),
         (FloatR 861163 (- 17), FloatR (- 1033918) (- 22)), FloatR 10890 (- 9),
         (FloatR 854194 (- 17), FloatR (- 1041876) (- 22)), FloatR 854195 (- 17),
         FloatR (- 1041875) (- 22)),
        (FloatR 10670 (- 9), (FloatR 861162 (- 17), FloatR (- 1033919) (- 22)),
         (FloatR 868078 (- 17), FloatR (- 1026137) (- 22)), FloatR 10780 (- 9),
         (FloatR 861162 (- 17), FloatR (- 1033919) (- 22)), FloatR 861163 (- 17),
         FloatR (- 1033918) (- 22)),
        (FloatR 10560 (- 9), (FloatR 868077 (- 17), FloatR (- 1026138) (- 22)),
         (FloatR 874942 (- 17), FloatR (- 1018525) (- 22)), FloatR 10670 (- 9),
         (FloatR 868077 (- 17), FloatR (- 1026138) (- 22)), FloatR 868078 (- 17),
         FloatR (- 1026137) (- 22)),
        (FloatR 10450 (- 9), (FloatR 874941 (- 17), FloatR (- 1018526) (- 22)),
         (FloatR 881755 (- 17), FloatR (- 1011076) (- 22)), FloatR 10560 (- 9),
         (FloatR 874941 (- 17), FloatR (- 1018526) (- 22)), FloatR 874942 (- 17),
         FloatR (- 1018525) (- 22)),
        (FloatR 10340 (- 9), (FloatR 881754 (- 17), FloatR (- 1011077) (- 22)),
         (FloatR 888519 (- 17), FloatR (- 1003783) (- 22)), FloatR 10450 (- 9),
         (FloatR 881754 (- 17), FloatR (- 1011077) (- 22)), FloatR 881755 (- 17),
         FloatR (- 1011076) (- 22)),
        (FloatR 10230 (- 9), (FloatR 888518 (- 17), FloatR (- 1003784) (- 22)),
         (FloatR 895234 (- 17), FloatR (- 996641) (- 22)), FloatR 10340 (- 9),
         (FloatR 888518 (- 17), FloatR (- 1003784) (- 22)), FloatR 888519 (- 17),
         FloatR (- 1003783) (- 22)),
        (FloatR 10120 (- 9), (FloatR 895233 (- 17), FloatR (- 996642) (- 22)),
         (FloatR 901902 (- 17), FloatR (- 989643) (- 22)), FloatR 10230 (- 9),
         (FloatR 895233 (- 17), FloatR (- 996642) (- 22)), FloatR 895234 (- 17),
         FloatR (- 996641) (- 22)),
        (FloatR 10010 (- 9), (FloatR 901901 (- 17), FloatR (- 989644) (- 22)),
         (FloatR 908523 (- 17), FloatR (- 982784) (- 22)), FloatR 10120 (- 9),
         (FloatR 901901 (- 17), FloatR (- 989644) (- 22)), FloatR 901902 (- 17),
         FloatR (- 989643) (- 22)),
        (FloatR 9900 (- 9), (FloatR 908522 (- 17), FloatR (- 982785) (- 22)),
         (FloatR 915099 (- 17), FloatR (- 976058) (- 22)), FloatR 10010 (- 9),
         (FloatR 908522 (- 17), FloatR (- 982785) (- 22)), FloatR 908523 (- 17),
         FloatR (- 982784) (- 22)),
        (FloatR 9790 (- 9), (FloatR 915098 (- 17), FloatR (- 976059) (- 22)),
         (FloatR 921629 (- 17), FloatR (- 969461) (- 22)), FloatR 9900 (- 9),
         (FloatR 915098 (- 17), FloatR (- 976059) (- 22)), FloatR 915099 (- 17),
         FloatR (- 976058) (- 22)),
        (FloatR 9680 (- 9), (FloatR 921628 (- 17), FloatR (- 969462) (- 22)),
         (FloatR 928117 (- 17), FloatR (- 962987) (- 22)), FloatR 9790 (- 9),
         (FloatR 921628 (- 17), FloatR (- 969462) (- 22)), FloatR 921629 (- 17),
         FloatR (- 969461) (- 22)),
        (FloatR 9570 (- 9), (FloatR 928115 (- 17), FloatR (- 962988) (- 22)),
         (FloatR 934560 (- 17), FloatR (- 956631) (- 22)), FloatR 9680 (- 9),
         (FloatR 928115 (- 17), FloatR (- 962988) (- 22)), FloatR 928117 (- 17),
         FloatR (- 962987) (- 22)),
        (FloatR 9460 (- 9), (FloatR 934559 (- 17), FloatR (- 956632) (- 22)),
         (FloatR 940962 (- 17), FloatR (- 950389) (- 22)), FloatR 9570 (- 9),
         (FloatR 934559 (- 17), FloatR (- 956632) (- 22)), FloatR 934560 (- 17),
         FloatR (- 956631) (- 22)),
        (FloatR 9350 (- 9), (FloatR 940961 (- 17), FloatR (- 950391) (- 22)),
         (FloatR 947322 (- 17), FloatR (- 944257) (- 22)), FloatR 9460 (- 9),
         (FloatR 940961 (- 17), FloatR (- 950391) (- 22)), FloatR 940962 (- 17),
         FloatR (- 950389) (- 22)),
        (FloatR 9240 (- 9), (FloatR 947321 (- 17), FloatR (- 944258) (- 22)),
         (FloatR 953642 (- 17), FloatR (- 938228) (- 22)), FloatR 9350 (- 9),
         (FloatR 947321 (- 17), FloatR (- 944258) (- 22)), FloatR 947322 (- 17),
         FloatR (- 944257) (- 22)),
        (FloatR 9130 (- 9), (FloatR 953641 (- 17), FloatR (- 938229) (- 22)),
         (FloatR 959921 (- 17), FloatR (- 932300) (- 22)), FloatR 9240 (- 9),
         (FloatR 953641 (- 17), FloatR (- 938229) (- 22)), FloatR 953642 (- 17),
         FloatR (- 938228) (- 22)),
        (FloatR 9020 (- 9), (FloatR 959920 (- 17), FloatR (- 932301) (- 22)),
         (FloatR 966161 (- 17), FloatR (- 926467) (- 22)), FloatR 9130 (- 9),
         (FloatR 959920 (- 17), FloatR (- 932301) (- 22)), FloatR 959921 (- 17),
         FloatR (- 932300) (- 22)),
        (FloatR 8910 (- 9), (FloatR 966159 (- 17), FloatR (- 926468) (- 22)),
         (FloatR 972361 (- 17), FloatR (- 920726) (- 22)), FloatR 9020 (- 9),
         (FloatR 966159 (- 17), FloatR (- 926468) (- 22)), FloatR 966161 (- 17),
         FloatR (- 926467) (- 22)),
        (FloatR 8800 (- 9), (FloatR 972360 (- 17), FloatR (- 920727) (- 22)),
         (FloatR 978524 (- 17), FloatR (- 915072) (- 22)), FloatR 8910 (- 9),
         (FloatR 972360 (- 17), FloatR (- 920727) (- 22)), FloatR 972361 (- 17),
         FloatR (- 920726) (- 22)),
        (FloatR 8690 (- 9), (FloatR 978523 (- 17), FloatR (- 915073) (- 22)),
         (FloatR 984649 (- 17), FloatR (- 909501) (- 22)), FloatR 8800 (- 9),
         (FloatR 978523 (- 17), FloatR (- 915073) (- 22)), FloatR 978524 (- 17),
         FloatR (- 915072) (- 22)),
        (FloatR 8580 (- 9), (FloatR 984648 (- 17), FloatR (- 909502) (- 22)),
         (FloatR 990737 (- 17), FloatR (- 904009) (- 22)), FloatR 8690 (- 9),
         (FloatR 984648 (- 17), FloatR (- 909502) (- 22)), FloatR 984649 (- 17),
         FloatR (- 909501) (- 22)),
        (FloatR 8470 (- 9), (FloatR 990736 (- 17), FloatR (- 904010) (- 22)),
         (FloatR 996788 (- 17), FloatR (- 898591) (- 22)), FloatR 8580 (- 9),
         (FloatR 990736 (- 17), FloatR (- 904010) (- 22)), FloatR 990737 (- 17),
         FloatR (- 904009) (- 22)),
        (FloatR 8360 (- 9), (FloatR 996787 (- 17), FloatR (- 898593) (- 22)),
         (FloatR 1002803 (- 17), FloatR (- 893244) (- 22)), FloatR 8470 (- 9),
         (FloatR 996787 (- 17), FloatR (- 898593) (- 22)), FloatR 996788 (- 17),
         FloatR (- 898591) (- 22)),
        (FloatR 8250 (- 9), (FloatR 1002802 (- 17), FloatR (- 893245) (- 22)),
         (FloatR 1008782 (- 17), FloatR (- 887963) (- 22)), FloatR 8360 (- 9),
         (FloatR 1002802 (- 17), FloatR (- 893245) (- 22)), FloatR 1002803 (- 17),
         FloatR (- 893244) (- 22)),
        (FloatR 8140 (- 9), (FloatR 1008781 (- 17), FloatR (- 887964) (- 22)),
         (FloatR 1014726 (- 17), FloatR (- 882744) (- 22)), FloatR 8250 (- 9),
         (FloatR 1008781 (- 17), FloatR (- 887964) (- 22)), FloatR 1008782 (- 17),
         FloatR (- 887963) (- 22)),
        (FloatR 8030 (- 9), (FloatR 1014725 (- 17), FloatR (- 882745) (- 22)),
         (FloatR 1020636 (- 17), FloatR (- 877582) (- 22)), FloatR 8140 (- 9),
         (FloatR 1014725 (- 17), FloatR (- 882745) (- 22)), FloatR 1014726 (- 17),
         FloatR (- 882744) (- 22)),
        (FloatR 7920 (- 9), (FloatR 1020635 (- 17), FloatR (- 877583) (- 22)),
         (FloatR 1026510 (- 17), FloatR (- 872474) (- 22)), FloatR 8030 (- 9),
         (FloatR 1020635 (- 17), FloatR (- 877583) (- 22)), FloatR 1020636 (- 17),
         FloatR (- 877582) (- 22)),
        (FloatR 7810 (- 9), (FloatR 1026509 (- 17), FloatR (- 872475) (- 22)),
         (FloatR 1032351 (- 17), FloatR (- 867414) (- 22)), FloatR 7920 (- 9),
         (FloatR 1026509 (- 17), FloatR (- 872475) (- 22)), FloatR 1026510 (- 17),
         FloatR (- 872474) (- 22)),
        (FloatR 7700 (- 9), (FloatR 1032350 (- 17), FloatR (- 867415) (- 22)),
         (FloatR 1038158 (- 17), FloatR (- 862398) (- 22)), FloatR 7810 (- 9),
         (FloatR 1032350 (- 17), FloatR (- 867415) (- 22)), FloatR 1032351 (- 17),
         FloatR (- 867414) (- 22)),
        (FloatR 7590 (- 9), (FloatR 1038157 (- 17), FloatR (- 862399) (- 22)),
         (FloatR 1043931 (- 17), FloatR (- 857421) (- 22)), FloatR 7700 (- 9),
         (FloatR 1038157 (- 17), FloatR (- 862399) (- 22)), FloatR 1038158 (- 17),
         FloatR (- 862398) (- 22)),
        (FloatR 7480 (- 9), (FloatR 1043930 (- 17), FloatR (- 857422) (- 22)),
         (FloatR 524836 (- 16), FloatR (- 852479) (- 22)), FloatR 7590 (- 9),
         (FloatR 1043930 (- 17), FloatR (- 857422) (- 22)), FloatR 1043931 (- 17),
         FloatR (- 857421) (- 22)),
        (FloatR 7370 (- 9), (FloatR 524835 (- 16), FloatR (- 852480) (- 22)),
         (FloatR 527689 (- 16), FloatR (- 847567) (- 22)), FloatR 7480 (- 9),
         (FloatR 524835 (- 16), FloatR (- 852480) (- 22)), FloatR 524836 (- 16),
         FloatR (- 852479) (- 22)),
        (FloatR 7260 (- 9), (FloatR 527688 (- 16), FloatR (- 847568) (- 22)),
         (FloatR 530526 (- 16), FloatR (- 842678) (- 22)), FloatR 7370 (- 9),
         (FloatR 527688 (- 16), FloatR (- 847568) (- 22)), FloatR 527689 (- 16),
         FloatR (- 847567) (- 22)),
        (FloatR 7150 (- 9), (FloatR 530525 (- 16), FloatR (- 842679) (- 22)),
         (FloatR 533347 (- 16), FloatR (- 837808) (- 22)), FloatR 7260 (- 9),
         (FloatR 530525 (- 16), FloatR (- 842679) (- 22)), FloatR 530526 (- 16),
         FloatR (- 842678) (- 22)),
        (FloatR 7040 (- 9), (FloatR 533346 (- 16), FloatR (- 837809) (- 22)),
         (FloatR 536151 (- 16), FloatR (- 832951) (- 22)), FloatR 7150 (- 9),
         (FloatR 533346 (- 16), FloatR (- 837809) (- 22)), FloatR 533347 (- 16),
         FloatR (- 837808) (- 22)),
        (FloatR 6930 (- 9), (FloatR 536150 (- 16), FloatR (- 832952) (- 22)),
         (FloatR 538939 (- 16), FloatR (- 828102) (- 22)), FloatR 7040 (- 9),
         (FloatR 536150 (- 16), FloatR (- 832952) (- 22)), FloatR 536151 (- 16),
         FloatR (- 832951) (- 22)),
        (FloatR 6820 (- 9), (FloatR 538938 (- 16), FloatR (- 828103) (- 22)),
         (FloatR 541711 (- 16), FloatR (- 823254) (- 22)), FloatR 6930 (- 9),
         (FloatR 538938 (- 16), FloatR (- 828103) (- 22)), FloatR 538939 (- 16),
         FloatR (- 828102) (- 22)),
        (FloatR 6710 (- 9), (FloatR 541710 (- 16), FloatR (- 823255) (- 22)),
         (FloatR 544467 (- 16), FloatR (- 818400) (- 22)), FloatR 6820 (- 9),
         (FloatR 541710 (- 16), FloatR (- 823255) (- 22)), FloatR 541711 (- 16),
         FloatR (- 823254) (- 22)),
        (FloatR 6600 (- 9), (FloatR 544466 (- 16), FloatR (- 818401) (- 22)),
         (FloatR 547206 (- 16), FloatR (- 813534) (- 22)), FloatR 6710 (- 9),
         (FloatR 544466 (- 16), FloatR (- 818401) (- 22)), FloatR 544467 (- 16),
         FloatR (- 818400) (- 22)),
        (FloatR 6490 (- 9), (FloatR 547205 (- 16), FloatR (- 813535) (- 22)),
         (FloatR 549929 (- 16), FloatR (- 808649) (- 22)), FloatR 6600 (- 9),
         (FloatR 547205 (- 16), FloatR (- 813535) (- 22)), FloatR 547206 (- 16),
         FloatR (- 813534) (- 22)),
        (FloatR 6380 (- 9), (FloatR 549927 (- 16), FloatR (- 808650) (- 22)),
         (FloatR 552635 (- 16), FloatR (- 803737) (- 22)), FloatR 6490 (- 9),
         (FloatR 549927 (- 16), FloatR (- 808650) (- 22)), FloatR 549929 (- 16),
         FloatR (- 808649) (- 22)),
        (FloatR 6270 (- 9), (FloatR 552634 (- 16), FloatR (- 803738) (- 22)),
         (FloatR 555325 (- 16), FloatR (- 798791) (- 22)), FloatR 6380 (- 9),
         (FloatR 552634 (- 16), FloatR (- 803738) (- 22)), FloatR 552635 (- 16),
         FloatR (- 803737) (- 22)),
        (FloatR 6160 (- 9), (FloatR 555324 (- 16), FloatR (- 798792) (- 22)),
         (FloatR 557998 (- 16), FloatR (- 793801) (- 22)), FloatR 6270 (- 9),
         (FloatR 555324 (- 16), FloatR (- 798792) (- 22)), FloatR 555325 (- 16),
         FloatR (- 798791) (- 22)),
        (FloatR 6050 (- 9), (FloatR 557997 (- 16), FloatR (- 793802) (- 22)),
         (FloatR 560654 (- 16), FloatR (- 788760) (- 22)), FloatR 6160 (- 9),
         (FloatR 557997 (- 16), FloatR (- 793802) (- 22)), FloatR 557998 (- 16),
         FloatR (- 793801) (- 22)),
        (FloatR 5940 (- 9), (FloatR 560653 (- 16), FloatR (- 788761) (- 22)),
         (FloatR 563293 (- 16), FloatR (- 783659) (- 22)), FloatR 6050 (- 9),
         (FloatR 560653 (- 16), FloatR (- 788761) (- 22)), FloatR 560654 (- 16),
         FloatR (- 788760) (- 22)),
        (FloatR 5830 (- 9), (FloatR 563292 (- 16), FloatR (- 783660) (- 22)),
         (FloatR 565915 (- 16), FloatR (- 778487) (- 22)), FloatR 5940 (- 9),
         (FloatR 563292 (- 16), FloatR (- 783660) (- 22)), FloatR 563293 (- 16),
         FloatR (- 783659) (- 22)),
        (FloatR 5720 (- 9), (FloatR 565914 (- 16), FloatR (- 778488) (- 22)),
         (FloatR 568520 (- 16), FloatR (- 773234) (- 22)), FloatR 5830 (- 9),
         (FloatR 565914 (- 16), FloatR (- 778488) (- 22)), FloatR 565915 (- 16),
         FloatR (- 778487) (- 22)),
        (FloatR 5610 (- 9), (FloatR 568519 (- 16), FloatR (- 773235) (- 22)),
         (FloatR 571107 (- 16), FloatR (- 767889) (- 22)), FloatR 5720 (- 9),
         (FloatR 568519 (- 16), FloatR (- 773235) (- 22)), FloatR 568520 (- 16),
         FloatR (- 773234) (- 22)),
        (FloatR 5500 (- 9), (FloatR 571106 (- 16), FloatR (- 767890) (- 22)),
         (FloatR 573675 (- 16), FloatR (- 762441) (- 22)), FloatR 5610 (- 9),
         (FloatR 571106 (- 16), FloatR (- 767890) (- 22)), FloatR 571107 (- 16),
         FloatR (- 767889) (- 22)),
        (FloatR 5390 (- 9), (FloatR 573674 (- 16), FloatR (- 762442) (- 22)),
         (FloatR 576225 (- 16), FloatR (- 756878) (- 22)), FloatR 5500 (- 9),
         (FloatR 573674 (- 16), FloatR (- 762442) (- 22)), FloatR 573675 (- 16),
         FloatR (- 762441) (- 22)),
        (FloatR 5280 (- 9), (FloatR 576224 (- 16), FloatR (- 756880) (- 22)),
         (FloatR 578757 (- 16), FloatR (- 751188) (- 22)), FloatR 5390 (- 9),
         (FloatR 576224 (- 16), FloatR (- 756880) (- 22)), FloatR 576225 (- 16),
         FloatR (- 756878) (- 22)),
        (FloatR 5170 (- 9), (FloatR 578756 (- 16), FloatR (- 751189) (- 22)),
         (FloatR 581269 (- 16), FloatR (- 745356) (- 22)), FloatR 5280 (- 9),
         (FloatR 578756 (- 16), FloatR (- 751189) (- 22)), FloatR 578757 (- 16),
         FloatR (- 751188) (- 22)),
        (FloatR 5060 (- 9), (FloatR 581268 (- 16), FloatR (- 745357) (- 22)),
         (FloatR 583761 (- 16), FloatR (- 739369) (- 22)), FloatR 5170 (- 9),
         (FloatR 581268 (- 16), FloatR (- 745357) (- 22)), FloatR 581269 (- 16),
         FloatR (- 745356) (- 22)),
        (FloatR 4950 (- 9), (FloatR 583760 (- 16), FloatR (- 739370) (- 22)),
         (FloatR 586233 (- 16), FloatR (- 733212) (- 22)), FloatR 5060 (- 9),
         (FloatR 583760 (- 16), FloatR (- 739370) (- 22)), FloatR 583761 (- 16),
         FloatR (- 739369) (- 22)),
        (FloatR 4840 (- 9), (FloatR 586232 (- 16), FloatR (- 733213) (- 22)),
         (FloatR 588683 (- 16), FloatR (- 726869) (- 22)), FloatR 4950 (- 9),
         (FloatR 586232 (- 16), FloatR (- 733213) (- 22)), FloatR 586233 (- 16),
         FloatR (- 733212) (- 22)),
        (FloatR 4730 (- 9), (FloatR 588682 (- 16), FloatR (- 726870) (- 22)),
         (FloatR 591112 (- 16), FloatR (- 720325) (- 22)), FloatR 4840 (- 9),
         (FloatR 588682 (- 16), FloatR (- 726870) (- 22)), FloatR 588683 (- 16),
         FloatR (- 726869) (- 22)),
        (FloatR 4620 (- 9), (FloatR 591111 (- 16), FloatR (- 720326) (- 22)),
         (FloatR 593519 (- 16), FloatR (- 713561) (- 22)), FloatR 4730 (- 9),
         (FloatR 591111 (- 16), FloatR (- 720326) (- 22)), FloatR 591112 (- 16),
         FloatR (- 720325) (- 22)),
        (FloatR 4510 (- 9), (FloatR 593518 (- 16), FloatR (- 713562) (- 22)),
         (FloatR 595903 (- 16), FloatR (- 706560) (- 22)), FloatR 4620 (- 9),
         (FloatR 593518 (- 16), FloatR (- 713562) (- 22)), FloatR 593519 (- 16),
         FloatR (- 713561) (- 22)),
        (FloatR 4400 (- 9), (FloatR 595902 (- 16), FloatR (- 706561) (- 22)),
         (FloatR 598263 (- 16), FloatR (- 699304) (- 22)), FloatR 4510 (- 9),
         (FloatR 595902 (- 16), FloatR (- 706561) (- 22)), FloatR 595903 (- 16),
         FloatR (- 706560) (- 22)),
        (FloatR 4290 (- 9), (FloatR 598262 (- 16), FloatR (- 699305) (- 22)),
         (FloatR 600598 (- 16), FloatR (- 691773) (- 22)), FloatR 4400 (- 9),
         (FloatR 598262 (- 16), FloatR (- 699305) (- 22)), FloatR 598263 (- 16),
         FloatR (- 699304) (- 22)),
        (FloatR 4180 (- 9), (FloatR 600597 (- 16), FloatR (- 691774) (- 22)),
         (FloatR 602907 (- 16), FloatR (- 683947) (- 22)), FloatR 4290 (- 9),
         (FloatR 600597 (- 16), FloatR (- 691774) (- 22)), FloatR 600598 (- 16),
         FloatR (- 691773) (- 22)),
        (FloatR 4070 (- 9), (FloatR 602906 (- 16), FloatR (- 683948) (- 22)),
         (FloatR 605189 (- 16), FloatR (- 675805) (- 22)), FloatR 4180 (- 9),
         (FloatR 602906 (- 16), FloatR (- 683948) (- 22)), FloatR 602907 (- 16),
         FloatR (- 683947) (- 22)),
        (FloatR 3960 (- 9), (FloatR 605188 (- 16), FloatR (- 675806) (- 22)),
         (FloatR 607444 (- 16), FloatR (- 667325) (- 22)), FloatR 4070 (- 9),
         (FloatR 605188 (- 16), FloatR (- 675806) (- 22)), FloatR 605189 (- 16),
         FloatR (- 675805) (- 22)),
        (FloatR 3850 (- 9), (FloatR 607443 (- 16), FloatR (- 667326) (- 22)),
         (FloatR 609669 (- 16), FloatR (- 658486) (- 22)), FloatR 3960 (- 9),
         (FloatR 607443 (- 16), FloatR (- 667326) (- 22)), FloatR 607444 (- 16),
         FloatR (- 667325) (- 22)),
        (FloatR 3740 (- 9), (FloatR 609668 (- 16), FloatR (- 658487) (- 22)),
         (FloatR 611864 (- 16), FloatR (- 649264) (- 22)), FloatR 3850 (- 9),
         (FloatR 609668 (- 16), FloatR (- 658487) (- 22)), FloatR 609669 (- 16),
         FloatR (- 658486) (- 22)),
        (FloatR 3630 (- 9), (FloatR 611863 (- 16), FloatR (- 649265) (- 22)),
         (FloatR 614028 (- 16), FloatR (- 639637) (- 22)), FloatR 3740 (- 9),
         (FloatR 611863 (- 16), FloatR (- 649265) (- 22)), FloatR 611864 (- 16),
         FloatR (- 649264) (- 22)),
        (FloatR 3520 (- 9), (FloatR 614027 (- 16), FloatR (- 639638) (- 22)),
         (FloatR 616158 (- 16), FloatR (- 629580) (- 22)), FloatR 3630 (- 9),
         (FloatR 614027 (- 16), FloatR (- 639638) (- 22)), FloatR 614028 (- 16),
         FloatR (- 639637) (- 22)),
        (FloatR 3410 (- 9), (FloatR 616157 (- 16), FloatR (- 629581) (- 22)),
         (FloatR 618254 (- 16), FloatR (- 619070) (- 22)), FloatR 3520 (- 9),
         (FloatR 616157 (- 16), FloatR (- 629581) (- 22)), FloatR 616158 (- 16),
         FloatR (- 629580) (- 22)),
        (FloatR 3300 (- 9), (FloatR 618253 (- 16), FloatR (- 619071) (- 22)),
         (FloatR 620314 (- 16), FloatR (- 608083) (- 22)), FloatR 3410 (- 9),
         (FloatR 618253 (- 16), FloatR (- 619071) (- 22)), FloatR 618254 (- 16),
         FloatR (- 619070) (- 22)),
        (FloatR 3190 (- 9), (FloatR 620313 (- 16), FloatR (- 608084) (- 22)),
         (FloatR 622336 (- 16), FloatR (- 596594) (- 22)), FloatR 3300 (- 9),
         (FloatR 620313 (- 16), FloatR (- 608084) (- 22)), FloatR 620314 (- 16),
         FloatR (- 608083) (- 22)),
        (FloatR 3080 (- 9), (FloatR 622335 (- 16), FloatR (- 596595) (- 22)),
         (FloatR 624319 (- 16), FloatR (- 584581) (- 22)), FloatR 3190 (- 9),
         (FloatR 622335 (- 16), FloatR (- 596595) (- 22)), FloatR 622336 (- 16),
         FloatR (- 596594) (- 22)),
        (FloatR 2970 (- 9), (FloatR 624318 (- 16), FloatR (- 584582) (- 22)),
         (FloatR 626260 (- 16), FloatR (- 572019) (- 22)), FloatR 3080 (- 9),
         (FloatR 624318 (- 16), FloatR (- 584582) (- 22)), FloatR 624319 (- 16),
         FloatR (- 584581) (- 22)),
        (FloatR 2860 (- 9), (FloatR 626259 (- 16), FloatR (- 572020) (- 22)),
         (FloatR 628159 (- 16), FloatR (- 558886) (- 22)), FloatR 2970 (- 9),
         (FloatR 626259 (- 16), FloatR (- 572020) (- 22)), FloatR 626260 (- 16),
         FloatR (- 572019) (- 22)),
        (FloatR 2750 (- 9), (FloatR 628158 (- 16), FloatR (- 558888) (- 22)),
         (FloatR 630012 (- 16), FloatR (- 545161) (- 22)), FloatR 2860 (- 9),
         (FloatR 628158 (- 16), FloatR (- 558888) (- 22)), FloatR 628159 (- 16),
         FloatR (- 558886) (- 22)),
        (FloatR 2640 (- 9), (FloatR 630011 (- 16), FloatR (- 545162) (- 22)),
         (FloatR 631818 (- 16), FloatR (- 530822) (- 22)), FloatR 2750 (- 9),
         (FloatR 630011 (- 16), FloatR (- 545162) (- 22)), FloatR 630012 (- 16),
         FloatR (- 545161) (- 22)),
        (FloatR 2530 (- 9), (FloatR 631817 (- 16), FloatR (- 530823) (- 22)),
         (FloatR 633575 (- 16), FloatR (- 1031701) (- 23)), FloatR 2640 (- 9),
         (FloatR 631817 (- 16), FloatR (- 530823) (- 22)), FloatR 631818 (- 16),
         FloatR (- 530822) (- 22)),
        (FloatR 2420 (- 9), (FloatR 633574 (- 16), FloatR (- 1031702) (- 23)),
         (FloatR 635281 (- 16), FloatR (- 1000458) (- 23)), FloatR 2530 (- 9),
         (FloatR 633574 (- 16), FloatR (- 1031702) (- 23)), FloatR 633575 (- 16),
         FloatR (- 1031701) (- 23)),
        (FloatR 2310 (- 9), (FloatR 635280 (- 16), FloatR (- 1000459) (- 23)),
         (FloatR 636933 (- 16), FloatR (- 967884) (- 23)), FloatR 2420 (- 9),
         (FloatR 635280 (- 16), FloatR (- 1000459) (- 23)), FloatR 635281 (- 16),
         FloatR (- 1000458) (- 23)),
        (FloatR 2200 (- 9), (FloatR 636932 (- 16), FloatR (- 967885) (- 23)),
         (FloatR 638529 (- 16), FloatR (- 933955) (- 23)), FloatR 2310 (- 9),
         (FloatR 636932 (- 16), FloatR (- 967885) (- 23)), FloatR 636933 (- 16),
         FloatR (- 967884) (- 23)),
        (FloatR 2090 (- 9), (FloatR 638528 (- 16), FloatR (- 933956) (- 23)),
         (FloatR 640067 (- 16), FloatR (- 898650) (- 23)), FloatR 2200 (- 9),
         (FloatR 638528 (- 16), FloatR (- 933956) (- 23)), FloatR 638529 (- 16),
         FloatR (- 933955) (- 23)),
        (FloatR 1980 (- 9), (FloatR 640066 (- 16), FloatR (- 898651) (- 23)),
         (FloatR 641545 (- 16), FloatR (- 861955) (- 23)), FloatR 2090 (- 9),
         (FloatR 640066 (- 16), FloatR (- 898651) (- 23)), FloatR 640067 (- 16),
         FloatR (- 898650) (- 23)),
        (FloatR 1870 (- 9), (FloatR 641544 (- 16), FloatR (- 861957) (- 23)),
         (FloatR 642960 (- 16), FloatR (- 823865) (- 23)), FloatR 1980 (- 9),
         (FloatR 641544 (- 16), FloatR (- 861957) (- 23)), FloatR 641545 (- 16),
         FloatR (- 861955) (- 23)),
        (FloatR 1760 (- 9), (FloatR 642959 (- 16), FloatR (- 823866) (- 23)),
         (FloatR 644310 (- 16), FloatR (- 784380) (- 23)), FloatR 1870 (- 9),
         (FloatR 642959 (- 16), FloatR (- 823866) (- 23)), FloatR 642960 (- 16),
         FloatR (- 823865) (- 23)),
        (FloatR 1650 (- 9), (FloatR 644309 (- 16), FloatR (- 784382) (- 23)),
         (FloatR 645592 (- 16), FloatR (- 743511) (- 23)), FloatR 1760 (- 9),
         (FloatR 644309 (- 16), FloatR (- 784381) (- 23)), FloatR 644310 (- 16),
         FloatR (- 784380) (- 23)),
        (FloatR 1540 (- 9), (FloatR 645591 (- 16), FloatR (- 743512) (- 23)),
         (FloatR 646805 (- 16), FloatR (- 701274) (- 23)), FloatR 1650 (- 9),
         (FloatR 645591 (- 16), FloatR (- 743512) (- 23)), FloatR 645592 (- 16),
         FloatR (- 743511) (- 23)),
        (FloatR 1430 (- 9), (FloatR 646804 (- 16), FloatR (- 701275) (- 23)),
         (FloatR 647946 (- 16), FloatR (- 657699) (- 23)), FloatR 1540 (- 9),
         (FloatR 646804 (- 16), FloatR (- 701275) (- 23)), FloatR 646805 (- 16),
         FloatR (- 701274) (- 23)),
        (FloatR 1320 (- 9), (FloatR 647945 (- 16), FloatR (- 657700) (- 23)),
         (FloatR 649012 (- 16), FloatR (- 612824) (- 23)), FloatR 1430 (- 9),
         (FloatR 647945 (- 16), FloatR (- 657700) (- 23)), FloatR 647946 (- 16),
         FloatR (- 657699) (- 23)),
        (FloatR 1210 (- 9), (FloatR 649011 (- 16), FloatR (- 612825) (- 23)),
         (FloatR 650002 (- 16), FloatR (- 566695) (- 23)), FloatR 1320 (- 9),
         (FloatR 649011 (- 16), FloatR (- 612825) (- 23)), FloatR 649012 (- 16),
         FloatR (- 612824) (- 23)),
        (FloatR 1100 (- 9), (FloatR 650001 (- 16), FloatR (- 566696) (- 23)),
         (FloatR 650914 (- 16), FloatR (- 1038743) (- 24)), FloatR 1210 (- 9),
         (FloatR 650001 (- 16), FloatR (- 566696) (- 23)), FloatR 650002 (- 16),
         FloatR (- 566695) (- 23)),
        (FloatR 990 (- 9), (FloatR 650913 (- 16), FloatR (- 1038744) (- 24)),
         (FloatR 651745 (- 16), FloatR (- 941842) (- 24)), FloatR 1100 (- 9),
         (FloatR 650913 (- 16), FloatR (- 1038744) (- 24)), FloatR 650914 (- 16),
         FloatR (- 1038743) (- 24)),
        (FloatR 880 (- 9), (FloatR 651744 (- 16), FloatR (- 941843) (- 24)),
         (FloatR 652494 (- 16), FloatR (- 842845) (- 24)), FloatR 990 (- 9),
         (FloatR 651744 (- 16), FloatR (- 941843) (- 24)), FloatR 651745 (- 16),
         FloatR (- 941842) (- 24)),
        (FloatR 770 (- 9), (FloatR 652493 (- 16), FloatR (- 842846) (- 24)),
         (FloatR 653159 (- 16), FloatR (- 741927) (- 24)), FloatR 880 (- 9),
         (FloatR 652493 (- 16), FloatR (- 842846) (- 24)), FloatR 652494 (- 16),
         FloatR (- 842845) (- 24)),
        (FloatR 660 (- 9), (FloatR 653158 (- 16), FloatR (- 741928) (- 24)),
         (FloatR 653739 (- 16), FloatR (- 639284) (- 24)), FloatR 770 (- 9),
         (FloatR 653158 (- 16), FloatR (- 741928) (- 24)), FloatR 653159 (- 16),
         FloatR (- 741927) (- 24)),
        (FloatR 550 (- 9), (FloatR 653738 (- 16), FloatR (- 639285) (- 24)),
         (FloatR 654232 (- 16), FloatR (- 535127) (- 24)), FloatR 660 (- 9),
         (FloatR 653738 (- 16), FloatR (- 639285) (- 24)), FloatR 653739 (- 16),
         FloatR (- 639284) (- 24)),
        (FloatR 440 (- 9), (FloatR 654231 (- 16), FloatR (- 535128) (- 24)),
         (FloatR 654637 (- 16), FloatR (- 859366) (- 25)), FloatR 550 (- 9),
         (FloatR 654231 (- 16), FloatR (- 535128) (- 24)), FloatR 654232 (- 16),
         FloatR (- 535127) (- 24)),
        (FloatR 330 (- 9), (FloatR 654636 (- 16), FloatR (- 859367) (- 25)),
         (FloatR 654953 (- 16), FloatR (- 646385) (- 25)), FloatR 440 (- 9),
         (FloatR 654636 (- 16), FloatR (- 859367) (- 25)), FloatR 654637 (- 16),
         FloatR (- 859366) (- 25)),
        (FloatR 220 (- 9), (FloatR 654952 (- 16), FloatR (- 646387) (- 25)),
         (FloatR 655179 (- 16), FloatR (- 863632) (- 26)), FloatR 330 (- 9),
         (FloatR 654952 (- 16), FloatR (- 646387) (- 25)), FloatR 654953 (- 16),
         FloatR (- 646386) (- 25)),
        (FloatR 110 (- 9), (FloatR 655178 (- 16), FloatR (- 863633) (- 26)),
         (FloatR 655315 (- 16), FloatR (- 864707) (- 27)), FloatR 220 (- 9),
         (FloatR 655178 (- 16), FloatR (- 863633) (- 26)), FloatR 655179 (- 16),
         FloatR (- 863632) (- 26)),
        (FloatR 0 0, (FloatR 655314 (- 16), FloatR (- 864708) (- 27)),
         (FloatR 655360 (- 16), FloatR 869715 (- 57)), FloatR 110 (- 9),
         (FloatR 655314 (- 16), FloatR (- 864708) (- 27)), FloatR 655315 (- 16),
         FloatR (- 864707) (- 27))])"
  oops --"by eval"

end


(*
Title: Strong-Security
Authors: Sylvia Grewe, Alexander Lux, Heiko Mantel, Jens Sauer
*)
theory Type_System
imports Language_Composition
begin

locale Type_System =
  SSP : Strongly_Secure_Programs "E" "BMap" "DA"
  for E :: "('exp, 'id, 'val) Evalfunction"
  and BMap :: "'val \<Rightarrow> bool"
  and DA :: "('id, 'd::order) DomainAssignment"
+
fixes
AssignSideCondition :: "'id \<Rightarrow> 'exp \<Rightarrow> bool"
and WhileSideCondition :: "'exp \<Rightarrow> bool"
and IfSideCondition ::
  "'exp \<Rightarrow> ('exp,'id) MWLfCom \<Rightarrow> ('exp,'id) MWLfCom \<Rightarrow> bool"
assumes semAssignSC: "AssignSideCondition x e \<Longrightarrow> e \<equiv>\<^bsub>DA x\<^esub> e"
and semWhileSC: "WhileSideCondition e \<Longrightarrow> \<forall>d. e \<equiv>\<^bsub>d\<^esub> e"
and semIfSC: "IfSideCondition e c1 c2 \<Longrightarrow> \<forall>d. e \<equiv>\<^bsub>d\<^esub> e \<or> [c1] \<approx>\<^bsub>d\<^esub> [c2]"
begin

-- "Security typing rules for the language commands"
inductive
ComSecTyping :: "('exp, 'id) MWLfCom \<Rightarrow> bool"
  ("\<turnstile>\<^bsub>\<C>\<^esub> _")
and ComSecTypingL :: "('exp,'id) MWLfCom list \<Rightarrow> bool"
   ("\<turnstile>\<^bsub>\<V>\<^esub> _")
where
skip: "\<turnstile>\<^bsub>\<C>\<^esub> skip" |
Assign: "\<lbrakk> AssignSideCondition x e \<rbrakk> \<Longrightarrow> \<turnstile>\<^bsub>\<C>\<^esub> x := e" |
Fork: "\<lbrakk> \<turnstile>\<^bsub>\<C>\<^esub> c; \<turnstile>\<^bsub>\<V>\<^esub> V \<rbrakk> \<Longrightarrow> \<turnstile>\<^bsub>\<C>\<^esub> fork c V" |
Seq: "\<lbrakk> \<turnstile>\<^bsub>\<C>\<^esub> c1; \<turnstile>\<^bsub>\<C>\<^esub> c2 \<rbrakk> \<Longrightarrow> \<turnstile>\<^bsub>\<C>\<^esub> c1;c2" |
While: "\<lbrakk> \<turnstile>\<^bsub>\<C>\<^esub> c; WhileSideCondition b \<rbrakk>
     \<Longrightarrow> \<turnstile>\<^bsub>\<C>\<^esub> while b do c od" |
If: "\<lbrakk> \<turnstile>\<^bsub>\<C>\<^esub> c1; \<turnstile>\<^bsub>\<C>\<^esub> c2; IfSideCondition b c1 c2 \<rbrakk>
  \<Longrightarrow> \<turnstile>\<^bsub>\<C>\<^esub> if b then c1 else c2 fi" |
Parallel: "\<lbrakk> \<forall>i < length V. \<turnstile>\<^bsub>\<C>\<^esub> V!i \<rbrakk> \<Longrightarrow> \<turnstile>\<^bsub>\<V>\<^esub> V"

inductive_cases parallel_cases:
"\<turnstile>\<^bsub>\<V>\<^esub> V"

--"soundness proof of abstract type system"
theorem ComSecTyping_single_is_sound:
"\<turnstile>\<^bsub>\<C>\<^esub> c \<Longrightarrow> Strongly_Secure [c]"
by (induct rule: ComSecTyping_ComSecTypingL.inducts(1)
    [of _ _ "Strongly_Secure"],
  auto simp add: Strongly_Secure_def,
  metis Strongly_Secure_Skip,
  metis Strongly_Secure_Assign semAssignSC,
  metis Compositionality_Fork,
  metis Compositionality_Seq,
  metis Compositionality_While semWhileSC,
  metis Compositionality_If semIfSC,
  metis parallel_composition)

theorem ComSecTyping_list_is_sound:
"\<turnstile>\<^bsub>\<V>\<^esub> V \<Longrightarrow> Strongly_Secure V"
by (metis ComSecTyping_single_is_sound Strongly_Secure_def
  parallel_composition parallel_cases)

end

end


section {* R3 refines R1 *}

theory R3_Refines_R1
imports AbstractMultiPaxosR3 AbstractMultiPaxosR1 Simulations Hist_Supplemental IOA_Automation
begin

section {* A few lemmas *}

lemma comprehension_to_fold:
  fixes Y P c
  assumes "finite Y"
  defines "c \<equiv> \<lambda> y xs . xs \<union> {x . P x y}"
  shows "{x . \<exists> y \<in> Y . P x y} = Finite_Set.fold c {} Y" using assms
proof -
  interpret c_folding:folding_idem c "{}"
    apply (unfold_locales)
     apply (auto simp add:c_def)
    done
  show ?thesis using assms(1)
  proof (induct Y)
    case empty
    then show ?case by simp
  next
    case (insert x F)
    have "Finite_Set.fold c {} (insert x F) = c x {x . \<exists> y \<in> F . P x y}"
      using c_folding.eq_fold c_folding.insert insert.hyps(1) insert.hyps(2) insert.hyps(3) by auto
    also have "... =  {z . \<exists> y \<in> (insert x F) . P z y}"
      by (fastforce simp add:c_def)
    finally show ?case by simp
  qed
qed

lemma comprehension_to_fold_2:
  fixes f S P g i c
  assumes "finite S"
  defines "c \<equiv> \<lambda> a res . (\<lambda> (gai, ri) . if P gai then insert (f gai) ri else ri) o$ ($ g a, res $)"
  shows
    "{f ((g a) $ i) | a . a \<in> S \<and> P ((g a) $ i)} = (Finite_Set.fold c (K$ {}) S) $ i" using assms(1)
proof (induct)
  case empty
  then show ?case by simp
next
  case (insert x F)
  interpret c_folding:folding_idem c "K$ {}"
    apply (unfold_locales)
     apply (auto simp add:c_def fun_eq_iff expand_finfun_eq)
    done
  have 1:"\<And> ff . c x ff $ i = (if P (g x $ i) then insert (f (g x $ i)) (ff $ i) else ff $ i)"
    by (simp add:c_def)
  have "Finite_Set.fold c (K$ {}) (insert x F) $ i = c x (Finite_Set.fold c (K$ {}) F) $ i"
    using c_folding.eq_fold c_folding.insert_idem insert.hyps(1) by auto
  also have "... = (if (P (g x $ i)) then insert (f (g x $ i)) (Finite_Set.fold c (K$ {}) F $ i)
    else (Finite_Set.fold c (K$ {}) F) $ i)"
    by (simp add: "1")
  finally show ?case using insert.hyps
    by auto
qed

locale receive_1b_lemmas = receive_1b onebs as log for onebs as log +
  assumes votes_default:"\<And> a . finfun_default (onebs $ a) = None"
    and log_default:"finfun_default log = inst_status.Free" and fin:"finite as"
  and conservative:"\<And> a a' i b v v' . \<lbrakk>onebs $ a $ i = Some (v,b); onebs $a' $ i = Some (v',b)\<rbrakk>
        \<Longrightarrow> v = v'"
begin

lemma votes_per_inst_decl:
  "votes_per_inst $ i = {the (onebs $ a $ i) | a . a \<in> as \<and> onebs $ a $ i \<noteq> None}"
proof -
  let ?f="\<lambda>(gai, ri). if gai \<noteq> None then insert (the gai) ri else ri"
  have 1:"?f = (\<lambda> (vo, vs) . option_as_set vo \<union> vs)"
    by (auto simp add:option_as_set_def fun_eq_iff split!:option.splits)
  have 2:"votes_per_inst = Finite_Set.fold (\<lambda> a vs . ?f o$ ($ (onebs $ a), vs $)) (K$ {}) as"
    by (simp only:votes_per_inst_def 1 Let_def pre_votes_per_inst_def c_def[abs_def])
  note 3 = comprehension_to_fold_2[OF fin, where ?g="op$ onebs" and ?f=the and ?P="flip op\<noteq> None"]
  show ?thesis by (simp only:2 3)
qed

lemma votes_per_inst_default:
  assumes "\<And> a . finfun_default (onebs $ a) = None"
  shows "finfun_default votes_per_inst = {}" using fin
proof (simp add:votes_per_inst_def, induct)
  case empty
  then show ?case by (simp add:pre_votes_per_inst_def)
next
  case (insert x F)
    have 1:"Finite_Set.fold c (K$ {}) (insert x F) = c x (Finite_Set.fold c (K$ {}) F)" using insert_idem
      by (simp add: eq_fold insert.hyps(1))
    have "finfun_default (Finite_Set.fold c (K$ {}) F) = {}" using insert.hyps(3) insert.prems
      by (simp add: pre_votes_per_inst_def)
    moreover have "finfun_default (onebs $ x) = None"
      by (simp add: assms)
    ultimately have "finfun_default ($ onebs $ x, Finite_Set.fold c (K$ {}) F $) = (None, {})"
      by (simp add: diag_default)
    with 1 show ?case by (simp add:c_def pre_votes_per_inst_def comp_default option_as_set_def)
qed

lemma max_per_inst_default:
  "finfun_default (max_per_inst) = {}"
proof -
  have "finfun_default votes_per_inst = {}"
    using votes_default votes_per_inst_default by auto
  thus ?thesis by (simp add:max_per_inst_def max_by_key_def comp_default)
qed

lemma new_log_default:
  "finfun_default new_log = inst_status.Free" using log_default
  by (auto simp add:new_log_def max_per_inst_default comp_default diag_default)

lemma conservative_per_inst:
  fixes v v' b i
    assumes "(v,b) \<in> votes_per_inst $ i"
    and "(v',b) \<in> votes_per_inst $ i"
  shows "v = v'" using conservative assms votes_per_inst_decl
proof -
  have "(v, b) \<in> {the (onebs $ a $ i) |a. a \<in> as \<and> onebs $ a $ i \<noteq> None}"
    by (metis assms(1) votes_per_inst_decl)
  then have f1: "\<exists>a. (v, b) = the (onebs $ a $ i) \<and> a \<in> as \<and> onebs $ a $ i \<noteq> None"
  proof -
    show ?thesis
      using \<open>(v, b) \<in> {the (onebs $ a $ i) |a. a \<in> as \<and> onebs $ a $ i \<noteq> None}\<close> by auto
  qed
  have "(v', b) \<in> {the (onebs $ a $ i) |a. a \<in> as \<and> onebs $ a $ i \<noteq> None}"
    by (metis assms(2) votes_per_inst_decl)
  then have "\<exists>a. (v', b) = the (onebs $ a $ i) \<and> a \<in> as \<and> onebs $ a $ i \<noteq> None"
  proof -
    show ?thesis
      using \<open>(v', b) \<in> {the (onebs $ a $ i) |a. a \<in> as \<and> onebs $ a $ i \<noteq> None}\<close> by auto
  qed
  then show ?thesis
    using f1 by (metis conservative option.collapse)
qed

lemma max_per_inst_lemma:
  "\<forall> i . max_per_inst $ i = max_by_key {(v,b) . (\<exists> a \<in> as . onebs $ a $ i = Some (v,b))} snd"
  apply (rule allI)
  apply (simp add:votes_per_inst_decl max_per_inst_def)
  by (smt Collect_cong case_prodE case_prodI option.sel)

lemma new_log_lemma:
  "\<forall> i . let m = max_by_key {(v,b) . (\<exists> a \<in> as . onebs $ a $ i = Some (v,b))} snd in
     case log $ i of Decided _ \<Rightarrow> new_log $ i = log $ i
     | _ \<Rightarrow> if m = {} then new_log $ i = Free
        else new_log $ i = Active"
  apply (rule allI) apply (auto simp add:Let_def new_log_def split!:inst_status.splits)
     apply (metis empty_iff max_per_inst_lemma)
    apply (metis empty_iff max_per_inst_lemma)
   apply (metis empty_iff max_per_inst_lemma)
  by (metis empty_iff max_per_inst_lemma)

lemma msgs_lemma:
  "msgs = {Phase2a i b v | i b v . (new_log $ i = Active \<and> max_per_inst $ i = {(v,b)})}"
proof -
  have 1:"finfun_default ((op= Active) o$ new_log) = False" using new_log_default
    apply auto
  proof -
    assume a1: "finfun_default (op = Active \<circ>$ local.new_log)"
    assume a2: "finfun_default local.new_log = Free"
    have "Active = finfun_default local.new_log"
      using a1 comp_default by auto
    then show False
      using a2 by (metis inst_status.distinct(5))
  qed
  hence "i \<in> set (finfun_to_list ((op= Active) o$ new_log)) = (new_log $ i = Active)" for i
    apply (simp add:)
  proof -
    assume a1: "\<not> finfun_default (op = Active \<circ>$ local.new_log)"
    have f2: "\<And>p f n i. (p \<circ>$ f(n::nat $:= i::'b inst_status)) $ n \<or> \<not> p i"
      by (metis finfun_comp_update finfun_upd_apply)
    have f3: "\<And>f n i. f(n::nat $:= i::'b inst_status) = f \<or> i \<noteq> f $ n"
      by (metis finfun_ext finfun_upd_apply)
    then have f4: "\<And>p f n. p (f $ (n::nat)::'b inst_status) \<or> \<not> (p \<circ>$ f) $ n"
      by (metis finfun_comp_update finfun_upd_apply)
    { assume "Active \<noteq> local.new_log $ i \<and> local.new_log $ i \<noteq> Active"
      then have "\<not> (op = Active \<circ>$ local.new_log) $ i \<and> \<not> finfun_default (op = Active \<circ>$ local.new_log) \<and> local.new_log $ i \<noteq> Active"
        using f4 a1 by metis
      then have "finfun_dom (op = Active \<circ>$ local.new_log) $ i = (local.new_log $ i = Active)"
        by (smt finfun_dom_conv) }
    then show "finfun_dom (op = Active \<circ>$ local.new_log) $ i = (local.new_log $ i = Active)"
      using f3 f2 a1 by (metis finfun_dom_conv)
  qed
  thus ?thesis unfolding msgs_def Let_def apply simp
    (* Here we are missing the fact that if an instance is Active in new_log then its max_per_inst
    is a singleton*)
  oops

end

section {* Refinement proof using a refinement mapping *}

locale ref_proof_4 = quorums quorums + amp_r3 leader next_bal as quorums
  + r1:ampr1_ioa quorums leader
  for quorums :: "('a::linorder) set set" and leader :: "bal \<Rightarrow> ('a::linorder)" and next_bal as +
  fixes ampr3_ioa :: "(('a, 'v) global_state, 'v paxos_action) ioa"
    and ampr1_ioa :: "(('v, 'a, 'l) ampr1_state, 'v paxos_action) ioa"
  defines "ampr3_ioa \<equiv> ioa" and "ampr1_ioa \<equiv> r1.ioa"
  fixes a1 a2 a3
  assumes at_least_3:"a1 \<in> as \<and> a2 \<in> as \<and> a3 \<in> as \<and> a1 \<noteq> a2 \<and> a3 \<noteq> a2 \<and> a3 \<noteq> a1"
  assumes fin:"finite as" and infin:"infinite (UNIV::'a set)"
    -- {* @{term "UNIV::'a set"} must be infinite for @{term finfun_default} to make sense. *}
begin

interpretation IOA .

lemmas action_defs = propose_def do_2a_def receive_2b_def
      try_acquire_leadership_def receive_1a_def receive_2a_def receive_1b_def receive_fwd_def
  send_all_def Let_def

lemmas init_defs = ampr3_ioa_def ioa_def global_start_def local_start_def
  ampr1_ioa_def r1.ioa_def r1.start_def r1.start_s_def

method trans_cases =
  (simp add:is_trans_def ampr3_ioa_def ioa_def, elim trans_cases)

definition inv1 where inv1_def[inv_proofs_defs]:
  "inv1 s \<equiv> \<forall> a . acceptors (lstate s a) = as \<and> id (lstate s a) = a"
lemma inv1:"invariant ampr3_ioa inv1"
  apply (rule invariantI)
   apply (simp add:inv1_def init_defs)
  apply (rm_reachable)
  apply trans_cases
         apply (auto simp add:inv1_def action_defs)
  done
declare inv1[invs]

declare finfun_upd_apply[simp]

definition inv6 where inv6_def:
  "inv6 s \<equiv> \<forall> a i b v . (Packet a (Phase2a i b v) \<in> network s \<longrightarrow> log (lstate s (leader b)) $ i \<noteq> Free)"
lemma inv6: "invariant ampr3_ioa inv6"
  apply (rule invariantI)
   apply (simp add:inv6_def init_defs)
  apply (insert invs)
  apply (instantiate_invs)
  apply (rm_reachable)
  apply (trans_cases)
        apply (fastforce simp add:inv1_def inv6_def action_defs)
        apply (fastforce simp add:inv1_def inv6_def action_defs)
       apply (simp add:inv1_def inv6_def action_defs split!:if_splits)
      apply (fastforce simp add:inv1_def inv6_def action_defs split!:if_splits)
     apply (fastforce simp add:inv1_def inv6_def action_defs split!:if_splits)
    apply (fastforce simp add:inv1_def inv6_def action_defs split!:if_splits) defer
   apply (fastforce simp add:inv1_def inv6_def action_defs split!:if_splits)
   (* TODO: The hard one is left. *) oops

definition inv2 where inv2_def:
  "inv2 s \<equiv> \<forall> i b v1 v2 a1 a2 .
    (Packet a1 (Phase2a i b v1) \<in> network s
      \<and> Packet a2 (Phase2a i b v2) \<in> network s \<longrightarrow> v1 = v2)"
lemma inv2:"invariant ampr3_ioa inv2"
  apply (rule invariantI)
   apply (simp add:inv2_def init_defs)
  apply (insert invs)
  apply (instantiate_invs)
  apply (rm_reachable)
  apply (trans_cases;
    (simp add:inv1_def inv2_def action_defs finfun_default_update_const split!:packet.splits msg.splits; fail)?)
  subgoal premises prems for s t act a v
  proof -
    thm prems
    show ?thesis using prems(1,2,4) oops
      nitpick[no_assms, card 'v =2, card 'a = 1, show_types]

definition inv3 where
  "inv3 s \<equiv> \<forall> i a1 a2 b d1 v1 d2 v2 .
    Packet d1 (Phase2b a1 i b v1) \<in> network s \<and> Packet d2 (Phase2b a2 i b v2) \<in> network s
    \<longrightarrow> v1 = v2"
lemma inv2:"invariant ampr3_ioa inv2"
  apply (rule invariantI)
   apply (simp add:inv2_def init_defs)
  apply (insert invs)
  apply (instantiate_invs)
  apply (rm_reachable)
  apply trans_cases
  oops

definition inv5 :: "('a,'v)global_state \<Rightarrow> bool" where inv5_def[inv_proofs_defs]:
  "inv5 s \<equiv> \<forall> a b a2 p .
    finfun_default ((acc.onebs (lstate s a)) $ b $ a2) = None
    \<and> (finfun_default (acc.votes (lstate s a)) = None)
    \<and> (p \<in> network s \<longrightarrow>
        (case p of Packet _ (Phase1b _ _ vs) \<Rightarrow> finfun_default vs = None
        | Packet _ _ \<Rightarrow> True))"
lemma inv5:"invariant ampr3_ioa inv5"
  apply (rule invariantI)
   apply (simp add:inv5_def init_defs finfun_default_const)
  apply (insert invs)
  apply (instantiate_invs)
  apply (rm_reachable)
  apply (trans_cases;
    (simp add:inv1_def inv5_def action_defs finfun_default_update_const split!:packet.splits msg.splits; fail)?)
  subgoal premises prems for s t act a b vs m p a2 (* receive_1b*)
  proof -
    have 1:"acc.onebs (lstate t a) = new_onebs (acc.onebs (lstate s a)) vs b a2"
      using prems(2,5,6) by (auto simp add:inv1_def action_defs)
    show ?thesis
    proof (auto simp add:inv5_def)
      fix a' b' a2'
      show "finfun_default (acc.onebs (lstate t a') $ b' $ a2') = None"
      proof (cases "a' = a")
        case True
        have 2:"acc.onebs (lstate t a') = new_onebs (acc.onebs (lstate s a')) vs b a2"
          using 1 True by auto
        have 3:"finfun_default (acc.onebs (lstate s a') $ b' $ a2') = None"
          using prems(1) by (auto simp add:inv5_def)
        show ?thesis using 2 3 prems(1,4,7)
          apply (auto simp add: inv5_def new_onebs_def update_onebs.new_onebs_def)
          apply (case_tac "b' = b", case_tac "a2' = a2")
            apply fastforce
          apply blast
          by fastforce
      next
        case False
        then show ?thesis using prems(1,6) by (simp add:inv5_def)
      qed
    next
      fix a
      show "finfun_default (votes (lstate t a)) = None" using prems
        by (simp add:inv1_def inv5_def action_defs finfun_default_update_const split!:packet.splits msg.splits)
    next
      fix p
      let ?sa = "lstate s a"
      have 1:"let msgs = msgs (acc.onebs ?sa $ b) (acc.acceptors ?sa) (log ?sa)
        in snd (receive_1b ?sa a2 b vs) \<subseteq> \<Union> {send_all ?sa m | m . m \<in> msgs} "
        by (auto simp add:inv1_def action_defs)
      have 2:"\<And> m . let msgs = msgs (acc.onebs ?sa $ b) (acc.acceptors ?sa) (log ?sa) in
        m \<in> \<Union> {send_all ?sa m | m . m \<in> msgs} \<Longrightarrow> case m of Packet _ (Phase2a _ _ _) \<Rightarrow> True | _ \<Rightarrow> False"
        using r1.msgs_lemma by (fastforce simp add:send_all_def)
      from 1 2 have "\<And> p . p \<in> snd (receive_1b ?sa a2 b vs) \<Longrightarrow>
        case p of Packet _ (Phase2a _ _ _) \<Rightarrow> True | _ \<Rightarrow> False" by auto
      moreover have "network t = snd (receive_1b ?sa a2 b vs) \<union> network s" using prems(5,6) by auto
      ultimately show "p \<in> network t \<Longrightarrow> case p of Packet _ (Phase1b _ _ vs) \<Rightarrow> finfun_default vs = None | Packet _ _ \<Rightarrow> True"
        using prems(1) by (force simp add:inv5_def inv1_def split!:packet.splits msg.splits)
    qed
  qed
  done
declare inv5[invs]

definition inv4 where "inv4 s \<equiv>
  (\<forall> a . finfun_default (log (lstate s a)) = Free)"

lemma inv4:"invariant ampr3_ioa inv4"
  apply (rule invariantI)
   apply (simp add:inv4_def init_defs)
   apply (simp add: finfun_default_const)
  apply (insert invs)
  apply (instantiate_invs)
  apply (rm_reachable)
  apply trans_cases
         apply (auto simp add:inv4_def inv1_def action_defs finfun_default_update_const finfun_upd_apply
          amp_r3.next_inst_lemma
          split!:if_splits msg.splits packet.splits inst_status.splits) oops

fun extract_vs where
  "extract_vs (Fwd v) = {v}"
| "extract_vs (Phase2a _ _ v) = {v}"
| "extract_vs (Phase2b _ _ _ v) = {v}"
| "extract_vs (Phase1b _ _ ff) = {v . \<exists> i b . ff $ i = Some (v,b)}"
  -- {* Could be @{term "{ff $ i \<bind> (Some o fst) | i . True} \<bind> option_as_set" } *}
| "extract_vs _ = {}"

definition propCmd where "propCmd s \<equiv> \<Union> ((\<lambda> p . case p of Packet _ m \<Rightarrow> extract_vs m) ` network s)"

definition ref_map where "ref_map s \<equiv> \<lparr>
  ampr1_state.propCmd = propCmd s,
  ballot = \<lambda> a . acc.ballot (lstate s a),
  vote = \<lambda> i a b . if (\<exists> a2 v . Packet a2 (Phase2b a i b v) \<in> network s)
    then Some (the_elem {v . \<exists> a2 . Packet a2 (Phase2b a i b v) \<in> network s}) else None,
  suggestion = \<lambda> i b . if (\<exists> a v. Packet a (Phase2a i b v) \<in> network s)
    then Some (the_elem {v . \<exists> a . Packet a (Phase2a i b v) \<in> network s}) else None,
  onebs = \<lambda> a b . if (\<exists> ff . Packet (leader b) (Phase1b a b ff) \<in> network s)
    then Some (the_elem {op$ ff | ff . Packet (leader b) (Phase1b a b ff) \<in> network s}) else None\<rparr>"

lemmas ref_defs = ref_map_def propCmd_def

lemma "is_ref_map ref_map ampr3_ioa ampr1_ioa"
  apply (auto simp add:is_ref_map_def)
   apply (simp add:init_defs ref_defs)
  apply (insert invs)
  apply (instantiate_invs)
  apply (rm_reachable)
  apply trans_cases
  subgoal premises prems for s t act a v (* Propose *)
  proof (intro exI[where ?x="ref_map s"] exI[where ?x="[(act, ref_map t)]"])
    thm prems
    have "ref_map t = (ref_map s)\<lparr>propCmd := insert v (ampr1_state.propCmd (ref_map s))\<rparr>"
    proof (cases "leader (acc.ballot (lstate s a)) = a") oops

end

section {* Testing interpretation. *}

definition n :: nat where "n \<equiv> 3"
  -- {* The number of processes *}

definition accs where "accs \<equiv> {1..n}"
  -- {* The set of acceptors *}

definition leader where "leader (b::nat) \<equiv> (b mod n) + 1"

definition next_bal :: "nat \<Rightarrow> nat \<Rightarrow> nat" where "next_bal b a \<equiv>
  (b div n + 1) * n + a"

global_interpretation cq:card_quorums accs
  defines qs = "cq.quorums" and nas = "cq.nas"
  apply (unfold_locales)
   apply (simp add: accs_def n_def)
  apply (simp add: accs_def)
  done

definition r3_ioa :: "((nat, nat) global_state, nat paxos_action) ioa"
  where r3_ioa_def:"r3_ioa \<equiv> amp_r3.ioa leader next_bal accs"

definition r1_ioa  :: "((nat, nat, nat) ampr1_state, nat paxos_action) ioa"
  where "r1_ioa \<equiv> ampr1_ioa.ioa qs leader"

global_interpretation ref_proof_4 qs leader next_bal accs
  r3_ioa r1_ioa 1 2 3
    apply (unfold_locales)
      apply (auto simp add:accs_def n_def r3_ioa_def r1_ioa_def) .

term ioa
thm ioa_def
interpretation IOA .
thm init_defs
(* declare [[show_types, show_consts]] *)
lemma "invariant r3_ioa inv2"
  apply (rule invariantI)
   apply (simp add:inv2_def init_defs accs_def leader_def next_bal_def amp_r3.ioa_def
      amp_r3.global_start_def)
  apply (insert invs)
  apply (instantiate_invs)
  apply (rm_reachable)
  apply (trans_cases;
    (simp add:inv1_def inv2_def action_defs finfun_default_update_const split!:packet.splits msg.splits; fail)?)
apply (simp add:inv2_def inv1_def inv5_def propose_def do_2a_def send_all_def) oops

section {* Old attempts. *}

subsection {* Proof using a history variable (simple sketch) *}

locale ref_proof_1 = quorums quorums + amp_r3 leader next_bal as quorums
  + r1:ampr1_ioa quorums leader
  for quorums :: "('a::linorder) set set" and leader :: "bal \<Rightarrow> ('a::linorder)" and next_bal as +
  fixes ampr3_ioa :: "(('a, 'v) global_state, 'v paxos_action) ioa"
    and ampr1_ioa :: "(('v, 'a, 'l) ampr1_state, 'v paxos_action) ioa"
  defines "ampr3_ioa \<equiv> ioa" and "ampr1_ioa \<equiv> r1.ioa"
begin

interpretation IOA .

definition ghost_ioa where
  -- {* We add a history variable that tracks the set of proposed commands. *}
  "ghost_ioa \<equiv>
      let update = \<lambda> s h a s' . case a of Propose v \<Rightarrow> insert v h | _ \<Rightarrow> h;
        init = \<lambda> s . {}
      in
    add_history ampr3_ioa update init"

lemmas ioa_defs =
   IOA.actions_def
   IOA.externals_def IOA.add_history_def

lemmas amp_defs = ioa_defs ampr1_ioa_def ampr3_ioa_def ghost_ioa_def
  ioa_def global_start_def

definition inv1 where "inv1 s \<equiv> let r3_s = fst s; h = snd s in
  \<forall> a v . (Packet a (Fwd v)) \<in> network r3_s \<longrightarrow> v \<in> h"
declare inv1_def[inv_proofs_defs]

lemma inv1:"invariant ghost_ioa inv1"
  apply (rule invariantI)
   apply (simp add:inv1_def amp_defs)
  apply (rm_reachable)
  apply (simp add:ghost_ioa_def)
  apply (simp only: split_paired_all)
  apply (frule IOA.add_hist_trans(1), drule IOA.add_hist_trans(2))
  apply (simp add:is_trans_def ampr3_ioa_def ioa_def)
  apply (drule trans_cases)
          apply (auto simp add:inv1_def)
         defer
         apply(simp add:receive_2b_def Let_def split:if_splits option.splits)
        apply(simp add:try_acquire_leadership_def Let_def send_all_def split:if_splits option.splits)
       apply (metis amp_r3.msg.distinct(13) amp_r3.packet.inject empty_iff receive_1a_def singletonD snd_conv)
      apply(simp add:receive_2a_def Let_def send_all_def split:if_splits option.splits)
     apply(simp add:receive_2b_def Let_def send_all_def split:if_splits option.splits)
    apply(simp add:receive_1b_def receive_1b.msgs_def msgs_def Let_def send_all_def split:if_splits option.splits)
  subgoal proof - oops
    fix a :: "('a, 'v) global_state" and b :: "'v set" and ac :: 'a and bb :: nat and vs :: "nat \<Rightarrow>f ('v \<times> nat) option" and ad :: "('a, 'v) acc" and bc :: "('a, 'v) packet set" and ae :: 'a and v :: 'v
    assume a1: "(\<exists>x. finfun_dom (receive_1b.new_log (the (acc.onebs (lstate a ac) $ bb)) (acceptors (lstate a ac)) (log (lstate a ac))) $ x \<and> (Fwd v::('a, 'v) msg) = (case the_elem (receive_1b.max_per_inst (the (acc.onebs (lstate a ac) $ bb)) (acceptors (lstate a ac)) $ x) of (v, b) \<Rightarrow> Phase2a x b v)) \<and> ae \<in> acceptors (lstate a ac) \<and> ae \<noteq> acc.id (lstate a ac)"
    have "\<And>n p v. (case p of (v, na) \<Rightarrow> Phase2a n na v) \<noteq> (Fwd v::('a, 'v) msg)"
      by (metis amp_r3.msg.distinct(17) case_prod_conv surj_pair)
    then show "v \<in> b"
      using a1 by metis
  qed
   apply(simp add: do_2a_def receive_fwd_def Let_def send_all_def split:if_splits option.splits)
  apply(simp add: do_2a_def propose_def Let_def send_all_def split:if_splits option.splits)
  done

end

subsection {* Proof using a more involved history state. *}

locale ref_proof = quorums quorums + amp_r3 leader next_bal as quorums
  + r1:ampr1_ioa quorums leader
  for quorums :: "('a::linorder) set set" and leader :: "bal \<Rightarrow> ('a::linorder)" and next_bal as +
  fixes ampr3_ioa :: "(('a, 'v) global_state, 'v paxos_action) ioa"
    and ampr1_ioa :: "(('v, 'a, 'l) ampr1_state, 'v paxos_action) ioa"
  defines "ampr3_ioa \<equiv> ioa" and "ampr1_ioa \<equiv> r1.ioa"
begin

interpretation IOA .

lemmas ioa_defs =
   IOA.actions_def
   IOA.externals_def IOA.add_history_def

definition update_hist where "update_hist s h a s' \<equiv> case a of
  Propose v \<Rightarrow> h\<lparr>propCmd := insert v (propCmd h)\<rparr>
  | Internal \<Rightarrow>
      h\<lparr>vote := \<lambda> i a b . case (votes (lstate s' a) $ i) of Some (v,b2) \<Rightarrow>
          (if b = b2 then Some v else (vote h i a b)) | None \<Rightarrow> None,
        ampr1_state.ballot := \<lambda> a . acc.ballot (lstate s' a),
        suggestion := \<lambda> i b . case (log (lstate s' (leader b)) $ i) of Proposed v \<Rightarrow> (
              case (log (lstate s (leader b)) $ i) of Free \<Rightarrow> Some v | _ \<Rightarrow> suggestion h i b)
          | Decided v \<Rightarrow> suggestion h i b
          | Free \<Rightarrow> None,
        onebs := \<lambda> a b . if acc.ballot (lstate s' a) = b \<and> acc.ballot (lstate s' a) \<noteq> b
          then Some (op$ (votes (lstate s a))) else None\<rparr>
  | _ \<Rightarrow> h"

definition ghost_ioa where
  -- {* This gets a little tricky. Why not define a history IOA without @{term add_hist} and
  prove trace inclusion with a forward simulation? *}
  "ghost_ioa \<equiv> add_history ampr3_ioa update_hist (\<lambda> s . r1.start_s)"

lemmas amp_defs = ioa_defs ampr1_ioa_def ampr3_ioa_def ghost_ioa_def
  ioa_def global_start_def

definition inv1 where "inv1 s \<equiv> let r3_s = fst s; h = snd s in
  \<forall> a v . (Packet a (Fwd v)) \<in> network r3_s \<longrightarrow> v \<in> propCmd h"
declare inv1_def[inv_proofs_defs]

lemma inv1:"invariant ghost_ioa inv1"
  apply (rule invariantI)
   apply (simp add:inv1_def amp_defs)
  apply (rm_reachable)
  apply (simp add:ghost_ioa_def)
  apply (simp only: split_paired_all)
  apply (frule IOA.add_hist_trans(1), drule IOA.add_hist_trans(2))
  apply (simp add:is_trans_def ampr3_ioa_def ioa_def)
  apply (elim trans_cases)
         apply (auto simp add:inv1_def update_hist_def)
         apply (simp add:propose_def do_2a_def Let_def send_all_def split:if_splits)
        apply (simp add:receive_2b_def Let_def send_all_def split:if_splits)
       apply (simp add:try_acquire_leadership_def Let_def send_all_def split:if_splits)
      apply (simp add:receive_1a_def Let_def send_all_def split:if_splits)
     apply (simp add:receive_2a_def Let_def send_all_def split:if_splits)
    apply (simp add:receive_2b_def Let_def send_all_def split:if_splits)
   apply (simp add:receive_1b_def Let_def send_all_def msgs_def receive_1b.msgs_def split:if_splits)
  subgoal proof -
    fix a :: "('a, 'v) global_state" and b :: "('v, 'a, ?'l) ampr1_state" and ac :: 'a and bb :: nat and vs :: "nat \<Rightarrow>f ('v \<times> nat) option" and ad :: "('a, 'v) acc" and bc :: "('a, 'v) packet set" and ae :: 'a and v :: 'v
    assume a1: "(\<exists>x. finfun_dom (receive_1b.new_log (the (acc.onebs (lstate a ac) $ bb)) (acceptors (lstate a ac)) (log (lstate a ac))) $ x \<and> (Fwd v::('a, 'v) msg) = (case the_elem (receive_1b.max_per_inst (the (acc.onebs (lstate a ac) $ bb)) (acceptors (lstate a ac)) $ x) of (v, b) \<Rightarrow> Phase2a x b v)) \<and> ae \<in> acceptors (lstate a ac) \<and> ae \<noteq> acc.id (lstate a ac)"
    have "\<And>n p v. (case p of (v, na) \<Rightarrow> Phase2a n na v) \<noteq> (Fwd v::('a, 'v) msg)"
      by (metis amp_r3.msg.distinct(17) case_prod_conv surj_pair)
    then show "v \<in> propCmd b" oops
      using a1 by metis
  qed
  apply (simp add:receive_fwd_def do_2a_def Let_def send_all_def split:if_splits)
  done
declare inv1[invs]

definition ref_map where "ref_map s \<equiv> snd s"

method apply_exI_hist =
  (match conclusion in "\<exists> e\<^sub>0 ef . refines (e\<^sub>0,ef) (?s,h) a (?s',h') ?ioa ?f" for h h' a
    \<Rightarrow> \<open>intro exI[where ?x=h] exI[where ?x="[(a,h')]"]\<close>)

lemma "is_ref_map ref_map ghost_ioa ampr1_ioa"
  apply (auto simp add:is_ref_map_def)
   apply (simp add:ghost_ioa_def add_history_def ampr3_ioa_def r1.start_s_def ampr1_ioa_def r1.ioa_def r1.start_def
      ref_map_def)
  apply (insert invs)
  apply (instantiate_invs)
  apply (rm_reachable)
  apply (simp add:ghost_ioa_def)
  apply (frule IOA.add_hist_trans(1), drule IOA.add_hist_trans(2))
  apply (simp add:is_trans_def ampr3_ioa_def ioa_def)
  apply (elim trans_cases)
  (* Propose. *)
         apply apply_exI_hist
         apply (force simp add:ampr1_ioa_def ref_map_def refines_def update_hist_def is_trans_def r1.ioa_def
      r1.trans_def trace_match_def paxos_asig_def Let_def inv1_def r1.propose_def externals_def
      trace_def schedule_def filter_act_def propose_def do_2a_def split!:if_splits)
        prefer 7
  subgoal premises prems for s h s' h' act a v m p
    apply apply_exI_hist
    apply (simp add:refines_def)
    apply (intro conjI)
       apply (simp add:ref_map_def)
      apply (simp add:ref_map_def)
     prefer 2
     apply (simp add:trace_match_def trace_def schedule_def externals_def
        filter_act_def ampr1_ioa_def r1.ioa_def paxos_asig_def Let_def split!:if_splits)
  subgoal proof (cases "id (lstate s a) = leader (acc.ballot (lstate s a))")
    case False
    with prems(3,5,6) have "update_hist s h act s' = h" apply (simp add:update_hist_def receive_fwd_def)
    thm prems
    oops

end

subsection {* implementation proof using a forward simulation *}

locale ref_proof_3 = quorums quorums + amp_r3 leader next_bal as quorums
  + r1:ampr1_ioa quorums leader
  for quorums :: "('a::linorder) set set" and leader :: "bal \<Rightarrow> ('a::linorder)" and next_bal as +
  fixes ampr3_ioa :: "(('a, 'v) global_state, 'v paxos_action) ioa"
    and ampr1_ioa :: "(('v, 'a, 'l) ampr1_state, 'v paxos_action) ioa"
  defines "ampr3_ioa \<equiv> ioa" and "ampr1_ioa \<equiv> r1.ioa"
  fixes a1 a2 a3
  assumes "a1 \<in> as" and "a2 \<in> as" and "a3 \<in> as" and "a1 \<noteq> a2" and "a3 \<noteq> a2" and "a3 \<noteq> a1"
begin

interpretation IOA .

lemmas action_defs = propose_def do_2a_def receive_2b_def
      try_acquire_leadership_def receive_1a_def receive_2a_def receive_1b_def receive_fwd_def
lemmas init_defs = ampr3_ioa_def ioa_def global_start_def local_start_def
  ampr1_ioa_def r1.ioa_def r1.start_def r1.start_s_def

method trans_cases =
  (simp add:is_trans_def ampr3_ioa_def ioa_def, elim trans_cases)

definition inv1 where inv1_def[inv_proofs_defs]:"inv1 s \<equiv> \<forall> a . acceptors (lstate s a) = as \<and> id (lstate s a) = a"
lemma inv1:"invariant ampr3_ioa inv1"
  apply (rule invariantI)
   apply (simp add:inv1_def init_defs)
  apply (rm_reachable)
  apply trans_cases
         apply (auto simp add:Let_def inv1_def action_defs)
  done
declare inv1[invs]

fun extract_vs where
  "extract_vs (Fwd v) = {v}"
| "extract_vs (Phase2a _ _ v) = {v}"
| "extract_vs (Phase2b _ _ _ v) = {v}"
| "extract_vs (Phase1b _ _ ff) = {v . \<exists> i b . ff $ i = Some (v,b)}"
  -- {* Could be @{term "{ff $ i \<bind> (Some o fst) | i . True} \<bind> option_as_set" }*}
| "extract_vs _ = {}"

definition propCmd where "propCmd s \<equiv> \<Union> ((\<lambda> p . case p of Packet _ m \<Rightarrow> extract_vs m) ` network s)"

definition propCmd2 where "propCmd2 s \<equiv> {v . \<exists> a \<in> as .
  Packet a (Fwd v) \<in> network s
  \<or> (\<exists> i b . Packet a (Phase2a i b v) \<in> network s)
  \<or> (\<exists> a2 \<in> as . \<exists> i b v . Packet a (Phase2b a2 i b v) \<in> network s)
  \<or> (\<exists> a2 \<in> as . \<exists> b ff i b2 . Packet a (Phase1b a2 b ff) \<in> network s \<and> ff $ i = Some (v,b2))}"

definition fwd_sim where "fwd_sim s \<equiv> {t .
  ampr1_state.propCmd t = propCmd s
  \<and> ballot t = (\<lambda> a . acc.ballot (lstate s a))
  \<and> (\<forall> i b v . suggestion t i b = None \<longleftrightarrow> (\<forall> a . Packet a (Phase2a i b v) \<notin> network s))
  \<and> (\<forall> i b v . suggestion t i b = Some v \<longleftrightarrow> (\<forall> a . a \<noteq> leader b \<longrightarrow> Packet a (Phase2a i b v) \<in> network s))
  \<and> (\<forall> i b v a . vote t i a b = None \<longleftrightarrow> (\<forall> a2 . Packet a2 (Phase2b a i b v) \<notin> network s))
  \<and> (\<forall> i b v a . vote t i a b = Some v \<longleftrightarrow> (\<forall> a2 . a2 \<noteq> a \<longrightarrow> Packet a2 (Phase2b a i b v) \<in> network s))
  \<and> (\<forall> a b ff . onebs t a b = None \<longleftrightarrow> (Packet (leader b) (Phase1b a b ff) \<notin> network s))
  \<and> (\<forall> a b f . onebs t a b = Some f \<longleftrightarrow> (Packet (leader b) (Phase1b a b (Abs_finfun f)) \<in> network s))}"

lemmas sim_defs = fwd_sim_def propCmd_def

lemma "is_forward_sim fwd_sim ampr3_ioa ampr1_ioa"
  apply (auto simp add:is_forward_sim_def)
   apply (simp add:init_defs sim_defs)
   apply (metis ref_proof_3.axioms(2) ref_proof_3_axioms ref_proof_3_axioms_def)
  apply (insert invs)
  apply (instantiate_invs)
  apply (rm_reachable)
  apply trans_cases
  subgoal premises prems for s s' t act a v (* Propose *)
  proof -
    let ?ef = "[(act, s'\<lparr>ampr1_state.propCmd := insert v (ampr1_state.propCmd s')\<rparr>)]"
    show ?thesis
      apply (intro exI[where ?x="?ef"])
      apply (intro conjI)
        prefer 3
        apply (force simp add:trace_match_def trace_def schedule_def externals_def
          filter_act_def ampr1_ioa_def r1.ioa_def paxos_asig_def Let_def is_trans_def
          r1.trans_def split!:if_splits)
       apply simp
      subgoal proof (cases "leader (acc.ballot (lstate s a)) = acc.id (lstate s a)")
        case False
        with prems(1,4) show ?thesis by (simp add:propose_def send_all_def fwd_sim_def propCmd_def)
      next
        case True thm prems
        have 1:"\<And> a . acc.ballot (lstate t a) = ballot s' a" using prems(1,4) True
          by (simp add:do_2a_def propose_def send_all_def fwd_sim_def Let_def propCmd_def)
        have 2:"network t = network s \<union> {Packet a2 (Phase2a (next_inst (lstate s a)) (acc.ballot (lstate s a)) v)
            | a2 . a2 \<noteq> a \<and> a2 \<in> acceptors (lstate s a)}"
          using prems(4,2) True
          by (fastforce simp add:do_2a_def propose_def send_all_def fwd_sim_def propCmd_def Let_def inv1_def) oops
        show ?thesis using 1 2 prems(1,2) apply (auto simp add:sim_defs inv1_def split!:msg.splits packet.splits)
              apply (metis ref_proof_3.axioms(2) ref_proof_3_axioms ref_proof_3_axioms_def)
             apply meson defer
          apply meson oops
end

end