Hi Steve,

On 1/15/2019 8:51 AM, Steven A. Falco wrote:
> I'll look at that.  The worst burst of backspaces is about 7 characters long, 
> so I could accumulate 14 chars or so before making a decision.  In other 
> words, run a circular buffer, and when I see the first non-backspace after a 
> string of backspaces, then process the buffer.
> 
> But I'm starting to think that the better approach is to drop this patch from 
> the official tree, and just put my original patch into Fedora-only, as a 
> temporary patch, to be removed when the library issue is corrected.

This may be the way to go as this is only temporary until the ng-spice
library is fixed.  I'm assuming this issue is specific to Fedora.  If
not, we can re-evaluate it at the time that it is broken on another
platform.

Cheers,

Wayne

> 
> But I'll still play around with your idea to see how it looks once I get it 
> working. :-)
> 
>       Steve
> 
> On 1/15/19 12:08 AM, Andrew Lutsenko wrote:
>> Hi Steven,
>>
>> Your code is slow because you are using O(n^2) algorithm (look up big O 
>> notation if you don't know what that means, tldr is that for 1mb string it 
>> will take on the order of 10^12 operations to process in the worst case 
>> where there are lots of '\b' characters).
>> Instead of iteratively deleting all backspace characters in the string 
>> better approach is to gather all characters you want to keep in a buffer.
>> For example (I haven't compiled this but should be close enough):
>>
>> wxString buf;
>> int c1, c2; // note the int type, it's important because wxStrings are 
>> unicode
>> for(int i = 0; i + 1 < t.length(); i++) {
>>   c1 = t[i];
>>   c2 = t[i + 1]; 
>>   if (c1 != '\b' && c2 != '\b')
>>     buf.Append(wxUniChar(c1)); // Add current character unless it's 
>> backspace or next one is backspace
>> }
>> if (t.length() > 0 && c2 != '\b') // Add last character unless it's backspace
>>   buf.Append(wxUniChar(c2));
>> m_simConsole->AppendText( buf + "\n" );
>>
>> This is O(n) as apposed to O(n^2) so it will be blink of an eye to process 
>> 1mb. If it is still slow than it's because operator[] on wxString is not 
>> constant time. In that case convert it to std::wstring first, which is 
>> guaranteed to have constant time random access in c++11.
>>
>> Regards,
>> Andrew
>>
>> On Mon, Jan 14, 2019 at 5:58 PM Steven A. Falco <[email protected] 
>> <mailto:[email protected]>> wrote:
>>
>>     Thanks, Wayne.  I'll read through that.
>>
>>     As an experiment, I tried the code below, but it turns out to be far too 
>> slow to be usable.  What I've discovered is that all the "percent complete" 
>> status comes in as a single one+ megabyte string, so removing backspaces and 
>> the preceding characters one pair at a time is not workable.  Maybe there is 
>> a faster algorithm, but I'm not knowledgeable enough in C++ to write it.
>>
>>     What I can say is that any event with a newline seems to come in 
>> separately, so there is no risk to losing valid output, as far as I can see. 
>>  Here is a screenshot: 
>> https://www.dropbox.com/s/gc21pjyujo4ao3c/Screenshot_20190114_183910.png?dl=0
>>  where I print out the length of the string, then the string itself.  As you 
>> can see, each line is short, up until the megabyte line comes in.  You can 
>> see the length going down by 2 each time I remove a character-backspace pair.
>>
>>     I don't know where this leaves us.  Someone could try to come up with an 
>> efficient way to filter out the backspaces, or we could go with my original 
>> approach, cleaned up to conform to the coding conventions.  Please advise.
>>
>>             Steve
>>
>>     void SIM_PLOT_FRAME::onSimReport( wxCommandEvent& aEvent )
>>     {
>>         wxString t = aEvent.GetString();
>>         size_t position;
>>
>>         while( ( position = t.find( "\b" ) ) != wxString::npos )
>>         {
>>             if( position >= 1 )
>>             {
>>                     t = t.Mid(0, position - 1) + t.Mid(position + 1);
>>             }
>>             else
>>             {
>>                     t = t.Mid(0, position) +  t.Mid(position + 1);
>>             }
>>         }
>>
>>         m_simConsole->AppendText( aEvent.GetString() + "\n" );
>>         m_simConsole->SetInsertionPointEnd();
>>     }
>>
>>     On 1/14/19 6:21 PM, Wayne Stambaugh wrote:
>>     > On 1/14/19 1:06 PM, Steven A. Falco wrote:
>>     >> The issue was discussed here:
>>     >>
>>     >> 
>> https://forum.kicad.info/t/trying-to-get-ngspice-working-on-fedora/14628
>>     >>
>>     >> If you tell me what my "coding policy errors" are, or point me to 
>> something I should read, then I can do better next time.
>>     >
>>     > 
>> http://docs.kicad-pcb.org/doxygen/md_Documentation_development_coding-style-policy.html
>>     >
>>     >>
>>     >> I've attached a new copy of the patch - the code change is identical, 
>> the only difference is that it has the commit message prepended.
>>     >>
>>     >>      Steve
>>     >>
>>     >> On 1/14/19 12:50 PM, Wayne Stambaugh wrote:
>>     >>> Steve,
>>     >>>
>>     >>> Please include the bug report link so I can link the patch to the bug
>>     >>> report.  I'll fix the coding policy errors since I'm assuming this 
>> is as
>>     >>> one a done patch for you.
>>     >>>
>>     >>> Tom or Orson,
>>     >>>
>>     >>> Any objections to this patch.  I didn't test it but on the surface it
>>     >>> appears to resolve the issue.
>>     >>>
>>     >>> Cheers,
>>     >>>
>>     >>> Wayne
>>     >>>
>>     >>> On 1/14/2019 10:30 AM, Steven A. Falco wrote:
>>     >>>> I wanted to close the loop on the SIGTRAP crash that I reported a 
>> few days ago.
>>     >>>>
>>     >>>> The issue is probably unique to Fedora, and stems from a huge 
>> quantity of "percent complete" messages that the ngspice library passes back 
>> to KiCad.  I'm not kidding when I say huge - it amounts to over 1 megabyte 
>> of text, including many backspace characters.  When I try to select the 
>> text, it probably blows up the clipboard and causes the crash.
>>     >>>>
>>     >>>> The ideal fix will be to have the Fedora ngspice maintainer remove 
>> a flag, which in turn will disable the "percent complete" messages.
>>     >>>>
>>     >>>> In the interim, I have a patch that filters out any line containing 
>> a string of backspaces.  I don't know if there is any interest in applying 
>> this patch to the official KiCad sources, but I've attached it here in case 
>> there is interest.  I see it as defensive programming. :-)
>>     >>>>
>>     >>>> I'll wait a bit to see what happens with the ngspice library.  If 
>> it looks like there will be a substantial delay in having the flag removed, 
>> I can always apply my patch and push that as the next official Fedora build.
>>     >>>>
>>     >>>>    Steve
>>     >>>>
>>     >>>> On 1/11/19 2:25 PM, Steven A. Falco wrote:
>>     >>>>> On 1/11/19 1:51 PM, Steven A. Falco wrote:
>>     >>>>>> On 1/11/19 1:21 PM, Seth Hillbrand wrote:
>>     >>>>>>> Am 2019-01-11 12:18, schrieb Steven A. Falco:
>>     >>>>>>>> I tried another ngspice experiment.  I ran a simulation, and it
>>     >>>>>>>> worked, albeit with the data size warning I asked about 
>> earlier.  So
>>     >>>>>>>> far so good.
>>     >>>>>>>
>>     >>>>>>> That warning was saying that it ran out of memory and had 
>> overwritten unplanned space.  I would expect a crash after that.  I'm not 
>> sure that KiCad can trap that kind of error as it occurred inside the 
>> library.
>>     >>>>>>
>>     >>>>>> Ok, but I'm concerned about the bug reports I'll get if I were to 
>> enable ngspice and push the build to the Fedora community.
>>     >>>>>>
>>     >>>>>> I'll wait to see if the forum has any thoughts on the warning.  
>> I'll only enable ngspice in the official Fedora builds if I can get to where 
>> the examples run cleanly.
>>     >>>>>
>>     >>>>> I saved the netlist from the simple example I've been running:
>>     >>>>>
>>     >>>>> .title KiCad schematic
>>     >>>>> V101 in 0 PULSE (0 5 1u 1u 1u 1 1)
>>     >>>>> C101 Net-_C101-Pad1_ 0 1u
>>     >>>>> C102 out 0 100n
>>     >>>>> R101 Net-_C101-Pad1_ in 10k
>>     >>>>> R102 out Net-_C101-Pad1_ 1k
>>     >>>>> .save @v101[i]
>>     >>>>> .save @c101[i]
>>     >>>>> .save @c102[i]
>>     >>>>> .save @r101[i]
>>     >>>>> .save @r102[i]
>>     >>>>> .save V(0)
>>     >>>>> .save V(GND)
>>     >>>>> .save V(Net-_C101-Pad1_)
>>     >>>>> .save V(in)
>>     >>>>> .save V(out)
>>     >>>>> .tran 1u 100m
>>     >>>>> .end
>>     >>>>>
>>     >>>>> When I run this circuit in stand-alone ngspice, it does a lot of 
>> overprinting, apparently to indicate the run-time of the job.  Here is a 
>> small example of the character stream, where there are tons of backspaces as 
>> part of the overprinting:
>>     >>>>>
>>     >>>>> saf$ od -c foo
>>     >>>>> 0000000   %   0   .   0   0  \b  \b  \b  \b  \b   %   0   .   0   
>> 0  \b
>>     >>>>> 0000020  \b  \b  \b  \b   %   0   .   0   0  \b  \b  \b  \b  \b   
>> %   0
>>     >>>>> 0000040   .   0   0  \b  \b  \b  \n
>>     >>>>> 0000047
>>     >>>>>
>>     >>>>> The stand-alone captured output from this simple circuit is around 
>> 1 Mbyte!  I'm guessing that this huge amount of data is blowing up the 
>> window and showing all of the strange characters.
>>     >>>>>
>>     >>>>> I'm not sure of the division of labor here.  Is that something 
>> that a KiCad developer should address, or is it a library issue?  Hopefully 
>> there is a flag that can be passed to the library to suppress the 
>> overprinted text.
>>     >>>>>
>>     >>>>>   Steve
>>     >>>>>
>>     >>>>
>>     >>>>
>>     >>>> _______________________________________________
>>     >>>> Mailing list: https://launchpad.net/~kicad-developers
>>     >>>> Post to     : [email protected] 
>> <mailto:[email protected]>
>>     >>>> Unsubscribe : https://launchpad.net/~kicad-developers
>>     >>>> More help   : https://help.launchpad.net/ListHelp
>>     >>>>
>>     >>>
>>     >>> _______________________________________________
>>     >>> Mailing list: https://launchpad.net/~kicad-developers
>>     >>> Post to     : [email protected] 
>> <mailto:[email protected]>
>>     >>> Unsubscribe : https://launchpad.net/~kicad-developers
>>     >>> More help   : https://help.launchpad.net/ListHelp
>>     >>>
>>     >>
>>     >
>>
>>
>>     _______________________________________________
>>     Mailing list: https://launchpad.net/~kicad-developers
>>     Post to     : [email protected] 
>> <mailto:[email protected]>
>>     Unsubscribe : https://launchpad.net/~kicad-developers
>>     More help   : https://help.launchpad.net/ListHelp
>>
> 

_______________________________________________
Mailing list: https://launchpad.net/~kicad-developers
Post to     : [email protected]
Unsubscribe : https://launchpad.net/~kicad-developers
More help   : https://help.launchpad.net/ListHelp

Reply via email to