Re: Improving dot product for standard multidimensional D arrays

2020-03-03 Thread maarten van damme via Digitalmars-d-learn
it is difficult to write an efficient matrix matrix multiplication in any
language. If you want a fair comparison, implement your naive method in
python and compare those timings.

Op di 3 mrt. 2020 om 04:20 schreef 9il via Digitalmars-d-learn <
digitalmars-d-learn@puremagic.com>:

> On Sunday, 1 March 2020 at 20:58:42 UTC, p.shkadzko wrote:
> > Hello again,
> >
> > Thanks to previous thread on multidimensional arrays, I managed
> > to play around with pure D matrix representations and even
> > benchmark a little against numpy:
> >
> > [...]
>
> Matrix multiplication is about cache-friendly blocking.
> https://www.cs.utexas.edu/users/pingali/CS378/2008sp/papers/gotoPaper.pdf
>
> `mir-blas` package can be used for matrix operations for ndslice.
>   `cblas`  - if you want to work with your own matrix type .
>


Re: D is Multiplatform[DUVIDA]

2017-09-08 Thread maarten van damme via Digitalmars-d-learn
It's a compiled language, it'll behave like c++.

2017-09-08 7:13 GMT+02:00 dark777 via Digitalmars-d-learn <
digitalmars-d-learn@puremagic.com>:

> On Friday, 8 September 2017 at 03:56:25 UTC, rikki cattermole wrote:
>
>> On 08/09/2017 3:08 AM, dark777 wrote:
>>
>>> On Friday, 8 September 2017 at 00:09:08 UTC, solidstate1991 wrote:
>>>
 On Thursday, 7 September 2017 at 23:58:05 UTC, dark777 wrote:

> Good night, did you want to know this? Is the DE language
> cross-platform or cross-compile like C ++?
>

 GDC and LDC has multi-platform support, I'm currently working on an ARM
 backend for DMD.

>>>
>>> so does it mean that if I develop a program using the D language in BSD
>>> creating generic resources for example and compiling on windows, linux and
>>> darwin it would work fine?
>>>
>>
>> Each platform has its own unique behavior and related code.
>> Gotta try it to know for certain.
>>
>> But that is unrelated to D in the most part :)
>>
>
> but in any case then the D language can be considered multiplatform?
>


Re: very odd directx 11 error

2017-08-24 Thread maarten van damme via Digitalmars-d-learn
zeroMemory(&scd, scd.sizeof);

void zeroMemory(void* ad,size_t size){
(cast(byte*)& ad)[0 .. size] = 0;
}


I was totally corrupting my stack and it's not even needed in D, the
compiler zero's it out automatically.
Mystery solved, thanks a lot irc (adam,wolfgang,...)


2017-08-24 17:26 GMT+02:00 maarten van damme :

> I should probably add that the error is a hresult, being 0 when it works
> but -2005270527 when it fails.
>
> 2017-08-24 17:24 GMT+02:00 maarten van damme :
>
>> Hi all.
>>
>> This works (dub --arch=x86_mscoff) http://dpaste.com/1XCJEX7 but this
>> fails : http://dpaste.com/1C7WMB7 .
>>
>> Notice that all I've done is manually inlined init3d...
>>
>> You can compile this with the following dub.json
>>
>> http://dpaste.com/2QBQFSX
>>
>> Any help would be appreciated, it make absolutely no sense to me.
>>
>
>


Re: very odd directx 11 error

2017-08-24 Thread maarten van damme via Digitalmars-d-learn
I should probably add that the error is a hresult, being 0 when it works
but -2005270527 when it fails.

2017-08-24 17:24 GMT+02:00 maarten van damme :

> Hi all.
>
> This works (dub --arch=x86_mscoff) http://dpaste.com/1XCJEX7 but this
> fails : http://dpaste.com/1C7WMB7 .
>
> Notice that all I've done is manually inlined init3d...
>
> You can compile this with the following dub.json
>
> http://dpaste.com/2QBQFSX
>
> Any help would be appreciated, it make absolutely no sense to me.
>


very odd directx 11 error

2017-08-24 Thread maarten van damme via Digitalmars-d-learn
Hi all.

This works (dub --arch=x86_mscoff) http://dpaste.com/1XCJEX7 but this fails
: http://dpaste.com/1C7WMB7 .

Notice that all I've done is manually inlined init3d...

You can compile this with the following dub.json

http://dpaste.com/2QBQFSX

Any help would be appreciated, it make absolutely no sense to me.


Re: How to get uniq to return an array?

2017-07-04 Thread maarten van damme via Digitalmars-d-learn
have you tried std.range's .array?

2017-07-04 13:00 GMT+02:00 PumpkinCake via Digitalmars-d-learn <
digitalmars-d-learn@puremagic.com>:

> I'm trying to strip repeated values out of an int array using uniq. It's
> returning a UniqResult which can't be accessed like an array... how can I
> get it to return an array, or cast whatever it is returning to be an array?
>


Re: Neural Networks / ML Libraries for D

2016-10-25 Thread maarten van damme via Digitalmars-d-learn
There is mir https://github.com/libmir/mir which is geared towards machine
learning, I don't know if it has anything about neural networks, I've yet
to use it. If you're only interested in neural networks, I've used FANN (a
C library) together with D and it worked very well.

2016-10-25 13:17 GMT+02:00 Saurabh Das via Digitalmars-d-learn <
digitalmars-d-learn@puremagic.com>:

> Hello,
>
> Are there any good ML libraries for D? In particular, looking for a neural
> network library currently. Any leads would be appreciated.
>
> Thanks,
> Saurabh
>
>


Re: store template value

2015-08-02 Thread maarten van damme via Digitalmars-d-learn
Oh, neat. This saves the day :)

2015-08-01 23:22 GMT+02:00 Ali Çehreli :

> On 08/01/2015 08:37 AM, maarten van damme via Digitalmars-d-learn wrote:
>
>> I have a class that creates a task in it's constructor. How do I store
>> this
>> created task as one of it's value members and later on call .yieldForce()?
>>
>>
> Tasks can be created with a function pointer 'function parameter' as well.
> (This has already been added to "Programming in D" but it is not available
> on the web site yet.)
>
> I learned the exact type by the help of pragma(msg) below and used it to
> create MyTask and myTasks:
>
> import std.parallelism;
>
> double foo(int i)
> {
> return i * 1.5;
> }
>
> double bar(int i)
> {
> return i * 2.5;
> }
>
> void main()
> {
> auto tasks = [ task(&foo, 1),
>task(&bar, 2) ];// ← compiles
>
> pragma(msg, typeof(tasks[0]));
>
> alias MyTask = Task!(run, double function(int), int)*;
>
> MyTask[] myTasks;
> myTasks ~= task(&foo, 1);
> myTasks ~= task(&bar, 2);
> }
>
> Ali
>
>


Re: store template value

2015-08-01 Thread maarten van damme via Digitalmars-d-learn
But it's std.parallelism's task...
And how can I use get!T if I don't know the type of the task?

2015-08-01 19:02 GMT+02:00 Adam D. Ruppe via Digitalmars-d-learn <
digitalmars-d-learn@puremagic.com>:

> On Saturday, 1 August 2015 at 16:41:54 UTC, maarten van damme wrote:
>
>> I was afraid I would have to do that. Templatizing the class on the value
>> doesn't work as I later on want to create a hashmap of these classes. When
>> I assign a task to a variant, how do I call .yieldForce later on?
>>
>
>
> You can get a type from a Variant with the get!T method then call it.
>
> But actually, maybe Task should just be an interface with the yieldForce
> method then you create classes that implement it and pass them to the
> constructor. Then there's no need for templates or casting at all.
>


Re: store template value

2015-08-01 Thread maarten van damme via Digitalmars-d-learn
I was afraid I would have to do that. Templatizing the class on the value
doesn't work as I later on want to create a hashmap of these classes.
When I assign a task to a variant, how do I call .yieldForce later on?

2015-08-01 18:28 GMT+02:00 Adam D. Ruppe via Digitalmars-d-learn <
digitalmars-d-learn@puremagic.com>:

> On Saturday, 1 August 2015 at 15:37:46 UTC, maarten van damme wrote:
>
>> I have a class that creates a task in it's constructor. How do I store
>> this created task as one of it's value members and later on call
>> .yieldForce()?
>>
>
> If the class itself isn't templated on the type, you'll want to use
> something like std.variant.Variant to store it.
>


store template value

2015-08-01 Thread maarten van damme via Digitalmars-d-learn
I have a class that creates a task in it's constructor. How do I store this
created task as one of it's value members and later on call .yieldForce()?


Re: How to use core.thread.Thread

2015-07-16 Thread maarten van damme via Digitalmars-d-learn
You can certainly use thread but in most use cases, concurrency or
parallelism will accomplish the same in a much saner/safer way. (they're
wrappers around core.thread anyway).
Don't know of any tutorials about core.thread, about the other two you can
find help here : http://ddili.org/ders/d.en/

2015-07-16 11:24 GMT+02:00 aki via Digitalmars-d-learn <
digitalmars-d-learn@puremagic.com>:

> On Thursday, 16 July 2015 at 08:21:26 UTC, maarten van damme wrote:
>
>> Have you checked out std.parallelism and std.concurrency?
>>
>
> I know std.concurrency to use spawn. If I cannot use Thread,
> I'll implement by spawn. But want to try Thread class because
> it seems similar to Java's Thread class.
> I don't know std.parallelism. It seems for the different case.
>
> Aki.
>
>


Re: How to use core.thread.Thread

2015-07-16 Thread maarten van damme via Digitalmars-d-learn
Have you checked out std.parallelism and std.concurrency?

2015-07-16 9:57 GMT+02:00 aki via Digitalmars-d-learn <
digitalmars-d-learn@puremagic.com>:

> I can't resolve the compile errors:
>
> import core.thread;
> class DerivedThread : Thread {
> int count = 0;
> this() {
> super(&run);
> }
> private void run() {
> inc();  //testThread.d(8): Error: shared method
> testThread.DerivedThread.inc is not callable using a non-shared object
> }
> synchronized void inc() {
> ++count;//testThread.d(11): Deprecation:
> read-modify-write operations are not allowed for shared variables. Use
> core.atomic.atomicOp!"+="(this.count, 1) instead.
> }
> }
> void main() {
> auto thr = new DerivedThread();
> thr.start();
> thr.inc();  //testThread.d(17): Error: shared method
> testThread.DerivedThread.inc is not callable using a non-shared object
> thr.join();
> }
>
>
> 1. Should I declare thr as shared? But
> auto thr = new shared DerivedThread();
> does not resolve it.
>
> 2. Why "++count" cause an error? I think it is safe because
> it is marked as synchronized. If it is forced to use atomicOp
> all the time, it's painful.
>
> 3. Are there any tutorials about using Thread class?
>
> Aki.
>
>


