Fix "local variable referenced before assignment" in Python

local variable 'result' referenced before assignment python

Introduction

If you're a Python developer, you've probably come across a variety of errors, like the "local variable referenced before assignment" error. This error can be a bit puzzling, especially for beginners and when it involves local/global variables.

Today, we'll explain this error, understand why it occurs, and see how you can fix it.

The "local variable referenced before assignment" Error

The "local variable referenced before assignment" error in Python is a common error that occurs when a local variable is referenced before it has been assigned a value. This error is a type of UnboundLocalError , which is raised when a local variable is referenced before it has been assigned in the local scope.

Here's a simple example:

Running this code will throw the "local variable 'x' referenced before assignment" error. This is because the variable x is referenced in the print(x) statement before it is assigned a value in the local scope of the foo function.

Even more confusing is when it involves global variables. For example, the following code also produces the error:

But wait, why does this also produce the error? Isn't x assigned before it's used in the say_hello function? The problem here is that x is a global variable when assigned "Hello ". However, in the say_hello function, it's a different local variable, which has not yet been assigned.

We'll see later in this Byte how you can fix these cases as well.

Fixing the Error: Initialization

One way to fix this error is to initialize the variable before using it. This ensures that the variable exists in the local scope before it is referenced.

Let's correct the error from our first example:

In this revised code, we initialize x with a value of 1 before printing it. Now, when you run the function, it will print 1 without any errors.

Fixing the Error: Global Keyword

Another way to fix this error, depending on your specific scenario, is by using the global keyword. This is especially useful when you want to use a global variable inside a function.

No spam ever. Unsubscribe anytime. Read our Privacy Policy.

Here's how:

In this snippet, we declare x as a global variable inside the function foo . This tells Python to look for x in the global scope, not the local one . Now, when you run the function, it will increment the global x by 1 and print 1 .

Similar Error: NameError

An error that's similar to the "local variable referenced before assignment" error is the NameError . This is raised when you try to use a variable or a function name that has not been defined yet.

Running this code will result in a NameError :

In this case, we're trying to print the value of y , but y has not been defined anywhere in the code. Hence, Python raises a NameError . This is similar in that we are trying to use an uninitialized/undefined variable, but the main difference is that we didn't try to initialize y anywhere else in our code.

Variable Scope in Python

Understanding the concept of variable scope can help avoid many common errors in Python, including the main error of interest in this Byte. But what exactly is variable scope?

In Python, variables have two types of scope - global and local. A variable declared inside a function is known as a local variable, while a variable declared outside a function is a global variable.

Consider this example:

In this code, x is a global variable, and y is a local variable. x can be accessed anywhere in the code, but y can only be accessed within my_function . Confusion surrounding this is one of the most common causes for the "variable referenced before assignment" error.

In this Byte, we've taken a look at the "local variable referenced before assignment" error and another similar error, NameError . We also delved into the concept of variable scope in Python, which is an important concept to understand to avoid these errors. If you're seeing one of these errors, check the scope of your variables and make sure they're being assigned before they're being used.

local variable 'result' referenced before assignment python

Building Your First Convolutional Neural Network With Keras

Most resources start with pristine datasets, start at importing and finish at validation. There's much more to know. Why was a class predicted? Where was...

David Landup

© 2013- 2024 Stack Abuse. All rights reserved.

Local variable referenced before assignment in Python

avatar

Last updated: Apr 8, 2024 Reading time · 4 min

banner

# Local variable referenced before assignment in Python

The Python "UnboundLocalError: Local variable referenced before assignment" occurs when we reference a local variable before assigning a value to it in a function.

To solve the error, mark the variable as global in the function definition, e.g. global my_var .

unboundlocalerror local variable name referenced before assignment

Here is an example of how the error occurs.

We assign a value to the name variable in the function.

# Mark the variable as global to solve the error

To solve the error, mark the variable as global in your function definition.

mark variable as global

If a variable is assigned a value in a function's body, it is a local variable unless explicitly declared as global .

# Local variables shadow global ones with the same name

You could reference the global name variable from inside the function but if you assign a value to the variable in the function's body, the local variable shadows the global one.

accessing global variables in functions

Accessing the name variable in the function is perfectly fine.

On the other hand, variables declared in a function cannot be accessed from the global scope.

variables declared in function cannot be accessed in global scope

The name variable is declared in the function, so trying to access it from outside causes an error.

Make sure you don't try to access the variable before using the global keyword, otherwise, you'd get the SyntaxError: name 'X' is used prior to global declaration error.

# Returning a value from the function instead

An alternative solution to using the global keyword is to return a value from the function and use the value to reassign the global variable.

return value from the function

We simply return the value that we eventually use to assign to the name global variable.

# Passing the global variable as an argument to the function

You should also consider passing the global variable as an argument to the function.

pass global variable as argument to function

We passed the name global variable as an argument to the function.

If we assign a value to a variable in a function, the variable is assumed to be local unless explicitly declared as global .

# Assigning a value to a local variable from an outer scope

If you have a nested function and are trying to assign a value to the local variables from the outer function, use the nonlocal keyword.

assign value to local variable from outer scope

The nonlocal keyword allows us to work with the local variables of enclosing functions.

Had we not used the nonlocal statement, the call to the print() function would have returned an empty string.

not using nonlocal prints empty string

Printing the message variable on the last line of the function shows an empty string because the inner() function has its own scope.

Changing the value of the variable in the inner scope is not possible unless we use the nonlocal keyword.

Instead, the message variable in the inner function simply shadows the variable with the same name from the outer scope.

# Discussion

As shown in this section of the documentation, when you assign a value to a variable inside a function, the variable:

  • Becomes local to the scope.
  • Shadows any variables from the outer scope that have the same name.

The last line in the example function assigns a value to the name variable, marking it as a local variable and shadowing the name variable from the outer scope.

At the time the print(name) line runs, the name variable is not yet initialized, which causes the error.

The most intuitive way to solve the error is to use the global keyword.

The global keyword is used to indicate to Python that we are actually modifying the value of the name variable from the outer scope.

  • If a variable is only referenced inside a function, it is implicitly global.
  • If a variable is assigned a value inside a function's body, it is assumed to be local, unless explicitly marked as global .

If you want to read more about why this error occurs, check out [this section] ( this section ) of the docs.

# Additional Resources

You can learn more about the related topics by checking out the following tutorials:

  • SyntaxError: name 'X' is used prior to global declaration

book cover

Borislav Hadzhiev

Web Developer

buy me a coffee

Copyright © 2024 Borislav Hadzhiev

local variable 'result' referenced before assignment python

Explore your training options in 10 minutes Get Started

  • Graduate Stories
  • Partner Spotlights
  • Bootcamp Prep
  • Bootcamp Admissions
  • University Bootcamps
  • Coding Tools
  • Software Engineering
  • Web Development
  • Data Science
  • Tech Guides
  • Tech Resources
  • Career Advice
  • Online Learning
  • Internships
  • Apprenticeships
  • Tech Salaries
  • Associate Degree
  • Bachelor's Degree
  • Master's Degree
  • University Admissions
  • Best Schools
  • Certifications
  • Bootcamp Financing
  • Higher Ed Financing
  • Scholarships
  • Financial Aid
  • Best Coding Bootcamps
  • Best Online Bootcamps
  • Best Web Design Bootcamps
  • Best Data Science Bootcamps
  • Best Technology Sales Bootcamps
  • Best Data Analytics Bootcamps
  • Best Cybersecurity Bootcamps
  • Best Digital Marketing Bootcamps
  • Los Angeles
  • San Francisco
  • Browse All Locations
  • Digital Marketing
  • Machine Learning
  • See All Subjects
  • Bootcamps 101
  • Full-Stack Development
  • Career Changes
  • View all Career Discussions
  • Mobile App Development
  • Cybersecurity
  • Product Management
  • UX/UI Design
  • What is a Coding Bootcamp?
  • Are Coding Bootcamps Worth It?
  • How to Choose a Coding Bootcamp
  • Best Online Coding Bootcamps and Courses
  • Best Free Bootcamps and Coding Training
  • Coding Bootcamp vs. Community College
  • Coding Bootcamp vs. Self-Learning
  • Bootcamps vs. Certifications: Compared
  • What Is a Coding Bootcamp Job Guarantee?
  • How to Pay for Coding Bootcamp
  • Ultimate Guide to Coding Bootcamp Loans
  • Best Coding Bootcamp Scholarships and Grants
  • Education Stipends for Coding Bootcamps
  • Get Your Coding Bootcamp Sponsored by Your Employer
  • GI Bill and Coding Bootcamps
  • Tech Intevriews
  • Our Enterprise Solution
  • Connect With Us
  • Publication
  • Reskill America
  • Partner With Us

Career Karma

  • Resource Center
  • Bachelor’s Degree
  • Master’s Degree

Python local variable referenced before assignment Solution

When you start introducing functions into your code, you’re bound to encounter an UnboundLocalError at some point. This error is raised when you try to use a variable before it has been assigned in the local context .

In this guide, we talk about what this error means and why it is raised. We walk through an example of this error in action to help you understand how you can solve it.

Find your bootcamp match

What is unboundlocalerror: local variable referenced before assignment.

Trying to assign a value to a variable that does not have local scope can result in this error:

Python has a simple rule to determine the scope of a variable. If a variable is assigned in a function , that variable is local. This is because it is assumed that when you define a variable inside a function you only need to access it inside that function.

There are two variable scopes in Python: local and global. Global variables are accessible throughout an entire program; local variables are only accessible within the function in which they are originally defined.

Let’s take a look at how to solve this error.

An Example Scenario

We’re going to write a program that calculates the grade a student has earned in class.

We start by declaring two variables:

These variables store the numerical and letter grades a student has earned, respectively. By default, the value of “letter” is “F”. Next, we write a function that calculates a student’s letter grade based on their numerical grade using an “if” statement :

Finally, we call our function:

This line of code prints out the value returned by the calculate_grade() function to the console. We pass through one parameter into our function: numerical. This is the numerical value of the grade a student has earned.

Let’s run our code and see what happens:

An error has been raised.

The Solution

Our code returns an error because we reference “letter” before we assign it.

We have set the value of “numerical” to 42. Our if statement does not set a value for any grade over 50. This means that when we call our calculate_grade() function, our return statement does not know the value to which we are referring.

We do define “letter” at the start of our program. However, we define it in the global context. Python treats “return letter” as trying to return a local variable called “letter”, not a global variable.

We solve this problem in two ways. First, we can add an else statement to our code. This ensures we declare “letter” before we try to return it:

Let’s try to run our code again:

Our code successfully prints out the student’s grade.

If you are using an “if” statement where you declare a variable, you should make sure there is an “else” statement in place. This will make sure that even if none of your if statements evaluate to True, you can still set a value for the variable with which you are going to work.

Alternatively, we could use the “global” keyword to make our global keyword available in the local context in our calculate_grade() function. However, this approach is likely to lead to more confusing code and other issues. In general, variables should not be declared using “global” unless absolutely necessary . Your first, and main, port of call should always be to make sure that a variable is correctly defined.

In the example above, for instance, we did not check that the variable “letter” was defined in all use cases.

That’s it! We have fixed the local variable error in our code.

The UnboundLocalError: local variable referenced before assignment error is raised when you try to assign a value to a local variable before it has been declared. You can solve this error by ensuring that a local variable is declared before you assign it a value.

Now you’re ready to solve UnboundLocalError Python errors like a professional developer !

About us: Career Karma is a platform designed to help job seekers find, research, and connect with job training programs to advance their careers. Learn about the CK publication .

What's Next?

icon_10

Get matched with top bootcamps

Ask a question to our community, take our careers quiz.

James Gallagher

Leave a Reply Cancel reply

Your email address will not be published. Required fields are marked *

Apply to top tech training programs in one click

[SOLVED] Local Variable Referenced Before Assignment

local variable referenced before assignment

Python treats variables referenced only inside a function as global variables. Any variable assigned to a function’s body is assumed to be a local variable unless explicitly declared as global.

Why Does This Error Occur?

Unboundlocalerror: local variable referenced before assignment occurs when a variable is used before its created. Python does not have the concept of variable declarations. Hence it searches for the variable whenever used. When not found, it throws the error.

Before we hop into the solutions, let’s have a look at what is the global and local variables.

Local Variable Declarations vs. Global Variable Declarations

[Fixed] typeerror can’t compare datetime.datetime to datetime.date

Local Variable Referenced Before Assignment Error with Explanation

Try these examples yourself using our Online Compiler.

Let’s look at the following function:

Local Variable Referenced Before Assignment Error

Explanation

The variable myVar has been assigned a value twice. Once before the declaration of myFunction and within myFunction itself.

Using Global Variables

Passing the variable as global allows the function to recognize the variable outside the function.

Create Functions that Take in Parameters

Instead of initializing myVar as a global or local variable, it can be passed to the function as a parameter. This removes the need to create a variable in memory.

UnboundLocalError: local variable ‘DISTRO_NAME’

This error may occur when trying to launch the Anaconda Navigator in Linux Systems.

Upon launching Anaconda Navigator, the opening screen freezes and doesn’t proceed to load.

Try and update your Anaconda Navigator with the following command.

If solution one doesn’t work, you have to edit a file located at

After finding and opening the Python file, make the following changes:

In the function on line 159, simply add the line:

DISTRO_NAME = None

Save the file and re-launch Anaconda Navigator.

DJANGO – Local Variable Referenced Before Assignment [Form]

The program takes information from a form filled out by a user. Accordingly, an email is sent using the information.

Upon running you get the following error:

We have created a class myForm that creates instances of Django forms. It extracts the user’s name, email, and message to be sent.

A function GetContact is created to use the information from the Django form and produce an email. It takes one request parameter. Prior to sending the email, the function verifies the validity of the form. Upon True , .get() function is passed to fetch the name, email, and message. Finally, the email sent via the send_mail function

Why does the error occur?

We are initializing form under the if request.method == “POST” condition statement. Using the GET request, our variable form doesn’t get defined.

Local variable Referenced before assignment but it is global

This is a common error that happens when we don’t provide a value to a variable and reference it. This can happen with local variables. Global variables can’t be assigned.

This error message is raised when a variable is referenced before it has been assigned a value within the local scope of a function, even though it is a global variable.

Here’s an example to help illustrate the problem:

In this example, x is a global variable that is defined outside of the function my_func(). However, when we try to print the value of x inside the function, we get a UnboundLocalError with the message “local variable ‘x’ referenced before assignment”.

This is because the += operator implicitly creates a local variable within the function’s scope, which shadows the global variable of the same name. Since we’re trying to access the value of x before it’s been assigned a value within the local scope, the interpreter raises an error.

To fix this, you can use the global keyword to explicitly refer to the global variable within the function’s scope:

However, in the above example, the global keyword tells Python that we want to modify the value of the global variable x, rather than creating a new local variable. This allows us to access and modify the global variable within the function’s scope, without causing any errors.

Local variable ‘version’ referenced before assignment ubuntu-drivers

This error occurs with Ubuntu version drivers. To solve this error, you can re-specify the version information and give a split as 2 –

Here, p_name means package name.

With the help of the threading module, you can avoid using global variables in multi-threading. Make sure you lock and release your threads correctly to avoid the race condition.

When a variable that is created locally is called before assigning, it results in Unbound Local Error in Python. The interpreter can’t track the variable.

Therefore, we have examined the local variable referenced before the assignment Exception in Python. The differences between a local and global variable declaration have been explained, and multiple solutions regarding the issue have been provided.

Trending Python Articles

[Fixed] nameerror: name Unicode is not defined

How to fix UnboundLocalError: local variable 'x' referenced before assignment in Python

by Nathan Sebhastian

Posted on May 26, 2023

Reading time: 2 minutes

local variable 'result' referenced before assignment python

One error you might encounter when running Python code is:

This error commonly occurs when you reference a variable inside a function without first assigning it a value.

You could also see this error when you forget to pass the variable as an argument to your function.

Let me show you an example that causes this error and how I fix it in practice.

How to reproduce this error

Suppose you have a variable called name declared in your Python code as follows:

Next, you created a function that uses the name variable as shown below:

When you execute the code above, you’ll get this error:

This error occurs because you both assign and reference a variable called name inside the function.

Python thinks you’re trying to assign the local variable name to name , which is not the case here because the original name variable we declared is a global variable.

How to fix this error

To resolve this error, you can change the variable’s name inside the function to something else. For example, name_with_title should work:

As an alternative, you can specify a name parameter in the greet() function to indicate that you require a variable to be passed to the function.

When calling the function, you need to pass a variable as follows:

This code allows Python to know that you intend to use the name variable which is passed as an argument to the function as part of the newly declared name variable.

Still, I would say that you need to use a different name when declaring a variable inside the function. Using the same name might confuse you in the future.

Here’s the best solution to the error:

Now it’s clear that we’re using the name variable given to the function as part of the value assigned to name_with_title . Way to go!

The UnboundLocalError: local variable 'x' referenced before assignment occurs when you reference a variable inside a function before declaring that variable.

To resolve this error, you need to use a different variable name when referencing the existing variable, or you can also specify a parameter for the function.

I hope this tutorial is useful. See you in other tutorials.

Take your skills to the next level ⚡️

I'm sending out an occasional email with the latest tutorials on programming, web development, and statistics. Drop your email in the box below and I'll send new stuff straight into your inbox!

Hello! This website is dedicated to help you learn tech and data science skills with its step-by-step, beginner-friendly tutorials. Learn statistics, JavaScript and other programming languages using clear examples written for people.

Learn more about this website

Connect with me on Twitter

Or LinkedIn

Type the keyword below and hit enter

Click to see all tutorials tagged with:

Local variable referenced before assignment in Python

The “local variable referenced before assignment” error occurs in Python when you try to use a local variable before it has been assigned a value.

This error typically arises in situations where you declare a variable within a function but then try to access or modify it before actually assigning a value to it.

Here’s an example to illustrate this error:

In this example, you would encounter the “local variable ‘x’ referenced before assignment” error because you’re trying to print the value of x before it has been assigned a value. To fix this, you should assign a value to x before attempting to access it:

In the corrected version, the local variable x is assigned a value before it’s used, preventing the error.

Keep in mind that Python treats variables inside functions as local unless explicitly stated otherwise using the global keyword (for global variables) or the nonlocal keyword (for variables in nested functions).

If you encounter this error and you’re sure that the variable should have been assigned a value before its use, double-check your code for any logical errors or typos that might be causing the variable to not be assigned properly.

Using the global keyword

If you have a global variable named letter and you try to modify it inside a function without declaring it as global, you will get error.

This is because Python assumes that any variable that is assigned a value inside a function is a local variable, unless you explicitly tell it otherwise.

To fix this error, you can use the global keyword to indicate that you want to use the global variable:

Using nonlocal keyword

The nonlocal keyword is used to work with variables inside nested functions, where the variable should not belong to the inner function. It allows you to modify the value of a non-local variable in the outer scope.

For example, if you have a function outer that defines a variable x , and another function inner inside outer that tries to change the value of x , you need to use the nonlocal keyword to tell Python that you are referring to the x defined in outer , not a new local variable in inner .

Here is an example of how to use the nonlocal keyword:

If you don’t use the nonlocal keyword, Python will create a new local variable x in inner , and the value of x in outer will not be changed:

You might also like

How to Solve Error - Local Variable Referenced Before Assignment in Python

  • Python How-To's
  • How to Solve Error - Local Variable …

Check the Variable Scope to Fix the local variable referenced before assignment Error in Python

Initialize the variable before use to fix the local variable referenced before assignment error in python, use conditional assignment to fix the local variable referenced before assignment error in python.

How to Solve Error - Local Variable Referenced Before Assignment in Python

This article delves into various strategies to resolve the common local variable referenced before assignment error. By exploring methods such as checking variable scope, initializing variables before use, conditional assignments, and more, we aim to equip both novice and seasoned programmers with practical solutions.

Each method is dissected with examples, demonstrating how subtle changes in code can prevent this frequent error, enhancing the robustness and readability of your Python projects.

The local variable referenced before assignment occurs when some variable is referenced before assignment within a function’s body. The error usually occurs when the code is trying to access the global variable.

The primary purpose of managing variable scope is to ensure that variables are accessible where they are needed while maintaining code modularity and preventing unexpected modifications to global variables.

We can declare the variable as global using the global keyword in Python. Once the variable is declared global, the program can access the variable within a function, and no error will occur.

The below example code demonstrates the code scenario where the program will end up with the local variable referenced before assignment error.

In this example, my_var is a global variable. Inside update_var , we attempt to modify it without declaring its scope, leading to the Local Variable Referenced Before Assignment error.

We need to declare the my_var variable as global using the global keyword to resolve this error. The below example code demonstrates how the error can be resolved using the global keyword in the above code scenario.

In the corrected code, we use the global keyword to inform Python that my_var references the global variable.

When we first print my_var , it displays the original value from the global scope.

After assigning a new value to my_var , it updates the global variable, not a local one. This way, we effectively tell Python the scope of our variable, thus avoiding any conflicts between local and global variables with the same name.

python local variable referenced before assignment - output 1

Ensure that the variable is initialized with some value before using it. This can be done by assigning a default value to the variable at the beginning of the function or code block.

The main purpose of initializing variables before use is to ensure that they have a defined state before any operations are performed on them. This practice is not only crucial for avoiding the aforementioned error but also promotes writing clear and predictable code, which is essential in both simple scripts and complex applications.

In this example, the variable total is used in the function calculate_total without prior initialization, leading to the Local Variable Referenced Before Assignment error. The below example code demonstrates how the error can be resolved in the above code scenario.

In our corrected code, we initialize the variable total with 0 before using it in the loop. This ensures that when we start adding item values to total , it already has a defined state (in this case, 0).

This initialization is crucial because it provides a starting point for accumulation within the loop. Without this step, Python does not know the initial state of total , leading to the error.

python local variable referenced before assignment - output 2

Conditional assignment allows variables to be assigned values based on certain conditions or logical expressions. This method is particularly useful when a variable’s value depends on certain prerequisites or states, ensuring that a variable is always initialized before it’s used, thereby avoiding the common error.

In this example, message is only assigned within the if and elif blocks. If neither condition is met (as with guest ), the variable message remains uninitialized, leading to the Local Variable Referenced Before Assignment error when trying to print it.

The below example code demonstrates how the error can be resolved in the above code scenario.

In the revised code, we’ve included an else statement as part of our conditional logic. This guarantees that no matter what value user_type holds, the variable message will be assigned some value before it is used in the print function.

This conditional assignment ensures that the message is always initialized, thereby eliminating the possibility of encountering the Local Variable Referenced Before Assignment error.

python local variable referenced before assignment - output 3

Throughout this article, we have explored multiple approaches to address the Local Variable Referenced Before Assignment error in Python. From the nuances of variable scope to the effectiveness of initializations and conditional assignments, these strategies are instrumental in developing error-free code.

The key takeaway is the importance of understanding variable scope and initialization in Python. By applying these methods appropriately, programmers can not only resolve this specific error but also enhance the overall quality and maintainability of their code, making their programming journey smoother and more rewarding.

How to Fix Local Variable Referenced Before Assignment Error in Python

How to Fix Local Variable Referenced Before Assignment Error in Python

Table of Contents

Fixing local variable referenced before assignment error.

In Python , when you try to reference a variable that hasn't yet been given a value (assigned), it will throw an error.

That error will look like this:

In this post, we'll see examples of what causes this and how to fix it.

Let's begin by looking at an example of this error:

If you run this code, you'll get

The issue is that in this line:

We are defining a local variable called value and then trying to use it before it has been assigned a value, instead of using the variable that we defined in the first line.

If we want to refer the variable that was defined in the first line, we can make use of the global keyword.

The global keyword is used to refer to a variable that is defined outside of a function.

Let's look at how using global can fix our issue here:

Global variables have global scope, so you can referenced them anywhere in your code, thus avoiding the error.

If you run this code, you'll get this output:

In this post, we learned at how to avoid the local variable referenced before assignment error in Python.

The error stems from trying to refer to a variable without an assigned value, so either make use of a global variable using the global keyword, or assign the variable a value before using it.

Thanks for reading!

local variable 'result' referenced before assignment python

  • Privacy Policy
  • Terms of Service

local variable 'result' referenced before assignment python

Adventures in Machine Learning

4 ways to fix local variable referenced before assignment error in python, resolving the local variable referenced before assignment error in python.

Python is one of the world’s most popular programming languages due to its simplicity, readability, and versatility. Despite its many advantages, when coding in Python, one may encounter various errors, with the most common being the “local variable referenced before assignment” error.

Even the most experienced Python developers have encountered this error at some point in their programming career. In this article, we will look at four effective strategies for resolving the local variable referenced before assignment error in Python.

Strategy 1: Assigning a Value before Referencing

The first strategy is to assign a value to a variable before referencing it. The error occurs when the variable is referenced before it is assigned a value.

This problem can be avoided by initializing the variable before referencing it. For example, let us consider the snippet below:

“`python

add_numbers():

print(x + y)

add_numbers()

In the snippet above, the variables `x` and `y` are not assigned values before they are referenced in the `print` statement. Therefore, we will get a local variable “referenced before assignment” error.

To resolve this error, we must initialize the variables before referencing them. We can avoid this error by assigning a value to `x` and `y` before they are referenced, as shown below:

Strategy 2: Using the Global Keyword

In Python, variables declared inside a function are considered local variables. Thus, they are separate from other variables declared outside of the function.

If we want to use a variable outside of the function, we must use the global keyword. Using the global keyword tells Python that you want to use the variable that was defined globally, not locally.

For example:

In the code snippet above, the `global` keyword tells Python to use the variable `x` defined outside of the function rather than a local variable named `x`. Thus, Python will output 30.

Strategy 3: Adding Input Parameters for Functions

Another way to avoid the local variable referenced before assignment error is by adding input parameters to functions.

def add_numbers(x, y):

add_numbers(10, 20)

In the code snippet above, `x` and `y` are variables that are passed into the `add_numbers` function as arguments.

This approach allows us to avoid the local variable referenced before assignment error because the variables are being passed into the function as input parameters. Strategy 4: Initializing Variables before Loops or Conditionals

Finally, it’s also a good practice to initialize the variables before loops or conditionals.

If you are defining a variable within a loop, you must initialize it before the loop starts. This way, the variable already exists, and we can update the value inside the loop.

my_list = [1, 2, 3, 4, 5]

for number in my_list:

sum += number

In the code snippet above, the variable `sum` has been initialized with the value of 0 before the loop runs. Thus, we can update and use the variable inside the loop.

In conclusion, the “local variable referenced before assignment” error is a common issue in Python. However, with the strategies discussed in this article, you can avoid the error and write clean Python code.

Remember to initialize your variables, use the global keyword, add input parameters in functions, and initialize variables before loops or conditionals. By following these techniques, your Python code will be error-free and much easier to manage.

In essence, this article has provided four key strategies for resolving the “local variable referenced before assignment” error that is common in Python. These strategies include initializing variables before referencing, using the global keyword, adding input parameters to functions, and initializing variables before loops or conditionals.

These techniques help to ensure clean code that is free from errors. By implementing these strategies, developers can improve their code quality and avoid time-wasting errors that can occur in their work.

Popular Posts

Avoiding common python naming conflicts and errors, mastering the art of anti-joins in pandas: eliminating rows with ease, everything you need to know about sql server’s full outer join.

  • Terms & Conditions
  • Privacy Policy

The Research Scientist Pod

Python UnboundLocalError: local variable referenced before assignment

by Suf | Programming , Python , Tips

If you try to reference a local variable before assigning a value to it within the body of a function, you will encounter the UnboundLocalError: local variable referenced before assignment.

The preferable way to solve this error is to pass parameters to your function, for example:

Alternatively, you can declare the variable as global to access it while inside a function. For example,

This tutorial will go through the error in detail and how to solve it with code examples .

Table of contents

What is scope in python, unboundlocalerror: local variable referenced before assignment, solution #1: passing parameters to the function, solution #2: use global keyword, solution #1: include else statement, solution #2: use global keyword.

Scope refers to a variable being only available inside the region where it was created. A variable created inside a function belongs to the local scope of that function, and we can only use that variable inside that function.

A variable created in the main body of the Python code is a global variable and belongs to the global scope. Global variables are available within any scope, global and local.

UnboundLocalError occurs when we try to modify a variable defined as local before creating it. If we only need to read a variable within a function, we can do so without using the global keyword. Consider the following example that demonstrates a variable var created with global scope and accessed from test_func :

If we try to assign a value to var within test_func , the Python interpreter will raise the UnboundLocalError:

This error occurs because when we make an assignment to a variable in a scope, that variable becomes local to that scope and overrides any variable with the same name in the global or outer scope.

var +=1 is similar to var = var + 1 , therefore the Python interpreter should first read var , perform the addition and assign the value back to var .

var is a variable local to test_func , so the variable is read or referenced before we have assigned it. As a result, the Python interpreter raises the UnboundLocalError.

Example #1: Accessing a Local Variable

Let’s look at an example where we define a global variable number. We will use the increment_func to increase the numerical value of number by 1.

Let’s run the code to see what happens:

The error occurs because we tried to read a local variable before assigning a value to it.

We can solve this error by passing a parameter to increment_func . This solution is the preferred approach. Typically Python developers avoid declaring global variables unless they are necessary. Let’s look at the revised code:

We have assigned a value to number and passed it to the increment_func , which will resolve the UnboundLocalError. Let’s run the code to see the result:

We successfully printed the value to the console.

We also can solve this error by using the global keyword. The global statement tells the Python interpreter that inside increment_func , the variable number is a global variable even if we assign to it in increment_func . Let’s look at the revised code:

Let’s run the code to see the result:

Example #2: Function with if-elif statements

Let’s look at an example where we collect a score from a player of a game to rank their level of expertise. The variable we will use is called score and the calculate_level function takes in score as a parameter and returns a string containing the player’s level .

In the above code, we have a series of if-elif statements for assigning a string to the level variable. Let’s run the code to see what happens:

The error occurs because we input a score equal to 40 . The conditional statements in the function do not account for a value below 55 , therefore when we call the calculate_level function, Python will attempt to return level without any value assigned to it.

We can solve this error by completing the set of conditions with an else statement. The else statement will provide an assignment to level for all scores lower than 55 . Let’s look at the revised code:

In the above code, all scores below 55 are given the beginner level. Let’s run the code to see what happens:

We can also create a global variable level and then use the global keyword inside calculate_level . Using the global keyword will ensure that the variable is available in the local scope of the calculate_level function. Let’s look at the revised code.

In the above code, we put the global statement inside the function and at the beginning. Note that the “default” value of level is beginner and we do not include the else statement in the function. Let’s run the code to see the result:

Congratulations on reading to the end of this tutorial! The UnboundLocalError: local variable referenced before assignment occurs when you try to reference a local variable before assigning a value to it. Preferably, you can solve this error by passing parameters to your function. Alternatively, you can use the global keyword.

If you have if-elif statements in your code where you assign a value to a local variable and do not account for all outcomes, you may encounter this error. In which case, you must include an else statement to account for the missing outcome.

For further reading on Python code blocks and structure, go to the article: How to Solve Python IndentationError: unindent does not match any outer indentation level .

Go to the  online courses page on Python  to learn more about Python for data science and machine learning.

Have fun and happy researching!

Share this:

  • Click to share on Facebook (Opens in new window)
  • Click to share on LinkedIn (Opens in new window)
  • Click to share on Reddit (Opens in new window)
  • Click to share on Pinterest (Opens in new window)
  • Click to share on Telegram (Opens in new window)
  • Click to share on WhatsApp (Opens in new window)
  • Click to share on Twitter (Opens in new window)
  • Click to share on Tumblr (Opens in new window)

Fixing Python UnboundLocalError: Local Variable ‘x’ Accessed Before Assignment

Understanding unboundlocalerror.

The UnboundLocalError in Python occurs when a function tries to access a local variable before it has been assigned a value. Variables in Python have scope that defines their level of visibility throughout the code: global scope, local scope, and nonlocal (in nested functions) scope. This error typically surfaces when using a variable that has not been initialized in the current function’s scope or when an attempt is made to modify a global variable without proper declaration.

Solutions for the Problem

To fix an UnboundLocalError, you need to identify the scope of the problematic variable and ensure it is correctly used within that scope.

Method 1: Initializing the Variable

Make sure to initialize the variable within the function before using it. This is often the simplest fix.

Method 2: Using Global Variables

If you intend to use a global variable and modify its value within a function, you must declare it as global before you use it.

Method 3: Using Nonlocal Variables

If the variable is defined in an outer function and you want to modify it within a nested function, use the nonlocal keyword.

That’s it. Happy coding!

Next Article: Fixing Python TypeError: Descriptor 'lower' for 'str' Objects Doesn't Apply to 'dict' Object

Previous Article: Python TypeError: write() argument must be str, not bytes

Series: Common Errors in Python and How to Fix Them

Related Articles

  • Python Warning: Secure coding is not enabled for restorable state
  • 4 ways to install Python modules on Windows without admin rights
  • Python TypeError: object of type ‘NoneType’ has no len()
  • Python: How to access command-line arguments (3 approaches)
  • Understanding ‘Never’ type in Python 3.11+ (5 examples)
  • Python: 3 Ways to Retrieve City/Country from IP Address
  • Using Type Aliases in Python: A Practical Guide (with Examples)
  • Python: Defining distinct types using NewType class
  • Using Optional Type in Python (explained with examples)
  • Python: How to Override Methods in Classes
  • Python: Define Generic Types for Lists of Nested Dictionaries
  • Python: Defining type for a list that can contain both numbers and strings

Search tutorials, examples, and resources

  • PHP programming
  • Symfony & Doctrine
  • Laravel & Eloquent
  • Tailwind CSS
  • Sequelize.js
  • Mongoose.js

Consultancy

  • Technology Consulting
  • Customer Experience Consulting
  • Solution Architect Consulting

Software Development Services

  • Ecommerce Development
  • Web App Development
  • Mobile App Development
  • SAAS Product Development
  • Content Management System
  • System Integration & Data Migration
  • Cloud Computing
  • Computer Vision

Dedicated Development Team

  • Full Stack Developers For Hire
  • Offshore Development Center

Marketing & Creative Design

  • UX/UI Design
  • Customer Experience Optimization
  • Digital Marketing
  • Devops Services
  • Service Level Management
  • Security Services
  • Odoo gold partner

By Industry

  • Retail & Ecommerce
  • Manufacturing
  • Import & Distribution
  • Financical & Banking
  • Technology For Startups

Business Model

  • MARKETPLACE ECOMMERCE

Our realized projects

local variable 'result' referenced before assignment python

MB Securities - A Premier Brokerage

local variable 'result' referenced before assignment python

iONAH - A Pioneer in Consumer Electronics Industry

local variable 'result' referenced before assignment python

Emers Group - An Official Nike Distributing Agent

local variable 'result' referenced before assignment python

Academy Xi - An Australian-based EdTech Startup

  • Market insight

local variable 'result' referenced before assignment python

  • Ohio Digital
  • Onnet Consoulting

></center></p><h2>Local variable referenced before assignment: The UnboundLocalError in Python</h2><p>When you start introducing functions into your code, you’re bound to encounter an UnboundLocalError at some point. Because you try to use a local variable referenced before assignment. So, in this guide, we talk about what this error means and why it is raised. We walk through an example in action to help you understand how you can solve it.</p><p>Source: careerkarma</p><p><center><img style=

What is UnboundLocalError: local variable referenced before assignment?

Trying to assign a value to a variable that does not have local scope can result in this error:

Python has a simple rule to determine the scope of a variable. To clarify, a variable is assigned in a function, that variable is local. Because it is assumed that when you define a variable inside a function, you only need to access it inside that function.

There are two variable scopes in Python: local and global. Global variables are accessible throughout an entire program. Whereas, local variables are only accessible within the function in which they are originally defined.

An example of Local variable referenced before assignment

We’re going to write a program that calculates the grade a student has earned in class.

Firstly, we start by declaring two variables:

These variables store the numerical and letter grades a student has earned, respectively. By default, the value of “letter” is “F”. Then, we write a function that calculates a student’s letter grade based on their numerical grade using an “if” statement:

Finally, we call our function:

This line of code prints out the value returned by the  calculate_grade()  function to the console. We pass through one parameter into our function: numerical. This is the numerical value of the grade a student has earned.

Let’s run our code of Local variable referenced before assignment and see what happens:

Here is an error!

The Solution of Local variable referenced before assignment

The code returns an error: Unboundlocalerror local variable referenced before assignment because we reference “letter” before we assign it.

We have set the value of “numerical” to 42. Our  if  statement does not set a value for any grade over 50. This means that when we call our  calculate_grade()  function, our return statement does not know the value to which we are referring.

Moreover, we do define “letter” at the start of our program. However, we define it in the global context. Because Python treats “return letter” as trying to return a local variable called “letter”, not a global variable.

Therefore, this problem of variable referenced before assignment could be solved in two ways. Firstly, we can add an  else  statement to our code. This ensures we declare “letter” before we try to return it:

Let’s try to run our code again:

Our code successfully prints out the student’s grade. This approach is good because it lets us keep “letter” in the local context. To clarify, we could even remove the “letter = “F”” statement from the top of our code because we do not use it in the global context.

Alternatively, we could use the “global” keyword to make our global keyword available in the local context in our  calculate_grade()  function:

We use the “global” keyword at the start of our function.

This keyword changes the scope of our variable to a global variable. This means the “return” statement will no longer treat “letter” like a local variable. Let’s run our code. Our code returns: F.

The code works successfully! Let’s try it using a different grade number by setting the value of “numerical” to a new number:

Our code returns: B.

Finally, we have fixed the local variable referenced before assignment error in the code.

To sum up, as you can see, the UnboundLocalError: local variable referenced before assignment error is raised when you try to assign a value to a local variable before it has been declared. Then, you can solve this error by ensuring that a local variable is declared before you assign it a value. Moreover, if a variable is declared globally that you want to access in a function, you can use the “global” keyword to change its value. In case you have any inquiry, let’s CONTACT US . With a lot of experience in Mobile app development services , we will surely solve it for you instantly.

>>> Read more

  • Average python length: How to find it with examples
  • List assignment index out of range: Python indexerror solution you should know
  • Spyder vs Pycharm: The detailed comparison to get best option for Python programming
  • fix python error , Local variable referenced before assignment , python , python dictionary , python error , python learning , UnboundLocalError , UnboundLocalError in Python

Our Other Services

  • E-commerce Development
  • Web Apps Development
  • Web CMS Development
  • Mobile Apps Development
  • Software Consultant & Development
  • System Integration & Data Migration
  • Dedicated Developers & Testers For Hire
  • Remote Working Team
  • Saas Products Development
  • Web/Mobile App Development
  • Outsourcing
  • Hiring Developers
  • Digital Transformation
  • Advanced SEO Tips

Offshore Development center

Lastest News

aws-well-architected-framework

Comprehensive Guide about AWS Well Architected Framework

aws-cloud-migration

AWS Cloud Migration: Guide-to-Guide from A to Z

cloud computing for healthcare

Uncover The Treasures Of Cloud Computing For Healthcare 

cloud computing in financial services

A Synopsis of Cloud Computing in Financial Services 

applications of cloud computing

Discover Cutting-Edge Cloud Computing Applications To Optimize Business Resources

headless cms vs traditional cms

Headless CMS Vs Traditional CMS: Key Considerations in 2024

Tailor your experience

  • Success Stories

Copyright ©2007 – 2021 by AHT TECH JSC. All Rights Reserved.

local variable 'result' referenced before assignment python

Thank you for your message. It has been sent.

Snowpark ML Modeling: ML Model Development ¶

The Snowpark ML Modeling API is Generally Available as of package version 1.1.1.

The Snowpark ML Modeling API uses familiar Python frameworks such as scikit-learn and XGBoost for preprocessing data, feature engineering, and training models inside Snowflake.

Benefits of developing models with Snowpark ML Modeling include:

Feature engineering and preprocessing: Improve performance and scalability with distributed execution for frequently-used scikit-learn preprocessing functions.

Model training: Accelerate training for scikit-learn, XGBoost and LightGBM models without the need to manually create stored procedures or user-defined functions (UDFs), leveraging distributed hyperparameter optimization.

The Snowpark ML Modeling API provides estimators and transformers that have APIs similar to those in the scikit-learn, xgboost, and lightgbm libraries. You can use these APIs to build and train machine learning models that can be used with Snowpark ML Operations such as the Snowpark Model Registry .

See Introduction to Machine Learning with Snowpark ML for an example of an end-to-end workflow in Snowpark ML, including the modeling API.

This topic assumes that Snowpark ML and its modeling dependencies are already installed. See Installing Snowpark ML .

Review the following examples to get a sense of the similarities of the Snowpark ML Modeling API to the machine learning libraries you might be familiar with.

Preprocessing ¶

This example illustrates the using Snowpark ML Modeling data preprocessing and transformation functions. The two preprocessing functions used in the example ( MixMaxScaler and OrdinalEncoder ) use Snowflake’s distributed processing engine to provide significant performance improvements over client-side or stored procedure implementations. For details, see Distributed Preprocessing .

This example shows how to train a simple xgboost classifier model using Snowpark ML Modeling, then run predictions. The Snowpark ML API is similar to xgboost here, with only a few differences in how the columns are specified. For details on these differences, see General API Differences .

Feature Preprocessing and Training on Non-Synthetic Data ¶

This example uses the high-energy gamma particle data from a ground-based atmospheric Cherenkov telescope. The telescope observes high energy gamma particles, taking advantage of the radiation emitted by charged particles produced in the electromagnetic showers initiated by the gamma rays. The detector records the Cherenkov radiation (of visible to ultraviolet wavelengths) that leaks through the atmosphere, allowing reconstruction of the gamma shower parameters. The telescope also detects hadron rays that are abundant in cosmic showers and produce signals that mimic gamma rays.

The goal is to develop a classification model for distinguishing between gamma rays and hadron rays. The model enables scientists to filter out background noise and focus on the genuine gamma-ray signals. Gamma rays allow scientists to observe cosmic events like the birth and death of stars, cosmic explosions, and the behavior of matter in extreme conditions.

The particle data is available for download from MAGIC Gamma Telescope . Download and unzip the data, set the DATA_FILE_PATH variable to point to the data file, and run the code below to load it to Snowflake.

Once you have loaded the data, use the following code to train and predict, using the following steps.

Preprocess the data:

Replace missing values with the mean.

Center the data using a standard scaler.

Train an xgboost classifier to determine the type of events.

Test the accuracy of the model on both training and test datasets.

Distributed Hyperparameter Optimization ¶

This example shows how to run distributed hyperparameter optimization using Snowpark ML’s implementation of scikit-learn’s GridSearchCV . The individual runs are executed in parallel using distributed warehouse compute resources. For details on distributed hyperparameter optimization, see Distributed Hyperparameter Optimization .

To really see the power of distributed optimization, train on a million rows of data.

Snowpark ML Modeling Classes ¶

All Snowpark ML modeling and preprocessing classes are in the snowflake.ml.modeling namespace. The Snowpark ML modules have the same name as the corresponding modules from the sklearn namespace. For example, the Snowpark ML module corresponding to sklearn.calibration is snowflake.ml.modeling.calibration . The xgboost and lightgbm modules correspond to snowflake.ml.modeling.xgboost and snowflake.ml.modeling.lightgbm , respectively.

The Snowpark ML Modeling API provides wrappers for underlying scikit-learn, xgboost, and lightgbm classes, the majority of which are executed as stored procedures (running on a single warehouse node) in the virtual warehouse. Not all of the classes from scikit-learn are supported in Snowpark ML. See the Snowpark ML API Reference for a list of the classes currently available.

Some classes (including preprocessing and metrics classes) support distributed execution and may provide significant performance benefits compared to running the same operations locally. For more information, see Distributed Preprocessing and Distributed Hyperparameter Optimization . The table below lists the specific classes that support distributed execution.

General API Differences ¶

See the Snowpark ML API Reference for complete details of the modeling API.

Snowpark ML Modeling includes data preprocessing, transformation, and prediction algorithms based on scikit-learn, xgboost, and lightgbm. The Snowpark Python classes are replacements for the corresponding classes from the original packages, with similar signatures. However, these APIs are designed to work with Snowpark DataFrames instead of NumPy arrays.

Although the Snowpark ML Modeling API is similar to scikit-learn, there are some key differences. This section explains how to call the __init__ (constructor), fit , and predict methods for the estimator and transformer classes provided in Snowpark ML.

The constructor of all Snowpark ML Python model classes accepts five additional parameters ( input_cols , output_cols , sample_weight_col , label_cols , and drop_input_cols ) in addition to the parameters accepted by the equivalent classes in scikit-learn, xgboost, or lightgbm. These are strings or sequences of strings that specify the names of the input columns, output columns, sample weight column, and label columns in a Snowpark or Pandas DataFrame. If some of the datasets you use have different names, you can change these names after instantiation using one of the provided setter methods, such as set_input_cols .

Because you specify column names when instantiating the class (or afterward, using setter methods) the fit and predict methods in Snowpark ML model classes accept a single DataFrame instead of separate arrays for inputs, weights, and labels. The provided column names are used to access the appropriate column from the DataFrame in fit or predict . See fit and predict .

By default, the transform and predict methods in Snowpark ML return a DataFrame containing all of the columns from the DataFrame passed to the method, with the output from the prediction stored in additional columns. You can transform in place by specifying output column names that match the input column names, or drop the input columns by passing drop_input_cols = True .) The scikit-learn, xgboost, and lightgbm equivalents return arrays containing only the results.

Snowpark Python transformers do not have a fit_transform method. However, as with scikit-learn, parameter validation is only performed in the fit method, so you should call fit at some point before transform , even when the transformer does not do any fitting. fit returns the transformer, so the method calls may be chained; for example, Binarizer(threshold=0.5).fit(df).transform(df) .

Snowpark ML transformers do not currently have an inverse_transform method. In many use cases, this method is unnecessary because the input columns are retained in the output dataframe by default.

You can convert any Snowpark ML modeling object to the corresponding scikit-learn, xgboost, or lightgbm object, allowing you to use all the methods and attributes of the underlying type. See Retrieving the Underlying Model .

Constructing a Model ¶

In addition to the parameters accepted by individual scikit-learn model classes, all Snowpark ML Modeling classes accept the following additional parameters at instantiation.

These parameters are all technically optional, but you will often want to specify input_cols , output_cols , or both. label_cols and sample_weight_col are required in specific situations noted in the table, but can be omitted in other cases.

All column names must follow the Snowflake identifier requirements . To preserve case or use special characters (besides dollar sign and underscore) when creating a table, column names must be wrapped in double quotes. Use all-caps column names whenever possible to maintain compatibility with case-sensitive Pandas DataFrames.

The DecisionTreeClassifier constructor does not have any required arguments in scikit-learn; all arguments have default values. So in scikit-learn, you might write:

In Snowpark ML, you must specify the column names (or accept the defaults by not specifying them). In this example, they are explicitly specified.

You can initialize a Snowpark ML DecisionTreeClassifier by passing the arguments directly to the constructor or by setting them as attributes of the model after instantiation. (The attributes may be changed at any time.)

As constructor arguments:

By setting model attributes:

The fit method of a Snowpark ML classifier takes a single Snowpark or Pandas DataFrame containing all columns, including features, labels, and weights. This is different from scikit-learn’s fit method, which takes separate inputs for features, labels, and weights.

In scikit-learn, the DecisionTreeClassifier.fit method call looks like this:

In Snowpark ML, you only need to pass the DataFrame. You have already set the input, label, and weight column names at initialization or by using setter methods, as shown in Constructing a Model .

The predict method of a Snowpark ML class also takes a single Snowpark or Pandas DataFrame containing all feature columns. The result is a DataFrame that contains all the columns in the input DataFrame unchanged and the output columns appended. You must extract the output columns from this DataFrame. This is different from the predict method in scikit-learn, which returns only the results.

In scikit-learn, predict returns only the prediction results:

To get only the prediction results in Snowpark ML, extract the output columns from the returned DataFrame. Here, output_column_names is a list containing the names of the output columns:

Distributed Preprocessing ¶

Many of the data preprocessing and transformation functions in Snowpark ML are implemented using Snowflake’s distributed execution engine, which yields significant performance benefit compared to single-node execution (that is, stored procedures). To find out which functions support distributed execution, see Snowpark ML Modeling Classes .

The chart below shows illustrative performance numbers on large public datasets, running in a medium Snowpark-optimized warehouse, comparing scikit-learn running in stored procedures to Snowpark ML’s distributed implementations. In mary scenarios, your code can run 25 to 50 times faster when using Snowpark ML Modeling.

Illustration of performance improvements possible by distributed preprocessing

How Fits Are Distributed ¶

The fit method of a Snowpark ML preprocessing transformer accepts a Snowpark or pandas DataFrame, fits the dataset, and returns the fitted transformer.

For Snowpark DataFrames, distributed fitting uses the SQL engine. The transformer generates SQL queries to compute the necessary states (such as mean, maximum, or count). These queries are then executed by Snowflake, and the results are materialized locally. For complex states that cannot be computed in SQL, the transformer fetches intermediate results from Snowflake and performs local computations over metadata.

For complex transformers that require temporary state tables during transformation (for example, OneHotEncoder or OrdinalEncoder ), these tables are represented locally using pandas DataFrames.

pandas DataFrames are fitted locally, similar to fitting with scikit-learn. The transformer creates a corresponding scikit-learn transformer with the provided parameters. Then the scikit-learn transformer is fitted, and the Snowpark ML transformer derives necessary states from the scikit-learn object.

How Transforms Are Distributed ¶

The transform method of a Snowpark ML preprocessing transformer accepts a Snowpark or Pandas DataFrame, transforms the dataset, and returns a transformed dataset.

For Snowpark DataFrames, distributed transformation is performed using the SQL engine. The fitted transformer generates a Snowpark DataFrame with underlying SQL queries representing the transformed dataset. The transform method performs lazy evaluation for simple transforms (for example, StandardScaler or MinMaxScaler ), so that no transform is actually performed during the transform method.

However, certain complex transforms involve execution. This includes transformers that require temporary state tables (such as OneHotEncoder and OrdinalEncoder ) during transformation. For such a transformer, the transformer creates a temporary table from the Pandas DataFrame (which stores the state of the object) for joins and other operations. Another case is when certain parameters are set. For example, when the transformer is set to handle unknown values found during transformation by raising errors, it materializes the data, including columns, unknown values, and so forth.

Pandas DataFrames are transformed locally, similar to transformation with scikit-learn. The transformer creates a corresponding scikit-learn transformer using the to_sklearn API and performs the transform in memory.

Hyperparameter tuning is an integral part of the data science workflow. The Snowpark ML API provides distributed implementations of the scikit-learn GridSearchCV and RandomizedSearchCV APIs to enable efficient hyperparameter tuning on both single-node and multiple-node warehouses.

Snowpark ML enables distributed hyperparameter optimization by default. To disable it, use the following Python import.

The smallest Snowflake virtual warehouse (XS) or Snowpark-optimized warehouse (M) has one node. Each successively larger size doubles the number of nodes.

For single-node (XS) warehouses, the full capacity of the node is utilized by default using scikit-learn’s joblib multiprocessing framework.

Each fit operation requires its own copy of that training dataset loaded into RAM. You may run out of memory with datasets larger than about 10 GB. To process datasets of such magnitude, disable distributed hyperparameter optimization (with import snowflake.ml.modeling.parameters.disable_distributed_hpo ) and set the n_jobs parameter to 1 to minimize concurrency.

For multiple-node warehouses, the fit operations within your cross-validation tuning job are distributed across the nodes. No code changes are required to scale up. Estimator fits are executed in parallel across all available cores on all nodes in the warehouse.

Estimator fits are executed in parallel on all available CPUs on all machines in the warehouse

As an illustration, consider the California housing dataset provided with the scikit-learn library. The data includes 20,640 rows of data with the following information:

MedInc : Median income in the block group

HouseAge : Median house age in the block group

AveRooms : Ave number of rooms per household

AveBedrms : Average number of bedrooms per household

Population : The block group population

AveOccup : Average number of household members

Latitude and Longitude

The target of the dataset is the median income, expressed in hundreds of thousands of dollars.

In this example, we do grid search cross-validation on a random forest regressor to find the best hyperparameter combination to predict the median income.

This example runs in just over 7 minutes on a Medium (single node) Snowpark-optimized warehouse, and takes just 3 minutes to run on an X-Large warehouse.

Illustration of performance improvements possible by distributed hyperparameter optimization

Deploying and Running Your Model ¶

The result of training a model is a Python Snowpark ML model object. You can use the trained model to make predictions by calling the model’s predict method. This creates a temporary user-defined function to run the model in your Snowflake virtual warehouse. This function is automatically deleted at the end of your Snowpark ML session (for example, when your script ends or when you close your Jupyter notebook).

To keep the user-defined function after your session ends, you can create it manually. See the Quickstart on the topic for further information.

The Snowpark ML model registry also supports persistent models and makes finding and deploying them easier. See Snowflake Model Registry .

Pipeline for Multiple Transformations ¶

With scikit-learn, it is common to run a series of transformations using a pipeline. scikit-learn pipelines do not work with Snowpark ML classes, so Snowpark ML provides a Snowpark Python version of sklearn.pipeline.Pipeline for running a series of transformations. This class is in the snowflake.ml.modeling.pipeline package, and it works the same as the scikit-learn version.

Retrieving the Underlying Model ¶

Snowpark ML models can be “unwrapped,” that is, converted to the underlying third-party model types, with the following methods (depending on the library):

to_lightgbm

All attributes and methods of the underlying model can then be accessed and run locally against the estimator. For example, in the GridSearchCV example , we convert the grid search estimator to a scikit-learn object in order to retrieve the best score.

Known Limitations ¶

Snowpark ML estimators and transformers do not currently support sparse inputs or sparse responses. If you have sparse data, convert it to a dense format before passing it to Snowpark ML’s estimators or transformers.

The Snowpark ML package does not currently support matrix data types. Any operation on estimators and transformers that would produce a matrix as a result fails.

The order of rows in result data is not guaranteed to match the order of rows in input data.

Troubleshooting ¶

Adding more detail to logging ¶.

Snowpark ML uses Snowpark Python’s logging. By default, Snowpark ML logs INFO level messages to standard output. To get logs that are more detailed, which can help you troubleshoot issues with Snowpark ML, you can change the level to one of the supported levels .

DEBUG produces logs with the most details. To set the logging level to DEBUG:

Solutions to Common Issues ¶

The following table provides some suggestions for solving possible problems with Snowflake ML Modeling.

Further Reading ¶

See the documentation of the original libraries for complete information on their functionality.

Scikit-Learn

Acknowledgement ¶

Some parts of this document are derived from the Scikit-learn documentation, which is licensed under the BSD-3 “New” or “Revised” license and Copyright © 2007-2023 The scikit-learn developers. All rights reserved.

Some parts of this document are derived from the XGboost documentation, which is covered by Apache License 2.0, January 2004 and Copyright © 2019. All rights reserved.

Some parts of this document are derived from the LightGBM documentation, which is MIT-licensed and Copyright © Microsoft Corp. All rights reserved.

Quick AI Tutorial

  • Data Science
  • Machine Learning
  • Programming

Dspy

Intro to DSPy: Simple Ideas To Improve Your RAG

llmlingua

Llmlingua + LlamaIndex + RAG = Cheaper Chatbot

Function Schema

AutoGen + LangChian + SQLite + Function Schema = Super AI Chabot

Microsoft PHI-2

Microsoft PHI-2 + Huggine Face + Langchain = Super Tiny Chatbot

TaskWeaver

TaskWeaver + Planner + Plugin = Super AI Agent

OpenHermes

OpenHermes 2.5 Vs GPT-4 Vs LLama2 = The Winner

AutoGen + LangChian + RAG + Function Call = Super AI Chabot

AutoGen + LangChian + RAG + Function Call = Super AI Chabot

OPENCHAT MODEL

Why OpenChat Model is So Much Better Than ChatGPT? 

llava chatbot

How To Build a LLava chatbot

OPENCHAT MODEL

LangChain + RAG Fusion + GPT-4o Python Project: Easy AI/Chat for your Docs

Gao Dalie (高達烈)

in this Article, I have a super quick tutorial for you showing how to create an AI for your PDF with LangChain, rag Fusion and GPT-4o to make a powerful Agent Chatbot for your business or personal use.

rag f usion improves traditional search systems by overcoming their limitations through a multi-query approach

GPT-4o is a higher-end model of GPT-4 Turbo announced on May 14, 2024.

The “o” in GPT-4o is an abbreviation for omni.

Omni is a Latin prefix that means “ all, whole, omnidirectional .”

Therefore, when compared to GPT-4 Turbo, which until now could only handle text and images, it can be said to be a ` `multimodal AI that can also input voice .’’

However, it is only partially possible to meet user needs with RAG, and further evolution is required. In this Story, we will focus on “RAG Fusion”, how the Retrieval Augmented Generation Fusion process works, and what the features of GPT-4o.

Table of Contents

Before we start! 🦸🏻‍♀️

If you like this topic and you want to support me:

  • Clap my article 50 times; that will really help me out.👏
  • Follow me on Medium and subscribe for Free to get my latest article🫶
  • Follow me on my YouTube channel

What is the Rag Fusion?

The idea is to generate multiple queries derived from the original query, re-rank (order) the search results for each query using an algorithm called Reciprocal Rank Fusion, and extract those with a high degree of relevance.

RAG Fusion flow

The method is very simple. The key points are to first have LLM generate similar queries (1. above) and to rerank the chunks obtained by vector search for each query (3. above).

By generating multiple similar queries in step 1, you can pick up a wide range of related chunks when performing a vector search. Also, by performing reranking in step 3, you can preferentially select chunks that rank high in many queries.

Compared to RAG, which only uses normal vector search, processing time and costs are increased because the step of generating similar queries involves contacting the LLM. However, since similar query generation requires fewer input and output tokens, the increase in processing time and cost is small.

RAG FUSION

Why use multiple queries?

In traditional search systems, users often enter a single query to find information, but this approach has limitations. A single query may not capture the full scope of what your users are interested in, or may be too narrow to provide comprehensive results. Therefore, it is important to generate multiple queries from different perspectives.

What is the Difference Between RAG and RAG Fusion?

The key difference between RAG and rag Fusion lies in their approach to query generation and result processing. While RAG relies on a singular query input, rag Fusion amplifies this by generating multiple queries, providing a richer context for the search.

What Difference Between GPT-4 and GPT-4o?

GPT-4 is used in a wide range of applications, including creative writing, complex data analysis, and customer support automation, and is particularly effective in situations where response accuracy is required.

On the other hand, GPT-4o is ideal for use in chatbots, interactive applications that require real-time processing, and resource-constrained IoT devices.

Performance comparison

The table below compares the performance of GPT-4 and GPT-4o.

1*wnSe6bCiI1kr2IDTHk4G w

Disclaimer : This time, I tried implementing rag Fusion using Langchain, following the above flow. I have slightly modified the code based on a repository.

Let’s get started to get started, you do need to download a couple of different Python libraries, namely pypdf,chromadb, langchain_openai, and Langchain, operator, and argparse if you haven’t already done so can simply type

once you have done that let’s head on over to a Python file we will be making use of all Python library

let’s set up to perform document retrieval and query tasks using GPT-4o API. Then we Set up EMBEDDING_MODEL to text embedding 3

We initialise an argument parser object which will be used to handle command-line arguments provided to the script.

Define Retriever options

  • TOP_K : Specifies the number of top results to return from a search or retrieval operation.
  • MAX_DOCS_FOR_CONTEXT : The maximum number of documents to use for providing context in a retrieval or query response.
  • DOCUMENT_PDF: Copy the path of local,

create a template prompt

create a function called load and split document, Read the text documents from ‘pdf’ then split the documents into chunks

we create a function name vector retriever, load and split the document, create the Text embedding and store them in a database, we can add new information to the same by passing the new information to the vector database.

Next, we perform a vector search for each query to find similar documents, followed by a re-ranking of these documents. For re-ranking, we use Reciprocal Rank Fusion (RRF), which relies on similarity ranks.

The score of a document d in Reciprocal Rank Fusion, 𝑅𝑅𝐹(𝑑), is calculated based on the rank of document 𝑑, denoted as 𝑟𝑎𝑛𝑘𝑖(𝑑), and the hyperparameter k.

RAG FUSION

The hyperparameter k affects the Reciprocal Rank Fusion (RRF) scoring: the higher the value of k , the flatter the score curve, which increases the influence of documents with lower ranks. Typically, k =60 is often used, and I am adopting this value in my current analysis.

The function to calculate Reciprocal Rank Fusion is named reciprocal_rank_fusion . For testing purposes, I am displaying the RRF scores, but I am only returning a list of document chunks because the content of these chunks is all that needs to be passed as context to the LLM.

Since each of the four similar queries retrieves five chunks, the total number of chunks can reach 20. However, as this creates an excessive amount of context, only the top-ranked chunks are used. The maximum number of documents passed as context, MAX_DOCS_FOR_CONTEXT , is set to 8.

The next function query_generator generates similar queries. It works by inserting the original query, original_query into a prompt and asking the LLM (Language Learning Model) to generate a similar query. The original code only used the prompt: ‘Generate multiple search queries related to: {original_query}’. This approach produced fairly broad queries.

To narrow down the results, I have updated the prompt to include a directive: ‘When creating queries, please refine or add closely related contextual information in Japanese, without significantly altering the original query’s meaning.’

Next, we have the rrf_retriever function, which performs a vector search using multiple similar queries. The function create_retriever(...) splits the document, creates a Vector Store using Chroma technology, and returns an Retriever object (details are available in the code repository).

Vector searches are conducted as follows:

  • RunnableLambda(query_generator) generates similar queries as previously described.
  • Using retriever.map() , we perform a vector search for each of the four similar queries generated by query_generator , including the original query. The map() function retrieves five chunks for each query.
  • Finally, we apply reciprocal_rank_fusion to re-rank the results, which will be detailed in the next section.

The entire process of the rag Fusion query is defined as a function. It functions similarly to a standard RAG (Retrieval-Augmented Generation), but if you use rrf_retriever it instead of a standard vector search, it adapts to perform rag Fusion.

If a normal vector search Retriever is used, it will conduct a regular vector search.

The chain’s definition might seem complex, but this complexity arises because we aim to output not just the LLM’s answer but also the context provided. Essentially, the process involves simply connecting retriever → prompt → .model .

we create the main function that acts as the entry point of the script, which controls the flow based on the input parameters, uses a retriever function for different types of search tasks, and finally outputs the result of these operations.

Conclusion :

I tried Rag Fusion, which uses Reciprocal Rank Fusion (RRF) for reranking.

In addition to the PDF introduced in this video, I tried loading all the PDFs on my own PDF, but my subjective evaluation is as follows.

  • When the original query is simple, such as “What is 〇〇?” with only one word, it is possible to pick up surrounding information by generating similar queries, which tends to lead to a wider range of answers.
  • If the original query is specific, it is not much different from normal vector search.
  • When it comes to complex questions that ask multiple questions, the probability of being able to answer them without missing anything increases by breaking down the questions using similar queries.
  • When generating similar queries, the width needs to be adjusted with prompts.

Since it generates similar queries, I feel that it has a great effect on enriching the final answers to simple questions.

🧙‍♂️ I am AI application expert! If you are looking for Generative AI Engineer, drop an inquiry here or Book a 1-On-1 Consulting Call With Me.

📚Feel free to check out my other articles:

Else See: LangGraph + Adaptive Rag + LLama3 Python Project: Easy AI/Chat For Your Docs 2024

Else See :  LangGraph + Corrective RAG + Local LLM = Powerful Rag Chatbot 2024

Else See :  [ollama Libraries 🦙] Run Any Chatbot Free Locally On Your Computer 2024

REFERENCE : 

Paper: https://arxiv.org/abs/2402.03367

Github: https://github.com/Raudaschl/rag-fusion

Gao Dalie (高達烈)

Gao Dalie (高達烈) he is a data driven enthusiast deeply passioned about Data Science, Automation, and Artificial Intelligence. AS a top writer on Medium in the Artificial Intelligence category ,He is also the founder of QuickAITutorial. For more of his insights, follow him on Medium @mr.tarik098.

Leave a Reply Cancel reply

Your email address will not be published. Required fields are marked *

Save my name, email, and website in this browser for the next time I comment.

You might also like

RAG FUSION

LangGraph + Adaptive Rag + LLama3 Python Project: Easy AI/Chat for your Docs

crewai

CrewAi + SharedMemory + Grop API = Powerful Ai Agent

Corrective RAG

LangGraph + Corrective RAG + Local LLM = Powerful Rag Chatbot

Flash_Attention

Five Technique : VLLM + Torch + Flash_Attention =Super Local LLM

Quick AI Tutorial

Quick AI Tutorial is your gateway to the world of Data Science, Machine Learning, and Artificial Intelligence. Dive into our expertly crafted articles to gain insights, master cutting-edge techniques, and discover lucrative opportunities in the digital realm.

Stay Connected

More….

  • Policy Privacy
  • Cookies Policy
  • Ai Automation

© 2023 quickaitutorial - Premium WordPress news & magazine theme by quickaitutorial .

KDE Gear 24.05.0 Full Log Page

This is the automated full changelog for KDE Gear 24.05.0 from the git repositories.

  • New in this release
  • Add missing include moc. Commit .
  • Use QFileInfo::exists directly. Commit .
  • Extend CollectionAttributeTest. Commit .
  • Detach AttributeStorage when Entity is detached. Commit .
  • Enable the db-migrator in master. Commit .
  • Port to #pragma once. Commit .
  • Remove unused include. Commit .
  • Intercept enter key. Commit .
  • SetHeaderGroup() changes the column count and filterAcceptsColumn(). Commit .
  • Port deprecated method. Commit .
  • Now it compiles fine without deprecated method < qt6.1. I will fix for other qt soon. Commit .
  • Fix handling of UTC vs. local time for database engines. Commit . Fixes bug #483060 .
  • KIOCore is not necessary now. Commit .
  • Remove KF6::KIOCore. I need to investigate if I can remove it from KPimAkonadiConfig.cmake.in. Commit .
  • We don't need KF6::KIOCore in src/widgets now. Commit .
  • Use KFormat directly. Commit .
  • Fix minimum value. Commit .
  • Apply i18n to percent values. Commit .
  • Fix for crash when sourceModel isn't set yet. Commit .
  • Add missing [[nodiscard]]. Commit .
  • Don't export private method. Commit .
  • Remove duplicate headers between cpp/h. Commit .
  • Fix infinite recursion in NotificationCollector. Commit .
  • Reverse this part of preview commit as it's private but used outside class no idea how. Commit .
  • Don't export private methods + remove not necessary private Q_SLOTS (use lambda). Commit .
  • Monitor: restore Items from Ntf if we cannot fetch them. Commit .
  • NotificationCollector: ignore notification with invalid or empty item set. Commit .
  • Fix typo in cmake var name; unlikely that this is about ObjC++. Commit .
  • Remove all usage of ImapSet in Protocol. Commit .
  • Session: mark session as disconencted before deleting SessionThread. Commit .
  • AkRanges: simplify TrransformIterator. Commit .
  • Fix ChangeRecorder journal corruption due to qsizetype change in Qt6. Commit .
  • Ensure query size in search manager remains less than 1000. Commit . See bug #480543 .
  • Optimize imap set. Commit .
  • Suppress 'unused parameter' warning in extractResult() for some Entities. Commit .
  • DbMigrator: run StorageJanitor before starting the migration. Commit .
  • StorageJanitor: fix usage of global DbConfig instead of local one. Commit .
  • StorageJanitor: don't disconnect the global session bus connection. Commit .
  • DbMigrator: run DbUpdater as part of the process. Commit .
  • Pass DataStore to T::extractResult() entity helper. Commit .
  • StorageJanitor: skip running certain steps when AkonadiServer instance is not available. Commit .
  • StorageJanitor: skip migration to levelled cache if not necessary. Commit .
  • StorageJanitor: add tasks to a list and execute from there. Commit .
  • StorageJanitor: add task to find and remove duplicate Flags. Commit .
  • AkThread: call quit() evne in NoThread mode. Commit .
  • StorageJanitor: explicitly pass DataStore instance to each Entity/QB call. Commit .
  • Add info about not supported vaccum on sqlite backend. Commit .
  • Also skip MySQL tests on the FreeBSD CI. Commit .
  • Use local include. Commit .
  • Workaround a race condition when changing email flags during ItemSync. Commit .
  • Properly convert QDateTime from database in Entities. Commit .
  • Fix MSVC build. Commit .
  • ProtocolGen: improve handling of enums in the generator. Commit .
  • Improve logging Database transaction errors. Commit .
  • Use isEmpty here too. Commit .
  • Disable PostgreSQL Akonadi tests on the CI. Commit .
  • Fix xmldocumenttest on Windows. Commit .
  • Fix narrowing warning in DataStream and modernize a little. Commit .
  • Fix DbConfig on Windows CI and extend the test. Commit .
  • IncidenceChanger: fix crash due to redundant deletion of handler. Commit .
  • Adapt api. Commit .
  • USe _L1. Commit .
  • Make CalFilterProxyModel part of public API. Commit .
  • Use QIODevice::WriteOnly directly. Commit .
  • Drop support for KF5's deprecated KToolInvocation. Commit .
  • Add missing [[nodiscard]]". Commit .
  • Fix copyright. Commit .
  • Add option to hide declined invitations from event views. Commit .
  • Bump version so we can depend on the new API in KOrganizer. Commit .
  • Make CollectionCalendar work with a proxy on top of ETM instead of raw ETM. Commit .
  • Make CalFilterPartStatusProxyModel part of akonadi-calendar public API. Commit .
  • Not necessary to use 6 suffix. Commit .
  • Remove mem leak. Commit .
  • Refactor the SearchCollectionHelper to use d-pointer. Commit .
  • Make the SearchCollectionHelper inactive by default. Commit .
  • There is not qml/js files. Commit .
  • USe [[nodiscard]]. Commit .
  • Don't export symbol. Commit .
  • Remove unused variables. Commit .
  • Remove commented code. Commit .
  • Implement a dialog for the user to choose the suspend duration. Commit . Fixes bug #481024 . Fixes bug #457046 . Fixes bug #452264 . Fixes bug #453298 . Fixes bug #457046 .
  • Use local includes. Commit .
  • Fix 486837: " upon new contact creation, KAddressbook always warns: Location was not saved. Do you want to close editor?". Commit . Fixes bug #486837 .
  • We don't have kcfg* file. Commit .
  • Add missing explicit keyword. Commit .
  • QLatin1String is same as QLatin1StringView, we need to use QLatin1StringView now. Commit .
  • We depend against qtkeychain 0.14.2 (kwallet6 support). Commit .
  • Remove doc that doesn't compile. Commit .
  • Add QT6KEYCHAIN_LIB_VERSION 0.14.1. Commit .
  • It compiles fine without deprecated method < kf6.0. Commit .
  • We need kio here. Commit .
  • Remove commented include. Commit .
  • Port deprecated QCheckBox::stateChanged. Commit .
  • Use _L1 directly. Commit .
  • Initialize pointer. Commit .
  • Const'ify pointer. Commit .
  • Update copyright. Commit .
  • Use [[nodiscard]]. Commit .
  • Const'ify variable. Commit .
  • Minor optimization. Commit .
  • We can use directly QStringList. Commit .
  • Remove unused variable. Commit .
  • Don't export private method + remove Q_SLOTS + add missing [[nodiscard]]. Commit .
  • Use isEmpty(). Commit .
  • Fix searchplugintest. Commit .
  • Port deprecated methods. Commit .
  • We use lambda now + add missing [[nodiscard]]. Commit .
  • Fix build by requiring C++20. Commit .
  • Appdata: Fix typo in launchable desktop-id. Commit .
  • Add comment. Commit .
  • We already use "using namespace Akregator". Commit .
  • Const'ify. Commit .
  • It's enabled by default. Commit .
  • Coding style. Commit .
  • Coding style + add missing [[nodiscard]]. Commit .
  • Prepare for the future support for Activities. Commit .
  • Update org.kde.akregator.appdata.xml - Drop .desktop from ID. Commit .
  • New article theme. Commit .
  • Use desktop-application. Commit .
  • We use namespace directly. Commit .
  • Fix 483737: akregator icon, in systray does not follow dark breeze theme. Commit . Fixes bug #483737 .
  • Fix appstream developer tag id. Commit .
  • Remove some KIO/Global. Commit .
  • Fix homepage. Commit .
  • Fix appstream file. Commit .
  • Improve appstream metadata. Commit .
  • Remove unused code. Commit .
  • Set width on list section header. Commit .
  • Fix Sidebar Text Being Inappropriately Shown on Startup when Sidebar is Collapsed. Commit .
  • Set compilersettings level to 6.0. Commit .
  • Remove Qt5 dependencies. Commit .
  • .kde-ci.yml: add missing qqc2-desktop-style. Commit .
  • Add monochrome icon for Android. Commit .
  • Fix crash on shutdown. Commit .
  • Bump soversion for the Qt6-based version. Commit . Fixes bug #484823 .
  • Port away from QRegExp. Commit .
  • Analitza6Config: Add Qt6Core5Compat to dependencies. Commit .
  • Fix build with corrosion 0.5. Commit .
  • Fix download list page having uninteractable action buttons. Commit .
  • Fix downloads not being prompted and starting. Commit .
  • Fix history clearing not working. Commit . See bug #478890 .
  • Fix desktop tabs. Commit .
  • UrlDelegate: Fix deleting entries. Commit .
  • Fix remove button. Commit .
  • Fix bookmarks and history page not working on mobile. Commit .
  • Appstream: Update developer name. Commit .
  • Update rust crates. Commit .
  • WebApp: Fix not launching on Qt6. Commit .
  • Desktop: Fix switching tabs. Commit .
  • Metainfo: Change name to just Angelfish. Commit .
  • Complement org.kde.arianna.appdata.xml. Commit .
  • Use socket=fallback-x11. Commit .
  • Use tag in flatpak manifest. Commit .
  • Cli7zplugin: update cmake warning message. Commit .
  • Createdialogtest: fix 7z expected encryption with libarchive. Commit .
  • Extracttest: skip 7z multivolume with libarchive. Commit .
  • Move 7z multivolume load test to cli7ztest. Commit .
  • Libarchive: add support for unencrypted 7-zip. Commit . See bug #468240 .
  • Add . Commit .
  • Port deprecated qt6.7 methods. Commit .
  • Use QList as QVector is an alias to QList. Commit .
  • Man page: refer to Qt6 & KF6 version of commandline options. Commit .
  • Clirar: expand the list of messages about incorrect password. Commit .
  • Make the Compress menu items text consistent. Commit .
  • Clirartest: drop addArgs test for RAR4. Commit .
  • Clirarplugin: disable RAR4 compression method. Commit . Fixes bug #483748 .
  • Support opening EXE files through libarchive. Commit .
  • Don't rely on qtpaths for kconf_update scripts. Commit .
  • Specify umask for permission tests. Commit .
  • Cli7zplugin: improve compatibility with original 7-Zip. Commit .
  • Doc: Explain when "Extract here" does not create subfolder. Commit .
  • Fix compile test. Commit .
  • Add fallback to utime for platforms with incomplete c++20 chrono implementation. Commit .
  • Replace use of utime with std::filesystem::last_write_time. Commit .
  • Require c++20, which is the default for kf6. Commit .
  • Add Windows ci. Commit .
  • Link breeze icons if available. Commit .
  • Fix layout when no item is selected. Commit .
  • ExtractionDialog: Move to frameless design. Commit .
  • Remove margin around plugin settings page. Commit .
  • Don't use lstat on Windows. Commit .
  • Use virtually same code on Windows. Commit .
  • Fix use of mode_t on Windows. Commit .
  • Fix export macros. Commit .
  • Don't use kpty on Windows. Commit .
  • Only mark KCM as changed when text was actually edited. Commit . Fixes bug #476669 .
  • Update metadata to be compliant with flathub's quality guidelines. Commit .
  • Fix playlists page. Commit .
  • Extend copyright to 2024. Commit .
  • Flatpak: Clean up static libs. Commit .
  • Flatpak: Switch to stable kirigami-addons. Commit .
  • Fix ytmusicapi version check. Commit .
  • Get some amount of keyboard navigation working on library page. Commit .
  • Prevent horizontal scrolling on library page. Commit .
  • Also show options for top results. Commit .
  • Flatpak: Update pybind11. Commit .
  • Kirigami2 -> Kirigami. Commit .
  • Update ytmusicapi to 1.6.0. Commit .
  • LocalPlaylistPage: Fix postion of menu button. Commit .
  • MaximizedPlayerPage: some formatting fixes. Commit .
  • Hide volume button on mobile. Commit .
  • LocalPlaylistModel: Remove unnecessary default fromSql implementation. Commit .
  • Flatpak: Switch to non-preview runtime. Commit .
  • Flatpak: Pin kirigami-addons. Commit .
  • Update ytmusicapi to 1.5.4. Commit .
  • Search for Qt6 explicitly. Commit .
  • Adapt to API changes. Commit .
  • Flatpak: use fallback-x11. Commit .
  • Replace implicit signal parameter. Commit .
  • Flatpak: Build audiotube with release profile. Commit .
  • Port away from Qt5Compat. Commit .
  • Update ytmusicapi to 1.5.1. Commit .
  • Get rid of some GraphicalEffects uses. Commit .
  • Port to Kirigami Addons BottomDrawer. Commit .
  • Fix some QML warnings. Commit .
  • Add support for ytmusicapi 1.5.0. Commit .
  • Don't display empty album cover when nothing is playing. Commit .
  • Improve scroll performance of upcoming songs drawer. Commit .
  • Call signals instead of signal handlers. Commit .
  • SearchPage: Fix clicking on search history entries. Commit .
  • Fix position of the volume label. Commit .
  • Fix loading the "Systemabsturz" artist page. Commit .
  • FileMetaDataProvider: Use QSize for dimensions . Commit .
  • Fix formatting in src/kedittagsdialog_p.h. Commit .
  • KEditTagsDialog: refactor using QStandardItemModel/QTreeView instead of QTreeWidget. Commit .
  • It compiles fine without deprecated methods. Commit .
  • Fix typo. It's 6.0.0 not 6.6.0 as qt :). Commit .
  • Rename variable as KF_MIN_VERSION + it compiles fine without deprecated methods. Commit .
  • Appstream: use developer tag with name KDE. Commit .
  • Bump min required KF6 to 6.0. Commit .
  • Fix build by ensuring output dir for zipped svg files exists. Commit .
  • Store theme files as SVG in repo, compress to SVGZ only on installation. Commit .
  • Use _L1. Commit .
  • Remove 'ActiveDesignerFields' configuration from kcfg. Commit .
  • Use missing [[nodiscard]]. Commit .
  • Fix APK build. Commit .
  • Port QML to Qt6/KF6. Commit .
  • KAboutData: update homepage URL to latest repo path. Commit .
  • Appstream: use desktop-application type, add developer & launchable tags. Commit .
  • Drop code duplicating what KAboutData::setApplicationData() does. Commit .
  • Disable testpython. Commit .
  • Fixed the export to LaTex. Commit . Fixes bug #483482 .
  • Skip the new test added in the previous commit (tests with plots don't work on CI yet). Commit .
  • [python] ignore IPython's magic functions in imported Jupytor notebooks, not relevant for Cantor. Commit .
  • Properly initialize the setting for latex typesetting when creating a new session in a new worksheet. Commit . Fixes bug #467094 .
  • Don't try to evaluate the expression(s) in the worksheet if the login into the session has failed. Commit .
  • Disable requiring tests failing on FreeBSD. Commit .
  • Update README.md. Commit .
  • Extract i18n messages from *.qml. Commit .
  • Drop unused kconfigwidgets dependency. Commit .
  • Revert "DragAndDropHelper::updateDropAction: use StatJob for remote URLs". Commit .
  • Add branding colors for Flathub. Commit .
  • Fix crash while entering selection mode with Qt6.7. Commit . Fixes bug #485599 .
  • Viewproperties: remove now obsolete recentdocument reference. Commit .
  • Improve appstream summary. Commit .
  • DisabledActionNotifier: Prevent null dereferences. Commit . Fixes bug #485089 .
  • Fix saving sort role after change from header. Commit . Fixes bug #480246 .
  • Change "Could not" to "Cannot" in error messages. Commit .
  • KItemListController: don't create rubber band for a right click in an empty region. Commit . Fixes bug #484881 .
  • Versioncontrol: make observer the sole owner of plugins. Commit .
  • Kitemlist: don't open dir when double-click on expand arrow. Commit . Fixes bug #484688 .
  • DolphinMainWindow: show a banner when the user presses the shortcut of a disabled action. Commit .
  • Mark servicemenu items' KNS content as risky. Commit .
  • Fix layout in Compact View mode for RTL. Commit .
  • Fix selection marker for RTL. Commit .
  • Contextmenu: add a separator before vcs actions. Commit .
  • Also use breeze style on macOS. Commit .
  • Use breeze style on Windows. Commit .
  • Add comment to explain KColorSchemeManager. Commit .
  • KColorSchemeManager only on Windows and macOS. Commit .
  • Use KColorSchemeManager. Commit .
  • Touch up various user-visible strings. Commit .
  • Better support for RTL. Commit . Fixes bug #484012 . Fixes bug #449493 .
  • Use craft to build for windows. Commit .
  • Fix right-mouse click crashes on Windows. Commit .
  • Versioncontrol: Prevent a use-after-free in UpdateItemStatesThread. Commit . Fixes bug #477425 .
  • Avoid wrapping text in the status bar. Commit .
  • KItemListView: Improve scrollToItem(). Commit .
  • DolphinContextMenu: Add hint that secondary app will be opened by middle click. Commit .
  • Save 'Open Archives as Folders' setting. Commit . Fixes bug #474500 .
  • Add settings page for Panels. Commit . Fixes bug #480243 .
  • Adapt testOpenInNewTabTitle() to upstream change. Commit .
  • Sync Dolphin icon with Breeze system-file-manager. Commit . Fixes bug #482581 .
  • Animate most of the bars. Commit .
  • Enable custom view properties for special folders even if "remember for each folder" is off. Commit .
  • KItemListController::onPress: remove unused screenPos argument. Commit .
  • Dolphinmainwindow: Fix ordering warning. Commit .
  • Handle deprecation of QGuiApplication::paletteChanged. Commit .
  • Remove unneeded code for toggeling dockwidget visibility. Commit . Fixes bug #481952 .
  • Dolphin.zsh: complete both directories and URL protocols. Commit .
  • Start autoActivationTimer only if hovering over a directory. Commit . Fixes bug #479960 .
  • Add option to completely disable directory size counting. Commit . Implements feature #477187 .
  • Remove 'Id' field from JSON plugin metadata. Commit .
  • Open KFind with current dir. Commit . Fixes bug #482343 .
  • DragAndDropHelper::updateDropAction: use StatJob for remote URLs. Commit .
  • Fix compile with Qt 6.7. Commit .
  • Fix: can't drop into remote dir. Commit .
  • Resolve conflict between activateSoonAnimation and hoverSequenceAnimation. Commit .
  • Add drag-open animation. Commit .
  • Avoid searching for the knetattach service on startup. Commit .
  • Fix a crash in DolphinSearchBox::hideEvent(). Commit . Fixes bug #481553 .
  • Add documentation. Commit .
  • Improve DnD handling in read-only dirs. Commit .
  • Org.kde.dolphin.appdata: Add developer_name. Commit .
  • Flatpak: Use specific tag for baloo. Commit .
  • Fix flatpak. Commit .
  • Fix focus chain. Commit .
  • Speed up autoSaveSession test. Commit .
  • Add test cases for right-to-left keyboard navigation. Commit .
  • Improve arrow key navigation for right-to-left languages. Commit . Fixes bug #453933 .
  • Slightly refactor count resorting. Commit . See bug #473999 .
  • Avoid sorting too frequently. Commit .
  • Dolphintabbar: only open tab on double left click. Commit . Fixes bug #480098 .
  • Rolesupdater: set isExpandable to false when dir is empty. Commit .
  • Fix memory leak. Commit .
  • Resize the split button when the menu is removed. Commit .
  • Remove the menu from the split button when splitscreen is closed. Commit .
  • Remove popout action from toolbar when split screen is closed. Commit .
  • Use a separate menu action for split view action. Commit .
  • Move popout action into split action dropdown. Commit .
  • Follow the setting for which view to close. Commit .
  • Always update the split view button. Commit .
  • Use better description for pop out action. Commit .
  • Allow popping out a split view. Commit . Fixes bug #270604 .
  • Fix: "empty folder" placeholder text eating mouse events. Commit . Fixes bug #441070 .
  • Never emit the fileMiddleClickActivated signal if isTabsForFilesEnabled is true. Commit .
  • DolphinMainWindowTest: Add unit test for autosave session feature. Commit .
  • DolphinView: Use SingleShot and Queued Connections. Commit .
  • DolphinMainWindow: autosave session. Commit . Fixes bug #425627 .
  • Add setting also hide application/x-trash files when hiding hidden files. Commit . Fixes bug #475805 .
  • Always automatically choose a new file name while duplicating. Commit . Fixes bug #475410 .
  • Fix: closing split view doesn't update tab name. Commit . Fixes bug #469316 .
  • Explain free space button usage in tooltip. Commit .
  • Formatting leftover files and fix build. Commit .
  • Drop clang-format file. Commit .
  • Correct .git-blame-ignore-revs. Commit .
  • Add .git-blame-ignore-revs after formatting with clang. Commit .
  • Add and make use of ECM clang-format integration. Commit .
  • Git: fix pull and push dialogs typos in signal connection. Commit .
  • Git: Initial implementation of git clone dialog. Commit .
  • Org.kde.dolphin-plugins.metainfo.xml appstream issue summary-has-dot-suffix. Commit .
  • Svn: Fix gcc-13 One Definition Rule compilation error with LTO enabled. Commit . Fixes bug #482524 .
  • [svn] Fix part or previous commit message append to new shorter one. Commit . Fixes bug #446027 .
  • Use locales date in Git log. Commit . Fixes bug #454841 .
  • Git: Add restoreStaged action. Commit .
  • Port Mercurial plugin away from QTextCodec. Commit .
  • Port Git plugin away from QTextCodec. Commit .
  • Use ConfigGui not XmlGui in git and subversion plugins. Commit .
  • Use QList directly. Commit .
  • Fix broken man page installation due to defunc variable. Commit .
  • Appstream: use desktop-application type, add developer tag. Commit .
  • Use QString type arg with KActionCollection::action(). Commit .
  • Remove qt5 code. Commit .
  • Make sure that icon is setting. Commit .
  • Fix UI freeze when maximizing the Headerbar. Commit . Fixes bug #483613 .
  • Appdata: remove mention of supported platforms. Commit .
  • Appdata: use the newer, non-deprecated developer tag. Commit .
  • Appdata: massage summary text to be a bit shorter and more imperative. Commit .
  • Appdata: add developer name key. Commit .
  • Set branding colors in AppStream metadata. Commit .
  • Show artists image as a collage of 4 album covers again. Commit .
  • Add vertical spacing for grid/list view toolbars. Commit .
  • Fix height of track delegates in albums view. Commit .
  • Update CMakeLists - Bring Minimum CMake Version to 3.16. Commit .
  • NavigationActionBar: don't override the ToolBar background. Commit .
  • NavigationActionBar: group mobile background components into one Item. Commit .
  • NavigationActionBar: combine toolbars into one. Commit .
  • HeaderFooterToolbar: don't use a default contentItem. Commit .
  • Fix page header click events propagating into main ScrollView. Commit .
  • Allow switching between list/grid mode for non-track views. Commit . Implements feature #411952 .
  • Refactor saving sort order/role to make it easier to add more view preferences. Commit .
  • Move GridBrowserDelegate backend logic to AbstractBrowserDelegate. Commit .
  • Rename DataListView to DataTrackView. Commit .
  • MediaPlayListEntry: delete unused constructors. Commit .
  • MediaPlayList: make enqueueOneEntry call enqueueMultipleEntries internally. Commit .
  • MediaPlaylist: merge enqueueFilesList into enqueueMultipleEntries. Commit .
  • Replace EntryData tuple with a struct for improved readability. Commit .
  • Fix broken volume slider with Qt Multimedia backend. Commit . Fixes bug #392501 .
  • Port to declarative qml type registration. Commit .
  • Rename ElisaConfigurationDialog.qml -> ConfigurationDialog.qml. Commit .
  • Move QtQuick image provider registration from elisqmlplugin to main. Commit .
  • QML: drop import version number for org.kde.elisa. Commit .
  • Add sorting by album in GridViewProxyModel. Commit .
  • Fix failing trackmetadatamodelTest. Commit .
  • Rename data/ -> android/. Commit .
  • Merge androidResources/ with data/ and delete unneeded images. Commit .
  • Android: fix cropped app icon in apk installer for Android >= 14. Commit .
  • Fix missing cover art on Android >= 10. Commit .
  • Android: fix missing icons. Commit .
  • Fix missing music on Android >=13. Commit .
  • Android: port to Qt6. Commit .
  • ViewListData: delete unused mIsValid. Commit .
  • ViewsParameters: delete unused constructor. Commit .
  • Delete unused RadioSpecificStyle. Commit .
  • AbstractDataView: don't assume id "contentDirectoryView" exists. Commit .
  • DataGridView: simplify delegate width calculation. Commit .
  • GridBrowserDelegate: remove unneccessary "delegate" from "delegateDisplaySecondaryText". Commit .
  • Delete unused GridBrowser code. Commit .
  • Fix qt multimedia backend stopping playback after a track has finished. Commit .
  • Don't skip to the end when playing the same track twice in a row. Commit . Fixes bug #480743 .
  • Settings from Qt.labs.settings is deprecated, use the one from QtCore instead. Commit .
  • Configuration Dialog: use standard buttons for the button box. Commit .
  • Fix mobile playlist delegate binding loop. Commit .
  • Fix compile warnings for unused variables. Commit .
  • Open the config window in the centre of the app. Commit . Fixes bug #429936 .
  • Print a proper error message when the config window fails to load. Commit .
  • Open the mobile settings page when the config shortcut is activated in mobile. Commit .
  • Remove extra left padding in settings header bar. Commit .
  • Fix typos. Commit .
  • Improve DurationSlider and VolumeSlider keyboard accessibility. Commit .
  • Add accessible names to some controls. Commit .
  • Fix favorite filter and exit fullscreen buttons not activating on Enter/Return. Commit .
  • Refactor FlatButton to support checkable buttons. Commit .
  • Fix items taking focus when they aren't visible. Commit .
  • Fix mobile playlist entry menu buttons taking focus when parent isn't selected. Commit .
  • Fix mobile playlist Show Current button not highlighting current entry. Commit .
  • Refactor "About Elisa" dialog to use Kirigami Addons. Commit . Fixes bug #439781 .
  • Move mobile duration labels under slider so the slider has more space. Commit .
  • Update .flatpak-manifest.json to include kirigamiaddons. Commit .
  • Replace "open_about_kde_page" with "help_about_kde" everywhere. Commit .
  • Rename "help_about_kde" function to "open_about_kde_page". Commit .
  • Add kirigamiaddons library as dependency. Commit .
  • Add KirigamiAddons to CMakeLists.txt. Commit .
  • Add aboutKDE page. Commit .
  • Fix crash when flicking mouse over rating star. Commit .
  • Fix mobile Show Playlist button in wide mode. Commit .
  • Refactor the playlist drawer handleVisible property. Commit .
  • TodoView: Use current instead of selection to track active todo. Commit . Fixes bug #485185 .
  • Fix a few unused variable/parameter warnings. Commit .
  • Port away from deprecated QDateTime Qt::TimeSpec constructor. Commit .
  • USe _L1 operator directly. Commit .
  • Use setContentsMargins({}). Commit .
  • Clean up. Commit .
  • We don't have README.md file. Commit .
  • Remove commented code + remove private Q_SLOTS we use lambda. Commit .
  • Add missing explicit. Commit .
  • Remove EventViews::resourceColor() overload for an Akonadi::Item. Commit .
  • Agenda, Month: query collection color from calendar collection. Commit .
  • Prefer color stored in Akonadi over eventviewsrc. Commit .
  • Fix 'Create sub-todo' action being always disabled. Commit . Fixes bug #479351 .
  • Apply i18n to file size and download speed values. Commit .
  • SpeedDial: Add option to lock the dials position. Commit . Fixes bug #403684 .
  • Remove ending slash in default skipList. Commit .
  • Replace KMessage warning for duplicate skip list with passiveNotification. Commit .
  • It compiles fine with QT_NO_CONTEXTLESS_CONNECT. Commit .
  • Port openUrl warning away from KMessage. Commit .
  • Debug--. Commit .
  • Use #pragma oncde. Commit .
  • Remove KQuickCharts. Commit .
  • Add me as maintainer. Commit .
  • Move as private area. Commit .
  • Fix label position + increase icon size. Commit .
  • Remove qml versioning. Commit .
  • It's compile fine without deprecated methods. Commit .
  • Fix anti-aliasing: Use preferredRendererType (new in qt6.6). Commit .
  • Fix qml warning: use ===. Commit .
  • Add missing override. Commit .
  • Fix syntax signal in qml. Commit .
  • Set properties for plist file. Commit .
  • Remove leftover. Commit .
  • Try to fix test build on macOS. Commit .
  • Craft macOS: use Qt6. Commit .
  • Fix IME position when window is wider than editor width. Commit . Fixes bug #478960 .
  • Focus the QLineEdit when showing the rename dialog. Commit . See bug #485430 .
  • ImageReader: allow 2Gb max allocation. Commit . See bug #482195 .
  • Fix incorrectly reversed screen saver inhibition logic. Commit . Fixes bug #481481 .
  • Fix translate shortcut. Commit . See bug #484281 .
  • Only set slider range when there is a valid media object. Commit . Fixes bug #483242 .
  • Don't crash on unsupported fits images. Commit . Fixes bug #482615 .
  • Re-enable kimageannotator integration. Commit .
  • Add spotlightmode license header. Commit .
  • Thumbnailview: Check if thumbnail is actually visible when generating. Commit .
  • Thumbnailview: Don't execute thumbnail generation while we're still loading. Commit .
  • Rate limit how often we update PreviewItemDelegate when model rows change. Commit .
  • Update on window scale changes. Commit . Fixes bug #480659 .
  • Add minimal view mode. Commit .
  • Org.kde.gwenview.appdata: Add developer_name & update caption. Commit .
  • Fix flatpak build. Commit .
  • Remove "KDE" from GenericName in the desktop file. Commit .
  • Use directly KFormat. Commit .
  • Remove configuration for 'Custom Pages'. Commit .
  • Merge private area. Commit .
  • Correctly handle timezone of recurrence exceptions. Commit . See bug #481305 .
  • Don't export private method + coding style + use [[nodiscard]]. Commit .
  • Actually use QGpgme if found. Commit .
  • [Appimage] Re-enable. Commit .
  • Port away from deprecated Quotient::Accounts global variable. Commit .
  • Adapt to source-incompatible changes in Qt's 6.7 JNI API. Commit .
  • Use release versions of Poppler and Quotient in stable branch Flatpaks. Commit .
  • Port away from Quotient's connectSingleShot(). Commit .
  • Build against stable branches. Commit .
  • Bundle emblem-important icon on Android. Commit .
  • Port away from view-list-symbolic icon. Commit .
  • Allow to manually add ticket tokens by scanning a barcode. Commit .
  • Allow to edit ticket owner names. Commit .
  • Unify and extend clipboard code. Commit .
  • Refactor barcode scanner page for reuse. Commit .
  • Don't show seat information on the coach layout page when we don't have any. Commit .
  • Show coach layout actions also without any seat reservation or ticket. Commit .
  • Fix journey section delegate layout for waiting sections. Commit .
  • Add 24.02.2 release notes. Commit .
  • Fix journey section layout being messed up by Qt 6.7. Commit .
  • Work around event queue ordering changes in Qt 6.7. Commit .
  • Src/app/PublicTransportFeatureIcon.qml (featureTypeLabel): fix typo at "Wheelchair". Commit .
  • Show per-coach load information when available. Commit .
  • Show out-of-service coaches grayed out. Commit .
  • Handle additional coach feature types. Commit .
  • Also support program membership passes in pkpass format. Commit .
  • Remove unused kde/plasma-mobile version override. Commit .
  • Support tickets with attached Apple Wallet passes. Commit .
  • Support Apple Wallet passes attached via the standard subjectOf property. Commit .
  • Modernize PkPassManager class. Commit .
  • Show notes and full-vehicle features on coach layout page. Commit .
  • Show combined vehicle features in the journey details page. Commit .
  • Show vehicle features in the journey section delegate as well. Commit .
  • Show vehicle features for departures. Commit .
  • Deduplicate the public transport feature list. Commit .
  • Show journey features in notes sheet drawer as well. Commit .
  • Add coach details sheet drawer. Commit .
  • Refactor generic coach feature type label strings. Commit .
  • Port vehicle layout view to the new public transport feature API. Commit .
  • Fix centering pkpass barcode alt texts. Commit .
  • Fix handling of departure disruptions. Commit .
  • Remove outdated information about APKs. Commit .
  • Silence warnings for SheetDrawers without headers. Commit .
  • Prevent overly large pkpass footer images from messing up the layout. Commit .
  • Add DST transition information elements to the timeline. Commit .
  • Extend location info elements to also allow showing DST changes. Commit .
  • Consistently use [[nodiscard]] in LocationInformation. Commit .
  • Remember the last used folder in export file dialogs. Commit .
  • Modernize Settings class. Commit .
  • Make membership number on reservation pages copyable as well. Commit .
  • Suggest meaningful file names for exporting trip groups. Commit .
  • Modernize TripGroup class. Commit .
  • Fix icons coloring for coach type icons. Commit .
  • Use released Frameworks in Craft builds. Commit .
  • Add 24.02.1 release notes. Commit .
  • Adapt build options for KF6. Commit .
  • Add enough space at the end for the floating button. Commit .
  • Add floating button to timeline page to go to today and add new stuff. Commit .
  • Filter implausible geo coder results. Commit .
  • Tighten QML module dependency requirements. Commit .
  • Don't translate the developer_name Appstream tag. Commit .
  • Fix current ticket selection for elements without known arrival times. Commit .
  • Update release note for 24.02. Commit .
  • Adapt Craft ignore list to renamed KMime translation catalog. Commit .
  • Add Craft ignore list from Craft's blueprint. Commit .
  • Give translators a hint that here "Itinerary" needs to be translated. Commit .
  • Use ZXing master for the continuous Flatpak build. Commit .
  • Disable the journey map on the live status page. Commit .
  • Add developer_name tag required by Flathub. Commit .
  • Fix retaining journey notes/vehicle layouts when getting partial updates. Commit .
  • Fix check for displaying departure notes on train trips. Commit .
  • Make country combo box form delegate accessible. Commit .
  • Fix SheetDrawer in non-mobile mode. Commit .
  • Fix padding. Commit .
  • Port more sheets to SheetDrawer. Commit .
  • Improve sizing of the SheetDrawer on desktop. Commit .
  • Port to carls dialog and kinda fix sizing issue. Commit .
  • License. Commit .
  • Make map items clickable. Commit .
  • Fix "Add to calendar" sheet. Commit .
  • Improve display of notes sheet. Commit .
  • JourneyQueryPage: Fix secondary loading indicator being visible when it shouldn't. Commit .
  • MapView: Improve mouse zooming behaviour. Commit .
  • Improve a11y annotations on the journey search page. Commit .
  • Hide RadioSelector implementation details from the a11y tree. Commit .
  • Add i18n context for Join action. Commit .
  • Make country combo boxes in the stop picker page accessible. Commit .
  • Build ZXing statically to avoid clashing with the one in the platform. Commit . See bug #479819 .
  • Propagate actions from restaurants/hotels to their reservations as well. Commit .
  • Remove mention of the Thunderbird integration plugin. Commit .
  • Update nightly Flatpak link. Commit .
  • Promote actions from events to reservations when creating from events. Commit .
  • Handle join actions, used e.g. for event registrations. Commit .
  • Fix closing the journey replacement warning dialog. Commit .
  • Move loading indicator out of the way once the first results are displayed. Commit .
  • Add switch option. Commit .
  • Fix dangling reference warning. Commit .
  • Explicitly UTF-8 encode the post data. Commit .
  • Fix build with taglib 2. Commit .
  • K3b::Device::debugBitfield: Fix crash when using Qt6. Commit . Fixes bug #486314 .
  • Port more parts of libk3b away from QRegExp. Commit .
  • 485432: Fix libavcodec version major typo. Commit .
  • 485432: Add libavcodec version major check for FFmpeg avutil: remove deprecated FF_API_OLD_CHANNEL_LAYOUT. Commit .
  • Port libk3bdevice away from Qt::Core5Compat. Commit .
  • Add dontAskAgain about add hidden files for DataUrlAddingDialog. Commit . See bug #484737 .
  • Remove unused out parameter. Commit .
  • Remove QTextCodec use. Commit .
  • Settings (External Programs): Give a useful error message on failure. Commit .
  • Settings (External Programs): Consistent permissions format for both columns. Commit .
  • Remove unneeded Id from plugin metadata. Commit . Fixes bug #483858 .
  • [kcm] Rework account rename and removal popups. Commit . Fixes bug #482307 .
  • Move "add new account" action to top and update placeholder message. Commit .
  • Fix link target. Commit .
  • Prepare for the future activities support. Commit .
  • Add vcs-browser. Commit .
  • Fix mem leak. Commit .
  • Pass widget to drawPrimitive. Commit .
  • Use StartupNotify directly. Commit .
  • Tooltips on UTile: was dark font on black background. Commit .
  • Remove some Optional[] annotation clauses around tooltips. Commit .
  • HandId: resolve some type:ignore[override]. Commit .
  • Game: remove wrong TODOs. Commit .
  • Mypy: diverse, mostly cast(), assertions. Commit .
  • Query: add more logDebug. Commit .
  • Resource: cast config entries to str. Commit .
  • Fix annotations around QModelIndex. Commit .
  • Background: simplify pixmap(). Commit .
  • Scoring dialog: windlabels. Commit .
  • Fix ruleset differ. Commit .
  • Fix some annotations. Commit .
  • Move Prompt.returns() to KDialog.returns(). Commit .
  • Workaround for mypy problems with operators like QPointF+QPointF. Commit .
  • Qt: update obsolete things. Commit .
  • Replace .exec_() with .exec(). Commit .
  • New: ScoringComboBox, simplifiying code. Commit .
  • Annotations: add declarations for ui-generated attributes. Commit .
  • Rename insertAction and removeAction because inherited QDialog already uses them differently. Commit .
  • Qt6: full qualified names for enum members. Commit .
  • Scoring dialog: simplify player selections. Commit .
  • Regression from b1d3de8, 2023-10-05: Cancel deleting game must not throw exception. Commit .
  • Regression from 7a7f442e: undefined seed is now 0 in sql, not null. Commit .
  • Scoring game: on 2nd game, DB was not correctly opened. Commit .
  • Fix init order in WindLabel. Commit .
  • Revert part of b087aaca108234f939e332034ac4f7cc0ccc5a2e. Commit .
  • Pylint: common.py. Commit .
  • Merging problem: ChatMessage, ChatWindow undefined. Commit .
  • Qt6 only worked when Qt5 was installed too. Commit . Fixes bug #486171 .
  • Revert "remove HumanClient.remote_chat(), does not seem to be needed". Commit .
  • Select scoring game: delete may actually be called with 0 rows selected. Commit .
  • Games list: INSERT key never worked anyway, remove this. Commit .
  • Remove unused KDialog.spacingHint() and replace obsolete marginHint(). Commit .
  • Question dialogs had Info Icon instead of Question Icon, and remove unused code. Commit .
  • Versions are always int (default port number). Commit .
  • Try simplifying sqlite3 error handling. EXPERIMENTAL. Commit .
  • Query context manager: when done, reset inTransaction to None. Commit .
  • Use ReprMixin for more classes and improve some str . Commit .
  • Minor: rename initRulesets to __initRulesetsOrExit. Commit .
  • Close/open db connection per game. Commit .
  • InitDb(): remove code commented out in 2014. Commit .
  • Logging for sqlite locked. Commit .
  • Do not animate changes resulting from config changes. Commit .
  • Avoid spurious exception on teardown. Commit .
  • Player.__possibleChows(): simplify. Commit .
  • Selecting one of several possible chows: hide close window button. Commit .
  • Player: use MeldList for concealedMelds and exposedMelds. Commit .
  • MeldList: slice now also returns a MeldList. Commit .
  • Player.BonusTiles now returns TileList. Commit .
  • Tile.name2(): simplify. Commit .
  • Kajonggtest: accept spaces in args. Commit .
  • Player.assertLastTile - disabled for now. Commit .
  • Kajongg --help: clarify help texts because they were mistranslated to German. Commit .
  • Player: remove unused 'def mjString'. Commit .
  • Cleanup FIXMEs. Commit .
  • Convert to f-strings using flynt 1.0.1. Commit .
  • Kajonggtest.py: 400 currently is not enough history. Commit .
  • Kajonggtest.py: pretty --abbrev=10. Commit .
  • Gitignore .jedi/. Commit .
  • Prefer _{id4} over [id4]. Commit .
  • UITile. str shorter if not Debug.graphics. Commit .
  • New: UIMeld. str . Commit .
  • Rename method. Commit .
  • Board: yoffset is now always an int, introducing showShadowsBetweenRows for HandBoard. Commit .
  • Add a FIXME for HandBoard.checkTiles. Commit .
  • Since when does this trigger when toggling showShadows?. Commit .
  • Rename lowerHalf to forLowerHalf. Commit .
  • Mainwindow: rename playingScene to startPlayingGame, scoringScene to startScoringGame. Commit .
  • Remove commented code about capturing keyboard interrupt. Commit .
  • WindDisc: change inheritance order. WHY?. Commit .
  • Mypy is now clean: add pyproject.toml with modules to ignore. Commit .
  • Mypy: wind.py. Commit .
  • Mypy: wall.py. Commit .
  • Mypy: visible.py. Commit .
  • Mypy: util.py. Commit .
  • Mypy: uiwall.py. Commit .
  • Mypy: uitile.py. Commit .
  • Mypy: tree.py. Commit .
  • Mypy: tilesource.py. Commit .
  • Mypy: tilesetselector. Commit .
  • Mypy: tileset.py. Commit .
  • Mypy: tile.py. Commit .
  • Mypy: tables.py. Commit .
  • Mypy: statesaver.py. Commit .
  • Mypy: sound.py. Commit .
  • Mypy: setup.py. Commit .
  • Mypy: servertable.py. Commit .
  • Mypy: server.py. Commit .
  • Mypy: scoringtest.py. Commit .
  • Mypy: scoringdialog.py. Commit .
  • Mypy: scoring.py. Commit .
  • Mypy: scene.py. Commit .
  • Mypy: rulesetselector.py. Commit .
  • Mypy: rule.py. Commit .
  • Mypy: rulecode.py. Commit .
  • Mypy: rand.py. Commit .
  • Mypy: permutations.py. Commit .
  • Mypy: query.py. Commit .
  • Mypy: qtreactor.py. Commit .
  • Mypy: qt.py. Commit .
  • Mypy: predefined.py. Commit .
  • Mypy: playerlist.py. Commit .
  • Mypy: player.py. Commit .
  • Mypy: move.py. Commit .
  • Mypy: modeltest.py. Commit .
  • Mypy: mjresource.py. Commit .
  • Mypy: mi18n.py. Commit .
  • Mypy: message.py. Commit .
  • Mypy: mainwindow.py. Commit .
  • Mypy: login.py. Commit .
  • Mypy: log.py. Commit .
  • Mypy: kdestub.py. Commit .
  • Mypy: kajonggtest.py. Commit .
  • Mypy: kajongg.py. Commit .
  • Mypy: kajcsv.py. Commit .
  • Mypy: intelligence.py. Commit .
  • Mypy: humanclient.py. Commit .
  • Mypy: handboard.py. Commit .
  • Mypy: hand.py. Commit .
  • Mypy: guiutil.py. Commit .
  • Mypy: genericdelegates.py. Commit .
  • Mypy: games.py. Commit .
  • Mypy: differ.py. Commit .
  • Mypy: dialogs.py. Commit .
  • Mypy: deferredutil.py. Commit .
  • Mypy: config.py. Commit .
  • Mypy: common.py. Commit .
  • Mypy: client.py. Commit .
  • Mypy: chat.py. Commit .
  • Mypy: board.py. Commit .
  • Mypy: background.py. Commit .
  • Mypy: animation.py. Commit .
  • Mypy: def only. Commit .
  • Prepare intelligence for mypy: assertions. Commit .
  • Prepare intelligence.py for annotations: local var was used for more than one thing. Commit .
  • Util.callers() can now get a frame. Commit .
  • Hide a discrepancy between Qt Doc and Qt Behaviour. Commit .
  • Hand.lastSource: default is not None but TileSource.Unknown. Commit .
  • Board.setTilePos: height is now float. Commit .
  • Client: catch all exceptions in exec_move. Commit .
  • KIcon: do not call QIcon.fromTheme(None). Commit .
  • Prepare genericdelegates.py for annotations. Commit .
  • Prepare servertable.py for annotations. Commit .
  • Prepare handboard.py for annotations. Commit .
  • Move _compute_hash() from Tiles to TileTuple, remove TileList. hash . Commit .
  • Extract Tile.cacheMelds. Commit .
  • Put meld.py into tile.py, avoiding circular reference for mypy. Commit .
  • Remove Tiles.exposed(). Commit .
  • Prepare wind.py for annotations: remove class attr static init for tile and disc AND MUCH IN TILE.PY!!!. Commit .
  • Prepare server.py for annotations. Commit .
  • Prepare twisted reactor for annotations. Commit .
  • Prepare rulecode.py for annotations. Commit .
  • Move shouldTry and rearrange from StandardMahJongg to MJRule. Commit .
  • Prepare rulecode.py for annotations: rename some local variables. Commit .
  • Prepare scoringtest.py for annotations. Commit .
  • DeferredBlock: pass player list instead of single player to tell(). Commit .
  • DeferredBlock hasattr(receivers). Commit .
  • DeferredBlock: rename local var about to aboutPlayer. Commit .
  • Prepare deferredutil.py for annotations: assertions only. Commit .
  • Prepare mainwindow.py for annotations. Commit .
  • Player: use MeldList. WARN: Changes scoring. Commit .
  • Kajonggtest.py --log: use append mode. Commit .
  • Player.violatesOriginalCall(): discard arg is mandatory. Commit .
  • Player.showConcealedTiles only accepts TileTuple. Commit .
  • Player: simplify code. Commit .
  • Player: use TileList instead of list(). Commit .
  • Prepare player.py for annotations: Player. lt : False if other is no Player. Commit .
  • Player.tilesAvailable: rename arg tilename to tile. Commit .
  • Prepare player.py for annotations: assertions. Commit .
  • Player.maybeDangerous now returns MeldList instead of list. Commit .
  • Player.maybeDangerous: better code structure, should be neutral. Commit .
  • Rulecode.py: cls args: make mypy happy. Commit .
  • *.meldVariants() now returns MeldList instead of List[Meld]. Commit .
  • Rule.rearrange() and Rule.computeLastMelds() now always return MeldList/TileList. Commit .
  • Player: better Exception message. Commit .
  • KLanguageButton and KSeparator: make parent mandatory. Commit .
  • ClientDialog: setX/setY() expect int. Commit .
  • Use logException for all missing addErrback. Commit .
  • Client.tableChanged: small simplification. Commit .
  • Client.declared() used move.source, should be move.meld TODO WHY,SINCE WHEN?. Commit .
  • Prepare board.py for annotations. Commit .
  • YellowText: do no rename args in override. Commit .
  • Rewrite class Help. Commit .
  • StateSaver: always save at once. Commit .
  • Config default values can no longer be overidden by callers. Commit .
  • Correctly call QCommandLineOption. init . Commit .
  • Animation: fix debug output. Commit .
  • RichTextColumnDelegate: do not need cls.document. Commit .
  • Prepare tilesetselector.py for annotations. Commit .
  • Tileset: simplify code around renderer. Commit .
  • Tileset: do not _ init tileSize and faceSize. Commit .
  • Prepare tileset.py for annotations: only safe changes. Commit .
  • Loading tileset: fix creation of exception. Commit .
  • __logUnicodeMessage: rename local variable. Commit .
  • ElapsedSince: if since is None, return 0.0. Commit .
  • Duration.threshold: change default code. Commit .
  • Ruleset: rename name to raw_data. Commit .
  • No longer support deprecated im_func. Commit .
  • Prepare rule.py for annotations. Commit .
  • Score.total(): rename local variable score to result. Commit .
  • Prepare animation.py for annotations. Commit .
  • Prepare backgroundselector.py for annotations. Commit .
  • Prepare background.py for annotations. Commit .
  • Prepare mjresource.py for annotations. Commit .
  • Prepare tree.py for annotations. Commit .
  • TreeModel.parent(): fix docstring. Commit .
  • Prepare user.py for annotations. Commit .
  • Prepare chat.py for annotations. Commit .
  • Prepare rand.py for annotations. Commit .
  • Prepare wall.py for annotations: assertions. Commit .
  • Prepare login.py for annotations. Commit .
  • Prepare uiwall.py for annotations. Commit .
  • Prepare uitile.py for annotations. Commit .
  • Prepare humanclient.py for annotations. Commit .
  • Prepare client.py for annotations: assert. Commit .
  • Prepare kdestub.py for annotations (assert). Commit .
  • Hand: make more use of TileList/TileTuple/MeldList. Commit .
  • Hand.__maybeMahjongg now always returns a list. Commit .
  • Hand: another assertion for mypy;. Commit .
  • Hand.score is never None anymore, use Score() instead. Commit .
  • Hand: rename more local variables. Commit .
  • Prepare hand.py for annotations: a few more safe things. Commit .
  • Prepare hand.py for annotations: assertions only. Commit .
  • DbgIndent: handle not parent.indent. Commit .
  • Hand.__applyBestLastMeld: better local variable name. Commit .
  • Player.py: prepare for annotations. Commit .
  • Prepare mi18n.py for annotations. Commit .
  • Prepare qtreactor.py for annotations. Commit .
  • Prepare qt.py for annotations: import needed Qt things. Commit .
  • Prepare differ.py for annotations. Commit .
  • Prepare query.py for annotations. Commit .
  • Prepare message.py for annotations. Commit .
  • Prepare kajonggtest.py for annotations. Commit .
  • Prepare rulesetselector.py for annotations. Commit .
  • Prepare scoringdialog.py for annotations. Commit .
  • Prepare scoringdialog.py for annotations: fix bool/int/float types. Commit .
  • Prepare scoringdialog.py for annotations: remove unneeded assignment. Commit .
  • Prepare scoringdialog.py for annotations: comboTilePairs is never None but set(). Commit .
  • Prepare scoringdialog.py for annotations: override: do not change signatures. Commit .
  • Prepare scoringdialog.py for annotations: use Meld/MeldList. Commit .
  • Prepare scoringdialog.py for annotations: do not put None into widget lists. Commit .
  • Prepare scoringdialog.py for annotations: do not change signature of ScoreModel. init . Commit .
  • Prepare scoringdialog.py for annotations: rename .model to ._model, no wrong override. Commit .
  • Prepare scoringdialog.py for annotations: minX and minY are never None. Commit .
  • Prepare scoringdialog for annotations: checks and assertions against None. Commit .
  • Prepare scoringdialog.py for annotations: do no change attr type. Commit .
  • Prepare scoringdialog for annotations: assert. Commit .
  • Prepare scoring.py for annotations. Commit .
  • Prepare tables.py for annotations. Commit .
  • Prepare client.py for annotations: protect against defererencing None. Commit .
  • Prepare move.py for annotations: assertions. Commit .
  • Prepare permutations.py for annotations. Commit .
  • Prepare kajcsv.py for annotations. Commit .
  • Small fix in decorateWindow - title. Commit .
  • Prepare games.py for annotations. Commit .
  • Prepare game.py for annotations. Commit .
  • Prepare configdialog.py for annotations. Commit .
  • Prepare config.py for annotations. Commit .
  • PlayingGame: small simplification. Commit .
  • SelectButton: simplify API. Commit .
  • AnimationSpeed: safer debug format string. Commit .
  • Chat.appendLine: do not accept a list anymore. Commit .
  • MainWindow.queryExit: simplify local quitDebug(). Commit .
  • WindLabel: move init () up. Commit .
  • Allow BackGround() and Tileset() for simpler annotations. Commit .
  • Random.shuffle(): restore behaviour for pre - python-3.11. Commit .
  • Introduce Hand.is_from_cache. Commit .
  • Model subclasses: data and headerData: consistent default for role arg. Commit .
  • Ruleset editor: be more specific with comparing class types. Commit .
  • Rewrite event logging, now also supports Pyside. Commit .
  • TableList: restructure UpdateButtonsForTable. Commit .
  • Board: fix usage of Tile.numbers. Commit .
  • Wall: init self.living to [], not to None. Commit .
  • MJServer: call logDebug: withGamePrefix=False, not None. Commit .
  • Server.callRemote: always return a Deferred. Commit .
  • MeldList in rulecode. Commit .
  • Wriggling Snake: protect against LastTile None. Commit .
  • Introduce Tile.none. Commit .
  • Rule classes: remove convertParameter(). Commit .
  • Abort Game dialog: handle cancelled Deferred. Commit .
  • Intelligence: prepare for annotations. Commit .
  • Scoring: findUIMeld and uiMeldWith Tile now never return None. Commit .
  • Ruleseteditor: col0:name is read only. Commit .
  • Move: remove self.lastMeld from init . Commit .
  • Indent in tableChanged seems wrong. Commit .
  • Humanclient: small simplification. Commit .
  • Humanclient: renamed self.layout to self.gridLayout. Commit .
  • HumanClient.tableChanged: return old and new Table like ancestor does. Commit .
  • Humanclient.ClientDialog: no self.move = in init . Commit .
  • ListComboBox now always wants list, does not Accept None anymore. Commit .
  • KStandardAction: use Action instead of QAction. Commit .
  • Kdestub: remove KDialog.ButtonCode(). TODO: WHY?. Commit .
  • Board has no showShadows attribute. Commit .
  • Tree: make rawContent private, new readonly property raw. Commit .
  • Use QColor instead of str names, and www names instead of Qt.GlobalColor. Commit .
  • Fix signatures for rowCount() and columnCount(). Commit .
  • Qt6: do not directly access Qt namespace, always use the specific enums like Qt.CheckState. Commit .
  • Login: extract __check_socket(). Commit .
  • Prepare dialogs.py for annotations. Commit .
  • Common: lazy init of reactor. Commit .
  • Introduce Debug.timestamp. Commit .
  • Prepare for annotations: common.py. Commit .
  • Currently, class IgnoreEscape only works with Pyside. In PyQt, wrappers interfere. Commit .
  • Prepare client.py for annotations. Commit .
  • Correctly use QApplication.isRightToLeft(). Commit .
  • TODO ServerMessage.serverAction() added. But why???. Commit .
  • Scoringtest: some last melds were missing. Commit .
  • Score. nonzero renamed to bool , we are now Python3. Commit .
  • Tell..() now gets game.players instead of List[Tuple[wind, name]]. Commit .
  • Modeltest: rename parent() to test_parent(). Commit .
  • Fix IgnoreEscape.keyPressEvent. Commit .
  • New: KConfigGroup. str (). Commit .
  • Resources now MUST have VersionFormat. Commit .
  • ConfigParser: use sections() instead of _sections. Commit .
  • Message.py: call Player.showConcealedTiles() with TileTuple. Commit .
  • Kajonggtest: remove unused class Client. Commit .
  • Fix srvError. Commit .
  • BlockSignals: simplify signature. Commit .
  • Prepare sound.py for annotations. Commit .
  • Mypy: prepare common.py. Commit .
  • Always use sys.platform instead of os.name and the twisted thing. Commit .
  • Remove mainWindow.showEvent: its code was illegal and seemingly unneeeded. Commit .
  • Board: rename setPos to setTilePos: do not override setPos. Commit .
  • Mypy preparation: assert in rule.py. Commit .
  • Remove Scene.resizeEvent(), was never called. Commit .
  • New: Connection. str . Commit .
  • Meld: add debug output to assertion. Commit .
  • Prepare for annotations: winprep.py. Commit .
  • Prepare for annotations: rename Board.setRect to setBoardRect. Commit .
  • Prepare scene.py for annotations: assertion. Commit .
  • Prepare visible.py for annotations. Commit .
  • VisiblePlayer always has a front. Commit .
  • Game.ruleset: simplify. Commit .
  • Kajonggtest: get rid of global KNOWNCOMMITS. Commit .
  • Game: better ordering of method. Commit .
  • Hand() now also accepts individual args instead of string. Commit .
  • UITile(str) -> UITile(Tile(str)). Commit .
  • Tiles: rename hasChows() to possibleChows(). Commit .
  • Tile: fix for TileList with UITile. Commit .
  • New: TileList. add . Commit .
  • Tiles. iter . Commit .
  • TileList/TileTuple: put common code into Tiles. Commit .
  • Hand: improve error messages. Commit .
  • Remote_abort: clear pointer to closed game. Commit .
  • Game.debug() now accepts showStack arg. Commit .
  • Hand.newString: rename rest to unusedTiles. Commit .
  • Hand: rename __rest to unusedTiles. Commit .
  • Hand: does not need to have its own reference to player.intelligence. Commit .
  • Remove some ancient code about x in string which I do not understand anymore. Commit .
  • PieceListe.remove(): rename local variable. Commit .
  • PieceList.remove(): meaningful ValueError. Commit .
  • Use Piece for Wall, PieceList for Player._concealedTiles, TileTuple for Player.concealedTiles. Commit .
  • New, unused: Piece and PieceList. Commit .
  • Prepare Tile classes for Piece. Commit .
  • Servertable: handEnded and tilePicked for callbacks. Commit .
  • Meld is now TileTuple instead of TileList. Commit .
  • New: TileList. repr . Commit .
  • Use new class TileTuple in some places. Commit .
  • New: class TileTuple without using it yet. Commit .
  • New: Tile.setUp. Commit .
  • Tile does not inherit from str anymore. Commit .
  • Add FIXME for player.py. Commit .
  • Player.lastTile: use Tile.unknown instead of None. Commit .
  • Tile. bool (). Commit .
  • Tile: prepare code around Xy for bool (). Commit .
  • Tile: prepare code for bool (). Commit .
  • Tile * 5 and Tile *=5 create lists. Commit .
  • New: Tile/UITile.change_name(). Commit .
  • UITile: define proxies for tile, reducing size of following commits. Commit .
  • MJServer: fix format string. Commit .
  • New: Tile.name2(). Commit .
  • New: Tile.unknownStr. Commit .
  • Tile: use isExposed instead of isLower(). Commit .
  • New: len(Wall). Commit .
  • Meld: make warnings more robust. Commit .
  • Meld.without(): add assertions. Commit .
  • Animation: elim local pNname. Commit .
  • Animation. init (): init self.debug earlier. Commit .
  • PlayerList.parent is not needed, remove. Commit .
  • Graphics objects: rename name to debug_name(). Commit .
  • ReprMixin improvements. Commit .
  • ReprMixin now shows id4. Commit .
  • Rename StrMixin to ReprMixin. Commit .
  • Move id4 and Fmt from util to common. Commit .
  • Better debug output. Commit .
  • DeclareKong always expects a Meld for kong. Commit .
  • Introduce Game.fullWallSize. Commit .
  • Scoringtest: Debug.callers=8. Commit .
  • Game.hasDiscarded(player, tileName): tileName renamed to tile. Commit .
  • Game.gameid is int, not str. Commit .
  • Player: sayables is now __sayables. Commit .
  • Player: rename removeTile to removeConcealedTile. Commit .
  • Player.removeTile() is never called for bonus. Commit .
  • Tile: extract storeInCache. Commit .
  • ServerTable.claimTile: better interface. Commit .
  • Use chain instead of sum() for lists. Commit .
  • Tables: .differ now is .__differ. Commit .
  • Fix removing a ruleset definition. Commit .
  • RulesetDiffer: simplify API by only accepting lists of rulesets. Commit .
  • Small simplification. Commit .
  • Ruleset option: When ordering discared tiles, leave holes for claimed tiles or not. Commit .
  • Ruleset option: Discarded tiles in order of discard. Commit . Fixes bug #451244 .
  • DiscardBoard: encapsulate __lastDiscarded. Commit .
  • Kdestub: fix bug from 2017 around QLocale. Commit .
  • KDE wish 451244: change API for DiscardBoard.setRandomPlaces. Commit .
  • Introduce DiscardBoard.claimDiscard(). Commit .
  • Game.myself is not Optional anymore, use hasattr. Commit .
  • Separate _concealedTileName() for ServerGame. Commit .
  • Rename discardTile variable to discardedTile. Commit .
  • Eliminate game.appendMove. Commit .
  • Remove --rounds. Commit .
  • Improve debug output. Commit .
  • Sound: fix ordering by preferred languages. Commit .
  • Qtreactor: remove doEvents. Commit .
  • Leaking DeferredBlock: show where they where allocated. Commit .
  • Neutral: extract __debugCollect. Commit .
  • Add more debug output for robbing a kong. Commit .
  • Move id4() from log.py to util.py for fewer dependencies. Commit .
  • Use new traceback.StackSummary. Commit .
  • DeferredBlock: new attribute "where" for finding memory leaks. Commit .
  • Id4(): failed for dead Qt objects. Commit .
  • Board: clarify method comments. Commit .
  • Minor: make code easier to understand. Commit .
  • Kajonggtest: if process fails, translate signal number into name. Commit .
  • Fix wrong usage of logDebug (showStack). Commit .
  • Explain window: adapt player subtitle to what appears in main window. Commit .
  • Deferred blocks: cleanup after bug, avoiding DoS. Commit .
  • Scoring game: penalty spinbox mishandled wrong input. Commit .
  • Setup.py: split FULLAUTHOR into AUTHOR and EMAIL. Commit .
  • Dialog assertion now prints found value, cannot reproduce. Commit .
  • Fix logDebug when getting an Exception (like from Query). Commit .
  • Query: remove obsolete upgrading code. Commit .
  • Remove Internal.scaleScene - it had a bug in tileset.py. Commit .
  • Remove HumanClient.remote_chat(), does not seem to be needed. Commit .
  • Players[]: accept only Wind, int and sclice. Commit .
  • Wind.disc: lazy init. Commit .
  • Rename side.windTile to side.disc. Commit .
  • Rename PlayerWind to WindDisc and a few related names. Commit .
  • Wind: rename marker to disc. Commit .
  • Fix whitespace. Commit .
  • Fix UITile. str format string. Commit .
  • ChatWindow(table) only. Commit .
  • Fix bug from 2017: right-align checkboxes again. Commit .
  • Fix usage of Property() - why did this work at all?. Commit .
  • Scene.abort() now always returns Deferred. Commit .
  • Remove unused Request.about. Commit .
  • ScoringScene: rename local var. Commit .
  • Game: fix format strings: %d->%s. Commit .
  • Avoid warning about negative duration. Commit .
  • Fix blessing of heaven again. Commit .
  • Pylint: remove assert. Commit .
  • Kajonggtest.py --client: help text was wrong. Commit .
  • Better repr(Meld). Commit .
  • Sound: extract SoundPopen. Commit .
  • Remove unused private attributes. Commit .
  • Do not hide assertion errors. Commit .
  • Pylint is now 2.16.2. Commit .
  • Replace deprecated optparse with argparse. Commit .
  • Locale.getdefaultlocale() is deprecated. Commit .
  • Scoring game: fix combo box for last tile. Commit .
  • Qt6: AA_UseHighDpiPixmaps is deprecated. Commit .
  • Player: changing originalCall must invalidate cached player.hand. Commit .
  • Turning a tile to make it invisible is also legal. Commit .
  • Kajonggtest did not cleanup log and obsolete commits since 2017. Commit .
  • Use StartupNotify now instead of X-KDE-StartupNotify. Commit .
  • Add release info to AppStream metadata. Commit .
  • Bug 484503: Display error message if error occurs trying to play an audio file. Commit .
  • Fix translated shortcut. Commit . See bug #484281 .
  • Update version number. Commit .
  • Remove QTextCodec usage. Commit .
  • Revert unintentional change in d54151cfa72457e85f3013b54bf39971137d5433. Commit .
  • Allow playing of remote audio files. Commit .
  • Remove fade volume description. Commit .
  • Replace deprecated call. Commit .
  • Remove X11 calls when using Wayland. Commit .
  • Remove unused declarations. Commit .
  • Use libcanberra instead of Phonon for all audio output. Commit .
  • Bug 381334: Use libcanberra instead of Phonon to play sounds. Commit .
  • In Edit Alarm dialogue, allow save if Set Volume checkbox is toggled. Commit .
  • Remove unused library. Commit .
  • When user performs Refresh Alarms, don't reload calendars twice. Commit .
  • Add remote calendar file documentation. Commit .
  • Bug 481132: Remove description of local directory calendars, which are no longer supported. Commit .
  • Fix version number. Commit .
  • Bug 481053: Fix --name command line option not using its parameter. Commit .
  • Ensure that failing autotests are noticed. Commit .
  • Fix failing autotest on FreeBSD. Commit .
  • Fix syntax. Commit .
  • Wayland updates. Commit .
  • Improve whatsthis text for Wayland. Commit .
  • Add missing includes moc. Commit .
  • It builds without deprecated methods. Commit .
  • Use nullptr here. Commit .
  • Revert "Make libplasma optional". Commit .
  • Make libplasma optional. Commit .
  • Remove unused Qt5Compat dependency. Commit .
  • Make sure to show icon. Commit .
  • Remove extra ;. Commit .
  • Update and complement org.kde.kalk.appdata.xml. Commit .
  • Port away from Qt5Compat.GraphicalEffects. Commit .
  • Remove unnecessary quickcompiler dependency. Commit .
  • Change background of the display area. Commit .
  • Port unit converter to bootom Drawer. Commit .
  • Fix cliping in unit converter selector. Commit .
  • Add i18n to units and modes. Commit .
  • Fix plot viewer using the wrong number of maximum elements. Commit .
  • Update homepage to apps.kde.org. Commit .
  • It compiles fine without deprecated method + rename variable. Commit .
  • [kcm] Pass metadata to KCModule constructor. Commit . See bug #478091 .
  • Icons: App icon is not compressed SVG. Commit .
  • Port to std::as_const. Commit .
  • Fix sounds not playing. Commit .
  • Fix porting regression. Commit .
  • Remove Qt5 parts. Commit .
  • Add developer_name tag to the appdata file. Commit .
  • Add homepage URL. Commit .
  • KF app templates: use non-development min dependency KF 6.0. Commit .
  • Non-simple KF app template: deploy ui.rc file as Qt resource. Commit .
  • Add missing icon for android. Commit .
  • Fix icons on windows again. Commit .
  • Workaround for a qtmultimedia backend issue. Commit .
  • Add manual proxy configuration. Commit . Implements feature #467490 .
  • Fix clipping of ListView in ErrorListOverlay. Commit .
  • Fix missing streaming button on android. Commit .
  • Fix qml property assignment. Commit .
  • Refactor conversion from enum to int and vice versa. Commit .
  • Save filters on episode list and episode detail pages. Commit . Implements feature #466792 .
  • Workaround for mipmap issue with Image. Commit .
  • Set breeze as icon fallback theme. Commit .
  • Implement interval-based automatic podcast updates. Commit . Fixes bug #466789 .
  • Update appstream data. Commit .
  • Remove workaround for FolderDialog for flatpak. Commit . Fixes bug #485462 .
  • Fix i18nc call. Commit .
  • Add option to show podcast title on entry delegates. Commit .
  • Add switch to display Podcast image instead of Episode image. Commit .
  • Clean up the feed addition routine. Commit .
  • Improve i18nc for page titles. Commit .
  • Add comments to translatable strings in Settings. Commit .
  • Set correct icon fallback search path. Commit .
  • Add link to windows builds in README.md. Commit .
  • Fix icons not showing up in windows. Commit .
  • README: Fix location of nightly Android builds. Commit .
  • Remove unused includes. Commit .
  • Bump KF6 dependency and set compiler settings level. Commit .
  • Remove all dbus linking on windows. Commit .
  • Add release notes for 24.02.0. Commit .
  • Move back to stable dependencies for craft. Commit .
  • Add windows CD now binary-factory is gone. Commit .
  • Split off appearance settings into a dedicated section. Commit .
  • Introduce property to switch between mobile and desktop view. Commit .
  • Update date in KAboutData. Commit .
  • Fix incorrect colorscheme on startup. Commit .
  • Workaround for TapHandler+ColumnView issues. Commit .
  • Fix mobile player background on dark theme. Commit .
  • Add check for invalid embedded images. Commit . Fixes bug #480263 .
  • Fix the pause() method toggling pause state for VLC backend. Commit . Fixes bug #474432 .
  • Fix SectionListHeaders on DownloadListPage. Commit .
  • Add StartupWMClass to org.kde.kasts.desktop. Commit .
  • Add screenshot to README. Commit .
  • Solve size issues and adapt to match desktop and breeze style. Commit .
  • Show chapters in the progress slider. Commit .
  • Port to declarative type registration. Commit .
  • Fix image masking and smoothing. Commit .
  • Simplify author handling. Commit .
  • Remove some empty descructors. Commit .
  • Enable middle-click on systray icon to play/pause. Commit .
  • Move globaldrawer into own file. Commit .
  • Modernize cmake. Commit .
  • Port away from qt5compat graphical effects. Commit .
  • KateSaveModifiedDialog: Use message box icon size from style. Commit .
  • UrlBar: Optimize showing a directory. Commit .
  • UrlBar: Fix filtering in treeview. Commit .
  • Urlbar: Slightly optimize current symbol finding. Commit .
  • UrlBar: Fix symbol view. Commit .
  • Fix RBQL toolview remains after plugin is disabled. Commit .
  • Refer to qml language server binary by upstream name. Commit .
  • Fix capture warnings. Commit .
  • Use 6.0 as minimal release and use C++20 like frameworks. Commit .
  • Use new theme and style init functions. Commit .
  • Keep track of recent used files on saveAs & close. Commit . Fixes bug #486203 .
  • Make dbus optional. Commit .
  • Don't force konsole master. Commit .
  • Use kate from the right virtual desktop. Commit . Fixes bug #486066 .
  • These calls are officially available in KTextEditor::MainWindow. Commit .
  • Terminal plugin feature: keep one tab per directory we have a document for. Commit .
  • Fix build under Windows. Commit .
  • Fix external tools get lost on modification. Commit . Fixes bug #456502 .
  • Store path directly in KateProjectItem instead of using setData. Commit .
  • Kateconfigdialog: Change new tab placement text. Commit .
  • Fix crash on deleting the only file in view. Commit . Fixes bug #485738 .
  • Add support for ruff formatter. Commit . See bug #466175 .
  • Project: Add ruff code analysis tool. Commit . Fixes bug #466175 .
  • Port deprecated QCheckBox Qt6.7 method (QCheckBox::stateChanged->QCheckBox::checkStateChanged). Commit .
  • Project: Add html tidy analysis tool. Commit .
  • Add default Vue LSP config. Commit .
  • Fix copyright year. Commit .
  • Try less master parts. Commit .
  • Add 2 lsp server settings. Commit .
  • Kateprojectinfoviewindex: Restore Q_OBJECT macro. Commit .
  • Reduce moc usage in project plugin. Commit .
  • Fix leak. Commit .
  • Sessions: Update jump action list on shutdown. Commit .
  • Reduce moc features usage in libkateprivate. Commit .
  • Remove unnecessary usage of old style connect. Commit .
  • Ensure proper filled menu if widget has focus. Commit .
  • Show all toplevel menu entries below the curated stuff. Commit .
  • Fix tooltip hides on trying to scroll using scrollbar. Commit . Fixes bug #485120 .
  • Fix compile. Commit .
  • Remove unused var. Commit .
  • Dont use QLatin1String for non ascii stuff. Commit .
  • Use QFileInfo::exists. Commit .
  • Make signal non const. Commit .
  • Fix clazy detaching temporary warnings. Commit .
  • Fix clazy emit keyword warnings. Commit .
  • Add more hamburger actions. Commit .
  • Small cleanup. Commit .
  • Project plugin: when selecting a cmake build directory directly, don't skip it. Commit .
  • Project plugin: avoid recursion via symlinks when opening a project from a folder. Commit .
  • Project plugin: when creating a project from a directory, skip some files. Commit .
  • Port some old style signal/slot connections. Commit .
  • Use qEnvironmentVariable instead of qgetenv. Commit .
  • Cmake completion: Dont auto complete on tab and indent. Commit .
  • Fix menu bar hiding. Commit .
  • Man page: refer to Qt6 & KF6 version of commandline options now. Commit .
  • Mark risky KNS content. Commit .
  • Documents: Fix sorting for directories. Commit . Fixes bug #476307 .
  • ColorPicker: Do not keep adding to the hashmap. Commit .
  • ColorPicker: connect to line wrap/unwrap signals. Commit . Fixes bug #475109 .
  • Add job to publish to Microsoft Store. Commit .
  • Enable appx build for Windows. Commit .
  • Change license to match the rest of the files and update year. Commit .
  • Don't allow menu bar hide + hamburger menu on macOS. Commit .
  • Update rapidjson to current state. Commit .
  • Move rapidjson to 3rdparty. Commit .
  • Don't format full 3rdparty. Commit .
  • Move SingleApplication to 3rdparty. Commit .
  • Add Rainbow CSV plugin. Commit . Fixes bug #451981 .
  • Fix tabbar visibility check. Commit . Fixes bug #455890 .
  • Dont mess up Kate's hamburger menu. Commit .
  • Show translated shortcut. Commit . See bug #484281 .
  • Add screenshots for Windows to Appstream data. Commit .
  • Fix -Wunused-lambda-capture. Commit .
  • Hide menu bar in KWrite. Commit .
  • Fix session autosave deletes view session config. Commit . Fixes bug #482018 .
  • Fix typos, seperator->separator. Commit .
  • Add appimage ci. Commit .
  • Scroll Synchronisation. Commit .
  • Add a context menu to the URL bar for copying path or filename. Commit .
  • Restore last active toolview when closing file history. Commit . Fixes bug #474129 .
  • Fix tooltip not hiding after context menu was opened. Commit .
  • Diag: Trying to match cursor position instead of just line. Commit .
  • Diag: Match severity when trying to find item for line. Commit .
  • Diag: Fix severity filter. Commit .
  • Diag: Fix relatedInfo and fix items are hidden after applying filter. Commit .
  • Diag: Fix filtering after removing previous items. Commit . Fixes bug #481381 .
  • Fix build, add missing QPointer includes. Commit .
  • Move lsp context menu actions to xmlgui. Commit . Fixes bug #477224 .
  • Remove doc about dead option. Commit . See bug #483218 .
  • Add size limit config option to search in files. Commit . Fixes bug #480489 .
  • Use working directory placeholders when executing the run command. Commit .
  • Show correct tooltip for working directory cell. Commit .
  • Share code for url handling. Commit .
  • Don't acces member without checking. Commit . Fixes bug #482946 .
  • Improve safefty, don't crash on non arrays. Commit . Fixes bug #482152 .
  • Addons/konsole: Add split horizontal, vertical and new tab to terminal tools. Commit .
  • Fix the saving of the run commands for project targets. Commit .
  • Lsp client: close tabs with mouse middle button. Commit .
  • Tabswitcher: Do not emit if we're adding no documents. Commit .
  • S&R: Add a new tab if Ctrl is pressed when search is invoked. Commit .
  • Port to stable MainWindow widget api. Commit .
  • Fix rainbow highlighting breaks on bracket removal. Commit .
  • Fix tabswitcher performance when large of docs are opened. Commit .
  • Avoid many proxy invalidations on close. Commit .
  • Fix crash on close other with active widget. Commit . Fixes bug #481625 .
  • Craft: Use master markdownpart. Commit .
  • Tell Craft that we want konsole master. Commit .
  • Build Qt6 based Appx. Commit .
  • Dont include MainWindow unnecessarily. Commit .
  • More descriptive label. Commit . Fixes bug #464065 .
  • Use non-deprecated method of QDomDocument. Commit .
  • Simplify build, no extra config header. Commit .
  • Shortcut conflict with splitting. Commit .
  • Remove not existing icon. Commit .
  • Addressed review comments. Commit .
  • Reverted a couple of URL casing changes. Commit .
  • Cleanup before merge request. Commit .
  • Added action to restore previously closed tabs. Commit .
  • Use QT 6.5 deprecation level. Commit .
  • Quickopen: Handle reslectFirst with filtering. Commit .
  • Fix strikeout attribute name. Commit .
  • Fix crash. Commit .
  • Documents: Fix row numbers not updated after dnd. Commit .
  • Build plugin: make sure the selected target stays visible when changing the filter. Commit .
  • Documents: Allow closing docs with middle click optionally. Commit .
  • Allow configuring diagnostics limit. Commit .
  • Remove not-really-optional dependencies from plugins. Commit .
  • Fix diagnostic count when removing diagnostics from a doc with multiple providers. Commit .
  • Diag: Show diagnostic limit reached warning when limit is hit. Commit .
  • Diag: Always allow diagnostics for active document. Commit .
  • Fix lsp semantic tokens range request. Commit .
  • Dap/client.cpp: Use QJsonObject instead of null. Commit .
  • Fix Kate snippets: crash when editing a snippet repository. Commit . Fixes bug #478230 .
  • Fix: terminal path automatically changes on launch even if the terminal setting is disabled. Commit . Fixes bug #480080 .
  • Check for version. Commit .
  • KateSaveModifiedDialog: Play warning message box sound. Commit .
  • Don't build ktexteditor, doesn't match the sdk anymore. Commit .
  • Drop outdated pre-kf5 kconfig update rules. Commit .
  • Install theme data to themes/ subdir, for kdegames consistency. Commit .
  • Appstream demands continue... Commit .
  • Install a 128x128 icon to fix the flatpak build. Commit .
  • Fix small visual glitch when using Breeze. Commit .
  • Man use https://apps.kde.org/kbackup . Commit .
  • Update AppStream. Commit .
  • Fix typo in the launchable name. Commit .
  • Fix crash when opening the back/forward/up action menus. Commit . Fixes bug #483973 .
  • Fix instruction view. Commit .
  • Fix usage of no longer existing signal QComboBox::currentIndexChanged(QString). Commit .
  • Fix usage of no longer existing signal QComboBox::activated(QString). Commit .
  • Fix usage of no longer existing signal QProcess::error(ProcessError). Commit .
  • Appdata: add & tags. Commit .
  • Appdate: fix typo in "vi_z_ualisations". Commit . Fixes bug #465686 .
  • Bump min required CMake/Qt/KF to 3.16/6.5/6.0. Commit .
  • Fix setting key shortcuts for Reload action. Commit .
  • Add localization for decimal separator in KNumber.toQString. Commit .
  • It compiles with QT_NO_CONTEXTLESS_CONNECT. Commit .
  • Promote square root button to Normal mode. Commit . Fixes bug #471088 .
  • Add cubic root parsing. Commit .
  • Allow the string 'XOR' as a token for typed expressions. Commit .
  • Change default shortcut to Calculator. Commit . See bug #478936 .
  • Apply missing i18n. Commit .
  • Use a more frameless style for the calculator display. Commit .
  • 461010 FEATURE: 470371 FEATURE: 470591 FEATURE: 142728 FEATURE: 459999 FEATURE: 443276 CCBUG: 447347 BUG: 454835. Commit .
  • Fix compile warning. Commit .
  • Add [[nodiscard]]. Commit .
  • Make use of ECMAddAppIcon to add app icon. Commit .
  • Flapak: Installl the breeze icon. Commit .
  • Remove warning. Commit .
  • Fix qml warning. Commit .
  • Change appdata to comply with new FlatHub guidelines. Commit .
  • Update org.kde.kclock.appdata.xml. Commit .
  • Remove custom appstream check. Commit .
  • Fix selecting custom sound in alarm form being broken. Commit . Fixes bug #484229 .
  • Port timer to play ringing sound through custom alarmplayer, rather than knotification. Commit . Fixes bug #483824 .
  • Fix soundpicker page entries not selectable due to type error. Commit . Fixes bug #483453 .
  • Ci: Use ubuntu runner. Commit .
  • Ci: Add tag to appstream test. Commit .
  • Add backdrop icon to time page. Commit .
  • Stopwatch: Refactor and move laps model to C++, improve UI. Commit . See bug #481883 .
  • Remove clock widget on time page. Commit .
  • Fix navbar icons not showing with qqc2-breeze-style. Commit .
  • Don't crash on unload. Commit . Fixes bug #484236 .
  • Add nurmi to relicensecheck.pl. Commit .
  • Add QWindow support. Commit .
  • Add merritt to relicensecheck.pl. Commit .
  • Rename include moc too. Commit .
  • Appstream: add developer tag. Commit .
  • Remove character that wasn't supposed to be in the install command. Commit .
  • Src/kded/kded.cpp : Fix typo in InotifyModule::refresh() i18n msgs. Commit .
  • Don't export private symbol. Commit .
  • Port deprecated [=]. Commit .
  • Depend against last qt version. Commit .
  • Remove qml version. Commit .
  • Replace Kirigami.BasicListItem. Commit .
  • Use constexpr. Commit .
  • Add cppcheck support. Commit .
  • It compiles fine without deprecated method. Commit .
  • Fix url (use qt6 path). Commit .
  • We use QT_REQUIRED_VERSION here. Commit .
  • Optimization. Commit .
  • Fix typo. Commit .
  • Add a homepage to appdata to satisfy CI. Commit .
  • Output rules that override all others at the top of the save file. Commit .
  • Better wording for the CategoryWarning message. Commit .
  • Ensure that the CategoryWarning is shown, if relevant, on first startup. Commit .
  • Eliminate annoying "declaration shadows a member" warnings. Commit .
  • Use QLatin1StringView directly. Commit .
  • Remove no longer necessary Qt6Core5Compat dependency. Commit .
  • [filetransferjob] Simplify error handling. Commit .
  • Add 24.02.0 Windows artifact. Commit .
  • Smsapp/conversation list: Fix formatting issues and refactor code. Commit .
  • Fix: do not send NetworkPacket if autoshare is disabled when connecting. Commit . Fixes bug #476551 .
  • Fix incorrect filename for duplicate copies on notification displays. Commit . Fixes bug #484727 .
  • Make clang-format happy. Commit .
  • Smsapp/qml: Remove explicit column height binding. Commit .
  • Smsapp: Clean up conversation list title elements. Commit .
  • Smsapp/attachments: Remove Qt5Compat import. Commit .
  • Smsapp: Use Kirigami.ShadowedRectangle instead of DropShadow. Commit .
  • Smsapp/qml: Remove unneeded imports. Commit .
  • Improve accessibility based on HAN university accessibility report. Commit .
  • Smsapp/qml: Define explicit params in signal handlers. Commit .
  • Add macOS Craft builds. Commit .
  • Apply 2 suggestion(s) to 2 file(s). Commit .
  • Don't install kdeconnectd in libexec. Commit .
  • [kcm] Use correct KCModule constructor. Commit . Fixes bug #482199 . See bug #478091 .
  • Sftp: --warning. Commit .
  • App: Put the Placeholder inside the view. Commit .
  • Remove unused dependency. Commit .
  • Remove master dependency overrides from craft config. Commit .
  • Disable Bluetooth backend due to https://bugs.kde.org/show_bug.cgi?id=482192 . Commit .
  • Singlerelease is actually used. Commit .
  • [plugins/mousepad]: Add support for the persistence feature of the RemoteDesktop portal. Commit . Fixes bug #479013 .
  • [plugins/telephony] Clear actions before creating new notification action. Commit . Fixes bug #479904 .
  • Double click to select a track in timeline. Commit . See bug #486208 .
  • Fix sequence clip inserted in another one is not updated if track is locked. Commit . Fixes bug #487065 .
  • Fix duplicating sequence clips. Commit . Fixes bug #486855 .
  • Fix autosave on Windows (and maybe other platforms). Commit .
  • Fix crash on undo sequence close. Commit .
  • Fix wrong FFmpeg chapter export TIMEBASE. Commit . Fixes bug #487019 .
  • Don't invalidate sequence clip thumbnail on save, fix manually setting thumb on sequence clip. Commit .
  • Fixes for OpenTimelineIO integration. Commit .
  • Don't add normalizers to timeline sequence thumb producer. Commit .
  • Fix crash undoing an effect change in another timeline sequence. Commit .
  • WHen dragging a new clip in timeline, don't move existing selection. Commit .
  • Faster sequence switching. Commit .
  • Create sequence thumbs directly from bin clip producer. Commit .
  • Better icon for proxy settings page. Commit .
  • Fix mouse wheel does not scroll effect stack. Commit .
  • Open new bin: only allow opening a folder. Commit .
  • Fix monitor play/pause on click. Commit .
  • Ensure Qtblend is the prefered track compositing option. Commit .
  • Fix thumnbails and task manager crashes. Commit .
  • Various fixes for multiple bin projects. Commit .
  • Fix monitor pan with middle mouse button, allow zoomin until we have 60 pixels in the monitor view. Commit . See bug #486211 .
  • Fix monitor middle mouse pan. Commit .
  • Track compositing is a per sequence setting, correctly handle it. Commit .
  • Fix archive widget showing incorrect required size for project archival. Commit .
  • FIx crash dragging from effect stack to another sequence. Commit . See bug #467219 .
  • Fix consumer crash on project opening. Commit .
  • Fix copying effect by dragging in project monitor. Commit .
  • Fix crash dropping effect on a track. Commit .
  • Fix duplicating Bin clip does not suplicate effects. Commit . Fixes bug #463399 .
  • Workaround KIO Flatpak crash. Commit . See bug #486494 .
  • Fix effect index broken in effectstack. Commit .
  • Fix double click in timeline clip to add a rotoscoping keyframe breaks effect. Commit .
  • Fix copy/paste rotoscoping effect. Commit .
  • Allow enforcing the Breeze icon theme (disabled by default on all platforms). Commit .
  • Fix effect param flicker on drag. Commit .
  • Fix tests warnings. Commit .
  • Test if we can remove our dark breeze icon theme hack on all platforms with the latest KF changes. Commit .
  • Dont lose image duration when changing project's framerate. Commit . See bug #486394 .
  • Fix composition move broken in overwrite mode. Commit .
  • Fix opening Windows project files on Linux creates unwanted folders. Commit . See bug #486270 .
  • Audio record: allow playing timeline when monitoring, clicking track rec... Commit . See bug #486198 . See bug #485660 .
  • Fix compile warnings. Commit .
  • Fix Ctrl+Wheel not working on some effect parameters. Commit . Fixes bug #486233 .
  • On sequence change: correctly stop audio monitoring, fix crash when recording. Commit .
  • Fix Esc key not correctly stopping audio record. Commit .
  • Fix audio rec device selection on Qt5. Commit .
  • Fix Qt5 compilation. Commit .
  • Fix audio capture source not correctly saved / used when changed. Commit .
  • Fix audio mixer initialization. Commit .
  • Fix crash disabling sequence clip in timeline. Commit . Fixes bug #486117 .
  • Minor fixes and rephrasing for render widget duration info. Commit .
  • Adjust timeline clip offset label position and tooltip. Commit .
  • Feat: Implement effect groups. Commit .
  • Windows: disable force breeze icon and enforce breeze theme by default. Commit .
  • Edit clip duration: process in ripple mode if ripple tool is active. Commit .
  • Delay document notes widget initialisation. Commit .
  • Limit the threads to a maximum of 16 for libx265 encoding. Commit .
  • Another round of warning fixes. Commit .
  • Fix Qt6 deprecation warning. Commit .
  • Restore audio monitor state when connecting a timeline. Commit .
  • Work/audio rec fixes. Commit .
  • Cleanup and fix crash dragging a bin clip effect to a timeline clip. Commit .
  • Add close bin icon in toolbar, reword open new bin. Commit .
  • Correctly ensure all Bin Docks have a unique name, add menu entry in Bin to create new bin. Commit .
  • Fix a few Project Bin regressions. Commit .
  • Remove unused parameter. Commit .
  • Add multi-format rendering. Commit .
  • Fix crash opening a file on startup. Commit .
  • New camera proxy profile for Insta 360 AcePro. Commit .
  • Fix slip tool. Commit .
  • Qt6 Audio recording fixes. Commit .
  • MLT XML concurrency issue: use ReadWriteLock instead of Mutex for smoother operation. Commit .
  • Rename View menu "Bins" to "Project Bins" to avoid confusion, don't set same name for multiple bins. Commit .
  • Add tooltip to channelcopy effect. Commit .
  • Fix crash after save in sequence thumbnails. Commit . See bug #485452 .
  • Remove last use of dropped icon. Commit .
  • Use default breeze icon for audio (fixes mixer widget using all space). Commit .
  • Additional filters for file pickers / better way of handling file filters. Commit .
  • [nightly flatpak] Fix build. Commit .
  • Use default breeze icon for audio. Commit .
  • Fix possible crash on closing app just after opening. Commit .
  • Fix startup crash when pressing Esc. Commit .
  • Fix effects cannot be enabled after saving with disable bin/timeline effects. Commit . Fixes bug #438970 .
  • Audio recording implementation for Qt6. Commit .
  • Fix tests. Commit .
  • Fix guides list widget not properly initialized on startup. Commit .
  • Fix Bin initialized twice on project opening causing various crashes. Commit . See bug #485452 .
  • Fix crashes on insert/overwrite clips move. Commit .
  • Fix clips and compositions not aligned to track after spacer operation. Commit .
  • Fix spacer crash with compositions. Commit .
  • Fix spacer crash with guides, small optimization for group move under timeline cursor. Commit .
  • Correctly delete pluggable actions. Commit .
  • Fix dock action duplication and small mem leak. Commit .
  • View menu: move bins and scopes in submenus. Commit .
  • Ensure autosave is not triggered while saving. Commit .
  • Store multiple bins in Kdenlive Settings, remember each bin type (tree or icon view). Commit .
  • Code cleanup: move subtitle related members from timelinemodel to subtitlemodel. Commit .
  • Faster spacer tool. Commit .
  • Fix tab order of edit profile dialog. Commit .
  • Fix blurry folder icon with some project profiles. Commit .
  • Fix spacer tool with compositions and subtitles (broken by last commit). Commit .
  • Make spacer tool faster. Commit .
  • Monitor: add play zone from cursor. Commit . Fixes bug #484103 .
  • Improve AV1 NVENC export profile. Commit .
  • Translate shortcut too. Commit .
  • Require at least MLT 7.22.0. Commit .
  • Use proper method to remove ampersand accel. Commit .
  • Drop code duplicating what KAboutData::setApplicationData() & KAboutData::setupCommandLine() do. Commit .
  • Fix possible crash when quit just after starting. Commit .
  • Fix crash in sequence clip thumbnails. Commit . See bug #483836 .
  • Fix recent commit not allowing to open project file. Commit .
  • Go back to previous hack around ECM issue. Commit .
  • Restore monitor in full screen if they were when closing Kdenlive. Commit . See bug #484081 .
  • When opening an unrecoverable file, don't crash but propose to open a backup. Commit .
  • Ensure we never reset the locale while an MLT XML Consumer is running (it caused data corruption). Commit . See bug #483777 .
  • Fix: favorite effects menu not refreshed when a new effect is set as favorite. Commit .
  • Rotoscoping: add info about return key. Commit .
  • Fix: Rotoscoping not allowing to add points close to bottom of the screen. Commit .
  • Fix: Rotoscoping - allow closing shape with Return key, don't discard initial shape when drawing it and seeking in timeline. Commit . See bug #484009 .
  • Srt_equalizer: drop method that is only available in most recent version. Commit .
  • Fix: Speech to text, allow optional dependencies (srt_equalizer), fix venv not correctly enabled on first install and some packages not installing if optional dep is unavailable. Commit .
  • Update and improve build documentation for Qt6. Commit .
  • Add test for latest cut crash. Commit .
  • Update Readme to GitLab CD destination. Commit .
  • Check if KDE_INSTALL_DIRS_NO_CMAKE_VARIABLES can be disabled (we still have wrong paths in Windows install). Commit .
  • Fix: cannot revert letter spacing to 0 in title clips. Commit . Fixes bug #483710 .
  • Audio Capture Subdir. Commit .
  • Feat: filter avfilter.fillborders add new methods for filling border. Commit .
  • [nightly flatpak] Use the offical Qt6 runtime. Commit .
  • Update file org.kde.kdenlive.appdata.xml. Commit .
  • Add .desktop file. Commit .
  • Updated icons and appdata info for Flathub. Commit .
  • Fix whisper model size unit. Commit .
  • Don't seek timeline when hover timeline ruler and doing a spacer operation. Commit .
  • Improve install steps for SeamlessM4t, warn user of huge downloads. Commit .
  • Initial implementation of subtitles translation using SeamlessM4T engine. Commit .
  • Make whisper to srt script more robust, use kwargs. Commit .
  • Block Qt5 MLT plugins in thumbnailer when building with Qt6. Commit . Fixes bug #482335 .
  • [CD] Restore use of normal Appimage template after testing. Commit .
  • Fix CI/CD. Commit .
  • [CD] Disable Qt5 jobs. Commit .
  • Speech to text: add a link to models folder and display their size in settings. Commit .
  • Whisper: allow setting a maximum character count per subtitle (enabled by default). Commit .
  • Enforce proper styling for Qml dialogs. Commit .
  • Add missing license info. Commit .
  • Allow customizing camcorder proxy profiles. Commit . Fixes bug #481836 .
  • Don't move dropped files in the audio capture folder. Commit .
  • Don't Highlight Newly Recorded Audio in the Bin. Commit .
  • Show whisper output in speech recognition dialog. Commit .
  • Ensure translated keyframe names are initialized after qApp. Commit .
  • Don't call MinGW ExcHndlInit twice. Commit .
  • Fix extern variable triggering translation before the QApplication was created, breaking translations. Commit .
  • Fix bin thumbnails for missing clips have an incorrect aspect ratio. Commit .
  • Add Bold and Italic attributes to subtitle fonts style. Commit .
  • Warn on opening a project with a non standard fps. Commit . See bug #476754 .
  • Refactor keyframe type related code. Commit .
  • Set Default Audio Capture Bin. Commit .
  • Fix python package detection, install in venv. Commit .
  • Try to fix Mac app not finding its resources. Commit .
  • Another attempt to fix appimage venv. Commit .
  • Add test for nested sequences corruption. Commit . See bug #480776 .
  • Show blue audio/video usage icons in project Bin for all clip types. Commit .
  • Org.kde.kdenlive.appdata: Add developer_name. Commit .
  • Fix compilation warnings. Commit .
  • Better feedback message on failed cut. Commit .
  • Set default empty seek duration to 5 minutes instead of 16 minutes on startup to have a more usable scroll bar. Commit .
  • [Craft macOS] Try to fix signing. Commit .
  • [Craft macOS] Remove config for signing test. Commit .
  • Add some debug output for Mac effect drag crash. Commit .
  • Effect stack: don't show drop marker if drop doesn't change effect order. Commit .
  • Try to fix crash dragging effect on Mac. Commit .
  • Another try to fix monitor offset on Mac. Commit .
  • Don't display useless link when effect category is selected. Commit .
  • Add comment on MLT's manual build. Commit .
  • Add basic steps to compile MLT. Commit .
  • Blacklist MLT Qt5 module when building against Qt6. Commit .
  • Org.kde.kdenlive.appdata.xml use https://bugs.kde.org/enter_bug.cgi?product=kdenlive . Commit .
  • Fix Qt5 startup crash. Commit .
  • Refactor project loading message. Commit .
  • More rebust fix for copy&paste between sequences. Commit .
  • Port to QCheckBox::checkStateChanged. Commit .
  • Scale down overly large barcodes when possible. Commit .
  • Scale down overly large footer images when needed. Commit .
  • Remove unused Q_SLOT. Commit .
  • Don't export private method + add missing [[nodiscard]]. Commit .
  • Remove subdirectory. Commit .
  • Remove unused template (unmaintained). Commit .
  • Don't create two rule which check same host. Commit .
  • Not allow to enable/disable it. Commit .
  • Don't allow to select global rule. Commit .
  • Disable item when it's not local => we can't edit it. Commit .
  • Add support for enabled. Commit .
  • Use double click for open configure adblock. Commit .
  • USe QByteArrayLiteral. Commit .
  • Fix enum. Commit .
  • Prepare to add menu. Commit .
  • Don't export private methods. Commit .
  • Use = default. Commit .
  • Don't use QtQml. Commit .
  • Add [[nodiscard]] + don't export private methods. Commit .
  • Remove not necessary private Q_SLOTS. Commit .
  • Don't export symbol + use [[nodiscard]]. Commit .
  • Add model. Commit .
  • Allow to add contextMenu. Commit .
  • Add enable column. Commit .
  • Use a QTreeView. Commit .
  • Add data etc methods. Commit .
  • Continue to implement model. Commit .
  • Prepare to fill list. Commit .
  • Fix locale. Commit .
  • Run the kitinerary extractor on gif files as well. Commit .
  • Remove calls to KMime::ContentType::setCategory. Commit .
  • Port away addContent method. Commit .
  • SingleFileResource: trigger sync after initially loading file on start. Commit . Fixes bug #485761 .
  • Support NTLMv2. Commit .
  • Port EWS resource away from KIO Http. Commit .
  • Port ews resource to QtKeyChain. Commit .
  • We depend against kf6.0.0. Commit .
  • Bring back etesync support. Commit . Fixes bug #482600 .
  • Fix endless sync loop with some remote iCal sources. Commit . Fixes bug #384309 .
  • Port away from std::bind usage. Commit .
  • Use QtConcurrentRun directly. Commit .
  • Fix EWS config dialog. Commit .
  • Use KJob enum for error handling. Commit .
  • Use correct signature for qHash overload. Commit .
  • Ews: Handle KIO::ERR_ACCESS_DENIED error. Commit .
  • Ews: Use http1 for ews requests. Commit . See bug #480770 .
  • Move the token requester to KMailTransport. Commit .
  • IMAP: change Outlook app clientId to one owned by KDE. Commit .
  • Fix handling of expired Outlook OAuth2 tokens. Commit .
  • IMAP: implement XOAUTH support for Outlook/Office365 accounts. Commit .
  • Fix check for reveal password mode. Commit .
  • Remove unused pointer. Commit .
  • Port to setRevealPasswordMode when 5.249 (scripted). Commit .
  • Add debug category. Commit .
  • Use isEmpty. Commit .
  • Fix large delete jobs. Commit .
  • Rename translation catalog to kio6_perldoc to match version. Commit .
  • Drop support for Qt5/KF5. Commit .
  • Use kdoctools' kde-docs.css instead of kio_docfilter.css. Commit .
  • Use FindPython3 instead of FindPythonInterp and FindPythonLibs. Commit .
  • Externalscript: don't attempt to open an empty-URL document. Commit .
  • BreakpointModel: work around another empty URL assertion failure. Commit .
  • BreakpointModel: always handle moving cursor invalidation. Commit .
  • BreakpointModel: fix -Wimplicit-fallthrough Clang warnings. Commit .
  • Prevent empty TextDocument::url(). Commit .
  • Assert correct document in TextDocument::documentUrlChanged(). Commit .
  • BreakpointModel: create moving cursors only for CodeBreakpoints. Commit .
  • BreakpointModel: skip setting up moving cursors in untitled documents. Commit .
  • BreakpointModel::removeBreakpointMarks: take non-const reference. Commit .
  • Appstream: use developer tag instead of deprecated developer_name. Commit .
  • BreakpointModel: add support for renaming documents with breakpoints. Commit .
  • BreakpointModel: inform the user when toggling fails. Commit .
  • BreakpointModel: prevent breakpoints in untitled documents. Commit .
  • Git plugin: use more efficient check for "Author" lines. Commit .
  • Git plugin: do not check commit line for author information. Commit .
  • Git plugin: fix parsing of commits that are tagged or tip of a branch. Commit .
  • Only reparse project if meson-info contents change. Commit . Fixes bug #482983 .
  • Quick Open: add a TODO Qt6 rebenchmark comment. Commit .
  • BenchIndexedString: benchmark IndexedStringView in a container. Commit .
  • Introduce and use IndexedStringView. Commit .
  • Quick Open: store uint index in place of IndexedString. Commit .
  • Serialization: remove unused include. Commit .
  • BreakpointModel: complete document reload support. Commit . Fixes bug #362485 .
  • TestBreakpointModel: test reloading a document changed on disk. Commit .
  • BreakpointModel: preserve document line tracking during reload. Commit .
  • Debugger: refactor updating breakpoint marks. Commit .
  • Debugger: explain document line tracking in a comment. Commit .
  • Debugger: allow inhibiting BreakpointModel::markChanged() slot. Commit .
  • Debugger: split Breakpoint::setMovingCursor(). Commit .
  • TestBreakpointModel: add two breakpoint mark test functions. Commit .
  • TestBreakpointModel: verify all breakpoint data during setup. Commit .
  • TestBreakpointModel: verify expected mark type. Commit .
  • Specialize QTest::toString() for two Breakpoint enums. Commit .
  • Specialize QTest::toString() for IDocument::DocumentState. Commit .
  • Debugger: move setState() and setHitCount() into Breakpoint. Commit .
  • Debugger: update marks when a breakpoint is hit. Commit .
  • Extract BreakpointModel::setupDocumentBreakpoints(). Commit .
  • BreakpointModel: remove partAdded() usage. Commit .
  • Debugger: move breakpointType() into Breakpoint class. Commit .
  • Optimize Breakpoint::enabled() by returning m_enabled directly. Commit .
  • Debugger: get rid of most MarkInterface::MarkTypes casts. Commit .
  • Debugger: add verify helper for breakpoints with no moving cursor. Commit .
  • Debugger: keep Breakpoint's moving cursor up to date. Commit .
  • Debugger: isolate saved line numbers from the moving cursors. Commit .
  • Debugger: delete moving cursors. Commit .
  • Debugger: register breakpoints after loading of the config data. Commit .
  • Debugger: forbid the copying and moving of breakpoints. Commit .
  • Debugger: document markChanged() better. Commit .
  • Org.kde.kdevelop.appdata: Add screenshot caption. Commit .
  • Org.kde.kdevelop.appdata: Add developer_name. Commit .
  • DebugController: optimize removing execution mark. Commit .
  • DebugController: drop QSignalBlocker from showStepInSource(). Commit .
  • DebugController: replace partAdded() usage. Commit .
  • Add new menu action to create named session. Commit . Fixes bug #462297 .
  • Add tooltips to session names. Commit .
  • Add default name "(no projects)" to newly created session. Commit . Fixes bug #462297 .
  • Openwith: enclose FileOpener in namespace OpenWithUtils. Commit .
  • Extract OpenWithPlugin::delegateToParts(). Commit .
  • Extract OpenWithPlugin::delegateToExternalApplication(). Commit .
  • Openwith: validate service storage ID read from config. Commit .
  • Openwith: store file opener ID type in config. Commit .
  • Openwith: don't read the same config entry repeatedly. Commit .
  • Openwith: extract defaultsConfig(). Commit .
  • Extract OpenWithPlugin::updateMimeTypeForUrls(). Commit .
  • Emit a warning when we fail to instantiate a ReadOnlyPart. Commit .
  • Raise KCoreAddons deprecation level now that everything compiles. Commit .
  • Port PluginController away from deprecated KPluginLoader API. Commit .
  • Port away from deprecated KPluginLoader::findPlugins. Commit .
  • Port away from deprecated KPluginMetaData::serviceTypes. Commit .
  • Port away from deprecated KPluginMetaData::readStringList API. Commit .
  • Fix deprecation warning in KDevelopSessions. Commit .
  • Raise min-deprecated version for KService API. Commit .
  • Port kdevkonsoleviewplugin away from deprecated API. Commit .
  • Refactor how we sort actions for the OpenWithPlugin. Commit .
  • Disable Open With embedded parts for directories. Commit .
  • Port IPartController and OpenWithPlugin away from KMimeTypeTrader. Commit .
  • Remove duplicate KService include. Commit .
  • Remove set-but-unused OpenWithPlugin::m_services. Commit .
  • Simplify IPartController::createPart. Commit .
  • Hide internal IPartController::findPartFactory. Commit .
  • Port partcontroller.cpp away from KMimeTypeTrader. Commit .
  • DRY: introduce mimeTypeForUrl in partcontroller.cpp. Commit .
  • Cleanup PartController::{can,}createPart mimetype/url handling. Commit .
  • Remove dead code. Commit .
  • Explicitly include KParts/ReadWritePart. Commit .
  • Port applychangeswidget away from KMimeTypeTrader. Commit .
  • GrepFindFilesThread: avoid calling QUrl::fileName(). Commit .
  • GrepFindFilesThread: match relative paths against Exclude filter. Commit . Fixes bug #361760 .
  • Test_findreplace: test single file search location. Commit .
  • GrepFindFilesThread: don't match a search location against filters. Commit .
  • GrepFindFilesThread: navigate directories faster in findFiles(). Commit .
  • GrepFindFilesThread: don't search in symlinked files. Commit .
  • GrepFindFilesThread: fix limited-depth file search. Commit .
  • GrepFindFilesThread: fix and optimize limited-depth project file search. Commit .
  • Test_findreplace: test search limited to project files. Commit .
  • Test_findreplace: test search depth. Commit .
  • Test_findreplace: clang-format dataRows. Commit .
  • Test_findreplace: do not load any plugins. Commit .
  • Grepview: replace Depth comment with tooltip and What's This. Commit .
  • Grepview: normalize search location URL path segments. Commit .
  • It builds fine with QT_NO_CONTEXTLESS_CONNECT. Commit .
  • Remove obsolete comment. Commit .
  • Doc: specify file dialog's filter can be name or mime type filter. Commit .
  • Flatpak: Install the breeze icon. Commit .
  • Craft: We don't need master. Commit .
  • Fix section header. Commit . Fixes bug #480085 .
  • Show issuer name when removing a key. Commit . Fixes bug #477812 .
  • Make compile with QT_NO_CONTEXTLESS_CONNECT. Commit .
  • It compiles file without deprecated method + rename variable. Commit .
  • Rename as KF_... Commit .
  • Qt6Core5Compat is not optional. Commit .
  • Tweak the settings UI to fit the dialog size. Commit .
  • Rework the configuration dialogue. Commit . Fixes bug #101063 .
  • Register app at user session D-Bus. Commit .
  • Update hungary.kgm. Commit .
  • Add i18n to percent values. Commit .
  • Remove deprecated AA_UseHighDpiPixmaps. Commit .
  • Port away from QTextCodec. Commit .
  • It compiles without deprecated methods. Commit .
  • Don't silently quit when required data files are not found. Commit .
  • Drop stale Phonon reference. Commit .
  • Readd page search feature. Commit . Fixes bug #483972 .
  • Load documentation pages with KIO::HideProgressInfo. Commit .
  • Fix missing URL redirection implementation in web engine feeding from KIO. Commit . See bug #484176 .
  • Revert "Fix opening subpages of documentation". Commit .
  • Fix opening subpages of documentation. Commit . Fixes bug #484176 .
  • Trigger Quirks mode for index/glossary/search HTML pages. Commit .
  • Unbreak endless invocation loop with "info" pages. Commit . Fixes bug #484977 .
  • Page templates: fix CSS loading, DOCTYPE wrong uppercase HTML, not html. Commit .
  • Glossary pages: fix broken styling. Commit .
  • Fix outdated use of kdoctools5-common resources, kdoctools6-common now. Commit .
  • Contents & Glossary list: always activate entry on single click. Commit .
  • Forward/backward navigation: KToolBarPopupAction needs use of popupMenu(). Commit .
  • Use ECMDeprecationSettings. Commit .
  • Bump min required KF6 to 6.0 (and align Qt min version). Commit .
  • Add currentActivity method + make hasActivitySupport virtual. Commit .
  • Fix api. Commit .
  • Allow to get activities list. Commit .
  • Remove it as I will implement it directly in kmail. Commit .
  • Use identitytreedelegate. Commit .
  • Add delegate. Commit .
  • Minor. Commit .
  • Add hasActivitySupport. Commit .
  • Fix identitycombo. Commit .
  • Prepare to use proxymodel here. Commit .
  • Fix currentIdentityName. Commit .
  • Commented code --. Commit .
  • Fix currentIdentity. Commit .
  • Compile fine without qt6.7 deprecated methods. Commit .
  • Show identity identifier. Commit .
  • Revert "Use modelindex". Commit .
  • Revert "Use findData". Commit .
  • Use findData. Commit .
  • Use modelindex. Commit .
  • Don't store manager. IT's already stored in model. Commit .
  • We need to use currentData() as we will use filterproxymodel. Commit .
  • Add signal when activities changed. Commit .
  • Continue to implement identitywidget. Commit .
  • Prepare to add activities support. Commit .
  • Remove duplicate namespace. Commit .
  • Add missing methods. Commit .
  • Use UI:: class. Commit .
  • Prepare to add ui file. Commit .
  • Move to core. Not necessary to keep them in widget subdirectory. Commit .
  • Add autotests. Commit .
  • Add IdentityActivitiesAbstract. Commit .
  • Add IdentityActivitiesAbstract to combobox. Commit .
  • Add missing include mocs. Commit .
  • Add mIdentityActivitiesAbstract. Commit .
  • Store proxy model. Commit .
  • Use proxy model. Commit .
  • Add identityactivitiesabstract class. Commit .
  • Allow to sort treeview. Commit .
  • Add header name. Commit .
  • Show bold when identity is default. Commit .
  • Hide column. Commit .
  • Add identitywidget_gui. Commit .
  • Add IdentityTreeView. Commit .
  • Add test apps. Commit .
  • Fix autotests. Commit .
  • Add autotest. Commit .
  • Prepare to add autotests. Commit .
  • Add identitywidget. Commit .
  • Add settings. Commit .
  • Prepare to implement "filterAcceptsRow". Commit .
  • Add include mocs. Commit .
  • Add sortproxymodel. Commit .
  • Prepare to implement identitytreeview. Commit .
  • Rename model. Commit .
  • Const'ify variables. Commit .
  • Install header. Commit .
  • Use model by default now. Commit .
  • Fix show default info. Commit .
  • Allow to use model. Commit .
  • Add #ifdef. Commit .
  • Use IdentityTableModel. Commit .
  • Increase version. Commit .
  • Revert "Improve model for using it everywhere (combobox, listview etc)". Commit .
  • Add specific role. We need to table model (where we can specify column used). Commit .
  • Add override. Commit .
  • Fix generate list of identity. Commit .
  • Continue to implement using model. Commit .
  • Improve model for using it everywhere (combobox, listview etc). Commit .
  • Prepare to use Model. Commit .
  • Add destructor. Commit .
  • Prepare to created test apps. Commit .
  • Move find QtTest on top level. Commit .
  • Move in own directory. Commit .
  • We need only KPim6::IdentityManagementCore. Commit .
  • Add tooltip support. Commit .
  • Add comment about "using IdentityModel". Commit .
  • Move as private. Don't export private method. Commit .
  • Allow to show (Default setting identity). Commit .
  • Use = default;. Commit .
  • Show identitymodel.h in qtc6. Commit .
  • Use _L1 operator. Commit .
  • Time to increase version. Commit .
  • Fix coding style. Commit .
  • Objects/curve_imp.cc (CurveImp::cartesianEquationString): Fix typo in ret string. Commit .
  • Add launchable to appdata. Commit .
  • Scripting-api enable search, enable left hand side treeview, correct code style. Commit .
  • ".." -> ".". Commit .
  • Expose AuthentificationMode to qt meta object. Commit .
  • Port to deprecated methods. Commit .
  • Avoid redundant password prompts. Commit .
  • Drop kio_docfilter.css, no longer used. Commit .
  • Man worker: use kdoctools' kde-docs.css instead of kio_docfilter.css. Commit .
  • Info worker: use kdoctools' kde-docs.css instead of kio_docfilter.css. Commit .
  • Bump min required KF to normal 6.0. Commit .
  • Man, info: fix outdated use of kdoctools5-common resources, 6 variant now. Commit .
  • Thumbnail: KIO::filesize_t type for sizes instead of qint64_t. Commit .
  • Thumbnail: remote max size limits for remote directory. Commit .
  • [thumbnail] Limit bits per pixel to 32. Commit . Fixes bug #484183 .
  • Reduce dependencies. Commit .
  • Port most remaining QTextCodec uses. Commit .
  • Followup nfs code removal. Commit .
  • Nfs: rm -rf. Commit .
  • Afc: Adjust Solid action to new URL format. Commit .
  • Afc: Drop pretty name handling. Commit . Fixes bug #462381 .
  • Sftp: add sftp_aio support. Commit .
  • Smb: remove support for samba <3.2. Commit .
  • Smb: remove excess return. Commit .
  • Kcms/proxy: Fix warning regarding Chromium. Commit . Fixes bug #480847 .
  • Sftp: narrow into correct type. Commit .
  • Sftp: mode cannot be <0. Commit .
  • Sftp: magicnumber--. Commit .
  • Sftp: don't const trivial types in function arguments. Commit .
  • Sftp: stop implicit narrowing conversions. Commit .
  • Sftp: always open with O_CLOEXEC. Commit .
  • Sftp: silence switch default warning. Commit .
  • Sftp: remove unused header. Commit .
  • Sftp: remove constness where it gets in the way of move. Commit .
  • Thumbnail: ignore nice return value. Commit .
  • Sftp: unbreak gcc compat. Commit .
  • [fish] Use QByteArray for outBuf everywhere. Commit . Fixes bug #479707 .
  • Find and link to QDBus explicitely. Commit .
  • Add picture of the kanji browser. Commit .
  • Make CFR extractor cover more layout variants. Commit .
  • Add extractor script for international CFR PDF tickets. Commit .
  • Fix IRCTC departure time extraction. Commit . Fixes bug #486495 .
  • Extract information about train-bound SNCB RCT2 tickets. Commit .
  • Restore disabled FreeBSD extractor tests. Commit .
  • Use released Poppler for stable branch Flatpak builds. Commit .
  • Fix extraction of cancellation URLs from Lufthansa pkpass files. Commit .
  • Don't fail on non-ticket pages in Trenitalia PDFs. Commit .
  • Switch extractor builds to use the 24.05 branch. Commit .
  • Restore support for Trenitalia PDFs with barcodes. Commit .
  • Compile with newer poppler. Commit .
  • Extend LH pkpass extractor script to support train tickets. Commit .
  • Add generic extraction support for train pkpass tickets. Commit .
  • Refactor reservation type conversion for reuse. Commit .
  • Don't produce invalid start times for airports with unknown timezones. Commit .
  • Fix start/end time check for restaurant reservations. Commit .
  • Add Motel One email confirmation extractor script. Commit .
  • Deal with formatting in Indico registration properties. Commit .
  • Handle more time formats in Indico confirmations. Commit .
  • Fix check for prices in SNCF extractor script. Commit . Fixes bug #485389 .
  • Skip test with failing country detection on FreeBSD. Commit .
  • Add support for base64 encoded ERA SSB ticket barcodes. Commit .
  • Add extractor script for Eurostar's Thalys PDF ticket variant. Commit .
  • Fix Clang build. Commit .
  • Regenerate the train station database. Commit . See bug #485004 .
  • Support VR station code umlauts. Commit . See bug #485004 .
  • Build knowledge db code generator also on the CI. Commit .
  • Add extractor script for VR mobile PDF tickets. Commit . See bug #485004 .
  • Decode Finish ERA SSB alphanumeric station codes correctly. Commit . See bug #485004 .
  • Consider berth number in VR ERA SSB ticket barcodes. Commit . See bug #485004 .
  • Fix ERA SSB date conversion. Commit . See bug #485004 .
  • Use the generic subjectOf property for attaching Apple Wallet passes. Commit .
  • Fix(ticketportal): make the match for pkpass bundleId greedy. Commit .
  • Add(ticketportal): add ticketportal pkpass extractor. Commit .
  • Fix(ticketportal): using content.pages to interate over pages. Commit .
  • Add: Ticketportal event ticket extractor. Commit .
  • Handle VDV product id 9996 for the new Deutschlandsemesterticket. Commit .
  • Improve dealing with binary barcodes in Apple Wallet passes. Commit .
  • Prettify data extracted from Eurostar ERA ELB barcodes. Commit .
  • Actually add the new Finnair extractor script. Commit .
  • Add extractor script for UK national railway pkpass files. Commit .
  • Don't override pkpass boarding pass child node results. Commit .
  • Extract Eurostar pkpass tickets. Commit .
  • Don't override results for pkpass files we cannot generically extract. Commit .
  • Handle all types of pkpass barcode formats. Commit .
  • Extract Eurostar PDF tickets. Commit .
  • Support PDF soft masked images. Commit .
  • Consistently use [[nodiscard]] in PdfImage types. Commit .
  • Ignore masks when checking for full-page raster images in PDFs. Commit .
  • Add Finnair e-ticket extractor script. Commit .
  • Fix: add amsbus e-ticket with reservation code only format. Commit .
  • Fix: add SPDX headers. Commit .
  • Fix: add moongate extractor to the .qrc list. Commit .
  • Add moongate event ticket extractor. Commit .
  • Handle German language European Sleeper seat reservations. Commit .
  • Fix typo in include guard. Commit .
  • Fix SNCF Carte Advantage token type. Commit .
  • Fix: added the SPDX Header for amsbus.cz extractor. Commit .
  • Add amsbus.cz bus ticket extractor. Commit .
  • Fix instructions on how to get the continous Flatpak build. Commit .
  • Check whether ERA FCB first name fields are set before using them. Commit .
  • Update dependency versions for static builds. Commit .
  • Improve salzbergwekr.de extractor: address extraction from text. Commit .
  • Add salzbergwerk.de tour reservation extractor. Commit .
  • Significantly increase thresholds for PDF vector graphics barcodes. Commit .
  • Normalize geo coordinate Place properties. Commit .
  • Handle ti.to emails with iCal attachments correctly. Commit .
  • Correctly update search offset for multi-leg National Express tickets. Commit .
  • Add extractor script for Leo Express. Commit .
  • Eventim: Drop debug output. Commit .
  • Eventim: Also read event name from KEY_EVENTLINE. Commit .
  • Add extractor script for Eckerö Line ferry tickets. Commit . Fixes bug #481739 .
  • Handle ti.to PDF tickets as well. Commit .
  • Add extractor script for ti.to pkpass files. Commit .
  • Extract DB reservation iCal events. Commit .
  • Iterate full pdf from Trenitalia. Commit .
  • Minor typo in regexp for Trenitalia seat assignation. Commit .
  • Minor syntax fix in trenitalia.json file. Commit .
  • Fixed and improved parser for Trenitalia. Commit .
  • Added Flibco parser in the bundled extractors list. Commit .
  • Added Flibco parser. Commit .
  • Handle another DB regional ERA TLB ticket variant with PLAI layout. Commit .
  • Increase the plausible boarding time window slightly. Commit .
  • Extract ticket number from IATA BCBP. Commit .
  • Handle time quadruples in the generic boarding pass extractor. Commit . Fixes bug #481281 .
  • Support the horizontally split double ticket layout for PV/Vivi. Commit .
  • Extract seat information from Elron tickets. Commit .
  • Make LTG Link extractor more robust against slight layout variations. Commit .
  • Force-disable unity builds. Commit .
  • Handle Carte Advantage with multiple validity periods. Commit .
  • Also move ticketNumber to Ticket during import filtering. Commit .
  • Normalize reservationStatus properties using https URIs as well. Commit .
  • Check for invalid enum keys when deserializing JSON in all cases. Commit .
  • Allow to merge two flights even if one has no departure time. Commit .
  • Add extractor script for ANA etickets. Commit .
  • Also extract GIF files. Commit .
  • Don't set reservationNumber for Thalys ERA SSB barcodes to TCN. Commit .
  • Add support for inline PDF images. Commit .
  • Ns: Only return one of the possible station names. Commit .
  • Update blablacar-bus station list. Commit .
  • Stop the static extractor build job from triggering automatically. Commit .
  • Add JoinAction and Event::potentialAction. Commit .
  • Don't crash on missing PDF link actions. Commit .
  • Support https schema.org URIs. Commit .
  • Switch static extractor build to the stable Gear branch. Commit .
  • Add missing include on endian.h. Commit .
  • Add parent. Commit .
  • Fix indent. Commit .
  • Fix windows build. Commit .
  • Replace tab with space in cmakelists.txt. Commit .
  • Use {}. Commit .
  • Use static_cast as we don't check it. Commit .
  • Intercept return key. Commit .
  • Use 0.14.1. Commit .
  • Use QT6KEYCHAIN_LIB_VERSION = 0.14.2. Commit .
  • Port to setRevealPasswordMode (scripted). Commit .
  • Ldapoperation: evaluate value of HAVE_WINLDAP_H. Commit .
  • Don't show disabled certificates in signencryptwidget. Commit .
  • Bump version of kleopatra.rc. Commit .
  • Show certificate status in CertificateDetailsDialog. Commit .
  • Show the About dialog ourselves. Commit .
  • Port paperkey command away from GnuPGProcessCommand. Commit .
  • Show only one dialog when failing to import keys. Commit .
  • Make sure that users can't attempt to create a certificate expiring today. Commit .
  • Delay initialization of column sizes until model contains keys. Commit .
  • Remove automatic column resize on show/hide column. Commit .
  • Fix restore of column layout of card certificate tree view. Commit .
  • Adapt to docaction API change. Commit .
  • Show S/MIME certificates for PKCS#15 cards. Commit .
  • Fix tab order by creating widgets in correct order. Commit .
  • Factor list of card certificates out of NetKeyWidget. Commit .
  • Update QtKeychain in flatpak. Commit .
  • Don't ask to publish revocations of local certifications. Commit .
  • Port [=] deprecated in c++20. Commit .
  • Remove showToolTip helper. Commit .
  • Show explanation for deleting additional certificates in message box. Commit .
  • Add config for automatic key retrieval. Commit .
  • Add checkbox for enabling/disabling keyserver. Commit .
  • Add OpenPGP group and info label. Commit .
  • Add missing include for Windows. Commit .
  • Show correct origin in key search dialog. Commit .
  • Rework certificate deletion dialog. Commit .
  • Use monospace font for certificate dump tab. Commit .
  • Add smartcard info tab to CertificateDetailsDialog. Commit .
  • Flatpak: Build PIM dependencies from master branch. Commit .
  • Improve smartcard storage location strings. Commit .
  • Flatpak: Use master branch of Libkleo. Commit .
  • Fix button state when creating subkeys widget. Commit .
  • Cleanup NewCertificateWizard. Commit .
  • Simplify certificate details dialog. Commit .
  • Check for system tray icon. Commit .
  • Remove unused accessors for system tray icon. Commit .
  • Fix build with QT_NO_SYSTEMTRAYICON. Commit .
  • Do not quit Kleopatra when user chooses to just close the main window. Commit .
  • Accept close event of main window if Kleo is run with elevated permissions. Commit .
  • Quit Kleopatra when last windows is closed for elevated users on Windows. Commit .
  • Do not block application shutdown with a QEventLoopLocker. Commit .
  • Add error handling for Windows process connections. Commit .
  • Always quit on Quit for users with elevated permissions on Windows. Commit .
  • Show "No certificates found" overlay if nothing was found. Commit .
  • Add widget for showing a text overlay on top of another widget. Commit .
  • Factor the generic overlay handling out of ProgressOverlay. Commit .
  • Cancel lookup when user cancels progress dialog. Commit .
  • Remove message about ignored certificates without user IDs. Commit .
  • Remove extra margins. Commit .
  • Load value of "Treat .p7m files without extensions as mails" option. Commit .
  • Port away from KCMUtils. Commit .
  • Replace "key" with "certificate" in string. Commit .
  • Port away from removed CryptoConfigModule constructor. Commit .
  • Show a simple progress dialog while searching for certificates. Commit .
  • Don't show an error message if nothing is found on OpenPGP key server. Commit .
  • Fix config loading and saving. Commit .
  • Re-enable DeviceInfoWatcher on Windows. Commit .
  • Simplify key creation dialog. Commit .
  • Drop the obsolete kconf_update script. Commit .
  • Fix when "Imported Certificates" tab is shown. Commit .
  • We have to count the number of real subkeys, i.e. without the primary key. Commit .
  • Offer user the choice to change the subkeys only if there is a choice. Commit .
  • Consider a difference of up to 1 hour as same expiration as primary key. Commit .
  • Preselect certificate if there is only one search result. Commit .
  • Show certificate details instead of importing it when clicking on it in the server lookup dialog. Commit .
  • Restart gpg-agent instead of just shutting down the GnuPG daemons. Commit .
  • Skip keyserver lookup on certificate update if keyserver is disabled. Commit .
  • Fix minor typos. Commit .
  • Update validity settings description. Commit .
  • Fix some more state saving / restoration problems. Commit .
  • Also save tab order. Commit .
  • Immediately save new views. Commit .
  • Save views when closing one. Commit .
  • Improve tabwidget state saving. Commit .
  • Look for S/MIME certificates only. Commit .
  • Wait until the key cache is initialized before looking for smart cards. Commit .
  • Show progress while the card keys are learned. Commit .
  • Add a general progress overlay widget. Commit .
  • Make the WaitWidget more reusable. Commit .
  • Remove obsolete LearnCardKeysCommand. Commit .
  • Learn card certificates with ReaderStatus also for PKCS#15 cards. Commit .
  • Validate the certificates of the smart card. Commit .
  • Suspend automatic key cache updates while learning smart card certificates. Commit .
  • Avoid multiple runs of gpgsm --learn-card . Commit .
  • Force a refresh of the key cache after smart cards were learned. Commit .
  • Trigger learning of card certificates via ReaderStatus. Commit .
  • Look up certificates for NetKey cards in widget instead of card. Commit .
  • Add ability to learn smart cards to ReaderStatus. Commit .
  • Remove possibility to learn "NetKey v3 Card Certificates" via systray. Commit .
  • Always show the key list even if it's empty. Commit .
  • Automatically learn card keys. Commit .
  • Refactor key list state handling. Commit .
  • Fix restoring columns in certificatedetailsdialog. Commit .
  • Fix compilation with GPGME versions that don't yet have Key::hasEncrypt. Commit .
  • Add help item for the approval manual. Commit .
  • Remove unused member variable. Commit .
  • Also restore column hidden, expanded, order state. Commit .
  • Fix copying column widths to new tab. Commit .
  • Update subkey details dialog columns. Commit .
  • Fix loading keytreeview column widths. Commit .
  • Don't explicitely set a name for the first tab in the tab widget. Commit .
  • Highlight non-encryption keys in group's key list. Commit .
  • Prevent sign-only keys from being added to a key group. Commit .
  • Add command for creating key groups from selected certificates. Commit .
  • Add "Configure Groups" to toolbar. Commit .
  • Prevent the user from exporting groups containing sign-only keys. Commit .
  • Remove Qt::escape. Commit .
  • We don't use Qt::escape anywhere. Commit .
  • Use new folder-edit-sign-encrypt icon. Commit .
  • Warn the user when deleting keys that are part of a keygroup. Commit .
  • Fix update check for gpg4win. Commit .
  • Show a warning when the user imports a group containing sign-only keys. Commit .
  • Adapt SignEncryptWidget to be based on UserIDs instead of Keys. Commit .
  • Implement adding subkeys to an existing key. Commit .
  • Add screenshot of email view. Commit .
  • Use KF_MIN_VERSION/KMIME_VERSION in windows because for the moment version is not correct. We will fix it if necessary when windows will be reactivate. Commit .
  • Parent DecryptVerifyFilesDialog. Commit .
  • Restore column layout for most treeviews. Commit .
  • Use isEmpty here. Commit .
  • Use Algorithm and Keygrip columns in keylist. Commit .
  • Adapt to upstreamed column configuration menu and renamed NavigatableTreeView/NavigatableTreeWidget. Commit .
  • Allow users to change name of decryption result if file already exists. Commit .
  • Percent-encode wayland window token. Commit .
  • Fix compilation with Clang 16. Commit .
  • Allow dragging rows from keylist. Commit .
  • Export MainWindow and save token in environment variable. Commit .
  • Don't ask a second time for confirmation if a backup has been created. Commit .
  • Improve "copy/move key to smart card" workflow. Commit .
  • Fix sign/encrypt/decrypt/verify of notepad. Commit .
  • Ask user for confirmation to delete groups. Commit .
  • Improve file drop behavior. Commit .
  • Replace OK button with Save button in group edit dialog. Commit .
  • (Re-)add the edited group if it couldn't be found in the current groups. Commit .
  • Remove confusing config dialog behavior from groups dialog. Commit .
  • Add config option for adding a designated revoker for all new keys. Commit .
  • Use direct file I/O for verifying detached OpenPGP signatures. Commit .
  • Fix sign/encrypt for S/MIME. Commit .
  • Create temporary file to check if output folder is writable. Commit .
  • Do not use NTFS permissions check to check if output folder is writable. Commit .
  • Make decrypt/verify jobs directly read/write the input/output file. Commit .
  • Make sign/encrypt jobs directly read/write the input/output file. Commit .
  • Use more specific text for "More details" button for PGP keys. Commit .
  • Additionally show subkeys actions in a toolbar. Commit .
  • Use algorithm display name definitions from libkleo. Commit .
  • Limit subkey expiration date to primary key expiration date. Commit .
  • Apply code review suggestions. Commit .
  • Show subkeys without expiry as expiring when the parent key expires. Commit .
  • Ensure that the "Loading certificate cache..." overlay is shown. Commit .
  • Add icon to subkey validity change menu item. Commit .
  • Only allow email queries if no key/directory servers are configured. Commit .
  • Make WKD lookup work for email addresses surrounded by whitespace. Commit .
  • Added missing settings. Commit .
  • Don't start OpenPGP key server lookup if key server usage is disabled. Commit .
  • Simplify lookup of key IDs prefixed with "0x". Commit .
  • Try lookup via WKD even if key server is "none". Commit .
  • Add a tooltip for OpenPGP keyserver config mentioning "none". Commit .
  • Don't prefix special key server value "none" with hkps://. Commit .
  • Show an error if the usage of key servers has been disabled. Commit .
  • Bump Kleopatra version to 3.2.0. Commit .
  • Override comparison operator to consider read/displayed certificates. Commit .
  • Fix updating about data with custom functions. Commit .
  • Show certificate list and Learn Certificates button if it makes sense. Commit .
  • Adjust descriptions to try to fix Appstream validation. Commit .
  • Org.kde.kmag.metainfo.xml rename file from org.kde.kmag.appdata.xml. Commit .
  • Flatpak: Install a scaleable icon. Commit .
  • Editor: remove overwrite check duplicated from QFileDialog::getSaveFileName. Commit .
  • Add setIdentityActivitiesAbstract. Commit .
  • Add Activities enable supporté. Commit .
  • Generate config-kmail.h after setting HAVE_ACTIVITY_SUPPORT. Commit .
  • Adapt to new api. Commit .
  • Add include moc. Commit .
  • Prepare autotest. Commit .
  • Return current activities. Commit .
  • Fix generate config-kmail.h. Commit .
  • Add setTransportActivitiesAbstract. Commit .
  • Continue to implement activities support. Commit .
  • Add mIdentityActivities->setEnabled. Commit .
  • Add enabled support. Commit .
  • Add IdentityActivities. Commit .
  • Add identityactivities. Commit .
  • Add getter for TransportActivities. Commit .
  • Continue to implement TransportActivities. Commit .
  • Prepare TransportActivities support. Commit .
  • Add activities support. Commit .
  • Add activities debug. Commit .
  • Add code for implementing activities for the future (disable until 24.08). Commit .
  • Use TransportManagementWidgetNg. Commit .
  • Port deprecated qt6.7 method. Commit .
  • Expand the tab widgets in Kmail configuration dialog. Commit .
  • Remove slotClose. Commit .
  • Add context object to connect(). Commit .
  • Depend against new api. Commit .
  • Port to _L1 directly. Commit .
  • Increase KTEXTADDONS_MIN_VERSION to 1.5.4, it fixes load configure dialog. Commit .
  • Use directly view-pim-mail. Commit .
  • Don't create message element when not necessary. Commit .
  • Rename variable + const'ify variable. Commit .
  • Don't duplicate "private:". Commit .
  • Don't generate kmime element if not necessary. Commit .
  • Use constFirst. Commit .
  • Don't create element when it's not necessary. Commit .
  • Rename methods. Commit .
  • Add appstream release information. Commit .
  • Fix HTML injection in externally added warning widget. Commit . See bug #480193 .
  • Use {} here. Commit .
  • Don't necessary to use setModal here. Commit .
  • Const'ify variable/pointer. Commit .
  • Increase version. Libkleo already required it. Commit .
  • Remove unused comment. Commit .
  • Remove old comment (unused now). Commit .
  • Use KMessageWidget::Header. Commit .
  • Remove unused debug include. Commit .
  • Org.kde.kmail2.appdata.xml add donation URL and launchable. Commit .
  • Fix crash on close. Commit .
  • Convert includes as local include. Commit .
  • Fix more clazy warnings. Commit .
  • Use screenshots from the cdn. Commit .
  • Don't insert HTML in subject. Commit . See bug #480193 .
  • Show icon. Commit .
  • Split fetch list in several command. Commit .
  • Allow to add to kactioncollection. Commit .
  • Add Reopen Closed Viewer => we will able to add it in action collection. Commit .
  • Activate test on CI. Commit .
  • Isolate test. Commit .
  • Legacy was removed long time ago. Commit .
  • Remove accountwizard.knsrc as it's unused. Commit .
  • Improve description of pop3 configuration. Commit .
  • Add support for creating google resource automatically. Commit .
  • Set hostname during automatic configuration of outgoing server. Commit .
  • Save mail transport and then add it to the manager. Commit .
  • Fix saving mail transport. Commit .
  • Don't ask for password for gmail account. Commit .
  • Use consitent naming for resource created. Commit .
  • Remove code duplication. Commit .
  • Fix separator being displayed while below element is not. Commit .
  • Use list initialiazer constructor. Commit .
  • Fix disconnect mode not visible. Commit .
  • Reapply it. Commit .
  • Revert "Add QT6KEYCHAIN_LIB_VERSION". Commit .
  • Add QT6KEYCHAIN_LIB_VERSION. Commit .
  • We really need to have kolab support. Commit .
  • Fix qCWarning. Commit .
  • We can get legacy from git directly. Commit .
  • This check is not necessary now. Commit .
  • Fix QML name. Commit .
  • Fix triggered nextAction. Commit .
  • Disable for now the akonadi tests on the CI. Commit .
  • Reuse account configuration class for automatic account setup. Commit .
  • Rename manual configuration to account configuration. Commit .
  • Add UseTLS. Commit .
  • Add auto test for manual configuration. Commit .
  • Bring back autotests. Commit .
  • Fix automatic configuration. Commit .
  • Remove kolabl support from the UI for now. Commit .
  • Remove incorrect usage of kimap. Commit .
  • Fix visual glitch in configuration selection page. Commit .
  • Fix full name handling. Commit .
  • Rework identity handling. Commit .
  • Remove unused components. Commit .
  • Add kimap. Commit .
  • Move to declarative QML type registration. Commit .
  • Split ManualConfiguration from SetupManager. Commit .
  • Use MailTransport::Transport direclty in QML. Commit .
  • Start moving imap authentification type to KImap::AuthentificationType. Commit .
  • Reorganized pages. Commit .
  • Fix automatic setup. Commit . Fixes bug #480563 .
  • Revert recent changes to make it easier to integrate. Commit .
  • Use debug category. Commit .
  • Improve debug. Commit .
  • Hide ActivitiesRole column. Commit .
  • Check transportActivitiesAbstract. Commit .
  • Add more autotest. Commit .
  • Allow to show '(default)'. Commit .
  • Fix porting transportmanagementwidgetng. Commit .
  • Continue to port code. Commit .
  • Activate more code. Commit .
  • Show menu. Commit .
  • Port some code. Commit .
  • Add transportmanagementwidgetng_gui. Commit .
  • Make it compiles. Commit .
  • Fix class name. Commit .
  • Prepare to use new TransportTreeView. Commit .
  • USe constFirst. Commit .
  • Fix application name. Commit .
  • Rename it. Commit .
  • Make editable. Commit .
  • Edit when we double click. Commit .
  • Rename class. Commit .
  • Continue to implement delegate. Commit .
  • Add transportlistdelegate. Commit .
  • Add transportlistviewtest. Commit .
  • Add default values. Commit .
  • Add transportlistview_gui. Commit .
  • Add TransportActivitiesAbstract support. Commit .
  • Create transportlistview. Commit .
  • Install TransportModel. Commit .
  • Remove old code. Commit .
  • For the moment remove this code. Commit .
  • Not necessary to use private Q_SLOTS. Commit .
  • Use model by default. Commit .
  • Fix use correct model. Commit .
  • Port to model. Commit .
  • Improve test combobox. Commit .
  • Move method as private class. Commit .
  • Prepare to use model. Commit .
  • Constify pointer. Commit .
  • Invalidate filter when activities changed. Commit .
  • Prepare to add activities. Commit .
  • Add transport id. Commit .
  • Use MailTransport::TransportActivitiesAbstract. Commit .
  • Use model. Commit .
  • Remove unused method. Commit .
  • Add transportcombobox_gui apps. Commit .
  • Fix implement model. Commit .
  • Fix windows ci. Commit .
  • Get transport pointer. Commit .
  • Move in own repo. Commit .
  • Improve model. Commit .
  • Add TransportActivitiesAbstract. Commit .
  • Prepare to add transportactivitiesabstract. Commit .
  • Add TransportManager in model. Commit .
  • Add proxy model. Commit .
  • Add i18n context. Commit .
  • It broke on windows disable it. Commit .
  • Time to depend against 0.14.1. Commit .
  • Use QtKeychain instead of KWallet. Commit .
  • Implement Office365 XOAUTH2 authentication method for SMTP. Commit .
  • Bump version so we can depend on the new API in kdepim-runtime. Commit .
  • ServerTest: enable XOAUTH2 for Gmail and Office365. Commit .
  • Add Outlook OAuth2 token requester class. Commit .
  • Explicitely set the encryption mode in autotests. Commit .
  • Change default encryption to SSL/TLS. Commit .
  • Save after adding a new mail transport. Commit .
  • Fix ifdef for reveal password mode. Commit .
  • Don't use alias in meta object definition. Commit .
  • Remove now unused ContentType::setCategory method. Commit .
  • Deprecate ContentType::contentCategory. Commit .
  • Use a locale for the tests that also works on FreeBSD. Commit .
  • Add missing CC-BY-SA-4.0 license text copy. Commit .
  • Drop unused kcrash dependency. Commit .
  • Recognize tau as a constant. Commit .
  • Fix loading kmplot_part.rc in KF6. Commit .
  • Q_DECL_OVERRIDE -> override. Commit .
  • Add range to function display. Commit .
  • Take function bounds into account for min, max, and area. Commit .
  • [CI/CD] Add macOS jobs. Commit .
  • Theme preview PNGs: drop unused embedded color profile, rely on default sRGB. Commit .
  • Bug 429654 - Can't disable voice. Commit .
  • Bump min required Plasma libs to 6.0. Commit .
  • Fix crash during game over. Commit . Fixes bug #481546 .
  • Flatpak: add libplasma as explicit source. Commit .
  • Add missing KF6I18n dependency. Commit .
  • Fix crash while playing against CPU. Commit . Fixes bug #449639 .
  • Add parent + const'ify pointer. Commit .
  • Remove unused methods. Commit .
  • Use consistently generic apps.kde.org/koko as homepage. Commit .
  • Qml/EditorView: Set position for InlineMessage in footer. Commit .
  • Add "koko" to keywords list. Commit . Fixes bug #480249 .
  • Remove property dialog. Commit .
  • Disable slideshow on mobile. Commit .
  • Fix image actions on mobile. Commit .
  • Port away from deprecated ECMQMLModules. Commit .
  • Add missing receiver context of Qt connection lambda slot. Commit .
  • Proofreading. Commit .
  • Update ci definition. Commit .
  • Port to Qt6. Commit .
  • Add license to git blame ignore file. Commit .
  • Add git blame ignore file. Commit .
  • Port to ecm_add_qml_module. Commit .
  • Build with current ECM compiler default settings. Commit .
  • Fix broken section header in conferences view. Commit .
  • Fix broken section header in schedule view. Commit .
  • Correctly call setNeedsSave when java or javascript settings change. Commit .
  • Add settings to customize the background color for WebEnginePage. Commit . Fixes bug #484437 .
  • Fix crash when clicking on bookmark toolbar and allow configuring add bookmark shortcut. Commit . Fixes bug #485670 .
  • Revert "Choose background color of WebEnginePage according to default palette". Commit .
  • Choose background color of WebEnginePage according to default palette. Commit . Fixes bug #484437 .
  • Fix history when there's an URL change without a corresponding loadStarted signal. Commit . Fixes bug #467850 .
  • Drop compatibility with KF5. Commit .
  • Ensure that settings are marked as saved after calling load. Commit .
  • Add missing parameter. Commit .
  • Fix missing URL redirection implementation in web engine feeding from KIO. Commit .
  • Fix crash when choosing the default web engine. Commit . Fixes bug #484683 .
  • Allow the user to open or display a file right after it's been downloaded. Commit .
  • Ensure that popup windows are shown on Wayland. Commit . Fixes bug #477010 .
  • Determine mimetype according to filename instead of contents, if possible. Commit .
  • Respect NewTabsInFront option when creating a Javascript window or opening link in new tab. Commit .
  • KF5 CI build needs explicit includes for version. Commit .
  • Run the appropriate 'kcmshell' command for the major version. Commit .
  • Fetch "Copy/Move To" option from the correct Dolphin config group. Commit .
  • Web archive and HTML thumbnail: Convert to JSON metadata. Commit .
  • Image Gallery plugin: Eliminate "use of old-style cast" warnings. Commit .
  • Use modern connect syntax in KonqMainWindow. Commit .
  • Use correct slot name. Commit .
  • Fix: use proper CMakeLists variable name and fix versions. Commit .
  • Ensure WebEngineView receives focus after pressing return from the URL bar. Commit .
  • Ensure that GUI is correctly hidden and restored when toggling complete full screen. Commit .
  • Save and read cookies on disk. Commit .
  • Fix compilation with KF5 when DontUseKCookieJar is enabled. Commit .
  • Don't check for QtWebEngineWidgets_VERSION in KF6. Commit .
  • Only set the forcesNewWindow flag of BrowserArguments for WebBrowserWindow type. Commit .
  • Correctly set the needSave flag. Commit .
  • Fix the paths for the proxy and web shortcuts KCM in KF6. Commit .
  • Use QWebEnginePage::isVisible from WebEnginePage::changeLifecycleState. Commit .
  • Check if the value passed to runJavascript callbacks are valid. Commit .
  • Use the suggested file name when downloading a file. Commit .
  • Ensure that requested URL is set correctly when restoring a view from history. Commit .
  • Don't ask to save settings when nothing has changed in Performance KCM. Commit .
  • Remove dolphinnavigation KCM from configuration dialog. Commit .
  • Remove qDebug() calls. Commit .
  • Use KIconTheme::initTheme & KStyleManager::initStyle to ensure proper. Commit .
  • Construct tabbar with tabwidget parent. Commit .
  • Fix case when Lam Alef is at the end of the line. Commit .
  • Don't use Lam-Alef ligatures when shaping arabic letters. Commit . Fixes bug #478181 .
  • Supress incorrect resize notifications. Commit .
  • Fixed the window geometry config file placement. Commit . See bug #481898 . See bug #482954 .
  • Ensure profile name length limit will work everywhere. Commit .
  • Document line numbers overlay and add GUI method to configure. Commit .
  • Initialize Vt102Emulation::m_currentImage. Commit .
  • Fix ProfileTest which started failing with Qt6.7. Commit .
  • Add "No wrap" setting to search options. Commit . Implements feature #303485 .
  • Character: Return stringWidth, not value of ignoreWcWidth. Commit . Fixes bug #485155 .
  • Add ability to put tabbar on the sides of the view (left/right). Commit .
  • Fix hamburger menu/toolbar issues when splitting tabs. Commit . Fixes bug #474848 .
  • Manual: refer to Qt6 & KF6 version of commandline options now. Commit .
  • Add dummy title option for compatibility. Commit .
  • Override width of YiJing Hexagram Symbols Unicode characters (0x4dc0-0x4dff). Commit . Fixes bug #421625 .
  • Draw Braille characters instead of using font. Commit .
  • Add next/previous actions to change the profile of the current terminal. Commit . Fixes bug #413258 .
  • Add hamburger menu action to all active views. Commit . Fixes bug #484171 .
  • Check only IXON when getting flow control state. Commit . Fixes bug #457924 .
  • Use default application as text editor by default. Commit .
  • Handle wrapped lines correctly in emulateUpDown(). Commit .
  • Implement expected column behaviour in up/down emulation. Commit .
  • Rework the logic of Screen::emulateUpDown(). Commit .
  • Do not enclose CTL tab in appearance dialogue in its own qwidget. Commit . Fixes bug #474309 .
  • Fix strings to allow translations. Commit . Fixes bug #482364 .
  • Fix the mouse-position base for semantic click. Commit .
  • Allow moving through search results using Numpad's Enter key. Commit .
  • Change type of tokenBuffer to QList allow longer length of tokens. Commit . Fixes bug #479241 .
  • Draw block cursor with antialiasing. Commit . Fixes bug #483197 .
  • Draw block cursor outline with MiterJoin. Commit . Fixes bug #483197 .
  • Fallback to home dir if initial working dir is inaccessible. Commit . Fixes bug #470262 . See bug #469249 . See bug #475116 .
  • Reshow configuration dialog after toggling borders. Commit . Fixes bug #479081 .
  • Fix getting FreeBSD process name. Commit . Fixes bug #480196 .
  • Fix touchscreen scroll inconsistency. Commit . Fixes bug #450440 .
  • Revert "profile: enable underline files and open file/links by direct click". Commit .
  • Profile: enable underline files and open file/links by direct click. Commit . Fixes bug #481114 .
  • HotspotFilter/ColorFilter: add a caption to the color preview. Commit .
  • Avoid constructing QChar from non-BMP codepoints. Commit .
  • Fix compile error on macOS. Commit .
  • Don't disable Pty on macOS. Commit .
  • Don't use KGlobalAccel on macOS. Commit .
  • Add note that uni2characterwidth tool doesn't build with Qt6. Commit .
  • Fix Qt 6 assert on QChar outside BMP. Commit .
  • Support non-BMP codepoints in HTMLDecoder. Commit . Fixes bug #479983 .
  • TerminalDisplay/TerminalFonts: fix checking if emojiFont is set. Commit . Fixes bug #481211 .
  • Fix: Issue with focus setting on wdg after relocating to a new splitter. Commit . Fixes bug #479858 .
  • Fix View menu title case and add icon for mouse tracking. Commit .
  • Support Arch Linux names for the lrzsz executables. Commit .
  • Implemented DBus methods for reading displayed text. Commit . Fixes bug #238032 .
  • Fix bug 484599: Name of UI element too long (Hide/Show Sidebar). Commit . Fixes bug #484599 .
  • We don't have ui file here. Commit .
  • [craft] Don't build master version for everything. Commit . Fixes bug #481455 .
  • I push it by error. => disable until craft-windows support was fixed. Commit .
  • Use master version. Commit .
  • Start building Windows app packages. Commit .
  • KPARTS 5.76 is not necessary now. Commit .
  • Tweak @action context. Commit .
  • Make floating values locale-aware. Commit . Fixes bug #484660 .
  • Improve string context. Commit .
  • Drop unused license to restore CI. Commit .
  • Ui/FavoritePage: introduce apply button. Commit .
  • Ui/FavoritePage: change layout of remove element button. Commit .
  • Ui/FavoritePage: restore and refactor clipboard logic. Commit .
  • Ui/FavoritePage: Set position for InlineMessage in footer. Commit .
  • Delay tray setup until mainwindow state restored. Commit . Fixes bug #482316 .
  • Update NEWS. Commit .
  • Update changelog. Commit .
  • Readd flatpak. Commit .
  • Adapt test data to KHolidays changes. Commit .
  • Include ECMQmlModule only when needed. Commit . Fixes bug #483400 .
  • Keep year if months differ with day (undefined behaviour). Commit . Fixes bug #452236 .
  • Remove options from KOPrefs that already exist in CalendarSupport::KCalPrefs. Commit . Fixes bug #483504 .
  • Use view-calendar-tasks. Commit .
  • Remove the 'Custom Pages' settings from KOrganizer. Commit .
  • Add missing [[nodiscard]] remove unused Q_SLOTS. Commit .
  • Move constructor to private, we use singleton. Commit .
  • Set correct link for custompages handbook. Commit .
  • Remove unused KOHelper::resourceColor() overload. Commit .
  • Fix double-free corruption on exit. Commit .
  • Use directly auto. Commit .
  • Already defined as nullptr in header. Commit .
  • Remove akonadi test here. Commit .
  • Add test CI support. Commit .
  • Fix memory leak in parsing MapCSS conditions. Commit .
  • Build against dependencies from the stable branch. Commit .
  • Fix external usability of KOSM headers. Commit .
  • Use released Kirigami Addons. Commit .
  • Unify style for all corridor types. Commit .
  • Handle one more tagging variant for toilets. Commit .
  • Add Akademy 2024 venue as test location. Commit .
  • Fix about dialog missing data and showing an outdated version number. Commit .
  • Don't force master for Craft dependencies anymore. Commit .
  • Attempting to unbreak the Flatpak build again. Commit .
  • Switch to Breeze style for the Android demo app. Commit .
  • Move Craft ignore file here. Commit .
  • Use released Frameworks for static tools build. Commit .
  • Update nightly build links in the README. Commit .
  • Add missing Kirigami Addons dependency. Commit .
  • Add more indoor routing test locations. Commit .
  • Add std::hash specialization for OSM::Element. Commit .
  • Fix long-press event handling. Commit .
  • Add class and layer selector key lookup for MapCSS styles. Commit .
  • Fix OSM::UniqueElement leaking when moving into an already set element. Commit .
  • Fix possible crash during teardown/shutdown. Commit .
  • Make hover selection a setting in the demo app. Commit .
  • Consistently use nodiscard and noexcept attributes in the OSM base types. Commit .
  • Improve external usability of AbstractOverlaySource. Commit .
  • Demonstrate highlighting hovered elements. Commit .
  • Factor out EventPoint to map screen coordinate conversion. Commit .
  • Expose hovered element in the scene controller and map item API. Commit .
  • Fix MapCSS pseudo class state evaluation. Commit .
  • Evaluate MapCSS pseudo classes. Commit .
  • Implement MapCSS import media types correctly. Commit .
  • Implement support for MapCSS import media types. Commit .
  • Add parser support for MapCSS pseudo classes. Commit .
  • Fix dealer lookup by name for help and solve cmdl arg. Commit .
  • Fix crash on undo. Commit . Fixes bug #483013 .
  • Remove ktexttemplate from dependencies. Commit .
  • Fix autotest. Commit .
  • Adapt to Qt6 font weight changes. Commit .
  • Initial support for bcachefs. Commit . Fixes bug #477544 .
  • Fix compile warnings due to QVariant::type(). Commit .
  • Fix whole device exFAT filesystems. Commit . Fixes bug #480959 .
  • Allow lowercase FAT labels. Commit . Fixes bug #466994 .
  • Remove PKP provider. Commit .
  • Fix dangling reference. Commit .
  • Make the pointless path filter for journey results actually work again. Commit .
  • Factor out journey filter thresholds. Commit .
  • Use the new location-based timezone propagation also for the onboard API. Commit .
  • Fill in missing timezones based on locations from KI18nLocaleData. Commit .
  • Add another Hafas coach/vehicle feature mapping. Commit .
  • Handle invalid coordinates when parsing Navitia responses. Commit .
  • Transitous: Move NL and BE to regularCoverage. Commit .
  • Db, transitous: Sync geometry. Commit .
  • Add attribution data for Transitous. Commit .
  • Map two more Hafas feature message codes. Commit .
  • Handle non-WGS84 coordinates in EFA responses. Commit .
  • Add MOTIS intermodal routing paths query support. Commit .
  • Add support for parsing MOTIS OSRM routing paths. Commit .
  • Add support for parsing MOTIS PPR routing path responses. Commit .
  • Fix Android build with Qt 6.7. Commit .
  • Dsb: Add proper polygon so it doesn't interfere in Norway. Commit .
  • Ltglink: Handle when transportation type is not provided. Commit .
  • Increase stop merging distance to 25. Commit .
  • Reduce LTG Link to anyCoverage. Commit .
  • Sync Transitous coverage from transport-apis. Commit .
  • Sync DB from transport-apis. Commit .
  • Downgrade Srbija Voz and ŽPCGore provider to anyCoverage. Commit .
  • Align configuration of MOTIS intermodal modes with Transport API Repository. Commit .
  • Fix journey header size when we don't have vehicle features. Commit .
  • Fix Transitous coverage geometry syntax. Commit .
  • Add support for out-of-line coverage geometry to the coverage QA script. Commit .
  • Sync DB coverage data from the Transport API Repository. Commit .
  • Fi_digitransit: Add proper polygon, so it doesn't affect Latvia and Estonia. Commit .
  • Drop defunct Pasazieru Vilciens backend. Commit .
  • Add one more Hafas onboard restaurant flag mapping. Commit .
  • Update Navitia coverage to match the current reality. Commit .
  • Add Transitous configuration to qrc. Commit .
  • Correctly parse ÖBB business area coach information. Commit .
  • Support per-coach occupancy information. Commit .
  • Add support for out-of-service train coaches. Commit .
  • Parse Hafas feature remarks. Commit .
  • Add two more coach feature flags found in Hafas responses. Commit .
  • Add vehicle feature API to Stopover as well. Commit .
  • Support OTP's bikes allowed data. Commit .
  • Show features also in journey data. Commit .
  • Parse accessibility information in Navitia responses. Commit .
  • Add feature API to JourneySection. Commit .
  • Port QML examples to use the new Feature API. Commit .
  • Update ÖBB coach layout parser to the latest reponse format. Commit .
  • Add feature API for entire vehicles. Commit .
  • Port vehicle layout response parsers to new feature API. Commit .
  • Add new Feature API to VehicleSection. Commit .
  • Add new [journey section|vehicle|vehicle section] feature type. Commit .
  • Update to Transitous configuration from Transport API repository. Commit .
  • Lib: networks: Rename Transitous to be universal. Commit .
  • Explicitly set by_schedule_time for MOTIS stopover queries. Commit .
  • Consistently use nodiscard attribute in journey and vehicle API. Commit .
  • Improve coach background color on incomplete coach type information. Commit .
  • Don't attempt to serialized non-writable properties. Commit .
  • Actually check the results of the Hafas vehicle result parsing tests. Commit .
  • Check car type before deriving class from UIC coach number. Commit .
  • Register QML value types declaratively. Commit .
  • Port QML import to declarative type registration. Commit .
  • Add support for Hafas rtMode TripSearch configuration parameter. Commit .
  • Increase DB Hafas API and extension versions. Commit .
  • Parse UIC station gidL entries in Hafas responses. Commit .
  • Update Austrian coverage polygons from Transport API Repository. Commit .
  • Fix locale overriding in request unit tests. Commit . Fixes bug #482357 .
  • Add support for MOTIS line mode filters. Commit .
  • Remove the JSON key order hack for MOTIS journey requests. Commit .
  • Parse GTFS route colors in MOTIS responses. Commit .
  • Check for supported location types before triggering a query. Commit .
  • Clean up caching documentation and replace deprecated naming in the API. Commit .
  • Fix copy/paste mistake in caching negative journey query results. Commit .
  • Don't modify the request after we used it for a cache lookup. Commit .
  • Support arrival paging for MOTIS. Commit .
  • Implement generic fallback subsequent arrival paging. Commit .
  • Generate default request contexts for arrival paging as well. Commit .
  • Correctly select between intermodal and regular journey queries with MOTIS. Commit .
  • Add Location::hasIdentifier convenience method. Commit .
  • Implement stopover paging for MOTIS. Commit .
  • Generate correct default request contexts for previous departures. Commit .
  • Convert times for the vehicle layout queries to the correct local timezone. Commit .
  • Filter arrival-only/departure-only stopover query results from MOTIS. Commit .
  • Implement journey query paging for Motis. Commit .
  • Transitous: Update API endpoint. Commit .
  • Add helper method to set proper HTTP User-Agent headers. Commit .
  • Correctly de/encode MOTIS timestamps. Commit .
  • Document paging support API. Commit .
  • Fix the Android build. Commit .
  • Parse MOTIS journey paging request context data. Commit .
  • Use [[nodiscard]] consistently and extend API docs a bit. Commit .
  • Add Line::operatorName property. Commit .
  • Correctly swap start and destination for MOTIS backward searches. Commit .
  • Merge arrival/departure stopover query results. Commit .
  • Implement MOTIS departure queries. Commit .
  • Add tests for location search by coordinate with MOTIS. Commit .
  • Add config file for the Transitous development instance. Commit .
  • Make intermodal routing support a per-instance setting for MOTIS. Commit .
  • Add initial MOTIS support. Commit .
  • Also look for backend configurations on disk. Commit .
  • Support untranslated metadata files. Commit .
  • Serbijavoz: Fix wrongly matched station. Commit .
  • Fix test applications after kosmindoormap QML API changes. Commit .
  • Remove unavailable SNCB provider to enable fallback to DB. Commit .
  • Ltglink, pv, srbvoz, zpcg: Only add attribution when returning useful results. Commit .
  • Srbijavoz: Add quirks to match all stations with OSM. Commit .
  • Zpcg, zrbijavoz: Update station data. Commit .
  • Ltglink: Add support for notes. Commit .
  • Zpcg: Skip incomplete results. Commit .
  • NetworkReplyCollection: Give consumers a chance to handle allFinished of empty list. Commit .
  • Zpcg: Clean up. Commit .
  • Zpcg: Fix idName not being set on all names for a station. Commit .
  • Add Serbijavoz backend. Commit .
  • Zpcg: Prepare for adding srbvoz backend. Commit .
  • Work around yet another protobuf undefined define use issue. Commit .
  • Zpcg: Update station data with fix for "Prijepolje cargo". Commit .
  • Revert "Bump Frameworks and QT minimum versions". Commit .
  • Bump Frameworks and QT minimum versions. Commit .
  • Rdp: Proxy and Gateway settings. Commit . Fixes bug #482395 .
  • Remove plugin id metadata. Commit .
  • Build plugins as MODULE libraries. Commit .
  • Ensure WinPR version matches FreeRDP version. Commit .
  • Close rdp session after receiving an error. Commit .
  • RDP: Fix resolution scaling and initial resolution settings. Commit .
  • Also disconnect the cliprdr channel. Commit .
  • Add icon for Remote Desktops sidebar menu item. Commit .
  • Rdp: fix mouse double click. Commit .
  • Fix disconnection on session init due to missing clipboard struct init; BUG: 478580. Commit .
  • Set default TLS security level to 1 (80 bit) to mimic freerdp default. Commit .
  • Rdp: add an option to set TLS security level. Commit .
  • Fix missing break in mouse event handler. Commit .
  • Don't allow recording save dialog to be easily closed from clicking the scrim. Commit . Fixes bug #484174 .
  • Ensure audio prober is not loaded. Commit .
  • Update build.gradle. Commit .
  • Fix android build. Commit .
  • Don't special case qt version on android. Commit .
  • Drop unused kwindowsystem dependency. Commit .
  • Fix build with >=QtWaylandScanner-6.7.1. Commit .
  • Pw: Fix build with last released KPipeWire release. Commit .
  • Fixed crash calling PWFrameBuffer::cursorPosition(). Commit . Fixes bug #472453 .
  • Port KStandardAction usage to new connection syntax. Commit .
  • Fix assertion error when noWallet used. Commit .
  • Add nightly Flatpak build. Commit .
  • Pw: Improve fb allocation code. Commit .
  • Don't search for non-existant Qt6XkbCommonSupport. Commit .
  • Fix pipewire.h include not found. Commit .
  • Wayland: Adapt to change in kpipewire. Commit .
  • Update org.kde.kruler.appdata.xml - include screenshot caption and launchable parameter. Commit .
  • [Flatpak] Re-enable. Commit .
  • Add possibility to retrieve scanner data and option properties as JSON. Commit .
  • Replace developer_name with developer . Commit .
  • Appdata.xml: Add developer_name. Commit .
  • Do not set caption to application name, will result in duplicate. Commit .
  • Place "Contextual Help" entry in middle of Help menu. Commit .
  • Winner dialog: fix broken player name insertion into text. Commit .
  • Do not create layouts with parent argument when explicitly set later. Commit .
  • Ksirkskineditor: use KCrash. Commit .
  • Register apps at user session D-Bus. Commit .
  • Renderer: fill name hashes only once. Commit .
  • Fix HiDPI rendering in game views. Commit .
  • Correct icon and text positions in game chooser for HiDPI mode. Commit .
  • Fix 25x25 letter markers not showing up for ksudoku_scrible.svg. Commit .
  • Adopt frameless look. Commit .
  • Remove editor directives. Commit .
  • KAboutData: set homepage. Commit .
  • Undo system tray bug workaround. Commit . Fixes bug #484598 .
  • Avoid displaying "(I18N_ARGUMENT_MISSING)". Commit .
  • Fix crash when system tray icon is disabled. Commit . Fixes bug #484577 .
  • Fix progress bar text placeholder. Commit .
  • CMake: Bump min libktorrent version. Commit .
  • Apply i18n to percent values. Commit . See bug #484489 .
  • Set associated window for tray icon after showing main window. Commit . Fixes bug #483899 .
  • Infowidget: add context menu action to rename files. Commit . Fixes bug #208493 .
  • Save magnet queue whenever the queue is updated. Commit . Fixes bug #415580 .
  • Replace QWidget->show() with QWindow()->show(). Commit . Fixes bug #481151 .
  • Use different icon for queued seeding and queued downloading. Commit . Fixes bug #312607 .
  • Request symbolic tray icon. Commit . Fixes bug #480340 .
  • Revert us (qwerty) lesson words to 9bb5d012 (buggy) parent. Commit .
  • Adapt to source incompatible Qt 6.7 JNI API. Commit .
  • Add cppcheck. Commit .
  • Use released Kirigami. Commit .
  • Update license information. Commit .
  • Add feature graphic and add/update mobile screenshots. Commit .
  • Clean up Craft settings. Commit .
  • Add dependencies for QML module. Commit .
  • Add query delay to avoid calling service while typing location. Commit .
  • Wait till location query has finished before making a new one. Commit .
  • Fix listview section headers not being visible. Commit .
  • Add license header. Commit .
  • Format QML sources. Commit .
  • Fix language switching. Commit .
  • Rename as KF_MIN_VERSION. Commit .
  • Fix transparent rendering of the cube. Commit . Fixes bug #486085 .
  • Fix debug logging of GL Version; use categorized logging. Commit .
  • Don't create main window on the stack. Commit . Fixes bug #482499 .
  • Add KService dep to CMake. Commit .
  • Coding style: fixed lines > 80 characters. Commit .
  • Plugins/saveblocks: port QRegExp to QRegularExpression. Commit .
  • Plugins/export_k3b: port QRegExp to QRegularExpression. Commit .
  • Plugins/codec_ascii: port QRegExp to QRegularExpression. Commit .
  • Libgui: port QRegExp to QRegularExpression. Commit .
  • Libkwave: change QRegExp to QRegularExpression. Commit .
  • Tabs to spaces in some other files. Commit .
  • Bump KF5_MIN_VERSION and update where KMessageBox API has been deprecated. Commit .
  • Converted tabs to spaces in all .h and .cpp files, according to latest KDE coding style. Commit .
  • Bugfix: mime type names must not be localized. Commit .
  • Playback plugin: removed two unneeded Q_ASSERTs. Commit .
  • Playback_qt: fixed possible division through zero. Commit .
  • Bugfix: First run on multiscreen uses full desktop geometry. Commit .
  • Fix licensecheck on the CI. Commit .
  • Ci: Make use of Ubuntu:devel. Commit .
  • Complement and Update org.kde.kweather.appdata.xml. Commit .
  • Don't enable page dragging between locations unless it's touch input. Commit .
  • Add appstream CI test. Commit .
  • Update Project Link in Readme. Commit .
  • Improve logo and appstream metadata for flathub. Commit .
  • Update homepage consistently to apps.kde.org. Commit .
  • Use correct variable KF_MIN_VERSION. Commit .
  • KGamePropertyHandler: disable remaining stray qDebug calls for now. Commit .
  • KGamePropertyHandler: use direct connection with QDataStream signal arg. Commit .
  • Fix missing receiver context of connection lambda slot. Commit .
  • Revert "Bump min required KF6 to 6.0". Commit .
  • Fix compilation with Qt 6.8 (dev). Commit .
  • Add missing [[nodiscard]] + coding style. Commit .
  • Move destructor in cpp file. Commit .
  • Fix destroying down ProgressDialog. Commit .
  • It compiles fine without Qt deprecated methods. Commit .
  • It compiles fine without kf deprecated methods. Commit .
  • Remove Qt5/KF5 parts. Commit .
  • People API: handle EXPIRED_SYNC_TOKEN error properly. Commit .
  • Activate test CI. Commit .
  • Calendar API: implement support for Event.eventType. Commit .
  • Fix Calendar API test data. Commit .
  • Use QTEST_GUILESS_MAIN in file{copy,create}jobtest. Commit .
  • Introduce a BUILD_SASL_PLUGIN option for co-installability. Commit .
  • Adjust test to behavior change of QTemporaryFile::fileName(). Commit .
  • Use QT_REQUIRED_VERSION. Commit .
  • Add url parameter to docaction. Commit .
  • Try to prevent some invalid LDAP servers. Commit .
  • Add extra source for key origins to KeyListModel. Commit .
  • Store card information in KeyCache. Commit .
  • Port CryptoConfigModule away from KPageWidget. Commit .
  • Modernize/simplify code. Commit .
  • Start gpg-agent when sending a command to it fails with connection error. Commit .
  • Skip check for running gpg-agent when restarting it. Commit .
  • Add option to skip checking for a running gpg-agent. Commit .
  • Make Kleo::launchGpgAgent work for multiple threads. Commit .
  • Remove no longer needed qOverload for QProcess::finished signal. Commit .
  • Bump library version. Commit .
  • Restart gpg-agent instead of just shutting down all GnuPG daemons. Commit .
  • TreeView: add function to explicitely set config group nam. Commit .
  • Save TreeWidget state when it changes. Commit .
  • Save treeview state when it changes. Commit .
  • Disable too verbose logging. Commit .
  • Add option to force a refresh of the key cache. Commit .
  • Fix 'ret' may be used uninitialized warning. Commit .
  • Warn about groups containing sign-only keys in the groups dialog. Commit .
  • Qt::escape is not used. Commit .
  • Fix deleting KeyGroups. Commit .
  • KeyListSortFilterProxyModel: Consider key filters when checking whether groups match. Commit .
  • Adapt KeySelectionCombo to use user IDs instead of Keys. Commit .
  • Rework UserIdProxyModel data handling. Commit .
  • Various fixes for UserIDProxyModel. Commit .
  • Add elgamal algorithm names to Formatting::prettyAlgorithmName. Commit .
  • Save column state of treewidgets. Commit .
  • Add Algorithm and Keygrip columns to keylist. Commit .
  • Move column configuration menu code to NavigatableTreeView/NavigatableTreeWidget. Commit .
  • Add some missing algorithm names. Commit .
  • Cmake: Fix tab vs space issue. Commit .
  • Create interface for adding drag functionality to item views. Commit .
  • Override hidden functions. Commit .
  • Fix debug logging of process output. Commit .
  • Add model containing the user ids of all keys. Commit .
  • Show a usage for ADSKs. Commit .
  • Add Formatting::prettyAlgorithmName. Commit .
  • Do not generate compat cmake files by default. Commit .
  • Support special keyserver value "none" in helper functions. Commit .
  • Prevent infinite recursion when listing subjects of certificates. Commit .
  • Don't list the root of a two certificate chain twice. Commit .
  • Fix missing std::string header with MSVC. Commit .
  • Use AdjustingScrollArea in key approval dialog. Commit .
  • Add ScrollArea from Kleopatra. Commit .
  • Add GpgOL and Gpgtools mime filenames to classify. Commit .
  • CMakeLists: Use QT_REQUIRED_VERSION consistently. Commit .
  • Translate shortcut. Commit .
  • Use KWallet in KF6 build. Commit .
  • Upnprouter: Send in forward and undoForward. Commit .
  • Upnprouter: Fix SOAPAction header in UPnP requests. Commit .
  • Changes to allow renaming in ktorrent. Commit .
  • Clazy: use multi-arg instead. Commit .
  • Clazy: don't include entire modules, just the classes we need. Commit .
  • Clazy: don't call first on temporary container. Commit .
  • Clazy: don't create temporary QRegularExpression objects. Commit .
  • Clazy: add missing Q_EMIT keywords. Commit .
  • Revert accidentally pushed commit "changes to allow renaming in ktorrent". Commit .
  • Fix stalled jobs when TM prefetch is enabled. Commit . Fixes bug #474685 .
  • Add KDE Developer Name for Appdata to fix Flathub builds. Commit .
  • Add possibility to format for KDE PO summit. Commit .
  • Make all text translatable. Commit . Fixes bug #486448 .
  • Register client app at user session D-Bus. Commit .
  • Rename as forceFocus. Commit .
  • Use QStringView::split. Commit .
  • Use kformat. Commit .
  • Use directly QString. Commit .
  • Not export private method + coding style + use [[nodiscard]]. Commit .
  • Use include as local. Commit .
  • Finish to implement expiremovejob. Commit .
  • Normalize polygon winding order for 3D buildings. Commit .
  • Update OSMX rebuild instructions. Commit .
  • Fix Linux platform check. Commit .
  • Remove the no longer used high-z mbtile OSM raw data generator. Commit .
  • Only run NodeReducer on zoom levels where we actually need it. Commit .
  • Skip clipping of inner rings not included in the tile at all. Commit .
  • When activating the search bar, pick up any current selected text as default. Commit .
  • Prevents the recurrence end date combo from eliding. Commit .
  • Make delete dialog background scale with content. Commit .
  • Ensure window is not closed when last job is run. Commit .
  • Improve wording in ImportHandler. Commit .
  • Fix initial position in hourly view when viewing calendar late. Commit .
  • Use early return and fix typo. Commit .
  • IncidenceEditorPage: Fix null dereferencing. Commit .
  • Fix some deprecated parameters injection. Commit .
  • Move DatePopup to a singleton. Commit .
  • Port away from custom DatePicker. Commit .
  • Fix missing import. Commit .
  • Fix call to inhesisting closeDialog method. Commit .
  • Remove other qml version. Commit .
  • Use ===. Commit .
  • Add explicit. Commit .
  • Port ImportHandler to MessageDialog. Commit .
  • Port all custom QQC2.Dialog to MessageDialog. Commit .
  • Fix qml warnings. Commit .
  • Fix code. Otherwise it will crash. Commit .
  • Remove duplicate import. Commit .
  • Fix menubar display. Commit .
  • Complement metainfo.xml. Commit .
  • Rework delete incidence dialog. Commit . See bug #482037 .
  • Load about page asynchronously. Commit .
  • Add explicit keyword. Commit .
  • Add missing const'ref. Commit .
  • Use FormPasswordFieldDelegate. Commit .
  • Add back no display in mail desktop file. Commit .
  • Added save as option to the context menu in folderview. Commit .
  • Fix invalid parent collection error when creating new contact. Commit .
  • Added backend for email composition. Commit .
  • Use new icons from Helden Hoierman. Commit .
  • Fix switch mode in the week view. Commit .
  • Fix identation. Commit .
  • Add autotest on FreeBSD. Commit .
  • Fix wrong weekday label of Chinese locale when length set to letter only (M). Commit . Fixes bug #450571 .
  • Avoid heap allocation when calculating size with encoding. Commit .
  • Unify setMessageCryptoFormat and setCryptoMessageFormat. Commit .
  • Already called in subclass. Commit .
  • Messageviewer.kcfg.in : In groups "Todo", "Event", "Note" fix whatsthis text. Commit .
  • We don't have *.kcfg.cmake here. Commit .
  • Fix icon size. Commit .
  • Reduce memory => QList . Commit .
  • Fix potential problem: Saving over an existing file wouldn't truncate it first. Commit .
  • Add setPlaceholderText. Commit .
  • Don't create element when not necessary. Commit .
  • Remove private Q_SLOTS. Commit .
  • Remove unused private Q_SLOTS. Commit .
  • Show text when there is not filter. Commit .
  • Fix i18n. Commit .
  • Save recent address with full name. Commit . Fixes bug #301448 .
  • Don't create elements when it's not necessary. + don't try to replace prefix if suject is empty. Commit .
  • Remove heap allocation in RichtTextComposerNg. Commit .
  • Remove KF6::KIOCore in templateparser too. Commit .
  • Remove not necessary KF6::KIOCore here. Commit .
  • We don't need to link to KIOCore in messagelist. Commit .
  • Fix include. Commit .
  • Fix includes. Commit .
  • Use WebEngineViewer::BackOffModeManager::self(). Commit .
  • USE_TEXTHTML_BUILDER is used from long time without pb. Commit .
  • USe switch. Commit .
  • Allow to returns host searched in rules. Commit .
  • Load global files. Commit .
  • Add alwaysRuleForHost. Commit .
  • Remove extra /. Commit .
  • Don't make member variables const. Commit . Fixes bug #481877 .
  • Add search path. Commit .
  • Load global settings. Commit .
  • Continue to implement it. Commit .
  • Prepare to load global rules. Commit .
  • Use info only if it's enabled. Commit .
  • Save/load enable status. Commit .
  • Allow to enable/disable action. Commit .
  • Rename method/actions. Commit .
  • Store only local actions. Commit .
  • Allow define local/global openwith. Commit .
  • Use std::move. Commit .
  • Constructor must be private not singleton. Commit .
  • Allow open and save on main body parts. Commit .
  • Remove Q_SLOTS we use lambda now. Commit .
  • Use WebEngineViewer::CheckPhishingUrlCache::self(). Commit .
  • Move contructor in private area when we use singleton + add missing [[nodiscard]] + don't export private symbol. Commit .
  • Don't export private methods + add missing [[nodiscard]]. Commit .
  • Add missing [[nodiscard]] + MIMETREEPARSER_NO_EXPORT. Commit .
  • Remove unused private slot (we use lambda) + [[nodiscard]]. Commit .
  • Add missing [[nodiscard]] + move constructor in private area when we use. Commit .
  • Add missing MESSAGEVIEWER_NO_EXPORT + move constructor as private. Commit .
  • Add missing override [[nodiscard]] + const'ify variable. Commit .
  • Add missing [[nodiscard]] + move constructor as private when we use instance. Commit .
  • Move instance definition in c++. Commit .
  • Use forward declaration directly. Commit .
  • Warning--. Commit .
  • Remove not necessary Q_SLOTS. Commit .
  • Webengineexporthtmlpagejob is a dead code. Used when we can't print with qwebengine. Commit .
  • Remove unused slots. Commit .
  • Const'ify pointer/variables. Commit .
  • Remove comment. Commit .
  • Reduce string allocations. Commit .
  • Don't export private methods too. Commit .
  • Not export private methods. Commit .
  • Use more MESSAGEVIEWER_NO_EXPORT. Commit .
  • Fix encrypted attachments not showing in header. Commit .
  • Replace all remaining stack-created Composer objects in cryptocomposertest. Commit .
  • Fix composerviewbasttest. Commit .
  • Port to takeContent. Commit .
  • Use explicit. Commit .
  • Fix cryptocomposertest. Commit .
  • Remove include. Commit .
  • Use QByteArrayLiteral. Commit .
  • Fix *-signed-apple render tests. Commit .
  • Fix openpgp-inline-encrypted-with-attachment rendertest. Commit .
  • Update body part factory test expectations to shared-mime-info 2.4. Commit .
  • Fix detection of kmail:decryptMessage link. Commit .
  • Adapt expected rendertest output to Qt6 AM/PM time formatting. Commit .
  • Parse email address we get from GpgME. Commit .
  • Fix ViewerTest::shouldHaveDefaultValuesOnCreation. Commit .
  • Fix Grantlee header test date/time formatting. Commit .
  • Fix replystrategytest. Commit .
  • Fix templateparserjob unit test. Commit .
  • Fix MessageFactoryTest. Commit .
  • Port NodeHelper away from deprecated Content::add/removeContent. Commit .
  • Fix non UNIX build. Commit .
  • USe pragma once. Commit .
  • USe override keyword. Commit .
  • USe isEmpty here. Commit .
  • Fix build of cryptohelpertest with custom gpgmepp. Commit .
  • Fix url. Commit .
  • Fix cryptoutils unit tests. Commit .
  • Fix minor typo adding a dot (*mime -> *.mime). Commit .
  • Use subject for the filename. Commit .
  • Change extension when saving file. Commit .
  • Remove unused forward declaration. Commit .
  • Use isEmpty() directly. Commit .
  • Q_DECL_OVERRIDE-> override. Commit .
  • Cont'ify pointer. Commit .
  • Use === operator. Commit .
  • Fix variable is unused. Commit .
  • Not necessary to use 2 suffix. Commit .
  • Messageviewerdialog: Set window title. Commit .
  • Fix unit tests. Commit .
  • Use certificate instead of key in user interface. Commit .
  • Move to @same for products that are on the same release cycle. Commit .
  • Fix minor typo. Commit .
  • Fix message viewer dialog test. Commit .
  • Smime: Improve "no certificate found" error message. Commit .
  • Display error icon in KMessageWidgets. Commit .
  • Make dialog resizable. Commit .
  • Cleanup: Remove dead code. Commit .
  • Ensure email address in the header is visible and open with mailto:. Commit .
  • Fix module. Commit .
  • Adapt to behavior change in libQuotient. Commit .
  • Push ImageEditorPage using pushDialogLayer. Commit . Fixes bug #486315 .
  • Fix opening room on mobile. Commit .
  • Fix AddServerSheet. Commit .
  • Revert "Preserve mx-reply in the edited message if it exists". Commit .
  • Preserve mx-reply in the edited message if it exists. Commit .
  • Use escaped title in devtools. Commit .
  • Work around QML opening dialog in wrong window. Commit .
  • Replace Quotient::Connection with NeoChatConnection where possible. Commit .
  • Refactor the MessageComponentModel component update. Commit .
  • Remove search bar; Use QuickSwitcher instead. Commit .
  • Fix Roomlist Shortcuts. Commit . Fixes bug #485949 .
  • Force author display name in HiddenDelegate to PlainText. Commit .
  • Make the SpaceDrawer navigable with the keyboard. Commit .
  • Apply 1 suggestion(s) to 1 file(s). Commit .
  • Use AvatarButton in UserInfo instead of a custom button. This has the advantage of showing keyboard focus properly. Commit .
  • Use more appropriate icons and tooltips for the room info drawer handles. Commit .
  • Use new cornerRadius Kirigami unit across the app. Commit .
  • Make sure that tab can be used to navigate away from the chatbar. Commit .
  • Add Carl's focus title hack as a devtool option. Commit .
  • Improve CodeComponent background. Commit .
  • Make the "add new" menu button a hamburger menu. Commit .
  • Change actionChanged to notificationActionChanged. Commit .
  • Elide the Hidden delegate text. Commit .
  • Only override the DelegateType when showing hidden messages. Commit .
  • Implement devtoool to show hidden timeline messages. Commit .
  • Fancy Effects 2021-2024 gone but never forgotten. Commit .
  • Use 0.8.x for libQuotient flatpak. Commit .
  • Make sure the user can get to the navigationtabbar. Commit .
  • Rejrejore. Commit .
  • Jreojreojr. Commit .
  • Make sure the drawer get active focus on open. Commit .
  • RoomInformation: allow tabbing on actions. Commit .
  • Add kitemmodels back to Permissions.qml. Commit .
  • Try fixing test some more. Commit .
  • Make DrKonqi work with NeoChat. Commit .
  • Try fixing appium test. Commit .
  • Fix compatibility with libQuotient dev branch. Commit .
  • Remove outdated event registrations. Commit .
  • Add option to show all rooms in "uncategorized" tab. Commit .
  • Add missing import to global menu. Commit .
  • Remember previous downloads after restarts. Commit .
  • Fix opening account editor. Commit .
  • Mark ThreePIdModel as uncreatable. Commit .
  • Add missing #pragma once. Commit .
  • Add visualisation of the account's third party IDs in the account editor. Commit .
  • Add hover button for maximising a code block. Commit .
  • Improve README. Commit .
  • Fix Verification Window Sizing. Commit . Fixes bug #485309 .
  • Fix showing the unread count for DM section when not selected. Commit .
  • Add a debug options page to devtools with the option to always allow verification for now. Commit .
  • Fix feature flag devtools page by adding necohat import as this is where config comes from now. Commit .
  • Use declarative type registration for remaining types. Commit .
  • Devtools: Implement changing room state. Commit .
  • Load Main qml component from module. Commit .
  • Create QML module for login. Commit .
  • Use Qt.createComponent in non-weird way. Commit .
  • Show QR code for room in drawer. Commit .
  • Add button to get a QR code for the local user to the account editor page. Commit .
  • Fix gaps at the top and bottom of SpaceHomePage witht he wrong background colour. Commit .
  • Add image info for stickers. Commit .
  • Linkpreviewer Improvements. Commit .
  • Render custom emoji icons in the completion pane. Commit .
  • Re-add requirement for having devtools active for the show message source action. Commit . Fixes bug #485140 .
  • Force the choose room dialog's search dialog to be focused. Commit .
  • Fix the share dialog not showing up. Commit .
  • Show a verified icon for verified devices rather than a verify option. Commit .
  • Only ask for URL opening confirmation for QR codes. Commit . Fixes bug #484870 .
  • Tree Model 2 Electric Boogaloo. Commit .
  • Make ConfirmUrlDialog HIG-compliant. Commit .
  • Fix QML warning. Commit .
  • Remove leftover signal handler. Commit .
  • Create component for showing a maximize version of a code snippet. Commit .
  • Create qml module for devtools. Commit .
  • Fix location delegates. Commit .
  • Shut qt up about models passed to QML. Commit .
  • Move the various room models into RoomManager. Commit .
  • Stay in DM tab when selecting a DM. Commit .
  • Rework roommanager for improved stability. Commit .
  • RoomManger connection. Commit .
  • Space Search. Commit .
  • Fix marking messages as read when the window is thin. Commit .
  • Set OUTPUT_DIRECTORY for qml modules. Commit .
  • Remove unused property. Commit .
  • Remove leftover signal. Commit .
  • Add pagination to space hierarchy cache. Commit .
  • Add "Leave room" button to sidebar. Commit . Fixes bug #484425 .
  • Fix opening the last room active room if it's not in a space. Commit .
  • Make sure we're switching out of the space home page when leaving the currently opened space. Commit .
  • Fix plural handling in space member strings. Commit .
  • Improve space management strings. Commit .
  • Make various models more robust against deleted rooms. Commit .
  • UserInfo compact. Commit . Fixes bug #482261 .
  • Remove external room window feature. Commit . Fixes bug #455984 .
  • Show custom delegate for in-room user verification. Commit .
  • Add QR code scanner. Commit .
  • Support selected text for replies in the right click menu. Commit . Fixes bug #463885 .
  • Use custom room drawer icons. Commit .
  • SpaceChildrenModel: Handle space being deleted. Commit .
  • Simplify spacedrawer width code. Commit .
  • Allow show sender detail from message context menu. Commit .
  • Fix logout current connection crash. Commit .
  • Use unique pointers for space child items. Commit .
  • Create a QML module for settings. Commit .
  • Always encrypt DMs when creating them. Commit .
  • Don't Maximize Stickers. Commit . Fixes bug #482701 .
  • Fix Message Components for Tags with Attributes. Commit . Fixes bug #482331 .
  • Fix crash when visiting user. Commit . Fixes bug #483744 .
  • Fix manual user search dialog. Commit .
  • Fix Opening Maximized Media. Commit .
  • Improved itinerary delegates. Commit .
  • Add UI for entering key backup passphrase. Commit .
  • Fix removing a parent space when we're not joined. Commit .
  • Clean up button. Commit .
  • Fix opening manual room dialog. Commit .
  • More file previews. Commit .
  • Add back errouneously removed import. Commit .
  • Refactor and improve emoji detection in reactions. Commit .
  • Bump compiler settings level to 6.0. Commit .
  • Fix the quick format bar not actually doing anything. Commit .
  • Exclude lonely question marks from the linkify regex. Commit .
  • Timeline Module. Commit .
  • Remove stray log. Commit .
  • Itinerary Component. Commit .
  • Fix typo in MessageEditComponent. Commit .
  • Don't destroy formatting when editing previous messages. Commit .
  • Prevent collision between KUnifiedPush DBus and KRunner DBus. Commit .
  • Make the tabs in developer tools full-width. Commit .
  • Make sure that timeline is scrolled to end when switching room. Commit .
  • Add purpose plugin. Commit .
  • Remove manual window toggling for system tray icon. Commit . Fixes bug #479721 . Fixes bug #482779 .
  • Fix crash in RoomTreeModel. Commit .
  • Require frameworks 6.0. Commit .
  • Re-order spaces by dragging and dropping. Commit .
  • Move the devtools button to UserInfo. Commit .
  • Make sure that the MessageSourceSheet component is created properly in devtools. Commit .
  • Allow opening the settings from the welcome page. Commit .
  • Don't link KDBusAddons on windows. Commit .
  • Fix space tree refresh. Commit .
  • Improve hover link indicator accessibility. Commit .
  • Fix appstream. Commit .
  • StripBlockTags Fixes. Commit .
  • Add highlight and copy button to code component. Commit .
  • No Code String Convert. Commit .
  • Visualise readacted messages. Commit .
  • Fix binding loop in NotificationsView. Commit .
  • Show link preview for links in room topics. Commit .
  • Remove unnecessary regex in room topic component. Commit .
  • Use plaintext in devtools room selection combo. Commit .
  • Add devtools button to account menu. Commit .
  • Hide typing notifications for ignored users. Commit .
  • Fix the top section heading in the timeline. It was previously causing anchor loops. Commit .
  • Notification Consistency. Commit .
  • Fix (un)ignoring unknown users. Commit .
  • Fix compilation error. Commit .
  • Add app identifier in donation url. Commit .
  • Add more appstream urls. Commit .
  • Updated room sorting. Commit .
  • Split text section into blocks. Commit .
  • Devtools: Split state keys into a separate list. Commit .
  • Adapt to QTP0001. Commit .
  • Show AccountData in Devtools. Commit .
  • Fix sharing. Commit .
  • Cache space hierarchy to disk. Commit .
  • Make sure that only text messages can be edited. Commit .
  • Add view of ignored users and allow unignoring them. Commit .
  • Port room upgrade dialog to Kirigami.Dialog. Commit .
  • Favourites -> Favorites. Commit . Fixes bug #481814 .
  • Don't build kirigami-addons master. Commit .
  • Pin kirigami-addons. Commit .
  • Move ShowAuthorRole to MessageFilterModel. Commit .
  • Create a feature flag page in devtools. Commit .
  • Make sure that the room isn't already in the model before appending. Commit .
  • Html-escape display name in user detail sheet. Commit .
  • Fix saving images from maximize component. Commit .
  • Add feature flag for reply in thread. Commit .
  • Introduce MediaManager. Commit .
  • Leave predecessor rooms when leaving room. Commit .
  • Improve push notification string. Commit .
  • Remove room from RoomTreeModel before leaving it. Commit .
  • Fix crash in ImagePacksModel. Commit .
  • Fix email. Commit .
  • Quotient -> libQuotient. Commit .
  • Fix disconnect warning. Commit .
  • Don't try setting up push notifications when there's no endpoint. Commit .
  • Run qmlformat. Commit .
  • Remove duplicated actions. Commit .
  • Separate MessageDelegateContextMenu to its own base component. Commit .
  • Remove redundant checks. Commit .
  • Fix some properties. Commit .
  • Port RoomList to TreeView. Commit . Fixes bug #456643 .
  • Fix crash when there is no recommended space. Commit .
  • Fix audio playback. Commit .
  • Add neochat 24.02 release note. Commit .
  • Add a way for distros to recommend joining a space. Commit .
  • Change ExploreComponent to signal text changes and set filterText from there. Commit .
  • Space notification count. Commit .
  • Fix Space Saving. Commit .
  • Message Content Rework. Commit .
  • Fix reaction delegate sizing for text reaction. Commit .
  • Fix reaction update event when the event is not there anymore. Commit .
  • Skip Welcome screen when there's only one connection and it's loaded. Commit .
  • Allow dropping connections from the welcome page. Commit .
  • Make the settings window a little bit taller to accommodate most pages. Commit .
  • Show custom emoji reactions as per MSC4027. Commit .
  • Fix AudioDelegate playback. Commit .
  • Remember Space. Commit .
  • Improve getBody. Commit .
  • Run qmlformat over everything. Commit .
  • Fix layoutTimer. Commit .
  • Support the order parameter in m.space.child events. Commit .
  • Low priority rooms only show highlights and mentions in the roomlist . Commit .
  • Use resolveResource for SpaceDrawer and RoomListPage. Commit .
  • Revert "Compact Mode Improvements". Commit . Fixes bug #480504 .
  • Change the behaviour when clicking on a space. Commit .
  • Revert "Add a way for distros to recommend joining a space". Commit .
  • Don't color usernames in state delegates. Commit .
  • Compact Mode Improvements. Commit .
  • Fix copying selected text from a message. Commit .
  • Refactor EventHandler. Commit .
  • MessageSource Line Numbers. Commit .
  • Always use resolveResource instead of enterRoom or EnterSpaceHome. Commit .
  • Manual friend ID. Commit .
  • Add appstream developer tag and remove developer_name tag. Commit .
  • Autosearch. Commit .
  • Fix the vertical alignment of the notification bubble text. Commit .
  • The search for friendship. Commit .
  • Remove workaround for QTBUG 93281. Commit .
  • Add icon for notification state menu. Commit .
  • Generic Search Page. Commit .
  • Hide the subtitle text for room delegates if there is none. Commit .
  • Remove the option to merge the room list. Commit .
  • Clip QuickSwitcher. Commit .
  • Require master of ECM. Commit .
  • Current Room Messages. Commit .
  • NeoChatConnection signals. Commit .
  • Make the search message dialog header way prettier, like it is in KCMs. Commit .
  • Add missing thread roles in SearchModel. Commit .
  • Why can't we be friends. Commit .
  • Refactor proxy configuration and move to separate file. Commit .
  • Refactor some code around connection handling. Commit .
  • Move notifications button to space drawer. Commit . Fixes bug #479051 .
  • Add basic Itinerary integration. Commit .
  • Don't crash when calling directChatRemoteUser in something that isn't a direct chat. Commit .
  • Readonly Room. Commit . Fixes bug #479590 .
  • Unify usage of WITH_K7ZIP. Commit .
  • Fix sidebar status not being respected when opening the first file. Commit . Fixes bug #484938 .
  • We want to create appx packages for windows. Commit .
  • Remove CHM generator; disabled for 4 months. Commit .
  • Load certificates delayed. Commit . Fixes bug #472356 .
  • Add unit test for AFNumber_Format. Commit .
  • Djvu: Remove support for old djvu library version. Commit .
  • Various minor fixes. Commit .
  • A collection of cppcheck fixes. Commit .
  • Let poppler pick the font size when signing signature fields. Commit . See bug #443403 .
  • Add Windows Craft job. Commit .
  • Refactor documentSignatureMessageWidgetText and getSignatureFormFields. Commit .
  • Properly reset documentHasPassword. Commit .
  • Fix DocumentHasPassword check. Commit . Fixes bug #474888 .
  • Revert "refactor signatureguiutils.cpp to avoid unnessary page loops". Commit .
  • Refactor signatureguiutils.cpp to avoid unnessary page loops. Commit .
  • Fix crash on closing Annot Window if spell checking is enabled. Commit . Fixes bug #483904 .
  • Ignore synctex_parser; it's 3rd party code. Commit .
  • Fix a cppcheck warning. Commit .
  • Add cppcheck run to gitlab. Commit .
  • Improve clazy setup and enable more tests. Commit .
  • [macOS] Fix plist file. Commit .
  • Try to fix compile error on macOS. Commit .
  • When pressing shift, hjkl scroll 10 times faster. Commit .
  • Use setCurrentIndex to set currentIndex. Commit .
  • Fix loading okular preview part. Commit . Fixes bug #483109 .
  • Fix configure web shortcuts popup in kcmshell6. Commit .
  • Cleanups: Sprinkle in a bit unique_ptr. Commit .
  • Fix multiline selection. Commit . Fixes bug #482249 .
  • Fix crash when in embedded dummy mode. Commit . Fixes bug #476207 .
  • Clean up TextSelection and remove unused parts. Commit .
  • Use std::swap. Commit .
  • Fix PAGEVIEW_DEBUG build. Commit .
  • Add missing deps to CMake. Commit .
  • Newer clazy: More PMF. Commit .
  • Newer clazy: More for loops. Commit .
  • Newer clazy: Use PMF for actions. Commit .
  • Newer clazy: More QListery. Commit .
  • Newer clazy: Add a few std::as_const. Commit .
  • Newer clazy: QList changes. Commit .
  • Newer clazy: More potential detaching temporary. Commit .
  • Use QStringView more to reduce allocations. Commit .
  • Warn on suspicious realloc. Commit .
  • Presentationwidget: Invalidate pixmaps on dpr change. Commit . Fixes bug #479141 .
  • CI test runners are slower. Commit .
  • Better user strings for signature settings. Commit . See bug #481262 .
  • Stop looking for jpeg. Commit .
  • Remove plucker generator. Commit .
  • Simplify textentity memory management. Commit .
  • Org.kde.okular.appdata: Add developer_name. Commit .
  • [Craft] Don't rebuild everything. Commit .
  • DVI: use actual page size. Commit .
  • Better fix for crash-in-pdf-generation. Commit .
  • Button groups can span multiple pages. Commit . Fixes bug #479942 .
  • Reset SOVERSION. We changed the library name. Commit .
  • Add support for app.popUpMenu and submenus in popUpMenuEx. Commit . Fixes bug #479777 .
  • Mobile: Remove deprecated no-op code. Commit .
  • Fix crash in pdf generator. Commit .
  • Sync man page commands with the Command Line Options sections of the Okular handbook. Commit .
  • Fix ci by not requesting cross-group targets. Commit .
  • Fix unit test warnings. Commit .
  • Also fix compile path. Commit .
  • Fix loading okularpart. Commit .
  • Fix SlicerSelector. Commit . Fixes bug #481175 .
  • Convert QT_MAJOR_VERSION to 6. Commit .
  • Fix window updates on wayland. Commit . Fixes bug #468591 .
  • Port PracticeSummaryComponent to be a QWidget. Commit .
  • Port PracticeMainWindow to be a QWidget. Commit .
  • Port Editor to be a QWidget. Commit .
  • Port StatisticsMainWindow to be a QWidget. Commit .
  • Port Dashboard to be a QWidget. Commit .
  • Port away from deprecated pos() method. Commit .
  • Provide option to disable browser integration. Commit .
  • Use QDir::canonicalPath() for /home. Commit .
  • Enable nofail by default for / and /home. Commit . Fixes bug #476054 .
  • Add an fstab nofail mount option. Commit . Fixes bug #472431 .
  • Hide partition type on GPT disks. Commit .
  • Add LUKS2 option when creating LUKS partition. Commit .
  • Initial support for bcachefs. Commit .
  • Use isEmpty() here. Commit .
  • Add 0.14.2 version. Commit .
  • Use 0.14.2. Commit .
  • Appdata: Add homepage URL. Commit .
  • Use std::chrono_literals. Commit .
  • Ensure tooltip in recipient editor are word wrapped. Commit .
  • Use operator_L1 directly. Commit .
  • There is not ui file. Commit .
  • Remove duplicate "protected:". Commit .
  • Merge target_source. Commit .
  • Remove Q_SLOTS (as we use lambda). Commit .
  • Remove usage of QT_NO_* ifdef. Commit .
  • Fix clazy warning. Commit .
  • More Android fixes, such as the share menu. Commit .
  • Add the actual app icon image, oops. Commit .
  • Add Android app icon. Commit .
  • Export main() on Android. Commit .
  • Add Android APK support. Commit .
  • Fix typo in openAddToPlaylistMenu(). Commit .
  • Add more package descriptions. Commit .
  • Only find Qt::Test and ECMAddTests when building autotests. Commit .
  • Bump minimum C++ version 20. Commit .
  • Include ECMQmlModule explicitly. Commit .
  • Bump minimum KF to 6.0. Commit .
  • Make libmpv quieter. Commit .
  • Port from Qt5Compat.GraphicalEffects. Commit .
  • Add a player menu item to copy video URL. Commit .
  • Add a way to show video statistics. Commit .
  • PeerTube: Fix search. Commit .
  • PeerTube: Implement listing subscribed channels. Commit .
  • PeerTube: Fix channel information. Commit .
  • PeerTube: Fix viewing remote channels. Commit .
  • PeerTube: Fix author avatars for comments. Commit .
  • PeerTube: Fix video info on subscriptions, avatars for channels. Commit .
  • Add an "Add to playlist" action to the video player. Commit .
  • Fix the channel page sometimes showing the wrong data. Commit .
  • Fix the "Add to Playlist" dialog, again. Commit .
  • Invidious: Fix channel playlist thumbnails. Commit .
  • PeerTube: Un-YouTubify links, because they aren't those. Commit .
  • Add feature to import/export (YouTube) OPML subscriptions. Commit . See bug #468116 .
  • Fix i18n error in subscription button. Commit .
  • Use safe hardware acceleration from libmpv. Commit .
  • When there's no views, say "No views" instead of "0 views". Commit .
  • Fix subscription counts from Invidious that aren't integers. Commit .
  • Fix no audio in the PiP player. Commit .
  • Fix the video grid becoming unresponsive when flicking away the player. Commit . Fixes bug #480578 .
  • Restore maximized state when exiting fullscreen. Commit . Fixes bug #480851 .
  • Use 0 instead of Date.New in VideoQueueView. Commit .
  • Fix the sub count not being formatted correctly. Commit . Fixes bug #478405 .
  • Remove Utils.formatTime and use upstream KCoreAddons.Format. Commit .
  • Fix qmllint errors, QML module registration and more. Commit .
  • Remove duplicate const specifier. Commit .
  • Move Paginator to QInvidious. Commit .
  • Remove Paginator::previous(). Commit .
  • Add support for the new Pagination API to the rest of the query types. Commit .
  • Switch from QStringView. Commit .
  • Fix wrong GPL in the SPDX header for SourceSwitcherDialog. Commit .
  • Move source switcher to a dialog, also improve key navigation in it. Commit .
  • Use one QStringLiteral instead of multiple for key names. Commit .
  • Remove unused net() function in AbstractApi. Commit .
  • Add a page to view current subscriptions. Commit .
  • Check if future is canceled instead of valid. Commit .
  • Check if current player exists before disconnecting signals. Commit .
  • Remove now useless audio url debug message. Commit .
  • PeerTube: Implement support for fetching subscription feed. Commit .
  • Implement support for logging into PeerTube. Commit .
  • Overhaul login and credentials system. Commit .
  • Create common AccountCard component, share between Invidious + PeerTube. Commit .
  • Begin implementation of PeerTube login. Commit .
  • Don't add audio file if it isn't given. Commit .
  • PeerTube: Support thumbnailUrl from video JSON. Commit .
  • Introduce a Paginator API. Commit .
  • Only report result and process reply if the future isn't cancelled. Commit .
  • Fix audio in certain videos no longer working. Commit .
  • Make the "Add to Playlist" feature work in video lists. Commit .
  • Fix the weird scrolling & clipping on the channel pages. Commit .
  • Introduce minimum window size on desktop. Commit .
  • Fix autotest CMake file license. Commit .
  • Remove focus debug comment. Commit .
  • Introduce new general & network logging categories, and install them. Commit .
  • Protect against videoModel being undefined. Commit .
  • Use a regular control instead of an ItemDelegate for the source switcher. Commit .
  • Use QCommandLineParser::positionalArguments(), remove more cruft. Commit .
  • Remove unnecessary registration of MpvObject. Commit .
  • Move YouTube link parser to it's own file, add autotest. Commit .
  • Start at that point in the playlist when clicking a video inside of one. Commit .
  • Add support for viewing a channel's playlists. Commit .
  • Fix the video quality setting not actually doing anything. Commit . Fixes bug #475964 .
  • Fix the formats shown in the resolution box. Commit . See bug #475964 .
  • Use onClicked instead of onPressed in video queue. Commit .
  • Fix undefined reference when grabbing page title. Commit .
  • Fix a spew of undefined errors when the queue video item is loading. Commit .
  • Only show queue controls in video menu if there's one video loaded. Commit .
  • Save and load the last used source. Commit .
  • Improve the look of the queue control. Commit .
  • Use Qt.createComponent to create about pages. Commit .
  • Fix the video container being lost when going fullscreen. Commit .
  • Add small but useful comments explaining each part of the video player. Commit .
  • Fix touch input on the player, finally. Commit .
  • Use a better icon for the hide player button. Commit .
  • Reduce the amount of the video title duplication. Commit .
  • Update KAboutData, copyright date and add myself. Commit .
  • Push the channel page on the layer stack, instead of replacing it. Commit .
  • If the video player is open and there's a video, display in title. Commit .
  • Properly capitalize the watch/unwatch actions in the video menu. Commit .
  • Fix the network proxy page accidentally enabling its apply button. Commit .
  • Add more explanations to some settings, add more ellipses where needed. Commit .
  • Dramatically improve the login page. Commit .
  • Add icon and better description for the Invidious log in action. Commit .
  • Introduce a base source page type, move delete source action to header. Commit .
  • Add text and tooltips for the video controls. Commit .
  • Add action support to the video player header, move "Share" up there. Commit .
  • Give the settings window a title. Commit .
  • Set the window title to the current page name. Commit .
  • Use better picture-in-picture icon. Commit .
  • Word wrap the video description. Commit .
  • Hide view count on video grid items if it's not available. Commit .
  • Move "Add Source" button to the header bar. Commit .
  • Add setting to hide short form videos. Commit .
  • Improve loading experience by using proper LoadingPlaceholder and more. Commit .
  • Explicitly mark livestream and shorts, instead of no label. Commit .
  • Fix capitalization on the "Add to Playlist" dialog. Commit .
  • Fix long press for context menu for video grid items. Commit .
  • Set icon for the "Apply" button in network proxy settings. Commit .
  • Disable network proxy settings when set to "System Default". Commit .
  • Change minimized video player color set to Header. Commit .
  • Icon tweaks. Commit .
  • Remove click to toggle play/pause. Commit .
  • Fix right-clicking items with mouse or touchpad not working. Commit .
  • Fix touch on recommended video items. Commit .
  • Fix video controls not showing up on tap. Commit .
  • Fix context menu activating too easily on touch input. Commit .
  • Don't enable hover for grid items on touch input. Commit .
  • Fix thumbnail cropping in video player. Commit .
  • Mess around with the video grid and list item spacing and sizing. Commit .
  • Use new placeholder image item in video list and playlist grid items. Commit .
  • Remove some unnecessary imports of Qt5Compat.GraphicalEffects. Commit .
  • Add separator between active source and the expanded switcher. Commit .
  • Hide like count chip when zero. Commit .
  • Add date chip for checking when the video was published in the player. Commit .
  • Add share button to right side of video player. Commit .
  • Add heading for comments section. Commit .
  • Use QQC2.ItemDelegate everywhere now. Commit .
  • Fix keyboard toggle button always opening keyboard. Commit .
  • Properly implement showing keyboard on launch. Commit .
  • Show vkbd when a terminal page is created. Commit .
  • Appstream: replace deprecated developer_name /w developer, update type. Commit .
  • Appdata: Add launchable parameter and screenshot caption. Commit .
  • Org.kde.skanlite.appdata: Add developer_name. Commit .
  • Add a simple image and pdf import ability. Commit . Fixes bug #482224 .
  • Add command line option to dump all option information to a text file. Commit .
  • Split preview view from document page. Commit .
  • Remove wrong unlock for scanning thread. Commit .
  • Add build fixes (part2). Commit .
  • Add build fixes. Commit .
  • Re-enable flatpak and update dependencies. Commit .
  • Use qt6 syntax for parameters in signal. Commit .
  • Prevent save action while a document is not ready yet. Commit .
  • Safeguard against nullptr while saving document. Commit . Fixes bug #477439 .
  • Add mass flipping actions. Commit . See bug #481002 .
  • Set file dialog in PDF export view to save mode. Commit . Fixes bug #478296 .
  • Fix share delegates. Commit .
  • Fix error display for sharing window. Commit .
  • Completely hide the device name when options are hidden. Commit .
  • Use qt6 syntax for signal parameters. Commit .
  • Remove usage of unavailable property of scrollview. Commit .
  • Make use of QLocale::codeToLanguage for OCR. Commit .
  • Bump tesseract dependency to 5. Commit .
  • Bump KF dependency and cleanup. Commit .
  • Fix segfault with scanner connected by usb. Commit .
  • Shorten appstream metainfo summary. Commit .
  • Always convert old placeholder format to new placeholder format when new format is not used. Commit . Fixes bug #484211 .
  • Fix empty placeholders breaking nearby placeholders. Commit . Fixes bug #483320 .
  • ExportManager: reduce unnecessary string manipulation in formattedFilename(). Commit .
  • VideoCaptureOverlay: Minimized -> Window.Minimized. Commit .
  • Raise and activate capture windows when shown. Commit . Fixes bug #482467 .
  • Use HH instead of hh by default. Commit .
  • SpectacleCore: Only use normal windows and dialogs for window visible check. Commit .
  • ImagePlatformXcb: Make on click filter button handling code more descriptive. Commit .
  • VideoPlatformWayland: handle and add error messages for when the stream is prematurely closed. Commit .
  • VideoPlatform: don't assert recording boolean in setRecording. Commit .
  • VideoPlatformWayland: Remove the need for a DBus call to KWin's getWindowInfo. Commit .
  • Update recording related models in response to VideoPlatform changes. Commit .
  • VideoPlatformWayland: Get PipeWireRecord asynchronously. Commit . See bug #476866 .
  • VideoPlatformWayland: Add missing not operator. Commit .
  • Improve feedback when recording is not available. Commit . Fixes bug #484038 .
  • SpectacleCore: use shared error behavior for screenshot and recording failures. Commit .
  • RecordingFailedMessage: fix close button. Commit .
  • SpectacleCore: move video platform setup code closer to image platform setup code. Commit .
  • SpectacleCore: use VideoPlatform::regionRequested to start rectangle selection. Commit .
  • Revert "Accept the selection before sharing via purpose". Commit .
  • ImagePlatformKWin: Use logical positions for images in combinedImage on X11. Commit . Fixes bug #486118 .
  • ScreenshotFailedMessage: Fix close button not working. Commit .
  • ImagePlatformKWin: Put KWin request error on new line for readability. Commit .
  • ImagePlatformKWin: Make it easier to differentiate errors for different DBus method calls. Commit .
  • ImagePlatformKWin: Add a timer with message for unusually long DBus calls while debugging. Commit .
  • SpectacleCore: Don't show capture windows for screens that we fail to get images for. Commit .
  • ImagePlatformKWin: add more and better error messages. Commit .
  • ImagePlatformKWin: set 4 second timeout for asynchronous DBus calls. Commit .
  • ImagePlatformKWin: move combinedImage and and static vars to the top. Commit .
  • PlatformNull: Always emit newScreenshotFailed. Commit .
  • SpectacleCore: Ensure a message is always visible somewhere when a screenshot fails. Commit .
  • ImagePlatformKWin: Move allocateImage and readImage closer to the top of the cpp file. Commit .
  • Add support for error messages in recording DBus API. Commit .
  • Add more support for screenshot error messages. Commit .
  • Accept the selection before sharing via purpose. Commit .
  • Enforce passing tests. Commit .
  • ImagePlatformKWin: Use QDBusUnixFileDescriptor to manage the pipe file descriptor to read from. Commit .
  • Traits: remove static from dynamicMin/dynamicMax effect strengths. Commit .
  • ImagePlatformXcb: Remove KWin specific code. Commit .
  • AnnotationOptionsToolBarContents: fix separators being invisible. Commit .
  • Add blur/pixelate strength settings and slider for adjusting them. Commit . Fixes bug #469184 .
  • AnnotationOptionToolBarContents: Comment why we use callLater with onValueChanged. Commit .
  • Remove usage of ShapePath::pathHints until we depend on Qt 6.7. Commit .
  • Add categorized debug output for AnnotationDocument::setCanvas. Commit .
  • ImagePlatformKWin: don't scale screen images when all have the same scale. Commit .
  • Fix blank image with 1 screen and scale less than 1x. Commit .
  • QtCV: add missing pragma once. Commit .
  • Combine logging categories into one logging category. Commit .
  • SpectacleCore: add explicit noexcept to destructor declaration. Commit .
  • HoverOutline and Outline formatting. Commit .
  • VideoCaptureOverlay: align handles with outline. Commit .
  • HoverOutline: enable asynchronous. Commit .
  • Fix outline flickering/scaling issue when path becomes empty. Commit .
  • Improve outline alignment with the outside of interactive paths. Commit .
  • VideoCaptureOverlay: Cleanup outline margin code. Commit .
  • Outline: remove zoom and effectiveStrokeWidth. Commit .
  • Use dashColor instead of strokeColor2, rename strokeColor1 to strokeColor. Commit .
  • Outline: remove startX and startY. Commit .
  • Outline: add strokeStyle, capStyle and joinStyle. Commit .
  • Outline: add rectanglePath(). Commit .
  • Outline: don't enable asynchronous by default. Commit .
  • TextTool: Keep cursor in outline bounds when the previous character is a new line. Commit .
  • TextTool: Ensure cursor is at least 1 physical pixel thick. Commit .
  • F pathhiuntsUpdate TextTool.qml. Commit .
  • Hide HoverOutline when SelectionTool handles are hovered. Commit .
  • Outline: Add pathHints. Commit .
  • Split DashedOutline from Outline. Commit .
  • Handle add edges property. Commit .
  • Handle: set pathHints for optimization. Commit .
  • Appdata: Add developer_name & launchable. Commit .
  • Fix sequence numbers in filenames. Commit . Fixes bug #483260 .
  • Handle: Fix Qt 6.7 bugs. Commit .
  • QImage::deviceIndependentSize is not constexpr. Commit .
  • Fix annotation hover, selection and text UIs being offset after crop. Commit .
  • Use connect with 4 arguments. Commit .
  • AnnotationViewport: Scale image section down based on window device pixel ratio. Commit .
  • Disable video mode when a new rectangle capture screenshot is started. Commit . Fixes bug #481471 .
  • Handle: prevent division by zero in ShapePath scale. Commit . Fixes bug #484892 .
  • Use stack blur instead of Gaussian blur. Commit .
  • Explicit noexcept for ~AnnotationViewport(). Commit .
  • Use Gaussian blur for blur and shadow effects. Commit .
  • Fix screenshots with scale factors that have their sizes rounded up. Commit .
  • AnnotationViewport: Make image getting logic reusable. Commit .
  • AnnotationViewport: Copy image section when creating texture instead of setting texture sourceRect. Commit .
  • ImagePlatformKWin: Go back to manually combining images. Commit . Fixes bug #478426 .
  • Add OpenCV as a dependency. Commit .
  • Add crop tool. Commit . Fixes bug #467590 .
  • Add backend logic for undoable cropping. Commit . Fixes bug #481435 .
  • Rename "Show Annotation Tools" button to "Edit". Commit .
  • SpectacleCore: make class inheritance check more robust. Commit . Fixes bug #484652 .
  • AnnotationDocument: Workaround not repainting everywhere it should with fractional scaling. Commit .
  • Geometry: Add rectNormalized. Commit .
  • AnnotationViewport: use isCreationTool and isNoTool. Commit .
  • AnnotationTool: add bool properties to check general tool types. Commit .
  • Improve SelectionTool handle visibility with non-rectangular outlines. Commit .
  • Rename SelectionBackground to Outline and use Outline as the only selection graphics in VideoCaptureOverlay. Commit .
  • Rename ResizeHandles to SelectionTool. Commit .
  • Make handle behavior more reusable. Commit .
  • AnnotationDocument: Fill image with transparent pixels in defaultImage(). Commit .
  • ImageCaptureOverlay: Fix error when checkedButton is not set. Commit .
  • History: pass std::function by reference. Commit .
  • ImagePlatformXcb: prevent detaching KX11Extras::stackingOrder. Commit .
  • SpectacleCore: prevent detaching CaptureWindow::instances. Commit .
  • VideoFormatModel: remove unused variable. Commit .
  • AnnotationDocument: fully qualify signal argument. Commit .
  • ExportManager: remove slots and document former slot functions. Commit .
  • Change showMagnifier setting to toggle between Never, Always and While holding the Shift key. Commit . See bug #482605 .
  • CaptureOptions: "Capture Settings" -> "Screenshot Settings". Commit .
  • Add recording options to the no screenshot dialog. Commit . Fixes bug #468778 .
  • AnnotationViewport: Don't use TextureCanUseAtlas. Commit . Fixes bug #481665 .
  • Allow dragging no screenshot dialog window from anywhere. Commit .
  • Finish recording instead of activating when activated from shortcut while recording. Commit . Fixes bug #481471 .
  • Align region recording selection UI more like the recording outline. Commit .
  • Ensure region recording outline stays out of recording. Commit .
  • Set layer-shell exclusive zone for capture region overlay. Commit . Fixes bug #481391 .
  • Use cutout handles for video rectangle selection. Commit .
  • Make backingStoreCache private. Commit .
  • Remove FillVariant alias. Commit .
  • Traits: Use G for ::Geometry from Geometry.h. Commit .
  • Fix selection tool. Commit .
  • Use KConfigDialogManager system instead of directly setting video format. Commit . Fixes bug #481390 .
  • Fix filename template label buddies. Commit .
  • ViewerWindow: Check if s_viewerWindowInstance points to this when destroying. Commit . Fixes bug #469502 .
  • Fix drawing with touchscreen. Commit .
  • Use setMipmapFiltering instead of layer for image view smoothing. Commit .
  • Fix always recording the screen at (0,0) with screen recording. Commit . Fixes bug #480599 .
  • Do not loop video player and pause on playback stopped. Commit .
  • Use a QRegion to determine which areas to repaint. Commit .
  • Improve AnnotationViewport and AnnotationDocument repaint speed. Commit .
  • Recording: Play the video after it has recorded. Commit .
  • Fix decimal formatting in DelaySpinBox. Commit .
  • Recording: Do not leak node ids. Commit .
  • Fix invalid timestamp when opening config dialog before screen capture. Commit .
  • Fix unclickable buttons on dialog window after startSystemMove() is called. Commit .
  • Remove extra scale in AnnotationDocument::paintBaseImage. Commit .
  • Split paint into paintBaseImage, paintAnnotations and paintAll. Commit .
  • Use Viewport as abstraction for viewport rectanlge and scale. Commit .
  • Traits: Remove type() from Fill and Text and make Text itself a variant. Commit .
  • Use std::span to express where annotation painting should start and stop. Commit .
  • Fix color emojis not having black semi-transparent shadows. Commit .
  • Make annotation shadows black. Commit .
  • HistoryItem: Remove unnecessary constructors and assignment operators. Commit .
  • Move image effects to fill. Commit .
  • Traits: fix clang-format off not working on macro. Commit .
  • Fix build with ZXing master. Commit .
  • Allow right/bottom resize handle to translate when width/height is 0. Commit .
  • Make scale to size and untranslate scale logic reusable. Commit .
  • Raise minimum Qt to 6.6.0. Commit .
  • ResizeHandles: Add handle margins. Commit .
  • ResizeHandles: remove effectiveEdges. Commit .
  • Cut out inside of annotation resize handles. Commit .
  • Fix selection handles disappearing when annotation toolbar is shown. Commit .
  • Cut out inner parts of selection handles. Commit .
  • Fix freehand lines not being immediately drawn as a dot. Commit .
  • Fix numberFillColor label. Commit .
  • Use default value getters to get actual default tool values. Commit .
  • Add support for new lines and tabstops in text annotations. Commit . Fixes bug #472302 . Fixes bug #448491 .
  • TextTool: use effectiveStrokeWidth for background inset. Commit .
  • Use new undo/redo history and item traits system with smart pointers. Commit .
  • Remove X11 atom. Commit . Fixes bug #478162 .
  • Don't assume barcode content is always human-readable text. Commit .
  • Don't copy barcode contents unconditionally. Commit .
  • Only look for one barcode if that's all we are going to use. Commit .
  • Avoid unnecessary image conversions for barcode scanning. Commit .
  • Workaround modal QFontDialogs being unusable. Commit . See bug #https://bugs.kde.org/show_bug.cgi?id=478155 .
  • Fix layer-shell-qt CI dep. Commit .
  • Enable SmoothPixmapTransform on images with fractional scales. Commit .
  • Scan QR codes asyncronously. Commit .
  • Only scan QR code when a screenshot is first taken. Commit .
  • AnnotationDocument.cpp: rearrange to match header. Commit .
  • Initial implementation of scanning captured screenshot for qrcodes. Commit .
  • Fix recording. Commit .
  • Extra date/time placeholder descriptions, 12 hour / . Commit . See bug #https://bugs.kde.org/show_bug.cgi?id=477215 .
  • Add filename placeholder. Commit . Fixes bug #478802 .
  • Change "Show less" to "Show fewer" since the thing in question is countable. Commit .
  • Properly localize the delay spin box. Commit .
  • Localize the stroke width selection spinbox. Commit .
  • Localize the font selection status bar button. Commit .
  • Localize the resolution tooltip. Commit .
  • Add 24.05.0 release description. Commit .
  • Use declarative type registration. Commit .
  • Add clang-format pre-commit hook. Commit .
  • CMake: add KF6QQC2DesktopStyle runtime dependency. Commit .
  • Fetcher: initialize m_favoritesPercentage. Commit .
  • "Favorites" page: show loading placeholder. Commit .
  • Flatpak: update Kirigami Addons to 1.1.0. Commit .
  • Make regular expressions "static const". Commit .
  • TV Spielfilm fetcher: enhance program description. Commit .
  • TV Spielfilm fetcher: fix special program handling across pages. Commit .
  • TV Spielfilm fetcher: handle incorrect stop time. Commit .
  • Do not update "Favorites" page after fetching if nothing changed. Commit .
  • Database: do nothing when trying to add empty list. Commit .
  • "Favorites" page: enable dragging with mouse. Commit . Implements feature #481783 .
  • Delete qtquickcontrols2.conf. Commit .
  • Fix '"onlyFavorites" is not a properly capitalized signal handler name'. Commit .
  • Do not re-create "Favorites" page. Commit .
  • Simplify borders on "Favorites" page. Commit .
  • Save sorted favorites only if sorting changed. Commit .
  • Update gitignore for clangd cache. Commit .
  • Update gitignore for VS Code. Commit .
  • Do not allow to remove favorites on the "Sort Favorites" page. Commit .
  • Port SwipeListItem to ItemDelegate. Commit .
  • Fix typo in NetworkDataProvider::get(). Commit .
  • Fix programs not updated when fetching many in parallel. Commit .
  • Flatpak manifest: use same string style as on GitHub. Commit .
  • AppStream: add vcs-browser. Commit .
  • Add translation context for "program height" setting. Commit .
  • Use type-safe string IDs in qml. Commit .
  • Rework program description update. Commit .
  • Remove QML import versions. Commit .
  • Remove padding in group list items. Commit .
  • Settings page: use === instead of ==. Commit .
  • Settings page: fix file dialog. Commit .
  • Clip channel table. Commit .
  • Fix sorting favorites. Commit .
  • Sort favorites: specify arguments explicitly. Commit .
  • Do not set default QNetworkRequest::RedirectPolicyAttribute manually. Commit .
  • Fix fetching channels. Commit .
  • Do not set padding for SwipeListItem in group list. Commit .
  • Fix channel list page. Commit .
  • Fix fetching programs. Commit .
  • Replace Kirigami.BasicListItem with Controls.ItemDelegate. Commit .
  • Fix Kirigami.Action icons. Commit .
  • Drop Qt5/KF5 support. Commit .
  • Fix code quality. Commit .
  • Fix QString handling. Commit .
  • AppStream: do not translate developer name. Commit .
  • AppStream: specify supported input devices. Commit .
  • Flatpak: use Kirigami Add-ons 1.0.1. Commit .
  • Flatpak: add cleanup. Commit .
  • Don't enforce the spellchecker even when it's disabled. Commit . Fixes bug #486465 .
  • Fix the content font not actually affecting the post text. Commit . Fixes bug #481911 .
  • Fix multiple fullscreen images appearing on top of each other. Commit .
  • Improve mentions in the composer, move content warning field. Commit .
  • Copy the spoiler text in replies. Commit . Fixes bug #486691 .
  • Fix pasting text content in the status composer. Commit .
  • Set USE_QTWEBVIEW automatically if Qt6WebView is found. Commit .
  • Make QtWebView optional, overhaul auth (again). Commit . Fixes bug #483938 .
  • Fix the search model tests failing because we now resolve. Commit .
  • Fix QApplication missing in tokodon-offline. Commit .
  • Only enable exceptions when using MpvQt. Commit .
  • Enable QtMultimedia support by default on Windows. Commit .
  • Re-enable Windows CI. Commit .
  • Quiet the MPV status output. Commit .
  • Add optional QtMultimedia Support. Commit .
  • Resolve remote posts in the search box. Commit . Fixes bug #485080 .
  • Fix the notifications not showing the post text anymore. Commit .
  • Improve login error help text. Commit .
  • In the case that login fails, fall back to showing the network error. Commit .
  • Set the title for the pop out status composer. Commit .
  • Set the title of the settings window, to that. Commit .
  • Set the title of the main window to the current page. Commit .
  • Port from dedicated Clipboard class to KQuickControlsAddons. Commit .
  • Bump minimum kirigami-addons version to 1.1.0. Commit .
  • Fix broken code in CMakeLists.txt. Commit .
  • Comply with the flathub quality guidelines. Commit .
  • Add branding color. Commit .
  • Remove old code for qt5. Commit .
  • Fix placeholder string in recent translation fix. Commit .
  • Fix untranslatable string, improve format. Commit .
  • Fix the status composer asking to discard the draft if a post is sent. Commit .
  • Make the popout status composer ask before discarding drafts too. Commit .
  • Fix the discard draft prompt not showing up on the popout composer. Commit .
  • Copy spoiler text data when popping out composer. Commit .
  • Copy the original post data when popping out. Commit .
  • Allow popping out the status composer on desktop. Commit . Fixes bug #470048 .
  • Disable grouping follow notifications for now. Commit .
  • Only save screenshot when test fails. Commit .
  • More TimelineTest fixes. Commit .
  • Attempt another fix for the TimelineTest. Commit .
  • Add back the rest of TimelineTest. Commit .
  • Disable check for QtKeychain on KDE CI. Commit .
  • Fix appium test issues caused by recent changes. Commit .
  • Add a proper accessible name to the timeline. Commit .
  • The initial setup shouldn't ask for notification permission on desktop. Commit .
  • Re-enable Appium tests on the CI. Commit .
  • Revert "Remove workaround for QTBUG 93281". Commit .
  • Remove minimum window size on mobile. Commit . Fixes bug #482844 .
  • Load pages asynchronously when possible, and fix parenting. Commit .
  • Fix anchors loop for the separator in the account switcher. Commit .
  • Port the remaining usages of Qt5Compat.GraphicalEffects for rounding. Commit .
  • Fix crash if ProfileEditorBackend::displayNameHtml() is called. Commit .
  • Port profile header effects to QtQuick.Effects from Qt5Compat. Commit .
  • Add debug actions for increasing/decreasing follow count in MockAccount. Commit .
  • Check for follow requests once action is actually taken. Commit .
  • Add an alert count indicator for sidebar items, use for follow requests. Commit .
  • Fix the tags timelines not opening anymore. Commit .
  • Push the post menu button down when the menu is open. Commit .
  • Remove useless AbstractButton in user interaction label. Commit .
  • Always align the overflow menu to the parent item. Commit .
  • Remove "Hide Media" button from the tab order. Commit .
  • Allow key navigation through media attachments. Commit .
  • Require Qt 6.6 & KDE Frameworks 6.0.0, ... Commit .
  • Use since_id instead of min_id in grabbing push notifications. Commit .
  • Post push notifications in reverse order. Commit .
  • Reimplement an early exit when there's no accounts with no notifications. Commit .
  • Add NotificationHandler::lastNotificationClosed signal. Commit .
  • Create only one NotificationHandler and put it in AccountManager. Commit .
  • Fix not being able to check if a post is empty. Commit .
  • Move InlineIdentityInfo to Components folder. Commit .
  • Mass rename StatusDelegate components to PostDelegate. Commit .
  • Rename StandaloneTags to StatusTags. Commit .
  • Add context menu actions for videos and gif attachments as well. Commit .
  • Miscellaneous attachment cleanups and reorganization. Commit .
  • Rename ListPage to ListTimelinePage. Commit .
  • Use upstream ToolButton for InteractionButton. Commit .
  • Add documentation for ImageMenu. Commit .
  • Rename OverflowMenu to StatusMenu. Commit .
  • Add separate StatusLayout component. Commit .
  • Sidebar: Improve keyboard navigation. Commit .
  • Fix keyboard navigatin in the Sidebar. Commit .
  • Point kirigami-addons to specific commit. Commit .
  • Overhaul docs, again. Commit .
  • Ensure all Tokodon #include includes the subfolder everywhere. Commit .
  • Update the inconsistent copyright headers. Commit .
  • Complete Post class overhaul. Commit .
  • Separate Attachment and Notification classes from post.h. Commit .
  • Refactor out and remove utils.h. Commit .
  • Move CustomEmoji::replaceCustomEmojis to TextHandler. Commit .
  • Improve documentation of TextHandler and it's methods. Commit .
  • Make TextHandler a regular class and not a QObject. Commit .
  • Move regular expressions used in text processing to static consts. Commit .
  • Shift around the text processing functions. Commit .
  • Rename TextPreprocessing to TextHandler, move different functions there. Commit .
  • Visually separate replies in a thread. Commit .
  • Add margins to the video player controls. Commit .
  • Improve the look of the timeline footer. Commit .
  • Don't allow opening a context menu for an image if it's hidden. Commit .
  • Fix spacing on post info that has an application. Commit .
  • Disable interactivity of the alt and other attachment chip. Commit .
  • Hide embed action for private posts. Commit .
  • Fix z order of the link indicator. Commit .
  • Hide interaction buttons on most notifications except for mentions. Commit .
  • Add message to threads that some replies may be hidden. Commit .
  • Prevent crash when grouped notifications are used on initialization. Commit .
  • Enable grouping notifications by default. Commit .
  • Disable boosting private (followers-only) posts. Commit .
  • Fix undefined name error. Commit .
  • Add 24.02 release note. Commit .
  • Remove image attachment captions. Commit .
  • Fix bottom margin on settings button in sidebar. Commit .
  • Refresh the thread if we reply to it. Commit . Fixes bug #480695 . See bug #467724 .
  • Hide actions on mobile that are already present in the bottom bar. Commit . See bug #479247 .
  • TapHandler fixes to hopefully solve page switching woes. Commit .
  • Add icons to the send button in the composer. Commit .
  • Move DropArea to the composer TextArea. Commit .
  • Make the composer use the same flex column maximum width as posts. Commit .
  • Use correct spacing value in status preview. Commit .
  • Fix vertical alignment of time text in composer. Commit .
  • Fix alignment of character limit label in composer. Commit .
  • Use Loaders in StatusPreview to get rid of some unnecessary spacing. Commit .
  • Fix typo, it should be textItem not labelItem. Commit .
  • Fix missing viewportWidth in StatusPreview. Commit .
  • Wordwrap SetupNotification text. Commit .
  • Move multi-account home timeline name to QML, improve display. Commit .
  • PostContent: assorted bidirectionality fixes. Commit . Fixes bug #475043 .
  • MastoPage: don't mirror the elephant. Commit .
  • Display a tip that the privacy level of a post may affect replies. Commit .
  • Handle yet more edge cases where the standalone tags fail. Commit .
  • Improve error message with icons, and better help text. Commit .
  • Add initial setup flow where required. Commit . Fixes bug #477927 . Fixes bug #473787 .
  • Add a bit of padding to the post search results. Commit .
  • Clear search result before doing a new search. Commit .
  • Fix search section delegate having a 0px width. Commit .
  • Clip search field content. Commit .
  • Prevent visible error when the account doesn't have push scope. Commit .
  • Add building snapshots on Windows. Commit . See bug #484507 .
  • [CI] Require tests to pass. Commit .
  • Remove unused kdelibs4support dependency. Commit .
  • [CI] Add Windows. Commit .
  • [CI] Fix after recent upstream change. Commit .
  • Update icon to latest Breeze icon. Commit .
  • Clean up Terminal constructor. Commit .
  • Skip KX11Extras on Wayland. Commit .
  • Fix focusing new sessions. Commit . Fixes bug #482119 .
  • Fix startup crash with some skins. Commit .
  • Org.kde.yakuake.appdata.xml add donation URL and launchable. Commit .
  • QtTestGui is not necessary. Commit .
  • Avoid to include QtTest (which loads a lot of includes). Commit .

local variable 'result' referenced before assignment python

  • Python Basics
  • Interview Questions
  • Python Quiz
  • Popular Packages
  • Python Projects
  • Practice Python
  • AI With Python
  • Learn Python3
  • Python Automation
  • Python Web Dev
  • DSA with Python
  • Python OOPs
  • Dictionaries
  • How to Fix - UnboundLocalError: Local variable Referenced Before Assignment in Python
  • How to use Pickle to save and load Variables in Python?
  • How to fix Unresolved reference issue in PyCharm
  • Unused variable in for loop in Python
  • How to Access Dictionary Values in Python Using For Loop
  • Python | Accessing variable value from code scope
  • How to fix "SyntaxError: invalid character" in Python
  • Assign Function to a Variable in Python
  • How to Reference Elements in an Array in Python
  • How to Store Values in Dictionary in Python Using For Loop
  • How to Fix: SyntaxError: positional argument follows keyword argument in Python
  • How To Fix Valueerror Exceptions In Python
  • How To Fix - Python RuntimeWarning: overflow encountered in scalar
  • Different Forms of Assignment Statements in Python
  • Unused local variable in Python
  • Access environment variable values in Python
  • How to import variables from another file in Python?
  • Python Program to Find and Print Address of Variable
  • How To Fix Recursionerror In Python
  • JavaScript ReferenceError - Can't access lexical declaration`variable' before initialization

How to Fix – UnboundLocalError: Local variable Referenced Before Assignment in Python

Developers often encounter the  UnboundLocalError Local Variable Referenced Before Assignment error in Python. In this article, we will see what is local variable referenced before assignment error in Python and how to fix it by using different approaches.

What is UnboundLocalError: Local variable Referenced Before Assignment?

This error occurs when a local variable is referenced before it has been assigned a value within a function or method. This error typically surfaces when utilizing try-except blocks to handle exceptions, creating a puzzle for developers trying to comprehend its origins and find a solution.

Below, are the reasons by which UnboundLocalError: Local variable Referenced Before Assignment error occurs in  Python :

Nested Function Variable Access

Global variable modification.

In this code, the outer_function defines a variable ‘x’ and a nested inner_function attempts to access it, but encounters an UnboundLocalError due to a local ‘x’ being defined later in the inner_function.

In this code, the function example_function tries to increment the global variable ‘x’, but encounters an UnboundLocalError since it’s treated as a local variable due to the assignment operation within the function.

Solution for Local variable Referenced Before Assignment in Python

Below, are the approaches to solve “Local variable Referenced Before Assignment”.

In this code, example_function successfully modifies the global variable ‘x’ by declaring it as global within the function, incrementing its value by 1, and then printing the updated value.

In this code, the outer_function defines a local variable ‘x’, and the inner_function accesses and modifies it as a nonlocal variable, allowing changes to the outer function’s scope from within the inner function.

Please Login to comment...

Similar reads.

  • Python Errors
  • Python How-to-fix
  • Python Programs

Improve your Coding Skills with Practice

 alt=

What kind of Experience do you want to share?

Select Your Language

  • Single-page

Language and Page Formatting Options

Chapter 4. new features.

This part describes new features and major enhancements introduced in Red Hat Enterprise Linux 8.10.

4.1. Installer and image creation

Ability to use partitioning mode on the blueprint filesystem customization

With this update, while using RHEL image builder, you can customize your blueprint with the chosen filesystem customization. You can choose one of the following partition modes while you create an image:

  • Default: auto-lvm
  • LVM: the image uses Logical Volume Manager (LVM) even without extra partitions
  • Raw: the image uses raw partitioning even with extra partitions

Jira:RHELDOCS-16337 [1]

Filesystem customization policy changes in image builder

The following policy changes are in place when using the RHEL image builder filesystem customization in blueprints:

Currently, mountpoint and minimum partition minsize can be set. The following image types do not support filesystem customizations: image-installer edge-installer edge-simplified-installer The following image types do not create partitioned operating systems images. Customizing their filesystem is meaningless: edge-commit edge-container tar container The blueprint now supports the mountpoint customization for tpm and its sub-directories.

Jira:RHELDOCS-17261 [1]

4.2. Security

SCAP Security Guide rebased to 0.1.72

The SCAP Security Guide (SSG) packages have been rebased to upstream version 0.1.72. This version provides bug fixes and various enhancements, most notably:

  • CIS profiles are updated to align with the latest benchmarks.
  • The PCI DSS profile is aligned with the PCI DSS policy version 4.0.
  • STIG profiles are aligned with the latest DISA STIG policies.

For additional information, see the SCAP Security Guide release notes .

Jira:RHEL-25250 [1]

OpenSSL now contains protections against Bleichenbacher-like attacks

This release of the OpenSSL TLS toolkit introduces API-level protections against Bleichenbacher-like attacks on the RSA PKCS #1 v1.5 decryption process. The RSA decryption now returns a randomly generated deterministic message instead of an error if it detects an error when checking padding during a PKCS #1 v1.5 decryption. The change provides general protection against vulnerabilities such as CVE-2020-25659 and CVE-2020-25657 .

You can disable this protection by calling the EVP_PKEY_CTX_ctrl_str(ctx, "rsa_pkcs1_implicit_rejection". "0") function on the RSA decryption context, but this makes your system more vulnerable.

Jira:RHEL-17689 [1]

librdkafka rebased to 1.6.1

The librdkafka implementation of the Apache Kafka protocol has been rebased to upstream version 1.6.1. This is the first major feature release for RHEL 8. The rebase provides many important enhancements and bug fixes. For all relevant changes, see the CHANGELOG.md document provided in the librdkafka package.

This update changes configuration defaults and deprecates some configuration properties. Read the Upgrade considerations section in CHANGELOG.md for more details. The API (C & C++) and ABI © in this version are compatible with older versions of librdkafka , but some changes to the configuration properties may require changes to existing applications.

Jira:RHEL-12892 [1]

libkcapi rebased to 1.4.0

The libkcapi library, which provides access to the Linux kernel cryptographic API, has been rebased to upstream version 1.4.0. The update includes various enhancements and bug fixes, most notably:

  • Added the sm3sum and sm3hmac tools.
  • Added the kcapi_md_sm3 and kcapi_md_hmac_sm3 APIs.
  • Added SM4 convenience functions.
  • Fixed support for link-time optimization (LTO).
  • Fixed LTO regression testing.
  • Fixed support for AEAD encryption of an arbitrary size with kcapi-enc .

Jira:RHEL-5366 [1]

stunnel rebased to 5.71

The stunnel TLS/SSL tunneling service has been rebased to upstream version 5.71. This update changes the behavior of OpenSSL 1.1 and later versions in FIPS mode. If OpenSSL is in FIPS mode and stunnel default FIPS configuration is set to no , stunnel adapts to OpenSSL and FIPS mode is enabled.

Additional new features include:

  • Added support for modern PostgreSQL clients.
  • You can use the protocolHeader service-level option to insert custom connect protocol negotiation headers.
  • You can use the protocolHost option to control the client SMTP protocol negotiation HELO/EHLO value.
  • Added client-side support for Client-side protocol = ldap .
  • You can now configure session resumption by using the service-level sessionResume option.
  • Added support to request client certificates in server mode with CApath (previously, only CAfile was supported).
  • Improved file reading and logging performance.
  • Added support for configurable delay for the retry option.
  • In client mode, OCSP stapling is requested and verified when verifyChain is set.
  • In server mode, OCSP stapling is always available.
  • Inconclusive OCSP verification breaks TLS negotiation. You can disable this by setting OCSPrequire = no .

Jira:RHEL-2340 [1]

OpenSSH limits artificial delays in authentication

OpenSSH’s response after login failure is artificially delayed to prevent user enumeration attacks. This update introduces an upper limit so that such artificial delays do not become excessively long when remote authentication takes too long, for example in privilege access management (PAM) processing.

Jira:RHEL-1684

libkcapi now provides an option for specifying target file names in hash-sum calculations

This update of the libkcapi (Linux kernel cryptographic API) packages introduces the new option -T for specifying target file names in hash-sum calculations. The value of this option overrides file names specified in processed HMAC files. You can use this option only with the -c option, for example:

Jira:RHEL-15300 [1]

audit rebased to 3.1.2

The Linux Audit system has been updated to version 3.1.2, which provides bug fixes, enhancements, and performance improvements over the previously released version 3.0.7. Notable enhancements include:

  • The auparse library now interprets unnamed and anonymous sockets.
  • You can use the new keyword this-hour in the start and end options of the ausearch and aureport tools.
  • User-friendly keywords for signals have been added to the auditctl program.
  • Handling of corrupt logs in auparse has been improved.
  • The ProtectControlGroups option is now disabled by default in the auditd service.
  • Rule checking for the exclude filter has been fixed.
  • The interpretation of OPENAT2 fields has been enhanced.
  • The audispd af_unix plugin has been moved to a standalone program.
  • The Python binding has been changed to prevent setting Audit rules from the Python API. This change was made due to a bug in the Simplified Wrapper and Interface Generator (SWIG).

Jira:RHEL-15001 [1]

4.3. Shells and command-line tools

openCryptoki rebased to version 3.22.0

The opencryptoki package has been updated to version 3.22.0. Notable changes include:

  • Added support for the AES-XTS key type by using the CPACF protected keys.
  • Added support for managing certificate objects.
  • Added support for public sessions with the no-login option.
  • Added support for logging in as the Security Officer (SO).
  • Added support for importing and exporting the Edwards and Montgomery keys.
  • Added support for importing the RSA-PSS keys and certificates.
  • For security reasons, the 2 key parts of an AES-XTS key should not be the same. This update adds checks to the key generation and import process to ensure this.
  • Various bug fixes have been implemented.

Jira:RHEL-11413 [1]

4.4. Infrastructure services

chrony rebased to version 4.5

The chrony suite has been updated to version 4.5. Notable changes include:

  • Added periodic refresh of IP addresses of Network Time Protocol (NTP) sources specified by hostname. The default interval is two weeks and it can be disabled by adding refresh 0 to the chrony.conf file.
  • Improved automatic replacement of unreachable NTP sources.
  • Improved logging of important changes made by the chronyc utility.
  • Improved logging of source selection failures and falsetickers.
  • Added the hwtstimeout directive to configure timeout for late hardware transmit timestamps.
  • Added experimental support for corrections provided by Precision Time Protocol (PTP) transparent clocks to reach accuracy of PTP with hardware timestamping.
  • Fixed the presend option in interleaved mode.
  • Fixed reloading of modified sources specified by IP address from the sourcedir directories.

Jira:RHEL-21069

linuxptp rebased to version 4.2

The linuxptp protocol has been updated to version 4.2. Notable changes include:

  • Added support for multiple domains in the phc2sys utility.
  • Added support for notifications on clock updates and changes in the Precision Time Protocol (PTP) parent dataset, for example, clock class.
  • Added support for PTP Power Profile, namely IEEE C37.238-2011 and IEEE C37.238-2017.

Jira:RHEL-21326 [1]

4.5. Networking

The ss utility adds visibility improvement to TCP bound-inactive sockets

The iproute2 suite provides a collection of utilities to control TCP/IP networking traffic. TCP bound-inactive sockets are attached to an IP address and a port number but neither connected nor listening on TCP ports. The socket services ( ss ) utility adds support for the kernel to dump TCP bound-inactive sockets. You can view those sockets with the following command options:

  • ss --all : to dump all sockets including TCP bound-inactive ones
  • ss --bound-inactive : to dump only bound-inactive sockets

Jira:RHEL-6113 [1]

nispor rebased to version 1.2.10

The nispor packages have been upgraded to upstream version 1.2.10, which provides a number of enhancements and bug fixes over the previous version:

  • Added support for NetStateFilter to use the kernel filter on network routes and interfaces.
  • Single Root Input and Output Virtualization (SR-IOV) interfaces can query SR-IOV Virtual Function (SR-IOV VF) information per (VF).
  • Newly supported bonding options: lacp_active , arp_missed_max , and ns_ip6_target .

Bugzilla:2153166

4.6. Kernel

Kernel version in RHEL 8.10

Red Hat Enterprise Linux 8.10 is distributed with the kernel version 4.18.0-553.

rtla rebased to version 6.6 of the upstream kernel source code

The rtla utility has been upgraded to the latest upstream version, which provides multiple bug fixes and enhancements. Notable changes include:

  • Added the -C option to specify additional control groups for rtla threads to run in, apart from the main rtla thread.
  • Added the --house-keeping option to place rtla threads on a housekeeping CPU and to put measurement threads on different CPUs.
  • Added support to the timerlat tracer so that you can run timerlat hist and timerlat top threads in user space.

Jira:RHEL-10081 [1]

rteval was upgraded to the upstream version 3.7

With this update, the rteval utility has been upgraded to the upstream version 3.7. The most significant feature in this update concerns the isolcpus kernel parameter. This includes the ability to detect and use the isolcpus mechanism for measurement modules in rteval . As a result, it is easier for isolcpus users to use rteval to get accurate latency numbers and to achieve best latency results measured on a realtime kernel.

Jira:RHEL-8967 [1]

SGX is now fully supported

Software Guard Extensions (SGX) is an Intel® technology for protecting software code and data from disclosure and modification.

The RHEL kernel provides the SGX version 1 and 2 functionality. Version 1 enables platforms using the Flexible Launch Control mechanism to use the SGX technology. Version 2 adds Enclave Dynamic Memory Management (EDMM). Notable features include:

  • Modifying EPCM permissions of regular enclave pages that belong to an initialized enclave.
  • Dynamic addition of regular enclave pages to an initialized enclave.
  • Expanding an initialized enclave to accommodate more threads.
  • Removing regular and TCS pages from an initialized enclave.

In this release, SGX moves from Technology Preview to a fully supported feature.

Bugzilla:2041881 [1]

The Intel data streaming accelerator driver is now fully supported

The Intel data streaming accelerator driver (IDXD) is a kernel driver that provides an Intel CPU integrated accelerator. It includes a shared work queue with process address space ID ( pasid ) submission and shared virtual memory (SVM).

In this release, IDXD moves from a Technology Preview to a fully supported feature.

Jira:RHEL-10097 [1]

rteval now supports adding and removing arbitrary CPUs from the default measurement CPU list

With the rteval utility, you can add (using the + sign) or subtract (using the - sign) CPUs to the default measurement CPU list when using the --measurement-cpulist parameter, instead of having to specify an entire new list. Additionally, --measurement-run-on-isolcpus is introduced for adding the set of all isolated CPUs to the default measurement CPU list. This options covers the most common usecase of a real-time application running on isolated CPUs. Other usecases require a more generic feature. For example, some real-time applications used one isolated CPU for housekeeping, requiring it to be excluded from the default measurement CPU list. As a result, you can now not only add, but also remove arbitrary CPUs from the default measurement CPU list in a flexible way. Removing takes precedence over adding. This rule applies to both, CPUs specified with +/- signs and to those defined with --measurement-run-on-isolcpus .

Jira:RHEL-21926 [1]

4.7. Boot loader

DEP/NX support in the pre-boot stage

The memory protection feature known as Data Execution Prevention (DEP), No Execute (NX), or Execute Disable (XD), blocks the execution of code that is marked as non-executable. DEP/NX has been available in RHEL at the operating system level.

This release adds DEP/NX support in the GRUB and shim boot loaders. This can prevent certain vulnerabilities during the pre-boot stage, such as a malicious EFI driver that might execute certain attacks without the DEP/NX protection.

Jira:RHEL-15856 [1]

Support for TD RTMR measurement in GRUB and shim

Intel® Trust Domain Extension (Intel® TDX) is a confidential computing technology that deploys hardware-isolated virtual machines (VMs) called Trust Domains (TDs).

TDX extends the Virtual Machine Extensions (VMX) instructions and the Multi-key Total Memory Encryption (MKTME) feature with the TD VM guest. In a TD guest VM, all components in the boot chain, such as grub2 and shim , must log the event and measurement hash to runtime measurement registers (RTMR).

TD guest runtime measurement in RTMR is the base for attestation applications. Applications on the TD guest rely on TD measurement to provide trust evidence to get confidential information, such as the key from the relaying part through the attestation service.

With this release, the GRUB and shim boot loaders now support the TD measurement protocol.

For more information about Intel® TDX, see Documentation for Intel® Trust Domain Extensions .

Jira:RHEL-15583 [1]

4.8. File systems and storage

The Storage RHEL System Roles now support shared LVM device management

The RHEL System Roles now support the creation and management of shared logical volumes and volume groups.

Jira:RHEL-14022

multipathd now supports detecting FPIN-Li events for NVMe devices

Previously, the multipathd command would only monitor Integrity Fabric Performance Impact Notification (PFIN-Li) events on SCSI devices. multipathd could listen for Link Integrity events sent by a Fibre Channel fabric and use it to mark paths as marginal. This feature was only supported for multipath devices on top of SCSI devices, and multipathd was unable to mark Non-volatile Memory Express (NVMe) device paths as marginal by limiting the use of this feature.

With this update, multipathd supports detecting FPIN-Li events for both SCSI and NVMe devices. As a result, multipath now does not use paths without a good fabric connection, while other paths are available. This helps to avoid IO delays in such situations.

Jira:RHEL-6677

4.9. Dynamic programming languages, web and database servers

Python 3.12 available in RHEL 8

RHEL 8.10 introduces Python 3.12, provided by the new package python3.12 and a suite of packages built for it, as well as the ubi8/python-312 container image.

Notable enhancements compared to the previously released Python 3.11 include:

  • Python introduces a new type statement and new type parameter syntax for generic classes and functions.
  • Formatted string literal (f-strings) have been formalized in the grammar and can now be integrated into the parser directly.
  • Python now provides a unique per-interpreter global interpreter lock (GIL).
  • You can now use the buffer protocol from Python code.
  • To improve security, the builtin hashlib implementations of the SHA1, SHA3, SHA2-384, SHA2-512, and MD5 cryptographic algorithms have been replaced with formally verified code from the HACL* project. The builtin implementations remain available as fallback if OpenSSL does not provide them.
  • Dictionary, list, and set comprehensions in CPython are now inlined. This significantly increases the speed of a comprehension execution.
  • CPython now supports the Linux perf profiler.
  • CPython now provides stack overflow protection on supported platforms.

To install packages from the python3.12 stack, use, for example:

To run the interpreter, use, for example:

See Installing and using Python for more information.

For information about the length of support of Python 3.12, see Red Hat Enterprise Linux Application Streams Life Cycle .

Jira:RHEL-14942

A new environment variable in Python to control parsing of email addresses

To mitigate CVE-2023-27043 , a backward incompatible change to ensure stricter parsing of email addresses was introduced in Python 3.

This update introduces a new PYTHON_EMAIL_DISABLE_STRICT_ADDR_PARSING environment variable. When you set this variable to true , the previous, less strict parsing behavior is the default for the entire system:

However, individual calls to the affected functions can still enable stricter behavior.

You can achieve the same result by creating the /etc/python/email.cfg configuration file with the following content:

For more information, see the Knowledgebase article Mitigation of CVE-2023-27043 introducing stricter parsing of email addresses in Python .

Jira:RHELDOCS-17369 [1]

A new module stream: ruby:3.3

RHEL 8.10 introduces Ruby 3.3.0 in a new ruby:3.3 module stream. This version provides a number of performance improvements, bug and security fixes, and new features over Ruby 3.1 distributed with RHEL 8.7.

Notable enhancements include:

  • You can use the new Prism parser instead of Ripper . Prism is a portable, error tolerant, and maintainable recursive descent parser for the Ruby language.
  • YJIT, the Ruby just-in-time (JIT) compiler implementation, is no longer experimental and it provides major performance improvements.
  • The Regexp matching algorithm has been improved to reduce the impact of potential Regular Expression Denial of Service (ReDoS) vulnerabilities.
  • The new experimental RJIT (a pure-Ruby JIT) compiler replaces MJIT. Use YJIT in production.
  • A new M:N thread scheduler is now available.

Other notable changes:

  • You must now use the Lrama LALR parser generator instead of Bison .
  • Several deprecated methods and constants have been removed.
  • The Racc gem has been promoted from a default gem to a bundled gem.

To install the ruby:3.3 module stream, use:

If you want to upgrade from an earlier ruby module stream, see Switching to a later stream .

For information about the length of support of Ruby 3.3, see Red Hat Enterprise Linux Application Streams Life Cycle .

Jira:RHEL-17090 [1]

A new module stream: php:8.2

RHEL 8.10 adds PHP 8.2, which provides a number of bug fixes and enhancements over version 8.0.

With PHP 8.2 , you can:

  • Define a custom type that is limited to one of a discrete number of possible values using the Enumerations (Enums) feature.
  • Declare a property with the readonly modifier to prevent modification of the property after initialization.
  • Use fibers, full-stack, and interruptible functions.
  • Use readonly classes.
  • Declare several new standalone types.
  • Use a new Random extension.
  • Define constraints in traits.

To install the php:8.2 module stream, use the following command:

If you want to upgrade from an earlier php stream, see Switching to a later stream .

For details regarding PHP usage on RHEL 8, see Using the PHP scripting language .

For information about the length of support for the php module streams, see the Red Hat Enterprise Linux Application Streams Life Cycle .

Jira:RHEL-14705 [1]

The name() method of the perl-DateTime-TimeZone module now returns the time zone name

The perl-DateTime-TimeZone module has been updated to version 2.62, which changed the value that is returned by the name() method from the time zone alias to the main time zone name.

For more information and an example, see the Knowledgebase article Change in the perl-DateTime-TimeZone API related to time zone name and alias .

Jira:RHEL-35685

A new module stream: nginx:1.24

The nginx 1.24 web and proxy server is now available as the nginx:1.24 module stream. This update provides a number of bug fixes, security fixes, new features, and enhancements over the previously released version 1.22.

New features and changes related to Transport Layer Security (TLS):

  • Encryption keys are now automatically rotated for TLS session tickets when using shared memory in the ssl_session_cache directive.
  • Memory usage has been optimized in configurations with Secure Sockets Layer (SSL) proxy.
  • You can now disable looking up IPv4 addresses while resolving by using the ipv4=off parameter of the resolver directive.
  • nginx now supports the $proxy_protocol_tlv_* variables, which store the values ​​of the Type-Length-Value (TLV) fields that appear in the PROXY v2 TLV protocol.
  • The ngx_http_gzip_static_module module now supports byte ranges.

Other changes:

  • Header lines are now represented as linked lists in the internal API.
  • nginx now concatenates identically named header strings passed to the FastCGI, SCGI, and uwsgi back ends in the $r->header_in() method of the ngx_http_perl_module , and during lookups of the $http_... , $sent_http_... , $sent_trailer_... , $upstream_http_... , and $upstream_trailer_... variables.
  • nginx now displays a warning if protocol parameters of a listening socket are redefined.
  • nginx now closes connections with lingering if pipelining was used by the client.
  • The logging level of various SSL errors has been lowered, for example, from Critical to Informational .

To install the nginx:1.24 stream, use:

To upgrade from an earlier nginx stream, switch to a later stream .

For more information, see Setting up and configuring NGINX .

For information about the length of support for the nginx module streams, see the Red Hat Enterprise Linux Application Streams Life Cycle article.

Jira:RHEL-14714 [1]

A new module stream: mariadb:10.11

MariaDB 10.11 is now available as a new module stream, mariadb:10.11 . Notable enhancements over the previously available version 10.5 include:

  • A new sys_schema feature.
  • Atomic Data Definition Language (DDL) statements.
  • A new GRANT ... TO PUBLIC privilege.
  • Separate SUPER and READ ONLY ADMIN privileges.
  • A new UUID database data type.
  • Support for the Secure Socket Layer (SSL) protocol version 3; the MariaDB server now requires correctly configured SSL to start.
  • Support for the natural sort order through the natural_sort_key() function.
  • A new SFORMAT function for arbitrary text formatting.
  • Changes to the UTF-8 charset and the UCA-14 collation.
  • systemd socket activation files available in the /usr/share/ directory. Note that they are not a part of the default configuration in RHEL as opposed to upstream.
  • Error messages containing the MariaDB string instead of MySQL .
  • Error messages available in the Chinese language.
  • Changes to the default logrotate file.
  • For MariaDB and MySQL clients, the connection property specified on the command line (for example, --port=3306 ), now forces the protocol type of communication between the client and the server, such as tcp , socket , pipe , or memory .

For more information about changes in MariaDB 10.11, see Notable differences between MariaDB 10.5 and MariaDB 10.11 .

For more information about MariaDB, see Using MariaDB .

To install the mariadb:10.11 stream, use:

If you want to upgrade from the mariadb:10.5 module stream, see Upgrading from MariaDB 10.5 to MariaDB 10.11 .

For information about the length of support for the mariadb module streams, see Red Hat Enterprise Linux Application Streams Life Cycle .

Jira:RHEL-3637

A new module stream: postgresql:16

RHEL 8.10 introduces PostgreSQL 16, which provides a number of new features and enhancements over version 15.

  • Enhanced bulk loading improves performance.
  • The libpq library now supports connection-level load balancing. You can use the new load_balance_hosts option for more efficient load balancing.
  • You can now create custom configuration files and include them in the pg_hba.conf and pg_ident.conf files.
  • PostgreSQL now supports regular expression matching on database and role entries in the pg_hba.conf file.

Other changes include:

  • PostgreSQL is no longer distributed with the postmaster binary. Users who start the postgresql server by using the provided systemd unit file (the systemctl start postgres command) are not affected by this change. If you previously started the postgresql server directly through the postmaster binary, you must now use the postgres binary instead.
  • PostgreSQL no longer provides documentation in PDF format within the package. Use the online documentation instead.

See also Using PostgreSQL .

To install the postgresql:16 stream, use the following command:

If you want to upgrade from an earlier postgresql stream within RHEL 8, follow the procedure described in Switching to a later stream and then migrate your PostgreSQL data as described in Migrating to a RHEL 8 version of PostgreSQL .

For information about the length of support for the postgresql module streams, see the Red Hat Enterprise Linux Application Streams Life Cycle .

Jira:RHEL-3636

Git rebased to version 2.43.0

The Git version control system has been updated to version 2.43.0, which provides bug fixes, enhancements, and performance improvements over the previously released version 2.39.

  • You can now use the new --source option with the git check-attr command to read the .gitattributes file from the provided tree-ish object instead of the current working directory.
  • Git can now pass information from the WWW-Authenticate response-type header to credential helpers.
  • In case of an empty commit, the git format-patch command now writes an output file containing a header of the commit instead of creating an empty file.
  • You can now use the git blame --contents= <file> <revision> -- <path> command to find the origins of lines starting at <file> contents through the history that leads to <revision> .
  • The git log --format command now accepts the %(decorate) placeholder for further customization to extend the capabilities provided by the --decorate option.

Jira:RHEL-17103 [1]

Git LFS rebased to version 3.4.1

The Git Large File Storage (LFS) extension has been updated to version 3.4.1, which provides bug fixes, enhancements, and performance improvements over the previously released version 3.2.0.

Notable changes include:

  • The git lfs push command can now read references and object IDs from standard input.
  • Git LFS now handles alternative remotes without relying on Git.
  • Git LFS now supports the WWW-Authenticate response-type header as a credential helper.

Jira:RHEL-17102 [1]

4.10. Compilers and development tools

elfutils rebased to version 0.190

The elfutils package has been updated to version 0.190. Notable improvements include:

  • The libelf library now supports relative relocation (RELR).
  • The libdw library now recognizes .debug_[ct]u_index sections.
  • The eu-readelf utility now supports a new -Ds , --use-dynamic --symbol option to show symbols through the dynamic segment without using ELF sections.
  • The eu-readelf utility can now show .gdb_index version 9.
  • A new eu-scrlines utility compiles a list of source files associated with a specified DWARF or ELF file.
  • A debuginfod server schema has changed for a 60% compression in file name representation (this requires reindexing).

Jira:RHEL-15924

valgrind updated to 3.22

The valgrind package has been updated to version 3.22. Notable improvements include:

  • valgrind memcheck now checks that the values given to the C functions memalign , posix_memalign , and aligned_alloc , and the C++17 aligned new operator are valid alignment values.
  • valgrind memcheck now supports mismatch detection for C++14 sized and C++17 aligned new and delete operators.
  • Added support for lazy reading of DWARF debugging information, resulting in faster startup when debuginfo packages are installed.

Jira:RHEL-15926

Clang resource directory moved

The Clang resource directory, where Clang stores its internal headers and libraries, has been moved from /usr/lib64/clang/17 to /usr/lib/clang/17 .

Jira:RHEL-9299

A new grafana-selinux package

Previously, the default installation of grafana-server ran as an unconfined_service_t SELinux type. This update adds the new grafana-selinux package, which contains an SELinux policy for grafana-server and which is installed by default with grafana-server . As a result, grafana-server now runs as grafana_t SELinux type.

Jira:RHEL-7503

Updated GCC Toolset 13

GCC Toolset 13 is a compiler toolset that provides recent versions of development tools. It is available as an Application Stream in the form of a Software Collection in the AppStream repository.

Notable changes introduced in RHEL 8.10 include:

  • The GCC compiler has been updated to version 13.2.1, which provides many bug fixes and enhancements that are available in upstream GCC.
  • binutils now support AMD CPUs based on the znver5 core through the -march=znver5 compiler switch.
  • annobin has been updated to version 12.32.
  • The annobin plugin for GCC now defaults to using a more compressed format for the notes that it stores in object files, resulting in smaller object files and faster link times, especially in large, complex programs.

The following tools and versions are provided by GCC Toolset 13: GCC:: 13.2.1 GDB:: 12.1 binutils:: 2.40 dwz:: 0.14 annobin:: 12.32

To install GCC Toolset 13, run the following command as root:

To run a tool from GCC Toolset 13:

To run a shell session where tool versions from GCC Toolset 13 override system versions of these tools:

For more information, see GCC Toolset 13 .

Jira:RHEL-25405 [1]

LLVM Toolset rebased to version 17.0.6

LLVM Toolset has been updated to version 17.0.6.

  • The opaque pointers migration is now completed.
  • Removed support for the legacy pass manager in middle-end optimization.

Clang changes:

  • C++20 coroutines are no longer considered experimental.
  • Improved code generation for the std::move function and similar in unoptimized builds.

For more information, see the LLVM and Clang upstream release notes.

Jira:RHEL-9028

Rust Toolset rebased to version 1.75.0

Rust Toolset has been updated to version 1.75.0.

  • Constant evaluation time is now unlimited
  • Cleaner panic messages
  • Cargo registry authentication
  • async fn and opaque return types in traits

Jira:RHEL-12964

Go Toolset rebased to version 1.21.0

Go Toolset has been updated to version 1.21.0.

  • min , max , and clear built-ins have been added.
  • Official support for profile guided optimization has been added.
  • Package initialization order is now more precisely defined.
  • Type inferencing is improved.
  • Backwards compatibility support is improved.

For more information, see the Go upstream release notes.

Jira:RHEL-11872 [1]

papi supports new processor microarchitectures

With this enhancement, you can access performance monitoring hardware using papi events presets on the following processor microarchitectures:

  • 4th Generation Intel® Xeon® Scalable Processors

Jira:RHEL-9336 [1] , Jira:RHEL-9337, Jira:RHEL-9320

Ant rebased to version 1.10.9

The ant:1.10 module stream has been updated to version 1.10.9. This version provides support for code signing, using a provider class and provider argument.

The updated ant:1.10 module stream provides only the ant and ant-lib packages. Remaining packages related to Ant are distributed in the javapackages-tools module in the unsupported CodeReady Linux Builder (CRB) repository and have not been updated.

Packages from the updated ant:1.10 module stream cannot be used in parallel with packages from the javapackages-tools module. If you want to use the complete set of Ant-related packages, you must uninstall the ant:1.10 module and disable it, enable the CRB repository , and install the javapackages-tools module.

Jira:RHEL-5365

New package: maven-openjdk21

The maven:3.8 module stream now includes the maven-openjdk21 subpackage, which provides the Maven JDK binding for OpenJDK 21 and configures Maven to use the system OpenJDK 21.

Jira:RHEL-17126 [1]

cmake rebased to version 3.26

The cmake package has been updated to version 3.26. Notable improvements include:

  • Added support for the C17 and C18 language standards.
  • cmake can now query the /etc/os-release file for operating system identification information.
  • Added support for the CUDA 20 and nvtx3 libraries.
  • Added support for the Python stable application binary interface.
  • Added support for Perl 5 in the Simplified Wrapper and Interface Generator (SWIG) tool.

Jira:RHEL-7396

4.11. Identity Management

Identity Management users can now use external identity providers to authenticate to IdM

With this enhancement, you can now associate Identity Management (IdM) users with external identity providers (IdPs) that support the OAuth 2 device authorization flow. Examples of such IdPs include Red Hat build of Keycloak, Azure Entra ID, Github, Google, and Facebook.

If an IdP reference and an associated IdP user ID exist in IdM, you can use them to enable an IdM user to authenticate at the external IdP. After performing authentication and authorization at the external IdP, the IdM user receives a Kerberos ticket with single sign-on capabilities. The user must authenticate with the SSSD version available in RHEL 8.7 or later.

Jira:RHELPLAN-123140 [1]

ipa rebased to version 4.9.13

The ipa package has been updated from version 4.9.12 to 4.9.13. Notable changes include:

  • The installation of an IdM replica now occurs against a chosen server, not only for Kerberos authentication but also for all IPA API and CA requests.
  • The performance of the cert-find command has been improved dramatically for situations with a large number of certificates.
  • The ansible-freeipa package has been rebased from version 1.11 to 1.12.1.

For more information, see the upstream release notes .

Jira:RHEL-16936

Deleting expired KCM Kerberos tickets

Previously, if you attempted to add a new credential to the Kerberos Credential Manager (KCM) and you had already reached the storage space limit, the new credential was rejected. The user storage space is limited by the max_uid_ccaches configuration option that has a default value of 64. With this update, if you have already reached the storage space limit, your oldest expired credential is removed and the new credential is added to the KCM. If there are no expired credentials, the operation fails and an error is returned. To prevent this issue, you can free some space by removing credentials using the kdestroy command.

Jira:SSSD-6216

Support for bcrypt password hashing algorithm for local users

With this update, you can enable the bcrypt password hashing algorithm for local users. To switch to the bcrypt hashing algorithm:

  • Edit the /etc/authselect/system-auth and /etc/authselect/password-auth files by changing the pam_unix.so sha512 setting to pam_unix.so blowfish .

Apply the changes:

  • Change the password for a user by using the passwd command.
  • In the /etc/shadow file, verify that the hashing algorithm is set to $2b$ , indicating that the bcrypt password hashing algorithm is now used.

Jira:SSSD-6790

The idp Ansible module allows associating IdM users with external IdPs

With this update, you can use the idp ansible-freeipa module to associate Identity Management (IdM) users with external identity providers (IdP) that support the OAuth 2 device authorization flow. If an IdP reference and an associated IdP user ID exist in IdM, you can use them to enable IdP authentication for an IdM user. 

After performing authentication and authorization at the external IdP, the IdM user receives a Kerberos ticket with single sign-on capabilities. The user must authenticate with the SSSD version available in RHEL 8.7 or later.

Jira:RHEL-16938

IdM now supports the idoverrideuser , idoverridegroup and idview Ansible modules

With this update, the ansible-freeipa package now contains the following modules:

In the future, you will be able to use these modules to enable AD users to use smart cards to log in to IdM.

Jira:RHEL-16933

The delegation of DNS zone management enabled in ansible-freeipa

You can now use the dnszone ansible-freeipa module to delegate DNS zone management. Use the permission or managedby variable of the dnszone module to set a per-zone access delegation permission.

Jira:RHEL-19133

The ansible-freeipa ipauser and ipagroup modules now support a new renamed state

With this update, you can use the renamed state in ansible-freeipa ipauser module to change the user name of an existing IdM user. You can also use this state in ansible-freeipa ipagroup module to change the group name of an existing IdM group.

Jira:RHEL-4963

The runasuser_group parameter is now available in ansible-freeipa ipasudorule

With this update, you can set Groups of RunAs Users for a sudo rule by using the ansible-freeipa ipasudorule module. The option is already available in the Identity Management (IdM) command-line interface and the IdM Web UI.

Jira:RHEL-19129

389-ds-base rebased to version 1.4.3.39

The 389-ds-base package has been updated to version 1.4.3.39.

Jira:RHEL-19028

The HAProxy protocol is now supported for the 389-ds-base package

Previously, Directory Server did not differentiate incoming connections between proxy and non-proxy clients. With this update, you can use the new nsslapd-haproxy-trusted-ip multi-valued configuration attribute to configure the list of trusted proxy servers. When nsslapd-haproxy-trusted-ip is configured under the cn=config entry, Directory Server uses the HAProxy protocol to receive client IP addresses via an additional TCP header so that access control instructions (ACIs) can be correctly evaluated and client traffic can be logged.

If an untrusted proxy server initiates a bind request, Directory Server rejects the request and records the following message to the error log file:

Jira:RHEL-19240

samba rebased to version 4.19.4

The samba packages have been upgraded to upstream version 4.19.4, which provides bug fixes and enhancements over the previous version. The most notable changes are:

  • Command-line options in the smbget utility have been renamed and removed for a consistent user experience. However, this can break existing scripts or jobs that use the utility. See the smbget --help command and smbget(1) man page for further details about the new options.

If the winbind debug traceid option is enabled, the winbind service now logs, additionally, the following fields:

  • traceid : Tracks the records belonging to the same request.
  • depth : Tracks the request nesting level.
  • Samba no longer uses its own cryptography implementations and, instead, now fully uses cryptographic functionality provided by the GnuTLS library.
  • The directory name cache size option was removed.

Note that the server message block version 1 (SMB1) protocol has been deprecated since Samba 4.11 and will be removed in a future release.

Back up the database files before starting Samba. When the smbd , nmbd , or winbind services start, Samba automatically updates its tdb database files. Red Hat does not support downgrading tdb database files.

After updating Samba, use the testparm utility to verify the /etc/samba/smb.conf file.

Jira:RHEL-16483 [1]

4.12. The web console

RHEL web console can now generate Ansible and shell scripts

In the web console, you can now easily access and copy automation scripts on the kdump configuration page. You can then use the generated script to implement a specific kdump configuration on multiple systems.

Jira:RHELDOCS-17060 [1]

Simplified managing storage and resizing partitions on Storage

The Storage section of the web console is now redesigned. The new design improved visibility across all views. The overview page now presents all storage objects in a comprehensive table, which makes it easier to perform operations directly. You can click any row to view detailed information and any supplementary actions. Additionally, you can now resize partitions from the Storage section.

Jira:RHELDOCS-17056 [1]

4.13. Red Hat Enterprise Linux System Roles

The ad_integration RHEL system role now supports configuring dynamic DNS update options

With this update, the ad_integration RHEL system role supports configuring options for dynamic DNS updates using SSSD when integrated with Active Directory (AD). By default, SSSD will attempt to automatically refresh the DNS record:

  • When the identity provider comes online (always).
  • At a specified interval (optional configuration); by default, the AD provider updates the DNS record every 24 hours.

You can change these and other settings using the new variables in ad_integration . For example, you can set ad_dyndns_refresh_interval to 172800 to change the DNS record refresh interval to 48 hours. For more details regarding the role variables, see the resources in the /usr/share/doc/rhel-system-roles/ad_integration/ directory.

Jira:RHELDOCS-17372 [1]

The metrics RHEL System Role now supports configuring PMIE webhooks

With this update, you can automatically configure the global webhook_endpoint PMIE variable using the metrics_webhook_endpoint variable for the metrics RHEL System Role. This enables you to provide a custom URL for your environment that receives messages about important performance events, and is typically used with external tools such as Event-Driven Ansible.

Jira:RHEL-18170

The bootloader RHEL system role

This update introduces the bootloader RHEL system role. You can use this feature for stable and consistent configuration of bootloaders and kernels on your RHEL systems. For more details regarding requirements, role variables, and example playbooks, see the README resources in the /usr/share/doc/rhel-system-roles/bootloader/ directory.

Jira:RHEL-3241

The logging role supports general queue and general action parameters in output modules

Previously, it was not possible to configure general queue parameters and general action parameters with the logging role. With this update, the logging RHEL System Role supports configuration of general queue parameters and general action parameters in output modules.

Jira:RHEL-15440

Support for new ha_cluster System Role features

The ha_cluster System Role now supports the following features:

  • Enablement of the repositories containing resilient storage packages, such as dlm or gfs2 . A Resilient Storage subscription is needed to access the repository.
  • Configuration of fencing levels, allowing a cluster to use multiple devices to fence nodes.
  • Configuration of node attributes.

For information about the parameters you configure to implement these features, see Configuring a high-availability cluster by using the ha_cluster RHEL System Role .

Jira:RHEL-4624 [1] , Jira:RHEL-14090 , Jira:RHEL-22108

New RHEL System Role for configuring fapolicyd

With the new fapolicyd RHEL System Role, you can use Ansible playbooks to manage and configure the fapolicyd framework. The fapolicyd software framework controls the execution of applications based on a user-defined policy.

Jira:RHEL-16542

The network RHEL System role now supports new route types

With this enhancement, you can now use the following route types with the network RHEL System Role:

  • unreachable

Jira:RHEL-21491 [1]

New rhc_insights.display_name option in the rhc role to set display names

You can now configure or update the display name of the system registered to Red Hat Insights by using the new rhc_insights.display_name parameter. The parameter allows you to name the system based on your preference to easily manage systems in the Insights Inventory. If your system is already connected with Red Hat Insights, use the parameter to update the existing display name. If the display name is not set explicitly on registration, it is set to the hostname by default. It is not possible to automatically revert the display name to the hostname, but it can be set so manually.

Jira:RHEL-16965

The RHEL system roles now support LVM snapshot management

With this enhancement, you can use the new snapshot RHEL system roles to create, configure, and manage LVM snapshots.

Jira:RHEL-16553

The postgresql RHEL System Role now supports PostgreSQL 16

The postgresql RHEL System Role, which installs, configures, manages, and starts the PostgreSQL server, now supports PostgreSQL 16.

For more information about this system role, see Installing and configuring PostgreSQL by using the postgresql RHEL System Role .

Jira:RHEL-18963

New rhc_insights.ansible_host option in the rhc role to set Ansible hostnames

You can now configure or update the Ansible hostname for the systems registered to Red Hat Insights by using the new rhc_insights.ansible_host parameter. When set, the parameter changes the ansible_host configuration in the /etc/insights-client/insights-client.conf file to your selected Ansible hostname. If your system is already connected with Red Hat Insights, this parameter will update the existing Ansible hostname.

Jira:RHEL-16975

ForwardToSyslog flag is now supported in the journald system role

In the journald RHEL System Role, the journald_forward_to_syslog variable controls whether the received messages should be forwarded to the traditional syslog daemon or not. The default value of this variable is false . With this enhancement, you can now configure the ForwardToSyslog flag by setting journald_forward_to_syslog to true in the inventory. As a result, when using remote logging systems such as Splunk, the logs are available in the /var/log files.

Jira:RHEL-21123

ratelimit_burst variable is only used if ratelimit_interval is set in logging system role

Previously, in the logging RHEL System Role, when the ratelimit_interval variable was not set, the role would use the ratelimit_burst variable to set the rsyslog ratelimit.burst setting. But it had no effect because it is also required to set ratelimit_interval .

With this enhancement, if ratelimit_interval is not set, the role does not set ratelimit.burst . If you want to set ratelimit.burst , you must set both ratelimit_interval and ratelimit_burst variables.

Jira:RHEL-19047

Use the logging_max_message_size parameter instead of rsyslog_max_message_size in the logging system role

Previously, even though the rsyslog_max_message_size parameter was not supported, the logging RHEL System Role was using rsyslog_max_message_size instead of using the logging_max_message_size parameter. This enhancement ensures that logging_max_message_size is used and not rsyslog_max_message_size to set the maximum size for the log messages.

Jira:RHEL-15038

The ad_integration RHEL System Role now supports custom SSSD settings

Previously, when using the ad_integration RHEL System Role, it was not possible to add custom settings to the [sssd] section in the sssd.conf file using the role. With this enhancement, the ad_integration role can now modify the sssd.conf file and, as a result, you can use custom SSSD settings.

Jira:RHEL-21134

The ad_integration RHEL System Role now supports custom SSSD domain configuration settings

Previously, when using the ad_integration RHEL System Role, it was not possible to add custom settings to the domain configuration section in the sssd.conf file using the role. With this enhancement, the ad_integration role can now modify the sssd.conf file and, as a result, you can use custom SSSD settings.

Jira:RHEL-17667

New logging_preserve_fqdn variable for the logging RHEL System Role

Previously, it was not possible to configure a fully qualified domain name (FQDN) using the logging system role. This update adds the optional logging_preserve_fqdn variable, which you can use to set the preserveFQDN configuration option in rsyslog to use the full FQDN instead of a short name in syslog entries.

Jira:RHEL-15933

Support for creation of volumes without creating a file system

With this enhancement, you can now create a new volume without creating a file system by specifying the fs_type=unformatted option.

Similarly, existing file systems can be removed using the same approach by ensuring that the safe mode is disabled.

Jira:RHEL-16213

The rhc system role now supports RHEL 7 systems

You can now manage RHEL 7 systems by using the rhc system role. Register the RHEL 7 system to Red Hat Subscription Management (RHSM) and Insights and start managing your system using the rhc system role.

Using the rhc_insights.remediation parameter has no impact on RHEL 7 systems as the Insights Remediation feature is currently not available on RHEL 7.

Jira:RHEL-16977

New mssql_ha_prep_for_pacemaker variable

Previously, the microsoft.sql.server RHEL System Role did not have a variable to control whether to configure SQL Server for Pacemaker. This update adds the mssql_ha_prep_for_pacemaker . Set the variable to false if you do not want to configure your system for Pacemaker and you want to use another HA solution.

Jira:RHEL-19204

The sshd role now configures certificate-based SSH authentications

With the sshd RHEL System Role, you can now configure and manage multiple SSH servers to authenticate by using SSH certificates. This makes SSH authentications more secure because certificates are signed by a trusted CA and provide fine-grained access control, expiration dates, and centralized management.

Jira:RHEL-5985

selinux role now supports configuring SELinux in disabled mode

With this update, the selinux RHEL System Role supports configuring SELinux ports, file contexts, and boolean mappings on nodes that have SELinux set to disabled. This is useful for configuration scenarios before you enable SELinux to permissive or enforcing mode on a system.

Jira:RHEL-15871

selinux role now prints a message when specifying a non-existent module

With this release, the selinux RHEL System Role prints an error message when you specify a non-existent module in the selinux_modules.path variable.

Jira:RHEL-19044

4.14. Virtualization

RHEL now supports Multi-FD migration of virtual machines

With this update, multiple file descriptors (multi-FD) migration of virtual machines is now supported. Multi-FD migration uses multiple parallel connections to migrate a virtual machine, which can speed up the process by utilizing all the available network bandwidth.

It is recommended to use this feature on high-speed networks (20 Gbps and higher).

Jira:RHELDOCS-16970 [1]

Secure Execution VMs on IBM Z now support cryptographic coprocessors

With this update, you can now assign cryptographic coprocessors as mediated devices to a virtual machine (VM) with IBM Secure Execution on IBM Z.

By assigning a cryptographic coprocessor as a mediated device to a Secure Execution VM, you can now use hardware encryption without compromising the security of the VM.

Jira:RHEL-11597 [1]

You can now replace SPICE with VNC in the web console

With this update, you can use the web console to replace the SPICE remote display protocol with the VNC protocol in an existing virtual machine (VM).

Because the support for the SPICE protocol is deprecated in RHEL 8 and will be removed in RHEL 9, VMs that use the SPICE protocol fail to migrate to RHEL 9. However, RHEL 8 VMs use SPICE by default, so you must switch from SPICE to VNC for a successful migration.

Jira:RHELDOCS-18289 [1]

New virtualization features in the RHEL web console

With this update, the RHEL web console includes new features in the Virtual Machines page. You can now:

  • Add an SSH public key during virtual machine (VM) creation. This public key will be stored in the ~/.ssh/authorized_keys file of the designated non-root user on the newly created VM, which provides you with an immediate SSH access to the specified user account.
  • Select a pre-formatted block device type when creating a new storage pool. This is a more robust alternative to a physical disk device type, as it prevents unintentional reformatting of a raw disk device.

This update also changes some default behavior in the Virtual Machines page:

  • In the Add disk dialog, the Always attach option is now set by default.

Jira:RHELDOCS-18323 [1]

4.15. RHEL in cloud environments

New cloud-init clean option for deleting generated configuration files

The cloud-init clean --configs option has been added for the cloud-init utility. You can use this option to delete unnecessary configuration files generated by cloud-init on your instance. For example, to delete cloud-init configuration files that define network setup, use the following command:

Jira:RHEL-7312 [1]

RHEL instances on EC2 now support IPv6 IMDS connections

With this update, RHEL 8 and 9 instances on Amazon Elastic Cloud Compute (EC2) can use the IPv6 protocol to connect to Instance Metadata Service (IMDS). As a result, you can configure RHEL instances with cloud-init on EC2 with a dual-stack IPv4 and IPv6 connection. In addition, you can launch EC2 instances of RHEL with cloud-init in IPv6-only subnet.

Jira:RHEL-7278

4.16. Containers

The Container Tools packages have been updated

The updated Container Tools packages, which contain the Podman, Buildah, Skopeo, crun, and runc tools, are now available. Notable bug fixes and enhancements over the previous version include:

Notable changes in Podman v4.9:

  • You can now use Podman to load the modules on-demand by using the podman --module <your_module_name> command and to override the system and user configuration files.
  • A new podman farm command with a set of the create , set , remove , and update subcommands has been added. With these commands, you can farm out builds to machines running podman for different architectures.
  • A new podman-compose command has been added, which runs Compose workloads by using an external compose provider such as Docker compose.
  • The podman build command now supports the --layer-label and --cw options.
  • The podman generate systemd command is deprecated. Use Quadlet to run containers and pods under systemd .
  • The podman build command now supports Containerfiles with the HereDoc syntax.
  • The podman machine init and podman machine set commands now support a new --usb option. Use this option to allow USB passthrough for the QEMU provider.
  • The podman kube play command now supports a new --publish-all option. Use this option to expose all containerPorts on the host.

For more information about notable changes, see upstream release notes .

Jira:RHELPLAN-167794 [1]

Podman now supports containers.conf modules

You can use Podman modules to load a predetermined set of configurations. Podman modules are containers.conf files in the Tom’s Obvious Minimal Language (TOML) format.

These modules are located in the following directories, or their subdirectories:

  • For rootless users: $HOME/.config/containers/containers.conf.modules
  • For root users: /etc/containers/containers.conf.modules , or /usr/share/containers/containers.conf.modules

You can load the modules on-demand with the podman --module <your_module_name> command to override the system and user configuration files. Working with modules involve the following facts:

  • You can specify modules multiple times by using the --module option.
  • If <your_module_name> is the absolute path, the configuration file will be loaded directly.
  • The relative paths are resolved relative to the three module directories mentioned previously.
  • Modules in $HOME override those in the /etc/ and /usr/share/ directories.

For more information, see the upstream documentation .

Jira:RHELPLAN-167830 [1]

The Podman v4.9 RESTful API now displays data of progress

With this enhancement, the Podman v4.9 RESTful API now displays data of progress when you pull or push an image to the registry.

Jira:RHELPLAN-167822 [1]

SQLite is now fully supported as a default database backend for Podman

With Podman v4.9, the SQLite database backend for Podman, previously available as Technology Preview, is now fully supported. The SQLite database provides better stability, performance, and consistency when working with container metadata. The SQLite database backend is the default backend for new installations of RHEL 8.10. If you upgrade from a previous RHEL version, the default backend is BoltDB.

If you have explicitly configured the database backend by using the database_backend option in the containers.conf file, then Podman will continue to use the specified backend.

Jira:RHELPLAN-168179 [1]

Administrators can set up isolation for firewall rules by using nftables

You can use Netavark, a Podman container networking stack, on systems without iptables installed. Previously, when using the container networking interface (CNI) networking, the predecessor to Netavark, there was no way to set up container networking on systems without iptables installed. With this enhancement, the Netavark network stack works on systems with only nftables installed and improves isolation of automatically generated firewall rules.

Jira:RHELDOCS-16955 [1]

Containerfile now supports multi-line instructions

You can use the multi-line HereDoc instructions (Here Document notation) in the Containerfile file to simplify this file and reduce the number of image layers caused by performing multiple RUN directives.

For example, the original Containerfile can contain the following RUN directives:

Instead of multiple RUN directives, you can use the HereDoc notation:

Jira:RHELPLAN-168184 [1]

Toolbx is now available

With Toolbx, you can install the development and debugging tools, editors, and Software Development Kits (SDKs) into the Toolbx fully mutable container without affecting the base operating system. The Toolbx container is based on the registry.access.redhat.com/ubi8.10/toolbox:latest image.

Jira:RHELDOCS-16241 [1]

Quick Links

  • Subscriptions
  • Support Cases
  • Customer Service
  • Product Documentation
  • Contact Customer Portal
  • Customer Portal FAQ
  • Log-in Assistance
  • Trust Red Hat
  • Browser Support Policy
  • Accessibility
  • Awards and Recognition

Related Sites

  • developers.redhat.com
  • connect.redhat.com
  • cloud.redhat.com

Systems Status

  • Red Hat Subscription Value
  • About Red Hat
  • Red Hat Jobs

Red Hat legal and privacy links

  • Contact Red Hat
  • Red Hat Blog
  • Diversity, equity, and inclusion
  • Cool Stuff Store
  • Red Hat Summit
  • Privacy statement
  • Terms of use
  • All policies and guidelines
  • Digital accessibility

local variable 'result' referenced before assignment python

Article  

  • Volume 17, issue 10
  • GMD, 17, 4355–4382, 2024
  • Peer review
  • Related articles

local variable 'result' referenced before assignment python

VISIR-2: ship weather routing in Python

Gianandrea mannarini, mario leonardo salinas, lorenzo carelli, nicola petacco, josip orović.

Ship weather routing, which involves suggesting low-emission routes, holds potential for contributing to the decarbonisation of maritime transport. However, including because of a lack of readily deployable open-source and open-language computational models, its quantitative impact has been explored only to a limited extent.

As a response, the graph-search VISIR (discoVerIng Safe and effIcient Routes) model has been refactored in Python, incorporating novel features. For motor vessels, the angle of attack of waves has been considered, while for sailboats the combined effects of wind and sea currents are now accounted for. The velocity composition with currents has been refined, now encompassing leeway as well. Provided that the performance curve is available, no restrictions are imposed on the vessel type. A cartographic projection has been introduced. The graph edges are quickly screened for coast intersection via a K -dimensional tree. A least-CO 2 algorithm in the presence of dynamic graph edge weights has been implemented and validated, proving a quasi-linear computational performance. The software suite's modularity has been significantly improved, alongside a thorough validation against various benchmarks. For the visualisation of the dynamic environmental fields along the route, isochrone-bounded sectors have been introduced.

The resulting VISIR-2 model has been employed in numerical experiments within the Mediterranean Sea for the entirety of 2022, utilising meteo-oceanographic analysis fields. For a 125 m long ferry, the percentage saving of overall CO 2 expenditure follows a bi-exponential distribution. Routes with a carbon dioxide saving of at least 2 % with respect to the least-distance route were found for prevailing beam or head seas. Two-digit savings, up to 49 %, were possible for about 10 d in a year. In the case of an 11 m sailboat, time savings increased with the extent of path elongation, particularly during upwind sailing. The sailboat's routes were made approximately 2.4 % faster due to optimisation, with the potential for an additional 0.8 % in savings by factoring in currents.

VISIR-2 serves as an integrative model, uniting expertise from meteorology, oceanography, ocean engineering, and computer science, to evaluate the influence of ship routing on decarbonisation efforts within the shipping industry.

  • Article (PDF, 8420 KB)
  • Supplement (12136 KB)
  • Article (8420 KB)
  • Full-text XML

Mendeley

Mannarini, G., Salinas, M. L., Carelli, L., Petacco, N., and Orović, J.: VISIR-2: ship weather routing in Python, Geosci. Model Dev., 17, 4355–4382, https://doi.org/10.5194/gmd-17-4355-2024, 2024.

As climate change, with its unambiguous attribution to anthropogenic activities, rapidly unfolds ( IPCC ,  2023 ) , the causal roles played by various sectors of the economy, as well as the possibilities for mitigation, are becoming more evident. This holds true for the shipping sector as well ( IPCC ,  2022 ) , which has begun taking steps to reduce its carbon footprint. The International Maritime Organization (IMO) adopted an initial decarbonisation strategy in 2018 ( IMO ,  2018 a ) , which was later revised in 2023. The new ambition is to achieve complete decarbonisation by mid-century, addressing all greenhouse gas (GHG) emissions, with a partial uptake of near-zero GHG technology as early as 2030 ( IMO ,  2023 ) . While no new measures have been adopted yet, the revised strategy is expected to boost efforts to increase the energy efficiency of shipping in the short term ( Smith and Shaw ,  2023 ) . In line with the European Green Deal, the European Union has adopted new rules to include various GHG (carbon dioxide, methane, and nitrous oxide) emissions from shipping in its Emissions Trading System (EU-ETS), starting from 2024 ( https://climate.ec.europa.eu/eu-action/transport-emissions/reducing-emissions-shipping-sector_en , last access: 20 May 2024). For the first time ever, this will entail surrendering allowances for GHG emissions from vessels as well.

Zero-emission bunker fuels are projected to cost significantly more than present-day fossil fuels ( Al-Aboosi et al. ,  2021 ; Svanberg et al. ,  2018 ) . Thus, minimising their use will be crucial for financial sustainability. This necessitates energy savings through efficient use, achieved via both technical (e.g. wind-assisted propulsion systems or WAPSs) and operational measures (e.g. speed reduction and ship weather routing). According to the “CE-Ship” model, a GHG emissions model for the shipping sector, a global reduction in GHG emissions by 2030 by up to 47 % relative to 2008 levels could be feasible through a combination of operational measures, technical innovations, and the use of near-zero-GHG fuels ( Faber et al. ,  2023 ) . A separate study focusing on the European fleet estimates that a reduction in sailing speed alone could potentially lead to a 4 %–27 % emission reduction, while combining technical and operational measures might provide an additional 3 %–28 % reduction ( Bullock et al. ,  2020 ) . The impact of speed optimisation on emissions varies significantly, with potential percentage savings ranging from a median of 20 % to as high as 80 %, depending on factors such as the actual route, meteorological and marine conditions, and the vessel type ( Bouman et al. ,  2017 ) . In that paper, while cases are reported of up to 50 % savings, the role of weather routing was generally assessed to be lower than 10 %.

The variability in percentage savings reported in the literature can be attributed to the diversity of routes considered, the specific weather conditions, and the types of vessels analysed. Additionally, reviews often use a wide range of bibliographic sources, including grey literature, company technical reports, white papers, and works that fail to address the actual meteorological and marine conditions.

The VISIR (discoVerIng Safe and effIcient Routes, pronunciation: /vi′zi:r/) ship weather routing model was designed to objectively assess the potential impact of oceanographic and meteorological information on the safety and efficiency of navigation. So far, two versions of the model have been released (VISIR-1.a – Mannarini et al. ,  2016 a , and VISIR-1.b – Mannarini and Carelli ,  2019 a ). However, the use of a proprietary coding language (MATLAB) may hinder its further adoption. Also, the experience with VISIR-1 suggested the need to enhance the modularity of the package and implement other best practices of scientific coding, as recommended in Wilson et al. ( 2014 ) . Another area where innovation seemed possible was the development of a comprehensive framework to perform weather routing for both motor vessels and sailboats. While some aspects of this requirement were covered through a more modular approach, it also involved rethinking how to utilise environmental fields such as waves, currents, and wind. Furthermore, while the carbon intensity savings of least-time routes were already estimated via VISIR-1.b, a dedicated algorithm for the direct computation of least-CO 2 routes was lacking.

To address all these requirements, we designed, coded, tested, and conducted extensive numerical experiments with the VISIR-2 model ( Salinas et al. ,  2024 a ) . VISIR-2 is a Python-coded software, inheriting from VISIR-1 the fact that it is based on a graph-search method. However, VISIR-2 is a completely new model, leveraging the previous experience while also offering many new solutions and capabilities. Part of the validation process made use of its ancestor model VISIR-1. Computational performance has been enhanced, and efforts have been made to improve usability. In view of use for routing of WAPS vessels, we have developed a unified modelling framework, accounting for involuntary speed loss in waves, advection via ocean currents, thrust, and leeway from wind. A novel algorithm for finding the least-CO 2 routes has been devised, building upon Dijkstra's original method. The visualisation of dynamic information along the route has been further improved using isochrone-bounded sectors. VISIR-2 features are thoroughly described in this paper, along with some case studies and suggestions for possible development lines in the future.

The VISIR-2 model enabled systematic assessment of CO 2 savings deriving from optimal use of meteo-oceanographic information in the voyage planning process. Differently from most of the existing works cited above, the emissions could clearly be related to the significant wave height, relative angle of waves, and also engine load factor. This is discussed further in Sect.  6.1 . Ocean currents can be added to the optimisation, providing more realistic figures for the emission savings.

VISIR-2 is a numerical model well-suited for both academic and technical communities and facilitating the exploration and quantification of ship routing's potential for operational decarbonisation. In the European Union, there may be a need for independent verification of emissions reported in the monitoring, reporting, and verifying (MRV) system ( https://www.emsa.europa.eu/thetis-mrv.html , last access: 20 May 2024). Utilising baseline emissions computed through a weather routing model could enhance the accuracy and reliability of this verification process. Additionally, the incorporation of shipping into the EU-ETS intensifies the importance of minimising GHG emissions. Internationally, even with the adoption of zero- or low-carbon fuels encouraged by the recent update of the IMO's strategy, it remains critical to save these fuels as much as possible. Therefore, VISIR-2 could potentially serve as a valuable tool for saving both fuel and allowances.

The remainder of this paper includes a literature investigation in Sect.  1.1 followed by an in-depth presentation of the innovations introduced by VISIR-2 in Sect.  2 . Subsequently, the model validation is discussed in Sect.  3 and its performance is assessed in Sect.  4 . Several case studies in the Mediterranean Sea follow (Sect.  5 ). The results of the CO 2 emission percentage savings, some potential use cases, and an outlook on possible developments of VISIR-2 are discussed in Sect.  6 . Finally, the conclusions are presented in Sect.  7 . The Appendix contains technical information regarding the computation of the angle of attack between ships' heading and course (Appendix  A ), as well as details about the neural network employed to identify the vessel performance curves (Appendix  B ).

1.1  Literature review on weather routing

This compact review of systems for ship weather routing will be limited to web applications (Sect.  1.1.1 ) and peer-reviewed research papers (Sect.  1.1.2 ). It is further restricted to the freely available versions of desktop applications, while the selection of papers is meant to update the wider reviews already provided in Mannarini et al. ( 2016 a ) and Mannarini and Carelli ( 2019 b ) . A critical gap analysis (Sect.  1.1.3 ) completes this subsection.

1.1.1  Web applications

FastSeas ( https://fastseas.com/ , last access: 20 May 2024) is a weather routing tool for sailboats, with editable polars and the possibility of considering a motor propulsion. Wind forecasts are taken from the National Oceanic and Atmospheric Administration Global Forecast System (NOAA GFS) model and ocean surface currents from NOAA Ocean Surface Current Analyses Real-time (OSCAR). The tool makes use of Windy imagery, a free choice of endpoints is offered, departure time can vary between the present and a few days in the future, and the voyage plan is exportable in various formats.

The Avalon web router ( https://www.webrouter.avalon-routing.com/compute-route , last access: 20 May 2024) provides a coastal weather routing service for sailboats within subregions of France, the United Kingdom, and the United States. It offers a choice among tens of sailboats, with the option to also consider a motor-assisted propulsion. Hourly departure dates within a couple of days are allowed, and ocean weather along the routes is provided in tabular form.

GUTTA-VISIR ( https://gutta-visir.eu , last access: 20 May 2024) is a weather routing tool for a specific ferry developed in the frame of the “savinG fUel and emissions from mariTime Transport in the Adriatic region” (GUTTA) project. It provides both least-time and least-CO 2 routes between several ports of call. It makes use of operational wave and current forecast fields from the Copernicus Marine Environment Monitoring Service (CMEMS). The route departure date and time and the engine load can be varied. Waves, currents, or isolines can be rendered along with the routes, which can be exported.

OpenCPN ( https://opencpn.org/ , last access: 20 May 2024) is a comprehensive open-source platform, including a weather routing tool for sailboats. The product name originates from “Open-source Chart Plotter Navigation”. The vessel performance curves are represented via polars, and forecast data in GRIB format or a climatology can be used. Nautical charts can be downloaded and integrated into the graphical user interface. The programming language is C++, and a velocity composition with currents is accounted for. A detailed documentation of the numerical methods used is lacking though.

1.1.2  Research papers

A review of ship weather routing methods and applications was provided by Zis et al. ( 2020 ) . Several routing methods such as the isochrone method, dynamic programming, calculus of variations, and pathfinding algorithms were summarised before a taxonomy of related literature was proposed. The authors made the point that the wide range of emission savings reported in the literature might in future be constrained via defining a baseline case; providing benchmark instances; and performing sensitivity analyses, e.g. on the resolution of the environmental data used.

A specific weather routing model was documented by Vettor and Guedes Soares ( 2016 ) . It integrates advanced seakeeping and propulsion modelling with multi-objective (fuel consumption, duration, and safety) optimisation. An evolutionary algorithm was used, with initialisation from both random solutions and single-objective routes from a modified Dijkstra's algorithm. Safety constraints were considered via probabilities of exceeding thresholds for slamming, green water, or vertical acceleration. A specific strategy was proposed to rank solutions within a Pareto frontier.

A stochastic routing problem was addressed in Tagliaferri et al. ( 2014 ) . A single upwind leg of a yacht race is considered, with the wind direction being the stochastic variable. The vessel was represented in terms of polars, and the optimal route was computed via dynamic programming. The skipper's risk propensity was modelled via a specific preference on the wind transition matrices. This way it was shown how the risk attitude affects the chance to win a race.

Ladany and Levi ( 2017 ) developed a dynamic-programming approach to sailboat routing which accounts for the tacking time. The latter was assumed to be proportional to the amplitude of the course change. Furthermore, a sensitivity analysis was conducted, considering both the uncertainty in wind direction and the magnitude of the discretisation step in the numerical solution.

Sidoti et al. ( 2023 ) provided a consistent framework for a dynamic-programming approach for sailboats, considering both leeway and currents. In order to constrain the course of the boat on the available edges on the numerical grid, an iterative scheme was adopted. Case studies with NAVGEM winds and global HYCOM currents were carried out in a region across the Gulf Stream. The results without leeway were validated versus OpenCPN.

The impact of stochastic uncertainty on WAPS ships was addressed by Mason et al. ( 2023 b ) . A dynamic-programming technique was used, and “a priori” routing (whereby information available at the start of the journey only is used) was distinguished from “adaptive” routing (whereby the optimum solution is updated based on information that becomes available every 24  h along a journey). The latter strategy is shown, for voyages lasting several days, to be more robust with respect to the unavoidable stochastic uncertainty in the forecasts.

1.1.3  Knowledge gap

A few open web applications exist, mainly for sailboats and with limited insight into their numerical methods. Case study results from weather routing systems developed in academia have been published, but (with the exception of Mason et al. ,  2023 b ) no systematic assessment of CO 2 savings has been provided. Furthermore, no related software has been disclosed in any case. The OpenCPN package lacks both a peer-reviewed publication and documentation of the methods implemented. A prevalence of dynamic-programming approaches is noted, especially for web applications, with the graph-search method being used in research papers only. The tools focus either on sailboats (with or without a motor) or on motor vessels. When both are available (such as in FastSeas), the motor vessel is described in terms of polars.

From this assessment, the lack of an open-source and well-documented ship weather routing model, for both motor vessels and sailboats, with flexible characterisation of vessel performance appears as a gap which the present work aims to close.

This section includes a revision of the vessel kinematics of VISIR, as given in Sect.  2.1 ; changes in the graph generation procedure and in the use of static environmental fields in Sect.  2.2 ; updates to the computation of graph edge weights in Sect.  2.3 ; an additional optimisation objective in the shortest-path algorithm in Sect.  2.4 ; new vessel performance models in Sect.  2.5 ; innovative visualisation capabilities in Sect.  2.6 ; and a more modular structure of the software package, presented in Sect.  2.7 . Further technical details of the VISIR-2 code are presented in the software manual, provided along with its online repository ( Salinas et al. ,  2024 a ) .

2.1  Kinematics

For a graph-search model such as VISIR to deal with waves, currents, and wind for various vessel types, several updates to its approach for velocity composition were needed. They included both generalisations and use of new quantities, addressed in this subsection, as well as a new numerical solution, addressed in Appendix  A .

As in Mannarini and Carelli ( 2019 b ) , the kinematics of VISIR-2 is based on both the principle of superposition of velocities and the discretised sailing directions existing on a graph. However, while previously the vessel's speed over ground (SOG) was obtained from the magnitude of the vector sum of speed through water ( T   =  STW t ^ ) and ocean current ( w ), we show here that, more generally, SOG is the magnitude of a vector G   =  SOG e ^ , being the sum of the forward speed F   =   F h ^ and an effective current ω , and both will be defined in the following. In the absence of leeway, the F and T vectors are identical and ω = w , so the newer approach encompasses the previous one.

Making reference to Fig.  1 , the use of a graph constrains the vessel's course over ground to be along e ^ , being the orientation of one of the graph's arcs. Thus, any cross component of velocity or along a o ^ versor such that e ^ ⋅ o ^ = 0 must be null.

https://gmd.copernicus.org/articles/17/4355/2024/gmd-17-4355-2024-f01

Figure 1 Angular configuration with ( δ = - 27 °, γ i = - 109 °), resulting in ϵ = + 1 . The dark-grey area represents the ship hull, while the light-grey-shaded area denotes the no-go zone for α 0 =25 ° . Clockwise-oriented arcs indicate positive angles, and filled circles at line ends denote the meteorological (“from”) convention.

This implies that, to balance the cross flow from the currents, the vessel must head into a direction h ^ slightly different from the course e ^ . In Mannarini and Carelli ( 2019 b ) , such an angle of attack was defined as

where for both ψ h (heading, or HDG) and ψ e (course over ground, or COG) a nautical convention is used (due north, to direction). That framework is here generalised to also deal with the vector nature of some environmental fields, such as waves or wind. Using a meteorological convention (due north, from direction) for both the ψ a (waves) and ψ i (wind) directions, we here introduce the δ f angles, defined as

where γ f = ψ f - ψ e constitutes the relative angle between the f environmental field and the ship's course. f = a for waves and f = i for wind. In computing angular differences, their convention should be considered (see the angular_utils.py function in the VISIR-2 code). Thus, δ f =0 whenever the ship heads in the direction from which the field comes, and γ f =0 if her course is in such a direction.

Furthermore, we here define leeway as a motion, caused by the wind, transversal to the ship's heading. From the geometry shown in Fig.  1 , the oriented direction of leeway ψ L is given by

where the ⌊⋅⌋ delimiters indicate the floor function. Thus, ϵ is positive for δ i in the [0,180 ° ] range and flips every 180 ° of the argument. This is not the sole possible definition of leeway. For instance, in Breivik and Allen ( 2008 ) a distinction between the downwind and crosswind component of leeway is made. However, the present definition is consistent with the subsequent data of vessel performance (Sect.  2.5.2 ).

Upon expressing the magnitudes F of the vessel's forward velocity and L of leeway velocity as

with wind magnitude V i , significant wave height H s , and engine load χ , a leeway angle, being the ship's heading change between the F and T vectors, can be defined as

The above-introduced α L is not a constant but depends on both wind magnitude V i and the module of the relative direction, | δ i | . Also, from Fig.  1 , it is seen that F   =  STW  ⋅cos  α L . Thus, in the absence of leeway ( α L =0 ), one retrieves the identity of F and STW, which was an implicit assumption made in Mannarini and Carelli ( 2019 b ) .

Equations ( 5a ) and ( 5b ) comprise a major innovation with respect to the formalism of Mannarini and Carelli ( 2019 b ) , as an angular dependence in the performance curve is also introduced in VISIR for motor vessels for the first time (Sect.  2.5 ). Equation ( 5a ) includes dependencies on both wind and waves. Furthermore, a possible dependency on χ , the fractional engine load (or any other propulsion parameter), is highlighted here.

Within this formalism, if the vessel is a sailboat (or rather a motor vessel making use of a WAPS), just one additional condition should be considered. That is, given the wind-magnitude-dependent no-go angle α 0 ( V i ) , upwind navigation is not permitted, or

Now, given a water flow expressed by the vector

and making reference to Fig.  1 , the flow projections along ( e ^ ) and across ( o ^ ) the vehicle course are, respectively,

where for the ocean flow direction ψ w the nautical convention is also used.

In analogy to Eqs. ( 9a ) and ( 9b ) and also using nautical convention for ψ L , the along- and cross-course projections of the leeway are given by

The simple relations on the right-hand side (r.h.s.) of Eqs. ( 10a ) and ( 10b ) follow from the similitude of the red- and green-shaded triangles in Fig.  1 . As δ is typically a small angle (cf. Appendix  A ), it is apparent that the cross component of the leeway, w ⊥ ( L ) , is the dominant one. Its sign is such that it is always downwind; see Fig.  1 . If relevant, the Stokes drift ( van den Bremer and Breivik ,  2018 ) could be treated akin to an ocean current, and one would obtain for its projections a couple of equations formally identical to Eqs. ( 9a ) and ( 9b ).

Finally, the components of the effective flow ω advecting the vessel are

Due to Eqs. ( 10a ) and ( 10b ), both ω ∥ and ω ⊥ are functions of δ . We recall that the “cross” and “along” specifications refer to vessel course ψ e , differing from vessel heading by the δ angle.

The graphical construction in Fig.  1 makes it clear that G   =  SOG e ^ equals T + w or F + ω . Using the latter equality, together with the course assignment condition, and projecting along both e ^ and o ^ , two scalar equations are obtained, namely

Equations ( 12a ) and ( 12b ) are formally identical to those found in Mannarini and Carelli ( 2019 b ) in the presence of ocean currents only. This fact supports the interpretation of ω as an effective current.

However, Eqs. ( 12a ) and ( 12b ) alone are no more sufficient to determine the ocean current vector w . In fact, it is mingled with the effect of wind through leeway to form the effective flow ω (Eqs.  11a , 11b ). This is why, in the presence of strong winds, reconstruction of ocean currents from data of COG and HDG via a naive inversion of Eqs. ( 12a ) and ( 12b ) is challenging. This was indeed found by Le Goff et al. ( 2021 ) using automatic identification system (AIS) data across the Agulhas Current.

As it reduces the ship's speed available along its course (Eq.  12a ), the angle of attack δ plays a pivotal role in determining SOG. However, in the presence of an angle-dependent vessel speed (Eq.  5a ), δ is no longer given by a simple algebraic equation corresponding to Eq. ( 12b ) as in Mannarini and Carelli ( 2019 b ) but by a transcendental one:

In fact, due to Eq. ( 2 ), the r.h.s. of Eq. ( 13 ) depends both explicitly and implicitly on δ . Just in the limiting case of null currents, Eqs. ( 6 ), ( 10b ), and ( 12b ) collectively imply that

However, in general, the actual value of the forward speed F is only determined once the δ angle is retrieved from Eq. ( 13 ). To our knowledge, the transcendental nature of the equation defining δ had not been pointed out previously. Furthermore, in VISIR-2 an efficient numerical approximation for its solution is provided; see Appendix  A . This is also a novelty with practical benefits for the development of efficient operational services based on VISIR-2.

We note that Eq. ( 13 ) holds if and only if

Should this not be the case, the vessels' forward speed would not balance the effective drift.

As F is always non-negative, Eq. ( 13 ) implies that sgn ( δ ) = sgn ( ω ⊥ ) . In particular, in the case of an effective cross flow ω ⊥ bearing, as in Fig.  1 , to starboard, an anticlockwise change in vehicle heading ( δ <0 ) is needed for keeping course (note o ^ versor's orientation in Fig.  1 ).

Equations ( 12a ) and ( 12b ) can be solved for the speed over ground (SOG), which reads

According to Eq. ( 16 ), the cross flow ω ⊥ always reduces SOG, as part of vehicle momentum must be spent balancing the drift. The along-edge flow ω ∥ (or “effective drag”) may instead either increase or decrease SOG.

Finally, given that G = d x / d t , by taking the module of the left side, and approximating the r.h.s. with its finite-difference quotient, the graph edge weight δ t is computed as

where δ x is the edge length and SOG is given by Eq. ( 16 ). As the environmental fields determining SOG are both space and time dependent, the weights δ t are computed via the specific interpolation procedures in Sect.  2.3 and the shortest paths via the algorithms provided in Sect.  2.4 .

From Eq. ( 17 ), it follows that the condition

should be checked in case the specific graph-search method used does not allow for use of negative edge weights (as is the case for Dijkstra's algorithm; cf.  Bertsekas ,  1998 ). Violation of Eq. ( 18 ) may occur in the presence of a strong counter-flow ω ∥ along a specific graph edge, whose weight must correspondingly be set to not a number.

The CO 2 emissions along a graph edge are given by

where Γ = Γ ( | δ i | , V i ; | δ a | , H s , χ ) is the CO 2 emission rate of the specific vessel in the presence of the actual meteo-marine conditions. Both δ t and δ CO 2 are used in the least-CO 2 algorithm introduced in Sect.  2.4 .

2.2  Graph generation

Graph preparation is crucial for any graph-search method. Indeed, graph edges represent potential route legs. Therefore, the specific edges included within the graph directly influence the route topology. In addition, as will be shown in Sect.  2.3.2 , the length of edges affects the environmental field value represented by each edge. On the other hand, graph nodes determine the accessible locations within the domain. Therefore, they must be selected with consideration of both the presence of landmasses and shallow waters.

The structure of the mesh is also the most fundamental difference between a graph-search method (such as Dijkstra's or A * ) and dynamic programming. Indeed, a dynamic-programming problem can be transformed into a shortest-path problem on a graph ( Bertsekas ,  1998 , Sect. 2.1) . In the former, the nodes are organised along sections of variable amplitude corresponding to stages. In the latter, nodes can uniformly cover the entire domain. However, for both dynamic programming ( Mason et al. ,  2023 b ) and graph methods ( Mannarini et al. ,  2019 b ) , the number of edges significantly impacts the computational cost of computing a shortest path.

To efficiently address all these aspects, VISIR-2's graph preparation incorporates several updates compared to its predecessor, VISIR-1b, as outlined in the following sub-sections.

https://gmd.copernicus.org/articles/17/4355/2024/gmd-17-4355-2024-f02

Figure 2 Graph stencil for ν =4 : (a)  grid in spherical coordinates with Δ x resolution along both latitude and longitude axes; (b)  Mercator projection, with different resolutions along y or x , and graph edges (thick black and dashed grey lines) and angles (light blue) relative to due north. The y spacing is shown here as constant but, over a large latitudinal range, does vary. In VISIR-2, just the N q 1 ( ν ) dark-grey nodes (cf. Eq.  20 and Table  1 ) are connected to the origin, while, in VISIR-1, all ν ( ν +1) dark- or light-grey nodes were connected.

2.2.1  Cartographic projection

The nautical navigation purpose of a ship routing model necessitates the provision of both length and course information for each route leg. On the other hand, environmental fields used to compute a ship's SOG (Eq.  16 ) are typically provided as a matrix of values in spherical coordinates (latitude and longitude, similar to the fields used in Sect.  5.1 ). To address these aspects, VISIR-2 introduces a projection feature, which was overlooked in both VISIR-1.a and VISIR-1.b. The Mercator projection was chosen for its capacity to depict constant bearing lines as straight lines ( Feeman ,  2002 ) . The implementation was carried out using the pyproj library, which was employed to convert spherical coordinates on the WGS 84 (World Geodetic System 1984) ellipsoid into a Mercator projection, with the Equator serving as the standard parallel. For visualisation purposes, both the Matplotlib and cartopy libraries were utilised.

2.2.2  Edge direction

Leg courses of a ship route originate from graph edge directions. To determine them, we consider the Cartesian components of the edges in a projected space. As seen from Fig.  2 , this approach results in smaller angles relative to due north compared to using an unprojected graph. For the graph ( ν , Δ x ) values and average latitude of the case studies considered in this paper (Sect.  5 ), the maximum error between an unprojected graph and a Mercator projection would be about 5° (cf. Table  1 ). However, this angle critically impacts vessels like sailboats, whose performance hinges on environmental field orientation. Additionally, at higher latitudes, the courses tend to cluster along meridional directions. To achieve a more isotropic representation of courses, constructing the graph as a regular mesh in the projected space would be needed, which is left for future refinements of VISIR-2.

For a given sea domain, a graph is typically computed once and subsequently utilised for numerous different routes. However, in VISIR-1, the edge direction was recalculated every time a graph was utilised. In VISIR-2, the edge direction is computed just once, during graph generation, after which it is added to a companion file of the graph ( edge_orientation ). In the definition of the edge direction, the nautical convention (due north, to direction) is used in VISIR-2 graphs.

Finally it should be noted that in a directed graph, such as VISIR-2's, edge orientation also matters. Each edge acts as an arrow, conveying flow from “tail” to “head” nodes. Edge orientation refers to the assignment of the head or tail of an edge. Orientation holds a key to understanding vessel performance curves, explored further in Sect.  2.5 .

2.2.3  Quasi-collinear edges

A further innovation regarding the graph involves an edge pruning procedure. This eliminates redundant edges that carry very similar information. Indeed, some edges have the same ratio of horizontal to vertical grid hops (see the possible_hops() function). Examples of these edges are the solid and dashed arrows in Fig.  2 b. When the grid step size and the number of hops are not too large, these edges point to nearly the same angle relative to north. However, starting from an equidistant grid in spherical coordinates, the vertical spacing in Mercator projection is uneven. Thus, the directions of those edges are not exactly the same, and we call such edges “quasi-collinear”. In VISIR-2, only the shortest one among these quasi-collinear edges is retained. This corresponds to the solid arrows in Fig.  2 b. This reduces the number N q 1 of edges within a single quadrant to

where φ is Euler's totient function and ν the maximum number of hops from a given node of the graph. Thus, the quantity right of the inequality represents the total number of edges of a quadrant, including quasi-collinear ones. Using Eq. ( 20 ), at ν =4 already more than one-third of all edges are pruned and, at ν =10 , nearly half of them are (cf. Table  1 ).

Table 1 Edge count and minimum angle with due north. The total number of edges in the first quadrant is ν ( ν +1) , and the count of non-collinear edges is N q 1 from Eq. ( 20 ). For the order of connectivity ν , the angle in the unprojected graph is given by Δ θ = arcsin ( 1 / ν ) , regardless of latitude and grid resolution. Using a Mercator projection, at a latitude of L ° and for Δ x = D °, the angle is given by Δ θ D ( L ) .

local variable 'result' referenced before assignment python

Download Print Version | Download XLSX

This benefits both the computer memory allocation and the computing time for the shortest path. The latter is linear in the number of edges; cf.  Bertsekas ( 1998 , Sect. 2.4.5) . A further benefit of pruning quasi-collinear edges is a more faithful representation of the environmental conditions. In fact, the environmental field's values at the graph nodes are used for estimating the edge weights (see Sect.  2.3 ). Thus, keeping just shorter edges avoids using less spatially resolved information.

https://gmd.copernicus.org/articles/17/4355/2024/gmd-17-4355-2024-f03

Figure 3 Bathymetry field from EMODnet represented in shades of grey, with contour lines at depths at z =0   m and z = T , where T =7   m is the vessel draught. Additionally, the GSHHG shoreline at two different spatial resolutions is included.

2.2.4  Bathymetry and draught

The minimal safety requirement is that navigation does not occur in shallow waters. This corresponds to the condition that vessel draught T does not exceed sea depth z at all graph edges used for the route computations. This is equivalent to a positive under keel clearance (UKC) of z − T . As explained later in Sect.  2.3.2 , this can be checked by either evaluating the average UKC at the two edge nodes or interpolating it at the edge barycentre.

However, for a specific edge, UKC could still be positive and the edge cross the shoreline. This is avoided in VISIR by checking for mutual edge–shoreline crossings. Given the burden of this process, in VISIR-1b a procedure for restricting the check to inshore edges was introduced. In VISIR-2, as envisioned in Mannarini and Carelli ( 2019 b , Appendix C) , the process of searching for intersections is carried out using a K -dimensional tree (KDT; Bentley ,  1975 ; Maneewongvatana and Mount ,  1999 ). This is a means of indexing the graph edges via a spatial data structure which can effectively be queried for both nearest neighbours (coast proximity of nodes) and range queries (coast intersection of edges). The scipy.spatial.KDTree implementation was used ( https://docs.scipy.org/doc/scipy/reference/ , last access: 20 May 2024). Use of an advanced data structure in the graph is also a novelty of VISIR-2.

Various bathymetric databases can be used by VISIR-2. For European seas, the EMODnet dataset ( https://portal.emodnet-bathymetry.eu/ , last access: 20 May 2024) ( 1 / 16  arcmin resolution or about 116  m ) was used while, for global coverage, GEBCO_2022 ( https://www.gebco.net/data_and_products/gridded_bathymetry_data/ , last access: 20 May 2024) (15 arcsec resolution or about 463  m ) is available.

2.2.5  Shoreline

The bathymetry dataset, if detailed enough, can even be used for deriving an approximation of the shoreline. From Fig.  3 it is seen that a “pseudo-shoreline” derived from the UKC  =  0 contour line of a bathymetry that is fine enough (the EMODnet one) can effectively approximate an official shoreline (the GSHHG ( https://www.ngdc.noaa.gov/mgg/shorelines/ , last access: 20 May 2024) one, at the “high”-type resolution of 200  m ).

Such a pseudo-shoreline is the one used in VISIR-2 for checking the edge crossing condition specified in Sect.  2.2.4 .

2.3  Edge weights

For computing shortest paths on a graph, its edge weights are preliminarily needed. Due to Eqs. ( 16 ) and ( 5a )–( 5b ), they depend on both space- and time-dependent environmental fields, whose information has to be remapped to the numerical grids of VISIR-2. This is done in a partly differently way than in VISIR-1, providing users with improved flexibility and control over numerical fields. These novel options are documented in what follows.

https://gmd.copernicus.org/articles/17/4355/2024/gmd-17-4355-2024-f04

Figure 4 Temporal grid of VISIR-2. The upper horizontal axis ( t ) represents the coarse and uneven time resolution of the original environmental field. The lower horizontal axis corresponds to the fine and even time grid with resolution Δ τ to which it is remapped.

2.3.1  Temporal interpolation

The time at which edge weights are evaluated is key to the outcome of the routing algorithm. In Mannarini et al. ( 2019 b ) , to improve on the coarse time resolution of the environmental field, a linear interpolation in time of the edge weight was introduced (“Tint  =1 ” option in Fig.  4 ). In VISIR-2, instead, the environmental field values (grey dots) are preliminarily interpolated in time on a finer grid with Δ τ spacing (“Tint  =2 ” or blue dots). Then, the edge weight at the nearest available time step ( np.floor function used, corresponding to the blue segments) is selected.

2.3.2  Spatial interpolation

The numerical environmental field and the graph grid may possess varying resolutions and projections. Even if they were identical, the grid nodes might still be staggered. Moreover, it is necessary to establish a method for assigning the field values to the graph edges. For all these reasons, spatial interpolation of the environmental fields is essential.

https://gmd.copernicus.org/articles/17/4355/2024/gmd-17-4355-2024-f05

Figure 5 Spatial interpolation in VISIR-2. (a)  The squares represent grid nodes of the environmental field φ ( x ) , and the filled circles represent graph grid nodes. A graph edge is depicted as a magenta segment. (b)  Transect of (a)  along the edge direction e ^ , with the interpolator of φ as a solid grey line. The (0, 1) subscripts refer to the value of the Sint parameter, while h and t refer to the edge head and tail, respectively.

VISIR-2 first computes an interpolant using the scipy.interpolate.interp2d method. Then, to assign a representative value of the φ field on an edge, two options are available, which are depicted in Fig.  5 . In the first one or “Sint  =0 ”, an average between the edge head and tail values is computed, φ 0 = ( φ h + φ t ) / 2 . In the second one or “Sint  =1 ”, the field interpolator is evaluated at the location of the edge barycentre, φ 1 = φ ( x h + x t / 2 ) . As the field is generally nonlinear, this leads to different outcomes.

The two interpolation schemes were tested with various non-convex functions, and some results are reported in Sect. S0 of the Supplement. We observed that both options converge to a common value as the ( 1 / Δ x ) resolution of the graph grid increases. Thus, both options benefit from pruning collinear edges (Sect.  2.2.3 ), as they remove some longer edges from the graph, but neither demonstrates consistent superiority over the other in terms of fidelity.

However, setting Sint  =0 results in higher computational efficiency. This is because the interpolator is applied at each node with Sint  =0 , whereas it is applied at each edge with Sint  =1 . Given that the number of edges exceeds the number of nodes by a factor defined by Eq. ( 20 ), for the case studies ( 4 ≤ ν ≤ 5 ), the computational time for Sint  =0 was approximately 1 order of magnitude smaller than with Sint  =1 . Therefore, the latter was chosen as the default for VISIR-2.

The resulting edge-representative environmental field value affects the edge delay (Eq.  17 ), consequently impacting the vessel's speed as per Eqs. ( 5a ) and ( 5b ). Hence, a nonlinear relationship exists between the field value and the local sailing speed. Thus, the actual choice of the Sint parameter is not expected to systematically bias the vessel's speed in either direction.

Even before the spatial interpolation is performed, the so-called “sea-over-land” extrapolation is applied to the marine fields. This step, which is needed for filling the gaps in the vicinity of the shoreline, is conceptually performed as in Mannarini et al. ( 2016 a , Fig. 7) and implemented in the seaoverland function.

Since wave direction is a circular periodic quantity, we calculate its average using the circular mean ( https://en.wikipedia.org/wiki/Circular_mean , last access: 20 May 2024) ahead of interpolation. This differs from wind direction, typically given as Cartesian components ( u , v ), which can be interpolated directly.

2.4  Shortest-path algorithms

A major improvement made possible by the Python coding of VISIR-2 is the availability of built-in, advanced data structures such as dictionaries, queues, and heaps. They are key in the efficient implementations of graph-search algorithms ( Bertsekas ,  1998 ) . In particular, as data structures are used, Dijkstra's algorithm worst-case performance can improve from quadratic, 𝒪( N 2 ) , to linear–logarithmic, 𝒪( N log  N ) , where N is the number of graph nodes.

Nonetheless, Dijkstra's original algorithm exclusively accounted for static edge weights ( Dijkstra ,  1959 ) . When dynamic edge weights are present, Orda and Rom ( 1990 ) demonstrated that, in general, there are no computationally efficient algorithms. However, they also showed that, upon incorporating a waiting time at the source node, it is possible to keep the algorithmic complexity of a static problem. Given the assumption that the rate of variation in the edge delay δ t satisfies

an initial waiting time is not even unnecessary. This condition was assumed to hold in Mannarini et al. ( 2016 a ) for implementing a time-dependent Dijkstra's algorithm. That version of the shortest-path algorithm could not be used with an optimisation objective differing from voyage duration. As one aims to compute, for example, least-CO 2 routes, the algorithm requires further generalisation. This has been addressed in VISIR-2 via the pseudo-code provided in both Algorithms  1 and 2 . For its implementation in Python, we made use of a modified version of the single_source_Dijkstra function of the NetworkX Python library. The modification consisted in retrieving an edge weight at a specific time step. This is achieved via Algorithm  2 . In this, the cost.at_time pseudo-function represents a NetworkX method to access the edge weight information.

We note the generality of the pseudo-code with respect to the edge weight type ( w T parameter in both Algorithms  1 and 2 ). This implies that the same algorithm could also be used to compute routes that minimise figures of merit differing from CO 2 , such as different GHG emissions, cumulated passenger comfort indexes, or total amount of underwater radiated noise. This hinges solely on the availability of sufficient physical–chemical information to compute the corresponding edge weight in relation to the environmental conditions experienced by the vessel. A flexible optimisation algorithm is yet another novelty of VISIR-2.

The shortest-distance and the least-time algorithms invoked for both motor vessels and sailboats are identical. Differences occur at the post-processing level only, as different dynamical quantities (related to the marine conditions or the vessel kinematics) have to be evaluated along the optimal paths. Corresponding performance differences are evaluated in Sect. S1 of the Supplement.

Algorithm 1 _DIJKSTRA_TDEP.

Algorithm 2 GET_TIME_INDEX.

2.4.1  Non-FIFO

As previously mentioned, Dijkstra's algorithm can recover the optimal path in the presence of dynamic edge weights if Eq. ( 21 ) is satisfied. For cases where the condition is not met, Orda and Rom ( 1990 ) presented a constructive method for determining a waiting time at the source node. In this case, waiting involves encountering more favourable edge delay values, leading to the computation of a faster path. In other words, employing a first-in–first-out (FIFO) strategy for traversing graph edges may not always be optimal. This is why such a scenario is referred to as “non-FIFO”. We observe that condition Eq. ( 21 ) is violated when a graph edge, which was initially unavailable for navigation, suddenly becomes accessible. While this is a rather infrequent event for motor vessels (in Mannarini and Carelli ,  2019 b , non-FIFO edges were just 10 −6 of all graph edges), it is a more common situation for sailboats navigating in areas where the wind is initially too weak or within the no-go zone (Eq.  7 , Fig.  7 ). Indeed, the unavailability of an edge can be suddenly lifted as the wind strengthens or changes direction. However, under a FIFO hypothesis, the least-time algorithm would not wait for this improvement of the edge delay to occur. Rather, it would look for an alternative path that avoids the forbidden edge, potentially leading to a suboptimal path. In the case study of this paper, such a situation occurred for about 2 × 10 - 3 of the total number of sailboat routes; see Sects.  2.5.2 and S3.2.

2.5  Vessel modelling

At the heart of the VISIR-2 kinematics of Sect.  2.1 are the vessel forward and transversal speed in a seaway, Eqs. ( 5a )–( 5b ). In what follows, such a vessel performance function is also termed a “vessel model”.

In VISIR-1 the forward speed resulted, for motor vessels, from a semi-empirical parameterisation of resistances ( Mannarini et al. ,  2016 a ) and, for sailboats, from polar diagrams ( Mannarini et al. ,  2015 ) . The transversal speed due to leeway was neglected.

In VISIR-2 new vessel models were used, and just two of them are presented in this paper: a ferry and a sailboat. However, any other vessel type can be considered, provided that the corresponding performance curve is utilised in the Navi module (Table  4 , Fig.  8 ). The computational methods used to represent both the ferry and the sailboats are briefly described in Sect.  2.5.1 – 2.5.2 . All methods provide the relevant kinematic quantities and, where applicable, the emission rates in correspondence to discrete values of the environmental variables. Such a “lookup table” (LUT) was then interpolated to provide VISIR-2 with a function to be evaluated in the actual environmental (wave, currents, or wind) conditions. Additional LUTs can be used as well, and the relevant function for this part of the processing is vesselModels_identify.py .

The interpolating function was either a cubic spline (for sailboats) or the outcome of a neural-network-based prediction scheme (for the ferry). The neural network features are provided in Appendix  B . While the neural network generally demonstrated superior performance in fitting the LUTs (see Sect. S2 of the Supplement), it provided unreliable data in extrapolation mode, as shown in Figs.  6 – 7 . In contrast, the spline, when extrapolation was requested, returned the value at the boundary of the input data range.

2.5.1  Ferry

The ferry modelled in VISIR-2 was a medium-size Ro-Pax vessel whose parameters are reported in Table  2 .

Table 2 Principal parameters of the ferry.

local variable 'result' referenced before assignment python

1 kn  =  1.852 km h −1 .

A vessel's seakeeping model was used at the ship simulator at the University of Zadar, as documented in Mannarini et al. ( 2021 ) . Therein, additional details about both the simulator and the vessel can be found. The simulator applied a forcing from wind waves of significant wave height H s related to the local wind intensity V i by

This relationship was derived by Farkas et al. ( 2016 ) for the wave climate of the central Adriatic Sea. The simulator then recorded the resulting vessel speed, as well as some propulsion- and emission-related quantities. Leeway could not be considered by the simulator. The post-processed data feed the LUT to then be used for interpolating both STW and the CO 2 emission rate Γ as functions of significant wave height H s , relative wind-wave direction δ a = δ i , and fractional engine load χ . The results are displayed in Fig.  6 .

In a given sea state, the sustained speed is determined by the parameter χ . For head seas ( δ a =0 ° ) STW is seen to decrease with H s . The maximum speed loss varies from about 45 % of the calm water speed at χ =1 to about 70 % at χ =0.7 (Fig.  6 a). For χ =0.7 , the STW sensitivity to H s decreases from head ( δ a =0 °) to following seas ( δ a =180 °, Fig.  6 b). For this specific vessel, the increase in roll motion in beam seas, as discussed in Guedes Soares ( 1990 ) , and its subsequent impact on speed loss do not appear to constitute a relevant factor.

The Γ rate, which is on the order of 1  t  CO 2  h −1 , shows a shallow dependence on H s (Fig.  6 c), while it is much more critically influenced by both χ and δ a (Fig.  6 c, d).

https://gmd.copernicus.org/articles/17/4355/2024/gmd-17-4355-2024-f06

Figure 6 Ferry performance curve: in (a) , STW is shown as a function of significant wave height H s for head seas ( δ a =0 ° ), with engine load χ indicated by the marker colour. In (b) , STW is plotted as a function of δ a at a constant χ =0.7 , with H s represented by the colour variation. The lower panels  (c, d) display the CO 2 emission rate ( Γ ) with similar dependencies to in panels  (a) and (b) . Markers correspond to the LUT values, solid lines represent the spline interpolation, and dotted lines indicate the neural network's output.

2.5.2  Sailboat

Any sailboat described in terms of polars can in principle be used by VISIR-2. For the sake of the case study, a Bénétau First 36.7 was considered. Its hull and rigging features are given in Table  3 .

The modelling of the sailboat STW was carried out by means of the WinDesign velocity prediction program (VPP). The tool was documented in Claughton ( 1999 , 2003 ) and references therein. The VPP is able to perform a four-degrees-of-freedom analysis, taking into account a wide range of semi-empirical hydrodynamic and aerodynamic models. It solves an equilibrium problem by a modified multi-dimensional Newton–Raphson iteration scheme. The analysis considered the added resistance due to waves by means of the so-called “Delft method” based on the Delft Systematic Yacht Hull Series (DSYHS). Besides, the tool allows us to introduce response amplitude operators derived from other techniques as well, such as computational fluid dynamics. The wind-wave relationship was assumed to be given by Eq. ( 22 ). For each wind configuration (i.e. speed and direction), the optimal choice of sail set was considered. The main sail and the jib sail were considered for upwind conditions; otherwise the combination of main sail and spinnaker was used.

Table 3 Principal parameters of the sailboat (First 36.7).

local variable 'result' referenced before assignment python

Figure 7 Sailboat performance curve: forward speed F in  (a) and leeway speed L in  (b) are both plotted against the true wind angle δ i . Panel  (c)  shows the leeway angle α L obtained from Eq. ( 6 ). Marker and line colours represent wind magnitude V i . Data start at δ i = α 0 ( V i ) . Markers refer to the LUT, solid lines to spline interpolation, and dotted lines to the neural network's output. The colour bar also reports the LUT's minimum and maximum values printed in blue and red, respectively.

The outcome corresponds to Eqs. ( 5a ) and ( 5b ) and is provided in Fig.  7 . The no-go angle α 0 varies from 27 to 53° as the wind speed increases from 5 to 25  kn . At any true wind angle of attack δ i , the forward speed F increases with wind intensity, especially at lower magnitudes (Fig.  7 a). The peak boat speed is attained for broad reach ( δ i ≈135 °). Leeway magnitude L instead is at its largest for points of sail between the no-go zone ( δ i = α 0 ) and beam reach ( δ i =90 °); see Fig.  7 b. As the point of sail transitions from the no-go zone to running conditions, the leeway angle α L gradually reduces from 6 to 0°. This decrease follows a roughly linear pattern, as depicted in Fig.  7 c.

2.6  Visualisation

Further innovations brought in by VISIR-2 concern the visualisation of the dynamic environmental fields and the use of isolines.

To provide dynamic information via a static picture, the fields are rendered via concentric shells originating at the departure location. The shape of these shells is defined by isochrones. These are lines joining all sea locations which can be reached from the origin upon sailing for a given amount of time. This way, the field is portrayed at the time step the vessel is supposed to be at that location. Isochrones bulge along gradients of a vessel's speed. Such shells represent an evolution of the stripe-wise rendering introduced in VISIR-1.b ( Mannarini and Carelli ,  2019 b , Fig. 5) . The saved temporal dimensional of this plot type allows for its application in creating movies, where each frame corresponds to varying values of another variable, such as the departure date or engine load; see the “Video supplement” of this paper. This visual solution is another novelty introduced by VISIR-2.

In addition to isochrones, lines of equal distance from the route's origin (or “isometres”) and lines of equal quantities of CO 2 emissions (or “isopones”) are also computed. The name isopone is related to energy consumption (the Greek word means “equal effort”), which, for an internal combustion engine, the CO 2 emission is proportional to. Isopones bulge against gradients of emissions. Isometres do not bulge, unless some obstruction (shoals, islands, landmass in general) prevents straight navigation. Given that rendering is on a Mercator map, “straight” refers to a ship's movement along a constant bearing line. Isochrones correspond to the reachability fronts used in a model based on the level set equation (LSE) by Lolla ( 2016 ) .

2.7  Code modularity and portability

Software modularity has been greatly enhanced in VISIR-2. While in VISIR-1 modularity was limited to the graph preparation, which was detached from the main pipeline ( Mannarini et al. ,  2016 a , Fig. 8) , the VISIR-2 code is organised into many more software modules. Their characteristics are given in Table  4 , and the overall model workflow is shown in Fig.  8 .

https://gmd.copernicus.org/articles/17/4355/2024/gmd-17-4355-2024-f08

Figure 8 VISIR-2 workflow. Modules enclosed within thicker frames are intended for direct execution by the end user, while the other modules can be modified for advanced usage. The data flow occurs along the wavy arrow, with routine calls along the dashed line.

Table 4 VISIR-2 modules with their original names, purpose, and references within this paper. Module nos. 1–5 represent the core package and require the visir-venv virtual environment. Module no. 6 runs with visir _ vis-venv.

local variable 'result' referenced before assignment python

The modules can be run independently and can optionally save their outputs. Through the immediate availability of products from previously executed modules, this favours research and development activities. For operational applications (such as GUTTA-VISIR) instead, the computational workflow can be streamlined by avoiding the saving of the intermediate results. VISIR-2 module names are Italian words. This is done for enhancing their distinctive capacity; cf.  Wilson et al. ( 2014 ) . More details on the individual modules can be found in the user manual, provided as part of the present release ( Salinas et al. ,  2024 a ) .

A preliminary graphical user interface (GUI) is also available. In the version of VISIR-2 released here, it facilitates the ports' selection from the World Port Index ( https://msi.nga.mil/Publications/WPI , last access: 20 May 2024) database.

VISIR-2 was developed on macOS Ventura (13.x). However, both path parameterisation and the use of virtual environments ensure portability, which was successfully tested for both Ubuntu 22.04.1 LTS and Windows 11, on both personal computers and two distinct high-performance computing (HPC) facilities.

Validating a complex model like VISIR-2 is imperative. The code was developed with specific runs of VISIR-1 as a benchmark. The validation of VISIR-1 involved comparing its outcomes with both analytical and numerical benchmarks and assessing its reliability through extensive utilisation in operational services ( Mannarini et al. ,  2016 b ) .

Previous studies have compared VISIR-1 to analytical benchmarks for both static wave fields (“Cycloid”; Mannarini et al. ,  2016 a ) and dynamic currents (“Techy”; Mannarini and Carelli ,  2019 b ). Here, we present the results of executing the same tests with VISIR-2, at different graph resolutions, as shown in Table  5 . The errors are consistently found to be below 1 %.

Table 5 VISIR-2 route durations compared to analytic oracles (Cycloid and Techy), as referenced in the main text. L 0 and T 0 represent the length scales and timescales, respectively. The oracle durations are denoted by T ( e ) , while those from VISIR-2 are denoted by T * . The percentage mismatch is calculated as d T * = ( T * / T ( e ) ) - 1 .

local variable 'result' referenced before assignment python

1 nmi  =  1852 m.

Additionally, in Mannarini et al. ( 2019 b , Table II) , routes computed in dynamic wave fields were compared to the results from a model based on the LSE. For these specific runs of VISIR-2, the benchmarks were taken as LSE simulations at the nearest grid resolution. Notably, VISIR-2 consistently produces shorter-duration routes compared to VISIR-1.b (see Table  6 ).

Table 6 VISIR-2 vs. LSE durations. The relative error d T res * is defined as the discrepancy between T * and LSE at two different grid resolutions 1 / Δ x . Both VISIR-2 and VISIR-1 outcomes are provided.

local variable 'result' referenced before assignment python

For both analytical and numerical benchmarks, distinct from the scenario discussed in Sect.  2.2.3 , quasi-collinear edges were retained in the graphs.

During the tests mentioned earlier, the vessel's STW remained unaffected by vector fields. In instances where there was a presence of current vector fields (Techy oracle), they were merely added to STW, without directly impacting it. Therefore, the enhanced capability of VISIR-2 to accommodate angle-dependent vessel performance curves (cf. Eqs.  5a and 5b ) needs to be showcased.

To achieve this objective, the OpenCPN model was utilised. This model can calculate sailboat routes with or without factoring in currents and incorporates shoreline knowledge, though it does not consider bathymetry. For our tests, we provided VISIR-2 with wind and sea current fields identical to those used by OpenCPN (further details are provided in Sect.  5.1 ). Additionally, both models were equipped with the same sailboat polars. However, it is worth noting that OpenCPN does not handle leeway, whereas VISIR-2 can manage it. The VISIR-2 routes were computed on graphs of variable mesh resolution 1 / Δ x and connectivity ν , keeping fixed the “path resolution” parameter Δ P , which was introduced in Mannarini et al. ( 2019 b , Eq. 6) . This condition ensures that the maximum edge length remains approximately constant as the (Δ x , ν ) parameters are varied. Exemplary results are depicted in Fig.  9 , with corresponding metrics provided in Table  7 .

Table 7 VISIR-2 vs. OpenCPN comparison. Durations T * and relative mismatch d T * for the cases shown in Fig.  9 are provided. k =2 and Δ τ =15 min used throughout the numerical experiments.

local variable 'result' referenced before assignment python

Figure 9 VISIR-2 routes with wind and currents vs. OpenCPN: graphs of variable resolution, indexed by ν as shown in the legend, with a constant Δ P ∼0.3 °. Field intensity is in grey tones, and the direction is shown as black streamlines. Shell representation with isochrones is in dashed gold lines, and labels are in hours. The OpenCPN solution is plotted as a navy line. Panels  (a) and (b)  refer to the west- and eastbound voyage, respectively.

VISIR-2 routes exhibit topological similarity to OpenCPN routes, yet for upwind sailing, they require a larger amount of tacking (see Fig.  9 a). This discrepancy arises from the limited angular resolution of the graph (cf. Table  1 ). In the absence of currents, this implies a longer sailing time for VISIR-2 with respect to OpenCPN routes, ranging between 1.0 % and 3.4 %. However, as the graph resolution is increased, the route duration decreases. Notably, this reduction plateaus at ν =7 , indicating that such a resolution is optimal for the given path length. This type of comparison addresses the suggestion by Zis et al. ( 2020 ) to investigate the role of resolution in weather routing models. For a more thorough discussion of this particular aspect, please refer to Mannarini et al. ( 2019 b ) .

Downwind routes all divert northwards because of stronger wind there (Fig.  9 b). For these routes, the angular resolution does not pose a limiting factor, and VISIR-2 routes exhibit shorter durations compared to OpenCPN routes. Considering the influence of currents as well, VISIR-2 routes consistently prove to be the faster option, even for upwind sailing.

The disparities in duration between OpenCPN and VISIR-2 routes could be attributed to various factors, including the interpolation method used for the wind field in both space and time and the approach employed to consider currents. Delving into these aspects would necessitate a dedicated investigation, which is beyond the scope of this paper.

Numerical tests have been integrated into the current VISIR-2 release ( Salinas et al. ,  2024 a ) , covering the experiments listed in Tables  5 – 7 and beyond. These tests can be run using the Validazioni module.

The computational performance of VISIR-2 was evaluated using tests conducted on a single node of the “Juno” HPC facility at the Euro-Mediterranean Center on Climate Change (CMCC). This node was equipped with an Intel Xeon Platinum 8360Y processor, featuring 36 cores, each operating at a clock speed of 2.4 GHz, and boasting a per-node memory of 512 GB. Notably, parallelisation of the cores was not employed for these specific numerical experiments. Subsequently, our discussion here is narrowed down to assessing the performance of the module dedicated to computing optimal routes (“ Tracce ”) in its motor vessel version.

In Fig.  10 , we assess different variants of the shortest-path algorithm: least-distance, least-time, and least-CO 2 procedures. We differentiate between the core of these procedures, which focuses solely on computing the optimal sequence of graph nodes (referred to hereafter as the “Dijkstra” component), and the broader procedure (“total”), which also includes the computation of both marine and vessel dynamical information along the legs of the optimal paths. The spatial interpolation option used in these tests (Sint  =1 of Sect.  2.3.2 ) provides a conservative estimation of computational performance.

The numerical tests utilise the number of degrees of freedom (DOF) for the shortest-path problem as the independent variable. This value is computed as A ⋅ N τ , where A denotes the number of edges and N τ stands for the number of time steps of the fine grid (cf. Fig.  4 ). In the context of a sea-only edge graph, particularly in the case of a large graph (where border effects can safely be neglected), A can be represented as 4⋅ N q 1 ( ν ) , where N q 1 is defined by Eq. ( 20 ). Random edge weights were generated for graphs with ν =10 , resulting in a number of DOFs ranging between 10 5 and 10 9 . Each data point in Fig.  10 represents the average of three identical runs, which helps reduce the impact of fluctuating HPC usage by other users. Additionally, the computational performance of VISIR-2 is compared to that of VISIR-1b, as documented in Mannarini and Carelli ( 2019 b , Table 3, “With T-interp”) .

https://gmd.copernicus.org/articles/17/4355/2024/gmd-17-4355-2024-f10

Figure 10 Profiling of computing time for the Tracce module (motor vessel case). The independent variable is the number of DOFs (#DOF) in the graph. Markers refer to experimental data points and lines to least-square fits. Void markers and dashed lines refer to just Dijkstra's component, while full markers and solid lines refer to the whole of the each routine. The colours refer to the three alternative optimisation objectives, while black is used for VISIR-1.b results.

The primary finding is a confirmation of a power-law performance for all three optimisation objectives of VISIR-2: distance, route duration, and total CO 2 emissions. Remarkably, the curves appear nearly linear for the latter two algorithms (see Table  8 ). Such a scaling is even better than the linear–logarithmic worst-case estimate for Dijkstra's algorithms ( Bertsekas ,  1998 , Sect. 2.3.1) . Furthermore, this is not limited to just the Dijkstra components (as observed in VISIR-1.b) but extends to the entire procedure, encompassing the reconstruction of along-route variables. In addition to this enhanced scaling, VISIR-2 demonstrates an improved absolute computational performance within the explored DOF range. The performance gain is approximately a factor of 10 when compared to VISIR-1.b. This factor should even be larger when using the Sint  =0 interpolation option.

Digging deeper into the details, we observe that the least-distance procedure within VISIR-2, while exclusively dealing with static edge weights, exhibits a less favourable scaling behaviour compared to both the least-time and least-CO 2 procedures. This is attributed to the post-processing phase, wherein along-route information has to be evaluated at the appropriate time step. Further development is needed to improve on this. Additionally, tiny nonlinearities are seen for the smaller number of DOFs. However, as proven by the metrics reported in Table  8 , they do not affect the overall goodness of the power-law fits.

Lastly, it was found that peak memory allocation scales linearly across the entire explored range, averaging about 420  B per DOF. This is about 5 times larger than in VISIR-1b and should be attributed to the NetworkX structures used for graph representation. However, the large memory availability at the HPC facility prevented a possible degradation of performance for the largest numerical experiments due to memory swapping. A reduction in the unit memory allocation by a factor of 2 should be feasible using single-precision floating-point format. Another strategy would involve using alternative graph libraries, such as igraph .

Table 8 Fit coefficients of the T c = a ⋅ DOF b + c regressions for various components of Tracce , motor vessel version. “D” stands for Dijkstra's algorithm only, while “tot” includes the post-processing for reconstructing the voyage. p ( K ) is the p  value for the K coefficient. All data refer to VISIR-2 except the * _ V1b data, which refer to VISIR-1.b.

local variable 'result' referenced before assignment python

A more comprehensive outcome of the VISIR-2 code profiling, distinguishing also between the sailboat and the motor vessel version of the Tracce module, is provided in Sect. S1 of the Supplement.

A prior version of VISIR-2 has empowered GUTTA-VISIR operational service, generating several million optimal routes within the Adriatic Sea over the span of a couple of years. In this section, we delve into outcomes stemming from deploying VISIR-2 in different European seas. While the environmental fields are elaborated upon in Sect.  5.1 , the results are given in Sect.  5.2 , distinguishing by ferry and sailboat.

5.1  Environmental fields

The fields used for the case studies include both static and dynamic fields. The only static one was the bathymetry, extracted from the EMODnet product of 2022 ( https://emodnet.ec.europa.eu/en/bathymetry , last access: 20 May 2024). Its spatial resolution was 1 / 16  arcmin. The dynamic fields were the metocean conditions from both the European Centre for Medium-Range Weather Forecasts (ECMWF) and CMEMS. Analysis fields from the ECMWF high-resolution Atmospheric Model, 10 d forecast (Set I – HRES) with 0.1° resolution ( https://www.ecmwf.int/en/forecasts/datasets/set-i#I-i-a_fc , last access: 20 May 2024) were obtained. Both the u10m and v10m variables with 6-hourly resolution were used. From CMEMS, analyses of the sea state, corresponding to the hourly MEDSEA_ANALYSISFORECAST_WAV_006_017 product, and of the sea surface circulation, corresponding to hourly MEDSEA_ANALYSISFORECAST_PHY_006_013, both with 1 / 24 ° spatial resolution, were obtained. The wind-wave fields (vhm0 _ ww, vmdr _ ww) and the Cartesian components (uo, vo) of the sea surface currents were used, respectively. Just for the comparison of VISIR-2 to OpenCPN (see Sect.  3 ), 3-hourly forecast fields from ECMWF (0.4°, https://www.ecmwf.int/en/forecasts/datasets/open-data , last access: 20 May 2024) and 3-hourly Real-Time Ocean Forecast System (RTOFS) forecasts ( 1 / 12 °, https://polar.ncep.noaa.gov/global/about/ , last access: 20 May 2024) for surface currents (p3049 and p3050 variables for U and V , respectively) were used.

The kinematics of VISIR-2 presented in Sect.  2.1 do not limit the use to just surface ocean currents. This was just an initial approximation based on the literature discussed in Mannarini and Carelli ( 2019 b ) . However, recent multi-sensor observations reported in Laxague et al. ( 2018 ) at a specific location in the Gulf of Mexico revealed a significant vertical shear, in both magnitude (by a factor of 2) and direction (by about 90°), within the first 8  m . Numerical ocean models typically resolve this layer; for instance the aforementioned Mediterranean product of CMEMS provides four levels within that depth. These vertically resolved data hold the potential to refine the computation of a ship's advection by the ocean flow. A plausible approach could involve the linear superposition of vessel velocity with a weighted average of the current, also considering the ship's hull geometry.

5.2  Results

To showcase some of the novel features of VISIR-2, we present the outcomes of numerical experiments for both a ferry (as outlined in Sect.  2.5.1 ) and a sailboat (Sect.  2.5.2 ). All the results were generated using the interpolation options Sint  =0 (as elaborated upon in Sect.  2.3.2 ) and Tint  =2 (Sect.  2.3.1 ). These experiments considered the marine and atmospheric conditions prevailing in the Mediterranean Sea during the year 2022. Departures were scheduled daily at 03:00 UTC. The percentage savings ( d Q ) of a given quantity Q (such as the total CO 2 emissions throughout the journey or the duration of sailing) are computed comparing the optimal (“opt”) to the least-distance route (“gdt”):

5.2.1  Ferry

The chosen domain lies at the border between the Provençal Basin and the Ligurian Sea. Its sea state is significantly influenced by the mistral, a cold northwesterly wind that eventually affects much of the Mediterranean region during the winter months. The circulation within the domain is characterised by the southwest-bound Liguro–Provençal current and the associated eddies ( Schroeder and Chiggiato ,  2022 ) .

We conducted numerical experiments using VISIR-2 with a graph resolution given by ( ν , 1 / Δ x ) = ( 4 , 12 / ° ) , resulting in 2768 nodes and 114 836 edges within the selected domain. The time grid resolution was set at Δ τ =30 min and N τ =40 . A single iteration ( k =1 ) of Eq. ( A1 ) was performed. The ferry engine load factor χ was varied to encompass values of 70 %, 80 %, 90 %, and 100 % of the installed engine power. For each day, both route orientations, with and without considering currents, were taken into account. This led to a total of 5840 numerical experiments. The computation time for each route was approximately 4  min , with the edge weight and shortest-path calculations consuming around 30  s .

In Fig.  11 a an illustrative route is shown during a mistral event. As the ferry navigates against the wind, both its speed loss and its CO 2 emission rate reach their maximum levels (cf. Fig.  6 b, d). Consequently, both the least-time and the least-CO 2 algorithms calculate a detour into a calmer sea region where the combined benefits of improved sustained speed and reduced CO 2 emissions compensate for the longer path's costs. The least-CO 2 detour is wider than the least-time one, as the additional duration is compensated for by greater CO 2 savings. Moreover, these detours maximise the benefits from a southbound meander of the Liguro–Provençal current. Both optimal solutions intersect the water flow at points where it is narrowest, minimising the speed loss caused by the crosscurrent (cf. Eq.  16 ). Recessions of the isochrones become apparent starting at 6  h after departure. For this specific departure date and time, the overall reduction in CO 2 emissions, in comparison to the shortest-distance route, exceeds 35 %.

Figure  11 b illustrates that the magnitude of the related spatial diversion is merely intermediate, compared to the rest of 2022. Particularly during the winter months, the prevailing diversion is seen to occur towards the Ligurian Sea. Notably, VISIR-2 even computed a diversion to the east of Corsica, which is documented in Sect. S3.1 of the Supplement. In the “Video supplement” accompanying this paper, all the 2022 routes between Porto Torres and Toulon are rendered, along with relevant environmental data fields.

https://gmd.copernicus.org/articles/17/4355/2024/gmd-17-4355-2024-f11

Figure 11 The ferry's optimal routes between Porto Torres (ITPTO) and Toulon (FRTLN) with both waves and currents: (a)  for the specified departure date and time, the shortest-distance route is shown in blue, the least-time route in red, and the least-CO 2 route in green. The H s field is displayed in shades of grey with black arrows, while the currents are depicted in purple tones with white streamlines. The shortest-path algorithm did not utilise environmental field values within the etched area. Additionally, isochrones of the CO 2 -optimal route are shown at 3-hourly intervals. The engine load was χ =0.7 . (b)  A bundle of all northbound CO 2 -optimal routes (for χ = { 0.7 , 0.8 , 0.9 , 1.0 } ) is presented, with the line colour indicating the departure month.

To delve deeper into the statistical distribution of percentage CO 2 savings defined as in Eq. ( 23 ), Fig.  12 a provides a comparison with both the average significant wave height 〈 H s ( gdt ) 〉 and the absolute wave angle of attack 〈 | δ a ( gdt ) | 〉 along the shortest-distance route. Firstly, it should be noted that an increase in wave height can lead to either substantial or minimal CO 2 emission savings. This outcome depends on whether the prevailing wave direction opposes or aligns with the vessel's heading. When focusing on routes with a CO 2 saving of at least 2 %, it is seen that they mostly refer to either beam or head seas along the least-distance route. This corresponds to elevated speed loss and subsequent higher emissions, as reported in Fig.  6 b and d. This subset of routes shows a trend of larger savings in rougher sea states. Conversely, when encountering following seas with even higher H s , savings remain below 1 %. This is due to both a smaller speed reduction and a lower CO 2 emission rate. The counts of routes surpassing the 2 % saving threshold accounts for more than 1 / 10 of the total routes, the ones above the 10 % threshold, represent about 1 / 38 th of the cases. This implies that, for the given ferry and the specified route, double-digit percentage savings can be anticipated for about 10 calendar days per year.

The analysis of the CO 2 savings distribution can be conducted by also considering the role of the engine load factor χ , as depicted in Fig.  12 b. The distribution curves exhibit a bi-exponential shape, with the larger of the two decay lengths ( d 2 ) inversely proportional to the magnitude of χ ; cf. Table  10 . This relationship is connected to the observation of reduced speed loss at higher χ as rougher sea conditions are experienced, which was already noted in the characteristics of this vessel in Sect.  2.5.1 . The distribution's tail can extend to values ranging between 20 % and 50 %, depending on the specific value of χ .

Table 9 Average relative savings of the CO 2 -optimal vs. the least-distance route (in %), for various engine loads ( χ ), considering just waves (wa) or also currents (wa-cu), for ferry routes between Toulon (FRTLN) and Porto Torres (ITPTO) as in Fig.  11 . The χ -averaged values are also provided in the “Avg” columns.

local variable 'result' referenced before assignment python

Percentage CO 2 savings, broken down by sailing direction and considering the presence or absence of currents, are detailed in Table  9 . The average savings range from 0.6 % (1.0 % when considering sea currents) to 1.9 % (2.2 %). It is confirmed that the savings are more substantial on the route that navigates against the mistral wind (from Porto Torres to Toulon). However, the percentage savings are amplified when currents are taken into account, and this effect is particularly noticeable for the routes sailing in the downwind direction.

https://gmd.copernicus.org/articles/17/4355/2024/gmd-17-4355-2024-f12

Figure 12 Metrics relative to ferry routes pooled on sailing directions (FRTLN  ↔  ITPTO) and χ , using both waves and currents. (a)  Percentage savings, with the markers' grey shade representing the mean angle of attack along the least-distance route. The total number of routes, including those with relative CO 2 savings above 2 % (solid line) and 10 % (dashed), are also provided; (b)  Distributions of the CO 2 savings for each χ value, with fitted bi-exponential functions as in Table  10 . Each set of four columns pertains to a bin centred on the nearest tick mark and spanning a width of 5 %.

Table 10 Fit coefficients of y = a ⋅ [ exp ( - x / d 1 ) + b ⋅ exp ( - x / d 2 ) ] on the data of Fig.  12 b.

local variable 'result' referenced before assignment python

Further comments regarding the comparison of the CO 2 savings presented here with the existing literature can be found in Sect.  6 . While other works also hint at the presence of optimal route bundles, VISIR-2 marks the first comprehensive exploration of how CO 2 savings are distributed across various environmental conditions and engine loads.

5.2.2  Sailboat

The chosen area lies in the southern Aegean Sea, along a route connecting Greece (Monemvasia) and Türkiye (Marmaris). This area spans one of the most archipelagic zones in the Mediterranean Sea, holding historical significance as the birthplace of the term “archipelago”. The sea conditions in this area are influenced by the meltemi, prevailing northerly winds, particularly during the summer season. Such an “Etesian” weather pattern can extend its influence across a substantial portion of the Levantine basin ( Lionello et al. ,  2008 ; Schroeder and Chiggiato ,  2022 ) . On the eastern side of the domain, the circulation is characterised by the westbound Asia Minor Current, while on its western flank, two prominent cyclonic structures separated by the west Cretan anticyclonic gyre are usually found ( Theocharis et al. ,  1999 ) .

We performed numerical experiments with VISIR-2, with a graph resolution of ( ν , 1 / Δ x ) = ( 5 , 15 / ° ) , leading to 2874 nodes and 156 162 edges in the selected domain. The resolution of the time grid was Δ τ =30   min . Furthermore, N τ =120 time steps of the environmental fields and k =2 iterations for Eq. ( A1 ) were used. A First 36.7 sailboat was selected. For each day, both route orientations and all possible combinations of wind, current, and leeway were considered. This gave a total of 2920 numerical experiments. Each route required a total computing time of about 7  min , of which the edge weight and shortest-path computation amounted to 4  min , mainly spent on the edge weight computation. The excess time in comparison to the motor vessel's case study is attributed to both a higher value of N τ and the additional time required for accounting for the exclusion of the no-go zone of the sailboat shown in Fig.  7 .

In Fig.  13 a, a sailboat route is depicted for a specific departure date, superimposed on the wind and sea current patterns. Both the least-distance and least-time routes appropriately steer clear of continental or insular landmasses, with the time-optimal route opting for a more extensive detour. This adjustment is aimed at harnessing more favourable winds and circumventing unfavourable or cross currents, culminating in a remarkable 14.6 % reduction in route duration.

Moving to Fig.  13 b, the collective set or “bundle” of eastbound routes is presented. Unlike the ferry routes showcased in Fig.  11 b, it proves more challenging to discern a distinct seasonal pattern for the diversions of the sailboat routes. A metric for measuring diversions, such as the Fréchet distance utilised in Mannarini et al. ( 2019 a ) , could facilitate the identification of patterns. The corresponding return routes are shown in Sect. S4.2 of the Supplement, confirming this trend. The bundles indicate that also accounting for currents leads to a more expansive set of optimal routes.

In only five cases (constituting 1.7 × 10 - 3 of all sailboat routes), the least-time route was discovered to be slower than the least-distance route. These instances are scrutinised in Sect. S3.2 of the Supplement. The apparent inconsistency arises from the fact that these least-time routes arrive at certain intermediate waypoints earlier but encounter less favourable sailing conditions compared to those encountered by the least-distance routes arriving later. This discrepancy points to a non-FIFO situation (refer to Sect.  2.4.1 ). This scenario necessitates advancements in the least-time algorithm to accommodate dynamic edge weights, potentially incorporating an initial waiting time, as discussed in Orda and Rom ( 1990 ) .

https://gmd.copernicus.org/articles/17/4355/2024/gmd-17-4355-2024-f13

Figure 13 The sailboat's optimal routes between GRMON and TRMRM, considering both wind and currents: (a)  for the specified departure date and time, the least-time route is depicted in red, and the shortest-distance one is in blue. The wind field is represented in shades of grey with black arrows, while the currents are shown in purple tones with white streamlines. Additionally, isochrones of the time-optimal route are displayed at 6-hourly intervals. (b)  A bundle of all eastbound time-optimal routes is presented, with the line colour indicating the departure month.

A statistical evaluation of the time savings resulting from the optimisation process for sailboat routes is illustrated in Fig.  14 a. Thereby, Eq. ( 23 ) is employed to assess both the path length and duration percentage savings. The −d T savings are generally proportional to path lengthening d L , particularly under nearly upwind conditions along the least-distance route, i.e. where 〈 | δ i ( gdt ) | 〉 ∼ α 0 (cf. Eq.  7 ). This is understandable, as reduced sustained speeds and extended edge sailing times occur when wind originates from sectors close to the no-go zone, as depicted in Fig.  7 a.

It is important to acknowledge that, under excessively weak or consistently sustained upwind conditions, a sailboat route might become unfeasible. A quantitative overview of such “failed” routes is provided in Table  11 . It is evident that, thanks to the spatial diversions introduced by the route optimisation process, the likelihood of a least-time route failing, compared to the least-distance one, is reduced by a factor of approximately 100. In the “Video supplement” accompanying this paper, all sailboat routes between Monemvasia and Marmaris in 2022, along with the corresponding environmental fields, are included.

In Fig.  14 b, the impact of currents and leeway is assessed. The influence of currents leads to a change in duration of up to approximately 5 % when compared to routes affected solely by the wind. Categorising the data based on sailing direction (as presented in Sect. S5 in the Supplement), currents primarily contribute to shorter route durations for westbound courses (benefiting from the Asia Minor Current). Conversely, they primarily result in extended durations for eastbound routes, particularly where, to the north of the island of Rhodes, there is no alternative but to sail against the current.

Turning to leeway, when not in combination with currents, it consistently extends the duration of routes, particularly, as indicated in the Supplement, when facing upwind conditions (more likely for westbound routes), as the speed loss is exacerbated due to a higher leeway speed (region with δ i ∼ α 0 in Fig.  7 b).

As in our earlier comment in Sect.  2.1 , the impact of leeway is mainly provided by its cross-course component, which invariably decreases the vessel's SOG. Notably, the longitudinal component is smaller than the cross one by a tan  δ factor; cf. Eq. ( 17 ). With δ estimated from Eq. ( 14 ) and Fig.  7 b to fall within a range of a few degrees, the along-edge projection of leeway, w ∥ ( L ) , measures approximately 1 / 10 of the transversal one, w ⊥ ( L ) .

When both effects, currents and leeway, are considered together, the distribution of duration changes in comparison to wind-only routes resembles the distribution for the case with currents only. However, due to the impact of leeway, it is slightly skewed towards longer durations.

Finally in Table  11 time savings averaged throughout the year are presented. These savings are further categorised based on the direction of sailing and the specific combination of effects, including wind, currents, and leeway. The impact of sea currents generally increases the percentage duration savings from 2.4 % (the directional average of the wind-only or wind and leeway cases) to 3.2 % (the average across all results affected by sea currents). We observe that routes featuring prevailing upwind conditions and favourable westbound currents, while also accounting for leeway, typically yield greater percentage duration savings compared to corresponding eastbound routes. This outcome can be attributed to the increase in duration of the least-distance route, which results from the loss of sailboat manoeuvrability as the no-go zone is approached. It is also noted that the number of failed routes increases in the presence of leeway during upwind sailing. More statistical metrics are provided in Table S9 of the Supplement. Finally we observe that, in VISIR-2, rigging is regarded as fixed (cf. Table  3 ), whereas in actual sailing practice, it may be optimised based on both the wind intensity and the point of sail.

https://gmd.copernicus.org/articles/17/4355/2024/gmd-17-4355-2024-f14

Figure 14 Metrics of the sailboat's optimal routes pooled on sailing directions (GRMON  ↔  TRMRM). (a)  Duration percentage savings −d T vs. relative lengthening d L considering just wind: the markers' grey shade represents the average angle of attack of wind | 〈 δ i ( gdt ) 〉 | along the least-distance route. The number of data (#data) is given by ∑ d 365 - N f ( g ) , where d represents the two sailing directions and the N f ( g ) values are from the first row in Table  11 . (b)  Histograms of relative route duration T f , with environmental forcing combination f defined by the column colour, with respect to the duration T wi of the wind-only optimal routes.

Table 11 Average time savings of the sailboat routes (in %), considering just wind (wi) or also various combinations of currents (cu) and leeway (le) for the sailboat routes between Monemvasia (GRMON) and Marmaris (TRMRM) as in Fig.  13 . The number of failed routes for the least-distance N f ( g ) or the least-time routes N f ( o ) is also provided.

local variable 'result' referenced before assignment python

In this section, we critically compare the CO 2 savings achieved in Sect.  2.5.1 for the ferry's optimal routes with those reported in the ship weather routing literature (Sect.  6.1 ). Furthermore, we explore potential applications and users of VISIR-2 (Sect.  6.2 ) and provide some insights into possible developments (Sect.  6.3 ).

6.1  Comparing CO 2 savings with the literature

Only a handful of peer-reviewed papers have reported results on emission savings through ship routing, yet a few of these findings are reviewed here for comparison with VISIR-2's results.

For the ferry case study examined in this paper, the CO 2 emissions can be halved compared to those along the least-distance route in the best case (Fig.  12 ). This is in numerical agreement with the broad (0.1–48) % range reported in Bouman et al. ( 2017 , Table 2) . Notably, the upper limit reduction stands as an outlier, with the more probable values depicted in Bouman et al. ( 2017 , Fig. 2) falling below 10 %. This aligns well with the results obtained from the statistical distribution of VISIR-2 experiments, presented in both Fig.  12 b and Table  9 of this paper.

Applying the VOIDS model, Mason et al. ( 2023 a , Sect. 3.2) discovered that, for eastbound routes of a Panamax bulk carrier in the North Atlantic, voyage optimisation contributed to carbon savings ranging from 2.2 % to 13.2 %. This is a narrower range compared to the present findings of VISIR-2 (cf. Fig.  12 ). However, both a different vessel type (a ferry) and a different domain of sailing (the western Mediterranean Sea) were considered in our numerical experiments.

Miola et al. ( 2011 ) presented data from the second IMO GHG study, where the estimated CO 2 abatement potential for weather routing on the emissions of 2020 was reported to be as low as 0.24 %. In the same paper, a DNV study on projected emissions in 2030 was also cited, providing an estimate of 3.9 % for the CO 2 abatement potential through weather routing. The former figure compares well to the average emission reduction computed via VISIR-2 for the ferry downwind conditions and high engine load and the latter to results for upwind and low engine load (cf. Table  9 ).

Lindstad et al. ( 2013 ) estimated the reduction in CO 2 emissions for a dry bulk Panamax vessel navigating in head seas during a typical stormy period in the North Atlantic. This reduction was determined when sailing on a 4500 nmi (nautical miles; 8300 km) route compared to the shorter (yet stormier) least-distance route of 3600  nmi (6700 km). They found reductions ranging from 11 % to 48 %, depending on the speed of the vessel.

We note that, as for example in Mason et al. ( 2023 a , Fig. 7) , VISIR-2 optimal routes also exhibit spatial variations contingent on the departure date, forming a bundle as illustrated in Fig.  11 b and Sect. S4 of the Supplement. The shape of route boundaries was assessed for the United States’ Atlantic coast routes by means of AIS data in Breithaupt et al. ( 2017 ) . However, while multimodal distributions depending on sailing direction were noted, the authors did not attribute the preferential lanes to the presence of ocean currents but speculated that it was due to bathymetric constraints or artificial aids to navigation.

VISIR possesses a capability to incorporate ocean currents into the voyage optimisation process. As shown in Mannarini and Carelli ( 2019 b ) , this integration has proven to significantly reduce the duration of transatlantic routes. In the present paper, we reaffirm the positive impact of currents on ship route optimisation, also extending their benefits to the reduction in CO 2 emissions (Table  9 ) and to the determination of more faithful duration savings for sailboat routes (Table  11 ).

In general, both average and extreme CO 2 emission percentage savings found in the literature align well with the results obtained in the ferry case study presented in our paper. Nevertheless, engaging in a meaningful discussion of numerical differences, given the diverse range of vessel types, routes, environmental fields, and computational methods employed in the various published case studies, proves challenging.

VISIR-2 contributes to the existing body of literature by providing an open computational platform that facilitates the simulation of optimal ship routes in the presence of waves, currents, and wind. These simulations are designed to be transparent, with customisable sea domain and vessel performance curves, allowing for thorough inspection, modification, and evaluation. This addresses the concern raised by Zis et al. ( 2020 ) regarding the necessity of benchmarking instances of optimal routes and the associated input data. By providing such benchmarks, VISIR-2 supports and streamlines the work of future researchers in the field. Hence, we believe that the critical task of evaluating inter-model differences will best be addressed through dedicated inter-comparison studies, as previously demonstrated with VISIR-1 ( Mannarini et al. ,  2019 b ) .

6.2  Potential uses of VISIR-2

Given its open-source nature, validated results, and numerical stability, VISIR-2 can have great utility across various fields. The fact that both motor vessels and sailboats are treated equally will make VISIR-2 suitable for use in weather routing of vessels with wind-assisted propulsion.

Moreover, VISIR-2 can serve as a valuable tool for regulatory bodies seeking to make informed policies on shipping. As previously outlined, agencies like the European Maritime Safety Agency (EMSA), which oversee systems for monitoring, reporting, and verifying emissions, could utilise the model – provided that vessel performance curves and GHG emission rates are available – to calculate baseline emissions for various vessel and GHG types. With the inclusion of shipping in the EU-ETS, shipowners, ship managers, or bareboat charterers – whoever bears the fuel cost – are mandated to surrender allowances for their emissions. These stakeholders may find it beneficial to explore open-source solutions alongside existing commercial options.

VISIR-2 also has the potential to help reduce uncertainty regarding the effectiveness of weather routing in reducing CO 2 emissions ( Bullock et al. ,  2020 ) . For instance, evaluating distributions as in Fig.  12 b, it becomes possible to characterise the joint potential of sea domains and vessel types for GHG emission savings. This concept also aligns with the idea of a “green corridor of shipping”, as envisioned by both the Clydebank Declaration ( gov.uk ,  2021 ) and the United States Department of State ( DoS ,  2022 ) . In these initiatives, VISIR-2, thanks to the generality of its optimisation algorithm (Algorithms  1 , 2 ), could play a crucial role in minimising the consumption of costly zero-carbon fuel.

Furthermore, VISIR-2 could be used to generate a dataset of optimal routes for the training of artificial intelligence systems for autonomous vessels ( Li and Yang ,  2023 ) , surpassing the shortcomings of using AIS tracks, which include incomplete coverage ( Filipiak et al. ,  2020 ) . Finally, we note that, as open-source software, VISIR-2 can even have educational purposes, providing training opportunities for ship officials and maritime surveillance authorities, as well as for beginner sailors.

6.3  Outlook

There are several possible avenues for future developments of VISIR-2: the computer science, the algorithms, the ocean engineering, and the environmental fields.

First, as mentioned in Sect.  4 , some computational performance improvements for the least-distance procedure should be feasible. In applications where large domains, hyper-resolution, or multiple-input environmental fields are required, it will be necessary to devise a solution that effectively reduces the computer's memory allocation. To further enhance modularity of VISIR-2, future developments can focus on object-oriented programming principles. Containerisation of VISIR-2 is currently underway as part of the development of a digital twin of the ocean ( https://www.edito-modellab.eu/ , last access: 20 May 2024).

Further algorithmic work could address, for instance, construction of the graph directly in the projection space, facilitating the presence of more isotropic ship courses and perfectly collinear edges (cf. Sect.  2.2.2 ); development of an algorithm for given-duration, least-CO 2 routes; incorporation of multi-objective optimisation techniques ( Szlapczynska ,  2015 ; Sidoti et al. ,  2017 ) ; generalisation of the least-time algorithm to non-FIFO situations (cf. Sect.  2.4.1 ); and consideration of tacking time and motor assistance for sailboats or WAPSs.

Transitioning to upgrades in ocean engineering for VISIR-2, the focus could shift towards targeting large ocean-going vessels, contingent upon the availability of related performance curves. Safety constraints on vessel intact stability ( IMO ,  2018 b ) ; considerations of slamming, green water, and lateral acceleration ( Vettor and Guedes Soares ,  2016 ) ; passenger comfort as highlighted by Carchen et al. ( 2021 ) ; or vessel performance in the presence of cross seas could be integrated. Second-generation intact stability criteria ( Begovic et al. ,  2023 ) could be accounted for through a dynamic masking of the graph. VISIR-2's readiness for wind-assisted ship propulsion hinges on the availability of an appropriate vessel performance curve that accounts for the added resistance from both wind and waves.

In terms of environmental data, it should be feasible to extend beyond the reliance on surface currents alone by incorporating the initial few depth layers of ocean models. Furthermore, VISIR-2 currently operates under the assumption of having perfect knowledge of meteo-oceanographic conditions, which is provided through forecast fields for shorter voyages or analysis fields for longer ones. The latter corresponds to retracked routes as discussed in Mason et al. ( 2023 b ) . However, for real-time applications during extended voyages, it is essential to incorporate adaptive routing strategies. This entails using the latest forecasts to execute re-routing as needed.

This paper presented the development of VISIR-2: a modular, validated, and portable Python-coded model for ship weather routing. It provides a consistent framework for both motor vessels and sailboats by accounting for dynamic environmental fields such as waves, currents, and wind. The model can compute optimal ship routes even in complex and archipelagic domains. A cartographic projection, a feature that had been overlooked up to now, has been introduced in VISIR-2. The model provides, for vessels with an angle-dependent performance curve, an improved level of accuracy in the velocity composition with sea currents. It is found that heading and course differ by an angle of attack, which is given by the solution of a transcendental equation (Eq.  13 ) involving an effective flow being the vector sum of currents and leeway. A computationally inexpensive iterative solution has been devised (Appendix  A ). Furthermore, a variant of Dijkstra's algorithm is introduced and used, which can minimise not just the CO 2 emissions but any figure of merit depending on dynamic edge weights (cf. Algorithms  1 , 2 ).

The validation of VISIR-2 included comparisons to oracles and two inter-comparison exercises. Differently from the few available ship weather routing packages or services, the VISIR-2 software is accompanied by comprehensive documentation, making it suitable for community use.

The computational performance of the VISIR-2 shortest-path module displayed a significant enhancement compared to its predecessor, VISIR-1 (Sect.  4 ). A quasi-linear scaling with problem complexity was demonstrated for up to 1×10 9  DOFs. The robustness of VISIR-2 was demonstrated across thousands of flawless route computations.

While the model is general with respect to vessel type, two case studies with VISIR-2, based on realistic vessel seakeeping models, were documented in this paper.

From nearly 6000 routes of a 125 m long ferry, computed considering both waves and currents in the northwestern Mediterranean, average CO 2 savings between 0.6 % and 2.2 %, depending on the engine load and prevailing sailing direction, were found. The distribution of the savings was bi-exponential, with the longer decay length becoming more pronounced at lower engine loads. This implied in particular that two-digit percentage CO 2 savings, up to 49 %, were possible for about 10 d annually. This statistical distribution sheds new light on the underlying factors contributing to the variability observed in the role of weather routing, as reported in previous review studies ( Bouman et al. ,  2017 ; Bullock et al. ,  2020 ) . Furthermore, our findings bear significance for both the environmental impact of greenhouse gas emissions and the financial considerations within the EU-ETS.

From close to 3000 routes of an 11 m sailboat, within the southern Aegean Sea, accounting for both wind and currents, an average sailing time reduction of 2.4 % was observed. When considering currents as a factor, the duration of optimal routes could further be reduced by 3.2 %. Additionally, confirming prior work by Sidoti et al. ( 2023 ) , disregarding the role of leeway would lead to an incorrect estimation of the route duration in upwind conditions. Several cases of non-FIFO behaviour were detected, and there is potential for addressing them in the future through the refinement of the current least-time algorithm. All of these discoveries hold the potential to influence not just sailboat racing but also the utilisation of wind to aid in the propulsion of motor vessels.

In summary, this paper provides comprehensive documentation of the scientific hypotheses and decisions underpinning the development of an open-source ship routing model while also contributing to the quantification of achievable reductions in greenhouse gas emissions through voyage optimisation.

The angle δ between the ship's heading and course is obtained from the transcendental equation, Eq. ( 13 ). Its solution can be approximated by the following iteration:

where k is the number of iterations of the function

with γ being a constant resulting from the use of Eq. ( 2 ). The k =1 case corresponds to the solution provided in Mannarini and Carelli ( 2019 b ) .

https://gmd.copernicus.org/articles/17/4355/2024/gmd-17-4355-2024-f15

Figure A1 Approximate vs. exact solution of Eq. ( 13 ) for a First 36.7 sailboat. (a)  Iterative solution of Eq. ( A1 ) with k =1 vs. the exact solution, using ω ⊥ as the marker colour; (b)  unexplained variance ( R is the Pearson's correlation coefficient) of the linear regression and fitted slope coefficient for various k  values.

Both Eqs. ( 13 ) and ( A1 ) were evaluated for a sailboat as in Sect.  2.5.2 using environmental conditions (wind, currents) for a domain in the central Adriatic Sea. A total of 11 hourly time steps and 18 474 edges from a graph with ( ν , 1 / Δ x ) = ( 4 , 12 / ° ) were considered, resulting in a total of about 2×10 5 edge weight values. The iterative solution from Eq. ( A1 ) was compared to the roots of Eq. ( 13 ) found via the scipy.optimize.root solver, using as an initial guess the δ (1) solution of Eq. ( A1 ) (see the velocity_eval.py function in the VISIR-2 code). In what follows, the numerical solution from the solver is termed “exact”. The benefit of the approximated solution Eq. ( A1 ) is that it can easily be parallelised on all graph arcs, while this is not possible for the exact solution, which processes one arc at a time.

The outcome for a sailboat is provided in Fig.  A1 a. It is seen that the iterative approximation departs from the exact solution for δ angles larger than about 5°. Such departures are mainly related to the effective cross flow ω ⊥ (marker colour, determining the elongation from the origin). However, it is just a tiny fraction of the edges that present such departures, so the R 2 correlation coefficient between the exact solution and its approximation is almost identical to 1 for any k >0 , as shown in Fig.  A1 b.

The case k =0 corresponds to neglecting the loss of ships' momentum to balance the effective cross flow of Eq. ( 11b ). Therefore, it wrongly underestimates the sailing times. For the First 36.7 sailboat under consideration here, the k =1 solution leads to a slope about 5 % off. Already for k =2 the correct slope is achieved within an error of 2 ‰. For the ferry, the k =1 iteration is sufficient to reach a 2 % accuracy; see Sect. S6.1 in the Supplement. This could be due to the ferry having a smoother angular dependence than the sailboat's one, as seen from Figs.  6 b and 7 a. Finally, in Fig. S22 of the Supplement, evidence of the validation of the exact solution in the absence of currents, Eq. ( 14 ), is also provided.

For identifying the vessel performance curves from a LUT via a neural network, a multi-layer perceptron was used.

The models were built and trained via the scikit-learn package ( https://scikit-learn.org/stable/ , last access: 20 May 2024). A 3-fold cross-validation was used to identify the best model for each vessel performance function. Different solvers, hidden layers' sizes, L2 regularisation terms, and activation functions were explored, covering a search space of about 10 3 models. The optimal configuration made use of the rectified linear unit activation function, the Adam optimiser to minimise mean-squared error, for at most 10 3 passes through the training set (“epochs”) with a batch size of 200, a constant learning rate of 10 −4 , and early stopping after the validation loss fails to decrease for 10 epochs.

The source code of VISIR-2 is available from Salinas et al. ( 2024 a ) ( https://doi.org/10.5281/zenodo.10960842 ). The distribution includes a user manual. Raw data in the form of input datasets and graphs used for the route computations are available from Salinas et al. ( 2024 b ) ( https://doi.org/10.5281/zenodo.10674079 ). Intermediate data products in the form of routes for producing figures and tables in Sect.  5 are available from Salinas et al. ( 2024 c ) ( https://doi.org/10.5281/zenodo.10674082 ).

Videos for this paper are available at https://doi.org/10.5446/s_1687 (ferry case study, Salinas ,  2024 a ) and https://doi.org/10.5446/s_1688 (sailboat, Salinas ,  2024 b ).

The supplement related to this article is available online at:  https://doi.org/10.5194/gmd-17-4355-2024-supplement .

GM: conceptualisation, funding acquisition, methodology, project administration, supervision, validation, writing (original draft), writing (review and editing); MLS: data curation, investigation, software, validation, visualisation; LC: data curation, investigation, software, validation, visualisation; NP: investigation, resources; JO: investigation, resources.

The contact author has declared that none of the authors has any competing interests.

The authors are not liable for casualties or losses that may occur in using routes computed via VISIR-2 for navigation purposes. Publisher's note: Copernicus Publications remains neutral with regard to jurisdictional claims made in the text, published maps, institutional affiliations, or any other geographical representation in this paper. While Copernicus Publications makes every effort to include appropriate place names, the final responsibility lies with the authors.

Both ChatGPT-3 and Gemini were utilised to review sections of this paper for English-language accuracy.

This research has been supported by Interreg (grant nos. 10043587 and 10253074) and Horizon Europe (grant nos. 101093293 and 101138583).

This paper was edited by David Ham and reviewed by two anonymous referees.

Al-Aboosi, F. Y., El-Halwagi, M. M., Moore, M., and Nielsen, R. B.: Renewable ammonia as an alternative fuel for the shipping industry, Current Opinion in Chemical Engineering, 31, 100670, https://doi.org/10.1016/j.coche.2021.100670 , 2021.  a

Begovic, E., Bertorello, C., Rinauro, B., and Rosano, G.: Simplified operational guidance for second generation intact stability criteria, Ocean Eng., 270, 113583, https://doi.org/10.1016/j.oceaneng.2022.113583 , 2023.  a

Bentley, J. L.: Multidimensional binary search trees used for associative searching, Communications of the ACM, 18, 509–517, 1975.  a

Bertsekas, D.: Network Optimization: Continuous and Discrete Models, Athena Scientific, Belmont, Mass. 02178-9998, USA, 1998.  a , b , c , d , e

Bouman, E. A., Lindstad, E., Rialland, A. I., and Strømman, A. H.: State-of-the-art technologies, measures, and potential for reducing GHG emissions from shipping – A review, Transport. Res. D-Tr. E., 52, 408–421, https://doi.org/10.1016/j.trd.2017.03.022 , 2017.  a , b , c , d

Breithaupt, S. A., Copping, A., Tagestad, J., and Whiting, J.: Maritime Route Delineation using AIS Data from the Atlantic Coast of the US, J. Navigation, 70, 379–394, https://doi.org/10.1017/S0373463316000606 , 2017.  a

Breivik, Ø. and Allen, A. A.: An operational search and rescue model for the Norwegian Sea and the North Sea, J. Marine Syst., 69, 99–113, 2008.  a

Bullock, S., Mason, J., Broderick, J., and Larkin, A.: Shipping and the Paris climate agreement: a focus on committed emissions, BMC Energy, 2, 5, https://doi.org/10.1186/s42500-020-00015-2 , 2020.  a , b , c

Carchen, A., Gaggero, T., Besio, G., Mazzino, A., and Villa, D.: A method for the probabilistic assessment of the on-board comfort on a passenger vessel route, Ocean Eng., 225, 108702, https://doi.org/10.1016/j.oceaneng.2021.108 , 2021.  a

Claughton, A.: Developments in the IMS VPP Formulations, in: Fourteenth Chesapeake sailing yacht symposium, Annapolis, Maryland, 1–20, 1999.  a

Claughton, A. R.: Developments in hydrodynamic force models for velocity prediction programs, in: Proceedings of the International Conference The Modern Yacht, The Royal Institution of Naval Architects, RINA, Paper: P2003-4 Proceedings, ISBN 0 903055 91 0, 2003.  a

Dijkstra, E. W.: A note on two problems in connexion with graphs, Numerische Mathematik, 1.1, 269–271, https://doi.org/10.1145/3544585.3544600 , 1959.  a

DoS: Green Shipping Corridors Framework, Tech. rep., US Department of State, https://www.state.gov/green-shipping-corridors-framework/ (last access: 20 May 2024), 2022.  a

Faber, J., van Seters, D., and Scholten, P.: Shipping GHG emissions 2030: Analysis of the maximum technical abatement potential, Tech. rep., CE Delft, 2023.  a

Farkas, A., Parunov, J., and Katalinić, M.: Wave statistics for the middle Adriatic Sea, Pomorski zbornik, 52, 33–47, https://doi.org/10.18048/2016.52.02 , 2016.  a

Feeman, T. G.: Portraits of the Earth: A mathematician looks at maps, American Mathematical Soc., 18, 62–64, ISBN 0-8218-3255-7, 2002.  a

Filipiak, D., Węcel, K., Stróżyna, M., Michalak, M., and Abramowicz, W.: Extracting Maritime Traffic Networks from AIS Data Using Evolutionary Algorithm, Bus. Inf. Syst. Eng., 62, 435–450, https://doi.org/10.1007/s12599-020-00661-0 , 2020.  a

gov.uk: Clydebank Declaration, Tech. rep., UK Department for Transport, https://www.gov.uk/government/publications/cop-26-clydebank-declaration-for-green-shipping-corridors (last access: 20 May 2024), 2021.  a

Guedes Soares, C.: Effect of heavy weather maneuvering on the wave-induced vertical bending moments in ship structures, J. Ship Res., 34, 60–68, 1990.  a

IMO: MEPC.304(72) Initial IMO strategy on reduction of GHG emissions from ships, Tech. Rep. Annex 11, International Maritime Organization, London, UK, 2018a.  a

IMO: SDC 5/J/7 Finalization of second generation intact stability criteria, Tech. rep., International Maritime Organization, London, UK, 2018b.  a

IMO: MEPC.80/(WP.12) Report of the Working Group on Reduction of GHG Emissions from Ships Report of the Working Group on Reduction of GHG Emissions from Ships, Tech. rep., International Maritime Organization, London, UK, 2023.  a

IPCC: Sixth Assessment Report, WG3, Ch.10, Tech. rep., IPCC, https://www.ipcc.ch/report/ar6/wg3/ (last access: 20 May 2024), 2022.  a

IPCC: AR6 Synthesis Report: Climate Change 2023, Tech. rep., IPCC, https://www.ipcc.ch/report/ar6/syr/ (last access: 20 May 2024), 2023.  a

Ladany, S. P. and Levi, O.: Search for optimal sailing policy, European J. Oper. Res., 260, 222–231, https://doi.org/10.1016/j.ejor.2016.12.013 , 2017.  a

Laxague, N. J., Özgökmen, T. M., Haus, B. K., Novelli, G., Shcherbina, A., Sutherland, P., Guigand, C. M., Lund, B., Mehta, S., Alday, M., and Molemaker, J.: Observations of near-surface current shear help describe oceanic oil and plastic transport, Geophys. Res. Lett., 45, 245–249, 2018.  a

Le Goff, C., Boussidi, B., Mironov, A., Guichoux, Y., Zhen, Y., Tandeo, P., Gueguen, S., and Chapron, B.: Monitoring the greater Agulhas Current with AIS data information, J. Geophys. Res.-Oceans, 126, e2021JC017228, https://doi.org/10.1029/2021JC017228 , 2021.  a

Li, H. and Yang, Z.: Incorporation of AIS data-based machine learning into unsupervised route planning for maritime autonomous surface ships, Transport. Res. E-Log., 176, 103171, https://doi.org/10.1016/j.tre.2023.103171 , 2023.  a

Lindstad, H., Asbjørnslett, B. E., and Jullumstrø, E.: Assessment of profit, cost and emissions by varying speed as a function of sea conditions and freight market, Transport. Res. D-Tr. E., 19, 5–12, https://doi.org/10.1016/j.trd.2012.11.001 , 2013.  a

Lionello, P., Cogo, S., Galati, M., and Sanna, A.: The Mediterranean surface wave climate inferred from future scenario simulations, Global Planet. Change, 63, 152–162, https://doi.org/10.1016/j.gloplacha.2008.03.004 , 2008.  a

Lolla, S. V. T.: Path planning and adaptive sampling in the coastal ocean, Ph.D. thesis, Massachusetts Institute of Technology, http://hdl.handle.net/1721.1/103438 (last access: 20 May 2024), 2016.  a

Maneewongvatana, S. and Mount, D. M.: It's okay to be skinny, if your friends are fat, in: Center for geometric computing 4th annual workshop on computational geometry, 2, 1–8, 1999.  a

Mannarini, G. and Carelli, L.: [VISIR-1.b ship routing model] source code (Matlab), Zenodo [code], https://doi.org/10.5281/zenodo.2563074 , 2019a.  a

Mannarini, G. and Carelli, L.: VISIR-1.b: ocean surface gravity waves and currents for energy-efficient navigation, Geosci. Model Dev., 12, 3449–3480, https://doi.org/10.5194/gmd-12-3449-2019 , 2019b.  a , b , c , d , e , f , g , h , i , j , k , l , m , n , o

Mannarini, G., Lecci, R., and Coppini, G.: Introducing sailboats into ship routing system VISIR, in: 2015 6th International Conference on Information, Intelligence, Systems and Applications (IISA), IEEE, 1–6, https://doi.org/10.1109/IISA.2015.7387962 , 2015.  a

Mannarini, G., Pinardi, N., Coppini, G., Oddo, P., and Iafrati, A.: VISIR-I: small vessels – least-time nautical routes using wave forecasts, Geosci. Model Dev., 9, 1597–1625, https://doi.org/10.5194/gmd-9-1597-2016 , 2016a.  a , b , c , d , e , f , g

Mannarini, G., Turrisi, G., D'Anca, A., Scalas, M., Pinardi, N., Coppini, G., Palermo, F., Carluccio, I., Scuro, M., Cretì, S., Lecci, R., Nassisi, P., and Tedesco, L.: VISIR: technological infrastructure of an operational service for safe and efficient navigation in the Mediterranean Sea, Nat. Hazards Earth Syst. Sci., 16, 1791–1806, https://doi.org/10.5194/nhess-16-1791-2016 , 2016b.  a

Mannarini, G., Carelli, L., Zissis, D., Spiliopoulos, G., and Chatzikokolakis, K.: Preliminary inter-comparison of AIS data and optimal ship tracks, TransNav, 13, 53–61, https://doi.org/10.12716/1001.13.01.04 , 2019a.  a

Mannarini, G., Subramani, D., Lermusiaux, P., and Pinardi, N.: Graph-Search and Differential Equations for Time-Optimal Vessel Route Planning in Dynamic Ocean Waves, IEEE T. Intell. Transp., 21, 3581–3593, https://doi.org/10.1109/TITS.2019.2935614 , 2019b.  a , b , c , d , e , f

Mannarini, G., Carelli, L., Orović, J., Martinkus, C. P., and Coppini, G.: Towards Least-CO 2 Ferry Routes in the Adriatic Sea, J. Marine Sci. Eng., 9, 115, https://doi.org/10.3390/jmse9020115 , 2021.  a

Mason, J., Larkin, A., Bullock, S., van der Kolk, N., and Broderick, J. F.: Quantifying voyage optimisation with wind propulsion for short-term CO 2 mitigation in shipping, Ocean Eng., 289, 116065, https://doi.org/10.1016/j.oceaneng.2023.116065 , 2023a.  a , b

Mason, J., Larkin, A., and Gallego-Schmid, A.: Mitigating stochastic uncertainty from weather routing for ships with wind propulsion, Ocean Eng., 281, 114674, https://doi.org/10.1016/j.oceaneng.2023.114674 , 2023b.  a , b , c , d

Miola, A., Marra, M., and Ciuffo, B.: Designing a climate change policy for the international maritime transport sector: Market-based measures and technological options for global and regional policy actions, Energy Policy, 39, 5490–5498, https://doi.org/10.1016/j.enpol.2011.05.013 , 2011.  a

Orda, A. and Rom, R.: Shortest-path and Minimum-delay Algorithms in Networks with Time-dependent Edge-length, J. ACM, 37, 607–625, https://doi.org/10.1145/79147.214078 , 1990.  a , b , c

Salinas, M.: Ferry case study, TIB AVPortal [video], https://doi.org/10.5446/s_1687 , 2024a.  a

Salinas, M.: Sailboat case study, TIB AVPortal [video], https://doi.org/10.5446/s_1688 , 2024b.  a

Salinas, M. L., Carelli, L., and Mannarini, G.: [VISIR-2 ship weather routing model] source code (Python), Zenodo [code], https://doi.org/10.5281/zenodo.10960842 , 2024a.  a , b , c , d , e

Salinas, M. L., Carelli, L., and Mannarini, G.: [VISIR-2 ship weather routing model] raw data, Zenodo [data set], https://doi.org/10.5281/zenodo.10674079 , 2024b.  a

Salinas, M. L., Carelli, L., and Mannarini, G.: [VISIR-2 ship weather routing model] intermediate products, Zenodo [data set], https://doi.org/10.5281/zenodo.10674082 , 2024c.  a

Schroeder, K. and Chiggiato, J.: Oceanography of the Mediterranean Sea: An Introductory Guide, Elsevier, ISBN 978-0-12-823692-5, 2022.  a , b

Sidoti, D., Avvari, G. V., Mishra, M., Zhang, L., Nadella, B. K., Peak, J. E., Hansen, J. A., and Pattipati, K. R.: A Multiobjective Path-Planning Algorithm With Time Windows for Asset Routing in a Dynamic Weather-Impacted Environment, IEEE T. Syst. Man Cyb., 47, 3256–3271, https://doi.org/10.1109/TSMC.2016.2573271 , 2017.  a

Sidoti, D., Pattipati, K. R., and Bar-Shalom, Y.: Minimum Time Sailing Boat Path Algorithm, IEEE J. Ocean. Eng., 48, 307–322, https://doi.org/10.1109/JOE.2022.3227985 , 2023.  a , b

Smith, T. and Shaw, A.: An overview of the discussions from IMO MEPC 80 and Frequently Asked Questions, Tech. rep., UMAS, 2023.  a

Svanberg, M., Ellis, J., Lundgren, J., and Landälv, I.: Renewable methanol as a fuel for the shipping industry, Renew. Sustain. Energ. Rev., 94, 1217–1228, https://doi.org/10.1016/j.rser.2018.06.058 , 2018.  a

Szlapczynska, J.: Multi-objective weather routing with customised criteria and constraints, J. Navigation, 68, 338–354, https://doi.org/10.1017/S0373463314000691 , 2015.  a

Tagliaferri, F., Philpott, A., Viola, I., and Flay, R.: On risk attitude and optimal yacht racing tactics, Ocean Eng., 90, 149–154, https://doi.org/10.1016/j.oceaneng.2014.07.020 , 2014.  a

Theocharis, A., Balopoulos, E., Kioroglou, S., Kontoyiannis, H., and Iona, A.: A synthesis of the circulation and hydrography of the South Aegean Sea and the Straits of the Cretan Arc (March 1994–January 1995), Prog. Oceanogr., 44, 469–509, https://doi.org/10.1016/S0079-6611(99)00041-5 , 1999.  a

van den Bremer, T. S. and Breivik, Ø.: Stokes drift, Philos. T. Roy. Soc. A, 376, 20170104, https://doi.org/10.1098/rsta.2017.0104 , 2018.  a

Vettor, R. and Guedes Soares, C.: Development of a ship weather routing system, Ocean Eng., 123, 1–14, https://doi.org/10.1016/j.oceaneng.2016.06.035 , 2016.  a , b

Wilson, G., Aruliah, D., Brown, C. T., Hong, N. P. C., Davis, M., Guy, R. T., Haddock, S. H., Huff, K. D., Mitchell, I. M., Plumbley, M. D., Waugh, B., White, E. P., and Wilson, P: Best practices for scientific computing, PLoS Biol., 12, e1001745, https://doi.org/10.1371/journal.pbio.1001745 , 2014.  a , b

Zis, T. P., Psaraftis, H. N., and Ding, L.: Ship weather routing: A taxonomy and survey, Ocean Eng., 213, 107697, https://doi.org/10.1016/j.oceaneng.2020.107697 , 2020.  a , b , c

  • Introduction
  • Technical advancements
  • Computational performance
  • Case studies
  • Conclusions
  • Appendix A:  Angle of attack
  • Appendix B:  Neural network features
  • Code and data availability
  • Video supplement
  • Author contributions
  • Competing interests
  • Acknowledgements
  • Financial support
  • Review statement

Ship weather routing has the potential to reduce CO 2 emissions, but it currently lacks open and...

Loading metrics

Open Access

Peer-reviewed

Research Article

Modeling oxygen transport in the brain: An efficient coarse-grid approach to capture perivascular gradients in the parenchyma

Roles Conceptualization, Data curation, Formal analysis, Investigation, Methodology, Software, Validation, Visualization, Writing – original draft, Writing – review & editing

Affiliation Institut de Mécanique des Fluides de Toulouse (IMFT), UMR 5502, Université de Toulouse, CNRS, Toulouse, France

Roles Methodology, Writing – review & editing

Affiliations Institut de Mécanique des Fluides de Toulouse (IMFT), UMR 5502, Université de Toulouse, CNRS, Toulouse, France, Department of Mechanical Engineering, University College London, London, United Kingdom

Roles Conceptualization, Methodology, Writing – review & editing

Affiliation Institut de Mathématiques de Toulouse (IMT), UMR 5219, Université de Toulouse, CNRS, UPS, Toulouse, France

Roles Investigation, Writing – review & editing

Affiliation Department of Biomedical Engineering, Boston University, Boston, Massachusetts, United States of America

Roles Conceptualization, Formal analysis, Writing – review & editing

Roles Conceptualization, Formal analysis, Investigation, Methodology, Supervision, Writing – review & editing

Roles Conceptualization, Formal analysis, Funding acquisition, Investigation, Methodology, Project administration, Resources, Supervision, Writing – original draft, Writing – review & editing

* E-mail: [email protected]

ORCID logo

  • David Pastor-Alonso, 
  • Maxime Berg, 
  • Franck Boyer, 
  • Natalie Fomin-Thunemann, 
  • Michel Quintard, 
  • Yohan Davit, 
  • Sylvie Lorthois

PLOS

  • Published: May 23, 2024
  • https://doi.org/10.1371/journal.pcbi.1011973
  • Peer Review
  • Reader Comments

This is an uncorrected proof.

Fig 1

Recent progresses in intravital imaging have enabled highly-resolved measurements of periarteriolar oxygen gradients (POGs) within the brain parenchyma. POGs are increasingly used as proxies to estimate the local baseline oxygen consumption, which is a hallmark of cell activity. However, the oxygen profile around a given arteriole arises from an interplay between oxygen consumption and delivery, not only by this arteriole but also by distant capillaries. Integrating such interactions across scales while accounting for the complex architecture of the microvascular network remains a challenge from a modelling perspective. This limits our ability to interpret the experimental oxygen maps and constitutes a key bottleneck toward the inverse determination of metabolic rates of oxygen.

We revisit the problem of parenchymal oxygen transport and metabolism and introduce a simple, conservative, accurate and scalable direct numerical method going beyond canonical Krogh-type models and their associated geometrical simplifications. We focus on a two-dimensional formulation, and introduce the concepts needed to combine an operator-splitting and a Green’s function approach. Oxygen concentration is decomposed into a slowly-varying contribution, discretized by Finite Volumes over a coarse cartesian grid, and a rapidly-varying contribution, approximated analytically in grid-cells surrounding each vessel.

Starting with simple test cases, we thoroughly analyze the resulting errors by comparison with highly-resolved simulations of the original transport problem, showing considerable improvement of the computational-cost/accuracy balance compared to previous work. We then demonstrate the model ability to flexibly generate synthetic data reproducing the spatial dynamics of oxygen in the brain parenchyma, with sub-grid resolution. Based on these synthetic data, we show that capillaries distant from the arteriole cannot be overlooked when interpreting POGs, thus reconciling recent measurements of POGs across cortical layers with the fundamental idea that variations of vascular density within the depth of the cortex may reveal underlying differences in neuronal organization and metabolic load.

Author summary

The cerebral microvascular network is the logistics system that provides energy to brain cells at the right time and place. Blood flow and oxygen can now be observed dynamically in living rodents, which transformed our knowledge of the system and its role in ageing and disease. However, oxygen concentration at a given location is the result of a subtle balance between local cellular consumption, supply by neighboring vessels and their interconnections to distant ones. Thus, measurements are difficult to interpret without integrating this multi-scale component, which requires advanced computational models. This hinders our ability to bridge the gap between experiments in rodents and clinical applications in humans.

In this work, we focus on oxygen transport between vessels, leveraging recent advances in multi-scale modelling and their mathematical foundations. By this way, we formulate for the first time a simple, conservative, accurate and scalable computational model for cerebral oxygen across scales, that is able to integrate the spatially heterogenous distribution of vessels. We illustrate how this model, combined to imaging, will pave the way towards better estimates of oxygen consumption, a hallmark of neural activity that cannot be directly measured.

Citation: Pastor-Alonso D, Berg M, Boyer F, Fomin-Thunemann N, Quintard M, Davit Y, et al. (2024) Modeling oxygen transport in the brain: An efficient coarse-grid approach to capture perivascular gradients in the parenchyma. PLoS Comput Biol 20(5): e1011973. https://doi.org/10.1371/journal.pcbi.1011973

Editor: Daniel A. Beard, University of Michigan, UNITED STATES

Received: October 6, 2023; Accepted: March 5, 2024; Published: May 23, 2024

Copyright: © 2024 Pastor-Alonso et al. This is an open access article distributed under the terms of the Creative Commons Attribution License , which permits unrestricted use, distribution, and reproduction in any medium, provided the original author and source are credited.

Data Availability: All author-generated python code, as well as Comsol reference simulation data used for comparison are available from the Zenodo repository at doi: https://doi.org/10.5281/zenodo.8383820 .

Funding: The research leading to these results has received funding from the European Research Council under the European Union’s Seventh Framework Program (FP7/2007-2013) Consolidator Brainmicroflow, ERC grant agreement no. 615102 to SL, from the NIH (awards R21CA214299 and 1RF1NS110054 to SL) and from Agence Nationale de la Recherche (J452IMF23174 to SL). It was performed using HPC resources from CALMIP (Grant 2016P1541 to SL). YD was partly funded by the H2020 program Starting Bebop, ERC grant agreement no. 803074. The funders had no role in study design, data collection and analysis, decision to publish, or preparation of the manuscript.

Competing interests: The authors have declared that no competing interests exist.

1 Introduction

Due to its highly specialized function, the brain is one of the organs with the highest basal energy demand. With essentially no substantial energy reserves, it is thus extremely vulnerable to sudden interruptions in oxygen and nutrients delivery by the blood, which can induce neuronal death within minutes with devastating consequences, e.g., for stroke victims [ 1 ]. It is also highly sensitive to chronic cerebral hypoperfusion, which can lead to progressive neurodegeneration and cognitive decline, not only in hypoperfusion dementia [ 2 ] but also, as increasingly accepted, in Alzheimer’s disease [ 3 – 6 ]. However, despite its critical role in the transition between health and disease, many aspects of oxygen transport and metabolism in the brain remain poorly understood.

This motivated the development of high-resolution brain imaging techniques [ 7 ]. Together with the increased sophistication of experimental protocols, which enabled the brain of living rodents to be studied in various conditions including sleep, resting and awake states, these provide an unprecedented window on microvascular dynamics (e.g. diameters, red blood cell velocities, blood and tissue oxygenation, neural activity) [ 7 – 10 ]. However, due to the intrinsically heterogeneous and non-local nature of network flows [ 11 – 13 ], the results obtained in different conditions have been difficult to interpret. As we shall see next, this contributed to casting doubt on previously accepted ideas, including the fundamental idea that both structure and function of the brain microcirculation are subservient to cerebral metabolic demand.

With regard to brain function, the physiological role of neurovascular coupling, i.e. local surges in blood flow driven by increased neuronal activity (also referred to as functional hyperamia), has been questioned. On the one hand, even the baseline level of blood flow is indeed globally sufficient to supply oxygen to neurons with elevated levels of activity [ 12 ]. On the other hand, in the words of Drew [ 12 ], “low-flow regions are an inescapable consequence of the architecture of the cerebral vasculature” and “cannot be removed by functional hyperemia” . In fact, “increases in blood flow—whether local or global—will serve only to move the location of the low-blood-flow regions, not eliminate them [ 13 ]”.

With regard to structure, the local variations of vascular density have been believed for decades to reveal underlying differences in neuronal organization and metabolic load [ 14 – 16 ], as a result of cerebral angiogenesis being driven by their oxygen requirements [ 17 – 19 ]. Recent breakthroughs in brain-wide vascular network imaging and reconstruction in rodents, associated to scaling analyses, support this vision at the scale of the whole brain [ 20 ]. However, detailed measurements of periarteriolar oxygen profiles across cortical layers in awake mice, associated with estimates of the corresponding cerebral metabolic rate of oxygen, recently suggested that baseline oxygen consumption may decrease with cortical depth, from Layer I to Layer IV [ 10 ], in contrast to the known increase of capillary density [ 20 , 21 ].

Solving these apparent contradictions requires the development of models integrating the non-local nature of microvascular blood flow [ 11 , 13 , 22 ], which account for the complex architecture of brain microvascular networks but simplify or neglect transport and metabolism within the tissue, with models of oxygen dynamics going beyond the geometrical oversimplifications associated to Krogh-type analytical descriptions [ 10 , 23 – 28 ].

However, the computational cost of simulating oxygen transport and consumption in the brain parenchyma by standard numerical methods, such as finite volume or finite element methods, is prohibitive. In fact, they imply to finely mesh the extravascular tissue so as to resolve the strong oxygen concentration gradients building up in the vicinity of each vessel (e.g. [ 29 ]), not to mention the technical challenge of automatically meshing its complex three-dimensional volume. A popular alternative, specifically designed to solve oxygen transport in the microcirculation, formulates the problem using Green’s functions [ 30 – 34 ]. The non-local nature of this formulation allows the description of concentration gradients around microvessels while circumventing the need for meshing the intricate geometry of the extravascular space. However, it generally relies on the infinite domain form of the Green’s function, making difficult the application of boundary conditions at the limits of the tissue domain (e.g. periodic boundary conditions). Additionally, oxygen metabolism exhibits non-linear behavior [ 23 , 35 ], which is challenging to describe using Green’s function and generally requires additional meshing [ 30 , 36 ]. This, coupled with the non-local formulation at the core of the approach, requires the creation of large and dense matrices that are computationally costly to invert. Therefore, solving oxygen transport whether using standard methods or the Green’s function approach limits the size of the regions that can be considered and hinders the potential of such methods to be used in inverse problems, where measured spatial oxygen dynamics are used to deduce local metabolic rate constants or permeability coefficients, which requires to run the direct problem many times. In the latter case, the spatial resolution of the solver is much higher than that of the measurements, which requires averaging of the numerical results, deviating from an optimal allocation of computational resources.

Such challenges have been bypassed by introducing dual mesh techniques, where the extravascular domain is coarsely meshed independently of microvessel locations [ 37 ], or by simplifying the mesh structure, e.g. based on cartesian grids, to approximate the extravascular domain [ 38 ]. These approaches decrease the computational cost, but do not leverage recent progresses in other fields, where analytical solutions to similar problems (analogous form of equations with same underlying mathematical structure) could be used to capture the smallest features of the extravascular oxygen field (perivascular gradients). This would circumvent the need of mesh refinement around the sources. In geosciences (well or fractured reservoir modelling), for example, coupling models are often used where analytical functions help provide a relationship between the highly conductive slender structures (commonly modeled as 1D sources) and the 3D simulation domain [ 39 – 45 ]. In particular, in operator-splitting approaches [ 46 – 48 ], the scalar field (concentration, pressure, heat, etc.) is decomposed into a slowly varying contribution and a rapidly varying contribution. The former can be solved numerically over a coarse cartesian mesh, while the later can be approximated analytically, thus enabling a precise estimation of exchanges at the vessel-tissue interface as well as an a posteriori highly-resolved reconstruction of the concentration field in each mesh cell.

The goal of the present paper is to revisit the problem of oxygen transport and metabolism in the brain parenchyma to introduce a simple, scalable and accurate numerical method for its direct resolution. By simplicity, we mean the ability to use cartesian mesh cells independent of vessel locations, thus avoiding meshing the extravascular space, as well as the ability to impose various boundary conditions at the outer limits of the computational domain. By scalability, we refer to a mathematical formulation of the problem at the core of which is a low-bandwidth linear system of equations, so that the numerical resolution can be fully and efficiently parallelized. By accuracy, we mean the ability to control the numerical errors even in the case of a coarse mesh. Here, we present the associated concepts in two dimensions (Section 2), so as to increase the readability of the mathematical developments. This also permits to exploit current commercial finite element solvers, which enable to obtain reference solutions of the initial boundary value problem. This enables to carefully study how the underlying simplifications translate into numerical errors in idealized test cases that sequentially challenge these assumptions (Section 3). We then show how this model helps understanding the recent counter-intuitive experimental results on cortical oxygenation and metabolism [ 10 , 24 , 26 ] (Section 4). Finally, we discuss how this novel approach compares to previous work and how it will provide the groundwork for computationally affordable oxygen transport and metabolic simulations, fully coupled with intravascular transport in large microvascular networks.

2 Model and methods

We first focus on the diffusive transport of oxygen in the brain parenchyma, i.e. the brain tissue except for blood vessels, denoted Ω σ in Fig 1A , for which we present the general three-dimensional formulation in Section 2.1. We then restrict ourselves to a 2D configuration, where vessels are reduced to a collection of circular sources, as schematized in Fig 1B . This enables to maintain the readability of the mathematical developments, introduced from Section 2.2 onwards, without significant loss of generality. We finally consider oxygen consumption in Section 2.4.

thumbnail

  • PPT PowerPoint slide
  • PNG larger image
  • TIFF original image

Panel A represents a 3D region Ω of the brain tissue, which includes the parenchyma Ω σ and the vessel space Ω β . The external boundary is denoted by ∂Ω, the vessel walls by ∂Ω β , the vessels center-lines by Λ, the curvilinear coordinate system for the vessels by ( s , r , θ ) and the outer normal to the vessel walls by n . Panel B illustrates a 2D geometry, as used in the present paper to establish the modeling framework in Section 2, with two sources. The source walls are denoted by ∂Ω β ,1 and ∂Ω β ,2 . Panel C displays one example of a tesselation of space Ω σ into 4 sub-spaces V k for k = {1, 2, 3, 4}. Here, only two sub-spaces contain sources, i.e. , E ( V 1 ) = E ( V 4 ) = ⌀ , E ( V 2 ) = {2}, and E ( V 3 ) = {1}.

https://doi.org/10.1371/journal.pcbi.1011973.g001

2.1 Diffusive transport in the brain parenchyma

local variable 'result' referenced before assignment python

From now on, we restrict ourselves to a 2D configuration so that we can eliminate s from Eqs 3 – 5 and 6b . As we shall see in Section 5, the 2D problem allows us to focus on radial transport, which provides the high perivascular concentration gradients and therefore poses the greatest challenge for the development of numerical approaches.

2.2 Operator-splitting

local variable 'result' referenced before assignment python

2.3 Assembly of a system of discrete algebraic equations

local variable 'result' referenced before assignment python

https://doi.org/10.1371/journal.pcbi.1011973.g002

local variable 'result' referenced before assignment python

2.3.1 FV discretization for the slow term.

local variable 'result' referenced before assignment python

2.3.2 Potential-based localized formulation for the rapid term .

local variable 'result' referenced before assignment python

https://doi.org/10.1371/journal.pcbi.1011973.g003

The estimation of the single source potential based on the Green’s integral formulation has a natural extension to 3D. The circular sources that appear in the 2D model provide a simple formulation to the potential since the double layer potential is null (see Section B in S1 Methods ). In contrast, an open cylinder provides a non-null value for the double layer integral resulting in a second potential in Eq 24 [ 51 ] which accounts for the axial variations. The rest of the developments presented in Section 2.3, including FV discretization and localization of the slow term, can be simply extrapolated to 3D.

2.3.3 Sub-grid reconstruction to estimate vessel-tissue exchanges (q).

local variable 'result' referenced before assignment python

2.3.4 Full discrete system and error induced by localization.

local variable 'result' referenced before assignment python

2.4 Metabolism

local variable 'result' referenced before assignment python

2.5 Numerical implementation

The problem is assembled and solved using an in house code written in Python. Due to the large reduction in size allowed by the multiscale model presented, the libraries scipy and numpy for solving linear problems are adequate for the 2D simulations and test cases. An extension to 3D is possible under careful consideration and optimization of the code.

The integrals in Eqs 19 and 40 are evaluated using the second order accurate Simpson’s rule of integration [ 59 ]. Furthermore, the non-linear system assembled in Eq 39 is classically solved through an iterative Newton-Raphson method (see Section E in S1 Methods ).

2.6 Summary of model assumptions

Before examining the robustness, consistency and limitations of the above model in Section 3, we recall the two main assumptions introduced in the developments:

local variable 'result' referenced before assignment python

  • Case 1.1 : when h is not sufficiently small compared to the scale of variation driven by the boundary conditions, i.e., in simple cases, the size of the computational domain;
  • Case 1.2 : when a source lies near the domain outer boundaries ∂Ω;

local variable 'result' referenced before assignment python

  • Case 2.1 : when two or more sources are lying close together, that is, when the density of sources becomes locally too large;
  • Case 2.2 : when a source lies near ∂Ω.

In the next Section, we use idealized test cases of increasing complexity that help decouple the impact of these different sources of errors and clarify the associated size constraints.

3 Results: Error estimation

In this Section, we first consider test cases involving a single source (Section 3.1) and a single dipole, i.e., the combination of a single source and a single sink (Section 3.2). Then, in Section 3.3, we turn to multiple sources and sinks. Noteworthy, we generically designate by “source” any vessel j whose concentration is greater than the local tissue concentration, i.e., for which the resulting flux q j will be positive. In the same way, we use “sink” for any vessel j whose concentration is lower than the local tissue concentration, i.e., for which the resulting flux q j will be negative. This enables “diffusional shunts” in the parenchyma, which have been evidenced experimentally between arterioles and venules [ 69 ], to be considered.

Thus, for all simulations we assign 〈 C v 〉 j = ϕ max to all sources and 〈 C v 〉 j = 0 to all sinks, where ϕ max represents the oxygen concentration in penetrating arterioles at the inlet of the brain cortex. We also use a diffusion coefficient D = 2 × 10 −5 cm 2 ⋅ s −1 [ 25 , 30 , 70 ], an effective permeability for the capillaries of K eff = 2 × 10 −5 cm 2 ⋅ s −1 [ 29 , 30 ] and a maximum metabolic consumption of M = 2.4 μ mol ⋅ cm −3 ⋅ min −1 which falls within physiological range (see Table 1 ).

thumbnail

Radii R : see Fig 7; ϕ max : oxygen concentration in penetrating arterioles at the inlet of the brain cortex; D : diffusion coefficient in the parenchyma; K eff : effective diffusive permeability of the capillary walls; α : oxygen solubility in water at atmospheric pressure; M : maximum metabolic rate of oxygen; K : concentration where consumption is half of its maximum.

https://doi.org/10.1371/journal.pcbi.1011973.t001

Moreover, for all test cases considered in this Section, we purposely put ourselves in Case 1.1 above by considering relatively small domains of side L = 240 μ m, i.e., only 50 times larger than the source/sink radii ( R = 4.8 μ m). In doing so, we aim at providing reasonable estimates for the upper bounds of the numerical errors.

Errors are estimated by comparison with a fine mesh finite element (FE) solution of the original BVP ( Eq 1 for the linear problem or Eq 37 for the non-linear problem) without any additional modeling assumptions, in the same spirit as [ 29 ]. This reference FE solution, ϕ ref , was obtained with COMSOL Multiphysics using a triangular mesh fine enough to accommodate the contours of the circular sources, to handle the azimuthal variations of the concentration field around the sources and to ensure convergence in the estimation of q ref , obtained by integrating the normal derivative of ϕ ref along the vessel wall.

local variable 'result' referenced before assignment python

A: schematics of the configuration under study, highlighting the detail of the boundary conditions. The domain size is L = 240 μ m, the source radius is R = 4.8 μ m, and the neighbourhood size is (30 R ) 2 , i.e., n = 3 for a 5x5 grid ( h / L =0.2); B: evolution of global errors as a function of grid size for the linear and non-linear problems, and for both the multiscale and the coarse-grid FV model (see legend); C: schematics of the boundary test, for which we use a mesh size h / L = 0.2, i.e., a 5x5 grid; D: evolution of global errors as a function of d , from d = 0 where the source is in contact with the no-flux boundary, to d = 1.2 h where the source lies in the contiguous grid-cell. The dashed vertical line illustrates the limit of the boundary cell.

https://doi.org/10.1371/journal.pcbi.1011973.g004

thumbnail

A: evolution of the local errors on vessel-tissue exchanges for the source (filled symbols) and for the sink (empty symbols) as a function of distance d between source and sink; B: schematics of the smaller-neighborhood configuration ( n = 3); C: schematics of the large-neighborhood configuration ( n = 5); D: reconstruction of the sub-grid concentration field for the case n = 3 and d = 60 ⋅ R . The value of the concentration ( ϕ ) is non-dimensionalized by the value of the intravascular concentration in the source. The dashed vertical line in Panel A illustrates the transition between a situation where, for n = 3, the intersection of the source and sink neighborhoods contains both of them to a situation where the source and sink lie outside each other’s neighborhood.

https://doi.org/10.1371/journal.pcbi.1011973.g005

thumbnail

https://doi.org/10.1371/journal.pcbi.1011973.g006

For the sake of comparison, the following conventions are used in all figure legends in this Section:

  • Blue lines are used for the present multiscale method while red ones are used for the coarse-grid FV model.
  • Continuous lines are used for the linear, non-reactive model ( Eq 33 ) while discontinuous ones are used when metabolism is considered, i.e. reactive model ( Eq 39 ).
  • Square markers are used to display the global errors on the vessel-tissue exchanges while triangular ones are used to display errors on the concentration field.

3.1 Single source

local variable 'result' referenced before assignment python

When the radius of the source is a fifth of the side length of the grid-cell, the denominator in the above equation is equal to one, and the FV solution ( Eq 45 ) provides the same solution as the Peaceman well model. This occurs at the local minimum observed in Fig 4B , i.e. at approximately h / L = 0.1. The coarse-grid FV approach still exhibits errors between 10 −2 and 10 −1 for the smallest grid size considered in this study ( h ∼ 4 R ).

In contrast, a good balance between mesh-size and accuracy is achieved by the multiscale approach for the 5x5 grid ( h / L = 0.2) with n = 3 (see Fig 4A ), with errors on fluxes below 1% for both the linear and non-linear models (see Fig 4B ). These parameters will thus be used next except as stated otherwise.

local variable 'result' referenced before assignment python

We now worsen the deviation from Assumption 1 by reducing the distance d between the source and the no-flux boundary ( Cases 1.2 and 2.2 ), as illustrated in Fig 4C . Errors reach up to ≈10% when the source is in contact with the zero-flux boundary condition ( d = 0), see Fig 4D . They decrease rapidly with increasing d , with ε q < 2% as soon as there is half a grid-cell distance to the boundary. In contrast, the FV solution errors stay consistently around 10% even when the source belongs to a non-boundary grid-cell ( d / h > 1), except for a minimum for d / h ∼ 0.7. Similar to the Peaceman well model [ 39 ], the local minimum is likely obtained when the logarithmic decrease of the source potential is close to the discrete approximation of its gradient from values at the FV cell’s center.

Overall, the single source test-cases highlight how coupling the analytical rapid term to the coarse-grid FV discretization of the slow term improves the numerical resolution of oxygen transport and metabolism within the tissue space. Importantly, these test-cases have been designed to push the limits of the corresponding underlying assumptions, by choosing small computational domains. Given the results shown in Fig 4 , we expect to rarely find ourselves in conditions where ε ≥ 1%.

3.2 Single dipole

local variable 'result' referenced before assignment python

When the source and sink both lie in the same grid-cell, i.e., when d / R is below 40, the behavior of these local errors becomes similar whatever the neighbourhood size, since the cross-influence between their potentials is then calculated analytically by the rapid term. When there is no overlap between the two neighbourhoods (e.g. in Fig 5B and for d / R above 40 in the small neighborhood case, dark blue lines in Fig 5A ), the errors increase significantly, reaching the upper-bound estimate of errors induced by localized formulation of the rapid term (Section 2.3.2), as evaluated by Eq 36 . In contrast, for a larger neighborhood size (light blue lines in Fig 5A and 5C ), the errors quickly reach a plateau for an increasing separation distance d , consistent with the error obtained for a single source with similar discretization ( h / L = 0.2 in Fig 4B ). This underpins the residual error as the result of the coarse-grid resolution of the slow term and not of potential localization.

3.3 Multiple sources

We have shown how errors primarily build up when a source lies in the vicinity of a no-flux boundary ( Fig 4B ), and in lesser extent when two sources lie close to each other ( Fig 5A ), respectively. Both situations may arise frequently within the cortex, e.g., close to vessel bifurcations, where three vessel are connected in a single point.

Here, we thus consider a more realistic distribution of sources, obtained using a synthetic network that reproduces the structural and functional properties of cortical capillary beds, following [ 60 ] ( Fig 6A ). Briefly, we take a cross-section of such a network and map its intersections with each vessel ( Fig 6A ). We thus obtain a realistic map of source distribution, for which S = 17 ( Fig 6B ). We randomly assign one third of vessels to be sources and two third of vessels to be sinks, with periodic boundary conditions.

In Fig 6C and 6D , we show the coarse-grid concentration field and its reconstruction, respectively, for a 8x8 grid ( h / L =0.125 and h / R cap = 6.25) and n = 5. These clearly show that the model formulation enables enforcing the periodic boundary conditions for the reconstructed, highly-resolved, concentration field, as efficiently as the reference FE approach (Fig B in S1 Figures ), even if periodicity at the boundaries doesn’t propagate to the scale of the coarse-grid. Furthermore, the evolution of errors with neighbourhood size n ( Fig 6E ), follows the 1/ n 2 scaling predicted by Eq 36 , up to n = 5. For larger values of n , a plateau is reached, the value of which (∼1%) corresponds to the residual error associated to deviations from Assumption 2 , as shown in Sections 3.1 and 3.2. As a result, neither considering finer grid-cells nor increasing the neighborhood size n further reduce this residual errors (see Fig 6E and 6F , respectively).

Furthermore, we note that the numerical errors are only marginally affected when oxygen consumption is taken into consideration (dashed lines in Fig 6E and 6F ), showing the robustness of our approach.

In contrast, errors corresponding to the coarse-grid FV model lie consistently one order of magnitude above than the one resulting from the multiscale approach.

4 Results: Periarteriolar oxygen concentration gradients

Now that we have shown the ability of our model to efficiently solve for the oxygen concentration field, including around vessels where gradients are the strongest, we turn to its exploitation in the context of brain metabolism. We specifically ask if variations of the radial peri-arteriolar concentration profiles that were recently measured across cortical layers in awake mice [ 10 ] could result from the layer-specific (laminar) increase of capillary density with cortical depth rather than from variations of baseline oxygen consumption.

For that purpose, we consider the typical case of a single penetrating arteriole (PA) and its surrounding tissue, as illustrated in Fig 7A . To account for the capillary-free space that encircles the PA, we include a cylindrical tissue region devoid of capillaries, with typical radius of 100 μ m [ 10 , 24 ]. Further away, we generate a random spatial distribution of sources with densities approximately matching the capillary density in cortical layer II ( Table 2 ). We deduce the equivalent 2D source density (E2DSD) by using synthetic capillary networks similar to Section 3.3. We then create a randomized but statistically homogeneous distribution of sources following [ 60 , 73 ]. We assign concentrations at the outer walls of the PA and capillaries, by using an asymptotically large value of K eff and following experimental measurements in layer II [ 8 ]. For the capillaries, we assign a random distribution of normalized concentrations at capillary walls ∂Ω β , j , drawn from a Gaussian distribution with mean ϕ cap = 0.45 ϕ PA and standard deviation σ = 0.1 ϕ PA , approximately corresponding to experimental measurements in layer II ( Table 2 ). We also impose periodic boundary conditions on the limit of the domain to mimic the larger cortical space. Finally, the maximum metabolic rate of oxygen is chosen to be M = 2.4 μ mol ⋅ cm −3 ⋅ min −1 ( Table 1 ), an intermediate value within the physiological range. Other transport parameters used to solve the non-linear problem ( Eq 39 and 40 ) are deduced from reference values in the literature ( Table 1 ).

thumbnail

https://doi.org/10.1371/journal.pcbi.1011973.g007

thumbnail

The capillary length density (CLD) and depth of the corresponding layers are approximated from data in [ 20 ]. The equivalent two-dimensional source density (E2DSD) is deduced using synthetic capillary networks from [ 60 ] ( Fig 6A ). The ratio between arteriole and capillary concentration is approximated from data in [ 9 ].

https://doi.org/10.1371/journal.pcbi.1011973.t002

A typical realization of the resulting coarse-grid concentration field, converted to partial pressure ( PO 2 ) using the solubility of oxygen in brain tissue [ 10 , 30 , 37 ], is displayed in Fig 7B for a 20x20 grid ( h ∼ 20 μ m). This matches the experimental sampling used in [ 10 ] and results in a very good qualitative agreement with the field measured in a 100 μ m-deep plane perpendicular to a PA (see Fig 7C , data acquired following [ 10 ]). This field can be used to deduce the sub-grid concentration dynamics by interpolation ( Eq 30 , see e.g. Figs C and D in S1 Figures ), as well as the local cerebral metabolic rate of oxygen (CMRO 2 , see Eq 40 and Fig 7D ). Interestingly, the cerebral metabolic rate of oxygen exhibits ∼±10% variations in the outer region (around capillaries) and up to ∼±20% in the periarteriolar region, in contrast to the common assumption of a spatial homogeneity [ 10 , 23 , 24 , 74 ].

Moreover, the above results can be post-processed to deduce the azimuthal average of the normalized concentration around the PA, as displayed in Fig 7E as a function of the radial distance r to the PA center. In this figure, the plain orange line corresponds to the mean over 30 realizations of source distributions for layer II, while the faint orange areas shows the associated standard deviation. This radial concentration dynamics exhibits three regimes ( Fig 7E ): 1/ a constant value for r ≤ R PA , i.e. within the PA, consistent with the source potential ( Eq 24 ); 2/ a fast decrease for R PA ≤ r ≤ ∼0.8 R cyl corresponding to the inner part of the region devoid of capillaries around the PA (see Fig 7A ) and 3/ a re-increase followed by a slowly-varying region for larger values of r . The presence of a local minima, which can also be observed in the measurements ( Fig 7C and Fig E in S1 Figures , dashed lines) suggests that the outer region of the capillary-free cylinder is both fed by the PA and the capillary bed.

local variable 'result' referenced before assignment python

Noteworthy, similar results have been obtained for different values of the maximal metabolic rate of oxygen M within the physiological range ( Table 1 ), as illustrated in Fig D in S1 Figures . The only notable difference is that the amplitude of the dip in the radial concentration profile decreases with decreasing values of M (Fig E in S1 Figures ). For the set of parameters representative of layers I and II, this leads to a monotonous decrease of the average radial concentration followed by a region with nearly constant oxygen concentration, similar to experimental measurements reported in [ 10 , 24 ], as soon as M ≤ 1.2 μ mol ⋅ cm −3 ⋅ min −1 (Fig E in S1 Figures ). As a result, the oxygen dynamics in the close vicinity of the arteriole ( r < R cyl /2) may be highly similar in different cortical layers for different values of M (e.g. M = 2.4 μ mol ⋅ cm −3 ⋅ min −1 in layer IV, see red line in Fig 7E vs. M = 1.6 μ mol ⋅ cm −3 ⋅ min −1 in layer I, see blue dashed-dotted line in Fig E in S1 Figures ).

Altogether, the present model suggests that laminar variations of the capillary density may be sufficient to explain the differences in periarteriolar radial oxygen profiles measured at different depths within the cortex [ 10 ], without any variation of the maximal cerebral metabolic rate of oxygen M . If laminar variations of intravascular capillary PO 2 are also considered, the predicted differences are even larger than the experimental ones. This demonstrates the interplay between metabolic consumption, capillary density and intravascular availability of oxygen in the capillary bed to determine the radial oxygen gradient in the vicinity of PAs. This makes it difficult to consider the steepness of the radial periarteriolar oxygen profile as a surrogate for the baseline oxygen consumption, with the potential to reconcile recent experimental measurements with the idea that laminar variations of capillary density could reveal underlying differences in metabolic load.

5 Discussion

local variable 'result' referenced before assignment python

To provide rigorous but still intelligible mathematical developments, we focused on a two-dimensional version of the problem (Section 2). In this way, we were able to introduce the localization scheme enabling us to control the bandwidth of the associated linear system of equations, by manipulating the size of the region over which the interactions with nearby vessels are accounted for analytically (scalability). We demonstrated the existence of an optimal size for this region, above which the errors induced by localization are smaller than those induced by deviations from local azimuthal symmetry of the concentration field around each vessel (see Fig 6E ). This emphasizes the importance of comparing the results of any simplified model for oxygen transport in the brain parenchyma with a reference solution that is able to fully resolve these deviations. This is neither the case if only single vessels with Krogh-type configurations are considered for validation, as in [ 10 , 23 , 27 , 37 ], or if the discrete version of the problem is compared to the corresponding continuous version (i.e., comparing the solution of Eq 33 to the solution of Eq 6 instead of Eq 1 ), as in [ 58 , 66 , 72 , 77 ]. To our knowledge, such comparisons had never been performed before in this context. Crucially, they enabled to provide careful estimates of the numerical errors associated to the use of coarse meshes, demonstrating the unprecedented balance between reduction of problem size and minimization of errors associated to our method, compared to previous strategies in the literature (accuracy). With this regard, it is worth insisting that we designed test cases that enabled the origins of errors to be understood by purposefully choosing configurations with deviations from the model underlying assumptions (Section 3). Thus, all errors provide upper-bounds of the errors expected when considering larger, physiological-like problems. Moreover, the mathematical groundwork provided by the Green’s function framework (Section B in S1 Methods ) permitted to trace back the source of errors to specific modeling assumptions, which in turn offers a rationale for choosing the model parameters, including discretization and neighborhood size. Finally, the method makes use of a cartesian mesh independent of vessel locations, thereby belonging to the class of mesh-less approaches [ 38 ]. In contrast with the widespread semi-analytical methods [ 30 , 32 , 34 , 51 , 65 ] that require computationally intensive Fourier transforms to enforce conventional boundary conditions such as Neumann and Dirichlet [ 30 ], it also shows remarkable versatility with regard to the boundary conditions that can be handled (simplicity).

Of course, the two-dimensional version of the problem we considered doesn’t enable coupling oxygen transport in the parenchyma with oxygen transport in blood vessels, because intersecting the vascular network with a plane yields disconnected vascular sources, as schematized in Fig 1 . Thus, in the present work, intravascular concentrations have been treated as inputs, while in a three-dimensional version they should be treated as unknowns, with additional blocks in the final system accounting for intravascular transport, as highlighted in [ 45 , 52 , 66 ]. Together with previous work by our group that focused on revisiting intravascular transport [ 22 ], these will provide the foundations for an extension to three dimensions. The fact that the integrated potential arising from a circular source can be written analytically ( Eq 24 and Section B in S1 Methods ) is a peculiar characteristic of the 2D model. In 3D, additional errors may arise due to the approximations needed to estimate the potential of a small cylindrical element used to discretize the vascular networks, that will require careful evaluation in the spirit of [ 78 , 79 ].

local variable 'result' referenced before assignment python

6 Conclusion

We developed a multi-scale model describing the spatial dynamics of oxygen transport in the brain that is simple, conservative, accurate and scalable. Our strategy was to consider that the oxygen concentration in the parenchyma is the result of a balance between contributions at local (cell metabolism, delivery by neighbouring arteriole) and larger (capillary bed) spatial scales. This allowed us to split the oxygen concentration field into a slow and a fast varying terms, underlying the separation of scales between local and distant contributions. Doing so allowed us to combine a coarse-grid approach for the slow-varying term to a Green’s function approach for the fast-varying terms. This resulted in a computationally efficient model that was able to capture precisely gradients of concentration around microvessels and to describe boundary condition with flexibility (Dirichlet, Neumann, and periodic) along with the non-linear metabolic activity by the cells.

We then compared our model with reference solutions of the oxygen transport problem in scenarios of increasing complexity. We showed that our model was able to maintain small errors, even in scenario where the separation of scales was challenged or when azimuthal variations of flux were no longer negligible, demonstrating the robustness of the model.

While the present multi-scale model focused on two-dimensional problems, it has been designed to be easily extended to three-dimensional problems by adapting the expression for the source potential and by including an intravascular description of oxygen transport, both of which being available in the literature (see e.g. [ 22 , 30 , 45 ]).

Despite this limitation, we showed that the model was already capable of generating synthetic data reproducing the heterogeneous distribution of oxygen in the brain parenchyma. Doing so, we showed that periarteriolar gradients were the result of the balance between local cellular oxygen consumptionand supply by not only the neighbouring arteriole but also distant capillaries, thus reconciling recent measurements of periarteriolar oxygen gradients across cortical layers with the fundamental idea that variations of vascular density within the depth of the cortex may reveal underlying differences in neuronal organization.

Supporting information

S1 figures. contains supplementary figures a to e..

https://doi.org/10.1371/journal.pcbi.1011973.s001

S1 Methods. Contains supplementary methods Sections A to E.

https://doi.org/10.1371/journal.pcbi.1011973.s002

Acknowledgments

We gratefully acknowledge Maxime Pigou for technical help with the development and maintenance of the code and Franca Schmid for carefully reading our manuscript.

  • View Article
  • PubMed/NCBI
  • Google Scholar
  • 53. Taylor R, Krishna R. Multicomponent mass transfer. Wiley series in chemical engineering. New York: Wiley; 1993.
  • 54. Moinfar A, Varavei A, Sepehrnoori K, Johns RT. Development of a Novel and Computationally-Efficient Discrete-Fracture Model to Study IOR Processes in Naturally Fractured Reservoirs. In: All Days. Tulsa, Oklahoma, USA: SPE; 2012. p. SPE-154246-MS.
  • 59. Weisstein EC. CRC Concise encyclopedia of mathematics. Boca Raton: CRC Press; 1998.
  • 62. Pozrikidis C, Davis JM. Blood Flow Through Capillary Networks. In: Transport in Biological Media. Elsevier; 2013. p. 213–252.
  • 63. Roach GF. Green’s Functions. 2nd ed. Cambridge: Cambridge University Press; 1982.
  • 67. Atkins PW, De Paula J. Physical chemistry for the life sciences. 2nd ed. New York/Oxford: W.H. Freeman and Co./Oxford University Press; 2011.
  • 78. Pepper D, Kassab A, Divo E. Introduction to Finite Element, Boundary Element, and Meshless Methods: With Applications to Heat Transfer and Fluid Flow. ASME Press; 2014.
  • 79. Aliabadi MH, Wen PH. Boundary element methods in engineering and sciences. No. 4 in Computational and experimental methods in structures. London: Imperial College Press; 2011.

IMAGES

  1. UnboundLocalError: Local Variable Referenced Before Assignment

    local variable 'result' referenced before assignment python

  2. Python 中 UnboundLocalError: Local variable referenced before assignment 错误_迹忆客

    local variable 'result' referenced before assignment python

  3. Local Variable Referenced Before Assignment in Python

    local variable 'result' referenced before assignment python

  4. Local Variable Referenced Before Assignment in Python

    local variable 'result' referenced before assignment python

  5. Local variable referenced before assignment in Python

    local variable 'result' referenced before assignment python

  6. Python报错:UnboundLocalError: local variable ‘result‘ referenced before assignment

    local variable 'result' referenced before assignment python

VIDEO

  1. Assignment

  2. Assignment

  3. Local and Global Variables in Python (Python Tutorial

  4. Assignment

  5. Local (?) variable referenced before assignment

  6. Identifiants et variables en Python

COMMENTS

  1. Python 3: UnboundLocalError: local variable referenced before assignment

    File "weird.py", line 5, in main. print f(3) UnboundLocalError: local variable 'f' referenced before assignment. Python sees the f is used as a local variable in [f for f in [1, 2, 3]], and decides that it is also a local variable in f(3). You could add a global f statement: def f(x): return x. def main():

  2. Fix "local variable referenced before assignment" in Python

    Building Your First Convolutional Neural Network With Keras # python # artificial intelligence # machine learning # tensorflow Most resources start with pristine datasets, start at importing and finish at validation.

  3. Local variable referenced before assignment in Python

    The Python "UnboundLocalError: Local variable referenced before assignment" occurs when we reference a local variable before assigning a value to it in a function. To solve the error, mark the variable as global in the function definition, e.g. global my_var .

  4. Python local variable referenced before assignment Solution

    Trying to assign a value to a variable that does not have local scope can result in this error: UnboundLocalError: local variable referenced before assignment. Python has a simple rule to determine the scope of a variable. If a variable is assigned in a function, that variable is local. This is because it is assumed that when you define a ...

  5. [SOLVED] Local Variable Referenced Before Assignment

    Python treats variables referenced only inside a function as global variables. Any variable assigned to a function's body is assumed to be a local variable unless explicitly declared as global. ... DJANGO - Local Variable Referenced Before Assignment [Form] ... When a variable that is created locally is called before assigning, it results ...

  6. How to fix UnboundLocalError: local variable 'x' referenced before

    The UnboundLocalError: local variable 'x' referenced before assignment occurs when you reference a variable inside a function before declaring that variable. To resolve this error, you need to use a different variable name when referencing the existing variable, or you can also specify a parameter for the function. I hope this tutorial is useful.

  7. Local variable referenced before assignment in Python

    Using nonlocal keyword. The nonlocal keyword is used to work with variables inside nested functions, where the variable should not belong to the inner function. It allows you to modify the value of a non-local variable in the outer scope. For example, if you have a function outer that defines a variable x, and another function inner inside outer that tries to change the value of x, you need to ...

  8. Local Variable Referenced Before Assignment in Python

    This tutorial explains the reason and solution of the python error local variable referenced before assignment

  9. How to Fix Local Variable Referenced Before Assignment Error in Python

    value = value + 1 print (value) increment() If you run this code, you'll get. BASH. UnboundLocalError: local variable 'value' referenced before assignment. The issue is that in this line: PYTHON. value = value + 1. We are defining a local variable called value and then trying to use it before it has been assigned a value, instead of using the ...

  10. UnboundLocalError Local variable Referenced Before Assignment in Python

    Avoid Reassignment of Global Variables. Below, code calculates a new value (local_var) based on the global variable and then prints both the local and global variables separately.It demonstrates that the global variable is accessed directly without being reassigned within the function.

  11. 4 Ways to Fix Local Variable Referenced Before Assignment Error in Python

    Resolving the Local Variable Referenced Before Assignment Error in Python. Python is one of the world's most popular programming languages due to its simplicity ...

  12. Python UnboundLocalError: local variable referenced before assignment

    UnboundLocalError: local variable referenced before assignment. Example #1: Accessing a Local Variable. Solution #1: Passing Parameters to the Function. Solution #2: Use Global Keyword. Example #2: Function with if-elif statements. Solution #1: Include else statement. Solution #2: Use global keyword. Summary.

  13. python

    UnboundLocalError: local variable 'result' referenced before assignment. To solve this, you should define result before the for loop with a default value. In addition, it sounds like the get_response function doesn't get the values you expect (i.e intents_list 's and\or intents_json 's content is different than what you are expecting).

  14. Fixing Python UnboundLocalError: Local Variable 'x' Accessed Before

    Method 2: Using Global Variables. If you intend to use a global variable and modify its value within a function, you must declare it as global before you use it. Method 3: Using Nonlocal Variables. If the variable is defined in an outer function and you want to modify it within a nested function, use the nonlocal keyword. Examples

  15. Python 3: UnboundLocalError: local variable referenced before assignment

    To fix this, you can either move the assignment of the variable x before the print statement, or give it an initial value before the print statement. def example (): x = 5 print (x) example()

  16. Local variable referenced before assignment: The UnboundLocalError

    Trying to assign a value to a variable that does not have local scope can result in this error: 1 UnboundLocalError: local variable referenced before assignment. Python has a simple rule to determine the scope of a variable. To clarify, a variable is assigned in a function, that variable is local.

  17. Python报错解决:local variable 'xxx' referenced before assignment

    在python中有一个经典错误: local variable xxx referenced before assignment #赋值前引用的局部变量xxx 这里引入两个概念: 局部变量指的在函数内部定义并使用的变量,它只在函数内部有效。 全局变量指的是能作用于函数内外的变量,即全局变量既可以在各个函数的外部使用,也可以在各函数内部使用。

  18. Python (programming language)

    Python is a high-level, general-purpose programming language.Its design philosophy emphasizes code readability with the use of significant indentation.. Python is dynamically typed and garbage-collected.It supports multiple programming paradigms, including structured (particularly procedural), object-oriented and functional programming.It is often described as a "batteries included" language ...

  19. Taking input in Python

    Developers often have a need to interact with users, either to get data or to provide some sort of result. Most programs today use a dialog box as a way of asking the user to provide some type of input. While Python provides us with two inbuilt functions to read the input from the keyboard. input ( prompt ) raw_input ( prompt )

  20. Snowpark ML Modeling: ML Model Development

    The Snowpark ML package does not currently support matrix data types. Any operation on estimators and transformers that would produce a matrix as a result fails. The order of rows in result data is not guaranteed to match the order of rows in input data. Troubleshooting¶ Adding More Detail to Logging¶ Snowpark ML uses Snowpark Python's logging.

  21. python

    In order for you to modify test1 while inside a function you will need to do define test1 as a global variable, for example: test1 = 0. def test_func(): global test1. test1 += 1. test_func() However, if you only need to read the global variable you can print it without using the keyword global, like so: test1 = 0.

  22. LangChain + RAG Fusion + GPT-4o Python Project: Easy AI/Chat For Your

    rag fusion improves traditional search systems by overcoming their limitations through a multi-query approach. GPT-4o is a higher-end model of GPT-4 Turbo announced on May 14, 2024. The "o" in GPT-4o is an abbreviation for omni. Omni is a Latin prefix that means " all, whole, omnidirectional .".

  23. KDE Gear 24.05.0 Full Log Page

    [python] ignore IPython's magic functions in imported Jupytor notebooks, not relevant for Cantor. ... rename local variable score to result. Commit. Prepare animation.py for annotations. ... better local variable name. Commit. Player.py: prepare for annotations. Commit. Prepare mi18n.py for annotations.

  24. How to Fix

    Output. Hangup (SIGHUP) Traceback (most recent call last): File "Solution.py", line 7, in <module> example_function() File "Solution.py", line 4, in example_function x += 1 # Trying to modify global variable 'x' without declaring it as global UnboundLocalError: local variable 'x' referenced before assignment Solution for Local variable Referenced Before Assignment in Python

  25. Chapter 4. New features

    Python introduces a new type statement and new type parameter syntax for generic classes and functions. Formatted string literal (f-strings) have been formalized in the grammar and can now be integrated into the parser directly. Python now provides a unique per-interpreter global interpreter lock (GIL).

  26. NUDCD3 deficiency disrupts V(D)J recombination to cause SCID and ...

    OS is particularly associated with disorders of V(D)J recombination, the complex process whereby antigen receptor loci are rearranged to produce functional TCR and immunoglobulin genes ().Although this process is absolutely required for the generation of a diverse adaptive immune repertoire, the accompanying introduction and recombinatorial repair of DNA double-strand breaks implies a moment ...

  27. python

    @HoKy22: Are you asking why dct[key] = val does not raise a "local variable referenced before assignment" error? The reason is that this is not a bare name assignment. Instead, it causes Python to make the function call dct.__setitem__(key, val). -

  28. GMD

    Abstract. Ship weather routing, which involves suggesting low-emission routes, holds potential for contributing to the decarbonisation of maritime transport. However, including because of a lack of readily deployable open-source and open-language computational models, its quantitative impact has been explored only to a limited extent. As a response, the graph-search VISIR (discoVerIng Safe and ...

  29. python

    1. The variables wins, money and losses were declared outside the scope of the fiftyfifty() function, so you cannot update them from inside the function unless you explicitly declare them as global variables like this: def fiftyfifty(bet): global wins, money, losses. chance = random.randint(0,100)

  30. Modeling oxygen transport in the brain: An efficient coarse-grid

    Author summary The cerebral microvascular network is the logistics system that provides energy to brain cells at the right time and place. Blood flow and oxygen can now be observed dynamically in living rodents, which transformed our knowledge of the system and its role in ageing and disease. However, oxygen concentration at a given location is the result of a subtle balance between local ...