
Boost : 
Subject: Re: [boost] A question about Units & Spirit
From: Daniel J. Duffy (dduffy_at_[hidden])
Date: 20090615 15:04:58
Thanks, John
So I can just reply from here? Hope I'm doing it right this time :)
testing, testing..
Daniel
________________________________
From: boostbounces_at_[hidden] on behalf of John Phillips
Sent: Mon 08062009 21:59
To: boost_at_[hidden]
Subject: [boost] A question about Units & Spirit
In the middle of the directX thread, Daniel Duffy asked a question
that seems more suited to its own thread. I'm starting that thread and
giving others a chance to join into the discussion by giving you the
content of the few messages that have passed by so far.
John
From Daniel 
Hello,
This is my first mail, so I hope I have sent it to the right address :)
I am using the Units library for Dimensional Analysis. So far it is very
useful. Up till now I am using it in a hardcoded/compile time way as in
a test.cpp.
My inteterst is in using Units as part of a larger runtime system so I
need some way of making my code more flexible. Lambda library is an
option here but I would also like to create units and quanties from
string input as well as being able to parse these strings to units and
then store the units in a database.
Can I use Spirit (and Serialization) for these features? Maybe the
functionality already exist, and I have not found it.
best regrads
Daniel J. Duffy
From Hartmut 
Sure Spirit is your friend for all parsing and output generation needs.
What did you have in mind?
Regards Hartmut
From Daniel 
Hartmut,
I would like to generate wellformed units and create expressions of the
followiong kinds:
Examples of unit expressions:
1. 2m + 15m*32s/16s = 32m.
2. 3m*7s + 2m*10s/5m = 21m + 4s > ERROR. Can't add meters to
seconds.
The second group looks more tricky.
Examples of simplification:
1. (x2)2 + 4x2  2^x + 1 = 5x2  8x + 10
2. x2 + 7x + 10 = (x + 2)(x + 5)
3. (a + b)(a  b) = a2  b2
4. sin(x)2 + cos(x)2 = 1
5. 2sin(x)cos(x) = sin(2x)
One tricky part is for example #5 where the code needs to 'know'
trigonometry.
best regards
Daniel
From John 
Daniel J. Duffy wrote:
> Hartmut,
> I would like to generate wellformed units and create expressions of
the followiong kinds:
>
> Examples of unit expressions: 1. 2m + 15m*32s/16s = 32m. 2.
3m*7s + 2m*10s/5m = 21m + 4s > ERROR. Can't add meters to seconds.
So, you want this to happen at run time, or at compile time? At
compile time, I think you are already set with the Units library. At run
time, there are examples with the library that would help.
If parsing the input is your concern, then Spirit is a good choice.
(Spirit 2 is even better, by the way.)
Using the two together, you could write a program where a user enters
your example lines and gets correct responses.
>
> The second group looks more tricky.
>
> Examples of simplification: 1. (x2)2 + 4x2  2^x + 1 = 5x2 
8x + 10 2. x2 + 7x + 10 = (x + 2)(x + 5) 3. (a + b)(a  b) =
a2  b2 4. sin(x)2 + cos(x)2 = 1 5. 2sin(x)cos(x) = sin(2x)
> One tricky part is for example #5 where the code needs to 'know'
trigonometry.
As far as I can tell here, you are looking for a program that does
symbolic algebra. If that is true, then I don't think boost has a
complete solution for you.
Writing the parser for the input with Spirit wouldn't be that bad,
but writing the processing engine that matches patterns and does
simplifications is not covered by any current Boost libraries. I don't
recall seeing anyone poll for interest on this, so I don't think there
is even a partial library in the sandbox.
Would you want this at run time, compile time, both? I haven't tried
to write it, but I think a pure compile time implementation would be
prohibitively slow. For a pure run time solution, you might consider
linking to already existing solutions, such as Maple or Mathematica.
>
> best regards
>
> Daniel
>
John
_______________________________________________
Unsubscribe & other changes: http://lists.boost.org/mailman/listinfo.cgi/boost
Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk