overridedef consolidate_delay: Time = session_options.seconds("headless_consolidate_delay") overridedef prune_delay: Time = session_options.seconds("headless_prune_delay")
def default_check_delay: Time = session_options.seconds("headless_check_delay") def default_check_limit: Int = session_options.int("headless_check_limit") def default_nodes_status_delay: Time = session_options.seconds("headless_nodes_status_delay") def default_watchdog_timeout: Time = session_options.seconds("headless_watchdog_timeout") def default_commit_cleanup_delay: Time = session_options.seconds("headless_commit_cleanup_delay")
val consumer = { val delay_nodes_status =
Delay.first(nodes_status_delay max Time.zero) { val st = use_theories_state.value val now = progress.now()
progress.nodes_status(
Progress.Nodes_Status(now, st.dep_graph.topological_order, st.nodes_status))
}
val delay_commit_clean =
Delay.first(commit_cleanup_delay max Time.zero) { val clean_theories = use_theories_state.change_result(_.clean_theories) if (clean_theories.nonEmpty && session.is_ready) {
progress.echo("Removing " + clean_theories.length + " theories ...")
resources.clean_theories(session, id, clean_theories)
}
}
isabelle.Session.Consumer[isabelle.Session.Commands_Changed](getClass.getName) { changed => val state = session.get_state()
state.stable_tip_version match { case None => use_theories_state.change(apply_changed) case Some(version) => val theory_progress =
use_theories_state.change_result { st => val changed_st = apply_changed(st)
val domain = if (st.nodes_status.is_empty) dep_theories_set else changed_st.changed_nodes
val (nodes_status_changed, st1) =
st.reset_changed.nodes_status_update(state, version,
domain = Some(domain), trim = changed_st.changed_assignment)
if (nodes_status_delay >= Time.zero && nodes_status_changed) {
delay_nodes_status.invoke()
}
val theory_progress =
(for {
name <- st1.dep_graph.topological_order.iterator
node_status = st1.nodes_status(name) if !node_status.is_empty && changed_st.changed_nodes(name) &&
!st.already_committed.isDefinedAt(name)
p1 = node_status.percentage if p1 > 0 && !st.nodes_status.get(name).map(_.percentage).contains(p1)
} yield Progress.Theory(name.theory, percentage = Some(p1))).toList
if (commit.isDefined && commit_cleanup_delay > Time.zero) { if (st1.finished_result) delay_commit_clean.revoke() else delay_commit_clean.invoke()
}
finalclass Theory private[Headless]( val node_name: Document.Node.Name, val node_header: Document.Node.Header, val text: String, val node_required: Boolean
) { overridedef toString: String = node_name.toString
def update_theories(update: List[Theory]): State =
copy(theories =
update.foldLeft(theories) { case (thys, thy) =>
thys.get(thy.node_name) match { case Some(thy1) if thy1 == thy => thys case _ => thys + (thy.node_name -> thy)
}
})
def remove_theories(remove: List[Document.Node.Name]): State = {
require(remove.forall(name => !is_required(name)), "attempt to remove required nodes")
copy(theories = theories -- remove)
}
def unload_theories(
id: UUID.T,
theories: List[Document.Node.Name]
) : (List[Document.Edit_Text], State) = { val st1 = remove_required(id, theories) val theory_edits = for {
node_name <- theories
theory <- st1.theories.get(node_name)
} yield { val theory1 = theory.set_required(st1.is_required(node_name)) val edits = theory1.node_edits(Some(theory))
(theory1, edits)
}
(theory_edits.flatMap(_._2), st1.update_theories(theory_edits.map(_._1)))
}
def purge_theories(
nodes: Option[List[Document.Node.Name]]
) : ((List[Document.Node.Name], List[Document.Node.Name], List[Document.Edit_Text]), State) = { val all_nodes = theory_graph.topological_order val purge = nodes.getOrElse(all_nodes).filterNot(is_required).toSet
val retain = theory_graph.all_preds(all_nodes.filterNot(purge)).toSet val (retained, purged) = all_nodes.partition(retain) val purge_edits = purged.flatMap(name => theories(name).purge_edits)
privateval state = Synchronized(Resources.State())
def load_theories(
session: Session,
id: UUID.T,
theories: List[Document.Node.Name],
files: List[Document.Node.Name],
unicode_symbols: Boolean,
progress: Progress
): Unit = { val loaded_theories = for (node_name <- theories) yield { val path = node_name.path if (!node_name.is_theory) error("Not a theory file: " + path)
progress.expose_interrupt() val text = Symbol.output(unicode_symbols, File.read(path)) val node_header = resources.check_thy(node_name, Scan.char_reader(text)) new Resources.Theory(node_name, node_header, text, true)
}
val loaded = loaded_theories.length if (loaded > 1) progress.echo("Loading " + loaded + " theories ...")
state.change { st => val (doc_blobs1, st1) = st.insert_required(id, theories).update_blobs(files) val theory_edits = for (theory <- loaded_theories) yield { val node_name = theory.node_name val old_theory = st.theories.get(node_name) val theory1 = theory.set_required(st1.is_required(node_name)) val edits = theory1.node_edits(old_theory)
(theory1, edits)
} val file_edits = for { node_name <- files if doc_blobs1.changed(node_name) } yield st1.blob_edits(node_name, st.blobs.get(node_name))
¤ Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.0.18Bemerkung:
(vorverarbeitet)
¤
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung ist noch experimentell.