On 31 Aug 2009, at 8:02 PM, Igor Peshansky wrote:
> Jim LaGrone <[email protected]> wrote on 08/31/2009 05:10:30 PM:
>
>> On 31 Aug 2009, at 11:10 AM, Igor Peshansky wrote:
>>
>>>> tmp_fs_real and tmp_fs_image are Rails[Double].
>>>>
>>>> val real = tmp_fs_real;
>>>> val image = tmp_fs_image;
>>>>
>>>> val Mc_tmp = Mc; //just made this change
>>>> val N_tmp = N; // and this one
>>>> regionS = [0..N_tmp-1, 0..Mc_tmp-1];
>>>> distS = Dist.makeBlock(regionS,0);
>>>> S = Array.make[Complex](distS,
>>>> (val (i,j):Point) => new Complex ( real(i*Mc_tmp+j), image
>>>> (i*Mc_tmp+j) ) );
>>>
>>> Ah. I kept thinking of real() and image() as functions, but they
>>> are, in fact, Rails... That would explain it: Rails are objects,
>>> and thus live in the place they were created. So, accessing them
>>> from another place will give you a BadPlaceException.
>>>
>>> One possible solution is to make them ValRails (if the algorithm
>>> allows this). Another is to send the relevant bits using ValRails
>>> into other Rails that live in the appropriate places.
>>
>>
>> Here's what I have:
>>
>> The values of tmp_fs_real and tmp_fs_image are read from a file. I
>> then need to pair up each tmp_fs_real(n) with tmp_fs_image(n) for S
>> (n).
>>
>> try{
>> inputStream = new FileReader( new File(file_path) );
>>
>> tmp_fs_real = Rail.makeVal[Double](Mc*N, (i:int) => 0.0);
>> tmp_fs_imag = Rail.makeVal[Double](Mc*N, (i:int) => 0.0);
>> for (i = 0; i < Mc*N; i++){
>> tmp_fs_real(i) = inputStream.read( LSB.DOUBLE );
>> }
>> for (i = 0; i < Mc*N; i++){
>> tmp_fs_imag(i) = inputStream.read( LSB.DOUBLE );
>> }
>> inputStream.close();
>>
>> val real = tmp_fs_real;
>> val imag = tmp_fs_imag;
>> /*simulated SAR signal array*/
>>
>> val Mc_tmp = Mc;
>> val N_tmp = N;
>> regionS = [0..N_tmp-1, 0..Mc_tmp-1];
>> distS = Dist.makeBlock(regionS,0);
>>
>> S = Array.make[Complex](distS,
>> (val (i,j):Point) => new Complex ( real(i*Mc_tmp+j), imag
>> (i*Mc_tmp+j) ) );
>>
>> I will eventually use FFT on S, which is where the work is, so I
>> assume S should be distributed for the work. The API for Rail makes
>> it
>> look like makeVal() returns a ValRail. The above code still throws
>> the
>> BPException.
>
> Rail.makeVal() does indeed return a ValRail, but you did not show the
> type of tmp_fs_real. If you declared it to have the type Rail, then
> X10 will coerce the ValRail from the call to Rail.makeVal() into a
> Rail (by creating a new Rail and copying the values). So you are
> really accessing a Rail in your loop.
>
> Note that if you did declare it as a ValRail, you would not have been
> able to execute this line:
>
>> tmp_fs_real(i) = inputStream.read( LSB.DOUBLE );
>
> because setting elements is not supported by a ValRail.
>
> What you could do is this:
>
>> val real = tmp_fs_real as ValRail[Double];
>> val imag = tmp_fs_imag as ValRail[Double];
>
> or
>
>> val real : ValRail[Double] = tmp_fs_real;
>> val imag : ValRail[Double] = tmp_fs_imag;
>
> The above will convert the Rails to ValRails, and thus make them
> available in all places.
>
> Note that you could also do the following:
>
>> val inputStream = new FileReader( new File(file_path) );
>> val real = Rail.makeVal[Double](Mc*N, (i:int) =>
> inputStream.read( LSB.DOUBLE ));
>> val imag = Rail.makeVal[Double](Mc*N, (i:int) =>
> inputStream.read( LSB.DOUBLE ));
>> inputStream.close();
>
> (i.e., use the initializer again).
>
> Note, however, that you'll be sending both ValRails to all places.
> Since you only use a part of the data in each place, you could
> capture only the relevant data in each place, by computing the
> range of indexes used in each place. To do that, though, you
> would have to forgo the convenient initializer syntax.
I tried the initializers above with this result using the Java backend:
$ x10c -commandlineonly -d ../bin *.x10
x10c: ----------
1. ERROR in ../bin/State.java (at line 601)
return (inputStream1).<java.lang.Double>read
(x10.types.Types.DOUBLE,
LSB.DOUBLE);
^
^
^
^
^
^
^
^
^
^
^
^
^
^
^
^
^
^
^
^
^
^
^
^
^
^
^
^
^
^
^
^
^
^
^
^
^
^
^
^
^
^
^
^
^
^
^
^
^
^
^
^
^
^
^
^
^
^
^
^
^
^
^
^
^
^
^
^
^
^
^
^
^
^
^
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Unhandled exception type IOException
----------
2. ERROR in ../bin/State.java (at line 613)
return (inputStream1).<java.lang.Double>read
(x10.types.Types.DOUBLE,
LSB.DOUBLE);
^
^
^
^
^
^
^
^
^
^
^
^
^
^
^
^
^
^
^
^
^
^
^
^
^
^
^
^
^
^
^
^
^
^
^
^
^
^
^
^
^
^
^
^
^
^
^
^
^
^
^
^
^
^
^
^
^
^
^
^
^
^
^
^
^
^
^
^
^
^
^
^
^
^
^
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Unhandled exception type IOException
----------
2 problems (2 errors)
x10c: Non-zero return code: 255
2 errors.
I have a try-catch, so I don't know what's going on here. Here's my
code:
try{
val inputStream1 = new FileReader( new File(file_path) );
//these ValRails will be at each place;
//could optimize by distributing
val tmp_fs_real = Rail.makeVal[Double](Mc*N,
(i:int) => inputStream1.read( LSB.DOUBLE ));
val tmp_fs_imag = Rail.makeVal[Double](Mc*N,
(i:int) => inputStream1.read( LSB.DOUBLE ));
inputStream1.close();
/*simulated SAR signal array*/
val Mc_tmp = Mc;
val N_tmp = N;
regionS = [0..N_tmp-1, 0..Mc_tmp-1];
distS = Dist.makeBlock(regionS,0);
S = Array.make[Complex](distS,
(val (i,j):Point) => new Complex ( tmp_fs_real(i*Mc_tmp+j),
tmp_fs_imag(i*Mc_tmp+j) ) );
....
}
catch( ioe: IOException ) {
ioe.printStackTrace(Console.ERR);
System.exit(1);
}
Thanks for all the help.
Jim
------------------------------------------------------------------------------
Let Crystal Reports handle the reporting - Free Crystal Reports 2008 30-Day
trial. Simplify your report design, integration and deployment - and focus on
what you do best, core application coding. Discover what's new with
Crystal Reports now. http://p.sf.net/sfu/bobj-july
_______________________________________________
X10-users mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/x10-users