Re: Beginner ?. Why does D suggest to learn java

2014-10-16 Thread maarten van damme via Digitalmars-d-learn
While d can be complex, there's nothing preventing you from starting out
simple and not using all features at first.
I don't understand why it's not suitable for a beginner if you use this
approach...

2014-10-17 6:51 GMT+02:00 via Digitalmars-d-learn <
digitalmars-d-learn@puremagic.com>:

> On Friday, 17 October 2014 at 01:14:34 UTC, bearophile wrote:
>
>> Python is probably a better first language than Java. D is a
>> little too much complex as first language.
>>
>
> The IDE support is probably a bit better with Java/C# and using a
> statically typed language as your first language has advantages, but all
> are good first languages: easy to find tutorials, easy to find educational
> example code, easy to find answers to typical beginner issues on
> Stackoverflow…
>
> I personally think Logo, Processing and Scheme would be more fun as
> learning tools, but they are throw-away languages. E.g.
> http://turtleacademy.com/programs/en http://www.processing.org/ and many
> more online programming sites.
>
>
>


Re: D with no druntime

2014-08-21 Thread maarten van damme via Digitalmars-d-learn
There were 2 talks about bare metal D this year at the D conference.

The first one is about someone able to use D on microcontrollers with a few
k ram.:
https://www.youtube.com/watch?v=o5m0m_ZG9e8

The second one is about someone trying to strip almost everything out and
see what works:
https://www.youtube.com/watch?v=qErXPomAWYI

They both go through the process of striping down the runtime and showing
what works.


2014-08-21 7:13 GMT+02:00 uri via Digitalmars-d-learn <
digitalmars-d-learn@puremagic.com>:

> Hi All,
>
> I am playing with a small hack OS for fun and in 2066 there are these
> undefined refs (I have no druntime):
>
> _d_arraybounds (new to 2066)
> _d_assert (new to 2066)
> _d_unittest (new to 2066)
> _Dmodule_ref (also in 2065)
> _d_dso_registry (also in 2065)
>
> It is trivial to stub these out but it got me wondering...
>
> Is there any way to compile D that has no dependencies?
>
>
> Thanks,
> uri
>
>
>
>


Re: Command Line Application in D

2014-08-04 Thread maarten van damme via Digitalmars-d-learn
I am a little bit confused as to what you want.
There is a command line example at dlang.org, and there exists a program
(rdmd) that compiles several D files and runs them.
http://dlang.org/rdmd.html


2014-08-04 23:20 GMT+02:00 TJB via Digitalmars-d-learn <
digitalmars-d-learn@puremagic.com>:

> I am trying to build some simple command line applications that I have
> written in python as a way to learn D. Can you give some examples for me?
> For instance, I think I remember once seeing somewhere in the documentation
> an example that took several D files and compiled them all by running some
> kind of system command.
>
> I much appreciate your help!
>
> TJB
>


Re: std.algorithm range violation

2014-05-28 Thread maarten van damme via Digitalmars-d-learn
wow.
senpai, teach me what I did wrong...


2014-05-28 13:21 GMT+02:00 bearophile via Digitalmars-d-learn <
digitalmars-d-learn@puremagic.com>:

> maarten van damme:
>
>
>  writeln(providor_symbol_map.keys.sort!((x,y)=>providor_
>> symbol_map[x].length>=providor_symbol_map[y].length));
>> [/code]
>>
>
> Try:
>
> ((x, y) => providor_symbol_map[x].length > providor_symbol_map[y].length)
>
> Bye,
> bearophile
>


Re: std.algorithm range violation

2014-05-28 Thread maarten van damme via Digitalmars-d-learn
I'm trying to analyze the usage of certain words in a large number of spam
emails, and I want for every interesting word a list of 'providors', that
mentioned that word. with associative arrays I hoped to get it by using
array["interestingworde].

And I have to refer outside from sort(x,y) as associative arrays have no
order, I'll always have to sort a key-array according to values obtained
through the associative array.
It's supposed to be a delegate anyway, otherwise the least it could do is
throw a compilation error.


2014-05-28 12:53 GMT+02:00 Wanderer via Digitalmars-d-learn <
digitalmars-d-learn@puremagic.com>:

> On Wednesday, 28 May 2014 at 10:10:41 UTC, maarten van damme via
>
> Digitalmars-d-learn wrote:
>
>> an anyone explain me what I'm doing wrong here :
>>
>> [code]
>> dstring[][dstring] providor_symbol_map;
>> ...
>>
>> writeln(providor_symbol_map.keys.sort!((x,y)=>providor_
>> symbol_map[x].length>=providor_symbol_map[y].length));
>> [/code]
>>
>> output:
>> core.exception.RangeError@std.algorithm(9429): Range violation
>>
>
> "dstring[][dstring]" declaration looks a bit obscure to me...
> what do you intent with it, "array of maps" or "map of arrays"?
>
> Also, it looks unnatural that inside sorting lambda, you refer
> outside from it (back to providor_symbol_map variable). Ideally,
> you should only use variables x and y. Does D support sorting by
> map entries instead of by keys only or by values only?
>


std.algorithm range violation

2014-05-28 Thread maarten van damme via Digitalmars-d-learn
an anyone explain me what I'm doing wrong here :

[code]
dstring[][dstring] providor_symbol_map;
...

writeln(providor_symbol_map.keys.sort!((x,y)=>providor_symbol_map[x].length>=providor_symbol_map[y].length));
[/code]

output:
core.exception.RangeError@std.algorithm(9429): Range violation


Re: Newbie questions. Which Compiler to start with? Real Time behaviour? Has anyone converted CImg yet?

2013-09-01 Thread maarten van damme
1) afaik you can't cross compile to arm with dmd. I know it's possible with
gdc.
2) There are people who successfully use d without gc. I think andrei
posted a stub gc that throws an exception every time the garbage collector
is tried to get used. You can't use whole phobos (yet) without gc.


2013/9/2 John Carter 

> So I'm a reasonably experienced C/C++/Ruby/... programmer and D is looking
> very Good to me...
>
> So, time to get serious and sit down and learn it.
>
> Ultimately it won't pay me to learn it unless I can ultimately take my
> colleagues along.
>
> Currently they are itching to move from C to C++, and I'm trying to
> convince them not to.
>
> We work in the embedded linux real time area, so here are a few newbie
> questions that I couldn't spot the answer to...
>
> 1) Which D compiler should we start with? We use gcc/g++ for everything
> else, is gcd a good choice or should we stick with Digital mars one? (We
> would be cross compiling to sparc or arm)
>
> 2) The traditional argument against garbage collected languages in real
> time environments is that they sporadically lock up while collecting
> resulting in missed real time deadlines. Certainly the "state of the art"
> in GC has moved beyond this, and also there are workarounds for the
> problem. Is it possible to do real time programming in D?
>
> 3) A good starter project for me would be to take a well known
> cpu-intensive C++ template rich project and convert it to D and then
> present that side-by-side to my colleagues.
>
> I like playing around with CImg, http://cimg.sourceforge.net/
>
> CImg it is one huge template with chunks of macro magic to do image
> processing.
>
> Before I start, has anyone converted CImg to DImg yet?
>
> Thanks!
>


Re: A little of coordination for Rosettacode

2013-08-30 Thread maarten van damme
the entry :
http://rosettacode.org/wiki/File_IO
is wrong because as stated by the asignment : "In this task, the job is to
create a file called "output.txt", and place in it the contents of the file
"input.txt", *via an intermediate variable.**"*
*
*
there is no intermediate variable; I don't know if this is the right place
to post but you seem to do a lot of work for rosetta...


2013/8/31 bearophile 

> I have added a D entry for the "Go Fish" game:
>
> http://rosettacode.org/wiki/**Go_Fish#D
>
> I don't know the Go Fish game, so I am not sure this code is correct. Is
> some of you able and willing to test its play a bit?
>
> (This D entry is very Python-style because it's a translation of the
> Python entry, so it's not very strongly typed. Generally in D I prefer
> stronger typing, but in this case I think it's acceptable).
>
> Bye,
> bearophile
>


Re: std.algorithm's remove

2013-08-24 Thread maarten van damme
I'm not sure if it really is my place to criticize design decisions of a
language written by people that devoted their career to computer science
while I have only read some books out of boredom :)



2013/8/25 bearophile 

> maarten van damme:
>
>
>  But remove doesn't truly remove from the source range because the length
>> of
>> the source range stays the same. It's return value is a modified copy of
>> the source range.
>>
>> Filter doesn't really work right away because that would also remove
>> duplicate elements while I only want to remove at a given index. It also
>> makes for clunkier looking code and is counterintinuitive to come up with
>> (I want to remove an element therefore I have to filter every element that
>> isn't equal to that element from the source range...)
>> And while I haven't worked in c++, even that appears to have remove_copy
>> which is really what I want.
>>
>
> I agree that the design of std.algorithm.remove is bug prone. The compiler
> doesn't verify that you are using its result! I have also filed several
> bugs regarding the implementation of std.algorithm.remove.
>
> In the end your complaints are real. You can't expect Phobos to be
> perfect, but people work to fix it. Fixing such problems future D users
> will not find your problem. So I suggest you to think well about what your
> problem is, what you don't like on this, and then write a enhancement
> request for Phobos. Even if std.algorithm.remove can't be fixed, people can
> add a new function with a safer/more handy behavour.
>
> Bye,
> bearophile
>


Re: std.algorithm's remove

2013-08-24 Thread maarten van damme
>
>  (apart from reading the documentation on every single
>> trivial function in the std library?)
>>
>
> Before using every function from the standard library you have to read its
> documentation, this is sure. You can not assume its behavour to be exactly
> the same you hope it to have. This is true for languages as Python too.
>

While this is true, one can safely assume that a function called "writeln"
that takes a string will print that string and in the process not alter the
source. (Or at least, that's what I hope to be possible).


> Regarding your very quickly written D code, I suggest to decrease the
> indents size, put a space around operators, put immutable/const to
> everything that doesn't need to change (unless there are problems doing
> so).


I was timing the time it took me to go from exercise to working program. I
figured spamming immutable everywhere would only slow time down while not
increasing productivity (for small programs. If I were to write something
big, that is indeed a must)


> I also suggest to use UFCS chains, because they are more readable for this
> kind of code. Instead of the readln()[0..$-1] you could chomp, strip or do
> not retain newlines.


Hehe, I didn't knew about chomp, thanks for the tip.


> Instead of array(splitter) it's simpler to just split.

also a hidden gem. I always go for my goodies to std.algorithm, I didn't
expect there to be 'duplicates' in std.array as well.


> Instead of chain.length==0 it's better to use empty. The foreach usually
> doesn't need a type, and probably your for loop could written as a better
> foreach.

I like to spam types everywhere, it's something I've grown used to. I don't
like the concept of auto (although I do see why it could potentially
increase productivity).

I should've used a foreach loop, I can't remember why I didn't x)


> I also suggest to add contracts to your code. Instead of returning a
> "can't be solved", probably there are stronger typed solutions, like using
> an Algebraic or Nullable.
>
>
Yes, that was a bit ad-hoc decided. I was hesitating to use some kind of
bool for true-solved and false-unsolved and have the found parameter be by
ref. I came up with something that looks a bit neater now :)

