educationai
Package Swift pour les apps d'étude : répétition espacée FSRS-6, file d'étude, comparaison des réponses saisies et quiz.
Licence: MIT
Résumé
- Logique d'apprentissage pour les apps de flashcards : répétition espacée FSRS-6, file d'étude, notation des réponses saisies et quiz.
- Les tests rejouent 2 400 révisions issues de py-fsrs 6.3.2 sur huit configurations et comparent les résultats après chaque révision.
- SM2Scheduler garde les données SM-2 utilisables et convertit les cartes SM-2 en FSRS en conservant la date d'échéance de chaque carte.
- Il s'exécute sur l'appareil avec Foundation uniquement, vise la strict concurrency de Swift 6 et ne contient aucun réseau de neurones.
- 124 tests répartis en 11 suites sont passés au tag v2.0.0 avec Swift 6.4 sur macOS 27.0.1.
EducationAI porte la logique d'apprentissage d'une app de flashcards ou d'étude. FSRSScheduler décide quand chaque carte revient grâce à FSRS-6, le modèle de mémoire derrière le planificateur FSRS d'Anki, et ses tests comparent 2 400 révisions à l'implémentation de référence, py-fsrs 6.3.2. SM2Scheduler maintient les données SM-2 en état de marche et les convertit en FSRS. Autour du planificateur se trouvent une file d'étude, la notation des réponses saisies avec tolérance aux fautes de frappe, des quiz, un ajusteur de difficulté, une prévision de charge de travail, des statistiques de révision et des séries d'étude. Il s'exécute sur l'appareil, n'utilise que Foundation et est écrit pour Swift 6 strict concurrency. Il ne contient aucun réseau de neurones : FSRS est un modèle statistique de la mémoire.
Fonctionnalités
- FSRS-6 vérifié par rapport à la référence : les tests rejouent 2 400 révisions calculées par py-fsrs 6.3.2 sur huit configurations et comparent stabilité, difficulté, échéance et récupérabilité après chaque révision
- Étapes d'apprentissage et de réapprentissage, rétention souhaitée, intervalle maximal, fuzz d'intervalle et poids personnalisés (21 de FSRS-6 ou 19 de FSRS-5) ; un aperçu des quatre évaluations pour les boutons de réponse
- SM-2 tel que publié, et une conversion des cartes SM-2 en FSRS qui conserve l'échéance de chaque carte
- Notation des réponses saisies qui ignore la casse, les accents, la largeur des caractères et la ponctuation sans dépendre de la langue de l'appareil, pardonne les fautes de frappe selon la longueur de la réponse et fournit un travail borné face à des entrées hostiles
- Quiz à choix multiples et à réponse saisie construits à partir des cartes ; chaque résultat suggère une évaluation pour le planificateur, et un quiz enregistré est noté à nouveau lorsqu'il est chargé
- Une file d'étude avec limites quotidiennes, une prévision par jour, des statistiques de rétention, des séries comptées en jours calendaires de l'apprenant et un ajusteur de difficulté qui maintient la précision dans une plage cible
- Types valeur Sendable et Codable : chaque fonction reçoit la date avec laquelle elle travaille, l'aléatoire provient d'un générateur que vous pouvez initialiser avec une graine, et les valeurs stockées sont vérifiées avant usage au lieu de provoquer un plantage
- Aucune dépendance, uniquement Foundation ; référence DocC avec quatre guides et l'app d'exemple StudyDeck pour iOS et macOS
Démarrage rapide
1struct FlashcardsView: View {2 @State private var cards = [3 Flashcard(front: "Capital of Japan", back: "Tokyo"),4 Flashcard(front: "Capital of Kenya", back: "Nairobi"),5 Flashcard(front: "Capital of Peru", back: "Lima")6 ]7 @State private var showsAnswer = false8 private let scheduler = FSRSScheduler.default9 10 var body: some View {11 if let card = StudyQueue.cards(from: cards).first,12 let index = cards.firstIndex(where: { $0.id == card.id }) {13 VStack(spacing: 24) {14 Text(card.front).font(.title)15 if showsAnswer {16 Text(card.back).font(.title2).bold()17 HStack {18 ForEach(Rating.allCases, id: \.self) { rating in19 Button(String(describing: rating).capitalized) {20 if let outcome = try? scheduler.review(card.review, rating: rating) {21 cards[index].review = outcome.state22 }23 showsAnswer = false24 }25 .buttonStyle(.bordered)26 }27 }28 } else {29 Button("Show Answer") { showsAnswer = true }30 .buttonStyle(.borderedProminent)31 }32 }33 .padding()34 } else {35 Text("All done for now")36 }37 }38}Installation
Xcode (File › Add Package Dependencies…)
1https://github.com/muhittincamdali/educationai.gitSwift Package Manager (Package.swift)
1dependencies: [2 .package(url: "https://github.com/muhittincamdali/educationai.git", from: "2.0.0")3],4targets: [5 .target(name: "YourApp", dependencies: [6 .product(name: "EducationAI", package: "educationai")7 ])8]Captures d'écran




Chronologie
Dépôt ouvert ; 1.0.0 étiquetée le 7 août : une classe EducationAI avec des modèles d'apprentissage, dépendant d'Alamofire, RxSwift, SnapKit et SDWebImage
Réécrit sans dépendances sous forme de planificateur SM-2 et de moteurs de quiz, de progression, de recommandation et de ludification
Une dépendance vers un dossier local (../SwiftAI) et des types fictifs « neural tutor » et « enterprise » ont été ajoutés ; le package ne se résolvait plus pour personne d'autre
2.0.0 : reconstruit autour d'un planificateur FSRS-6 conforme à py-fsrs 6.3.2 ; le code de juin et tous les types de la 1.x supprimés