Fix marshalling of bool flags in MF - #3210

Merged
wschin merged 3 commits into
dotnet:masterfrom
wschin:quiet-mf
Apr 5, 2019
Merged

Fix marshalling of bool flags in MF#3210
wschin merged 3 commits into
dotnet:masterfrom
wschin:quiet-mf

Conversation

@wschin

@wschinwschin commented Apr 5, 2019

Copy link
Copy Markdown
Contributor

Fix#3003. The marshalled Boolean size from C# to C should be 1 byte, not 4. Also, the change from LIBMF is for supporting quiet option in new implicit-feedback MF.

@wschinwschin self-assigned this Apr 5, 2019
@wschinwschin added the bug Something isn't working label Apr 5, 2019
@codecov

codecovBot commented Apr 5, 2019

Copy link
Copy Markdown

Codecov Report

Merging #3210 into master will increase coverage by 0.01%.
The diff coverage is 0%.

@@ Coverage Diff @@## master #3210 +/- ##
==========================================
+ Coverage 72.61% 72.62% +0.01% 
==========================================
Files 807 807 Lines 145077 145080 +3 Branches 16213 16213 ==========================================
+ Hits 105345 105365 +20 + Misses 35316 35297 -19 - Partials 4416 4418 +2
FlagCoverage Δ
#Debug72.62% <0%> (+0.01%)⬆️
#production68.17% <0%> (+0.01%)⬆️
#test88.92% <ø> (ø)⬆️
Impacted FilesCoverage Δ
...osoft.ML.Recommender/SafeTrainingAndModelBuffer.cs78.87% <0%> (ø)⬆️
...soft.ML.Data/DataLoadSave/Text/TextLoaderCursor.cs84.7% <0%> (-0.41%)⬇️
...ML.Transforms/Text/StopWordsRemovingTransformer.cs86.1% <0%> (-0.16%)⬇️
...Microsoft.ML.Transforms/FeatureSelectionCatalog.cs60% <0%> (ø)⬆️
...osoft.ML.Recommender/MatrixFactorizationTrainer.cs70.39% <0%> (ø)⬆️
.../Microsoft.ML.Tests/TrainerEstimators/SdcaTests.cs97.31% <0%> (+0.05%)⬆️
...oft.ML.StandardTrainers/Standard/SdcaMulticlass.cs91.12% <0%> (+1.02%)⬆️
...LogisticRegression/MulticlassLogisticRegression.cs67.61% <0%> (+1.74%)⬆️
...oft.ML.StandardTrainers/StandardTrainersCatalog.cs92.34% <0%> (+3.27%)⬆️

/// </summary>
[FieldOffset(48)]
public int DoNmf;
public byte DoNmf;

@eerhardteerhardtApr 5, 2019

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

While this is better than what we had before, this is still not correct.

https://docs.microsoft.com/en-us/cpp/cpp/fundamental-types-cpp?view=vs-2019

bool Type bool is an integral type that can have one of the two values true or false. Its size is unspecified.

https://en.cppreference.com/w/cpp/language/types

bool - type, capable of holding one of the two values: true or false. The value of sizeof(bool) is implementation defined and might differ from 1.

Instead, to make interop/marshalling work correctly on all computers - the technique we use in .NET is to ensure the ABI (application binary interface) is stable no matter the compiler/processor/etc. This means only stable-sized types can be used in the ABI that C# code P/Invokes into.

So to fix this, the libmf C code should change to have a stable ABI. I see it uses float, int, and bool. For sure int and bool can change sizes depending on the compiler/processor. Instead, we should be using int32_t and int8_t on the C side. (Note: you can just have a wrapper export function in the C library that exposes the stable ABI and calls into your current code. So the main C/C++ code can remain unchanged.) #Closed

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thank you for pointing this out. Another iteration is pushed. Hopefully, it can address this comment.

@wschin
wschin requested a review from eerhardtApril 5, 2019 18:16
/// </summary>
[FieldOffset(48)]
public int DoNmf;
public sbyte DoNmf;

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why sbyte? Why not just byte?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It's int8 in C side.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Make it uint8_t on the C side then?

Signed-ness doesn't really matter here. So using byte is more appropriate.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ok. I will change other place to match this decision.


using namespace mf;

EXPORT_API(mf_parameter) make_param(const mf_parameter_bridge *param_bridge)

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I don't think this needs EXPORT_API does it?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yes!

param.eta = param_bridge->eta;
param.alpha = param_bridge->alpha;
param.c = param_bridge->c;
param.do_nmf = static_cast<bool>(param_bridge->do_nmf);

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Instead of static cast, would it be better to use param_bridge->do_nmf != 0 ? true : false?

@wschinwschinApr 5, 2019

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Sure.

@eerhardteerhardt left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

:shipit:

@wschin

Copy link
Copy Markdown
ContributorAuthor

I will make change to mf_problem and mf_model in other PRs because they incur more complicated changes.

@wschin
wschin merged commit b2ac8e0 into dotnet:masterApr 5, 2019
@wschin
wschin deleted the quiet-mf branch April 5, 2019 22:05
wschin added a commit to wschin/machinelearning that referenced this pull request Apr 11, 2019
@wschinwschin mentioned this pull request Apr 11, 2019
@ghostghost locked as resolved and limited conversation to collaborators Mar 23, 2022
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

bugSomething isn't working

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@wschin@Ivanidzo4ka@eerhardt
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Fix marshalling of bool flags in MF - #3210