http://dpaste.dzfl.pl/20034431


Re: std.algorithm's remove

2013-08-24 Thread maarten van damme
Correction, I could really use remove to begin with, only have to dup the
range. Still convinced that the remove behaviour is counterintuitive but I
assume good reasons exist...


2013/8/25 maarten van damme 

> But remove doesn't truly remove from the source range because the length
> of the source range stays the same. It's return value is a modified copy of
> the source range.
>
> Filter doesn't really work right away because that would also remove
> duplicate elements while I only want to remove at a given index. It also
> makes for clunkier looking code and is counterintinuitive to come up with
> (I want to remove an element therefore I have to filter every element that
> isn't equal to that element from the source range...)
> And while I haven't worked in c++, even that appears to have remove_copy
> which is really what I want.
>
> I could use temporary variables and blow that neat line up in 3 lines
> which, while still readable, look redundant.
>
> I'm happy the d result is 3 times shorter then their haskell solution but
> not that the time spent was 5 minutes working and the rest of the time
> debugging. This as opposed to using racket where the time spent is 15
> minutes but after that everything works great (while my racket experience
> is limited to playing around with it for 2 weeks now and then).
>
>
> 2013/8/25 Brad Anderson 
>
>> On Sunday, 25 August 2013 at 02:24:30 UTC, maarten van damme wrote:
>>
>>> hello,
>>>
>>> I'm a hobyist-programmer and around where I live there's a group of
>>> haskell
>>> fanatics. They posted solutions to a recent programming challenge which I
>>> find to be a bit ugly. For fun I wanted to implement it in d and a rough
>>> version (not correct yet, this was written/hacked in 5 minutes after
>>> reading the exercise)
>>>
>>> My rough version is posted here : http://dpaste.dzfl.pl/4b5a6578
>>>
>>> if you look at the output, you'll see this particular line :
>>> "omkom -> komkom because of : kom momkom momkom -> momkomm"
>>>
>>> This is because of what remove from std.algorithm does. It not only
>>> returns
>>> a range with that element removed (as the name implies), it also modifies
>>> the original range.
>>> I assume this decision was made for efficiency purposes but that is one
>>> of
>>> the most ugliest things I have ever come across. At least c# forces the
>>> 'ref' in it's parameters so you know something's up. Is there any way I
>>> could've known this? (apart from reading the documentation on every
>>> single
>>> trivial function in the std library?)
>>>
>>
>> It was done that way intentionally because the purpose of remove is to
>> remove from the source range.  If you don't want to affect the source range
>> use filter.
>>
>> I suspect you could trace remove's lineage back to C++ STL's remove which
>> works similarly (but is significantly clunkier and harder to use).
>>
>
>


Re: std.algorithm's remove

2013-08-24 Thread maarten van damme
But remove doesn't truly remove from the source range because the length of
the source range stays the same. It's return value is a modified copy of
the source range.

Filter doesn't really work right away because that would also remove
duplicate elements while I only want to remove at a given index. It also
makes for clunkier looking code and is counterintinuitive to come up with
(I want to remove an element therefore I have to filter every element that
isn't equal to that element from the source range...)
And while I haven't worked in c++, even that appears to have remove_copy
which is really what I want.

I could use temporary variables and blow that neat line up in 3 lines
which, while still readable, look redundant.

I'm happy the d result is 3 times shorter then their haskell solution but
not that the time spent was 5 minutes working and the rest of the time
debugging. This as opposed to using racket where the time spent is 15
minutes but after that everything works great (while my racket experience
is limited to playing around with it for 2 weeks now and then).


2013/8/25 Brad Anderson 

> On Sunday, 25 August 2013 at 02:24:30 UTC, maarten van damme wrote:
>
>> hello,
>>
>> I'm a hobyist-programmer and around where I live there's a group of
>> haskell
>> fanatics. They posted solutions to a recent programming challenge which I
>> find to be a bit ugly. For fun I wanted to implement it in d and a rough
>> version (not correct yet, this was written/hacked in 5 minutes after
>> reading the exercise)
>>
>> My rough version is posted here : http://dpaste.dzfl.pl/4b5a6578
>>
>> if you look at the output, you'll see this particular line :
>> "omkom -> komkom because of : kom momkom momkom -> momkomm"
>>
>> This is because of what remove from std.algorithm does. It not only
>> returns
>> a range with that element removed (as the name implies), it also modifies
>> the original range.
>> I assume this decision was made for efficiency purposes but that is one of
>> the most ugliest things I have ever come across. At least c# forces the
>> 'ref' in it's parameters so you know something's up. Is there any way I
>> could've known this? (apart from reading the documentation on every single
>> trivial function in the std library?)
>>
>
> It was done that way intentionally because the purpose of remove is to
> remove from the source range.  If you don't want to affect the source range
> use filter.
>
> I suspect you could trace remove's lineage back to C++ STL's remove which
> works similarly (but is significantly clunkier and harder to use).
>


std.algorithm's remove

2013-08-24 Thread maarten van damme
hello,

I'm a hobyist-programmer and around where I live there's a group of haskell
fanatics. They posted solutions to a recent programming challenge which I
find to be a bit ugly. For fun I wanted to implement it in d and a rough
version (not correct yet, this was written/hacked in 5 minutes after
reading the exercise)

My rough version is posted here : http://dpaste.dzfl.pl/4b5a6578

if you look at the output, you'll see this particular line :
"omkom -> komkom because of : kom momkom momkom -> momkomm"

This is because of what remove from std.algorithm does. It not only returns
a range with that element removed (as the name implies), it also modifies
the original range.
I assume this decision was made for efficiency purposes but that is one of
the most ugliest things I have ever come across. At least c# forces the
'ref' in it's parameters so you know something's up. Is there any way I
could've known this? (apart from reading the documentation on every single
trivial function in the std library?)


Re: randomShuffle

2013-06-03 Thread maarten van damme
How about using std.random.randomSample?


2013/6/3 Yann 

> Hey,
>
> I am trying to generate an array of 10 unique (!) random numbers from 1 to
> 1000 each (for example). The best I could come up with is:
>
> auto arr = iota(1, 1000).array;
> randomShuffle(arr);
> return arr.take(10).array.sort;
>
> This leaves me quite unhappy, because I would like the code
> a) to be one line
> b) not use "array" more than once
>
> Is there a better way to accomplish this? Naively, I would expect
> something like
> "return iota(1, 1000).randomShuffle.take(10).**sort;"
>
> Thanks,
> Yann
>


Re: how to avoid memory leaking

2013-05-14 Thread maarten van damme
So now pgen.d works (without simpledisplay version an reusing trueimage).
The simpledisplay version still has problems, but I'll try (manually
(de)allocating)/(reusing) the data


2013/5/14 Adam D. Ruppe 

> On Monday, 13 May 2013 at 21:28:34 UTC, maarten van damme wrote:
>
>> Adam checks this thread so he'll probably read the errors about
>> simpledisplay. if not I'll copy paste and put in a bug report on github.
>>
>
> I won't be on my linux box with free time until at least tomorrow
> afternoon but i'll check then. I've used simpledisplay on linux before, but
> never with a 64 bit app so i'll have to try it.
>
>
>  So, do we actually know where the memory problems came from? is anyone
>> actually running out of memory too or am I the only one?
>>
>
> I didn't actually get that far since i'm on my slow computer, but my guess
> is one of those copies got pointed into.
>
> The image in your code is something like 8 MB of memory, and is generated
> pretty rapidly, as fast as teh cpu could do it in the other thread.
>
> The old function took that 8MB and made at least two copies of it, once in
> my function and once in std.zlib's function. If the usable address space is
> 2 GB, any random 32 bit number would have about a 1/128 chance of pointing
> into it.
>
> If you consider the gc was probably scanning at least one copy of that
> data for pointers - std.zlib's one was constructed as a void[], so even if
> allocator told the gc what type it was (idk if it does or not), void[] has
> to be scanned conservatively because it could be an array of pointers.
>
> And then add in random numbers on the stack, and the odds are pretty good
> the gc will get a false positive and then fail to free the memory block.
>
>
> Repeat as it loops through the images, and you've got a pretty big memory
> leak adding up.
>
>
> I'm not 100% sure that's what happened, but I think it is pretty likely.
> The reason the new function fixes it is because it manages the big copies
> manually, freeing them at the end of the function without worrying about
> false pointers.
>


Re: how to avoid memory leaking

2013-05-13 Thread maarten van damme
I'll check every uint occurance, thank you. I'm on windows so I won't get
the "maximum number of clients" error you talk about. The loop I used
inside main was :
"while(true){
curtrans=generateTransformationMatrix();

for(int y=0;y

> On Friday, 10 May 2013 at 23:18:31 UTC, maarten van damme wrote:
>
>> I'm trying to generate images and after displaying them I want to save
>> them
>> to a png file. I use parallelism to generate them asynchronously with the
>> gui-thread to avoid blocking (don't know if this is really relevant).
>>
>> If I add a single line in the method where I generate the image that
>> creates a class which allocates a pretty big array, slowly but surely the
>> memory starts to rise until it ends in a spectacular out of memory
>> exception. I always thought the garbage collector would deal with it.
>>
>> I tried reducing it but failed. Maybe I should let dustmite bite in it a
>> bit later.
>> How can I manually fix this? Is this a known bug in the garbage collector?
>>
>> btw, this code also caused segfaults on my  64 bit laptop on linux.
>> How can I avoid this?
>>
>> main class:
>> https://dl.dropboxusercontent.**com/u/15024434/**
>> picturegenerator/generalised.d<https://dl.dropboxusercontent.com/u/15024434/picturegenerator/generalised.d>
>>
>> zip file with everything ready to go to compile:
>> https://dl.dropboxusercontent.**com/u/15024434/**picturegenerator/**
>> picturegenerator.zip<https://dl.dropboxusercontent.com/u/15024434/picturegenerator/picturegenerator.zip>
>>
>
> 1) your code is not compilable on 64x system due to erroneous treating of
> some platform-varying types as uint, use size_t. Luckily dmd has -m32 switch
>
> 2) I encounter not out of memory exception but enforcement failure in
> simpledisplay.d:1024 "Maximum number of clients" which looks like not a
> memory error but you running out of some X server limit.
>
> 3) Segfault occures in simpledisplay.d:1058 - in destructor you call
> XDestroyImage(handle) but do not check whether handle is null. However it
> happens after enforcement failure so it doesn't looks like root of problem.
>
> 4) What really consumes memory is kernel or something which forces it to
> consume it since my task manager reports two blocks of 280 MB and 126 MB
> inside kernel part of virtual memory.
>


