<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html lang="en">
<head>
<title>Source code</title>
<link rel="stylesheet" type="text/css" href="../../../../../stylesheet.css" title="Style">
</head>
<body>
<div class="sourceContainer">
<pre><span class="sourceLineNo">001</span>/*-<a name="line.1"></a>
<span class="sourceLineNo">002</span> *******************************************************************************<a name="line.2"></a>
<span class="sourceLineNo">003</span> * Copyright (c) 2011, 2016 Diamond Light Source Ltd.<a name="line.3"></a>
<span class="sourceLineNo">004</span> * All rights reserved. This program and the accompanying materials<a name="line.4"></a>
<span class="sourceLineNo">005</span> * are made available under the terms of the Eclipse Public License v1.0<a name="line.5"></a>
<span class="sourceLineNo">006</span> * which accompanies this distribution, and is available at<a name="line.6"></a>
<span class="sourceLineNo">007</span> * http://www.eclipse.org/legal/epl-v10.html<a name="line.7"></a>
<span class="sourceLineNo">008</span> *<a name="line.8"></a>
<span class="sourceLineNo">009</span> * Contributors:<a name="line.9"></a>
<span class="sourceLineNo">010</span> *    Peter Chang - initial API and implementation and/or initial documentation<a name="line.10"></a>
<span class="sourceLineNo">011</span> *******************************************************************************/<a name="line.11"></a>
<span class="sourceLineNo">012</span><a name="line.12"></a>
<span class="sourceLineNo">013</span>// This is generated from DoubleDataset.java by fromdouble.py<a name="line.13"></a>
<span class="sourceLineNo">014</span><a name="line.14"></a>
<span class="sourceLineNo">015</span>package org.eclipse.january.dataset;<a name="line.15"></a>
<span class="sourceLineNo">016</span><a name="line.16"></a>
<span class="sourceLineNo">017</span>import java.util.ArrayList;<a name="line.17"></a>
<span class="sourceLineNo">018</span>import java.util.Arrays;<a name="line.18"></a>
<span class="sourceLineNo">019</span>import java.util.List;<a name="line.19"></a>
<span class="sourceLineNo">020</span>import java.util.Set;<a name="line.20"></a>
<span class="sourceLineNo">021</span>import java.util.TreeSet;<a name="line.21"></a>
<span class="sourceLineNo">022</span><a name="line.22"></a>
<span class="sourceLineNo">023</span>import org.apache.commons.math3.complex.Complex;<a name="line.23"></a>
<span class="sourceLineNo">024</span>import org.eclipse.january.metadata.StatisticsMetadata;<a name="line.24"></a>
<span class="sourceLineNo">025</span><a name="line.25"></a>
<span class="sourceLineNo">026</span><a name="line.26"></a>
<span class="sourceLineNo">027</span>/**<a name="line.27"></a>
<span class="sourceLineNo">028</span> * Extend dataset for long values // PRIM_TYPE<a name="line.28"></a>
<span class="sourceLineNo">029</span> */<a name="line.29"></a>
<span class="sourceLineNo">030</span>public class LongDataset extends AbstractDataset {<a name="line.30"></a>
<span class="sourceLineNo">031</span>        // pin UID to base class<a name="line.31"></a>
<span class="sourceLineNo">032</span>        private static final long serialVersionUID = Dataset.serialVersionUID;<a name="line.32"></a>
<span class="sourceLineNo">033</span><a name="line.33"></a>
<span class="sourceLineNo">034</span>        protected long[] data; // subclass alias // PRIM_TYPE<a name="line.34"></a>
<span class="sourceLineNo">035</span><a name="line.35"></a>
<span class="sourceLineNo">036</span>        @Override<a name="line.36"></a>
<span class="sourceLineNo">037</span>        protected void setData() {<a name="line.37"></a>
<span class="sourceLineNo">038</span>                data = (long[]) odata; // PRIM_TYPE<a name="line.38"></a>
<span class="sourceLineNo">039</span>        }<a name="line.39"></a>
<span class="sourceLineNo">040</span><a name="line.40"></a>
<span class="sourceLineNo">041</span>        protected static long[] createArray(final int size) { // PRIM_TYPE<a name="line.41"></a>
<span class="sourceLineNo">042</span>                long[] array = null; // PRIM_TYPE<a name="line.42"></a>
<span class="sourceLineNo">043</span><a name="line.43"></a>
<span class="sourceLineNo">044</span>                try {<a name="line.44"></a>
<span class="sourceLineNo">045</span>                        array = new long[size]; // PRIM_TYPE<a name="line.45"></a>
<span class="sourceLineNo">046</span>                } catch (OutOfMemoryError e) {<a name="line.46"></a>
<span class="sourceLineNo">047</span>                        logger.error("The size of the dataset ({}) that is being created is too large "<a name="line.47"></a>
<span class="sourceLineNo">048</span>                                        + "and there is not enough memory to hold it.", size);<a name="line.48"></a>
<span class="sourceLineNo">049</span>                        throw new OutOfMemoryError("The dimensions given are too large, and there is "<a name="line.49"></a>
<span class="sourceLineNo">050</span>                                        + "not enough memory available in the Java Virtual Machine");<a name="line.50"></a>
<span class="sourceLineNo">051</span>                }<a name="line.51"></a>
<span class="sourceLineNo">052</span>                return array;<a name="line.52"></a>
<span class="sourceLineNo">053</span>        }<a name="line.53"></a>
<span class="sourceLineNo">054</span><a name="line.54"></a>
<span class="sourceLineNo">055</span>        @Override<a name="line.55"></a>
<span class="sourceLineNo">056</span>        public int getDType() {<a name="line.56"></a>
<span class="sourceLineNo">057</span>                return INT64; // DATA_TYPE<a name="line.57"></a>
<span class="sourceLineNo">058</span>        }<a name="line.58"></a>
<span class="sourceLineNo">059</span><a name="line.59"></a>
<span class="sourceLineNo">060</span>        /**<a name="line.60"></a>
<span class="sourceLineNo">061</span>         * Create a null dataset<a name="line.61"></a>
<span class="sourceLineNo">062</span>         */<a name="line.62"></a>
<span class="sourceLineNo">063</span>        LongDataset() {<a name="line.63"></a>
<span class="sourceLineNo">064</span>        }<a name="line.64"></a>
<span class="sourceLineNo">065</span><a name="line.65"></a>
<span class="sourceLineNo">066</span>        /**<a name="line.66"></a>
<span class="sourceLineNo">067</span>         * Create a zero-filled dataset of given shape<a name="line.67"></a>
<span class="sourceLineNo">068</span>         * @param shape<a name="line.68"></a>
<span class="sourceLineNo">069</span>         */<a name="line.69"></a>
<span class="sourceLineNo">070</span>        LongDataset(final int... shape) {<a name="line.70"></a>
<span class="sourceLineNo">071</span>                if (shape != null) {<a name="line.71"></a>
<span class="sourceLineNo">072</span>                        size = ShapeUtils.calcSize(shape);<a name="line.72"></a>
<span class="sourceLineNo">073</span>                        this.shape = shape.clone();<a name="line.73"></a>
<span class="sourceLineNo">074</span><a name="line.74"></a>
<span class="sourceLineNo">075</span>                        try {<a name="line.75"></a>
<span class="sourceLineNo">076</span>                                odata = data = createArray(size);<a name="line.76"></a>
<span class="sourceLineNo">077</span>                        } catch (Throwable t) {<a name="line.77"></a>
<span class="sourceLineNo">078</span>                                logger.error("Could not create a dataset of shape {}", Arrays.toString(shape), t);<a name="line.78"></a>
<span class="sourceLineNo">079</span>                                throw new IllegalArgumentException(t);<a name="line.79"></a>
<span class="sourceLineNo">080</span>                        }<a name="line.80"></a>
<span class="sourceLineNo">081</span>                }<a name="line.81"></a>
<span class="sourceLineNo">082</span>        }<a name="line.82"></a>
<span class="sourceLineNo">083</span><a name="line.83"></a>
<span class="sourceLineNo">084</span>        /**<a name="line.84"></a>
<span class="sourceLineNo">085</span>         * Create a dataset using given data<a name="line.85"></a>
<span class="sourceLineNo">086</span>         * @param data<a name="line.86"></a>
<span class="sourceLineNo">087</span>         * @param shape<a name="line.87"></a>
<span class="sourceLineNo">088</span>         *            (can be null to create 1D dataset)<a name="line.88"></a>
<span class="sourceLineNo">089</span>         */<a name="line.89"></a>
<span class="sourceLineNo">090</span>        LongDataset(final long[] data, int... shape) { // PRIM_TYPE<a name="line.90"></a>
<span class="sourceLineNo">091</span>                if (data == null) {<a name="line.91"></a>
<span class="sourceLineNo">092</span>                        throw new IllegalArgumentException("Data must not be null");<a name="line.92"></a>
<span class="sourceLineNo">093</span>                }<a name="line.93"></a>
<span class="sourceLineNo">094</span>                if (shape == null || shape.length == 0) {<a name="line.94"></a>
<span class="sourceLineNo">095</span>                        shape = new int[] { data.length };<a name="line.95"></a>
<span class="sourceLineNo">096</span>                }<a name="line.96"></a>
<span class="sourceLineNo">097</span>                size = ShapeUtils.calcSize(shape);<a name="line.97"></a>
<span class="sourceLineNo">098</span>                if (size != data.length) {<a name="line.98"></a>
<span class="sourceLineNo">099</span>                        throw new IllegalArgumentException(String.format("Shape %s is not compatible with size of data array, %d",<a name="line.99"></a>
<span class="sourceLineNo">100</span>                                        Arrays.toString(shape), data.length));<a name="line.100"></a>
<span class="sourceLineNo">101</span>                }<a name="line.101"></a>
<span class="sourceLineNo">102</span>                this.shape = size == 0 ? null : shape.clone();<a name="line.102"></a>
<span class="sourceLineNo">103</span><a name="line.103"></a>
<span class="sourceLineNo">104</span>                odata = this.data = data;<a name="line.104"></a>
<span class="sourceLineNo">105</span>        }<a name="line.105"></a>
<span class="sourceLineNo">106</span><a name="line.106"></a>
<span class="sourceLineNo">107</span>        /**<a name="line.107"></a>
<span class="sourceLineNo">108</span>         * Copy a dataset<a name="line.108"></a>
<span class="sourceLineNo">109</span>         * @param dataset<a name="line.109"></a>
<span class="sourceLineNo">110</span>         */<a name="line.110"></a>
<span class="sourceLineNo">111</span>        LongDataset(final LongDataset dataset) {<a name="line.111"></a>
<span class="sourceLineNo">112</span>                copyToView(dataset, this, true, true);<a name="line.112"></a>
<span class="sourceLineNo">113</span><a name="line.113"></a>
<span class="sourceLineNo">114</span>                try {<a name="line.114"></a>
<span class="sourceLineNo">115</span>                        if (dataset.stride == null) {<a name="line.115"></a>
<span class="sourceLineNo">116</span>                                if (dataset.data != null) {<a name="line.116"></a>
<span class="sourceLineNo">117</span>                                        odata = data = dataset.data.clone();<a name="line.117"></a>
<span class="sourceLineNo">118</span>                                }<a name="line.118"></a>
<span class="sourceLineNo">119</span>                        } else {<a name="line.119"></a>
<span class="sourceLineNo">120</span>                                offset = 0;<a name="line.120"></a>
<span class="sourceLineNo">121</span>                                stride = null;<a name="line.121"></a>
<span class="sourceLineNo">122</span>                                base = null;<a name="line.122"></a>
<span class="sourceLineNo">123</span>                                odata = data = createArray(size);<a name="line.123"></a>
<span class="sourceLineNo">124</span><a name="line.124"></a>
<span class="sourceLineNo">125</span>                                IndexIterator iter = dataset.getIterator();<a name="line.125"></a>
<span class="sourceLineNo">126</span>                                for (int i = 0; iter.hasNext(); i++) {<a name="line.126"></a>
<span class="sourceLineNo">127</span>                                        data[i] = dataset.data[iter.index];<a name="line.127"></a>
<span class="sourceLineNo">128</span>                                }<a name="line.128"></a>
<span class="sourceLineNo">129</span>                        }<a name="line.129"></a>
<span class="sourceLineNo">130</span>                } catch (Throwable t) {<a name="line.130"></a>
<span class="sourceLineNo">131</span>                        logger.error("Could not create a dataset of shape {}", Arrays.toString(shape), t);<a name="line.131"></a>
<span class="sourceLineNo">132</span>                        throw new IllegalArgumentException(t);<a name="line.132"></a>
<span class="sourceLineNo">133</span>                }<a name="line.133"></a>
<span class="sourceLineNo">134</span>        }<a name="line.134"></a>
<span class="sourceLineNo">135</span><a name="line.135"></a>
<span class="sourceLineNo">136</span>        /**<a name="line.136"></a>
<span class="sourceLineNo">137</span>         * Copy and cast a dataset to this class type<a name="line.137"></a>
<span class="sourceLineNo">138</span>         * @param dataset<a name="line.138"></a>
<span class="sourceLineNo">139</span>         */<a name="line.139"></a>
<span class="sourceLineNo">140</span>        LongDataset(final Dataset dataset) {<a name="line.140"></a>
<span class="sourceLineNo">141</span>                copyToView(dataset, this, true, false);<a name="line.141"></a>
<span class="sourceLineNo">142</span>                offset = 0;<a name="line.142"></a>
<span class="sourceLineNo">143</span>                stride = null;<a name="line.143"></a>
<span class="sourceLineNo">144</span>                base = null;<a name="line.144"></a>
<span class="sourceLineNo">145</span>                try {<a name="line.145"></a>
<span class="sourceLineNo">146</span>                        odata = data = createArray(size);<a name="line.146"></a>
<span class="sourceLineNo">147</span>                } catch (Throwable t) {<a name="line.147"></a>
<span class="sourceLineNo">148</span>                        logger.error("Could not create a dataset of shape {}", Arrays.toString(shape), t);<a name="line.148"></a>
<span class="sourceLineNo">149</span>                        throw new IllegalArgumentException(t);<a name="line.149"></a>
<span class="sourceLineNo">150</span>                }<a name="line.150"></a>
<span class="sourceLineNo">151</span>                IndexIterator iter = dataset.getIterator();<a name="line.151"></a>
<span class="sourceLineNo">152</span>                for (int i = 0; iter.hasNext(); i++) {<a name="line.152"></a>
<span class="sourceLineNo">153</span>                        data[i] = dataset.getElementLongAbs(iter.index); // GET_ELEMENT_WITH_CAST<a name="line.153"></a>
<span class="sourceLineNo">154</span>                }<a name="line.154"></a>
<span class="sourceLineNo">155</span>        }<a name="line.155"></a>
<span class="sourceLineNo">156</span><a name="line.156"></a>
<span class="sourceLineNo">157</span>        @Override<a name="line.157"></a>
<span class="sourceLineNo">158</span>        public boolean equals(Object obj) {<a name="line.158"></a>
<span class="sourceLineNo">159</span>                if (this == obj) {<a name="line.159"></a>
<span class="sourceLineNo">160</span>                        return true;<a name="line.160"></a>
<span class="sourceLineNo">161</span>                }<a name="line.161"></a>
<span class="sourceLineNo">162</span><a name="line.162"></a>
<span class="sourceLineNo">163</span>                if (obj == null) {<a name="line.163"></a>
<span class="sourceLineNo">164</span>                        return false;<a name="line.164"></a>
<span class="sourceLineNo">165</span>                }<a name="line.165"></a>
<span class="sourceLineNo">166</span><a name="line.166"></a>
<span class="sourceLineNo">167</span>                if (!getClass().equals(obj.getClass())) {<a name="line.167"></a>
<span class="sourceLineNo">168</span>                        if (getRank() == 0) { // for zero-rank datasets<a name="line.168"></a>
<span class="sourceLineNo">169</span>                                return obj.equals(getObjectAbs(offset));<a name="line.169"></a>
<span class="sourceLineNo">170</span>                        }<a name="line.170"></a>
<span class="sourceLineNo">171</span>                        return false;<a name="line.171"></a>
<span class="sourceLineNo">172</span>                }<a name="line.172"></a>
<span class="sourceLineNo">173</span><a name="line.173"></a>
<span class="sourceLineNo">174</span>                LongDataset other = (LongDataset) obj;<a name="line.174"></a>
<span class="sourceLineNo">175</span>                if (size != other.size) {<a name="line.175"></a>
<span class="sourceLineNo">176</span>                        return false;<a name="line.176"></a>
<span class="sourceLineNo">177</span>                }<a name="line.177"></a>
<span class="sourceLineNo">178</span>                if (!Arrays.equals(shape, other.shape)) {<a name="line.178"></a>
<span class="sourceLineNo">179</span>                        return false;<a name="line.179"></a>
<span class="sourceLineNo">180</span>                }<a name="line.180"></a>
<span class="sourceLineNo">181</span>                if (data == other.data &amp;&amp; stride == null &amp;&amp; other.stride == null) {<a name="line.181"></a>
<span class="sourceLineNo">182</span>                        return true;<a name="line.182"></a>
<span class="sourceLineNo">183</span>                }<a name="line.183"></a>
<span class="sourceLineNo">184</span><a name="line.184"></a>
<span class="sourceLineNo">185</span>                IndexIterator iter = getIterator();<a name="line.185"></a>
<span class="sourceLineNo">186</span>                IndexIterator oiter = other.getIterator();<a name="line.186"></a>
<span class="sourceLineNo">187</span>                while (iter.hasNext() &amp;&amp; oiter.hasNext()) {<a name="line.187"></a>
<span class="sourceLineNo">188</span>                        if (data[iter.index] != other.data[oiter.index]) { // OBJECT_UNEQUAL<a name="line.188"></a>
<span class="sourceLineNo">189</span>                                return false;<a name="line.189"></a>
<span class="sourceLineNo">190</span>                        }<a name="line.190"></a>
<span class="sourceLineNo">191</span>                }<a name="line.191"></a>
<span class="sourceLineNo">192</span>                return true;<a name="line.192"></a>
<span class="sourceLineNo">193</span>        }<a name="line.193"></a>
<span class="sourceLineNo">194</span><a name="line.194"></a>
<span class="sourceLineNo">195</span>        @Override<a name="line.195"></a>
<span class="sourceLineNo">196</span>        public int hashCode() {<a name="line.196"></a>
<span class="sourceLineNo">197</span>                return super.hashCode();<a name="line.197"></a>
<span class="sourceLineNo">198</span>        }<a name="line.198"></a>
<span class="sourceLineNo">199</span><a name="line.199"></a>
<span class="sourceLineNo">200</span>        @Override<a name="line.200"></a>
<span class="sourceLineNo">201</span>        public LongDataset clone() {<a name="line.201"></a>
<span class="sourceLineNo">202</span>                return new LongDataset(this);<a name="line.202"></a>
<span class="sourceLineNo">203</span>        }<a name="line.203"></a>
<span class="sourceLineNo">204</span><a name="line.204"></a>
<span class="sourceLineNo">205</span>        /**<a name="line.205"></a>
<span class="sourceLineNo">206</span>         * Create a dataset from an object which could be a Java list, array (of arrays...) or Number. Ragged<a name="line.206"></a>
<span class="sourceLineNo">207</span>         * sequences or arrays are padded with zeros.<a name="line.207"></a>
<span class="sourceLineNo">208</span>         *<a name="line.208"></a>
<span class="sourceLineNo">209</span>         * @param obj<a name="line.209"></a>
<span class="sourceLineNo">210</span>         * @return dataset with contents given by input<a name="line.210"></a>
<span class="sourceLineNo">211</span>         */<a name="line.211"></a>
<span class="sourceLineNo">212</span>        static LongDataset createFromObject(final Object obj) {<a name="line.212"></a>
<span class="sourceLineNo">213</span>                LongDataset result = new LongDataset();<a name="line.213"></a>
<span class="sourceLineNo">214</span><a name="line.214"></a>
<span class="sourceLineNo">215</span>                if (obj != null) {<a name="line.215"></a>
<span class="sourceLineNo">216</span>                        result.shape = ShapeUtils.getShapeFromObject(obj);<a name="line.216"></a>
<span class="sourceLineNo">217</span>                        result.size = ShapeUtils.calcSize(result.shape);<a name="line.217"></a>
<span class="sourceLineNo">218</span><a name="line.218"></a>
<span class="sourceLineNo">219</span>                        try {<a name="line.219"></a>
<span class="sourceLineNo">220</span>                                result.odata = result.data = createArray(result.size);<a name="line.220"></a>
<span class="sourceLineNo">221</span>                        } catch (Throwable t) {<a name="line.221"></a>
<span class="sourceLineNo">222</span>                                logger.error("Could not create a dataset of shape {}", Arrays.toString(result.shape), t);<a name="line.222"></a>
<span class="sourceLineNo">223</span>                                throw new IllegalArgumentException(t);<a name="line.223"></a>
<span class="sourceLineNo">224</span>                        }<a name="line.224"></a>
<span class="sourceLineNo">225</span><a name="line.225"></a>
<span class="sourceLineNo">226</span>                        int[] pos = new int[result.shape.length];<a name="line.226"></a>
<span class="sourceLineNo">227</span>                        result.fillData(obj, 0, pos);<a name="line.227"></a>
<span class="sourceLineNo">228</span>                }<a name="line.228"></a>
<span class="sourceLineNo">229</span><a name="line.229"></a>
<span class="sourceLineNo">230</span>                return result;<a name="line.230"></a>
<span class="sourceLineNo">231</span>        }<a name="line.231"></a>
<span class="sourceLineNo">232</span>        <a name="line.232"></a>
<span class="sourceLineNo">233</span>        /**<a name="line.233"></a>
<span class="sourceLineNo">234</span>         *<a name="line.234"></a>
<span class="sourceLineNo">235</span>         * @param stop<a name="line.235"></a>
<span class="sourceLineNo">236</span>         * @return a new 1D dataset, filled with values determined by parameters<a name="line.236"></a>
<span class="sourceLineNo">237</span>         */<a name="line.237"></a>
<span class="sourceLineNo">238</span>        static LongDataset createRange(final double stop) {<a name="line.238"></a>
<span class="sourceLineNo">239</span>                return createRange(0, stop, 1);<a name="line.239"></a>
<span class="sourceLineNo">240</span>        }<a name="line.240"></a>
<span class="sourceLineNo">241</span>        <a name="line.241"></a>
<span class="sourceLineNo">242</span>        /**<a name="line.242"></a>
<span class="sourceLineNo">243</span>         *<a name="line.243"></a>
<span class="sourceLineNo">244</span>         * @param start<a name="line.244"></a>
<span class="sourceLineNo">245</span>         * @param stop<a name="line.245"></a>
<span class="sourceLineNo">246</span>         * @param step<a name="line.246"></a>
<span class="sourceLineNo">247</span>         * @return a new 1D dataset, filled with values determined by parameters<a name="line.247"></a>
<span class="sourceLineNo">248</span>         */<a name="line.248"></a>
<span class="sourceLineNo">249</span>        static LongDataset createRange(final double start, final double stop, final double step) {<a name="line.249"></a>
<span class="sourceLineNo">250</span>                int size = calcSteps(start, stop, step);<a name="line.250"></a>
<span class="sourceLineNo">251</span>                LongDataset result = new LongDataset(size);<a name="line.251"></a>
<span class="sourceLineNo">252</span>                for (int i = 0; i &lt; size; i++) {<a name="line.252"></a>
<span class="sourceLineNo">253</span>                        result.data[i] = (long) (start + i * step); // PRIM_TYPE // ADD_CAST<a name="line.253"></a>
<span class="sourceLineNo">254</span>                }<a name="line.254"></a>
<span class="sourceLineNo">255</span>                return result;<a name="line.255"></a>
<span class="sourceLineNo">256</span>        }<a name="line.256"></a>
<span class="sourceLineNo">257</span><a name="line.257"></a>
<span class="sourceLineNo">258</span>        /**<a name="line.258"></a>
<span class="sourceLineNo">259</span>         * @param shape<a name="line.259"></a>
<span class="sourceLineNo">260</span>         * @return a dataset filled with ones<a name="line.260"></a>
<span class="sourceLineNo">261</span>         */<a name="line.261"></a>
<span class="sourceLineNo">262</span>        static LongDataset ones(final int... shape) {<a name="line.262"></a>
<span class="sourceLineNo">263</span>                return new LongDataset(shape).fill(1);<a name="line.263"></a>
<span class="sourceLineNo">264</span>        }<a name="line.264"></a>
<span class="sourceLineNo">265</span><a name="line.265"></a>
<span class="sourceLineNo">266</span>        @Override<a name="line.266"></a>
<span class="sourceLineNo">267</span>        public LongDataset fill(final Object obj) {<a name="line.267"></a>
<span class="sourceLineNo">268</span>                setDirty();<a name="line.268"></a>
<span class="sourceLineNo">269</span>                long dv = DTypeUtils.toLong(obj); // PRIM_TYPE // FROM_OBJECT<a name="line.269"></a>
<span class="sourceLineNo">270</span>                IndexIterator iter = getIterator();<a name="line.270"></a>
<span class="sourceLineNo">271</span>                while (iter.hasNext()) {<a name="line.271"></a>
<span class="sourceLineNo">272</span>                        data[iter.index] = dv;<a name="line.272"></a>
<span class="sourceLineNo">273</span>                }<a name="line.273"></a>
<span class="sourceLineNo">274</span><a name="line.274"></a>
<span class="sourceLineNo">275</span>                return this;<a name="line.275"></a>
<span class="sourceLineNo">276</span>        }<a name="line.276"></a>
<span class="sourceLineNo">277</span><a name="line.277"></a>
<span class="sourceLineNo">278</span>        /**<a name="line.278"></a>
<span class="sourceLineNo">279</span>         * This is a typed version of {@link #getBuffer()}<a name="line.279"></a>
<span class="sourceLineNo">280</span>         * @return data buffer as linear array<a name="line.280"></a>
<span class="sourceLineNo">281</span>         */<a name="line.281"></a>
<span class="sourceLineNo">282</span>        public long[] getData() { // PRIM_TYPE<a name="line.282"></a>
<span class="sourceLineNo">283</span>                return data;<a name="line.283"></a>
<span class="sourceLineNo">284</span>        }<a name="line.284"></a>
<span class="sourceLineNo">285</span><a name="line.285"></a>
<span class="sourceLineNo">286</span>        @Override<a name="line.286"></a>
<span class="sourceLineNo">287</span>        protected int getBufferLength() {<a name="line.287"></a>
<span class="sourceLineNo">288</span>                if (data == null)<a name="line.288"></a>
<span class="sourceLineNo">289</span>                        return 0;<a name="line.289"></a>
<span class="sourceLineNo">290</span>                return data.length;<a name="line.290"></a>
<span class="sourceLineNo">291</span>        }<a name="line.291"></a>
<span class="sourceLineNo">292</span><a name="line.292"></a>
<span class="sourceLineNo">293</span>        @Override<a name="line.293"></a>
<span class="sourceLineNo">294</span>        public LongDataset getView(boolean deepCopyMetadata) {<a name="line.294"></a>
<span class="sourceLineNo">295</span>                LongDataset view = new LongDataset();<a name="line.295"></a>
<span class="sourceLineNo">296</span>                copyToView(this, view, true, deepCopyMetadata);<a name="line.296"></a>
<span class="sourceLineNo">297</span>                view.setData();<a name="line.297"></a>
<span class="sourceLineNo">298</span>                return view;<a name="line.298"></a>
<span class="sourceLineNo">299</span>        }<a name="line.299"></a>
<span class="sourceLineNo">300</span><a name="line.300"></a>
<span class="sourceLineNo">301</span>        /**<a name="line.301"></a>
<span class="sourceLineNo">302</span>         * Get a value from an absolute index of the internal array. This is an internal method with no checks so can be<a name="line.302"></a>
<span class="sourceLineNo">303</span>         * dangerous. Use with care or ideally with an iterator.<a name="line.303"></a>
<span class="sourceLineNo">304</span>         *<a name="line.304"></a>
<span class="sourceLineNo">305</span>         * @param index<a name="line.305"></a>
<span class="sourceLineNo">306</span>         *            absolute index<a name="line.306"></a>
<span class="sourceLineNo">307</span>         * @return value<a name="line.307"></a>
<span class="sourceLineNo">308</span>         */<a name="line.308"></a>
<span class="sourceLineNo">309</span>        public long getAbs(final int index) { // PRIM_TYPE<a name="line.309"></a>
<span class="sourceLineNo">310</span>                return data[index];<a name="line.310"></a>
<span class="sourceLineNo">311</span>        }<a name="line.311"></a>
<span class="sourceLineNo">312</span><a name="line.312"></a>
<span class="sourceLineNo">313</span>        @Override<a name="line.313"></a>
<span class="sourceLineNo">314</span>        public boolean getElementBooleanAbs(final int index) {<a name="line.314"></a>
<span class="sourceLineNo">315</span>                return data[index] != 0; // BOOLEAN_FALSE<a name="line.315"></a>
<span class="sourceLineNo">316</span>        }<a name="line.316"></a>
<span class="sourceLineNo">317</span><a name="line.317"></a>
<span class="sourceLineNo">318</span>        @Override<a name="line.318"></a>
<span class="sourceLineNo">319</span>        public double getElementDoubleAbs(final int index) {<a name="line.319"></a>
<span class="sourceLineNo">320</span>                return data[index]; // BOOLEAN_ZERO<a name="line.320"></a>
<span class="sourceLineNo">321</span>        }<a name="line.321"></a>
<span class="sourceLineNo">322</span><a name="line.322"></a>
<span class="sourceLineNo">323</span>        @Override<a name="line.323"></a>
<span class="sourceLineNo">324</span>        public long getElementLongAbs(final int index) {<a name="line.324"></a>
<span class="sourceLineNo">325</span>                return data[index]; // BOOLEAN_ZERO // OMIT_TOLONG_INT<a name="line.325"></a>
<span class="sourceLineNo">326</span>        }<a name="line.326"></a>
<span class="sourceLineNo">327</span><a name="line.327"></a>
<span class="sourceLineNo">328</span>        @Override<a name="line.328"></a>
<span class="sourceLineNo">329</span>        public Object getObjectAbs(final int index) {<a name="line.329"></a>
<span class="sourceLineNo">330</span>                return data[index];<a name="line.330"></a>
<span class="sourceLineNo">331</span>        }<a name="line.331"></a>
<span class="sourceLineNo">332</span><a name="line.332"></a>
<span class="sourceLineNo">333</span>        @Override<a name="line.333"></a>
<span class="sourceLineNo">334</span>        public String getStringAbs(final int index) {<a name="line.334"></a>
<span class="sourceLineNo">335</span>                return stringFormat == null ? String.format("%d", data[index]) : // FORMAT_STRING<a name="line.335"></a>
<span class="sourceLineNo">336</span>                        stringFormat.format(data[index]);<a name="line.336"></a>
<span class="sourceLineNo">337</span>        }<a name="line.337"></a>
<span class="sourceLineNo">338</span><a name="line.338"></a>
<span class="sourceLineNo">339</span>        /**<a name="line.339"></a>
<span class="sourceLineNo">340</span>         * Set a value at absolute index in the internal array. This is an internal method with no checks so can be<a name="line.340"></a>
<span class="sourceLineNo">341</span>         * dangerous. Use with care or ideally with an iterator.<a name="line.341"></a>
<span class="sourceLineNo">342</span>         *<a name="line.342"></a>
<span class="sourceLineNo">343</span>         * @param index<a name="line.343"></a>
<span class="sourceLineNo">344</span>         *            absolute index<a name="line.344"></a>
<span class="sourceLineNo">345</span>         * @param val<a name="line.345"></a>
<span class="sourceLineNo">346</span>         *            new value<a name="line.346"></a>
<span class="sourceLineNo">347</span>         */<a name="line.347"></a>
<span class="sourceLineNo">348</span>        public void setAbs(final int index, final long val) { // PRIM_TYPE<a name="line.348"></a>
<span class="sourceLineNo">349</span>                setDirty();<a name="line.349"></a>
<span class="sourceLineNo">350</span>                data[index] = val;<a name="line.350"></a>
<span class="sourceLineNo">351</span>        }<a name="line.351"></a>
<span class="sourceLineNo">352</span><a name="line.352"></a>
<span class="sourceLineNo">353</span>        @Override<a name="line.353"></a>
<span class="sourceLineNo">354</span>        protected void setItemDirect(final int dindex, final int sindex, final Object src) {<a name="line.354"></a>
<span class="sourceLineNo">355</span>                setDirty();<a name="line.355"></a>
<span class="sourceLineNo">356</span>                long[] dsrc = (long[]) src; // PRIM_TYPE<a name="line.356"></a>
<span class="sourceLineNo">357</span>                data[dindex] = dsrc[sindex];<a name="line.357"></a>
<span class="sourceLineNo">358</span>        }<a name="line.358"></a>
<span class="sourceLineNo">359</span><a name="line.359"></a>
<span class="sourceLineNo">360</span>        @Override<a name="line.360"></a>
<span class="sourceLineNo">361</span>        public void setObjectAbs(final int index, final Object obj) {<a name="line.361"></a>
<span class="sourceLineNo">362</span>                if (index &lt; 0 || index &gt; data.length) {<a name="line.362"></a>
<span class="sourceLineNo">363</span>                        throw new IndexOutOfBoundsException("Index given is outside dataset");<a name="line.363"></a>
<span class="sourceLineNo">364</span>                }<a name="line.364"></a>
<span class="sourceLineNo">365</span><a name="line.365"></a>
<span class="sourceLineNo">366</span>                setAbs(index, DTypeUtils.toLong(obj)); // FROM_OBJECT<a name="line.366"></a>
<span class="sourceLineNo">367</span>        }<a name="line.367"></a>
<span class="sourceLineNo">368</span><a name="line.368"></a>
<span class="sourceLineNo">369</span>        /**<a name="line.369"></a>
<span class="sourceLineNo">370</span>         * @return item in first position<a name="line.370"></a>
<span class="sourceLineNo">371</span>         * @since 2.0<a name="line.371"></a>
<span class="sourceLineNo">372</span>         */<a name="line.372"></a>
<span class="sourceLineNo">373</span>        public long get() { // PRIM_TYPE<a name="line.373"></a>
<span class="sourceLineNo">374</span>                return data[getFirst1DIndex()];<a name="line.374"></a>
<span class="sourceLineNo">375</span>        }<a name="line.375"></a>
<span class="sourceLineNo">376</span><a name="line.376"></a>
<span class="sourceLineNo">377</span>        /**<a name="line.377"></a>
<span class="sourceLineNo">378</span>         * @param i<a name="line.378"></a>
<span class="sourceLineNo">379</span>         * @return item in given position<a name="line.379"></a>
<span class="sourceLineNo">380</span>         */<a name="line.380"></a>
<span class="sourceLineNo">381</span>        public long get(final int i) { // PRIM_TYPE<a name="line.381"></a>
<span class="sourceLineNo">382</span>                return data[get1DIndex(i)];<a name="line.382"></a>
<span class="sourceLineNo">383</span>        }<a name="line.383"></a>
<span class="sourceLineNo">384</span><a name="line.384"></a>
<span class="sourceLineNo">385</span>        /**<a name="line.385"></a>
<span class="sourceLineNo">386</span>         * @param i<a name="line.386"></a>
<span class="sourceLineNo">387</span>         * @param j<a name="line.387"></a>
<span class="sourceLineNo">388</span>         * @return item in given position<a name="line.388"></a>
<span class="sourceLineNo">389</span>         */<a name="line.389"></a>
<span class="sourceLineNo">390</span>        public long get(final int i, final int j) { // PRIM_TYPE<a name="line.390"></a>
<span class="sourceLineNo">391</span>                return data[get1DIndex(i, j)];<a name="line.391"></a>
<span class="sourceLineNo">392</span>        }<a name="line.392"></a>
<span class="sourceLineNo">393</span><a name="line.393"></a>
<span class="sourceLineNo">394</span>        /**<a name="line.394"></a>
<span class="sourceLineNo">395</span>         * @param pos<a name="line.395"></a>
<span class="sourceLineNo">396</span>         * @return item in given position<a name="line.396"></a>
<span class="sourceLineNo">397</span>         */<a name="line.397"></a>
<span class="sourceLineNo">398</span>        public long get(final int... pos) { // PRIM_TYPE<a name="line.398"></a>
<span class="sourceLineNo">399</span>                return data[get1DIndex(pos)];<a name="line.399"></a>
<span class="sourceLineNo">400</span>        }<a name="line.400"></a>
<span class="sourceLineNo">401</span><a name="line.401"></a>
<span class="sourceLineNo">402</span>        @Override<a name="line.402"></a>
<span class="sourceLineNo">403</span>        public Object getObject() {<a name="line.403"></a>
<span class="sourceLineNo">404</span>                return Long.valueOf(get()); // CLASS_TYPE<a name="line.404"></a>
<span class="sourceLineNo">405</span>        }<a name="line.405"></a>
<span class="sourceLineNo">406</span><a name="line.406"></a>
<span class="sourceLineNo">407</span>        @Override<a name="line.407"></a>
<span class="sourceLineNo">408</span>        public Object getObject(final int i) {<a name="line.408"></a>
<span class="sourceLineNo">409</span>                return Long.valueOf(get(i)); // CLASS_TYPE<a name="line.409"></a>
<span class="sourceLineNo">410</span>        }<a name="line.410"></a>
<span class="sourceLineNo">411</span><a name="line.411"></a>
<span class="sourceLineNo">412</span>        @Override<a name="line.412"></a>
<span class="sourceLineNo">413</span>        public Object getObject(final int i, final int j) {<a name="line.413"></a>
<span class="sourceLineNo">414</span>                return Long.valueOf(get(i, j)); // CLASS_TYPE<a name="line.414"></a>
<span class="sourceLineNo">415</span>        }<a name="line.415"></a>
<span class="sourceLineNo">416</span><a name="line.416"></a>
<span class="sourceLineNo">417</span>        @Override<a name="line.417"></a>
<span class="sourceLineNo">418</span>        public Object getObject(final int... pos) {<a name="line.418"></a>
<span class="sourceLineNo">419</span>                return Long.valueOf(get(pos)); // CLASS_TYPE<a name="line.419"></a>
<span class="sourceLineNo">420</span>        }<a name="line.420"></a>
<span class="sourceLineNo">421</span><a name="line.421"></a>
<span class="sourceLineNo">422</span>        @Override<a name="line.422"></a>
<span class="sourceLineNo">423</span>        public String getString() {<a name="line.423"></a>
<span class="sourceLineNo">424</span>                return getStringAbs(getFirst1DIndex());<a name="line.424"></a>
<span class="sourceLineNo">425</span>        }<a name="line.425"></a>
<span class="sourceLineNo">426</span><a name="line.426"></a>
<span class="sourceLineNo">427</span>        @Override<a name="line.427"></a>
<span class="sourceLineNo">428</span>        public String getString(final int i) {<a name="line.428"></a>
<span class="sourceLineNo">429</span>                return getStringAbs(get1DIndex(i));<a name="line.429"></a>
<span class="sourceLineNo">430</span>        }<a name="line.430"></a>
<span class="sourceLineNo">431</span><a name="line.431"></a>
<span class="sourceLineNo">432</span>        @Override<a name="line.432"></a>
<span class="sourceLineNo">433</span>        public String getString(final int i, final int j) {<a name="line.433"></a>
<span class="sourceLineNo">434</span>                return getStringAbs(get1DIndex(i, j));<a name="line.434"></a>
<span class="sourceLineNo">435</span>        }<a name="line.435"></a>
<span class="sourceLineNo">436</span><a name="line.436"></a>
<span class="sourceLineNo">437</span>        @Override<a name="line.437"></a>
<span class="sourceLineNo">438</span>        public String getString(final int... pos) {<a name="line.438"></a>
<span class="sourceLineNo">439</span>                return getStringAbs(get1DIndex(pos));<a name="line.439"></a>
<span class="sourceLineNo">440</span>        }<a name="line.440"></a>
<span class="sourceLineNo">441</span><a name="line.441"></a>
<span class="sourceLineNo">442</span>        @Override<a name="line.442"></a>
<span class="sourceLineNo">443</span>        public double getDouble() {<a name="line.443"></a>
<span class="sourceLineNo">444</span>                return get(); // BOOLEAN_ZERO<a name="line.444"></a>
<span class="sourceLineNo">445</span>        }<a name="line.445"></a>
<span class="sourceLineNo">446</span><a name="line.446"></a>
<span class="sourceLineNo">447</span>        @Override<a name="line.447"></a>
<span class="sourceLineNo">448</span>        public double getDouble(final int i) {<a name="line.448"></a>
<span class="sourceLineNo">449</span>                return get(i); // BOOLEAN_ZERO<a name="line.449"></a>
<span class="sourceLineNo">450</span>        }<a name="line.450"></a>
<span class="sourceLineNo">451</span><a name="line.451"></a>
<span class="sourceLineNo">452</span>        @Override<a name="line.452"></a>
<span class="sourceLineNo">453</span>        public double getDouble(final int i, final int j) {<a name="line.453"></a>
<span class="sourceLineNo">454</span>                return get(i, j); // BOOLEAN_ZERO<a name="line.454"></a>
<span class="sourceLineNo">455</span>        }<a name="line.455"></a>
<span class="sourceLineNo">456</span><a name="line.456"></a>
<span class="sourceLineNo">457</span>        @Override<a name="line.457"></a>
<span class="sourceLineNo">458</span>        public double getDouble(final int... pos) {<a name="line.458"></a>
<span class="sourceLineNo">459</span>                return get(pos); // BOOLEAN_ZERO<a name="line.459"></a>
<span class="sourceLineNo">460</span>        }<a name="line.460"></a>
<span class="sourceLineNo">461</span><a name="line.461"></a>
<span class="sourceLineNo">462</span>        @Override<a name="line.462"></a>
<span class="sourceLineNo">463</span>        public float getFloat() {<a name="line.463"></a>
<span class="sourceLineNo">464</span>                return get(); // BOOLEAN_ZERO // OMIT_REAL_CAST<a name="line.464"></a>
<span class="sourceLineNo">465</span>        }<a name="line.465"></a>
<span class="sourceLineNo">466</span><a name="line.466"></a>
<span class="sourceLineNo">467</span>        @Override<a name="line.467"></a>
<span class="sourceLineNo">468</span>        public float getFloat(final int i) {<a name="line.468"></a>
<span class="sourceLineNo">469</span>                return get(i); // BOOLEAN_ZERO // OMIT_REAL_CAST<a name="line.469"></a>
<span class="sourceLineNo">470</span>        }<a name="line.470"></a>
<span class="sourceLineNo">471</span><a name="line.471"></a>
<span class="sourceLineNo">472</span>        @Override<a name="line.472"></a>
<span class="sourceLineNo">473</span>        public float getFloat(final int i, final int j) {<a name="line.473"></a>
<span class="sourceLineNo">474</span>                return get(i, j); // BOOLEAN_ZERO // OMIT_REAL_CAST<a name="line.474"></a>
<span class="sourceLineNo">475</span>        }<a name="line.475"></a>
<span class="sourceLineNo">476</span><a name="line.476"></a>
<span class="sourceLineNo">477</span>        @Override<a name="line.477"></a>
<span class="sourceLineNo">478</span>        public float getFloat(final int... pos) {<a name="line.478"></a>
<span class="sourceLineNo">479</span>                return get(pos); // BOOLEAN_ZERO // OMIT_REAL_CAST<a name="line.479"></a>
<span class="sourceLineNo">480</span>        }<a name="line.480"></a>
<span class="sourceLineNo">481</span><a name="line.481"></a>
<span class="sourceLineNo">482</span>        @Override<a name="line.482"></a>
<span class="sourceLineNo">483</span>        public long getLong() {<a name="line.483"></a>
<span class="sourceLineNo">484</span>                return get(); // BOOLEAN_ZERO // OMIT_UPCAST<a name="line.484"></a>
<span class="sourceLineNo">485</span>        }<a name="line.485"></a>
<span class="sourceLineNo">486</span><a name="line.486"></a>
<span class="sourceLineNo">487</span>        @Override<a name="line.487"></a>
<span class="sourceLineNo">488</span>        public long getLong(final int i) {<a name="line.488"></a>
<span class="sourceLineNo">489</span>                return get(i); // BOOLEAN_ZERO // OMIT_UPCAST<a name="line.489"></a>
<span class="sourceLineNo">490</span>        }<a name="line.490"></a>
<span class="sourceLineNo">491</span><a name="line.491"></a>
<span class="sourceLineNo">492</span>        @Override<a name="line.492"></a>
<span class="sourceLineNo">493</span>        public long getLong(final int i, final int j) {<a name="line.493"></a>
<span class="sourceLineNo">494</span>                return get(i, j); // BOOLEAN_ZERO // OMIT_UPCAST<a name="line.494"></a>
<span class="sourceLineNo">495</span>        }<a name="line.495"></a>
<span class="sourceLineNo">496</span><a name="line.496"></a>
<span class="sourceLineNo">497</span>        @Override<a name="line.497"></a>
<span class="sourceLineNo">498</span>        public long getLong(final int... pos) {<a name="line.498"></a>
<span class="sourceLineNo">499</span>                return get(pos); // BOOLEAN_ZERO // OMIT_UPCAST<a name="line.499"></a>
<span class="sourceLineNo">500</span>        }<a name="line.500"></a>
<span class="sourceLineNo">501</span><a name="line.501"></a>
<span class="sourceLineNo">502</span>        @Override<a name="line.502"></a>
<span class="sourceLineNo">503</span>        public int getInt() {<a name="line.503"></a>
<span class="sourceLineNo">504</span>                return (int) get(); // BOOLEAN_ZERO // OMIT_UPCAST<a name="line.504"></a>
<span class="sourceLineNo">505</span>        }<a name="line.505"></a>
<span class="sourceLineNo">506</span><a name="line.506"></a>
<span class="sourceLineNo">507</span>        @Override<a name="line.507"></a>
<span class="sourceLineNo">508</span>        public int getInt(final int i) {<a name="line.508"></a>
<span class="sourceLineNo">509</span>                return (int) get(i); // BOOLEAN_ZERO // OMIT_UPCAST<a name="line.509"></a>
<span class="sourceLineNo">510</span>        }<a name="line.510"></a>
<span class="sourceLineNo">511</span><a name="line.511"></a>
<span class="sourceLineNo">512</span>        @Override<a name="line.512"></a>
<span class="sourceLineNo">513</span>        public int getInt(final int i, final int j) {<a name="line.513"></a>
<span class="sourceLineNo">514</span>                return (int) get(i, j); // BOOLEAN_ZERO // OMIT_UPCAST<a name="line.514"></a>
<span class="sourceLineNo">515</span>        }<a name="line.515"></a>
<span class="sourceLineNo">516</span><a name="line.516"></a>
<span class="sourceLineNo">517</span>        @Override<a name="line.517"></a>
<span class="sourceLineNo">518</span>        public int getInt(final int... pos) {<a name="line.518"></a>
<span class="sourceLineNo">519</span>                return (int) get(pos); // BOOLEAN_ZERO // OMIT_UPCAST<a name="line.519"></a>
<span class="sourceLineNo">520</span>        }<a name="line.520"></a>
<span class="sourceLineNo">521</span><a name="line.521"></a>
<span class="sourceLineNo">522</span>        @Override<a name="line.522"></a>
<span class="sourceLineNo">523</span>        public short getShort() {<a name="line.523"></a>
<span class="sourceLineNo">524</span>                return (short) get(); // BOOLEAN_ZERO // OMIT_UPCAST<a name="line.524"></a>
<span class="sourceLineNo">525</span>        }<a name="line.525"></a>
<span class="sourceLineNo">526</span><a name="line.526"></a>
<span class="sourceLineNo">527</span>        @Override<a name="line.527"></a>
<span class="sourceLineNo">528</span>        public short getShort(final int i) {<a name="line.528"></a>
<span class="sourceLineNo">529</span>                return (short) get(i); // BOOLEAN_ZERO // OMIT_UPCAST<a name="line.529"></a>
<span class="sourceLineNo">530</span>        }<a name="line.530"></a>
<span class="sourceLineNo">531</span><a name="line.531"></a>
<span class="sourceLineNo">532</span>        @Override<a name="line.532"></a>
<span class="sourceLineNo">533</span>        public short getShort(final int i, final int j) {<a name="line.533"></a>
<span class="sourceLineNo">534</span>                return (short) get(i, j); // BOOLEAN_ZERO // OMIT_UPCAST<a name="line.534"></a>
<span class="sourceLineNo">535</span>        }<a name="line.535"></a>
<span class="sourceLineNo">536</span><a name="line.536"></a>
<span class="sourceLineNo">537</span>        @Override<a name="line.537"></a>
<span class="sourceLineNo">538</span>        public short getShort(final int... pos) {<a name="line.538"></a>
<span class="sourceLineNo">539</span>                return (short) get(pos); // BOOLEAN_ZERO // OMIT_UPCAST<a name="line.539"></a>
<span class="sourceLineNo">540</span>        }<a name="line.540"></a>
<span class="sourceLineNo">541</span><a name="line.541"></a>
<span class="sourceLineNo">542</span>        @Override<a name="line.542"></a>
<span class="sourceLineNo">543</span>        public byte getByte() {<a name="line.543"></a>
<span class="sourceLineNo">544</span>                return (byte) get(); // BOOLEAN_ZERO // OMIT_UPCAST<a name="line.544"></a>
<span class="sourceLineNo">545</span>        }<a name="line.545"></a>
<span class="sourceLineNo">546</span><a name="line.546"></a>
<span class="sourceLineNo">547</span>        @Override<a name="line.547"></a>
<span class="sourceLineNo">548</span>        public byte getByte(final int i) {<a name="line.548"></a>
<span class="sourceLineNo">549</span>                return (byte) get(i); // BOOLEAN_ZERO // OMIT_UPCAST<a name="line.549"></a>
<span class="sourceLineNo">550</span>        }<a name="line.550"></a>
<span class="sourceLineNo">551</span><a name="line.551"></a>
<span class="sourceLineNo">552</span>        @Override<a name="line.552"></a>
<span class="sourceLineNo">553</span>        public byte getByte(final int i, final int j) {<a name="line.553"></a>
<span class="sourceLineNo">554</span>                return (byte) get(i, j); // BOOLEAN_ZERO // OMIT_UPCAST<a name="line.554"></a>
<span class="sourceLineNo">555</span>        }<a name="line.555"></a>
<span class="sourceLineNo">556</span><a name="line.556"></a>
<span class="sourceLineNo">557</span>        @Override<a name="line.557"></a>
<span class="sourceLineNo">558</span>        public byte getByte(final int... pos) {<a name="line.558"></a>
<span class="sourceLineNo">559</span>                return (byte) get(pos); // BOOLEAN_ZERO // OMIT_UPCAST<a name="line.559"></a>
<span class="sourceLineNo">560</span>        }<a name="line.560"></a>
<span class="sourceLineNo">561</span><a name="line.561"></a>
<span class="sourceLineNo">562</span>        @Override<a name="line.562"></a>
<span class="sourceLineNo">563</span>        public boolean getBoolean() {<a name="line.563"></a>
<span class="sourceLineNo">564</span>                return get() != 0; // BOOLEAN_FALSE<a name="line.564"></a>
<span class="sourceLineNo">565</span>        }<a name="line.565"></a>
<span class="sourceLineNo">566</span><a name="line.566"></a>
<span class="sourceLineNo">567</span>        @Override<a name="line.567"></a>
<span class="sourceLineNo">568</span>        public boolean getBoolean(final int i) {<a name="line.568"></a>
<span class="sourceLineNo">569</span>                return get(i) != 0; // BOOLEAN_FALSE<a name="line.569"></a>
<span class="sourceLineNo">570</span>        }<a name="line.570"></a>
<span class="sourceLineNo">571</span><a name="line.571"></a>
<span class="sourceLineNo">572</span>        @Override<a name="line.572"></a>
<span class="sourceLineNo">573</span>        public boolean getBoolean(final int i, final int j) {<a name="line.573"></a>
<span class="sourceLineNo">574</span>                return get(i, j) != 0; // BOOLEAN_FALSE<a name="line.574"></a>
<span class="sourceLineNo">575</span>        }<a name="line.575"></a>
<span class="sourceLineNo">576</span><a name="line.576"></a>
<span class="sourceLineNo">577</span>        @Override<a name="line.577"></a>
<span class="sourceLineNo">578</span>        public boolean getBoolean(final int... pos) {<a name="line.578"></a>
<span class="sourceLineNo">579</span>                return get(pos) != 0; // BOOLEAN_FALSE<a name="line.579"></a>
<span class="sourceLineNo">580</span>        }<a name="line.580"></a>
<span class="sourceLineNo">581</span><a name="line.581"></a>
<span class="sourceLineNo">582</span>        /**<a name="line.582"></a>
<span class="sourceLineNo">583</span>         * Sets the value at first point to the passed value. The dataset must not be null<a name="line.583"></a>
<span class="sourceLineNo">584</span>         *<a name="line.584"></a>
<span class="sourceLineNo">585</span>         * @param value<a name="line.585"></a>
<span class="sourceLineNo">586</span>         * @since 2.0<a name="line.586"></a>
<span class="sourceLineNo">587</span>         */<a name="line.587"></a>
<span class="sourceLineNo">588</span>        public void setItem(final long value) { // PRIM_TYPE<a name="line.588"></a>
<span class="sourceLineNo">589</span>                setAbs(getFirst1DIndex(), value);<a name="line.589"></a>
<span class="sourceLineNo">590</span>        }<a name="line.590"></a>
<span class="sourceLineNo">591</span><a name="line.591"></a>
<span class="sourceLineNo">592</span>        /**<a name="line.592"></a>
<span class="sourceLineNo">593</span>         * Sets the value at a particular point to the passed value. The dataset must be 1D<a name="line.593"></a>
<span class="sourceLineNo">594</span>         *<a name="line.594"></a>
<span class="sourceLineNo">595</span>         * @param value<a name="line.595"></a>
<span class="sourceLineNo">596</span>         * @param i<a name="line.596"></a>
<span class="sourceLineNo">597</span>         */<a name="line.597"></a>
<span class="sourceLineNo">598</span>        public void setItem(final long value, final int i) { // PRIM_TYPE<a name="line.598"></a>
<span class="sourceLineNo">599</span>                setAbs(get1DIndex(i), value);<a name="line.599"></a>
<span class="sourceLineNo">600</span>        }<a name="line.600"></a>
<span class="sourceLineNo">601</span><a name="line.601"></a>
<span class="sourceLineNo">602</span>        /**<a name="line.602"></a>
<span class="sourceLineNo">603</span>         * Sets the value at a particular point to the passed value. The dataset must be 2D<a name="line.603"></a>
<span class="sourceLineNo">604</span>         *<a name="line.604"></a>
<span class="sourceLineNo">605</span>         * @param value<a name="line.605"></a>
<span class="sourceLineNo">606</span>         * @param i<a name="line.606"></a>
<span class="sourceLineNo">607</span>         * @param j<a name="line.607"></a>
<span class="sourceLineNo">608</span>         */<a name="line.608"></a>
<span class="sourceLineNo">609</span>        public void setItem(final long value, final int i, final int j) { // PRIM_TYPE<a name="line.609"></a>
<span class="sourceLineNo">610</span>                setAbs(get1DIndex(i, j), value);<a name="line.610"></a>
<span class="sourceLineNo">611</span>        }<a name="line.611"></a>
<span class="sourceLineNo">612</span><a name="line.612"></a>
<span class="sourceLineNo">613</span>        /**<a name="line.613"></a>
<span class="sourceLineNo">614</span>         * Sets the value at a particular point to the passed value<a name="line.614"></a>
<span class="sourceLineNo">615</span>         *<a name="line.615"></a>
<span class="sourceLineNo">616</span>         * @param value<a name="line.616"></a>
<span class="sourceLineNo">617</span>         * @param pos<a name="line.617"></a>
<span class="sourceLineNo">618</span>         */<a name="line.618"></a>
<span class="sourceLineNo">619</span>        public void setItem(final long value, final int... pos) { // PRIM_TYPE<a name="line.619"></a>
<span class="sourceLineNo">620</span>                setAbs(get1DIndex(pos), value);<a name="line.620"></a>
<span class="sourceLineNo">621</span>        }<a name="line.621"></a>
<span class="sourceLineNo">622</span><a name="line.622"></a>
<span class="sourceLineNo">623</span>        @Override<a name="line.623"></a>
<span class="sourceLineNo">624</span>        public void set(final Object obj) {<a name="line.624"></a>
<span class="sourceLineNo">625</span>                setItem(DTypeUtils.toLong(obj)); // FROM_OBJECT<a name="line.625"></a>
<span class="sourceLineNo">626</span>        }<a name="line.626"></a>
<span class="sourceLineNo">627</span><a name="line.627"></a>
<span class="sourceLineNo">628</span>        @Override<a name="line.628"></a>
<span class="sourceLineNo">629</span>        public void set(final Object obj, final int i) {<a name="line.629"></a>
<span class="sourceLineNo">630</span>                setItem(DTypeUtils.toLong(obj), i); // FROM_OBJECT<a name="line.630"></a>
<span class="sourceLineNo">631</span>        }<a name="line.631"></a>
<span class="sourceLineNo">632</span><a name="line.632"></a>
<span class="sourceLineNo">633</span>        @Override<a name="line.633"></a>
<span class="sourceLineNo">634</span>        public void set(final Object obj, final int i, final int j) {<a name="line.634"></a>
<span class="sourceLineNo">635</span>                setItem(DTypeUtils.toLong(obj), i, j); // FROM_OBJECT<a name="line.635"></a>
<span class="sourceLineNo">636</span>        }<a name="line.636"></a>
<span class="sourceLineNo">637</span><a name="line.637"></a>
<span class="sourceLineNo">638</span>        @Override<a name="line.638"></a>
<span class="sourceLineNo">639</span>        public void set(final Object obj, int... pos) {<a name="line.639"></a>
<span class="sourceLineNo">640</span>                if (pos == null || (pos.length == 0 &amp;&amp; shape.length &gt; 0)) {<a name="line.640"></a>
<span class="sourceLineNo">641</span>                        pos = new int[shape.length];<a name="line.641"></a>
<span class="sourceLineNo">642</span>                }<a name="line.642"></a>
<span class="sourceLineNo">643</span><a name="line.643"></a>
<span class="sourceLineNo">644</span>                setItem(DTypeUtils.toLong(obj), pos); // FROM_OBJECT<a name="line.644"></a>
<span class="sourceLineNo">645</span>        }<a name="line.645"></a>
<span class="sourceLineNo">646</span><a name="line.646"></a>
<span class="sourceLineNo">647</span>        @Override<a name="line.647"></a>
<span class="sourceLineNo">648</span>        public void resize(int... newShape) {<a name="line.648"></a>
<span class="sourceLineNo">649</span>                setDirty();<a name="line.649"></a>
<span class="sourceLineNo">650</span>                final IndexIterator iter = getIterator();<a name="line.650"></a>
<span class="sourceLineNo">651</span>                final int nsize = ShapeUtils.calcSize(newShape);<a name="line.651"></a>
<span class="sourceLineNo">652</span>                final long[] ndata; // PRIM_TYPE<a name="line.652"></a>
<span class="sourceLineNo">653</span>                try {<a name="line.653"></a>
<span class="sourceLineNo">654</span>                        ndata = createArray(nsize);<a name="line.654"></a>
<span class="sourceLineNo">655</span>                } catch (Throwable t) {<a name="line.655"></a>
<span class="sourceLineNo">656</span>                        logger.error("Could not create a dataset of shape {}", Arrays.toString(shape), t);<a name="line.656"></a>
<span class="sourceLineNo">657</span>                        throw new IllegalArgumentException(t);<a name="line.657"></a>
<span class="sourceLineNo">658</span>                }<a name="line.658"></a>
<span class="sourceLineNo">659</span>                for (int i = 0; iter.hasNext() &amp;&amp; i &lt; nsize; i++) {<a name="line.659"></a>
<span class="sourceLineNo">660</span>                        ndata[i] = data[iter.index];<a name="line.660"></a>
<span class="sourceLineNo">661</span>                }<a name="line.661"></a>
<span class="sourceLineNo">662</span><a name="line.662"></a>
<span class="sourceLineNo">663</span>                odata = data = ndata;<a name="line.663"></a>
<span class="sourceLineNo">664</span>                size = nsize;<a name="line.664"></a>
<span class="sourceLineNo">665</span>                shape = newShape;<a name="line.665"></a>
<span class="sourceLineNo">666</span>                stride = null;<a name="line.666"></a>
<span class="sourceLineNo">667</span>                offset = 0;<a name="line.667"></a>
<span class="sourceLineNo">668</span>                base = null;<a name="line.668"></a>
<span class="sourceLineNo">669</span>        }<a name="line.669"></a>
<span class="sourceLineNo">670</span><a name="line.670"></a>
<span class="sourceLineNo">671</span>        @Override<a name="line.671"></a>
<span class="sourceLineNo">672</span>        public LongDataset sort(Integer axis) {<a name="line.672"></a>
<span class="sourceLineNo">673</span>                setDirty();<a name="line.673"></a>
<span class="sourceLineNo">674</span>                if (axis == null) {<a name="line.674"></a>
<span class="sourceLineNo">675</span>                        if (stride == null) {<a name="line.675"></a>
<span class="sourceLineNo">676</span>                                Arrays.sort(data);<a name="line.676"></a>
<span class="sourceLineNo">677</span>                        } else {<a name="line.677"></a>
<span class="sourceLineNo">678</span>                                LongDataset ads = clone().sort(null);<a name="line.678"></a>
<span class="sourceLineNo">679</span>                                setSlicedView(getView(false), ads);<a name="line.679"></a>
<span class="sourceLineNo">680</span>                        }<a name="line.680"></a>
<span class="sourceLineNo">681</span>                } else {<a name="line.681"></a>
<span class="sourceLineNo">682</span>                        axis = checkAxis(axis);<a name="line.682"></a>
<span class="sourceLineNo">683</span>                        <a name="line.683"></a>
<span class="sourceLineNo">684</span>                        LongDataset ads = new LongDataset(shape[axis]);<a name="line.684"></a>
<span class="sourceLineNo">685</span>                        PositionIterator pi = getPositionIterator(axis);<a name="line.685"></a>
<span class="sourceLineNo">686</span>                        int[] pos = pi.getPos();<a name="line.686"></a>
<span class="sourceLineNo">687</span>                        boolean[] hit = pi.getOmit();<a name="line.687"></a>
<span class="sourceLineNo">688</span>                        while (pi.hasNext()) {<a name="line.688"></a>
<span class="sourceLineNo">689</span>                                copyItemsFromAxes(pos, hit, ads);<a name="line.689"></a>
<span class="sourceLineNo">690</span>                                Arrays.sort(ads.data);<a name="line.690"></a>
<span class="sourceLineNo">691</span>                                setItemsOnAxes(pos, hit, ads.data);<a name="line.691"></a>
<span class="sourceLineNo">692</span>                        }<a name="line.692"></a>
<span class="sourceLineNo">693</span>                }<a name="line.693"></a>
<span class="sourceLineNo">694</span>                return this;<a name="line.694"></a>
<span class="sourceLineNo">695</span>                // throw new UnsupportedOperationException("Cannot sort dataset"); // BOOLEAN_USE<a name="line.695"></a>
<span class="sourceLineNo">696</span>        }<a name="line.696"></a>
<span class="sourceLineNo">697</span><a name="line.697"></a>
<span class="sourceLineNo">698</span>        @Override<a name="line.698"></a>
<span class="sourceLineNo">699</span>        public LongDataset getUniqueItems() {<a name="line.699"></a>
<span class="sourceLineNo">700</span>                Set&lt;Long&gt; set = new TreeSet&lt;Long&gt;(); // CLASS_TYPE<a name="line.700"></a>
<span class="sourceLineNo">701</span>                IndexIterator it = getIterator();<a name="line.701"></a>
<span class="sourceLineNo">702</span>                while (it.hasNext()) {<a name="line.702"></a>
<span class="sourceLineNo">703</span>                        set.add(data[it.index]);<a name="line.703"></a>
<span class="sourceLineNo">704</span>                }<a name="line.704"></a>
<span class="sourceLineNo">705</span><a name="line.705"></a>
<span class="sourceLineNo">706</span>                LongDataset u = new LongDataset(set.size()); // CLASS_TYPE<a name="line.706"></a>
<span class="sourceLineNo">707</span>                int i = 0;<a name="line.707"></a>
<span class="sourceLineNo">708</span>                long[] udata = u.getData(); // PRIM_TYPE<a name="line.708"></a>
<span class="sourceLineNo">709</span>                for (Long v : set) { // CLASS_TYPE<a name="line.709"></a>
<span class="sourceLineNo">710</span>                        udata[i++] = v;<a name="line.710"></a>
<span class="sourceLineNo">711</span>                }<a name="line.711"></a>
<span class="sourceLineNo">712</span>                return u;<a name="line.712"></a>
<span class="sourceLineNo">713</span>        }<a name="line.713"></a>
<span class="sourceLineNo">714</span><a name="line.714"></a>
<span class="sourceLineNo">715</span>        @Override<a name="line.715"></a>
<span class="sourceLineNo">716</span>        public LongDataset getSlice(final SliceIterator siter) {<a name="line.716"></a>
<span class="sourceLineNo">717</span>                LongDataset result = new LongDataset(siter.getShape());<a name="line.717"></a>
<span class="sourceLineNo">718</span>                long[] rdata = result.data; // PRIM_TYPE<a name="line.718"></a>
<span class="sourceLineNo">719</span><a name="line.719"></a>
<span class="sourceLineNo">720</span>                for (int i = 0; siter.hasNext(); i++)<a name="line.720"></a>
<span class="sourceLineNo">721</span>                        rdata[i] = data[siter.index];<a name="line.721"></a>
<span class="sourceLineNo">722</span><a name="line.722"></a>
<span class="sourceLineNo">723</span>                result.setName(name + BLOCK_OPEN + Slice.createString(siter.shape, siter.start, siter.stop, siter.step) + BLOCK_CLOSE);<a name="line.723"></a>
<span class="sourceLineNo">724</span>                return result;<a name="line.724"></a>
<span class="sourceLineNo">725</span>        }<a name="line.725"></a>
<span class="sourceLineNo">726</span><a name="line.726"></a>
<span class="sourceLineNo">727</span>        @Override<a name="line.727"></a>
<span class="sourceLineNo">728</span>        public void fillDataset(Dataset result, IndexIterator iter) {<a name="line.728"></a>
<span class="sourceLineNo">729</span>                IndexIterator riter = result.getIterator();<a name="line.729"></a>
<span class="sourceLineNo">730</span>                result.setDirty();<a name="line.730"></a>
<span class="sourceLineNo">731</span><a name="line.731"></a>
<span class="sourceLineNo">732</span>                long[] rdata = ((LongDataset) result).data; // PRIM_TYPE<a name="line.732"></a>
<span class="sourceLineNo">733</span><a name="line.733"></a>
<span class="sourceLineNo">734</span>                while (riter.hasNext() &amp;&amp; iter.hasNext()) {<a name="line.734"></a>
<span class="sourceLineNo">735</span>                        rdata[riter.index] = data[iter.index];<a name="line.735"></a>
<span class="sourceLineNo">736</span>                }<a name="line.736"></a>
<span class="sourceLineNo">737</span>        }<a name="line.737"></a>
<span class="sourceLineNo">738</span><a name="line.738"></a>
<span class="sourceLineNo">739</span>        @Override<a name="line.739"></a>
<span class="sourceLineNo">740</span>        public LongDataset setByBoolean(final Object obj, Dataset selection) {<a name="line.740"></a>
<span class="sourceLineNo">741</span>                setDirty();<a name="line.741"></a>
<span class="sourceLineNo">742</span>                if (obj instanceof Dataset) {<a name="line.742"></a>
<span class="sourceLineNo">743</span>                        final Dataset ds = (Dataset) obj;<a name="line.743"></a>
<span class="sourceLineNo">744</span>                        final int length = ((Number) selection.sum()).intValue();<a name="line.744"></a>
<span class="sourceLineNo">745</span>                        if (length != ds.getSize()) {<a name="line.745"></a>
<span class="sourceLineNo">746</span>                                throw new IllegalArgumentException(<a name="line.746"></a>
<span class="sourceLineNo">747</span>                                                "Number of true items in selection does not match number of items in dataset");<a name="line.747"></a>
<span class="sourceLineNo">748</span>                        }<a name="line.748"></a>
<span class="sourceLineNo">749</span><a name="line.749"></a>
<span class="sourceLineNo">750</span>                        final IndexIterator oiter = ds.getIterator();<a name="line.750"></a>
<span class="sourceLineNo">751</span>                        final BooleanIterator biter = getBooleanIterator(selection);<a name="line.751"></a>
<span class="sourceLineNo">752</span><a name="line.752"></a>
<span class="sourceLineNo">753</span>                        while (biter.hasNext() &amp;&amp; oiter.hasNext()) {<a name="line.753"></a>
<span class="sourceLineNo">754</span>                                data[biter.index] = ds.getElementLongAbs(oiter.index); // GET_ELEMENT_WITH_CAST<a name="line.754"></a>
<span class="sourceLineNo">755</span>                        }<a name="line.755"></a>
<span class="sourceLineNo">756</span>                } else {<a name="line.756"></a>
<span class="sourceLineNo">757</span>                        final long dv = DTypeUtils.toLong(obj); // PRIM_TYPE // FROM_OBJECT<a name="line.757"></a>
<span class="sourceLineNo">758</span>                        final BooleanIterator biter = getBooleanIterator(selection);<a name="line.758"></a>
<span class="sourceLineNo">759</span><a name="line.759"></a>
<span class="sourceLineNo">760</span>                        while (biter.hasNext()) {<a name="line.760"></a>
<span class="sourceLineNo">761</span>                                data[biter.index] = dv;<a name="line.761"></a>
<span class="sourceLineNo">762</span>                        }<a name="line.762"></a>
<span class="sourceLineNo">763</span>                }<a name="line.763"></a>
<span class="sourceLineNo">764</span>                return this;<a name="line.764"></a>
<span class="sourceLineNo">765</span>        }<a name="line.765"></a>
<span class="sourceLineNo">766</span><a name="line.766"></a>
<span class="sourceLineNo">767</span>        @Override<a name="line.767"></a>
<span class="sourceLineNo">768</span>        public LongDataset setBy1DIndex(final Object obj, final Dataset index) {<a name="line.768"></a>
<span class="sourceLineNo">769</span>                setDirty();<a name="line.769"></a>
<span class="sourceLineNo">770</span>                if (obj instanceof Dataset) {<a name="line.770"></a>
<span class="sourceLineNo">771</span>                        final Dataset ds = (Dataset) obj;<a name="line.771"></a>
<span class="sourceLineNo">772</span>                        if (index.getSize() != ds.getSize()) {<a name="line.772"></a>
<span class="sourceLineNo">773</span>                                throw new IllegalArgumentException(<a name="line.773"></a>
<span class="sourceLineNo">774</span>                                                "Number of items in index dataset does not match number of items in dataset");<a name="line.774"></a>
<span class="sourceLineNo">775</span>                        }<a name="line.775"></a>
<span class="sourceLineNo">776</span><a name="line.776"></a>
<span class="sourceLineNo">777</span>                        final IndexIterator oiter = ds.getIterator();<a name="line.777"></a>
<span class="sourceLineNo">778</span>                        final IntegerIterator iter = new IntegerIterator(index, size);<a name="line.778"></a>
<span class="sourceLineNo">779</span><a name="line.779"></a>
<span class="sourceLineNo">780</span>                        while (iter.hasNext() &amp;&amp; oiter.hasNext()) {<a name="line.780"></a>
<span class="sourceLineNo">781</span>                                data[iter.index] = ds.getElementLongAbs(oiter.index); // GET_ELEMENT_WITH_CAST<a name="line.781"></a>
<span class="sourceLineNo">782</span>                        }<a name="line.782"></a>
<span class="sourceLineNo">783</span>                } else {<a name="line.783"></a>
<span class="sourceLineNo">784</span>                        final long dv = DTypeUtils.toLong(obj); // PRIM_TYPE // FROM_OBJECT<a name="line.784"></a>
<span class="sourceLineNo">785</span>                        IntegerIterator iter = new IntegerIterator(index, size);<a name="line.785"></a>
<span class="sourceLineNo">786</span><a name="line.786"></a>
<span class="sourceLineNo">787</span>                        while (iter.hasNext()) {<a name="line.787"></a>
<span class="sourceLineNo">788</span>                                data[iter.index] = dv;<a name="line.788"></a>
<span class="sourceLineNo">789</span>                        }<a name="line.789"></a>
<span class="sourceLineNo">790</span>                }<a name="line.790"></a>
<span class="sourceLineNo">791</span>                return this;<a name="line.791"></a>
<span class="sourceLineNo">792</span>        }<a name="line.792"></a>
<span class="sourceLineNo">793</span><a name="line.793"></a>
<span class="sourceLineNo">794</span>        @Override<a name="line.794"></a>
<span class="sourceLineNo">795</span>        public LongDataset setByIndexes(final Object obj, final Object... indexes) {<a name="line.795"></a>
<span class="sourceLineNo">796</span>                setDirty();<a name="line.796"></a>
<span class="sourceLineNo">797</span>                final IntegersIterator iter = new IntegersIterator(shape, indexes);<a name="line.797"></a>
<span class="sourceLineNo">798</span>                final int[] pos = iter.getPos();<a name="line.798"></a>
<span class="sourceLineNo">799</span><a name="line.799"></a>
<span class="sourceLineNo">800</span>                if (obj instanceof Dataset) {<a name="line.800"></a>
<span class="sourceLineNo">801</span>                        final Dataset ds = (Dataset) obj;<a name="line.801"></a>
<span class="sourceLineNo">802</span>                        if (ShapeUtils.calcSize(iter.getShape()) != ds.getSize()) {<a name="line.802"></a>
<span class="sourceLineNo">803</span>                                throw new IllegalArgumentException(<a name="line.803"></a>
<span class="sourceLineNo">804</span>                                                "Number of items in index datasets does not match number of items in dataset");<a name="line.804"></a>
<span class="sourceLineNo">805</span>                        }<a name="line.805"></a>
<span class="sourceLineNo">806</span><a name="line.806"></a>
<span class="sourceLineNo">807</span>                        final IndexIterator oiter = ds.getIterator();<a name="line.807"></a>
<span class="sourceLineNo">808</span><a name="line.808"></a>
<span class="sourceLineNo">809</span>                        while (iter.hasNext() &amp;&amp; oiter.hasNext()) {<a name="line.809"></a>
<span class="sourceLineNo">810</span>                                setItem(ds.getElementLongAbs(oiter.index), pos); // GET_ELEMENT_WITH_CAST<a name="line.810"></a>
<span class="sourceLineNo">811</span>                        }<a name="line.811"></a>
<span class="sourceLineNo">812</span>                } else {<a name="line.812"></a>
<span class="sourceLineNo">813</span>                        final long dv = DTypeUtils.toLong(obj); // PRIM_TYPE // FROM_OBJECT<a name="line.813"></a>
<span class="sourceLineNo">814</span><a name="line.814"></a>
<span class="sourceLineNo">815</span>                        while (iter.hasNext()) {<a name="line.815"></a>
<span class="sourceLineNo">816</span>                                setItem(dv, pos);<a name="line.816"></a>
<span class="sourceLineNo">817</span>                        }<a name="line.817"></a>
<span class="sourceLineNo">818</span>                }<a name="line.818"></a>
<span class="sourceLineNo">819</span>                return this;<a name="line.819"></a>
<span class="sourceLineNo">820</span>        }<a name="line.820"></a>
<span class="sourceLineNo">821</span><a name="line.821"></a>
<span class="sourceLineNo">822</span>        @Override<a name="line.822"></a>
<span class="sourceLineNo">823</span>        LongDataset setSlicedView(Dataset view, Dataset d) {<a name="line.823"></a>
<span class="sourceLineNo">824</span>                setDirty();<a name="line.824"></a>
<span class="sourceLineNo">825</span>                final BroadcastSelfIterator it = BroadcastSelfIterator.createIterator(view, d);<a name="line.825"></a>
<span class="sourceLineNo">826</span><a name="line.826"></a>
<span class="sourceLineNo">827</span>                while (it.hasNext()) {<a name="line.827"></a>
<span class="sourceLineNo">828</span>                        data[it.aIndex] = it.bLong; // BCAST_WITH_CAST d.getElementLongAbs(it.bIndex);<a name="line.828"></a>
<span class="sourceLineNo">829</span>                }<a name="line.829"></a>
<span class="sourceLineNo">830</span>                return this;<a name="line.830"></a>
<span class="sourceLineNo">831</span>        }<a name="line.831"></a>
<span class="sourceLineNo">832</span><a name="line.832"></a>
<span class="sourceLineNo">833</span>        @Override<a name="line.833"></a>
<span class="sourceLineNo">834</span>        public LongDataset setSlice(final Object obj, final IndexIterator siter) {<a name="line.834"></a>
<span class="sourceLineNo">835</span>                setDirty();<a name="line.835"></a>
<span class="sourceLineNo">836</span><a name="line.836"></a>
<span class="sourceLineNo">837</span>                if (obj instanceof IDataset) {<a name="line.837"></a>
<span class="sourceLineNo">838</span>                        final IDataset ds = (IDataset) obj;<a name="line.838"></a>
<span class="sourceLineNo">839</span>                        final int[] oshape = ds.getShape();<a name="line.839"></a>
<span class="sourceLineNo">840</span><a name="line.840"></a>
<span class="sourceLineNo">841</span>                        if (!ShapeUtils.areShapesCompatible(siter.getShape(), oshape)) {<a name="line.841"></a>
<span class="sourceLineNo">842</span>                                throw new IllegalArgumentException(String.format(<a name="line.842"></a>
<span class="sourceLineNo">843</span>                                                "Input dataset is not compatible with slice: %s cf %s", Arrays.toString(oshape),<a name="line.843"></a>
<span class="sourceLineNo">844</span>                                                Arrays.toString(siter.getShape())));<a name="line.844"></a>
<span class="sourceLineNo">845</span>                        }<a name="line.845"></a>
<span class="sourceLineNo">846</span><a name="line.846"></a>
<span class="sourceLineNo">847</span>                        if (ds instanceof Dataset) {<a name="line.847"></a>
<span class="sourceLineNo">848</span>                                final Dataset ads = (Dataset) ds;<a name="line.848"></a>
<span class="sourceLineNo">849</span>                                final IndexIterator oiter = ads.getIterator();<a name="line.849"></a>
<span class="sourceLineNo">850</span><a name="line.850"></a>
<span class="sourceLineNo">851</span>                                while (siter.hasNext() &amp;&amp; oiter.hasNext())<a name="line.851"></a>
<span class="sourceLineNo">852</span>                                        data[siter.index] = ads.getElementLongAbs(oiter.index); // GET_ELEMENT_WITH_CAST<a name="line.852"></a>
<span class="sourceLineNo">853</span>                        } else {<a name="line.853"></a>
<span class="sourceLineNo">854</span>                                final IndexIterator oiter = new PositionIterator(oshape);<a name="line.854"></a>
<span class="sourceLineNo">855</span>                                final int[] pos = oiter.getPos();<a name="line.855"></a>
<span class="sourceLineNo">856</span><a name="line.856"></a>
<span class="sourceLineNo">857</span>                                while (siter.hasNext() &amp;&amp; oiter.hasNext())<a name="line.857"></a>
<span class="sourceLineNo">858</span>                                        data[siter.index] = ds.getLong(pos); // PRIM_TYPE<a name="line.858"></a>
<span class="sourceLineNo">859</span>                        }<a name="line.859"></a>
<span class="sourceLineNo">860</span>                } else {<a name="line.860"></a>
<span class="sourceLineNo">861</span>                        try {<a name="line.861"></a>
<span class="sourceLineNo">862</span>                                long v = DTypeUtils.toLong(obj); // PRIM_TYPE // FROM_OBJECT<a name="line.862"></a>
<span class="sourceLineNo">863</span><a name="line.863"></a>
<span class="sourceLineNo">864</span>                                while (siter.hasNext())<a name="line.864"></a>
<span class="sourceLineNo">865</span>                                        data[siter.index] = v;<a name="line.865"></a>
<span class="sourceLineNo">866</span>                        } catch (IllegalArgumentException e) {<a name="line.866"></a>
<span class="sourceLineNo">867</span>                                throw new IllegalArgumentException("Object for setting slice is not a dataset or number");<a name="line.867"></a>
<span class="sourceLineNo">868</span>                        }<a name="line.868"></a>
<span class="sourceLineNo">869</span>                }<a name="line.869"></a>
<span class="sourceLineNo">870</span>                return this;<a name="line.870"></a>
<span class="sourceLineNo">871</span>        }<a name="line.871"></a>
<span class="sourceLineNo">872</span><a name="line.872"></a>
<span class="sourceLineNo">873</span>        @Override<a name="line.873"></a>
<span class="sourceLineNo">874</span>        public void copyItemsFromAxes(final int[] pos, final boolean[] axes, final Dataset dest) {<a name="line.874"></a>
<span class="sourceLineNo">875</span>                long[] ddata = (long[]) dest.getBuffer(); // PRIM_TYPE<a name="line.875"></a>
<span class="sourceLineNo">876</span><a name="line.876"></a>
<span class="sourceLineNo">877</span>                SliceIterator siter = getSliceIteratorFromAxes(pos, axes);<a name="line.877"></a>
<span class="sourceLineNo">878</span>                int[] sshape = ShapeUtils.squeezeShape(siter.getShape(), false);<a name="line.878"></a>
<span class="sourceLineNo">879</span><a name="line.879"></a>
<span class="sourceLineNo">880</span>                IndexIterator diter = dest.getSliceIterator(null, sshape, null);<a name="line.880"></a>
<span class="sourceLineNo">881</span><a name="line.881"></a>
<span class="sourceLineNo">882</span>                if (ddata.length &lt; ShapeUtils.calcSize(sshape)) {<a name="line.882"></a>
<span class="sourceLineNo">883</span>                        throw new IllegalArgumentException("destination array is not large enough");<a name="line.883"></a>
<span class="sourceLineNo">884</span>                }<a name="line.884"></a>
<span class="sourceLineNo">885</span><a name="line.885"></a>
<span class="sourceLineNo">886</span>                dest.setDirty();<a name="line.886"></a>
<span class="sourceLineNo">887</span>                while (siter.hasNext() &amp;&amp; diter.hasNext()) {<a name="line.887"></a>
<span class="sourceLineNo">888</span>                        ddata[diter.index] = data[siter.index];<a name="line.888"></a>
<span class="sourceLineNo">889</span>                }<a name="line.889"></a>
<span class="sourceLineNo">890</span>        }<a name="line.890"></a>
<span class="sourceLineNo">891</span><a name="line.891"></a>
<span class="sourceLineNo">892</span>        @Override<a name="line.892"></a>
<span class="sourceLineNo">893</span>        public void setItemsOnAxes(final int[] pos, final boolean[] axes, final Object src) {<a name="line.893"></a>
<span class="sourceLineNo">894</span>                setDirty();<a name="line.894"></a>
<span class="sourceLineNo">895</span>                long[] sdata = (long[]) src; // PRIM_TYPE<a name="line.895"></a>
<span class="sourceLineNo">896</span><a name="line.896"></a>
<span class="sourceLineNo">897</span>                SliceIterator siter = getSliceIteratorFromAxes(pos, axes);<a name="line.897"></a>
<span class="sourceLineNo">898</span><a name="line.898"></a>
<span class="sourceLineNo">899</span>                if (sdata.length &lt; ShapeUtils.calcSize(siter.getShape())) {<a name="line.899"></a>
<span class="sourceLineNo">900</span>                        throw new IllegalArgumentException("destination array is not large enough");<a name="line.900"></a>
<span class="sourceLineNo">901</span>                }<a name="line.901"></a>
<span class="sourceLineNo">902</span><a name="line.902"></a>
<span class="sourceLineNo">903</span>                for (int i = 0; siter.hasNext(); i++) {<a name="line.903"></a>
<span class="sourceLineNo">904</span>                        data[siter.index] = sdata[i];<a name="line.904"></a>
<span class="sourceLineNo">905</span>                }<a name="line.905"></a>
<span class="sourceLineNo">906</span>        }<a name="line.906"></a>
<span class="sourceLineNo">907</span><a name="line.907"></a>
<span class="sourceLineNo">908</span>        private List&lt;int[]&gt; findPositions(final long value) { // PRIM_TYPE<a name="line.908"></a>
<span class="sourceLineNo">909</span>                IndexIterator iter = getIterator(true);<a name="line.909"></a>
<span class="sourceLineNo">910</span>                List&lt;int[]&gt; posns = new ArrayList&lt;int[]&gt;();<a name="line.910"></a>
<span class="sourceLineNo">911</span>                int[] pos = iter.getPos();<a name="line.911"></a>
<span class="sourceLineNo">912</span><a name="line.912"></a>
<span class="sourceLineNo">913</span>                {<a name="line.913"></a>
<span class="sourceLineNo">914</span>                        while (iter.hasNext()) {<a name="line.914"></a>
<span class="sourceLineNo">915</span>                                if (data[iter.index] == value) {<a name="line.915"></a>
<span class="sourceLineNo">916</span>                                        posns.add(pos.clone());<a name="line.916"></a>
<span class="sourceLineNo">917</span>                                }<a name="line.917"></a>
<span class="sourceLineNo">918</span>                        }<a name="line.918"></a>
<span class="sourceLineNo">919</span>                }<a name="line.919"></a>
<span class="sourceLineNo">920</span>                return posns;<a name="line.920"></a>
<span class="sourceLineNo">921</span>        }<a name="line.921"></a>
<span class="sourceLineNo">922</span><a name="line.922"></a>
<span class="sourceLineNo">923</span>        @Override<a name="line.923"></a>
<span class="sourceLineNo">924</span>        public int[] maxPos(boolean... ignoreInvalids) {<a name="line.924"></a>
<span class="sourceLineNo">925</span>                StatisticsMetadata&lt;Number&gt; md = getStats(); // PRIM_TYPE<a name="line.925"></a>
<span class="sourceLineNo">926</span>                // StatisticsMetadata&lt;Number&gt; md = getStats(); // BOOLEAN_USE<a name="line.926"></a>
<span class="sourceLineNo">927</span>                // StatisticsMetadata&lt;String&gt; md = getStringStats(); // OBJECT_USE<a name="line.927"></a>
<span class="sourceLineNo">928</span>                List&lt;int[]&gt; max = md.getMaximumPositions(ignoreInvalids);<a name="line.928"></a>
<span class="sourceLineNo">929</span><a name="line.929"></a>
<span class="sourceLineNo">930</span>                if (max == null) {<a name="line.930"></a>
<span class="sourceLineNo">931</span>                        max = findPositions(md.getMaximum(ignoreInvalids).longValue()); // PRIM_TYPE<a name="line.931"></a>
<span class="sourceLineNo">932</span>                        // max = findPositions(md.getMaximum(ignoreInvalids).intValue() != 0); // BOOLEAN_USE<a name="line.932"></a>
<span class="sourceLineNo">933</span>                        // max = findPositions(md.getMaximum(ignoreInvalids).toString()); // OBJECT_USE<a name="line.933"></a>
<span class="sourceLineNo">934</span><a name="line.934"></a>
<span class="sourceLineNo">935</span>                        md.setMaximumPositions(max);<a name="line.935"></a>
<span class="sourceLineNo">936</span>                }<a name="line.936"></a>
<span class="sourceLineNo">937</span><a name="line.937"></a>
<span class="sourceLineNo">938</span>                return max.get(0); // first maximum<a name="line.938"></a>
<span class="sourceLineNo">939</span>        }<a name="line.939"></a>
<span class="sourceLineNo">940</span><a name="line.940"></a>
<span class="sourceLineNo">941</span>        @Override<a name="line.941"></a>
<span class="sourceLineNo">942</span>        public int[] minPos(boolean... ignoreInvalids) {<a name="line.942"></a>
<span class="sourceLineNo">943</span>                StatisticsMetadata&lt;Number&gt; md = getStats(); // PRIM_TYPE<a name="line.943"></a>
<span class="sourceLineNo">944</span>                // StatisticsMetadata&lt;Number&gt; md = getStats(); // BOOLEAN_USE<a name="line.944"></a>
<span class="sourceLineNo">945</span>                // StatisticsMetadata&lt;String&gt; md = getStringStats(); // OBJECT_USE<a name="line.945"></a>
<span class="sourceLineNo">946</span>                List&lt;int[]&gt; min = md.getMinimumPositions(ignoreInvalids);<a name="line.946"></a>
<span class="sourceLineNo">947</span><a name="line.947"></a>
<span class="sourceLineNo">948</span>                if (min == null) {<a name="line.948"></a>
<span class="sourceLineNo">949</span>                        min = findPositions(md.getMinimum(ignoreInvalids).longValue()); // PRIM_TYPE<a name="line.949"></a>
<span class="sourceLineNo">950</span>                        // min = findPositions(md.getMinimum(ignoreInvalids).intValue() != 0); // BOOLEAN_USE<a name="line.950"></a>
<span class="sourceLineNo">951</span>                        // min = findPositions(md.getMinimum(ignoreInvalids).toString()); // OBJECT_USE<a name="line.951"></a>
<span class="sourceLineNo">952</span><a name="line.952"></a>
<span class="sourceLineNo">953</span>                        md.setMinimumPositions(min);<a name="line.953"></a>
<span class="sourceLineNo">954</span>                }<a name="line.954"></a>
<span class="sourceLineNo">955</span><a name="line.955"></a>
<span class="sourceLineNo">956</span>                return min.get(0); // first minimum<a name="line.956"></a>
<span class="sourceLineNo">957</span>        }<a name="line.957"></a>
<span class="sourceLineNo">958</span><a name="line.958"></a>
<span class="sourceLineNo">959</span>        @Override<a name="line.959"></a>
<span class="sourceLineNo">960</span>        public boolean containsNans() {<a name="line.960"></a>
<span class="sourceLineNo">961</span>                return false;<a name="line.961"></a>
<span class="sourceLineNo">962</span>        }<a name="line.962"></a>
<span class="sourceLineNo">963</span><a name="line.963"></a>
<span class="sourceLineNo">964</span>        @Override<a name="line.964"></a>
<span class="sourceLineNo">965</span>        public boolean containsInfs() {<a name="line.965"></a>
<span class="sourceLineNo">966</span>                return false;<a name="line.966"></a>
<span class="sourceLineNo">967</span>        }<a name="line.967"></a>
<span class="sourceLineNo">968</span><a name="line.968"></a>
<span class="sourceLineNo">969</span>        @Override<a name="line.969"></a>
<span class="sourceLineNo">970</span>        public boolean containsInvalidNumbers() {<a name="line.970"></a>
<span class="sourceLineNo">971</span>                return false;<a name="line.971"></a>
<span class="sourceLineNo">972</span>        }<a name="line.972"></a>
<span class="sourceLineNo">973</span><a name="line.973"></a>
<span class="sourceLineNo">974</span>        @Override<a name="line.974"></a>
<span class="sourceLineNo">975</span>        public LongDataset iadd(final Object b) {<a name="line.975"></a>
<span class="sourceLineNo">976</span>                setDirty();<a name="line.976"></a>
<span class="sourceLineNo">977</span>                Dataset bds = b instanceof Dataset ? (Dataset) b : DatasetFactory.createFromObject(b);<a name="line.977"></a>
<span class="sourceLineNo">978</span>                boolean useLong = bds.getElementClass().equals(Long.class);<a name="line.978"></a>
<span class="sourceLineNo">979</span>                if (bds.getSize() == 1) {<a name="line.979"></a>
<span class="sourceLineNo">980</span>                        final IndexIterator it = getIterator();<a name="line.980"></a>
<span class="sourceLineNo">981</span>                        final int bOffset = bds.getOffset();<a name="line.981"></a>
<span class="sourceLineNo">982</span>                        if (useLong) {<a name="line.982"></a>
<span class="sourceLineNo">983</span>                                final long lb = bds.getElementLongAbs(bOffset);<a name="line.983"></a>
<span class="sourceLineNo">984</span>                                while (it.hasNext()) {<a name="line.984"></a>
<span class="sourceLineNo">985</span>                                        data[it.index] += lb;<a name="line.985"></a>
<span class="sourceLineNo">986</span>                                }<a name="line.986"></a>
<span class="sourceLineNo">987</span>                        } else {<a name="line.987"></a>
<span class="sourceLineNo">988</span>                                final double db = bds.getElementDoubleAbs(bOffset);<a name="line.988"></a>
<span class="sourceLineNo">989</span>                                while (it.hasNext()) {<a name="line.989"></a>
<span class="sourceLineNo">990</span>                                        data[it.index] += db;<a name="line.990"></a>
<span class="sourceLineNo">991</span>                                }<a name="line.991"></a>
<span class="sourceLineNo">992</span>                        }<a name="line.992"></a>
<span class="sourceLineNo">993</span>                } else {<a name="line.993"></a>
<span class="sourceLineNo">994</span>                        final BroadcastSelfIterator it = BroadcastSelfIterator.createIterator(this, bds);<a name="line.994"></a>
<span class="sourceLineNo">995</span>                        it.setOutputDouble(!useLong);<a name="line.995"></a>
<span class="sourceLineNo">996</span>                        if (useLong) {<a name="line.996"></a>
<span class="sourceLineNo">997</span>                                while (it.hasNext()) {<a name="line.997"></a>
<span class="sourceLineNo">998</span>                                        data[it.aIndex] += it.bLong;<a name="line.998"></a>
<span class="sourceLineNo">999</span>                                }<a name="line.999"></a>
<span class="sourceLineNo">1000</span>                        } else {<a name="line.1000"></a>
<span class="sourceLineNo">1001</span>                                while (it.hasNext()) {<a name="line.1001"></a>
<span class="sourceLineNo">1002</span>                                        data[it.aIndex] += it.bDouble;<a name="line.1002"></a>
<span class="sourceLineNo">1003</span>                                }<a name="line.1003"></a>
<span class="sourceLineNo">1004</span>                        }<a name="line.1004"></a>
<span class="sourceLineNo">1005</span>                }<a name="line.1005"></a>
<span class="sourceLineNo">1006</span>                return this;<a name="line.1006"></a>
<span class="sourceLineNo">1007</span>        }<a name="line.1007"></a>
<span class="sourceLineNo">1008</span><a name="line.1008"></a>
<span class="sourceLineNo">1009</span>        @Override<a name="line.1009"></a>
<span class="sourceLineNo">1010</span>        public LongDataset isubtract(final Object b) {<a name="line.1010"></a>
<span class="sourceLineNo">1011</span>                setDirty();<a name="line.1011"></a>
<span class="sourceLineNo">1012</span>                Dataset bds = b instanceof Dataset ? (Dataset) b : DatasetFactory.createFromObject(b);<a name="line.1012"></a>
<span class="sourceLineNo">1013</span>                boolean useLong = bds.getElementClass().equals(Long.class);<a name="line.1013"></a>
<span class="sourceLineNo">1014</span>                if (bds.getSize() == 1) {<a name="line.1014"></a>
<span class="sourceLineNo">1015</span>                        final IndexIterator it = getIterator();<a name="line.1015"></a>
<span class="sourceLineNo">1016</span>                        final int bOffset = bds.getOffset();<a name="line.1016"></a>
<span class="sourceLineNo">1017</span>                        if (useLong) {<a name="line.1017"></a>
<span class="sourceLineNo">1018</span>                                final long lb = bds.getElementLongAbs(bOffset);<a name="line.1018"></a>
<span class="sourceLineNo">1019</span>                                while (it.hasNext()) {<a name="line.1019"></a>
<span class="sourceLineNo">1020</span>                                        data[it.index] -= lb;<a name="line.1020"></a>
<span class="sourceLineNo">1021</span>                                }<a name="line.1021"></a>
<span class="sourceLineNo">1022</span>                        } else {<a name="line.1022"></a>
<span class="sourceLineNo">1023</span>                                final double db = bds.getElementDoubleAbs(bOffset);<a name="line.1023"></a>
<span class="sourceLineNo">1024</span>                                while (it.hasNext()) {<a name="line.1024"></a>
<span class="sourceLineNo">1025</span>                                        data[it.index] -= db;<a name="line.1025"></a>
<span class="sourceLineNo">1026</span>                                }<a name="line.1026"></a>
<span class="sourceLineNo">1027</span>                        }<a name="line.1027"></a>
<span class="sourceLineNo">1028</span>                } else {<a name="line.1028"></a>
<span class="sourceLineNo">1029</span>                        final BroadcastSelfIterator it = BroadcastSelfIterator.createIterator(this, bds);<a name="line.1029"></a>
<span class="sourceLineNo">1030</span>                        if (useLong) {<a name="line.1030"></a>
<span class="sourceLineNo">1031</span>                                it.setOutputDouble(false);<a name="line.1031"></a>
<span class="sourceLineNo">1032</span>                                while (it.hasNext()) {<a name="line.1032"></a>
<span class="sourceLineNo">1033</span>                                        data[it.aIndex] -= it.bLong;<a name="line.1033"></a>
<span class="sourceLineNo">1034</span>                                }<a name="line.1034"></a>
<span class="sourceLineNo">1035</span>                        } else {<a name="line.1035"></a>
<span class="sourceLineNo">1036</span>                                it.setOutputDouble(true);<a name="line.1036"></a>
<span class="sourceLineNo">1037</span>                                while (it.hasNext()) {<a name="line.1037"></a>
<span class="sourceLineNo">1038</span>                                        data[it.aIndex] -= it.bDouble;<a name="line.1038"></a>
<span class="sourceLineNo">1039</span>                                }<a name="line.1039"></a>
<span class="sourceLineNo">1040</span>                        }<a name="line.1040"></a>
<span class="sourceLineNo">1041</span>                }<a name="line.1041"></a>
<span class="sourceLineNo">1042</span>                return this;<a name="line.1042"></a>
<span class="sourceLineNo">1043</span>        }<a name="line.1043"></a>
<span class="sourceLineNo">1044</span><a name="line.1044"></a>
<span class="sourceLineNo">1045</span>        @Override<a name="line.1045"></a>
<span class="sourceLineNo">1046</span>        public LongDataset imultiply(final Object b) {<a name="line.1046"></a>
<span class="sourceLineNo">1047</span>                setDirty();<a name="line.1047"></a>
<span class="sourceLineNo">1048</span>                Dataset bds = b instanceof Dataset ? (Dataset) b : DatasetFactory.createFromObject(b);<a name="line.1048"></a>
<span class="sourceLineNo">1049</span>                boolean useLong = bds.getElementClass().equals(Long.class);<a name="line.1049"></a>
<span class="sourceLineNo">1050</span>                if (bds.getSize() == 1) {<a name="line.1050"></a>
<span class="sourceLineNo">1051</span>                        final IndexIterator it = getIterator();<a name="line.1051"></a>
<span class="sourceLineNo">1052</span>                        final int bOffset = bds.getOffset();<a name="line.1052"></a>
<span class="sourceLineNo">1053</span>                        if (useLong) {<a name="line.1053"></a>
<span class="sourceLineNo">1054</span>                                final long lb = bds.getElementLongAbs(bOffset);<a name="line.1054"></a>
<span class="sourceLineNo">1055</span>                                while (it.hasNext()) {<a name="line.1055"></a>
<span class="sourceLineNo">1056</span>                                        data[it.index] *= lb;<a name="line.1056"></a>
<span class="sourceLineNo">1057</span>                                }<a name="line.1057"></a>
<span class="sourceLineNo">1058</span>                        } else {<a name="line.1058"></a>
<span class="sourceLineNo">1059</span>                                final double db = bds.getElementDoubleAbs(bOffset);<a name="line.1059"></a>
<span class="sourceLineNo">1060</span>                                while (it.hasNext()) {<a name="line.1060"></a>
<span class="sourceLineNo">1061</span>                                        data[it.index] *= db;<a name="line.1061"></a>
<span class="sourceLineNo">1062</span>                                }<a name="line.1062"></a>
<span class="sourceLineNo">1063</span>                        }<a name="line.1063"></a>
<span class="sourceLineNo">1064</span>                } else {<a name="line.1064"></a>
<span class="sourceLineNo">1065</span>                        final BroadcastSelfIterator it = BroadcastSelfIterator.createIterator(this, bds);<a name="line.1065"></a>
<span class="sourceLineNo">1066</span>                        it.setOutputDouble(!useLong);<a name="line.1066"></a>
<span class="sourceLineNo">1067</span>                        if (useLong) {<a name="line.1067"></a>
<span class="sourceLineNo">1068</span>                                while (it.hasNext()) {<a name="line.1068"></a>
<span class="sourceLineNo">1069</span>                                        data[it.aIndex] *= it.bLong;<a name="line.1069"></a>
<span class="sourceLineNo">1070</span>                                }<a name="line.1070"></a>
<span class="sourceLineNo">1071</span>                        } else {<a name="line.1071"></a>
<span class="sourceLineNo">1072</span>                                while (it.hasNext()) {<a name="line.1072"></a>
<span class="sourceLineNo">1073</span>                                        data[it.aIndex] *= it.bDouble;<a name="line.1073"></a>
<span class="sourceLineNo">1074</span>                                }<a name="line.1074"></a>
<span class="sourceLineNo">1075</span>                        }<a name="line.1075"></a>
<span class="sourceLineNo">1076</span>                }<a name="line.1076"></a>
<span class="sourceLineNo">1077</span>                return this;<a name="line.1077"></a>
<span class="sourceLineNo">1078</span>        }<a name="line.1078"></a>
<span class="sourceLineNo">1079</span><a name="line.1079"></a>
<span class="sourceLineNo">1080</span>        @Override<a name="line.1080"></a>
<span class="sourceLineNo">1081</span>        public LongDataset idivide(final Object b) {<a name="line.1081"></a>
<span class="sourceLineNo">1082</span>                setDirty();<a name="line.1082"></a>
<span class="sourceLineNo">1083</span>                Dataset bds = b instanceof Dataset ? (Dataset) b : DatasetFactory.createFromObject(b);<a name="line.1083"></a>
<span class="sourceLineNo">1084</span>                boolean useLong = bds.getElementClass().equals(Long.class);<a name="line.1084"></a>
<span class="sourceLineNo">1085</span>                if (bds.getSize() == 1) {<a name="line.1085"></a>
<span class="sourceLineNo">1086</span>                        final int bOffset = bds.getOffset();<a name="line.1086"></a>
<span class="sourceLineNo">1087</span>                        if (useLong) {<a name="line.1087"></a>
<span class="sourceLineNo">1088</span>                                final long lb = bds.getElementLongAbs(bOffset);<a name="line.1088"></a>
<span class="sourceLineNo">1089</span>                                if (lb == 0) { // INT_USE<a name="line.1089"></a>
<span class="sourceLineNo">1090</span>                                        fill(0); // INT_USE<a name="line.1090"></a>
<span class="sourceLineNo">1091</span>                                } else { // INT_USE<a name="line.1091"></a>
<span class="sourceLineNo">1092</span>                                final IndexIterator it = getIterator();<a name="line.1092"></a>
<span class="sourceLineNo">1093</span>                                while (it.hasNext()) {<a name="line.1093"></a>
<span class="sourceLineNo">1094</span>                                        data[it.index] /= lb;<a name="line.1094"></a>
<span class="sourceLineNo">1095</span>                                }<a name="line.1095"></a>
<span class="sourceLineNo">1096</span>                                } // INT_USE<a name="line.1096"></a>
<span class="sourceLineNo">1097</span>                        } else {<a name="line.1097"></a>
<span class="sourceLineNo">1098</span>                                final double db = bds.getElementDoubleAbs(bOffset);<a name="line.1098"></a>
<span class="sourceLineNo">1099</span>                                if (db == 0) { // INT_USE<a name="line.1099"></a>
<span class="sourceLineNo">1100</span>                                        fill(0); // INT_USE<a name="line.1100"></a>
<span class="sourceLineNo">1101</span>                                } else { // INT_USE<a name="line.1101"></a>
<span class="sourceLineNo">1102</span>                                final IndexIterator it = getIterator();<a name="line.1102"></a>
<span class="sourceLineNo">1103</span>                                while (it.hasNext()) {<a name="line.1103"></a>
<span class="sourceLineNo">1104</span>                                        data[it.index] /= db;<a name="line.1104"></a>
<span class="sourceLineNo">1105</span>                                }<a name="line.1105"></a>
<span class="sourceLineNo">1106</span>                                } // INT_USE<a name="line.1106"></a>
<span class="sourceLineNo">1107</span>                        }<a name="line.1107"></a>
<span class="sourceLineNo">1108</span>                } else {<a name="line.1108"></a>
<span class="sourceLineNo">1109</span>                        final BroadcastSelfIterator it = BroadcastSelfIterator.createIterator(this, bds);<a name="line.1109"></a>
<span class="sourceLineNo">1110</span>                        it.setOutputDouble(!useLong);<a name="line.1110"></a>
<span class="sourceLineNo">1111</span>                        if (useLong) {<a name="line.1111"></a>
<span class="sourceLineNo">1112</span>                                while (it.hasNext()) {<a name="line.1112"></a>
<span class="sourceLineNo">1113</span>                                        if (it.bLong == 0) { // INT_USE<a name="line.1113"></a>
<span class="sourceLineNo">1114</span>                                                data[it.aIndex] = 0; // INT_USE<a name="line.1114"></a>
<span class="sourceLineNo">1115</span>                                        } else { // INT_USE<a name="line.1115"></a>
<span class="sourceLineNo">1116</span>                                        data[it.aIndex] /= it.bLong;<a name="line.1116"></a>
<span class="sourceLineNo">1117</span>                                        } // INT_USE<a name="line.1117"></a>
<span class="sourceLineNo">1118</span>                                }<a name="line.1118"></a>
<span class="sourceLineNo">1119</span>                        } else {<a name="line.1119"></a>
<span class="sourceLineNo">1120</span>                                while (it.hasNext()) {<a name="line.1120"></a>
<span class="sourceLineNo">1121</span>                                        if (it.bDouble == 0) { // INT_USE<a name="line.1121"></a>
<span class="sourceLineNo">1122</span>                                                data[it.aIndex] = 0; // INT_USE<a name="line.1122"></a>
<span class="sourceLineNo">1123</span>                                        } else { // INT_USE<a name="line.1123"></a>
<span class="sourceLineNo">1124</span>                                        data[it.aIndex] /= it.bDouble;<a name="line.1124"></a>
<span class="sourceLineNo">1125</span>                                        } // INT_USE<a name="line.1125"></a>
<span class="sourceLineNo">1126</span>                                }<a name="line.1126"></a>
<span class="sourceLineNo">1127</span>                        }<a name="line.1127"></a>
<span class="sourceLineNo">1128</span>                }<a name="line.1128"></a>
<span class="sourceLineNo">1129</span>                return this;<a name="line.1129"></a>
<span class="sourceLineNo">1130</span>        }<a name="line.1130"></a>
<span class="sourceLineNo">1131</span><a name="line.1131"></a>
<span class="sourceLineNo">1132</span>        @Override<a name="line.1132"></a>
<span class="sourceLineNo">1133</span>        public LongDataset ifloor() {<a name="line.1133"></a>
<span class="sourceLineNo">1134</span>                return this;<a name="line.1134"></a>
<span class="sourceLineNo">1135</span>        }<a name="line.1135"></a>
<span class="sourceLineNo">1136</span><a name="line.1136"></a>
<span class="sourceLineNo">1137</span>        @Override<a name="line.1137"></a>
<span class="sourceLineNo">1138</span>        public LongDataset iremainder(final Object b) {<a name="line.1138"></a>
<span class="sourceLineNo">1139</span>                setDirty();<a name="line.1139"></a>
<span class="sourceLineNo">1140</span>                Dataset bds = b instanceof Dataset ? (Dataset) b : DatasetFactory.createFromObject(b);<a name="line.1140"></a>
<span class="sourceLineNo">1141</span>                boolean useLong = bds.getElementClass().equals(Long.class);<a name="line.1141"></a>
<span class="sourceLineNo">1142</span>                if (bds.getSize() == 1) {<a name="line.1142"></a>
<span class="sourceLineNo">1143</span>                        final int bOffset = bds.getOffset();<a name="line.1143"></a>
<span class="sourceLineNo">1144</span>                        if (useLong) {<a name="line.1144"></a>
<span class="sourceLineNo">1145</span>                                final long lb = bds.getElementLongAbs(bOffset);<a name="line.1145"></a>
<span class="sourceLineNo">1146</span>                                if (lb == 0) { // INT_USE<a name="line.1146"></a>
<span class="sourceLineNo">1147</span>                                        fill(0); // INT_USE<a name="line.1147"></a>
<span class="sourceLineNo">1148</span>                                } else { // INT_USE<a name="line.1148"></a>
<span class="sourceLineNo">1149</span>                                final IndexIterator it = getIterator();<a name="line.1149"></a>
<span class="sourceLineNo">1150</span>                                while (it.hasNext()) {<a name="line.1150"></a>
<span class="sourceLineNo">1151</span>                                        data[it.index] %= lb;<a name="line.1151"></a>
<span class="sourceLineNo">1152</span>                                }<a name="line.1152"></a>
<span class="sourceLineNo">1153</span>                                } // INT_USE<a name="line.1153"></a>
<span class="sourceLineNo">1154</span>                        } else {<a name="line.1154"></a>
<span class="sourceLineNo">1155</span>                                final long lb = bds.getElementLongAbs(bOffset);<a name="line.1155"></a>
<span class="sourceLineNo">1156</span>                                if (lb == 0) { // INT_USE<a name="line.1156"></a>
<span class="sourceLineNo">1157</span>                                        fill(0); // INT_USE<a name="line.1157"></a>
<span class="sourceLineNo">1158</span>                                } else { // INT_USE<a name="line.1158"></a>
<span class="sourceLineNo">1159</span>                                final IndexIterator it = getIterator();<a name="line.1159"></a>
<span class="sourceLineNo">1160</span>                                while (it.hasNext()) {<a name="line.1160"></a>
<span class="sourceLineNo">1161</span>                                        data[it.index] %= lb;<a name="line.1161"></a>
<span class="sourceLineNo">1162</span>                                }<a name="line.1162"></a>
<span class="sourceLineNo">1163</span>                                } // INT_USE<a name="line.1163"></a>
<span class="sourceLineNo">1164</span>                        }<a name="line.1164"></a>
<span class="sourceLineNo">1165</span>                } else {<a name="line.1165"></a>
<span class="sourceLineNo">1166</span>                        final BroadcastSelfIterator it = BroadcastSelfIterator.createIterator(this, bds);<a name="line.1166"></a>
<span class="sourceLineNo">1167</span>                        it.setOutputDouble(!useLong);<a name="line.1167"></a>
<span class="sourceLineNo">1168</span>                        if (useLong) {<a name="line.1168"></a>
<span class="sourceLineNo">1169</span>                                while (it.hasNext()) {<a name="line.1169"></a>
<span class="sourceLineNo">1170</span>                                try {<a name="line.1170"></a>
<span class="sourceLineNo">1171</span>                                                data[it.aIndex] %= it.bLong; // INT_EXCEPTION<a name="line.1171"></a>
<span class="sourceLineNo">1172</span>                                } catch (ArithmeticException e) {<a name="line.1172"></a>
<span class="sourceLineNo">1173</span>                                        data[it.aIndex] = 0;<a name="line.1173"></a>
<span class="sourceLineNo">1174</span>                                }<a name="line.1174"></a>
<span class="sourceLineNo">1175</span>                                }<a name="line.1175"></a>
<span class="sourceLineNo">1176</span>                        } else {<a name="line.1176"></a>
<span class="sourceLineNo">1177</span>                                while (it.hasNext()) {<a name="line.1177"></a>
<span class="sourceLineNo">1178</span>                                        data[it.aIndex] %= it.bDouble;<a name="line.1178"></a>
<span class="sourceLineNo">1179</span>                                }<a name="line.1179"></a>
<span class="sourceLineNo">1180</span>                        }<a name="line.1180"></a>
<span class="sourceLineNo">1181</span>                }<a name="line.1181"></a>
<span class="sourceLineNo">1182</span>                return this;<a name="line.1182"></a>
<span class="sourceLineNo">1183</span>        }<a name="line.1183"></a>
<span class="sourceLineNo">1184</span><a name="line.1184"></a>
<span class="sourceLineNo">1185</span>        @Override<a name="line.1185"></a>
<span class="sourceLineNo">1186</span>        public LongDataset ipower(final Object b) {<a name="line.1186"></a>
<span class="sourceLineNo">1187</span>                setDirty();<a name="line.1187"></a>
<span class="sourceLineNo">1188</span>                Dataset bds = b instanceof Dataset ? (Dataset) b : DatasetFactory.createFromObject(b);<a name="line.1188"></a>
<span class="sourceLineNo">1189</span>                if (bds.getSize() == 1) {<a name="line.1189"></a>
<span class="sourceLineNo">1190</span>                        final int bOffset = bds.getOffset();<a name="line.1190"></a>
<span class="sourceLineNo">1191</span>                        final double vr = bds.getElementDoubleAbs(bOffset);<a name="line.1191"></a>
<span class="sourceLineNo">1192</span>                        final IndexIterator it = getIterator();<a name="line.1192"></a>
<span class="sourceLineNo">1193</span>                        if (bds.isComplex()) {<a name="line.1193"></a>
<span class="sourceLineNo">1194</span>                                final double vi = bds.getElementDoubleAbs(bOffset + 1);<a name="line.1194"></a>
<span class="sourceLineNo">1195</span>                                if (vi == 0) {<a name="line.1195"></a>
<span class="sourceLineNo">1196</span>                                        while (it.hasNext()) {<a name="line.1196"></a>
<span class="sourceLineNo">1197</span>                                                final double v = Math.pow(data[it.index], vr);<a name="line.1197"></a>
<span class="sourceLineNo">1198</span>                                                if (Double.isInfinite(v) || Double.isNaN(v)) { // INT_USE<a name="line.1198"></a>
<span class="sourceLineNo">1199</span>                                                        data[it.index] = 0; // INT_USE<a name="line.1199"></a>
<span class="sourceLineNo">1200</span>                                                } else { // INT_USE<a name="line.1200"></a>
<span class="sourceLineNo">1201</span>                                                data[it.index] = (long) v; // PRIM_TYPE_LONG // ADD_CAST<a name="line.1201"></a>
<span class="sourceLineNo">1202</span>                                                } // INT_USE<a name="line.1202"></a>
<span class="sourceLineNo">1203</span>                                        }<a name="line.1203"></a>
<span class="sourceLineNo">1204</span>                                } else {<a name="line.1204"></a>
<span class="sourceLineNo">1205</span>                                        final Complex zv = new Complex(vr, vi);<a name="line.1205"></a>
<span class="sourceLineNo">1206</span>                                        while (it.hasNext()) {<a name="line.1206"></a>
<span class="sourceLineNo">1207</span>                                                Complex zd = new Complex(data[it.index], 0);<a name="line.1207"></a>
<span class="sourceLineNo">1208</span>                                                final double v = zd.pow(zv).getReal();<a name="line.1208"></a>
<span class="sourceLineNo">1209</span>                                                if (Double.isInfinite(v) || Double.isNaN(v)) { // INT_USE<a name="line.1209"></a>
<span class="sourceLineNo">1210</span>                                                        data[it.index] = 0; // INT_USE<a name="line.1210"></a>
<span class="sourceLineNo">1211</span>                                                } else { // INT_USE<a name="line.1211"></a>
<span class="sourceLineNo">1212</span>                                                data[it.index] = (long) v; // PRIM_TYPE_LONG // ADD_CAST<a name="line.1212"></a>
<span class="sourceLineNo">1213</span>                                                } // INT_USE<a name="line.1213"></a>
<span class="sourceLineNo">1214</span>                                        }<a name="line.1214"></a>
<span class="sourceLineNo">1215</span>                                }<a name="line.1215"></a>
<span class="sourceLineNo">1216</span>                        } else {// NAN_OMIT<a name="line.1216"></a>
<span class="sourceLineNo">1217</span>                                while (it.hasNext()) {<a name="line.1217"></a>
<span class="sourceLineNo">1218</span>                                        final double v = Math.pow(data[it.index], vr);<a name="line.1218"></a>
<span class="sourceLineNo">1219</span>                                        if (Double.isInfinite(v) || Double.isNaN(v)) { // INT_USE<a name="line.1219"></a>
<span class="sourceLineNo">1220</span>                                                data[it.index] = 0; // INT_USE<a name="line.1220"></a>
<span class="sourceLineNo">1221</span>                                        } else { // INT_USE<a name="line.1221"></a>
<span class="sourceLineNo">1222</span>                                        data[it.index] = (long) v; // PRIM_TYPE_LONG // ADD_CAST<a name="line.1222"></a>
<span class="sourceLineNo">1223</span>                                        } // INT_USE<a name="line.1223"></a>
<span class="sourceLineNo">1224</span>                                }<a name="line.1224"></a>
<span class="sourceLineNo">1225</span>                        }<a name="line.1225"></a>
<span class="sourceLineNo">1226</span>                } else {<a name="line.1226"></a>
<span class="sourceLineNo">1227</span>                        final BroadcastIterator it = BroadcastIterator.createIterator(this, bds);<a name="line.1227"></a>
<span class="sourceLineNo">1228</span>                        it.setOutputDouble(true);<a name="line.1228"></a>
<span class="sourceLineNo">1229</span>                        if (bds.isComplex()) {<a name="line.1229"></a>
<span class="sourceLineNo">1230</span>                                while (it.hasNext()) {<a name="line.1230"></a>
<span class="sourceLineNo">1231</span>                                        final Complex zv = new Complex(it.bDouble, bds.getElementDoubleAbs(it.bIndex + 1));<a name="line.1231"></a>
<span class="sourceLineNo">1232</span>                                        final double v = new Complex(it.aDouble, 0).pow(zv).getReal();<a name="line.1232"></a>
<span class="sourceLineNo">1233</span>                                        if (Double.isInfinite(v) || Double.isNaN(v)) { // INT_USE<a name="line.1233"></a>
<span class="sourceLineNo">1234</span>                                                data[it.aIndex] = 0; // INT_USE<a name="line.1234"></a>
<span class="sourceLineNo">1235</span>                                        } else { // INT_USE<a name="line.1235"></a>
<span class="sourceLineNo">1236</span>                                        data[it.aIndex] = (long) v; // PRIM_TYPE_LONG // ADD_CAST<a name="line.1236"></a>
<span class="sourceLineNo">1237</span>                                        } // INT_USE<a name="line.1237"></a>
<span class="sourceLineNo">1238</span>                                }<a name="line.1238"></a>
<span class="sourceLineNo">1239</span>                        } else {// NAN_OMIT<a name="line.1239"></a>
<span class="sourceLineNo">1240</span>                                while (it.hasNext()) {<a name="line.1240"></a>
<span class="sourceLineNo">1241</span>                                        final double v = Math.pow(it.aDouble, it.bDouble);<a name="line.1241"></a>
<span class="sourceLineNo">1242</span>                                        if (Double.isInfinite(v) || Double.isNaN(v)) { // INT_USE<a name="line.1242"></a>
<span class="sourceLineNo">1243</span>                                                data[it.aIndex] = 0; // INT_USE<a name="line.1243"></a>
<span class="sourceLineNo">1244</span>                                        } else { // INT_USE<a name="line.1244"></a>
<span class="sourceLineNo">1245</span>                                        data[it.aIndex] = (long) v; // PRIM_TYPE_LONG // ADD_CAST<a name="line.1245"></a>
<span class="sourceLineNo">1246</span>                                        } // INT_USE<a name="line.1246"></a>
<span class="sourceLineNo">1247</span>                                }<a name="line.1247"></a>
<span class="sourceLineNo">1248</span>                        }<a name="line.1248"></a>
<span class="sourceLineNo">1249</span>                }<a name="line.1249"></a>
<span class="sourceLineNo">1250</span>                return this;<a name="line.1250"></a>
<span class="sourceLineNo">1251</span>        }<a name="line.1251"></a>
<span class="sourceLineNo">1252</span><a name="line.1252"></a>
<span class="sourceLineNo">1253</span>        @Override<a name="line.1253"></a>
<span class="sourceLineNo">1254</span>        public double residual(final Object b, final Dataset w, boolean ignoreNaNs) {<a name="line.1254"></a>
<span class="sourceLineNo">1255</span>                Dataset bds = b instanceof Dataset ? (Dataset) b : DatasetFactory.createFromObject(b);<a name="line.1255"></a>
<span class="sourceLineNo">1256</span>                final BroadcastIterator it = BroadcastIterator.createIterator(this, bds);<a name="line.1256"></a>
<span class="sourceLineNo">1257</span>                it.setOutputDouble(true);<a name="line.1257"></a>
<span class="sourceLineNo">1258</span>                double sum = 0;<a name="line.1258"></a>
<span class="sourceLineNo">1259</span>                double comp = 0;<a name="line.1259"></a>
<span class="sourceLineNo">1260</span>                {<a name="line.1260"></a>
<span class="sourceLineNo">1261</span>                        if (w == null) {<a name="line.1261"></a>
<span class="sourceLineNo">1262</span>                                while (it.hasNext()) {<a name="line.1262"></a>
<span class="sourceLineNo">1263</span>                                        final double diff = it.aDouble - it.bDouble;<a name="line.1263"></a>
<span class="sourceLineNo">1264</span>                                        final double err = diff * diff - comp;<a name="line.1264"></a>
<span class="sourceLineNo">1265</span>                                        final double temp = sum + err;<a name="line.1265"></a>
<span class="sourceLineNo">1266</span>                                        comp = (temp - sum) - err;<a name="line.1266"></a>
<span class="sourceLineNo">1267</span>                                        sum = temp;<a name="line.1267"></a>
<span class="sourceLineNo">1268</span>                                }<a name="line.1268"></a>
<span class="sourceLineNo">1269</span>                        } else {<a name="line.1269"></a>
<span class="sourceLineNo">1270</span>                                IndexIterator itw = w.getIterator();<a name="line.1270"></a>
<span class="sourceLineNo">1271</span>                                while (it.hasNext() &amp;&amp; itw.hasNext()) {<a name="line.1271"></a>
<span class="sourceLineNo">1272</span>                                        final double diff = it.aDouble - it.bDouble;<a name="line.1272"></a>
<span class="sourceLineNo">1273</span>                                        final double err = diff * diff * w.getElementDoubleAbs(itw.index) - comp;<a name="line.1273"></a>
<span class="sourceLineNo">1274</span>                                        final double temp = sum + err;<a name="line.1274"></a>
<span class="sourceLineNo">1275</span>                                        comp = (temp - sum) - err;<a name="line.1275"></a>
<span class="sourceLineNo">1276</span>                                        sum = temp;<a name="line.1276"></a>
<span class="sourceLineNo">1277</span>                                }<a name="line.1277"></a>
<span class="sourceLineNo">1278</span>                        }<a name="line.1278"></a>
<span class="sourceLineNo">1279</span>                }<a name="line.1279"></a>
<span class="sourceLineNo">1280</span>                return sum;<a name="line.1280"></a>
<span class="sourceLineNo">1281</span>        }<a name="line.1281"></a>
<span class="sourceLineNo">1282</span>}<a name="line.1282"></a>




























































</pre>
</div>
</body>
</html>
