예제 #1
0
        private void fill_matrices(int item_count)
        {
            int num_vars = item_count + 2;

            if (item_count != _last_item_count)
            {
                _vB = new int[num_vars];
                _vN = new int[item_count];
                _last_item_count = item_count;
            }

            int[] vB = _vB, vN = _vN;
            List <solver_entry> items = this.items;

            _E.set_to_identity(num_vars);
            _cB.clear(1, num_vars);
            _cN.clear(1, item_count);
            _B.set_to_identity(num_vars);
            _B_inv.clear(num_vars);
            _N.clear(num_vars, item_count);
            _b.clear(num_vars, 1);
            //_B_inv.set_to_identity(num_vars);
            _z.clear(1, num_vars);
            _z_c.clear(1, item_count);

            _result.clear(num_vars, 1);
            _entering_column.clear(num_vars, 1);
            _dividers.clear(num_vars, 1);

            sparse_row_ref B0_ref = _B[0], B1_ref = _B[1];
            int            cur_index;

            for (int cur_item = 0; cur_item < item_count; ++cur_item)
            {
                cur_index               = cur_item + 2;
                vB    [cur_index]       = cur_item;
                vN    [cur_item]        = cur_item + num_vars;
                B0_ref[cur_index]       = items[cur_item].x;
                B1_ref[cur_index]       = items[cur_item].y;
                _N[cur_index][cur_item] = 1.0;
                _b[cur_index][0]        = items[cur_item].max_value;
            }
            vB[0] = item_count;
            vB[1] = item_count + 1;
        }
예제 #2
0
        static public void multiply(ref sparse_matrix result, sparse_matrix left, sparse_matrix right)
        {
            if (left._width != right._height)
            {
                throw new ArgumentException("Operand size mismatch");
            }

            Dictionary <int, double> result_row_ref, left_row_ref, right_row_ref;
            double cur_element;
            int    cur_column;

            result.clear(left._height, right._width);
            int result_height = result._height;

            Dictionary <int, double>[] result_contents = result._contents, left_contents = left._contents, right_contents = right._contents;
            for (int cur_row = 0; cur_row < result_height; ++cur_row)
            {
                left_row_ref   = left_contents[cur_row];
                result_row_ref = result_contents[cur_row];
                foreach (KeyValuePair <int, double> cur_diagonal in left_row_ref)
                {
                    cur_element   = cur_diagonal.Value;
                    right_row_ref = right_contents[cur_diagonal.Key];
                    foreach (KeyValuePair <int, double> cur_horizontal in right_row_ref)
                    {
                        cur_column = cur_horizontal.Key;
                        if (result_row_ref.ContainsKey(cur_column))
                        {
                            result_row_ref[cur_column] += cur_element * cur_horizontal.Value;
                        }
                        else
                        {
                            result_row_ref.Add(cur_column, cur_element * cur_horizontal.Value);
                        }
                    }
                }
            }
        }