Re: Disgusted

2013-05-13 Thread maarten van damme
If you define intelligence as the ability to learn computer languages, I'd
have to disagree with you. No reason to be disgusted, just curious. Why on
earth would you spend your time doing that?


2013/5/13 D-Ratiseur 

> On Monday, 13 May 2013 at 00:21:06 UTC, John Colvin wrote:
>
>> On Monday, 13 May 2013 at 00:18:34 UTC, D-Ratiseur wrote:
>>
>>> I went back from a trip...basically I spent 6 monthes in Yukon...
>>> Then, came back to my activities, I was a lot in the library of
>>> the university linked to my geo. location...I've noticed a strange
>>> guy...He was always reading some books about computer programming languages.
>>> After a few monthes, I've realized that he was learning from
>>> A to Z all the languagues...I've just realized that he was probably
>>> smarter than me...And despite of being disgusted, I wonder If It's time to
>>> hide again in the Yukon state...'cause I'm basically disgusted, and the
>>> basic concept of being alive is stupid and pointless.
>>>
>>
>> There's always smarter people. Hell, most of my friends are smarter than
>> me.
>>
>
> You're probably smarter than me.
> But I know why I left my predilection language: I'm comming from
> Pascal/Delphi and everything is done while in D there is still a field for
> the basic stuff.
> Maybe Roquentin was also looking for that: a free field.
>


Re: how to avoid memory leaking

2013-05-13 Thread maarten van damme
But seeing as the memory only starts growing when I put the png line in,
and that I keep deleting the old class and replacing it for a new instance,
shouldn't the gc clean up everything as nothing can still be referencing to
that data?

I am working on windows, on linux my original code segfaulted, I don't know
about the reduced version though. Afaik it doesn't use a platform
dependent feature.


2013/5/13 Benjamin Thaut 

> Instead of the .dup you can use the slice operator []. Although this
> really should not cause a compiler crash if you forgett to do so.
>
> int[3] staticArray;
> int[] normalArray = staticArray[];
>
>
> I'm not seeing something fundamentally wrong with your code right now. I
> will most likely have some more time to look at it tomorrow. Does it use
> any plattform specific features? (E.g. does it work on windows?)
>
> Having a GC does not mean you can not have memory leaks. If you manage to
> keep the memory referenced by some hard rooted reference the GC is not
> allowed to free it and you will get a memory leak. I'm also currently not
> aware of any tools for D that will help you find memory leaks.
>
> Kind Regards
> Benjamin Thaut
>
>


Re: how to avoid memory leaking

2013-05-12 Thread maarten van damme
aren't you guys all getting tons of internal error's as soon as you combine
dynamic arrays with static arrays? It seems as if these things are
completely seperate things, but their syntax sugests a more closely related
connection. I really find it confusing...

So, after reducing, I am very certain that at least one problem comes from
generating a png, the code used is here available :
https://github.com/adamdruppe/misc-stuff-including-D-programming-language-web-stuff/blob/master/png.d
seeing as this is pure d, am I right in assuming there should never be any
memory leaks when using this?

The reduced loop that only generates images is here :

TrueColorImage i= new TrueColorImage(width,height);
PNG* png;
double[][4] curtrans;
while(true){
curtrans=generateTransformationMatrix();

for(int y=0;y

> Am 12.05.2013 21:05, schrieb maarten van damme:
>
>> This is ridiculous. Your solution appears to keep the memory somewhat
>> constant around 20mb-28mb untill it suddenly runs out of memory.
>> Literally out of nowhere.
>>
>> I have no idea what's causing everything, so I decided to get rid of the
>> window altogether and to try saving the images instead of displaying +
>> saving them. Now I run in "Internal error: ..\ztc\cgcs.c 343"...
>>
>> D is really dissapointing here. Maybe it's the gc having fun, maybe it's
>> something else, no way to know for sure. Having to give up on displaying
>> it altogether runs into internal error's.
>>
>
> As D is a relative new lagnauge stuff like this can happen. It would be
> great if you could reduce the compiler crash to a minimal test case using
> dustmite: 
> https://github.com/**CyberShadow/DustMite<https://github.com/CyberShadow/DustMite>
> A description how to use it is aviable in the wiki. If you successfully
> reduced the compiler error please fill in a bug report at
> http://d.puremagic.com/issues/
>
> --
> Kind Regards
> Benjamin Thaut
>


Re: how to avoid memory leaking

2013-05-12 Thread maarten van damme
This is ridiculous. Your solution appears to keep the memory somewhat
constant around 20mb-28mb untill it suddenly runs out of memory. Literally
out of nowhere.

I have no idea what's causing everything, so I decided to get rid of the
window altogether and to try saving the images instead of displaying +
saving them. Now I run in "Internal error: ..\ztc\cgcs.c 343"...

D is really dissapointing here. Maybe it's the gc having fun, maybe it's
something else, no way to know for sure. Having to give up on displaying it
altogether runs into internal error's.


Re: how to avoid memory leaking

2013-05-12 Thread maarten van damme
I tried using gc.malloc and gc.free but got an invalidmemoryoperation
exception when doing gc.free(data.ptr);
Simply using gc.malloc like you proposed, the memory keeps growing. Is this
a bug in the d garbage collector?

What's really strange though, is that the destructor of trueimagecolor (the
class allocating the buffer) is getting called everytime...
Does this mean that a destructor getting called still is no garantee that
all data is getting free'd?



2013/5/12 Benjamin Thaut 

> Am 11.05.2013 01:18, schrieb maarten van damme:
>
>  I'm trying to generate images and after displaying them I want to save
>> them to a png file. I use parallelism to generate them asynchronously
>> with the gui-thread to avoid blocking (don't know if this is really
>> relevant).
>>
>> If I add a single line in the method where I generate the image that
>> creates a class which allocates a pretty big array, slowly but surely
>> the memory starts to rise until it ends in a spectacular out of memory
>> exception. I always thought the garbage collector would deal with it.
>>
>> I tried reducing it but failed. Maybe I should let dustmite bite in it a
>> bit later.
>> How can I manually fix this? Is this a known bug in the garbage collector?
>>
>> btw, this code also caused segfaults on my  64 bit laptop on linux.
>> How can I avoid this?
>>
>> main class:
>> https://dl.dropboxusercontent.**com/u/15024434/**
>> picturegenerator/generalised.d<https://dl.dropboxusercontent.com/u/15024434/picturegenerator/generalised.d>
>>
>> zip file with everything ready to go to compile:
>> https://dl.dropboxusercontent.**com/u/15024434/**picturegenerator/**
>> picturegenerator.zip<https://dl.dropboxusercontent.com/u/15024434/picturegenerator/picturegenerator.zip>
>>
>
> Try allocating the big array with:
>
> import core.memory;
>
> size_t imageSize = 1024*1024*3;
> auto imageData[] = (cast(ubyte*)GC.malloc(**imageSize ,
> GC.BlkAttr.NO_SCAN)[0..**imageSize];
>
> Which will result in the big memory block not beeing scanned by the GC
> which should reduce the number of false positives during collection.
>
> If this doesn't work, use malloc / free of the c standard library to
> allocate and free the image data.
>
> Kind Regards
> Benjamin Thaut
>


how to avoid memory leaking

2013-05-10 Thread maarten van damme
I'm trying to generate images and after displaying them I want to save them
to a png file. I use parallelism to generate them asynchronously with the
gui-thread to avoid blocking (don't know if this is really relevant).

If I add a single line in the method where I generate the image that
creates a class which allocates a pretty big array, slowly but surely the
memory starts to rise until it ends in a spectacular out of memory
exception. I always thought the garbage collector would deal with it.

I tried reducing it but failed. Maybe I should let dustmite bite in it a
bit later.
How can I manually fix this? Is this a known bug in the garbage collector?

btw, this code also caused segfaults on my  64 bit laptop on linux.
How can I avoid this?

main class:
https://dl.dropboxusercontent.com/u/15024434/picturegenerator/generalised.d

zip file with everything ready to go to compile:
https://dl.dropboxusercontent.com/u/15024434/picturegenerator/picturegenerator.zip


Re: variable x cannot be read at compile time (ctfe)

2012-12-18 Thread maarten van damme
My only assumption is that -version=runtime doesn't utilize ctfe and
the other does. The rest is simple timing on both linux and windows
and ctfe is way slower...

2012/12/18 bearophile :
> maarten van damme:
>
>> How can this be?
>
>
> Maybe there are some mistakes in your assumptions.
>
> Bye,
> bearophilwe


Re: variable x cannot be read at compile time (ctfe)

2012-12-17 Thread maarten van damme
How do I make dmd output asm?

I wrote a simple test and for a simple int[] array it was 2,5 times slower.

2012/12/17 bearophile :
> maarten van damme:
>
>
>> it's odd that the resulting arraylist is slower to access at runtime
>> then the arraylist generated at runtime... Is there a reason for this?
>
>
> In such cases, beside thinking some time about the topic, one solution is to
> take a look at the asm.
>
> Maybe it's the same problem as with enum arrays, they get copied like
> literals every time you use them.
>


Re: variable x cannot be read at compile time (ctfe)

2012-12-17 Thread maarten van damme
Thanks, I'm really happy it works now.

it's odd that the resulting arraylist is slower to access at runtime
then the arraylist generated at runtime... Is there a reason for this?

Should I open bugreports for your testcases?

2012/12/17 bearophile :
>> I think it's a problem of nested delegates at CT. But if this is the
>> problem, dmd used to give a more clear error message.
>
>
> Two minimized programs that show the problems:
>
> -
>
> import std.algorithm: filter;
> import std.array: array;
> auto foo(in int x) {
> return [1, 2].filter!(i => x)();
> }
> enum a = foo(3).array();
> void main() {}
>
>
>
> temp.d(4): Error: variable x cannot be read at compile time
>
> -
>
> import std.array: array;
> enum a = [1, 2].array();
> void main() {}
>
>
>
> ...\src\druntime\import\core\memory.d(251): Error:
> gc_malloc cannot be interpreted at compile time, because it has no available
> source code
>
> -
>
> Bye,
> bearophile


variable x cannot be read at compile time (ctfe)

2012-12-17 Thread maarten van damme
I finally got around trying to finish my sudoksolver and I'm pretty
happy with the result, except one little piece that screams for ctfe
but I never seem to get it working.
I always get "variable x cannot be read at compile time" in this method :

auto bitsetToRange(in SudokuCell x) {
return boardSide.iota().filter!(i => (x >> i) & 1)().map!(x=>x+1)();
}

with SudokuCell beeing declared as:
alias ushort SudokuCell;

I want to generate a dynamic array with all return values form this
method with x ranging from 0..sudokuCell.size.
Why is it complaining x cannot be read at compile time while it is
passed at compile time?


Re: DLL Injection

2012-12-03 Thread maarten van damme
Yes, that was the problem :p

I have no idea about mcvr71, maybe because of std.process but that
isn't that huge a concern


Re: DLL Injection

2012-12-03 Thread maarten van damme
Strangely, the main in my dll is getting executed multiple times and
msvcr71.dll gets injected too. Is this normal?

2012/12/3 s0beit :
> On Sunday, 2 December 2012 at 22:30:56 UTC, maarten van damme wrote:
>>
>> Thanks, interesting blog :)
>>
>> 2012/12/2 s0beit :
>>>
>>> Alright, I was finally able to give it a try:
>>>
>>> http://s0beit.me/d/d-module-injector/
>>>
>>> I released the source code as well as the binary here if anyone wants to
>>> try. It worked for me in a game I was playing with.
>
>
> Thanks! Please let me know the results if you end up trying it, I want to
> confirm it works depending on certain conditions.


Re: telnet and D

2012-11-29 Thread maarten van damme
> vibe.d is very modular, just import what you need.
> I hate to push it, but it has very good documentation and examples.
>
> Its designed for web apps, but it makes a nice little web library as well.
>
> import vibe.vibe;
>
> void main()
> {
> auto client = new HttpClient;
> client.connect("www.google.com", 80);
>
> auto res = client.request((req){
> req.url = "/";
> });
>
> logInfo("Response: %d", res.statusCode);
>
> foreach( k, v; res.headers )
> logInfo("Header: %s: %s", k, v);
>
> (new NullOutputStream).write(res.bodyReader);
> client.disconnect();
> }
>
>

That does indeed look clean. Now I'm using a ubyte[1] buffer to try
and read single bytes from my sockets.

their tcp example looks pretty clean:
import vibe.d;

static this()
{
auto conn = connectTcp("time-b.timefreq.bldrdoc.gov", 13);
logInfo("The time is: %s", cast(string)conn.readAll());
}

let's see how it'll hold up when I try to deal with raw bytes :)


Re: telnet and D

2012-11-27 Thread maarten van damme
> IIRC, telnet is simple, so it shouldn't be too difficult..
Turns out it indeed was simple. My option negotiation had a bug :D

my (primitive) telnet client works now :)


