Project

General

Profile

Download (4.64 KB) Statistics
| Branch: | Revision:

distorted-objectlib / src / main / java / org / distorted / objectlib / tablebases / TablebasesPruning.java @ f079bf77

1 00947987 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
2
// Copyright 2023 Leszek Koltunski                                                               //
3
//                                                                                               //
4
// This file is part of Magic Cube.                                                              //
5
//                                                                                               //
6
// Magic Cube is proprietary software licensed under an EULA which you should have received      //
7
// along with the code. If not, check https://distorted.org/magic/License-Magic-Cube.html        //
8
///////////////////////////////////////////////////////////////////////////////////////////////////
9
10
package org.distorted.objectlib.tablebases;
11
12 884b702b Leszek Koltunski
import android.content.res.Resources;
13 00947987 Leszek Koltunski
14 884b702b Leszek Koltunski
import java.io.ByteArrayOutputStream;
15
import java.io.IOException;
16
import java.io.InputStream;
17 00947987 Leszek Koltunski
18
///////////////////////////////////////////////////////////////////////////////////////////////////
19
20 f079bf77 Leszek Koltunski
public abstract class TablebasesPruning extends TablebasesAbstract
21 884b702b Leszek Koltunski
{
22
  private boolean mInitialized;
23 f079bf77 Leszek Koltunski
  private PruningTable[] mHighTables;
24
  private PruningTable[] mMidTables;
25
  private int mGodsNumber, mLowestHigh, mHighestMid, mLowestMid;
26 00947987 Leszek Koltunski
27 15d1f6ad Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
28
29 f079bf77 Leszek Koltunski
  abstract int[] getMidPruningLevels();
30
  abstract int[] getHighPruningLevels();
31
  abstract int getGodsNumber();
32 15d1f6ad Leszek Koltunski
33 00947987 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
34
35 f079bf77 Leszek Koltunski
  private PruningTable createPruningTable(Resources res, int id)
36 00947987 Leszek Koltunski
    {
37 884b702b Leszek Koltunski
    InputStream stream = res.openRawResource(id);
38
    ByteArrayOutputStream buffer = new ByteArrayOutputStream();
39 00947987 Leszek Koltunski
40 884b702b Leszek Koltunski
    int nRead;
41
    byte[] tmp = new byte[16384];
42 00947987 Leszek Koltunski
43 884b702b Leszek Koltunski
    try
44 00947987 Leszek Koltunski
      {
45 884b702b Leszek Koltunski
      while ((nRead = stream.read(tmp, 0, tmp.length)) != -1)
46 00947987 Leszek Koltunski
        {
47 884b702b Leszek Koltunski
        buffer.write(tmp, 0, nRead);
48 00947987 Leszek Koltunski
        }
49 884b702b Leszek Koltunski
      stream.close();
50
      byte[] data = buffer.toByteArray();
51
      buffer.close();
52 f079bf77 Leszek Koltunski
      return new PruningTable(data);
53 884b702b Leszek Koltunski
      }
54
    catch(IOException ex)
55 00947987 Leszek Koltunski
      {
56 884b702b Leszek Koltunski
      mInitialized = false;
57 f079bf77 Leszek Koltunski
      return null;
58 00947987 Leszek Koltunski
      }
59 884b702b Leszek Koltunski
    }
60 00947987 Leszek Koltunski
61 884b702b Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
62 00947987 Leszek Koltunski
63 f079bf77 Leszek Koltunski
  public TablebasesPruning()
64 884b702b Leszek Koltunski
    {
65
    super();
66 f079bf77 Leszek Koltunski
    mGodsNumber = getGodsNumber();
67 7363eaa6 Leszek Koltunski
    mInitialized = false;
68 00947987 Leszek Koltunski
    }
69
70
///////////////////////////////////////////////////////////////////////////////////////////////////
71
72 f079bf77 Leszek Koltunski
  public TablebasesPruning(Resources res, int[] midIDs, int[] highIDs)
73 00947987 Leszek Koltunski
    {
74 884b702b Leszek Koltunski
    super();
75
76 f079bf77 Leszek Koltunski
    int mid = midIDs !=null ? midIDs.length  : 0;
77
    int high= highIDs!=null ? highIDs.length : 0;
78
79
    mMidTables = mid >0 ? new PruningTable[mid] : null;
80
    mHighTables= high>0 ? new PruningTable[high]: null;
81
    mGodsNumber = getGodsNumber();
82 884b702b Leszek Koltunski
    mInitialized = true;
83
84 f079bf77 Leszek Koltunski
    for(int i=0; i<mid ; i++) mMidTables[i] = createPruningTable(res,midIDs[i] );
85
    for(int i=0; i<high; i++) mHighTables[i]= createPruningTable(res,highIDs[i]);
86 00947987 Leszek Koltunski
    }
87
88 15d1f6ad Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
89
90
  public byte[][] getPacked()
91
    {
92 7363eaa6 Leszek Koltunski
    if( !mInitialized )
93
      {
94 f079bf77 Leszek Koltunski
      int[] midLevels = getMidPruningLevels();
95
      int numMidLevels= midLevels!=null ? midLevels.length : 0;
96
      int[] highLevels = getHighPruningLevels();
97
      int numHighLevels= highLevels!=null ? highLevels.length : 0;
98 7363eaa6 Leszek Koltunski
      int maxLevel = 0;
99 15d1f6ad Leszek Koltunski
100 f079bf77 Leszek Koltunski
      if( highLevels!=null )
101
        {
102
        for( int l : highLevels )
103
          if( l>maxLevel ) maxLevel = l;
104
        }
105
      else
106
        {
107
        if( midLevels!=null )
108
          for( int l : midLevels )
109
            if( l>maxLevel ) maxLevel = l;
110
        }
111 15d1f6ad Leszek Koltunski
112 7363eaa6 Leszek Koltunski
      createTablebase(maxLevel);
113 f079bf77 Leszek Koltunski
      mMidTables = numMidLevels >0 ? new PruningTable[numMidLevels ] : null;
114
      mHighTables= numHighLevels>0 ? new PruningTable[numHighLevels] : null;
115 15d1f6ad Leszek Koltunski
116 f079bf77 Leszek Koltunski
      for(int i=0; i<numMidLevels; i++)
117
        mMidTables[i] = new PruningTable(mTablebase,midLevels[i]);
118
      for(int i=0; i<numHighLevels; i++)
119
        mHighTables[i] = new PruningTable(mTablebase,highLevels[i]);
120 15d1f6ad Leszek Koltunski
121 7363eaa6 Leszek Koltunski
      mInitialized = true;
122 15d1f6ad Leszek Koltunski
      }
123
124 f079bf77 Leszek Koltunski
    int midNum  = mMidTables !=null ? mMidTables.length  : 0;
125
    int highNum = mHighTables!=null ? mHighTables.length : 0;
126
    byte[][] data = new byte[midNum+highNum][];
127
128
    for(int i=0; i<midNum ; i++) data[i       ] = mMidTables[i].getPacked();
129
    for(int i=0; i<highNum; i++) data[i+midNum] = mHighTables[i].getPacked();
130 7363eaa6 Leszek Koltunski
131 15d1f6ad Leszek Koltunski
    return data;
132
    }
133
134 00947987 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
135
136
  public int[][] solution(int index, int[] extra)
137
    {
138
    return null;
139
    }
140
}