Replace DvText with .NET Standard type. - #705

Closed
codemzs wants to merge 23 commits into
dotnet:masterfrom
codemzs:dvtext
Closed

Replace DvText with .NET Standard type.#705
codemzs wants to merge 23 commits into
dotnet:masterfrom
codemzs:dvtext

Conversation

@codemzs

@codemzscodemzs commented Aug 21, 2018

Copy link
Copy Markdown
Member

fixes#673

scan.Span = DvText.NA;
else if (_sb.Length == 0)
scan.Span = DvText.Empty;
if (scan.QuotingError || _sb.Length == 0)

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

scan.QuotingError [](start = 28, length = 17)

I wonder if throwing an exception is more appropriate here

labelNames = new VBuffer<DvText>(2, new[] { new DvText("positive"), new DvText("negative") });
DvText[] names = new DvText[2];
labelNames = new VBuffer<ReadOnlyMemory<char>>(2, new[] { "positive".AsMemory(), "negative".AsMemory() });
ReadOnlyMemory<char>[] names = new ReadOnlyMemory<char>[2];

@codemzscodemzsAug 22, 2018

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

ReadOnlyMemory[] names = new ReadOnlyMemory[2]; [](start = 12, length = 59)

indent #Resolved

@TomFinley

TomFinley commented Aug 22, 2018

Copy link
Copy Markdown
Contributor

Hi @codemzs! Do note that our usual practice for "personal" code reviews is that they happen in a personal fork. That is, there is nothing preventing one from requesting a "pull request" into master in ones own fork, where one can review the changes in convenience as much as they like. Indeed this is our usual practice. #Resolved

var stratVals = foldCol >= 0 ? new[] { DvText.NA, DvText.NA } : new[] { DvText.NA };
//REVIEW: Not sure if empty string makes sense here.

var stratVals = foldCol >= 0 ? new[] { "".AsMemory(),"".AsMemory() } : new[] { "".AsMemory() };

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

Need to check on this.