Re: telnet and D

2012-11-27 Thread maarten van damme
Haven't looked at vibe.d yet because it looked more like a library for
writing web apps and  normal sockets should be enough.


Didn't know about Tango, I'll try deciphering the original d1 module.


Re: getters and setters not an lvalue

2012-10-31 Thread maarten van damme
Ok, makes sense now :)

2012/10/31 monarch_dodra :
> On Wednesday, 31 October 2012 at 12:46:12 UTC, maarten van damme wrote:
>>
>> In my current code I'd like to do something ala:
>>
>> void main(){
>> getsettest test=new getsettest();
>>
>> test.value+=1;
>> }
>>
>> class getsettest{
>> int myvalue;
>>
>> this(){
>> }
>>
>> @property{
>>
>> int value(){
>> return myvalue;
>> }
>>
>> void value(int value){
>> myvalue=value;
>> }
>> }
>> }
>>
>> but this gives the following error:
>> test.d(4): Error: test.value() is not an lvalue
>>
>> Is there a rationale behind this decision of not translating
>> test.value+=1 to test.value= test.value +1 ?
>
>
> It's not that simple as "test.value" is not an LValue, so from the
> compiler's perspective "test.value = test.value + 1" calls two different
> functions, that may or may not have anything to do with each other.
>
> The expansion "++ => +=1 => a = a + 1" works if there is only 1 lvalue the
> whole chain through.
>
> Can the compiler really assume it can do that? And is it a smart move to
> allow it to make that assumption. What you have there is basically an
> encapsulated field, that does not leak its address:
>
> You can take the filed, you can update it with a new value, but you can't
> modify it.
>
> If you allow "test.value+=1", then where does it end?
>
> Is this legal?
> //
> void foo(int& a) {...}
> foo(test.value);
> //
>
> Would you want the compiler to expand it into:
> //
> void foo(int& a) {...}
>
> //scope for __temp
> {
>   auto __temp = test.value;
>   foo(temp);
>   test.value = temp;
> }
> //
>
> 
> IMO, if you take the time to write both functions, instead of just:
> //
> @property ref int front(){return myvalue;}
> //
> Then the compiler must assume you did it for a reason, and not mess with
> your code.


Re: getters and setters not an lvalue

2012-10-31 Thread maarten van damme
Ok, looking forward to the fix :)

Btw, I have a foreach loop and in that foreach loop I want to decide
if the current element can stay and if not, I want to remove it. If
removing it yields an empty range in the foreach loop, it crashes.
What's the sane way to do this?


getters and setters not an lvalue

2012-10-31 Thread maarten van damme
In my current code I'd like to do something ala:

void main(){
getsettest test=new getsettest();

test.value+=1;
}

class getsettest{
int myvalue;

this(){
}

@property{

int value(){
return myvalue;
}

void value(int value){
myvalue=value;
}
}
}

but this gives the following error:
test.d(4): Error: test.value() is not an lvalue

Is there a rationale behind this decision of not translating
test.value+=1 to test.value= test.value +1 ?


Re: bigger then size_t

2012-10-09 Thread maarten van damme
Another quick question. When I know an array is going to have an
length smaller then 255, can I use bytes as index or do I have to use
size_t to make it portable across 64 bit platforms?


Re: bigger then size_t

2012-10-09 Thread maarten van damme
Ok, that solves it. Thank you.


Re: Sudoku Py / C++11 / D?

2012-08-25 Thread maarten van damme
>
> Congratulations, you have found a compiler bug. I have found
> maybe one hundred of those. Please minimize the code and submit
> it to Bugzilla :-)
>

Oh, but try playing around with static and dynamic arrays. You'll be
able to find plenty more :p

By changing both squareWidth and squareHeight to 5, we get an optlink
crash (those are more rare, aren't they?)

I've made one of my last modifications allowing M x N sudoku's. I
think I'm going to place the result on github or something. It was a
great experience :)

One last thing would be to try and move generateBitsetCache to CTFE
(if that's even possible).

Anyway, code can be checked out at http://dpaste.dzfl.pl/879b0973
(along with the pretty compiler error at the end).

I'm going to try dustmite out (always wanted to do that) and see if it
can reduce my testcase (no previous experience).


Re: Sudoku Py / C++11 / D?

2012-08-25 Thread maarten van damme
Ok, thank you very much with your help :)


Re: Sudoku Py / C++11 / D?

2012-08-25 Thread maarten van damme
Ok, I'll try with Array!bool instead of bool.

I now renamed a few things, added a few extra checks and generalized
bearophiles modifications. Now the only thing keeping it from solving
25 x 25 size sudoku's is the way I input numbers :)

However, I now have a very strange issue. Compiling with dmd -O
-release -inline works but compiling with dmd -O -release -inline
-noboundscheck gives the following compile time error:

Assertion failure: 'semanticstarted == 2' on line 829 in file 'module.c'

abnormal program termination

Code is at http://dpaste.dzfl.pl/41a01039

I can't test on gdc because compilation of the aur sources failed on
my laptop and I'm to lazy to try and determine the source of the error
:p

Also, why do you use enum's and not consts ?


Re: Sudoku Py / C++11 / D?

2012-08-25 Thread maarten van damme
While trying to use Array!bool I noticed this:
import std.container;

void main(){
Array!bool test;
test[0]=false;
}
gives an assertion failure without any information.
Also, why on earth can't I instantiate array!bool with a given length?


Re: Sudoku Py / C++11 / D?

2012-08-25 Thread maarten van damme
The puzzle unflipped is extra hard as the solution to the first row is
987 654 321. Come to think of it, one could add a new function "flip"
that mutates the sudoku according to well known rules and maybe
something like unflip for when the sudoku was finnished.

New techniques could certainly be added (like single candidate and
naked pairs) without too much overhead so they might just pay off,
certainly on the impossible puzzle.

Maybe I could also pre-calculate all rows, collumns and squares and
store them in int pointer arrays. This way things could become even
faster. Would it be possible to do something like that in ctfe?


Re: Sudoku Py / C++11 / D?

2012-08-24 Thread maarten van damme
2012/8/25 Timon Gehr :
> On 08/24/2012 09:32 PM, maarten van damme wrote:
>>
>> I've distiled what I understood from your source and the resulting
>> executable managed to solve the impossible one in 27 seconds while
>> your source takes 41 seconds.
>>
>
> It is 10s vs 13s with GDC on my machine.
>

I've only tried dmd but I'm installing gdc on this laptop too.
When that's done I'm going to see how they both perform on this puzzle
: http://en.wikipedia.org/wiki/File:Sudoku_puzzle_hard_for_brute_force.jpg


Re: Sudoku Py / C++11 / D?

2012-08-24 Thread maarten van damme
and everythingPossible should also be changed to something ala 2 ^(side) -1


Re: Sudoku Py / C++11 / D?

2012-08-24 Thread maarten van damme
> Some suggestions about the code:
Thank you very much for your criticism, there are indeed a lot of
points where I have to improve on.

> - Put a space before and after operators, after a commas and semicolon,
> around "..", etc.
> - Compile with "-wi -property";
> - Try to add pure/const/nothrow/immutable where possible;

I realize the usefullness of keywords like these but having to type
them over and over again tends to become rather annoying. There are
functions where the implementation is shorter than it's declaration...
Is there a special reason I should use them in little programs like these?

> - Minimize the need of cast();
> - Sometimes it's useful to localize the imports (stdio e datetime are used
> just by the main);
> - Minimize the usage of magical constants like 0b10__, possibly
> define it only once. And often adding underscores inside long numbers is
> handy (here I have put them every 4 digits because it's binary);
> - Repeating things like "short[81]" in many function signatures is quite
> bad. Better to define a global type with alias (or someday better with
> std.typecons.Typedef when it will work), and then use it;
> - Generally it's better to use unsigned values for array indexes;
> - If you look for performance and your program is single thread, then it's
> better to annotate global variables with __gshared;

I'm not all that familiar with __gshared, why does it increase performance?

>
> - This:
> ubyte[81] taken = false;
> is better than this:
> ubyte[81] taken;
> taken[] = false;

I know and I think I can even leave false out because the default
value of ubyte is 0 => false. I had a big in my code and it took me a
long time to find it. That line is a leftover of a desperate attempt
at finding it :) (as is line 101)