Merged
wschin merged 3 commits into
dotnet:masterfrom
wschin:quiet-mf
Apr 5, 2019
Merged

Fix marshalling of bool flags in MF#3210
wschin merged 3 commits into
dotnet:masterfrom
wschin:quiet-mf

Conversation

@wschin

@wschinwschin commented Apr 5, 2019

Copy link
Copy Markdown
Contributor

Fix#3003. The marshalled Boolean size from C# to C should be 1 byte, not 4. Also, the change from LIBMF is for supporting quiet option in new implicit-feedback MF.

@wschinwschin self-assigned this Apr 5, 2019
@wschinwschin added the bug Something isn't working label Apr 5, 2019
@codecov

codecovBot commented Apr 5, 2019

Copy link
Copy Markdown

Codecov Report

Merging #3210 into master will increase coverage by 0.01%.
The diff coverage is 0%.

@@ Coverage Diff @@## master #3210 +/- ##
==========================================
+ Coverage 72.61% 72.62% +0.01% 
==========================================
Files 807 807 Lines 145077 145080 +3 Branches 16213 16213 ==========================================
+ Hits 105345 105365 +20 + Misses 35316 35297 -19 - Partials 4416 4418 +2
FlagCoverage Δ
#Debug72.62% <0%> (+0.01%)⬆️
#production68.17% <0%> (+0.01%)⬆️
#test88.92% <ø> (ø)⬆️
Impacted FilesCoverage Δ
...osoft.ML.Recommender/SafeTrainingAndModelBuffer.cs78.87% <0%> (ø)⬆️
...soft.ML.Data/DataLoadSave/Text/TextLoaderCursor.cs84.7% <0%> (-0.41%)⬇️
...ML.Transforms/Text/StopWordsRemovingTransformer.cs86.1% <0%> (-0.16%)⬇️
...Microsoft.ML.Transforms/FeatureSelectionCatalog.cs60% <0%> (ø)⬆️
...osoft.ML.Recommender/MatrixFactorizationTrainer.cs70.39% <0%> (ø)⬆️
.../Microsoft.ML.Tests/TrainerEstimators/SdcaTests.cs97.31% <0%> (+0.05%)⬆️
...oft.ML.StandardTrainers/Standard/SdcaMulticlass.cs91.12% <0%> (+1.02%)⬆️
...LogisticRegression/MulticlassLogisticRegression.cs67.61% <0%> (+1.74%)⬆️
...oft.ML.StandardTrainers/StandardTrainersCatalog.cs92.34% <0%> (+3.27%)⬆️

/// </summary>
[FieldOffset(48)]
public int DoNmf;
public byte DoNmf;

@eerhardteerhardtApr 5, 2019

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

While this is better than what we had before, this is still not correct.

https://docs.microsoft.com/en-us/cpp/cpp/fundamental-types-cpp?view=vs-2019

bool Type bool is an integral type that can have one of the two values true or false. Its size is unspecified.

https://en.cppreference.com/w/cpp/language/types

bool - type, capable of holding one of the two values: true or false. The value of sizeof(bool) is implementation defined and might differ from 1.

Instead, to make interop/marshalling work correctly on all computers - the technique we use in .NET is to ensure the ABI (application binary interface) is stable no matter the compiler/processor/etc. This means only stable-sized types can be used in the ABI that C# code P/Invokes into.

So to fix this, the libmf C code should change to have a stable ABI. I see it uses float, int, and bool. For sure int and bool can change sizes depending on the compiler/processor. Instead, we should be using int32_t and int8_t on the C side. (Note: you can just have a wrapper export function in the C library that exposes the stable ABI and calls into your current code. So the main C/C++ code can remain unchanged.) #Closed

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thank you for pointing this out. Another iteration is pushed. Hopefully, it can address this comment.

@wschin
wschin requested a review from eerhardtApril 5, 2019 18:16
/// </summary>
[FieldOffset(48)]
public int DoNmf;
public sbyte DoNmf;

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why sbyte? Why not just byte?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It's int8 in C side.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Make it uint8_t on the C side then?

Signed-ness doesn't really matter here. So using byte is more appropriate.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ok. I will change other place to match this decision.


using namespace mf;

EXPORT_API(mf_parameter) make_param(const mf_parameter_bridge *param_bridge)

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I don't think this needs EXPORT_API does it?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yes!

param.eta = param_bridge->eta;
param.alpha = param_bridge->alpha;
param.c = param_bridge->c;
param.do_nmf = static_cast<bool>(param_bridge->do_nmf);

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Instead of static cast, would it be better to use param_bridge->do_nmf != 0 ? true : false?

@wschinwschinApr 5, 2019

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Sure.

@eerhardteerhardt left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

:shipit:

@wschin

Copy link
Copy Markdown
ContributorAuthor

I will make change to mf_problem and mf_model in other PRs because they incur more complicated changes.

@wschin
wschin merged commit b2ac8e0 into dotnet:masterApr 5, 2019
@wschin
wschin deleted the quiet-mf branch April 5, 2019 22:05
wschin added a commit to wschin/machinelearning that referenced this pull request Apr 11, 2019
@wschinwschin mentioned this pull request Apr 11, 2019
@ghostghost locked as resolved and limited conversation to collaborators Mar 23, 2022
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

bugSomething isn't working

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@wschin@Ivanidzo4ka@eerhardt
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Fix marshalling of bool flags in MF - #3210