@codemzscodemzs changed the title WIP DO NOT REVIEW - Replace DvText with .NET Standard type.WIP Replace DvText with .NET Standard type.Aug 23, 2018
@codemzscodemzs changed the title WIP Replace DvText with .NET Standard type.RIP Replace DvText with .NET Standard type.Aug 23, 2018
/// </summary>
public static string GetRawUnderlyingBufferInfo(out int ichMin, out int ichLim, ReadOnlyMemory<char> memory)
{
MemoryMarshal.TryGetString(memory, out string outerBuffer, out ichMin, out int length);

@TomFinleyTomFinleyAug 24, 2018

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

My attitude towards this is either we support ReadOnlyMemory<char> or we don't. If we do, then our methods on top of it should work, even if this fails. Fortunately it seems like this was only introduced because we wanted to just have a light "shim" on top of existing DvText methods, which is not really something we want to do. #Resolved

/// </summary>
public static bool Equals(ReadOnlyMemory<char> b, ReadOnlyMemory<char> memory)
{
if (memory.Length != b.Length)

@TomFinleyTomFinleyAug 24, 2018

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

This method and the one below could probably efficiently enough be done over direct indices over the ReadOnlyMemory<char> structure, at least, so I would hope. This would simplify the method considerably. #Resolved

}

/// <summary>
/// Does not propagate NA values. Returns true if both are NA (same as a.Equals(b)).

@TomFinleyTomFinleyAug 24, 2018

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

"Returns true if both are NA" suggests this is copy-pasted from somewhere, since of course now we will no longer have the notion of an NA string. This suggests an incomplete conversion, and is an opportunity for code simplification that we should do right now. #Resolved

/// Returns a text span with leading and trailing spaces trimmed. Note that this
/// will remove only spaces, not any form of whitespace.
/// </summary>
public static ReadOnlyMemory<char> Trim(ReadOnlyMemory<char> memory)

@TomFinleyTomFinleyAug 24, 2018

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

The two major motivations for moving from DvText to ROM<char> is that we get to avoid declaring our own special type for text, and also get to exploit the functionality that the .NET framework gives us. It seems like we did the first, and not the second: we have implementations of some things that appear to have relatively straightforward close implementations in System.MemoryExtensions. #Resolved

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

These extension methods are part of ReadOnlySpan and they return ROS as well which you cannot assign to ROM or create a ROM out of it and that effectively makes them useless for someone that is working with ROM. I'm starting a thread with the guys that wrote these methods to make sure I'm not missing anything.


In reply to: 212748423 [](ancestors = 212748423)

/// <summary>
/// This produces zero for an empty string.
/// </summary>
public static bool TryParse(out Single value, ReadOnlyMemory<char> memory)

@TomFinleyTomFinleyAug 24, 2018

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

So, now that .NET has it, is float.TryParse(ReadOnlyMemory<char>, ...) unusable? #Resolved

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

If it is, you can also get rid of DoubleParser.


In reply to: 212748642 [](ancestors = 212748642)

@codemzscodemzsSep 4, 2018

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

Very well. Unfortunately, these methods are only available in .netstandard 2.1, not in 2.0 and our product code targets 2.0. We cannot target 2.1 because then product code won't run on desktop framework anymore because these methods are not available there.

reference: https://docs.microsoft.com/en-us/dotnet/api/system.text.stringbuilder.append?view=netcore-2.1

https://docs.microsoft.com/en-us/dotnet/api/system.text.stringbuilder.append?view=netframework-4.7.2

It would have been really nice if they were though...


In reply to: 212759741 [](ancestors = 212759741,212748642)

@TomFinley

TomFinley commented Aug 24, 2018

Copy link
Copy Markdown
Contributor
 private bool TryParseCore(string text, int ich, int lim, out ulong dst)

Certainly ulong.TryParse(ReadOnlyMemory<char>, ...) exists now. So can we get rid of this? #Resolved


Refers to: src/Microsoft.ML.Data/Data/Conversion.cs:1265 in ef32b4a. [](commit_id = ef32b4a, deletion_comment = False)

@TomFinley

Copy link
Copy Markdown
Contributor
 private bool TryParseCore(string text, int ich, int lim, out ulong dst)

Same for all TryParse methods.


In reply to: 415887609 [](ancestors = 415887609)


Refers to: src/Microsoft.ML.Data/Data/Conversion.cs:1265 in ef32b4a. [](commit_id = ef32b4a, deletion_comment = False)

public static NormStr FindInPool(NormStr.Pool pool, ReadOnlyMemory<char> memory)
{
Contracts.CheckValue(pool, nameof(pool));
MemoryMarshal.TryGetString(memory, out string outerBuffer, out int ichMin, out int length);

@TomFinleyTomFinleyAug 24, 2018

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Same comment as before. You're either supporting ReadOnlyMemor<char> or you're not. Also of course as with every other usage of this function we are ignoring whether this succeeded or not. #Resolved

@TomFinley

Copy link
Copy Markdown
Contributor
 private bool TryParseCore(string text, int ich, int lim, out ulong dst)

You will of course have to handle mapping the empty string to 0, which things like double.TryParse and the like of course will not do, but that still represents a sizable improvement.


In reply to: 415887757 [](ancestors = 415887757,415887609)


Refers to: src/Microsoft.ML.Data/Data/Conversion.cs:1265 in ef32b4a. [](commit_id = ef32b4a, deletion_comment = False)

@codemzscodemzs changed the title RIP Replace DvText with .NET Standard type.Replace DvText with .NET Standard type.Aug 26, 2018
@codemzs

Copy link
Copy Markdown
MemberAuthor
 private bool TryParseCore(string text, int ich, int lim, out ulong dst)

Please see my previous reply on the other comment similar to this.


In reply to: 415892086 [](ancestors = 415892086,415887757,415887609)


Refers to: src/Microsoft.ML.Data/Data/Conversion.cs:1265 in ef32b4a. [](commit_id = ef32b4a, deletion_comment = False)

…to dvtext
# Conflicts:
#	src/Microsoft.ML.Data/DataLoadSave/Text/TextLoader.cs
#	src/Microsoft.ML.Data/Evaluators/EvaluatorUtils.cs
#	src/Microsoft.ML.Data/Transforms/TermTransform.cs
#	src/Microsoft.ML.Data/Transforms/TermTransformImpl.cs
#	src/Microsoft.ML.ImageAnalytics/ImageLoaderTransform.cs
#	test/Microsoft.ML.TestFramework/DataPipe/TestDataPipeBase.cs

[Column("1")]
public string Text;
public ReadOnlyMemory<char> Text;

@eerhardteerhardtSep 7, 2018

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.

We still support regular string types, right? I think that would be bad if we didn't. #Resolved


[Column("1")]
public float Number_1;
public ReadOnlyMemory<char> Number_1;

@eerhardteerhardtSep 7, 2018

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.

This seems wrong - it was float before, and the property is called Number_1. #Resolved

</ItemGroup>

<ItemGroup>
<PackageReference Include="System.Memory" Version="4.5.1" />

@eerhardteerhardtSep 7, 2018

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.

This shouldn't be necessary. All our test projects are netcoreapp2.1, and so Span and ReadOnlyMemory should be available by default. #Resolved

</ItemGroup>

<ItemGroup>
<PackageReference Include="System.Memory" Version="4.5.1" />

@eerhardteerhardtSep 7, 2018

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.

This shouldn't be necessary. All our test projects are netcoreapp2.1, and so Span and ReadOnlyMemory should be available by default. #Resolved

public float? fFloat;
public double? fDouble;
public bool? fBool;
public string fString;

@eerhardteerhardtSep 7, 2018

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 think we should still support string types, and as such, string can be null. So we should have some tests for null strings. #Resolved

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

What will null string map to? empty string?


In reply to: 215970412 [](ancestors = 215970412)

@codemzscodemzs closed this Sep 20, 2018
@codemzs
codemzs deleted the dvtext branch September 20, 2018 18:15
@codemzs

Copy link
Copy Markdown
MemberAuthor

This change was committed via #863

@ghostghost locked as resolved and limited conversation to collaborators Mar 29, 2022
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

.NET data type system instead of DvTypes

3 participants

@codemzs@TomFinley@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

Replace DvText with .NET Standard type. - #705

Closed
codemzs wants to merge 23 commits into
dotnet:masterfrom
codemzs:dvtext
Closed

Replace DvText with .NET Standard type.#705
codemzs wants to merge 23 commits into
dotnet:masterfrom
codemzs:dvtext

Conversation

@codemzs

@codemzscodemzs commented Aug 21, 2018

Copy link
Copy Markdown
Member

fixes#673

scan.Span = DvText.NA;
else if (_sb.Length == 0)
scan.Span = DvText.Empty;
if (scan.QuotingError || _sb.Length == 0)

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

scan.QuotingError [](start = 28, length = 17)

I wonder if throwing an exception is more appropriate here

labelNames = new VBuffer<DvText>(2, new[] { new DvText("positive"), new DvText("negative") });
DvText[] names = new DvText[2];
labelNames = new VBuffer<ReadOnlyMemory<char>>(2, new[] { "positive".AsMemory(), "negative".AsMemory() });
ReadOnlyMemory<char>[] names = new ReadOnlyMemory<char>[2];

@codemzscodemzsAug 22, 2018

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

ReadOnlyMemory[] names = new ReadOnlyMemory[2]; [](start = 12, length = 59)

indent #Resolved

@TomFinley

TomFinley commented Aug 22, 2018

Copy link
Copy Markdown
Contributor

Hi @codemzs! Do note that our usual practice for "personal" code reviews is that they happen in a personal fork. That is, there is nothing preventing one from requesting a "pull request" into master in ones own fork, where one can review the changes in convenience as much as they like. Indeed this is our usual practice. #Resolved

var stratVals = foldCol >= 0 ? new[] { DvText.NA, DvText.NA } : new[] { DvText.NA };
//REVIEW: Not sure if empty string makes sense here.

var stratVals = foldCol >= 0 ? new[] { "".AsMemory(),"".AsMemory() } : new[] { "".AsMemory() };

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

Need to check on this.

@codemzscodemzs changed the title WIP DO NOT REVIEW - Replace DvText with .NET Standard type.WIP Replace DvText with .NET Standard type.Aug 23, 2018
@codemzscodemzs changed the title WIP Replace DvText with .NET Standard type.RIP Replace DvText with .NET Standard type.Aug 23, 2018
/// </summary>
public static string GetRawUnderlyingBufferInfo(out int ichMin, out int ichLim, ReadOnlyMemory<char> memory)
{
MemoryMarshal.TryGetString(memory, out string outerBuffer, out ichMin, out int length);

@TomFinleyTomFinleyAug 24, 2018

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

My attitude towards this is either we support ReadOnlyMemory<char> or we don't. If we do, then our methods on top of it should work, even if this fails. Fortunately it seems like this was only introduced because we wanted to just have a light "shim" on top of existing DvText methods, which is not really something we want to do. #Resolved

/// </summary>
public static bool Equals(ReadOnlyMemory<char> b, ReadOnlyMemory<char> memory)
{
if (memory.Length != b.Length)

@TomFinleyTomFinleyAug 24, 2018

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

This method and the one below could probably efficiently enough be done over direct indices over the ReadOnlyMemory<char> structure, at least, so I would hope. This would simplify the method considerably. #Resolved

}

/// <summary>
/// Does not propagate NA values. Returns true if both are NA (same as a.Equals(b)).

@TomFinleyTomFinleyAug 24, 2018

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

"Returns true if both are NA" suggests this is copy-pasted from somewhere, since of course now we will no longer have the notion of an NA string. This suggests an incomplete conversion, and is an opportunity for code simplification that we should do right now. #Resolved

/// Returns a text span with leading and trailing spaces trimmed. Note that this
/// will remove only spaces, not any form of whitespace.
/// </summary>
public static ReadOnlyMemory<char> Trim(ReadOnlyMemory<char> memory)

@TomFinleyTomFinleyAug 24, 2018

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

The two major motivations for moving from DvText to ROM<char> is that we get to avoid declaring our own special type for text, and also get to exploit the functionality that the .NET framework gives us. It seems like we did the first, and not the second: we have implementations of some things that appear to have relatively straightforward close implementations in System.MemoryExtensions. #Resolved

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

These extension methods are part of ReadOnlySpan and they return ROS as well which you cannot assign to ROM or create a ROM out of it and that effectively makes them useless for someone that is working with ROM. I'm starting a thread with the guys that wrote these methods to make sure I'm not missing anything.


In reply to: 212748423 [](ancestors = 212748423)

/// <summary>
/// This produces zero for an empty string.
/// </summary>
public static bool TryParse(out Single value, ReadOnlyMemory<char> memory)

@TomFinleyTomFinleyAug 24, 2018

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

So, now that .NET has it, is float.TryParse(ReadOnlyMemory<char>, ...) unusable? #Resolved

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

If it is, you can also get rid of DoubleParser.


In reply to: 212748642 [](ancestors = 212748642)

@codemzscodemzsSep 4, 2018

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

Very well. Unfortunately, these methods are only available in .netstandard 2.1, not in 2.0 and our product code targets 2.0. We cannot target 2.1 because then product code won't run on desktop framework anymore because these methods are not available there.

reference: https://docs.microsoft.com/en-us/dotnet/api/system.text.stringbuilder.append?view=netcore-2.1

https://docs.microsoft.com/en-us/dotnet/api/system.text.stringbuilder.append?view=netframework-4.7.2

It would have been really nice if they were though...


In reply to: 212759741 [](ancestors = 212759741,212748642)

@TomFinley

TomFinley commented Aug 24, 2018

Copy link
Copy Markdown
Contributor
 private bool TryParseCore(string text, int ich, int lim, out ulong dst)

Certainly ulong.TryParse(ReadOnlyMemory<char>, ...) exists now. So can we get rid of this? #Resolved


Refers to: src/Microsoft.ML.Data/Data/Conversion.cs:1265 in ef32b4a. [](commit_id = ef32b4a, deletion_comment = False)

@TomFinley

Copy link
Copy Markdown
Contributor
 private bool TryParseCore(string text, int ich, int lim, out ulong dst)

Same for all TryParse methods.


In reply to: 415887609 [](ancestors = 415887609)


Refers to: src/Microsoft.ML.Data/Data/Conversion.cs:1265 in ef32b4a. [](commit_id = ef32b4a, deletion_comment = False)

public static NormStr FindInPool(NormStr.Pool pool, ReadOnlyMemory<char> memory)
{
Contracts.CheckValue(pool, nameof(pool));
MemoryMarshal.TryGetString(memory, out string outerBuffer, out int ichMin, out int length);

@TomFinleyTomFinleyAug 24, 2018

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Same comment as before. You're either supporting ReadOnlyMemor<char> or you're not. Also of course as with every other usage of this function we are ignoring whether this succeeded or not. #Resolved

@TomFinley

Copy link
Copy Markdown
Contributor
 private bool TryParseCore(string text, int ich, int lim, out ulong dst)

You will of course have to handle mapping the empty string to 0, which things like double.TryParse and the like of course will not do, but that still represents a sizable improvement.


In reply to: 415887757 [](ancestors = 415887757,415887609)


Refers to: src/Microsoft.ML.Data/Data/Conversion.cs:1265 in ef32b4a. [](commit_id = ef32b4a, deletion_comment = False)

@codemzscodemzs changed the title RIP Replace DvText with .NET Standard type.Replace DvText with .NET Standard type.Aug 26, 2018
@codemzs

Copy link
Copy Markdown
MemberAuthor
 private bool TryParseCore(string text, int ich, int lim, out ulong dst)

Please see my previous reply on the other comment similar to this.


In reply to: 415892086 [](ancestors = 415892086,415887757,415887609)


Refers to: src/Microsoft.ML.Data/Data/Conversion.cs:1265 in ef32b4a. [](commit_id = ef32b4a, deletion_comment = False)

…to dvtext
# Conflicts:
#	src/Microsoft.ML.Data/DataLoadSave/Text/TextLoader.cs
#	src/Microsoft.ML.Data/Evaluators/EvaluatorUtils.cs
#	src/Microsoft.ML.Data/Transforms/TermTransform.cs
#	src/Microsoft.ML.Data/Transforms/TermTransformImpl.cs
#	src/Microsoft.ML.ImageAnalytics/ImageLoaderTransform.cs
#	test/Microsoft.ML.TestFramework/DataPipe/TestDataPipeBase.cs

[Column("1")]
public string Text;
public ReadOnlyMemory<char> Text;

@eerhardteerhardtSep 7, 2018

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.

We still support regular string types, right? I think that would be bad if we didn't. #Resolved


[Column("1")]
public float Number_1;
public ReadOnlyMemory<char> Number_1;

@eerhardteerhardtSep 7, 2018

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.

This seems wrong - it was float before, and the property is called Number_1. #Resolved

</ItemGroup>

<ItemGroup>
<PackageReference Include="System.Memory" Version="4.5.1" />

@eerhardteerhardtSep 7, 2018

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.

This shouldn't be necessary. All our test projects are netcoreapp2.1, and so Span and ReadOnlyMemory should be available by default. #Resolved

</ItemGroup>

<ItemGroup>
<PackageReference Include="System.Memory" Version="4.5.1" />

@eerhardteerhardtSep 7, 2018

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.

This shouldn't be necessary. All our test projects are netcoreapp2.1, and so Span and ReadOnlyMemory should be available by default. #Resolved

public float? fFloat;
public double? fDouble;
public bool? fBool;
public string fString;

@eerhardteerhardtSep 7, 2018

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 think we should still support string types, and as such, string can be null. So we should have some tests for null strings. #Resolved

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

What will null string map to? empty string?


In reply to: 215970412 [](ancestors = 215970412)

@codemzscodemzs closed this Sep 20, 2018
@codemzs
codemzs deleted the dvtext branch September 20, 2018 18:15
@codemzs

Copy link
Copy Markdown
MemberAuthor

This change was committed via #863

@ghostghost locked as resolved and limited conversation to collaborators Mar 29, 2022
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

.NET data type system instead of DvTypes

3 participants

@codemzs@TomFinley@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

Replace DvText with .NET Standard type. - #705

Closed
codemzs wants to merge 23 commits into
dotnet:masterfrom
codemzs:dvtext
Closed

Replace DvText with .NET Standard type.#705
codemzs wants to merge 23 commits into
dotnet:masterfrom
codemzs:dvtext

Conversation

@codemzs

@codemzscodemzs commented Aug 21, 2018

Copy link
Copy Markdown
Member

fixes#673

scan.Span = DvText.NA;
else if (_sb.Length == 0)
scan.Span = DvText.Empty;
if (scan.QuotingError || _sb.Length == 0)

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

scan.QuotingError [](start = 28, length = 17)

I wonder if throwing an exception is more appropriate here

labelNames = new VBuffer<DvText>(2, new[] { new DvText("positive"), new DvText("negative") });
DvText[] names = new DvText[2];
labelNames = new VBuffer<ReadOnlyMemory<char>>(2, new[] { "positive".AsMemory(), "negative".AsMemory() });
ReadOnlyMemory<char>[] names = new ReadOnlyMemory<char>[2];

@codemzscodemzsAug 22, 2018

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

ReadOnlyMemory[] names = new ReadOnlyMemory[2]; [](start = 12, length = 59)

indent #Resolved

@TomFinley

TomFinley commented Aug 22, 2018

Copy link
Copy Markdown
Contributor

Hi @codemzs! Do note that our usual practice for "personal" code reviews is that they happen in a personal fork. That is, there is nothing preventing one from requesting a "pull request" into master in ones own fork, where one can review the changes in convenience as much as they like. Indeed this is our usual practice. #Resolved

var stratVals = foldCol >= 0 ? new[] { DvText.NA, DvText.NA } : new[] { DvText.NA };
//REVIEW: Not sure if empty string makes sense here.

var stratVals = foldCol >= 0 ? new[] { "".AsMemory(),"".AsMemory() } : new[] { "".AsMemory() };

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

Need to check on this.

@codemzscodemzs changed the title WIP DO NOT REVIEW - Replace DvText with .NET Standard type.WIP Replace DvText with .NET Standard type.Aug 23, 2018
@codemzscodemzs changed the title WIP Replace DvText with .NET Standard type.RIP Replace DvText with .NET Standard type.Aug 23, 2018
/// </summary>
public static string GetRawUnderlyingBufferInfo(out int ichMin, out int ichLim, ReadOnlyMemory<char> memory)
{
MemoryMarshal.TryGetString(memory, out string outerBuffer, out ichMin, out int length);

@TomFinleyTomFinleyAug 24, 2018

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

My attitude towards this is either we support ReadOnlyMemory<char> or we don't. If we do, then our methods on top of it should work, even if this fails. Fortunately it seems like this was only introduced because we wanted to just have a light "shim" on top of existing DvText methods, which is not really something we want to do. #Resolved

/// </summary>
public static bool Equals(ReadOnlyMemory<char> b, ReadOnlyMemory<char> memory)
{
if (memory.Length != b.Length)

@TomFinleyTomFinleyAug 24, 2018

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

This method and the one below could probably efficiently enough be done over direct indices over the ReadOnlyMemory<char> structure, at least, so I would hope. This would simplify the method considerably. #Resolved

}

/// <summary>
/// Does not propagate NA values. Returns true if both are NA (same as a.Equals(b)).

@TomFinleyTomFinleyAug 24, 2018

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

"Returns true if both are NA" suggests this is copy-pasted from somewhere, since of course now we will no longer have the notion of an NA string. This suggests an incomplete conversion, and is an opportunity for code simplification that we should do right now. #Resolved

/// Returns a text span with leading and trailing spaces trimmed. Note that this
/// will remove only spaces, not any form of whitespace.
/// </summary>
public static ReadOnlyMemory<char> Trim(ReadOnlyMemory<char> memory)

@TomFinleyTomFinleyAug 24, 2018

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

The two major motivations for moving from DvText to ROM<char> is that we get to avoid declaring our own special type for text, and also get to exploit the functionality that the .NET framework gives us. It seems like we did the first, and not the second: we have implementations of some things that appear to have relatively straightforward close implementations in System.MemoryExtensions. #Resolved

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

These extension methods are part of ReadOnlySpan and they return ROS as well which you cannot assign to ROM or create a ROM out of it and that effectively makes them useless for someone that is working with ROM. I'm starting a thread with the guys that wrote these methods to make sure I'm not missing anything.


In reply to: 212748423 [](ancestors = 212748423)

/// <summary>
/// This produces zero for an empty string.
/// </summary>
public static bool TryParse(out Single value, ReadOnlyMemory<char> memory)

@TomFinleyTomFinleyAug 24, 2018

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

So, now that .NET has it, is float.TryParse(ReadOnlyMemory<char>, ...) unusable? #Resolved

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

If it is, you can also get rid of DoubleParser.


In reply to: 212748642 [](ancestors = 212748642)

@codemzscodemzsSep 4, 2018

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

Very well. Unfortunately, these methods are only available in .netstandard 2.1, not in 2.0 and our product code targets 2.0. We cannot target 2.1 because then product code won't run on desktop framework anymore because these methods are not available there.

reference: https://docs.microsoft.com/en-us/dotnet/api/system.text.stringbuilder.append?view=netcore-2.1

https://docs.microsoft.com/en-us/dotnet/api/system.text.stringbuilder.append?view=netframework-4.7.2

It would have been really nice if they were though...


In reply to: 212759741 [](ancestors = 212759741,212748642)

@TomFinley

TomFinley commented Aug 24, 2018

Copy link
Copy Markdown
Contributor
 private bool TryParseCore(string text, int ich, int lim, out ulong dst)

Certainly ulong.TryParse(ReadOnlyMemory<char>, ...) exists now. So can we get rid of this? #Resolved


Refers to: src/Microsoft.ML.Data/Data/Conversion.cs:1265 in ef32b4a. [](commit_id = ef32b4a, deletion_comment = False)

@TomFinley

Copy link
Copy Markdown
Contributor
 private bool TryParseCore(string text, int ich, int lim, out ulong dst)

Same for all TryParse methods.


In reply to: 415887609 [](ancestors = 415887609)


Refers to: src/Microsoft.ML.Data/Data/Conversion.cs:1265 in ef32b4a. [](commit_id = ef32b4a, deletion_comment = False)

public static NormStr FindInPool(NormStr.Pool pool, ReadOnlyMemory<char> memory)
{
Contracts.CheckValue(pool, nameof(pool));
MemoryMarshal.TryGetString(memory, out string outerBuffer, out int ichMin, out int length);

@TomFinleyTomFinleyAug 24, 2018

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Same comment as before. You're either supporting ReadOnlyMemor<char> or you're not. Also of course as with every other usage of this function we are ignoring whether this succeeded or not. #Resolved

@TomFinley

Copy link
Copy Markdown
Contributor
 private bool TryParseCore(string text, int ich, int lim, out ulong dst)

You will of course have to handle mapping the empty string to 0, which things like double.TryParse and the like of course will not do, but that still represents a sizable improvement.


In reply to: 415887757 [](ancestors = 415887757,415887609)


Refers to: src/Microsoft.ML.Data/Data/Conversion.cs:1265 in ef32b4a. [](commit_id = ef32b4a, deletion_comment = False)

@codemzscodemzs changed the title RIP Replace DvText with .NET Standard type.Replace DvText with .NET Standard type.Aug 26, 2018
@codemzs

Copy link
Copy Markdown
MemberAuthor
 private bool TryParseCore(string text, int ich, int lim, out ulong dst)

Please see my previous reply on the other comment similar to this.


In reply to: 415892086 [](ancestors = 415892086,415887757,415887609)


Refers to: src/Microsoft.ML.Data/Data/Conversion.cs:1265 in ef32b4a. [](commit_id = ef32b4a, deletion_comment = False)

…to dvtext
# Conflicts:
#	src/Microsoft.ML.Data/DataLoadSave/Text/TextLoader.cs
#	src/Microsoft.ML.Data/Evaluators/EvaluatorUtils.cs
#	src/Microsoft.ML.Data/Transforms/TermTransform.cs
#	src/Microsoft.ML.Data/Transforms/TermTransformImpl.cs
#	src/Microsoft.ML.ImageAnalytics/ImageLoaderTransform.cs
#	test/Microsoft.ML.TestFramework/DataPipe/TestDataPipeBase.cs

[Column("1")]
public string Text;
public ReadOnlyMemory<char> Text;

@eerhardteerhardtSep 7, 2018

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.

We still support regular string types, right? I think that would be bad if we didn't. #Resolved


[Column("1")]
public float Number_1;
public ReadOnlyMemory<char> Number_1;

@eerhardteerhardtSep 7, 2018

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.

This seems wrong - it was float before, and the property is called Number_1. #Resolved

</ItemGroup>

<ItemGroup>
<PackageReference Include="System.Memory" Version="4.5.1" />

@eerhardteerhardtSep 7, 2018

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.

This shouldn't be necessary. All our test projects are netcoreapp2.1, and so Span and ReadOnlyMemory should be available by default. #Resolved

</ItemGroup>

<ItemGroup>
<PackageReference Include="System.Memory" Version="4.5.1" />

@eerhardteerhardtSep 7, 2018

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.

This shouldn't be necessary. All our test projects are netcoreapp2.1, and so Span and ReadOnlyMemory should be available by default. #Resolved

public float? fFloat;
public double? fDouble;
public bool? fBool;
public string fString;

@eerhardteerhardtSep 7, 2018

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 think we should still support string types, and as such, string can be null. So we should have some tests for null strings. #Resolved

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

What will null string map to? empty string?


In reply to: 215970412 [](ancestors = 215970412)

@codemzscodemzs closed this Sep 20, 2018
@codemzs
codemzs deleted the dvtext branch September 20, 2018 18:15
@codemzs

Copy link
Copy Markdown
MemberAuthor

This change was committed via #863

@ghostghost locked as resolved and limited conversation to collaborators Mar 29, 2022
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

.NET data type system instead of DvTypes

3 participants

@codemzs@TomFinley@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

Replace DvText with .NET Standard type. - #705

Closed
codemzs wants to merge 23 commits into
dotnet:masterfrom
codemzs:dvtext
Closed

Replace DvText with .NET Standard type.#705
codemzs wants to merge 23 commits into
dotnet:masterfrom
codemzs:dvtext

Conversation

@codemzs

@codemzscodemzs commented Aug 21, 2018

Copy link
Copy Markdown
Member

fixes#673

scan.Span = DvText.NA;
else if (_sb.Length == 0)
scan.Span = DvText.Empty;
if (scan.QuotingError || _sb.Length == 0)

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

scan.QuotingError [](start = 28, length = 17)

I wonder if throwing an exception is more appropriate here

labelNames = new VBuffer<DvText>(2, new[] { new DvText("positive"), new DvText("negative") });
DvText[] names = new DvText[2];
labelNames = new VBuffer<ReadOnlyMemory<char>>(2, new[] { "positive".AsMemory(), "negative".AsMemory() });
ReadOnlyMemory<char>[] names = new ReadOnlyMemory<char>[2];

@codemzscodemzsAug 22, 2018

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

ReadOnlyMemory[] names = new ReadOnlyMemory[2]; [](start = 12, length = 59)

indent #Resolved

@TomFinley

TomFinley commented Aug 22, 2018

Copy link
Copy Markdown
Contributor

Hi @codemzs! Do note that our usual practice for "personal" code reviews is that they happen in a personal fork. That is, there is nothing preventing one from requesting a "pull request" into master in ones own fork, where one can review the changes in convenience as much as they like. Indeed this is our usual practice. #Resolved

var stratVals = foldCol >= 0 ? new[] { DvText.NA, DvText.NA } : new[] { DvText.NA };
//REVIEW: Not sure if empty string makes sense here.

var stratVals = foldCol >= 0 ? new[] { "".AsMemory(),"".AsMemory() } : new[] { "".AsMemory() };

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

Need to check on this.

@codemzscodemzs changed the title WIP DO NOT REVIEW - Replace DvText with .NET Standard type.WIP Replace DvText with .NET Standard type.Aug 23, 2018
@codemzscodemzs changed the title WIP Replace DvText with .NET Standard type.RIP Replace DvText with .NET Standard type.Aug 23, 2018
/// </summary>
public static string GetRawUnderlyingBufferInfo(out int ichMin, out int ichLim, ReadOnlyMemory<char> memory)
{
MemoryMarshal.TryGetString(memory, out string outerBuffer, out ichMin, out int length);

@TomFinleyTomFinleyAug 24, 2018

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

My attitude towards this is either we support ReadOnlyMemory<char> or we don't. If we do, then our methods on top of it should work, even if this fails. Fortunately it seems like this was only introduced because we wanted to just have a light "shim" on top of existing DvText methods, which is not really something we want to do. #Resolved

/// </summary>
public static bool Equals(ReadOnlyMemory<char> b, ReadOnlyMemory<char> memory)
{
if (memory.Length != b.Length)

@TomFinleyTomFinleyAug 24, 2018

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

This method and the one below could probably efficiently enough be done over direct indices over the ReadOnlyMemory<char> structure, at least, so I would hope. This would simplify the method considerably. #Resolved

}

/// <summary>
/// Does not propagate NA values. Returns true if both are NA (same as a.Equals(b)).

@TomFinleyTomFinleyAug 24, 2018

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

"Returns true if both are NA" suggests this is copy-pasted from somewhere, since of course now we will no longer have the notion of an NA string. This suggests an incomplete conversion, and is an opportunity for code simplification that we should do right now. #Resolved

/// Returns a text span with leading and trailing spaces trimmed. Note that this
/// will remove only spaces, not any form of whitespace.
/// </summary>
public static ReadOnlyMemory<char> Trim(ReadOnlyMemory<char> memory)

@TomFinleyTomFinleyAug 24, 2018

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

The two major motivations for moving from DvText to ROM<char> is that we get to avoid declaring our own special type for text, and also get to exploit the functionality that the .NET framework gives us. It seems like we did the first, and not the second: we have implementations of some things that appear to have relatively straightforward close implementations in System.MemoryExtensions. #Resolved

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

These extension methods are part of ReadOnlySpan and they return ROS as well which you cannot assign to ROM or create a ROM out of it and that effectively makes them useless for someone that is working with ROM. I'm starting a thread with the guys that wrote these methods to make sure I'm not missing anything.


In reply to: 212748423 [](ancestors = 212748423)

/// <summary>
/// This produces zero for an empty string.
/// </summary>
public static bool TryParse(out Single value, ReadOnlyMemory<char> memory)

@TomFinleyTomFinleyAug 24, 2018

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

So, now that .NET has it, is float.TryParse(ReadOnlyMemory<char>, ...) unusable? #Resolved

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

If it is, you can also get rid of DoubleParser.


In reply to: 212748642 [](ancestors = 212748642)

@codemzscodemzsSep 4, 2018

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

Very well. Unfortunately, these methods are only available in .netstandard 2.1, not in 2.0 and our product code targets 2.0. We cannot target 2.1 because then product code won't run on desktop framework anymore because these methods are not available there.

reference: https://docs.microsoft.com/en-us/dotnet/api/system.text.stringbuilder.append?view=netcore-2.1

https://docs.microsoft.com/en-us/dotnet/api/system.text.stringbuilder.append?view=netframework-4.7.2

It would have been really nice if they were though...


In reply to: 212759741 [](ancestors = 212759741,212748642)

@TomFinley

TomFinley commented Aug 24, 2018

Copy link
Copy Markdown
Contributor
 private bool TryParseCore(string text, int ich, int lim, out ulong dst)

Certainly ulong.TryParse(ReadOnlyMemory<char>, ...) exists now. So can we get rid of this? #Resolved


Refers to: src/Microsoft.ML.Data/Data/Conversion.cs:1265 in ef32b4a. [](commit_id = ef32b4a, deletion_comment = False)

@TomFinley

Copy link
Copy Markdown
Contributor
 private bool TryParseCore(string text, int ich, int lim, out ulong dst)

Same for all TryParse methods.


In reply to: 415887609 [](ancestors = 415887609)


Refers to: src/Microsoft.ML.Data/Data/Conversion.cs:1265 in ef32b4a. [](commit_id = ef32b4a, deletion_comment = False)

public static NormStr FindInPool(NormStr.Pool pool, ReadOnlyMemory<char> memory)
{
Contracts.CheckValue(pool, nameof(pool));
MemoryMarshal.TryGetString(memory, out string outerBuffer, out int ichMin, out int length);

@TomFinleyTomFinleyAug 24, 2018

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Same comment as before. You're either supporting ReadOnlyMemor<char> or you're not. Also of course as with every other usage of this function we are ignoring whether this succeeded or not. #Resolved

@TomFinley

Copy link
Copy Markdown
Contributor
 private bool TryParseCore(string text, int ich, int lim, out ulong dst)

You will of course have to handle mapping the empty string to 0, which things like double.TryParse and the like of course will not do, but that still represents a sizable improvement.


In reply to: 415887757 [](ancestors = 415887757,415887609)


Refers to: src/Microsoft.ML.Data/Data/Conversion.cs:1265 in ef32b4a. [](commit_id = ef32b4a, deletion_comment = False)

@codemzscodemzs changed the title RIP Replace DvText with .NET Standard type.Replace DvText with .NET Standard type.Aug 26, 2018
@codemzs

Copy link
Copy Markdown
MemberAuthor
 private bool TryParseCore(string text, int ich, int lim, out ulong dst)

Please see my previous reply on the other comment similar to this.


In reply to: 415892086 [](ancestors = 415892086,415887757,415887609)


Refers to: src/Microsoft.ML.Data/Data/Conversion.cs:1265 in ef32b4a. [](commit_id = ef32b4a, deletion_comment = False)

…to dvtext
# Conflicts:
#	src/Microsoft.ML.Data/DataLoadSave/Text/TextLoader.cs
#	src/Microsoft.ML.Data/Evaluators/EvaluatorUtils.cs
#	src/Microsoft.ML.Data/Transforms/TermTransform.cs
#	src/Microsoft.ML.Data/Transforms/TermTransformImpl.cs
#	src/Microsoft.ML.ImageAnalytics/ImageLoaderTransform.cs
#	test/Microsoft.ML.TestFramework/DataPipe/TestDataPipeBase.cs

[Column("1")]
public string Text;
public ReadOnlyMemory<char> Text;

@eerhardteerhardtSep 7, 2018

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.

We still support regular string types, right? I think that would be bad if we didn't. #Resolved


[Column("1")]
public float Number_1;
public ReadOnlyMemory<char> Number_1;

@eerhardteerhardtSep 7, 2018

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.

This seems wrong - it was float before, and the property is called Number_1. #Resolved

</ItemGroup>

<ItemGroup>
<PackageReference Include="System.Memory" Version="4.5.1" />

@eerhardteerhardtSep 7, 2018

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.

This shouldn't be necessary. All our test projects are netcoreapp2.1, and so Span and ReadOnlyMemory should be available by default. #Resolved

</ItemGroup>

<ItemGroup>
<PackageReference Include="System.Memory" Version="4.5.1" />

@eerhardteerhardtSep 7, 2018

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.

This shouldn't be necessary. All our test projects are netcoreapp2.1, and so Span and ReadOnlyMemory should be available by default. #Resolved

public float? fFloat;
public double? fDouble;
public bool? fBool;
public string fString;

@eerhardteerhardtSep 7, 2018

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 think we should still support string types, and as such, string can be null. So we should have some tests for null strings. #Resolved

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

What will null string map to? empty string?


In reply to: 215970412 [](ancestors = 215970412)

@codemzscodemzs closed this Sep 20, 2018
@codemzs
codemzs deleted the dvtext branch September 20, 2018 18:15
@codemzs

Copy link
Copy Markdown
MemberAuthor

This change was committed via #863

@ghostghost locked as resolved and limited conversation to collaborators Mar 29, 2022
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

.NET data type system instead of DvTypes

3 participants

@codemzs@TomFinley@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

Replace DvText with .NET Standard type. - #705

Closed
codemzs wants to merge 23 commits into
dotnet:masterfrom
codemzs:dvtext
Closed

Replace DvText with .NET Standard type.#705
codemzs wants to merge 23 commits into
dotnet:masterfrom
codemzs:dvtext

Conversation

@codemzs

@codemzscodemzs commented Aug 21, 2018

Copy link
Copy Markdown
Member

fixes#673

scan.Span = DvText.NA;
else if (_sb.Length == 0)
scan.Span = DvText.Empty;
if (scan.QuotingError || _sb.Length == 0)

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

scan.QuotingError [](start = 28, length = 17)

I wonder if throwing an exception is more appropriate here

labelNames = new VBuffer<DvText>(2, new[] { new DvText("positive"), new DvText("negative") });
DvText[] names = new DvText[2];
labelNames = new VBuffer<ReadOnlyMemory<char>>(2, new[] { "positive".AsMemory(), "negative".AsMemory() });
ReadOnlyMemory<char>[] names = new ReadOnlyMemory<char>[2];

@codemzscodemzsAug 22, 2018

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

ReadOnlyMemory[] names = new ReadOnlyMemory[2]; [](start = 12, length = 59)

indent #Resolved

@TomFinley

TomFinley commented Aug 22, 2018

Copy link
Copy Markdown
Contributor

Hi @codemzs! Do note that our usual practice for "personal" code reviews is that they happen in a personal fork. That is, there is nothing preventing one from requesting a "pull request" into master in ones own fork, where one can review the changes in convenience as much as they like. Indeed this is our usual practice. #Resolved

var stratVals = foldCol >= 0 ? new[] { DvText.NA, DvText.NA } : new[] { DvText.NA };
//REVIEW: Not sure if empty string makes sense here.

var stratVals = foldCol >= 0 ? new[] { "".AsMemory(),"".AsMemory() } : new[] { "".AsMemory() };

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

Need to check on this.

@codemzscodemzs changed the title WIP DO NOT REVIEW - Replace DvText with .NET Standard type.WIP Replace DvText with .NET Standard type.Aug 23, 2018
@codemzscodemzs changed the title WIP Replace DvText with .NET Standard type.RIP Replace DvText with .NET Standard type.Aug 23, 2018
/// </summary>
public static string GetRawUnderlyingBufferInfo(out int ichMin, out int ichLim, ReadOnlyMemory<char> memory)
{
MemoryMarshal.TryGetString(memory, out string outerBuffer, out ichMin, out int length);

@TomFinleyTomFinleyAug 24, 2018

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

My attitude towards this is either we support ReadOnlyMemory<char> or we don't. If we do, then our methods on top of it should work, even if this fails. Fortunately it seems like this was only introduced because we wanted to just have a light "shim" on top of existing DvText methods, which is not really something we want to do. #Resolved

/// </summary>
public static bool Equals(ReadOnlyMemory<char> b, ReadOnlyMemory<char> memory)
{
if (memory.Length != b.Length)

@TomFinleyTomFinleyAug 24, 2018

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

This method and the one below could probably efficiently enough be done over direct indices over the ReadOnlyMemory<char> structure, at least, so I would hope. This would simplify the method considerably. #Resolved

}

/// <summary>
/// Does not propagate NA values. Returns true if both are NA (same as a.Equals(b)).

@TomFinleyTomFinleyAug 24, 2018

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

"Returns true if both are NA" suggests this is copy-pasted from somewhere, since of course now we will no longer have the notion of an NA string. This suggests an incomplete conversion, and is an opportunity for code simplification that we should do right now. #Resolved

/// Returns a text span with leading and trailing spaces trimmed. Note that this
/// will remove only spaces, not any form of whitespace.
/// </summary>
public static ReadOnlyMemory<char> Trim(ReadOnlyMemory<char> memory)

@TomFinleyTomFinleyAug 24, 2018

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

The two major motivations for moving from DvText to ROM<char> is that we get to avoid declaring our own special type for text, and also get to exploit the functionality that the .NET framework gives us. It seems like we did the first, and not the second: we have implementations of some things that appear to have relatively straightforward close implementations in System.MemoryExtensions. #Resolved

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

These extension methods are part of ReadOnlySpan and they return ROS as well which you cannot assign to ROM or create a ROM out of it and that effectively makes them useless for someone that is working with ROM. I'm starting a thread with the guys that wrote these methods to make sure I'm not missing anything.


In reply to: 212748423 [](ancestors = 212748423)

/// <summary>
/// This produces zero for an empty string.
/// </summary>
public static bool TryParse(out Single value, ReadOnlyMemory<char> memory)

@TomFinleyTomFinleyAug 24, 2018

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

So, now that .NET has it, is float.TryParse(ReadOnlyMemory<char>, ...) unusable? #Resolved

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

If it is, you can also get rid of DoubleParser.


In reply to: 212748642 [](ancestors = 212748642)

@codemzscodemzsSep 4, 2018

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

Very well. Unfortunately, these methods are only available in .netstandard 2.1, not in 2.0 and our product code targets 2.0. We cannot target 2.1 because then product code won't run on desktop framework anymore because these methods are not available there.

reference: https://docs.microsoft.com/en-us/dotnet/api/system.text.stringbuilder.append?view=netcore-2.1

https://docs.microsoft.com/en-us/dotnet/api/system.text.stringbuilder.append?view=netframework-4.7.2

It would have been really nice if they were though...


In reply to: 212759741 [](ancestors = 212759741,212748642)

@TomFinley

TomFinley commented Aug 24, 2018

Copy link
Copy Markdown
Contributor
 private bool TryParseCore(string text, int ich, int lim, out ulong dst)

Certainly ulong.TryParse(ReadOnlyMemory<char>, ...) exists now. So can we get rid of this? #Resolved


Refers to: src/Microsoft.ML.Data/Data/Conversion.cs:1265 in ef32b4a. [](commit_id = ef32b4a, deletion_comment = False)

@TomFinley

Copy link
Copy Markdown
Contributor
 private bool TryParseCore(string text, int ich, int lim, out ulong dst)

Same for all TryParse methods.


In reply to: 415887609 [](ancestors = 415887609)


Refers to: src/Microsoft.ML.Data/Data/Conversion.cs:1265 in ef32b4a. [](commit_id = ef32b4a, deletion_comment = False)

public static NormStr FindInPool(NormStr.Pool pool, ReadOnlyMemory<char> memory)
{
Contracts.CheckValue(pool, nameof(pool));
MemoryMarshal.TryGetString(memory, out string outerBuffer, out int ichMin, out int length);

@TomFinleyTomFinleyAug 24, 2018

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Same comment as before. You're either supporting ReadOnlyMemor<char> or you're not. Also of course as with every other usage of this function we are ignoring whether this succeeded or not. #Resolved

@TomFinley

Copy link
Copy Markdown
Contributor
 private bool TryParseCore(string text, int ich, int lim, out ulong dst)

You will of course have to handle mapping the empty string to 0, which things like double.TryParse and the like of course will not do, but that still represents a sizable improvement.


In reply to: 415887757 [](ancestors = 415887757,415887609)


Refers to: src/Microsoft.ML.Data/Data/Conversion.cs:1265 in ef32b4a. [](commit_id = ef32b4a, deletion_comment = False)

@codemzscodemzs changed the title RIP Replace DvText with .NET Standard type.Replace DvText with .NET Standard type.Aug 26, 2018
@codemzs

Copy link
Copy Markdown
MemberAuthor
 private bool TryParseCore(string text, int ich, int lim, out ulong dst)

Please see my previous reply on the other comment similar to this.


In reply to: 415892086 [](ancestors = 415892086,415887757,415887609)


Refers to: src/Microsoft.ML.Data/Data/Conversion.cs:1265 in ef32b4a. [](commit_id = ef32b4a, deletion_comment = False)

…to dvtext
# Conflicts:
#	src/Microsoft.ML.Data/DataLoadSave/Text/TextLoader.cs
#	src/Microsoft.ML.Data/Evaluators/EvaluatorUtils.cs
#	src/Microsoft.ML.Data/Transforms/TermTransform.cs
#	src/Microsoft.ML.Data/Transforms/TermTransformImpl.cs
#	src/Microsoft.ML.ImageAnalytics/ImageLoaderTransform.cs
#	test/Microsoft.ML.TestFramework/DataPipe/TestDataPipeBase.cs

[Column("1")]
public string Text;
public ReadOnlyMemory<char> Text;

@eerhardteerhardtSep 7, 2018

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.

We still support regular string types, right? I think that would be bad if we didn't. #Resolved


[Column("1")]
public float Number_1;
public ReadOnlyMemory<char> Number_1;

@eerhardteerhardtSep 7, 2018

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.

This seems wrong - it was float before, and the property is called Number_1. #Resolved

</ItemGroup>

<ItemGroup>
<PackageReference Include="System.Memory" Version="4.5.1" />

@eerhardteerhardtSep 7, 2018

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.

This shouldn't be necessary. All our test projects are netcoreapp2.1, and so Span and ReadOnlyMemory should be available by default. #Resolved

</ItemGroup>

<ItemGroup>
<PackageReference Include="System.Memory" Version="4.5.1" />

@eerhardteerhardtSep 7, 2018

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.

This shouldn't be necessary. All our test projects are netcoreapp2.1, and so Span and ReadOnlyMemory should be available by default. #Resolved

public float? fFloat;
public double? fDouble;
public bool? fBool;
public string fString;

@eerhardteerhardtSep 7, 2018

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 think we should still support string types, and as such, string can be null. So we should have some tests for null strings. #Resolved

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

What will null string map to? empty string?


In reply to: 215970412 [](ancestors = 215970412)

@codemzscodemzs closed this Sep 20, 2018
@codemzs
codemzs deleted the dvtext branch September 20, 2018 18:15
@codemzs

Copy link
Copy Markdown
MemberAuthor

This change was committed via #863

@ghostghost locked as resolved and limited conversation to collaborators Mar 29, 2022
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

.NET data type system instead of DvTypes

3 participants

@codemzs@TomFinley@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

Replace DvText with .NET Standard type. - #705

Closed
codemzs wants to merge 23 commits into
dotnet:masterfrom
codemzs:dvtext
Closed

Replace DvText with .NET Standard type.#705
codemzs wants to merge 23 commits into
dotnet:masterfrom
codemzs:dvtext

Conversation

@codemzs

@codemzscodemzs commented Aug 21, 2018

Copy link
Copy Markdown
Member

fixes#673

scan.Span = DvText.NA;
else if (_sb.Length == 0)
scan.Span = DvText.Empty;
if (scan.QuotingError || _sb.Length == 0)

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

scan.QuotingError [](start = 28, length = 17)

I wonder if throwing an exception is more appropriate here

labelNames = new VBuffer<DvText>(2, new[] { new DvText("positive"), new DvText("negative") });
DvText[] names = new DvText[2];
labelNames = new VBuffer<ReadOnlyMemory<char>>(2, new[] { "positive".AsMemory(), "negative".AsMemory() });
ReadOnlyMemory<char>[] names = new ReadOnlyMemory<char>[2];

@codemzscodemzsAug 22, 2018

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

ReadOnlyMemory[] names = new ReadOnlyMemory[2]; [](start = 12, length = 59)

indent #Resolved

@TomFinley

TomFinley commented Aug 22, 2018

Copy link
Copy Markdown
Contributor

Hi @codemzs! Do note that our usual practice for "personal" code reviews is that they happen in a personal fork. That is, there is nothing preventing one from requesting a "pull request" into master in ones own fork, where one can review the changes in convenience as much as they like. Indeed this is our usual practice. #Resolved

var stratVals = foldCol >= 0 ? new[] { DvText.NA, DvText.NA } : new[] { DvText.NA };
//REVIEW: Not sure if empty string makes sense here.

var stratVals = foldCol >= 0 ? new[] { "".AsMemory(),"".AsMemory() } : new[] { "".AsMemory() };

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

Need to check on this.

@codemzscodemzs changed the title WIP DO NOT REVIEW - Replace DvText with .NET Standard type.WIP Replace DvText with .NET Standard type.Aug 23, 2018
@codemzscodemzs changed the title WIP Replace DvText with .NET Standard type.RIP Replace DvText with .NET Standard type.Aug 23, 2018
/// </summary>
public static string GetRawUnderlyingBufferInfo(out int ichMin, out int ichLim, ReadOnlyMemory<char> memory)
{
MemoryMarshal.TryGetString(memory, out string outerBuffer, out ichMin, out int length);

@TomFinleyTomFinleyAug 24, 2018

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

My attitude towards this is either we support ReadOnlyMemory<char> or we don't. If we do, then our methods on top of it should work, even if this fails. Fortunately it seems like this was only introduced because we wanted to just have a light "shim" on top of existing DvText methods, which is not really something we want to do. #Resolved

/// </summary>
public static bool Equals(ReadOnlyMemory<char> b, ReadOnlyMemory<char> memory)
{
if (memory.Length != b.Length)

@TomFinleyTomFinleyAug 24, 2018

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

This method and the one below could probably efficiently enough be done over direct indices over the ReadOnlyMemory<char> structure, at least, so I would hope. This would simplify the method considerably. #Resolved

}

/// <summary>
/// Does not propagate NA values. Returns true if both are NA (same as a.Equals(b)).

@TomFinleyTomFinleyAug 24, 2018

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

"Returns true if both are NA" suggests this is copy-pasted from somewhere, since of course now we will no longer have the notion of an NA string. This suggests an incomplete conversion, and is an opportunity for code simplification that we should do right now. #Resolved

/// Returns a text span with leading and trailing spaces trimmed. Note that this
/// will remove only spaces, not any form of whitespace.
/// </summary>
public static ReadOnlyMemory<char> Trim(ReadOnlyMemory<char> memory)

@TomFinleyTomFinleyAug 24, 2018

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

The two major motivations for moving from DvText to ROM<char> is that we get to avoid declaring our own special type for text, and also get to exploit the functionality that the .NET framework gives us. It seems like we did the first, and not the second: we have implementations of some things that appear to have relatively straightforward close implementations in System.MemoryExtensions. #Resolved

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

These extension methods are part of ReadOnlySpan and they return ROS as well which you cannot assign to ROM or create a ROM out of it and that effectively makes them useless for someone that is working with ROM. I'm starting a thread with the guys that wrote these methods to make sure I'm not missing anything.


In reply to: 212748423 [](ancestors = 212748423)

/// <summary>
/// This produces zero for an empty string.
/// </summary>
public static bool TryParse(out Single value, ReadOnlyMemory<char> memory)

@TomFinleyTomFinleyAug 24, 2018

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

So, now that .NET has it, is float.TryParse(ReadOnlyMemory<char>, ...) unusable? #Resolved

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

If it is, you can also get rid of DoubleParser.


In reply to: 212748642 [](ancestors = 212748642)

@codemzscodemzsSep 4, 2018

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

Very well. Unfortunately, these methods are only available in .netstandard 2.1, not in 2.0 and our product code targets 2.0. We cannot target 2.1 because then product code won't run on desktop framework anymore because these methods are not available there.

reference: https://docs.microsoft.com/en-us/dotnet/api/system.text.stringbuilder.append?view=netcore-2.1

https://docs.microsoft.com/en-us/dotnet/api/system.text.stringbuilder.append?view=netframework-4.7.2

It would have been really nice if they were though...


In reply to: 212759741 [](ancestors = 212759741,212748642)

@TomFinley

TomFinley commented Aug 24, 2018

Copy link
Copy Markdown
Contributor
 private bool TryParseCore(string text, int ich, int lim, out ulong dst)

Certainly ulong.TryParse(ReadOnlyMemory<char>, ...) exists now. So can we get rid of this? #Resolved


Refers to: src/Microsoft.ML.Data/Data/Conversion.cs:1265 in ef32b4a. [](commit_id = ef32b4a, deletion_comment = False)

@TomFinley

Copy link
Copy Markdown
Contributor
 private bool TryParseCore(string text, int ich, int lim, out ulong dst)

Same for all TryParse methods.


In reply to: 415887609 [](ancestors = 415887609)


Refers to: src/Microsoft.ML.Data/Data/Conversion.cs:1265 in ef32b4a. [](commit_id = ef32b4a, deletion_comment = False)

public static NormStr FindInPool(NormStr.Pool pool, ReadOnlyMemory<char> memory)
{
Contracts.CheckValue(pool, nameof(pool));
MemoryMarshal.TryGetString(memory, out string outerBuffer, out int ichMin, out int length);

@TomFinleyTomFinleyAug 24, 2018

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Same comment as before. You're either supporting ReadOnlyMemor<char> or you're not. Also of course as with every other usage of this function we are ignoring whether this succeeded or not. #Resolved

@TomFinley

Copy link
Copy Markdown
Contributor
 private bool TryParseCore(string text, int ich, int lim, out ulong dst)

You will of course have to handle mapping the empty string to 0, which things like double.TryParse and the like of course will not do, but that still represents a sizable improvement.


In reply to: 415887757 [](ancestors = 415887757,415887609)


Refers to: src/Microsoft.ML.Data/Data/Conversion.cs:1265 in ef32b4a. [](commit_id = ef32b4a, deletion_comment = False)

@codemzscodemzs changed the title RIP Replace DvText with .NET Standard type.Replace DvText with .NET Standard type.Aug 26, 2018
@codemzs

Copy link
Copy Markdown
MemberAuthor
 private bool TryParseCore(string text, int ich, int lim, out ulong dst)

Please see my previous reply on the other comment similar to this.


In reply to: 415892086 [](ancestors = 415892086,415887757,415887609)


Refers to: src/Microsoft.ML.Data/Data/Conversion.cs:1265 in ef32b4a. [](commit_id = ef32b4a, deletion_comment = False)

…to dvtext
# Conflicts:
#	src/Microsoft.ML.Data/DataLoadSave/Text/TextLoader.cs
#	src/Microsoft.ML.Data/Evaluators/EvaluatorUtils.cs
#	src/Microsoft.ML.Data/Transforms/TermTransform.cs
#	src/Microsoft.ML.Data/Transforms/TermTransformImpl.cs
#	src/Microsoft.ML.ImageAnalytics/ImageLoaderTransform.cs
#	test/Microsoft.ML.TestFramework/DataPipe/TestDataPipeBase.cs

[Column("1")]
public string Text;
public ReadOnlyMemory<char> Text;

@eerhardteerhardtSep 7, 2018

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.

We still support regular string types, right? I think that would be bad if we didn't. #Resolved


[Column("1")]
public float Number_1;
public ReadOnlyMemory<char> Number_1;

@eerhardteerhardtSep 7, 2018

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.

This seems wrong - it was float before, and the property is called Number_1. #Resolved

</ItemGroup>

<ItemGroup>
<PackageReference Include="System.Memory" Version="4.5.1" />

@eerhardteerhardtSep 7, 2018

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.

This shouldn't be necessary. All our test projects are netcoreapp2.1, and so Span and ReadOnlyMemory should be available by default. #Resolved

</ItemGroup>

<ItemGroup>
<PackageReference Include="System.Memory" Version="4.5.1" />

@eerhardteerhardtSep 7, 2018

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.

This shouldn't be necessary. All our test projects are netcoreapp2.1, and so Span and ReadOnlyMemory should be available by default. #Resolved

public float? fFloat;
public double? fDouble;
public bool? fBool;
public string fString;

@eerhardteerhardtSep 7, 2018

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 think we should still support string types, and as such, string can be null. So we should have some tests for null strings. #Resolved

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

What will null string map to? empty string?


In reply to: 215970412 [](ancestors = 215970412)

@codemzscodemzs closed this Sep 20, 2018
@codemzs
codemzs deleted the dvtext branch September 20, 2018 18:15
@codemzs

Copy link
Copy Markdown
MemberAuthor

This change was committed via #863

@ghostghost locked as resolved and limited conversation to collaborators Mar 29, 2022
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

.NET data type system instead of DvTypes

3 participants

@codemzs@TomFinley@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

Replace DvText with .NET Standard type. - #705

Closed
codemzs wants to merge 23 commits into
dotnet:masterfrom
codemzs:dvtext
Closed

Replace DvText with .NET Standard type.#705
codemzs wants to merge 23 commits into
dotnet:masterfrom
codemzs:dvtext

Conversation

@codemzs

@codemzscodemzs commented Aug 21, 2018

Copy link
Copy Markdown
Member

fixes#673

scan.Span = DvText.NA;
else if (_sb.Length == 0)
scan.Span = DvText.Empty;
if (scan.QuotingError || _sb.Length == 0)

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

scan.QuotingError [](start = 28, length = 17)

I wonder if throwing an exception is more appropriate here

labelNames = new VBuffer<DvText>(2, new[] { new DvText("positive"), new DvText("negative") });
DvText[] names = new DvText[2];
labelNames = new VBuffer<ReadOnlyMemory<char>>(2, new[] { "positive".AsMemory(), "negative".AsMemory() });
ReadOnlyMemory<char>[] names = new ReadOnlyMemory<char>[2];

@codemzscodemzsAug 22, 2018

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

ReadOnlyMemory[] names = new ReadOnlyMemory[2]; [](start = 12, length = 59)

indent #Resolved

@TomFinley

TomFinley commented Aug 22, 2018

Copy link
Copy Markdown
Contributor

Hi @codemzs! Do note that our usual practice for "personal" code reviews is that they happen in a personal fork. That is, there is nothing preventing one from requesting a "pull request" into master in ones own fork, where one can review the changes in convenience as much as they like. Indeed this is our usual practice. #Resolved

var stratVals = foldCol >= 0 ? new[] { DvText.NA, DvText.NA } : new[] { DvText.NA };
//REVIEW: Not sure if empty string makes sense here.

var stratVals = foldCol >= 0 ? new[] { "".AsMemory(),"".AsMemory() } : new[] { "".AsMemory() };

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

Need to check on this.

@codemzscodemzs changed the title WIP DO NOT REVIEW - Replace DvText with .NET Standard type.WIP Replace DvText with .NET Standard type.Aug 23, 2018
@codemzscodemzs changed the title WIP Replace DvText with .NET Standard type.RIP Replace DvText with .NET Standard type.Aug 23, 2018
/// </summary>
public static string GetRawUnderlyingBufferInfo(out int ichMin, out int ichLim, ReadOnlyMemory<char> memory)
{
MemoryMarshal.TryGetString(memory, out string outerBuffer, out ichMin, out int length);

@TomFinleyTomFinleyAug 24, 2018

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

My attitude towards this is either we support ReadOnlyMemory<char> or we don't. If we do, then our methods on top of it should work, even if this fails. Fortunately it seems like this was only introduced because we wanted to just have a light "shim" on top of existing DvText methods, which is not really something we want to do. #Resolved

/// </summary>
public static bool Equals(ReadOnlyMemory<char> b, ReadOnlyMemory<char> memory)
{
if (memory.Length != b.Length)

@TomFinleyTomFinleyAug 24, 2018

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

This method and the one below could probably efficiently enough be done over direct indices over the ReadOnlyMemory<char> structure, at least, so I would hope. This would simplify the method considerably. #Resolved

}

/// <summary>
/// Does not propagate NA values. Returns true if both are NA (same as a.Equals(b)).

@TomFinleyTomFinleyAug 24, 2018

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

"Returns true if both are NA" suggests this is copy-pasted from somewhere, since of course now we will no longer have the notion of an NA string. This suggests an incomplete conversion, and is an opportunity for code simplification that we should do right now. #Resolved

/// Returns a text span with leading and trailing spaces trimmed. Note that this
/// will remove only spaces, not any form of whitespace.
/// </summary>
public static ReadOnlyMemory<char> Trim(ReadOnlyMemory<char> memory)

@TomFinleyTomFinleyAug 24, 2018

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

The two major motivations for moving from DvText to ROM<char> is that we get to avoid declaring our own special type for text, and also get to exploit the functionality that the .NET framework gives us. It seems like we did the first, and not the second: we have implementations of some things that appear to have relatively straightforward close implementations in System.MemoryExtensions. #Resolved

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

These extension methods are part of ReadOnlySpan and they return ROS as well which you cannot assign to ROM or create a ROM out of it and that effectively makes them useless for someone that is working with ROM. I'm starting a thread with the guys that wrote these methods to make sure I'm not missing anything.


In reply to: 212748423 [](ancestors = 212748423)

/// <summary>
/// This produces zero for an empty string.
/// </summary>
public static bool TryParse(out Single value, ReadOnlyMemory<char> memory)

@TomFinleyTomFinleyAug 24, 2018

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

So, now that .NET has it, is float.TryParse(ReadOnlyMemory<char>, ...) unusable? #Resolved

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

If it is, you can also get rid of DoubleParser.


In reply to: 212748642 [](ancestors = 212748642)

@codemzscodemzsSep 4, 2018

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

Very well. Unfortunately, these methods are only available in .netstandard 2.1, not in 2.0 and our product code targets 2.0. We cannot target 2.1 because then product code won't run on desktop framework anymore because these methods are not available there.

reference: https://docs.microsoft.com/en-us/dotnet/api/system.text.stringbuilder.append?view=netcore-2.1

https://docs.microsoft.com/en-us/dotnet/api/system.text.stringbuilder.append?view=netframework-4.7.2

It would have been really nice if they were though...


In reply to: 212759741 [](ancestors = 212759741,212748642)

@TomFinley

TomFinley commented Aug 24, 2018

Copy link
Copy Markdown
Contributor
 private bool TryParseCore(string text, int ich, int lim, out ulong dst)

Certainly ulong.TryParse(ReadOnlyMemory<char>, ...) exists now. So can we get rid of this? #Resolved


Refers to: src/Microsoft.ML.Data/Data/Conversion.cs:1265 in ef32b4a. [](commit_id = ef32b4a, deletion_comment = False)

@TomFinley

Copy link
Copy Markdown
Contributor
 private bool TryParseCore(string text, int ich, int lim, out ulong dst)

Same for all TryParse methods.


In reply to: 415887609 [](ancestors = 415887609)


Refers to: src/Microsoft.ML.Data/Data/Conversion.cs:1265 in ef32b4a. [](commit_id = ef32b4a, deletion_comment = False)

public static NormStr FindInPool(NormStr.Pool pool, ReadOnlyMemory<char> memory)
{
Contracts.CheckValue(pool, nameof(pool));
MemoryMarshal.TryGetString(memory, out string outerBuffer, out int ichMin, out int length);

@TomFinleyTomFinleyAug 24, 2018

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Same comment as before. You're either supporting ReadOnlyMemor<char> or you're not. Also of course as with every other usage of this function we are ignoring whether this succeeded or not. #Resolved

@TomFinley

Copy link
Copy Markdown
Contributor
 private bool TryParseCore(string text, int ich, int lim, out ulong dst)

You will of course have to handle mapping the empty string to 0, which things like double.TryParse and the like of course will not do, but that still represents a sizable improvement.


In reply to: 415887757 [](ancestors = 415887757,415887609)


Refers to: src/Microsoft.ML.Data/Data/Conversion.cs:1265 in ef32b4a. [](commit_id = ef32b4a, deletion_comment = False)

@codemzscodemzs changed the title RIP Replace DvText with .NET Standard type.Replace DvText with .NET Standard type.Aug 26, 2018
@codemzs

Copy link
Copy Markdown
MemberAuthor
 private bool TryParseCore(string text, int ich, int lim, out ulong dst)

Please see my previous reply on the other comment similar to this.


In reply to: 415892086 [](ancestors = 415892086,415887757,415887609)


Refers to: src/Microsoft.ML.Data/Data/Conversion.cs:1265 in ef32b4a. [](commit_id = ef32b4a, deletion_comment = False)

…to dvtext
# Conflicts:
#	src/Microsoft.ML.Data/DataLoadSave/Text/TextLoader.cs
#	src/Microsoft.ML.Data/Evaluators/EvaluatorUtils.cs
#	src/Microsoft.ML.Data/Transforms/TermTransform.cs
#	src/Microsoft.ML.Data/Transforms/TermTransformImpl.cs
#	src/Microsoft.ML.ImageAnalytics/ImageLoaderTransform.cs
#	test/Microsoft.ML.TestFramework/DataPipe/TestDataPipeBase.cs

[Column("1")]
public string Text;
public ReadOnlyMemory<char> Text;

@eerhardteerhardtSep 7, 2018

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.

We still support regular string types, right? I think that would be bad if we didn't. #Resolved


[Column("1")]
public float Number_1;
public ReadOnlyMemory<char> Number_1;

@eerhardteerhardtSep 7, 2018

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.

This seems wrong - it was float before, and the property is called Number_1. #Resolved

</ItemGroup>

<ItemGroup>
<PackageReference Include="System.Memory" Version="4.5.1" />

@eerhardteerhardtSep 7, 2018

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.

This shouldn't be necessary. All our test projects are netcoreapp2.1, and so Span and ReadOnlyMemory should be available by default. #Resolved

</ItemGroup>

<ItemGroup>
<PackageReference Include="System.Memory" Version="4.5.1" />

@eerhardteerhardtSep 7, 2018

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.

This shouldn't be necessary. All our test projects are netcoreapp2.1, and so Span and ReadOnlyMemory should be available by default. #Resolved

public float? fFloat;
public double? fDouble;
public bool? fBool;
public string fString;

@eerhardteerhardtSep 7, 2018

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 think we should still support string types, and as such, string can be null. So we should have some tests for null strings. #Resolved

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

What will null string map to? empty string?


In reply to: 215970412 [](ancestors = 215970412)

@codemzscodemzs closed this Sep 20, 2018
@codemzs
codemzs deleted the dvtext branch September 20, 2018 18:15
@codemzs

Copy link
Copy Markdown
MemberAuthor

This change was committed via #863

@ghostghost locked as resolved and limited conversation to collaborators Mar 29, 2022
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

.NET data type system instead of DvTypes

3 participants

@codemzs@TomFinley@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

Replace DvText with .NET Standard type. - #705

Closed
codemzs wants to merge 23 commits into
dotnet:masterfrom
codemzs:dvtext
Closed

Replace DvText with .NET Standard type.#705
codemzs wants to merge 23 commits into
dotnet:masterfrom
codemzs:dvtext

Conversation

@codemzs

@codemzscodemzs commented Aug 21, 2018

Copy link
Copy Markdown
Member

fixes#673

scan.Span = DvText.NA;
else if (_sb.Length == 0)
scan.Span = DvText.Empty;
if (scan.QuotingError || _sb.Length == 0)

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

scan.QuotingError [](start = 28, length = 17)

I wonder if throwing an exception is more appropriate here

labelNames = new VBuffer<DvText>(2, new[] { new DvText("positive"), new DvText("negative") });
DvText[] names = new DvText[2];
labelNames = new VBuffer<ReadOnlyMemory<char>>(2, new[] { "positive".AsMemory(), "negative".AsMemory() });
ReadOnlyMemory<char>[] names = new ReadOnlyMemory<char>[2];

@codemzscodemzsAug 22, 2018

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

ReadOnlyMemory[] names = new ReadOnlyMemory[2]; [](start = 12, length = 59)

indent #Resolved

@TomFinley

TomFinley commented Aug 22, 2018

Copy link
Copy Markdown
Contributor

Hi @codemzs! Do note that our usual practice for "personal" code reviews is that they happen in a personal fork. That is, there is nothing preventing one from requesting a "pull request" into master in ones own fork, where one can review the changes in convenience as much as they like. Indeed this is our usual practice. #Resolved

var stratVals = foldCol >= 0 ? new[] { DvText.NA, DvText.NA } : new[] { DvText.NA };
//REVIEW: Not sure if empty string makes sense here.

var stratVals = foldCol >= 0 ? new[] { "".AsMemory(),"".AsMemory() } : new[] { "".AsMemory() };

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

Need to check on this.

@codemzscodemzs changed the title WIP DO NOT REVIEW - Replace DvText with .NET Standard type.WIP Replace DvText with .NET Standard type.Aug 23, 2018
@codemzscodemzs changed the title WIP Replace DvText with .NET Standard type.RIP Replace DvText with .NET Standard type.Aug 23, 2018
/// </summary>
public static string GetRawUnderlyingBufferInfo(out int ichMin, out int ichLim, ReadOnlyMemory<char> memory)
{
MemoryMarshal.TryGetString(memory, out string outerBuffer, out ichMin, out int length);

@TomFinleyTomFinleyAug 24, 2018

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

My attitude towards this is either we support ReadOnlyMemory<char> or we don't. If we do, then our methods on top of it should work, even if this fails. Fortunately it seems like this was only introduced because we wanted to just have a light "shim" on top of existing DvText methods, which is not really something we want to do. #Resolved

/// </summary>
public static bool Equals(ReadOnlyMemory<char> b, ReadOnlyMemory<char> memory)
{
if (memory.Length != b.Length)

@TomFinleyTomFinleyAug 24, 2018

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

This method and the one below could probably efficiently enough be done over direct indices over the ReadOnlyMemory<char> structure, at least, so I would hope. This would simplify the method considerably. #Resolved

}

/// <summary>
/// Does not propagate NA values. Returns true if both are NA (same as a.Equals(b)).

@TomFinleyTomFinleyAug 24, 2018

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

"Returns true if both are NA" suggests this is copy-pasted from somewhere, since of course now we will no longer have the notion of an NA string. This suggests an incomplete conversion, and is an opportunity for code simplification that we should do right now. #Resolved

/// Returns a text span with leading and trailing spaces trimmed. Note that this
/// will remove only spaces, not any form of whitespace.
/// </summary>
public static ReadOnlyMemory<char> Trim(ReadOnlyMemory<char> memory)

@TomFinleyTomFinleyAug 24, 2018

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

The two major motivations for moving from DvText to ROM<char> is that we get to avoid declaring our own special type for text, and also get to exploit the functionality that the .NET framework gives us. It seems like we did the first, and not the second: we have implementations of some things that appear to have relatively straightforward close implementations in System.MemoryExtensions. #Resolved

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

These extension methods are part of ReadOnlySpan and they return ROS as well which you cannot assign to ROM or create a ROM out of it and that effectively makes them useless for someone that is working with ROM. I'm starting a thread with the guys that wrote these methods to make sure I'm not missing anything.


In reply to: 212748423 [](ancestors = 212748423)

/// <summary>
/// This produces zero for an empty string.
/// </summary>
public static bool TryParse(out Single value, ReadOnlyMemory<char> memory)

@TomFinleyTomFinleyAug 24, 2018

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

So, now that .NET has it, is float.TryParse(ReadOnlyMemory<char>, ...) unusable? #Resolved

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

If it is, you can also get rid of DoubleParser.


In reply to: 212748642 [](ancestors = 212748642)

@codemzscodemzsSep 4, 2018

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

Very well. Unfortunately, these methods are only available in .netstandard 2.1, not in 2.0 and our product code targets 2.0. We cannot target 2.1 because then product code won't run on desktop framework anymore because these methods are not available there.

reference: https://docs.microsoft.com/en-us/dotnet/api/system.text.stringbuilder.append?view=netcore-2.1

https://docs.microsoft.com/en-us/dotnet/api/system.text.stringbuilder.append?view=netframework-4.7.2

It would have been really nice if they were though...


In reply to: 212759741 [](ancestors = 212759741,212748642)

@TomFinley

TomFinley commented Aug 24, 2018

Copy link
Copy Markdown
Contributor
 private bool TryParseCore(string text, int ich, int lim, out ulong dst)

Certainly ulong.TryParse(ReadOnlyMemory<char>, ...) exists now. So can we get rid of this? #Resolved


Refers to: src/Microsoft.ML.Data/Data/Conversion.cs:1265 in ef32b4a. [](commit_id = ef32b4a, deletion_comment = False)

@TomFinley

Copy link
Copy Markdown
Contributor
 private bool TryParseCore(string text, int ich, int lim, out ulong dst)

Same for all TryParse methods.


In reply to: 415887609 [](ancestors = 415887609)


Refers to: src/Microsoft.ML.Data/Data/Conversion.cs:1265 in ef32b4a. [](commit_id = ef32b4a, deletion_comment = False)

public static NormStr FindInPool(NormStr.Pool pool, ReadOnlyMemory<char> memory)
{
Contracts.CheckValue(pool, nameof(pool));
MemoryMarshal.TryGetString(memory, out string outerBuffer, out int ichMin, out int length);

@TomFinleyTomFinleyAug 24, 2018

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Same comment as before. You're either supporting ReadOnlyMemor<char> or you're not. Also of course as with every other usage of this function we are ignoring whether this succeeded or not. #Resolved

@TomFinley

Copy link
Copy Markdown
Contributor
 private bool TryParseCore(string text, int ich, int lim, out ulong dst)

You will of course have to handle mapping the empty string to 0, which things like double.TryParse and the like of course will not do, but that still represents a sizable improvement.


In reply to: 415887757 [](ancestors = 415887757,415887609)


Refers to: src/Microsoft.ML.Data/Data/Conversion.cs:1265 in ef32b4a. [](commit_id = ef32b4a, deletion_comment = False)

@codemzscodemzs changed the title RIP Replace DvText with .NET Standard type.Replace DvText with .NET Standard type.Aug 26, 2018
@codemzs

Copy link
Copy Markdown
MemberAuthor
 private bool TryParseCore(string text, int ich, int lim, out ulong dst)

Please see my previous reply on the other comment similar to this.


In reply to: 415892086 [](ancestors = 415892086,415887757,415887609)


Refers to: src/Microsoft.ML.Data/Data/Conversion.cs:1265 in ef32b4a. [](commit_id = ef32b4a, deletion_comment = False)

…to dvtext
# Conflicts:
#	src/Microsoft.ML.Data/DataLoadSave/Text/TextLoader.cs
#	src/Microsoft.ML.Data/Evaluators/EvaluatorUtils.cs
#	src/Microsoft.ML.Data/Transforms/TermTransform.cs
#	src/Microsoft.ML.Data/Transforms/TermTransformImpl.cs
#	src/Microsoft.ML.ImageAnalytics/ImageLoaderTransform.cs
#	test/Microsoft.ML.TestFramework/DataPipe/TestDataPipeBase.cs

[Column("1")]
public string Text;
public ReadOnlyMemory<char> Text;

@eerhardteerhardtSep 7, 2018

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.

We still support regular string types, right? I think that would be bad if we didn't. #Resolved


[Column("1")]
public float Number_1;
public ReadOnlyMemory<char> Number_1;

@eerhardteerhardtSep 7, 2018

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.

This seems wrong - it was float before, and the property is called Number_1. #Resolved

</ItemGroup>

<ItemGroup>
<PackageReference Include="System.Memory" Version="4.5.1" />

@eerhardteerhardtSep 7, 2018

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.

This shouldn't be necessary. All our test projects are netcoreapp2.1, and so Span and ReadOnlyMemory should be available by default. #Resolved

</ItemGroup>

<ItemGroup>
<PackageReference Include="System.Memory" Version="4.5.1" />

@eerhardteerhardtSep 7, 2018

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.

This shouldn't be necessary. All our test projects are netcoreapp2.1, and so Span and ReadOnlyMemory should be available by default. #Resolved

public float? fFloat;
public double? fDouble;
public bool? fBool;
public string fString;

@eerhardteerhardtSep 7, 2018

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 think we should still support string types, and as such, string can be null. So we should have some tests for null strings. #Resolved

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

What will null string map to? empty string?


In reply to: 215970412 [](ancestors = 215970412)

@codemzscodemzs closed this Sep 20, 2018
@codemzs
codemzs deleted the dvtext branch September 20, 2018 18:15
@codemzs

Copy link
Copy Markdown
MemberAuthor

This change was committed via #863

@ghostghost locked as resolved and limited conversation to collaborators Mar 29, 2022
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

.NET data type system instead of DvTypes

3 participants

@codemzs@TomFinley@eerhardt