text:
Fix copy to clipboard error because action is undefined

Details

Can't copy to clipboard a money request system message in a one-expense report because the action is undefined.
Fixed Issues

$ https://github.com/Expensify/App/issues/51127
PROPOSAL: https://github.com/Expensify/App/issues/51127#issuecomment-2425035891
Tests

Same as QA Steps

[x] Verify that no errors appear in the JS console

Offline tests

Same as QA Steps
QA Steps

Open a workspace chat that has no unsettled expense
Submit a money request
Open the one-expense report
Edit money request info (desc, merchant, etc.)
Right-click/long-press the system message
Choose Copy to Clipboard
Verify it copies the system message by pasting it to the composer

[x] Verify that no errors appear in the JS console

PR Author Checklist

[x] I linked the correct issue in the ### Fixed Issues section above
[x] I wrote clear testing steps that cover the changes made in this PR

[x] I added steps for local testing in the Tests section
[x] I added steps for the expected offline behavior in the Offline steps section
[x] I added steps for Staging and/or Production testing in the QA steps section
[x] I added steps to cover failure scenarios (i.e. verify an input displays the correct error message if the entered data is not correct)
[x] I turned off my network connection and tested it while offline to ensure it matches the expected behavior (i.e. verify the default avatar icon is displayed if app is offline)
[x] I tested this PR with a High Traffic account against the staging or production API to ensure there are no regressions (e.g. long loading states that impact usability).

[x] I included screenshots or videos for tests on all platforms
[x] I ran the tests on all platforms & verified they passed on:

[x] Android: Native
[x] Android: mWeb Chrome
[x] iOS: Native
[x] iOS: mWeb Safari
[x] MacOS: Chrome / Safari
[x] MacOS: Desktop