Merged
wschin merged 3 commits into
dotnet:masterfrom
wschin:quiet-mf
Apr 5, 2019
Merged

Fix marshalling of bool flags in MF#3210
wschin merged 3 commits into
dotnet:masterfrom
wschin:quiet-mf

Conversation

@wschin

@wschinwschin commented Apr 5, 2019

Copy link
Copy Markdown
Contributor

Fix#3003. The marshalled Boolean size from C# to C should be 1 byte, not 4. Also, the change from LIBMF is for supporting quiet option in new implicit-feedback MF.

@wschinwschin self-assigned this Apr 5, 2019
@wschinwschin added the bug Something isn't working label Apr 5, 2019
@codecov

codecovBot commented Apr 5, 2019

Copy link
Copy Markdown

Codecov Report

Merging #3210 into master will increase coverage by 0.01%.
The diff coverage is 0%.

@@ Coverage Diff @@## master #3210 +/- ##
==========================================
+ Coverage 72.61% 72.62% +0.01% 
==========================================
Files 807 807 Lines 145077 145080 +3 Branches 16213 16213 ==========================================
+ Hits 105345 105365 +20 + Misses 35316 35297 -19 - Partials 4416 4418 +2
FlagCoverage Δ
#Debug72.62% <0%> (+0.01%)⬆️
#production68.17% <0%> (+0.01%)⬆️
#test88.92% <ø> (ø)⬆️
Impacted FilesCoverage Δ
...osoft.ML.Recommender/SafeTrainingAndModelBuffer.cs78.87% <0%> (ø)⬆️
...soft.ML.Data/DataLoadSave/Text/TextLoaderCursor.cs84.7% <0%> (-0.41%)⬇️
...ML.Transforms/Text/StopWordsRemovingTransformer.cs86.1% <0%> (-0.16%)⬇️
...Microsoft.ML.Transforms/FeatureSelectionCatalog.cs60% <0%> (ø)⬆️
...osoft.ML.Recommender/MatrixFactorizationTrainer.cs70.39% <0%> (ø)⬆️
.../Microsoft.ML.Tests/TrainerEstimators/SdcaTests.cs97.31% <0%> (+0.05%)⬆️
...oft.ML.StandardTrainers/Standard/SdcaMulticlass.cs91.12% <0%> (+1.02%)⬆️
...LogisticRegression/MulticlassLogisticRegression.cs67.61% <0%> (+1.74%)⬆️
...oft.ML.StandardTrainers/StandardTrainersCatalog.cs92.34% <0%> (+3.27%)⬆️

/// </summary>
[FieldOffset(48)]
public int DoNmf;
public byte DoNmf;

@eerhardteerhardtApr 5, 2019

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

While this is better than what we had before, this is still not correct.

https://docs.microsoft.com/en-us/cpp/cpp/fundamental-types-cpp?view=vs-2019

bool Type bool is an integral type that can have one of the two values true or false. Its size is unspecified.

https://en.cppreference.com/w/cpp/language/types

bool - type, capable of holding one of the two values: true or false. The value of sizeof(bool) is implementation defined and might differ from 1.

Instead, to make interop/marshalling work correctly on all computers - the technique we use in .NET is to ensure the ABI (application binary interface) is stable no matter the compiler/processor/etc. This means only stable-sized types can be used in the ABI that C# code P/Invokes into.

So to fix this, the libmf C code should change to have a stable ABI. I see it uses float, int, and bool. For sure int and bool can change sizes depending on the compiler/processor. Instead, we should be using int32_t and int8_t on the C side. (Note: you can just have a wrapper export function in the C library that exposes the stable ABI and calls into your current code. So the main C/C++ code can remain unchanged.) #Closed

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thank you for pointing this out. Another iteration is pushed. Hopefully, it can address this comment.

@wschin
wschin requested a review from eerhardtApril 5, 2019 18:16
/// </summary>
[FieldOffset(48)]
public int DoNmf;
public sbyte DoNmf;

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why sbyte? Why not just byte?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It's int8 in C side.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Make it uint8_t on the C side then?

Signed-ness doesn't really matter here. So using byte is more appropriate.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ok. I will change other place to match this decision.


using namespace mf;

EXPORT_API(mf_parameter) make_param(const mf_parameter_bridge *param_bridge)

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I don't think this needs EXPORT_API does it?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yes!

param.eta = param_bridge->eta;
param.alpha = param_bridge->alpha;
param.c = param_bridge->c;
param.do_nmf = static_cast<bool>(param_bridge->do_nmf);

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Instead of static cast, would it be better to use param_bridge->do_nmf != 0 ? true : false?

@wschinwschinApr 5, 2019

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Sure.

@eerhardteerhardt left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

:shipit:

@wschin

Copy link
Copy Markdown
ContributorAuthor

I will make change to mf_problem and mf_model in other PRs because they incur more complicated changes.

@wschin
wschin merged commit b2ac8e0 into dotnet:masterApr 5, 2019
@wschin
wschin deleted the quiet-mf branch April 5, 2019 22:05
wschin added a commit to wschin/machinelearning that referenced this pull request Apr 11, 2019
@wschinwschin mentioned this pull request Apr 11, 2019
@ghostghost locked as resolved and limited conversation to collaborators Mar 23, 2022
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

bugSomething isn't working

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@wschin@Ivanidzo4ka@eerhardt
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Fix marshalling of bool flags in MF - #3210