I even tried using array!bool but even instantiating failed so I gave
up. Would performance increase be noticeable? I guess not.
>
>
> This is your code modified, it's also a little faster:
> http://dpaste.dzfl.pl/06510dcd
>

Thank you. I see you also used contracts, looks better now :)
(using contracts is really something I should start doing...)

> I will try to replace the int[] of cachedBitsetToRange with something more
> static, to reduce indirection.
>
> Bye,
> bearophile


I should also add a little check to see if every value I put is indeed
numerical.


Re: Sudoku Py / C++11 / D?

2012-08-24 Thread maarten van damme
> I'm unsure if searching for the field with the least possibilities was
> a smart move because now I have to carry that "taken" array through
> all my functions and optimize has to check the whole sudoku instead of
> a slice. (come to think of it, taken should've been named occupied)

I take that back, having tried it out, it is more then 3 times slower...


Re: Sudoku Py / C++11 / D?

2012-08-24 Thread maarten van damme
Thank you very much.
I changed line 119 to an explicit cast to int and removed an unneeded
cast at line 63.
It now happily compiles with 64bit mode : http://dpaste.dzfl.pl/63666f07.
It's kind off odd though that compiling with -inline seems to slow it
a bit down.

I'm unsure if searching for the field with the least possibilities was
a smart move because now I have to carry that "taken" array through
all my functions and optimize has to check the whole sudoku instead of
a slice. (come to think of it, taken should've been named occupied)

Still, I'm really pleased with the results. I should write a
prettyPrint method that prints sudoku's in a prettier format and
returns the solution instead of the shorts containing the solutions
hidden in bitfields :)


Re: Sudoku Py / C++11 / D?

2012-08-24 Thread maarten van damme
I've distiled what I understood from your source and the resulting
executable managed to solve the impossible one in 27 seconds while
your source takes 41 seconds.

I've probably violated every D guideline concerning the use of static,
pure, nothrow,... but it works perfectly :)
It does fail to compile on dpaste, I have no idea why. It does compile
on my machine though...

http://dpaste.dzfl.pl/8a2aef5b

2012/8/21, Timon Gehr :
> On 08/21/2012 05:52 PM, maarten van damme wrote:
>> > On 08/20/2012 11:49 PM, Timon Gehr wrote:> On 08/20/2012 10:43 PM,
> maarten van damme wrote:
>>>>
>>>> Still it comes nowhere near beating timons solution. Is the logic of
>>>> that documented somewhere because I don't understand it.
>>>>
>>>
>>> Try this:
>>> http://dpaste.dzfl.pl/23b1b6e2
>>
>> Thank you very much, this makes everything more clearer. I'm not very
>> familiar with binary operators so the comments help out a lot.
>> Would you mind it if I shamelessly copy your solution of using shorts
>> to store possibilities in?
>>
>
> Not at all.
>
>> I'm also a bit confused. How come the int's you change from a square
>> passed from squ are stilled referenced to the original array? I
>> thought it lost that reference as soon as you did any operations (like
>> concenating) on it?
>>
>
> The used ranges just express patterns of iteration. They replace manual
> for-loops. The data source has assignable elements, and the relevant
> range operations in Phobos all propagate this capability to their
> result.
>
>


Re: Sudoku Py / C++11 / D?

2012-08-21 Thread maarten van damme
2012/8/17, Chris Cain :
>
> Gonna chime in a bit here:
>
> There's a lot of factors at play when deciding to use shorts vs
> bytes vs native-sized ints. The best way to decide is to time all
> of them and see which works best overall.
>
> With caching on a larger problem, I'd guess that the smaller you
> go, the better. The reason is that you run the risk of your data
> getting large enough that it can't all fit in the L2 cache and
> waiting for information to come from memory takes forever
> (comparatively speaking).
>
> Also, I just looked at your solution (not Mr. Gehr's solution),
> but it looks like you could approach this much more efficiently.
>
> It seems like you're storing a lot of information in arrays of
> ints. At least some of that could be stored in a bitmap/bitset
> (http://en.wikipedia.org/wiki/Bit_array) and give you
> significantly better memory efficiency. Array!bool in
> std.container will actually do the correct thing and store things
> like a bitset, so you don't necessarily have to implement your
> own (however, I think that it stores it in an int when you could
> use a short to hold 1-9 ... but it's not enough to really worry
> about).
>

I've been using my phone the last few days to check my emails and
overlooked this message. I've never heard about std.container but this
could indeed be a more efficient solution. I'm now storing a lot in
bytes but that's still 8 times too much :)

> Try this:
> http://dpaste.dzfl.pl/23b1b6e2

Thank you very much, this makes everything more clearer. I'm not very
familiar with binary operators so the comments help out a lot.
Would you mind it if I shamelessly copy your solution of using shorts
to store possibilities in?

I'm also a bit confused. How come the int's you change from a square
passed from squ are stilled referenced to the original array? I
thought it lost that reference as soon as you did any operations (like
concenating) on it?

> Was that sarcasm? My own code only uses copying when it's working in the next 
> section of brute force, otherwise it's all referenced.

No, that wasn't sarastic. If you look at my last code you see that I
"compose" the squares using something like [] ~ [.] ~ [.]
Using a foreach loop and copying the values was 10 times faster...

>  I only use exceptions twice and both when it would be unable to find a 
> solution; I suppose I can try putting nothrow on everything and return a bool 
> if it had an error for solving, or when it had to, inside a structure. 
> Mmmm... I'll give it a try.

Yes but when your solver reaches a solution that is wrong, you get a
whole "branch" of numbers falling of, all throwing a "broken sudoku"
exception. It will rarely be called once.

> Not normal but it can be arranged. :p

But I used it in my getRegion code where I do simple calculations on
the contents of that array. It is slower there...


Re: Sudoku Py / C++11 / D?

2012-08-19 Thread maarten van damme
>   Depends. Do you plan on doing more than brute force? Having it
> bulk copy them may not be that bad if it's all in one place, and
> if you do it like that you have all the combinations that carry
> forward to the next level and if you back out it undoes them all
> automatically.
>

No, I think doing something else then brute-force would simply be a
waste of time (except for finding singles in which case you don't need
to use a brute force solver right?)
These are of course speculations, I'm not sure.

>> Going even further I could even store a filled-in value as an
>> array with one possibilities...
>
>   As long as you can tell it apart for it to work, that's up to
> you.
>
yes, that is indeed going to be the problem ...


Re: Sudoku Py / C++11 / D?

2012-08-19 Thread maarten van damme
I'm using a static array.

I'm hesitating though if I should store possibilities in a precalculated
array or calculate them in-place. If i precalculate the possibilities i'd
have to copy them over and over so i don't know if it's smart.

Going even further I could even store a filled-in value as an array with
one possibilities...


Re: Sudoku Py / C++11 / D?

2012-08-19 Thread maarten van damme
The infinite loop was my mistake. I was looking at your outer while loop
but because you use exceptions instead of return values it indeed throws an
exception, my bad :)

By replacing ref by const ref my program slowed down (looked over a period
of 10_000 runs). Not considerably but noticeable. Compiled with -release
-noboundscheck -O -inline. Anyone else experiencing the same?

Is copying a static arrays cheaper then recalculating the lovation of
collumns and squares btw?


Re: Sudoku Py / C++11 / D?

2012-08-19 Thread maarten van damme
my code is located at http://dpaste.dzfl.pl/93cd5f45

2012/8/19, maarten van damme :
> Great, i tried to get rid of the dynamic array "possibilities" by
> representing it using a static array of bools. This approach made it 4
> times faster :)
>
> When i have a solid wifi connection I'm going to install dmd 2.60 to
> compile timon's code. In the meantime I've started beautifying the source
> so i can follow the logic.
>
> I still have a few questions however:
> - era claims his code takes 12 seconds on the hardest supplied puzzle yet
> it enters an infinite loop when the puzzle isnt solvable. Is he talking
> about a different puzzle?
>
> -is it normal that const ref is slower then ref?
>
> - in an effort of trying to make the program reuse the same memory I've
> moved some temporary variables outside the function but the program became
> slower, how can this be?
>
> - in a few hours i'll upload my newest source. I cant find that much stupid
> design decisions anymore that cause slowdowns yet it keeps lagging behind
> by an enormous amount to timon's solver. What's that much more efficient in
> his solution?
>


Re: Sudoku Py / C++11 / D?

2012-08-19 Thread maarten van damme
Great, i tried to get rid of the dynamic array "possibilities" by
representing it using a static array of bools. This approach made it 4
times faster :)

When i have a solid wifi connection I'm going to install dmd 2.60 to
compile timon's code. In the meantime I've started beautifying the source
so i can follow the logic.

I still have a few questions however:
- era claims his code takes 12 seconds on the hardest supplied puzzle yet
it enters an infinite loop when the puzzle isnt solvable. Is he talking
about a different puzzle?

-is it normal that const ref is slower then ref?

- in an effort of trying to make the program reuse the same memory I've
moved some temporary variables outside the function but the program became
slower, how can this be?

- in a few hours i'll upload my newest source. I cant find that much stupid
design decisions anymore that cause slowdowns yet it keeps lagging behind
by an enormous amount to timon's solver. What's that much more efficient in
his solution?


Re: Sudoku Py / C++11 / D?

2012-08-16 Thread maarten van damme
great, going to play around with it tomorrow.
Caching the possibilities is going to look really ugly but you're
right, it's going to give quiet a boost in performance.

I'm also going to format your source code a bit more and see if I can
follow it's logic as it seems to be way more efficient. (although
compilation is failing here, I'm running dmd 2.059 and it gives "can't
stride on chunks!(short))

would using short or bytes increase performance compared to integers?
if so, why did you use shorts instead of bytes?

