Parcoursup / Calcul de l'ordre d'appel des candidats index


module VerificationResultatsAlgoOrdreAppelP2
  [@java:package:fr.parcoursup.whyml.verification]
  [@java:visibility:package]

  use int.Int
  use mach.java.lang.Integer
  use mach.java.util.UnmodifiableList

  use fr.parcoursup.whyml.ordreappel.algo.voeu_classe.VoeuClasse
  use fr.parcoursup.whyml.ordreappel.algo.groupe_classement_valide.GroupeClassementValide
  use proofs.ordre_appel.properties.rv_p2.RuntimeVerificationSpecP2 as P2
  use fr.parcoursup.whyml.exceptions.invalid_argument_exception.InvalidArgumentException
  use fr.parcoursup.whyml.exceptions.verification_exception.VerificationException
  use fr.parcoursup.whyml.exceptions.verification_exception_message.VerificationExceptionMessage

   (*
    Verif de P2: Un candidat à la fois boursier et du secteur
    (ou dans un groupe sans taux de candidats du secteur)
    qui a le rang r dans le classement pédagogique 
    n’est jamais doublé par personne et aura donc un rang inférieur 
    ou égal à r dans l’ordre d’appel. 

    https://framagit.org/parcoursup/algorithmes-de-parcoursup/-/blob/master/src/main/java/fr/parcoursup/algos/verification/VerificationsResultatsAlgoOrdreAppel.java
   *)

  let verifier (grp : GroupeClassementValide.t) : unit
    requires { groupe_ok grp }
    ensures { P2.spec grp }
    raises { VerificationException.E _ -> not (P2.spec grp) }
  =
    let oa = get_ordre_appel_list grp in
    let nb_voeux = get_nb_voeux_classes grp in
    let tx_sect = get_taux_min_du_secteur_pourcents grp in
    try begin
      for iv1 = 0 to nb_voeux - 1 do
        invariant { [@expl:inv P2a] forall k. 0 <= k < iv1 -> P2.p2a_loc oa tx_sect k }
        invariant { [@expl:inv P2b] forall k. 0 <= k < iv1 -> P2.p2b_loc oa tx_sect k }

        let v1 = UL.get oa iv1 in
        if est_boursier v1 && (tx_sect = 0 || est_du_secteur v1) then
        begin
          if get_rang_appel v1 > get_rang v1 then
          begin
            assert {[@expl:P2a nok] not (P2.p2a_loc oa tx_sect iv1) };
            raise VerificationException.E (crtX2
              VerificationExceptionMessage.VERIFICATION_RESULTATS_ALGO_ORDRE_APPEL_BOURSIER_DU_SECTEUR_DECROIT
                (get_g_cn_cod v1) (get_c_gp_cod grp));
          end;

          for iv2 = 0 to iv1 - 1 do
            invariant { forall k. 0 <= k < iv2 -> P2.p2b_aux oa iv1 k }
            let v2 = UL.get oa iv2 in
            if get_rang v2 > get_rang v1 && get_rang_appel v2 < get_rang_appel v1 then
            begin
              assert { [@expl:P2b nok] not (P2.p2b_aux oa iv1 iv2) };
              assert { [@expl:P2b nok] not (P2.p2b_loc oa tx_sect iv1) };
              raise VerificationException.E (crtX3 VERIFICATION_RESULTATS_ALGO_ORDRE_APPEL_BOURSIER_DU_SECTEUR_DEPASSE
                (get_g_cn_cod v1) (get_g_cn_cod v2) (get_c_gp_cod grp));
            end;
          done
        end
      done
    end with
    | InvalidArgumentException.E _ -> absurd
    | IndexOutOfBoundsException.E _ -> absurd
    end
end

(* generated on Thu Nov 21 02:04:27 UTC 2024 from rev:  *)

Generated by why3doc 1.7.2+git