Merged
wschin merged 3 commits into
dotnet:masterfrom
wschin:quiet-mf
Apr 5, 2019
Merged

Fix marshalling of bool flags in MF#3210
wschin merged 3 commits into
dotnet:masterfrom
wschin:quiet-mf

Conversation

@wschin

@wschinwschin commented Apr 5, 2019

Copy link
Copy Markdown
Contributor

Fix#3003. The marshalled Boolean size from C# to C should be 1 byte, not 4. Also, the change from LIBMF is for supporting quiet option in new implicit-feedback MF.

@wschinwschin self-assigned this Apr 5, 2019
@wschinwschin added the bug Something isn't working label Apr 5, 2019
@codecov

codecovBot commented Apr 5, 2019

Copy link
Copy Markdown

Codecov Report

Merging #3210 into master will increase coverage by 0.01%.
The diff coverage is 0%.

@@ Coverage Diff @@## master #3210 +/- ##
==========================================
+ Coverage 72.61% 72.62% +0.01% 
==========================================
Files 807 807 Lines 145077 145080 +3 Branches 16213 16213 ==========================================
+ Hits 105345 105365 +20 + Misses 35316 35297 -19 - Partials 4416 4418 +2
FlagCoverage Δ
#Debug72.62% <0%> (+0.01%)⬆️
#production68.17% <0%> (+0.01%)⬆️
#test88.92% <ø> (ø)⬆️
Impacted FilesCoverage Δ
...osoft.ML.Recommender/SafeTrainingAndModelBuffer.cs78.87% <0%> (ø)⬆️
...soft.ML.Data/DataLoadSave/Text/TextLoaderCursor.cs84.7% <0%> (-0.41%)⬇️
...ML.Transforms/Text/StopWordsRemovingTransformer.cs86.1% <0%> (-0.16%)⬇️
...Microsoft.ML.Transforms/FeatureSelectionCatalog.cs60% <0%> (ø)⬆️
...osoft.ML.Recommender/MatrixFactorizationTrainer.cs70.39% <0%> (ø)⬆️
.../Microsoft.ML.Tests/TrainerEstimators/SdcaTests.cs97.31% <0%> (+0.05%)⬆️
...oft.ML.StandardTrainers/Standard/SdcaMulticlass.cs91.12% <0%> (+1.02%)⬆️
...LogisticRegression/MulticlassLogisticRegression.cs67.61% <0%> (+1.74%)⬆️
...oft.ML.StandardTrainers/StandardTrainersCatalog.cs92.34% <0%> (+3.27%)⬆️

/// </summary>
[FieldOffset(48)]
public int DoNmf;
public byte DoNmf;

@eerhardteerhardtApr 5, 2019

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

While this is better than what we had before, this is still not correct.

https://docs.microsoft.com/en-us/cpp/cpp/fundamental-types-cpp?view=vs-2019

bool Type bool is an integral type that can have one of the two values true or false. Its size is unspecified.

https://en.cppreference.com/w/cpp/language/types

bool - type, capable of holding one of the two values: true or false. The value of sizeof(bool) is implementation defined and might differ from 1.

Instead, to make interop/marshalling work correctly on all computers - the technique we use in .NET is to ensure the ABI (application binary interface) is stable no matter the compiler/processor/etc. This means only stable-sized types can be used in the ABI that C# code P/Invokes into.

So to fix this, the libmf C code should change to have a stable ABI. I see it uses float, int, and bool. For sure int and bool can change sizes depending on the compiler/processor. Instead, we should be using int32_t and int8_t on the C side. (Note: you can just have a wrapper export function in the C library that exposes the stable ABI and calls into your current code. So the main C/C++ code can remain unchanged.) #Closed

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thank you for pointing this out. Another iteration is pushed. Hopefully, it can address this comment.

@wschin
wschin requested a review from eerhardtApril 5, 2019 18:16
/// </summary>
[FieldOffset(48)]
public int DoNmf;
public sbyte DoNmf;

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why sbyte? Why not just byte?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It's int8 in C side.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Make it uint8_t on the C side then?

Signed-ness doesn't really matter here. So using byte is more appropriate.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ok. I will change other place to match this decision.


using namespace mf;

EXPORT_API(mf_parameter) make_param(const mf_parameter_bridge *param_bridge)

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I don't think this needs EXPORT_API does it?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yes!

param.eta = param_bridge->eta;
param.alpha = param_bridge->alpha;
param.c = param_bridge->c;
param.do_nmf = static_cast<bool>(param_bridge->do_nmf);

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Instead of static cast, would it be better to use param_bridge->do_nmf != 0 ? true : false?

@wschinwschinApr 5, 2019

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Sure.

@eerhardteerhardt left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

:shipit:

@wschin

Copy link
Copy Markdown
ContributorAuthor

I will make change to mf_problem and mf_model in other PRs because they incur more complicated changes.

@wschin
wschin merged commit b2ac8e0 into dotnet:masterApr 5, 2019
@wschin
wschin deleted the quiet-mf branch April 5, 2019 22:05
wschin added a commit to wschin/machinelearning that referenced this pull request Apr 11, 2019
@wschinwschin mentioned this pull request Apr 11, 2019
@ghostghost locked as resolved and limited conversation to collaborators Mar 23, 2022
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

bugSomething isn't working

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@wschin@Ivanidzo4ka@eerhardt
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Fix marshalling of bool flags in MF - #3210