2012/8/17, Timon Gehr :
> On 08/16/2012 11:51 PM, maarten van damme wrote:
>>
>>  > This is because your specific solution is slow.
>>  >
>>  > Mine takes <20ms on the 'hard' puzzle and ~13s on the impossible one.
>>  > (~2.4 GHZ intel x86_64 machine, with gdmd -O -release -inline
>> -noboundscheck.)
>>  > There is a constant factor between those two solutions.
>>
>> I've compiled it using dmd on my latitude e5500 which is not that fast
>> so I don't think it's that slow...
>>
>
> Compiled and run in the same environment, your solution takes 0.26s on
> the 'hard' one, whereas mine takes 0.0013s. Your solution takes ~1600s
> on the impossible one whereas mine takes ~13s.
>
>> Besides, lets say mine is five times slower,
>
> Hard facts say that it is at around 100x-200x slower.
>
>> 3000 seconds is still waaay  to much.
>
> Sounds reasonable to me.
>
>> When I'm back able to get my laptop to use my crapy data
>> connection I'll compare.
>>
>> Do you have some optimization ideas by the way?
>>
>
> First of all, getting rid of the dynamic allocations is low hanging fruit.
>
> Then you'll have to reduce the number of times you recompute the same
> information. Update/restore the possibilities array as you
> update/restore the solution attempts. Do this for the whole board at
> once and use a compact representation of possibilities.
>


Re: Sudoku Py / C++11 / D?

2012-08-16 Thread maarten van damme
> This is because your specific solution is slow.
>
> Mine takes <20ms on the 'hard' puzzle and ~13s on the impossible one.
> (~2.4 GHZ intel x86_64 machine, with gdmd -O -release -inline
-noboundscheck.)
> There is a constant factor between those two solutions.

I've compiled it using dmd on my latitude e5500 which is not that fast so I
don't think it's that slow...

Besides, lets say mine is five times slower, 3000 seconds is still waaay to
much. When I'm back able to get my laptop to use my crapy data connection
I'll compare.

Do you have some optimization ideas by the way?


Re: Sudoku Py / C++11 / D?

