/// <summary>
 /// Performs standard version validation.
 /// </summary>
 public static void CheckVersionInfo(ref ModelHeader header, VersionInfo ver)
 {
     Contracts.CheckDecode(header.ModelSignature == ver.ModelSignature, "Unknown file type");
     Contracts.CheckDecode(header.ModelVerReadable <= header.ModelVerWritten, "Corrupt file header");
     if (header.ModelVerReadable > ver.VerWrittenCur)
     {
         throw Contracts.ExceptDecode("Cause: ML.NET {0} cannont read component '{1}' of the model, because the model is too new.\n" +
                                      "Suggestion: Make sure the model is trained with ML.NET {0} or older.\n" +
                                      "Debug details: Maximum expected version {2}, got {3}.",
                                      typeof(VersionInfo).Assembly.GetName().Version, ver.LoaderSignature, header.ModelVerReadable, ver.VerWrittenCur);
     }
     if (header.ModelVerWritten < ver.VerWeCanReadBack)
     {
         // Breaking backwards compatibility is something we should avoid if at all possible. If
         // this message is observed, it may be a bug.
         throw Contracts.ExceptDecode("Cause: ML.NET {0} cannot read component '{1}' of the model, because the model is too old.\n" +
                                      "Suggestion: Make sure the model is trained with ML.NET {0}.\n" +
                                      "Debug details: Minimum expected version {2}, got {3}.",
                                      typeof(VersionInfo).Assembly.GetName().Version, ver.LoaderSignature, header.ModelVerReadable, ver.VerWrittenCur);
     }
 }