Merged
wschin merged 3 commits into
dotnet:masterfrom
wschin:quiet-mf
Apr 5, 2019
Merged

Fix marshalling of bool flags in MF#3210
wschin merged 3 commits into
dotnet:masterfrom
wschin:quiet-mf

Conversation

@wschin

@wschinwschin commented Apr 5, 2019

Copy link
Copy Markdown
Contributor

Fix#3003. The marshalled Boolean size from C# to C should be 1 byte, not 4. Also, the change from LIBMF is for supporting quiet option in new implicit-feedback MF.

@wschinwschin self-assigned this Apr 5, 2019
@wschinwschin added the bug Something isn't working label Apr 5, 2019
@codecov

codecovBot commented Apr 5, 2019

Copy link
Copy Markdown

Codecov Report

Merging #3210 into master will increase coverage by 0.01%.
The diff coverage is 0%.

@@ Coverage Diff @@## master #3210 +/- ##
==========================================
+ Coverage 72.61% 72.62% +0.01% 
==========================================
Files 807 807 Lines 145077 145080 +3 Branches 16213 16213 ==========================================
+ Hits 105345 105365 +20 + Misses 35316 35297 -19 - Partials 4416 4418 +2
FlagCoverage Δ
#Debug72.62% <0%> (+0.01%)⬆️
#production68.17% <0%> (+0.01%)⬆️
#test88.92% <ø> (ø)⬆️
Impacted FilesCoverage Δ
...osoft.ML.Recommender/SafeTrainingAndModelBuffer.cs78.87% <0%> (ø)⬆️
...soft.ML.Data/DataLoadSave/Text/TextLoaderCursor.cs84.7% <0%> (-0.41%)⬇️
...ML.Transforms/Text/StopWordsRemovingTransformer.cs86.1% <0%> (-0.16%)⬇️
...Microsoft.ML.Transforms/FeatureSelectionCatalog.cs60% <0%> (ø)⬆️
...osoft.ML.Recommender/MatrixFactorizationTrainer.cs70.39% <0%> (ø)⬆️
.../Microsoft.ML.Tests/TrainerEstimators/SdcaTests.cs97.31% <0%> (+0.05%)⬆️
...oft.ML.StandardTrainers/Standard/SdcaMulticlass.cs91.12% <0%> (+1.02%)⬆️
...LogisticRegression/MulticlassLogisticRegression.cs67.61% <0%> (+1.74%)⬆️
...oft.ML.StandardTrainers/StandardTrainersCatalog.cs92.34% <0%> (+3.27%)⬆️

/// </summary>
[FieldOffset(48)]
public int DoNmf;
public byte DoNmf;

@eerhardteerhardtApr 5, 2019

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

While this is better than what we had before, this is still not correct.

https://docs.microsoft.com/en-us/cpp/cpp/fundamental-types-cpp?view=vs-2019

bool Type bool is an integral type that can have one of the two values true or false. Its size is unspecified.

https://en.cppreference.com/w/cpp/language/types

bool - type, capable of holding one of the two values: true or false. The value of sizeof(bool) is implementation defined and might differ from 1.

Instead, to make interop/marshalling work correctly on all computers - the technique we use in .NET is to ensure the ABI (application binary interface) is stable no matter the compiler/processor/etc. This means only stable-sized types can be used in the ABI that C# code P/Invokes into.

So to fix this, the libmf C code should change to have a stable ABI. I see it uses float, int, and bool. For sure int and bool can change sizes depending on the compiler/processor. Instead, we should be using int32_t and int8_t on the C side. (Note: you can just have a wrapper export function in the C library that exposes the stable ABI and calls into your current code. So the main C/C++ code can remain unchanged.) #Closed

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thank you for pointing this out. Another iteration is pushed. Hopefully, it can address this comment.

@wschin
wschin requested a review from eerhardtApril 5, 2019 18:16
/// </summary>
[FieldOffset(48)]
public int DoNmf;
public sbyte DoNmf;

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why sbyte? Why not just byte?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It's int8 in C side.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Make it uint8_t on the C side then?

Signed-ness doesn't really matter here. So using byte is more appropriate.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ok. I will change other place to match this decision.


using namespace mf;

EXPORT_API(mf_parameter) make_param(const mf_parameter_bridge *param_bridge)

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I don't think this needs EXPORT_API does it?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yes!

param.eta = param_bridge->eta;
param.alpha = param_bridge->alpha;
param.c = param_bridge->c;
param.do_nmf = static_cast<bool>(param_bridge->do_nmf);

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Instead of static cast, would it be better to use param_bridge->do_nmf != 0 ? true : false?

@wschinwschinApr 5, 2019

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Sure.

@eerhardteerhardt left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

:shipit:

@wschin

Copy link
Copy Markdown
ContributorAuthor

I will make change to mf_problem and mf_model in other PRs because they incur more complicated changes.

@wschin
wschin merged commit b2ac8e0 into dotnet:masterApr 5, 2019
@wschin
wschin deleted the quiet-mf branch April 5, 2019 22:05
wschin added a commit to wschin/machinelearning that referenced this pull request Apr 11, 2019
@wschinwschin mentioned this pull request Apr 11, 2019
@ghostghost locked as resolved and limited conversation to collaborators Mar 23, 2022
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

bugSomething isn't working

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@wschin@Ivanidzo4ka@eerhardt
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Fix marshalling of bool flags in MF - #3210