2012-08-16 Thread maarten van damme
I've now ran in something odd. Using a slight variant from my program on
dpaste (can't upload modified version atm but changes are minimal) it takes
0.6 seconds to solve the hard puzzle the python version took 180 seconds
for. Yet on the last puzzle, the impossible one, python takes 1800 seconds
to figure out it's impossible yet mine takes over 3885 seconds. Where is
this slowdown coming from?


Re: Sudoku Py / C++11 / D?

2012-08-15 Thread maarten van damme
solving sudoku's well too : http://dpaste.dzfl.pl/903e34b5
I have one question though, how can you make it find all possible solutions?

2012/8/16, Era Scarecrow :
> On Thursday, 16 August 2012 at 01:05:20 UTC, Era Scarecrow wrote:
>> So far having it running it's found over 23k+ combinations
>> after about 3 minutes.
>
>   Unless I introduced a bug... Now I'll have to speed it up to
> make sure and won't take an afternoon to calculate.
>


Re: sorting failed error

2012-07-31 Thread maarten van damme
I now tried to bring it to the next level, using concurrency to bread
a couple of populations and make the best solutions migrate between
them.
But, to use concurrency in D, one has to continually cast between
immutable, cast immutable away, 
Not only that, casting away from immutable (or too, the error message
is not informative at all) you get error's along the line of "opEquals
doesn't work with immutable arguments"...

Why is it that cumbersome? It seems like D took a good idea and ruined
it with all that const-stuff.

I have the feeling that I've completely missed the whole idea on how
concurrency in D should work. Is it normal that you have to either
mess with immutable or with the broken shared?
Am I implementing everything wrong?


Re: sorting failed error

2012-07-30 Thread maarten van damme
2012/7/31 Timon Gehr :
> I realize that the code is just for fun, but I have some comments:
>
> - don't .dup stuff just in order to index directly. it never has
> any effect other than performance degradation. (this could be a
> compiler warning)
>
> - crossOver and mutate mutate their parameters in-place. I assume this
> is by mistake. reproduce effectively inserts every element a couple
> times because of this -- this is why the bug manifests reliably.
> (const, immutable annotations?)
>
> - make use of $
>
> int from=uniform(0,victim.dna.length);
> int to=uniform(0,victim.dna.length);
> swap(victim.dna[from],victim.dna[to]);
>
> =>
>
> swap(victim.dna[uniform(0,$)],
>  victim.dna[uniform(0,$)]);
>
> - sort is in-place
>
> workers=array(sort!(fitnessCompare)(workers));
>
> =>
>
> sort!fitnessCompare(workers)
>
> - mark local functions static if they do not need to access the
> enclosing context.
>
> - use size_t for array iteration variables (if necessary)
>
>
> for(int x=0;x travelled+=distance(cities[x],cities[x+1]);
>
> =>
>
> for(size_t x=1;x travelled+=distance(cities[x-1],cities[x]);
>
> I also removed the subtraction from the array length. This would be
> correct in this case because cities.length>=2 is guaranteed, but it is
> an error prone pattern.
>
> - another way to do it is to drop the loop completely and to use
> ranges instead:
>
> return zip(cities,cities.drop(1))
>   .map!(a=>distance(a.expand))
>   .reduce!"a+b";
>
>
> The benefit is that this is now obviously correct.
>
>
> You might also want to consider not building up the cities array
> and computing the terms at the boundary explicitly instead:
>
> return distance(city(0,0), victim.dna[0]) +
>distance(victim.dna[$-1], city(0,0)) +
>zip(victim.dna, victim.dna.drop(1))
>   .map!(a=>distance(a.expand))
>   .reduce!"a+b";
>
> The goal is to craft the shortest code possible that is still
> efficient and easy to follow.
>
> - type deduction?
>
>
> further comments whose application does not lead to immediate benefit:
>
> - in contracts are better specified in their dedicated section to push
> the requirements onto the caller.
>
> - consider for(;;) as a means for indefinite looping.
>
> - the convention is upper case for type names

Thank you very much for this criticism, I'm relatively new to
programming and these mistakes/points are the kind off things you
can't learn from reading a book or two.

I have one little question about one of the last points though
why use for(;;)?
As far as I can tell this simply reduces readability from while(true).
Is there any reason for this?


Re: sorting failed error

2012-07-30 Thread maarten van damme
monarch_dodra, I'm not trying to order cities, I'm trying to filter
out duplicate's in my dna chromosomes and "==" isn't working on
structs that encapsulates dynamic arrays.

And I can compare elements without defining opCmp. I've written a
function that calculates the distance travelled when going to the
cities according to that dna and sort using that.

It looks like you didn't really get how or what I'm trying to do (I
don't blame you, I'm terrible at explaining things). You should really
look at the code, most things are more obvious there.

Ellery,
When I change it so it uses double


Re: sorting failed error

2012-07-30 Thread maarten van damme
Great, with that workaround everything works correctly now.

I can finally start playing around with my salesman's dna :p

There is one little problem left, the comparing problem. I can't
really define an opcmp because a city isn't smaller or bigger than
another city, it's simply another city. I tried defining opEquals but
it still refuses to work (could be a problem on my end though).

To clear things out: Comparing an array of structs with inside a
dynamic array fails unless you add an opCmp (?or opEquals?) function
to that struct.

I thought comparing failed because the references to those dynamic
arrays were different and that he was comparing references instead of
values.


Re: sorting failed error

2012-07-30 Thread maarten van damme
2012/7/30 bearophile :
> maarten van damme:
>
>
>> I really dislike contracts, they kind off blow your function up while
>> adding not that much. I'll add some unit tests.
>
>
> They make your programs more robust. Contracts are used to spot bugs in your
> code and not to validate data coming from the "outside world".
>
> As most other tools there are few ways to use them well, and many ways to
> use them badly. I suggest you to read about the meaning of Contract
> programming, so maybe you will learn to appreciate them.
>
> Bye,
> bearophile

I certainly will. Andrei's chapter didn't convince me but maybe
reading something more specialized to contract programming
specifically will convince me :)

About my pass-by-value problem, I am not used to working with structs,
I usually work with classes. That's why I completely forgot about
post-blit constructors... Still my sorting problem isn't sorted out.


Re: sorting failed error

2012-07-30 Thread maarten van damme
About float not beeing deterministic, would this behavior also exist
when I use doubles? I've changed everything to use doubles now and the
same error comes up.

My sorting function used < so I guess it can never return on (a,b)
when (b,a) was true. But on the other hand, it can return false twice.
Is it antisymmetric then?

I have a struct that encapsulates an array. Shouldn't that struct get
passed by value? Because right now the array inside that struct get's
passed by reference. How can I circumvent this?

I thought I had the problem at the line
city[] cities=victim.dna

I later on modified cities so it should've been victim.dna.dpu. This
didn't solve the problem however...


Re: sorting failed error

2012-07-30 Thread maarten van damme
it is guaranteed to never be 0 because it always contains all cities
so it will always travel something unless there are no cities or when
all cities are in the same place (in which case the task to solve is
senseless).

I'll create an array containing all finesses and try sorting using that.

And bearophile, you're right. it was supposed to be a very quick
program just for fun to see how powerful genetics can be. (read about
them yesterday.Never looked at a complete implementation and I'm
trying to see how far I'd get with some simple rules. My cross over
function isn't really that good...)

I really dislike contracts, they kind off blow your function up while
adding not that much. I'll add some unit tests.


Re: sorting failed error

2012-07-30 Thread maarten van damme
My cmp is :

bool fitnessCompare(chromosome first,chromosome second){
return fitness(first)>fitness(second);
}

float fitness(chromosome victim){
city[] cities=victim.dna;

//we need to start from home and return to home
cities=city(0,0) ~ cities;
cities~=city(0,0);

float travelled=0f;
for(int x=0;xhttp://pastebin.com/7927Hpv2


sorting failed error

2012-07-30 Thread maarten van damme
For fun I started implementing a program that uses genetics
algorithm's to solve the travelling salesman problem. I want to sort
an array of chromosome structures according to their fitness. I now
get the error:

core.exception.AssertError@C:\D\dmd2\windows\bin\..\..\src\phobos\std\algorithm.
d(6714): Failed to sort range of type chromosome[]. Actual result is: [chromosom
e([city(20, 0), city(25, 25), city(10, 65), city(50, 50), city(75, 30), city(0,
10)]), chromosome([city(10, 65), city(50, 50), city(25, 25), city(75, 30), city(
...

I have no idea what is wrong with my code and the error is not very informative.
Does anyone have any idea as to what the problem could be?

(full code is at
https://dl.dropbox.com/u/15024434/travelling_salesman.d , If it's not
something obvious then I'm going to try to reduce it to something as
small as possible)

Maarten


Re: an enum inside another enum

2012-07-26 Thread maarten van damme
Such a shame that enums do not allow mixins to be made. This
(mixin(EnumInh!First)) would've been an imho way cleaner solution then
declaring your own kind off enum and doing template magic on that.

I still have some problems with Simen's code (the first one, haven't
yet experimented with enumeration.d)
template ExtendEnum(T, string s)
if (is(T == enum) && is(typeof({mixin("enum a {"~s~"}");}))){
mixin(
"enum ExtendEnum {"
~ EnumDefAsString!T() ~ s
~ "}");
}

The newly generated ExtendEnum will try to convert my old enum with
string fields to integer fields. the mixin should generated
"ExtendEnum : string" when passing in an enum with type string. Same
problem apply's to the second line of this sniped. enum a doesn't have
a type yet so it will try to convert everything to ints.


As I seem to run into problems few others have, is my usage of enum's incorrect?


an enum inside another enum

2012-07-26 Thread maarten van damme
Hi, would the response to this question :
http://stackoverflow.com/questions/757684/enum-inheritance be the same
for D?

I have these two enums:
enum first : string{
 a="a",
 b="b"
}

enum second : string{
 a=first.a,
 b=first.b,
 c="c"
}

Is there a way to make this cleaner? I don't mind having something like
second.firstchar.a
with firstchar  beeing a "first" enum.

To do that I would need to tell the enum that it can also use the type
"first" because in the end, that is a string too...


Re: getting to know dmd and druntime

2012-07-23 Thread maarten van damme
2012/7/23 Sean Kelly :
> On Jul 23, 2012, at 3:53 AM, maarten van damme wrote:
>
>> Got some more information here : http://wiki.osdev.org/D_Bare_Bones
>>
>> Any way to do this with dmd? When compiling with -debuglib=none and
>> -defaultlib=none I still get a 31 kb executable so druntime still gets
>> linked in.
>
> That's not druntime.  The smallest an executable has ever been with runtime 
> is ~60 kb, and it's larger than that now.

doesn't druntime get linked in automatically when compiling any D
file? But your right, when I compile a normal empty d file with only a
main method the resulting executable is way bigger.

When I compile with -defaultlib=none and -debuglib=none it now
complains about none.lib not beeing found. How can I link in an empty
.lib?

I did another check to see if druntime was getting linked in by
creating an instantiating a class. It now complains about __d_newclass
not beeing found so druntime really isn't getting linked.


Re: getting to know dmd and druntime

2012-07-23 Thread maarten van damme
I couldn't find anything D-related in the map file. When I compile
without -debuglib=none and -defaultlib=none I also get a 31 kb
executable with the exact same map file. Does he ignore those flags?


Re: getting to know dmd and druntime

2012-07-23 Thread maarten van damme
Got some more information here : http://wiki.osdev.org/D_Bare_Bones

Any way to do this with dmd? When compiling with -debuglib=none and
-defaultlib=none I still get a 31 kb executable so druntime still gets
linked in.


Re: getting to know dmd and druntime

2012-07-22 Thread maarten van damme
2012/7/22 Nick Sabalausky :
> Actually, that's just a clever illusion. Your main() method isn't
> really the first thing called, the first thing called is a function in
> druntime called dmain (or Dmain or _dmain or something like that, I
> forget offhand). This function does all the initial stuff like calling
> all the static/module constructors, initializing druntime including the
> GC, some other stuff, and then actually calling *your* main().
>
> IIRC, this dmain function is in object.d.
>

I've looked and it appears to be in rt/dmain2.d .
Great to know that my main() function isn't the first function called,
this explains a lot for me.

It looks like what I need is a function with the signature
extern (C) int main(int argc, char** argv)
which initializes the garbage collector etc.

To compile it I would need a function with signature
"_Dmodule_ref"
What is this and where does it come from?
(Got this information from
http://www.mail-archive.com/digitalmars-d@puremagic.com/msg89241.html)

I'm trying to compile my file with only extern (C) int main with
-defaultlib=none and -debuglib=none but the resulting executable is 31
kb so I'm pretty sure druntime is still beeing mixed in.


getting to know dmd and druntime

2012-07-22 Thread maarten van damme
Right now I'm a bit confused. I assume that the garbage collector and
some other parts from druntime need startup code. But what gets run
first is my main method in the d file I compile.
Does this mean that the first call to something in druntime calls that
startup code? If not, what does get ran first? how can I intercept
this and run something else?
When compiling without druntime the program will crash when
initializing an object. How can I implement my own limited druntime
that provides it's own version of the new expression?
Druntime contains it's own trimmed down garbage collector that is most
likely not very efficient. How can I use that one instead of the other
more advanced one?
Is the garbage collector embedded in druntime or is it somehow linked
at compile time from a c-source (I found gc.c in the dmd source).
What else gets linked? What exactly does dmd do? Which parts of
druntime does it rely on?

I really want to get to know that part of D a bit better. Is this
somewhere documented?
Ideally I want to compile a d file without druntime (and thus with a
very limited subset of D). Then, I want to start writing my own
version of druntime (that is, providing the needed methods to get
something more advanced working but stubbing everything out).

I came accross this blog
https://www.semitwist.com/articles/article/view/d-on-gba-nds-progress-thanks-to-oopman
but the link to the documentation seems to not be working (and judging
by the date it will most likely be about D1).

To sum everything up : are the inner workings of dmd-druntime
somewhere documented?


how to consume less memory

2012-07-09 Thread maarten van damme
I use a foreach with parallel where I download and process webpages.
Needles to say, this can consume a lot of memory at peak times. I've
noticed the D garbage collector doesn't return the memory when it
isn't needed anymore. Is there any clever way to limit that usage?
Currently it consumes 1 gig but I'm afraid it'll get even higher...


Re: bad unary function

2012-07-03 Thread maarten van damme
Ok, everything works great now.

thank you
maarten


Re: bad unary function

2012-07-03 Thread maarten van damme
Ok, that made sense :)

Now I get a variable with the Result type and this isn't castable or
convertable to an array of strings, how can I extract the actual
result now?


bad unary function

2012-07-03 Thread maarten van damme
I  have an array of structs and I've written a function that takes as
argument a struct (and an array but this is besides the point) and
returns a unique string.

I wanted to use map to retrieve a string array of all unique strings
from that array. I've used it this way:
string [] added=map!("toName(a,parsedschema)")(mod.added);

But I get a compilation error:

bad unary function : toName(a,parsedschema) for type randomStruct.

Is my usage of map wrong?
what's the compiler trying to explain?


Re: Concurrency in D

2012-06-28 Thread maarten van damme
yeah, I didn't knew std.parallelism was so easy to use. Speed up was
really big for minimal effort.


Re: how to handle shared arrays?

2012-06-22 Thread maarten van damme
Well, maybe idup is a bit better then assumeuniqe.
I don't work anymore with that mutable array on the workerthread but
using idup is in all cases allowed and cannot cause subtle bugs like
me reusing a mutable array that I've casted to immutable and send over
to another thread.
It's a shame that shared doesn't (yet) work, It looks a bit "dirty" to
convert to immutable and back to mutable simply to pass it over to
another thread...


Re: how to handle shared arrays?

2012-06-21 Thread maarten van damme
Oh thank god, this helps soo much. Now I can finally do away with all
those ugly shared casts and variables in my other toy code involving
threads.
It works like a charm, great.


how to handle shared arrays?

2012-06-21 Thread maarten van damme
I want to have two threads. One parses some content ever half hour and
the other continuously parses commands passed from the first thread.
When the second thread finished something it should send the results
back to the first thread who'll present it to the user.
The messages the second thread needs to send back is under the form of
an array of a struct.

Right now I'm trying something like this:
shared (T[]) mods=cast(shared (T[]))modifications.dup;
send(tid, mods);

This gives me a rather odd-looking errormessage:
C:\D\dmd2\windows\bin\..\..\src\phobos\std\variant.d(528): Error: function core.
stdc.string.memcpy (void* s1, const(void*) s2, uint n) is not callable using arg
ument types (ubyte[20u]*,shared(T[])*,uint)
C:\D\dmd2\windows\bin\..\..\src\phobos\std\variant.d(528): Error: cannot implici
tly convert expression (& rhs) of type shared(T[])* to const(
void*)

How should I handle arrays that I will need to send back to another thread?
Excuse me for all those questions, I'm really having a hard time
grasping the D threading model.


Re: sorting associative array's keys by values

2012-06-18 Thread maarten van damme
and something I forgot to ask, is it a conscious decision to not print
out fired asserts in treads? Normally when an assert fails my whole
program crashes and I can see what went wrong. With treads however, it
quietly dies.


Re: sorting associative array's keys by values

2012-06-18 Thread maarten van damme
Everything turned out to be problems with \r \n.
The treading system worked perfectly (although I still don't
understand how one can use immutable and receiveonly).


Re: sorting associative array's keys by values

2012-06-17 Thread maarten van damme
another problem, when I do use shared.
My code is
int amountTreads = 20;
if(upperLimit-lowerLimit

Re: sorting associative array's keys by values

2012-06-17 Thread maarten van damme
Ok, everything worked (nearly perfect). Sometimes the webpage gets
completely messed up  ("<" changes to d134 or something like that) but
the tests handle it rather well.
That's why I decided to improve it a bit and use treads. I've always
been afraid of d treads because I never really got the grasp of that
message passing system but hey, there is a first time for everything.
Maybe I was a bit optimistic as I now already run into troubles.

I have two arrays of the form
int[string]

To pass them from the spawned function back to the spawner I wanted to use
tid.send( array1,array2);

This was illegal, they have to be either immutable or shared. I've
read somwhere that D tries to avoid shared where possible (with that
message passing system) so I went for immutable and changed it over to
tid.send(cast(immutable(int[string]))array1,...) (you get the idea)

Not only does this look ugly, it's looks like what I'm doing isn't
really correct.
But anyway, onto the next part, receiving it.

I used
auto msg=receiveOnly!(int[string],int[string]);

of course this fails because I send immutable items and want to receive mutables
I then changed it to
auto msg=receiveOnly!(immutable int[string],immutable int[string]);

Compilation now fails with the very informative
C:\D\dmd2\windows\bin\..\..\src\phobos\std\concurrency.d(612): Error: can only i
nitialize const member _field_field_0 inside constructor
C:\D\dmd2\windows\bin\..\..\src\phobos\std\concurrency.d(612): Error: can only i
nitialize const member _field_field_1 inside constructor

Why is treading made so damn hard?
what have I done wrong now?


Re: sorting associative array's keys by values

2012-06-17 Thread maarten van damme
well, the page I parse is automatically generated and thus allways
contains . (if the page completely downloaded which it didn't).
The second error I found (my mistake) is that newlines get scrambled
up severely when downloading the page causing the markers I try to
find to sometimes break down on two different lines. replacechars from
std.string crashed too with the error "invalid utf sequence". Now I
use std.array's replace and everything (appears) to be working.


If only I'd learned regex, I think that would've saved me quite some time.


Re: sorting associative array's keys by values

2012-06-16 Thread maarten van damme
It should allways contain  so it has more then 2 elements and
there is a note section that starts with "

  1   2   >