[x] I verified there are no console errors (if there's a console error not related to the PR, report it or open an issue for it to be fixed)
[x] I followed proper code patterns (see Reviewing the code)

[x] I verified that any callback methods that were added or modified are named for what the method does and never what callback they handle (i.e. toggleReport and not onIconClick)
[x] I verified that the left part of a conditional rendering a React component is a boolean and NOT a string, e.g. myBool && <MyComponent />.
[x] I verified that comments were added to code that is not self explanatory
[x] I verified that any new or modified comments were clear, correct English, and explained "why" the code was doing something instead of only explaining "what" the code was doing.
[x] I verified any copy / text shown in the product is localized by adding it to src/languages/* files and using the translation method

[x] If any non-english text was added/modified, I verified the translation was requested/reviewed in #expensify-open-source and it was approved by an internal Expensify engineer. Link to Slack message:

[x] I verified all numbers, amounts, dates and phone numbers shown in the product are using the localization methods
[x] I verified any copy / text that was added to the app is grammatically correct in English. It adheres to proper capitalization guidelines (note: only the first word of header/labels should be capitalized), and is either coming verbatim from figma or has been approved by marketing (in order to get marketing approval, ask the Bug Zero team member to add the Waiting for copy label to the issue)
[x] I verified proper file naming conventions were followed for any new files or renamed files. All non-platform specific files are named after what they export and are not named "index.js". All platform-specific files are named for the platform the code supports as outlined in the README.
[x] I verified the JSDocs style guidelines (in STYLE.md) were followed

[x] If a new code pattern is added I verified it was agreed to be used by multiple Expensify engineers
[x] I followed the guidelines as stated in the Review Guidelines
[x] I tested other components that can be impacted by my changes (i.e. if the PR modifies a shared library or component like Avatar, I verified the components using Avatar are working as expected)
[x] I verified all code is DRY (the PR doesn't include any logic written more than once, with the exception of tests)
[x] I verified any variables that can be defined as constants (ie. in CONST.js or at the top of the file that uses the constant) are defined as such
[x] I verified that if a function's arguments changed that all usages have also been updated correctly
[x] If any new file was added I verified that:

[x] The file has a description of what it does and/or why is needed at the top of the file if the code is not self explanatory

[x] If a new CSS style is added I verified that:

[x] A similar style doesn't already exist
[x] The style can't be created with an existing StyleUtils function (i.e. StyleUtils.getBackgroundAndBorderStyle(theme.componentBG))

[x] If the PR modifies code that runs when editing or sending messages, I tested and verified there is no unexpected behavior for all supported markdown - URLs, single line code, code blocks, quotes, headings, bold, strikethrough, and italic.
[x] If the PR modifies a generic component, I tested and verified that those changes do not break usages of that component in the rest of the App (i.e. if a shared library or component like Avatar is modified, I verified that Avatar is working as expected in all cases)
[x] If the PR modifies a component related to any of the existing Storybook stories, I tested and verified all stories for that component are still working as expected.
[x] If the PR modifies a component or page that can be accessed by a direct deeplink, I verified that the code functions as expected when the deeplink is used - from a logged in and logged out account.
[x] If the PR modifies the UI (e.g. new buttons, new UI components, changing the padding/spacing/sizing, moving components, etc) or modifies the form input styles:

[x] I verified that all the inputs inside a form are aligned with each other.
[x] I added Design label and/or tagged @Expensify/design so the design team can review the changes.

[x] If a new page is added, I verified it's using the ScrollView component to make it scrollable when more elements are added to the page.
[x] If the main branch was merged into this PR after a review, I tested again and verified the outcome was still expected according to the Test steps.

Screenshots/Videos

Android: Native

https://github.com/user-attachments/assets/7472d1c0-71f7-477a-a05a-1c467b17c3cf

Android: mWeb Chrome

https://github.com/user-attachments/assets/441e7ee7-0be2-46ee-bf73-37696d9e497c

iOS: Native

https://github.com/user-attachments/assets/e9f8fcb2-4330-49cd-98a5-ef783d6d4300

iOS: mWeb Safari

https://github.com/user-attachments/assets/c0febb1d-d304-4e06-958f-bf4ac96e7770

MacOS: Chrome / Safari

https://github.com/user-attachments/assets/5aedc30c-a976-48c5-80c4-8454ed922271

MacOS: Desktop

https://github.com/user-attachments/assets/8c6fedfd-6b7a-4dc6-a7b7-0891298b840f

:hand: This PR was not deployed to staging yet because QA is ongoing. It will be automatically deployed to staging after the next production release.

authors: OSBotify bernhardoj


text:
Storage not retaining selection

The storage heart and crafting terminal are not retaining selections such as the selection of craftable recipes only, storage units from MagicStorageExtra don't work with storage units from MagicStorage they are craftable yet not compatible with each other (not sure if that is intended).

The 2 mods are not designed to work together (as blocks) but MSE added compatibly to craft things using MS items. Also don't think saving the selection is a feature, but I could be wrong.

There's a config for saving the selection

Where is the config for the saving the selection exactly?

source: gharchive/issue

license: MIT

license_type: permissive

license_source: github-api


text:
Game crashes when matchmaker finds game while game update not done

When there is a new game update, and you queue for matchmaker, and the update doesnt fully get applied before the matchmaker starts, the game itself just crashes because its started while its files are updated.

Current game files should probably be downloaded at start of client before user can open Play tab.

Sure although this doesn't help as much when the patch is deployed while users are online

This is mostly caused by not being able to tell when party members are ready and so requires a change to the server protocol to fix.

It seems like the same problem can happen for slow map downloads according to forum.

Yes it only happens when you are in a party as there is no way for the party leader to know if you are ready or not before launching the game.

Maybe for the maps, but game updates are a problem fro solo players too (and maps would be as well if theyr were slower to download, which can happen). I think in general party invitation acceptance or queue joining should both be delayed until all files are ready.

forcing it to be during party invitation doesn't really solve the problem as the issue occurs when a patch is released so people would already be in a party when the change happens. The server currently doesn't send any information on what patch a launched game is supposed to run so there is no way to know if you are running the correct version when in queue unfortunately.

A lot of people (i assume, ta least it happened to me) start the client AFTER the patch has already landed and start queueing in TMM in the days or weeks after a patch release. If they didnt start a custom game before, they run into this issue.
A very tiny fraction of people are queuing at the same time as the patch hits. Thats a much harder problem to solve and impatcs a tiny amount of players.

repo: FAForever/downlords-faf-client


text:
Layer selector disappears when resizing browser window

When IFM Maps is loaded initially with at small browser window and the window i made bigger the layer selector disappears.
This is an issue with a callback in the responsive design (we currently have a single breakpoint) which does not handle the layer menu properly.

It is quite hard to modify this component of the behaviour of the layer selector without a total rewrite. Since we will be substituting it with a new layer selector at some point the on the fly behaviour change of the selector has simply been disabled.

repo: FCOO/ifm-maps

license: mit

license_source: bigquery


text:
Ontology dendogram

Homepage requires a dendogram (or force graph) visual of primary classes, similar to the famous diagram of EN 15907. Nodes should click through to entity pages.

Added general layout and styling on commit 9dc18b3bc5ab66a853876edfa542d73540332768.
Outstanding

[ ] Language translations for classes
[ ] Highlighting
[ ] Link to entity

repo: FIAF/FIAFcore-docs


text:
Fix Link to Vision Javadocs

The new Javadoc location is:
https://javadoc.io/doc/org.firstinspires.ftc/Vision/latest/overview-summary.html

repo: FIRST-Tech-Challenge/ftcdocs


text:
PyOpenpose Render without ther original Image - Only the pose

Let's take the example of the repository:
import cv2
import os
import PyOpenPose as OP

OPENPOSE_ROOT = os.environ["OPENPOSE_ROOT"]

img = cv2.imread("galloping knights.jpg")

op = OP.OpenPose((656, 368), (368, 368), (1280, 720), "COCO", OPENPOSE_ROOT + os.sep + "models" + os.sep, 0, False)

op.detectPose(img)

viz = op.render(img)

cv2.imwrite("result.jpeg", viz)

# getKeypoints returns an array of matrices
# When POSE is requested the return array contains one entry with all persons.
persons = op.getKeypoints(op.KeypointType.POSE)[0]

print("Found", persons.shape[0],"persons.")
print("Result info:",persons.shape, persons.dtype)

print(persons[0])

Is there anyway to overlay the pose on a black background instead of the image itself ?
This would give something like this:

And doing this does not work:
result = viz - img
cv2.imwrite("result.jpeg", result)

I obtain a ton of artifacts

Thanks

Just provide an empty image to op.render
i.e
canvas = np.zeros_like(img)
viz = op.render(canvas)

authors: DEKHTIARJonathan padeler

repo: FORTH-ModelBasedTracker/PyOpenPose


text:
You have to sign in to use Huraga

Huraga forces you to login before letting you see any content in the website.
New visitors shouldn't have to sign up to see what's sold.

i wasnt sure if this was the same issue so i posted it: https://github.com/FOSSBilling/FOSSBilling/issues/306

i wasnt sure if this was the same issue so i posted it: https://github.com/FOSSBilling/FOSSBilling/issues/306

it's unrelated.

thanks

Resolved after PR was merged

authors: BelleNottelling evrifaessa weismannweb

repo: FOSSBilling/FOSSBilling


text:
Allow fixed-size versions to be aligned, allow many fixed-size versions for single target

Many fixed size copies may be generated for single target (by passing an array instead of object)
fixed size copies may be aligned horizontally and vertically (for example top-left)

No breaking changes are introduced.
In next minor release (0.5.0) I suggest:

replacing fixedSizeVersion with fixedSizeVersions for consistency and dropping support for both true and object values for this setting: only array input should be supported.
dropping support for default suffix of -fixed-size in favour of -center-middle

Since this PR was not updated for several years, I will be closing it.

source: gharchive/pull-request

authors: jonathantneal jrencz

repo: FWeinb/grunt-svgstore


text:
JDK8 project

I hope to use it on my JDK8 project, what should I do

0.11.3 can use

repo: FXMisc/RichTextFX


text:
Add Hint

Always check the main repository for new commits or update

Use "Resolve conflicts" button

repo: FaMaHo/refactored-waddle


text:
Keyboard is still appearing  during recording

I'm using 1.1.7-bete Both iOS and Android still show the keyboard during recording
        /// <summary>
        ///     When overridden, allows application developers to customize behavior immediately prior to the
        ///     <see cref="Page" /> becoming visible.
        /// </summary>
        protected override void OnAppearing()
        {
            ScreenSecurity.Default.ActivateScreenSecurityProtection();
            base.OnAppearing();
        }

        /// <summary>
        ///     When overridden, allows the application developer to customize behavior as the <see cref="Page" />
        ///     disappears.
        /// </summary>
        protected override void OnDisappearing()
        {
            ScreenSecurity.Default.DeactivateScreenSecurityProtection();
            base.OnDisappearing();
        }

.
![20240805_085305000_iOS](https://github.c

om/user-attachments/assets/1f5873d8-53d3-4e9c-b8a1-dc71244b60df)

Hi @CalbinKing , hope you're doing well.
Unfortunately, this is impossible to archive because the keyboard and other stuff are OS related and we cannot control them. The only way to hide the keyboard from recording and screenshots is by setting IsPassword property of an Entry control to true, Apple designed it to be this way.
Best I can do is create an EventHandler only for iOS, that is triggered when recording starts/ends and you can see how to handle the situation.
Let me know if that will work for you.

I've added an event handler to check if a screenshot was taken or a screen recording is happening, feel free to check the latest version, maybe you can react to it and make some implementation to hide or disable the keyboard.

authors: CalbinKing FabriBertani


text:
Re add names to documented rules that were previously autonamed.

Related to #1493

Looks to me like a bug with stitch's name inference?

repo: FabricMC/yarn


text:
Move message related stuff to a new package

Resolves #3157
Also dropped Chat from ChatMessageSignature and SignedChatMessage, given non-chat-invoked commands now also send "signed chat message" (mojank?)

@apple502j Since MessageDecorator rename has been made, can your update this pr too?


text:
Incompatible with sodium version 0.5.8 for minecraft version 1.20.1

Describe the Bug
Incompatible mods found!
A potential solution has been determined, this may resolve your problem:
- Replace mod 'Create' (create) 0.5.1-d-build.1161+mc1.20.1 with any version that is compatible with:
- sodium 0.5.8+mc1.20.1
More details:
- Mod 'Create' (create) 0.5.1-d-build.1161+mc1.20.1 is incompatible with version 0.5.0 or later of mod 'Sodium' (sodium), but a matching version is present: 0.5.8+mc1.20.1!
Reproduction Steps

install sodium 0.5.8 for minecraft version 1.20.1
install create
3.run the game
...

Expected Result
Incompatible mods found!
net.fabricmc.loader.impl.FormattedException: Some of your mods are incompatible with the game or each other!
A potential solution has been determined, this may resolve your problem:
- Replace mod 'Create' (create) 0.5.1-d-build.1161+mc1.20.1 with any version that is compatible with:
- sodium 0.5.8+mc1.20.1
More details:
- Mod 'Create' (create) 0.5.1-d-build.1161+mc1.20.1 is incompatible with version 0.5.0 or later of mod 'Sodium' (sodium), but a matching version is present: 0.5.8+mc1.20.1!
at net.fabricmc.loader.impl.FormattedException.ofLocalized(FormattedException.java:51)
at net.fabricmc.loader.impl.FabricLoaderImpl.load(FabricLoaderImpl.java:195)
at net.fabricmc.loader.impl.launch.knot.Knot.init(Knot.java:146)
at net.fabricmc.loader.impl.launch.knot.Knot.launch(Knot.java:68)
at net.fabricmc.loader.impl.launch.knot.KnotClient.main(KnotClient.java:23)
at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103)
at java.base/java.lang.reflect.Method.invoke(Method.java:580)
at org.multimc.onesix.OneSixLauncher.launchWithMainClass(OneSixLauncher.java:243)
at org.multimc.onesix.OneSixLauncher.launch(OneSixLauncher.java:278)
at org.multimc.EntryPoint.listen(EntryPoint.java:143)
at org.multimc.EntryPoint.main(EntryPoint.java:34)
Screenshots and Videos
No response
Crash Report or Log
No response
Operating System
Windows 10
Mod Version
0.5.1f
Minecraft Version
1.20.1
Other Mods
sodium version 0.5.8 on mincreaft 1.20.1
Additional Context
No response

currently create 0.5.1d sodium 0.4.10 fabric api 0.88.1 iris 1.6.4 and indium 1.0.21 are the precise versions you want.
a fix is in the works

Dupe of #1039

is there a planned release date, any communication is helpeful, sorry if im being pushy, i understand this is a large project

there is not

authors: GwenBlanketKnight IThundxr TropheusJ drwoops pauliesnug

repo: Fabricators-of-Create/Create


text:
Add automatic publishing to Modrinth

Adds a GitHub Actions workflow to automatically publish to Modrinth (and CurseForge for the CF launcher, but not mmc). Closes #462.
You'll need to set the secret MODRINTH_TOKEN secret to a valid token to the Modrinth API, and the secret CURSEFORGE_TOKEN to a valid token to the CurseForge API.

Maybe for CF as well (?)

Let's test in production 🎉


text:
Can we reduce the moment(range rotation) speed ?

Hi @jfmaeck,
sorry we have disturb You again,
we can able to reduce the moment(range rotation) speed ?
Thanks :octocat:

Sorry, I don't think this is possible at the moment.

Ok @jfmaeck.

authors: baladkb jfmaeck

repo: FaiblUG/jQuery-Lcn-Circle-Range-Select


text:
96 pallet onboarding

Design of the nft and Onboarding pallets

Codecov Report

Merging #106 (b7ddcbb) into main (9bcff90) will decrease coverage by 6.54%.
The diff coverage is 0.00%.

@@            Coverage Diff             @@
##             main     #106      +/-   ##
==========================================
- Coverage   60.34%   53.79%   -6.55%
==========================================
  Files          22       25       +3
  Lines        1339     1502     +163
==========================================
  Hits          808      808
- Misses        531      694     +163

Impacted Files
Coverage Δ

pallets/nft/src/functions.rs
0.00% <0.00%> (ø)

pallets/nft/src/lib.rs
0.00% <0.00%> (ø)

pallets/nft/src/types.rs
0.00% <0.00%> (ø)

pallets/roles/src/structs.rs
90.00% <0.00%> (-6.43%)
:arrow_down:

runtime/src/lib.rs
3.07% <ø> (ø)

Continue to review full report at Codecov.

Legend - Click here to learn more
Δ = absolute <relative> (impact), ø = not affected, ? = missing data
Powered by Codecov. Last update 9bcff90...b7ddcbb. Read the comment docs.

There are 2 "onboarding" issues. This one seems to me to be like a "pallet nft" issue. In that case, waiting for the tests completion.

The latest commits are all about the nft pallet. below is a summary of what was accomplished:

[ ] Implement basic nft calls in the pallet (create_collection/mint/destroy_collection/burn/transfer/etc...)
[ ] Implement nft functions that might be useful later in function.rs (they are not actually used and their presence might bring the code coverage down)
[ ] Connect pallet_nft to pallet_roles
[ ] Implement & define permissions attached to pallet_nft calls based of pallet_roles
[ ] pallet_nft Benchmarking
[ ] pallet_nft testing

What was don in the latest commit.
Nft-Pallet:

User should not have to think about nft's item indexes. items indexes are auto generated and tracked according to their collection. They are not used as parameters anymore.
Updated testing and benchmarking to fit above modifications

Onboarding-Pallet:

2 helpers functions:

create_asset: creates the nft
do_buy: executes the buying transaction
These 2 functions will be used in a submit-proposal pallet-call (next-step) which will submit the proposal to the Vote-pallet for review.

ToDo:

[ ] Add Vote-pallet to the runtimne in order to access necessary calls for proposal submission
[ ] Add the submit-proposal pallet call.
[ ] Testing and Benchmarking for onboarding-pallet
[ ] Documenting nft-pallet & onboarding-pallet
[ ] track and correct bugs

The do_buy() function in onboarding is doing a check between the origin and the owner of the collection. This may fail as the do_buy() function at the end of the voting is called with the origin of the submit_proposal() function, that is the owner. In that case, he proposal is executed but the function stops at this check. As it's a function to have the complete workflow, the check origin/owner should be changed.

authors: codecov-commenter letodunc ndkazu

repo: Fair-Squares/fair-squares


text:
Edit button not appear on many vouchers journal, receipt etc

Edit button not appear on many vouchers journal, receipt etc

nahi aa rahi button kayi jagah abhi bhi

repo: Fammeo/EasyCloudBooks


text:
label should be change in some pages

Describe the bug
Action multi name change to --> Actions
Screenshots


text:
How add custom value to textInput when press on cell

It seems that the getDefaultValue only runs once and it does not help me when I put my custom state on that property.
I'm test too with textInputProps sending onChangeText function, but it's no good, because when the _onPress is executed it is forced to take the value of rowData.description and I lose control over that state. code here.
I would like to know if there is a way to achieve this and if it is not possible, then I would appreciate it being implemented for an upcoming version

Hi @jose920405
Did you try to call onChangeText right after onPress callback? It might help

Hey, Thanks for your advise, but I ma not sure we can reach onChangeText
Example:
<GooglePlacesAutocomplete
          placeholder='hey!'
          minLength={2} // minimum length of text to search
          autoFocus={false}
          listViewDisplayed='auto'    // true/false/undefined
          fetchDetails={true}
          renderDescription={(row) => row.description} // custom description render
          onPress={(data, details = null) => { // 'details' is provided when fetchDetails = true
            // console.log(data);
            // console.log(details);
            this.onChangeText('');

of course this.onChangeTex is undefined..
Thanks for your help

Hi @alan345 @jose920405
Look like this is a duplicate of https://github.com/FaridSafi/react-native-google-places-autocomplete/issues/84
Use setAddressText component method to take control over text input value.

@mayask Can you write example how to use setAddressText component method?


text:
arXiv '20 | Offline reinforcement learning: Tutorial, review, and perspectives on open problems.

Levine S, Kumar A, Tucker G, et al. Offline reinforcement learning: Tutorial, review, and perspectives on open problems.

相关文献

Ghosh D, Rahme J, Kumar A, et al. Why generalization in RL is difficult: Epistemic POMDPs and implicit partial observability.
Kirk R, Zhang A, Grefenstette E, et al. A survey of generalisation in deep reinforcement learning.

Offline 强化学习在 2019 年由 UC Berkeley 的大佬开出来的坑。**Offline RL 舍弃了和环境的交互，让 agent 在一个固定的数据集（batch）上进行训练，从而得到想要的策略。**这样不就可以直接解决强化学习采样效率低下，采样昂贵的问题。而限制强化学习大规模应用的主要原因之一，是需要和环境进行实时交互，来实时收集数据，以提高策略。但是，在很多应用中，样本收集很困难，或者很危险。所以，实时的和环境进行交互是不太可能的，所以发掘一种可以仅利用之前收集的数据来训练的方法非常重要。

Offline RL 的问题描述和大致概述
什么是Offline强化学习？
下图中给出了三幅图，非常详细地解释了Offline RL、online RL和Off-policy RL之间的区别。

Offline RL可以被定义为data-driven形式的强化学习问题。在不和环境交互的情况下，来使目标最大化：

我们给算法提供一个静态的数据集：

并且通过数据集来学到最好的策略。其本质上，Offline RL需要学习算法从固定的数据集中获得对MDP的充分理解，并构造一个策略π(a|s)，以在实际交互中获得最多的累计奖励（return）。本文中用πβ表示数据集D中的状态和动作分布，比如(s, a) ∈ D，并且 s ∼ dπβ (s)，而动作是根据行为策略采样而来，a ∼ πβ(a|s)。

Offline RL中的困难
造成 Offline RL 学习困难的原因有很多。其中最主要的困难是：学习算法需要完全的依赖于静态数据集 D，但是没有办法提高探索，因为不和环境进行交互，就无法知道探索得到的数据是否有效，所以 Offline RL 不可能通过探索发现高奖励的区域。而且，并没有办法解决此问题，所以，假设数据集D 可以充分的覆盖高奖励的转移对。
这好像并没有影响Offline RL去学习环境背后的MDP结构，只是会受到数据本身的影响，不知道是否覆盖高奖励转移对，影响后期的control问题。

前面无法确定数据集D中是否包含高奖励转移对，还只是数据收集的问题。另外一个非常微妙，并且实际中更加重要的挑战是，Offline RL 需要从观测到的数据集 D 中，学习到一个超越 D 中观测到的数据的策略。这时候问题就来了，在之前的监督学习中，我们希望从训练数据集中学到网络可以在测试数据集上获得较好的性能，且测试数据和训练数据是独立同分布的。而 Offline RL 中，我们希望学到的策略和在数据集 D 上观测的不一样，所以会造成非常严重的分布偏移的问题。
Offline RL 中训练目标和最终想得到的目标并不一样。那么，我们的函数模拟器（策略，值函数，模型）需要在一个分布下训练，而将在不同的分布下评估，为了最大化累计收益，对于同一个状态，新策略也会给出不同的动作。

目前数据分布偏移问题，有很多的解决方式，最简单的一种即为在训练过程中限制一些东西，比
如，分布偏移的下界。比如，限制目标策略 π(a|s) 和行为策略 πβ(a|s) 的差异程度，我们可以约束状
态的分布位移。

接下来将简要的描述分布偏移在 MDP 中对策略造成的不利影响。假设，我们对于每一个 s ∈ D都提供了最优的动作标签 a∗。那么，我们期望如果没有被提供这些最优的动作标签 a∗，我们的策略依然可以获得同样好的性能。那么，损失函数可以定义为：

如果使用监督学习的思想（标准经验误差最小化）来学习，可以得到如下结论：
这意味着，考虑时间步为 H 的情况下，在离线强化学习中误差上界和时间步之间是平方关系，而在在线强化学习中是线性关系。直觉上感觉，造成这样的原因是因为，学习策略 π(a|s) 可能会进入和训练分布差距很远的状态，这将导致 dπ(s) 和 dπβ (s) 差距非常大。那么，当策略在 t 时刻遇到了分布之外（数据集中没见过）的状态，那么策略在之后的 H − t 个时刻就有可能不断的犯错，所以累计误差为 O(H)，而且每一个时间步，都有可能进入分布外的状态，所以整体误差为 O(H^2)。但是在在线学习中，不会遇到分布外的状态。这个现象提示我们，如果不注意尽量的减少不利的影响，分布偏移可能会对从任何一个固定数据集中学习到的策略，都造成非常大的影响。

基于重要性采样的 Offline RL 与离线策略评估
事实上所有的 off-policy 算法都可以改为 offline 算法，最直接的方法之一就是重要性采样，利用
从 πβ(τ ) 中采样出的轨迹来估计 J(π)。这部分，我们将回顾 off-policy 中使用重要性采样来进行策略评估的方法，并且讨论如何将重要性采样运用到 offline RL 中。
Off-policy中通过重要性采样估计
可以通过重要性采样来获得J(π)的无偏估计：

其中，

并且{s0,a0,r0,s1,...}是从πβ(τ ) 中采样出的 n 条轨迹。但是不幸的是，由于重要性权重的连乘这样的估计方法可能会有很高的方差，CS 598 note 6 中给出了证明，其方差为

其中 K 等于的动作空间的大小。简单的处理方法是将权重进行归一化，除以

这样使得重要性采样不再是无偏估计，但是可以使得方差减小，其效果依然非常好。统计里面评估参数估计的好坏有三个性质：无偏性，有效性，一致性，方差一高，有效性就低。

考虑到当 t′ > t 时，rt 和 st′ 和 at′ 无关，所以，可以将 t 时刻之后的重要性权重都舍弃掉，就得到了 pre-decision 重要性采样估计的一般形式：

这样虽然可以通过减小重要性权重来减小方差。实际上，这样的做法仍然会导致很大的方差。如果，我们使用近似的模型 Qˆπ(st, at) 来模拟 Q 函数，并将其合并到公式 (4) 中，就得到了大名鼎鼎的 doubly robust estimator。
其思想为：之前分析了重要性采样的方差为 r^2(K − 1)，由于 K 是不能改变的，所以自然的想到减去一个常数，使方差为 (r − c)^2(K − 1)，当 c = r 时，方差降到０，所以用 Qˆπ(st, at)来近似 r 。并且，双重鲁棒重要性采样一定是无偏估计。（此部分来自于 CS 598 note 6）

当然还有很多很多的采样方法，这些采样方法都可以用来做策略提升。在 offline RL 中，我们希望可以改进行为策略，以保证算法的性能有很高的概率不低于一个边界。

Off-Policy 梯度下降
通常我们研究 policy gradient 都是在 on-policy 算法中，这是因为策略不能用其他策略产生的数据更新。而重要性采样可以直接被用于估计策略梯度，而不是先求值函数在得到策略。策略梯度方法则是通过优化 J(π)，直接对策略函数参数的梯度进行估计，来优化策略函数。而我们在这部分将策略梯度的方法扩展到 Offline RL 中。
Off-Policy 算法中，轨迹 τ 是从行为策略中采样出的，并且 πβ(a|s) ̸= π(a|s)。接下来将从 Off-Policy算法出发，讲述 offline RL 中的扩展和挑战。策略梯度可定义为：

其中，

1 是从 πβ(τ ) 中采样出的 n 条轨迹。和前面分析的一样，当 t′ > t 时，rt 不依赖于 st, at，所以在计算 t 时刻的奖励时，可以不考虑 t′ 时刻的动作和状态，所以可以舍弃 t′ 时刻的重要性权重，于是得到了 per-decision 重要性策略梯度估计：

7)
实际应用中，策略梯度估计的方差非常大，到时很难 work。为了降低方差，和前面重要性采样估计一样，有对重要性权重进行归一化的方法，同时也有双重鲁棒估计的方法。而且，Off-Policy 算法中经常将重要性权重作为正则化项，以保证学习策略 πθ(a|s) 和采样策略 πβ(a|s) 之间差距不会太大。

通过 softmax 函数，使得

在样本有限的情况下，这样的做法会自动的调整策略πθ，使得最少有一个样本的重要性权重较大。目前，基于重要性采样的深度强化学习算法，通常采用基于样本的 KL 散度正则化项，比如大名鼎鼎的TRPO。

近似 Off-Policy策略梯度
重要性采样的目标函数，需要将每个时刻的重要性权重连乘起来，所以会导致非常大的方差，这或许就是重要性采样方差较大的本质原因。所以，我们使用行为策略得到的状态分布 dπβ (s)，代替当前策略 dπ(s)，推导出近似的基于重要性采样的梯度。近似估计的结果是有偏估计，dπβ (s) ̸=dπ(s)，但是在实际应用中效果还不错。这里用 Jβ(πθ) 来表示目标函数，以强调对行为策略的依赖，写作：

注意，Jβ(πθ) 和 J(πθ) 中的状态分布不一样，导致 Jβ(πθ) 是对 J(πθ) 的有偏估计。很显然，在 Offline RL 中，在 dπβ (s) 下估计，可以简单的直接从数据集 D 中进行采样，不需要进行重要性采样。而且，大家发现这个偏差在实际应用中是可接受的。所以，策略梯度被写成如下所示，并且此近似梯度被大规模的应用于深度强化学习算法中。

其中，为了估计策略梯度的近似值，我们需要估计 Qπθ (s, a)。之后，将详细的讨论在 Offline RL中如何估计价值函数。

边缘化重要性采样
本小节，边缘化重要性采样比较的难懂，我参考了 CS 598 的 Marginalized Importance Sampling，里面讲的比较详细。前文中我们详细的描述了重要性采样有较大的方差，而且用 Off-Policy 的策略梯度估计是有偏估计。如果，我们想避免因为错误的状态分布而导致偏差，还有对每个动作计算重要性采样率并连乘导致的较大的方差。所以，找到了一个取代的方法，直接估计边缘状态的重要性：

对于一个策略，我们可以采用定义为按照策略获得的规范化的预期奖励来评价：

基于前向贝尔曼方程的方法
基于前向贝尔曼方程的方法：意思是，ρ(π) 满足前向贝尔曼方程：

这个公式理解起来并不难，左边拆开就是，dπθ (s′)。这个方程可用于使用时间差分更新来估计当前策略下的 ρ(π)。
比如，当使用随机梯度更新，Gelada 和 Bellemare 等人提出只有如下方法来在线更新 ρ(π)：

其中，s ∼ dπβ (s′)，a ∼ πβ(a | s)，s′ ∼ T (s′| s, a)。其他额外的技术，包括 T D(λ) 估计，自动调节特征维度，也可以用来稳定学习过程。
而 Liu 等人提出了用对抗的方法来获得 ρ(π)。从公式 (16) 中，可以推断出公式：

对于 ∀f，当且仅当 ρ = ρπ 时有 L(ρ, f) = 0。其中，ρ 为生成器，f 为判别器。那么，目标函数可以写为一个求鞍点的问题，

计算出 ρ∗ 就可以用来估计 Off-Policy 梯度了。同时 Zhang 等人提出了另一种使用贝尔曼前进方程直接优化贝尔曼残差的方法，这就是 Bo Dai 他们的那一套方法，直接优化两个分布间的 f 散度。此方法优化的是公式 (11) 的 f 散度，并且增加约束对 ρπ 进行归一化，来防止模型坍缩。

然后，Bo Dai 使用了凸共轭的技巧，在对偶空间求解此目标函数，并且可以避免由于采样估计造成的偏差。读者可以详细阅读 Gendice: Generalized offline estimation of stationary values.

基于凸共轭方法的后向 Bellman 方程
此小节最后，我们将讨论使用后向 Bellman 方程（后向 Bellman 方程使用凸共轭得到了类似泛函的价值函数，其中泛函的意思为函数的函数，个人看到这理解的是建立以一个关于 ρπ 的函数）对off-policy 的策略估计和提升。此类方法中用到了成熟的凸优化技巧。最先是 Lee and He (2018) 等人提出了将应用于凸优化的工作扩展到 Off-Policy 策略优化中。他们证明了 Off-Policy 的采样复杂度下界，然而，将凸优化中的技术扩展到 RL 中很具挑战性。
Nachum 等人用类似的方法来进行 Off-Policy 评估。其主要思想是将其转换为一个优化问题，读原文才知道，此处采用的是凸共轭，凸优化问题为

其中，令 ν : S × A → R 为任意的价值函数，并满足：

此处可以定义一个修正的 Bellman 算子，

这和没有 r(s, a) 项的贝尔曼算子 B˜π 很类似。在 DualDICE: Behavior Agnostic Estimation of Discounted Stationary Distribution Corrections 的 3.2 中详细的推导了，公式(20) 的优化问题，可以写为：

公式 (22) 的最优解为 ν∗，那么就可以利用 x(s, a) = ν(s, a) − B˜πν(s, a) 计算得到 ρπ(s, a)，可用于off-Policy 评估和提升。
类似的在 Algaedice: Policy gradient from arbitrary experience 中用类似的方法设计了一个Off-Policy RL 算法。其核心思想是通过求解一个优化问题得到 On-Policy 问题的策略梯度估计。公式表达为，

其中，

通过使用对 f 散度的对偶可以得到：

利用改变变量的技巧，将公式 (24) 变成一个鞍点优化问题，

其中 Q 为 Q 函数，满足

。其中，f(x) = x^2，f∗(x) = x^2，这一目标简化为应用常规的 AC 算法就可求解，但是注意附加了条件，优化在初始状态s0 时刻的 Q 值。假设在最优解 Q∗ 的情况下，函数 L(Q∗, πβ, π) 策略梯度为正规化政策梯度问题中的on-policy 的策略梯度：（具体过程需要阅读 Algaedice: Policy gradient from arbitrary experience）

其中 Q˜π 是对应于正则化 RL 问题的行为-价值函数。这篇文章的核心创新点在于使用对偶方式构建的 Off-Policy RL 算法，计算梯度时只依赖 Off-Policy 数据，并且这些数据可以从任意行为策略收集而来。计算出的对偶函数的梯度就是原来的 On-Policy 的策略梯度，所以他们的做法有效的避免了求重要性权重。

挑战和开放性问题
第三部分中，我们讨论了不同形式的重要性采样估计当前策略 πθ 的累积回报期望或者估计策略梯度的方法。本节中讨论的策略提升的方法主要是针对经典的 Off-Policy，其中附加的数据是在线收集的，但重用之前的数据以提高效率。据我们所知，这些方法还没有普遍应用于离线环境中。
将这些方法运用到完全 offline 的 RL 中，将会主要遇到下列一些问题。

重要性采样通常会陷入高方差的问题，这个方差在连续设置中将急剧增加，因为在连续的时间步长的重要性权重是相乘的（比如公式 (6)），这将导致误差指数级的累积。近似和边缘重要性抽样方法在一定程度上缓解了这一问题，避免了多个时间步长的重要性权重相乘，但根本问题仍然存在：当行为策略 πβ 与当前学习的策略 πθ 差异过大时，其重要性权重会发生退化，任何对 return或梯度的估计都有较大的方差而无法使用，特别是在高维状态和行为空间中，或者对于采样轨迹很长的问题。在策略 πθ 只与行为策略 πβ 偏差较小的情况下，重要性抽样估计是最合适的。在经典的 off-policy 设置中，使用重要性采样是因为，其问题本身通常是符合这种情况的，因为使用最新的策略收集到新的轨迹会重复收集并添加到数据集，但是在 offline 中，通常不是这种情况。这样在 offline 中，非常容易产生行为策略 πβ 与当前学习的策略 πθ 差异过大的情况。所以，限制重要性采样在 offline RL 中的应用的主要困难是，1. 策略 πθ 与行为策略 πβ 偏差较大；2. 状态和动作空间维度过大；3. 采样的轨迹过长（有效视界过长）。
在 Off-Policy 估计梯度的方法中，最有效的方法要么需要估计值函数，要么需要通过动态规划估计状态边缘密度比率。动态规划方法在 offline 中存在分布漂移的问题（策略得到的动作和原数据中不一样），这使得在不进行额外修正的情况下很难稳定地学习值函数。在经典的 Off-Policy 中，这个问题没有那么严重，因为 off-policy 可以额外的收集最新数据。

动态规划下的 Offline RL
动态规划方法，比如 Q-learning 算法，与策略梯度法相比，原则上可以为离线强化学习提供更有吸引力的选择。在第 4.1 节中，我们将讨论基于线性函数近似的一种较老的方法，它们也被有效地用于深度神经网络函数近似器。比如，kalashnikov 等人提出了描述了一种名为 QT-Opt 的 Q-learning 算法，该算法能够从之前实验过程中记录的约 50 万次抓取试验中学习有效的基于视觉的机器人抓取策略，但观察到额外的 online 微调，和单纯根据记录的数据训练的策略相比，仍然大大提高了策略的性能。实际上一些关于 offline RL 的工作也注意到，对于某些类型的数据集，传统的动态规划算法，如deep Q-learning 或确定性 AC 算法，实际上也可取得较好的效果（An optimistic perspective on offline reinforcement learning）。
但是，实际使用中，这样的方法在 offline RL 中会遇到很多的问题。其中，最重要的是我们之前提到的分布偏移问题，解决分布偏移问题的方法可以大致分成两类，1. 4.3 小节中将描述的策略约束方法，以减小学习策略 πθ 和行为策略 πβ 间的某种距离，来减小分布偏移。2. 4.4 小节中将描述的非确定性方法，此类方法试图估计对 Q 值的不确定性，然后利用这种不确定性来发现分布位移。在 4.5小节中，将总结所有类型的分布偏移修正方法，并总结其开放性问题和面临的挑战。

基于线性价值函数的 Off-Policy 价值函数估计
文章中首先讨论了基于线性函数近似的价值函数和策略估计的标准 offline RL 算法，算法本身并不能减轻分布偏移的影响，但当有好的线性特征时，算法依然效果不错。现代深度强化学习方法通常避开线性特征，倾向于非线性的神经网络函数逼近器，而大量的文献中线性方法是离线强化学习算法的重要组成部分（Batch reinforcement learning）。首先介绍的是，使用线性函数来近似 Q 函数，

f(s,a)T表示为状态动作对 (s, a) 的线性特征。而对学习策略 π(a|s) 的 Q函数估计，是通过对行为策略 πβ(a|s)，而状态分布为 dπβ (s)。并且，贝尔曼算子表示为：

由于用线性近似来表示 Q 函数，那么 Q 函数可以看成是线性函数集合中的一个解，并可以通过最小化均方误差进行求解。这看上去很简单，下面我们将介绍不同的求解 Qπ 的方法。再强调一遍Q函数是关于特征 f(s, a) 的线性函数，而线性特征 f(s, a) 的表格形式为 F ∈ R|S||A|×d，这样可得到
Qϕ = Fϕ。下面主要介绍两种求解线性近似器的方法。

贝尔曼残差最小化
核心思想为寻找合适的 ϕ 使贝尔曼残差最小化。首先，将 Bellman 方程写成 Bellman 算子形式，并将其扩展为使用奖励函数的向量化表达式，R，和一个线性算子 Pπ 来表示动力学转移过程，于是有

而是，贝尔曼方程可以表示为：

求解此方程写出最小二乘解，我们得到：

表达式中求解的是伪逆，此表达式使 Bellman 残差 (Bellman 方程左、右两边的差的平方) 的 2 范数最小化，并被称为 Bellman 残差最小化解。

最小二乘不动点近似
4.1.1 中描述的方法，很显然存在着求逆的问题，当求解空间较大时，直接求解出最优解非常困难。另一种方法是使用投影不动点迭代，而不是直接最小化贝尔曼误差，来得到最小二乘不动点近似解。实际上，对强化学习有所了解的同学知道，贝尔曼方程是符合压缩映射定理的。最小二乘不动点近似方法中，迭代 Bellman 算子直到收敛，即为

当 k → ∞ 时，收敛到唯一的解 Qπ。此方法中，使用函数来近似表示 Q但是，并不要严格的使

因为可能没有 ϕ 可以非常准确的表示 BπQk。需要明确的是，我们求解的是 ϕ，而 Qk = Fϕk，那么可以将 Bellman 方程做如下改写：

通过，迭代的计算

可以求解出 Bellman 算子的不动点。
但是，当真正的 Q 函数不在 F 张成的空间中时 (比如：Q 函数不能线性表示)，不同的方法通常
会得到不同的解。首先，我们可以猜测，一个好的线性拟合方法需要找到 Q 函数：Fϕ，它对应于真实的 Qπ 在 F 定义的超平面上的最小二乘投影。可惜，Bellman 残差最小化和最小二乘不动点一般都不能得到这个解。然而，通过 Bellman 残差最小化得到的解可能更接近真实 Q 函数，因为它是通过直接最小化 Bellman 残差得到的。最小二乘不动点迭代得到了一个 Q 函数，它是投影 Bellman 算子的不动点，但可能是任意次优的。然而，根据经验，最小二乘不动点比 Bellman 残差最小化更加具有计算可行性。实际上，并没有理论来讨论，哪个算法一定就比较好。在实践中，与 Bellman 残差最小化相比，最小二乘不动点迭代可以产生更有效的策略，而 Bellman 残差最小化方法求解过程更稳定，结果比较唯一。

最小二乘时间差分 Q-Learning (LSTD-Q)
接下来描述的 LSTD-Q，是一种从静态数据集直接采样来估计 Qπ 的方法。如果，采用增量式更新的方法，

7)
所以，通过计算

就可以计算出 ϕ 了。注意，LSTD-Q 算法不直接适用于估计最优 Q 函数 Q∗，因为 Q∗ 的最优 Bellman 方程由于存在最大化操作而不是线性的，因此不能以封闭形式求解。

最小二乘策略迭代 (LSPI)
最后，我们讨论最小二乘策略迭代 (LSPI)，这是一种经典的离线强化学习算法，它使用对 Q 函数的线性近似来执行近似的策略迭代 (见 2.1 节的讨论)。LSPI 使用 LSTD-Q 来近似策略评估，于是就能得到对 Qπ 的估计，记为 Qϕ。然后，根据 Qϕ 使用贪心策略来进行策略迭代，比如

LSPI 的一个重要的特性是，当动作是离散的时，它不需要单独对策略近似表示，因此消除了 AC 算法中由于 Actor 的函数近似而产生的误差。

动态规划在 Offline 强化学习中产生的分布偏移问题
分布偏移在训练阶段和测试阶段都会对使用动态规划方法的 offline RL 产生影响。因为 Q 函数是通过 πβ 获得的数据集来学的，他的 state distribution 和 action distribution 和自己用学出来的 π 所采样出来的 state 和 action 的分布是不一样的。在测试阶段，offline RL 训练策略的状态访问概率分布 dπ(s) 与训练数据的状态访问概率分布 dπβ (s) 存在系统差异。这意味着，策略梯度算法中，对于状态 s ∼ dπβ (s) 通过 AC 算法可能会产生意想不到的错误动作。减小分布偏移的方法是限制学习策略和行为策略之间的散度。比如

可以得到 DKL(dπ(s)∥dπβ (s)) 的下界为 δ，且 δ ∝ O(ϵ/(1 − γ)^2)。这个下界在实际中是非常松散的，但仍然表明，通过限定学习到的策略与收集离线训练数据的行为策略的偏离程度，可以减轻状态分布转移的影响。然而，这样的做法可能使最终性能不那么好，因为行为策略 (以及与之接近的任何策略) 可能比从 offline 数据中学到的最佳策略差得多。
需要注意的是，对于前面讨论的算法，状态分布偏移影响测试阶段的性能，但对训练没有影响。而在训练的时候，state 的分布没偏移，因为用到的 state 数据只有 πβ 采出来的数据 D，无论是策略还是 Q 函数都不会在任何非从 dπβ (s) 中采样得到的状态下求值。而 action 的分布偏移了，因为训练时自己学的 action 是通过最大化 Q 来得到的，因此可能不在 D 中, 那么 Q 的估计就不准，在不断的训练迭代中累积误差。所以解决 action distribution shift 是非常关键的。详细的说，Bellman 方程依赖于

评估 Qπ(st+1, at+1) 时，如果 π(a|s) 和 πβ(a|s) 有较大的差别，就会导致对目标 Q 值的估计有很大的偏差。又由于

的操作是问题进一步加剧，这意味着如果策略产生超出分布的行为，而学习到的 Q 函数会错误地产生过大的值。
分布偏移问题，在实际中将会带来巨大的问题，“unlearning”。

通过上述的实验可以观察到，学习曲线类似遇到了过拟合的情况：回报首先提高，然后随着训练的进行急剧下降。然而，即使我们增加数据集的大小，这种“过拟合”效应仍然存在，这表明这与经典的统计过拟合不同。然而，随着 Q 函数训练的时间越来越长，目标值错误越来越大，整个 Q 函数都退化了。
所以，如何解决动作的 out-of-distribution (OOD) 问题是使用动态规划方法求解 offline RL 问题的关键。下一节将会讨论“策略约束”的方法来解决此类问题。

策略约束在 Off-policy 评估和提升中的运用
通过动态规划进行离线强化学习的策略约束方法背后的基本思想是，使得 π(a′|s′) 和 πβ(a|s) 之间
靠近。这个操作使得计算

时，a′ 是 in distribution 的，不会造成错误的累计。当然，在实际中，为了使学习到的策略优于行为策略，策略分布需要偏离，但通过保持这种偏移较小，由于分布外动作输入而产生的错误可以得到控制。根据概率分布度量方法不一样和约束方法不一样，我们可以沿着这两个方向对方法进行广泛分类：

显式的 f 散度约束：直接增加对学习策略 π 和行为策略 πβ 直接的 f 散度作为约束。
隐式的 f 散度约束：使用对 actor 的更新，通过构造来使 π 靠近 πβ。
积分概率度量约束 (IPM)：对于 offline RL，该方法能更好地表达约束条件，具有较好的理论和经验特性。
策略惩罚：不仅可以对 actor 的更新增加约束，也可以对奖励函数或者目标 Q 值增加惩罚。

形式上，我们可以将具有策略约束的策略迭代方法表示为优化以下目标的不动点迭代：

一般实际处理中，并不是使得 min 和 max 操作收敛后才停止更新，而是执行一定的步数后停止更新。我们可将其看成是一般的 AC 算法，只不过在策略策略的更新上加上了正则化项 D(π, πβ) < ϵ。对于D 的选择有很多方法，对于这一类算法，我们称之为策略约束方法。
在策略惩罚方法中，对 AC 算法进行了改进，将约束归入 Q 值计算中，迫使策略不仅避免在每一状态下偏离 πβ(a|s)，而且避免在未来时间步长中出现可能导致和 πβ(a|s) 偏离较大的动作。那么，就可以得到如下的表达：

虽然策略约束和策略惩罚方法的基本出发点是类似的，但如何定义约束和如何执行约束的具体选择在实践中可能产生显著的差异。接下来我们将讨论这些选择以及它们的权衡。

显式的 f 散度
对于任意的凸函数 f，其对应的 f 散度为：

实际上 KL 散度，X^2 散度都是特殊的 f 散度，只不过是 f 函数不一样。一个 f 散度的变分形式也可以写成，这里是采用了凸共轭的形式，也是公式 (30) 的对偶形式，

f 散度的原形式 (30) 和对偶变分形式 (31) 都可以用来做策略约束。在对偶形式中，需要额外训练一个网络来表示函数 x。KL 散度表示为：

可以通过采样动作 a ∼ π(·|s)，然后对期望内的概率进行抽样估计。经常把 f 散度当成正则化项的，这类算法太多了。此外，非对称松弛 f 散度的子族可用于策略约束。

隐式的 f 散度
隐式的 f 散度的基本思想是通过构造来使 π 靠近 πβ。KL-divergence 约束也可以隐式执行，就像在 AWR (Advantage-weighted regression: Simple and scalable off-policy reinforcement learning) 和ABM (Keep doing what worked: Behavioral modelling priors for offline reinforcement learning) 的算法下一样。这些方法首先求解 KL-divergence 约束下的最优下一个策略迭代：π¯k+1，其计算过程如下所示，

这里用 Q 的指数加权 πβ 来估计一个新的 π¯，之后让 πβ 和习得的 π¯ 的距离小。这里 π¯ 一定程度上代表着 πβ。其中第一步，可以采用从 πβ(a|s)(比如从经验回放池 D 中) 的重要性采样，而其重要性权重和

成正比的。第二步可以通过监督学习的方法来实现。这样，通过重要性采样在策略上有效地实现了 KL-divergence 约束，其中 α 对应拉格朗日乘子。Q 函数 Qπk 对应上一次迭代的策略πk，这里可以用可以用任意 Q 值或优势估计器进行估计。读者可以参考相关工作 (Advantage-weighted regression: Simple and scalable off-policy reinforcement learning)。

Integral probability metrics (IPMs)
策略约束的另一种选择是积分概率度量 (Integral probability metrics)，它是依赖于函数类 Φ 的函
数形式的散度度量：

函数类 Φ 的不同选择会产生不同的散度。例如，Φ 由空间 (RKHS) 中可再生核希尔伯特空间 (RKHS)中等的所有单位 Hilbert 范数的函数组成时，Dϕ 表示最大均值差异 (MMD) 距离，也可以直接从样本中计算，方法如下：

实际上也就是平方了一下，而在 RKHS 中，

就是核函数 k(·, ·)。而当 ϕ 由单位 Lipschitz常数组成的话，则 Dϕ 等价为一阶 Wasserstein 距离：

这些方法都很实用，因为它们通常可以用非参数估计器进行估计。读者可以阅读 (On integral probability metrics,ϕ-divergences and binary classification.) 得到详细的对 IPMs 的解读。同样，BEAR 也用 MMD 距离来表示策略约束 (Stabilizing off-policy q-learning via bootstrapping error reduction.)，而 Wu 等人 (Behavior regularized offline reinforcement learning.) 估计了一阶 Wasserstein 距离的实例化。

不同约束间的平衡
KL-divergence 约束，以及其他 f-divergences，代表了一类简单的约束方法，因为它们很容易被用于策略惩罚算法中，只需简单的对奖励函数增加：

对应到KL 散度的特殊情况下为：

当使用最大熵强化学习算法时，最后一项包含在熵正则化器 H(π(·|s)) 内。但是，KL -divergence 和其他 f-divergence 对于离线强化学习并不一定是理想的。考虑一个行为策略是均匀分布，在这种情况下，offline 强化学习原则上应该是非常有效的。事实上，即使是没有任何策略约束参与的标准 AC 算法在这种设置下也可以执行得很好，因为当所有动作的概率都相等时，就不存在超出分布的动作。然而，在此设置中的 kl 散度约束将限制学习策略 π(a|s) 使其靠近行为策略 πβ(a|s)，而 πβ(a|s) 是均匀策略，这就使 π(a|s) 不会过于集中，算法产生一个高度随机的策略。这显然是不合适的，这也表明 KL 散度约束并不一定是理想的选择。
相反，Kumar 等人 (Stabilizing off-policy q-learning via bootstrapping error reduction) 和 Laroche等人 (Safe policy improvement with baseline bootstrapping.) 认为，只限制学习策略 π 和行为策略 πβ的 support set，可能足以从理论上和经验上获得一种有效的 offline RL 算法。这部分是来自于，Kumar等人提出的 Bootstrapping Error Accumulation Reduction (BEAR) 算法，大家可以在 Kumar 的 blog中看到较好的解释：https://bair.berkeley.edu/blog/2019/12/05/bear/。这里有个新问题，什么是 support set？构造集的定义为：

实际上就是去掉部分概率值较小的部分。但是，使用支撑集的时候，不仅可以得到确定性和较优的学习策略，而且同时可以避免 OOD 动作。Kumar 举了一个 1 维迷宫的例子，从 S 出发，目标是终点G。此模型展示在下图中，

全约束学习策略和行为策略，会明显更倾向于向左边移动，到达目标点的概率并不高。而支撑集约束可以学习到最优策略，因为当行为策略的概率密度小于某个阈值时，学习策略是学习不到的。个人理解，通过这样的方式，将硬优化问题转换成了软优化问题，在 Offline RL 中，我们真正希望的不是我们的学习策略和 D 的行为策略越像越好，而是学习策略在行为策略的支撑集的范围内去进行优化。所以，我们可以把对学习策略的约束变成让学习策略保持在行为策略的支撑集内呢。这样的做法可帮助学习策略，不会陷入到不好的行为策略中。限制 support set 并不容易。对于离散动作，可以直接让出现在 πβ suport set 之外的概率尽可能小，即为：

当 MDP 为一个连续的行动空间并且无法估计精确的支持度时，Kumar 表明一个有限样本的 MMD距离估计可以用来近似地约束学习策略的支持度。其中，MMD 距离被定义为：

基于不确定性估计的离线近似动态规划 (Offline approximated dynamic programming with uncertainty estimation)
4.3 小节中描述的策略约束方法可以有效的防止在计算 Q 函数的目标值时出现 out-of-distribution(OOD) 动作。与直接 constraint 的思路不同另一种思路是，我们希望让 Q-function 对 OOD 的 action其更有适应力。通常不确定性分两种，数据不确定性和模型不确定性。数据不确定性是指 data 有可能出错，而模型不确定性是学到的模型参数有可能出错，进一步导致模型的输出可能出错。这里很容易把模型不确定性和模型输出的概率搞混淆。举例来说，把一张猫的图片输入到一个分类器里，模型以很高的概率判断这是猫，并不代表模型不确定性低。但是如果把一个模型训练 n 次，这 n 个模型都一致判断这是猫，才能说模型对于这张猫图的不确定性低。这里用到的判断模型不确定性的指标就是输出的方差。因此，训练学到的 Q 函数就是模型，那么对于 OOD 的动作作为 Q 函数的输入，Q 函数的模型不确定性就更大。那么通过减小 Q 函数的不确定性，就可以防止输出 OOD 的动作，达到和策略约束异曲同工的效果。
这种方法需要从数据集 D 中学习到 Q 函数的不确定集合或分布，我们可以表示 PD(Qπ)。那么，
如何来计算 PD(Qπ) 的不确定性呢？可以用 ensemble 的方式通过衡量输出的方差来估计它，或者对 Q值分布进行参数化，假设其为已知的分布，如 Gaussian，通过学习 Gaussian 分布参数的形式来实现。如果不确定度可以学习，由此 Q 函数的估计可以替换为：

其中，Unc 表示为不确定度，减去它就得到了实际 Q 函数的保守估计结果。不确定度度量 Unc 的选择取决于不确定度估计方法的具体选择。而 bootstrap 集成被用来表示 Q 函数在以前的工作中是很常见的，方法有很多。

挑战和开放性问题
在 4.2 小节已经讨论了，基本的动态规划近似算法由于分布偏移的问题，表现非常的差。而分布偏移主要是由动作分布的行为策略 πβ(a|s) 和学习策略 π(a|s) 的差距过大导致。此部分我们讨论了策略约束和显式的不确定性估计如何在原则上缓解这一问题，并且讨论这两种方法的一些缺点。
虽然，基于不确定性估计的方法思想看着很有趣，但是实际运用中，估计 PD(Qπ) 和 Unc 是非常
困难的。而且，策略约束的方法效果远胜于纯粹的基于非确定性估计的方法。但是，基于非确定性估计的方法广泛的被运用于“探索”中。在探索问题中，往往会倾向于采用不确定性高的动作，来增加算法的探索性能。但是，在 offline RL 中，我们必须相对于不确定性集采取 conservative 的行动，对不确定性估计精度的要求要高得多。而探索算法中，只需要探索的集合中，有效果好的动作就行，如果有很多效果差的动作也没事。然而，offline RL 中需要设置不确定性来直接度量 Q 函数的可信度，这需要更高的要求。实际上，不完美的不确定性集可能会导致过于保守的估计 (这会阻碍学习)，或者过于松散的估计 (会导致产生 OOD 动作)。当然，策略约束或基于不确定性方法可能在之后会有很大的改进，研究人员会开发出更好的认知不确定性估计的方法或更好的衡量分布测度算法，并融入到 offline RL 中。
策略约束的方法在目前取得了较好的性能，也是大家通常使用的方法，但是其还是有很多的缺点。

大部分策略约束，从数据集 D 拟合一个行为策略 πβ(·|s) 的估计，并用其来约束学习策略π(·|s)。这意味着算法的性能非常依赖于对行为策略估计的准确度。在现实环境中，类似的高度多模态动作的情况下，对行为策略的估计可能非常困难。例如，如果使用单峰高斯策略来建模高维的动作分布，可能无法防止学习策略 π 选择 OOD 动作。那么这里的开放性问题是，是否可以设计一种策略约束，可以直接从数据集中观察到的样本中计算得到，而不需要拟合一个对行为策略的估计。其主要思想是，既然估计行为策略很困难，我们能不能直接跳过对行为策略的估计，而直接计算约束呢？
即使行为策略估计准了，函数拟合不准的问题又来了。当用神经网络表示 Q 函数，函数近似的不良影响可能会阻碍 Q 函数的学习，即使在目标值中控制了 OOD 的动作。比如，数据集不够大，在小数据集中近似动态规划算法非常容易过拟合。在 online 强化学习中，由于函数近似而产生的高估误差可以通过主动数据收集来修正。而 offline RL 中这些误差会累积起来，并影响 offline RL 中之后的迭代过程，而如何解决这个问题仍然是一个开放的问题。
即使 Q 函数在训练过程中从不估计 OOD 状态，但 Q 函数仍然受训练集状态分布 dπβ (s)的影响。比如，例如，在 dπβ (s) 条件下，函数近似耦合两种概率不同的状态的 Q 值时，使用函数近似的动态规划可能会对概率较低的 dπβ (s) 状态产生错误的解。这个问题可能会更严重地影响使用函数近似的 offline RL 算法，因为它们根本无法控制数据的分布。
offline 近似动态规划的另一个潜在挑战是，行为策略的改进程度受到累积误差的限制。由于在offline RL 中，整体误差为 O(H^2)，这个在 2.2 小节分析过。每一步与行为策略的小差异就累积起来，最终会导致最终学习策略严重偏离行为分布，性能很差。所以，这要求每一步的策略约束要很强，以确保整体误差比较小。那么，这样的强约束肯定会影响学习策略的提升。最近的研究中所探讨的 (Algaedice: Policy gradient from arbitrary experience.)，另一种选择是直接限制策略的状态动作边缘分布。这部分内容在 3.4 小节的边缘重要性采样中已经详细描述过了，然而对策略表示和使用状态动作边缘分布需要使用贝尔曼方程迭代，而且可能会遇到 OOD 动作。那么一个开放性问题就来了，研究一种约束以便有效地权衡所学习策略的误差积累和次优性，并且可以在实践中通过标准优化技术建议实现，而不需要额外的函数近似器来拟合行为策略。

Model-Based offline 强化学习
Online 的 Model-based RL 已经有许多文章研究，主流方法是从数据集中先学习一个状态转移模型，然后可以直接通过 planning 来生成 action，或者直接训练一个 policy 函数。但其中一个核心问题仍然是，数据集学出来的状态转移模型

是对于 πβ 的，并非对应于 plan 的或者学到的策略，所以核心问题仍然是 distributional shift。目前极少工作探讨 offline model-based RL，所以如何解决 model-based RL 中的 distributional shift 是一个公开问题。同时，就算是 online 的 model-based RL也有自身的挑战，主要是高维的 observation 和 long horizon 的问题。另外，是否 model-based 模型能在理论上帮助提升 model-free DP 算法还是一个公开问题。原因是尽管 DP 方法没有直接学一个动态模型，但是相当于学了一个无参模型。本质上，DP 和 model-based RL 都是在做预测问题，前者预测future return, 后者预测 future states. 因此，探索 offline RL 对于 non-linear 函数估计的 model-basedmodel 与 DP 方法的 theoretical bounds on the optimal performance 也是一个公开问题。

repo: Fassial/read-papers


text:
🛑 Datastore API Endpoint is down

In 06d46cf, Datastore API Endpoint (https://gamepersistence.roblox.com/) was down:

HTTP code: 404
Response time: 246 ms

Resolved: Datastore API Endpoint is back up in 5ec65a4 after 16 minutes.

repo: FearedFusionX/Ro-Status


text:
⚠ Roblox Devforum has degraded performance

In 7edd515, Roblox Devforum (https://devforum.roblox.com) experienced degraded performance:

HTTP code: 200
Response time: 2255 ms

Resolved: Roblox Devforum performance has improved in f8fb6b4.


text:
⚠ Avatar API Endpoint has degraded performance

In e77eaa4, Avatar API Endpoint (https://avatar.roblox.com/v1/avatar-rules) experienced degraded performance:

HTTP code: 200
Response time: 1121 ms

Resolved: Avatar API Endpoint performance has improved in 02ebfea.


text:
🛑 Roblox Devforum is down

In e1890ac, Roblox Devforum (https://devforum.roblox.com) was down:

HTTP code: 0
Response time: 0 ms

Resolved: Roblox Devforum is back up in 7cd3570 after 25 minutes.


text:
🛑 Foundry VTT 004 is down

In bcdbb4f, Foundry VTT 004 ($FOUNDRY004) was down:

HTTP code: 0
Response time: 0 ms

Resolved: Foundry VTT 004 is back up in 3910548.


text:
Added autocomplete text search for comboboxes

Some comboboxes like persona skills and item inventory will now autocomplete as you type with your keyboard. This should decrease drastically the editing time.

I opened an issue asking for this but you told me that it lagged when you tried it.
I did it myself and so far is not lagging :) could be my computer, as I have a fast processor.
Could you try it and tell me if it lags for you? If it doesn't, I hope you could merge it with your branch.
Thank you.

Way less intrusive than what I was doing. Merge accepted. 👍


text:
Make maximum document size configurable

Description

Closes #4233.
Readiness checklist

[ ] I added/updated unit tests (and they pass).
[x] I added/updated integration/compatibility tests (and they pass).
[ ] I added/updated comments and checked rendering.
[ ] I made spot refactorings.
[ ] I updated user documentation.
[ ] I ran task all, and it passed.
[x] I ensured that PR title is good enough for the changelog.
[x] (for maintainers only) I set Reviewers (@FerretDB/core), Milestone (Next), Labels, Project and project's Sprint fields.
[x] I marked all done items in this checklist.

Hi @chilagrow
Could you point me to instructions how to set the maximum document size when running ferredDB in docker using docker?
Thank you for your help! :)

Update:
I found this blog post and modified my docker compose to:
services:
  postgres:
    image: postgres
    restart: on-failure
    environment:
      - POSTGRES_USER=username
      - POSTGRES_PASSWORD=password
      - POSTGRES_DB=ferretdb
    volumes:
      - ./data:/var/lib/postgresql/data

  ferretdb:
    image: ghcr.io/ferretdb/ferretdb
    restart: on-failure
    ports:
      - 127.0.0.1:27017:27017
    environment:
      - FERRETDB_POSTGRESQL_URL=postgres://postgres:5432/ferretdb
      - FERRETDB_TEST_BATCH_SIZE=537395136 # 512 MB
      - FERRETDB_TEST_MAX_BSON_OBJECT_SIZE_MI_B=537395136 # 512 MB

networks:
  default:
    name: ferretdb

However, when trying to insert a document using pymongo, I get the following error:
  File "/Users/.../lib/python3.11/site-packages/pymongo/message.py", line 1281, in _raise_document_too_large
    raise DocumentTooLarge(f"{operation!r} command document too large")
pymongo.errors.DocumentTooLarge: 'saslStart' command document too large

Any ideas?

@vsisl you might have accidentally configured it too large. Try something more suitable like below, the unit is MiB :hugs:
      - FERRETDB_TEST_MAX_BSON_OBJECT_SIZE_MI_B=512 # 512 MiB

As for FERRETDB_TEST_BATCH_SIZE, let's use the default by removing the option. It's the number of documents to be inserted at once by backend, not related to the size. So 5373951361 would be too many.

Hi @chilagrow
Thank you very much for your quick reply! I really appreciate your help! :)
I followed your instructions but ran into another problem. I'm now getting a connection timeout error. This is strange because the error message mentions 20s timeout. But in reality, the error is raised immediately after executing the .insert_one() method. There's definitely now 20s gap before the error is raised.
I imagine that this is probably not the right place to seek help with this. Nevertheless, I decided to post this here, just in case you've seen such an error before...
Thanks again for your help!
  File "/Users/.../lib/python3.11/site-packages/pymongo/collection.py", line 658, in insert_one
    self._insert_one(
  File "/Users/.../lib/python3.11/site-packages/pymongo/collection.py", line 598, in _insert_one
    self.__database.client._retryable_write(
  File "/Users/.../lib/python3.11/site-packages/pymongo/mongo_client.py", line 1575, in _retryable_write
    return self._retry_with_session(retryable, func, s, bulk, operation, operation_id)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/Users/.../lib/python3.11/site-packages/pymongo/mongo_client.py", line 1461, in _retry_with_session
    return self._retry_internal(
           ^^^^^^^^^^^^^^^^^^^^^
  File "/Users/.../lib/python3.11/site-packages/pymongo/_csot.py", line 108, in csot_wrapper
    return func(self, *args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/Users/.../lib/python3.11/site-packages/pymongo/mongo_client.py", line 1507, in _retry_internal
    ).run()
      ^^^^^
  File "/Users/.../lib/python3.11/site-packages/pymongo/mongo_client.py", line 2353, in run
    return self._read() if self._is_read else self._write()
                                              ^^^^^^^^^^^^^
  File "/Users/.../lib/python3.11/site-packages/pymongo/mongo_client.py", line 2470, in _write
    return self._func(self._session, conn, self._retryable)  # type: ignore
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/Users/.../lib/python3.11/site-packages/pymongo/collection.py", line 586, in _insert_command
    result = conn.command(
             ^^^^^^^^^^^^^
  File "/Users/.../lib/python3.11/site-packages/pymongo/helpers.py", line 342, in inner
    return func(*args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^
  File "/Users/.../lib/python3.11/site-packages/pymongo/pool.py", line 1017, in command
    self._raise_connection_failure(error)
  File "/Users/.../lib/python3.11/site-packages/pymongo/pool.py", line 1214, in _raise_connection_failure
    _raise_connection_failure(self.address, error, timeout_details=details)
  File "/Users/.../lib/python3.11/site-packages/pymongo/pool.py", line 427, in _raise_connection_failure
    raise AutoReconnect(msg) from error
pymongo.errors.AutoReconnect: localhost:27017: [Errno 32] Broken pipe (configured timeouts: connectTimeoutMS: 20000.0ms)

@vsisl thanks for letting us know. We would like a bit more information, could you file a bug please :hugs:. Don't forget to include the version of pymongo driver and logs from FerretDB too, those are helpful for us!

authors: chilagrow vsisl

repo: FerretDB/FerretDB


text:
MultiHome issue

Hi, when i use : ark_MultiHome=188.165.55.178 (my ip failover)
the server can't boot
when i don't use it everything is fine...
any clue ?

Is the IP address you are trying to use set up on an interface on the machine?

I've re installed the machine

If you look at the output of ifconfig or ip address, is that IP address set up on any of the interfaces?

i've just re installed my machine on another OS, is there something to do ? On the OVH panel, it seems to be good to me

Your game server's failure to start suggests that the IP address is not configured on any interfaces.  If the "failover" ip addresses are set up on the same interface as the main IP address, then you will need to configure that IP address on a virtual interface attached to that physical interface.
Refer to your distribution documentation on how to persistently configure such a virtual interface (e.g. eth0:1).

The second one is working without any config, it was auto set to the machine and the main ip, i've got the same config on the two different machine (nano /etc/network/interfaces)

authors: arkfrance klightspeed

repo: FezVrasta/ark-server-tools


text:
Update TypeScript definitions for V1 API

The latest TypeScript definitions available on https://github.com/DefinitelyTyped/DefinitelyTyped are for popper.js v0.4.x. Would you be willing to update the definitions to reflect the breaking changes in the v1 API?
Steps to reproduce the problem

Install popper.js latest version (v1.8.4 at time of this issue)
Install latest TypeScript definitions from https://github.com/DefinitelyTyped/DefinitelyTyped (for v0.4.x at time of this issue)
Add a custom modifier as described here: https://github.com/FezVrasta/popper.js/issues/62

What is the expected behavior?
Custom modifiers would be definable.
What went wrong?
The wrong types for modifiers in the TS definitions prevent compilation of TypeScript code.
Any other comments?
If you'd like help updating the definitions let me know and I'll see what I can do to help out.

I never used TypeScript. The whole API is described in the documentation. I use JSDoc to describe the types so maybe there's a tool to automatically generate them from jsdoc?

I tried https://www.npmjs.com/package/tsd-jsdoc but it throws a lot of warnings because of invalid types like Object Array, HTMLElement, Boolean, String...

I'm going to close this since there's already a PR to update the definitions in the DefinitelyTyped repo.

authors: FezVrasta mattrcarter


text:
Fix JSDoc type for 'options.modifiers.preventOverflow.boundariesElement'.

Was browsing through the docs, and this looked like an error. Hope I'm not mistaken. 😄

Done - there was another Element lower in the docs so I fixed that up. Hopefully that was appropriate.

Absolutely, thanks you for the PR!

authors: DanielRosenwasser FezVrasta


text:
docker scripts for containerized uuv simulator development environment

See the README.MD for details and instructions on how to test.

Works for me!

repo: Field-Robotics-Lab/DAVE


text:
When in mod learn mode there should be blinking icon in title bar

When in mod learn mode there should be blinking icon in title bar

Fixed in 971cbc8ab9c4a79ac528f3869bbe00e53604ac50

repo: FigBug/Wavetable


text:
Allow registering existing objects for ACL

A registered private key can be used to register an existing object store object with the gateway for permissioning
A registered private key can also store an object without being an enabled Data Storage Account also
Object permissions can now be revoked by the permission granter (won't do anything if no permissions for an object hash/granter/grantee combination)
Now storing granter/address of encryption key/object meta proto status for object permissions

Forgot we have a client for this... updated with the two new endpoints and the new field for putObject

Forgot we have a client for this... updated with the two new endpoints and the new field for putObject

Whoops - samesies lol.  :looking:

authors: hyperschwartz piercetrey-figure

repo: FigureTechnologies/object-store-gateway


text:
🛑 logs.spanix.xyz is down

In ba6af3b, logs.spanix.xyz (https://logs.spanix.xyz/) was down:

HTTP code: 0
Response time: 0 ms

Resolved: logs.spanix.xyz is back up in b9ef94d.

repo: Fijxu/justlog-instances-uptime


text:
Error running mkcert-v1.2.0-windows-amd64.exe -install

I'm receiving an error when runing mkcert 1.2.0 on Windows.  I downloaded the prebuilt binary.
Windows 10 1809 17763.195
Running cmd.exe as Administrator.
ERROR: failed to generate CA certificate: asn1: string not valid UTF-8

same problem...
Windows, v1.3.0

authors: DrDrrae LuomingXu

repo: FiloSottile/mkcert


text:
Finbuckle.MultiTenant 6.3.0 Released

Hello, version 6.3.0 is now available on NuGet.
First, a big THANK YOU!!! to my sponsors @cpcrook, @renhammington, @project-bi, and @hasansan07!
If you want to support this project please check out the sponsor button above. Every little bit helps.
This release is mostly bug fixes to clean things up before .NET 6 is released. Thanks to @lahma, @mphill, and @Nivalux for their help with some of the items below.
6.3.0

Removed support for .NET Core 2.1 which ended Microsoft support in August 2020.
Retargeted specifically to .netcoreapp3.1 and .net5.0 across all packages.
Added AdjustKey, AdjustIndex, AdjustAlIndexes, AdjustUniqueIndexes methods to be chained off IsMultiTenant in EFCore functionality. They add the implicit TenantId to the respective key/indexes.
Reverted generic version of IsMultiTenant back to non-generic version for more flexibility.
Improved tenant resolution logging functionality and performance. Thanks to @lahma!
Fixed a bug with InMemoryStore implementation of TryUpdate. Thanks to @mphill!
Fixed a bug where ConfigurationStore would throw an exception if there was no default section in the config.
Fixed a bug where ASP.NET Core Identity security stamp validation would force user logout and raise exceptions. Thanks to @Nivalux for finding the root cause of this bug.
Fixed a bug where MultiTenantOptionsManager<TOptions> was internal instead of public.
Fixed problematic references in sample projects.
Updated and improved documentation.
Updated and improved tests.
Added various project files for .NET Foundation on-boarding.

Hi Andrew,
Why did you remove .NET Standard 2.1 support? It's not the same as netcoreapp2.1 and it's not going out of style.
I wanted to upgrade to the new version in my .NET Standard 2.1 project but i got the not supported error.
Thank you and kind regards,
Nebojša

hi @npongracic I mainly did it to be consistent across all packages. I wouldn't be against the main Finbuckle.MultiTenant package targeting netstandard though would that work for your case? I could do a patch release or at the latest when .NET 6 is out I will have another release.

Hi Andrew,
Thank you, that would be great, it's no hurry but just thought i should let
you know. I'm using the Finbuckle.MultiTenant.EntityFrameworkCore package
and it has the issue (even though it's EF Core it should work in .NET
standard libs).
It's not really a problem for me, i could change the project to a .NET core
project but it's kind of strange that something that has worked in version
6.2 has such a breaking change that it doesn't work in version 6.3 and it
took me a while to figure out the issue.
Thank you for your hard work and kind regards,
Nebojša
On Fri, Sep 17, 2021 at 6:45 AM Andrew White @.***>
wrote:

hi @npongracic https://github.com/npongracic I mainly did it to be
consistent across all packages. I wouldn't be against the main
Finbuckle.MultiTenant package targeting netstandard though would that
work for your case? I could do a patch release or at the latest when .NET 6
is out I will have another release.
—
You are receiving this because you were mentioned.
Reply to this email directly, view it on GitHub
https://github.com/Finbuckle/Finbuckle.MultiTenant/issues/455#issuecomment-921460711,
or unsubscribe
https://github.com/notifications/unsubscribe-auth/AAOOGBWWHG7AFOETLNT2QLDUCLBV7ANCNFSM5DREGUDQ
.
Triage notifications on the go with GitHub Mobile for iOS
https://apps.apple.com/app/apple-store/id1477376905?ct=notification-email&mt=8&pt=524675
or Android
https://play.google.com/store/apps/details?id=com.github.android&referrer=utm_campaign%3Dnotification-email%26utm_medium%3Demail%26utm_source%3Dgithub.

@npongracic I reverted back to netstandard2.1 with the 6.3.1 update.

Hi Andrew,
Thank you, it is working great. :)
Kind regards,
Nebojša
On Fri, Oct 1, 2021 at 12:25 AM Andrew White @.***>
wrote:

@npongracic https://github.com/npongracic I reverted back to
netstandard2.1 with the 6.3.1 update.
—
You are receiving this because you were mentioned.
Reply to this email directly, view it on GitHub
https://github.com/Finbuckle/Finbuckle.MultiTenant/issues/455#issuecomment-931746509,
or unsubscribe
https://github.com/notifications/unsubscribe-auth/AAOOGBS2VJO6H3JTXCTL3WDUETPVZANCNFSM5DREGUDQ
.
Triage notifications on the go with GitHub Mobile for iOS
https://apps.apple.com/app/apple-store/id1477376905?ct=notification-email&mt=8&pt=524675
or Android
https://play.google.com/store/apps/details?id=com.github.android&referrer=utm_campaign%3Dnotification-email%26utm_medium%3Demail%26utm_source%3Dgithub.

@AndrewTriesToCode
I am configuring entities in separated classes implementing IEntityTypeConfiguration
public class GroupConfig : IEntityTypeConfiguration<Group>
{
    public void Configure(EntityTypeBuilder<Group> builder)
    {
        var key = builder.Metadata.GetKeys().First();
        builder.IsMultiTenant().AdjustKey(key, builder).AdjustIndexes(); // builder parameter has wrong type
        builder.Property(g => g.Name).HasMaxLength(32);
        builder.HasIndex(g => new { g.Name, g.CreatedBy });
    }
}

I would like to use AdjustKey in this configuration but this method expects EntityFrameworkCore.ModelBuilder instead of EntityFrameworkCore.Metadata.Builders.EntityTypeBuilder
Do you have any suggestion how can I get ModelBuilder here?

authors: AndrewTriesToCode npongracic snax4a


text:
Serializer add() not working as expected

Is the serializer add() method applied to each record in a collection returned from a query()? If so, my example below isn't working as expected. If not, is there another approach I should be taking? I simply want each record in my collection to have a fullName attribute that includes the first and last attributes so I don't have to worry about concatenating them in my views...
angular
  .module( "manage.residents" )
  .factory( "Resident", (RailsResource) ->
    class Resident extends RailsResource
      @configure
        url: "/api/manage/facilities/{{facilityId}}/residents/{{id}}"
        name: "resident"
        serializer: "ResidentSerializer"
  )
  .factory( "ResidentSerializer", (railsSerializer) ->
    railsSerializer( ->
      @add("fullName", (resident) ->
        "#{resident.first} #{resident.last}"
      )
      return
    )
  )

But the records in the collection are unaffected...
[
  {
    "id": 1,
    "facilityId": 1,
    "first": "Art",
    "middle": "",
    "last": "Acord",
    "nickname": "",
    "roomNumber": "A-101",
    "birthDate": "19391229"
  },{
    ...
  }
]

Not sure if this is the best approach, but here's my workaround (inspired by #156)
angular
    .module( "manage.residents" )
    .factory( "Resident", (RailsResource) ->
        class Resident extends RailsResource
            @configure
                url: "/api/manage/facilities/{{facilityId}}/residents/{{id}}"
                name: "resident"
                interceptors: [
                    afterResponse: (result)->
                        if angular.isArray result
                            item._prepare() for item in result
                        else
                            item._prepare()
                ]
            _prepare: ->
                @fullName = "#{@first} #{@last}"
                @

    )


text:
(re)move gradle, intellij-specific files, and built-in java server

99.99% of our development scripts are in javascript/nodejs, and the remaining *0.01% is in java/groovy. I believe this should change. *(actually, according to GitHub it is 3.2% java)
I think the java-centric stuff should be moved into its own project. This project could pull down the latest version of fine-uploader and allow testing from there for those who prefer that stack.
I understand that this server is used by some for development and testing purposes, but I think it should be moved out of the sources repo, and instead moved into its own project. The best likely place would be -- like node-fine-uploader-server -- its own project, but I guess the Fine Uploader server repo would work too.
I think, if we did want to include a server for manual testing, we'd want to be able to define it in our devDependencies. This also means if Fine Uploader were publish to say npm, that integrators would not receive our development dependencies and a bunch of gradle and java crap that they're unable to run (leading to increased install time) unless they chose to.
Gradle is also redundant (the grunt and npm are already included -- why have even more build systems?), and it generates a lot of useless crap in our source tree.
This overall cleanup will not only result in a few saved kBs, but also less mental-clock-cycles spent ignoring these files repeatedly.

I'm going to remove all the Java stuff in 5.2 and replace it with PHP.  This seems like the best choice, since PHP is likely the most common server-side language for integrators.

The develop branch is now Java-free!  No more IntelliJ!  Yay!

authors: feltnerm rnicholus

repo: FineUploader/fine-uploader


text:
Unit tests

Unit tests are needed to ensure the code I'm writing actually works. This involves adding some stuff to the CMakeLists to allow building of unit tests.

[x] Add unit test support to CMakeLists
[x] Use Travis CI to build disccord
[x] Use Travis CI to run tests
[x] Write preliminary unit tests

I like Catch, what do you think?

At this point the basic framework for unit testing has been written, so what we need now is complete unit tests for things which aren't currently tested or are not tested fully.

authors: FiniteReality unleashy

repo: FiniteReality/disccord


text:
Suggestion: add the ability to put two different types of slabs together and/or the ability to break one part of stacked slabs at a time.

some examples of mods that use similar functions to the suggestion but are sadly incompatible include the double slabs mod and kleeslabs

Partial duplicate of https://github.com/FirEmerald/AdditionalPlacements/issues/5
As for the other part, I'll look into it sometime.

Here is a crash log for incompatibility with "Double Slabs" mod. Btw: your mod is brilliant and well build. Thank you!
java.lang.IllegalArgumentException: Cannot set property EnumProperty{name=type, clazz=class net.minecraft.world.level.block.state.properties.SlabType, values=[top, bottom, double]} as it does not exist in Block{additionalplacements:minecraft.spruce_slab}
at net.minecraft.world.level.block.state.StateHolder.m_61124_(StateHolder.java:117) ~[client-1.19.2-20220805.130853-srg.jar%23799!/:?] {re:mixin,pl:accesstransformer:B,re:computing_frames,pl:accesstransformer:B,re:classloading,pl:accesstransformer:B,pl:mixin:APP:canary.mixins.json:alloc.blockstate.StateHolderMixin,pl:mixin:A}
at cjminecraft.doubleslabs.api.support.minecraft.MinecraftSlabSupport.getStateForHalf(MinecraftSlabSupport.java:51) ~[DoubleSlabs-1.19-6.1.0.jar%23578!/:6.1.0] {re:classloading}
at cjminecraft.doubleslabs.common.placement.PlacementHandler.getStateFromSupport(PlacementHandler.java:73) ~[DoubleSlabs-1.19-6.1.0.jar%23578!/:6.1.0] {re:classloading}
at cjminecraft.doubleslabs.common.placement.PlacementHandler.onItemUse(PlacementHandler.java:327) ~[DoubleSlabs-1.19-6.1.0.jar%23578!/:6.1.0] {re:classloading}
at cjminecraft.doubleslabs.common.placement.PlacementHandler_onItemUse_RightClickBlock.invoke(.dynamic) ~[DoubleSlabs-1.19-6.1.0.jar%23578!/:6.1.0] {re:classloading,pl:eventbus:B}
at net.minecraftforge.eventbus.ASMEventHandler.invoke(ASMEventHandler.java:73) ~[eventbus-6.0.3.jar%2379!/:?] {}
at net.minecraftforge.eventbus.EventBus.post(EventBus.java:315) ~[eventbus-6.0.3.jar%2379!/:?] {}
at net.minecraftforge.eventbus.EventBus.post(EventBus.java:296) ~[eventbus-6.0.3.jar%2379!/:?] {}
at net.minecraftforge.common.ForgeHooks.onRightClickBlock(ForgeHooks.java:875) ~[forge-1.19.2-43.2.8-universal.jar%23804!/:?] {re:mixin,re:classloading,pl:mixin:APP:tombstone.mixins.json:ForgeHooksMixin,pl:mixin:A}
at net.minecraft.client.multiplayer.MultiPlayerGameMode.m_233746(MultiPlayerGameMode.java:322) ~[client-1.19.2-20220805.130853-srg.jar%23799!/:?] {re:mixin,pl:accesstransformer:B,pl:runtimedistcleaner:A,re:classloading,pl:accesstransformer:B,pl:mixin:A,pl:runtimedistcleaner:A}
at net.minecraft.client.multiplayer.MultiPlayerGameMode.m_233740(MultiPlayerGameMode.java:312) ~[client-1.19.2-20220805.130853-srg.jar%23799!/:?] {re:mixin,pl:accesstransformer:B,pl:runtimedistcleaner:A,re:classloading,pl:accesstransformer:B,pl:mixin:A,pl:runtimedistcleaner:A}
at net.minecraft.client.multiplayer.MultiPlayerGameMode.m_233729_(MultiPlayerGameMode.java:252) ~[client-1.19.2-20220805.130853-srg.jar%23799!/:?] {re:mixin,pl:accesstransformer:B,pl:runtimedistcleaner:A,re:classloading,pl:accesstransformer:B,pl:mixin:A,pl:runtimedistcleaner:A}
at net.minecraft.client.multiplayer.MultiPlayerGameMode.m_233732_(MultiPlayerGameMode.java:311) ~[client-1.19.2-20220805.130853-srg.jar%23799!/:?] {re:mixin,pl:accesstransformer:B,pl:runtimedistcleaner:A,re:classloading,pl:accesstransformer:B,pl:mixin:A,pl:runtimedistcleaner:A}
at net.minecraft.client.Minecraft.m_91277_(Minecraft.java:1671) ~[client-1.19.2-20220805.130853-srg.jar%23799!/:?] {re:mixin,pl:accesstransformer:B,pl:runtimedistcleaner:A,re:classloading,pl:accesstransformer:B,pl:mixin:APP:balm.mixins.json:MinecraftMixin,pl:mixin:APP:playerrevive.mixins.json:MinecraftAccessor,pl:mixin:APP:fallingleaves.mixins.json:MinecraftClientMixin,pl:mixin:APP:bettercombat.mixins.json:client.MinecraftClientAccessor,pl:mixin:APP:bettercombat.mixins.json:client.MinecraftClientInject,pl:mixin:APP:flywheel.mixins.json:PausedPartialTickAccessor,pl:mixin:APP:bookshelf.common.mixins.json:client.AccessorMinecraft,pl:mixin:APP:carryon.mixins.json:MinecraftMixin,pl:mixin:APP:architectury.mixins.json:MixinMinecraft,pl:mixin:APP:blueprint.mixins.json:client.MinecraftMixin,pl:mixin:APP:iceberg.mixins.json:MinecraftMixin,pl:mixin:APP:quark.mixins.json:client.MinecraftMixin,pl:mixin:APP:valhelsia_tweaks.mixins.json:client.DisplayMemoryWarningScreenMixin,pl:mixin:APP:create.mixins.json:WindowResizeMixin,pl:mixin:A,pl:runtimedistcleaner:A}
at net.minecraft.client.Minecraft.m_91279_(Minecraft.java:1953) ~[client-1.19.2-20220805.130853-srg.jar%23799!/:?] {re:mixin,pl:accesstransformer:B,pl:runtimedistcleaner:A,re:classloading,pl:accesstransformer:B,pl:mixin:APP:balm.mixins.json:MinecraftMixin,pl:mixin:APP:playerrevive.mixins.json:MinecraftAccessor,pl:mixin:APP:fallingleaves.mixins.json:MinecraftClientMixin,pl:mixin:APP:bettercombat.mixins.json:client.MinecraftClientAccessor,pl:mixin:APP:bettercombat.mixins.json:client.MinecraftClientInject,pl:mixin:APP:flywheel.mixins.json:PausedPartialTickAccessor,pl:mixin:APP:bookshelf.common.mixins.json:client.AccessorMinecraft,pl:mixin:APP:carryon.mixins.json:MinecraftMixin,pl:mixin:APP:architectury.mixins.json:MixinMinecraft,pl:mixin:APP:blueprint.mixins.json:client.MinecraftMixin,pl:mixin:APP:iceberg.mixins.json:MinecraftMixin,pl:mixin:APP:quark.mixins.json:client.MinecraftMixin,pl:mixin:APP:valhelsia_tweaks.mixins.json:client.DisplayMemoryWarningScreenMixin,pl:mixin:APP:create.mixins.json:WindowResizeMixin,pl:mixin:A,pl:runtimedistcleaner:A}
at net.minecraft.client.Minecraft.m_91398_(Minecraft.java:1768) ~[client-1.19.2-20220805.130853-srg.jar%23799!/:?] {re:mixin,pl:accesstransformer:B,pl:runtimedistcleaner:A,re:classloading,pl:accesstransformer:B,pl:mixin:APP:balm.mixins.json:MinecraftMixin,pl:mixin:APP:playerrevive.mixins.json:MinecraftAccessor,pl:mixin:APP:fallingleaves.mixins.json:MinecraftClientMixin,pl:mixin:APP:bettercombat.mixins.json:client.MinecraftClientAccessor,pl:mixin:APP:bettercombat.mixins.json:client.MinecraftClientInject,pl:mixin:APP:flywheel.mixins.json:PausedPartialTickAccessor,pl:mixin:APP:bookshelf.common.mixins.json:client.AccessorMinecraft,pl:mixin:APP:carryon.mixins.json:MinecraftMixin,pl:mixin:APP:architectury.mixins.json:MixinMinecraft,pl:mixin:APP:blueprint.mixins.json:client.MinecraftMixin,pl:mixin:APP:iceberg.mixins.json:MinecraftMixin,pl:mixin:APP:quark.mixins.json:client.MinecraftMixin,pl:mixin:APP:valhelsia_tweaks.mixins.json:client.DisplayMemoryWarningScreenMixin,pl:mixin:APP:create.mixins.json:WindowResizeMixin,pl:mixin:A,pl:runtimedistcleaner:A}
at net.minecraft.client.Minecraft.m_91383_(Minecraft.java:1078) ~[client-1.19.2-20220805.130853-srg.jar%23799!/:?] {re:mixin,pl:accesstransformer:B,pl:runtimedistcleaner:A,re:classloading,pl:accesstransformer:B,pl:mixin:APP:balm.mixins.json:MinecraftMixin,pl:mixin:APP:playerrevive.mixins.json:MinecraftAccessor,pl:mixin:APP:fallingleaves.mixins.json:MinecraftClientMixin,pl:mixin:APP:bettercombat.mixins.json:client.MinecraftClientAccessor,pl:mixin:APP:bettercombat.mixins.json:client.MinecraftClientInject,pl:mixin:APP:flywheel.mixins.json:PausedPartialTickAccessor,pl:mixin:APP:bookshelf.common.mixins.json:client.AccessorMinecraft,pl:mixin:APP:carryon.mixins.json:MinecraftMixin,pl:mixin:APP:architectury.mixins.json:MixinMinecraft,pl:mixin:APP:blueprint.mixins.json:client.MinecraftMixin,pl:mixin:APP:iceberg.mixins.json:MinecraftMixin,pl:mixin:APP:quark.mixins.json:client.MinecraftMixin,pl:mixin:APP:valhelsia_tweaks.mixins.json:client.DisplayMemoryWarningScreenMixin,pl:mixin:APP:create.mixins.json:WindowResizeMixin,pl:mixin:A,pl:runtimedistcleaner:A}
at net.minecraft.client.Minecraft.m_91374_(Minecraft.java:700) ~[client-1.19.2-20220805.130853-srg.jar%23799!/:?] {re:mixin,pl:accesstransformer:B,pl:runtimedistcleaner:A,re:classloading,pl:accesstransformer:B,pl:mixin:APP:balm.mixins.json:MinecraftMixin,pl:mixin:APP:playerrevive.mixins.json:MinecraftAccessor,pl:mixin:APP:fallingleaves.mixins.json:MinecraftClientMixin,pl:mixin:APP:bettercombat.mixins.json:client.MinecraftClientAccessor,pl:mixin:APP:bettercombat.mixins.json:client.MinecraftClientInject,pl:mixin:APP:flywheel.mixins.json:PausedPartialTickAccessor,pl:mixin:APP:bookshelf.common.mixins.json:client.AccessorMinecraft,pl:mixin:APP:carryon.mixins.json:MinecraftMixin,pl:mixin:APP:architectury.mixins.json:MixinMinecraft,pl:mixin:APP:blueprint.mixins.json:client.MinecraftMixin,pl:mixin:APP:iceberg.mixins.json:MinecraftMixin,pl:mixin:APP:quark.mixins.json:client.MinecraftMixin,pl:mixin:APP:valhelsia_tweaks.mixins.json:client.DisplayMemoryWarningScreenMixin,pl:mixin:APP:create.mixins.json:WindowResizeMixin,pl:mixin:A,pl:runtimedistcleaner:A}
at net.minecraft.client.main.Main.m_239872_(Main.java:212) ~[client-1.19.2-20220805.130853-srg.jar%23799!/:?] {re:classloading,re:mixin,pl:runtimedistcleaner:A,pl:mixin:A,pl:runtimedistcleaner:A}
at net.minecraft.client.main.Main.main(Main.java:51) ~[client-1.19.2-20220805.130853-srg.jar%23799!/:?] {re:classloading,re:mixin,pl:runtimedistcleaner:A,pl:mixin:A,pl:runtimedistcleaner:A}
at jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:?] {}
at jdk.internal.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) ~[?:?] {}
at jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) ~[?:?] {}
at java.lang.reflect.Method.invoke(Unknown Source) ~[?:?] {}
at net.minecraftforge.fml.loading.targets.CommonClientLaunchHandler.lambda$launchService$0(CommonClientLaunchHandler.java:27) ~[fmlloader-1.19.2-43.2.8.jar%2395!/:?] {}
at cpw.mods.modlauncher.LaunchServiceHandlerDecorator.launch(LaunchServiceHandlerDecorator.java:30) [modlauncher-10.0.8.jar%2382!/:?] {}
at cpw.mods.modlauncher.LaunchServiceHandler.launch(LaunchServiceHandler.java:53) [modlauncher-10.0.8.jar%2382!/:?] {}
at cpw.mods.modlauncher.LaunchServiceHandler.launch(LaunchServiceHandler.java:71) [modlauncher-10.0.8.jar%2382!/:?] {}
at cpw.mods.modlauncher.Launcher.run(Launcher.java:106) [modlauncher-10.0.8.jar%2382!/:?] {}
at cpw.mods.modlauncher.Launcher.main(Launcher.java:77) [modlauncher-10.0.8.jar%2382!/:?] {}
at cpw.mods.modlauncher.BootstrapLaunchConsumer.accept(BootstrapLaunchConsumer.java:26) [modlauncher-10.0.8.jar%2382!/:?] {}
at cpw.mods.modlauncher.BootstrapLaunchConsumer.accept(BootstrapLaunchConsumer.java:23) [modlauncher-10.0.8.jar%2382!/:?] {}
at cpw.mods.bootstraplauncher.BootstrapLauncher.main(BootstrapLauncher.java:141) [bootstraplauncher-1.1.2.jar:?] {}

I appreciate the intent, but I don't need any crashlogs for this issue. The problem arises in how doubleslabs handles the block placement code - it assumes (normally correctly so) that the placed block is the normal block for the item, whereas this mod changes the block placed when placing vertically.

authors: FirEmerald NixityNull abrossimow

repo: FirEmerald/AdditionalPlacements


text:
🐛 [firebase_analytics] first_open event is being fired many times by same app instance

Bug report
I'm comparing data from different analytics services and see that first_open in firebase_analytics is duplicated (or even worse).
For example, in Android:
First_open: 1 Nov (comparison with appsFlyer):
AppsFlyer 267
Firebase 475

First_open: 1 Nov (comparison with google ads considering compaign)
Google Ads report: 122
Firebase (Audience: adsCompaign): 231

So the difference is up to 47 percent!
Then I went to BigQuery and tried to understand what is going on.
My query was:
SELECT user_pseudo_id FROM `analytics_210753586.*`, UNNEST(user_properties) AS user_properties, UNNEST(event_params) AS event_params
WHERE
  event_name = 'first_open' AND
  user_properties.key = "first_open_time"
  AND CAST(user_properties.value.int_value AS int64) BETWEEN 1604098800000 AND 1604185200000
  AND device.operating_system = 'ANDROID'

and I could see that the first_open event is duplicated 7 times each! For iOS the duplication is 6 times for each. But here I'm not sure if my query is correct.
My custom events sending using FirebaseAnalytics().logEvent() seems to be ok.
Firebase analytics package version is firebase_analytics 6.0.1 for android and 6.1.0 for iOS.
Flutter doctor
Click To Expand
Doctor summary (to see all details, run flutter doctor -v):
[✓] Flutter (Channel unknown, 1.20.4, on Mac OS X 10.15.7 19H2, locale en-RU)

[✓] Android toolchain - develop for Android devices (Android SDK version 29.0.2)
[✓] Xcode - develop for iOS and macOS (Xcode 12.1)
[✓] Android Studio (version 4.0)
[✓] VS Code (version 1.50.1)
[✓] Connected device (1 available)

• No issues found!

Strange, I get 1 event for every device when testing with the latest flutter master 1.24.0-8.0.pre.113 and firebase_analytics: ^6.1.0 using the official example.

flutter doctor -v
[√] Flutter (Channel master, 1.24.0-8.0.pre.113, on Microsoft Windows [Version 10.0.19041.572], locale et-EE)
    • Flutter version 1.24.0-8.0.pre.113 at C:\Development\flutter_master
    • Framework revision a75b5b6c8f (4 hours ago), 2020-11-06 01:19:02 -0500
    • Engine revision 0693ee04d1
    • Dart version 2.12.0 (build 2.12.0-21.0.dev)

[√] Android toolchain - develop for Android devices (Android SDK version 30.0.2)
    • Android SDK at C:\Users\marku\AppData\Local\Android\sdk
    • Platform android-30, build-tools 30.0.2
    • Java binary at: C:\Users\marku\AppData\Local\JetBrains\Toolbox\apps\AndroidStudio\ch-0\201.6858069\jre\bin\java
    • Java version OpenJDK Runtime Environment (build 1.8.0_242-release-1644-b01)
    • All Android licenses accepted.

[√] Chrome - develop for the web
    • Chrome at C:\Program Files\Google\Chrome\Application\chrome.exe

[√] Visual Studio - develop for Windows (Visual Studio Community 2019 16.7.7)
    • Visual Studio at C:\Program Files (x86)\Microsoft Visual Studio\2019\Community
    • Visual Studio Community 2019 version 16.7.30621.155
    • Windows 10 SDK version 10.0.18362.0

[√] Android Studio (version 4.1.0)
    • Android Studio at C:\Users\marku\AppData\Local\JetBrains\Toolbox\apps\AndroidStudio\ch-0\201.6858069
    • Flutter plugin can be installed from:
       https://plugins.jetbrains.com/plugin/9212-flutter
    • Dart plugin can be installed from:
       https://plugins.jetbrains.com/plugin/6351-dart
    • Java version OpenJDK Runtime Environment (build 1.8.0_242-release-1644-b01)

[√] IntelliJ IDEA Ultimate Edition (version 2020.2)
    • IntelliJ at C:\Users\marku\AppData\Local\JetBrains\Toolbox\apps\IDEA-U\ch-0\202.7660.26
    • Flutter plugin can be installed from:
       https://plugins.jetbrains.com/plugin/9212-flutter
    • Dart plugin can be installed from:
       https://plugins.jetbrains.com/plugin/6351-dart

[√] Connected device (6 available)
    • SM G950F (mobile)           • ce12171c51cc001c03 • android-arm64  • Android 9 (API 28)
    • sdk gphone x86 arm (mobile) • emulator-5554      • android-x86    • Android 11 (API 30) (emulator)
    • Windows (desktop)           • windows            • windows-x64    • Microsoft Windows [Version 10.0.19041.572]
    • Web Server (web)            • web-server         • web-javascript • Flutter Tools
    • Chrome (web)                • chrome             • web-javascript • Google Chrome 86.0.4240.183
    • Edge (web)                  • edge               • web-javascript • Microsoft Edge 86.0.622.61

• No issues found!

Are you sure the baseline for AppsFlyer is correct? Is the event exactly the same?

In AppsFlyer I use my custom event which I report in my main function. I added the same custom event for firebase, so looking forward to further results. Will notify you about my observes.

So, I did an additional investigation and I found some interesting facts.
I compared data from the firebase dashboard, BigQuery, and AppsFlyer.
First I compared the range from 3 to 9 November for the android platform:

firebase - 1442
BQ - 863
appsFlyer - 847
GP console -  668

Then I tried to compare a bit larger range using one additional event. Here is data from 3 sources with some screenshots:
From Oktober 20 to Oktober 30 from BigQuery:

first_open - 3156
user_swiped_1_section - 3139

From Oktober 20 to Oktober 30 from Firebase dashboard:

first_open - 5530
user_swiped_1_section - 3158

GP installs 20 - 30 Oktober:
3307

How is that possible that the firebase dashboard show way more first_open events even in comparison with BigQuery?

As far as I can tell, it seems that first_open  is fired one time after each app update.
I created a Firebase analytics account that I only use for testing, so I can track what's going on.
When I update my app in the appStore/playStore ,  first_open is fired again and even worst :  first_open_time is reset to the current first_open timestamp .
IT doesn't keep track of the all time first_open_time.
So I had to create a specific event to keep track of the all time first open ( called it all_time_first_launch)
Hope this could help investigation...

Hey folks, this issue is something to be addressed by the firebase analytics SDK directly for either the firebase-android-sdk or firebase-ios-sdk repositories. These events are automatically fired and Flutterfire has no control over them. Here's a useful page found via Firebase Analytics official documentation which describes what to expect for automatic events.

authors: Ctrl-X alectogeek markusaksli-nc russellwheatley

repo: FirebaseExtended/flutterfire


text:
🐛 Samsung | FlutterSurfaceView | Choreographer

Samsung | FlutterSurfaceView | Choreographer
When testing filabase dynamic links, they work fine on Android and Iphone devices. When opening, I get a link and there are no extra logs, but when I open a link to Samsung (A51), I get a lot of extra logs and I don’t get a link, breakpoints do not react to the link.
Followed the link in the browser to debug Firebase dynamic links &d=1 and fixed all the errors after the fix, nothing has changed.
Expected results:  Expected result (the same as on all other devices (Android): when you open the application, get the Firebase dynamic link
Actual results:  Current result (this was found on the tests of some Samsung (A51) phones): when opening the application, there are a lot of logs, but I don’t get the link and the Firebase does not respond to the link

Flutter doctor -v

[✓] Flutter (Channel stable, 2.8.1, on macOS 12.1 21C52 darwin-arm, locale ru-RU)
    • Flutter version 2.8.1 at /Users/boriskulagin/Documents/devflutter/flutter
    • Upstream repository https://github.com/flutter/flutter.git
    • Framework revision 77d935af4d (7 weeks ago), 2021-12-16 08:37:33 -0800
    • Engine revision 890a5fca2e
    • Dart version 2.15.1

[✓] Android toolchain - develop for Android devices (Android SDK version 30.0.3)
    • Android SDK at /Users/boriskulagin/Library/Android/sdk
    • Platform android-31, build-tools 30.0.3
    • Java binary at: /Users/boriskulagin/.sdkman/candidates/java/current/bin/java
    • Java version OpenJDK Runtime Environment Zulu11.52+13-CA (build 11.0.13+8-LTS)
    • All Android licenses accepted.

[✓] Xcode - develop for iOS and macOS (Xcode 13.2.1)
    • Xcode at /Applications/[Xcode.app/Contents/Developer](http://xcode.app/Contents/Developer)
    • CocoaPods version 1.11.2

[✓] Chrome - develop for the web
    • Chrome at /Applications/Google [Chrome.app/Contents/MacOS/Google](http://chrome.app/Contents/MacOS/Google) Chrome

[!] Android Studio (not installed)
    • Android Studio not found; download from https://developer.android.com/studio/index.html
      (or visit https://flutter.dev/docs/get-started/install/macos#android-setup for detailed instructions).

[✓] VS Code (version 1.63.2)
    • VS Code at /Users/boriskulagin/Documents/Visual Studio [Code.app/Contents](http://code.app/Contents)
    • Flutter extension version 3.34.0

[✓] Connected device (2 available)
    • SM A515F (mobile) • R58N309APNY • android-arm64  • Android 11 (API 30)
    • Chrome (web)      • chrome      • web-javascript • Google Chrome 98.0.4758.80

Logs

I/ViewRootImpl@13e67d2[MainActivity](23677): MSG_WINDOW_FOCUS_CHANGED 0 1
I/SurfaceControl(23677): nativeRelease nativeObject s[524906069344]
I/SurfaceControl(23677): nativeRelease nativeObject e[524906069344]
I/SurfaceControl(23677): nativeRelease nativeObject s[524906065312]
I/SurfaceControl(23677): nativeRelease nativeObject e[524906065312]
I/SurfaceControl(23677): nativeRelease nativeObject s[524906065216]
I/SurfaceControl(23677): nativeRelease nativeObject e[524906065216]
D/InputTransport(23677): Input channel destroyed: 'ClientS', fd=114
I/SurfaceControl(23677): nativeRelease nativeObject s[522228851744]
I/SurfaceControl(23677): nativeRelease nativeObject e[522228851744]
I/SurfaceView(23677): onWindowVisibilityChanged(8) false io.flutter.embedding.android.FlutterSurfaceView{bf72f1e V.E...... ........ 0,0-1080,2274} of ViewRootImpl@13e67d2[MainActivity]
I/SurfaceView(23677): surfaceDestroyed callback.size 1 #2 io.flutter.embedding.android.FlutterSurfaceView{bf72f1e V.E...... ........ 0,0-1080,2274}
W/libEGL  (23677): EGLNativeWindowType 0x7940335010 disconnect failed
I/SurfaceView(23677): remove() from RT android.view.SurfaceView$2@ccc947e Surface(name=SurfaceView - ru.techsuccess.servicebook/ru.techsuccess.servicebook.MainActivity@bf72f1e@0)/@0x5088015
I/SurfaceControl(23677): nativeRelease nativeObject s[520766243104]
I/SurfaceControl(23677): nativeRelease nativeObject e[520766243104]
I/SurfaceControl(23677): nativeRelease nativeObject s[522227116160]
I/SurfaceControl(23677): nativeRelease nativeObject e[522227116160]
W/libEGL  (23677): EGLNativeWindowType 0x7940333010 disconnect failed
I/SurfaceControl(23677): nativeRelease nativeObject s[520766245312]
I/SurfaceControl(23677): nativeRelease nativeObject e[520766245312]
I/SurfaceControl(23677): assignNativeObject: nativeObject = 0 Surface(name=null)/@0x8d4ca2c / android.view.SurfaceControl.readFromParcel:1117 android.view.IWindowSession$Stub$Proxy.relayout:1826 android.view.ViewRootImpl.relayoutWindow:9005 android.view.ViewRootImpl.performTraversals:3360 android.view.ViewRootImpl.doTraversal:2618 android.view.ViewRootImpl$TraversalRunnable.run:9971 android.view.Choreographer$CallbackRecord.run:1010 android.view.Choreographer.doCallbacks:809 android.view.Choreographer.doFrame:744 android.view.Choreographer$FrameDisplayEventReceiver.run:995
I/SurfaceControl(23677): assignNativeObject: nativeObject = 0 Surface(name=null)/@0x7ce63ff / android.view.SurfaceControl.readFromParcel:1117 android.view.IWindowSession$Stub$Proxy.relayout:1836 android.view.ViewRootImpl.relayoutWindow:9005 android.view.ViewRootImpl.performTraversals:3360 android.view.ViewRootImpl.doTraversal:2618 android.view.ViewRootImpl$TraversalRunnable.run:9971 android.view.Choreographer$CallbackRecord.run:1010 android.view.Choreographer.doCallbacks:809 android.view.Choreographer.doFrame:744 android.view.Choreographer$FrameDisplayEventReceiver.run:995
I/SurfaceControl(23677): nativeRelease nativeObject s[522227116256]
I/SurfaceControl(23677): nativeRelease nativeObject e[522227116256]
I/ViewRootImpl@13e67d2[MainActivity](23677): Relayout returned: old=(0,0,1080,2400) new=(0,0,1080,2400) req=(1080,2400)8 dur=18 res=0x5 s={false 0} ch=true fn=33
I/SurfaceView(23677): windowStopped(true) false io.flutter.embedding.android.FlutterSurfaceView{bf72f1e V.E...... ........ 0,0-1080,2274} of ViewRootImpl@13e67d2[MainActivity]
I/ViewRootImpl@13e67d2[MainActivity](23677): stopped(true) old=false
I/SurfaceView(23677): onWindowVisibilityChanged(4) false io.flutter.embedding.android.FlutterSurfaceView{bf72f1e V.E...... ........ 0,0-1080,2274} of ViewRootImpl@13e67d2[MainActivity]
I/SurfaceControl(23677): assignNativeObject: nativeObject = 0 Surface(name=null)/@0x8d4ca2c / android.view.SurfaceControl.readFromParcel:1117 android.view.IWindowSession$Stub$Proxy.relayout:1826 android.view.ViewRootImpl.relayoutWindow:9005 android.view.ViewRootImpl.performTraversals:3360 android.view.ViewRootImpl.doTraversal:2618 android.view.ViewRootImpl$TraversalRunnable.run:9971 android.view.Choreographer$CallbackRecord.run:1010 android.view.Choreographer.doCallbacks:809 android.view.Choreographer.doFrame:744 android.view.Choreographer$FrameDisplayEventReceiver.run:995
I/SurfaceControl(23677): assignNativeObject: nativeObject = 0 Surface(name=null)/@0x7ce63ff / android.view.SurfaceControl.readFromParcel:1117 android.view.IWindowSession$Stub$Proxy.relayout:1836 android.view.ViewRootImpl.relayoutWindow:9005 android.view.ViewRootImpl.performTraversals:3360 android.view.ViewRootImpl.doTraversal:2618 android.view.ViewRootImpl$TraversalRunnable.run:9971 android.view.Choreographer$CallbackRecord.run:1010 android.view.Choreographer.doCallbacks:809 android.view.Choreographer.doFrame:744 android.view.Choreographer$FrameDisplayEventReceiver.run:995
I/ViewRootImpl@13e67d2[MainActivity](23677): Relayout returned: old=(0,0,1080,2400) new=(0,0,1080,2400) req=(1080,2400)4 dur=6 res=0x1 s={false 0} ch=false fn=-1
I/ViewRootImpl@13e67d2[MainActivity](23677): stopped(false) old=true
I/ViewRootImpl@13e67d2[MainActivity](23677): stopped(false) old=false
I/SurfaceView(23677): onWindowVisibilityChanged(0) false io.flutter.embedding.android.FlutterSurfaceView{bf72f1e V.E...... ........ 0,0-1080,2274} of ViewRootImpl@13e67d2[MainActivity]
I/SurfaceControl(23677): assignNativeObject: nativeObject = 0 Surface(name=null)/@0x7ce63ff / android.view.SurfaceControl.readFromParcel:1117 android.view.IWindowSession$Stub$Proxy.relayout:1836 android.view.ViewRootImpl.relayoutWindow:9005 android.view.ViewRootImpl.performTraversals:3360 android.view.ViewRootImpl.doTraversal:2618 android.view.ViewRootImpl$TraversalRunnable.run:9971 android.view.Choreographer$CallbackRecord.run:1010 android.view.Choreographer.doCallbacks:809 android.view.Choreographer.doFrame:744 android.view.Choreographer$FrameDisplayEventReceiver.run:995
I/ViewRootImpl@13e67d2[MainActivity](23677): Relayout returned: old=(0,0,1080,2400) new=(0,0,1080,2400) req=(1080,2400)0 dur=11 res=0x7 s={true 520768139264} ch=true fn=-1
I/SurfaceView(23677): windowStopped(false) true io.flutter.embedding.android.FlutterSurfaceView{bf72f1e V.E...... ........ 0,0-1080,2274} of ViewRootImpl@13e67d2[MainActivity]
I/SurfaceView(23677): surfaceCreated 1 #1 io.flutter.embedding.android.FlutterSurfaceView{bf72f1e V.E...... ........ 0,0-1080,2274}
I/SurfaceView(23677): surfaceChanged (1080,2274) 1 #1 io.flutter.embedding.android.FlutterSurfaceView{bf72f1e V.E...... ........ 0,0-1080,2274}
I/ViewRootImpl@13e67d2[MainActivity](23677): [DP] dp(1) 1 android.view.SurfaceView.updateSurface:1311 android.view.SurfaceView.setWindowStopped:343 android.view.SurfaceView.surfaceCreated:1835
I/ViewRootImpl@13e67d2[MainActivity](23677): [DP] pdf(0) 1 android.view.SurfaceView.notifyDrawFinished:577 android.view.SurfaceView.performDrawFinished:564 android.view.SurfaceView.lambda$TWz4D2u33ZlAmRtgKzbqqDue3iM:0
I/ViewRootImpl@13e67d2[MainActivity](23677): [DP] rdf()
I/ViewRootImpl@13e67d2[MainActivity](23677): updateBoundsLayer: shouldReparent = true t = android.view.SurfaceControl$Transaction@23bacf5 sc = Surface(name=Bounds for - ru.techsuccess.servicebook/ru.techsuccess.servicebook.MainActivity@1)/@0xc997a8a frame = 1
I/ViewRootImpl@13e67d2[MainActivity](23677): [DP] dp(1) 1 android.view.ViewRootImpl.reportNextDraw:10957 android.view.ViewRootImpl.performTraversals:3845 android.view.ViewRootImpl.doTraversal:2618
I/ViewRootImpl@13e67d2[MainActivity](23677): [DP] pd() Asnyc report
I/SurfaceView(23677): setParentSpaceRectangle: useBLAST = false position = Rect(0, 0 - 1080, 2274) frameNumber = 1 t = android.view.SurfaceControl$Transaction@b9275cc
I/SurfaceView(23677): applySurfaceTransforms: t = android.view.SurfaceControl$Transaction@b9275cc surfaceControl = Surface(name=SurfaceView - ru.techsuccess.servicebook/ru.techsuccess.servicebook.MainActivity@bf72f1e@1)/@0x16b68fb frame = 1
I/SurfaceView(23677): applySurfaceTransforms: postScaleX = 1.0 postScaleY = 1.0
I/ViewRootImpl@13e67d2[MainActivity](23677): [DP] pdf(0) 1 android.view.ViewRootImpl.lambda$performDraw$1$ViewRootImpl:4668 android.view.-$$Lambda$ViewRootImpl$DJd0VUYJgsebcnSohO6h8zc_ONI.run:6 android.os.Handler.handleCallback:938
I/ViewRootImpl@13e67d2[MainActivity](23677): [DP] rdf()
I/ViewRootImpl@13e67d2[MainActivity](23677): MSG_WINDOW_FOCUS_CHANGED 1 1
D/InputMethodManager(23677): prepareNavigationBarInfo() DecorView@b13bd46[MainActivity]
D/InputMethodManager(23677): getNavigationBarColor() -16711423
D/InputMethodManager(23677): prepareNavigationBarInfo() DecorView@b13bd46[MainActivity]
D/InputMethodManager(23677): getNavigationBarColor() -16711423
V/InputMethodManager(23677): Starting input: tba=ru.techsuccess.servicebook ic=null mNaviBarColor -16711423 mIsGetNaviBarColorSuccess true , NavVisible : true , NavTrans : false
D/InputMethodManager(23677): startInputInner - Id : 0
I/InputMethodManager(23677): startInputInner - mService.startInputOrWindowGainedFocus
D/InputTransport(23677): Input channel constructed: 'ClientS', fd=115
I/SurfaceControl(23677): nativeRelease nativeObject s[522228851936]
I/SurfaceControl(23677): nativeRelease nativeObject e[522228851936]
I/SurfaceControl(23677): nativeRelease nativeObject s[522228851840]
I/SurfaceControl(23677): nativeRelease nativeObject e[522228851840]

but I don’t get the link and the Firebase does not respond to the link

@Taverz
Can you provide us log from Android or iOS phone where it works and you get the link, as compared to the log you shared above ?

When testing filabase dynamic links,

Can you provide us a complete minimal reproducible code sample and how are you testing the link ?
Also, you can use the plugin example on Samsung phone and see if you get same behavior with it or not.

@darshankawar
When the link works in the logs, only my print to track the work of the link, there are no system logs.

Can you provide us a complete minimal reproducible code sample and how are you testing the link ?
Also, you can use the plugin example on Samsung phone and see if you get same behavior with it or not.

@Taverz

The example you posted works.
I found out that if the application is closed, minimized completely, then it goes and gets everything. But if the app is not closed, then it navigates but doesn't get the link.

@Taverz
When app is not closed, does getInitialLink() method get called or returns null ? Also, does onLink method get called ?

@darshankawar  no get called onLink

does getInitialLink() method get called or returns null ? Also, does onLink method get called ?

Sorry, I didn't understand your above response, does onLink get called or not ? also, does getInitialLink() method get called or returns null ?

@Taverz
Sorry for coming back a bit late on this. I suggest you to reach out to firebase support on this, since it seems to be device specific and may not be related to firebase_dynamic_link plugin.

authors: Taverz darshankawar


text:
Eval operations at execution where state unknown

Closes: #805

Cancelling this in favour of #996, there’s just too much magic already and this change adds yet more. V3 will radically simplify and address these issues properly.

repo: Fizzadar/pyinfra


text:
How is BatchValueSchedule supposed to be working?

I have this simple workflow for Video to Video generation. Basically I just want to be able to define start_at_step for each frame of the video individually. This one complains that for start_at_step I'm giving it a list, instead of Int: '<' not supported between instances of 'list' and 'int'. How to use BatchValueSchedule?

Start_at_step dosn't have the code to process a batch of values, a custom ksampler needs to be made to do this.

ahh okay, if this library could provide such KSampler, that would be amazing ✌

authors: FizzleDorf madvas


text:
Dr. Frinkelfracken's Cure x Chris Brown, Busta Rhymes & Lil Wayne

Song Name
Dr. Frinkelfracken's Cure x Chris Brown, Busta Rhymes & Lil Wayne
Artist Name
EmpyriousGD
Source
Youtube
Youtube Link
https://www.youtube.com/watch?v=LHxniotDPuM
Direct File Link
No response
Song ID
383158
Start Offset [ms]
0
Extra
Created from Auto Nong.
Created for level: 62912799

accept

repo: FlafyDev/auto-nong-indexes


text:
微调过程中的收敛问题

我在bge-m3-v2-ranker上增加我自己的数据微调模型。使用脚本提供的默认参数进行训练。
我的LOSS图开起来不太正常，LOSS除了最开始波动之外，后续训练过程中一直在1.3左右。

望解答

我问了KIMI，他说的对吗，他说我的模型已经收敛~

loss突然变得很高，中间模型似乎训崩了。
可以打印出损失较高那几步的数据，检查数据质量是否过低。如果数据质量没有问题，可以尝试降低学习率解决。

我在bge-m3-v2-ranker上增加我自己的数据微调模型。使用脚本提供的默认参数进行训练。 我的LOSS图开起来不太正常，LOSS除了最开始波动之外，后续训练过程中一直在1.3左右。
望解答

请问一下你是用Flagembedding提供的脚本跑的么？每轮的loss数值你是怎么得到的啊？用脚本跑每次只再日志中有，本地拿不到离线数据。

loss突然变得很高，中间模型似乎训崩了。 可以打印出损失较高那几步的数据，检查数据质量是否过低。如果数据质量没有问题，可以尝试降低学习率解决。

感谢，我降低学习率解决了。看起来bge-m3-v2-rerank是一个已经收敛的模型，不能用太大的学习率，要不然会跳出LOSS极小值的区域。

我将学习率降低到1e-7，收敛的问题解决了。整体loss=0.02左右。不过我在测试集上的F1大幅降低了，由0.7降低到了0.3左右~

有大佬帮我看下我的问题吗，我的训练数据质量看着还可以，示例如下：

我在bge-m3-v2-ranker上增加我自己的数据微调模型。使用脚本提供的默认参数进行训练。 我的LOSS图开起来不太正常，LOSS除了最开始波动之外，后续训练过程中一直在1.3左右。
望解答

请问一下你是用Flagembedding提供的脚本跑的么？每轮的loss数值你是怎么得到的啊？用脚本跑每次只再日志中有，本地拿不到离线数据。

没太懂你的意思，你是要画LOSS图吗。我是用的wandb监控LOSS走势

我将学习率降低到1e-7，收敛的问题解决了。整体loss=0.02左右。不过我在测试集上的F1大幅降低了，由0.7降低到了0.3左右~
有大佬帮我看下我的问题吗，我的训练数据质量看着还可以，示例如下：

neg随机选择吧，有些neg看起来和query很相似，比如“拦截了没？”，“我已经拦截啦”

authors: 545999961 BaLuoBooo tianbo-che

repo: FlagOpen/FlagEmbedding


text:
关于Finetune的一些小问题，没有early stop和best_model save

您好，仔细看了一下finetune的代码，代码内没有做evaluation，early stop或者是设置存最好的模型，请问是通过什么方式去判断finetune表现最好的checkpoints呢？
请问是看每 500 steps之后的train loss作为标准吗？

您好，目前微调代码里没有evaluation的部分，这块需要用户根据具体下游任务设置评估指标，也可以以C-MTEB里的相似任务进行评估。

明白，谢谢！

authors: PNightOwlY staoxiao


text:
Identity override count retrieval is slow for large numbers of overrides

For instance, for an environment with ~50k overrides, retrieving features with override counters takes 15 to 80 seconds.
Things to explore:

Look into DynamoDB access pattern and ways to optimise it
Cache/store identity counters elsewhere

For now, a valid solution is likely to just add a + next to the icon if there are possibly more identity overrides, using the fact that a next page exists in dynamo.

repo: Flagsmith/flagsmith


text:
Access controls

👋 @aktang @anmolvj @archlichking @cgdibble @chiahrens @chrisunder @jarzuaga @tobrien @VtoCorleone
I'm unable to merge PRs. I reached out to my contact at Walmart and it appears he no longer works there. If you can help restore my owner permissions to Flank, that'd be great.
Thanks!

This can be closed. :)

Thanks! Yeah, Flank is owned by me now. 😂

authors: bootstraponline sridhar-vadlamani-ck

repo: Flank/flank


text:
Do not resample data of sensors recording instantaneous values

Closes #490.

Pull Request Test Coverage Report for Build 2947508562

0 of 3 (0.0%)  changed or added relevant lines in 1 file are covered.
1 unchanged line in 1 file lost coverage.
Overall coverage decreased (-0.01%) to 67.744%

Changes Missing Coverage
Covered Lines
Changed/Added Lines
%

flexmeasures/data/models/generic_assets.py
0
3
0.0%

Files with Coverage Reduction
New Missed Lines
%

flexmeasures/data/models/generic_assets.py
1
48.38%

Totals

Change from base Build 2947332461:
-0.01%

Covered Lines:
7277

Relevant Lines:
10169

💛  - Coveralls

repo: FlexMeasures/flexmeasures


text:
Add beliefs with belief timing

This PR allows reading time series from a file that explicitly includes belief times. Also we now drop duplicate rows when reading time series from file, with a warning to the user.

Pull Request Test Coverage Report for Build 3036282615

1 of 7 (14.29%)  changed or added relevant lines in 1 file are covered.
No unchanged relevant lines lost coverage.
Overall coverage decreased (-0.05%) to 65.008%

Changes Missing Coverage
Covered Lines
Changed/Added Lines
%

flexmeasures/cli/data_add.py
1
7
14.29%

Totals

Change from base Build 3029301422:
-0.05%

Covered Lines:
6478

Relevant Lines:
9356

💛  - Coveralls