Merged
wschin merged 3 commits into
dotnet:masterfrom
wschin:quiet-mf
Apr 5, 2019
Merged

Fix marshalling of bool flags in MF#3210
wschin merged 3 commits into
dotnet:masterfrom
wschin:quiet-mf

Conversation

@wschin

@wschinwschin commented Apr 5, 2019

Copy link
Copy Markdown
Contributor

Fix#3003. The marshalled Boolean size from C# to C should be 1 byte, not 4. Also, the change from LIBMF is for supporting quiet option in new implicit-feedback MF.

@wschinwschin self-assigned this Apr 5, 2019
@wschinwschin added the bug Something isn't working label Apr 5, 2019
@codecov

codecovBot commented Apr 5, 2019

Copy link
Copy Markdown

Codecov Report

Merging #3210 into master will increase coverage by 0.01%.
The diff coverage is 0%.

@@ Coverage Diff @@## master #3210 +/- ##
==========================================
+ Coverage 72.61% 72.62% +0.01% 
==========================================
Files 807 807 Lines 145077 145080 +3 Branches 16213 16213 ==========================================
+ Hits 105345 105365 +20 + Misses 35316 35297 -19 - Partials 4416 4418 +2
FlagCoverage Δ
#Debug72.62% <0%> (+0.01%)⬆️
#production68.17% <0%> (+0.01%)⬆️
#test88.92% <ø> (ø)⬆️
Impacted FilesCoverage Δ
...osoft.ML.Recommender/SafeTrainingAndModelBuffer.cs78.87% <0%> (ø)⬆️
...soft.ML.Data/DataLoadSave/Text/TextLoaderCursor.cs84.7% <0%> (-0.41%)⬇️
...ML.Transforms/Text/StopWordsRemovingTransformer.cs86.1% <0%> (-0.16%)⬇️
...Microsoft.ML.Transforms/FeatureSelectionCatalog.cs60% <0%> (ø)⬆️
...osoft.ML.Recommender/MatrixFactorizationTrainer.cs70.39% <0%> (ø)⬆️
.../Microsoft.ML.Tests/TrainerEstimators/SdcaTests.cs97.31% <0%> (+0.05%)⬆️
...oft.ML.StandardTrainers/Standard/SdcaMulticlass.cs91.12% <0%> (+1.02%)⬆️
...LogisticRegression/MulticlassLogisticRegression.cs67.61% <0%> (+1.74%)⬆️
...oft.ML.StandardTrainers/StandardTrainersCatalog.cs92.34% <0%> (+3.27%)⬆️

/// </summary>
[FieldOffset(48)]
public int DoNmf;
public byte DoNmf;

@eerhardteerhardtApr 5, 2019

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

While this is better than what we had before, this is still not correct.

https://docs.microsoft.com/en-us/cpp/cpp/fundamental-types-cpp?view=vs-2019

bool Type bool is an integral type that can have one of the two values true or false. Its size is unspecified.

https://en.cppreference.com/w/cpp/language/types

bool - type, capable of holding one of the two values: true or false. The value of sizeof(bool) is implementation defined and might differ from 1.

Instead, to make interop/marshalling work correctly on all computers - the technique we use in .NET is to ensure the ABI (application binary interface) is stable no matter the compiler/processor/etc. This means only stable-sized types can be used in the ABI that C# code P/Invokes into.

So to fix this, the libmf C code should change to have a stable ABI. I see it uses float, int, and bool. For sure int and bool can change sizes depending on the compiler/processor. Instead, we should be using int32_t and int8_t on the C side. (Note: you can just have a wrapper export function in the C library that exposes the stable ABI and calls into your current code. So the main C/C++ code can remain unchanged.) #Closed

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thank you for pointing this out. Another iteration is pushed. Hopefully, it can address this comment.

@wschin
wschin requested a review from eerhardtApril 5, 2019 18:16
/// </summary>
[FieldOffset(48)]
public int DoNmf;
public sbyte DoNmf;

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why sbyte? Why not just byte?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It's int8 in C side.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Make it uint8_t on the C side then?

Signed-ness doesn't really matter here. So using byte is more appropriate.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ok. I will change other place to match this decision.


using namespace mf;

EXPORT_API(mf_parameter) make_param(const mf_parameter_bridge *param_bridge)

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I don't think this needs EXPORT_API does it?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yes!

param.eta = param_bridge->eta;
param.alpha = param_bridge->alpha;
param.c = param_bridge->c;
param.do_nmf = static_cast<bool>(param_bridge->do_nmf);

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Instead of static cast, would it be better to use param_bridge->do_nmf != 0 ? true : false?

@wschinwschinApr 5, 2019

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Sure.

@eerhardteerhardt left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

:shipit:

@wschin

Copy link
Copy Markdown
ContributorAuthor

I will make change to mf_problem and mf_model in other PRs because they incur more complicated changes.

@wschin
wschin merged commit b2ac8e0 into dotnet:masterApr 5, 2019
@wschin
wschin deleted the quiet-mf branch April 5, 2019 22:05
wschin added a commit to wschin/machinelearning that referenced this pull request Apr 11, 2019
@wschinwschin mentioned this pull request Apr 11, 2019
@ghostghost locked as resolved and limited conversation to collaborators Mar 23, 2022
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

bugSomething isn't working

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@wschin@Ivanidzo4ka@eerhardt
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Fix marshalling of bool flags in MF - #3210

Merged
wschin merged 3 commits into
dotnet:masterfrom
wschin:quiet-mf
Apr 5, 2019
Merged

Fix marshalling of bool flags in MF#3210
wschin merged 3 commits into
dotnet:masterfrom
wschin:quiet-mf

Conversation

@wschin

@wschinwschin commented Apr 5, 2019

Copy link
Copy Markdown
Contributor

Fix#3003. The marshalled Boolean size from C# to C should be 1 byte, not 4. Also, the change from LIBMF is for supporting quiet option in new implicit-feedback MF.

@wschinwschin self-assigned this Apr 5, 2019
@wschinwschin added the bug Something isn't working label Apr 5, 2019
@codecov

codecovBot commented Apr 5, 2019

Copy link
Copy Markdown

Codecov Report

Merging #3210 into master will increase coverage by 0.01%.
The diff coverage is 0%.

@@ Coverage Diff @@## master #3210 +/- ##
==========================================
+ Coverage 72.61% 72.62% +0.01% 
==========================================
Files 807 807 Lines 145077 145080 +3 Branches 16213 16213 ==========================================
+ Hits 105345 105365 +20 + Misses 35316 35297 -19 - Partials 4416 4418 +2
FlagCoverage Δ
#Debug72.62% <0%> (+0.01%)⬆️
#production68.17% <0%> (+0.01%)⬆️
#test88.92% <ø> (ø)⬆️
Impacted FilesCoverage Δ
...osoft.ML.Recommender/SafeTrainingAndModelBuffer.cs78.87% <0%> (ø)⬆️
...soft.ML.Data/DataLoadSave/Text/TextLoaderCursor.cs84.7% <0%> (-0.41%)⬇️
...ML.Transforms/Text/StopWordsRemovingTransformer.cs86.1% <0%> (-0.16%)⬇️
...Microsoft.ML.Transforms/FeatureSelectionCatalog.cs60% <0%> (ø)⬆️
...osoft.ML.Recommender/MatrixFactorizationTrainer.cs70.39% <0%> (ø)⬆️
.../Microsoft.ML.Tests/TrainerEstimators/SdcaTests.cs97.31% <0%> (+0.05%)⬆️
...oft.ML.StandardTrainers/Standard/SdcaMulticlass.cs91.12% <0%> (+1.02%)⬆️
...LogisticRegression/MulticlassLogisticRegression.cs67.61% <0%> (+1.74%)⬆️
...oft.ML.StandardTrainers/StandardTrainersCatalog.cs92.34% <0%> (+3.27%)⬆️

/// </summary>
[FieldOffset(48)]
public int DoNmf;
public byte DoNmf;

@eerhardteerhardtApr 5, 2019

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

While this is better than what we had before, this is still not correct.

https://docs.microsoft.com/en-us/cpp/cpp/fundamental-types-cpp?view=vs-2019

bool Type bool is an integral type that can have one of the two values true or false. Its size is unspecified.

https://en.cppreference.com/w/cpp/language/types

bool - type, capable of holding one of the two values: true or false. The value of sizeof(bool) is implementation defined and might differ from 1.

Instead, to make interop/marshalling work correctly on all computers - the technique we use in .NET is to ensure the ABI (application binary interface) is stable no matter the compiler/processor/etc. This means only stable-sized types can be used in the ABI that C# code P/Invokes into.

So to fix this, the libmf C code should change to have a stable ABI. I see it uses float, int, and bool. For sure int and bool can change sizes depending on the compiler/processor. Instead, we should be using int32_t and int8_t on the C side. (Note: you can just have a wrapper export function in the C library that exposes the stable ABI and calls into your current code. So the main C/C++ code can remain unchanged.) #Closed

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thank you for pointing this out. Another iteration is pushed. Hopefully, it can address this comment.

@wschin
wschin requested a review from eerhardtApril 5, 2019 18:16
/// </summary>
[FieldOffset(48)]
public int DoNmf;
public sbyte DoNmf;

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why sbyte? Why not just byte?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It's int8 in C side.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Make it uint8_t on the C side then?

Signed-ness doesn't really matter here. So using byte is more appropriate.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ok. I will change other place to match this decision.


using namespace mf;

EXPORT_API(mf_parameter) make_param(const mf_parameter_bridge *param_bridge)

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I don't think this needs EXPORT_API does it?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yes!

param.eta = param_bridge->eta;
param.alpha = param_bridge->alpha;
param.c = param_bridge->c;
param.do_nmf = static_cast<bool>(param_bridge->do_nmf);

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Instead of static cast, would it be better to use param_bridge->do_nmf != 0 ? true : false?

@wschinwschinApr 5, 2019

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Sure.

@eerhardteerhardt left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

:shipit:

@wschin

Copy link
Copy Markdown
ContributorAuthor

I will make change to mf_problem and mf_model in other PRs because they incur more complicated changes.

@wschin
wschin merged commit b2ac8e0 into dotnet:masterApr 5, 2019
@wschin
wschin deleted the quiet-mf branch April 5, 2019 22:05
wschin added a commit to wschin/machinelearning that referenced this pull request Apr 11, 2019
@wschinwschin mentioned this pull request Apr 11, 2019
@ghostghost locked as resolved and limited conversation to collaborators Mar 23, 2022
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

bugSomething isn't working

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@wschin@Ivanidzo4ka@eerhardt
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Fix marshalling of bool flags in MF - #3210

Merged
wschin merged 3 commits into
dotnet:masterfrom
wschin:quiet-mf
Apr 5, 2019
Merged

Fix marshalling of bool flags in MF#3210
wschin merged 3 commits into
dotnet:masterfrom
wschin:quiet-mf

Conversation

@wschin

@wschinwschin commented Apr 5, 2019

Copy link
Copy Markdown
Contributor

Fix#3003. The marshalled Boolean size from C# to C should be 1 byte, not 4. Also, the change from LIBMF is for supporting quiet option in new implicit-feedback MF.

@wschinwschin self-assigned this Apr 5, 2019
@wschinwschin added the bug Something isn't working label Apr 5, 2019
@codecov

codecovBot commented Apr 5, 2019

Copy link
Copy Markdown

Codecov Report

Merging #3210 into master will increase coverage by 0.01%.
The diff coverage is 0%.

@@ Coverage Diff @@## master #3210 +/- ##
==========================================
+ Coverage 72.61% 72.62% +0.01% 
==========================================
Files 807 807 Lines 145077 145080 +3 Branches 16213 16213 ==========================================
+ Hits 105345 105365 +20 + Misses 35316 35297 -19 - Partials 4416 4418 +2
FlagCoverage Δ
#Debug72.62% <0%> (+0.01%)⬆️
#production68.17% <0%> (+0.01%)⬆️
#test88.92% <ø> (ø)⬆️
Impacted FilesCoverage Δ
...osoft.ML.Recommender/SafeTrainingAndModelBuffer.cs78.87% <0%> (ø)⬆️
...soft.ML.Data/DataLoadSave/Text/TextLoaderCursor.cs84.7% <0%> (-0.41%)⬇️
...ML.Transforms/Text/StopWordsRemovingTransformer.cs86.1% <0%> (-0.16%)⬇️
...Microsoft.ML.Transforms/FeatureSelectionCatalog.cs60% <0%> (ø)⬆️
...osoft.ML.Recommender/MatrixFactorizationTrainer.cs70.39% <0%> (ø)⬆️
.../Microsoft.ML.Tests/TrainerEstimators/SdcaTests.cs97.31% <0%> (+0.05%)⬆️
...oft.ML.StandardTrainers/Standard/SdcaMulticlass.cs91.12% <0%> (+1.02%)⬆️
...LogisticRegression/MulticlassLogisticRegression.cs67.61% <0%> (+1.74%)⬆️
...oft.ML.StandardTrainers/StandardTrainersCatalog.cs92.34% <0%> (+3.27%)⬆️

/// </summary>
[FieldOffset(48)]
public int DoNmf;
public byte DoNmf;

@eerhardteerhardtApr 5, 2019

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

While this is better than what we had before, this is still not correct.

https://docs.microsoft.com/en-us/cpp/cpp/fundamental-types-cpp?view=vs-2019

bool Type bool is an integral type that can have one of the two values true or false. Its size is unspecified.

https://en.cppreference.com/w/cpp/language/types

bool - type, capable of holding one of the two values: true or false. The value of sizeof(bool) is implementation defined and might differ from 1.

Instead, to make interop/marshalling work correctly on all computers - the technique we use in .NET is to ensure the ABI (application binary interface) is stable no matter the compiler/processor/etc. This means only stable-sized types can be used in the ABI that C# code P/Invokes into.

So to fix this, the libmf C code should change to have a stable ABI. I see it uses float, int, and bool. For sure int and bool can change sizes depending on the compiler/processor. Instead, we should be using int32_t and int8_t on the C side. (Note: you can just have a wrapper export function in the C library that exposes the stable ABI and calls into your current code. So the main C/C++ code can remain unchanged.) #Closed

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thank you for pointing this out. Another iteration is pushed. Hopefully, it can address this comment.

@wschin
wschin requested a review from eerhardtApril 5, 2019 18:16
/// </summary>
[FieldOffset(48)]
public int DoNmf;
public sbyte DoNmf;

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why sbyte? Why not just byte?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It's int8 in C side.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Make it uint8_t on the C side then?

Signed-ness doesn't really matter here. So using byte is more appropriate.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ok. I will change other place to match this decision.


using namespace mf;

EXPORT_API(mf_parameter) make_param(const mf_parameter_bridge *param_bridge)

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I don't think this needs EXPORT_API does it?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yes!

param.eta = param_bridge->eta;
param.alpha = param_bridge->alpha;
param.c = param_bridge->c;
param.do_nmf = static_cast<bool>(param_bridge->do_nmf);

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Instead of static cast, would it be better to use param_bridge->do_nmf != 0 ? true : false?

@wschinwschinApr 5, 2019

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Sure.

@eerhardteerhardt left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

:shipit:

@wschin

Copy link
Copy Markdown
ContributorAuthor

I will make change to mf_problem and mf_model in other PRs because they incur more complicated changes.

@wschin
wschin merged commit b2ac8e0 into dotnet:masterApr 5, 2019
@wschin
wschin deleted the quiet-mf branch April 5, 2019 22:05
wschin added a commit to wschin/machinelearning that referenced this pull request Apr 11, 2019
@wschinwschin mentioned this pull request Apr 11, 2019
@ghostghost locked as resolved and limited conversation to collaborators Mar 23, 2022
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

bugSomething isn't working

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@wschin@Ivanidzo4ka@eerhardt